Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

prehistory

Amin'ny maha-tia fitaovana retro aho, dia nividy ZX Spectrum + tamin'ny mpivarotra iray tany UK aho. Tafiditra tamin'ny solosaina mihitsy aho, nahazo kasety audio maromaro misy kilalao (ao amin'ny fonosana voalohany misy torolΓ lana), ary koa fandaharana voarakitra ao amin'ny kasety tsy misy marika manokana. Nahagaga fa azo novakiana tsara ny angon-drakitra avy amin'ny kasety 40 taona ary saika afaka nisintona ny lalao sy programa rehetra tao amin'izy ireo aho.

Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

Na izany aza, tamin'ny kasety sasany dia nahita rakipeo izay mazava ho azy fa tsy nataon'ny solosaina ZX Spectrum. Samy hafa tanteraka ny feony ary, tsy toy ny firaketana an-tsoratra avy amin'ny solosaina voalaza, dia tsy nanomboka tamin'ny bootloader BASIC fohy izy ireo, izay matetika hita ao amin'ny fandraketana ny programa sy ny lalao rehetra.

Nandritra ny fotoana kelikely dia nanenjika ahy izany - tena naniry ny hahita izay nafenina tao amin'izy ireo aho. Raha toa ianao ka afaka mamaky ny feo ho toy ny filaharan'ny bytes, dia azonao atao ny mitady tarehin-tsoratra na izay rehetra manondro ny niandohan'ny famantarana. Karazana arkeolojia retro.

Rehefa lasa lavitra aho ary mijery ny etikety ny kasety mihitsy, dia mitsiky aho satria

teo imason'ny masoko ny valiny
Eo amin'ny marika amin'ny kasety havia dia misy ny anaran'ny solosaina TRS-80, ary eo ambanin'ny anaran'ny mpanamboatra: "Novokarin'ny Radio Shack any Etazonia"

(Raha te hihazona ny intrigue hatramin'ny farany ianao dia aza miditra amin'ny mpandroba)

Fampitahana famantarana feo

Voalohany indrindra, andao hatao nomerika ny raki-peo. Azonao atao ny mihaino ny feony:


Ary toy ny mahazatra ny firaketana avy amin'ny solosaina ZX Spectrum dia maneno:


