Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

prehistory

Jije olufẹ ohun elo retro, Mo ti ra ZX Spectrum + lẹẹkan kan lati ọdọ olutaja kan ni UK. Ti o wa pẹlu kọnputa funrararẹ, Mo gba ọpọlọpọ awọn kasẹti ohun pẹlu awọn ere (ninu apoti atilẹba pẹlu awọn ilana), ati awọn eto ti o gbasilẹ lori awọn kasẹti laisi awọn ami pataki. Iyalenu, data lati awọn kasẹti 40 ọdun jẹ kika daradara ati pe Mo ni anfani lati ṣe igbasilẹ gbogbo awọn ere ati awọn eto lati ọdọ wọn.

Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

Sibẹsibẹ, lori diẹ ninu awọn kasẹti Mo rii awọn igbasilẹ ti o han gbangba ko ṣe nipasẹ kọnputa ZX Spectrum. Wọn dabi ohun ti o yatọ patapata ati pe, ko dabi awọn igbasilẹ lati kọnputa ti a mẹnuba, wọn ko bẹrẹ pẹlu kukuru BASIC bootloader, eyiti o nigbagbogbo wa ninu awọn gbigbasilẹ ti gbogbo awọn eto ati awọn ere.

Fun awọn akoko yi Ebora mi - Mo gan fe lati wa jade ohun ti o pamọ ninu wọn. Ti o ba le ka ifihan ohun afetigbọ bi ọna ti awọn baiti, o le wa awọn ohun kikọ tabi ohunkohun ti o tọka si ipilẹṣẹ ti ifihan. A irú ti Retiro-archeology.

Ni bayi ti Mo ti lọ ni gbogbo ọna ati wo awọn akole ti awọn kasẹti funrararẹ, Mo rẹrin musẹ nitori

idahun si wà ọtun ni iwaju ti oju mi ​​gbogbo pẹlú
Lori aami ti kasẹti osi ni orukọ kọnputa TRS-80, ati ni isalẹ orukọ olupese: “Ti ṣelọpọ nipasẹ Radio Shack ni AMẸRIKA”

(Ti o ba fẹ tọju intrigue naa titi di opin, maṣe lọ labẹ apanirun)

Ifiwera awọn ifihan agbara ohun

Ni akọkọ, jẹ ki a ṣe digitize awọn gbigbasilẹ ohun. O le tẹtisi ohun ti o dabi:


Ati bi o ṣe ṣe deede gbigbasilẹ lati kọmputa ZX Spectrum n dun:


Ni awọn ọran mejeeji, ni ibẹrẹ ti gbigbasilẹ wa ti a pe awaoko ohun orin - ohun kan ti igbohunsafẹfẹ kanna (ni igbasilẹ akọkọ o jẹ kukuru pupọ <1 iṣẹju-aaya, ṣugbọn o jẹ iyatọ). Ohun orin awakọ ṣe ifihan kọnputa lati mura lati gba data. Gẹgẹbi ofin, kọnputa kọọkan mọ ohun orin awakọ “ti ara rẹ” nikan nipasẹ apẹrẹ ti ifihan ati igbohunsafẹfẹ rẹ.

O jẹ dandan lati sọ nkankan nipa apẹrẹ ifihan ara rẹ. Fun apẹẹrẹ, lori ZX Spectrum apẹrẹ rẹ jẹ onigun mẹrin:

Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

Nigbati a ba rii ohun orin awakọ kan, ZX Spectrum n ṣe afihan yiyan pupa ati awọn ọpa buluu lori aala iboju lati fihan pe a ti mọ ami naa. Pilot ohun orin pari pulse synchro, eyi ti o ṣe ifihan agbara kọmputa lati bẹrẹ gbigba data. O jẹ ifihan nipasẹ akoko kukuru (fiwera si ohun orin awakọ ati data ti o tẹle) (wo eeya)

Lẹhin ti pulse amuṣiṣẹpọ ti gba, kọnputa ṣe igbasilẹ dide / isubu kọọkan ti ifihan agbara, wiwọn iye akoko rẹ. Ti iye akoko ba kere ju iye kan lọ, bit 1 ni a kọ si iranti, bibẹẹkọ 0. Awọn iwọn naa ni a gba sinu awọn baiti ati tun ṣe ilana naa titi di igba ti N gba. Nọmba N ni a maa n gba lati ori akọsori faili ti a gbasile. Ilana ikojọpọ jẹ bi atẹle:

  1. awaoko ohun orin
  2. akọsori (ipari ipari), ni iwọn ti data ti a gbasile (N), orukọ faili ati iru
  3. awaoko ohun orin
  4. data funrararẹ

Lati rii daju wipe awọn data ti wa ni ti kojọpọ tọ, awọn ZX julọ.Oniranran kika awọn ti a npe ni baiti parity (parity baiti), eyi ti o jẹ iṣiro nigba fifipamọ faili kan nipasẹ XORing gbogbo awọn baiti ti data kikọ. Nigbati o ba ka faili kan, kọnputa naa ṣe iṣiro baiti baiti lati data ti o gba ati, ti abajade ba yatọ si ọkan ti o fipamọ, ṣafihan ifiranṣẹ aṣiṣe “Aṣiṣe ikojọpọ teepu R”. Ni pipe, kọnputa le fun ifiranṣẹ yii tẹlẹ ti, nigbati o ba nka, ko le ṣe idanimọ pulse kan (ti o padanu tabi iye akoko ko baamu si awọn opin kan)

Nitorinaa, jẹ ki a wo kini ami ifihan aimọ kan dabi:

Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

Eyi ni ohun orin awakọ. Awọn apẹrẹ ti awọn ifihan agbara ti wa ni significantly o yatọ, sugbon o jẹ ko o pe awọn ifihan agbara oriširiši ti a tun kukuru isọ ti kan awọn igbohunsafẹfẹ. Ni igbohunsafẹfẹ iṣapẹẹrẹ ti 44100 Hz, aaye laarin awọn “awọn oke” jẹ isunmọ awọn apẹẹrẹ 48 (eyiti o ni ibamu si igbohunsafẹfẹ ti ~ 918 Hz) Jẹ ki a ranti nọmba yii.

Jẹ ki a wo ni bayi ajẹkù data:

Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

Ti a ba ṣe iwọn aaye laarin awọn iṣọn kọọkan, o han pe aaye laarin awọn iṣọn “gun” tun jẹ awọn ayẹwo ~ 48, ati laarin awọn kukuru - ~ 24. Wiwa siwaju diẹ diẹ, Emi yoo sọ pe ni ipari o wa ni pe “itọkasi” awọn iṣọn pẹlu igbohunsafẹfẹ ti 918 Hz tẹle nigbagbogbo, lati ibẹrẹ si opin faili naa. O le ṣe akiyesi pe nigba gbigbe data, ti o ba pade pulse afikun laarin awọn itọka itọkasi, a ro pe o jẹ bit 1, bibẹẹkọ 0.

Kini nipa pulse amuṣiṣẹpọ? Jẹ ki a wo ibẹrẹ ti data naa:

Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

Ohun orin awakọ dopin ati data bẹrẹ lẹsẹkẹsẹ. Ni igba diẹ, lẹhin ti o ṣe itupalẹ ọpọlọpọ awọn igbasilẹ ohun afetigbọ, a ni anfani lati ṣawari pe baiti akọkọ ti data nigbagbogbo jẹ kanna (10100101b, A5h). Kọmputa le bẹrẹ kika data lẹhin ti o gba.

O tun le san ifojusi si iyipada ti pulse itọkasi akọkọ lẹsẹkẹsẹ lẹhin 1st ti o kẹhin ni baiti amuṣiṣẹpọ. O ti ṣe awari pupọ nigbamii ni ilana ti idagbasoke eto idanimọ data kan, nigbati data ni ibẹrẹ faili ko le ka ni iduroṣinṣin.

Bayi jẹ ki a gbiyanju lati ṣe apejuwe algorithm kan ti yoo ṣe ilana faili ohun ati fifuye data.

Gbigba Data

