**************************************************************** *** *** *** C O M E T D E C O M P I L E R *** *** *** **************************************************************** Copyright (c) 1994 RUMSOFT COMET DECOMPILER (DC) slúži na spetný preklad strojového kódu na kód zdrojový a to pre assembler Comet verzia 1.4. Výsledok može byť nielen vo forme inštrukcií, ale je možne použiť aj preklad formou pseudo inštrukcií DEFB, DEFM, DEFW a DEFS. Rozne formy prekladu je možné lubovolne kombinovať. Vlastná činnosť spočíva len v zadaní adries pre preklad a niekolkých prepínačov. Strojový kód može býť kdekolvek v rozsahu adries 16384 až do konca RAM. Preklad je dvojpriechodový a relatívne rýchly (disassemblovanie MASTER DOSu - 15 KB - trvá asi 10 minút - výsledný zdroják má 65 KB). Údaje, ktoré treba decompileru oznámiť, aby vedel čo má robiť, sú velmi jednoduché. Po spustení sa najprv zadvaj prepínače. Odpovedajte klávesou "Y" alebo "N" (return). Output to screen - určuje či sa pri druhom priechode bude výsledok zároveň vypisovať aj na obrazovku. Umožňuje vizuálnu kontrolu, ale ako každý výpis aj tento velmi spomaluje prácu počítača. Doporučujem len pri kratších prekladoch (cca 1KB). All address like labels - volba definuje prekladaču, ako má narábať s adresamy v operandoch inštrukcií, ktoré sú mimo vlastného disassemblovaneho bloku. Najlepšie bude si to vysvetliť na malom príklade. Majme krátku rutinu: ORG &8000 DUMP 3,0 ; ADRESA 65536 8000 zac: LD A,2 8002 CALL &0112 8005 LD DE,text 8008 LD BC,&000C 800B CALL &0013 800E LD A,(zac+1) 8011 CALL &0112 8014 RET 8015 text: DM "POKUSNY TEXT" vplyv volby na vysledok> all label off LD A,2 CALL &0112 LD DE,L8015 LD BC,&000C CALL &0013 LD A,(L8001) CALL &0112 RET L8015: DB "P","O","K","U","S","N","Y"," ","T","E","X","T" all label on LD A,2 CALL L0112 LD DE,L8015 LD BC,L000C ; NESPRAVNE CALL L0013 LD A,(L8001) CALL L0112 RET L8015: DB "P","O","K","U","S","N","Y"," ","T","E","X","T" Self modify code test - pokial kod používa modifikáciu seba samého, je dobré mať volbu zapnutú. Pokial najde inštrukciu, ktorej operandy sú priamo adresované nejakou inou inštrukciou, bude táto rozložená pomocou pseudo inštr. DEFB. Napríklad : self modify test off LD A,2 CALL &0112 LD DE,L8015 LD BC,&000C CALL &0013 LD A,(L8001) CALL &0112 RET L8015: DB "P","O","K","U","S","N","Y"," ","T","E","X","T" self modify test on DEFB &3E L8001: DEFB 2 CALL L0112 LD DE,L8015 LD BC,&000C CALL L0013 LD A,(L8001) CALL L0112 RET L8015: DB "P","O","K","U","S","N","Y"," ","T","E","X","T" Program korektne prekladá kód asemblovaný na ktorkolvekú adresu (0000 - 65536), ktorý je uložený v ktorejkolvek stránke RAM, ale musí túto adresu poznať. Zadáte ju po otázke ASSEMBLING ADDRESS. V našom príklade to bude adresa &8000. Aby program vedel, kde má kód hladať, musíte mu ešte oznámiť fyzickú adresu, kde sa nachádza. V našom príklade to bude 65536 (vazba na inštrukciu DUMP 3,0). No a teraz prichádza najdoležitejšia časť činnosti - zadanie rozsahu a sposobu spetného prekladu. Program automaticky ponúkne ako počiatočnu adresu &8000 a očakáva určenie sposobu prekladu: K dispozícií je DISA, DEFB, DEFM, DEFW a DEFS. V našom príklade budeme potrebovať najprv preklad do inštrukcií Z80, preto stlačíme klavesu "D" a hneď zadáme nasledujúcu adresu za poslednou inštrukciou, ktorú požadujeme preložiť - určíme rozsah. T.j. adresu &8015. Táto je opeť braná ako počiatočnᐠadresa nasledovneho bloku. Opeť sme pri zadávaní sposobu prekladu. Nasledovný blok chceme preložiť ako textový reťazec, takže zvolíme DEFM - klavesa "D" - ako koniec zadáme &8015+12. Potom, čo nám počítač oznámi adresu &8021 ako počiatočnú pre ďalší prípadný preklad, stlačíme klavesu RETURN, čím mu dáme jasne najavo, že sme skončili a je rad na ňom. Jednotlivé priechody Vám počítač vždy oznámi. V tom druhom sa podla toho či je povolený výstup na obrazovku, zobrazuje priebežne adresa práve prekladanej inštrukcie, alebo kompletný výpis zdrojového textu a'la COMET. Po ukončení činnosti program zobrazí celkovú dlžku zdrojového súboru a vypýta si max. 8 znakov dlhý názov súboru, do ktorého má výsledok uložiť. P.S.: Pri preklade je asi najpotrebnejšie vedieť, ktorá časť programu je kód a ktorá data, preto si ho pred prekladom najprv pozorne preskúmajte a zistené adresy poznačte na papier...