📄 fp8087.s
字号:
.define .adf4, .adf8, .sbf4, .sbf8, .mlf4, .mlf8, .dvf4, .dvf8.define .ngf4, .ngf8, .fif4, .fif8, .fef4, .fef8.define .cif4, .cif8, .cuf4, .cuf8, .cfi, .cfu, .cff4, .cff8.define .cmf4, .cmf8.sect .text; .sect .rom; .sect .data; .sect .bss! $Header: fp8087.s,v 1.2 89/11/28 12:51:35 ceriel Exp $! Implement interface to floating point package for Intel 8087 .sect .romone: .data2 1two: .data2 2bigmin: .data2 0, -32768 .sect .text.adf4: mov bx,sp wait flds 2(bx) wait fadds 6(bx) wait fstps 6(bx) wait ret.adf8: mov bx,sp wait fldd 2(bx) wait faddd 10(bx) wait fstpd 10(bx) wait ret.sbf4: mov bx,sp wait flds 6(bx) wait fsubs 2(bx) wait fstps 6(bx) wait ret.sbf8: mov bx,sp wait fldd 10(bx) wait fsubd 2(bx) wait fstpd 10(bx) wait ret.mlf4: mov bx,sp wait flds 2(bx) wait fmuls 6(bx) wait fstps 6(bx) wait ret.mlf8: mov bx,sp wait fldd 2(bx) wait fmuld 10(bx) wait fstpd 10(bx) wait ret.dvf4: mov bx,sp wait flds 6(bx) wait fdivs 2(bx) wait fstps 6(bx) wait ret.dvf8: mov bx,sp wait fldd 10(bx) wait fdivd 2(bx) wait fstpd 10(bx) wait ret.ngf4: mov bx,sp wait flds 2(bx) wait fchs wait fstps 2(bx) wait ret.ngf8: mov bx,sp wait fldd 2(bx) wait fchs wait fstpd 2(bx) wait ret.fif4: mov bx,sp push bx ! make room for FP status word wait flds 4(bx) wait fmuls 8(bx) ! multiply wait fld st ! copy result wait ftst ! test sign; handle negative separately wait fstsw -2(bx) wait mov ax,-2(bx) sahf ! result of test in condition codes jb 1f frndint ! this one rounds (?) wait fcom st(1) ! compare with original; if <=, then OK wait fstsw -2(bx) wait mov ax,-2(bx) sahf jbe 2f fisubs one ! else subtract 1 wait jmp 2f1: ! here, negative case frndint ! this one rounds (?) wait fcom st(1) ! compare with original; if >=, then OK wait fstsw -2(bx) wait mov ax,-2(bx) sahf jae 2f fiadds one ! else add 1 wait2: fsub st(1),st ! subtract integer part wait mov bx,2(bx) fstps (bx) wait fstps 4(bx) wait pop bx ret.fif8: mov bx,sp push bx ! make room for FP status word wait fldd 4(bx) wait fmuld 12(bx) ! multiply wait fld st ! and copy result wait ftst ! test sign; handle negative separately wait fstsw -2(bx) wait mov ax,-2(bx) sahf ! result of test in condition codes jb 1f frndint ! this one rounds (?) wait fcom st(1) ! compare with original; if <=, then OK wait fstsw -2(bx) wait mov ax,-2(bx) sahf jbe 2f fisubs one ! else subtract 1 wait jmp 2f1: ! here, negative case frndint ! this one rounds (?) wait fcom st(1) ! compare with original; if >=, then OK wait fstsw -2(bx) wait mov ax,-2(bx) sahf jae 2f fiadds one ! else add 1 wait2: fsub st(1),st ! subtract integer part mov bx,2(bx) fstpd (bx) wait fstpd 8(bx) wait pop bx ret.fef4: ! this could be simpler, if only the ! fxtract instruction was emulated properly mov bx,sp mov ax,6(bx) and ax,#077600 je 1f ! zero exponent mov cx,#7 shr ax,cl sub ax,#126 mov cx,ax ! exponent in cx mov ax,6(bx) and ax,#0100177 or ax,#0037400 ! load -1 exponent mov dx,4(bx) mov bx,2(bx) mov 4(bx),ax mov 2(bx),dx mov (bx),cx ret1: ! we get here on zero exp mov ax,6(bx) and ax,#0177 or ax,4(bx) jne 1f ! zero result xor ax,ax mov bx,2(bx) mov (bx),ax mov 2(bx),ax mov 4(bx),ax ret1: ! otherwise unnormalized number mov cx,6(bx) and cx,#0100177 mov dx,cx and cx,#0x8000 mov ax,#-1252: test dx,#0x80 jne 1f dec ax shl 4(bx),#1 rcl dx,#1 or dx,cx jmp 2b1: mov cx,4(bx) mov bx,2(bx) mov (bx),ax mov 2(bx),cx and dx,#0100177 or dx,#0037400 ! load -1 exponent mov 4(bx),dx ret.fef8: ! this could be simpler, if only the ! fxtract instruction was emulated properly mov bx,sp mov ax,10(bx) and ax,#077760 je 1f ! zero exponent mov cx,#4 shr ax,cl sub ax,#1022 mov cx,ax ! exponent in cx mov ax,10(bx) and ax,#0100017 or ax,#0037740 ! load -1 exponent push 8(bx) push 6(bx) push 4(bx) mov bx,2(bx) pop 2(bx) pop 4(bx) pop 6(bx) mov 8(bx),ax mov (bx),cx ret1: ! we get here on zero exp mov ax,10(bx) and ax,#017 or ax,8(bx) or ax,6(bx) or ax,4(bx) jne 1f ! zero result xor ax,ax mov bx,2(bx) mov (bx),ax mov 2(bx),ax mov 4(bx),ax mov 6(bx),ax mov 8(bx),ax ret1: ! otherwise unnormalized number mov cx,10(bx) and cx,#0100017 mov dx,cx and cx,#0x8000 mov ax,#-10212: test dx,#0x10 jne 1f dec ax shl 4(bx),#1 rcl 6(bx),#1 rcl 8(bx),#1 rcl dx,#1 or dx,cx jmp 2b1: and dx,#0100017 or dx,#0037740 ! load -1 exponent mov cx,8(bx) push 6(bx) push 4(bx) mov bx,2(bx) mov (bx),ax mov 8(bx),dx mov 6(bx),cx pop 2(bx) pop 4(bx) ret.cif4: mov bx,sp cmp 2(bx),#2 jne 1f wait filds 4(bx) wait fstps 2(bx) wait ret1: wait fildl 4(bx) wait fstps 4(bx) wait ret.cif8: mov bx,sp cmp 2(bx),#2 jne 1f wait filds 4(bx) wait fstpd 2(bx) wait ret1: wait fildl 4(bx) wait fstpd 2(bx) wait ret.cuf4: mov bx,sp cmp 2(bx),#2 jne 1f mov ax,4(bx) mov 2(bx),ax mov 4(bx),#0 wait fildl 2(bx) wait fstps 2(bx) wait ret1: wait fildl 4(bx) wait cmp 6(bx),#0 jge 1f2: wait fisubl bigmin wait fisubl bigmin1: wait fstps 4(bx) wait ret.cuf8: mov bx,sp cmp 2(bx),#2 jne 1f mov 6(bx),#01: wait fildl 4(bx) wait cmp 6(bx),#0 jge 1f2: wait fisubl bigmin wait fisubl bigmin1: wait fstpd 2(bx) wait ret.cfi: mov bx,sp push bx wait fstcw -2(bx) wait mov dx,-2(bx) or -2(bx),#0xc00 ! truncating mode wait fldcw -2(bx) pop ax cmp 4(bx),#4 jne 2f ! loc 4 loc ? cfi wait flds 6(bx) wait fistpl 6(bx) wait cmp 2(bx),#2 jne 1f mov ax,6(bx)1: mov 4(bx),dx wait fldcw 4(bx) wait ret2: ! loc 8 loc ? cfi wait fldd 6(bx) wait fistpl 10(bx) wait cmp 2(bx),#2 jne 1b mov ax,10(bx) jmp 1b.cfu: mov bx,sp push bx wait fstcw -2(bx) wait mov dx,-2(bx) and -2(bx),#0xf3ff or -2(bx),#0x400 ! to -infinity wait fldcw -2(bx) wait pop ax cmp 4(bx),#4 jne 2f ! loc 4 loc ? cfu flds 6(bx) wait fabs ! ??? wait fiaddl bigmin fistpl 6(bx) wait mov ax,8(bx) sub ax,bigmin+2 mov 8(bx),ax cmp 2(bx),#2 jne 1f mov ax,6(bx)1: mov 4(bx),dx wait fldcw 4(bx) wait ret2: wait ! loc 8 loc ? cfu fldd 6(bx) wait fabs ! ??? wait fiaddl bigmin fistpl 10(bx) wait mov ax,12(bx) sub ax,bigmin+2 mov 12(bx),ax cmp 2(bx),#2 jne 1b mov ax,10(bx) jmp 1b.cff4: mov bx,sp wait fldd 2(bx) wait fstcw 2(bx) wait mov dx,2(bx) and 2(bx),#0xf3ff ! set to rounding mode wait fldcw 2(bx) wait fstps 6(bx) mov 2(bx),dx wait fldcw 2(bx) wait ret.cff8: mov bx,sp wait flds 2(bx) wait fstpd 2(bx) wait ret.cmf4: mov bx,sp push bx ! room for 8087 status word xor cx,cx wait flds 6(bx) wait flds 2(bx) wait fcompp ! compare and pop operands wait fstsw -2(bx) wait mov ax,-2(bx) sahf je 1f jb 2f dec cx jmp 1f2: inc cx1: mov ax,cx pop bx ret.cmf8: mov bx,sp push bx ! room for 8087 status word xor cx,cx wait fldd 10(bx) wait fldd 2(bx) wait fcompp ! compare and pop operands wait fstsw -2(bx) wait mov ax,-2(bx) sahf je 1f jb 2f dec cx jmp 1f2: inc cx1: mov ax,cx pop bx ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -