dos_compilers/Digital Research PLI-86 v1/FDIV2.A86
2024-06-30 12:01:25 -07:00

60 lines
1.6 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; Division by power of two (function)
cseg
public fdiv2
extrn ?signal:near
; entry:
; p1 -> fixed(7) power of two
; p2 -> floating point number
; exit:
; p1 -> (unchanged)
; p2 -> (unchanged)
; stack: p2 / (2 ** p1)
fdiv2: ;BX = .low(.p1)
mov si,[bx] ;SI = .p1
lods al ;AL = p1 (power of 2)
mov bx,2[bx] ;BX = .p2
; AL = power of 2, BX = .low byte of fp num
mov dx,[bx] ;DX = low and middle mantissa
mov cx,2[bx] ;CL = high mantissa, CH = exponent
test cx,7f80h ;exponent zero?
jz fdret ;to return from float div
dby2: ;divide by two
test al,al ;counted power of 2 to zero?
jz fdret ;return if so
dec al ;count power of two down
sub cx,80h ;count exponent down
test cx,7f80h ;test for underflow
jnz dby2 ;loop again if no underflow
; Underflow occurred, signal underflow condition
mov bx,offset siglst;signal parameter list
call ?signal ;signal underflow
sub cx,cx ;clear result to zero for default return
mov dx,cx
fdret: pop bx ;recall return address
push cx ;save high order fp num
push dx ;save low order fp num
jmp bx ;return to calling routine
dseg
siglst dw offset sigcod ;address of signal code
dw offset sigsub ;address of subcode
dw offset sigfil ;address of file code
dw offset sigaux ;address of aux message
; end of parameter vector, start of params
sigcod db 3 ;03 = underflow
sigsub db 128 ;arbitrary subcode for id
sigfil dw 0000 ;no associated file name
sigaux dw offset undmsg ;0000 if no aux message
undmsg db 32,'Underflow in Divide by Two',0
end