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

1.1       root        1: ////////
                      2: /
                      3: / Intel 8086 C runtime.
                      4: / SMALL model.
                      5: /
                      6: ////////
                      7: 
                      8:        .globl  lrmod
                      9:        .globl  lrsgn
                     10:        .globl  llmod
                     11:        .globl  llsgn
                     12: 
                     13: ////////
                     14: /
                     15: / These four routines transform an unsigned operator into
                     16: / a signed operator. They are called with the arguments on the stack
                     17: / as pushed by the compiler, and a pointer to the "r" format unsigned
                     18: / operator routine in "ax". The C style call frame for the signed
                     19: / operator is created here.
                     20: /
                     21: ////////
                     22: 
                     23: alow   =       8
                     24: ahigh  =       10
                     25: bptr   =       12
                     26: blow   =       12
                     27: bhigh  =       14
                     28: fptr   =       -4
                     29: 
                     30: lrmod: mov     dx,$1                   / set remainder flag.
                     31:        jmp     l0
                     32: 
                     33: lrsgn: sub     dx,dx                   / clear remainder flag.
                     34:        jmp     l0
                     35: 
                     36: llmod: mov     dx,$0x8001              / set lvalue, remainder flags.
                     37:        jmp     l0
                     38: 
                     39: llsgn: mov     dx,$0x8000              / set lvalue flag.
                     40: 
                     41: l0:    push    si                      / standard
                     42:        push    di                      / c
                     43:        push    bp                      / function
                     44:        mov     bp,sp                   / linkage.
                     45: 
                     46:        push    bx                      / save bx.
                     47:        mov     bx,ax                   / function adr to bx.
                     48:        mov     di,dx                   / flags to di.
                     49:        push    bx                      / save function in fptr.
                     50:        sub     si,si                   / clear sign flag.
                     51:        or      di,di                   / check lvalue flag.
                     52:        jns     l1                      / rvalue passed.
                     53:        mov     bx,bptr(bp)             / grab address of operand abd
                     54:        mov     dx,2(bx)                / grab the b
                     55:        mov     ax,(bx)                 / operand.
                     56:        jmp     l2
                     57: 
                     58: l1:    mov     dx,bhigh(bp)
                     59:        mov     ax,blow(bp)
                     60: 
                     61: l2:    or      dx,dx                   / check sign.
                     62:        jns     l3                      / jump if operand positive.
                     63:        neg     dx                      / negate
                     64:        neg     ax                      / the
                     65:        sbb     dx,$0                   / operand.
                     66:        shr     di,$1                   / check remainder flag.
                     67:        jc      l3                      / jump if doing remainder.
                     68:        inc     si                      / flip result sign.
                     69: 
                     70: l3:    push    dx                      / push onto
                     71:        push    ax                      / stack as function arg.
                     72: 
                     73:        mov     dx,ahigh(bp)            / grab the
                     74:        mov     ax,alow(bp)             / other operand.
                     75:        or      dx,dx                   / check the operand sign.
                     76:        jns     l4                      / jump if positive.
                     77:        neg     dx                      / negate
                     78:        neg     ax                      / the
                     79:        sbb     dx,$0                   / operand.
                     80:        inc     si                      / and flip the sign.
                     81: 
                     82: l4:    push    dx                      / push other operand as
                     83:        push    ax                      / an argument.
                     84: 
                     85:        icall   fptr(bp)                / call unsigned op.
                     86:        add     sp,$10                  / pop off 5 words.
                     87: 
                     88:        shr     si,$1                   / do we need to negate ??
                     89:        jnc     l5                      / nope.
                     90:        neg     dx                      / negate 
                     91:        neg     ax                      / the
                     92:        sbb     dx,$0                   / result.
                     93: 
                     94: l5:    pop     bx                      / restore saved bx.
                     95:        mov     sp,bp                   / standard
                     96:        pop     bp                      / c
                     97:        pop     di                      / function
                     98:        pop     si                      / return
                     99:        ret                             / sequence.

unix.superglobalmegacorp.com

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