á á±á¬ááá¯áá»ážáá¬á
áá±ááºáá±á¬ááºáž áá¬á·ááºáá²ááᯠááŸá áºáááºáá°áá áºáŠážááŒá áºáá±á¬ááŒá±á¬áá·áº UK ááŸá áá±á¬ááºážáá»áá°áá¶á០ZX Spectrum+ ááᯠáá áºáá«á áááºáá°áá²á·áá°ážáááºá ááœááºááŒá°áá¬ááá¯ááºááá¯áẠá¡áá«á¡áááºá ááááºážáá»á¬áž (áá°áááºážáá¯ááºááá¯ážááŸá¯ááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážáá«ááá·áº) á¡áá¶áááºáááºáá»á¬ážá¡ááŒáẠá¡áá°ážá¡ááŸááºá¡áá¬ážááá«áá² áááºáááºáá±á«áºááœáẠááŸááºáááºážáááºáá¬ážáá±á¬ áááá¯ááááºáá»á¬ážáá« áááŸááá²á·áá«áááºá á¡á¶á·ááŒá áá¬áá±á¬ááºážáá¬á á¡ááẠáá á¡ááœáẠáááºáááºááœá±ááá± áá±áá¬ááœá±ááᯠáá±á¬ááºážáá±á¬ááºážáááºááá¯ááºááŒá®áž ááááºážáá²á· áááá¯ááááºá¡á¬ážáá¯á¶ážáá®ážáá«ážááᯠáá±á«ááºážáá¯ááºáá¯ááºááá¯ááºáá²á·áá«áááºá
ááá¯á·áá±á¬áºáááºážá á¡áá»áá¯á·áá±á¬ áááºáááºáá»á¬ážááœáẠZX Spectrum ááœááºáá»á°áá¬á០ááŸááºážááŸááºážáááºážáááºáž áááŒá¯áá¯ááºáá¬ážááá·áº á¡áá¶ááœááºážáá»ááºáá»á¬ážááᯠáá»áœááºá¯ááºááœá±á·ááŸááá²á·áááºá áááºážááá¯á·ááẠáá¯á¶ážáááœá²ááŒá¬ážááá·áºá¡áá¶ááŒá
áºááŒá®áž áá±á¬áºááŒáá¬ážáá±á¬ááœááºáá»á°áá¬á០á¡áá¶ááœááºážááŒááºážáá»á¬ážááŸáá·áºááá°áá²á áááºážááá¯á·ááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº áááá¯ááááºáá»á¬ážááŸáá·áº ááááºážáá»á¬ážá¡á¬ážáá¯á¶ážá á¡áá¶ááœááºážááŸá¯ááœáẠáá«ááŸáááá·áº BASIC bootloader á¡ááá¯ááŒáá·áº á
áááºááŒááºážáááŸááá«á
á¡áá»áááºá¡áá±á¬áºááŒá¬á¡á±á¬áẠáá®á¡áá¬á áá»áœááºáá±á¬á·áºááᯠááá²ááŒá±á¬ááºá
á±áá²á·ááẠ- áá°ááá¯á·áá²ááŸá¬ áá¯á¶ážááœááºáá¬ážáá²á·á¡áá¬ááœá±ááᯠáá»áœááºáá±á¬áº ááááºáááá»ááºáá²á·áááºá á¡áá¶á¡áá»ááºááŒááŸá¯ááᯠááá¯ááºáá»á¬ážá á¡ááœá²ááá¯ááºá¡ááŒá
Ạáááºááá¯ááºáá»áŸááºá áááºááẠá¡áá»ááºááŒááŸá¯á áá°áá¡á
ááᯠááœáŸááºááŒááá·áº á
á¬áá¯á¶ážáá»á¬áž ááá¯á·ááá¯áẠáááºááá·áºá¡áá¬ááá¯áááᯠááŸá¬ááœá±ááá¯ááºáááºá áá±ááºáá±á¬ááºáž ááŸá±ážáá±á¬ááºážáá¯áá±áá áá
áºáá»áá¯ážá
á¡áᯠááááºážáá¯á¶ážááœá¬ážáááºáž áááºáááºáá¶ááááºááœá±ááᯠááŒáá·áºááá¯ááºáá±á¬á· ááŒá¯á¶ážáá±áááááºá
á¡ááŒá±á áá«á·áá»ááºá
áááŸá±á·ááŸá¬áá² ááŸááá¬áá±á
áááºáááºáááºáááºá á¡ááœáŸááºážááœáẠTRS-80 ááœááºáá»á°áá¬áá¡áááºááŒá
áºááŒá®áž áá¯ááºáá¯ááºáá°áá¡áááºá¡á±á¬ááºááœááº- "U.S.A. ááœáẠRadio Shack ááŸáá¯ááºáá¯ááºáááº"
(á¡áá¯á¶ážáá ááŒá±áá¯ááºážáá¯ááºáá»ááºáááºáá±á¬á· ááá¯ážááŸááºá¡á±á¬ááºááᯠáááœá¬ážáá«áá²á·)
á¡áá¶á¡áá»ááºááŒááŸá¯áá»á¬áž ááŸáá¯ááºážááŸááºááŒááºážá
ááááá¯á¶ážá¡áá±áá²á·á á¡áá¶ááœááºážááŸá¯ááœá±ááᯠáá áºáá»á áºáááºá áá áºáá²á· áá¯ááºááŒáá·áºáá¡á±á¬ááºá áááºááá¯á¡áá¶áá²ááá¯áá¬ááᯠáá¬ážáááºááá¯ááºáá«áááºá
ZX Spectrum ááœááºááŒá°áá¬á០á¡áá¶áááºážááẠáá¯á¶ážá á¶á¡ááá¯ááºážá
ááŸá áºáŠážá áá¯á¶ážááá á¹á áá»á¬ážááœááº, á¡áá¶ááœááºážáá¡á ááŸá¬áá«áá±á«áºááŸááá«áááºá áá±áá¬ááºááŸá°ážáá±áᶠ- áá°áá®áá±á¬ááŒáááºááŸá¯ááºážáá¡áᶠ(áááááá¯ááºáá°ážááŸá¯ááœááºáááºážááẠ<1 á áá¹ááá·áºááá¯áá±á¬ááºážáá±á¬áºáááºáž ááœá²ááŒá¬ážááááŒááºááá¯ááºáááº)á ááá¯ááºážáá±á¬á·áá±áá¶ááẠáá±áá¬áááºáá¶ááẠááŒááºáááºáááºá¡ááœáẠááœááºáá»á°áá¬á¡á¬áž á¡áá»ááºááŒáááºá á ááºážáááºážá¡ááá¯ááºážá ááœááºáá»á°áá¬áá áºáá¯á á®ááẠá¡áá»ááºááŒááŸá¯áá¯á¶á á¶ááŸáá·áº áááºážáááŒáááºááŸá¯ááºážááŒáá·áº áááºážá "ááá¯ááºááá¯ááº" ááŸá±á·ááŒá±ážáá±áá¶ááá¯áᬠá¡ááá¡ááŸááºááŒá¯áááºá
á¡áá»ááºááŒáá¯á¶ááá¹áá¬ááºááŸáá·áºáááºáááºááŒá®áž áá áºáá¯áá¯ááŒá±á¬ááẠááá¯á¡ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá ZX Spectrum ááœáẠáááºážááá¯á¶ááá¹áá¬ááºááẠá áá¯áá¶áá¯á¶ááŒá áºáááºá
pilot tone ááá¯ááœá±á·ááŸááá±á¬á¡áá«á ZX Spectrum ááẠsignal ááá¯á¡ááá¡ááŸááºááŒá¯ááŒá±á¬ááºážááœáŸááºááŒáááºá
ááááºáá¡áá¬ážáááºááœááºá¡áá®áá±á¬ááºááŸáá·áºá¡ááŒá¬áá¬ážáá»á¬ážááá¯áá
áºááŸáá·áºá
á®ááŒááááºá áá±áá¬ááºááŸá°ážá áá±áá¶á¡áá¯á¶ážááẠsynchro ááœá±ážáá¯ááºááŸá¯ááºážááœááºááŒá°áá¬ááẠáá±áá¬áááºáá¶ááá°ááẠá¡áá»ááºááŒáá±ážáááºá áááºážááᯠááá¯áá±á¬ááºážáá±á¬ááŒá¬áá»ááẠ(áá±áá¬ááºááŸá°ážá¡áá¶ááŸáá·áº áá±á¬ááºáááºááœá²á¡áá»ááºá¡áááºáá»á¬ážááŸáá·áº ááŸáá¯ááºážááŸááºáá¬ážáááº) (áá¯á¶ááœááºááŒáá·áºáá«)
áááºáá°áá»áá±á¬ ááœá±ážáá¯ááºááŸá¯ááºážááᯠáááºáá¶áááŸáááŒá®ážáá±á¬ááºá ááœááºáá»á°áá¬ááẠáááºážáááŒá¬áá»áááºááᯠááá¯ááºážáá¬ááŒá®áž á¡áá»ááºááŒááŸá¯ ááŒáá·áºáááº/áá»ááŸá¯áá áºáá¯á á®ááᯠááŸááºáááºážáááºáááºá ááŒá¬áá»áááºááẠáááºááŸááºáá¬ážáá±á¬ ááá·áºáááºáá»ááºááẠáááºážáá«áá bit 1 ááᯠmemory ááá¯á· á á¬áá±ážáááºá ááá¯á·ááá¯ááºáá«á 0á bits áá»á¬ážááᯠbytes á¡ááŒá Ạá á¯áá±á¬ááºážááŒá®áž N bytes ááᯠáááŸááááºá¡áá áá¯ááºáááºážá ááºááᯠáááºáá«ááá²áá² áá¯ááºáá±á¬ááºáá«áááºá áá¶áá«áẠN ááᯠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áá±á«ááºážáá¯ááºáá¯ááºáá¬ážáá±á¬ááá¯ááºá áá±á«ááºážá á®ážá០áá°áááºá loading sequence ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºááẠá
- áá±áá¬ááºááŸá°ážáá±áá¶
- áá±á«ááºážá á®áž (áá¯á¶áá±á¡ááŸááº)á áá±á«ááºážáá¯ááºáá¯ááºáá¬ážáá±á¬áá±áá¬á¡ááœááºá¡á á¬áž (N)á ááá¯ááºá¡áááºááŸáá·áº á¡áá»áá¯ážá¡á á¬áž áá«ááŸááááºá
- áá±áá¬ááºááŸá°ážáá±áá¶
- data ááá¯ááºááá¯ááº
áá±áá¬ááᯠááŸááºáááºá áœá¬ áááºáá±á¬ááºááŒá±á¬ááºáž áá±áá»á¬á á±áááºá ZX Spectrum áá¯áá±á«áºáá±á¬ á¡áá¬ááᯠáááºáááºá parity byte (parity byte) ááᯠXORing ááŒáá·áº ááá¯ááºáá áºáá¯ááᯠááááºážáááºážáá±á¬á¡áá«ááœáẠááœááºáá»ááºáá±á¬ (parity byte)á ááá¯ááºááá¯áááºááá·áºá¡áá«á ááœááºáá»á°áá¬ááẠáááºáá¶áááŸááá±á¬áá±áá¬á០parity byte ááá¯ááœááºáá»ááºááŒá®áž ááááºááẠááááºážáááºážáá¬ážááá·áºááá¯ááºááŸáá·áº ááœá²ááœá²áá«áá á¡ááŸá¬ážáááºáá±á·áá»áº âR Tape loading errorâ ááᯠááŒááááºá á¡ááá¡áá»ááŒá±á¬ááá»áŸááºá á á¬áááºááá·áºá¡áá«á áááºážááẠááœá±ážáá¯ááºááŸá¯ááºážááᯠáááŸááºááááá¯ááºáá»áŸáẠ(ááœááºááœá¬ážááẠááá¯á·ááá¯áẠáááºážáááŒá¬áá»áááºááẠá¡áá»áá¯á·áá±á¬ááá·áºáááºáá»ááºáá»á¬ážááŸáá·áº áááá¯ááºáá®áá«)á
áá®áá±á¬á· á¡áᯠááááá²á· á¡áá»ááºááŒáá¯á¶á áááºááá¯áá»áá¯ážáá²ááá¯áᬠááŒáá·áºááŒáá¡á±á¬ááºá
áá«á áá±áá¬ááºááŸá°ážáá²á· á¡áá¶áá«á á¡áá»ááºááŒááŸá¯ááá¯á¶ááá¹áá¬ááºááẠáááááá¬áá¬ááœá²ááŒá¬ážáá±á¬áºáááºážá á¡áá»ááºááŒááŸá¯ááœáẠááŒáááºááŸá¯ááºážáá
áºáá¯á ááá¯áá±á¬ááºážáá±á¬ áá²áá»áá¯ážá
á¯á¶ááᯠáááºáá«ááá²áá² ááŒá¯áá¯ááºááŒá±á¬ááºáž áááºááŸá¬ážáá«áááºá ááá°áá¬ááŒáááºááŸá¯ááºáž 44100 Hz ááœááºá "áá±á¬ááºáááºáá»á¬áž" á¡ááŒá¬ážá¡ááœá¬á¡áá±ážááẠááá·áºááŸááºážááŒá±á¡á¬ážááŒáá·áº 48 ááá°áá¬áá»á¬ážááŒá
áºááẠ(ááŒáááºááŸá¯ááºáž ~ 918 Hz ááŸáá·áº áááºááá¯ááºáááº) á€ááááºážááááºážááᯠááŸááºáá¬ážááŒáá«á
áá¯á·á
á¡áᯠdata á¡ááá¯ááºážááᯠááŒáá·áºáá¡á±á¬ááºá
áá»áœááºá¯ááºááá¯á·ááẠáá²áá»áá¯ážá
á¯á¶áá
áºáá¯áá»ááºážááŒá¬ážá¡ááœá¬á¡áá±ážááᯠááá¯ááºážáá¬áá«áá "ááŸááº" áá²áá»áá¯ážá
á¯á¶ááŒá¬ážá¡ááœá¬á¡áá±ážááẠ~48ááá°áá¬ááŒá
áºáá±áá±ážááŒá®áž á¡ááá¯áá
áºáá¯ááŒá¬ážááœáẠ- ~24 ááŒá
áºáááºá á¡áááºážáááºááŸá±á·áááºááŒáá·áºááá¯ááºáá«á á¡áá¯á¶ážááœáẠ918 Hz ááŒáááºááŸá¯ááºážááŒáá·áº ááá¯ááºáá¡á
ááŸá¡áá¯á¶ážá¡áá á¡áááºáááŒááºááá¯ááºáá±áá±á¬ "ááá¯ážáá¬áž" áá²á·áá»á¬ážááẠááœááºáá±á«áºáá¬áááºáᯠááá¯ááá±áááºá áá±áá¬ááᯠááá¯á·ááá·áºá¡áá«ááœáẠáááºááœáŸááºážáá²áá»áá¯ážá
á¯á¶ááŒá¬ážááœáẠáá±á¬ááºááẠpulse áá
áºáá¯ááœá±á·áá«áá áááºážááᯠbit 1á ááá¯á·ááá¯áẠ0 áᯠáá°áááá¯ááºáá«áááºá
sync pulse ááá±á¬á áá±áá¬áá²á·á¡á ááᯠááŒáá·áºáá¡á±á¬ááºá
áá±áá¬ááºááŸá°áž á¡áá¶á¡áá¯á¶ážáááºááŒá®áž áá±áá¬ááẠáá»ááºáá»ááºážá
áááºáááºá ááá¡ááŒá¬á ááá°áá®áá±á¬á¡áá¶áááºážáá°ááŸá¯áá»á¬ážááᯠááá¯ááºážááŒá¬ážá
áááºááŒá¬ááŒá®ážáá±á¬ááºá áá±áá¬ááááááá¯ááºááẠá¡ááŒá²áááºážá¡áá°áá°ááŒá
áºááẠ(10100101bá A5h) ááᯠááŸá¬ááœá±ááœá±á·ááŸáááá¯ááºáá²á·áááºá ááœááºáá»á°áá¬ááẠáááºážááá¯áááºáá¶áááŸáááŒá®ážáá±á¬áẠáá±áá¬ááᯠá
áááºáááºááŸá¯ááá¯ááºáááºá
á áá·áºáẠbyte ááœáẠáá±á¬ááºáá¯á¶áž 1st ááŒá®ážáá±á¬áẠááááááºááœáŸááºážáá»ááºáá¯ááºááŸá¯ááºážá á¡ááŒá±á¬ááºážá¡áá²ááᯠá¡á¬áá¯á¶á áá¯ááºááá¯ááºáááºá ááá¯ááºáá¡á ááœáẠáá±áá¬ááᯠáááºááŒáááºá áœá¬ ááááºááá¯ááºáá±á¬á¡áá« áá±áá¬á¡ááá¡ááŸááºááŒá¯ááŸá¯ áááá¯ááááºááᯠáá®ááœááºááá·áºáá¯ááºáááºážá ááºááœáẠáá±á¬ááºááá¯ááºážááœáẠáááºážááᯠááŸá¬ááœá±ááœá±á·ááŸááá²á·áááºá
ááᯠá¡áá¶ááá¯ááºááᯠáá¯ááºáá±á¬ááºááŒá®áž áá±áá¬ááᯠáááºááá·áº á¡ááºáááá¯áá®áááºáá áºáá¯ááᯠáá±á¬áºááŒááẠááŒáá¯ážá á¬ážááŒáá·áºááŒáá«á áá¯á·á
áá±áá¬ááᯠáááºáá±áááºá
áŠážá áœá¬á á¡ááºáááá¯áá®áááºááᯠááá¯ážááá¯ážááŸááºážááŸááºážáá¬ážááẠáá°ááá»ááºá¡áá»áá¯á·ááᯠááŒáá·áºááŒáá«á áá¯á·á
- ááá¯ááºáá»á¬ážááᯠWAV áá±á¬áºáááºááŒáá·áºáᬠá ááºážá á¬ážáá«áááºá
- á¡áá¶ááá¯ááºááœáẠááŸá±á·ááŒá±ážáá±áá¶ááŒáá·áº á áááºááááºááŒá áºááŒá®áž á¡á ááœáẠá¡áá¶ááááºááŒááºáž ááá«áááºááá«á
- á¡áááºážá¡ááŒá áºááá¯ááºááœáẠááá°áá¬ááŸá¯ááºáž 44100 Hz ááŸáááá«áááºá á€ááá á¹á ááœááºá ááá°áᬠáá áá¯á áááºááœáŸááºážáá²áá»áá¯ážá á¯á¶ááŒá¬ážá¡ááœá¬á¡áá±ážááᯠáá¯á¶ážááŒááºáá¬ážááŒá®ážááŒá áºááŒá®áž áááºážááᯠáááá¯ááááºááŒáá·áº ááœááºáá»ááºááẠáááá¯á¡ááºáá«á
- ááá°áá¬áá±á¬áºáááºááẠáááºááá·áº (8/16 bits/floating point) ááŒá áºááá¯ááºááẠ- áááºááŸá¯áá±á¬á¡áá«ááœáẠáá»áœááºá¯ááºááá¯á·á áááºážááᯠááá¯áá»ááºáá±á¬áá¯á¶á á¶ááá¯á· ááŒá±á¬ááºážááá¯ááºáá±á¬ááŒá±á¬áá·áºá
- ááááºááᯠáááºááŒáááºá á±ááá·áº á¡áááºážá¡ááŒá áºááá¯ááºááᯠááá¬áá¡á¬ážááŒáá·áº áá¯á¶ááŸááºááŒá áºá¡á±á¬áẠáá¯ááºáá±á¬ááºáááºáᯠáá»áœááºá¯ááºááá¯á· áá°ááá«áááºá
Reading algorithm ááẠá¡á±á¬ááºáá«á¡ááá¯ááºáž ááŒá áºáááá·áºáááºá
- áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºááᯠáááºááá¯áá®á¡ááŒá áºáááºááŸá¯ááŒá®áž áá áºáá»áááºáááºážááœáẠááá°áá¬áá±á¬áºáááºááᯠ8 bits á¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áá«áááºá
- á¡áá¶áá±áá¬ááŸá áááááœá±ážáá¯ááºááŸá¯ááºážá á¡áá±á¡áá¬ážááᯠáá¯á¶ážááŒááºáá«á áá«ááá¯áá¯ááºááá¯á·á á¡ááŒáá·áºáá¯á¶áž ááœáŸá²ááœááºáá²á· ááá°áá¬á¡áá±á¡ááœááºááᯠááœááºáá»ááºááá¯á· ááá¯áá«áááºá ááá¯ážááŸááºážá á±áááºá áá»áœááºá¯ááºááá¯á·ááẠáááºážááᯠáá áºááŒáááºáááºážááŒáá·áº ááœááºáá»ááºáá«áááºá áááºážááᯠprev_pos variable ááœáẠááááºážáááºážááŒáá«á áá¯á·á
- áá±á¬ááºáá¯á¶ážááœá±ážáá¯ááºááŸá¯ááºáž á¡áá±á¡áá¬ážááá¯á· 48 ááᯠááá·áºáá« (pos := prev_pos + 48)
- áá¬áá°ážááᯠ48 ááŒáá·áº ááá¯ážááŒáŸáá·áºáá¬ážáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºáááºáááºááœáŸááºážááœá±ážáá¯ááºááŸá¯ááºáž (ááááºáá»áá¯á·ááœááºážáá»ááºáá»á¬ážá áááẠdrive ááá¹ááá¬ážá ááááºáááŒáááºáááºáááºááŸá¯á áááºááŒáá·áº) á pos pulse á á¡áá±á¡áá¬ážááᯠáá»áááºááŸáááẠááá¯á¡ááºáá«áááºá áá«ááá¯áá¯ááºááá¯á·á áá±ážáááºáá²á·áá±áᬠ(pos-8; pos+8) ááá¯áá°ááŒá®áž áááºážáá±á«áºááŸá á¡ááŒáá·áºáá¯á¶ážááá¬áááᯠááŸá¬áá«á á¡áá»á¬ážáá¯á¶ážááŸáá·áº áááºááá¯ááºááá·áº á¡áá±á¡áá¬ážááᯠpos ááœáẠááááºážáááºážáá¬ážáááºááŒá áºáááºá á€áá±áá¬ááœáẠ8 = 48/6 ááẠá ááºážáááºáááŸááá¬ážáá±á¬ ááááºážáá±áá áºáá¯ááŒá áºááŒá®áž áá»áœááºá¯ááºááá¯á·ááẠááŸááºáááºáá±á¬á¡ááŒáá·áºáá¯á¶ážááᯠáá¯á¶ážááŒááºáááºááŒá áºááŒá®áž á¡áá®ážáá¬ážááŸáá¡ááŒá¬ážáá±á¬ááœááºážá¡á¬ážáá»á¬ážááᯠááááá¯ááºáááºááá¯ááºááŒá±á¬ááºáž á¡á¬ááá¶áá«áááºá á¡ááœááºááá¯ážááœá¬ážáá±á¬á¡ááŒá±á¡áá±áá»á¬ážááœááºá áá²áá»áá¯ážá á¯á¶ááŒá¬ážá¡ááœá¬á¡áá±ážááẠ48 áááºáááºážáá±á¬ ááá¯á·ááá¯áẠááŒá®ážáá¬ážáá±á¬á¡áá«á ááœá±ážáá¯ááºááŸá¯ááºážááá¯á¡áááºážá¡áá»ááºááŸá¬ááœá±ááŒááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáá±á¬áºáááºáž áá±á¬ááºážáá«ážááááºáááºá¡ááœááºážááœáẠáááºážááᯠá¡ááºáááá¯áá®áááºááœáẠáá±á¬áºááŒáááºááá¯ááºáá«á
- ááááºá¡ááá·áºááœááºá áááºááœáŸááºážááœá±ážáá¯ááºááŸá¯ááºážááᯠáá¯á¶ážáááœá±á·ááŸááááŒá±á¬ááºáž á á áºáá±ážááẠááá¯á¡ááºáááºááŒá áºáááºá ááá¯ááá¯áááºááŸá¬á áááºááẠá¡ááŒáá·áºáá¯á¶ážááá¯ááŸá¬áá»áŸáẠá€á¡ááá¯ááºážááœáẠá áááºá¡á¬ážáááºáááºááŸá¯ááŸáááŒá±á¬ááºáž á¡á¬áááá¶ááá¯ááºáá«á á á¬áááºááŒááºážáááá¯ááááºááᯠáá»áœááºá¯ááºááá±á¬ááºáá¯á¶ážá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááœááºá á¡ááá¯ááºážáá áºáá¯áá±á«áºááŸá á¡ááŒáá·áºáá¯á¶ážááŸáá·áº á¡áááá·áºáá¯á¶áž ááœáŸá²ááœááºáááºááá¯ážáá»á¬ážá¡ááŒá¬áž ááŒá¬ážáá¬ážáá»ááºááᯠá á áºáá±ážááŒá®áž á¡áá»áá¯á·áá±á¬ ááá·áºáááºáá»ááºáááºáá»á±á¬áºááœááºáá«áá ááŸá¯á¶á·áá±á¬áºááŸá¯áá áºáᯠáá«áááºááŸá¯ááᯠáá»áœááºá¯ááºáá±ááœááºáá«áááºá áááºááœáŸááºážááœá±ážáá¯ááºááŸá¯ááºážááᯠááŸá¬áááœá±á·áá«á áá¬áá¯ááºááááºáááºážá ááœá±ážáá»ááºá áᬠ2 áᯠááŸááááº- áá±áá¬ááẠááŒá®ážáá¯á¶ážááœá¬ážááŒá®áž á¡áá¶ááááºááœá¬ážáááºááŒá áºá á± ááá¯á·ááá¯áẠáááºážááᯠá á¬áááºááŒááºážá¡ááŸá¬ážáᯠáá°áááá·áºáááºá ááá¯á·áá¬ááœááºá á¡ááºáááá¯áá®áááºááᯠááá¯ážááŸááºážá á±ááẠá€á¡áá¬ááᯠáá»áœááºá¯ááºááá¯á· áá»ááºááŸááºáá¬ážáá«áááºá
- áá±á¬ááºáá áºááá·áºááœááºá áá»áœááºá¯ááºááá¯á·ááẠdata pulse (bit 0 ááá¯á·ááá¯áẠ1) ááŸááá±ááŒá±á¬ááºáž áá¯á¶ážááŒááºááẠááá¯á¡ááºááŒá®áž áááºážá¡ááœáẠá¡ááá¯ááºáž (prev_pos;pos) middle_pos ááẠmiddle_pos := (prev_pos+pos)/2 ááŸáá·áº áá®áá»áŸááẠá¡áá»áá¯á·áá±á¬ áááºááœááºááŸá middle_pos á¡ááá¯ááºáž (middle_pos-8;middle_pos +8) ááœáẠá¡ááŒáá·áºáá¯á¶ážááŸáá·áº á¡áááá·áºáá¯á¶áž ááá¬áááᯠááœááºáá»ááºááŒáá·áºááŒáá«á áá¯á·á áááºážááá¯á·ááŒá¬ážá ááœá¬ááŒá¬ážáá»ááºá 10 áááºááá¯áá«áá áá»áœááºá¯ááºááá¯á·ááẠááááºááœáẠbit 1 ááá¯áá±ážáááºá ááá¯á·ááá¯ááºáá«á 0á 10 ááẠáááºááœá±á·á ááºážáááºáááŸááá±á¬ ááááºážáá±áá áºáá¯ááŒá áºáááºá
- prev_pos (prev_pos := pos) ááœáẠáááºááŸáá¡áá±á¡áá¬ážááᯠááááºážáááºážáá«
- á¡ááá·áº 3 ááŸá áááºá ááá¯ááºáá áºáá¯áá¯á¶ážááᯠáá»áœááºá¯ááºááá¯á·áááºááŒá®ážáááºá¡áá ááŒááºáá¯ááºáá«á
- ááá¬áá²á· áá Ạarray ááᯠááá¯ááºá¡á á¯áá áºáá¯á¡áá±áá²á· ááááºážáááºážáá¬ážááá«áááºá áááºááŸá¯ááá·áºá¡áá« áááºáá°áá»áá±á¬ ááá¯ááºááᯠáá»áœááºá¯ááºááá¯á· ááá·áºááœááºážáá ááºážá á¬ážáá¬ážáá±á¬ááŒá±á¬áá·áº áá áºá¡áá±á¡ááœááºááẠ8 á ááá¯ážááááºážááá¯ááºááá¯ááºááá·áºá¡ááŒáẠááá¯á¡ááºáá±á¬ áá áºá¡á±á¬á·ááºáááºááá¯áááºáž áááááá«á algorithm áááááá¯á¶ážá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááœááºá sync byte ááááºááŸáááŸá¯ááá¯áá»áœááºáá±á¬áºááááá²á·áááŒáá·áº offset bits á¡áá±á¡ááœááºá¡áá»áá¯ážáá»áá¯ážááŒáá·áºááá¯áẠ8 áá¯ááá¯ááá¯ážááŸááºážá áœá¬ááááºážáááºážáá²á·áááºá áááºážááá¯á·áá²á០áá áºáá¯ááẠááŸááºáááºáá±á¬ á¡áá»ááºá¡ááẠáá«ááŸááááºá áá±á¬ááºáá¯á¶áž algorithm ááœááºá áá»áœááºá¯ááºááẠááŸááºáááºáá±á¬ output ááá¯ááºááᯠáá»ááºáá»ááºážáááá¯ááºá á±ááá·áº A5h á¡áá bits á¡á¬ážáá¯á¶ážááᯠááá¯ážááŸááºážá áœá¬ áááºááŸá¬ážáá«áááºá
á
áááºáááºá
á¬ážáá°áá»á¬ážá¡ááœáẠRuby ááŸá Algorithm
áááá¯ááááºáá±ážááá¯á· áá¬áá¬á
áá¬ážá¡ááŒá
ẠRuby ááᯠááœá±ážáá»ááºáá²á·áá¬ááá¯áá±á¬á·... áá»áœááºáá±á¬áº áá®á¡á
á®á¡á
ááºááŸá¬ áá¬ážááá¯ááºáá«á ááœá±ážáá»ááºááœáá·áºááẠá
áœááºážáá±á¬ááºáááºááŒáá·áºáá¬ážáááºááá¯ááºáá±á¬áºáááºáž á
á¬áááºááŸá¯ááºážááᯠááŒááºááá¯ááºááá»áŸááŒááºá¡á±á¬ááºááŒá¯áá¯ááºáááºáá¬áááºááẠáááºážá¡ááœááºáááá¯ááºáááºáá«á
# ÐÑпПлÑзÑеЌ 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*")
ááááº
á¡ááºáááá¯áá®ááẠááŸáá·áº ááááºážáá±áá»á¬áž á áá°ááœá²áá»á¬ážá áœá¬ááᯠá ááºážááŒáá·áºááŒá®ážáá±á¬ááºá á¡ááœááºá áááºáááºá á¬ážá áá¬áá±á¬ááºážáá±á¬ á¡áá¬áá áºáá¯ááᯠáááŸáááẠáá»áœááºá¯áẠáá¶áá±á¬ááºážáá²á·áááº-
ááá¯á·ááŒá±á¬áá·áºá áá¬ááºáá±á¬ááºááŒáá¯ážáá»á¬ážá¡ááá¯ááºá ááááºáá»á¬ážááœá²ááẠá¡á
á®á¡á
ááºáá
áºáá¯ááŸááááºá ááá¯á·áá±á¬áºáááºáž áááá¯ááááºá
á¬áá¬ážááœáẠáá±á¬á·áá»ááºá
áá¬ážáá¯á¶ážáá»á¬áž áááŸááá«á áá±á¬á·áá»ááºá
á¬áá¯á¶ážá¡á¬ážáá¯á¶ážááᯠbytes (áááºááá¯ážáá
áºáá¯á
á® > 80h) á¡ááŒá
Ạáá¯ááºáá¯ááºáá¬ážáááºá ááᯠáá»áœááºá¯ááºááá¯á·ááẠ80s á០áááºááá·áºááœááºááŒá°áá¬á០á€áá±á¬áºáááºááŒáá·áº áááá¯ááááºáá»á¬ážááᯠááááºážáááºážááá¯ááºáááºááᯠááŸá¬ááœá±áááºááá¯á¡ááºáá«áááºá
ááááºáá±á¬á·á áááºážááẠBASIC áááá¯ááááºááŸáá·áº á¡ááœááºáááºáá°áááºá ZX Spectrum ááœááºááŒá°áá¬ááẠáááá¯ááááºáá»á¬ážááᯠáááºááá¯áá®ááœáẠáá°áá®áá±á¬áá¯á¶á
á¶ááŒáá·áº ááááºážáááºážáá¬ážááŒá®áž áááá¯ááááºáá»á¬ážááᯠááááºááŒáá·áº ááááºážáááºážáááºá ááá
á¹á
áá
áºáá¯á¡ááœááºá áá«áááºáá±á¬á·áá»ááºá
á¬áá¯á¶ážáá»á¬ážááá¯á
á
áºáá±ážáá²á·áááºá
áá»áœááºáá±á¬áºááẠááá¯á¡áá»áááºá áá¬áááºááŒá®áž Atariá Commodore 64 ááŸáá·áº á¡ááŒá¬ážááœááºáá»á°áá¬áá»á¬ážá áœá¬á á¡ááŒá±áá¶áá±á¬á·áá»ááºá á¬áá¯á¶ážáá»á¬ážááᯠá á áºáá±ážáá²á·ááŒá®ážá á á¬ááœááºá á¬áááºážáá»á¬ážááᯠáá»áœááºá¯ááºááŸá¬ááœá±ááá¯ááºáá²á·áá±á¬áºáááºáž áá¡á±á¬ááºááŒááºáá²á·áá² áá±ááºáá±á¬ááºáá®ááœááºááŒá°áá¬á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŸáá·áº áááºáááºá áá»áœááºá¯ááºáá¡ááááá¬ááẠá¡ááœááºáá»ááºááŒáá·áºááŒááºážáááŸááá²á·áá«á
ááŒá®ážáá±á¬á· ááœá¬ážááá¯á· áá¯á¶ážááŒááºááá¯ááºáááºá
ááœááºáá»á°áᬠTandy/Radio Shack TRS-80
áá±á¬ááºážáá«ážá¡á ááŸá¬ á¥ááá¬áá áºáá¯á¡áá±áá²á· áá»áœááºáá±á¬áºáá±ážáá²á·áá²á· áá±ážááœááºážáá²á á¡áá¶áááºážáá¬ááᯠáá®ááœááºááŒá°áá¬ááŸá¬ áá®ááá¯áá»áá¯áž ááŒá¯áá¯ááºáá²á·áᬠááŒá áºááá¯ááºáá»á±ááŸááá«áááº-
á€ááœááºááŒá°áá¬ááŸáá·áº áááºážááá»áá¯ážááœá²áá»á¬áž (Model I/Model III/Model IV á
áááºááŒáá·áº) ááẠáá
áºáá»áááºáááºážááœáẠá¡ááœááºáá±áááºážá
á¬ážáá²á·ááẠ(áá¯ááºáá«áááºá áá¯ááŸá¬ážááœááºááá¯ááºáá«)á áá°ááá¯á·áá¯á¶ážáá²á· áááá¯áááºáá¬á Z80 áááºáž ááŸááºáá¬ážá
áá¬áá«áá²á áá®ááœááºááŒá°áá¬á¡ááœáẠá¡ááºáá¬áááºááŸá¬ ááŸá¬ááá¯á·ááááºá
emulator ááᯠáá±á«ááºážáá¯ááºáá¯ááºáá²á·áááºá
áá»áœááºáá±á¬áºáááºáž ááœá±á·áááºá
CAS ááá¯ááºáá±á¬áºáááºááᯠááœááºáá»ááºááŒá®áž (áá»áœááºá¯ááºáááºáá²ááœááºááŸáááŒá®ážáá¬áž ááááºááœá±á០áá±áá¬áá»á¬ážááᯠáá áºáááºážáááºážáá»ááºáž áááá¹áá°á¡ááŒá Ạáá°ážáá°áá±á¬áºááŒááŒááºážááŒá áºááŒá®ážá áá°áá®áá±á¬ ááá¯ááºáá«ááŸááá±á¬ áá±á«ááºážá á®ážááŸááœá²á) áá»áœááºáá±á¬áºáá áºáᯠááŒá¯áá¯ááºáá²á·áá«áááºá áá»áœááºá¯ááºááááá¯ááááºááœáẠááŒá±á¬ááºážáá²ááŸá¯á¡áááºážáááºááŸáááŒá®áž emulator (TRS-80 Model III) ááœáẠá¡áá¯ááºáá¯ááºáá±á¬ CAS ááá¯ááºááᯠáá¯ááºááá¯ááºáááº-
áááááœá±ážáá¯ááºááŸá¯ááºážááŸáá·áº áááºááœáŸááºážáá²áá»áá¯ážá
á¯á¶ááŒá¬ážá¡ááœá¬á¡áá±ážááᯠGEM áááºáá±á·áá»áºá¡ááŒá
Ạá¡ááá¯á¡áá»á±á¬ááºáá¯á¶ážááŒááºááŒááºážááŒáá·áº ááŒá±á¬ááºážáá²ááŒááºáž utility á áá±á¬ááºáá¯á¶ážáá¬ážááŸááºážááᯠáá®ááá¯ááºážáá¯ááºáá¬ážááŒá®ážá á¡áááºážá¡ááŒá
áºáá¯ááºááᯠáááŸáááá¯ááºáá«áááº
áá±á¬ááºáá»ááº
áá«ááá¯á·áá»áŸá±á¬ááºáá²á·áá²á·áááºážáᬠá¡ááááºááᯠá áœá²áááºááœááºáá±á¬ááºážáá²á· ááá®ážáá áºáá¯ááŒá áºáá¬áá²á·ááŒá®áž áá±á¬ááºáá¯á¶ážááŸá¬ á¡ááŒá±ááá¯ááœá±á·ááá¯ááºááá²á·á¡ááœáẠáááºážáá¬áááá«áááºá á¡ááŒá¬ážá¡áá¬áá»á¬ážáá²ááœááºá áá«:
- ZX Spectrum ááœáẠáá±áá¬ááááºážáááºážááẠáá±á¬áºáááºááᯠááŸá¬ááœá±áá²á·ááŒá®áž á¡áá¶áááºáááºáá»á¬ážá០áá±áá¬ááᯠááááºážáááºáž/áááºááŸá¯ááŒááºážá¡ááœáẠáááºáááºáá¬ážáá±á¬ ROM áá¯ááºááá¯ážáá¯ááºá ááºáá»á¬ážááᯠáá±á·áá¬áá²á·áááºá
- TRS-80 ááœááºááŒá°áá¬ááŸáá·áº áááºážááá»áá¯ážááœá²áá»á¬ážááᯠáááá»áœááºážáá²á·ááŒá®ážá áááºáááºááŸá¯á áá áºááᯠáá±á·áá¬áᬠááá°áá¬áááá¯ááááºáá»á¬ážááᯠááŒáá·áºááŸá¯áᬠá ááºáá¯ááºáá»á¬ážááœáẠá¡ááŸá¬ážááŸá¬ááẠá¡ááœáá·áºá¡áá±ážááá²á·ááẠ(áá±á¬ááºáá±á¬á·á Z80 mnemonics á¡á¬ážáá¯á¶ážááẠáá»áœááºá¯ááºááŸáá·áºáááºážááŸá®ážááŒáááº)
- á¡áá¶áááºážáá°ááŸá¯áá»á¬ážááᯠCAS áá±á¬áºáááºááá¯á· ááŒá±á¬ááºážáááºá¡ááœáẠ"ááá¬ážáááº" áááááá¬á០á¡ááá¡ááŸááºáááŒá¯ááá·áº áá±áá¬ááᯠáááºááá¯ááºááá·áº ááŒáá·áºá á¯á¶áá±á¬ á¡áá¯á¶ážáááºááŸá¯áá áºáá¯ááᯠáá±ážáá¬ážáá²á·áááº
source: www.habr.com