|
|
1.1 root 1: .globl _reflag
2: .globl _coswitch
3: .globl _boundary
4: .globl _sp
5: .globl __brkend
6: .globl csv
7: .globl cret
8:
9: | coswitch(oldstate, newstate, first)
10: | int *oldstate, *newstate;
11: | int first;
12: _coswitch:
13: | save machine state on stack
14: push bp
15: mov bp,sp
16: push di
17: push si
18: push _boundary
19: mov bx,*4(bp)
20: mov (bx),sp
21: mov bx,*6(bp)
22: mov ax,*8(bp)
23: or ax,ax
24: jnz not_first
25: | if (first == 0) set up new stack
26: lea di,_sp
27: mov _boundary,di
28: mov ax,(bx)
29: mov sp,ax
30: sub ax,ax
31: push ax
32: push ax
33: call _interp
34: pop ax | clear args from stack
35: pop ax
36: mov ax,#badret
37: call _syserr
38:
39: not_first:
40: mov ax,(bx) | switch to new stack
41: mov sp,ax
42:
43: pop _boundary | and restore machine state from stack
44: pop si
45: pop di
46: pop bp
47: ret
48:
49: .data
50: badret:
51: .asciz "interp() returned in coswitch"
52:
53: .text
54: .globl _xruner
55: .globl _runerr
56: .globl _reflag
57: .globl _sp
58: .globl _abort
59:
60: | runerr turns off stack probes and calls xrunerr
61: | without this, calls to runerr might recurse
62: | infinitely
63: _runerr:
64: mov _reflag,#1 | disable stack probes
65: jmp _xruner
66:
67: _reflag: .word *0 | setting reflag disables stack probes
68: _boundary: .word __brkend | address of var representing limit on stack
69: | growth
70:
71: .text
72:
73: | csv - save registers and set up procedure frame
74: | verify that stack space is sufficient for interrupt
75: | handlers and routine arithmetic
76: csv:
77: ~csv=.
78: pop bx | bx gets return address
79: push bp
80: mov bp,sp
81: push di
82: push si
83:
84: sub sp,ax
85: cmp _reflag,#1
86: je csv_ok | stack probes disabled
87: mov ax,sp
88: mov di,_boundary
89: sub ax,(di)
90: sub ax,#128
91: ja csv_ok
92:
93: mov ax,#0
94: push ax
95: mov ax,#302
96: push ax
97: call _runerr
98: call _abort | runerr shouldn't return
99:
100: csv_ok:
101: jmp @bx
102:
103: | cret - restore saved registers and remove
104: | procedure frame
105: cret:
106: ~cret=.
107: lea sp,*-4(bp)
108: pop si
109: pop di
110: pop bp
111: ret
112:
113:
114: .data
115:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.