Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

ro-eachdraidheil

Le bhith dèidheil air bathar-cruaidh retro, cheannaich mi ZX Spectrum + bho neach-reic san RA. Air a ghabhail a-steach leis a 'choimpiutair fhèin, fhuair mi grunn chlàran claistinn le geamannan (anns a' phacaid thùsail le stiùireadh), a bharrachd air prògraman air an clàradh air cassettes gun chomharran sònraichte. Gu h-iongantach, bha dàta bho cèisean 40-bliadhna air a leughadh gu math agus bha e comasach dhomh cha mhòr a h-uile geama agus prògram a luchdachadh sìos bhuapa.

Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

Ach, air cuid de chlàran lorg mi clàraidhean nach robh gu soilleir air an dèanamh leis a’ choimpiutair ZX Spectrum. Bha fuaim gu tur eadar-dhealaichte aca agus, eu-coltach ris na clàraidhean bhon choimpiutair a chaidh ainmeachadh, cha do thòisich iad le bootloader goirid BASIC, a tha mar as trice an làthair ann an clàraidhean a h-uile prògram agus geama.

Airson ùine chuir seo dragh orm - bha mi airson faighinn a-mach dè a bha falaichte annta. Nam b’ urrainn dhut an comharra claisneachd a leughadh mar shreath de bytes, dh’ fhaodadh tu coimhead airson caractaran no rud sam bith a sheallas cò às a thàinig a’ chomharra. Seòrsa de retro-arc-eòlas.

A-nis gu bheil mi air falbh fad na slighe agus a 'coimhead air bileagan nan cassettes fhèin, tha mi a' dèanamh gàire oir

bha am freagairt ceart air beulaibh mo shùilean fad na h-ùine
Air bileag a 'chèis chlì tha ainm a' choimpiutair TRS-80, agus dìreach fo ainm an neach-dèanamh: "Air a dhèanamh le Radio Shack anns na SA"

(Ma tha thu airson an inntinn a chumail gu deireadh, na bi a ’dol fon spoiler)

Dèan coimeas eadar comharran claisneachd

An toiseach, leig dhuinn na clàraidhean claisneachd a dhèanamh didseatach. Faodaidh tu èisteachd ris na tha e coltach:


Agus mar as àbhaist fuaimean coimpiutair ZX Spectrum:


Anns an dà chùis, aig toiseach a 'chlàraidh tha rud ris an canar tòn pìleat - fuaim den aon tricead (anns a’ chiad chlàradh tha e glè ghoirid <1 diog, ach faodar a chomharrachadh). Bidh an tòn pìleat a’ comharrachadh a’ choimpiutair gus ullachadh airson dàta fhaighinn. Mar riaghailt, chan eil gach coimpiutair ag aithneachadh ach an tòna pìleat “fhèin” le cumadh a ’chomharra agus cho tric sa tha e.

Feumar rudeigin a ràdh mu chumadh nan comharran fhèin. Mar eisimpleir, air an ZX Spectrum tha a chumadh ceart-cheàrnach:

Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

Nuair a lorgar tòna pìleat, bidh an ZX Spectrum a’ taisbeanadh bhàraichean dearga is gorm mu seach air crìoch na sgrìn gus sealltainn gun deach an comharra aithneachadh. Thig tòna pìleat gu crìch Pulse sioncronaich, a tha a 'comharrachadh a' choimpiutair gus tòiseachadh air dàta fhaighinn. Tha e air a chomharrachadh le ùine nas giorra (an taca ris an tòna pìleat agus an dàta às deidh sin) (faic am figear)

Às deidh a’ chuisle sioncranachaidh fhaighinn, bidh an coimpiutair a’ clàradh gach àrdachadh/tuiteam den chomharra, a’ tomhas a fhad. Ma tha an ùine nas lugha na crìoch sònraichte, thèid pìos 1 a sgrìobhadh gu cuimhne, air neo 0. Thèid na pìosan a chruinneachadh ann am bytes agus thèid am pròiseas a-rithist gus am faighear N bytes. Mar as trice thèid an àireamh N a thoirt bho bhann-cinn an fhaidhle a chaidh a luchdachadh sìos. Tha an sreath luchdachadh mar a leanas:

  1. tòn pìleat
  2. bann-cinn (fad stèidhichte), anns a bheil meud an dàta a chaidh a luchdachadh sìos (N), ainm faidhle agus seòrsa
  3. tòn pìleat
  4. an dàta fhèin

