Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

pêşdîrok

Ji ber ku ez evîndarek nermalava retro bûm, min carekê ZX Spectrum+ ji firoşkarek li Keyaniya Yekbûyî kirî. Di nav komputerê bixwe de, min gelek kasetên dengî yên bi lîstikan (di pakêta orîjînal de bi rêwerzan), û her weha bernameyên ku li ser kasetan bêyî nîşaneyên taybetî hatine tomar kirin, wergirtin. Ecêb e, daneyên kasetên 40 salî baş dihatin xwendin û min karîbû hema hema hemû lîstik û bernameyan ji wan daxim.

Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

Lêbelê, li ser hin kasetan min tomarên ku bi eşkere ji hêla komputera ZX Spectrum ve nehatine çêkirin dîtin. Ew bi tevahî cûda deng didan û, berevajî tomarên ji komputera navborî, wan bi bootloaderek BASIC ya kurt, ku bi gelemperî di tomarên hemî bername û lîstikan de heye, dest pê nekir.

Demek ev yek min hejand - Min bi rastî dixwest ku bibînim ka çi di wan de veşartî ye. Ger we bikariba sînyala dengî wekî rêzek byteyan bixwînin, hûn dikarin li tîpan an her tiştê ku eslê sînyalê destnîşan dike bigerin. Cûreyek retro-arkeolojî.

Niha ku ez bi tevahî çûm û li etîketên kasetan bi xwe dinêrim, ez dikenim ji ber ku

bersiv her tim li ber çavên min bû
Li ser etîketa kaseta çepê navê komputera TRS-80, û hema li binê navê çêker heye: "Ji hêla Radio Shack li Dewletên Yekbûyî ve hatî çêkirin"

(Heke hûn dixwazin întrigan heta dawiyê bihêlin, nekevin bin xerakirinê)

Berawirdkirina sînyalên deng

Beriya her tiştî em qeydên deng dîjîtal bikin. Hûn dikarin guhdarî bikin ka ew çi dixuye:


Û wekî her carê qeyda ji komputera ZX Spectrum deng dide:


Di her du rewşan de, di destpêka tomarkirinê de tê gotin dengê pîlot - dengek heman frekansê (di tomarkirina yekem de ew pir kurt e <1 çirkeyek, lê tê veqetandin). Dengê pîlotê îşaret dide komputerê ku ji bo wergirtina daneyan amade bibe. Wekî qaîdeyek, her komputer tenê dengê pîlotê "xwe" ji hêla şiklê nîşanê û frekansa wê ve nas dike.

Pêdivî ye ku meriv li ser şeklê sînyalê bixwe tiştek bibêje. Mînakî, li ser ZX Spectrum şiklê wê çargoşe ye:

Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

Dema ku dengek pîlot tê kifş kirin, ZX Spectrum barên sor û şîn ên alternatîf li ser sînorê ekranê destnîşan dike da ku destnîşan bike ku îşaret hatiye naskirin. Dengê pîlot bi dawî dibe nebza synchro, ku sînyala komputerê dide ku dest bi wergirtina daneyan bike. Ew ji hêla demek kurttir ve tête diyar kirin (li gorî dengê pîlot û daneyên paşerojê) (binihêre jimar)

Piştî ku nebza hevdemkirinê tê wergirtin, kompîtur her bilindbûn/ketina sînyalê tomar dike, dema wê dipîve. Heger mawet ji sînorekî kêmtir be, bit 1 li bîrê tê nivîsandin, wekî din 0. Bit di nav baytan de têne berhev kirin û pêvajo tê dûbarekirin heta ku N bît werin wergirtin. Hejmara N bi gelemperî ji sernavê pelê dakêşandî tê girtin. Rêza barkirinê wiha ye:

  1. dengê pîlot
  2. sernav (dirêjahiya sabît), mezinahiya daneya dakêşandî (N), nav û celebê pelê vedihewîne
  3. dengê pîlot
  4. dane bi xwe

Ji bo ku pê ewle bibin ku dane rast hatine barkirin, ZX Spectrum bi vî rengî dixwîne parity byte (byte hevseng), ya ku dema pelek tomar dike bi XORkirina hemî baytên daneyên nivîskî têne hesibandin. Dema ku pelek dixwîne, komputer ji daneyên wergirtî baytê parîteyê hesab dike û heke encam ji ya tomarkirî cûda be, peyama xeletiyê "Çewtiya barkirina tape R" nîşan dide. Bi hişkî axaftin, komputer dikare vê peyamê berê biweşîne heke, dema xwendinê, ew nikaribe pêlekê nas bike (ji dest çûye an jî dema wê bi hin sînoran re têkildar nabe)