Ni akọkọ, jẹ ki a wo awọn arosinu diẹ lati jẹ ki algorithm rọrun:

  1. A yoo ṣe akiyesi awọn faili nikan ni ọna kika WAV;
  2. Faili ohun gbọdọ bẹrẹ pẹlu ohun orin awakọ ati pe ko gbọdọ ni ipalọlọ ni ibẹrẹ
  3. Faili orisun gbọdọ ni oṣuwọn iṣapẹẹrẹ ti 44100 Hz. Ni idi eyi, aaye laarin awọn itọka itọkasi ti awọn ayẹwo 48 ti pinnu tẹlẹ ati pe a ko nilo lati ṣe iṣiro rẹ ni eto;
  4. Apeere kika le jẹ eyikeyi (8/16 die-die / lilefoofo ojuami) - niwon nigba kika a le se iyipada si awọn ti o fẹ ọkan;
  5. A ro pe faili orisun jẹ deede nipasẹ titobi, eyi ti o yẹ ki o mu abajade naa duro;

Algorithm kika yoo jẹ bi atẹle:

  1. A ka faili naa sinu iranti, ni akoko kanna yiyipada ọna kika apẹẹrẹ si awọn 8-bit;
  2. Ṣe ipinnu ipo ti pulse akọkọ ninu data ohun ohun. Lati ṣe eyi, o nilo lati ṣe iṣiro nọmba ti ayẹwo pẹlu titobi ti o pọju. Fun ayedero, a yoo ṣe iṣiro rẹ lẹẹkan pẹlu ọwọ. Jẹ ki a fipamọ si prev_pos oniyipada;
  3. Fi 48 kun si ipo ti pulse ti o kẹhin (pos:= prev_pos + 48)
  4. Niwọn igba ti o pọ si ipo nipasẹ 48 ko ṣe iṣeduro pe a yoo gba si ipo ti pulse itọkasi atẹle (awọn abawọn teepu, iṣẹ riru ti ẹrọ awakọ teepu, ati bẹbẹ lọ), a nilo lati ṣatunṣe ipo ti pulse pos. Lati ṣe eyi, mu nkan kekere ti data (pos-8; pos + 8) ki o wa iye titobi ti o pọju lori rẹ. Ipo ti o baamu ti o pọju yoo wa ni ipamọ ni pos. Nibi 8 = 48/6 jẹ igbagbogbo ti a gba ni idanwo, eyiti o ṣe iṣeduro pe a yoo pinnu iwọn to pe ati pe kii yoo ni ipa lori awọn iwuri miiran ti o le wa nitosi. Ni awọn ọran ti o buru pupọ, nigbati aaye laarin awọn iṣọn ba kere pupọ tabi tobi ju 48 lọ, o le ṣe wiwa ti a fi agbara mu fun pulse, ṣugbọn laarin ipari ti nkan naa Emi kii yoo ṣe apejuwe eyi ni algorithm;
  5. Ni igbesẹ ti tẹlẹ, yoo tun jẹ pataki lati ṣayẹwo pe a ti rii pulse itọkasi rara. Iyẹn ni, ti o ba n wa o pọju, eyi ko ṣe iṣeduro pe itusilẹ wa ni apa yii. Ninu imuse tuntun mi ti eto kika, Mo ṣayẹwo iyatọ laarin iwọn ti o pọ julọ ati awọn iye titobi ti o kere ju lori apakan kan, ati pe ti o ba kọja opin kan, Mo ka niwaju agbara kan. Ibeere naa tun jẹ kini lati ṣe ti a ko ba ri pulse itọkasi. Awọn aṣayan 2 wa: boya data ti pari ati ipalọlọ tẹle, tabi eyi yẹ ki o gbero aṣiṣe kika. Sibẹsibẹ, a yoo fi eyi silẹ lati jẹ ki algorithm rọrun;
  6. Ni igbesẹ ti n tẹle, a nilo lati pinnu wiwa pulse data (bit 0 tabi 1), fun eyi a gba aarin apakan (prev_pos;pos) middle_pos dogba si middle_pos : = (prev_pos+pos)/2 ati ni diẹ ninu awọn adugbo ti middle_pos lori apa (midle_pos-8; middle_pos +8) jẹ ki a ṣe iṣiro awọn ti o pọju ati ki o kere titobi. Ti iyatọ laarin wọn ba ju 10 lọ, a kọ bit 1 sinu abajade, bibẹẹkọ 0. 10 jẹ igbagbogbo ti a gba ni idanwo;
  7. Ṣafipamọ ipo lọwọlọwọ ni prev_pos (prev_pos := pos)
  8. Tun bẹrẹ lati igbesẹ 3 titi ti a fi ka gbogbo faili naa;
  9. Abajade bit orun gbọdọ wa ni fipamọ bi awọn baiti kan ti ṣeto. Niwọn igba ti a ko ṣe akiyesi baiti amuṣiṣẹpọ nigba kika, nọmba awọn iwọn le ma jẹ ọpọ ti 8, ati aiṣedeede bit ti a beere tun jẹ aimọ. Ninu imuse akọkọ ti algorithm, Emi ko mọ nipa aye ti baiti amuṣiṣẹpọ ati nitorinaa nirọrun ti fipamọ awọn faili 8 pẹlu awọn nọmba oriṣiriṣi ti awọn aiṣedeede aiṣedeede. Ọkan ninu wọn ni data ti o pe. Ni algoridimu ikẹhin, Mo rọrun yọ gbogbo awọn ege to A5h, eyiti o fun laaye laaye lati gba faili ti o wu ti o tọ lẹsẹkẹsẹ

