home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-09-30 | 52.7 KB | 1,757 lines |
- \ Dasm386.Seq 80386/80386SX Disassembler
-
- Comment:
-
- \ Pasm386.seq Version 1.0
- \
- \ Updated 30 Sep 89, Gene Czarcinski
- \ - Enhance to support 386 opcodes (for PASM386)
- \ - restructure source to make it more readable
- \ and updatable.
- \ - Add support for the 8087/80287/80387
- \ - Add support for Extended Size Registers and operands.
- \ - Add support for Extended Addressing Size (32 bit, etc.)
- \ including new base/index registers, "scaling", and
- \ 32-bit displacement/addresses.
- \ - add BEHEADing
-
- ** Note: The "code error checking" in this disassembler is NOT
- complete. That is, a correct program (no bad opcodes or
- options) will be correct but incorrect opcodes, etc. may
- NOT be interpreted correctly. For example, currently
- invalid 386 control registers are defined as correct.
-
- ** Note: Pasm386 does NOT need a 286 or 386 to load and execute.
-
-
- \ DIS8086.SEQ 8086 Disassembler by Charles Curley
-
- PREFIX \ Conversion by Bill Muench 9 September 88 Fixes
-
- \ More 'Not Used' Trapped
- \ XCHGA for NOP FES for 8reg INC DEC
- \ REP REPNE MUL/DIV POP CS ESC
-
- Comment;
-
- \ ===========================================================================
- \ ===========================================================================
-
- ONLY FORTH ALSO DEFINITIONS
-
- DECIMAL
- WARNING OFF
- PreFix
-
- VOCABULARY DASM386
-
- Dasm386 also Definitions
-
- HEADERLESS \ ***********************************************************
-
- \ ===========================================================================
- \ ===========================================================================
-
- \ For Speed:
-
- CODE 2/S ( n ct - n'| shift n right ct )
- POP CX
- POP AX
- SHR AX, CL
- 1PUSH
- END-CODE
-
- CODE 2*S ( n ct - n'| shift n left ct )
- POP CX
- POP AX
- SHL AX, CL
- 1PUSH
- END-CODE
-
- CODE SEXT ( n - n' | sign extend byte to word )
- POP AX
- CBW
- 1PUSH
- END-CODE
-
- \ Locate existing INTerrupts
-
- CODE #INT2@ ( int# - seg off )
- POP AX \ int#
- MOV AH, # $35 \ cmd
- PUSH ES \ save ES
- INT $21 \ DOS
- POP AX \ get ES
- PUSH ES \ seg
- PUSH BX \ off
- MOV ES, AX \ restore ES
- NEXT
- END-CODE
-
- \ ===========================================================================
-
- : (.H2) ( n -- ) \ 2 hex digits
- 0 <# # # #>
- type ;
-
- : .H2 (.H2) space ;
-
- : (.H4) ( n -- ) \ 4 hex digits
- 0 <# # # # # #>
- type ;
-
- : .H4 (.H4) space ;
-
- : COL ( n )
- dup #OUT @ <= if CR then
- #OUT @ - SPACES ;
-
- VARIABLE SYMBOLIC \ Show registers as FORTH registers
- SYMBOLIC ON
-
- VARIABLE ID0 \ DisAssembly NAME delay in ms
- 700 ID0 !
-
- Variable Osize \ Operand Size Flag
- Osize off
-
- Variable Asize \ Address Size Flag
- Asize off
-
- VARIABLE CP \ Current Pointer to Instruction "data" being processed
- VARIABLE OPS \ operand count
- VARIABLE DISP \ 2nd operand ext, flag, ct
-
- \ ===========================================================================
-
- : .NA ( n ) \ unknown opcode
- ." ??? " .h2 ;
-
- : .NA0 ( n - n ) \ more of unknown opcode
- DUP .NA ;
-
- : .NA1 ( op ext ) \ unknown "sub" opcode
- SWAP .NA .h2 ;
-
- : .NA2 ( op1 op2 ext ) \ unknown "sub" opcode
- rot .NA
- swap .h2 .h2 ;
-
- \ Avoid name conflicts *************************
-
- : LOOPP [COMPILE] LOOP ; IMMEDIATE
-
- : LEAVEE [COMPILE] LEAVE ; Immediate
-
- : ANDD AND ;
-
- : ORR OR ;
-
- : XORR XOR ;
-
- : NOTT NOT ;
-
- : Osize@ Osize @ ;
-
- : Asize@ Asize @ ;
-
- : T@ ( a - w )
- DUMPSEG @ swap @L ;
-
- : TC@ ( a - n )
- DUMPSEG @ swap C@L ;
-
- : NEXTB ( - n ) \ get next byte, bump current-pointer
- CP @ TC@ 1 CP +! ;
-
- : NEXTW ( - w ) \ get next word, bump current-pointer
- CP @ T@ 2 CP +! ;
-
- \ ===========================================================================
-
- : DUMP| ( a n )
- BOUNDS DO
- I TC@ .h2
- LOOPP ;
-
- : %type ( a n )
- BOUNDS DO
- I TC@
- DUP
- $7F $20
- OVER - >R - R>
- U< IF
- DROP ASCII ~
- THEN
- EMIT
- LOOPP ;
-
- \ ===========================================================================
-
- : .#
- ." # " ;
-
- : .,
- ." , " ;
-
- : ?., ( op - op )
- DUP $0C7 ANDD 6
- <> IF
- .,
- THEN ;
-
- : .FAR
- ." FAR " ;
-
- \ ===========================================================================
-
- : NULL ;
-
- : .ID| ( nf \ no 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 )
- #OUT @ SWAP
- .ID|
- #OUT @ - 8 +
- SPACES ;
-
- : SELF.L ( Left Justified Self-doc! )
- CREATE
- LAST @ ,
- DOES>
- @ ID.L ;
-
- : .SELF ( Self-doc! )
- CREATE
- LAST @ ,
- DOES>
- @ .ID| ;
-
-
- \ ===========================================================================
-
- HEADERS \ ***********************************************************
-
- \ Register Definitions
-
- .self EAX .self EBX .self ECX .self EDX
- .self ESI .self EDI .self ESP .self EBP
- .self CR0 .self CR1 .self CR2 .self CR3
- .self CR4 .self CR5 .self CR6 .self CR7
- .self DR0 .self DR1 .self DR2 .self DR3
- .self DR4 .self DR5 .self DR6 .self DR7
- .self TR0 .self TR1 .self TR2 .self TR3
- .self TR4 .self TR5 .self TR6 .self TR7
-
- .self ST
- .self ST(0) .self ST(1) .self ST(2) .self ST(3)
- .self ST(4) .self ST(5) .self ST(6) .self ST(7)
-
- .self ES .self CS .self SS .self DS
- .self FS .self GS
-
- .SELF AL .SELF AX .SELF [BX+SI] .self [EAX]
- .SELF CL .SELF CX .SELF [BX+DI] .self [ECX]
- .SELF DL .SELF DX .SELF [BP+SI] .self [EDX]
- .SELF BL .SELF BX .SELF [BP+DI] .self [EBX]
- .SELF AH .SELF SP .SELF [SI]
- .SELF CH .SELF BP .SELF [DI] .self [EBP]
- .SELF DH .SELF SI .SELF [BP] .self [ESI]
- .SELF BH .SELF DI .SELF [BX] .self [EDI]
-
- .self *1 .self *2 .self *4 .self *8
- .SELF BYTE .SELF WORD .self DWORD
- .self BCD .self REAL*4 .self REAL*8 .self REAL_TEMP
- .self Integer*2 .self Integer*4 .self Integer*8
-
- \ ===========================================================================
-
- \ Instruction Opcode Mnemonics
-
- self.l FADD self.l FMUL self.l FCOM self.l FCOMP
- self.l FSUB self.l FSUBR self.l FDIV self.l FDIVR
- self.l FUCOM self.l FUCOMP self.l FUCOMPP
- self.l FSUBRP self.l FSUBP self.l FDIVRP self.l FDIVP
- self.l FADDP self.l FMULP self.l FCOMPP
- self.l FCLEX self.l FINIT
- self.l FENI self.l FDISI self.l FSETPM self.l FFREEP
- self.l FFREE self.l FXCH self.l FST self.l FSTP
- self.l FLD self.l FNOP self.l FSAVE self.l FSTSW
- self.l FCHS self.l FABS self.l FTST self.l FXAM
- self.l FLD1 self.l FLDL2T self.l FLDL2E self.l FLDPI
- self.l FLDLG2 self.l FLDLN2 self.l FLDZ self.l FRSTOR
- self.l F2XM1 self.l FYL2X self.l FPTAN self.l FPATAN
- self.l FXTRACT self.l FPREM1 self.l FDECSTP self.l FINCSTP
- self.l FPREM self.l FYL2XP1 self.l FSQRT self.l FSINCOS
- self.l FRNDINT self.l FSCALE self.l FSIN self.l FCOS
- self.l FLDENV self.l FLDCW self.l FSTENV self.l FSTCW
-
- self.l CLTS
- self.l SGDT self.l SIDT
- self.l LGDT self.l LIDT
- self.l SMSW self.l LMSW
- self.l SLDT self.l STR
- self.l LLDT self.l LTR
- self.l VERR self.l VERW
-
- self.l LSS self.l LFS self.l LGS
- self.l BSF self.l BSR
- self.l BT self.l BTS
- self.l BTR self.l BTC
- self.l MOVSX self.l MOVZX
- self.l SHLD self.l SHRD
-
- self.l INS self.l OUTS
- self.l BOUND self.l ARPL
- SELF.L LES SELF.L LDS
- SELF.L INTO SELF.L IRET
- SELF.L ENTER SELF.L LEAVE
-
- SELF.L JA SELF.L JAE SELF.L JB SELF.L JBE
- SELF.L JE SELF.L JG SELF.L JGE SELF.L JL
- SELF.L JLE SELF.L JNE SELF.L JNO SELF.L JNS
- SELF.L JO SELF.L JPE SELF.L JPO SELF.L JS
-
- SELF.L SETA SELF.L SETAE SELF.L SETB SELF.L SETBE
- SELF.L SETE SELF.L SETG SELF.L SETGE SELF.L SETL
- SELF.L SETLE SELF.L SETNE SELF.L SETNO SELF.L SETNS
- SELF.L SETO SELF.L SETPE SELF.L SETPO SELF.L SETS
-
- self.l AAM self.l AAD self.l XLAT
- SELF.L XCHG SELF.L CBW SELF.L CWD
- SELF.L JMP SELF.L CALL
- SELF.L WAIT SELF.L PUSHF SELF.L POPF SELF.L SAHF
- SELF.L LAHF SELF.L TEST
- self.l MOVS self.l CMPS self.l STOS self.l LODS
- self.l SCAS
- self.l RET self.l INT
- SELF.L IN SELF.L OUT
- SELF.L LOOPE SELF.L LOOP SELF.L LOOPNE
- self.l JCXZ self.l JECXZ
- SELF.L NOT SELF.L NEG SELF.L MUL SELF.L IMUL
- SELF.L DIV SELF.L IDIV SELF.L REP SELF.L REPNE
- SELF.L LOCK SELF.L HLT SELF.L CMC
- SELF.L CLC SELF.L STC SELF.L CLI SELF.L STI
- SELF.L CLD SELF.L STD
- self.l LAR self.l LSL
-
- SELF.L DAA SELF.L DAS SELF.L AAA SELF.L AAS
- SELF.L ADD SELF.L ADC SELF.L AND SELF.L XOR
- SELF.L OR SELF.L SBB SELF.L SUB SELF.L CMP
- SELF.L ROL SELF.L ROR SELF.L RCL SELF.L RCR
- SELF.L SHL SELF.L SHR SELF.L SAR
- self.l INC self.l DEC
- SELF.L LEA SELF.L MOV
-
- self.l PUSH self.l POP SELF.L PUSHA SELF.L POPA
-
- \ ===========================================================================
-
- SELF.L NEXT SELF.L 1PUSH SELF.L 2PUSH
- SELF.L BRAN1 SELF.L PLOOP
-
-
- HEADERLESS \ ***********************************************************
-
- \ ===========================================================================
-
- : ?DISP ( op ext - op ext | ?MOD disp )
- DUP 6 2/S ?DUP
- 0= IF ( MOD=0 )
- DUP 7 ANDD ( ?R/M )
- 6 = 2 ANDD
- THEN
- DUP 3 = IF ( MOD=3 )
- DROP 0
- THEN
- DISP ! ;
-
- CREATE SYMBOLS ASSEMBLER
- >NEXT ,
- >NEXT 1- ,
- >NEXT 2- ,
- ' BRANCH >BODY ,
- ' (LOOP) 5 + ,
-
- HERE SYMBOLS - 2/ CONSTANT SYMBOLCT
-
- : ?SYMBOL ( a - a ? | if n = -1 no symbol else index )
- TRUE
- DUMPSEG @ ?CS: =
- SYMBOLIC @ 0<>
- ANDD IF
- SYMBOLCT 0 DO ( if in code segment )
- OVER I 2*
- SYMBOLS +
- @ = IF
- DROP
- I
- LEAVEE
- THEN
- LOOPP
- THEN ;
-
- : .SYMBOL ( a | name or value )
- ?SYMBOL DUP 0< IF
- DROP .H4
- EXIT
- THEN
- NIP
- EXEC: NEXT 1PUSH 2PUSH BRAN1 PLOOP ;
-
- : .SIZE ( op )
- 1 ANDD Osize@ 2 ANDD ORR Exec:
- BYTE WORD
- BYTE DWORD ;
-
- : .memSIZE ( op ext -- op ext )
- dup $C0 ANDD $C0 <> if
- over .SIZE space
- then ;
-
- : .WORD/DWORD ( -- )
- Osize@ if DWORD else WORD then
- space ;
-
- : .8REG ( ext )
- 7 ANDD
- EXEC: AL CL DL BL AH CH DH BH ;
-
- : .16REG ( ext )
- 7 ANDD Osize@ $08 ANDD ORR
- EXEC: AX CX DX BX SP BP SI DI
- EAX ECX EDX EBX ESP EBP ESI EDI ;
-
- : .R8/16 ( op ext )
- SWAP 1 ANDD
- EXEC: .8REG .16REG ;
-
- : .R/M ( op ext - op ext )
- 2DUP
- .R8/16 ;
-
- : .REG ( op ext - op ext )
- 2DUP 3 2/S
- .R8/16 ;
-
- : .AL/X ( op )
- 1 ANDD Osize@ 2 ANDD ORR
- EXEC: AL AX AL EAX ;
-
- \ ===========================================================================
-
- : 0DISP ." 0 " ;
-
- : BDISP \ byte displacement
- CP @ DISP @ +
- TC@
- 1 OPS +!
- .h2 ;
-
- : WDISP \ word displacement
- CP @ DISP @ +
- T@ .H4
- 2 OPS +! ;
-
- : DDISP \ word displacement
- CP @ DISP @ + dup
- T@
- swap 2 +
- T@
- .H4 .H4
- 4 OPS +! ;
-
- \ ===========================================================================
-
- : .DISP ( op ext - op ext )
- DUP 6 2/S 3 ANDD
- EXEC: 0DISP BDISP WDISP .R/M ;
-
- : .DISP32 ( op ext - op ext )
- 6 2/S 3 ANDD
- EXEC: 0DISP BDISP DDISP .R/M ;
-
- \ ===========================================================================
-
- : BIMM ( byte immediate )
- .#
- CP @ DISP @ +
- TC@
- 1 OPS +!
- .h2 ;
-
- : WIMM ( word immediate )
- .#
- CP @ DISP @ +
- T@
- Osize@ if
- CP @ DISP @ + 2 +
- T@ .H4
- 2 OPS +!
- then
- .H4
- 2 OPS +! ;
-
- : .IMM ( op )
- 1 ANDD IF
- WIMM
- else
- BIMM
- then ;
-
- \ ===========================================================================
-
- : .MREG32regs ( n -- )
- 7 ANDD Exec:
- [EAX] [ECX] [EDX] [EBX] NULL [EBP] [ESI] [EDI] ;
-
- : .MREG32-2 ( op ext | 2nd byte of extended addr - SSndxBASE )
- NEXTB \ SS-Index-Base
- dup $C7 ANDD 5 = if
- DDISP
- else
- over .DISP32
- dup .MREG32regs
- then
- dup 3 2/S 7 ANDD .MREG32regs
- 6 2/S 3 ANDD Exec:
- *1 *2 *4 *8 ;
-
- : .MREG32 ( op ext | 32 bit address )
- DUP $C7 ANDD 5 = IF \ MOD=0 R/M=6
- DDISP
- EXIT
- THEN
- dup $07 ANDD 4 = if
- .MREG32-2
- exit
- then
- dup .DISP32
- dup .MREG32regs ;
-
- : .MREG ( op ext - op ext | reg + disp )
- dup $C0 ANDD $C0 = IF \ MOD=3
- .R/M
- EXIT
- THEN
- Asize@ if
- .MREG32
- exit
- then
- DUP $C7 ANDD 6 = IF \ MOD=0 R/M=6
- WDISP
- EXIT
- THEN
- .DISP
- DUP 7 ANDD \ MOD=1 or 2
- EXEC: [BX+SI] [BX+DI] [BP+SI] [BP+DI] [SI] [DI] [BP] [BX] ;
-
- \ ===========================================================================
-
- : .SEG ( op )
- 3 2/S 3 ANDD
- EXEC: ES CS SS DS ;
-
- \ ===========================================================================
-
- : P/P_1 ( op )
- DUP 1 ANDD
- EXEC: PUSH POP ;
-
- : P/P ( op )
- P/P_1 .SEG ;
-
- : .ADJ ( op )
- 3 2/S 3 ANDD
- EXEC: DAA DAS AAA AAS ;
-
- : P/SEG ( op | push seg override )
- DUP 5 2/S 1 ANDD
- EXEC: P/P .na ;
-
- : P/ADJ ( op | pop adjust )
- DUP 5 2/S 1 ANDD
- EXEC: P/P .ADJ ;
-
- : .ALU ( op )
- 3 2/S 7 ANDD
- EXEC: ADD OR ADC SBB AND SUB XOR CMP ;
-
- : ALU ( op - op )
- DUP .ALU
- DUP 4 ANDD IF
- DUP .AL/X ., .IMM
- EXIT
- THEN
- NEXTB
- OVER 2 ANDD IF
- .REG ., .MREG
- ELSE
- .MREG ?., .REG
- THEN
- 2DROP ;
-
- \ ===========================================================================
-
- : 00-3F ( op - op | 00-3F )
- DUP 7 ANDD
- EXEC: ALU ALU ALU ALU ALU ALU P/SEG P/ADJ ;
-
- \ ===========================================================================
- \ ===========================================================================
-
-
- : 40-5F_1 ( op | 40-5F )
- DUP 3 2/S 3 ANDD Exec:
- INC DEC PUSH POP ;
-
- : 40-5F ( op | 40-5F )
- 40-5F_1 .16REG ;
-
- \ ===========================================================================
-
- : PUSHi
- PUSH
- dup $68 = IF
- drop Wimm
- exit
- THEN
- dup $6A = IF
- drop Bimm
- exit
- THEN
- .NA ;
-
- : Pall ( op )
- 1 ANDD Exec: PUSHA POPA ;
-
- : 6C-6D ( op )
- INS .Size ;
-
- : 6E-6F ( op )
- OUTS .Size ;
-
- : i62 ( op )
- drop BOUND
- NEXTB .MREG
- drop ;
-
- : i63 ( op )
- drop ARPL
- NEXTB .MREG
- drop ;
-
-
- : IMUL6x ( op )
- IMUL
- dup .SIZE space
- NEXTB .MREG drop
- .#
- 2 ANDD 0= if
- NEXTW
- else
- NEXTB
- then
- .H4 ;
-
- : 60-6F ( op )
- dup $0f andd Exec:
- Pall Pall
- i62 i63
- .na .na
- .na .na
- PUSHi IMUL6x
- PUSHi IMUL6x
- 6C-6D 6C-6D
- 6E-6F 6E-6F ;
-
- \ ===========================================================================
-
- : .BR| ( op )
- 15 ANDD
- EXEC: JO JNO JB JAE JE JNE JBE JA
- JS JNS JPE JPO JL JGE JLE JG ;
-
- : 70-7F ( op | 70-7F branch & dest )
- .BR|
- NEXTB SEXT CP @ + .SYMBOL ;
-
- \ ===========================================================================
-
- : 40-7F ( op | 40-7F )
- DUP 4 2/S 3 ANDD Exec:
- 40-5F \ 4x
- 40-5F \ 5x
- 60-6F \ 6x
- 70-7F ; \ 7x
-
-
- \ ===========================================================================
- \ ===========================================================================
-
- : ALU#1 ( op | 80-81 )
- NEXTB
- DUP .ALU
- .memSIZE
- .MREG ?.,
- ?DISP
- DROP
- .IMM ;
-
- : ALU#2c ( op ext )
- .NA1 ;
-
- : ALU#2b ( op ext )
- dup .ALU
- .memSIZE
- .MREG ?.,
- ?DISP BIMM
- 2DROP ;
-
- : ALU#2 ( op | 82-83 )
- NEXTB
- DUP
- 3 2/S 7 ANDD Exec:
- ALU#2b ALU#2c \ ADD, ???
- ALU#2b ALU#2b \ ADC, SBB
- ALU#2c ALU#2b \ ???, SUB
- ALU#2c ALU#2b ; \ ???, CMP
-
- \ ===========================================================================
-
-
- : 84-85 ( op | r/m reg )
- TEST
- NEXTB
- .MREG ?.,
- .REG
- 2DROP ;
-
- : 86-87 ( op | r/m reg )
- XCHG
- NEXTB
- .MREG ?.,
- .REG
- 2DROP ;
-
-
- \ ===========================================================================
-
- : MOVRM/REG ( op | 88-89 )
- MOV
- NEXTB
- .MREG ?.,
- .REG
- 2DROP ;
-
- : MOVD ( op | 8A-8B )
- MOV
- NEXTB
- .REG .,
- .MREG
- 2DROP ;
-
-
- : MOVS>M ( op | 8C-8F )
- NEXTB
- OVER $8D = IF
- LEA
- .REG .,
- .MREG
- ELSE
- OVER $8F = IF
- DUP $38 ANDD IF
- .NA1
- EXIT
- THEN
- [ ' POP >NAME ] LITERAL
- ID.L .MREG
- ELSE ( 8C 8E )
- DUP $20 ANDD IF
- .NA1
- EXIT
- THEN
- MOV SWAP 1 ORR ( Force 16bit moves only )
- SWAP OVER 2 ANDD IF ( 8E )
- DUP .SEG .,
- .MREG
- ELSE ( 8C )
- .MREG ?., DUP
- .SEG
- THEN
- THEN
- THEN
- 2DROP ;
-
-
- \ ===========================================================================
-
- : 8MOVS ( op | 80-8F )
- DUP 2/ 7 ANDD Exec:
- ALU#1 ALU#2
- 84-85 86-87
- MOVRM/REG MOVD
- MOVS>M MOVS>M ;
-
- \ ===========================================================================
-
-
- : INTER \ interseg jmp or call
- .FAR
- NEXTW
- NEXTW
- .H4
- .SYMBOL ;
-
- : CALLI ( interseg call )
- CALL
- INTER ;
-
- : XCHGA ( op | 90-97 )
- DUP $90 = IF
- ." NOP "
- DROP
- ELSE
- XCHG
- .16REG .,
- Osize@ if EAX else AX then
- THEN ;
-
- : 98-9F ( op | 98-9F )
- 7 ANDD Exec:
- CBW CWD CALLI WAIT
- PUSHF POPF SAHF LAHF ;
-
- \ ===========================================================================
-
- : 90S ( op | 90-9F )
- DUP 3 2/S 1 ANDD
- EXEC: XCHGA 98-9F ;
-
- \ ===========================================================================
-
- : A0-A3 ( op | A0-A3 )
- MOV
- DUP 2 ANDD IF
- WDISP .AL/X
- ELSE
- .AL/X ., WDISP
- THEN ;
-
- : A4-A5 ( op | A4-A5 )
- MOVS .SIZE ;
-
- : A6-A7 ( op | A6-A7 )
- CMPS .SIZE ;
-
- : A8-A9 ( op | A8-A9 )
- TEST
- DUP .AL/X ., .IMM ;
-
- : AA-AB ( op | AA-AB )
- STOS .SIZE ;
-
- : AC-AD ( op | AC-AD )
- LODS .SIZE ;
-
- : AE-AF ( op | AE-AF )
- SCAS .SIZE ;
-
- : A0S ( op | A0-AF )
- DUP 2/ 7 ANDD Exec:
- A0-A3 A0-A3 A4-A5 A6-A7
- A8-A9 AA-AB AC-AD AE-AF ;
-
- \ ===========================================================================
-
- : MOV# ( op | B0-BF )
- MOV
- DUP 8 ANDD IF
- .16REG ., WIMM
- ELSE
- .8REG ., BIMM
- THEN ;
-
- \ ===========================================================================
-
- : 80-BF ( op | 80-BF )
- DUP 4 2/S 3 ANDD Exec:
- 8MOVS \ 8x
- 90S \ 9x
- A0S \ Ax
- MOV# ; \ Bx
-
- \ ===========================================================================
- \ ===========================================================================
-
-
- : .SHIFTS ( ext )
- 3 2/S 7 ANDD
- EXEC: ROL ROR RCL RCR SHL SHR .NA0 SAR ;
-
- : Shift+Immed ( op | C0-C1 )
- NEXTB
- DUP 3 2/S 7 ANDD
- 6 = IF \ 110 is invalid
- .NA1
- EXIT
- THEN
- DUP .SHIFTS \ print opcode
- .MREG \ and operand
- 2DROP \ opcode and extension
- ., Bimm ; \ Immediate code
-
-
- : Enter/Leave ( op | C8-C9 )
- $C8 = IF \ Enter
- ENTER
- NEXTW space .H4
- NEXTB space .H2
- ELSE \ Leave
- LEAVE
- THEN ;
-
- : CxRET ( op | C2-C3 CA-CB )
- RET
- DUP 8 ANDD IF
- .FAR
- THEN
- 1 ANDD 0= IF
- WDISP ( ??? ) ." +SP"
- THEN ;
-
- : .L/L ( op )
- 1 ANDD
- EXEC: LES LDS ;
-
- : LES/LDS ( op | C4-C5 )
- DUP .L/L
- NEXTB
- .REG .,
- .MREG
- 2DROP ;
-
- : MOV#R/M ( op | C6-C7 )
- NEXTB
- DUP $38 ANDD IF
- .NA1
- EXIT
- THEN
- MOV
- .memSIZE
- .MREG ?.,
- ?DISP DROP
- .IMM ;
-
- : CC-CD ( op | CC-CD )
- INT
- 1 ANDD IF
- NEXTB
- ELSE
- 3
- THEN
- .H2 ;
-
- : INTO/IRET ( op | CE-CF )
- 1 ANDD
- EXEC: INTO IRET ;
-
- \ ===========================================================================
-
- : C0S ( op | C0-CF )
- DUP 2/ $07 ANDD Exec:
- Shift+Immed CxRET LES/LDS MOV#R/M
- Enter/Leave CxRET CC-CD INTO/IRET ;
-
- \ ===========================================================================
- \ ===========================================================================
-
- : SHIFTS ( op | D0-D3 ) \ 2-byte code, $D0-$D3 plus 2nd byte for ModnnnR/M
- NEXTB
- DUP 3 2/S 7 ANDD
- 6 = IF \ 110 is invalid
- .NA1
- EXIT
- THEN
- DUP .SHIFTS \ print opcode
- .memSIZE \ and operand size
- .MREG ?., \ and operand
- DROP
- 2 ANDD IF \ $D2 and $D3 by CL
- CL
- ELSE
- .# 1 .H2
- THEN ;
-
- : iD4 ( op | D4 ) \ ASCII adjust for multiply
- AAM NEXTB
- 2DROP ;
-
- : iD5 ( op | D5 ) \ ASCII adjust for divide
- AAD NEXTB
- 2DROP ;
-
- : iD7 ( op | D7 )
- XLAT
- DROP ;
-
- \ ===========================================================================
-
- : .ST(i) ( ext )
- dup 7 ANDD Exec:
- ST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7) ;
-
- : .ST, ST ., space ;
-
- : .ST_1 ( n )
- dup 3 2/S 7 ANDD Exec:
- .ST, .ST, NULL NULL .ST, .ST, .ST, .ST, ;
-
- : Ftype_2 ( op ext )
- dup 3 2/S 1 ANDD Exec:
- BCD Integer*8 ;
-
- : Ftype ( op ext )
- over $07 ANDD 2*
- over $20 ANDD 0<> if 1+ then
- exec:
- REAL*4 REAL*4 REAL*4 NULL
- Integer*4 Integer*4 Integer*4 REAL_TEMP
- REAL*8 REAL*8 REAL*8 NULL
- Integer*2 Integer*2 Integer*2 Ftype_2 ;
-
- : Fmath ( ext )
- dup 3 2/S 7 ANDD Exec:
- FADD FMUL FCOM FCOMP FSUB FSUBR FDIV FDIVR ;
-
- : Fxx ( op ext )
- ." F:"
- 2dup swap (.h2) ." -" (.h2) ." " ;
-
- : F0mod11 ( ext )
- Fmath .ST_1 .ST(i) ;
-
- : F1mod11 ( ext )
- dup 3 2/S 7 ANDD
- dup 0 = if drop FLD .ST(i) exit then
- dup 1 = if drop FXCH .ST(i) exit then
- dup 2 = if drop FNOP exit then
- dup 3 = if drop FSTP .ST(i) exit then
- dup $1f ANDD Exec:
- FCHS FABS Fxx Fxx FTST FXAM Fxx Fxx
- FLD1 FLDL2T FLDL2E FLDPI FLDLG2 FLDLN2 FLDZ Fxx
- F2XM1 FYL2X FPTAN FPATAN FXTRACT FPREM1 FDECSTP FINCSTP
- FPREM FYL2XP1 FSQRT FSINCOS FRNDINT FSCALE FSIN FCOS ;
-
- : F2mod11 ( ext )
- dup $E9 = if FUCOMPP exit then
- Fxx ;
-
- : F3mod11 ( ext )
- dup $E4 > if Fxx exit then
- dup $07 ANDD Exec:
- FENI FDISI FCLEX FINIT FSETPM ;
-
- : F4mod11 ( ext )
- Fmath .ST(i) ., space ST ;
-
- : F5mod11op ( n )
- Exec: FFREE FXCH FST FSTP FUCOM FUCOMP ;
-
- : F5mod11 ( ext )
- dup 3 2/S 7 ANDD
- dup 5 > if
- drop Fxx exit
- then
- F5mod11op .ST(i) ;
-
- : F6mod11P ( ext )
- dup 3 2/S 7 ANDD Exec:
- FADDP FMULP FCOMP Fxx
- FSUBP FSUBRP FDIVP FDIVRP ;
-
- : F6mod11 ( ext )
- dup $D9 = if FCOMPP exit then
- F6mod11P .st(i) ., space ST ;
-
- : F7mod11op ( n )
- Exec: FFREEP FXCH FSTP FSTP ;
-
-
- : F7mod11 ( ext )
- dup $E0 = if FSTSW AX exit then
- dup 3 2/S 7 ANDD
- dup 3 > if
- drop Fxx exit
- then
- F7mod11op .ST(i) ;
-
- : Fmod11 ( op ext )
- over 7 ANDD Exec:
- F0mod11 F1mod11 F2mod11 F3mod11
- F4mod11 F5mod11 F6mod11 F7mod11 ;
-
- : Fodd ( op ext )
- over 1 2/S 3 ANDD 3 2*S
- over 3 2/S 7 ANDD
- ORR Exec:
- FLD Fxx FST FSTP FLDENV FLDCW FSTENV FSTCW
- FLD Fxx FST FSTP Fxx FLD Fxx FSTP
- FLD Fxx FST FSTP FRSTOR Fxx FSAVE FSTSW
- FLD Fxx FST FSTP FLD FLD FSTP FSTP ;
-
- : F_387 ( op -- ) \ Floating Point CoProcessor
- NEXTB \ a 2-byte instruction
- dup $C0 ANDD $C0 = if
- Fmod11
- else
- over 1 ANDD 0= if
- Fmath
- else
- Fodd
- then
- #out @ >R
- Ftype
- #out @ R> <> if
- 2 spaces
- then
- .MREG
- then
- 2DROP ;
-
- \ ===========================================================================
-
- : D0S ( op | D0-DF )
- DUP $0F ANDD
- EXEC: SHIFTS SHIFTS SHIFTS SHIFTS
- iD4 iD5 .NA iD7
- F_387 F_387 F_387 F_387
- F_387 F_387 F_387 F_387 ;
-
- \ ===========================================================================
- \ ===========================================================================
-
- : .LOOPj Osize@ if JECXZ else JCXZ then ;
-
- : .LOOP ( op )
- 3 ANDD
- EXEC: LOOPNE LOOPE LOOP .LOOPj ;
-
- : LOOPS ( op | E0-E3 )
- .LOOP NEXTB
- SEXT CP @ + .SYMBOL ;
-
-
- : IO# ( op | E4-E7 ) \ IN/OUT with immediate port number
- DUP 2 ANDD IF
- OUT BIMM .AL/X
- EXIT
- THEN
- IN .AL/X ., BIMM ;
-
- : IOX ( op | EC-EF ) \ IN/OUT with port in DX
- DUP 2 ANDD IF
- OUT DX ., .AL/X
- EXIT
- THEN
- IN .AL/X ., DX ;
-
-
- : .CALL ( op )
- 3 ANDD
- EXEC: CALL JMP JMP JMP ;
-
- : CALLS ( op | E8-EB )
- DUP .CALL DUP
- 2 ANDD IF
- DUP 1 ANDD IF
- NEXTB SEXT CP @ + .SYMBOL
- ELSE
- INTER
- THEN
- ELSE
- NEXTW CP @ + .SYMBOL
- ( make smart about DEBUG's tricks and E0 )
- DUP $0E9 = CP @ C@
- $0E0 = ANDD IF
- 1 CP +!
- THEN
- THEN
- DROP ;
-
- \ ===========================================================================
-
- : E0S ( op | E0-EF )
- DUP 2 2/S 3 ANDD
- EXEC: LOOPS IO# CALLS IOX ;
-
- \ ===========================================================================
- \ ===========================================================================
-
-
-
-
- : F6-F7test ( op ext | F6-F7 )
- TEST
- .memSIZE
- .MREG ?.,
- ?DISP
- .IMM
- drop ;
-
-
- : .MUL/DIV ( ext )
- 3 2/S 3 ANDD
- EXEC: MUL IMUL DIV IDIV ;
-
- : MUL/DIV ( op ext | F6-F7 )
- DUP .MUL/DIV
- .memSIZE
- .MREG
- 2DROP ;
-
- : .NOT/NEG ( ext )
- 3 2/S 1 ANDD
- EXEC: NOT NEG ;
-
- : NOT/NEG ( op ext | F6-F7 )
- DUP .NOT/NEG
- .memSIZE
- .MREG
- 2DROP ;
-
- : F6-F7S ( op | F6-F7 ) \ opcode was $F6 or $F7,
- NEXTB \ look at next byte (subcode)
- DUP 3 2/S 7 ANDD
- EXEC: F6-F7test .NA1 NOT/NEG NOT/NEG
- MUL/DIV MUL/DIV MUL/DIV MUL/DIV ;
-
- \ ===========================================================================
-
- : .FES ( ext )
- 3 2/S 1 ANDD
- EXEC: INC DEC ;
-
- : FES ( op | FE ) \ opcode was $FE, look at next byte
- NEXTB
- DUP 3 2/S
- 6 ANDD IF \ only 000 and 001 are valid
- .NA1 EXIT
- THEN
- DUP
- .FES \ INC/DEC op-subcode
- .MREG \ operand
- $C0 ANDD $C0 <> IF \ size of operand
- dup space .SIZE
- THEN
- DROP ; \ done
-
- \ ===========================================================================
-
- : .FF_CALL/JMP ( ext )
- 2/ 1 ANDD
- EXEC: JMP CALL ;
-
- : FF_CALL/JMP ( op ext | FF )
- DUP 3 2/S DUP .FF_CALL/JMP
- 1 ANDD IF
- .FAR
- THEN
- .MREG 2DROP ;
-
- : FF_PUSH ( op ext | FF )
- DUP 4 ANDD IF
- PUSH .MREG 2DROP EXIT
- THEN
- .NA1 ;
-
- : .FF_INC ( op ext )
- 3 2/S 1 ANDD
- EXEC: INC DEC ;
-
- : FF_INC ( op ext | FF )
- DUP .FF_INC \ INC or DEC
- .MREG \ operand
- $C0 ANDD $C0 <> IF \ size of operand
- dup space .SIZE
- THEN
- DROP ; \ trash opcode and done
-
- : FFS ( op | FF ) \ opcode was $FF, look at next byte
- NEXTB
- DUP 4 2/S 3 ANDD
- EXEC: FF_INC FF_CALL/JMP FF_CALL/JMP FF_PUSH ;
-
- : .NAF1 ( a - a )
- DUMPSEG @ OVER C@L .NA ;
-
- : F0S ( op | F0-FF )
- DUP 15 ANDD
- DUP 7 ANDD
- 6 < IF
- NIP
- THEN
- EXEC: LOCK .NAF1 REPNE REP HLT CMC F6-F7S F6-F7S
- CLC STC CLI STI CLD STD FES FFS ;
-
- \ ===========================================================================
-
- : C0-FF ( op | C0-FF )
- DUP 4 2/S 3 ANDD Exec:
- C0S D0S E0S F0S ;
-
- \ ===========================================================================
- \ ===========================================================================
-
- : x06 ( op1 op2 | 06 )
- CLTS 2drop ;
-
- : x02_1 1 ANDD Exec: LAR LSL ;
-
- : x02 ( op1 op2 | 0f02-0f03 )
- x02_1 drop
- 1 NEXTB
- dup 3 2/S .16REG .,
- .MREG 2drop ;
-
-
- : x01_1 Exec: SGDT SIDT LGDT LIDT SMSW SMSW LMSW LMSW ;
-
- : x01 ( op1 op2 | 0f01 )
- NEXTB
- dup 3 2/S 7 ANDD
- dup 5 = IF
- drop .NA2 exit
- then
- dup 7 = if
- drop .NA2 exit
- then
- x01_1
- >r 2drop r>
- .MREG drop ;
-
-
- : x00_1 Exec: SLDT STR LLDT LTR VERR VERW VERR VERW ;
-
- : x00 ( op1 op2 | 0f00 )
- NEXTB
- dup 3 2/S 7 ANDD
- dup 6 >= IF
- drop .NA2 exit
- then
- x00_1
- >r 2drop r>
- .MREG drop ;
-
- : x00S ( op1 op2 -- )
- dup $0f ANDD Exec:
- x00 x01 x02 x02
- .na1 .na1 X06 .na1
- .na1 .na1 .na1 .na1
- .na1 .na1 .na1 .na1 ;
-
- \ ===========================================================================
-
- : .Exx 7 ANDD Exec: EAX ECX EDX EBX ESP EBP ESI EDI ;
- : .CRx 7 ANDD Exec: CR0 CR1 CR2 CR3 CR4 CR5 CR6 CR7 ;
- : .DRx 7 ANDD Exec: DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7 ;
- : .TRx 7 ANDD Exec: TR0 TR1 TR2 TR3 TR4 TR5 TR6 TR7 ;
-
- : x20 ( op1 op2 | 0f20 ) \ e.g., MOV EAX, CR0
- MOV NEXTB
- dup $C0 ANDD $C0 <> if
- .NA2 exit
- then
- dup
- .Exx
- .,
- 3 2/S .CRx
- 2drop ;
-
- : x21 ( op1 op2 | 0f21 ) \ e.g., MOV EAX, DR0
- MOV NEXTB
- dup $C0 ANDD $C0 <> if
- .NA2 exit
- then
- dup
- .Exx
- .,
- 3 2/S .DRx
- 2drop ;
-
- : x22 ( op1 op2 | 0f22 ) \ e.g., MOV CR0, EAX
- MOV NEXTB
- dup $C0 ANDD $C0 <> if
- .NA2 exit
- then
- dup
- 3 2/S .CRx
- .,
- .Exx
- 2drop ;
-
- : x23 ( op1 op2 | 0f23 ) \ e.g., MOV DR0, EAX
- MOV NEXTB
- dup $C0 ANDD $C0 <> if
- .NA2 exit
- then
- dup
- 3 2/S .DRx
- .,
- .Exx
- 2drop ;
-
- : x24 ( op1 op2 | 0f24 ) \ e.g., MOV EAX, TR6
- MOV NEXTB
- dup $C0 ANDD $C0 <> if
- .NA2 exit
- then
- dup
- .Exx
- .,
- 3 2/S .TRx
- 2drop ;
-
- : x26 ( op1 op2 | 0f26 ) \ e.g., MOV TR6, EAX
- MOV NEXTB
- dup $C0 ANDD $C0 <> if
- .NA2 exit
- then
- dup
- 3 2/S .TRx
- .,
- .Exx
- 2drop ;
-
-
- : x20S ( op1 op2 -- )
- dup $0f ANDD Exec:
- x20 x21 x22 x23
- x24 .na1 x26 .na1
- .na1 .na1 .na1 .na1
- .na1 .na1 .na1 .na1 ;
-
-
- \ ===========================================================================
-
- : 0F/00-3F ( op1 op2 -- )
- DUP 4 2/S 3 ANDD Exec:
- x00S .NA1 x20S .NA1 ;
-
- \ ===========================================================================
- \ ===========================================================================
-
- : BTcom \ common for BT, BTR, BTC, BTS
- 2drop
- NEXTB
- .MREG ?.,
- 3 2/S .16REG ;
-
-
- \ ===========================================================================
- \ ===========================================================================
-
- : x80S ( op1 op2 -- ) \ 2-byte displacement conditional jumps
- .BR| drop
- ." LONG "
- NEXTW CP @ + .h4 ;
-
- \ ===========================================================================
-
- : .SET| ( op )
- 15 ANDD
- EXEC: SETO SETNO SETB SETAE SETE SETNE SETBE SETA
- SETS SETNS SETPE SETPO SETL SETGE SETLE SETG ;
-
- : x90S ( op1 op2 -- )
- .SET| drop
- NEXTB .MREG
- drop ;
-
- \ ===========================================================================
-
-
- : xA0 push fs 2drop ;
- : xA1 pop fs 2drop ;
- : xA8 push gs 2drop ;
- : xA9 pop gs 2drop ;
-
- : xA3 ( op1 op2 )
- BT
- BTcom ;
-
- : xAB ( op1 op2 )
- BTS
- BTcom ;
-
- : sh_dbl ( op1 op2 -- ) \ common
- 1 \ to fake out .MREG
- NEXTB
- .Word/Dword
- .MREG ?.,
- 3 2/S .16reg .,
- drop \ the fake
- 1 ANDD 0= IF
- OPS @ CP +! OPS off
- NEXTB .# .h2
- else
- ." CL"
- then
- drop ;
-
- : xA4 ( op1 op2 | 0fA4-0fA5 )
- SHLD sh_dbl ;
-
- : xAC ( op1 op2 | 0fAC-0fAD )
- SHRD sh_dbl ;
-
- : IMULaf ( op1 op2 | 0fAF )
- IMUL
- .Word/Dword
- NEXTB
- dup 3 2/S .16REG .,
- .MREG drop
- 2drop ;
-
- : xA0S ( op1 op2 -- )
- dup $0F ANDD Exec:
- xA0 xA1 .na1 xA3
- xA4 xA4 .na1 .na1
- xA8 xA9 .na1 xAB
- xAC xAC .na1 IMULaf ;
-
- \ ===========================================================================
-
- : Lxs ( op1 op2 )
- 2drop
- NEXTB
- .REG .,
- .MREG
- drop ;
-
- : xB2 ( op1 op2 )
- LSS Lxs ;
-
- : xB4 ( op1 op2 )
- LFS Lxs ;
-
- : xB5 ( op1 op2 )
- LGS Lxs ;
-
-
- : .BSx 1 ANDD Exec: BSF BSR ;
-
- : BSx ( op1 op2 -- )
- .BSx
- drop NEXTB
- dup 3 2/S .16REG .,
- .MREG
- drop ;
-
- : xB3 ( op1 op2 )
- BTR
- BTcom ;
-
- : xBB ( op1 op2 )
- BTC
- BTcom ;
-
-
- : .BTi ( ext -- ext )
- dup 3 2/S 3 ANDD Exec:
- BT BTS BTR BTC ;
-
- : BTi ( op1 op2 | BA ) \ BT with immediate
- NEXTB \ need 3rd byte
- dup $20 ANDD 0= IF \ oops -- bad code
- .NA2 exit
- THEN
- .BTi \ print the opcode
- .Word/Dword
- .MREG drop
- OPS @ CP +! OPS off
- NEXTB .# .h2
- 2drop ;
-
-
- : Mcom \ common code for MOVSX, MOVZX
- NEXTB
- dup 3 2/S .16REG .,
- .MREG drop
- space .SIZE
- drop ;
-
- : Mzx ( op1 op2 | 0fB6-0fB7 )
- MOVZX Mcom ;
-
- : Msx ( op1 op2 | 0fBE-0fBF )
- MOVSX Mcom ;
-
- : xB0S ( op1 op2 -- )
- dup $0F ANDD Exec:
- .na1 .na1 xB2 xB3
- xB4 xB5 Mzx Mzx
- .na1 .na1 BTi xBB
- BSx BSx Msx Msx ;
-
-
- \ ===========================================================================
-
- : 0F/80-BF ( op1 op2 -- )
- DUP 4 2/S 3 ANDD Exec:
- x80S x90S xA0S xB0S ;
-
- \ ===========================================================================
- \ ===========================================================================
-
- : .Prefix ( -- )
- drop
- 25 col ." <prefix>" ;
-
- : .INST_1 \ 1-byte opcodes
- 6 2/S Exec:
- 00-3F 40-7F 80-BF C0-FF ;
-
- : .INST_2 \ 2-byte opcodes
- dup 6 2/S Exec:
- 0F/00-3F .NA1 0F/80-BF .NA1 ;
-
- : .INST ( op )
- 2 SPACES
- NEXTB
- 255 ANDD
- DUP Case
- $0F Of
- NEXTB .INST_2
- EndOf
- $26 Of
- ." ES:" .Prefix
- EndOf
- $2E Of
- ." CS:" .Prefix
- EndOf
- $36 Of
- ." SS:" .Prefix
- EndOf
- $3E Of
- ." DS:" .Prefix
- EndOf
- $64 Of
- ." FS:" .Prefix
- EndOf
- $65 Of
- ." GS:" .Prefix
- EndOf
- $66 Of
- Osize on
- ." Operand_Size"
- .Prefix
- EndOf
- $67 Of
- Asize on
- ." Address_Size"
- .Prefix
- EndOf
- $F0 Of
- ." LOCK" .Prefix
- EndOf
- .INST_1
- Osize off
- Asize off
- EndCase
- OPS @ CP +!
- OPS OFF
- DISP OFF ;
-
-
- : INST \ display opcode at ip advancing as needed
- DUMPSEG @ ?CS: = IF \ Display CODE <name> if in CS:
- CP @ >NAME DUP
- [ ' NO-NAME >NAME ]
- LITERAL XORR
- IF
- ID0 @ MS CR ." CODE " DUP .ID| CR
- THEN
- DROP
- THEN
- .INST ;
-
-
- \ ===========================================================================
- HEADERS \ ***********************************************************
- \ ===========================================================================
-
- FORTH DEFINITIONS
-
- \ Display memory ("dump" format)
-
- : DM ( a - a' )
- SAVESTATE
- Hex
- BEGIN CR DUMPSEG @ (.h4) ." :"
- DUP .h4 ." - "
- BASE @ 2DUP DUMP|
- 2 SPACES 2DUP %type +
- ?KEYPAUSE
- AGAIN ;
-
- \ Disassemble instructions .. from address
-
- : DIS ( a )
- CP !
- SAVESTATE
- HEX
- BEGIN CP @ \ save current addr for later
- CR INST \ process the instruction
- 37 COL ." \" \ space over on output line
- DUMPSEG @ .h4 DUP .h4 \ print addr (seg & offset) of instr
- CP @ OVER - \ using saved value, calc length of the instruction's code
- 2DUP
- SPACE DUMP| \ dump in hex
- 69 COL %type \ and printable ascii
- ?STACK \ make sure stack is OK
- ?KEYPAUSE \ check for Pause or Stop
- AGAIN ;
-
- \ Disassemble Interrupt Procedure .. from Int Number
-
- : IDIS ( int# )
- #INT2@ SWAP DUMPSEG ! DIS ;
-
- \ ===========================================================================
-
- : SEEN ( a )
- [ HIDDEN ]
- ?CS: DUMPSEG !
- DUP @REL>ABS DEFINITION-CLASS MAX-CLASSES
- = IF
- DUP DOES? NIP 0= IF
- DIS
- EXIT
- THEN
- THEN
- (SEE) ;
-
- : SEE ( name ) ' SEEN ;
-
- \ ===========================================================================
- BEHEAD \ ***********************************************************
-
- ONLY FORTH ALSO DEFINITIONS
- \ ===========================================================================
-
- CR .( Dasm386 LOADED )
-