Gus dèanamh cinnteach gu bheil an dàta air a luchdachadh gu ceart, leugh an ZX Spectrum an rud ris an canar byte co-ionannachd (parity byte), a thèid a thomhas nuair a shàbhalas tu faidhle le XORing a h-uile byte den dàta sgrìobhte. Nuair a bhios tu a’ leughadh faidhle, bidh an coimpiutair a’ tomhas byte co-ionannachd bhon dàta a fhuaireadh agus, ma tha an toradh eadar-dhealaichte bhon fhear a chaidh a shàbhaladh, seallaidh e an teachdaireachd mearachd “R Tape loading error”. Gu cruaidh, faodaidh an coimpiutair an teachdaireachd seo a chuir a-mach nas tràithe mura h-urrainn dha, nuair a bhios e a’ leughadh, builleag aithneachadh (air a chall no nach eil an ùine aige a’ freagairt ri crìochan sònraichte)

Mar sin, chì sinn a-nis cò ris a tha comharra neo-aithnichte coltach:

Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

Is e seo an tòn pìleat. Tha cumadh a ’chomharra gu math eadar-dhealaichte, ach tha e soilleir gu bheil an comharra a’ toirt a-steach buillean goirid ath-aithris aig tricead sònraichte. Aig tricead samplachaidh de 44100 Hz, tha an astar eadar na “binneanan” timcheall air 48 sampall (a tha a rèir tricead ~918 Hz). Cuimhnichidh sinn am figear seo.

Bheir sinn sùil a-nis air a’ chriomag dàta:

Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

Ma thomhaiseas sinn an astar eadar buillean fa leth, tha e a’ tionndadh a-mach gu bheil an astar eadar buillean “fada” fhathast ~48 sampall, agus eadar feadhainn ghoirid - ~24. A 'coimhead air adhart beagan, bidh mi ag ràdh gun do thionndaidh e a-mach aig a' cheann thall gu bheil buillean "iomradh" le tricead 918 Hz a 'leantainn gu leantainneach, bho thoiseach gu deireadh an fhaidhle. Faodar gabhail ris nuair a bhios sinn a’ tar-chuir dàta, ma thachras buille a bharrachd eadar na buillean iomraidh, bidh sinn ga mheas mar bit 1, air neo 0.

Dè mu dheidhinn an sioncranachadh pulse? Bheir sinn sùil air toiseach an dàta:

Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

Thig an tòn pìleat gu crìch agus tòisichidh an dàta sa bhad. Beagan nas fhaide air adhart, às deidh dhuinn mion-sgrùdadh a dhèanamh air grunn chlàran claisneachd eadar-dhealaichte, bha e comasach dhuinn faighinn a-mach gu bheil a’ chiad byte de dhàta an-còmhnaidh mar an ceudna (10100101b, A5h). Is dòcha gun tòisich an coimpiutair a’ leughadh dàta às deidh dha fhaighinn.

Faodaidh tu cuideachd aire a thoirt do ghluasad a ’chiad chuisle iomraidh dìreach às deidh a’ 1d mu dheireadh anns a ’byte sioncranachaidh. Chaidh a lorg fada nas fhaide air adhart ann a bhith a 'leasachadh prògram aithne dàta, nuair nach b' urrainnear an dàta aig toiseach an fhaidhle a leughadh gu seasmhach.

A-nis feuchaidh sinn ri cunntas a thoirt air algairim a làimhsicheas faidhle claisneachd agus a luchdaicheas dàta.

A’ luchdachadh dàta

An toiseach, leig dhuinn sùil a thoirt air beagan bharailean gus an algairim a chumail sìmplidh:

  1. Cha bheachdaich sinn ach air faidhlichean ann an cruth WAV;
  2. Feumaidh am faidhle claisneachd tòiseachadh le tòna pìleat agus chan fhaod sàmhchair a bhith ann aig an toiseach
  3. Feumaidh ìre samplachaidh de 44100 Hz a bhith aig an fhaidhle stòr. Anns a ’chùis seo, tha an astar eadar buillean iomraidh 48 sampall air a dhearbhadh mar-thà agus chan fheum sinn obrachadh a-mach gu prògramach;
  4. Faodaidh cruth an t-sampall a bhith sam bith (8/16 pìosan / puing fleòdraidh) - oir nuair a bhios sinn ga leughadh is urrainn dhuinn a thionndadh chun fhear a tha thu ag iarraidh;
  5. Tha sinn a 'gabhail ris gu bheil am faidhle tùsail air a dhèanamh àbhaisteach le amplitude, a bu chòir an toradh a dhèanamh seasmhach;

