prehistory
Kaha ke ne ke rata lisebelisoa tsa retro, ke kile ka reka ZX Spectrum + ho morekisi oa UK. E kenyelelitsoe le k'homphieutha ka boeona, ke ile ka fumana lik'hasete tse 'maloa tsa molumo tse nang le lipapali (ka har'a sephutheloana sa pele se nang le litaelo), hammoho le mananeo a rekotiloeng lik'haseteng tse se nang matšoao a khethehileng. Ho makatsang ke hore lintlha tse tsoang lik'haseteng tsa lilemo tse 40 li ne li baloa hantle 'me ke khonne ho khoasolla hoo e batlang e le lipapali le mananeo ohle ho tsona.
Leha ho le joalo, lik’haseteng tse ling ke ile ka fumana lirekoto tse neng li sa etsoa ka ho hlaka ke k’homphieutha ea ZX Spectrum. Li ne li utloahala li fapane ka ho feletseng 'me, ho fapana le lirekoto tse tsoang k'homphieutheng e boletsoeng, ha lia ka tsa qala ka bootloader e khutšoanyane ea BASIC, eo hangata e leng teng lirekotong tsa mananeo ohle le lipapali.
Ka nako e itseng sena se ile sa ntšoenya - ke ne ke hlile ke batla ho tseba hore na ho patiloe eng ho bona. Haeba u ne u ka bala lets'oao la molumo e le tatellano ea li-byte, u ka sheba litlhaku kapa eng kapa eng e bonts'ang tšimoloho ea lets'oao. Mofuta oa retro-archaeology.
Kaha joale ke tsamaile hohle 'me ke sheba lileibole tsa lik'hasete ka botsona, ke bososela hobane
karabo e ne e le ka pel'a mahlo a ka nako eohle
Leiboleng ea k'hasete e ka letsohong le letšehali ho na le lebitso la komporo ea TRS-80, 'me ka tlase ho lebitso la moetsi: "E entsoe ke Radio Shack USA"
(Haeba u batla ho boloka bolotsana ho fihlela qetellong, u se ke ua kena tlas'a mohatelli)
Papiso ya matshwao a medumo
Pele ho tsohle, a re ke re kenyeng lirekoto tsa molumo ka mokhoa oa digital. U ka mamela hore na e utloahala joang:
'Me joalo ka tloaelo ho rekota ho tsoa komporong ea ZX Spectrum ho utloahala:
Maemong ana ka bobeli, qalong ea ho rekota ho na le seo ho thoeng ke molumo oa sefofane - molumo oa maqhubu a tšoanang (ha ho rekota ha pele o khutšoanyane haholo <1 motsotsoana, empa o khetholloa). Mohala oa sefofane o bontša k'homphieutha hore e itokisetse ho amohela data. E le molao, k'homphieutha e 'ngoe le e' ngoe e lemoha molumo oa "mofofisi" oa eona feela ka sebōpeho sa pontšo le maqhubu a eona.
Hoa hlokahala ho bua ho hong ka sebopeho sa pontšo ka boeona. Mohlala, ho ZX Spectrum sebopeho sa eona se khutlonnetsepa:
Ha molumo oa sefofane o fumanoa, ZX Spectrum e hlahisa mekoallo e khubelu le e putsoa moeling oa skrine ho bontša hore lets'oao le amohetsoe. Pilot tone e fela synchro pulse, e bontšang khomphuta hore e qale ho amohela data. E tšoauoa ka nako e khuts'oane (ha e bapisoa le molumo oa sefofane le data e latelang) (bona setšoantšo)
Ka mor'a hore ho amoheloe pulse ea sync, k'homphieutha e tlaleha ho phahama ho hong le ho hong ha letšoao, ho lekanya nako ea eona. Haeba nako e le ka tlase ho moeli o itseng, bit 1 e ngolloa mohopolong, ho seng joalo 0. Li-bits li bokelloa ka li-byte 'me ts'ebetso e phetoa ho fihlela N byte e amoheloa. Nomoro ea N hangata e nkuoa hloohong ea faele e jarollotsoeng. Tatelano ya loading ke e latelang:
- molumo oa sefofane
- hlooho (bolelele bo tsitsitseng), e na le boholo ba data e jarollotsoeng (N), lebitso la faele le mofuta
- molumo oa sefofane
- data ka boeona
Ho etsa bonnete ba hore data e laetsoe ka nepo, ZX Spectrum e bala seo ho thoeng ke parity byte (parity byte), e baloang ha u boloka faele ka XORing li-byte tsohle tsa data e ngotsoeng. Ha u bala faele, k'homphieutha e lekanya palo ea parity ho tloha ho data e amoheloang 'me, haeba sephetho se fapane le se bolokiloeng, se bontša molaetsa oa phoso "R Tape loading error". Ha e le hantle, k'homphieutha e ka fana ka molaetsa ona pejana haeba, ha e bala, e sitoa ho lemoha pulse (e hlolohetsoeng kapa nako ea eona ha e lumellane le meeli e itseng)
Kahoo, ha re boneng hore na lets'oao le sa tsejoeng le shebahala joang:
Ena ke molumo oa sefofane. Sebopeho sa pontšo se fapane haholo, empa ho hlakile hore letšoao le na le ho pheta-pheta maqhubu a makhutšoane a maqhubu a itseng. Ka makhetlo a 44100 Hz, sebaka se pakeng tsa "litlhōrō" ke lisampole tse ka bang 48 (tse lumellanang le maqhubu a ~ 918 Hz). A re hopoleng palo ena.
Joale ha re shebeng sekhechana sa data:
Haeba re lekanya sebaka se pakeng tsa maqhubu a motho ka mong, ho fumaneha hore sebaka se pakeng tsa "nako e telele" e ntse e le lisampole tse 48, 'me pakeng tsa tse khutšoanyane - ~ 24. Ha ke sheba pele, ke tla bolela hore qetellong ho ile ha fumaneha hore "referense" ea "referense" e nang le maqhubu a 918 Hz e ntse e tsoela pele, ho tloha qalong ho fihlela qetellong ea faele. Ho ka nahanoa hore ha o fetisetsa data, haeba ho kopana le pulse e eketsehileng pakeng tsa li-pulses tsa litšupiso, re e nka e le 1, ho seng joalo 0.
Ho thoe'ng ka sync pulse? Ha re shebeng qalong ea data:
Pilot tone e fela mme data e qala hang-hang. Nakoana hamorao, ka mor'a ho hlahloba lirekoto tse fapaneng tse fapaneng, re ile ra khona ho fumana hore byte ea pele ea data e lula e tšoana (10100101b, A5h). Khomphuta e ka qala ho bala data ka mor'a hore e e fumane.
U ka boela ua ela hloko phetoho ea molumo oa pele oa litšupiso hang ka mor'a 1st ea ho qetela ho sync byte. E ile ea sibolloa hamorao haholo ha ho ntse ho etsoa lenaneo la ho lemoha data, ha data qalong ea faele e ke ke ea baloa ka mokhoa o tsitsitseng.
Joale a re lekeng ho hlalosa algorithm e tla sebetsana le faele ea molumo le ho kenya data.
Loading Data
Taba ea pele, a re shebeng mehopolo e 'maloa ho boloka algorithm e le bonolo:
- Re tla nahana feela ka lifaele ka sebopeho sa WAV;
- Faele ea molumo e tlameha ho qala ka molumo oa sefofane 'me ha ea lokela ho ba le khutso qalong
- Faele ea mohloli e tlameha ho ba le sekhahla sa sampole sa 44100 Hz. Tabeng ena, sebaka se pakeng tsa litšupiso tsa lisampole tse 48 se se se khethiloe 'me ha ho hlokahale hore re se bale ka mokhoa oa lenaneo;
- Sebopeho sa mohlala se ka ba leha e le sefe (8/16 bits/floating point) - ho tloha ha re bala re ka e fetolela ho eo ue batlang;
- Re nka hore faele ea mohloli e tloaelehile ka amplitude, e lokelang ho tsitsisa sephetho;
Algorithm ea ho bala e tla ba ka tsela e latelang:
- Re bala faele mohopolong, ka nako e ts'oanang re fetola sebopeho sa mohlala ho li-bits tse 8;
- Etsa qeto ea boemo ba molumo oa pele ho data ea molumo. Ho etsa sena, o hloka ho bala palo ea sampuli ka boholo ba amplitude. Ho nolofatsa, re tla e bala hang ka letsoho. Ha re e boloke ho e feto-fetohang prev_pos;
- Kenya 48 sebakeng sa molumo oa ho qetela (pos := prev_pos + 48)
- Ho tloha ha ho eketsa boemo ka 48 ha ho tiise hore re tla fihla boemong ba pululo e latelang ea litšupiso (litšitiso tsa tepi, ts'ebetso e sa tsitsang ea mochine oa koloi, joalo-joalo), re lokela ho lokisa boemo ba pulse pos. Ho etsa sena, nka karolo e nyane ea data (pos-8; pos +8) 'me u fumane boleng bo phahameng ba amplitude ho eona. Boemo bo lumellanang le boholo bo tla bolokoa ka pos. Mona 8 = 48/6 ke ntho e sa khaotseng e fumanoeng ka liteko, e tiisang hore re tla fumana boholo bo nepahetseng 'me re ke ke ra ama tšusumetso e meng e ka bang haufi. Maemong a mabe haholo, ha sebaka se pakeng tsa li-pulse se le tlase haholo kapa se le seholo ho feta 48, o ka kenya ts'ebetsong patlisiso e qobelloang bakeng sa pulse, empa ka har'a sebaka sa sehlooho seo nke ke ka se hlalosa ka algorithm;
- Mohatong o fetileng, ho tla hlokahala hape ho hlahloba hore na pulse ea litšupiso e fumanoe ho hang. Ke hore, haeba u batla feela boholo, sena ha se tiise hore tšusumetso e teng karolong ena. Ts'ebetsong ea ka ea morao-rao ea lenaneo la ho bala, ke hlahloba phapang pakeng tsa litekanyetso tse phahameng le tse fokolang tsa amplitude karolong, 'me haeba e feta moeli o itseng, ke bala boteng ba tšusumetso. Potso hape ke seo u lokelang ho se etsa haeba pulse ea referense e sa fumanoe. Ho na le likhetho tse 2: ebang data e felile 'me khutso e latela, kapa sena se lokela ho nkuoa e le phoso ea ho bala. Leha ho le joalo, re tla siea sena ho nolofatsa algorithm;
- Mothating o latelang, re hloka ho tseba hore na ho na le pulse ea data (bit 0 kapa 1), bakeng sa sena re nka bohareng ba karolo (prev_pos;pos) middle_pos e lekanang le middle_pos := (prev_pos+pos)/2 le sebakeng se seng sa mahareng_pos karolong (bohare_pos-8;bohare_pos +8) ha re bale boholo le bonyane ba amplitude. Haeba phapang pakeng tsa bona e feta 10, re ngola bit 1 ho sephetho, ho seng joalo 0. 10 ke ntho e sa khaotseng e fumanoang ka liteko;
- Boloka boemo ba hajoale ho prev_pos (prev_pos := pos)
- Pheta ho qala mohato oa 3 ho fihlela re bala faele eohle;
- Li-bit array tse hlahisoang li tlameha ho bolokoa joalo ka sehlopha sa li-byte. Kaha ha rea ka ra ela hloko li-byte tsa sync ha re bala, palo ea li-bits e ka 'na ea se ke ea e-ba ngata ea 8,' me "bit offset" e hlokahalang le eona ha e tsejoe. Ts'ebetsong ea pele ea algorithm, ke ne ke sa tsebe ka boteng ba sync byte mme ka hona ke bolokile lifaele tse 8 tse nang le linomoro tse fapaneng tsa offset bits. E 'ngoe ea tsona e ne e na le data e nepahetseng. Ka algorithm ea ho qetela, ke tlosa likotoana tsohle ho fihla ho A5h, e leng se ntumellang hore hang-hang ke fumane faele e nepahetseng ea tlhahiso.
Algorithm ho Ruby, bakeng sa ba thahasellang
Ke khethile Ruby e le puo ea ho ngola lenaneo, hobane ... Ke lenaneo ka eona hangata. Khetho ha e na ts'ebetso e phahameng, empa mosebetsi oa ho etsa hore lebelo la ho bala kapele kamoo ho ka khonehang ha o tšoanelehe.
# Используем 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*")
sephetho
Kamora ho leka mefuta e mengata ea algorithm le li-constants, ke bile lehlohonolo ho fumana ho hong ho khahlisang haholo:
Kahoo, ho ahlola ka likhoele tsa sebopeho, re na le lenaneo la ho rala li-graph. Leha ho le joalo, ha ho na mantsoe a sehlooho temaneng ea lenaneo. Mantsoe ohle a bohlokoa a kentsoe joalo ka li-byte (boleng bo bong le bo bong> 80h). Hona joale re hloka ho fumana hore na ke khomphuta efe ho tloha lilemong tsa bo-80 e ka bolokang mananeo ka mokhoa ona.
Ha e le hantle, e tšoana haholo le lenaneo la BASIC. Khomphutha ea ZX Spectrum e boloka mananeo ka mokhoa o tšoanang mohopolong mme e boloka mananeo ho theipi. Feela haeba ho ka etsahala, ke ile ka hlahloba mantsoe a sehlooho khahlanong le
Ke ile ka boela ka hlahloba mantsoe a sehlooho a BASIC a Atari e tummeng, Commodore 64 le lik'homphieutha tse ling tse ngata tsa nako eo, tseo ke ileng ka khona ho li fumana, empa ntle le katleho - tsebo ea ka ea mefuta ea lik'homphieutha tsa retro e ne e se e pharaletseng haholo.
Eaba ke etsa qeto ea ho tsamaea
Computer Tandy/Radio Shack TRS-80
Ho ka etsahala hore ebe rekoto e mameloang eo ho buuoang ka eona, eo ke faneng ka eona e le mohlala qalong ea sengoloa, e entsoe ka komporo e tjena:
Ho ile ha fumaneha hore k'homphieutha ena le mefuta ea eona (Model I / Model III / Model IV, joalo-joalo) e ne e tumme haholo ka nako e le 'ngoe (ho hlakile, eseng Russia). Hoa hlokomeleha hore processor eo ba e sebelisitseng le eona e ne e le Z80. Bakeng sa komporo ena u ka e fumana Inthaneteng
Ke khoasolla emulator
Ke boetse ke fumane
Ha ke se ke fumane sebopeho sa faele sa CAS (seo e ileng ea e-ba kopi e fokolang ea data e tsoang teiping eo ke neng ke se ke ntse ke e-na le eona, ntle le hlooho e nang le boteng ba sync byte), ke entse liphetoho tse fokolang lenaneong la ka mme ke khonne ho hlahisa faele e sebetsang ea CAS e sebetsang ho emulator (TRS-80 Model III):
Ke thehile mofuta oa morao-rao oa sesebelisoa sa ho fetolela ka boikemelo bo ikemetseng ba sekhahla sa pele le sebaka se pakeng tsa litšupiso tsa sephutheloana sa GEM, khoutu ea mohloli e fumaneha ho
fihlela qeto e
Tsela eo re e tsamaileng e ile ea fetoha leeto le tsotehang la nakong e fetileng, ’me ke thabela hore ebe qetellong ke fumane karabo. Har'a tse ling, ke:
- Ke ile ka fumana mokhoa oa ho boloka data ho ZX Spectrum mme ka ithuta mekhoa ea ROM e hahiloeng ka hare bakeng sa ho boloka / ho bala data ho tsoa lik'haseteng tsa molumo.
- Ke ile ka tloaelana le k'homphieutha ea TRS-80 le mefuta ea eona, ke ithutile mokhoa oa ho sebetsa, ka sheba mananeo a mehlala, 'me ka ba le monyetla oa ho etsa debugging ka likhoutu tsa mochini (ka mor'a moo, li-mnemonics tsohle tsa Z80 ke li tseba)
- O ngotse ts'ebeliso e felletseng ea ho fetolela lirekoto tsa audio ho fomete ea CAS, e ka balang data e sa amoheloeng ke ts'ebeliso ea "molao".
Source: www.habr.com