015
26.03.2007, 23:24 Uhr
timetube
|
Zitat: | Deff postete Hallo, habe die, vielleicht im ersten Zupacken, etwas wahnwitzig klingende Anfrage: Wie kann man am besten ein CP/M, das im ROM abgelegt ist, so reassemblieren, dass als Resultat ein vernünftig dokumentiertes Quell-Listing entsteht?
Vielleicht kommt mit meiner Frage auch wieder etwas mehr Leben in das Forum bzw. zumindest in dieser Rubrik!
Gruß Deff |
Na da will ich mal schnell noch drauf antworten
Der IDA (http://www.datarescue.com/) ist wirklich ein sehr gutes, wenn auch nicht gerade billiges Tool um für alle möglichen CPUs ein „revers engineering“ zu machen.
Das Ergebnis einer solchen IDE Analyse sieht dann z.B. so aus: OK, das sauber, gut leserlich formatierte Listings geht hier nun verlohren, genau wie die Zeichensatzumsetzung.
; ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ; º This file is generated by The Interactive Disassembler (IDA) º ; º Copyright (c) 2004 by DataRescue sa/nv, <ida@datarescue.com> º ; º Licensed to: Juergen Sievers - N.A.D.I.N.E. Software, 1 user, adv, 12/2003 º ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ; ; File Name : CDokumente und Einstellungen\jsievers\Desktop\abc24\INITIAL.COM ; Format : Binary File ; Base Address: 0000h Range: 0100h - 0900h Loaded length: 0800h
; Processor : z80 [] ; Target assembler: Zilog Macro Assembler
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
; Segment type: Regular segment RAM ds 5 ENTRY: ds 1 ; CODE XREF: RAM:0108p RAM:011Bp ... GOCPM: ds 2 ds 1 unk_9: ds 1 iobuff: ds 1 byte_B: ds 0ECh off_F7: ds 2 ; DATA XREF: sub_2C2+37o sub_2C2+5Bo ds 7 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ start: ld sp, piobuff ; "\n" ld c, PRTSTR ld de, INTRO ; "\r\nMINI FLOPPY DISK INITIALIZER$" call ENTRY
startinit: ; CODE XREF: RAM:029Bj xor a ld (Track), a ld (Sector), a inc a ld (AktSecence), a
getdrive: ; CODE XREF: RAM:012Fj RAM:0134j ; DATA XREF: ... ld c, PRTSTR ld de, RQDRIVE ; "\r\nDRIVE (A-D) ? $" call ENTRY ld c, RDBUFF ld de, piobuff ; "\n" call ENTRY ld hl, getdrive call SeekLastInput ; ret HL if no input ld a, (hl) cp 'A' jp c, getdrive cp 'E' jp nc, getdrive sub 'A' ld (DRIVE), a
getdensity: ; CODE XREF: RAM:015Dj ; DATA XREF: RAM:014Co ld de, RQDENSITY ; "\r\nDOUBLE DENSITY (Y/N) ? $" ld c, PRTSTR call ENTRY ld c, RDBUFF
loc_146: ; "\n" ld de, piobuff call ENTRY ld hl, getdensity call SeekLastInput ; ret HL if no input ld a, (hl) cp 'N' jp z, singled cp 'Y' jp z, dobled jp getdensity ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
singled: ; CODE XREF: RAM:0155j xor a ld b, 1 jp setdensity ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
dobled: ; CODE XREF: RAM:015Aj ld a, 80h ld b, 2
setdensity: ; CODE XREF: RAM:0163j ld (DENSITY), a ; 80=double, 01=sigle ld a, b ld (SIDES), a ld a, 9 ld (SECTORS), a
WrongSequence: ; CODE XREF: RAM:0194j RAM:0199j ld c, PRTSTR ld de, RQSEQUENCE ; "\r\nSEQUENCE CODE (1/2/3/4/5) ? $" call ENTRY ld c, RDBUFF ld de, piobuff ; "\n" call ENTRY ld hl, DefSequence call SeekLastInput ; ret HL if no input ld a, (hl) jp setsequence ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Lohnt sich aber nur wenn man sowas öfter machen muss. tt. -- "Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt." Ein Stein. Dieser Post wurde am 26.03.2007 um 23:26 Uhr von timetube editiert. |