|
|
1.1 root 1: / $Header: /kernel/kersrc/i286/RCS/clist.s,v 1.1 92/07/17 15:21:23 bin Exp Locker: bin $
2:
3: / (lgl-
4: / The information contained herein is a trade secret of Mark Williams
5: / Company, and is confidential information. It is provided under a
6: / license agreement, and may be copied or disclosed only under the
7: / terms of that agreement. Any reproduction or disclosure of this
8: / material without the express written authorization of Mark Williams
9: / Company or persuant to the license agreement is unlawful.
10: /
11: / COHERENT Version 2.3.37
12: / Copyright (c) 1982, 1983, 1984.
13: / An unpublished work by Mark Williams Company, Chicago.
14: / All rights reserved.
15: / -lgl)
16: ////////
17: /
18: / i8086 coherent clist hack.
19: / cltinit, getq and putq have been tuned.
20: / the remaining functions are as produced by cc -S coh/clist.c
21: / with NCPCL substituted
22: /
23: / $Log: clist.s,v $
24: / Revision 1.1 92/07/17 15:21:23 bin
25: / Initial revision
26: /
27: / Revision 1.1 88/03/24 17:39:16 src
28: / Initial revision
29: /
30:
31: #include <sys/const.h>
32:
33: .shri
34: L10001: .word NCPCL+2
35: .globl cltinit_
36: cltinit_:
37: push si
38: push di
39: push bp
40: mov bp, sp
41: sub sp, $0x0C
42:
43: pushf / s =
44: cli / sphi()
45: sub di, di
46: mov ax, NCLIST_
47: imul cs:L10001
48: mov -0x0C(bp), ax
49: add ax, clistp_
50: mov -0x04(bp), ax
51:
52: L3: sub -0x04(bp), $NCPCL+2
53: mov ax, -0x04(bp)
54: cmp ax, clistp_
55: jb L2
56:
57: L10002: mov si, -0x04(bp)
58: mov (si), di
59: mov di, si
60: jmp L3
61:
62: L2: mov cltfree_, di
63: call spl_
64: add sp, $0x02
65:
66: mov sp, bp
67: pop bp
68: pop di
69: pop si
70: ret
71:
72: .globl getq_
73:
74: getq_:
75: mov dx, si
76: push bp
77: mov bp, sp
78:
79: mov bp, 4(bp) / bp = cqp
80: sub ax, ax / ax = 0
81: cmp (bp), ax / if (cqp->cq_cc == 0)
82: jne 0f
83: dec ax / return (-1)
84: jmp 2f
85:
86: 0: pushf / s =
87: cli / sphi()
88: mov si, 6(bp) / si = op = cqp->cq_op
89: mov bx, 8(bp) / bx = ox = cqp->cq_ox
90: movb al, 2(bx,si) / ax = op->cl_ch[ox]
91: dec (bp) / if (--cqp->cq_cc == 0)
92: je 0f
93: inc bx / ++ox
94: cmp bx, $NCPCL / if (ox == NCPL)
95: jne 1f
96:
97: 0: sub bx, bx / ox = 0;
98: mov cx, (si) / cx = np = op->cl_fp
99: mov 6(bp), cx / cqp->cq_op = np
100: cmp cx, bx / if (np == 0)
101: jne 0f
102: mov 2(bp), bx / cqp->cq_ip = 0
103: mov 4(bp), bx / cqp->cq_ix = 0
104:
105: 0: mov cx, cltfree_ / cx = tmp = cltfree
106: mov (si), cx / op->cl_fp = tmp
107: mov cltfree_, si / cltfree = op
108: cmp cltwant_, bx / if (cltwant != 0)
109: je 1f
110: mov cltwant_, bx / cltwant = 0
111: mov cx, $cltwant_ / wakeup(&cltwant)
112: push bx / save
113: push dx / save
114: push ax / save
115: push cx
116: call wakeup_
117: pop cx / clear stack
118: pop ax / restore
119: pop dx / restore
120: pop bx / restore
121:
122: 1: mov 8(bp), bx / cqp->cq_ox = ox
123: mov cx, ax
124: call spl_ / spl(s)
125: add sp, $2
126: mov ax, cx
127:
128: 2: pop bp
129: mov si, dx
130: ret
131:
132: .globl putq_
133:
134: putq_:
135: mov dx, si
136: push bp
137: mov bp, sp
138:
139: mov cx, 6(bp) / cx = c
140: mov bp, 4(bp) / bp = cqp
141: sub ax, ax / ax = 0
142: pushf / s =
143: cli / sphi()
144: mov si, 2(bp) / si = ip = cqp->cq_ip
145: mov bx, 4(bp) / bx = ix = cqp->cq_ix
146: cmp bx, ax / if (ix == 0)
147: jne 2f
148: mov si, cltfree_ / ip = cltfree
149: cmp si, ax / if (ip == 0)
150: jne 0f
151: call spl_ / spl(s)
152: add sp, $2
153: mov ax, $-1 / return (-1)
154: jmp 3f
155:
156: 0: mov bx, (si) / tmp = ip->cl_fp
157: mov cltfree_, bx / cltfree = tmp
158: mov (si), ax / ip->cl_fp = 0
159: mov bx, 2(bp) / np = cqp->cq_ip
160: cmp bx, ax / if (np == 0)
161: jne 0f
162: mov 6(bp), si / cqp->cq_op = ip
163: jmp 1f
164:
165: 0: mov (bx), si / np->cl_fp = ip
166:
167: 1: mov 2(bp), si / cqp->cq_ip = ip
168: mov bx, ax / bx = ix = cqp->cq_ix = 0
169:
170: 2: movb 2(bx,si), cl / ip->cl_ch[ix] = c
171: inc bx / ix++
172: cmp bx, $NCPCL / if (ix == NCPCL)
173: jne 0f
174: mov bx, ax / ix = 0
175:
176: 0: mov 4(bp), bx / cqp->cq_ix = ix
177: inc (bp) / cqp->cq_cc++
178: call spl_ / spl(s)
179: add sp, $2
180: mov ax, cx / return (c)
181:
182: 3: pop bp
183: mov si, dx
184: ret
185:
186: .globl clrq_
187:
188: clrq_:
189: push si
190: push di
191: push bp
192: mov bp, sp
193:
194: mov si, 0x08(bp)
195: call sphi_
196: mov di, ax
197:
198: L18: push si
199: call getq_
200: add sp, $0x02
201: or ax, ax
202: jge L18
203: push di
204: call spl_
205: add sp, $0x02
206:
207: pop bp
208: pop di
209: pop si
210: ret
211:
212: .globl waitq_
213:
214: waitq_:
215: push si
216: push di
217: push bp
218: mov bp, sp
219:
220: L21: cmp cltfree_, $0x00
221: jne L19
222: mov cltwant_, $0x01
223: sub ax, ax
224: push ax
225: push ax
226: mov ax, $0x0100
227: push ax
228: mov ax, $cltwant_
229: push ax
230: call sleep_
231: add sp, $0x08
232: jmp L21
233:
234: L19: pop bp
235: pop di
236: pop si
237: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.