Bidh an algorithm leughaidh mar a leanas:

  1. Leugh sinn am faidhle gu cuimhne, aig an aon àm ag atharrachadh an cruth sampall gu 8 pìosan;
  2. Obraich a-mach suidheachadh a’ chiad bhuille anns an dàta claisneachd. Gus seo a dhèanamh, feumaidh tu obrachadh a-mach an àireamh de shampall leis a 'char as àirde amplitude. Airson sìmplidh, bidh sinn ga thomhas aon uair le làimh. Sàbhailidh sinn e don chaochladair prev_pos;
  3. Cuir 48 ri suidheachadh na cuisle mu dheireadh (pos := prev_pos + 48)
  4. Leis nach eil àrdachadh an t-suidheachaidh le 48 a’ gealltainn gun ruig sinn suidheachadh na h-ath chuisle iomraidh (uireasbhaidhean teip, obrachadh neo-sheasmhach an uidheamachd draibhidh teip, msaa), feumaidh sinn suidheachadh a’ phuirt-puist atharrachadh. Gus seo a dhèanamh, gabh pìos beag dàta (pos-8; pos + 8) agus lorg an luach leudachaidh as àirde air. Thèid an suidheachadh a fhreagras ris an ìre as àirde a stòradh ann am pos. An seo tha 8 = 48/6 na sheasmhach a fhuaireadh gu deuchainneach, a tha a’ gealltainn gun socraich sinn an ìre as àirde ceart agus nach toir sinn buaidh air spionnadh eile a dh’ fhaodadh a bhith faisg air làimh. Ann an cùisean fìor dhona, nuair a tha an astar eadar buillean mòran nas lugha na no nas àirde na 48, faodaidh tu sgrùdadh èiginneach airson cuisle a chuir an gnìomh, ach taobh a-staigh raon an artaigil cha toir mi cunntas air seo san algairim;
  5. Aig a 'cheum roimhe, bhiodh e riatanach cuideachd dèanamh cinnteach gun deach a' chuisle iomraidh a lorg idir. Is e sin, ma tha thu dìreach a’ coimhead airson an ìre as àirde, chan eil seo a’ gealltainn gu bheil an spionnadh an làthair san roinn seo. Anns a’ bhuileachadh as ùire agam air a’ phrògram leughaidh, bidh mi a’ dèanamh sgrùdadh air an eadar-dhealachadh eadar na luachan leudachaidh as àirde agus as ìsle air earrann, agus ma thèid e thairis air crìoch sònraichte, bidh mi a’ cunntadh làthaireachd spionnadh. Is e a’ cheist cuideachd dè a nì thu mura lorgar a’ chuisle iomraidh. Tha 2 roghainn ann: an dàrna cuid tha an dàta air tighinn gu crìch agus tha sàmhchair a’ leantainn, no bu chòir beachdachadh air seo mar mhearachd leughaidh. Ach, fàgaidh sinn seo air falbh gus an algairim a dhèanamh nas sìmplidhe;
  6. Aig an ath cheum, feumaidh sinn faighinn a-mach a bheil cuisle dàta (beagan 0 no 1 ann), airson seo bheir sinn meadhan na h-earrainn (prev_pos; pos) middle_pos co-ionann ri middle_pos := (prev_pos + pos)/2 agus ann an cuid de nàbachd de middle_pos air an roinn (meadhan_pos-8; middle_pos +8) feuch an obraich sinn a-mach an leud as àirde agus as ìsle. Ma tha an eadar-dhealachadh eatarra nas motha na 10, bidh sinn a’ sgrìobhadh pìos 1 a-steach don toradh, air dhòigh eile tha 0. 10 na sheasmhach a gheibhear gu deuchainneach;
  7. Sàbhail an suidheachadh làithreach ann an prev_pos (prev_pos := pos)
  8. Dèan a-rithist a’ tòiseachadh bho cheum 3 gus an leugh sinn am faidhle gu lèir;
  9. Feumar an raon bit a thig às a shàbhaladh mar sheata de bytes. Leis nach tug sinn aire don sync byte nuair a bha sinn a’ leughadh, is dòcha nach bi an àireamh de phìosan iomadaidh de 8, agus chan eil fios cuideachd air a’ chothromachadh a tha a dhìth. Anns a’ chiad bhuileachadh air an algairim, cha robh fios agam gu robh am byte sioncranachaidh ann agus mar sin cha do shàbhail mi ach 8 faidhlichean le diofar àireamhan de phìosan dheth. Ann an aon dhiubh bha dàta ceart. Anns an algairim dheireannach, bidh mi dìreach a’ toirt air falbh a h-uile pìos suas gu A5h, a leigeas leam am faidhle toraidh ceart fhaighinn sa bhad