Ji ber vê yekê, em niha bibînin ka nîşanek nenas çawa xuya dike:

Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

Ev dengê pîlot e. Şêweya sînyalê bi girîngî cûda ye, lê diyar e ku îşaret ji dubarekirina pêlên kurt ên frekansek diyar pêk tê. Di frekansa nimûneyê ya 44100 Hz de, dûrahiya di navbera "lûtkeyan" de bi qasî 48 nimûneyan e (ku bi frekansa ~ 918 Hz re têkildar e).

Naha em li perçeya daneyê binêrin:

Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

Ger em dûrahiya di navbera pêlên kesane de bipîvin, derdikeve holê ku dûrahiya di navbera pêlên "dirêj" de hîn jî ~48 nimûne ye, û di navbera yên kurt de - ~24. Piçek li pêş mêze bikim, ez ê bibêjim ku di dawiyê de derket holê ku pêlên "referans" ên bi frekansa 918 Hz, ji serî heya dawiya pelê bi domdarî dişopînin. Dikare were texmîn kirin ku dema veguheztina daneyan, heke di navbera pêlên referansê de pêlekek zêde çêbibe, em wê wekî bit 1, wekî din 0 dihesibînin.

Li ser nebza hevdemkirinê çi ye? Ka em li destpêka daneyan binêrin:

Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

Dengê pîlotê diqede û dane yekser dest pê dike. Dûv re, piştî analîzkirina çend tomarên dengî yên cihêreng, me karî vedîtin ku baytê yekem ê daneyê her gav yek e (10100101b, A5h). Piştî ku kompîtur distîne dibe ku dest bi xwendina daneyan bike.

Her weha hûn dikarin bala xwe bidin guheztina pêla referansê ya yekem tavilê piştî 1-ya paşîn di byte hevdemkirinê de. Ew di pêvajoya pêşdebirina bernameyek nasîna daneyê de pir paşê hate kifş kirin, dema ku daneyên di destpêka pelê de bi domdarî nedihatin xwendin.

Naha em hewl bidin ku algorîtmayek ku dê pelek bihîstwerî pêvajo bike û daneyan bar bike diyar bike.

Daneyên barkirin

Pêşîn, bila em li çend texmînan binihêrin da ku algorîtmayê sade bihêlin:

  1. Em ê tenê pelên di formata WAV de bifikirin;
  2. Divê fayla dengî bi dengê pîlot dest pê bike û di destpêkê de bêdeng nebe
  3. Pêdivî ye ku pelê çavkaniyê rêjeya nimûneyê 44100 Hz be. Di vê rewşê de, dûrahiya di navbera pêlên referansê yên 48 nimûneyan de jixwe hatî destnîşan kirin û ne hewce ye ku em wê bi bernameyî hesab bikin;
  4. Forma nimûneyê dikare her be (8/16 bit / xala herikîn) - ji ber ku dema xwendinê em dikarin wê veguherînin ya xwestinê;
  5. Em texmîn dikin ku pelê çavkaniyê ji hêla amplitude ve tê normalîzekirin, ku divê encamê aram bike;

