prehistory
Kuve munhu anoda retro hardware, ndakambotenga ZX Spectrum+ kubva kumutengesi kuUK. Yakabatanidzwa nekombuta yacho pachayo, ndakagamuchira makaseti akawanda okuteerera ane mitambo (mupakeji yepakutanga nemirayiridzo), pamwe chete nemapurogiramu akarekodhwa pamakaseti asina mavara anokosha. Zvinoshamisa kuti data kubva ku40-year-old cassettes yakaverengwa zvakanaka uye ndakakwanisa kutora inenge yose mitambo nemapurogiramu kubva kwavari.
Zvisinei, pane mamwe makaseti ndakawana marekodhi akanga asina kugadzirwa nekombiyuta yeZX Spectrum. Vainzwika zvakasiyana zvachose uye, kusiyana nemarekodhi kubva kukombiyuta yakataurwa, havana kutanga nekapfupi BASIC bootloader, iyo inowanzovapo mune zvinyorwa zvezvirongwa zvose nemitambo.
Kwenguva yakati rebei izvi zvakandishungurudza - ndaida chaizvo kuziva kuti chii chaive chakavigwa mavari. Kana iwe ukagona kuverenga iyo odhiyo siginecha senhevedzano yemabyte, unogona kutsvaga mavara kana chero chinhu chinoratidza kwakabva chiratidzo. Rudzi rwe retro-archaeology.
Zvino zvandafamba nzira yese uye ndinotarisa mavara emakaseti pachawo, ndinonyemwerera nekuti
mhinduro yaive pamberi pemeso angu nguva yese iyi
Pazita rekaseti yekuruboshwe pane zita rekombuta yeTRS-80, uye pazasi pezita remugadziri: "Yakagadzirwa neRadio Shack muUSA"
(Kana iwe uchida kuchengeta intrigue kusvika kumagumo, usaende pasi pemuparadzi)
Kuenzanisa kwemasaini masaini
Chekutanga, ngatiisei marekodhi ekurekodha. Unogona kuteerera zvazvinoita:
Uye senguva dzose kurekodha kubva kuZX Spectrum komputa inonzwika:
Muzviitiko zviviri izvi, pakutanga kwekurekodha kune inonzi pilot tone - ruzha rweiyo yakafanana frequency (mukutanga kurekodha ipfupi kwazvo <1 yechipiri, asi inosiyaniswa). Toni yekutyaira inoisa chiratidzo komputa kugadzirira kugamuchira data. Sezvo mutemo, komputa imwe neimwe inoziva chete "yake" mutyairi toni nechimiro chechiratidzo uye kuwanda kwayo.
Izvo zvinodikanwa kutaura chimwe chinhu pamusoro pechiratidzo chechimiro pachayo. Semuenzaniso, paZX Spectrum chimiro chayo chine rectangular:
Kana toni yekutyaira yaonekwa, iyo ZX Spectrum inoratidza chinjana tsvuku nebhuruu mabara pamuganho wechidzitiro kuratidza kuti chiratidzo chazivikanwa. Pilot toni inopera synchro pulse, iyo inoratidza kuti komputa itange kugamuchira data. Iyo inoratidzirwa nehupfupi hwenguva (inofananidzwa neyekuridza toni uye inotevera data) (ona mufananidzo)
Mushure mekunge sync pulse yagamuchirwa, komputa inorekodha imwe neimwe kusimuka / kudonha kwechiratidzo, kuyera nguva yayo. Kana nguva iri pasi peimwe muganhu, bit 1 inonyorerwa kundangariro, zvikasadaro 0. Mabhiti anounganidzwa mumabhaiti uye maitiro anodzokororwa kusvikira N bytes yagamuchirwa. Nhamba N inowanzotorwa kubva kumusoro wefaira yakatorwa. Kurodha kutevedzana kunotevera:
- pilot tone
- musoro (urefu hwakagadziriswa), ine saizi yedhata yakatorwa (N), zita refaira uye mhando
- pilot tone
- iyo data pachayo
Kuve nechokwadi chekuti data rakaremerwa nemazvo, iyo ZX Spectrum inoverenga iyo inonzi parity byte (parity byte), iyo inoverengerwa paunenge uchichengetedza faira neXORing ese mabheti e data rakanyorwa. Paunenge uchiverenga faira, komputa inoverengera parity byte kubva kune yakagamuchirwa data uye, kana mhedzisiro yakasiyana neyakachengetwa, inoratidza meseji yekukanganisa "R Tape kurodha kukanganisa". Kunyatsotaura, komputa inogona kuburitsa meseji iyi kare kana, kana ichiverenga, isingakwanise kuziva pulse (yakarasika kana nguva yayo isingaenderane nemimwe miganhu)
Saka, ngationei kuti chiratidzo chisingazivikanwe chinotaridzika sei:
Iyi ndiyo pilot toni. Chimiro chechiratidzo chakasiyana zvakanyanya, asi zviri pachena kuti chiratidzo chinosanganisira kudzokorora mapfupi mapfupi eimwe frequency. Pakuenzanisira frequency ye 44100 Hz, chinhambwe chiri pakati pe "peaks" chinenge 48 samples (inoenderana nefrequency ye ~ 918 Hz). Ngatirangarirei nhamba iyi.
Ngatitarisei ikozvino data fragment:
Kana tikayera chinhambwe pakati pemapurusi ega ega, zvinoitika kuti chinhambwe chiri pakati pe "refu" pulses ichiri ~ 48 samples, uye pakati pepfupi - ~ 24. Ndichitarisa mberi zvishoma, ndichataura kuti pakupedzisira zvakazoitika kuti "reference" pulses ine frequency ye 918 Hz inoenderera mberi, kubva pakutanga kusvika kumagumo efaira. Zvinogona kufungidzirwa kuti kana uchitumira data, kana imwe pulse yakasangana pakati pemareferensi pulses, tinoiona sediki 1, neimwe nzira 0.
Zvakadini nezve sync pulse? Ngatitarisei pakutanga kwedata:
Toni yekutyaira inopera uye data inotanga pakarepo. Mushure mechinguva chidiki, mushure mekuongorora akati wandei akasiyana marekodhi, takakwanisa kuona kuti yekutanga byte yedata inogara yakafanana (10100101b, A5h). Komputa inogona kutanga kuverenga data mushure mekunge yaigamuchira.
Iwe unogona zvakare kutarisisa kuchinjika kweyekutanga referensi pulse pakarepo mushure mekupedzisira 1st mu sync byte. Yakawanikwa gare gare mukugadzirisa chirongwa chekucherechedza data, apo data pakutanga kwefaira yaisagona kuverengwa zvakasimba.
Zvino ngatiedzei kutsanangura algorithm inozogadzirisa faira rekuteerera uye kurodha data.
Loading Data
Kutanga, ngatitarisei fungidziro shoma kuti tichengetedze algorithm iri nyore:
- Tichangotarisa mafaera muWAV fomati;
- Iyo faira yekuteerera inofanira kutanga nepilot toni uye haifanirwe kuve nekunyarara pakutanga
- Iyo faira faira inofanirwa kuve nesampling rate ye44100 Hz. Muchiitiko ichi, chinhambwe chiri pakati pemareferensi pulses ye48 samples yakatotemerwa uye isu hatifanire kuiverengera zvakarongeka;
- Sample fomati inogona kuva chero (8/16 bits/floating point) - kubvira pakuverenga tinogona kuishandura kune yaunoda;
- Isu tinofungidzira kuti iyo sosi faira yakajairwa neamplitude, iyo inofanirwa kudzikamisa mhedzisiro;
Iyo algorithm yekuverenga ichave inotevera:
- Isu tinoverenga iyo faira mundangariro, panguva imwechete ichishandura sampuli fomati ku8 bits;
- Sarudza nzvimbo yekutanga pulse mune data redhiyo. Kuti uite izvi, unofanirwa kuverenga nhamba yemuenzaniso nehukuru amplitude. Kuti zvive nyore, tichazviverenga kamwe chete. Ngatizvichengetei kune prev_pos musiyano;
- Wedzera 48 panzvimbo yekurova kwekupedzisira (pos := prev_pos + 48)
- Sezvo kuwedzera nzvimbo ne48 hakuvimbisi kuti tichasvika panzvimbo yeinotevera referensi pulse (tape defects, kusagadzikana kushanda kwe tepi drive mechanism, nezvimwewo), tinoda kugadzirisa nzvimbo yepos pulse. Kuti uite izvi, tora chidimbu chidiki che data (pos-8; pos +8) uye tsvaga iyo yakanyanya amplitude kukosha pairi. Nzvimbo inoenderana nepamusoro ichachengetwa mu pos. Pano 8 = 48/6 inguva yekuedza yakawanikwa, iyo inovimbisa kuti tichaona iyo yakakwana yepamusoro uye haizokanganisa mamwe mafungiro angave ari pedyo. Mumamiriro ezvinhu akaipa kwazvo, kana chinhambwe pakati pemapurusi chakanyanya kuderera kana kupfuura 48, unogona kuita kumanikidzirwa kutsvaga pulse, asi mukati mechikamu chechinyorwa ini handizotsananguri izvi mune algorithm;
- Panhanho yapfuura, zvingave zvakare zvakafanira kutarisa kuti referensi pulse yakawanikwa zvachose. Ndokunge, kana iwe uchingotsvaga iyo yakakwira, izvi hazvivimbise kuti iyo impulse iripo muchikamu ichi. Mukuita kwangu kwazvino kwechirongwa chekuverenga, ndinotarisa mutsauko pakati pehupamhi uye hudiki amplitude kukosha pachikamu, uye kana ikadarika imwe muganhu, ndinoverenga kuvepo kwekukurudzira. Mubvunzo ndewokuti chii chaunofanira kuita kana referensi pulse isingawanikwe. Pane 2 sarudzo: ingave iyo data yapera uye kunyarara kunotevera, kana izvi zvinofanirwa kutorwa sekukanganisa kuverenga. Nekudaro, isu tichasiya izvi kurerutsa iyo algorithm;
- Padanho rinotevera, tinoda kuona kuvepo kwedata pulse (bit 0 kana 1), nekuda kweizvi tinotora pakati pechikamu (prev_pos;pos) pakati_pos yakaenzana nepakati_pos := (prev_pos+pos)/2 uye mune imwe nharaunda yepakati_pos pachikamu (chepakati_pos-8;pakati_pos +8) ngativerengei huwandu uye hudiki amplitude. Kana mutsauko uripo pakati pawo unopfuura gumi, tinonyora bhiti 10 mumhedzisiro, kana zvisina kudaro 1. 0 inogara yakawanikwa ichiedzwa;
- Sevha chinzvimbo chiripo mu prev_pos (prev_pos := pos)
- Dzokorora kutanga kubva padanho rechitatu kusvika taverenga faira rose;
- Iyo inobuda bitti array inofanirwa kuchengetedzwa seti yemabhaiti. Sezvo isu tisina kufunga nezve sync byte pakuverenga, nhamba yebits inogona kunge isiri yakawanda ye8, uye inodiwa bit offset haizivikanwe zvakare. Mukutanga kuitiswa kwealgorithm, ini handina kuziva nezve kuvapo kweiyo sync byte uye saka ndakangochengeta 8 mafaera ane nhamba dzakasiyana dze offset bits. Imwe yacho ine data chaiyo. Mune yekupedzisira algorithm, ini ndinongobvisa zvese zvimedu kusvika kuA5h, izvo zvinonditendera kuti ndiwane nekukurumidza kubuda faira.
Algorithm muRuby, kune avo vanofarira
Ndakasarudza Ruby semutauro wekunyora purogiramu, nokuti ... Ini ndinoronga pairi nguva zhinji. Iyo sarudzo haisi yepamusoro-yekuita, asi basa rekuita kuverenga nekukurumidza sezvinobvira harina kukosha.
# ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ 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*")
mugumisiro
Sezvo ndayedza akati wandei akasiyana egorgorithm uye maconstants, ndakaita rombo rakanaka kuwana chimwe chinhu chinonakidza kwazvo:
Saka, tichitonga nemhando dzetambo, isu tine chirongwa chekuronga magirafu. Nekudaro, hapana mazwi akakosha mune zvinyorwa zvechirongwa. Ese mazwi akakosha akaiswa encoded semabhaiti (yega yega kukosha> 80h). Iye zvino tinoda kuona kuti ndeipi komputa kubva kuma80s inogona kuchengetedza zvirongwa mune iyi fomati.
Muchokwadi, yakafanana neiyo BASIC chirongwa. Iyo ZX Spectrum komputa inochengeta zvirongwa muinenge yakafanana fomati mundangariro uye inochengetedza zvirongwa kumatepi. Zvingoitika, ndakatarisa mazwi makuru achipikisa
Ndakatarisa zvakare mazwi eBASIC eAtari akakurumbira, Commodore 64 uye mamwe makomputa akati wandei enguva iyoyo, ayo ndakakwanisa kuwana zvinyorwa, asi pasina kubudirira - ruzivo rwangu rwemhando dzemakomputa eretro rwakazove rusina kupararira.
Ndakabva ndafunga kuenda
Computer Tandy/Radio Shack TRS-80
Zvinogoneka kuti kurekodha kwekuteerera kuri mubvunzo, kwandakapa semuenzaniso pakutanga kwechinyorwa, kwakaitwa pakombuta seizvi:
Zvakazoitika kuti kombiyuta iyi nemhando dzayo (Model I / Model III / Model IV, nezvimwewo) yaizivikanwa zvikuru panguva imwe chete (hongu, kwete muRussia). Izvo zvakakosha kuti processor yavakashandisa yaivewo Z80. Kune iyi komputa unogona kuwana paInternet
Ndakatora emulator
Ndakawanawo
Mushure mekuona iyo CAS faira fomati (iyo yakazove ingori chidimbu-ne-bit kopi yedata kubva patepi yandakanga ndiinayo paruoko, kunze kwemusoro nekuvapo kwe sync byte), ndakaita shanduko shoma kuchirongwa changu uye yakakwanisa kuburitsa faira reCAS rinoshanda rakashanda muemulator (TRS-80 Model III):
Ini ndakagadzira yazvino vhezheni yeshanduro yekushandisa ine otomatiki kutsunga kweyekutanga pulse uye chinhambwe pakati pereferensi pulses seGEM package, iyo sosi kodhi inowanikwa pa.
mhedziso
Nzira yatakafamba yakava rwendo runofadza rwekare, uye ndinofara kuti pakupedzisira ndakawana mhinduro. Pakati pezvimwe zvinhu, ini:
- Ndakafunga mafomati ekuchengetedza data muZX Spectrum uye ndakadzidza yakavakirwa-mukati maROM maitiro ekuchengetedza / kuverenga data kubva kuodhiyo makaseti.
- Ndakaziva komputa yeTRS-80 nemhando dzayo, ndakadzidza sisitimu yekushandisa, ndakatarisa zvirongwa zvemuenzaniso uye ndakatowana mukana wekuita debugging mumakodhi emakina (mushure mezvose, ese maZ80 mnemonics anozviziva kwandiri)
- Akanyora chishandiso chakazara chekushandura marekodhi ekurekodha kuita CAS fomati, iyo inogona kuverenga data risingazivikanwe ne "official" utility.
Source: www.habr.com