Amin'ireo tranga roa ireo, eo am-piandohan'ny fandraisam-peo dia misy ny antsoina hoe feo mpanamory - feo mitovy matetika (amin'ny firaketana voalohany dia fohy dia fohy <1 segondra, saingy azo avahana). Ny feon'ny mpanamory dia manambara ny solosaina mba hiomana handray data. Amin'ny maha-fitsipika azy, ny solosaina tsirairay dia tsy mahafantatra afa-tsy ny feony "manokana" amin'ny alΓ lan'ny endriky ny famantarana sy ny matetika.

Ilaina ny milaza zavatra momba ny endriky ny famantarana. Ohatra, amin'ny ZX Spectrum dia mahitsizoro ny endriny:

Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

Rehefa hita ny feon'ny mpanamory, ny ZX Spectrum dia mampiseho bara mena sy manga mifandimby eo amin'ny sisin'ny efijery mba hanondroana fa efa fantatra ilay famantarana. Mifarana ny feon'ny mpanamory synchro pulse, izay manondro ny solosaina hanomboka handray angona. Izy io dia miavaka amin'ny faharetana fohy kokoa (raha ampitahaina amin'ny feon'ny mpanamory sy ny angona manaraka) (jereo ny sary)

Rehefa voaray ny pulse sync, dia raisin'ny solosaina ny fisondrotana/fianjeran'ny famantarana tsirairay, mandrefy ny faharetany. Raha latsaky ny fetra voafaritra ny faharetany, dia soratana ao amin'ny fitadidiana ny bit 1, raha tsy izany dia 0. Angonina ho bytes ny bits ary averina ny dingana mandra-pahazoana N bytes. Ny isa N dia matetika alaina amin'ny lohatenin'ny rakitra alaina. Toy izao manaraka izao ny filaharan'ny loading:

  1. feo mpanamory
  2. lohapejy (lavany raikitra), mirakitra ny haben'ny angona alaina (N), anaran-drakitra ary karazana
  3. feo mpanamory
  4. ny angon-drakitra mihitsy

Mba hahazoana antoka fa fenoina tsara ny angon-drakitra, ny ZX Spectrum dia mamaky ilay antsoina hoe parity byte (parity byte), izay kajy rehefa mitahiry rakitra amin'ny XORing ny bita rehetra amin'ny angona voasoratra. Rehefa mamaky rakitra ny solosaina dia manisa ny parity byte avy amin'ny angon-drakitra voaray ary, raha toa ka tsy mitovy amin'ny voatahiry ny valiny, dia mampiseho ny hafatra diso "R tape loading error". Raha ny marina, ny solosaina dia afaka mamoaka ity hafatra ity aloha kokoa raha toa, rehefa mamaky, dia tsy mahafantatra pulse (tsy hita na tsy mifanaraka amin'ny fetra sasany ny faharetany)

Andeha hojerentsika izao ny endriky ny famantarana tsy fantatra:

Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

Ity ny tonon'ny mpanamory. Ny endriky ny mari-pamantarana dia tena hafa, saingy mazava fa ny famantarana dia ahitana ny famerimberenana pulses fohy matetika. Amin'ny fatran'ny santionany amin'ny 44100 Hz, ny elanelana eo anelanelan'ny "peaks" dia santionany 48 eo ho eo (izay mifanitsy amin'ny matetika ~ 918 Hz.

Andeha hojerentsika izao ny sombin-drakitra:

Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

Raha mandrefy ny halaviran'ny pulses tsirairay isika, dia hita fa ny elanelana misy eo amin'ny pulses "lava" dia mbola ~ 48 santionany, ary eo anelanelan'ny fohy - ~ 24. Raha mijery kely aloha aho dia holazaiko fa amin'ny farany dia hita fa ny pulses "reference" miaraka amin'ny matetika 918 Hz dia manaraka tsy tapaka, hatrany am-piandohana ka hatramin'ny faran'ny rakitra. Azo heverina fa rehefa mamindra angon-drakitra, raha misy pulse fanampiny misy eo anelanelan'ny pulses reference, dia heverintsika ho bit 1, raha tsy izany 0.

Ahoana ny amin'ny pulse sync? Andeha hojerentsika ny fiandohan'ny angona:

Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

Mifarana ny feon'ny mpanamory ary manomboka avy hatrany ny angon-drakitra. Fotoana fohy taty aoriana, rehefa avy namakafaka ireo horonam-peo maro samihafa izahay, dia hitanay fa mitovy foana ny byte voalohany amin'ny angona (10100101b, A5h). Mety manomboka mamaky angon-drakitra ny solosaina aorian'ny fandraisany azy.

Azonao atao ihany koa ny mandinika ny fiovan'ny pulse reference voalohany avy hatrany aorian'ny 1 farany amin'ny byte sync. Hita izany taty aoriana be teo amin'ny dingan'ny famolavolana programa famantarana ny angona, rehefa tsy azo vakiana tsara ny angon-drakitra tany am-piandohan'ny rakitra.

Andeha isika hanandrana hamaritana algorithm iray izay handamina rakitra audio sy hampiditra angona.

Loading Data

Voalohany, andeha hojerentsika ireo vinavina vitsivitsy mba hitazonana ny algorithm ho tsotra:

  1. Ny rakitra amin'ny endrika WAV ihany no hodinihintsika;
  2. Ny rakitra audio dia tsy maintsy manomboka amin'ny feo mpanamory ary tsy tokony hisy fahanginana any am-piandohana
  3. Ny rakitra loharano dia tsy maintsy manana tahan'ny santionany 44100 Hz. Amin'ity tranga ity, ny elanelana misy eo amin'ny pulses referans amin'ny santionany 48 dia efa voafaritra ary tsy mila manao kajy amin'ny programa isika;
  4. Ny endrika santionany dia mety ho na inona na inona (8/16 bits / teboka mitsingevana) - satria rehefa mamaky dia afaka manova azy ho amin'ny tiana;
  5. Heverintsika fa ny rakitra loharano dia ara-dalΓ na amin'ny amplitude, izay tokony hampitony ny vokatra;

Ny algorithm amin'ny famakiana dia ho toy izao manaraka izao:

  1. Mamaky ny rakitra ho fitadidiana izahay, ary mamadika ny format santionany ho 8 bit;
  2. Farito ny toeran'ny pulse voalohany amin'ny angona feo. Mba hanaovana izany dia mila manao kajy ny isan'ny santionany amin'ny amplitude ambony indrindra. Ho an'ny fahatsorana dia hanao kajy indray mandeha amin'ny tanana izahay. Andao hotehirizina amin'ny variable prev_pos;
  3. Ampio ny 48 amin'ny toeran'ny pulse farany (pos := prev_pos + 48)
  4. Koa satria ny fampitomboana ny toerana amin'ny 48 dia tsy manome antoka fa ho tonga any amin'ny toeran'ny pulse reference manaraka isika (kilema amin'ny kasety, fampandehanana tsy miovaova amin'ny mekanika kasety, sns.), Mila manitsy ny toeran'ny pulse pos. Mba hanaovana izany, makΓ  angona kely (pos-8; pos+8) ary tadiavo ny sandan'ny amplitude ambony indrindra eo aminy. Ny toerana mifanaraka amin'ny ambony indrindra dia hotehirizina ao amin'ny pos. Eto ny 8 = 48/6 dia tsy miovaova azo andrana, izay miantoka fa hamaritra ny fara-tampony marina isika ary tsy hisy fiantraikany amin'ny impulses hafa mety ho eo akaiky. Amin'ny tranga tena ratsy, raha ny elanelana misy eo amin'ny pulses dia latsaky ny 48 na mihoatra ny XNUMX, dia azonao atao ny manatanteraka fikarohana an-tery ho an'ny pulse, fa ao anatin'ny sehatry ny lahatsoratra dia tsy hamaritra izany amin'ny algorithm aho;
  5. Amin'ny dingana teo aloha dia ilaina ihany koa ny manamarina fa ny pulse reference dia hita mihitsy. Izany hoe, raha mitady ny ambony indrindra ianao, dia tsy manome antoka fa misy ny impulse amin'ity fizarana ity. Amin'ny fampiharana farany ny programa famakiana dia manamarina ny fahasamihafana misy eo amin'ny sandan'ny amplitude ambony indrindra sy ambany indrindra amin'ny fizarana iray aho, ary raha mihoatra ny fetra iray izany dia manisa ny fisian'ny impulse aho. Ny fanontaniana dia hoe inona no tokony hatao raha tsy hita ny pulse reference. Misy safidy 2: na efa tapitra ny angon-drakitra ary manaraka ny fahanginana, na tokony hoheverina ho fahadisoana famakiana izany. Na izany aza, hanala izany izahay mba hanatsorana ny algorithm;
  6. Amin'ny dingana manaraka dia mila mamaritra ny fisian'ny pulse data (bit 0 na 1), noho izany dia maka ny afovoan'ny fizarana (prev_pos;pos) middle_pos mitovy amin'ny middle_pos := (prev_pos+pos)/2 ary amin'ny faritra sasany amin'ny middle_pos amin'ny fizarana (middle_pos-8;middle_pos +8) andao kajy ny amplitude ambony indrindra sy ambany indrindra. Raha mihoatra ny 10 ny fahasamihafana misy eo amin'izy ireo, dia soratanay ny bitika 1 amin'ny valiny, raha tsy izany dia 0. 10 dia tsy miova azo andrana;
  7. Tehirizo ny toerana misy ankehitriny amin'ny prev_pos (prev_pos := pos)
  8. Avereno manomboka amin'ny dingana 3 mandra-pamakiantsika ny rakitra manontolo;
  9. Tsy maintsy hotehirizina ho andian-bytes ny laharan'ny bit. Koa satria tsy niraharaha ny sync byte izahay rehefa mamaky, dia mety tsy ho 8 ny isan'ny bits, ary tsy fantatra koa ny bit offset. Tamin'ny fampiharana voalohany ny algorithm dia tsy fantatro ny fisian'ny sync byte ary noho izany dia namonjy rakitra 8 miaraka amin'ny isa offset bits. Nisy angona marina ny iray tamin'izy ireo. Ao amin'ny algorithm farany, esoriko fotsiny ny bits rehetra hatramin'ny A5h, izay mamela ahy hahazo avy hatrany ny rakitra famoahana marina

Algorithm amin'ny Ruby, ho an'ireo liana
Ruby no nofidiko ho fiteny hanoratana ny fandaharana, satria... Matetika aho no manao programa momba izany. Ny safidy dia tsy avo lenta, fa ny asa ny fanaovana ny famakiana haingana haingana araka izay azo atao dia tsy mendrika izany.

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

vokatra

Rehefa nanandrana karazana algorithm sy constants maromaro aho dia tsara vintana nahazo zavatra tena mahaliana:

Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

Noho izany, raha mitsara amin'ny tadin'ny endri-tsoratra isika dia manana programa handrafetana grafika. Na izany aza, tsy misy teny fanalahidy ao amin'ny lahatsoratry ny programa. Ny teny fanalahidy rehetra dia voakodia ho bytes (sanda tsirairay > 80h). Ankehitriny dia mila mitady izay solosaina avy amin'ny 80s afaka mitahiry programa amin'ity endrika ity.

Raha ny marina dia mitovy amin'ny programa BASIC izy io. Ny solosaina ZX Spectrum dia mitahiry programa amin'ny endrika mitovy amin'ny fitadidiana ary mitahiry programa ho an'ny horonam-peo. Raha sanatria, nojereko ny teny fanalahidy manohitra LOHA. Na izany aza, mazava ho azy fa ratsy ny vokatra.

Nojereko ihany koa ny teny fototra BASIC an'ny Atari malaza, Commodore 64 ary solosaina maro hafa tamin'izany fotoana izany, izay nahafahako nahita antontan-taratasy, saingy tsy nahomby - ny fahalalako ny karazana ordinatera retro dia tsy dia lehibe loatra.

Dia nanapa-kevitra ny handeha aho ny lisitra, ary avy eo ny fijeriko dia nibanjina ny anaran'ilay mpanamboatra Radio Shack sy ny solosaina TRS-80. Ireo no anarana voasoratra teo amin'ny etikety ny kasety nandry teo ambony latabatra! Tsy fantatro ireo anarana ireo taloha ary tsy nahafantatra ny ordinatera TRS-80 aho, ka toa ny Radio Shack dia mpanamboatra kasety audio toa an'i BASF, Sony na TDK, ary ny TRS-80 no fotoana famerenam-peo. Fa nahoana no tsy?

Computer Tandy/Radio Shack TRS-80

Tena azo inoana fa ny fandraisam-peo resahina, izay nomeko ohatra tany am-piandohan'ny lahatsoratra, dia natao tamin'ny solosaina toy izao:

Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

Hita fa io solosaina io sy ny karazany (Model I/Model III/Model IV, sns) no tena nalaza tamin'ny fotoana iray (mazava ho azy fa tsy tany Rosia). Marihina fa Z80 ihany koa ny processeur nampiasain’izy ireo. Ho an'ity solosaina ity dia azonao jerena ao amin'ny Internet fampahalalana be dia be. Tamin'ny taona 80 dia nizara ny fampahalalana momba ny solosaina GAZETY. Amin'izao fotoana izao dia misy maromaro emulators solosaina ho an'ny sehatra samihafa.

Nisintona ny emulator aho ny 80gp ary sambany aho no nahita ny fomba fiasan'ity solosaina ity. Mazava ho azy, ny solosaina dia tsy nanohana ny loko Output dia 128x48 pixels ihany, fa maro ny fanitarana sy ny fanovana izay mety hampitombo ny efijery fanapahan-kevitra. Maro ihany koa ny safidy ho an'ny rafitra miasa ho an'ity solosaina ity sy ny safidy amin'ny fampiharana ny fiteny BASIC (izay, tsy toy ny ZX Spectrum, amin'ny modely sasany dia tsy "nalefa" ao anaty ROM akory ary ny safidy rehetra dia azo alaina avy amin'ny kapila floppy, toy ny ny OS mihitsy)

Hitako koa utility mamadika rakipeo ho endrika CAS, izay tohanan'ny emulators, saingy noho ny antony tsy nahafahana namaky raki-peo tamin'ny kasety nampiasa azy ireo.

Rehefa nahafantatra ny endrika rakitra CAS (izay nivadika ho dika mitovy amin'ny angon-drakitra avy amin'ny kasety efa teo am-pelatanako, afa-tsy ny lohatenin'ny fisian'ny sync byte), dia nanao a fiovana vitsivitsy tamin'ny programako ary afaka namoaka rakitra CAS miasa izay niasa tao amin'ny emulator (TRS-80 Model III):

Ahoana no namerina ny angona tamin'ny endrika tsy fantatra tamin'ny kasety magnetika

Nanamboatra ny dikan-teny farany amin'ny fampitaovana fiovam-po aho miaraka amin'ny famaritana mandeha ho azy ny pulse voalohany sy ny elanelana misy eo amin'ny pulses reference ho fonosana GEM, ny kaody loharano dia misy amin'ny Github.

famaranana

Ny lalana nodiavinay dia nivadika ho dia nahavariana tamin’ny lasa, ary faly aho fa nahita ny valiny tamin’ny farany. Anisan'ny zavatra hafa aho:

  • Nahafantatra ny endrika fitahirizana angon-drakitra ao amin'ny ZX Spectrum aho ary nandinika ny fomba amam-panao ROM naorina ho an'ny fitahirizana / famakiana angona avy amin'ny kasety audio.
  • Nahafantatra ny solosaina TRS-80 sy ny karazany aho, nianatra ny rafitra fiasana, nijery programa santionany ary nanana fahafahana hanao debugging amin'ny kaody milina (na izany aza, ny mnemonics Z80 rehetra dia mahazatra ahy)
  • Nanoratra fitaovana feno handikana ny horonam-peo ho endrika CAS, izay afaka mamaky angon-drakitra tsy eken'ny fitaovana β€œofisialy”

Source: www.habr.com

Mividiana fampiantranoana azo antoka ho an'ny tranokala misy fiarovana DDoS, mpizara VPS VDS πŸ”₯ Mividiana fampiantranoana tranonkala azo antoka miaraka amin'ny fiarovana DDoS, mpizara VPS VDS | ProHoster