Algorithm ann an Ruby, dhaibhsan aig a bheil ùidh
Thagh mi Ruby mar an cànan airson am prògram a sgrìobhadh, oir... Bidh mi a’ prògramadh air a’ mhòr-chuid den ùine. Chan eil an roghainn àrd-choileanadh, ach chan fhiach an obair astar leughaidh a dhèanamh cho luath ‘s a ghabhas.

# Используем gem 'wavefile'
require 'wavefile'

reader = WaveFile::Reader.new('input.wav')
samples = []
format = WaveFile::Format.new(:mono, :pcm_8, 44100)

# Читаем WAV файл, конвертируем в формат Mono, 8 bit 
# Массив samples будет состоять из байт со значениями 0-255
reader.each_buffer(10000) do |buffer|
  samples += buffer.convert(format).samples
end

# Позиция первого импульса (вместо 0)
prev_pos = 0
# Расстояние между импульсами
distance = 48
# Значение расстояния для окрестности поиска локального максимума
delta = (distance / 6).floor
# Биты будем сохранять в виде строки из "0" и "1"
bits = ""

loop do
  # Рассчитываем позицию следующего импульса
  pos = prev_pos + distance
  
  # Выходим из цикла если данные закончились 
  break if pos + delta >= samples.size

  # Корректируем позицию pos обнаружением максимума на отрезке [pos - delta;pos + delta]
  (pos - delta..pos + delta).each { |p| pos = p if samples[p] > samples[pos] }

  # Находим середину отрезка [prev_pos;pos]
  middle_pos = ((prev_pos + pos) / 2).floor

  # Берем окрестность в середине 
  sample = samples[middle_pos - delta..middle_pos + delta]

  # Определяем бит как "1" если разница между максимальным и минимальным значением на отрезке превышает 10
  bit = sample.max - sample.min > 10
  bits += bit ? "1" : "0"
end

# Определяем синхро-байт и заменяем все предшествующие биты на 256 бит нулей (согласно спецификации формата) 
bits.gsub! /^[01]*?10100101/, ("0" * 256) + "10100101"

# Сохраняем выходной файл, упаковывая биты в байты
File.write "output.cas", [bits].pack("B*")

thoradh air

An dèidh grunn dhreachan den algairim agus de chuibhlichean fheuchainn, bha mi fortanach rudeigin inntinneach fhaighinn:

Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

Mar sin, a’ breithneachadh leis na sreathan charactaran, tha prògram againn airson grafaichean a dhealbhadh. Ach, chan eil prìomh fhaclan ann an teacsa a’ phrògraim. Tha a h-uile prìomh fhacal air a chòdachadh mar bytes (gach luach> 80h). A-nis feumaidh sinn faighinn a-mach dè an coimpiutair bho na 80an a dh'fhaodadh prògraman a shàbhaladh sa chruth seo.

Gu dearbh, tha e glè choltach ri prògram BASIC. Bidh an coimpiutair ZX Spectrum a’ stòradh phrògraman timcheall air an aon chruth mar chuimhneachan agus a’ sàbhaladh phrògraman gu teip. Dìreach gun fhios, rinn mi sgrùdadh air na prìomh fhaclan an aghaidh clàr. Ach, bha an toradh follaiseach àicheil.

Rinn mi sgrùdadh cuideachd air prìomh fhaclan BASIC an Atari, Commodore 64 mòr-chòrdte agus grunn choimpiutairean eile aig an àm sin, airson an robh e comasach dhomh sgrìobhainnean a lorg, ach às aonais soirbheachas - cha robh an eòlas agam air na seòrsaichean de choimpiutairean retro cho farsaing.

An uairsin chuir mi romham a dhol an liosta, agus an uairsin thuit mo shealladh air ainm an neach-dèanamh Radio Shack agus an coimpiutair TRS-80. Seo na h-ainmean a chaidh a sgrìobhadh air bileagan nan cassettes a bha nan laighe air mo bhòrd! Cha robh mi eòlach air na h-ainmean sin roimhe agus cha robh mi eòlach air a’ choimpiutair TRS-80, agus mar sin bha e coltach riumsa gur e saothraiche caiséid claisneachd leithid BASF, Sony no TDK a bh’ ann an Radio Shack, agus b’ e an TRS-80 an ùine ath-chluich. Carson nach biodh?

