prehistory
Njengomthandi we-retro hardware, ngake ngathenga i-ZX Spectrum+ kumthengisi wase-UK. Kuhlanganiswe nekhompyutha ngokwayo, ngithole amakhasethi alalelwayo amaningana anemidlalo (ephaketheni lokuqala elineziqondiso), kanye nezinhlelo eziqoshwe kumakhasethi ngaphandle kokumaka okukhethekile. Ngokumangalisayo, idatha evela kumakhasethi aneminyaka engu-40 ubudala yayifundeka kahle futhi ngakwazi ukulanda cishe yonke imidlalo nezinhlelo kuzo.
Nokho, kwamanye amakhasethi ngathola ukuqoshwa okucacile ukuthi ayenziwanga ikhompyutha ye-ZX Spectrum. Bazwakala behluke ngokuphelele futhi, ngokungafani nokuqoshwa okuvela kukhompyutha eshiwo, abazange baqale nge-bootloader emfushane ye-BASIC, evame ukuba khona ekurekhodweni kwazo zonke izinhlelo nemidlalo.
Okwesikhathi esithile lokhu kwangiphatha kabi - ngangifuna ngempela ukuthola ukuthi yini eyayifihlwe kuzo. Uma ukwazi ukufunda isignali yomsindo njengokulandelana kwamabhayithi, ungabheka izinhlamvu nanoma yini ebonisa umsuka wesiginali. Uhlobo lwe-retro-archaeology.
Manje njengoba ngihambe yonke indlela futhi ngibheka amalebula amakhasethi ngokwawo, ngimamatheka ngoba
impendulo yayiphambi kwamehlo ami njalo
Kwilebula yekhasethi lesobunxele kunegama lekhompyutha ye-TRS-80, futhi ngezansi nje kwegama lomkhiqizi: βIkhiqizwe iRadio Shack e-USAβ
(Uma ufuna ukugcina uzungu kuze kube sekugcineni, ungangeni ngaphansi komchithi)
Ukuqhathaniswa kwezimpawu zomsindo
Okokuqala, masifake okurekhodiwe kwidijithali. Ungalalela ukuthi kuzwakala kanjani:
Futhi njengokujwayelekile ukuqoshwa okuvela kukhompyutha ye-ZX Spectrum kuzwakala:
Kuzo zombili izimo, ekuqaleni kokuqoshwa kukhona okuthiwa ithoni yomshayeli - umsindo wemvamisa efanayo (ekurekhodweni kokuqala kufushane kakhulu <isekhondi elingu-1, kodwa liyahlukaniseka). Ithoni yokuhlola ikhombisa ikhompuyutha ukuthi ilungiselele ukwamukela idatha. Njengomthetho, ikhompyutha ngayinye ibona kuphela ithoni yomshayeli "eyayo" ngokuma kwesiginali kanye nemvamisa yayo.
Kuyadingeka ukusho okuthile ngesimo sesignali ngokwayo. Isibonelo, ku-ZX Spectrum ukwakheka kwayo kungunxande:
Uma kutholwa ithoni yokushayela, i-ZX Spectrum ibonisa amabha abomvu naluhlaza ashintshana emngceleni wesikrini ukukhombisa ukuthi isignali iboniwe. Ithoni yokushayela iyaphela i-synchro pulse, okubonisa ikhompuyutha ukuthi iqale ukwamukela idatha. Ibonakala ngobude besikhathi obufushane (uma kuqhathaniswa nethoni yokuhlola kanye nedatha elandelayo) (bona umfanekiso)
Ngemuva kokuthi i-pulse yokuvumelanisa yamukelwe, ikhompuyutha irekhoda ukuphakama/ukwehla ngakunye kwesignali, ikala ubude bayo. Uma ubude besikhathi bungaphansi komkhawulo othile, ibhithi elingu-1 libhalwa enkumbulweni, ngaphandle kwalokho 0. Amabhithi aqoqwa abe amabhayithi futhi inqubo iphindaphindiwe kuze kube yilapho kutholwa amabhayithi angu-N. Inombolo N ivamise ukuthathwa enhlokweni yefayela elilandiwe. Ukulandelana kokulayisha imi kanje:
- ithoni yomshayeli
- unhlokweni (ubude obulungisiwe), uqukethe usayizi wedatha elandiwe (N), igama lefayela nohlobo
- ithoni yomshayeli
- idatha ngokwayo
Ukuqinisekisa ukuthi idatha ilayishwe ngendlela efanele, i-ZX Spectrum ifunda okuthiwa i-parity byte (ibhayithi yokulinganisa), ebalwa lapho ulondoloza ifayela ngo-XORing wonke amabhayithi edatha ebhaliwe. Lapho ufunda ifayela, ikhompuyutha ibala i-parity byte kusuka kudatha etholiwe futhi, uma umphumela uhlukile kulowo ogciniwe, ubonisa umlayezo wephutha "Iphutha lokulayisha i-R Tape". Uma sikhuluma ngokuqinile, ikhompuyutha ingakhipha lo mlayezo kusenesikhathi uma, lapho ifunda, ingakwazi ukubona ukushaya kwenhliziyo (okugejiwe noma ubude bayo bungahambisani nemikhawulo ethile)
Ngakho-ke, manje ake sibone ukuthi isignali engaziwa ibukeka kanjani:
Lena ithoni yomshayeli. Ukuma kwesignali kuhluke kakhulu, kodwa kusobala ukuthi isignali iqukethe ukuphindaphinda ama-pulses amafushane wemvamisa ethile. Kumvamisa yesampula engu-44100 Hz, ibanga eliphakathi kokuthi "iziqongo" cishe lingamasampuli angu-48 (elihambisana nemvamisa engu-~918 Hz). Masikhumbule lesi sibalo.
Manje ake sibheke ucezu lwedatha:
Uma sikala ibanga phakathi kwama-pulses angawodwana, kuvela ukuthi ibanga eliphakathi kwama-pulses "amade" lisengamasampuli angu-~48, futhi phakathi kwamafushane - ~ 24. Uma ngibheka phambili kancane, ngizosho ukuthi ekugcineni kwavela ukuthi ama-pulses "reference" anemvamisa ye-918 Hz alandela ngokuqhubekayo, kusukela ekuqaleni kuze kube sekupheleni kwefayela. Kungacatshangwa ukuthi lapho kudluliswa idatha, uma i-pulse eyengeziwe ihlangatshezwana nama-pulses ereferensi, sikubheka njenge-bit 1, ngaphandle kwalokho u-0.
Kuthiwani nge-sync pulse? Ake sibheke ekuqaleni kwedatha:
Ithoni yokuhlola iyaphela futhi idatha iqala ngokushesha. Kamuva, ngemva kokuhlaziya okurekhodiwe okuhlukahlukene okuhlukahlukene, sikwazile ukuthola ukuthi ibhayithi yokuqala yedatha ihlezi ifana (10100101b, A5h). Ikhompyutha ingase iqale ukufunda idatha ngemva kokuyithola.
Ungakwazi futhi ukunaka ukuguquka kokushaya kwesithenjwa kokuqala ngokushesha ngemva kokokugcina kubhayithi yokuvumelanisa. Kutholwe kamuva kakhulu kunqubo yokuthuthukisa uhlelo lokuqaphela idatha, lapho idatha ekuqaleni kwefayela ingakwazi ukufundwa ngokuzinzile.
Manje ake sizame ukuchaza i-algorithm ezocubungula ifayela elilalelwayo futhi ilayishe idatha.
Ilayisha Idatha
Okokuqala, ake sibheke ukuqagela okumbalwa ukuze sigcine i-algorithm ilula:
- Sizocabangela kuphela amafayela ngefomethi ye-WAV;
- Ifayela lomsindo kufanele liqale ngethoni yokuhlola futhi akufanele liqukathe ukuthula ekuqaleni
- Ifayela elingumthombo kufanele libe nesilinganiso sesampula esingu-44100 Hz. Kulokhu, ibanga eliphakathi kwama-reference pulses amasampula angu-48 selinqunyiwe kakade futhi asikho isidingo sokulibala ngokohlelo;
- Ifomethi yesampula ingaba yinoma yimaphi (amabhithi angu-8/16/iphuzu elintantayo) - kusukela lapho sifunda singayiguqulela kule esiyifunayo;
- Sicabanga ukuthi ifayela lomthombo lijwayelekile nge-amplitude, okufanele izinze umphumela;
I-algorithm yokufunda izoba kanje:
- Sifunda ifayela enkumbulweni, ngesikhathi esifanayo siguqule ifomethi yesampula kumabhithi angu-8;
- Nquma indawo ye-pulse yokuqala kudatha yomsindo. Ukuze wenze lokhu, udinga ukubala inombolo yesampula nge-amplitude enkulu. Ukwenza kube lula, sizoyibala kanye mathupha. Masiyigcine kokuguquguqukayo prev_pos;
- Engeza u-48 endaweni yokushaya kokugcina (pos := prev_pos + 48)
- Njengoba ukwandisa isikhundla ngo-48 akuqinisekisi ukuthi sizofika endaweni ye-pulse yereferensi elandelayo (ukukhubazeka kwe-tape, ukusebenza okungazinzile komshini we-tape drive, njll.), sidinga ukulungisa isikhundla se-pos pulse. Ukuze wenze lokhu, thatha idatha encane (pos-8;pos+8) futhi uthole inani eliphezulu le-amplitude kuyo. Indawo ehambisana nobukhulu izogcinwa ku-pos. Lapha i-8 = 48/6 iyisimo esitholwe ngokuhlolwa, esiqinisekisa ukuthi sizonquma ubukhulu obulungile futhi ngeke sithinte eminye imifuziselo engase ibe seduze. Ezimweni ezimbi kakhulu, lapho ibanga eliphakathi kwama-pulses lingaphansi kakhulu noma lingaphezulu kuka-48, ungasebenzisa ukusesha okuphoqelekile kwe-pulse, kodwa ngaphakathi kwe-athikili ngeke ngikuchaze lokhu ku-algorithm;
- Esinyathelweni sangaphambilini, kuzodingeka futhi ukuthi uhlole ukuthi i-pulse yereferensi itholakele nhlobo. Okusho ukuthi, uma umane ubheka ubukhulu, lokhu akuqinisekisi ukuthi umfutho ukhona kule ngxenye. Ekuqaliseni kwami ββββkwakamuva kohlelo lokufunda, ngibheka umehluko phakathi kwamanani aphezulu kanye nobuncane be-amplitude engxenyeni, futhi uma yeqa umkhawulo othile, ngibala ukuba khona komfutho. Umbuzo futhi ukuthi yini okufanele uyenze uma i-pulse yereferensi ingatholakali. Kunezinketho ezi-2: kungenzeka ukuthi idatha iphelile futhi ukuthula kuyalandela, noma lokhu kufanele kuthathwe njengephutha lokufunda. Nokho, sizokweqa lokhu ukuze senze i-algorithm ibe lula;
- Esinyathelweni esilandelayo, sidinga ukunquma ubukhona be-data pulse (bit 0 noma 1), kulokhu sithatha indawo ephakathi nesegimenti (prev_pos;pos) middle_pos elingana ne-middle_pos := (prev_pos+pos)/2 futhi endaweni ethile ye-middle_pos kwisegimenti (maphakathi_pos-8;maphakathi_pos +8) ake sibale ubukhulu nobuncane be-amplitude. Uma umehluko phakathi kwazo ungaphezu kuka-10, sibhala kancane u-1 kumphumela, ngaphandle kwalokho u-0. 10 uwukutholwa njalo kokuhlolwa;
- Londoloza indawo yamanje kokuthi prev_pos (prev_pos := pos)
- Phinda uqale kusukela esinyathelweni sesi-3 size silifunde lonke ifayela;
- Umphumela wohlelo lwebhithi kufanele ulondolozwe njengesethi yamabhayithi. Njengoba asizange sinake i-byte yokuvumelanisa lapho sifunda, inani lamabhithi lingase lingabi ukuphindaphinda kuka-8, futhi i-bit offset edingekayo nayo ayaziwa. Ekusetshenzisweni kokuqala kwe-algorithm, bengingazi ngobukhona be-byte yokuvumelanisa ngakho-ke ngimane ngilondoloze amafayela ayi-8 anezinombolo ezihlukene zama-offset bits. Enye yazo ibiqukethe idatha elungile. Ku-algorithm yokugcina, ngivele ngisuse zonke izingcezu kuze kufike ku-A5h, okungivumela ukuthi ngithole ngokushesha ifayela eliphumayo elilungile.
I-algorithm ku-Ruby, eyalabo abanentshisekelo
Ngikhethe uRuby njengolimi lokubhala uhlelo, ngoba... Ngihlela kuyo isikhathi esiningi. Inketho akuyona ukusebenza okuphezulu, kodwa umsebenzi wokwenza isivinini sokufunda ngokushesha ngangokunokwenzeka awufanelekile.
# ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ 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*")
Umphumela
Ngemva kokuzama ukuhlukahluka okuningana kwe-algorithm nama-constants, ngaba nenhlanhla yokuthola okuthile okuthakazelisa kakhulu:
Ngakho-ke, ukwahlulela ngezintambo zomlingiswa, sinohlelo lokuhlela amagrafu. Nokho, awekho amagama angukhiye embhalweni wohlelo. Wonke amagama angukhiye abhalwe ngekhodi njengamabhayithi (inani ngalinye > 80h). Manje sidinga ukuthola ukuthi iyiphi ikhompyutha evela kuma-80s engagcina izinhlelo ngale fomethi.
Eqinisweni, ifana kakhulu nohlelo lwe-BASIC. Ikhompiyutha ye-ZX Spectrum igcina izinhlelo ngefomethi efanayo kumemori futhi igcina izinhlelo ukuze iqoshwe. Uma kwenzeka, ngihlole amagama angukhiye ngokumelene
Ngiphinde ngahlola amagama angukhiye we-BASIC we-Atari ethandwayo, i-Commodore 64 namanye amakhompiyutha amaningana angaleso sikhathi, engikwazile ukuthola imibhalo, kodwa ngaphandle kwempumelelo - ulwazi lwami lwezinhlobo zamakhompiyutha we-retro aluzange lube lubanzi kangako.
Ngabe senginquma ukuhamba
I-Computer Tandy/Radio Shack TRS-80
Kungenzeka kakhulu ukuthi ukurekhodwa komsindo okukhulunywa ngakho, engikunike njengesibonelo ekuqaleni kwesihloko, kwenziwa kukhompuyutha kanje:
Kwavela ukuthi le khompyutha nezinhlobonhlobo zayo (Imodeli I / Imodeli III / Imodeli IV, njll.) yayithandwa kakhulu ngesikhathi esisodwa (yebo, hhayi eRussia). Kuyaphawuleka ukuthi iprosesa ababeyisebenzisa yayiyi-Z80. Kule khompyutha ungathola ku-inthanethi
Ngilande i-emulator
Nami ngithole
Ngemva kokuthola ifomethi yefayela le-CAS (okuvele kwaba ikhophi kancane-kancane yedatha evela kutheyiphu engangivele nginayo, ngaphandle kwesihloko esinobukhona bebhayithi yokuvumelanisa), ngenze izinguquko ezimbalwa kuhlelo lwami futhi ngakwazi ukukhipha ifayela elisebenzayo le-CAS elisebenze kusifanisi (TRS-80 Model III):
Ngiklame inguqulo yakamuva yensiza yokuguqula ngokunquma okuzenzakalelayo kwe-pulse yokuqala kanye nebanga phakathi kwama-reference pulses njengephakheji ye-GEM, ikhodi yomthombo iyatholakala kokuthi
isiphetho
Indlela esiye sayihamba yaphenduka yaba uhambo oluthakazelisayo lwesikhathi esidlule, futhi ngiyajabula ngokuthi ekugcineni ngiyitholile impendulo. Phakathi kwezinye izinto, mina:
- Ngithole ifomethi yokulondoloza idatha ku-ZX Spectrum futhi ngafunda imizila ye-ROM eyakhelwe ngaphakathi yokugcina/ukufunda idatha kumakhasethi alalelwayo.
- Ngajwayelana nekhompiyutha ye-TRS-80 nezinhlobonhlobo zayo, ngafunda uhlelo lokusebenza, ngabheka izinhlelo zesampula futhi ngathola nethuba lokwenza ukulungisa iphutha kumakhodi omshini (phela, wonke ama-mnemonics e-Z80 ajwayelekile kimi)
- Ubhale insiza ephelele yokuguqula okurekhodiwe komsindo kube ifomethi ye-CAS, engafunda idatha engaziwa insiza "esemthethweni"
Source: www.habr.com