home *** CD-ROM | disk | FTP | other *** search
- \\ DIS8096.SEQ disasembler for 8096 by Mike Mayo,
- \ based on DIS8086.SEQ 8086 Disassembler by Charles Curley
- ─────────────────────────────────────────────────────────────────────────────
- $Header: F:/tcom96/debugger/logs/dis8096.sev 1.5 23 Apr 1991 11:02:58 MikeM $
- ─────────────────────────────────────────────────────────────────────────────
- ─────────────────────────────────────────────────────────────────────────────
- $Log: F:/tcom96/debugger/logs/dis8096.sev $
- \
- \ Rev 1.5 23 Apr 1991 11:02:58 MikeM
- \
- ─────────────────────────────────────────────────────────────────────────────
- {
- PREFIX \ Conversion by Bill Muench 9 September 88 Fixes
-
- forth definitions decimal
- anew distarg96words
- warning off
-
- vocabulary distarget
-
- : h.4 ( n -- ) \ display n in four digit hex
- $10 save!> base
- 0 <# # # # # #> type space
- restore> base ;
-
- : sp>col ( n -- ) \ output spaces to column n
- #out @ - 0max spaces ;
-
- CODE 2/S ( n ct - n') \ shift n right by ct bits
- POP CX
- POP AX
- SHR AX, CL
- 1PUSH
- END-CODE
-
- CODE SEXT ( n - n' ) \ sign extend byte to word
- POP AX
- CBW
- 1PUSH
- END-CODE
-
- DIStarget DEFINITIONS
-
- \ Avoid name conflicts
- : ANDD AND ;
- : ORR OR ;
- : XORR XOR ;
- : NOTT NOT ;
-
- 0 value pad=
- : (dTC@) ( a - n ) 2* pad + pad= - c@ ;
- : (dT@) ( a - n ) 2* pad + pad= - @ ;
-
- DEFER dTC@ ( a - n ) \ deferred byte fetch of memory to disassemble
- DEFER dT@ ( a - n ) \ deferred word fetch of memory to disassemble
- : MEMORY
- ['] (dTC@) IS dTC@
- ['] (dT@) IS dT@
- ;
-
-
- \ Stuff for displaying opcode names
-
- : .ID| ( nf -- ) \ show the name pointed to by nf without trailing space
- DUP 1+ DUP YC@ ROT YC@ 31 AND
- 0 ?DO DUP 127 AND FEMIT
- 128 AND IF ASCII _ 128 OR ELSE 1+ DUP YC@ THEN
- LOOP
- 2DROP ;
-
- : ID.L ( a -- ) \ show the name pointed to by nf in an 8-column field
- #OUT @ SWAP .ID| #OUT @ - 8 + SPACES ;
- : .SELF ( -- ) \ defines a word that types out it's name
- CREATE LAST @ , DOES> @ .ID| ;
- : SELF.L ( -- ) \ defines a word that types out it's name
- \ left-justified in 8 columns
- CREATE LAST @ , DOES> @ ID.L ;
- : .ME ( -- ) \ print name of word that calls this
- LAST @ [COMPILE] LITERAL COMPILE ID.L ; IMMEDIATE
-
- : .SYMBOL H. ;
-
- VARIABLE CP
- : NEXTB ( - n ) CP @ dTC@ 1 CP +! ; \ get the next byte to disassemble
- : NEXTW ( - w ) NEXTB NEXTB 256 * + ; \ get the next word to disassemble
-
- : .N ( op -- op ) \ show number of unknown opcode
- ." ?" dup h. ;
-
- 0 VALUE AMODE
- : .MODE ( op -- op ) \ pick out address mode bits
- DUP 3 ANDD !> AMODE ;
- \ ." amode" AMODE . ;
-
- : .WREG ." w." NEXTB H. ;
- : .BREG ." b." NEXTB H. ;
- : .LREG ." L." NEXTB H. ;
-
- : .IMMW ." #" NEXTW H. ;
- : .IMMB ." #" NEXTB H. ;
-
- : .INDIRECT
- NEXTB DUP
- 1 AND IF ." [" 1- H. ." ]+, "
- ELSE ." [" H. ." ], "
- THEN
- ;
-
- : .INDEXED
- ." [" NEXTB DUP $FE AND H. ." ] +"
- 1 AND IF NEXTW
- ELSE NEXTB
- THEN
- H. ." , " ;
-
- : .WAOP AMODE EXEC: .WREG .IMMW .INDIRECT .INDEXED ;
-
- : .BAOP AMODE EXEC: .BREG .IMMB .INDIRECT .INDEXED ;
-
-
- : SKIP .ME .BREG ;
- : CLR .ME .WREG ;
- : NOT .ME .WREG ;
- : NEG .ME .WREG ;
- : DEC .ME .WREG ;
- : EXT .ME .LREG ;
- : INC .ME .WREG ;
- : SHR .ME .BREG .WREG ;
- : SHL .ME .BREG .WREG ;
- : SHRA .ME .BREG .WREG ;
- : SHRL .ME .BREG .LREG ;
- : SHLL .ME .BREG .LREG ;
- : SHRAL .ME .BREG .LREG ;
- : NORML .ME .BREG .LREG ;
-
- : 0xS ( op -- n ) \
- DUP 15 ANDD
- EXEC: SKIP CLR NOT NEG .N DEC EXT INC
- SHR SHL SHRA .N SHRL SHLL SHRAL NORML ;
-
- : CLRB .ME .BREG ;
- : NOTB .ME .WREG ;
- : NEGB .ME .BREG ;
- : DECB .ME .BREG ;
- : EXTB .ME .WREG ;
- : INCB .ME .BREG ;
- : SHRB .ME .BREG .BREG ;
- : SHLB .ME .BREG .BREG ;
- : SHRAB .ME .BREG .BREG ;
-
- : 1xS ( op -- n ) \
- DUP 15 ANDD
- EXEC: .N CLRB NOTB NEGB .N DECB EXTB INCB
- SHRB SHLB SHRAB .N .N .N .N .N ;
-
- : SJMP .ME DUP 7 AND 256 * NEXTB + SEXT CP @ + .SYMBOL ;
- : SCALL .ME DUP 7 AND 256 * NEXTB + SEXT CP @ + .SYMBOL ;
-
- : 2xS ( op -- n ) \
- DUP $28 < IF SJMP ELSE SCALL THEN ;
-
- : JBC .ME DUP 7 AND . .BREG NEXTB SEXT CP @ + .SYMBOL ;
- : JBS .ME DUP 7 AND . .BREG NEXTB SEXT CP @ + .SYMBOL ;
-
- : 3xS ( op -- n ) \
- DUP $38 < IF JBC ELSE JBS THEN ;
-
- : .MUL3 .MODE .WAOP ." s" .WREG ." d" .LREG ;
- : .MULB3 .MODE .BAOP ." s" .BREG ." d" .WREG ;
- : .MUL .MODE .WAOP .LREG ;
- : .MULB .MODE .BAOP .WREG ;
- : .DIV .MODE .WAOP .LREG ;
- : .DIVB .MODE .BAOP .WREG ;
-
- : MULU3 .ME .MUL3 ;
- : MULUB3 .ME .MULB3 ;
- : MULU .ME .MUL ;
- : MULUB .ME .MULB ;
- : DIVU .ME .DIV ;
- : DIVUB .ME .DIVB ;
-
- : AND3 .ME .MODE .WAOP ." s" .WREG ." d" .WREG ;
- : ADD3 .ME .MODE .WAOP ." s" .WREG ." d" .WREG ;
- : SUB3 .ME .MODE .WAOP ." s" .WREG ." d" .WREG ;
-
- : 4xS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: AND3 ADD3 SUB3 MULU3 ;
-
- : ANDB3 .ME .MODE .BAOP ." s" .BREG ." d" .BREG ;
- : ADDB3 .ME .MODE .BAOP ." s" .BREG ." d" .BREG ;
- : SUBB3 .ME .MODE .BAOP ." s" .BREG ." d" .BREG ;
-
- : 5xS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: ANDB3 ADDB3 SUBB3 MULUB3 ;
-
- : AND .ME .MODE .WAOP .WREG ;
- : ADD .ME .MODE .WAOP .WREG ;
- : SUB .ME .MODE .WAOP .WREG ;
-
- : 6xS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: AND ADD SUB MULU ;
-
- : ANDB .ME .MODE .BAOP .BREG ;
- : ADDB .ME .MODE .BAOP .BREG ;
- : SUBB .ME .MODE .BAOP .BREG ;
-
- : 7xS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: ANDB ADDB SUBB MULUB ;
-
- : OR .ME .MODE .WAOP .WREG ;
- : XOR .ME .MODE .WAOP .WREG ;
- : CMP .ME .MODE .WAOP .WREG ;
-
- : 8xS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: OR XOR CMP DIVU ;
-
- : ORB .ME .MODE .BAOP .BREG ;
- : XORB .ME .MODE .BAOP .BREG ;
- : CMPB .ME .MODE .BAOP .BREG ;
-
- : 9xS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: ORB XORB CMPB DIVUB ;
-
- : LD .ME .MODE .WAOP .WREG ;
- : ADDC .ME .MODE .WAOP .WREG ;
- : SUBC .ME .MODE .WAOP .WREG ;
- : LDBZE .ME .MODE .BAOP .WREG ;
-
- : AxS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: LD ADDC SUBC LDBZE ;
-
- : LDB .ME .MODE .BAOP .BREG ;
- : ADDCB .ME .MODE .BAOP .BREG ;
- : SUBCB .ME .MODE .BAOP .BREG ;
- : LDBSE .ME .MODE .BAOP .WREG ;
-
- : BxS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: LDB ADDCB SUBCB LDBSE ;
-
-
- : BMOV .ME .WREG .LREG ;
- : ST DUP $C1 = IF BMOV
- ELSE .ME .MODE .WAOP .WREG
- THEN ;
- : CMPL .ME .LREG .LREG ;
- : STB DUP $C5 = IF CMPL
- ELSE .ME .MODE .BAOP .BREG
- THEN ;
- : PUSH .ME .MODE .WAOP ;
- : POP .ME .MODE .WAOP ;
-
- : CxS ( op -- n ) \
- DUP 15 ANDD 2/ 2/
- EXEC: ST STB PUSH POP ;
-
-
- SELF.L JNST SELF.L JNH SELF.L JGT SELF.L JNC
- SELF.L JNVT SELF.L JNV SELF.L JGE SELF.L JNE
- SELF.L JST SELF.L JH SELF.L JLE SELF.L JC
- SELF.L JVT SELF.L JV SELF.L JLT SELF.L JE
-
- : .BR| ( op -- op )
- DUP 15 ANDD
- EXEC: JNST JNH JGT JNC JNVT JNV JGE JNE JST JH JLE JC JVT JV JLT JE ;
-
- : DxS ( op --op ) \ D0-DF branch & dest
- .BR| NEXTB SEXT CP @ + .SYMBOL ;
-
-
- : LCALL .ME NEXTW CP @ + .SYMBOL ;
- : LJMP .ME NEXTW CP @ + .SYMBOL ;
-
- : DJNZ .ME NEXTB H. NEXTB SEXT CP @ + .SYMBOL ;
- : DJNZW .ME NEXTB H. NEXTB SEXT CP @ + .SYMBOL ;
- : BR[] .ME NEXTB H. ;
-
- : ExS ( op -- n )
- DUP 15 ANDD
- CASE 0 OF DJNZ ENDOF
- 1 OF DJNZW ENDOF
- 3 OF BR[] ENDOF
- 7 OF LJMP ENDOF
- 15 OF LCALL ENDOF
- DROP .N
- ENDCASE ;
-
- : MUL3 .ME .MUL3 ;
- : MULB3 .ME .MULB3 ;
- : MUL .ME .MUL ;
- : MULB .ME .MULB ;
- : DIV .ME .DIV ;
- : DIVB .ME .DIVB ;
-
- : FEs NEXTB $FC ANDD
- CASE
- $4C OF MUL3 ENDOF
- $5C OF MULB3 ENDOF
- $6C OF MUL ENDOF
- $7C OF MULB ENDOF
- $8C OF DIV ENDOF
- $9C OF DIVB ENDOF
- DROP ENDCASE ;
-
- .SELF RET .SELF F1S .SELF PUSHF .SELF POPF .SELF PUSHA .SELF POPA
- .SELF TRAP .SELF CLRC .SELF SETC .SELF DI .SELF EI .SELF CLRVT
- .SELF NOP .SELF RST
-
- : IDLPD .ME NEXTB H. ;
-
- : FxS ( op -- op )
- DUP 15 ANDD
- EXEC: RET F1S PUSHF POPF PUSHA POPA IDLPD TRAP
- CLRC SETC DI EI CLRVT NOP FEs RST ;
-
- : .INST ( op -- op )
- 255 ANDD DUP 4 2/S
- EXEC: 0xS 1xS 2xS 3xS 4xS 5xS 6xS 7xS
- 8xS 9xS AxS BxS CxS DxS ExS FxS ;
-
- : INST \ display opcode at ip advancing as needed
- 2 SPACES
- NEXTB .INST DROP
- ;
- : DIS ( a l -- ) \ disassemble from address a, length l words
- CR
- over CP !
- +
- save> base hex
- BEGIN cp @ 4 u.r
- cp @ dt@ 8 u.r cp @ 1+ dt@ 6 u.r
- 2 spaces INST
- cr
- cp @ over >= until
- drop
- restore> base
- ;
-
- : fdis ( | filename -- )
- gfl bl word $file ?open.error \ open the file
- seqhandle endfile \ get file length
- $100 m/mod ( r q ) \ number of $100 byte segments
- 0 0 seqhandle movepointer \ reset to beginning of file
- off> pad= 0 cp !
- 0 do
- pad $100 seqhandle hread drop \ read and
- cp @ $80 dis \ disassemble $100 byte segments
- $100 +!> pad=
- loop
- pad over seqhandle hread drop \ read and
- 2/ cp @ swap dis \ disassemble the rest
- off> pad=
- ;
-
- : target ['] TC@ IS dTC@ ; \ disassemble from target memory
- target
-
-
- : dis-hello
- defers .hello
- only forth definitions also distarget also forth ;
- ' dis-hello is .hello
-
- ALSO FORTH DEFINITIONS
-
-
-