home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* DISZ80.PAS *)
- (* Version: 1.0, Autor: Born B., Prog. Spr.: Turbo Pascal V3.x, *)
- (* Betr. Sys.: MSDOS, CP/M 80, CP/M 86 *)
- (* Baumorientierter Disassembler fuer den Z80 Prozessor.Der Hauptspeicher- *)
- (* bereich zwischen Startadresse und Endadresse wird disassembliert und *)
- (* auf der Standardausgabe ausgegeben. Start- und Endadresse werden ent- *)
- (* weder als Dezimal- oder als Hexadezimalzahl ($xxxx) ueber die Standard- *)
- (* eingabe eingegeben. *)
- (* Implementierungshinweis: *)
- (* Der Typ 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. *)
- PROGRAM DisasmZ80 (Input,Output);
- CONST
- Bytelen = 1; Wordlen = 2;
- Condition : ARRAY [0..7] OF STRING [2]
- = ('NZ','Z ','NC','C ','PO','PE','P ','M ');
- Register1 : ARRAY [0..7] OF STRING [1] = ('B','C','D','E','H','L',' ','A');
- Register2 : ARRAY [0..7] OF STRING [4]
- = ('B ','C ','D ','E ','H ','L ','(HL)','A ');
- Register3 : ARRAY [0..3] OF STRING [2] = ('BC','DE','HL','SP');
- Register4 : ARRAY [0..3] OF STRING [2] = ('BC','DE','HL','AF');
- Befehl1 : ARRAY [0..7] OF STRING [3]
- = ('ADD','ADC','SUB','SBC','AND','XOR','OR ','CP ');
- Befehl2 : ARRAY [0..7] OF STRING [4]
- = ('RLCA','RRCA','RLA ','RRA ','DAA ','CPL ','SCF ','CCF ');
- TYPE
- bitfield = ARRAY [1..3] OF INTEGER;
- VAR
- Startadr, Endadr, Currentadr,
- Column, Opcode, SecOpcode,
- Thirdopcode, k : INTEGER;
- Bitfeld : bitfield;
- (* ----------------------------------------------------------------------- *)
- (* 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 *)
- 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[0:adr]; (* lese low Byte *)
- WriteHex(1,temp); Write (' '); adr := Succ(adr); (* Hex Ausgabe *)
- IF len = 2 THEN BEGIN (* Wort einlesen *)
- temp := temp OR 256 * Mem[0:adr];
- WriteHex (1,Mem[0:adr]); Write (' '); (* Hex Ausgabe *)
- 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 Greather := TRUE (* high Byte vergl. *)
- ELSE IF Lo(Wert1) < Lo(Wert2) THEN Greather := TRUE (* low Byte vergl. *)
- ELSE Greather := FALSE;
- END;
- (* ----------------------------------------------------------------------- *)
- (* decodiere das Opcodebyte in einzelne Bitfelder. Die Ergebnisbits werden *)
- (* rechtsbuendig geschoben: *)
- (* Bit(1) = bbxx xxxx, Bit(2) = xxbb bxxx, Bit(3) = xxxx xbbb *)
- PROCEDURE Decode (VAR Bitfeld : bitfield; Opcode : INTEGER);
- BEGIN
- Bitfeld [1] := Opcode DIV 64;
- Bitfeld [2] := (Opcode AND $38) DIV 8;
- Bitfeld [3] := Opcode AND $07;
- END;
- (* ----------------------------------------------------------------------- *)
- (* Modul zur Implementierung der erweiterten Opcodes: CB xx xx *)
- PROCEDURE ExtendCB;
- CONST
- Befehl3 : ARRAY [0..7] OF STRING [3]
- = ('RLC','RRC','RL ','RR ','SLA','SRA','***','SRL');
- Befehl4 : ARRAY [1..3] OF STRING [3]
- = ('BIT','RES','SET');
- BEGIN
- Opcode := GetVal (Currentadr,Bytelen); (* lese 2. Opcode *)
- Decode (Bitfeld,Opcode); (* decode Bitsfelder *)
- Write (' ');
- IF Bitfeld[1] = 0 THEN
- BEGIN
- IF Bitfeld[2] <> 6 THEN
- Write (Befehl3[Bitfeld[2]],' ',Register2[Bitfeld[3]]);
- END
- ELSE
- Write (Befehl4[Bitfeld[1]],' ',Bitfeld[2]:1,',',Register2[Bitfeld[3]]);
- END;
- (* ----------------------------------------------------------------------- *)
- (* Modul zur Implementierung der erweiterten Opcodes: ED *)
- PROCEDURE ExtendED;
- CONST
- Befehl5 : ARRAY [0..7] OF STRING [8]
- = ('LD I,A','LD R,A','LD A,I','LD A,R ',
- 'RRD ','RLD ','********','********');
- Befehl6 : ARRAY [0..3,4..7] OF STRING [4]
- = (('LDI ','LDD ','LDIR','LDDR'),('CPI ','CPD ','CPIR','CPDR'),
- ('INI ','IND ','INIR','INDR'),('OUTI','OUTD','OTIR','OTDR'));
- BEGIN
- Opcode := GetVal (Currentadr,Bytelen); (* lese 2. Opcode *)
- Decode (Bitfeld,Opcode); (* decode bits *)
- IF Bitfeld[1] = 1 THEN (* 01 xxx xxx *)
- CASE Bitfeld [3] OF
- 0: IF Bitfeld [2] <> 6 THEN (* 01 xxx 000: IN r,(C) *)
- Write (' ','IN ',Register1[Bitfeld[2]],',(C)');
- 1: IF Bitfeld [2] <> 6 THEN (* 01 xxx 001: OUT (C),r *)
- Write (' ','OUT (C),',Register1[Bitfeld[2]]);
- 2: IF Odd(Bitfeld [2]) THEN (* 01 xxx 010: SBC HL,rp, ... *)
- Write (' ','ADC HL,',Register3[Bitfeld[2] DIV 2])
- ELSE
- Write (' ','SBC HL,',Register3[Bitfeld[2] DIV 2]);
- 3: IF (Bitfeld [2] DIV 2) <> 2 THEN (* 01 xxx 011: LD (NN),rp,... *)
- BEGIN
- SecOpcode := GetVal (Currentadr,Wordlen); Write (' ');
- IF Odd (Bitfeld[2]) THEN
- BEGIN
- Write ('LD ',Register3[Bitfeld[2] DIV 2],',(');
- WriteHex (Wordlen,SecOpcode); Write (')');
- END
- ELSE
- BEGIN
- Write ('LD ('); WriteHex (Wordlen,SecOpcode);
- Write ('),',Register3[Bitfeld[2] DIV 2]);
- END;
- END;
- 4: IF Bitfeld [2] = 0 THEN (* 01 xxx 100: NEG *)
- Write (' ','NEG');
- 5: IF Bitfeld [2] = 0 THEN (* 01 xxx 101: RETN, RETI *)
- Write (' ','RETN')
- ELSE IF Bitfeld [2] = 1 THEN
- Write (' ','RETI');
- 6: IF Bitfeld [2] IN [0,2,3] THEN (* 01 xxx 110: IM0 .. IM2 *)
- CASE Bitfeld [2] OF
- 0: Write (' ','IM0');
- 2: Write (' ','IM1');
- 3: Write (' ','IM2');
- END;
- 7: IF Bitfeld[2] < 6 THEN (* 01 xxx 1110: LD I,A .. *)
- Write (' ',Befehl5[Bitfeld[2]]);
- END (* CASE *)
- ELSE IF Bitfeld [1] = 2 THEN (* 10 xxx xxx: *)
- IF (Bitfeld[3] IN [0..3]) AND (Bitfeld[2] IN [4..7]) THEN (* LDI .. *)
- Write (' ', Befehl6[Bitfeld[3],Bitfeld[2]]);
- END;
- (* ----------------------------------------------------------------------- *)
- (* Modul zur Implementierung der erweiterten Opcodes: DD und FD *)
- PROCEDURE Extendxx;
- VAR Praefix : STRING [2];
- BEGIN
- IF Opcode = $DD THEN Praefix := 'IX' (* setze Indexreg. *)
- ELSE Praefix := 'IY';
- Opcode := GetVal (Currentadr,Bytelen); (* lese 2. Opcode *)
- Decode (Bitfeld,Opcode); (* decode bits *)
- IF Opcode = $CB THEN
- BEGIN (* xD CB dd OP *)
- SecOpcode := GetVal (Currentadr,Bytelen); (* hole dd *)
- Opcode := GetVal (Currentadr,Bytelen); (* hole OP *)
- Decode (Bitfeld,Opcode); (* decodiere bits *)
- IF Bitfeld[3] = 6 THEN BEGIN
- CASE Bitfeld[1] OF
- 0: BEGIN
- Write (' ');
- CASE Bitfeld[2] OF
- 0: Write ('RLC '); 1: Write ('RRC ');
- 2: Write ('RL '); 3: Write ('RR ');
- 4: Write ('SLA '); 5: Write ('SRA ');
- 6: Exit; 7: Write ('SRL ');
- END;
- END;
- 1: Write ('BIT ',Bitfeld[2],',');
- 2: Write ('SET ',Bitfeld[2],',');
- 3: Write ('RES ',Bitfeld[2],',');
- END;
- Write ('(',Praefix,'+');
- WriteHex (Bytelen,SecOpcode); Write (')'); (* displ. dd *)
- END;
- END
- ELSE
- CASE Bitfeld[1] OF
- 0: IF Bitfeld[3] IN [1..6] THEN
- CASE Bitfeld[3] OF
- 1: BEGIN
- IF Bitfeld[2] = 4 THEN (* 00 100 001: LD IX,nn *)
- BEGIN
- SecOpcode := GetVal (Currentadr,Wordlen);
- Write (' ','LD ',Praefix,',');
- WriteHex (Wordlen,SecOpcode);
- END
- ELSE IF Odd(Bitfeld[2]) THEN (* 00 pp1 001: ADD IX,pp *)
- IF (Bitfeld[2] DIV 2) = 2 THEN
- Write (' ','ADD ',Praefix,',',Praefix)
- ELSE
- Write (' ','ADD ',Praefix,',',
- Register3[Bitfeld[2] DIV 2]);
- END;
- 2: IF Bitfeld[2] IN [4,5] THEN BEGIN
- SecOpcode := GetVal (Currentadr,Wordlen);
- IF Bitfeld[2] = 4 THEN
- BEGIN
- Write (' ','LD (');
- WriteHex (Wordlen,SecOpcode); Write ('),',Praefix);
- END
- ELSE
- BEGIN
- Write (' ','LD ',Praefix,'(');
- WriteHex (Wordlen,SecOpcode); Write (')');
- END;
- END;
- 3: IF Bitfeld[2] = 4 THEN Write (' INC ',Praefix)
- ELSE IF Bitfeld[2] = 5 THEN Write (' DEC ',Praefix);
- 4: IF Bitfeld[2] = 6 THEN BEGIN
- SecOpcode := GetVal (Currentadr,Bytelen);
- Write (' INC (',Praefix,'+');
- WriteHex (Bytelen,SecOpcode); Write (')');
- END;
- 5: IF Bitfeld[2] = 6 THEN BEGIN
- SecOpcode := GetVal (Currentadr,Bytelen);
- Write (' DEC (',Praefix,'+');
- WriteHex (Bytelen,SecOpcode); Write (')');
- END;
- 6: IF Bitfeld[2] = 6 THEN BEGIN
- SecOpcode := GetVal (Currentadr,Bytelen);
- Thirdopcode := GetVal (Currentadr,Bytelen);
- Write (' LD (',Praefix,'+');
- WriteHex (Bytelen,SecOpcode); Write ('),');
- WriteHex (Bytelen,Thirdopcode);
- END;
- END; (* CASE *)
- 1: IF (Bitfeld [3] = 6) AND (Bitfeld[2] <> 6) THEN (* LD r,(IX+d) *)
- BEGIN
- SecOpcode := GetVal (Currentadr,Bytelen);
- Write (' LD ',Register1[Bitfeld[2]],',(',Praefix,'+');
- WriteHex (Bytelen,SecOpcode); Write (')');
- END
- ELSE
- IF (Bitfeld [3] <> 6) AND (Bitfeld[2] = 6) THEN (* LD (IX+d),r *)
- BEGIN
- SecOpcode := GetVal (Currentadr,Bytelen);
- Write (' LD (',Praefix,'+');
- WriteHex (Bytelen,SecOpcode);
- Write (')',',',Register1[Bitfeld[3]]);
- END;
- 2: IF Bitfeld[3] = 6 THEN BEGIN (* 10 000 110: ADD A,(IX+d) *)
- SecOpcode := GetVal (Currentadr,Bytelen);
- Write (' ', Befehl1[Bitfeld[2]],' ');
- IF Bitfeld[2] IN [0,1,3] THEN Write ('A,');
- Write('(',Praefix,'+'); WriteHex(Bytelen,SecOpcode); Write(')');
- END;
- 3: IF Bitfeld[3] IN [1,3,5] THEN
- CASE Bitfeld[3] OF
- 1: IF Bitfeld[2] IN [4,5,7] THEN
- CASE Bitfeld[2] OF
- 4: Write (' POP ',Praefix);
- 5: Write (' JP (',Praefix,')');
- 7: Write (' LD SP,',Praefix);
- END;
- 3: IF Bitfeld[2] = 4 THEN
- Write (' EX (SP),',Praefix);
- 5: IF Bitfeld[2] = 4 THEN
- Write (' PUSH ',Praefix);
- END;
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- (* Modul zur Implementierung der Opcodes 00 xxx xxx. Der Opcode wird nach *)
- (* 7 Untergruppen entschluesselt -> 00 xxx bbb. bbb = Bitfeld [3] *)
- PROCEDURE Gruppe00;
- BEGIN
- CASE Bitfeld [3] OF (* Untergruppe 00 xxx 000 -> NOP, EX AF,AF' und *)
- 0: BEGIN (* relative Spruenge DJNZ, JR, JRNZ, JRZ, ... *)
- IF Bitfeld [2] < 2 THEN
- CASE Bitfeld [2] OF
- 0: Write (' NOP');
- 1: Write (' EX AF,AF''');
- END
- ELSE (* relative Sprungbefehle *)
- BEGIN
- SecOpcode := GetVal(Currentadr,Bytelen); (* lese Displacement *)
- Write (' ');
- CASE Bitfeld [2] OF
- 2: Write ('DJNZ '); 3: Write ('JR ');
- 4: Write ('JR NZ,'); 5: Write ('JR Z,');
- 6: Write ('JR NC,'); 7: Write ('JR C,');
- END;
- IF SecOpcode > 127 THEN (* korrektes Displacement *)
- WriteHex (Wordlen,(Currentadr - (256 - SecOpcode)))
- ELSE (* ausgeben *)
- WriteHex (Wordlen,(Currentadr + SecOpcode));
- END;
- END;
- (* Untergruppe 00 xxx 001 xxx = rpb *)
- (* b = 1 -> ADD HL,rp b = 0 -> LD rp,NN *)
- 1: IF Odd(Bitfeld [2]) THEN
- Write (' ','ADD HL,',Register3[Bitfeld [2] DIV 2])
- ELSE
- BEGIN
- SecOpcode := GetVal (Currentadr,Wordlen); (* lese Word *)
- Write (' ','LD ',Register3[Bitfeld[2] DIV 2],',');
- WriteHex (Wordlen,SecOpcode);
- END;
- (* Untergruppe 00 xxx 010 *)
- (* xxx = 101 -> LD HL,(NN) xxx = 100 -> LD (NN),HL *)
- (* xxx = rp0 -> LD (rp),A xxx = rp0 -> LD A,(rp) *)
- 2: IF Bitfeld [2] IN [4..7] THEN
- BEGIN
- SecOpcode := GetVal (Currentadr,Wordlen); (* lese Word *)
- CASE Bitfeld[2] OF
- 4: BEGIN
- Write (' ','LD ('); (* LD (NN),HL *)
- WriteHex (Wordlen,SecOpcode); Write ('),HL');
- END;
- 5: BEGIN
- Write (' ','LD HL,('); (* LD HL,(NN) *)
- WriteHex (Wordlen,SecOpcode); Write (')');
- END;
- 6: BEGIN
- Write (' ','LD ('); (* LD (NN),A *)
- WriteHex (Wordlen,SecOpcode); Write ('),A');
- END;
- 7: BEGIN
- Write (' ','LD A,('); (* LD A,(NN) *)
- WriteHex (Wordlen,SecOpcode); Write (')');
- END;
- END; (* case *)
- END
- ELSE IF Odd(Bitfeld [2]) THEN
- Write (' ','LD A,(',Register3[Bitfeld[2] DIV 2],')')
- ELSE
- Write (' ','LD (',Register3[Bitfeld[2] DIV 2],'),A');
- (* Untergruppe 00 xxx 011 -> INC rp DEC rp *)
- 3: IF Odd(Bitfeld [2]) THEN
- Write (' ','DEC ',Register3[Bitfeld [2] DIV 2])
- ELSE
- Write (' ','INC ',Register3[Bitfeld [2] DIV 2]);
- (* Untergruppe 00 xxx 100 -> INC r *)
- 4: Write (' ','INC ',Register2[Bitfeld [2]]);
- (* Untergruppe 00 xxx 101 -> DEC r *)
- 5: Write (' ','DEC ',Register2[Bitfeld [2]]);
- 6: BEGIN (* Untergruppe 00 xxx 110 -> LD r,N *)
- SecOpcode := GetVal (Currentadr,Bytelen); (* lese N *)
- IF Bitfeld [2] = 6 THEN Write (' ','LD (HL),')
- ELSE Write (' ','LD ',Register1[Bitfeld[2]],',');
- WriteHex (Bytelen,SecOpcode); (* N ausgeben *)
- END;
- (* Untergruppe 00 xxx 111 -> DAA,... *)
- 7: Write (' ',Befehl2[Bitfeld[2]]);
- END; (* CASE *)
- END;
- (* ----------------------------------------------------------------------- *)
- (* Modul zur Enschluesselung der Hauptgruppe 01 xxx xxx. Es handelt sich *)
- (* hierbei um die LD r,r Befehle *)
- PROCEDURE Gruppe01;
- BEGIN
- Write (' ');
- IF Opcode = $76 THEN Write ('HALT') (* Ausnahme Halt = 76 *)
- ELSE IF Bitfeld [2] = 6 THEN Write ('LD (HL),',Register2[Bitfeld[3]])
- ELSE Write ('LD ',Register1[Bitfeld[2]],',',Register2[Bitfeld[3]]);
- END;
- (* ----------------------------------------------------------------------- *)
- (* Modul zur Entschluesselung der Hauptgruppe 10 xxx xxx. Es handelt sich *)
- (* um die Befehle ADD, ADC, SUB, ... *)
- PROCEDURE Gruppe10;
- BEGIN
- Write (' '); Write (Befehl1[Bitfeld[2]],' ');
- IF Bitfeld [2] IN [0,1,3] THEN Write ('A,'); (* ADD A,r ... *)
- IF Bitfeld[3] = 6 THEN Write ('(HL)')
- ELSE Write (Register1[Bitfeld[3]]);
- END;
- (* ----------------------------------------------------------------------- *)
- (* Modul zur Entschluesselung der Hauptgruppe 11 xxx xxx. Es werden 7 *)
- (* Untergruppen gebildet: 11 xxx bbb. Ausserdem werden die Praefix-Bytes *)
- (* CB, DD, ED, FD abgefangen *)
- PROCEDURE Gruppe11;
- BEGIN
- CASE Bitfeld [3] OF (* Untergruppe 11 xxx 000 -> RET CC *)
- 0: Write (' ','RET ',Condition [Bitfeld[2]]);
- 1: BEGIN (* Untergruppe 11 xxx 001 -> RET, POP *)
- IF Odd(Bitfeld [2]) THEN
- CASE (Bitfeld [2] DIV 2) OF
- 0: Write (' ','RET');
- 1: Write (' ','EXX');
- 2: Write (' ','Jp (HL)');
- 3: Write (' ','LD SP,HL');
- END
- ELSE Write (' ','POP ',Register4[Bitfeld[2] DIV 2]);
- END;
- 2: BEGIN (* Untergruppe 11 xxx 010 -> JP CC,NN *)
- SecOpcode := GetVal (Currentadr,Wordlen); (* lese Word NN *)
- Write (' ','Jp ',Condition[Bitfeld[2]],',');
- WriteHex (Wordlen,SecOpcode); (* NN ausgeben *)
- END;
- 3: CASE Bitfeld [2] OF (* Untergruppe 11 xxx 011 -> JP, OUT, IN *)
- 0: BEGIN (* JP NN *)
- SecOpcode := GetVal (Currentadr,Wordlen); (* lese Adresse *)
- Write (' ','Jp ');
- WriteHex (Wordlen,SecOpcode); (* Adr ausgeben *)
- END;
- 1: ExtendCB; (* Opcode CB *)
- 2: BEGIN (* OUT (N),A *)
- SecOpcode := GetVal (Currentadr,Bytelen); (* lese N *)
- Write (' ','OUT (');
- WriteHex (Bytelen,SecOpcode); Write(')'); (* N ausgeben *)
- Write ('),A');
- END;
- 3: BEGIN (* IN A,(N) *)
- SecOpcode := GetVal (Currentadr,Bytelen); (* lese N *)
- Write (' ','IN A,(');
- WriteHex (Bytelen,SecOpcode); Write(')'); (* N ausgeben *)
- END;
- 4: Write (' ','EX (SP),HL');
- 5: Write (' ','EX DE,HL');
- 6: Write (' ','Di');
- 7: Write (' ','Ei');
- END;
- 4: BEGIN (* Untergruppe 11 xxx 100 -> CALL CC,NN *)
- SecOpcode := GetVal (Currentadr,Wordlen); (* lese Word NN *)
- Write (' ','CALL ',Condition[Bitfeld[2]],',');
- WriteHex (Wordlen,SecOpcode); (* NN ausgeben *)
- END;
- 5: IF Odd(Bitfeld [2]) THEN (* Untergruppe 11 xxx 101 -> PUSH CALL *)
- CASE (Bitfeld [2] DIV 2) OF
- 0: BEGIN
- SecOpcode := GetVal (Currentadr,Wordlen); (* lese NN *)
- Write (' ','CALL '); WriteHex (Wordlen,SecOpcode);
- END;
- 1: Extendxx; (* Opcode DD *)
- 2: ExtendED; (* Opcode DE *)
- 3: Extendxx; (* Opcode FD *)
- END
- ELSE Write (' ','PUSH ',Register4[Bitfeld[2] DIV 2]);
- 6: BEGIN (* Untergruppe 11 xxx 110 -> ADD A,N ... *)
- SecOpcode := GetVal (Currentadr,Bytelen); (* lese N *)
- Write (' ',Befehl1[Bitfeld[2]],' ');
- IF Bitfeld[2] IN [0,1,3] THEN Write ('A,'); (* ADD A,N .. *)
- WriteHex (Bytelen,SecOpcode); (* N ausgeben *)
- END;
- (* Untergruppe 11 xxx 111 -> RST n *)
- 7: Write (' ','RST ',Bitfeld[2]*8);
- END; (* CASE *)
- END;
- (* ----------------------------------------------------------------------- *)
- BEGIN (* Disasmz80 *)
- WriteLn; WriteLn; WriteLn;
- WriteLn('Z80 Disassembler v1.0 (C) 1987 b.Born & PASCAL Int.');
- WriteLn;
- REPEAT (* Programmende, wenn StartAdr > EndAdr ! *)
- Write('Start Adresse (Hex = $XXXX) :'); ReadLn(Startadr);
- Write('End Adresse (Hex = $XXXX) :'); ReadLn(Endadr);
- Currentadr := Startadr;
- WHILE Greather(Currentadr,Endadr) DO BEGIN (* Disassembler loop *)
- WriteHex (Wordlen,Currentadr); Write (' '); (* Adresse ausgeben *)
- Opcode := GetVal (Currentadr,Bytelen); (* lese Opcodebyte *)
- Decode (Bitfeld,Opcode); (* sep. Bitfelder *)
- CASE Bitfeld [1] OF (* Opcodes werden in 4 Hauptgruppen decodiert *)
- 0: Gruppe00; 1: Gruppe01; 2: Gruppe10; 3: Gruppe11;
- END;
- WriteLn;
- END;
- UNTIL Greather(Endadr,Startadr);
- END.