-
Notifications
You must be signed in to change notification settings - Fork 85
/
tst3.src
371 lines (301 loc) · 7.91 KB
/
tst3.src
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
.page
.subttl 'tst3.src'
; .a=#buffers needed
; sets up buffer # and allocates lindx
getwch
sec ; set .c=1 indicate write
bcs getr2
getrch
clc ; set .c=0 indicate read
getr2
php ; save r/w flag (.c)
sta temp ; save #bufs needed
jsr frechn ; free any channels
jsr fndlnx ; get next lindx open
sta lindx
ldx sa
plp
bcc getr55
getr52 ora #$80
getr55 sta lintab,x ; save lindx in lintab
getbf
and #$3f
tay ; now get the buffers
lda #$ff
sta buf0,y
sta buf1,y
sta ss,y
getr3 dec temp
bmi getr4
jsr getbuf
bpl getr5
gberr jsr relbuf ; error ,rel bufs
lda #nochnl
jmp cmderr
getr5 sta buf0,y
dec temp
bmi getr4
jsr getbuf
bmi gberr
sta buf1,y
getr4 rts
; free chanl associated with sa
; free read and write chanls
; dont free chanl 15
frechn lda sa
cmp #$f
bne freco
rts
freco
frerd
frewrt ldx sa
lda lintab,x
cmp #$ff
beq fre25
and #$3f
sta lindx
lda #$ff
sta lintab,x
ldx lindx
lda #0
sta chnrdy,x
jsr relbuf
; release the lindx
relinx ldx lindx
lda #1
rel15 dex
bmi rel10
asl a
bne rel15
rel10 ora linuse ; 1=free 0=used
sta linuse
fre25 rts
; given sa , free its read chanl
; release buffers (lindx)
relbuf ldx lindx
lda buf0,x
cmp #$ff
beq rel1
pha
lda #$ff
sta buf0,x
pla
jsr frebuf
rel1 ldx lindx
lda buf1,x
cmp #$ff
beq rel2
pha
lda #$ff
sta buf1,x
pla
jsr frebuf
rel2 ldx lindx
lda ss,x
cmp #$ff
beq rel3
pha
lda #$ff
sta ss,x
pla
jsr frebuf
rel3 rts
; get a free buffer #
; regs destroyed: .a .x
; out: .a,.x= buf # or $ff if failed
; .n= 1 if failed
; if successful init jobs & lstjob
getbuf
tya ; save .y
pha
ldy #1
jsr fndbuf
bpl gbf1 ; found one
dey
jsr fndbuf
bpl gbf1 ; found one
jsr stlbuf ; steal one
tax ; test it
bmi gbf2 ; didn't find one
gbf1
lda jobs,x
bmi gbf1 ; wait for job free
lda drvnum
sta jobs,x ; clear job queue
sta lstjob,x
txa
asl a
tay
lda #2
sta buftab,y
gbf2
pla
tay ; restore .y
txa ; exit with buf # in .a & cc set
rts
; find a free buf # & set bit in bufuse
; all regs used
; in: .y= index into bufuse
; out: .x= buf # or $ff if failed
; .n= 1 if failed
fndbuf
ldx #7
fb1
lda bufuse,y ; search bufuse
and bmask,x
beq fb2 ; found a free one
dex
bpl fb1 ; until all bits are tested
rts
fb2 ; set it used
lda bufuse,y
eor bmask,x ; set bit
sta bufuse,y
txa
dey
bmi fb3 ; if .y then...
clc ; ...add 8 more
adc #8
fb3
tax ; leave in .x
fri20
rts
freiac ; free inactive buffer
ldx lindx
lda buf0,x
bmi fri10
txa
clc
adc #mxchns+1
tax
lda buf0,x
bpl fri20
fri10
cmp #$ff
beq fri20
pha
lda #$ff
sta buf0,x
pla
frebuf and #$f
tay
iny
ldx #16
freb1 ror bufuse+1
ror bufuse
dey
bne freb2
clc
freb2 dex
bpl freb1
rts
clrchn lda #14
sta sa
clrc1 jsr frechn
dec sa
bne clrc1
rts
cldchn lda #14
sta sa
clsd ldx sa
lda lintab,x
cmp #$ff
beq cld2
and #$3f
sta lindx
jsr getact
tax
lda lstjob,x
and #1
cmp drvnum
bne cld2
jsr frechn
cld2 dec sa
bpl clsd
rts
;********************************
;*********** s t l b u f ******
;********************************
; steal a buffer
; this rtn searches the channels
; in order of least recently used
; and steals the first inactive
; buffer it finds.
; input paramters:
; lrutbl - least recentyl
; used table
; output paramters:
; a <== buffer #
; register usage:
; x - channel index
; y - lrutbl index
;*******************************
stlbuf
lda t0
pha ; save t0
ldy #0
stl05
ldx lrutbl,y
lda buf0,x
bpl stl10 ; active
cmp #$ff
bne stl30 ; it's inactive
stl10
txa
clc
adc #mxchns+1
tax
lda buf0,x
bpl stl20
cmp #$ff
bne stl30
stl20
iny
cpy #mxchns-1
bcc stl05
ldx #$ff ; set failure
bne stl60 ; bra
stl30 ; steal the buffer if no error
stx t0
and #$3f
tax
stl40
lda jobs,x
bmi stl40 ; wait till done
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
jmp ptch54 ; *** rom ds 06/18/85 ***
nop
; cmp #2 ; errors?
; bcc stl50 ; ok
rtch54 ; return
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
ldx t0
cpx #mxchns+1
bcc stl10 ; check opposite slot
bcs stl20 ; check another channel
; found one, so lets steal it
stl50
ldy t0
lda #$ff
sta buf0,y ; clear slot
stl60
pla
sta t0
txa ; buf # in .a & set cc's
rts
; find a free lindx to use
; mark as used in linuse
fndlnx ldy #0
lda #1
fnd10 bit linuse ; 1=free 0=used
bne fnd30
iny
asl a
bne fnd10
lda #nochnl ; no free lindx available
jmp cmderr
fnd30 eor #$ff ; toggle bit mask
and linuse ; mark bit used
sta linuse
tya ; return lindx in .a
rts