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

1.1       root        1: ////////
                      2: /
                      3: / Intel 8086 floating point.
                      4: / integer types to double.
                      5: / small model.
                      6: /
                      7: ////////
                      8: 
                      9:        .globl  dicvt
                     10:        .globl  ducvt
                     11:        .globl  dlcvt
                     12:        .globl  dvcvt
                     13:        .globl  _fpac_
                     14: 
                     15: ////////
                     16: /
                     17: / ** dicvt -- convert integer to double float.
                     18: /
                     19: / this routine is called directly by the compiler to convert an integer
                     20: / into a double precision floating point number. no checking is done if
                     21: / the integer overflows when it is negated.
                     22: /
                     23: / compiler calling sequence:
                     24: /      push    <int argument>
                     25: /      call    dicvt
                     26: /      add     sp,2
                     27: /
                     28: / outputs:
                     29: /      _fpac_=result.
                     30: /
                     31: / uses:
                     32: /      ax, bx, cx, dx
                     33: /
                     34: ////////
                     35: 
                     36: i      =       8                       / int argument.
                     37: 
                     38: dicvt: push    si                      / standard
                     39:        push    di                      / c
                     40:        push    bp                      / function
                     41:        mov     bp,sp                   / linkage.
                     42: 
                     43:        sub     dx,dx                   / top half = 0.
                     44:        subb    bh,bh                   / bh=0 (positive)
                     45:        mov     ax,i(bp)                / get argument.
                     46:        or      ax,ax                   / check its sign,
                     47:        jns     l0                      / jump if positive.
                     48:        neg     ax                      / negate.
                     49:        movb    bh,$0x80                / set sign flag.
                     50:        jmp     l0                      / go to common code.
                     51: 
                     52: ////////
                     53: /
                     54: / ** ducvt -- convert unsigned integer to double float.
                     55: /
                     56: / this routine is called directly by the compiler to convert an unsigned
                     57: / integer to double precision floating point. no overflows are possible.
                     58: /
                     59: / compiler calling sequence:
                     60: /      push    <unsigned argument>
                     61: /      call    ducvt
                     62: /      add     sp,2
                     63: /
                     64: / outputs:
                     65: /      _fpac_=result.
                     66: /
                     67: / uses:
                     68: /      ax, bx, cx, dx
                     69: /
                     70: ////////
                     71: 
                     72: u      =       8                       / unsigned int argument.
                     73: 
                     74: ducvt: push    si                      / standard
                     75:        push    di                      / c
                     76:        push    bp                      / function
                     77:        mov     bp,sp                   / linkage.
                     78: 
                     79:        sub     dx,dx                   / top half = 0.
                     80:        subb    bh,bh                   / bh=0 (positive)
                     81:        mov     ax,u(bp)                / low half = argument.
                     82:        jmp     l0                      / go to common code.
                     83: 
                     84: ////////
                     85: /
                     86: / ** dlcvt -- convert long integer to double float.
                     87: / 
                     88: / this routine is called directly by the compiler to convert a long (32
                     89: / bit) integer to double precision floating point. no checking is  done
                     90: / for overflow when the long integer is negated.
                     91: /
                     92: / compiler calling sequence:
                     93: /      push    <long argument>
                     94: /      call    dlcvt
                     95: /      add     sp,4
                     96: /
                     97: / outputs:
                     98: /      _fpac_=result.
                     99: /
                    100: / uses:
                    101: /      ax, bx, cx, dx
                    102: /
                    103: ////////
                    104: 
                    105: l      =       8                       / long argument.
                    106: 
                    107: dlcvt: push    si                      / stadard
                    108:        push    di                      / c
                    109:        push    bp                      / function
                    110:        mov     bp,sp                   / linkage.
                    111: 
                    112:        subb    bh,bh                   / sign = positive.
                    113:        mov     dx,l+2(bp)              / fetch.
                    114:        mov     ax,l+0(bp)              / long.
                    115:        or      dx,dx                   / test the sign.
                    116:        jns     l0                      / positive, go to common code.
                    117:        neg     dx                      / negate
                    118:        neg     ax                      / the
                    119:        sbb     dx,$0                   / long int.
                    120:        movb    bh,$0x80                / set the sign flag.
                    121:        jmp     l0                      / go to common code.
                    122: 
                    123: ////////
                    124: /
                    125: / ** dvcvt -- convert unsigned long integer to double float
                    126: /
                    127: / this routine is called directly by the compiler to convert a long (32
                    128: / bit) unsigned integer to double precision floating point. no overflow
                    129: / is possible.
                    130: /
                    131: / compiler calling sequence:
                    132: /      push    <unsigned long argument>
                    133: /      call    dvcvt
                    134: /      add     sp,4
                    135: /
                    136: / outputs:
                    137: /      _fpac_=result.
                    138: /
                    139: / uses:
                    140: /      ax, bx, cx, dx
                    141: /
                    142: ////////
                    143: 
                    144: v      =       8                       / unsigned long argument.
                    145: 
                    146: dvcvt: push    si                      / standard
                    147:        push    di                      / c
                    148:        push    bp                      / function
                    149:        mov     bp,sp                   / linkage.
                    150: 
                    151:        subb    bh,bh                   / sign = positive.
                    152:        mov     dx,v+2(bp)              / fetch
                    153:        mov     ax,v+0(bp)              / unsigned long.
                    154: 
                    155: l0:    sub     cx,cx                   / exp=0 (for 0)
                    156:        mov     si,dx                   / test for
                    157:        or      si,ax                   / zeroness.
                    158:        jz      l3                      / jump if zero, exp=0, frac=0.
                    159: 
                    160:        movb    cl,$128+32              / cx=binary point to right of ax.
                    161: 
                    162: l1:    shl     ax,$1                   / shift up
                    163:        rcl     dx,$1                   / until
                    164:        jc      l2                      / the hidden bit
                    165:        decb    cl                      / just
                    166:        jmp     l1                      / appears.
                    167: 
                    168: l2:    shrb    cl,$1                   / make room
                    169:        rcr     dx,$1                   / for the
                    170:        rcr     ax,$1                   / sign bit.
                    171:        orb     cl,bh                   / zap in sign.
                    172: 
                    173: l3:    movb    _fpac_+7,cl             / save result
                    174:        mov     _fpac_+5,dx             / into                  (odd)
                    175:        mov     _fpac_+3,ax             / the                   (odd)
                    176:        sub     ax,ax                   / function
                    177:        movb    _fpac_+2,al             / return
                    178:        mov     _fpac_+0,ax             / location
                    179: 
                    180:        pop     bp                      / standard
                    181:        pop     di                      / c
                    182:        pop     si                      / function
                    183:        ret                             / return.

unix.superglobalmegacorp.com

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