home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
forth
/
compiler
/
fpc
/
source
/
fdis.seq
< prev
next >
Wrap
Text File
|
1987-12-11
|
5KB
|
162 lines
\ FDISASS.SEQ Floating point disassembler extensions by Robert L. Smith
NEEDS DISASSEM.SEQ
\ Floating Point disassembler
HEX DISASSEMBLER DEFINITIONS
: NOTYPE ;
.SELF INTEGER*2 .SELF INTEGER*4 .SELF INTEGER*8
.SELF REAL*4 .SELF REAL*8 .SELF TEMP_REAL
.SELF BCD
: FTYPE7 ( op ext -- op ext )
DUP 3 2/S 1 AND EXEC: BCD INTEGER*8 STOP[
.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)
comment:
\ Disassembler definitions
NOTYPE Print nothing for "type."
Various self-printing types.
FTYPE7 There are two possibilities for an ESC-7 code type:
either BCD or INTEGER*8.
ST(i) Various self-identifying ST registers
comment;
\ Print floating point arguments
: .STI ( ext -- ext )
DUP 7 AND EXEC: ST(0) ST(1) ST(2) ST(3) ST(4)
ST(5) ST(6) ST(7) STOP[
: FTYPE ( op ext -- op ext )
DUP C0 = IF NOTYPE EXIT THEN
OVER 7 AND 2* OVER 20 AND IF 1+ THEN
EXEC: REAL*4 REAL*4 REAL*4 NOTYPE
INTEGER*4 INTEGER*4 INTEGER*4 TEMP_REAL
REAL*8 REAL*8 REAL*8 NOTYPE
INTEGER*2 INTEGER*2 INTEGER*2 FTYPE7 STOP[
comment:
\ Floating Point Arguments
.STI Print an ST register, depending on the low order
3 bits.
FTYPE Print the operand types.
comment;
: FST,STI .STI ST ;
: FSTI,ST ST .STI ;
: FSTARGS ( op ext -- op ext )
OVER DE = IF DUP 30 AND 10 - IF FSTI,ST THEN EXIT THEN
OVER D9 = IF DUP 30 AND 0= IF .STI THEN EXIT THEN
OVER 7 AND EXEC: FST,STI NOTYPE NOTYPE NOTYPE
FSTI,ST .STI NOTYPE NOTYPE STOP[
: FARGS ( op ext -- op ext )
DUP C0 AND C0 = IF FSTARGS EXIT THEN
FTYPE OVER 1 AND 0=
IF ST THEN .MREG ;
comment:
FST,STI Print an argument of the form ST, ST(i)
FSTI,ST Print an argument of the form ST(i), ST
FSTARGS Print the arguments for the mod=11 case. These
are typically of the form ST,ST(i) or ST(i),ST
or none.
comment;
.SELF FADD .SELF FMUL .SELF FCOM .SELF FCOMP
.SELF FSUB .SELF FSUBR .SELF FDIV .SELF FDIVR
.SELF FLD .SELF FST .SELF FSTP .SELF FLDENV
.SELF FLDCW .SELF FSTENV .SELF FSTCW .SELF FRSTOR
.SELF FSAVE .SELF FSTSW
.SELF FXCH .SELF FNOP .SELF FCHS .SELF FABS
.SELF FTST .SELF FXAM .SELF FLD1 .SELF FLD2T
.SELF FLDL2E .SELF FLDPI .SELF FLDLG2 .SELF FLDLN2
.SELF FLDZ .SELF FENI .SELF FDISI .SELF FCLEX
.SELF FINIT .SELF FADDP .SELF FMULP .SELF FSUBP
.SELF FSUBRP .SELF FDIVP .SELF FSCALE .SELF FFREE
.SELF FDIVRP .SELF F2XM1 .SELF FYL2X .SELF FPTAN
.SELF FPATAN .SELF FXTRACT .SELF FDECSTP .SELF FINCSTP
.SELF FPREM .SELF FYL2XP1 .SELF FSQRT .SELF FRNDINT
: FCOMPP ( op ext -- op ext )
DUP 7 AND 1 =
IF .MOI EXIT THEN
ESC, EXIT ;
: F1FX ( op ext -- op ext )
DUP 0F AND EXEC:
F2XM1 FYL2X FPTAN FPATAN FXTRACT ESC, FDECSTP FINCSTP
FPREM FYL2XP1 FSQRT ESC, FRNDINT FSCALE ESC, ESC, STOP[
: F1EX ( op ext -- op ext )
DUP 0F AND EXEC:
FCHS FABS ESC, ESC, FTST FXAM ESC, ESC,
FLD1 FLD2T FLDL2E FLDPI FLDLG2 FLDLN2 FLDZ ESC, STOP[
: F1MOD11 ( op ext -- op ext )
DUP 38 AND 8 = IF FARGS FXCH EXIT THEN
DUP F8 AND C0 = IF FARGS FLD EXIT THEN
DUP D0 = IF FNOP EXIT THEN
DUP E0 < IF ESC, EXIT THEN
DUP 4 2/S 1 AND EXEC: F1EX F1FX STOP[
: F5MOD11 ( op ext -- op ext )
DUP 3 2/S 7 AND DUP 3 > IF DROP ESC, EXIT THEN
>R .STI R> EXEC: FFREE OOPS FST FSTP STOP[
: F6MOD11 ( op ext -- op ext )
FARGS DUP 3 2/S 7 AND EXEC:
FADDP FMULP ESC, FCOMPP FSUBP FSUBRP FDIVP FDIVRP STOP[
: F3MOD11 ( op ext -- op ext )
DUP 38 AND 20 -
IF ESC,
ELSE DUP 7 AND EXEC: FENI FDISI FCLEX FINIT
THEN ;
: FEVEN ( op ext -- op ext )
FARGS DUP 3 2/S 7 AND EXEC:
FADD FMUL FCOM FCOMP FSUB FSUBR FDIV FDIVR STOP[
: FMOD11OP ( op ext -- op ext )
OVER 7 AND EXEC: FEVEN F1MOD11 FEVEN F3MOD11
FEVEN F5MOD11 F6MOD11 ESC, STOP[
: FODD0 ( op ext -- op ext )
FARGS DUP 3 2/S 3 AND EXEC: FLD ESC, FST FSTP STOP[
: FODD4 ( op ext -- op ext )
FARGS OVER 6 AND 2* OVER 3 2/S 3 AND OR EXEC:
FLDENV FLDCW FSTENV FSTCW ESC, FLD FSTP ESC,
FRSTOR FSAVE ESC, FSTSW FLD FLD FSTP FSTP STOP[
: FODD ( op ext -- op ext )
DUP 38 AND 20 < IF FODD0 ELSE FODD4 THEN ;
: FOPS ( op ext -- op ext )
DUP C0 AND C0 = IF FMOD11OP EXIT THEN
OVER 1 AND IF FODD ELSE FEVEN THEN ;
' FOPS IS ESCCODE \ Enable Floating Point
FORTH DEFINITIONS
DECIMAL