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