Algorîtmaya xwendinê dê wiha be:

  1. Em pelê di bîra xwe de dixwînin, di heman demê de forma nimûneyê vediguhezînin 8 bit;
  2. Di daneya dengî de pozîsyona pêla yekem diyar bikin. Ji bo kirina vê yekê, hûn hewce ne ku hejmara nimûneyê bi amplitudeya herî zêde hesab bikin. Ji bo sadebûnê, em ê carekê bi destan hesab bikin. Ka em wê li guherbara prev_pos hilînin;
  3. 48 li pozîsyona pêla paşîn zêde bikin (pos := prev_pos + 48)
  4. Ji ber ku zêdekirina pozîsyonê bi 48-an garantî nake ku em ê bigihîjin pozîsyona nebza referansa paşîn (kêmasiyên tape, xebata bêserûber a mekanîzmaya ajokera kasêtê, hwd.), Pêdivî ye ku em pozîsyona nebza poz eyar bikin. Ji bo vê yekê, perçeyek piçûk a daneyê (pos-8;pos+8) bigirin û li ser wê nirxa herî zêde ya amplitude bibînin. Cihê ku bi herî zêde re têkildar e dê di pozê de were hilanîn. Li vir 8 = 48/6 domdarek bi ceribandinê hatî bidestxistin e, ku garantî dike ku em ê herî zêde rast destnîşan bikin û dê bandorê li impulsên din ên ku dibe ku nêzîk bin neke. Di rewşên pir xirab de, dema ku dûrahiya di navbera pêlşan de ji 48an pir kêmtir an mezintir e, hûn dikarin lêgerînek bi zorê ji bo pêlekê pêk bînin, lê di çarçoveya gotarê de ez ê vê yekê di algorîtmayê de venabêjim;
  5. Di gava berê de, di heman demê de pêdivî ye ku meriv kontrol bike ka pêla referansê bi tevahî hate dîtin. Ango, heke hûn tenê li herî zêde bigerin, ev garantî nake ku di vê beşê de impuls heye. Di pêkanîna min a herî paşîn a bernameya xwendinê de, ez cûdahiya di navbera nirxên amplitudeya herî zêde û hindiktirîn de li ser perçeyekê kontrol dikim, û heke ew ji sînorek diyar derbas bibe, ez hebûna impulsekê dihejmêrim. Pirs jî ev e ku heke nebza referansê neyê dîtin çi bikin. 2 vebijark hene: an dane bi dawî bûye û bêdengî li pey tê, an jî divê ev wekî xeletiyek xwendinê were hesibandin. Lêbelê, em ê vê yekê nehêlin ku algorîtmayê hêsan bikin;
  6. Di gava paşîn de, pêdivî ye ku em hebûna pêlek daneyê (bit 0 an 1) diyar bikin, ji bo vê yekê em nîvê beşê (prev_pos;pos) navîn_pos wekhevî navîn_pos := (prev_pos+pos)/2 û li hin taxên navîn_pos li ser beşê (middle_pos-8;middle_pos +8) em amplîtuda herî zêde û herî kêm hesab bikin. Heger ferqa di navbera wan de ji 10-an zêdetir be, em bit 1-ê di encamê de dinivîsin, wekî din 0. 10 domdarek e ku bi ceribandinê hatî peyda kirin;
  7. Helwesta heyî di prev_pos de tomar bike (prev_pos := pos)
  8. Ji gava 3-an dest pê bikin dubare bikin heya ku em tevahî pelê bixwînin;
  9. Pêdivî ye ku rêzika bit ya encam wekî komek byte were tomarkirin. Ji ber ku me dema xwendinê baytê hevdengiyê hesab nekiriye, dibe ku hejmara bitan ne pirjimara 8 be, û guheztina bitê ya pêwîst jî nenas e. Di pêkanîna yekem a algorîtmayê de, min li ser hebûna byte hevdemkirinê nizanibû û ji ber vê yekê bi tenê 8 pelên bi hejmarên cûda yên bitsên offset tomar kirin. Yek ji wan daneyên rast hebûn. Di algorîtmaya paşîn de, ez tenê hemî bit heta A5h jê dikim, ku dihêle ku ez tavilê pelê encamek rast bistînim

Algorîtmaya li Ruby, ji bo kesên eleqedar
Min Ruby wekî zimanê nivîsandina bernameyê hilbijart, ji ber ku ... Ez pir caran li ser wê bername dikim. Vebijêrk ne performansa bilind e, lê peywira çêkirina leza xwendinê bi qasî ku pêkan e hêjayî wê nîne.

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

Di encama

Dema ku ez çend guhertoyên algorîtma û domdar ceribandim, ez bi şens bûm ku ez tiştek pir balkêş bi dest xistim:

Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

Ji ber vê yekê, li gorî rêzikên karakteran dadbar dikin, me bernameyek ji bo xêzkirina grafiyan heye. Lêbelê, di nivîsa bernameyê de peyvên sereke tune. Hemî peyvên sereke wekî byte têne kod kirin (her nirx > 80h). Naha divê em fêr bibin ka kîjan komputer ji salên 80-an dikare bernameyan di vê formatê de hilîne.

Bi rastî, ew pir dişibihe bernameyek BASIC. Komputera ZX Spectrum bernameyan hema hema bi heman formatê di bîrê de hilîne û bernameyan li ser kasetê hilîne. Tenê di rewşê de, min li hember peyvên sereke kontrol kir mêz. Lêbelê, encam eşkere neyînî bû.

