home *** CD-ROM | disk | FTP | other *** search
- \ some code to test assembling and dis-assembling floating point instructions
-
-
- CREATE FLOAT-WORK 10 ALLOT
-
- VARIABLE FSP
-
- CODE FP>R ( F: -- r ; 8087: r -- )
- MOV BX, FSP
- SUB BX, # 8
- MOV FSP BX
- FSTP REAL*8 0 [BX]
- NEXT
- END-CODE
-
- CODE R>FP ( F: r -- ; 8087: -- r )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- ADD BX, # 8
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE FP>I ( 8087: r -- ; -- 16b)
- SUB SP, # 2
- MOV BX, SP
- FRNDINT
- FSTP INTEGER*2 0 [BX]
- WAIT
- NEXT
- END-CODE
-
- CODE I>FP ( 8087: -- r ; 16b -- )
- MOV BX, SP
- FLD INTEGER*2 0 [BX]
- ADD SP, # 2
- NEXT
- END-CODE
-
- CODE FP>DI ( 8087: r -- ; -- 32b )
- SUB SP, # 4
- MOV BX, SP
- FRNDINT
- FSTP INTEGER*4 0 [BX]
- WAIT
- NEXT
- end-code
-
- CODE DI>FP ( 8087: -- r ; 32b -- )
- MOV BX, SP
- FLD INTEGER*4 0 [BX]
- ADD SP, # 4
- NEXT
- END-CODE
-
- CODE FP>QI ( 8087: r -- ; -- 64b)
- SUB SP, # 8
- MOV BX, SP
- FRNDINT
- FSTP INTEGER*8 0 [BX]
- WAIT
- NEXT
- END-CODE
-
- CODE QI>FP ( 8087: -- r ; 64b -- )
- MOV BX, SP
- FLD INTEGER*8 0 [BX]
- ADD SP, # 8
- NEXT
- END-CODE
-
- CODE FP>SR ( 8087: r -- ; -- 32bit-real )
- SUB SP, # 4
- MOV BX, SP
- FSTP REAL*4 0 [BX]
- WAIT
- NEXT
- END-CODE
-
- CODE SR>FP ( 8087: -- r ; 32bit-real -- )
- MOV BX, SP
- FLD REAL*4 0 [BX]
- ADD SP, # 4
- NEXT
- END-CODE
-
- CODE FPSW> ( -- n )
- SUB SP, # 2
- MOV BX, SP
- FSTSW 0 [BX]
- WAIT
- NEXT
- END-CODE
-
- CODE FPCW> ( -- n )
- SUB SP, # 2
- MOV BX, SP
- FSTCW 0 [BX]
- WAIT
- NEXT
- END-CODE
-
- CODE >FPCW ( n -- )
- MOV BX, SP
- FLDCW 0 [BX]
- ADD SP, # 2
- NEXT
- END-CODE
-
- CODE INITFP ( -- )
- FINIT
- FENI
- FDISI
- NEXT
- END-CODE
-
- CODE CLEARFP ( -- )
- FCLEX
- NEXT
- END-CODE
-
- CODE PI ( F: -- pi )
- FLDPI
- MOV BX, FSP
- SUB BX, # 8
- MOV FSP BX
- FSTP REAL*8 0 [BX]
- NEXT
- END-CODE
-
- CODE F1.0 ( F: -- 1.0 )
- FLD1
- MOV BX, FSP
- SUB BX, # 8
- MOV FSP BX
- FSTP REAL*8 0 [BX]
- NEXT
- END-CODE
-
- CODE F0.0 ( F: -- 0.0 )
- FLDZ
- MOV BX, FSP
- SUB BX, # 8
- MOV FSP BX
- FSTP REAL*8 0 [BX]
- NEXT
- END-CODE
-
- CODE F* ( F: r1 r2 -- r1*r2)
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- ADD BX, # 8
- FMUL 0 [BX]
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE F+ ( F: r1 r2 -- r1+r2)
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- ADD BX, # 8
- FADD 0 [BX]
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE F- ( F: r1 r2 -- r1-r2)
- MOV BX, FSP
- FLD REAL*8 8 [BX]
- FLD 0 [BX]
- ADD BX, # 8
- FSUBRP ST(1), ST(0)
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE F\- ( F: r1 r2 -- r1-r2)
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- ADD BX, # 8
- FLD 0 [BX]
- FSUBRP ST(1), ST(0)
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE F/ ( F: r1 r2 -- r1/r2)
- MOV BX, FSP
- FLD REAL*8 8 [BX]
- FLD 0 [BX]
- ADD BX, # 8
- FDIVRP ST(1), ST(0)
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE FABS ( F: r1 -- |r1|)
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FABS,
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE FNEGATE ( F: r1 -- -r1 )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FCHS
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE FSQRT ( F: r1 -- SQRT[r1])
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FSQRT,
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE FLOG ( F: r1 -- LOG10[r1])
- MOV BX, FSP
- FLDLG2
- FLD REAL*8 0 [BX]
- FYL2X
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE FLN ( F: r1 -- LN[r1])
- MOV BX, FSP
- FLDLN2
- FLD REAL*8 0 [BX]
- FYL2X
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE 1/F ( F: r -- r^-1)
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FLD1
- FDIVP ST(1), ST(0)
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE [SIN] ( F: r -- sin<r> )
- MOV BX, FSP
- FLD REAL*8 0 [BX] \ Load 8087 from top of f.p. stack
- FLD1 \ Load F1.0
- FLD ST(0) \ Dup it
- FADDP ST(1), ST(0) \ Make F2.0
- FXCH ST(1)
- FDIVP ST(1), ST(0) \ Divide argument by 2.
- FPTAN \ Partial tangent -> y, x
- FXCH ST(1)
- FDIVP ST(1), ST(0) \ y/x
- FLD ST(0) \ dup
- FLD ST(0) \ dup
- FMULP ST(1), ST(0)
- FLD1
- FADDP ST(1), ST(0) \ 1 + (y/x)**2
- FXCH ST(1)
- FLD1
- FLD ST(0)
- FADDP ST(1), ST(0) \ 2.0
- FMULP ST(1), ST(0) \ 2(y/x)
- FDIVP ST(1), ST(0) \ 2(y/x)/(1+(y/x)**2)
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE [COS] ( F: r -- cos<r> )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FLD1
- FLD1
- FADDP ST(1), ST(0)
- FXCH ST(1)
- FDIVP ST(1), ST(0)
- FPTAN
- FXCH ST(1)
- FDIVP ST(1), ST(0)
- FLD ST(0)
- FMULP ST(1), ST(0)
- FLD ST(0)
- FLD1
- FADDP ST(1), ST(0)
- FXCH ST(1)
- FLD1
- FSUBP ST(1), ST(0)
- FDIVP ST(1), ST(0)
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE [TAN] ( F: r -- tan<r> )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FPTAN
- FXCH ST(1)
- FDIVP ST(1), ST(0)
- FSTP 0 [BX]
- NEXT
- END-CODE
-
-
- CODE F2**N* ( F: r1 -- r2 ; n -- )
- MOV BX, SP
- FLD INTEGER*2 0 [BX]
- ADD SP, # 2
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FSCALE
- FSTP 0 [BX]
- FSTP ST
- NEXT
- END-CODE
-
- CODE FDUP ( F: r -- r r )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- SUB BX, # 8
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE FOVER ( F: r1 r2 -- r1 r2 r1 )
- MOV BX, FSP
- ADD BX, # 8
- FLD REAL*8 0 [BX]
- SUB BX, # 16
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE FSWAP ( F: r1 r2 -- r2 r1 )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FLD 8 [BX]
- FSTP 0 [BX]
- FSTP 8 [BX]
- NEXT
- END-CODE
-
- CODE FNSWAP ( F: rn rn-1 ... r1 r0 -- r0 rn-1 ... r1 rn ; n -- )
- MOV BX, FSP
- POP AX
- SHL AX, # 1
- SHL AX, # 1
- SHL AX, # 1
- FLD REAL*8 0 [BX]
- ADD AX, BX
- XCHG AX, BX
- FLD REAL*8 0 [BX]
- FXCH ST(1)
- FSTP 0 [BX]
- MOV BX, AX
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE FROT ( F: r1 r2 r3 -- r2 r3 r1 )
- MOV BX, FSP
- ADD BX, # 8
- FLD REAL*8 0 [BX]
- SUB BX, # 8
- FLD REAL*8 0 [BX]
- ADD BX, # 16
- FLD REAL*8 0 [BX]
- SUB BX, # 16
- FSTP 0 [BX]
- ADD BX, # 8
- FSTP 0 [BX]
- ADD BX, # 8
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE F-ROT ( F: r1 r2 r3 -- r3 r1 r2 )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- ADD BX, # 16
- FLD REAL*8 0 [BX]
- SUB BX, # 8
- FLD REAL*8 0 [BX]
- SUB BX, # 8
- FSTP 0 [BX]
- ADD BX, # 8
- FSTP 0 [BX]
- ADD BX, # 8
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE FNIP ( F: r1 r2 -- r2 )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- ADD BX, # 8
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE FTUCK ( F: r1 r2 -- r2 r1 r2 )
- MOV BX, FSP
- FLD REAL*8 8 [BX]
- FLD REAL*8 0 [BX]
- FST 8 [BX]
- FXCH ST1
- FSTP REAL*8 0 [BX]
- SUB BX, # 8
- FSTP REAL*8 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE FPICK ( F: rX ... rn ... r2 r1 r0 n --- ... r1 r0 rn )
- POP AX
- MOV AH, # 8
- MUL AH
- MOV BX, FSP
- ADD BX, AX
- FLD REAL*8 0 [BX]
- MOV BX, FSP
- SUB BX, # 8
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE (RVS0) ( F: r -- ; -- fpsw )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FTST
- FSTP ST(0)
- ADD BX, # 8
- MOV FSP BX
- SUB SP, # 2
- MOV BX, SP
- FSTSW 0 [BX]
- WAIT
- NEXT
- END-CODE
-
- CODE (RVSR) ( F: r1 r2 -- ; -- fpsw )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- ADD BX, # 8
- FLD REAL*8 0 [BX]
- FCOMPP
- ADD BX, # 8
- MOV FSP BX
- SUB SP, # 2
- MOV BX, SP
- FSTSW 0 [BX]
- WAIT
- NEXT
- END-CODE
-
- CODE F@ ( F: -- r ; addr -- )
- POP BX
- FLD REAL*8 0 [BX]
- MOV BX, FSP
- SUB BX, # 8
- FSTP 0 [BX]
- MOV FSP BX
- NEXT
- END-CODE
-
- CODE F! ( F: r -- ; addr -- )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- ADD BX, # 8
- MOV FSP BX
- POP BX
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CODE (FLIT) ( F: -- r )
- MOV BX, FSP
- SUB BX, # 8
- LODSW ES:
- MOV 0 [BX], AX
- LODSW ES:
- MOV 2 [BX], AX
- LODSW ES:
- MOV 4 [BX], AX
- LODSW ES:
- MOV 6 [BX], AX
- MOV FSP BX
- NEXT
- END-CODE
-
- ASSEMBLER ALSO HEX
-
- LABEL (POWER) ( 87: log2x y -- x^y )
- FMULP ST(1), ST(0) \ x * y
- FLD ST(0) \ DUP
- FSTCW FLOAT-WORK \ Save current Control Word
- MOV AX, FLOAT-WORK
- MOV CX, AX
- AND AX, # F3FF
- OR AX, # 0400 \ Round toward neg. inf.
- MOV FLOAT-WORK AX
- FLDCW FLOAT-WORK
- FRNDINT \ Take floor of x*y
- MOV FLOAT-WORK CX
- FLDCW FLOAT-WORK \ Restore Control word.
- FST REAL*8 FLOAT-WORK \ Save copy of floored value.
- FXCH ST(1)
- FSUBP ST(1), ST(0) \ (x*y) - floor(x*y) -> fract
- FLD1
- FCHS
- FXCH ST(1)
- FSCALE \ fract/2
- FXCH ST(1)
- FSTP ST(0) \ Remove the -1.
- F2XM1 \ 2^(fract/2) - 1
- FLD1
- FADDP ST(1), ST(0) \ 2^(fract/2)
- FLD ST(0) \ DUP
- FMULP ST(1), ST(0) \ 2^fract
- FLD REAL*8 FLOAT-WORK
- FXCH ST(1)
- FSCALE \ 2^(x*y)
- FXCH ST(1)
- FSTP ST(0) \ Remove the floored value.
- RET
- END-CODE
-
- PREVIOUS FORTH
- DECIMAL
-
- CODE (FALN) ( 87: r -- e^r )
- FLDL2E
- CALL (POWER)
- NEXT
- END-CODE
-
- CODE (FALOG) ( 87: r -- 10^r )
- FLDL2T
- CALL (POWER)
- NEXT
- END-CODE
-
- ASSEMBLER ALSO HEX
-
- LABEL (FATAN)
- FLD1
- FCOM ST(1)
- FSTSW FLOAT-WORK
- MOV AX, FLOAT-WORK
- AND AX, # 4100
- 0=
- IF
- FPATAN
- ELSE
- FXCH ST(1)
- FPATAN
- FLD1
- FLD ST(0)
- FADDP ST(1), ST(0)
- FLDPI
- FDIVP ST(1), ST(0)
- FSUBP ST(1), ST(0)
- THEN
- RET
- END-CODE
-
- PREVIOUS FORTH
-
- CODE FATAN ( F: r -- arctan[r] )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FTST
- FSTSW FLOAT-WORK
- MOV AX, FLOAT-WORK
- AND AX, # 4100
- SUB AX, # 0100
- 0=
- IF
- FCHS
- CALL (FATAN)
- FCHS
- ELSE
- CALL (FATAN)
- THEN
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- DECIMAL
-
- CODE FMUL10 ( -- )
- MOV FLOAT-WORK # 10 WORD
- FLD INTEGER*2 FLOAT-WORK
- FMULP ST(1), ST(0)
- NEXT
- END-CODE
-
- CODE (FADDI) ( n -- )
- MOV BX, SP
- FLD INTEGER*2 0 [BX]
- FADDP ST(1), ST(0)
- ADD SP, # 2
- NEXT
- END-CODE
-
- CODE QNEGATE ( +q -- -q )
- MOV BX, SP
- FLD 0 [BX] INTEGER*8
- FCHS
- FSTP 0 [BX]
- NEXT
- END-CODE
-
- CREATE FLOAT-BCD 10 ALLOT
-
- VARIABLE #BCD 17 #BCD !
-
- CODE R>BCD! ( F: r -- ; n -- ; full precision bcd-string to FLOAT-BCD )
- FLD #BCD INTEGER*2
- MOV BX, SP
- FLD INTEGER*2 0 [BX]
- ADD SP, # 2
- MOV BX, FSP
- FSUBRP ST(1), ST(0)
- FLD1
- FSUBRP ST1, ST0
- FLDL2T
- CALL (POWER)
- FLD REAL*8 0 [BX]
- ADD BX, # 8
- FMULP ST(1), ST(0)
- FSTP FLOAT-BCD BCD
- MOV FSP BX
- WAIT
- NEXT
- END-CODE
-
-
- HEX
-
- CODE FPARSE ( F: r -- ; -- int-part frac-part )
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FLD ST0
- FSTCW FLOAT-WORK
- MOV AX, FLOAT-WORK
- MOV CX, AX
- OR AX, # 0C00
- MOV FLOAT-WORK AX
- FLDCW FLOAT-WORK
- FRNDINT
- MOV FLOAT-WORK CX
- FLDCW FLOAT-WORK
- FLD ST0
- FSTP REAL*8 0 [BX]
- FSUBRP ST1, ST0
- SUB BX, # 8
- FSTP REAL*8 0 [BX]
- MOV FSP BX
- WAIT
- NEXT
- END-CODE
-
- DECIMAL
-
- variable #places
-
- CODE FRNDFRC ( F: +r -- +r )
- FLD1
- FLD1
- FADDP ST1, ST0 ( 2.0 ON TOP OF STACK )
- FLD INTEGER*2 #PLACES
- FCHS
- FLDL2T
- CALL (POWER)
- FDIVP ST(1), ST(0)
- MOV BX, FSP
- FLD REAL*8 0 [BX]
- FADDP ST(1), ST(0)
- FSTP REAL*8 0 [BX]
- NEXT
- END-CODE
-
- Code xx1
- fld st(1)
- fld st(2)
- fld real*4 0 [bx]
- fld real*8 0 [bx]
- fst real*4 0 [bx]
- fst real*8 0 [bx]
- fstp real*4 0 [bx]
- fstp real*8 0 [bx]
- fld integer*4 0 [bx]
- fld integer*2 0 [bx]
- fst integer*4 0 [bx]
- fst integer*2 0 [bx]
- fstp integer*4 0 [bx]
- fstp integer*2 0 [bx]
- fld bcd 0 [bx]
- fstp bcd 0 [bx]
- fld integer*8 0 [bx]
- fstp integer*8 0 [bx]
- fld temp_real 0 [bx]
- fstp temp_real 0 [bx]
- frstor 0 [bx]
- fsave 0 [si]
- fstsw 0 [di]
- fldenv 0 [bx]
- fldcw 0 [si]
- fstenv 8 [si]
- fstcw 4 [di]
- next
- end-code
-
- code xx2
- fld st(1)
- fld st(2)
- fld st(3)
- fld st(4)
- fld st(5)
- fld st(6)
- fld st(7)
- fxch st(3)
- fnop
- fchs
- fabs
- ftst
- fxam
- fld1
- fldl2t
- fldl2e
- fldpi
- fldlg2
- fldln2
- fldz
- f2xm1
- fyl2x
- fptan
- fpatan
- fxtract
- fdecstp
- fincstp
- fprem
- fyl2xp1
- frndint
- fscale
- feni
- fdisi
- fclex
- finit
- ffree st(3)
- next
- end-code
-
- code xx3
- fadd real*4 0 [si]
- fmul real*4 0 [si]
- fcom real*4 0 [si]
- fcomp real*4 0 [si]
- fsub real*4 0 [si]
- fsubr real*4 0 [si]
- fdiv real*4 0 [si]
- fdivr real*4 0 [si]
- fadd integer*4 0 [si]
- fmul integer*4 0 [si]
- fcom integer*4 0 [si]
- fcomp integer*4 0 [si]
- fsub integer*4 0 [si]
- fsubr integer*4 0 [si]
- fdiv integer*4 0 [si]
- fdivr integer*4 0 [si]
- fadd real*8 0 [si]
- fmul real*8 0 [si]
- fcom real*8 0 [si]
- fcomp real*8 0 [si]
- fsub real*8 0 [si]
- fsubr real*8 0 [si]
- fdiv real*8 0 [si]
- fdivr real*8 0 [si]
- fadd integer*2 0 [si]
- fmul integer*2 0 [si]
- fcom integer*2 0 [si]
- fcomp integer*2 0 [si]
- fsub integer*2 0 [si]
- fsubr integer*2 0 [si]
- fdiv integer*2 0 [si]
- fdivr integer*2 0 [si]
- next
- end-code
-
- asm.386
- code xx9
- fcos
- fsin
- fsincos
- fprem1
- fucompp
- fucom st(1)
- fucomp st(2)
- next
- end-code
-