home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / tcom96 / debugger / dis8096.seq < prev    next >
Encoding:
Text File  |  1991-03-26  |  10.1 KB  |  374 lines

  1. \\ DIS8096.SEQ disasembler for 8096 by Mike Mayo,
  2. \   based on DIS8086.SEQ   8086 Disassembler  by Charles Curley
  3. ─────────────────────────────────────────────────────────────────────────────
  4. $Header:   F:/tcom96/debugger/logs/dis8096.sev   1.5   23 Apr 1991 11:02:58   MikeM  $
  5. ─────────────────────────────────────────────────────────────────────────────
  6. ─────────────────────────────────────────────────────────────────────────────
  7. $Log:   F:/tcom96/debugger/logs/dis8096.sev  $
  8. \    Rev 1.5   23 Apr 1991 11:02:58   MikeM
  9. ─────────────────────────────────────────────────────────────────────────────
  10. {
  11.   PREFIX  \ Conversion by  Bill Muench  9 September 88  Fixes
  12.  
  13. forth definitions  decimal
  14. anew distarg96words
  15. warning off
  16.  
  17. vocabulary distarget
  18.  
  19. : h.4 ( n -- ) \ display n in four digit hex
  20.         $10 save!> base
  21.         0 <# # # # # #> type space
  22.         restore> base ;
  23.  
  24. : sp>col ( n -- ) \ output spaces to column n
  25.         #out @ - 0max spaces ;
  26.  
  27. CODE 2/S ( n ct - n') \ shift n right by ct bits
  28.         POP CX
  29.         POP AX
  30.         SHR AX, CL
  31.         1PUSH
  32.         END-CODE
  33.  
  34. CODE SEXT ( n - n' ) \ sign extend byte to word
  35.         POP AX
  36.         CBW
  37.         1PUSH
  38.         END-CODE
  39.  
  40. DIStarget DEFINITIONS
  41.  
  42. \ Avoid name conflicts
  43. : ANDD AND ;
  44. : ORR  OR ;
  45. : XORR XOR ;
  46. : NOTT NOT ;
  47.  
  48. 0 value pad=
  49. : (dTC@) ( a - n ) 2* pad + pad= - c@ ;
  50. : (dT@)  ( a - n ) 2* pad + pad= - @  ;
  51.  
  52. DEFER dTC@ ( a - n )         \ deferred byte fetch of memory to disassemble
  53. DEFER dT@ ( a - n )          \ deferred word fetch of memory to disassemble
  54. : MEMORY
  55.         ['] (dTC@) IS dTC@
  56.         ['] (dT@)  IS dT@
  57.         ;
  58.  
  59.  
  60. \ Stuff for displaying opcode names
  61.  
  62. : .ID| ( nf -- )  \ show the name pointed to by nf without trailing space
  63.         DUP 1+ DUP YC@ ROT YC@ 31 AND
  64.         0  ?DO  DUP 127 AND FEMIT
  65.                 128 AND IF  ASCII _ 128 OR  ELSE  1+ DUP YC@  THEN
  66.                 LOOP
  67.         2DROP ;
  68.  
  69. : ID.L ( a -- ) \ show the name pointed to by nf in an 8-column field
  70.         #OUT @ SWAP .ID| #OUT @ - 8 + SPACES ;
  71. : .SELF ( -- ) \ defines a word that types out it's name
  72.         CREATE LAST @ , DOES> @ .ID| ;
  73. : SELF.L ( -- ) \ defines a word that types out it's name
  74.                 \ left-justified in 8 columns
  75.         CREATE LAST @ , DOES> @ ID.L ;
  76. : .ME ( -- ) \ print name of word that calls this
  77.         LAST @ [COMPILE] LITERAL COMPILE ID.L ;     IMMEDIATE
  78.  
  79. : .SYMBOL   H.  ;
  80.  
  81. VARIABLE CP
  82. : NEXTB ( - n ) CP @ dTC@   1 CP +! ;   \ get the next byte to disassemble
  83. : NEXTW ( - w ) NEXTB NEXTB 256 * + ;   \ get the next word to disassemble
  84.  
  85. : .N ( op -- op ) \ show number of unknown opcode
  86.         ." ?"  dup h.  ;
  87.  
  88. 0 VALUE AMODE
  89. : .MODE ( op -- op ) \ pick out address mode bits
  90.         DUP 3 ANDD !> AMODE   ;
  91. \        ."  amode" AMODE .   ;
  92.  
  93. : .WREG  ." w." NEXTB H.  ;
  94. : .BREG  ." b." NEXTB H.  ;
  95. : .LREG  ." L." NEXTB H.  ;
  96.  
  97. : .IMMW   ." #"  NEXTW H. ;
  98. : .IMMB   ." #"  NEXTB H. ;
  99.  
  100. : .INDIRECT
  101.         NEXTB DUP
  102.         1 AND IF  ." [" 1- H. ." ]+, "
  103.             ELSE  ." [" H. ." ], "
  104.             THEN
  105.         ;
  106.  
  107. : .INDEXED
  108.         ." [" NEXTB DUP $FE AND H. ." ] +"
  109.         1 AND IF  NEXTW
  110.             ELSE  NEXTB
  111.             THEN
  112.         H. ." , " ;
  113.  
  114. : .WAOP   AMODE EXEC: .WREG  .IMMW  .INDIRECT  .INDEXED  ;
  115.  
  116. : .BAOP   AMODE EXEC: .BREG  .IMMB  .INDIRECT  .INDEXED  ;
  117.  
  118.  
  119. : SKIP   .ME  .BREG  ;
  120. : CLR    .ME  .WREG  ;
  121. : NOT    .ME  .WREG  ;
  122. : NEG    .ME  .WREG  ;
  123. : DEC    .ME  .WREG  ;
  124. : EXT    .ME  .LREG  ;
  125. : INC    .ME  .WREG  ;
  126. : SHR    .ME  .BREG  .WREG  ;
  127. : SHL    .ME  .BREG  .WREG  ;
  128. : SHRA   .ME  .BREG  .WREG  ;
  129. : SHRL   .ME  .BREG  .LREG  ;
  130. : SHLL   .ME  .BREG  .LREG  ;
  131. : SHRAL  .ME  .BREG  .LREG  ;
  132. : NORML  .ME  .BREG  .LREG  ;
  133.  
  134. : 0xS ( op -- n ) \
  135.         DUP 15 ANDD
  136.         EXEC:  SKIP  CLR  NOT  NEG  .N    DEC   EXT    INC
  137.                SHR   SHL  SHRA  .N  SHRL  SHLL  SHRAL  NORML  ;
  138.  
  139. : CLRB   .ME  .BREG  ;
  140. : NOTB   .ME  .WREG  ;
  141. : NEGB   .ME  .BREG  ;
  142. : DECB   .ME  .BREG  ;
  143. : EXTB   .ME  .WREG  ;
  144. : INCB   .ME  .BREG  ;
  145. : SHRB   .ME  .BREG  .BREG  ;
  146. : SHLB   .ME  .BREG  .BREG  ;
  147. : SHRAB  .ME  .BREG  .BREG  ;
  148.  
  149. : 1xS ( op -- n ) \
  150.         DUP 15 ANDD
  151.         EXEC:  .N    CLRB  NOTB   NEGB  .N  DECB  EXTB  INCB
  152.                SHRB  SHLB  SHRAB  .N    .N  .N    .N    .N   ;
  153.  
  154. : SJMP    .ME  DUP 7 AND 256 *  NEXTB + SEXT  CP @ +  .SYMBOL  ;
  155. : SCALL   .ME  DUP 7 AND 256 *  NEXTB + SEXT  CP @ +  .SYMBOL  ;
  156.  
  157. : 2xS ( op -- n ) \
  158.         DUP $28 < IF SJMP ELSE SCALL THEN ;
  159.  
  160. : JBC   .ME  DUP 7 AND .  .BREG  NEXTB SEXT  CP @ +  .SYMBOL  ;
  161. : JBS   .ME  DUP 7 AND .  .BREG  NEXTB SEXT  CP @ +  .SYMBOL  ;
  162.  
  163. : 3xS ( op -- n ) \
  164.         DUP $38 < IF JBC ELSE JBS THEN ;
  165.  
  166. : .MUL3   .MODE  .WAOP  ." s" .WREG  ." d" .LREG  ;
  167. : .MULB3  .MODE  .BAOP  ." s" .BREG  ." d" .WREG  ;
  168. : .MUL    .MODE  .WAOP  .LREG ;
  169. : .MULB   .MODE  .BAOP  .WREG ;
  170. : .DIV    .MODE  .WAOP  .LREG ;
  171. : .DIVB   .MODE  .BAOP  .WREG ;
  172.  
  173. : MULU3   .ME .MUL3 ;
  174. : MULUB3  .ME .MULB3 ;
  175. : MULU    .ME .MUL  ;
  176. : MULUB   .ME .MULB ;
  177. : DIVU    .ME .DIV  ;
  178. : DIVUB   .ME .DIVB ;
  179.  
  180. : AND3   .ME .MODE .WAOP ." s" .WREG ." d" .WREG ;
  181. : ADD3   .ME .MODE .WAOP ." s" .WREG ." d" .WREG ;
  182. : SUB3   .ME .MODE .WAOP ." s" .WREG ." d" .WREG ;
  183.  
  184. : 4xS ( op -- n ) \
  185.         DUP 15 ANDD 2/ 2/
  186.         EXEC:  AND3  ADD3  SUB3  MULU3  ;
  187.  
  188. : ANDB3   .ME .MODE .BAOP ." s" .BREG ." d" .BREG ;
  189. : ADDB3   .ME .MODE .BAOP ." s" .BREG ." d" .BREG ;
  190. : SUBB3   .ME .MODE .BAOP ." s" .BREG ." d" .BREG ;
  191.  
  192. : 5xS ( op -- n ) \
  193.         DUP 15 ANDD 2/ 2/
  194.         EXEC:  ANDB3  ADDB3  SUBB3  MULUB3  ;
  195.  
  196. : AND   .ME .MODE .WAOP .WREG ;
  197. : ADD   .ME .MODE .WAOP .WREG ;
  198. : SUB   .ME .MODE .WAOP .WREG ;
  199.  
  200. : 6xS ( op -- n ) \
  201.         DUP 15 ANDD 2/ 2/
  202.         EXEC:  AND  ADD  SUB  MULU  ;
  203.  
  204. : ANDB   .ME .MODE .BAOP .BREG ;
  205. : ADDB   .ME .MODE .BAOP .BREG ;
  206. : SUBB   .ME .MODE .BAOP .BREG ;
  207.  
  208. : 7xS ( op -- n ) \
  209.         DUP 15 ANDD 2/ 2/
  210.         EXEC:  ANDB  ADDB  SUBB  MULUB  ;
  211.  
  212. : OR    .ME .MODE .WAOP .WREG ;
  213. : XOR   .ME .MODE .WAOP .WREG ;
  214. : CMP   .ME .MODE .WAOP .WREG ;
  215.  
  216. : 8xS ( op -- n ) \
  217.         DUP 15 ANDD 2/ 2/
  218.         EXEC:  OR  XOR  CMP  DIVU  ;
  219.  
  220. : ORB    .ME .MODE .BAOP .BREG ;
  221. : XORB   .ME .MODE .BAOP .BREG ;
  222. : CMPB   .ME .MODE .BAOP .BREG ;
  223.  
  224. : 9xS ( op -- n ) \
  225.         DUP 15 ANDD 2/ 2/
  226.         EXEC:  ORB  XORB  CMPB  DIVUB  ;
  227.  
  228. : LD     .ME .MODE .WAOP .WREG ;
  229. : ADDC   .ME .MODE .WAOP .WREG ;
  230. : SUBC   .ME .MODE .WAOP .WREG ;
  231. : LDBZE  .ME .MODE .BAOP .WREG ;
  232.  
  233. : AxS ( op -- n ) \
  234.         DUP 15 ANDD 2/ 2/
  235.         EXEC:  LD  ADDC  SUBC  LDBZE    ;
  236.  
  237. : LDB    .ME .MODE .BAOP .BREG ;
  238. : ADDCB  .ME .MODE .BAOP .BREG ;
  239. : SUBCB  .ME .MODE .BAOP .BREG ;
  240. : LDBSE  .ME .MODE .BAOP .WREG ;
  241.  
  242. : BxS ( op -- n ) \
  243.         DUP 15 ANDD 2/ 2/
  244.         EXEC:  LDB  ADDCB  SUBCB  LDBSE    ;
  245.  
  246.  
  247. : BMOV  .ME         .WREG  .LREG  ;
  248. : ST    DUP $C1 = IF  BMOV
  249.                 ELSE  .ME  .MODE  .WAOP  .WREG
  250.                 THEN  ;
  251. : CMPL  .ME         .LREG  .LREG  ;
  252. : STB   DUP $C5 = IF  CMPL
  253.                 ELSE  .ME  .MODE  .BAOP  .BREG
  254.                 THEN  ;
  255. : PUSH  .ME  .MODE  .WAOP         ;
  256. : POP   .ME  .MODE  .WAOP         ;
  257.  
  258. : CxS ( op -- n ) \
  259.   DUP 15 ANDD  2/ 2/
  260.   EXEC:  ST  STB  PUSH  POP  ;
  261.  
  262.  
  263. SELF.L JNST SELF.L JNH  SELF.L JGT  SELF.L JNC
  264. SELF.L JNVT SELF.L JNV  SELF.L JGE  SELF.L JNE
  265. SELF.L JST  SELF.L JH   SELF.L JLE  SELF.L JC
  266. SELF.L JVT  SELF.L JV   SELF.L JLT  SELF.L JE
  267.  
  268. : .BR| ( op -- op )
  269.         DUP  15 ANDD
  270.   EXEC: JNST JNH JGT JNC JNVT JNV JGE JNE JST JH JLE JC JVT JV JLT JE ;
  271.  
  272. : DxS ( op --op ) \ D0-DF branch & dest
  273.         .BR|  NEXTB SEXT CP @ + .SYMBOL ;
  274.  
  275.  
  276. : LCALL   .ME  NEXTW  CP @ +  .SYMBOL  ;
  277. : LJMP    .ME  NEXTW  CP @ +  .SYMBOL  ;
  278.  
  279. : DJNZ    .ME  NEXTB H.  NEXTB SEXT CP @ +  .SYMBOL  ;
  280. : DJNZW   .ME  NEXTB H.  NEXTB SEXT CP @ +  .SYMBOL  ;
  281. : BR[]    .ME  NEXTB H. ;
  282.  
  283. : ExS ( op -- n )
  284.         DUP 15 ANDD
  285.         CASE  0 OF DJNZ ENDOF
  286.               1 OF DJNZW ENDOF
  287.               3 OF BR[] ENDOF
  288.               7 OF LJMP ENDOF
  289.               15 OF LCALL ENDOF
  290.               DROP .N
  291.         ENDCASE ;
  292.  
  293. : MUL3   .ME .MUL3 ;
  294. : MULB3  .ME .MULB3 ;
  295. : MUL    .ME .MUL  ;
  296. : MULB   .ME .MULB ;
  297. : DIV    .ME .DIV  ;
  298. : DIVB   .ME .DIVB ;
  299.  
  300. : FEs   NEXTB $FC ANDD
  301.         CASE
  302.         $4C OF MUL3  ENDOF
  303.         $5C OF MULB3 ENDOF
  304.         $6C OF MUL  ENDOF
  305.         $7C OF MULB ENDOF
  306.         $8C OF DIV  ENDOF
  307.         $9C OF DIVB ENDOF
  308.         DROP ENDCASE  ;
  309.  
  310. .SELF RET .SELF F1S .SELF PUSHF .SELF POPF .SELF PUSHA .SELF POPA
  311. .SELF TRAP .SELF CLRC .SELF SETC .SELF DI .SELF EI .SELF CLRVT
  312. .SELF NOP .SELF RST
  313.  
  314. : IDLPD   .ME  NEXTB H.  ;
  315.  
  316. : FxS ( op -- op )
  317.   DUP 15 ANDD
  318.   EXEC: RET  F1S  PUSHF POPF  PUSHA POPA IDLPD TRAP
  319.         CLRC SETC DI    EI    CLRVT NOP  FEs   RST  ;
  320.  
  321. : .INST ( op -- op )
  322.   255 ANDD DUP 4 2/S
  323.   EXEC: 0xS 1xS 2xS 3xS 4xS 5xS 6xS 7xS
  324.         8xS 9xS AxS BxS CxS DxS ExS FxS ;
  325.  
  326. : INST \ display opcode at ip  advancing as needed
  327.         2 SPACES
  328.         NEXTB .INST DROP
  329.         ;
  330. : DIS ( a l -- ) \ disassemble from address a, length l words
  331.         CR
  332.         over CP !
  333.         +
  334.         save> base  hex
  335.         BEGIN   cp @ 4 u.r
  336.                         cp @ dt@ 8 u.r  cp @ 1+ dt@ 6 u.r
  337.                 2 spaces  INST
  338.                 cr
  339.                 cp @ over >= until
  340.         drop
  341.         restore> base
  342.         ;
  343.  
  344. : fdis ( | filename -- )
  345.         gfl bl word $file ?open.error   \ open the file
  346.         seqhandle endfile               \ get file length
  347.         $100 m/mod             ( r q )  \ number of $100 byte segments
  348.         0 0 seqhandle movepointer       \ reset to beginning of file
  349.         off> pad=  0 cp !
  350.         0 do
  351.                 pad $100 seqhandle hread drop  \ read and
  352.                 cp @ $80 dis            \ disassemble $100 byte segments
  353.                 $100 +!> pad=
  354.           loop
  355.         pad over seqhandle hread drop   \ read and
  356.         2/ cp @ swap dis                \ disassemble the rest
  357.         off> pad=
  358.         ;
  359.  
  360. : target  ['] TC@ IS dTC@  ; \ disassemble from target memory
  361. target
  362.  
  363.  
  364. : dis-hello
  365.         defers .hello
  366.         only forth definitions also distarget also forth ;
  367. ' dis-hello is .hello
  368.  
  369. ALSO FORTH DEFINITIONS
  370.  
  371.  
  372.