EGY BITHIBA TÖRTÉNETE

Magnókazettán levő régi programjaim digitalizálása során történt, hogy az egyik CAS file-t (Az EDI assembler/editort) kicsit hibásan hozta létre a konvertáló program. Nem okozott nagy bajt, de mint kiderült, néhány Z80 utasítást (LD (HL),reg és LD reg,(HL)) egyszerűen nem akart felismerni az EDI. Ekkor elkészítettem egy kis Perl script-et, ami a gépi kódú programokban levő ellenőrzőösszeget tudta vizsgálni. Ki is derült, hogy valahol baj van, íme a diagnózis:

SYSTEM program "EDI   "
block: 256 bytes at 41A9H: ok
block: 256 bytes at 42A9H: ok
block: 256 bytes at 43A9H: ok
block: 256 bytes at 44A9H: ok
block: 256 bytes at 45A9H: ok
block: 256 bytes at 46A9H: ok
block: 256 bytes at 47A9H: ok
block: 256 bytes at 48A9H: ok
block: 256 bytes at 49A9H: ok
block: 256 bytes at 4AA9H: ok
block: 256 bytes at 4BA9H: ok
block: 256 bytes at 4CA9H: ok
block: 256 bytes at 4DA9H: ok
block: 256 bytes at 4EA9H: ok
block: 256 bytes at 4FA9H: ok
block: 256 bytes at 50A9H: ok
block: 256 bytes at 51A9H: checksum error: 46H-C6H (data offset: 0x115B)
  51a9 47 cd 5f 4e | c3 6a 4e 7d | b0 47 c3 54 | 4e fe 64 c0  GÍ_NĂjN}°GĂTNţdŔ
  51b9 18 f2 7b cd | 6b 4e cd 6a | 4e c3 63 4e | cb 53 20 f6  .ň{ÍkNÍjNĂcNËS ö
  51c9 c3 4e 4e 7b | fe 04 28 ee | cd 5f 4e 78 | ee 61 47 cd  ĂNN{ţ.(îÍ_NxîaGÍ
  51d9 54 4e c3 63 | 4e 7b fe 06 | c0 60 18 dd | cd 46 4e 7a  TNĂcN{ţ.Ŕ`.ÝÍFNz
  51e9 65 6b 18 cf | cd 54 4e 18 | d0 cd 67 4e | cd 09 52 7d  ek.ĎÍTN.ĐÍgNÍ.R}
  51f9 18 a5 fe 07 | 28 ae cb e0 | fe 27 28 a8 | fd fe 04 c0  .Ąţ.(®Ëŕţ'(¨ýţ.Ŕ
  5209 cb 58 06 46 | c2 54 4e 7b | f6 70 18 8b | cd 42 4e 20  ËX.FÂTN{öp..ÍBN
  5219 03 7d a0 c0 | 78 b5 c3 6b | 4e fe 09 28 | f7 06 c9 fe  .} ŔxµĂkNţ.(÷.Éţ
  5229 0b 18 11 03 | 6b 5b 00 03 | 06 10 e9 e9 | c3 60 c3 63  ....k[....ééĂ`Ăc
  5239 4e 7d fe 04 | c0 c3 6a 4e | 01 00 01 cd | 79 fe 3b ca  N}ţ.ŔĂjN...Íyţ;Ę
  5249 bf 51 fe 93 | c0 78 e6 c6 | b5 47 eb c3 | bf 51 fe 01  żQţ.ŔxćƵGëĂżQţ.
  5259 20 0b 7d fe | 06 ca 4e 4e | cb 9d c3 53 | 4e fe 02 c0   .}ţ.ĘNNË.ĂSNţ.Ŕ
  5269 cb e8 60 c3 | 63 4e cd 42 | 4e 20 04 3e | 02 95 d8 11  Ëč`ĂcNÍBN .>..Ř.
  5279 80 52 19 46 | c3 aa 51 46 | 56 5e fe 02 | 28 e2 fe 01  .R.FĂŞQFV^ţ.(âţ.
  5289 ca 53 4e cb | 58 06 34 28 | 01 04 b7 20 | 5b 78 e6 c7  ĘSNËX.4(..· [xćÇ
  5299 47 c3 53 4e | 02 11 00 17 | b4 4a 8e 02 | 11 00 10 ad  GĂSN....´J.....­
block: 256 bytes at 52A9H: ok
block: 256 bytes at 53A9H: ok
block: 136 bytes at 54A9H: ok
start address: 4300H
end of data at position 5366
end of file

Ebből már lehetett látni, hogy körülbelül merrefelé van a hiba, és azt is, hogy szerencsés esetben csak egyetlen 128-as helyiértékű bit romlott el, hiszen ebben különbözött a számolt és a file-ban levő ellenőszőösszeg.

Szerencsére még megvolt a nyers 44.1 kHz-es mintavételezésű WAV file, és ebben sikerült is egy gyanús részt találni. Az alábbi ábrán ez a kép közepén látható:

Ránézésre nem lehet teljes bizonyossággal megmondani, hogy az ott impulzus (1 bit) vagy nem impulzus (0 bit). Kíváncsi voltam, a konvertáló program ezt miként olvasta be. A gyanús hely után következő néhány bitet kigyűjtöttem:

Ez ugyebár 5 darab egyes bit, utána egy nullás bit, majd 8 darab egyes bit, utána pedig egy nullás, azaz az 111110111111110 bitsorozatról van szó, ez következik rögtön a gyanús bit után. Hogy könnyen megtaláljam ezt a mintát a hibás blokkban, az egész blokkot karakteres bitsorozattá alakítottam. A fenti hexa-ascii alakból indultam és egy editor meg egy ügyes kis perl script segítségével hamar meg is volt a teljes blokk (a sortörések csak a szemléltetés kedvéért szerepelnek, egy alábbi sor pontosan egy, a fenti litsában szereplő sornak felel meg):

01000111110011010101111101001110110000110110101001001110011111011011000001000111110000110101010001001110111111100110010011000000
00011000111100100111101111001101011010110100111011001101011010100100111011000011011000110100111011001011010100110010000011110110
11000011010011100100111001111011111111100000010000101000111011101100110101011111010011100111100011101110011000010100011111001101
01010100010011101100001101100011010011100111101111111110000001101100000001100000000110001101110111001101010001100100111001111010
01100101011010110001100011001111110011010101010001001110000110001101000011001101011001110100111011001101000010010101001001111101
00011000101001011111111000000111001010001010111011001011111000001111111000100111001010001010100011111101111111100000010011000000
11001011010110000000011001000110110000100101010001001110011110111111011001110000000110001000101111001101010000100100111000100000
00000011011111011010000011000000011110001011010111000011011010110100111011111110000010010010100011110111000001101100100111111110
00001011000110000001000100000011011010110101101100000000000000110000011000010000111010011110100111000011011000001100001101100011
01001110011111011111111000000100110000001100001101101010010011100000000100000000000000011100110101111001111111100011101111001010
10111111010100011111111010010011110000000111100011100110110001101011010101000111111010111100001110111111010100011111111000000001
00100000000010110111110111111110000001101100101001001110010011101100101110011101110000110101001101001110111111100000001011000000
11001011111010000110000011000011011000110100111011001101010000100100111000100000000001000011111000000010100101011101100000010001
10000000010100100001100101000110110000111010101001010001010001100101011001011110111111100000001000101000111000101111111000000001
11001010010100110100111011001011010110000000011000110100001010000000000100000100101101110010000001011011011110001110011011000111
01000111110000110101001101001110000000100001000100000000000101111011010001001010100011100000001000010001000000000001000010101101

Ebben már akár egy szövegszerkesztő "Keresés" funkciójával is gyorsan meg lehet találni az 111110111111110 mintát, és bár 3 helyen is előfordul, pár további bit megvizsgálásával azonnal látszik, hogy az aláhúzással jelölt helyről van szó. Mint látható, a konvertáló program 1-nek értelmezte az előtte levő gyanús bitet. További jó hír, hogy valóban egy 128-as helyiértékű bitről van szó, tehát bízhattam benne, hogy ez a gyanús bit a keresett igazi hiba. Mint látható, egy FD FE 04 byte-sorozatról van szó, és az FD-ből kell 7D-t csinálni, hogy ellenkezőjére állítsuk a gyanús bitet (a fenti listában meg is jelöltem ezt a byte-ot). Egy hexa editorral (Midnight Commander, F3, F4) hamar ki is javítottam, és rögtön ki is próbáltam az új CAS file-t az emulátorban:

A jobb oldali képernyőn látszik az eredmény, a fordítás sikeres! A 4-es és a 7-es sorok szerint immár megérti és jól kezeli az EDI a korábban még hibásnak jelzett utasításokat is!

A bal oldali képernyő tanúsága szerint a disassemblált listából is lehetett volna sejteni, hol a baj: egy hivatalasosan nem definiált utasítást eredményezett a bithiba.

Az EDI javított verziója letölthető a HT honlapról.

(Márkus Csaba)