12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- .sect .text; .sect .rom; .sect .data; .sect .bss
- .define .dvi4
- yl=6
- yh=8
- xl=10
- xh=12
- .sect .text
- .dvi4:
- push si
- push di
- mov si,sp ! copy of sp
- mov bx,yl(si)
- mov ax,yh(si)
- cwd
- mov di,dx
- cmp dx,ax
- jne 7f
- and dx,dx
- jge 1f
- neg bx
- je 7f
- 1:
- xor dx,dx
- mov cx,xl(si)
- mov ax,xh(si)
- and ax,ax
- jge 2f
- neg ax
- neg cx
- sbb ax,dx
- not di
- 2:
- div bx
- xchg ax,cx
- div bx ! cx = high abs(result), ax=low abs(result)
- 9:
- and di,di
- jge 1f
- neg cx
- neg ax
- sbb cx,0
- 1:
- ! cx is high order result
- ! ax is low order result
- mov dx,cx
- pop di
- pop si
- ret 8 ! result in ax/dx
- 7:
- push dx ! sign of y
- mov di,ax
- xor bx,bx
- and di,di
- jge 1f
- neg di
- neg yl(si)
- sbb di,bx
- 1:
- mov ax,xl(si)
- mov dx,xh(si)
- and dx,dx
- jge 1f
- neg dx
- neg ax
- sbb dx,bx
- not -2(si)
- 1:
- mov cx,16
- 1:
- shl ax,1
- rcl dx,1
- rcl bx,1
- cmp di,bx
- ja 3f
- jb 2f
- cmp yl(si),dx
- jbe 2f
- 3:
- loop 1b
- jmp 1f
- 2:
- sub dx,yl(si)
- sbb bx,di
- inc ax
- loop 1b
- 1:
- pop di ! di=sign of result,ax= result
- jmp 9b
|