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.
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:
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:
- kamvekedwe ka woyendetsa
- mutu (utali wokhazikika), uli ndi kukula kwa data yotsitsidwa (N), dzina lafayilo ndi mtundu
- kamvekedwe ka woyendetsa
- 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:
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:
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:
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:
- Tingoganizira mafayilo amtundu wa WAV;
- Fayilo yomvera iyenera kuyamba ndi kamvekedwe ka woyendetsa ndipo isakhale chete poyambira
- Fayilo yoyambira iyenera kukhala ndi zitsanzo za 44100 Hz. Pankhaniyi, mtunda wapakati pa ma pulses a 48 zitsanzo zatsimikiziridwa kale ndipo sitiyenera kuwerengera mwadongosolo;
- Mtundu wa zitsanzo ukhoza kukhala uliwonse (8/16 bits/point yoyandama) - popeza powerenga titha kusinthira ku zomwe tikufuna;
- Timaganiza kuti fayilo yoyambira imasinthidwa ndi matalikidwe, omwe amayenera kukhazikika;
Ma algorithm owerengera adzakhala motere:
- Timawerenga fayilo mu kukumbukira, nthawi yomweyo kutembenuza mawonekedwe a chitsanzo kukhala ma bits 8;
- 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;
- Onjezani 48 pamalo pomwe kugunda komaliza (pos := prev_pos + 48)
- 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;
- 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;
- 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;
- Sungani zomwe zili mu prev_pos (prev_pos := pos)
- Bwerezani kuyambira sitepe 3 mpaka titawerenga fayilo yonse;
- 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:
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
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
Kompyuta Tandy/Radio Shack TRS-80
Ndizotheka kuti zojambulira zomwe zikufunsidwa, zomwe ndidapereka mwachitsanzo kumayambiriro kwa nkhaniyi, zidapangidwa pakompyuta motere:
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
Ndatsitsa emulator
Ndinapezanso
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):
Ndidapanga mtundu waposachedwa kwambiri wogwiritsa ntchito kutembenuka ndikudziwikiratu kugunda koyamba komanso mtunda pakati pa ma pulses ngati phukusi la GEM, code code ikupezeka pa
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