|
|
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.