Di heman demê de min keywordên BASIC yên navdar Atari, Commodore 64 û çend komputerên din ên wê demê jî kontrol kir, ji bo ku min karîbû belgeyan bibînim, lê bêyî serketinê - zanîna min di derheqê celebên komputerên retro de ne ew qas berfireh bû.

Paşê min biryar da ku herim navnîş, û paşê awira min li ser navê çêker Radio Shack û komputera TRS-80 ket. Ev navên ku li ser etîketên kasetên ku li ser maseya min hatibûn nivîsandin ev in! Min berê van navan nizanibû û bi komputera TRS-80-ê ne nas bûm, ji ber vê yekê ji min re xuya bû ku Radio Shack çêkerek kasetên dengî yên wekî BASF, Sony an TDK bû, û TRS-80 dema lêdanê bû. Çima na?

Computer Tandy / Radyoya Shack TRS-80

Bi îhtimaleke mezin ew qeyda deng a ku min di destpêka gotarê de wek mînak da, li ser komputerek weha hatî çêkirin:

Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

Derket holê ku ev komputer û celebên wê (Model I / Model III / Model IV, hwd.) di demekê de (bê guman, ne li Rûsyayê) pir populer bûn. Hêjayî gotinê ye ku pêvajoya ku wan bikar anîne jî Z80 bû. Ji bo vê komputerê hûn dikarin li ser Înternetê bibînin gelek agahî. Di salên 80-an de, agahdariya komputerê hate belav kirin kovaran. Di vê demê de çend hene emûlatoran komputerên ji bo platformên cuda.

Min emulator dakêşand trs80gp û ji bo cara yekem min karî bibînim ka ev komputer çawa dixebite. Bê guman, komputerê hilberîna rengîn piştgirî nekir, çareseriya ekranê tenê 128x48 pixel bû, lê gelek pêvekirin û guhertin hebûn ku dikarin çareseriya ekranê zêde bikin. Di heman demê de gelek vebijarkên pergalên xebitandinê yên vê komputerê û vebijarkên bicîhkirina zimanê BASIC hebûn (ku berevajî ZX Spectrum, di hin modelan de jî di ROM-ê de ne "flash" bû û her vebijarkek dikaribû ji dîska dîskê were barkirin, mîna OS bixwe)

Min jî dît bikêrhatî ji bo veguheztina tomarên dengî di forma CAS de, ku ji hêla emulatoran ve tê piştgirî kirin, lê ji ber hin sedeman ne gengaz bû ku meriv tomarên ji kasetên min bi karanîna wan bixwîne.

Dema ku ez forma pelê CAS-ê fêhm kirim (ku derket holê ku tenê kopiyek bît-bi-bit ji daneyên kasêta ku berê li ber destê min bû, ji xeynî sernavê bi hebûna byte hevdemkirinê), min çêkir. çend guheztinên bernameya min û karîbû pelek CAS-a xebitandinê ya ku di emulatorê de dixebitî derxe (TRS-80 Model III):

Çawa min daneyên bi rengek nenas ji kasêta magnetîkî vegerand

Min guhertoya herî dawî ya kargêriya veguheztinê bi destnîşankirina otomatîkî ya pêla yekem û dûrahiya di navbera pêlên referansê de wekî pakêtek GEM sêwirand, koda çavkaniyê li vir heye. Github.

encamê

Rêya ku me meşandiye derketiye rêwîtiyek balkêş a berbi paşerojê, û ez kêfxweş im ku di dawiyê de min bersiv dît. Di nav tiştên din de ez:

  • Min forma tomarkirina daneyan di ZX Spectrum de fêhm kir û rûtînên ROM-ê yên çêkirî yên ji bo hilanîn/xwendina daneya ji kasetên deng vekolîn kir.
  • Min bi komputera TRS-80 û cûrbecûrên wê nas kir, pergala xebitandinê lêkolîn kir, li bernameyên nimûne nihêrî û tewra min fersend dît ku ez di kodên makîneyê de xeletiyê bikim (bi her tiştî, hemî mnemonîkên Z80 ji min re nas in)
  • Ji bo veguheztina tomarên dengî li formata CAS, ku dikare daneyên ku ji hêla kargêriya "fermî" ve nayên naskirin, amûrek bêkêmasî nivîsand.

Source: www.habr.com

Ji bo malperên bi parastina DDoS, serverên VPS VDS mêvandariya pêbawer bikirin 🔥 Hostinga malperê ya pêbawer bi parastina DDoS, serverên VPS VDS bikirin | ProHoster