⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 87toalt.inc

📁 Dos6.0
💻 INC
📖 第 1 页 / 共 2 页
字号:
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 + -