Algorithm ni Ruby, fun awon ti nife
Mo yan Ruby gẹgẹbi ede fun kikọ eto naa, nitori ... Mo eto lori o julọ ti awọn akoko. Aṣayan kii ṣe iṣẹ-giga, ṣugbọn iṣẹ ṣiṣe ti ṣiṣe iyara kika ni yarayara bi o ti ṣee ko tọ si.

# Используем 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*")

Esi

Lẹhin igbiyanju ọpọlọpọ awọn iyatọ ti algorithm ati awọn iduro, Mo ni orire lati gba nkan ti o nifẹ pupọ:

Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

Nitorinaa, ni idajọ nipasẹ awọn gbolohun ọrọ kikọ, a ni eto fun awọn aworan igbero. Sibẹsibẹ, ko si awọn koko-ọrọ ninu ọrọ eto naa. Gbogbo awọn koko ti wa ni koodu bi awọn baiti (iye kọọkan> 80h). Bayi a nilo lati wa iru kọnputa wo lati awọn ọdun 80 le fipamọ awọn eto ni ọna kika yii.

Ni otitọ, o jọra pupọ si eto BASIC kan. Kọmputa ZX Spectrum tọju awọn eto ni isunmọ ọna kika kanna ni iranti ati fi awọn eto pamọ si teepu. O kan ni ọran, Mo ṣayẹwo awọn koko-ọrọ lodi si tabili. Sibẹsibẹ, abajade jẹ kedere odi.

Mo tun ṣayẹwo awọn koko-ọrọ BASIC ti gbajumo Atari, Commodore 64 ati ọpọlọpọ awọn kọnputa miiran ti akoko yẹn, fun eyiti Mo le rii iwe, ṣugbọn laisi aṣeyọri - imọ mi ti awọn iru awọn kọnputa retro ti jade lati ko jakejado.

Nigbana ni mo pinnu lati lọ akojọ, ati lẹhinna oju mi ​​ṣubu lori orukọ ti olupese Radio Shack ati kọmputa TRS-80. Wọnyi li awọn orukọ ti a ti kọ lori awọn aami ti awọn kasẹti ti o dubulẹ lori tabili mi! Emi ko mọ awọn orukọ wọnyi tẹlẹ ati pe ko faramọ pẹlu kọnputa TRS-80, nitorinaa o dabi fun mi pe Radio Shack jẹ olupese kasẹti ohun bii BASF, Sony tabi TDK, ati pe TRS-80 ni akoko ṣiṣiṣẹsẹhin. Ki lo de?

Kọmputa Tandy / Radio shack TRS-80

O ṣeese pupọ pe gbigbasilẹ ohun ti o wa ninu ibeere, eyiti Mo fun bi apẹẹrẹ ni ibẹrẹ nkan naa, ni a ṣe lori kọnputa bii eyi:

Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

O wa jade pe kọnputa yii ati awọn oriṣiriṣi rẹ (Awoṣe I / Awoṣe III / Awoṣe IV, bbl) jẹ olokiki pupọ ni akoko kan (dajudaju, kii ṣe ni Russia). O jẹ akiyesi pe ero isise ti wọn lo tun jẹ Z80. Fun kọmputa yii o le wa lori Intanẹẹti a pupo ti alaye. Ni awọn 80s, alaye kọmputa ti pin ni awọn akọọlẹ. Ni akoko nibẹ ni o wa orisirisi emulators awọn kọmputa fun orisirisi awọn iru ẹrọ.

Mo gba lati ayelujara emulator trs80gp ati fun igba akọkọ Mo ni anfani lati wo bi kọnputa yii ṣe ṣiṣẹ. Nitoribẹẹ, kọnputa ko ṣe atilẹyin iṣelọpọ awọ; ipinnu iboju jẹ awọn piksẹli 128 × 48 nikan, ṣugbọn ọpọlọpọ awọn amugbooro ati awọn iyipada ti o le mu iwọn iboju pọ si. Ọpọlọpọ awọn aṣayan tun wa fun awọn ọna ṣiṣe fun kọnputa yii ati awọn aṣayan fun imuse ede BASIC (eyiti, ko dabi ZX Spectrum, ni diẹ ninu awọn awoṣe paapaa ko “flashed” sinu ROM ati pe eyikeyi aṣayan le ṣe kojọpọ lati disiki floppy kan, gẹgẹ bi OS funrararẹ)

Mo tun ri ohun elo lati yi awọn gbigbasilẹ ohun pada si ọna kika CAS, eyiti o jẹ atilẹyin nipasẹ awọn emulators, ṣugbọn fun idi kan ko ṣee ṣe lati ka awọn gbigbasilẹ lati awọn kasẹti mi ni lilo wọn.

Ni wiwa ọna kika faili CAS (eyiti o jade lati jẹ ẹda-bit-bit kan ti data lati teepu ti Mo ti ni tẹlẹ ni ọwọ, ayafi fun akọsori pẹlu wiwa baiti amuṣiṣẹpọ), Mo ṣe kan awọn ayipada diẹ si eto mi ati pe o ni anfani lati gbejade faili CAS ti n ṣiṣẹ ti o ṣiṣẹ ninu emulator (TRS-80 Model III):

Bii MO ṣe gba data pada ni ọna kika aimọ lati teepu oofa

Mo ṣe apẹrẹ ẹya tuntun ti ohun elo iyipada pẹlu ipinnu aifọwọyi ti pulse akọkọ ati aaye laarin awọn itọka itọkasi bi package GEM, koodu orisun wa ni Github.

ipari

Ọna ti a ti rin ni o wa jade lati jẹ irin-ajo ti o fanimọra si igba atijọ, inu mi si dun pe ni ipari Mo ti ri idahun. Ninu awọn ohun miiran, Mo:

  • Mo ṣayẹwo ọna kika fun fifipamọ data ni ZX Spectrum ati iwadi awọn ilana ROM ti a ṣe sinu fun fifipamọ / kika data lati awọn kasẹti ohun
  • Mo ni imọran pẹlu kọnputa TRS-80 ati awọn oriṣiriṣi rẹ, kọ ẹkọ ẹrọ ṣiṣe, wo awọn eto apẹẹrẹ ati paapaa ni aye lati ṣe n ṣatunṣe aṣiṣe ni awọn koodu ẹrọ (lẹhinna gbogbo awọn mnemonics Z80 jẹ faramọ si mi)
  • Kọ ohun elo ti o ni kikun fun iyipada awọn gbigbasilẹ ohun si ọna kika CAS, eyiti o le ka data ti ko ṣe idanimọ nipasẹ ohun elo “osise”

orisun: www.habr.com

Fi ọrọìwòye kun