Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

prehistory

Pokhala wokonda zida za retro, nthawi ina ndinagula ZX Spectrum + kuchokera kwa wogulitsa ku UK. Kuphatikizidwa ndi kompyuta yokha, ndinalandira makaseti angapo omvera okhala ndi masewera (m'mapaketi oyambirira okhala ndi malangizo), komanso mapulogalamu ojambulidwa pa makaseti opanda zizindikiro zapadera. Chodabwitsa n'chakuti deta yochokera ku makaseti a zaka 40 inali yowerengedwa bwino ndipo ndinatha kukopera pafupifupi masewera onse ndi mapulogalamu kuchokera kwa iwo.

Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

Komabe, pamakaseti ena ndidapeza zojambulidwa zomwe mwachiwonekere sizinapangidwe ndi kompyuta ya ZX Spectrum. Zinkamveka mosiyana kwambiri ndipo, mosiyana ndi zojambulidwa kuchokera pa kompyuta yomwe yatchulidwa, sanayambe ndi bootloader yaifupi ya BASIC, yomwe nthawi zambiri imakhalapo muzojambula za mapulogalamu ndi masewera onse.

Kwa nthawi yayitali izi zidandivutitsa - ndidafunadi kudziwa zomwe zidabisika mwa iwo. Ngati mungawerenge siginecha yomvera ngati ma byte, mutha kuyang'ana zilembo kapena chilichonse chomwe chikuwonetsa komwe chizindikirocho chinachokera. Mtundu wa retro-archaeology.

Tsopano popeza ndapita njira yonse ndikuyang'ana zolemba za makaseti okha, ndikumwetulira chifukwa

yankho linali pamaso panga nthawi yonseyi
Pa lemba ya kaseti yakumanzere pali dzina la kompyuta ya TRS-80, ndipo pansi pa dzina la wopanga: "Yopangidwa ndi Radio Shack ku USA"

(Ngati mukufuna kusunga chiwembucho mpaka kumapeto, musapite pansi pa wowononga)

Kufananiza kwa ma audio

Choyamba, tiyeni tisinthe mawu omvera pa digito. Mutha kumvera zomwe zikumveka:


Ndipo mwachizolowezi kujambula kuchokera pakompyuta ya ZX Spectrum kumamveka:


Muzochitika zonsezi, kumayambiriro kwa kujambula pali otchedwa kamvekedwe ka woyendetsa - phokoso lafupipafupi (pakujambula koyamba ndi lalifupi kwambiri <1 sekondi imodzi, koma imasiyanitsidwa). Toni yoyendetsa ndege imasonyeza kompyuta kuti ikonzekere kulandira deta. Monga lamulo, kompyuta iliyonse imazindikira kamvekedwe kake "yake" kokha ndi mawonekedwe a chizindikiro ndi ma frequency ake.

M'pofunika kunena chinachake za mawonekedwe chizindikiro palokha. Mwachitsanzo, pa ZX Spectrum mawonekedwe ake ndi amakona anayi:

Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

Pamene kamvekedwe ka woyendetsa ndege kadziwika, ZX Spectrum imawonetsa mipiringidzo yofiira ndi yabuluu pamalire a chinsalu kusonyeza kuti chizindikirocho chadziwika. Mamvekedwe a woyendetsa amatha synchro pulse, zomwe zimasonyeza kompyuta kuti iyambe kulandira deta. Imadziwika ndi nthawi yayifupi (poyerekeza ndi kamvekedwe ka woyendetsa ndi deta yotsatila) (onani chithunzi)

Pambuyo pa kugunda kwa sync kulandiridwa, kompyuta imalemba kukwera / kugwa kulikonse kwa chizindikiro, kuyeza nthawi yake. Ngati nthawiyo ili yochepa kuposa malire ena, pang'ono 1 imalembedwa pamtima, mwinamwake 0. Ma bits amasonkhanitsidwa kukhala ma byte ndipo ndondomekoyi ikubwerezedwa mpaka N bytes ilandilidwa. Nambala N nthawi zambiri imatengedwa kuchokera pamutu wa fayilo yotsitsidwa. Kutsitsa kwadongosolo kuli motere:

  1. kamvekedwe ka woyendetsa
  2. mutu (utali wokhazikika), uli ndi kukula kwa data yotsitsidwa (N), dzina lafayilo ndi mtundu
  3. kamvekedwe ka woyendetsa
  4. deta yokha

Kuti muwonetsetse kuti deta imayikidwa bwino, ZX Spectrum imawerenga zomwe zimatchedwa parity byte (parity byte), yomwe imawerengedwa posunga fayilo ndi XORing ma byte onse a data yolembedwa. Powerenga fayilo, kompyuta imawerengera parity byte kuchokera ku data yomwe idalandilidwa ndipo, ngati zotsatira zake zikusiyana ndi zomwe zasungidwa, zimawonetsa uthenga wolakwika "R Tape loading error". Kunena zowona, kompyuta imatha kutulutsa uthengawu kale ngati, powerenga, sichingazindikire kugunda kwa mtima (kuphonya kapena kutalika kwake sikukugwirizana ndi malire ena)

Chifukwa chake, tiyeni tiwone momwe chizindikiro chosadziwika chimawonekera:

Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

Iyi ndiye kamvekedwe kake. Mawonekedwe a chizindikirocho ndi osiyana kwambiri, koma zikuwonekeratu kuti chizindikirocho chimakhala ndi kubwereza mafupipafupi afupipafupi. Pazitsanzo za 44100 Hz, mtunda wa pakati pa "nsonga" ndi pafupifupi zitsanzo 48 (zomwe zimagwirizana ndi mafupipafupi a ~ 918 Hz). Tiyeni tikumbukire chiwerengerochi.

Tiyeni tsopano tiwone gawo la data:

Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

Ngati tiyesa mtunda pakati pa ma pulse, zimakhala kuti mtunda wapakati pa "zautali" udakali ~ 48 zitsanzo, ndi pakati pa zazifupi - ~ 24. Kuyang'ana patsogolo pang'ono, ndikunena kuti pamapeto pake zidapezeka kuti "zowonjezera" zokhala ndi ma frequency a 918 Hz zimatsata mosalekeza, kuyambira pachiyambi mpaka kumapeto kwa fayilo. Titha kuganiziridwa kuti potumiza deta, ngati kugunda kowonjezera kumakumana pakati pa ma pulses, timawona ngati 1, apo ayi 0.

Nanga bwanji sync pulse? Tiyeni tiwone chiyambi cha data:

Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

Mamvekedwe oyendetsa amatha ndipo deta imayamba nthawi yomweyo. Patapita nthawi, titasanthula zojambulira zingapo zosiyanasiyana, tidatha kuzindikira kuti byte yoyamba ya data imakhala yofanana nthawi zonse (10100101b, A5h). Kompyutayo ingayambe kuwerenga deta ikalandira.

Mutha kulabadiranso kusuntha kwa kugunda koyambira koyamba mutangomaliza 1st mu sync byte. Zinapezeka pambuyo pake popanga pulogalamu yozindikiritsa deta, pamene deta yomwe ili kumayambiriro kwa fayiloyo sinathe kuwerengedwa mokhazikika.

Tsopano tiyeni tiyese kufotokoza algorithm yomwe ikonza fayilo yomvera ndikutsitsa deta.

Loading Data

Choyamba, tiyeni tiwone malingaliro angapo kuti tisunge ma algorithm osavuta:

  1. Tingoganizira mafayilo amtundu wa WAV;
  2. Fayilo yomvera iyenera kuyamba ndi kamvekedwe ka woyendetsa ndipo isakhale chete poyambira
  3. Fayilo yoyambira iyenera kukhala ndi zitsanzo za 44100 Hz. Pankhaniyi, mtunda wapakati pa ma pulses a 48 zitsanzo zatsimikiziridwa kale ndipo sitiyenera kuwerengera mwadongosolo;
  4. Mtundu wa zitsanzo ukhoza kukhala uliwonse (8/16 bits/point yoyandama) - popeza powerenga titha kusinthira ku zomwe tikufuna;
  5. Timaganiza kuti fayilo yoyambira imasinthidwa ndi matalikidwe, omwe amayenera kukhazikika;

Ma algorithm owerengera adzakhala motere:

  1. Timawerenga fayilo mu kukumbukira, nthawi yomweyo kutembenuza mawonekedwe a chitsanzo kukhala ma bits 8;
  2. Tsimikizirani malo a kugunda koyamba muzomvera. Kuti muchite izi, muyenera kuwerengera chiwerengero cha chitsanzocho ndi matalikidwe apamwamba kwambiri. Kuti zikhale zosavuta, tidzawerengera kamodzi pamanja. Tiyeni tisunge ku prev_pos kusinthika;
  3. Onjezani 48 pamalo pomwe kugunda komaliza (pos := prev_pos + 48)
  4. Popeza kuwonjezeka kwa malo ndi 48 sikutsimikizira kuti tidzafika pa malo amtundu wotsatira (zowonongeka kwa tepi, kusakhazikika kwa makina oyendetsa tepi, ndi zina zotero), tiyenera kusintha malo a pos pulse. Kuti muchite izi, tengani kachidutswa kakang'ono ka deta (pos-8; pos +8) ndikupeza phindu lalikulu la matalikidwe pa izo. Malo ogwirizana ndi kuchuluka kwake adzasungidwa mu pos. Apa 8 = 48/6 ndizomwe zimapezedwa moyeserera, zomwe zimatsimikizira kuti tidzazindikira kuchuluka koyenera ndipo sizikhudza zikhumbo zina zomwe zingakhale pafupi. Pazifukwa zoipa kwambiri, pamene mtunda pakati pa pulses ndi wocheperapo kapena wokulirapo kuposa 48, kufufuza kokakamiza kwa pulse kungathe kuchitidwa, koma mkati mwa nkhaniyo sindidzalongosola izi mu algorithm;
  5. Pa sitepe yapitayi, pangakhalenso kofunika kuwonetsetsa kuti phokoso lachidziwitso linapezeka konse. Ndiko kuti, ngati mungoyang'ana pazipita, izi sizikutanthauza kuti chikhumbocho chilipo mu gawo ili. Pakukhazikitsa kwanga kwaposachedwa kwa pulogalamu yowerengera, ndimayang'ana kusiyana pakati pamlingo wokulirapo komanso wocheperako pagawo, ndipo ngati ipitilira malire ena, ndimawerengera kukhalapo kwa chisonkhezero. Funso ndilofunikanso kuchita ngati kugunda kwazomwe sikunapezeke. Pali 2 zosankha: mwina deta yatha ndipo kukhala chete kumatsatira, kapena izi ziyenera kuonedwa ngati zolakwika zowerenga. Komabe, tidzasiya izi kuti tichepetse ma aligorivimu;
  6. Pa sitepe yotsatira, tiyenera kudziwa kukhalapo kwa kugunda kwa data (bit 0 kapena 1), chifukwa cha izi timatenga pakati pa gawo (prev_pos;pos) middle_pos wofanana pakati_pos := (prev_pos+pos)/2 ndi m'dera lina lapakati_pos pagawo (pakati_pos-8;pakati_pos +8) tiyeni tiwerengere kuchuluka kwake ndi matalikidwe ochepera. Ngati kusiyana pakati pawo kuli kopitilira 10, timalemba pang'ono 1 pazotsatira, apo ayi 0. 10 ndizomwe zimapezedwa mosalekeza;
  7. Sungani zomwe zili mu prev_pos (prev_pos := pos)
  8. Bwerezani kuyambira sitepe 3 mpaka titawerenga fayilo yonse;
  9. Zotsatira za bit array ziyenera kusungidwa ngati ma byte. Popeza sitinaganizire za sync byte powerenga, chiwerengero cha bits sichingakhale chochuluka cha 8, ndipo chofunika kwambiri sichidziwikanso. Pakukhazikitsa koyambirira kwa ma aligorivimu, sindimadziwa za kukhalapo kwa ma sync byte motero ndidangosunga mafayilo 8 okhala ndi manambala osiyanasiyana azitsulo. Chimodzi mwa izo chinali ndi deta yolondola. Mu aligorivimu yomaliza, ndimangochotsa ma bits onse mpaka A5h, zomwe zimandilola kuti ndipeze fayilo yoyenera.

Algorithm mu Ruby, kwa omwe ali ndi chidwi
Ndinasankha Ruby ngati chinenero cholembera pulogalamuyi, chifukwa ... Ndimapanga pulogalamu nthawi zambiri. Chosankhacho sichichita bwino kwambiri, koma ntchito yowerengera mofulumira momwe mungathere siiyenera.

# Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ 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*")

chifukwa

Nditayesa mitundu ingapo ya algorithm ndi zosinthika, ndinali ndi mwayi kupeza china chosangalatsa kwambiri:

Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

Chifukwa chake, potengera zingwe zamakhalidwe, tili ndi pulogalamu yokonza ma graph. Komabe, palibe mawu osakira m'mawu a pulogalamuyi. Mawu onse osakira amasungidwa ngati ma byte (mtengo uliwonse> 80h). Tsopano tiyenera kupeza kompyuta kuchokera 80s akhoza kusunga mapulogalamu mu mtundu uwu.

M'malo mwake, ndizofanana kwambiri ndi pulogalamu ya BASIC. Makompyuta a ZX Spectrum amasunga mapulogalamu m'njira yofanana ndikukumbukira ndikusunga mapulogalamu patepi. Zikatero, ndinayang'ana mawu osakira tebulo. Komabe, zotsatira zake mwachiwonekere zinali zoipa.

Ndinayang'ananso mawu osakira a BASIC a Atari, Commodore 64 ndi makompyuta ena angapo a nthawi imeneyo, omwe ndinatha kupeza zolemba, koma osapambana - chidziwitso changa cha mitundu ya makompyuta a retro sichinali chachikulu.

Kenako ndinaganiza zopita mndandanda, ndiyeno maso anga adagwera pa dzina la wopanga Radio Shack ndi kompyuta ya TRS-80. Awa ndi mayina amene analembedwa pa malembo a makaseti amene anali patebulo langa! Mayinawa sindimawadziwa kale ndipo sindinkadziwa bwino za kompyuta ya TRS-80, kotero zinkawoneka kwa ine kuti Radio Shack inali yopanga makaseti omvera monga BASF, Sony kapena TDK, ndipo TRS-80 inali nthawi yosewera. Kulekeranji?

Kompyuta Tandy/Radio Shack TRS-80

Ndizotheka kuti zojambulira zomwe zikufunsidwa, zomwe ndidapereka mwachitsanzo kumayambiriro kwa nkhaniyi, zidapangidwa pakompyuta motere:

Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

Zinapezeka kuti kompyuta iyi ndi mitundu yake (Model I/Model III/Model IV, etc.) inali yotchuka kwambiri nthawi imodzi (kumene, osati ku Russia). Ndizodabwitsa kuti purosesa yomwe adagwiritsa ntchito inalinso Z80. Pakompyuta iyi mutha kupeza pa intaneti zambiri zambiri. M'zaka za m'ma 80, zambiri zamakompyuta zidagawidwa magazini. Pakali pano pali angapo emulators makompyuta a nsanja zosiyanasiyana.

Ndatsitsa emulator trs80gp ndipo kwa nthawi yoyamba ndinatha kuona momwe kompyutayi imagwirira ntchito. Zachidziwikire, kompyuta sinagwirizane ndi kutulutsa kwamitundu; mawonekedwe azithunzi anali ma pixel 128x48 okha, koma panali zowonjezera ndi zosintha zambiri zomwe zitha kukulitsa mawonekedwe a skrini. Panalinso zosankha zambiri zamakina ogwiritsira ntchito pakompyuta iyi ndi zosankha zogwiritsira ntchito chilankhulo cha BASIC (chomwe, mosiyana ndi ZX Spectrum, m'mitundu ina sichinali "kuwunikira" mu ROM ndipo njira iliyonse ikhoza kuikidwa pa floppy disk, monga OS yokha)

Ndinapezanso zothandiza kutembenuza zojambulira zomvera kukhala mtundu wa CAS, womwe umathandizidwa ndi otsatsira, koma pazifukwa zina sikunali kotheka kuwerenga zojambulidwa kuchokera ku makaseti anga ndikugwiritsa ntchito.

Nditaganizira za mtundu wa fayilo ya CAS (yomwe idangokhala kopi pang'ono-pang'ono ya data kuchokera pa tepi yomwe ndinali nayo kale, kupatula mutu wokhala ndi sync byte), ndinapanga zosintha zochepa pa pulogalamu yanga ndipo ndidatha kutulutsa fayilo yogwira ntchito ya CAS yomwe idagwira ntchito mu emulator (TRS-80 Model III):

Momwe ndinapezeranso deta mumtundu wosadziwika kuchokera pa tepi ya maginito

Ndidapanga mtundu waposachedwa kwambiri wogwiritsa ntchito kutembenuka ndikudziwikiratu kugunda koyamba komanso mtunda pakati pa ma pulses ngati phukusi la GEM, code code ikupezeka pa Github.

Pomaliza

Njira imene tayendamo inasanduka ulendo wochititsa chidwi m’mbuyomu, ndipo ndine wokondwa kuti pamapeto pake ndinapeza yankho. Mwa zina, ine:

  • Ndinalingalira kachitidwe ka kusunga deta mu ZX Spectrum ndikuphunzira njira zopangira ROM zosungira / kuwerenga deta kuchokera ku makaseti omvera.
  • Ndinadziwana ndi makompyuta a TRS-80 ndi mitundu yake, ndinaphunzira makina opangira opaleshoni, ndinayang'ana mapulogalamu a chitsanzo ndipo ndinali ndi mwayi wokonza makina a makina (pambuyo pake, zonse za Z80 ndizodziwika kwa ine)
  • Adalemba zida zonse zosinthira zojambulidwa kukhala mtundu wa CAS, zomwe zimatha kuwerenga zomwe sizikudziwika ndi "official" utility.

Source: www.habr.com

Kuwonjezera ndemanga