Annotation of coherent/b/lib/libc/crt/i8086/lxcvt.s, revision 1.1.1.1

1.1       root        1: ////////
                      2: /
                      3: / Intel 8086 floating point.
                      4: / double to long and unsigned long.
                      5: / small model.
                      6: /
                      7: ////////
                      8: 
                      9:        .globl  ldcvt
                     10:        .globl  vdcvt
                     11:        .globl  _fpac_
                     12: 
                     13: ////////
                     14: /
                     15: / ldcvt - double to long integer.
                     16: / vdcvt - double to unsigned long integer.
                     17: /
                     18: / compiler calling sequence:
                     19: /      push    <double argument>
                     20: /      call    [lv]dcvt
                     21: /      add     sp,8
                     22: /
                     23: / outputs:
                     24: /      dx:ax=long or unsigned long result.
                     25: /
                     26: / uses:
                     27: /      ax, bx, cx, dx
                     28: /
                     29: ////////
                     30: 
                     31: n      =       8                       / double argument.
                     32: 
                     33: ldcvt: push    si                      / standard
                     34:        push    di                      / c
                     35:        push    bp                      / function
                     36:        mov     bp,sp                   / linkage
                     37: 
                     38:        mov     si,$31                  / si=largest exponent.
                     39:        jmp     l0                      / go to common code.
                     40: 
                     41: vdcvt: push    si                      / standard
                     42:        push    di                      / c
                     43:        push    bp                      / function
                     44:        mov     bp,sp                   / linkage
                     45: 
                     46:        testb   n+7(bp),$0x80           / double < 0 ??
                     47:        jnz     l3                      / (error) yes, return 0.
                     48:        mov     si,$32                  / si=largest exponant.
                     49: 
                     50: l0:    mov     bx,n+6(bp)              / scoop
                     51:        mov     dx,n+4(bp)              / up the front of
                     52:        mov     ax,n+2(bp)              / the double.
                     53: 
                     54:        shl     ax,$1                   / slide
                     55:        rcl     dx,$1                   / off the
                     56:        rcl     bx,$1                   / sign.
                     57: 
                     58:        movb    cl,bh                   / cl=biased exponant.
                     59:        and     cx,$0xFF                / extract, test for all zeros.
                     60:        jz      l3                      / if exp=0, it's 0.
                     61:        sub     cx,$0x81                / unbias.
                     62:        jl      l3                      / if small, it's 0.
                     63:        cmp     cx,si                   / legal range ??
                     64:        jge     l3                      / (error) nope, return 0.
                     65: 
                     66:        movb    bh,dh                   / get
                     67:        xchgb   bh,bl                   / 32 bits
                     68:        movb    dh,ah                   / into
                     69:        xchgb   dh,dl                   / the
                     70:        mov     si,dx                   / bx:si pair.
                     71: 
                     72:        sub     dx,dx                   / set up dx:ax with the
                     73:        mov     ax,$0x01                / hidden bit.
                     74:        jcxz    l2                      / skip if done.
                     75: 
                     76: l1:    shl     si,$1                   / shift
                     77:        rcl     bx,$1                   / up
                     78:        rcl     ax,$1                   / the
                     79:        rcl     dx,$1                   / long.
                     80:        loop    l1                      / do all bits.
                     81: 
                     82: l2:    testb   n+7(bp),$0x80           / check sign.
                     83:        jz      l4                      / jump if pos.
                     84:        neg     dx                      / convert
                     85:        neg     ax                      / to
                     86:        sbb     dx,$0                   / correct sign.
                     87:        jmp     l4                      / done.
                     88: 
                     89: l3:    sub     dx,dx                   / make up a 0 to
                     90:        mov     ax,dx                   / pass back.
                     91: 
                     92: l4:    pop     bp                      / standard
                     93:        pop     di                      / c
                     94:        pop     si                      / function
                     95:        ret                             / return.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.