📄 87toalt.inc
字号:
if (MMsegNumber EQ 3)
pop es ;; restore ES
endif ;; segment CS
MRestoreBX ;
ENDM ;; GenerateRPtrCall
;
;**********
;
; Integer varsion
GenerateIPtrCall MACRO InstName,arg1,arg3,sufx
GetTypeILetter <arg1>,MMTypeLetter
MSetupBX <arg3>
MGetSeg <arg3>,MMSegNumber
GetSegLetter MMSegNumber,MMSegLetter
if (MMsegNumber EQ 3) ;; Segment = CS
push es ;; make ES same as CS
push cs
pop es
endif ;; segment = CS
MMsinst CATSTR <AltM>,MMSegLetter,<InstName>,MMTypeLetter,<sufx>
EXTRN MMsinst:PROC ;; the altmath interface call
call MMsinst ;; the altmath interface call
if (MMsegNumber EQ 3)
pop es ;; restore ES
endif ;; segment CS
MRestoreBX ;
ENDM ;; GenerateIPtrCall
;
;******************************************************************************
; fld
;
; Forms of this macro:
; 1 fld ST
; 2 fld ST(x) ;; where 0<=x<=7
; 3 fld dword ptr [bx]
; 4 fld qword ptr [bx]
;
fld MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ; Three arguments max for fld
endif ;; ifnb arg4
ifb <arg2> ;; Check if register form
MgetST <arg1>,MMstreg ;; Must be of form ST or ST(x)
if (MMstreg EQ 0)
EXTRN AltMfdup:PROC
call AltMfdup ;; if ST 0 then duplicate TOS
else ;; if ST(0)
push bx ;; fld ST(streg)
mov bl,MMstreg
EXTRN AltMfldst:PROC
call AltMfldst
pop bx
endif ;; if ST(0)
else ;; arg2 not blank
ifidni <arg2>,<ptr>
GenerateRPtrCall <ld>,<arg1>,<arg3>
else ;; if (isptr)
.err Illegal form of fld instruction
endif ;; if (isptr)
endif ;; arg2 not blank
ENDM ;; fld
;
;******************************************************************************
; fild
;
fild MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ; Three arguments max for fild
endif ;; ifnb arg4
ifidni <arg2>,<ptr>
GenerateIPtrCall <ld>,<arg1>,<arg3>
else ;; if arg2 is ptr
.err Illegal form of fild instruction
endif ;; if arg2 is ptr
ENDM ;; fild
;
;******************************************************************************
; fxch
;
fxch MACRO arg1,arg2
ifnb <arg2> ;; Check number of arguments
.err ; Maximum one argument
endif ;; ifnb arg2
ifb <arg1>
EXTRN AltMfxch:PROC ;; moved inside macro
call AltMfxch
else
MgetST <arg1>,MMstreg
push bx
mov bl,MMstreg
EXTRN AltMfxchq:PROC
call AltMfxchq
pop bx
endif ;; ifb <arg1>
ENDM ;; fxch
;
;******************************************************************************
; fst
fst MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ; Three arguments max for fst
endif ;; ifnb arg4
ifidni <arg2>,<ptr>
GenerateRPtrCall <st>,<arg1>,<arg3>
else ;; if (isptr)
.err Illegal form of fst instruction
endif ;; if (isptr)
ENDM ;; fst
;
;******************************************************************************
; fstp
;
fstp MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ; Three arguments max for fstp
endif ;; ifnb arg4
ifb <arg2>
MgetST arg1,MMstreg
if (MMstreg EQ 0)
EXTRN AltMfstpST0:PROC
call AltMfstpST0
else ;; if (MMstreg EQ 0)
.err Illegal form of fstp instruction
endif ;; if (MMstreg EQ 0)
else ;; ifb <arg2>
ifidni <arg2>,<ptr>
GenerateRPtrCall <st>,<arg1>,<arg3>,<p>
else ;; if (isptr)
.err Illegal form of fstp instruction
endif ;; if (isptr)
endif ;; ifb <arg2>
ENDM ;; fstp
;
;******************************************************************************
; fistp
fistp MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ; Three arguments max for fistp
endif ;; ifnb arg4
ifidni <arg2>,<ptr>
GenerateIPtrCall <ist>,<arg1>,<arg3>,<p>
else ;; if (isptr)
.err Illegal form of fistp instruction
endif ;; if (isptr)
ENDM ;; fistp
;
;******************************************************************************
; fld1
;
fld1 MACRO
EXTRN AltMfld1:PROC
call AltMfld1
ENDM ;; fld1
;
;******************************************************************************
; fldz
;
fldz MACRO
EXTRN AltMfldz:PROC ;; moved inside macro
call AltMfldz
ENDM ;; fldz
;
;******************************************************************************
; fcompp
fcompp MACRO
EXTRN AltMfcompp:PROC
call AltMfcompp
ENDM ;; fcompp
;
;******************************************************************************
; fstsw
fstsw MACRO arg1,arg2
ifnb <arg2>
.err ; Illegal form of fstsw, only one argument
else ;; if too many arguments
sEnd CODE
sBegin DATA
EXTRN AltMathStatus:WORD ;; declare AltMathStatus as extrn
sEnd DATA
sBegin CODE
push ax ;; save ax
mov ax,AltMathStatus ;; arg1 := AltMathStatus
mov arg1,ax
pop ax ;; restore ax
endif ;; if too many arguments
ENDM ;; fstsw
;******************************************************************************
; fadd
fadd MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ; Three arguments max for fadd
endif ;; ifnb arg4
ifb <arg1>
EXTRN AltMfadd:PROC
call AltMfadd
else
ifidni <arg2>,<ptr>
GenerateRPtrCall <add>,<arg1>,<arg3>
else ;; if (isptr)
.err Illegal form of fadd instruction
endif ;; if (isptr)
endif ;; ifb arg1
ENDM ;; fadd
;******************************************************************************
; fsub
fsub MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ; Three arguments max for fsub
endif ;; ifnb arg4
ifb <arg1>
EXTRN AltMfsub:PROC
call AltMfsub
else
ifidni <arg2>,<ptr>
GenerateRPtrCall <sub>,<arg1>,<arg3>
else ;; if (isptr)
.err Illegal form of fsub instruction
endif ;; if (isptr)
endif ;; ifb arg1
ENDM ;; fsub
;******************************************************************************
; fmul
fmul MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ; Three arguments max for fmul
endif ;; ifnb arg4
ifb <arg1>
EXTRN AltMfmul:PROC
call AltMfmul
else
ifidni <arg2>,<ptr>
GenerateRPtrCall <mul>,<arg1>,<arg3>
else ;; if (isptr)
.err Illegal form of fmul instruction
endif ;; if (isptr)
endif ;; ifb arg1
ENDM ;; fmul
;******************************************************************************
; fdiv
fdiv MACRO arg1,arg2,arg3,arg4
ifnb <arg4> ;; Check number of arguments
.err ;; Three arguments max for fdiv
endif ;; ifnb arg4
ifb <arg1>
EXTRN AltMfdiv:PROC
call AltMfdiv
else
ifidni <arg2>,<ptr>
GenerateRPtrCall <div>,<arg1>,<arg3>
else ;; if (isptr)
.err Illegal form of fdiv instruction
endif ;; if (isptr)
endif ;; ifb arg1
ENDM ;; fdiv
;******************************************************************************
; fabs
fabs MACRO
EXTRN AltMfabs:PROC ;; moved inside macro
call AltMfabs
ENDM ;; fabs
;******************************************************************************
; fchs
fchs MACRO
EXTRN AltMfchs:PROC ;; moved inside macro
call AltMfchs
ENDM ;; fchs
;******************************************************************************
; fsqrt
fsqrt MACRO
EXTRN AltMfsqrt:PROC
call AltMfsqrt
ENDM ;; fsqrt
;******************************************************************************
; fwait
fwait MACRO
ENDM ;;fwait
;******************************************************************************
;
endif ; ife m87toalt_asm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -