Annotation of coherent/b/lib/libc/gen/i8086/ldiv.m, revision 1.1.1.1

1.1       root        1: //////////
                      2: / i8086 general utilities library.
                      3: / ldiv()
                      4: / ANSI 4.10.6.4.
                      5: / Long division and remainder.
                      6: //////////
                      7: 
                      8: #include "larges.h"
                      9: 
                     10: //////////
                     11: / #include <stdlib.h>
                     12: / ldiv_t ldiv(long int numer, long int denom)
                     13: /
                     14: / Compute quotient and remainder of 'numer' by 'denom'.
                     15: / Return a pointer to a statically allocated ldiv_t object.
                     16: //////////
                     17: 
                     18:        .prvd
                     19: quot:  .word   0
                     20:        .word   0
                     21: rem:   .word   0
                     22:        .word   0
                     23: 
                     24: numer  =       6+RASIZE
                     25: denom  =       4+numer
                     26: 
                     27:        .shri
                     28:        .globl  ldiv_, vdiv
                     29: 
                     30: ldiv_:
                     31:        push    di
                     32:        push    si
                     33:        push    bp
                     34:        mov     bp, sp
                     35: 
                     36:        mov     ax, numer(bp)
                     37:        mov     dx, 2+numer(bp)         / Dividend to DX:AX
                     38:        mov     cx, denom(bp)
                     39:        mov     bx, 2+denom(bp)         / Divisor to BX:CX
                     40: 
                     41:        mov     bp, dx
                     42:        xor     bp, bx
                     43:        and     bp, $0x8000             / Quotient sign to sign bit of BP
                     44: 
                     45:        or      bx, bx
                     46:        jns     0f
                     47:        not     bx                      / Force divisor positive
                     48:        neg     cx
                     49:        sbb     bx, $-1
                     50: 0:
                     51:        or      dx, dx
                     52:        jns     0f
                     53:        or      bp, $1                  / Remainder sign to low bit of BP
                     54:        not     dx                      / Force dividend positive
                     55:        neg     ax
                     56:        sbb     dx, $-1
                     57: 0:
                     58:        Gcall   vdiv                    / Quotient to SI:DI, rem to DX:AX
                     59:        or      bp, bp
                     60:        jns     0f
                     61:        not     si                      / Negate quotient
                     62:        neg     di
                     63:        sbb     si, $-1
                     64: 0:
                     65:        and     bp, $1
                     66:        je      0f
                     67:        not     dx                      / Negate remainder
                     68:        neg     ax
                     69:        sbb     dx, $-1
                     70: 0:
                     71:        Map     (ds, bx, $@quot)
                     72:        mov     bx, $quot               / Destination to DS:BX
                     73:        mov     (bx), di
                     74:        mov     2(bx), si               / Store quotient
                     75:        mov     4(bx), ax
                     76:        mov     6(bx), dx               / Store remainder
                     77: 
                     78: #if    LARGE
                     79:        mov     dx, ds
                     80: #endif
                     81:        mov     ax, bx                  / Return pointer in DX:AX
                     82: 
                     83:        pop     bp
                     84:        pop     si
                     85:        pop     di
                     86:        Gret
                     87: 
                     88: / end of ldiv.m

unix.superglobalmegacorp.com

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