Annotation of coherent/b/lib/libc/crt/i8086/ixcvt.s, revision 1.1

1.1     ! root        1: ////////
        !             2: /
        !             3: / Intel 8086 floating point.
        !             4: / double to int and unsigned int.
        !             5: / small model.
        !             6: /
        !             7: ////////
        !             8: 
        !             9:        .globl  idcvt
        !            10:        .globl  udcvt
        !            11:        .globl  _fpac_
        !            12: 
        !            13: ////////
        !            14: /
        !            15: / idcvt - double to integer.
        !            16: / udcvt - double to unsigned integer.
        !            17: /
        !            18: / compiler calling sequence:
        !            19: /      push    <double argument>
        !            20: /      call    [iu]dcvt
        !            21: /      add     sp,8
        !            22: /
        !            23: / outputs:
        !            24: /      ax=int or unsigned int result.
        !            25: /
        !            26: / uses:
        !            27: /      ax, bx, cx, dx
        !            28: /
        !            29: ////////
        !            30: 
        !            31: n      =       8                       / double argument
        !            32: 
        !            33: idcvt: push    si                      / standard
        !            34:        push    di                      / c
        !            35:        push    bp                      / function
        !            36:        mov     bp,sp                   / linkage
        !            37: 
        !            38:        mov     si,$15                  / si=largest exponent.
        !            39:        jmp     l0                      / go to common code.
        !            40: 
        !            41: udcvt: 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,$16                  / si=largest exponant.
        !            49: 
        !            50: l0:    mov     dx,n+6(bp)              / scoop up the front
        !            51:        mov     bx,n+4(bp)              / of the double.
        !            52: 
        !            53:        shl     bx,$1                   / slide
        !            54:        rcl     dx,$1                   / sign.
        !            55: 
        !            56:        movb    cl,dh                   / cl=biased exponant.
        !            57:        and     cx,$0xFF                / extract, test for all zeros.
        !            58:        jz      l3                      / if exp=0, it's 0.
        !            59:        sub     cx,$0x81                / unbias.
        !            60:        jl      l3                      / if small, it's 0.
        !            61:        cmp     cx,si                   / legal range ??
        !            62:        jge     l3                      / (error) nope, return 0.
        !            63: 
        !            64:        mov     ax,$0x01                / hidden bit.
        !            65:        jcxz    l2                      / skip if done.
        !            66: 
        !            67: l1:    shlb    bh,$1                   / shift
        !            68:        rclb    dl,$1                   / up
        !            69:        rcl     ax,$1                   / int.
        !            70:        loop    l1                      / do all bits.
        !            71: 
        !            72: l2:    testb   n+7(bp),$0x80           / check sign of double.
        !            73:        jz      l4                      / jump if pos.
        !            74:        neg     ax                      / fix.
        !            75:        jmp     l4                      / done.
        !            76: 
        !            77: l3:    sub     ax,ax                   / return 0.
        !            78: 
        !            79: l4:    pop     bp                      / standard
        !            80:        pop     di                      / c
        !            81:        pop     si                      / function
        !            82:        ret                             / return.

unix.superglobalmegacorp.com

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