ellvis / zeroteam / blog

ellvis(@)zeroteam(.)sk

---------------------------------------------------------------------


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
Žiadna veda to nie je, dáta sú krátky program v assembleri. Ten vyzerá takto:
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.



<-- 20231105 Cambridge Z88 a manuál | index | Demoscéna na Gameboy Advance -->

---------------------------------------------------------------------

made by ellvis using Bluefish in 2023, RSS feed