ukubuzwa
Ukuba ngumthandi we-retro hardware, ndakhe ndathenga i-ZX Spectrum + kumthengisi wase-UK. Kubandakanywa nekhompyutha ngokwayo, ndifumene iikhasethi ezininzi zeaudio ezinemidlalo (kwipakethe yokuqala enemiyalelo), kunye neenkqubo ezirekhodiweyo kwiikhasethi ezingenazo iimpawu ezikhethekileyo. Okumangalisayo kukuba, idatha evela kwiikhasethi ze-40 ubudala yayifundeka kakuhle kwaye ndakwazi ukukhuphela phantse yonke imidlalo kunye neenkqubo ezivela kubo.
Nangona kunjalo, kwezinye iikhasethi ndifumene ukurekhoda okungenziwanga ngokucacileyo yiZX Spectrum computer. Bavakala behluke ngokupheleleyo kwaye, ngokungafaniyo nokurekhoda kwikhompyutheni ekhankanyiweyo, abazange baqale nge-BASIC bootloader emfutshane, edla ngokubakho kwiirekhodi zazo zonke iinkqubo kunye nemidlalo.
Kangangexesha elithile oku kwandikhathaza β ndandifuna ngokwenene ukwazi ukuba yintoni efihlwe kubo. Ukuba ubunokufunda umqondiso wesandi njengolandelelwano lwee-bytes, unokukhangela iimpawu okanye nantoni na ebonisa imvelaphi yomqondiso. Uhlobo lwe-retro-archaeology.
Ngoku ndihambe yonke indlela kwaye ndijonge iileyibhile zekhasethi ngokwazo, ndincuma kuba
impendulo ibiphambi kwamehlo am ngalo lonke ixesha
Kwileyibhile yekhasethi yasekhohlo kukho igama lekhompyutha ye-TRS-80, kwaye ngaphantsi nje kwegama lomenzi: βIveliswe yiRadio Shack e-USAβ
(Ukuba ufuna ukugcina iyelenqe kude kube sekupheleni, musa ukuya phantsi komphangi)
Ukuthelekiswa kwemiqondiso yomsindo
Okokuqala, masenze ushicilelo olurekhodiweyo lube yidijithali. Ungamamela ukuba ivakala njani:
Kwaye njengesiqhelo ukurekhodwa kwikhompyuter ye-ZX Spectrum kuvakala:
Kuzo zombini iimeko, ekuqaleni kokurekhoda kukho into ebizwa ithoni yomqhubi wenqwelomoya - isandi sokuphindaphinda okufanayo (kwirekhodi lokuqala lifutshane kakhulu <1 yesibini, kodwa iyahlukaniswa). Ithowuni yokulinga inika umqondiso kwikhompyuter ukuba ilungiselele ukufumana idatha. Njengomthetho, ikhomputha nganye ibona kuphela ithoni yomqhubi "yeyakhe" ngokuma kwesignali kunye nokuphindaphinda kwayo.
Kuyimfuneko ukuthetha into malunga nemilo yomqondiso ngokwayo. Umzekelo, kwi-ZX Spectrum imilo yayo ixande:
Xa ithoni yokulinga ifunyenwe, i-ZX Spectrum ibonisa imivalo ebomvu nebhlowu etshintshanayo kumda wesikrini ukubonisa ukuba isignali yamkelwe. Ithoni yokulinga iyaphela i-synchro pulse, ebonisa ukuba ikhomputha iqalise ukufumana idatha. Ibonakaliswa lixesha elifutshane (xa kuthelekiswa nethoni yokulinga kunye neenkcukacha ezilandelayo) (jonga umfanekiso)
Emva kokuba i-pulse ye-sync ifunyenwe, ikhompyutha irekhoda ukunyuka / ukuwa kwesignali nganye, ukulinganisa ubude bayo. Ukuba ixesha lingaphantsi komda othile, i-bit 1 ibhalwa kwimemori, kungenjalo 0. Iibhithi ziqokelelwa kwii-bytes kwaye inkqubo iphinda iphindwe de i-N bytes ifunyenwe. Inani elingu-N lidla ngokuthathwa kwiheader yefayile ekhutshelweyo. Ukulandelelanisa ukulayisha ngolu hlobo lulandelayo:
- ithoni yomqhubi wenqwelomoya
- iheader (ubude obulungisiweyo), iqulethe ubungakanani bedatha ekhutshelweyo (N), igama lefayile kunye nohlobo
- ithoni yomqhubi wenqwelomoya
- idatha ngokwayo
Ukuqinisekisa ukuba idatha ilayishwe ngokuchanekileyo, i-ZX Spectrum ifunda okubizwa ngokuba ukulingana byte (ibhayithi yokulinganisa), ebalwa xa ugcina ifayile ngoXORing zonke iibhayithi zedatha ebhaliweyo. Xa ufunda ifayile, ikhomputha ibala i-parity byte kwidatha efunyenweyo kwaye, ukuba umphumo uhluke kulowo ugciniweyo, ubonisa umyalezo wephutha "Iphutha le-R Tape yokulayisha". Ukuthetha ngokuthe ngqo, ikhomputha inokukhupha lo myalezo kwangaphambili ukuba, xa ufunda, ayikwazi ukuqonda i-pulse (iphoswe okanye ubude bayo abuhambelani nemida ethile)
Ke, ngoku makhe sibone ukuba uphawu olungaziwayo lujongeka njani:
Le yithoni yokulinga. Ubume bomqondiso buhluke kakhulu, kodwa kucacile ukuba umqondiso uquka ukuphindaphinda i-pulses emfutshane yefrikhwensi ethile. Kwisampulu yesampulu ye-44100 Hz, umgama phakathi "kweencopho" malunga neesampulu ezingama-48 (ezihambelana nokuphindaphinda kwe ~ 918 Hz). Masikhumbule lo mfanekiso.
Ngoku makhe sijonge isiqwenga sedatha:
Ukuba silinganisa umgama phakathi kwee-pulses zomntu ngamnye, kuvela ukuba umgama phakathi kwee-pulses "ezide" use ~ 48 iisampulu, kwaye phakathi kwezifutshane - ~ 24. Ukujonga phambili kancinci, ndiya kuthetha ukuba ekugqibeleni kwavela ukuba "ireferensi" i-pulses kunye ne-frequency ye-918 Hz ilandele ngokuqhubekayo, ukususela ekuqaleni ukuya ekupheleni kwefayile. Kungacingelwa ukuba xa uhambisa idatha, ukuba i-pulse eyongezelelweyo idibene phakathi kwee-reference pulses, siyithatha njenge-bit 1, ngaphandle koko i-0.
Kuthekani nge-sync pulse? Makhe sijonge ekuqaleni kwedatha:
Ithoni yokulinga iyaphela kwaye idatha iqala ngokukhawuleza. Kancinane kamva, emva kokuhlalutya ushicilelo oluvakalayo olwahlukeneyo, siye sakwazi ukufumanisa ukuba i-byte yokuqala yedatha isoloko ifana (10100101b, A5h). Ikhompyuter inokuqalisa ukufunda idatha emva kokuba iyifumene.
Unako kwakhona ukunika ingqalelo utshintsho lokuqala reference pulse ngoko nangoko emva 1st yokugqibela byte sync. Kwafunyaniswa kamva kakhulu kwinkqubo yokuphuhlisa inkqubo yokuqaphela idatha, xa idatha ekuqaleni kwefayile yayingenakufundwa ngokuzinzileyo.
Ngoku makhe sizame ukuchaza i-algorithm eya kuqhuba ifayile yomsindo kunye nokulayisha idatha.
Ilayisha idatha
Okokuqala, makhe sijonge kwiingqikelelo ezimbalwa ukugcina i-algorithm ilula:
- Siza kuqwalasela kuphela iifayile kwifomathi ye-WAV;
- Ifayile yeaudio kufuneka iqale ngethoni yokulinga kwaye mayingaqulathi ukuthula ekuqaleni
- Ifayile yomthombo kufuneka ibe nomlinganiselo wesampulu we-44100 Hz. Kule meko, umgama phakathi kwee-reference pulses zeesampuli ze-48 sele uzimisele kwaye akudingeki ukuba siwubale ngeprogram;
- Ifomathi yesampulu inokuba yiyo nayiphi na (i-8/16 bits/indawo edadayo) - ekubeni xa sifunda sinokuyiguqulela kulowo ufunwayo;
- Sicinga ukuba ifayile yomthombo iqhelekile nge-amplitude, ekufuneka izinzile umphumo;
I-algorithm yokufunda iya kuba ngolu hlobo lulandelayo:
- Sifunda ifayile kwimemori, ngexesha elifanayo ukuguqula ifomathi yesampuli kwiibhithi ezi-8;
- Qinisekisa indawo ye-pulse yokuqala kwidatha yomsindo. Ukwenza oku, kufuneka ubale inani lesampuli kunye nobuninzi be-amplitude. Ukwenza lula, siyakuyibala kube kanye ngesandla. Masiyigcine kwi-prev_pos eguquguqukayo;
- Yongeza u-48 kwindawo yokubetha kokugqibela (pos := prev_pos + 48)
- Ekubeni ukwandisa isikhundla nge-48 akuqinisekisi ukuba siya kufika kwindawo ye-pulse yesalathiso esilandelayo (iziphene ze-tape, ukusebenza okungazinzanga kwe-tape drive mechanism, njl.), kufuneka silungise indawo ye-pos pulse. Ukwenza oku, thatha idatha encinci (pos-8; pos +8) kwaye ufumane ixabiso eliphezulu le-amplitude kuyo. Isikhundla esihambelana nobuninzi siya kugcinwa kwi-pos. Apha i-8 = 48/6 yinto efunyenwe ngokuvavanywa rhoqo, eqinisekisa ukuba siya kugqiba ubuninzi obuchanekileyo kwaye asiyi kuchaphazela ezinye iimpembelelo ezinokuthi zibe kufuphi. Kwiimeko ezimbi kakhulu, xa umgama phakathi kwee-pulses ungaphantsi kakhulu okanye ukhulu kune-48, unokuphumeza ukukhangela okunyanzeliswayo kwi-pulse, kodwa ngaphakathi kwendawo yenqaku andiyi kuchaza oku kwi-algorithm;
- Kwinqanaba langaphambili, kuya kufuneka kwakhona ukujonga ukuba i-pulse yereferensi ifunyenwe konke konke. Oko kukuthi, ukuba ujonga nje ubuninzi, oku akuqinisekisi ukuba impembelelo ikhona kweli candelo. Kuphunyezo lwam lwamva nje lwenkqubo yokufunda, ndijonga umahluko phakathi kowona mgangatho uphezulu kunye nobuncinci bexabiso le-amplitude kwicandelo, kwaye ukuba lingaphezulu komda othile, ndibala ubukho bempembelelo. Umbuzo kwakhona ukuba wenze ntoni ukuba i-pulse yereferensi ayifumanekanga. Kukho iinketho ezi-2: mhlawumbi idatha iphelile kwaye ukuthula kulandele, okanye oku kufuneka kuthathwe njengempazamo yokufunda. Nangona kunjalo, siyakushiya oku ukwenza lula i-algorithm;
- Kwinqanaba elilandelayo, kufuneka siqinisekise ubukho bedatha yepulse (bit 0 okanye 1), kule nto sithatha umbindi wecandelo (prev_pos;pos) middle_pos elilingana no middle_pos := (prev_pos+pos)/2 kwaye kwindawo ethile ebumelwaneni bephakathi_kwicandelo (phakathi_pos-8; embindini_pos +8) masibale ubuninzi kunye nobuncinci beamplitude. Ukuba umahluko phakathi kwabo ungaphezulu kwe-10, sibhala bit 1 kwisiphumo, kungenjalo u-0. 10 yinto ehlala ifunyenwe ngokuvavanywa;
- Gcina indawo yangoku kwi-prev_pos (prev_pos := pos)
- Phinda uqale kwinyathelo lesi-3 de sifunde yonke ifayile;
- Uluhlu lwentwana olunesiphumo kufuneka lugcinwe njengeseti yee-bytes. Ekubeni asizange sithathele ingqalelo i-byte yongqamaniso xa sifunda, inani lamasuntswana alinakuphinda libe sisi-8, kwaye i-bit offset efunekayo ayaziwa. Ekuphunyezweni kokuqala kwe-algorithm, andizange ndiyazi malunga nobukho be-byte ye-sync kwaye ngoko ke ndagcina iifayile ezi-8 ezinamanani ahlukeneyo e-offset bits. Enye yazo iqulethe idatha echanekileyo. Kwi-algorithm yokugqibela, ndisusa zonke iibits ukuya kuthi ga kwi-A5h, endivumela ukuba ndifumane kwangoko ifayile yemveliso echanekileyo.
I-algorithm kwiRuby, kwabo banomdla
Ndikhethe uRuby njengolwimi lokubhala inkqubo, kuba... Iprogram kuyo ixesha elininzi. Ukhetho alukho ukusebenza okuphezulu, kodwa umsebenzi wokwenza isantya sokufunda ngokukhawuleza akufanelekile.
# ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ 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*")
Isiphumo
Emva kokuzama iindidi ezininzi ze-algorithm kunye ne-constants, ndibe nethamsanqa lokufumana into enomdla kakhulu:
Ngoko ke, ngokugweba ngeentambo zomlinganiswa, sineprogram yokucwangcisa iigrafu. Nangona kunjalo, akukho magama angundoqo kwisicatshulwa seprogram. Onke amagama angundoqo afakwe ngekhowudi njenge-bytes (ixabiso ngalinye> 80h). Ngoku kufuneka sifumanise ukuba yeyiphi ikhompyuter ekwi-80s enokugcina iinkqubo kule fomati.
Enyanisweni, ifana kakhulu nenkqubo ye-BASIC. Ikhompyuter ye-ZX Spectrum igcina iinkqubo malunga nefomathi efanayo kwimemori kwaye igcina iinkqubo kwiteyiphu. Nje ukuba kunokwenzeka, ndijonge amagama angundoqo ngokuchasene
Ndaphinda ndajonga amagama angundoqo e-BASIC e-Atari ethandwayo, i-Commodore 64 kunye nezinye iikhomputha ezininzi zelo xesha, apho ndakwazi ukufumana amaxwebhu, kodwa ngaphandle kwempumelelo-ulwazi lwam lweentlobo zeekhompyutheni ze-retro zajika zaba zibanzi.
Ndiye ndagqiba ekubeni ndihambe
Computer Tandy/Radio Shack TRS-80
Kunokwenzeka ukuba ukurekhoda okurekhodiweyo okubuzwayo, endikunike njengomzekelo ekuqaleni kwenqaku, kwenziwa kwikhompyuter ngolu hlobo:
Kwavela ukuba le khompyutha kunye neentlobo zayo (iModel I / Model III / Model IV, njl.) zazidume kakhulu ngexesha elinye (ngokuqinisekileyo, kungekhona eRashiya). Kuyaphawuleka ukuba iprosesa abayisebenzisileyo yayikwayiZ80. Kule khompyutha ungayifumana kwi-Intanethi
Ndikhuphele i-emulator
Nam ndifumene
Emva kokuba ndiyifumene ifomati yefayile ye-CAS (eye yajika yaba yikopi nje-by-bit yedatha esuka kwiteyiphu endandisele ndinayo, ngaphandle kweheader enobukho be-byte yongqamaniso), ndenze utshintsho olumbalwa kwinkqubo yam kwaye ikwazile ukuvelisa ifayile yeCAS esebenzayo esebenze kwi-emulator (TRS-80 Model III):
Ndenze uguqulelo lwamva nje lwesixhobo sokuguqula ngokuzimisela okuzenzekelayo kwe-pulse yokuqala kunye nomgama phakathi kwee-pulses zereferensi njengephakheji ye-GEM, ikhowudi yomthombo iyafumaneka
isiphelo
Indlela esiyihambileyo yajika yaba luhambo olunika umdla kwixesha elidlulileyo, kwaye ndiyavuya kuba ekugqibeleni ndiyifumene impendulo. Phakathi kwezinye izinto, mna:
- Ndicinge ifomathi yokugcina idatha kwi-ZX Spectrum kwaye ndafunda iindlela ze-ROM eyakhelwe-ngaphakathi yokugcina / ukufunda idatha kwiikhasethi zomsindo.
- Ndaye ndaqhelana nekhompyuter ye-TRS-80 kunye neentlobo zayo, ndafunda inkqubo yokusebenza, ndajonga iinkqubo zesampulu kwaye ndafumana nethuba lokwenza ukulungisa iimpazamo kwiikhowudi zoomatshini (emva koko, zonke iimnemonics zeZ80 ziqhelekile kum)
- Ubhale usetyenziso olupheleleyo lokuguqula ushicilelo olurekhodiweyo kwifomathi yeCAS, enokufunda idatha engaqondwayo yinto "esemthethweni"
umthombo: www.habr.com