prehistory
ášá¬áµá® áááµáá áá ášá á ááá á ááµ áá ZX Spectrum+ ášá¥áááá á»á áááᢠášá®ááá©á°á© áá á°ášáá® á¥á ášáŠá²á® á«áŽá¶áœ ášášáá³áᜠáá (á ááááªá«á áážáá« ááµá¥ ášáááªá«á áá) á¥áá²áá áá© ááááµ á³áá°ášáá£ážá á á«áŽá¶áœ áá ášá°áááá¡ áá®áá«ááœá á ááá»ááᢠášááááá ááá áš40 á ááµ á«áŽá¶áœ áášá á á°áᥠááá á£á á¥á ášáá áá°á áááá ášáá³áᜠá¥á áá®áá«ááœá ášáá± ááášáµ áœá«ááá¢
ááá á á áá³ááµ á«áŽá¶áœ áá á ZX Spectrum á®ááá©á°á á«áá°á°á« áášá»ááœá á ááá»ááᢠá¥áá± áá ááá ášá°ááš áµáᜠá«á°á áá á á¥á ášá°á áá°á á®ááá©á°á á
ááᜠá á°ááš ááá© á ááá áá®áá«áᜠá¥á ášáá³áᜠá
ááᜠááµá¥ á£áá á áá BASIC á¡áµ á«á á áááá©á á¢
áá°áá°á áá áá
á á£á á á³ááá - á á¥áá± ááµá¥ áá á¥áá°á°á°á á áááá
á á£á á¥ááá áá áᢠášáµáᜠáááá±á á¥áá° á£ááµ á
á°á á°ášá°á ááá ᥠášá»áᣠášáááá±á á áá£á¥ ášáá áá áááááœá ááá áááááá ááá áááá ááœááᢠá ááµ ááááµ á¬áµá®-á ááªáŠáá.
á áá áááá ááááµ áá ášá«áŽá¶á¹á ááá«áᜠáµááášáµá£ ááá á¥ááá áááá«á±á
ááá± áááጠá¥á«á© áá
á áá« á«áŽáµ ááá«á áá áš TRS-80 á®ááá©á°á áµá áá ᣠá¥á ášá áá«á¹ áµá á á³áœ âá á ááªá« ááµá¥ á á¬á²á® á»á ášá°á°á«â
(áŽá«áá á¥áµáš áášášá»á ááášáµ ášááá á á á¥áá áµá á ááá±)
ášáµáᜠáááá¶áœá ááá³á°á
á ááááªá« ášáµáá á áááœá á²áá³á á¥ááµáááᢠáá á¥áá°áááµá áá³áᥠááœááá¡-
á¥á á¥áá°á°ááá°á ášZX Spectrum á®ááá©á°á ášá°áá³á áµááœá¡-
á ááá±á ááá³ááœ, á áášá»á ááááªá« áá ášáá£á ááá á á á á¥á«áª áá - á°áá³á³á áµáááᜠáµáᜠ(á ááááªá«á áášá» á á£á á áá <1 á°ášááµ áá, áá ááášáµ áá»áá). ášá á¥á«áªá áµáᜠá®ááá©á°á© áášá áááá á á¥áá²ááá ááááµ áá°á£áᢠá¥áá° á ááµ á°áá¥, á¥á«áá³áá± á®ááá©á°á á á²ááá á¥á á áµáááᜠá áᜠášá«á±á "ášá«á±" á á¥á«áª áµáᜠá¥á» ááááá£á.
áµá áááá± á áᜠá«á± á ááµ ááá áááá á«áµáááá. ááá³áᣠá ZX Spectrum áá á áá¹ á á«áµ áááá ááá¡-
ášááááµ áá á²áá ááµá€ááµ áµáááµášá áááá± áá³ááá ááááášáµ á áá« áá¹ áá°á áá á°ááá áá á¥á á°áá«á á ááááœá á«á³á«áᢠá á¥á«áª áá á«á áá ášá°áá³á°á ášáᥠááµ, áá
á á®áááá°á© áášá ááá á á¥áá²ááá ááááµ á«á°ááá. á¥á± á á áá áá (ášá á¥á«áªá áá á¥á ášáá£á© áášá áá á²áááá) á°ááᶠáá³ááá (á¥ááá áááášá±)
ášááá³á°á ááµ ášá°áá á á áá á®ááá©á°á© ášááá³ áááá á ááá«áµ á¥á«áá³áá±á ášááááµ ááá³áµ/ááá°á ááááá£áᢠášááá³ áá ášá°áá°á áá°á¥ á«áá° ášáá, á¢áµ 1 áá° áá á°áš áµááµá³ áá»áá, á áá ááá« 0. á¢áµáµ áá° á£ááµ áá°á á°á£á á¥á áá°á± N á£ááµ á¥áµáªáá á áµášáµ áá°áááá. áá¥á N á¥ááá áá ášáášá°á ááá á«áµá ááá°á³áᢠášáá«á á á°á á°ášá°á á¥áá°áášá°áá áá.
- á á¥á«áª áá
- á«áµá (áá ááááµ)ᣠášáášá°á ááᥠáá á (N)ᣠášááá áµá á¥á ááááµ ááá
- á á¥á«áª áá
- áášáá á«á±
ááá¡ á áµááá áá«áá ááášááᥠZX Spectrum ášáá£ááá á«áá£áᢠá¥á©áááµ á£ááµ (ááªá² á£ááµ)ᣠáá á áááá á áá«áµááá¡á áµ áá ášáá°áá áááá ášáœáá ááᥠá£ááµ XOR á ááµášá ááᢠá ááµá ááá á áá«áá¡á áµ áá á®ááá©á°á© ášá°áá áá áášá ášááªá² á£ááµá á«á°áá á¥á áá€á± ášá°ááá á ášá°ááš ášáá "R Tape loading error" ášáááá ášáµá á°áµ ááá¥ááµ á«á³á«á. á áµááá ááááá á®ááá©á°á© á áá«áá¡á áµ áá ášáᥠááµá ááášáµ á«áá»á (á«ááá¡ ááá ášááá³ ááá ášá°áá°á áá°áŠáœ áá ášááá£á£á ášáá) áá á ááá¥ááµ áá°á á¥á áá°á¥ ááœááá¢
áµááá ᣠá áá á«áá³áá ááááµ áá á¥áá°áááµá á¥áááášáµá¡-
áá
ášááááµ áá ááᢠášáááá± á
áá
á á£á ášá°ááš áá, ááá áá áááá± ášá°áá°á áµáááᜠá á«áá ášáᥠááµ ááµááá á¥áá°áá«á«áµáµ ááᜠáá. á 44100 Hz ášááá áµáááᜠá "ááá®ááœ" áá«ášá á«áá áááµ á áááµ 48 ááááᜠáá (áá
á áš ~ 918 Hz áµáááᜠáá áááá³á) áá
áá ááµá á¥ááµá³ááµá¢
á áá ášáášá ááááá á¥ááá¡-
á ááá°á¥ á¥á«á¥á¬áᜠáá«ášá á«ááá áááµ ášáá«á, á "ášá
á" á¥á«á¥á¬áᜠáá«ášá á«áá áááµ á ááá ~ 48 áááááœ, á¥á á á á«áá áá«ášá - ~ 24. áµáᜠáá° ááµ áµááášáµ á áášášá»á áá 918 Hz áµáááᜠá«áážá âáá£áá»â á¥á«áᜠášááááªá«á á¥áµáš ááá áášášá» áµášáµ á«áááášá¥ á¥áá°áášá°á á¥ááá ᢠáášáá á áá«áµá°áááá áµ áá á°ášá᪠ášáᥠááµ (pulse) á áá£áá» á¥á«áᜠáá«ášá ášá°áá áš, á¥áá° á¢áµ 1 á¥ááá¥á«áá, á áá ááá« 0 á¥ááá¥á«áá.
áµá ááá³á°á ášáᥠááµáµ? ášáášááá ááááªá« á¥áááášáµá¡-
ášá á¥á«áªá áµáᜠá«á áá á¥á ááá¡ áá²á«áá áááá«á. áµáᜠááá¶á£ ášá°áá«á© ášáµáᜠá
áááœá ášáášááá á ááᣠášááááªá«á á£ááµ á³á³ áááá á ááµ á áááµ áááá (10100101bᣠA5h) áááá
áœáááᢠá®ááá©á°á© áášááá ášá°áá á á áá ááá ᥠáááá ááœáá.
á¥áá²áá á ááá³á°á á£ááµ ááµá¥ ášáášášá»á 1 á á áá áá²á«áá áááááªá«á ášáá£áá» ááµ ááᥠáµá©ášáµ ááµá áµ ááœááᢠá ááá ááááªá« áá á«áá áášá á á°ášáá ááá³ ááá ᥠá áááœáá áµ áá ášááᥠáááá« áá®áá«áá á áááááµ áá°áµ ááµá¥ á¥á ááᶠá°ááá·áá¢
á áá ášáµáᜠáááá ášáá«áµá¬áµ á¥á ááᥠášááá á áááªááá ááááᜠá¥ááááá¢
ááᥠá áá«á áá
á ááááªá«á£ á áááªááá ááá áááµášá á¥ááµ ááá¶áœá á¥áááášáµá¡-
- ááááœá á WAV á áážáµ á¥á» á¥áááášá³áá;
- ášáµáᜠááá á ááááµ áá áááá á áá áµ á¥á ááááªá« áá ážá¥á³á áá«á ášáá áµá
- ášááá ááá ášááá áá á 44100 Hz ááá á áá áµá¢ á áá ááá³ á 48 ááááᜠáá«ášá á£áá ášáá£áá» á áá£á¶áœ áá«ášá á«áá áááµ á áµááµá á°ááµáá á¥á á áá®áá«á ááµááµ á á«áµááááá;
- ášááá á áážá± ááááá ááá ááœáá (8/16 á¢áµ / á°áá³áá áá¥á¥) - á ááá ᥠáá áá°ááááá áááᥠá¥ááœááá;
- ášááá ááá á amplitude ášá°ááá° áá á¥áá á¥áááá³áá, áá á áá€á±á áášáááµ á áá áµ;
ášáá£á¥ áµáá° ááá á¥áá°áášá°áá áááá.
- áááá áá° áá á°áš áµááµá³ á¥ááá£áá, á á°áá³á³á áá ášááá á áážá±á áá° 8 á¢áµ á¥áááá£áá;
- á áµáᜠáášá ááµá¥ ášááááªá«áá ášáᥠááµ áŠá³ áááµá. áá áá áááµášá ášááááá áá¥á ášášáá°áá áµááµ áá ááµááµ á«áµááááá³á. ááááááµ á ááµ áá á á¥á á¥áá°áááᢠáá° á°áááá prev_pos á¥ááµááá á;
- á áášášá»á ášáᥠááµ áŠá³ áá 48 á«áá (pos:= prev_pos + 48)
- áŠá³áá á 48 áá³á°á áá° áá£á© ášáá£áá» ááµ (ášáŽá ááµáá¶áœ ᣠášáŽá áµá«áá ááŽá á«áá°ášáá á á á«á ᣠááá°) áá°áááá áµ áŠá³ á¥áá°áááá ááµáµá áµáááá°á¥ ášááµá³ ááµá á áááᥠááµá°á«ášá á áá¥á ᢠáá áá áááµášá, áµáᜠááᥠ(pos-8; pos + 8) ááá°á± á¥á á á¥á± áá ášáá°ááá ášáá á á¥áŽáµ á«áá. ášášáá°áá áá ášáááá°á á áááᥠá ááµá³ ááµá¥ áášáá»á. á¥áá 8 = 48/6 á áášá« ášá°áá áá áá, áá á áµáááááá ášáá°ááá áááá°á ááµáµá áá°á£á á¥á á á á á«á¢á« ááá ášááœá ááᜠááá¶áœá á ááá³áá. á á£á áá¥á á áá ááá³ááœ, á á¥á«á¥á¬áᜠáá«ášá á«áá áááµ áš 48 á«áá° ááá áš XNUMX á áá ášáá, ášáá³á ááµ áááá áá°áá á ááœáá, ááá áá á á ááá¹ áá°á ááµá¥ áá áá á á áááªáá ááµá¥ á ááááœá;
- á ááµáá á°ášá, ášáá£áá»á ááµ áá á áá á¥áá°á°áá áášááá¥á á áµááá áááá. á«á áááµ á ááá ášáá°ááá ášáááá áá ááá± á áá ááá ááµá¥ ááá©á á á«ášááá¥á. á áášášá»á ášáá£á¥ áá®áá«á á á°áá£á á ááµá¥ á á ááµ ááá áá á ášáá°áá á¥á á áµáá¹ ášáá á á¥áŽá¶áœ áá«ášá á«ááá áá©ááµ á ášááá£áá ᣠá¥á ášá°áá°á áá°á¥ á áá ášáá ᣠášáááµ áááá á¥áá¥á«ááᢠá á°ášááªá á¥á«áá ášááá³ášáªá«á ááµ á«áá°áá áá ááµášá á¥áá³áá áµ áá. 2 á áá«á®áœ á áá¡ áá ááá¡ á ááá á¥á ážá¥á³á áášá°ááᣠááá áá á¥áá° ášááá ᥠáµá á°áµ ááá á á áá áµá¢ ááá áá, á áááªááá ááááá áá áá á¥áá°áááá;
- á ááá¥áá á°ášá, ášááᥠááµ (á¢áµ 0 ááá 1) ááá©á ááá á áá¥á, ááá á ášáááá áá«ášáá (prev_pos;pos) áá«ášáá_pos áá«ášáá_pos áá á¥á©á á¥áááµá³áá: = (prev_pos+pos)/2 á¥á á á áá³ááµ áš middle_pos á°áá ááá áá (áá«ášáá_ááµ-8;áá«ášáá_ááµ +8) ášáá°ááá á¥á áá á°ááá áµááµ á¥áá°ááᢠá áá«ášáážá á«áá áá©ááµ áš 10 á áá ášáá, á áá€á± ááµá¥ á¢áµ 1 á¥ááœááá, á áá ááá« 0. 10 á áášá« ášá°áá áá áá;
- ášá ááá áŠá³ á prev_pos ááµá¥ á«áµááá¡ (prev_pos := pos)
- áááá ááá á¥áµášáááá á áµášáµ ášá°ášá 3 ááá® ááµáááµ;
- ášá°ááá ášá¢áµ áµááµá á¥áá° á£ááµ áµá¥áµá¥ áááᥠá áá áµá¢ á ááá ᥠáá ášááá³á°á á£ááµ áááµ ááµá¥ áµáááá£á ášá¢áµ á¥ááµ 8 á¥ááµ áááá ááœáá á¥á ášááááá á¢áµ áá«á«á» á¥áá²á á áá³áá áᢠá á áááªáá ášááááªá« á á°áá£á á áá ášááá³á°á á£ááµ ááá©á á ááá á áá á á¥á áµááá á ááá 8 ááááœá ášá°áá«á© ášáá¥á®áœ áá«á«á» á¢áµ áá á áµááá§áᢠášáá«ášáážá á áá± áµáááá áášá ááá. á áášášá»á áµáá°-ááá ááµá¥, áááá á¢áµ á¥áµáš A5h áµášáµ á¥á» á áµááá³áá, áá á áµáááááá ášáá€áµ ááá áá²á«áá á¥áá³áá á«áµáœááá
á áááªáá á á©á¢á£ ááááá
áá®áá«áá ááá»á á©á¢á ášáášá¥á©áµ ááá ááဠáááá«á±á... á¥á áá áá®áá«á á á°ááááᢠááá«á ášáá°á á áááá á áá°áá, ááá áá ášáá£á¥ áá¥ááµá á á°á»á áá¥ááµ ášáááááµ áµá« áá ášááá.
# ÐÑпПлÑзÑеЌ 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*")
áá€áµ
á áá«á³ ášá áááªáá á¥á ášáááᜠá áá«á®áœá ášáášáá© á áá á ááµ á á£á á áµá°á³áœ ááá á áááᎠááµáá ááá¡-
áµááá
ᣠá ááž-á£á
áªá«áµ áá¥ášááááᜠáµáááááᣠáá«ááœá ááá
ášáœ áá®áá«á á ááᢠááá á áá®áá«á áœáá ááµá¥ ááá ááá áááµ ášááᢠááá ááá ááá¶áœ á¥áá° á£ááµ (á¥á«áá³áá± á¥áŽáµ> 80 á°) á°ááá ááᢠá áá áš 80 áá¹ ááµá¥ ášáµáá á®ááá©á°á áá®áá«ááœá á áá
á
áážáµ ááµááᥠá¥áá°ááœá ááá
á áá¥á.
á¥áá°áá áš BASIC áá®áá«á áá á á£á á°áá³á³á ááᢠášááµá€ááµ áµáááµášá á®áááá°á áá®áá«ááœá á á°áá³á³á á
áááµ á áá
á°áš áµááµá³ á«ášáá»á á¥á áá®áá«ááœá á áŽá á«áµááá£áᢠá¥áá°áá« ášááᣠááá ááá¶á¹á á áááá ááµá»ááá¢
á¥áá²áá á³áááá á á³áªá£ á®ááá¶á 64 á¥á ášáá áá ááᜠá áá«á³ á®áááá°á®áœá BASIC ááá áááµá á á£á«áᣠááá á á°áá¶áœ ááááµ á»áá©áᣠáá á áá°á³á«ááá - áµá á¬áµá® á®áááá°á®áœ á áááµ á«áá á¥áááµ á«á á«á á á°á á ááááá¢
ášáá«á ááááµ áá°áá©
ášá®áááá°á á³áá² / á¬á²á® Shack TRS-80
á áœáá ááááªá« áá á¥áá° áá³á ášá ááµá©áµ á á¥á«á ááµá¥ á«áá ášáµáᜠá á á á®ááá©á°á áá ášá°áášáž á³ááá á ááááá¢
áá
á®ááá°á á¥á ááá«áá¹ (ááŽá I / ááŽá III / ááŽá IV, ááá°) á á ááµ áá á á£á á°áá³á
áá á© (á á¥ááᥠá á©á²á« ááµá¥ á áá°áá). ášá°á ááá áµ áá®á°á°áá Z80 ááá áµá©ášáµ ášááµá¥ ááᢠááá
á®áááá°á á áááášá¥ áá ááááµ ááœááá¢
emulator á ááááá
á¥áá á ááá
ášCAS ááá á ááá±á á«áá á á áá (ášáá áá°á á á¥á ášáá ášá á«áŽáµ ášá°áá áášá áµáᜠá -á¢áµ á á áá ášá°ááᣠášááá³á°á á£ááµ á«áá á«áµá á áµá°áá)ᢠá áá®áá«á áá á¥ááµ áááŠáœ á¥á á emulator (TRS-80 ááŽá III) ááµá¥ ášáá°á« ášáá°á« CAS ááá ááá£áµ áœá«ááá¢
ášááááªá«áá ášáᥠááµ á á«áµ á°á á ááá°á á¥á á áá£áá» á¥á«áᜠáá«ášá á«ááá áááµ á¥áá° GEM á¥á
á á áá áá ášá
áᥠáááá ášááááá«áá áµáªáµ ááµáá ááᣠášááá á®á± á áá ááááá¢
áá°áá°áá«
ášá°áááá áµ ááááµ áá° á«ááá ááá á áµá°áá áá ááᣠá¥á á áášášá» ááá±á á áááᎠá°áµá°á ááᢠášááᜠááá®áœ á á°ášá᪠á¥áá¡-
- á ZX Spectrum ááµá¥ áášáá áááµááᥠá áážá±á á ááá«áá á¥á ášáµáᜠá«áŽá¶áœ áášáá áááµááᥠ/ áááá ᥠá á¥á® ášá°á°á«áá áš ROM ááá¶áœá á á¥áá»áá
- áš TRS-80 á®ááá©á°á á¥á ááá«áá¹ áá á°ááá á ᣠáµááá° ááááá á á¥áá»áá ᣠášááá áá®áá«ááœá á°ááášáµá© á¥á á ááœá á®á¶áœ ááµá¥ áášá á¥áá³á á¥áµáá á ááá»áá (ášááá á áá ᣠááá áš Z80 mnemonics áá¥á á«ááá)
- ášáµáᜠá áááœá áá° CAS á áážáµ áááášá ášáá«áµáœá áá á áááááµ ááᣠáá á á "áŠááŽáá" ááááá« á«áá³áá áášá ááá ᥠááœááá¢
ááá: hab.com