Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

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.

Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

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:

Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

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:

  1. pilot tone
  2. musoro (urefu hwakagadziriswa), ine saizi yedhata yakatorwa (N), zita refaira uye mhando
  3. pilot tone
  4. 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:

Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

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:

Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

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:

Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

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:

  1. Tichangotarisa mafaera muWAV fomati;
  2. Iyo faira yekuteerera inofanira kutanga nepilot toni uye haifanirwe kuve nekunyarara pakutanga
  3. Iyo faira faira inofanirwa kuve nesampling rate ye44100 Hz. Muchiitiko ichi, chinhambwe chiri pakati pemareferensi pulses ye48 samples yakatotemerwa uye isu hatifanire kuiverengera zvakarongeka;
  4. Sample fomati inogona kuva chero (8/16 bits/floating point) - kubvira pakuverenga tinogona kuishandura kune yaunoda;
  5. Isu tinofungidzira kuti iyo sosi faira yakajairwa neamplitude, iyo inofanirwa kudzikamisa mhedzisiro;

Iyo algorithm yekuverenga ichave inotevera:

  1. Isu tinoverenga iyo faira mundangariro, panguva imwechete ichishandura sampuli fomati ku8 bits;
  2. 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;
  3. Wedzera 48 panzvimbo yekurova kwekupedzisira (pos := prev_pos + 48)
  4. 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;
  5. 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;
  6. 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;
  7. Sevha chinzvimbo chiripo mu prev_pos (prev_pos := pos)
  8. Dzokorora kutanga kubva padanho rechitatu kusvika taverenga faira rose;
  9. 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:

Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

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 table. Zvisinei, muuyo wacho sezviri pachena wakanga usina kunaka.

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 iyo rondedzero, uye ipapo maziso angu akawira pazita remugadziri Radio Shack uye TRS-80 komputa. Aya ndiwo mazita akanga akanyorwa pamapepa emakaseti akanga ari patafura yangu! Ndanga ndisingazive mazita aya kare uye ndaisaziva nezvekombuta yeTRS-80, saka kwandiri zvakaita sekuti Radio Shack yaive mugadziri wemakaseti ekuteerera akadai seBASF, Sony kana TDK, uye TRS-80 yaive nguva yekutamba. Kuregererei?

Computer Tandy/Radio Shack TRS-80

Zvinogoneka kuti kurekodha kwekuteerera kuri mubvunzo, kwandakapa semuenzaniso pakutanga kwechinyorwa, kwakaitwa pakombuta seizvi:

Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

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 ruzivo rwakawanda. Muma80s, ruzivo rwekombuta rwakagoverwa mukati magazini. Parizvino pane akati wandei emulators makombiyuta emapuratifomu akasiyana.

Ndakatora emulator trs80gp uye kekutanga ndakakwanisa kuona kuti komputa iyi yakashanda sei. Ehe, komputa haina kutsigira kubuda kwemavara; iyo skrini yekugadziriswa yaingove 128x48 pixels, asi pakanga paine akawanda ekuwedzera uye magadzirirwo ayo aigona kuwedzera skrini. Paivewo nesarudzo dzakawanda dzemashandisirwo ekombuta iyi uye sarudzo dzekushandisa mutauro weBASIC (iyo, kusiyana neZX Spectrum, mune mamwe mamodheru haina kana "kupenya" muROM uye chero sarudzo yaigona kutakurwa kubva pafloppy disk, senge. iyo OS pachayo)

Ndakawanawo utility kushandura marekodhi ekurekodhwa kuita CAS fomati, inotsigirwa nemaemulators, asi nekuda kwechimwe chikonzero zvaisaita kuverenga zvakarekodhwa kubva mumakaseti angu ndichishandisa iwo.

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):

Matorero andakaita data mune isingazivikanwe fomati kubva kune magineti tepi

Ini ndakagadzira yazvino vhezheni yeshanduro yekushandisa ine otomatiki kutsunga kweyekutanga pulse uye chinhambwe pakati pereferensi pulses seGEM package, iyo sosi kodhi inowanikwa pa. Github.

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

Voeg