Annotation of 43BSD/contrib/icon/lib/coact.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * coact(coexpr,value) - suspend current co-expression and activate
                      3:  *  coexpr with value.
                      4:  *
                      5:  * Outline:
                      6:  *    create procedure frame
                      7:  *    save sp and boundary in current co-expression stack header
                      8:  *    dereference result if it is local to co-expression
                      9:  *    change current stack to coexpr
                     10:  *    set activator in new co-expression stack header
                     11:  *    get sp and boundary from new co-expression stack header
                     12:  *    return value in new stack
                     13:  */
                     14: Global(_boundary)      /* Icon/C boundary */
                     15: Global(_current)       /* current co-expression */
                     16: Global(_file)          /* current file name */
                     17: Global(_line)          /* current line number */
                     18: Global(_deref)         /* dereference */
                     19: Global(_runerr)                /* runtime error */
                     20: Global(_coact)
                     21: 
                     22: #ifdef VAX
                     23: _coact:
                     24:        Mask    STDSV
                     25:        calls   $0,_setbound
                     26:        subl2   $8,sp           # Make room on stack for line and file
                     27:        movl    _line,-4(fp)    # and put them in the frame
                     28:        movl    _file,-8(fp)
                     29:        movl    _current+4,r2   # r2  <- pointer to current stack header
                     30:        movl    sp,16(r2)       # save the stack pointer,
                     31:        movl    ap,20(r2)       #  address pointer,
                     32:        movl    _boundary,24(r2)#  and boundary for the current co-expression
                     33:                                #  in its stack header
                     34:        moval   8(ap),r4        # point r4 at coexp argument on stack
                     35:        pushl   r4              #  and
                     36:        calls   $1,_deref       # dereference the co-expression
                     37:        cmpl    $D_ESTACK,(r4)+ # see if we indeed have a co-expression
                     38:                                #  and if we don't, it's runnerr 118,
                     39:                                #  "co-expression expected"
                     40:        jeql    f1
                     41:        tstl    -(r4)           # back up to point at bogus co-expression
                     42:        pushl   r4              #  and call runerr with the bogon as
                     43:        pushl   $118            #  its argument
                     44:        calls   $2,_runerr
                     45:        
                     46: f1:
                     47:        movl    (r4)+,r3        # point r3 at the co-expression stack header
                     48:        movl    $D_ESTACK,4(r3) # create the descriptor for the activator
                     49:        movl    r2,8(r3)        #  (r2 has pointer to previously current
                     50:                                #   co-expression, which is the activator)
                     51:        movl    r3,_current+4   # make the new co-expression current
                     52:        movl    16(r3),sp       # get stack pointer,
                     53:        movl    20(r3),ap       #  address pointer,
                     54:        movl    24(r3),fp       #  and frame pointer/boundary from header
                     55:        movl    fp,_boundary
                     56:        movl    4(ap),r1        # get nargs in r1
                     57:        movaq   8(ap)[r1],r0    # point r0 at target for result on stack,
                     58:        movl    r0,r1           #  and save the pointer
                     59:        movq    (r4),(r1)       # copy value from old stack to new
                     60:        movl    r1,r4           # point r4 at address of result on new stack
                     61:        movl    (r4),r1         # get type field of new result
                     62:        bitl    $F_NQUAL,r1     # if return value points into the old
                     63:        jeql    f11             #   co-expression, then it needs
                     64:        bitl    $F_VAR,r1       #   dereferencing
                     65:        jeql    f11
                     66:        bitl    $F_TVAR,r1
                     67:        jneq    f2
                     68:        movl    4(r4),r1        # get pointer field of result into r1
                     69:        jbr     f3
                     70: f2:
                     71:        bicl2   $~TYPEMASK,r1   # isolate type bits by turning off others
                     72:        cmpl    $T_TVSUBS,r1    # if we have a substring t.v., we have
                     73:        jneq    f11             #  to dereference it.
                     74:        movl    4(r4),r1        # point r1 at the string of the
                     75:        movl    16(r1),r1       #  trapped variable (cmt??)
                     76: f3:
                     77:        cmpl    r1,16(r2)       # if pointer is between old sp and sbase,
                     78:        jlss    f11             #  it needs dereferencing
                     79:        cmpl    r1,12(r2)       
                     80:        jgtr    f11
                     81:        pushl   r4
                     82:        calls   $1,_deref       # so, dereference it
                     83: f11:
                     84:        movl    -4(fp),_line    # restore line number
                     85:        movl    -8(fp),_file    #  and file name
                     86:        calls   $0,_clrbound
                     87:        ret                     # return.  This return will use the dummy
                     88:                                #  frame built above and we should land in
                     89:                                #  first frame built above
                     90: #endif VAX
                     91: #ifdef PORT
                     92: DummyFcn(_coact)
                     93: #endif PORT
                     94: #ifdef PDP11
                     95: / coact(coexpr,value) - suspend current co-expression and activate
                     96: / coexpr with value.
                     97: 
                     98: / NOTE:  this code is highly dependent on stack frame layout.
                     99: 
                    100: / Outline:
                    101: /    create procedure frame
                    102: /    save sp and boundary in current co-expression stack header
                    103: /    dereference result if it is local to co-expression
                    104: /    change current stack to coexpr
                    105: /    set activator in new co-expression stack header
                    106: /    get sp and boundary from new co-expression stack header
                    107: /    return value in new stack
                    108: 
                    109: / Register usage:
                    110: /    r2:  pointer to current co-expression stack header
                    111: /    r3:  pointer to new co-expression stack header
                    112: /    r4:  pointer to arguments to activate
                    113: /    r5:  procedure frame pointer
                    114: Global(csv)            / save registers
                    115: Global(cret)            / return as from C
                    116: _coact:
                    117:        jsr     r5,csv          / create procedure frame
                    118:        mov     _line,(sp)      / save current line number
                    119:        mov     _file,-(sp)     /   and file name
                    120:        mov     _current+2,r2   / r2 <- pointer to current stack header
                    121:        mov     sp,8.(r2)       / save sp
                    122:        mov     _boundary,12.(r2)  / save boundary
                    123:        mov     r5,r4           / r4 <- pointer to coexpr
                    124:        add     $6,r4
                    125:        mov     r4,-(sp)        / dereference coexpr
                    126:        jsr     pc,_deref
                    127:         tst     (sp)+
                    128:        cmp     $D_ESTACK,(r4)+ / check type field of coexpr
                    129:        beq     1f
                    130:        tst     -(r4)
                    131:        mov     r4,-(sp)
                    132:        mov     $118.,-(sp)     / runerr 118 - co-expression expected
                    133:        jsr     pc,_runerr
                    134: 1:
                    135:        mov     (r4)+,r3        / r3 <- pointer to new stack header
                    136:        mov     $D_ESTACK,2(r3) / set activator field of new stack header
                    137:        mov     r2,4(r3)
                    138:        mov     r3,_current+2   / make new stack header current
                    139:        mov     8.(r3),sp       / get new sp
                    140:        mov     12.(r3),r5      / get new r5 and
                    141:        mov     r5,_boundary    /   new boundary
                    142:         mov     4(r5),r0        / r0 <- location of result on new stack
                    143:         asl     r0              /    (r0 <- 6 + 4*nargs)
                    144:         asl     r0
                    145:         add     r5,r0
                    146:         add     $6,r0
                    147:         mov     r0,r1           / remember address of result on new stack
                    148:        mov     (r4)+,(r0)+     / copy value from old stack
                    149:        mov     (r4)+,(r0)
                    150:         mov     r1,r4           / r4 <- address of result on new stack
                    151:         mov     (r4), r1        / get type field of return value into r1
                    152:        bit     $F_NQUAL,r1     / if return value points into the old
                    153:        beq     1f              /   co-expression, then it needs
                    154:        bit     $F_VAR,r1       /   dereferencing
                    155:        beq     1f
                    156:        bit     $F_TVAR,r1
                    157:        bne     2f
                    158:        mov     2(r4),r1        / get pointer field into r1
                    159:        br      3f
                    160: 2:
                    161:        bic     $!TYPEMASK,r1   / check type code for substring t.v.
                    162:        cmp     $T_TVSUBS,r1    /   if not, it doesn't need
                    163:        bne     1f              /   dereferencing
                    164:        mov     2(r4),r1        / get pointer field from b_tvsubs
                    165:        mov     8.(r1),r1       /   block into r1
                    166: 3:
                    167:        cmp     r1,8.(r2)       / if pointer is between old
                    168:        blo     1f              /   sp and sbase it needs
                    169:        cmp     r1,6.(r2)       /   dereferencing
                    170:        bhi     1f
                    171:         mov     r4,(sp)         / dereference it
                    172:         jsr     pc,_deref
                    173:         tst     (sp)+
                    174: 1:
                    175:        mov     -8.(r5),_line   / restore line number
                    176:        mov     -10.(r5),_file  /   and file name
                    177:        jmp     cret            / return in new stack
                    178: #endif PDP11

unix.superglobalmegacorp.com

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