|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.