19.11. 2023
Disassembling 001
Dávno som sa nevenoval Spectru, tak som si v rámci malého cvičenia zašiel na spectrumcomputing.co.uk,
dal si vylistovať všetky utility: undetermined na ZX Spectre a pozrel sa na prvú, ktorá nie je type-in
z časopisu a nemá žiadny popis ani dokumentáciu. Volá sa AD LISTER.
Download je Z80 snapshot presne pred spustením programu. Stačí stlačiť ENTER a je to. Poďme sa teda pozrieť
o čo ide. BASIC vyzerá takto:
|
10 LET TOT=0: FOR n=23296 TO 23320: READ a: LET TOT=TOT+a: POKE n,a: NEXT n
20 IF TOT<>2558 THEN PRINT "data error": STOP
30 RANDOMIZE USR 23296
40 DATA 62,2,205,1,22,1,192,93,10,254,128,48,5,254,32,56,1,215,3,62,255,184,32,240,201
|
0x5b00 LD A,02 ;kanál č.2 je obrazovka
0x5b02 CALL 1601 ;otvor kanál
0x5b05 LD bc,5DC0 ;odkiaľ sa bude prehľadávať pamäť
0x5b08 LOOP LD A,(BC) ;načítaj znak z pamäte
0x5b09 CP 80 ;skús či sa dá ešte zobraziť (horná hranica ASCII)
0x5b0B JR NC,SKIP_CHAR ;ak sa nedá, preskoč znak
0x5b0D CP 20 ;skús, či sa dá už zobraziť (dolná hranica ASCII)
0x5b0F JR C,SKIP_CHAR ;ak sa nedá, preskoč znak
0x5b11 RST 10 ;zobraz znak
0x5b12 SKIP_CHAR INC BC ;posuň sa v pamäti ďalej
0x5b13 LD A,FF ;vyšší bajt pamäte kde chceme končiť
0x5b15 CP B ;sme už tam?
0x5b16 JR NZ,LOOP ;ak nie, skontroluj ďalší znak
0x5b18 RET ;koniec
|
Ide teda o jednoduchý program, ktorý prejde pamäť od adresy 5DC0 (24000) po adresu FFC0 (65472) a zobrazí
na obrazovke všetky ASCII znaky, ktoré v pamäti nájde. Po spustení je to vidieť aj na tom, že sa na obrazovke
objaví reťazec ADLISTER Ib.
Keďže program prechádza kus pamäte, chvíľku mu to trvá. Len tak pre zaujímavosť som napoukoval zopár znakov
ku koncu pamäte a program spustil znova (tento raz už priamo cez RANDOMIZE USR 23296). No a tu ma prekvapilo,
že síce znaky zobrazil, ale ADLISTER Ib sa stratilo. Chvíľu som teda bádal čo sa to deje.
Ako som už spomínal, program je snapshot Z80 s predpripraveným RUNom. Navyše je čierny BORDER, takže sa
so systémom niečo dialo. Keď som si pozrel pamäť, reťazec ADLISTER Ib je na adrese 5E66 (24166). Neriešim
príliš ako ho tam autor dostal, zaujíma ma skôr prečo po spustení zmizne. Tak som si pozrel mapu pamäte a tam
to začína byť jasné. Kým samotný program beží v PRINTER BUFFERi, prehľadávanie začína ešte v oblasti kde leží
pôvodný BASICový program. Za programom ešte ležia premenné a za nimi je niečo, čo sa volá E_LINE - Command
or program line being edited. To už stačilo skontrolovať systémové premenné - táto leží na 5C59 (23641)
a odkazuje na 5E4F (24143). A to je práve dôvod, prečo čokoľvek v BASICu urobíme, prepíše daný reťazec.
Na funkčnosť programu to ale (samozrejme) vplyv nemá.
Celé je to prkotina, ale bavil som sa pri tom a snáď aj jednu či dve veci naučil (napríklad často zvyknem
ignorovať fakt, že CP môže nastavovať aj CARRY a nie len ZERO). Keďže nezdokumentovaných utilít je mraky,
určite sa niekedy pozriem aj na ďalšie.
|