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

1.1       root        1: /*
                      2:  * coret(coexpr,value) - suspend current co-expression and activate
                      3:  *  activator with value, without changing activator's activator.
                      4:  *
                      5:  * Outline:
                      6:  *    create procedure frame
                      7:  *    save sp and boundary in current co-expression stack header
                      8:  *    change current stack to coexpr
                      9:  *    get sp and boundary from new co-expression stack header
                     10:  *    return value in new stack
                     11:  */
                     12: Global(_boundary)      /* Icon/C boundary */
                     13: Global(_current)       /* current co-expression */
                     14: Global(_file)          /* current file name */
                     15: Global(_line)          /* current line number */
                     16: Global(_deref)         /* dereference */
                     17: 
                     18: Global(_coret)
                     19: #ifdef VAX
                     20: _coret:
                     21:        Mask    STDSV
                     22:        calls   $0,_setbound
                     23:        subl2   $8,sp           # Make room on stack for line and file
                     24:        movl    _line,-4(fp)    # and put them in the frame
                     25:        movl    _file,-8(fp)
                     26:        movl    _current+4,r2   # r2  <- pointer to current stack header
                     27:        movl    sp,16(r2)       # save the stack pointer,
                     28:        movl    ap,20(r2)       #  address pointer,
                     29:        movl    _boundary,24(r2) #  and boundary for the current co-expression
                     30:                                #  in its stack header
                     31:        movl    ap,r4           # save ap for later use (to get the
                     32:                                #  result that we were passed
                     33:        movl    8(r2),r3        # r3 points to activator
                     34:        movl    r3,_current+4   # make new stack header current
                     35:        movl    16(r3),sp       # get new sp,
                     36:        movl    20(r3),ap       #  ap,
                     37:        movl    24(r3),fp       #  fp,
                     38:        movl    fp,_boundary    #  and boundary
                     39:        movq    8(r4),16(ap)    # copy arg0 of caller to our arg0, apparently
                     40:                                #  because we have two fake arguments (?)
                     41:        moval   16(ap),r4       # point r4 at our new result
                     42: 
                     43:        movl    (r4),r1         # get type field of new result
                     44:        bitl    $F_NQUAL,r1     # if return value points into the old
                     45:        jeql    f1              #   co-expression, then it needs
                     46:        bitl    $F_VAR,r1       #   dereferencing
                     47:        jeql    f1
                     48:        bitl    $F_TVAR,r1
                     49:        jneq    f2
                     50:        movl    4(r4),r1        # get pointer field of result into r1
                     51:        jbr     f3
                     52: f2:
                     53:        bicl2   $~TYPEMASK,r1   # isolate type bits by turning off others
                     54:        cmpl    $T_TVSUBS,r1    # if we have a substring t.v., we have
                     55:        jneq    f1              #  to dereference it.
                     56:        movl    4(r4),r1        # point r1 at the string of the
                     57:        movl    16(r1),r1       #  trapped variable
                     58: f3:
                     59:        cmpl    r1,16(r2)       # if pointer is between old sp and sbase,
                     60:        jlss    f1              #  it needs dereferencing
                     61:        cmpl    r1,12(r2)       
                     62:        jgtr    f1
                     63:        pushl   r4
                     64:        calls   $1,_deref       # so, dereference it
                     65: f1:
                     66:        movl    -4(fp),_line    # restore line number
                     67:        movl    -8(fp),_file    #  and file name
                     68:        calls   $0,_clrbound
                     69:        ret                     # return.  This return will use the dummy
                     70:                                #  frame built above and we should land in
                     71: #endif VAX
                     72: #ifdef PORT
                     73: DummyFcn(_coret)
                     74: #endif PORT
                     75: #ifdef PDP11
                     76: / coret(coexpr,value) - suspend current co-expression and activate
                     77: / activator with value, without changing activator's activator.
                     78: 
                     79: / NOTE:  this code is highly dependent on stack frame layout.
                     80: 
                     81: / Outline:
                     82: /    create procedure frame
                     83: /    save sp and boundary in current co-expression stack header
                     84: /    change current stack to coexpr
                     85: /    get sp and boundary from new co-expression stack header
                     86: /    return value in new stack
                     87: 
                     88: / Register usage:
                     89: /    r2:  pointer to current co-expression stack header
                     90: /    r3:  pointer to new co-expression stack header
                     91: /    r4:  pointer to arguments to activate
                     92: /    r5:  procedure frame pointer
                     93: Global(csv)            / save registers
                     94: Global(cret)            / return as from C
                     95: 
                     96: _coret:
                     97:        jsr     r5,csv          / create procedure frame
                     98:        mov     _line,(sp)      / save current line number
                     99:        mov     _file,-(sp)     /   and file name
                    100:        mov     _current+2,r2   / r2 <- pointer to current stack header
                    101:        mov     sp,8.(r2)       / save sp
                    102:        mov     _boundary,12.(r2)  / save boundary
                    103:        mov     r5,r4           / r4 <- pointer to top of stack
                    104:         mov     4(r2),r3        / r3 <- pointer to activator
                    105:        mov     r3,_current+2   / make new stack header current
                    106:        mov     8.(r3),sp       / get new sp
                    107:        mov     12.(r3),r5      / get new r5 and
                    108:        mov     r5,_boundary    /   new boundary
                    109:        mov     6(r4),10.(r5)   / copy value from old stack
                    110:        mov     8.(r4),12.(r5)
                    111:         mov     r5,r4           / r4 <- address of result on new stack
                    112:         add     $10.,r4
                    113:         mov     (r4), r1        / get type field of return value into r1
                    114:        bit     $F_NQUAL,r1     / if return value points into the old
                    115:        beq     1f              /   co-expression, then it needs
                    116:        bit     $F_VAR,r1       /   dereferencing
                    117:        beq     1f
                    118:        bit     $F_TVAR,r1
                    119:        bne     2f
                    120:        mov     2(r4),r1        / get pointer field into r1
                    121:        br      3f
                    122: 2:
                    123:        bic     $!TYPEMASK,r1   / check type code for substring t.v.
                    124:        cmp     $T_TVSUBS,r1    /   if not, it doesn't need
                    125:        bne     1f              /   dereferencing
                    126:        mov     2(r4),r1        / get pointer field from b_tvsubs
                    127:        mov     8.(r1),r1       /   block into r1
                    128: 3:
                    129:        cmp     r1,8.(r2)       / if pointer is between old
                    130:        blo     1f              /   sp and sbase it needs
                    131:        cmp     r1,6.(r2)       /   dereferencing
                    132:        bhi     1f
                    133:         mov     r4,-(sp)         / dereference result
                    134:         jsr     pc,_deref
                    135:         tst     (sp)+
                    136: 1:
                    137:        mov     -8.(r5),_line   / restore line number
                    138:        mov     -10.(r5),_file  /   and file name
                    139:        jmp     cret            / return in new stack
                    140: #endif PDP11

unix.superglobalmegacorp.com

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