;Disassembler nach %REAS
IDEAL
MODEL small,pascal
P286
warn pro ;Protected-Mode-Fehler anmeckern
public LCode,Reas
extrn MemKCSel:Word, PutHexW:near, PutHexB:near
CODESEG
;Maske - Mnemonik - Terminator (-1)
db 6ah,3ah,39h,06h,66h,35h
MMT_Ohne:
db -1,0
db 10h,22h,32h,27h,37h,08h,18h,2ah
db 3ah,2fh,3fh,76h,0c3h,0d3h,0e3h,0f3h,0c9h
db 0d9h,0e9h,0f9h,0dbh,0ebh,0fbh,0cdh,-1
db 0cfh,1h,2h,3h,9h,0ah,0bh,0c1h,0c5h,-1
db 0c7h,0h,4h,5h,6h,0c0h,0c2h,0c4h,0c6h,-1
MMT_CB:
db 0c0h,0h,40h,80h,0c0h
MMT_ED:
db -1,70h,71h,47h,57h,67h,4dh,4fh,5fh,6fh,-1
db 0cfh,42h,43h,4ah,4bh,-1
db 0c7h,40h,41h,44h,45h,-1
db 0e7h,0a0h,0a1h,0a2h,-1
db 0f7h,0b3h,0a3h,-1
db 0d7h,46h,-1
db 0dfh,56h,5eh,-1
db 0,0
addy=0 ;Zeichen-Addierwert
last=-1000 ;Ungültiger Startwert
counter=-1 ;Laufender DEFS-Zähler
macro POKE value
if last NE -1000
db last
endif
last=value
endm
macro DEFS str:rest
addy=128 ;;Erstes Zeichen mit gesetztem Bit 7
irp arg,<str> ;;Mit jedem Argument der Liste tue...
irpc c,<arg> ;;Mit jedem Zeichen des Arguments tue...
if addy AND 127 ;;Mitten in Zeichenersetzung?
ifidn <c>,< > ;;Leerzeichen (nie zuerst!)?
last=last+26 ;;LAST korrigieren
elseifidn <c>,<'> ;;Abschließendes Hochkomma?
exitm ;;Zeichen-Schleife verlassen
else
POKE %('&c'+addy)
endif
addy=11 ;;Bit7 löschen nach erstem Zeichen
elseifidn <c>,<'> ;;Stringanfang?
addy=addy+11 ;;InString setzen
else
POKE %(arg+addy)
exitm ;;Zeichen-Schleife verlassen
endif
endm
addy=0 ;;Nächstes Argument ohne Bit7
endm
POKE -1000 ;;Letztes Byte schreiben
counter=counter+1 ;;Aufrufe mitzählen
endm
BMNE: DEFS 'LD ' ;0
DEFS 'RET' ;1
DEFS 'NOP' ;2
DEFS 'OUT ' ;3
DEFS 'INC ' ;4
DEFS 'DEC ' ;5
DEFS '(',26h,')' ;6 (nn)
DEFS '(',1fh,')' ;7 (dd)
DEFS 31,',' ;8 nn,
DEFS ',',31 ;9 ,nn
DEFS 'A,' ;10
DEFS ',A' ;11
DEFS 28h,',',29h ;12 b,r
DEFS 'ADD ' ;13 ari_
DEFS 'ADC '
DEFS 'SUB '
DEFS 'SBC '
DEFS 'AND '
DEFS 'X',19
DEFS 'OR '
DEFS 'CP '
DEFS 22 ;21 BC
DEFS 'BC' ;22
DEFS 24 ;23 DE
DEFS 'DE' ;24
DEFS 26 ;25 HL
DEFS 'HL' ;26
DEFS 'AF' ;27
DEFS 'SP' ;28
DEFS 'RLC' ;29 rot
DEFS 'RRC'
DEFS 'RL'
DEFS 'RR'
DEFS 'SLA'
DEFS 'SRA
DEFS 'SLS'
DEFS 'SRL'
DEFS 'B' ;37 r
DEFS 'C'
DEFS 'D'
DEFS 'E'
DEFS 'H'
DEFS 'L'
AppXY: DEFS 'M'
DEFS 'A'
DEFS 'NZ ' ;45 cc
DEFS 'Z '
DEFS 'NC '
DEFS 'C '
DEFS 'PO '
DEFS 'PE '
DEFS 'P '
DEFS 'M '
DEFS 'I' ;53 blo
DEFS 'D'
DEFS 'IR'
DEFS 'DR'
DEFS '(',26,'+',37,')' ;(IX+d)
HashBasis_Ohne=counter
DEFS 2 ;NOP
DEFS 'DJNZ ',27h
DEFS 0,6,9 ;LD (nn),HL
DEFS 0,6,11 ;LD (nn),A
DEFS 'DAA'
DEFS 'SCF'
DEFS 'EXAF'
DEFS 'JR ',27h
DEFS 0,8,6 ;LD HL,(nn)
DEFS 0,0ah,6 ;LD A,(nn)
DEFS 'CPL'
DEFS 'CCF'
DEFS 'HALT'
DEFS 'JMP ',26h
DEFS 3,25h ;OUT n
DEFS 'EX (',1ch,')',9 ;EX (SP),HL
DEFS 'DI'
DEFS 1 ;RET
DEFS 'EXX'
DEFS 'JMP ',7 ;JMP (HL)
DEFS 0,8,1ah ;LD SP,HL
DEFS 'IN ',25h
DEFS 'EX ',18h,',HL' ;EX DE,HL; Umstand wegen IX/IY
DEFS 'EI'
DEFS 'CALL ',26h
DEFS 0,8,26h ;LD dd,nn
DEFS 0,7,0bh ;LD (dd),A
DEFS 4,1fh ;INC dd
DEFS 0dh,1ah,9 ;ADD HL,dd
DEFS 0,0ah,7 ;LD A,(dd)
DEFS 5,1fh ;DEC dd
DEFS 'POP ',1eh ;POP qq
DEFS 'PUSH ',1eh ;PUSH qq
DEFS 'J',23h,27h ;Jcc e
DEFS 4,21h ;INC r
DEFS 5,21h ;DEC r
DEFS 0,21h,',',25h ;LD r,n
DEFS 'R',22h ;Rcc
DEFS 'JP',22h,26h ;JPcc nn
DEFS 'CA',22h,26h ;CAcc nn
DEFS 1dh,25h ;ADD..CP n
DEFS 20h,'A' ;RLCA..RRA
DEFS 0,21h,',',29h ;LD r,r
DEFS 1dh,29h ;ADD..CP r
DEFS 'RST',28h ;RSTp
HashBasis_CB=counter
DEFS 20h,2bh,29h,2ah ;RLC...SRL r
DEFS 'BIT ',0ch
DEFS 'RES ',0ch,2ah
DEFS 'SET ',0ch,2ah
HashBasis_ED=counter
DEFS 'INF'
DEFS 'OTCL'
DEFS 0,'I',0bh ;LD I,A
DEFS 0,0ah,'I' ;LD A,I
DEFS 'RRD'
DEFS 1,'I' ;RETI
DEFS 0,'R',0bh ;LD R,A
DEFS 0,0ah,'R' ;LD A,R
DEFS 'R',0 ;RLD
DEFS 10h,1ah,9 ;SBC HL,dd
DEFS 0,6,9 ;LD (nn),dd
DEFS 0eh,1ah,9 ;ADC AL,dd
DEFS 0,8,6 ;LD dd,(nn)
DEFS 'IN ',21h
DEFS 3,21h ;OUT r
DEFS 'NEG'
DEFS 1,'N' ;RETN
DEFS 'LD',24h ;LDI...LDDR
DEFS 'CP',24h ;CPI...CPDR
DEFS 'IN',24h ;INI
DEFS 'OT',24h ;OTIR/OTDR
DEFS 'OUT',24h ;OUTI/OUTD
DEFS 'IM0'
DEFS 'IM1'
DEFS 'IM2'
DEFS 2 ;NOP
HashBasis_Asm=counter
DEFS 'DB ',25h ;für den Assembler
DEFS 'DW ',26h ;für den Assembler
db 80h ;Abschluß
proc Reas
arg mc:far ptr byte, asm:far ptr byte
;Register: DS:BX=Source-Zeiger, CS:SI=Tabellen-Zeiger
;AL oder AH: Opcode, ES:DI=Ausgabe-Stringzeiger
;CH=Z80:LY, DH=Z80:B, DL=Z80:C
;DL Bit7: DD+CB, Bit6: (IX+d), Bit2: Ausgaberoutine für (IX+d),
;Bit 1: DD/FD-Präfix, Bit0: FD-Präfix
push ds
cld
mov dx,HashBasis_Ohne*256 ;DH=Hashindex-1
lds bx,[mc]
les di,[asm]
mov si,offset MMT_Ohne
@@l: mov al,[bx]
cmp al,0ddh
jnz @@ndd
mov dl,2
inc bx
jmp @@l
@@ndd:
cmp al,0fdh
jnz @@nfd
mov dl,3
inc bx
jmp @@l
@@nfd:
cmp al,0cbh
jnz @@ncb
mov si,offset MMT_CB
mov dh,HashBasis_CB ;Anderer Hashindex-1
test dl,2 ;IX/IY?
jz @@zbyte
or dl,80h ;für Sonderbehandlung
inc bx ;d übergehen
jmp @@zbyte
@@ncb:
cmp al,0edh
jnz @@such
mov si,offset MMT_ED
mov dx,HashBasis_ED*256 ;Anderer Hashindex-1, kein IX/IY!
@@zbyte:inc bx
@@such: mov ch,[bx] ;Eigentlichen Opcode laden
segcs lodsb ;Maske laden
and ch,al ;Maskiertes Byte
@@cmp: segcs lodsb ;Vergleichsbyte
cmp al,-1 ;Ende?
jz @@such ;ja-Opcode neu maskieren
inc dh ;Nächster Hash
cmp al,ch ;Gefunden?
jnz @@cmp ;nein, weitersuchen
mov al,[bx] ;Opcode laden
inc bx
mov ch,al
ror al,3
and al,7
xchg al,dh
;Aufruf mit BX=Codezeiger, DH=Registernummer (Bits 5,4,3) in (2,1,0),
;CH=Opcode, AL=Hashindex, DL=Flags
call pla
pop ds
ret
endp
proc pria
;PE: ES:DI=Ausgabezeiger, CL=Druckzeichen bis Tab
cmp al,2bh
jc macro_exp
sub al,11
cmp al,' '
jz @@tabu
cmp al,')'
jnz @@prih
and ch,not 4 ;IX+d abschließen
@@prih: cmp al,5bh
jc @@pra
sub al,1ah
stosb
@@tabu: mov di,[bp+4]
add di,5
ret
@@pra: stosb
ret
endp
proc macro_exp
cmp al,1dh ;Festes Makro?
jc pla ;ja
cmp al,25h ;Ziffernmakros?
jnc @@ma ;ja
cmp al,1fh ;2-bit variable Textmakros? (??)
jc @@m2 ;ja
jnz @@m1 ;nein
or dh,1 ;auch, aber dd statt qq
@@m1: dec al
cmp al,22h ;c (Relativsprünge) oder blo (Block-Suffix)
jc @@m2 ;nein, 3 gültige Bits
and dh,3 ;2 Bits bleiben gültig
dec al
@@m2: shl al,3
add al,13-(1dh*8) ;Variable Textmakros beginnen ab Hash 13
@@m21: add al,dh
;Unterprogramm-Einsprung
pla: test dl,3 ;IX/IY?
jz @@nm ;nein
cmp al,1ah ;Hash 1A (HL)?
jnz @@nhl ;nein
mov al,'I'
stosb
@@xy: mov al,dl
and al,1
add al,'X'
stosb
ret
@@ma: ;Ziffernmakro (n,nn,e,b,r',r'cb) expandieren
sub al,25h ;nullbasiert
cbw
add ax,ax ;*2
xchg si,ax
mov al,dh ;Ziffer des Interesses
test dl,80h ;DD+CB-Flag? NZ!
jmp [cs:@@mac+si]
@@mac dw @@n,@@nn,@@e,@@b,@@re,@@r1
@@re: ;r' (Quell-Register)
jnz @@me ;wenn DD+CB
@@ra: mov al,ch ;Opcode laden
and al,7 ;Quell-Register
mov dh,al
mov al,25h
jmp @@m21
@@r1: ;r1
jz @@ret ;wenn kein DD+CB: nichts ausgeben! (??)
and al,7 ;Opcode (Kopie von CH)
cmp al,6 ;M als Registerkodierung?
jnz @@hm
test dl,40h ;(IX+d) (??)
jnz @@ret
@@hm: mov al,','
stosb
jmp @@ra
@@nhl: ;(Doppel)Registerausgabe (mit Vorbyte DD/FD)
cmp al,2bh ;M?
jnz @@nm ;Keine Ersetzung
@@me: or dl,44h ;Ausgabe von (IX+d) erfolgt nun
mov al,39h ;Hash dafür
test dl,80h ;DD+CB?
jz @@nm ;nein
sub bx,2 ;damit d richtig geholt wird
call @@nm
inc bx
@@ret: ret
@@nm: ;Hash suchen (PE: AL=Hash-Index (0=erster))
mov cl,al
inc cl
mov si,offset bmne ;Tabellen-Start
@@sch: segcs lodsb ;Byte holen
or al,al ;Bit7 (Anfangskennung) gesetzt?
jns @@sch ;nein, nicht mitzählen
dec cl ;ja, mitzählen
jnz @@sch ;bis 0
@@prst: and al,7fh
@@prsl: push si ;Tabellenzeiger behalten
call pria ;Ausgeben, ggf. Rekursion
pop si
segcs lodsb ;Nächstes Byte
or al,al ;Bit7 gesetzt? (wäre Anfang nächster Eintrag)
jns @@prsl ;nein, weiter ausgeben
test dl,3 ;IX/IY?
jz @@ret ;nein
test dl,40h ;(IX+d) bereits aufgetreten?
jnz @@ret ;ja
sub si,offset AppXY ;Untersuchung auf Ausgaben von L und H
and si,not 1
jnz @@ret ;nein
mov al,ch ;Opcode laden
and al,0C7h
cmp al,46h
jz @@ret
jmp @@xy
@@n: ;Hexzahl n
mov al,[bx]
inc bx
test dl,4 ;Ausgabe (IX+d) läuft?
jz @@n1 ;nein, immer positives Byte
or al,al ;Negativ?
jns @@n1 ;bleibt so
neg al
mov [byte es:di-1],'-' ;Minus patchen
@@n1: jmp puthexb ;Byte ausgeben
@@nn: ;Hexzahl nn oder Absolutsprung
mov ax,[bx]
add bx,2
@@ph: jmp puthexw
@@e: ;Relativsprung
mov al,[bx]
inc bx
cbw
add ax,bx
jmp @@ph
@@b: ;Bit-Nummer
add al,'0'
stosb
ret
endp
;**************************************************
proc LCode
arg adr: far ptr byte
les si,[adr]
xor cx,cx
jmp @@w
@@ed:
seges lodsb
inc cl
and al,0c7h
cmp al,43h
jnz @@ex
jmp @@exi2
@@cb:
test ch,80h ;mit IX/IY?
jz @@exi
jmp @@exi2
@@ix: or ch,80h ;merken: IX/IY (statt M: noch ein Byte)
@@w:
seges lodsb
inc cl
mov ah,al
cmp al,0edh
jz @@ed
cmp al,0ddh
jz @@ix
cmp al,0fdh
jz @@ix
cmp al,0cbh
jz @@cb
;normaler Opcode:
cmp al,0cdh
jz @@exi2
cmp al,0c3h
jz @@exi2
and al,0e7h
cmp al,22h
mov al,ah
jz @@exi2
and al,0cfh
cmp al,1
jz @@exi2
and al,0c7h
jz @@ew
cmp al,0c2h
jz @@exi
cmp al,0c4h
jz @@exi
cmp al,6
jz @@exi
cmp al,0c6h
jz @@exi
mov al,ah
and al,0f7h
cmp al,0d3h
jz @@exi
jmp @@ex
@@ew: ;Extrawurst?
mov al,ah
cmp al,9
jc @@ex
jmp @@exi
@@exi2: inc cl
@@exi: inc cl
@@ex: mov al,cl
cbw
ret
endp
END
Vorgefundene Kodierung: OEM (CP437) | 1
|
|