123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615 |
- .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
- ! $Id$
- ! Implement interface to floating point package for Intel 8087
- .sect .rom
- one:
- .data2 1
- two:
- .data2 2
- bigmin:
- .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 2f
- 1: ! 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
- wait
- 2:
- 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 2f
- 1: ! 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
- wait
- 2:
- 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
- ret
- 1: ! 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
- ret
- 1: ! otherwise unnormalized number
- mov cx,6(bx)
- and cx,0100177
- mov dx,cx
- and cx,0x8000
- mov ax,-125
- 2:
- test dx,0x80
- jne 1f
- dec ax
- shl 4(bx),1
- rcl dx,1
- or dx,cx
- jmp 2b
- 1:
- 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
- ret
- 1: ! 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
- ret
- 1: ! otherwise unnormalized number
- mov cx,10(bx)
- and cx,0100017
- mov dx,cx
- and cx,0x8000
- mov ax,-1021
- 2:
- 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 2b
- 1:
- 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
- ret
- 1:
- 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
- ret
- 1:
- 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
- ret
- 1:
- wait
- fildl 4(bx)
- wait
- cmp 6(bx),0
- jge 1f
- 2:
- wait
- fisubl (bigmin)
- wait
- fisubl (bigmin)
- 1:
- wait
- fstps 4(bx)
- wait
- ret
- .cuf8:
- mov bx,sp
- cmp 2(bx),2
- jne 1f
- mov 6(bx),0
- 1:
- wait
- fildl 4(bx)
- wait
- cmp 6(bx),0
- jge 1f
- 2:
- wait
- fisubl (bigmin)
- wait
- fisubl (bigmin)
- 1:
- 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
- ret
- 2:
- ! 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
- ret
- 2:
- 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 1f
- 2:
- inc cx
- 1:
- 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 1f
- 2:
- inc cx
- 1:
- mov ax,cx
- pop bx
- ret
|