home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* DIS8080.PAS *)
- (* Version: 1.0, Autor: Born B., Prog. Spr.: Turbo Pascal V3.x, *)
- (* Betr. Sys.: MSDOS, CP/M 80, CP/M 86 *)
- (* Tabellengesteuerter Disassembler fuer den 8080 Prozessor. Der Haupt- *)
- (* speicherbereich zwischen Startadresse u. Endadresse wird disassembliert *)
- (* und auf der Standardausgabe ausgegeben. Start- und Endadresse werden *)
- (* entweder als Dezimal- oder als Hexadezimalzahl ($xxxx) ueber die *)
- (* Standardeingabe eingegeben. *)
- (* Implementierungshinweis: *)
- (* Der Type Integer ist in Turbo Pascal als 2 Byte mit Vorzeichen imple- *)
- (* mentiert. Ganzzahlen > 32767 werden als negativ aufgefasst. Deshalb *)
- (* sind alle Operationen auf 16 Bit Werte unter diesem Aspekt vorzunehmen. *)
- (* *)
- (* Aufbau der Tabellen mit den mnemotechnischen Abkuerzungen der Befehle, *)
- (* sowie Informationen ueber Befehlstyp und -laenge. Die Tabelle ist als *)
- (* Record mit folgender Struktur defininiert: *)
- (* Befehl() = 4 Zeichen der mnemotechnischen Abkuerzung *)
- (* Bytes() = Zahl der Befehlsbytes *)
- (* Register(1) = Codierung 1. Register *)
- (* Register(2) = Codierung 2. Register *)
- (* *)
- (* Registercodierung: 0 -> %, 1 -> DB, 2 -> DW, 3 -> A *)
- (* 4 -> B, 5 -> C, 6 -> D, 7 -> E *)
- (* 8 -> H, 9 -> L, 10 -> M, 11 -> BC *)
- (* 12 -> DE, 13 -> HL, 14 -> SP, 15 -> PSW *)
- (* Zur Initialisierung der Tabelle wird hier eine typisierte Konstante *)
- (* (Turbo-spezifisch !!) benutzt. Bei anderen Pascal-Compilern muss eine *)
- (* Initialisierung ueber Zuweisungen im Anweisungsteil geschehen. *)
-
- PROGRAM DisAsm8080 (Input,Output);
-
- LABEL 999;
-
- CONST bytelen = 1;
- wordlen = 2;
-
- TYPE Code = RECORD
- Befehl : STRING [4];
- Bytes : INTEGER;
- Register : ARRAY [1..2] OF INTEGER;
- END;
-
- VAR Startadr, Endadr, Currentadr,
- Segment, Column, Opcode, SecOpcode, i : INTEGER;
-
- CONST Table: ARRAY [0..255] OF Code =
- ((Befehl: 'NOP '; Bytes: 1; Register: (0,0)),
- (Befehl: 'LXI '; Bytes: 3; Register: (4,2)),
- (Befehl: 'STAX'; Bytes: 1; Register: (4,0)),
- (Befehl: 'INX '; Bytes: 1; Register: (4,0)),
- (Befehl: 'INR '; Bytes: 1; Register: (4,0)),
- (Befehl: 'DCR '; Bytes: 1; Register: (4,0)),
- (Befehl: 'MVI '; Bytes: 2; Register: (4,1)),
- (Befehl: 'RLC '; Bytes: 1; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'DAD '; Bytes: 1; Register: (4,0)),
- (Befehl: 'LDAX'; Bytes: 1; Register: (4,0)),
- (Befehl: 'DCX '; Bytes: 1; Register: (4,0)),
- (Befehl: 'INR '; Bytes: 1; Register: (5,0)),
- (Befehl: 'DCR '; Bytes: 1; Register: (5,0)),
- (Befehl: 'MVI '; Bytes: 2; Register: (5,1)),
- (Befehl: 'RRC '; Bytes: 1; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'LXI '; Bytes: 3; Register: (6,2)),
- (Befehl: 'STAX'; Bytes: 1; Register: (6,0)),
- (Befehl: 'INX '; Bytes: 1; Register: (6,0)),
- (Befehl: 'INR '; Bytes: 1; Register: (6,0)),
- (Befehl: 'DCR '; Bytes: 1; Register: (6,0)),
- (Befehl: 'MVI '; Bytes: 2; Register: (6,1)),
- (Befehl: 'RAL '; Bytes: 1; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'DAD '; Bytes: 1; Register: (6,0)),
- (Befehl: 'LDAX'; Bytes: 1; Register: (6,0)),
- (Befehl: 'DCX '; Bytes: 1; Register: (6,0)),
- (Befehl: 'INR '; Bytes: 1; Register: (7,0)),
- (Befehl: 'DCR '; Bytes: 1; Register: (7,0)),
- (Befehl: 'MVI '; Bytes: 2; Register: (7,1)),
- (Befehl: 'RAR '; Bytes: 1; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'LXI '; Bytes: 3; Register: (8,2)),
- (Befehl: 'SHLD'; Bytes: 3; Register: (2,0)),
- (Befehl: 'INX '; Bytes: 1; Register: (8,0)),
- (Befehl: 'INR '; Bytes: 1; Register: (8,0)),
- (Befehl: 'DCR '; Bytes: 1; Register: (8,0)),
- (Befehl: 'MVI '; Bytes: 1; Register: (8,1)),
- (Befehl: 'DAA '; Bytes: 1; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'DAD '; Bytes: 1; Register: (8,0)),
- (Befehl: 'LHLD'; Bytes: 3; Register: (2,0)),
- (Befehl: 'DCX '; Bytes: 1; Register: (8,0)),
- (Befehl: 'INR '; Bytes: 1; Register: (9,0)),
- (Befehl: 'DCR '; Bytes: 1; Register: (9,0)),
- (Befehl: 'MVI '; Bytes: 2; Register: (9,1)),
- (Befehl: 'CMA '; Bytes: 1; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'LXI '; Bytes: 3; Register:(14,2)),
- (Befehl: 'STA '; Bytes: 3; Register: (2,0)),
- (Befehl: 'INX '; Bytes: 1; Register:(14,0)),
- (Befehl: 'INR '; Bytes: 1; Register:(10,0)),
- (Befehl: 'DCR '; Bytes: 1; Register:(10,0)),
- (Befehl: 'MVI '; Bytes: 2; Register:(10,1)),
- (Befehl: 'STC '; Bytes: 1; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'DAD '; Bytes: 1; Register:(14,0)),
- (Befehl: 'LDA '; Bytes: 3; Register: (2,0)),
- (Befehl: 'DCX '; Bytes: 1; Register:(14,0)),
- (Befehl: 'INR '; Bytes: 1; Register: (3,0)),
- (Befehl: 'DCR '; Bytes: 1; Register: (3,0)),
- (Befehl: 'MVI '; Bytes: 2; Register: (3,1)),
- (Befehl: 'CMC '; Bytes: 1; Register: (0,0)),
- (Befehl: 'MOV '; Bytes: 1; Register: (4,4)),
- (Befehl: 'MOV '; Bytes: 1; Register: (4,5)),
- (Befehl: 'MOV '; Bytes: 1; Register: (4,6)),
- (Befehl: 'MOV '; Bytes: 1; Register: (4,7)),
- (Befehl: 'MOV '; Bytes: 1; Register: (4,8)),
- (Befehl: 'MOV '; Bytes: 1; Register: (4,9)),
- (Befehl: 'MOV '; Bytes: 1; Register: (4,10)),
- (Befehl: 'MOV '; Bytes: 1; Register: (4,3)),
- (Befehl: 'MOV '; Bytes: 1; Register: (5,4)),
- (Befehl: 'MOV '; Bytes: 1; Register: (5,5)),
- (Befehl: 'MOV '; Bytes: 1; Register: (5,6)),
- (Befehl: 'MOV '; Bytes: 1; Register: (5,7)),
- (Befehl: 'MOV '; Bytes: 1; Register: (5,8)),
- (Befehl: 'MOV '; Bytes: 1; Register: (5,9)),
- (Befehl: 'MOV '; Bytes: 1; Register: (5,10)),
- (Befehl: 'MOV '; Bytes: 1; Register: (5,3)),
- (Befehl: 'MOV '; Bytes: 1; Register: (6,4)),
- (Befehl: 'MOV '; Bytes: 1; Register: (6,5)),
- (Befehl: 'MOV '; Bytes: 1; Register: (6,6)),
- (Befehl: 'MOV '; Bytes: 1; Register: (6,7)),
- (Befehl: 'MOV '; Bytes: 1; Register: (6,8)),
- (Befehl: 'MOV '; Bytes: 1; Register: (6,9)),
- (Befehl: 'MOV '; Bytes: 1; Register: (6,10)),
- (Befehl: 'MOV '; Bytes: 1; Register: (6,3)),
- (Befehl: 'MOV '; Bytes: 1; Register: (7,4)),
- (Befehl: 'MOV '; Bytes: 1; Register: (7,5)),
- (Befehl: 'MOV '; Bytes: 1; Register: (7,6)),
- (Befehl: 'MOV '; Bytes: 1; Register: (7,7)),
- (Befehl: 'MOV '; Bytes: 1; Register: (7,8)),
- (Befehl: 'MOV '; Bytes: 1; Register: (7,9)),
- (Befehl: 'MOV '; Bytes: 1; Register: (7,10)),
- (Befehl: 'MOV '; Bytes: 1; Register: (7,3)),
- (Befehl: 'MOV '; Bytes: 1; Register: (8,4)),
- (Befehl: 'MOV '; Bytes: 1; Register: (8,5)),
- (Befehl: 'MOV '; Bytes: 1; Register: (8,6)),
- (Befehl: 'MOV '; Bytes: 1; Register: (8,7)),
- (Befehl: 'MOV '; Bytes: 1; Register: (8,8)),
- (Befehl: 'MOV '; Bytes: 1; Register: (8,9)),
- (Befehl: 'MOV '; Bytes: 1; Register: (8,10)),
- (Befehl: 'MOV '; Bytes: 1; Register: (8,3)),
- (Befehl: 'MOV '; Bytes: 1; Register: (9,4)),
- (Befehl: 'MOV '; Bytes: 1; Register: (9,5)),
- (Befehl: 'MOV '; Bytes: 1; Register: (9,6)),
- (Befehl: 'MOV '; Bytes: 1; Register: (9,7)),
- (Befehl: 'MOV '; Bytes: 1; Register: (9,8)),
- (Befehl: 'MOV '; Bytes: 1; Register: (9,9)),
- (Befehl: 'MOV '; Bytes: 1; Register: (9,10)),
- (Befehl: 'MOV '; Bytes: 1; Register: (9,3)),
- (Befehl: 'MOV '; Bytes: 1; Register:(10,4)),
- (Befehl: 'MOV '; Bytes: 1; Register:(10,5)),
- (Befehl: 'MOV '; Bytes: 1; Register:(10,6)),
- (Befehl: 'MOV '; Bytes: 1; Register:(10,7)),
- (Befehl: 'MOV '; Bytes: 1; Register:(10,8)),
- (Befehl: 'MOV '; Bytes: 1; Register:(10,9)),
- (Befehl: 'HLT '; Bytes: 1; Register: (0,0)),
- (Befehl: 'MOV '; Bytes: 1; Register:(10,3)),
- (Befehl: 'MOV '; Bytes: 1; Register: (3,4)),
- (Befehl: 'MOV '; Bytes: 1; Register: (3,5)),
- (Befehl: 'MOV '; Bytes: 1; Register: (3,6)),
- (Befehl: 'MOV '; Bytes: 1; Register: (3,7)),
- (Befehl: 'MOV '; Bytes: 1; Register: (3,8)),
- (Befehl: 'MOV '; Bytes: 1; Register: (3,9)),
- (Befehl: 'MOV '; Bytes: 1; Register: (3,10)),
- (Befehl: 'MOV '; Bytes: 1; Register: (3,3)),
- (Befehl: 'ADD '; Bytes: 1; Register: (4,0)),
- (Befehl: 'ADD '; Bytes: 1; Register: (5,0)),
- (Befehl: 'ADD '; Bytes: 1; Register: (6,0)),
- (Befehl: 'ADD '; Bytes: 1; Register: (7,0)),
- (Befehl: 'ADD '; Bytes: 1; Register: (8,0)),
- (Befehl: 'ADD '; Bytes: 1; Register: (9,0)),
- (Befehl: 'ADD '; Bytes: 1; Register:(10,0)),
- (Befehl: 'ADD '; Bytes: 1; Register: (3,0)),
- (Befehl: 'ADC '; Bytes: 1; Register: (4,0)),
- (Befehl: 'ADC '; Bytes: 1; Register: (5,0)),
- (Befehl: 'ADC '; Bytes: 1; Register: (6,0)),
- (Befehl: 'ADC '; Bytes: 1; Register: (7,0)),
- (Befehl: 'ADC '; Bytes: 1; Register: (8,0)),
- (Befehl: 'ADC '; Bytes: 1; Register: (9,0)),
- (Befehl: 'ADC '; Bytes: 1; Register:(10,0)),
- (Befehl: 'ADC '; Bytes: 1; Register: (3,0)),
- (Befehl: 'SUB '; Bytes: 1; Register: (4,0)),
- (Befehl: 'SUB '; Bytes: 1; Register: (5,0)),
- (Befehl: 'SUB '; Bytes: 1; Register: (6,0)),
- (Befehl: 'SUB '; Bytes: 1; Register: (7,0)),
- (Befehl: 'SUB '; Bytes: 1; Register: (8,0)),
- (Befehl: 'SUB '; Bytes: 1; Register: (9,0)),
- (Befehl: 'SUB '; Bytes: 1; Register:(10,0)),
- (Befehl: 'SUB '; Bytes: 1; Register: (3,0)),
- (Befehl: 'SBB '; Bytes: 1; Register: (4,0)),
- (Befehl: 'SBB '; Bytes: 1; Register: (5,0)),
- (Befehl: 'SBB '; Bytes: 1; Register: (6,0)),
- (Befehl: 'SBB '; Bytes: 1; Register: (7,0)),
- (Befehl: 'SBB '; Bytes: 1; Register: (8,0)),
- (Befehl: 'SBB '; Bytes: 1; Register: (9,0)),
- (Befehl: 'SBB '; Bytes: 1; Register:(10,0)),
- (Befehl: 'SBB '; Bytes: 1; Register: (3,0)),
- (Befehl: 'ANA '; Bytes: 1; Register: (4,0)),
- (Befehl: 'ANA '; Bytes: 1; Register: (5,0)),
- (Befehl: 'ANA '; Bytes: 1; Register: (6,0)),
- (Befehl: 'ANA '; Bytes: 1; Register: (7,0)),
- (Befehl: 'ANA '; Bytes: 1; Register: (8,0)),
- (Befehl: 'ANA '; Bytes: 1; Register: (9,0)),
- (Befehl: 'ANA '; Bytes: 1; Register:(10,0)),
- (Befehl: 'ANA '; Bytes: 1; Register: (3,0)),
- (Befehl: 'XRA '; Bytes: 1; Register: (4,0)),
- (Befehl: 'XRA '; Bytes: 1; Register: (5,0)),
- (Befehl: 'XRA '; Bytes: 1; Register: (6,0)),
- (Befehl: 'XRA '; Bytes: 1; Register: (7,0)),
- (Befehl: 'XRA '; Bytes: 1; Register: (8,0)),
- (Befehl: 'XRA '; Bytes: 1; Register: (9,0)),
- (Befehl: 'XRA '; Bytes: 1; Register:(10,0)),
- (Befehl: 'XRA '; Bytes: 1; Register: (3,0)),
- (Befehl: 'ORA '; Bytes: 1; Register: (4,0)),
- (Befehl: 'ORA '; Bytes: 1; Register: (5,0)),
- (Befehl: 'ORA '; Bytes: 1; Register: (6,0)),
- (Befehl: 'ORA '; Bytes: 1; Register: (7,0)),
- (Befehl: 'ORA '; Bytes: 1; Register: (8,0)),
- (Befehl: 'ORA '; Bytes: 1; Register: (9,0)),
- (Befehl: 'ORA '; Bytes: 1; Register:(10,0)),
- (Befehl: 'ORA '; Bytes: 1; Register: (3,0)),
- (Befehl: 'CMP '; Bytes: 1; Register: (4,0)),
- (Befehl: 'CMP '; Bytes: 1; Register: (5,0)),
- (Befehl: 'CMP '; Bytes: 1; Register: (6,0)),
- (Befehl: 'CMP '; Bytes: 1; Register: (7,0)),
- (Befehl: 'CMP '; Bytes: 1; Register: (8,0)),
- (Befehl: 'CMP '; Bytes: 1; Register: (9,0)),
- (Befehl: 'CMP '; Bytes: 1; Register:(10,0)),
- (Befehl: 'CMP '; Bytes: 1; Register: (3,0)),
- (Befehl: 'RNZ '; Bytes: 1; Register: (0,0)),
- (Befehl: 'POP '; Bytes: 1; Register: (4,0)),
- (Befehl: 'JNZ '; Bytes: 3; Register: (2,0)),
- (Befehl: 'JMP '; Bytes: 3; Register: (2,0)),
- (Befehl: 'CNZ '; Bytes: 3; Register: (2,0)),
- (Befehl: 'PUSH'; Bytes: 1; Register: (4,0)),
- (Befehl: 'ADI '; Bytes: 2; Register: (1,0)),
- (Befehl: 'RST0'; Bytes: 1; Register: (0,0)),
- (Befehl: 'RZ '; Bytes: 1; Register: (0,0)),
- (Befehl: 'RET '; Bytes: 1; Register: (0,0)),
- (Befehl: 'JZ '; Bytes: 3; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'CZ '; Bytes: 3; Register: (2,0)),
- (Befehl: 'CALL'; Bytes: 3; Register: (2,0)),
- (Befehl: 'ACI '; Bytes: 2; Register: (1,0)),
- (Befehl: 'RST1'; Bytes: 1; Register: (0,0)),
- (Befehl: 'RNC '; Bytes: 1; Register: (0,0)),
- (Befehl: 'POP '; Bytes: 1; Register: (6,0)),
- (Befehl: 'JNC '; Bytes: 3; Register: (2,0)),
- (Befehl: 'OUT '; Bytes: 2; Register: (1,0)),
- (Befehl: 'CNC '; Bytes: 3; Register: (2,0)),
- (Befehl: 'PUSH'; Bytes: 1; Register: (6,0)),
- (Befehl: 'SUI '; Bytes: 2; Register: (1,0)),
- (Befehl: 'RST2'; Bytes: 1; Register: (0,0)),
- (Befehl: 'RC '; Bytes: 1; Register: (0,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'JC '; Bytes: 3; Register: (2,0)),
- (Befehl: 'IN '; Bytes: 2; Register: (1,0)),
- (Befehl: 'CC '; Bytes: 3; Register: (2,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'SBI '; Bytes: 2; Register: (1,0)),
- (Befehl: 'RST3'; Bytes: 1; Register: (0,0)),
- (Befehl: 'RPO '; Bytes: 1; Register: (0,0)),
- (Befehl: 'POP '; Bytes: 1; Register: (8,0)),
- (Befehl: 'JPO '; Bytes: 3; Register: (2,0)),
- (Befehl: 'XTHL'; Bytes: 1; Register: (0,0)),
- (Befehl: 'CPO '; Bytes: 3; Register: (2,0)),
- (Befehl: 'PUSH'; Bytes: 1; Register: (8,0)),
- (Befehl: 'ANI '; Bytes: 2; Register: (1,0)),
- (Befehl: 'RST4'; Bytes: 1; Register: (0,0)),
- (Befehl: 'RPE '; Bytes: 1; Register: (0,0)),
- (Befehl: 'PCHL'; Bytes: 1; Register: (0,0)),
- (Befehl: 'JPE '; Bytes: 3; Register: (2,0)),
- (Befehl: 'XCHG'; Bytes: 1; Register: (0,0)),
- (Befehl: 'CPE '; Bytes: 3; Register: (2,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'XRI '; Bytes: 2; Register: (1,0)),
- (Befehl: 'RST5'; Bytes: 1; Register: (0,0)),
- (Befehl: 'RP '; Bytes: 1; Register: (0,0)),
- (Befehl: 'POP '; Bytes: 1; Register:(15,0)),
- (Befehl: 'JP '; Bytes: 3; Register: (2,0)),
- (Befehl: 'DI '; Bytes: 1; Register: (0,0)),
- (Befehl: 'CP '; Bytes: 3; Register: (2,0)),
- (Befehl: 'PUSH'; Bytes: 1; Register:(15,0)),
- (Befehl: 'ORI '; Bytes: 2; Register: (1,0)),
- (Befehl: 'RST6'; Bytes: 1; Register: (0,0)),
- (Befehl: 'RM '; Bytes: 1; Register: (0,0)),
- (Befehl: 'SPHL'; Bytes: 1; Register: (0,0)),
- (Befehl: 'JM '; Bytes: 3; Register: (2,0)),
- (Befehl: 'EI '; Bytes: 1; Register: (0,0)),
- (Befehl: 'CM '; Bytes: 3; Register: (2,0)),
- (Befehl: '----'; Bytes: 1; Register: (0,0)),
- (Befehl: 'CPI '; Bytes: 2; Register: (1,0)),
- (Befehl: 'RST7'; Bytes: 1; Register: (0,0)));
- (* ----------------------------------------------------------------------- *)
- (* Ausgabe eines Wertes als Hexzahl auf der Standardausgabe. Durch "len" *)
- (* wird festgelegt, ob ein Byte (len = 1) oder Worte (len = 2) ausgegeben *)
- (* werden sollen. *)
- PROCEDURE WriteHex (len, value : INTEGER);
- CONST HexZif : ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
- VAR temp, i : INTEGER;
- BEGIN
- FOR i := len DOWNTO 1 DO BEGIN (* 1 oder 2 bytes *)
- IF i = 2 THEN temp := Swap(value) AND $0FF (* high byte holen *)
- ELSE temp := value AND $0FF; (* low byte holen *)
- (* Ausgabe von jeweils 2 Hexziffern: *)
- Write(HexZif[temp DIV 16]:1,HexZif[temp MOD 16]:1);
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- (* Lese 1 oder 2 Bytes aus dem Speicher ab "adr" und gebe das Ergebnis an *)
- (* "GetVal" zurueck. Die gelesenen Bytes werden als Hexziffern auf der *)
- (* Standardausgabe angezeigt. Fuer CP/M 80 muss der Zugriff auf den Spei- *)
- (* cher mit "Mem[adr]" erfolgen, die Spezifizierung des Segments kann ent- *)
- (* fallen. Fuer die 8088 etc. ist dagegen das Segment anzugeben. *)
- FUNCTION getval (VAR adr : INTEGER; len : INTEGER) : INTEGER;
- VAR temp : INTEGER;
- BEGIN
- temp := Mem[Segment:adr]; (* lese low Byte *)
- WriteHex(1,temp); (* Hex Ausgabe *)
- Write (' ');
- adr := Succ(adr);
- IF len = 2 THEN BEGIN (* Wort einlesen *)
- temp := temp OR 256 * Mem[Segment:adr];
- WriteHex (1,Mem[Segment:adr]); (* Hex Ausgabe *)
- Write (' ');
- adr := Succ(adr);
- END;
- getval := temp;
- END;
- (* ----------------------------------------------------------------------- *)
- (* vergleiche, ob Wert1 < Wert2 ist, beachte die Implementierung des Typs *)
- (* Integer in Turbo Pascal *)
- FUNCTION greather (Wert1,Wert2 : INTEGER) : BOOLEAN;
- BEGIN
- IF Hi(Wert1) < Hi(Wert2) THEN (* high Byte vergleichen *)
- greather := TRUE
- ELSE IF Lo(Wert1) < Lo(Wert2) THEN (* low Byte vergleichen *)
- greather := TRUE
- ELSE
- greather := FALSE;
- END;
- (* ----------------------------------------------------------------------- *)
- BEGIN (* DisAsm8080 *)
- WriteLn; WriteLn; WriteLn;
- WriteLn('8080 Disassembler v1.0 (C) 1987 B.Born & PASCAL INT.');
- WriteLn;
- REPEAT (* Programmende, wenn StartAdr > EndAdr ! *)
- Write('Segment (Hex = $XXXX) :'); ReadLn(Segment);
- Write('Start Adresse (Hex = $XXXX) :'); ReadLn(Startadr);
- Write('End Adresse (Hex = $XXXX) :'); ReadLn(Endadr);
- Currentadr := Startadr;
- (* while currentadr < Endadr do *)
- (* vergleiche Datentype Word [0 .. FFFF] *)
- WHILE greather(Currentadr,Endadr) DO BEGIN (* Disassembler-Loop *)
- WriteHex(wordlen,Segment); (* Segment ausgeben *)
- Write(':');
- WriteHex(wordlen,Currentadr); (* Adresse ausgeben *)
- Write(' ');
- Opcode := getval(Currentadr,bytelen); (* lese Opcodebyte *)
- WITH Table[Opcode] DO BEGIN (* decodiere Befehl *)
- IF Bytes = 3 THEN
- BEGIN (* lese Wort *)
- SecOpcode := getval(Currentadr,wordlen);
- Column := 15; (* Ausgabespalte *)
- END
- ELSE IF Bytes = 2 THEN
- BEGIN (* lese Byte *)
- SecOpcode := getval(Currentadr,bytelen);
- Column := 12;
- END
- ELSE
- Column := 9;
- FOR i := Column TO 20 DO (* Ausgabe auf Spalte 20 positionieren *)
- Write (' ');
- Write (Befehl,' '); (* Befehl ausgeben *)
- (* bestimme die Konstanten- und Registerbezeichnungen: *)
- FOR i := 1 TO 2 DO BEGIN
- CASE Register[i] OF
- 0: GOTO 999;
- 1: BEGIN (* code DB z.B. ORI 15 *)
- WriteHex(bytelen,SecOpcode);
- GOTO 999;
- END;
- 2: BEGIN (* code DW z.B. SHLD 1234 *)
- WriteHex(wordlen,SecOpcode);
- GOTO 999;
- END;
- 3: Write ('A'); (* Registercodes *)
- 4: Write ('B');
- 5: Write ('C');
- 6: Write ('D');
- 7: Write ('E');
- 8: Write ('H');
- 9: Write ('L');
- 10: Write ('M');
- 11: Write ('BC');
- 12: Write ('DE');
- 13: Write ('HL');
- 14: Write ('SP');
- 15: Write ('PSW');
- END; (* CASE *)
- IF Register[2] = 0 THEN GOTO 999;
- IF i = 1 THEN Write (',');
- END; (* FOR *)
- END; (* WITH *)
- 999: WriteLn;
- END; (* WHILE CurrentAdr < Endadr *)
- UNTIL greather(Endadr,Startadr);
- END.
-