Annotation of 43BSD/contrib/icon/lib/cofail.s, revision 1.1

1.1     ! root        1: /*
        !             2:  * cofail(coexpr,value) - suspend current co-expression and activate
        !             3:  *  activator with failure, 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: Global(_fail)          /* signal failure */
        !            18: 
        !            19: Global(_cofail)
        !            20: #ifdef VAX
        !            21: _cofail:
        !            22:        Mask    STDSV
        !            23:        calls   $0,_setbound
        !            24:        subl2   $8,sp           # make room on stack for line and file
        !            25:        movl    _line,-4(fp)    # and put them in the frame
        !            26:        movl    _file,-8(fp)
        !            27:        movl    _current+4,r2   # r2 points at current stack header
        !            28:        movl    sp,16(r2)       # save the stack pointer,
        !            29:        movl    ap,20(r2)       #  address pointer,
        !            30:        movl    _boundary,24(r2) #  and boundary
        !            31:        movl    8(r2),r3        # r3 points to activator
        !            32:        movl    r3,_current+4   # make new stack header current
        !            33:        movl    16(r3),sp       # get new sp,
        !            34:        movl    20(r3),ap       #  ap,
        !            35:        movl    24(r3),fp       #  fp,
        !            36:        movl    fp,_boundary    #  and boundary
        !            37:        movl    -4(fp),_line    # restore line number
        !            38:        movl    -8(fp),_file    #  and file name
        !            39:        calls   $0,_fail        # fail in the new stack
        !            40: #endif VAX
        !            41: #ifdef PORT
        !            42: DummyFcn(_cofail)
        !            43: #endif PORT
        !            44: #ifdef PDP11
        !            45: / cofail(coexpr,value) - suspend current co-expression and activate
        !            46: / activator with failure, without changing activator's activator.
        !            47: 
        !            48: / NOTE:  this code is highly dependent on stack frame layout.
        !            49: 
        !            50: / Outline:
        !            51: /    create procedure frame
        !            52: /    save sp and boundary in current co-expression stack header
        !            53: /    change current stack to coexpr
        !            54: /    get sp and boundary from new co-expression stack header
        !            55: /    return value in new stack
        !            56: 
        !            57: / Register usage:
        !            58: /    r2:  pointer to current co-expression stack header
        !            59: /    r3:  pointer to new co-expression stack header
        !            60: /    r5:  procedure frame pointer
        !            61: 
        !            62: Global(csv)            / save registers
        !            63: Global(cret)            / return as from C
        !            64: 
        !            65: _cofail:
        !            66:        jsr     r5,csv          / create procedure frame
        !            67:        mov     _line,(sp)      / save current line number
        !            68:        mov     _file,-(sp)     /   and file name
        !            69:        mov     _current+2,r2   / r2 <- pointer to current stack header
        !            70:        mov     sp,8.(r2)       / save sp
        !            71:        mov     _boundary,12.(r2)  / save boundary
        !            72:         mov     4(r2),r3        / r3 <- pointer to activator
        !            73:        mov     r3,_current+2   / make new stack header current
        !            74:        mov     8.(r3),sp       / get new sp
        !            75:        mov     12.(r3),r5      / get new r5 and
        !            76:        mov     r5,_boundary    /   new boundary
        !            77:        mov     -8.(r5),_line   / restore line number
        !            78:        mov     -10.(r5),_file  /   and file name
        !            79:        jsr     pc,_fail        / fail in new stack
        !            80: #endif PDP11

unix.superglobalmegacorp.com

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