Tandy coimpiutair / Radio Shack TRS-80

Tha e glè choltach gun deach an clàradh claisneachd sin, a thug mi seachad mar eisimpleir aig toiseach an artaigil, a dhèanamh air coimpiutair mar seo:

Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

Thionndaidh e a-mach gun robh fèill mhòr air a’ choimpiutair seo agus a sheòrsan (Model I / Model III / Model IV, msaa) aig aon àm (gu dearbh, chan ann san Ruis). Bu chòir a thoirt fa-near gur e Z80 am pròiseasar a chleachd iad cuideachd. Airson a 'choimpiutair seo gheibh thu air an eadar-lìon tòrr fiosrachaidh. Anns na 80an, chaidh fiosrachadh coimpiutair a sgaoileadh a-steach irisean. Aig an àm seo tha grunn emulators coimpiutairean airson diofar àrd-ùrlaran.

Luchdaich sìos mi an emulator trs80gp agus airson a’ chiad uair bha e comasach dhomh faicinn mar a bha an coimpiutair seo ag obair. Gu dearbh, cha do chuir an coimpiutair taic ri toradh dath; cha robh an rùn sgrion ach 128 × 48 piogsail, ach bha mòran leudachadh agus atharrachaidhean ann a dh’ fhaodadh rùn an sgrion àrdachadh. Bha mòran roghainnean ann cuideachd airson siostaman obrachaidh airson a’ choimpiutair seo agus roghainnean airson a’ chànan BASIC a chuir an gnìomh (nach robh, eu-coltach ris an ZX Spectrum, ann an cuid de mhodalan eadhon “air a lasadh” gu ROM agus dh’ fhaodadh roghainn sam bith a bhith air a luchdachadh bho diosc sùbailte, dìreach mar an OS fhèin)

Lorg mi cuideachd goireasachd gus clàraidhean claisneachd a thionndadh gu cruth CAS, a tha a’ faighinn taic bho emuladairean, ach airson adhbhar air choireigin cha robh e comasach clàraidhean bho na cassettes agam a leughadh gan cleachdadh.

Às deidh dhomh fòrmat faidhle CAS obrachadh a-mach (a thàinig a-mach mar dìreach leth-bhreac beag air bheag den dàta bhon teip a bha agam mar-thà ri làimh, ach a-mhàin an ceann-cinn le làthaireachd sioncranachaidh byte), rinn mi a glè bheag de dh’ atharrachaidhean air a’ phrògram agam agus bha e comasach dhomh faidhle CAS obrach a chuir a-mach a bha ag obair san emuladair (TRS-80 Model III):

Mar a fhuair mi air ais dàta ann an cruth neo-aithnichte bho teip magnetach

Dhealbhaich mi an dreach as ùire den ghoireas tionndaidh le dearbhadh fèin-ghluasadach air a’ chiad bhuille agus an astar eadar buillean iomraidh mar phasgan GEM, tha an còd stòr ri fhaighinn aig GitHub.

co-dhùnadh

B’ e turas inntinneach a bh’ anns an t-slighe air an do shiubhail sinn san àm a dh’ fhalbh, agus tha mi toilichte gun d’ fhuair mi am freagairt aig a’ cheann thall. Am measg rudan eile, tha mi:

  • Rinn mi a-mach an cruth airson dàta a shàbhaladh anns an ZX Spectrum agus rinn mi sgrùdadh air na cleachdaidhean ROM a chaidh a thogail a-steach airson dàta a shàbhaladh / a leughadh bho chlàran claisneachd
  • Fhuair mi eòlas air a’ choimpiutair TRS-80 agus na seòrsaichean aige, rinn mi sgrùdadh air an t-siostam obrachaidh, choimhead mi air prògraman sampaill agus eadhon bha cothrom agam debugging a dhèanamh ann an còdan inneal (às deidh a h-uile càil, tha a h-uile cuimhneachan Z80 eòlach orm)
  • Sgrìobh goireas làn-chuimseach airson clàran claisneachd a thionndadh gu cruth CAS, as urrainn dàta a leughadh nach eil aithnichte leis a’ ghoireas “oifigeil”

Source: www.habr.com

Cuir beachd ann