0
|
1 ********************************************************************
|
|
2 * IOMan - OS-9 Level One V2 I/O Manager module
|
|
3 *
|
|
4 * $Id$
|
|
5 *
|
|
6 * Ed. Comments Who YY/MM/DD
|
|
7 * ------------------------------------------------------------------
|
|
8 * 11 Tandy/Microware original version
|
|
9
|
|
10 nam IOMan
|
|
11 ttl OS-9 Level One V2 I/O Manager module
|
|
12
|
|
13 ifp1
|
|
14 use defsfile
|
|
15 endc
|
|
16
|
|
17 tylg set Systm+Objct
|
|
18 atrv set ReEnt+rev
|
|
19 rev set $01
|
|
20 * edition $0B = Stock OS-9 Level One Vr. 2.00 IOMan
|
|
21 * edition $0C = IO Queue sort bug fixed
|
|
22 edition equ $0C
|
|
23
|
|
24 mod eom,name,tylg,atrv,IOManEnt,size
|
|
25
|
|
26 size equ .
|
|
27
|
|
28 name fcs /IOMan/
|
|
29 fcb edition
|
|
30
|
|
31 * IOMan is called from OS9p2
|
|
32 IOManEnt equ *
|
|
33 * allocate device and polling tables
|
|
34 ldx <D.Init
|
|
35 lda PollCnt,x
|
|
36 ldb #POLSIZ
|
|
37 mul
|
|
38 pshs b,a
|
|
39 lda DevCnt,x
|
|
40 ldb #DEVSIZ
|
|
41 mul
|
|
42 pshs b,a
|
|
43 addd 2,s add devsize to polsiz
|
|
44 addd #$0018
|
|
45 addd #$00FF bring up to next page
|
|
46 clrb
|
|
47 os9 F$SRqMem
|
|
48 bcs Crash
|
|
49 * clear allocated mem
|
|
50 leax ,u
|
|
51 L0033 clr ,x+
|
|
52 subd #$0001
|
|
53 bhi L0033
|
|
54 stu <D.PolTbl
|
|
55 ldd ,s++ get dev size
|
|
56 leax d,u
|
|
57 stx <D.DevTbl
|
|
58 addd ,s++ get poll size
|
|
59 leax d,u
|
|
60 stx <D.CLTB
|
|
61 ldx <D.PthDBT
|
|
62 os9 F$All64
|
|
63 bcs Crash
|
|
64 stx <D.PthDBT
|
|
65 os9 F$Ret64
|
|
66 leax >DPoll,pcr
|
|
67 stx <D.Poll
|
|
68 * install I/O system calls
|
|
69 leay <IOCalls,pcr
|
|
70 os9 F$SSvc
|
|
71 rts return to OS9p2
|
|
72
|
|
73 Crash jmp [>$FFFE]
|
|
74
|
|
75 IOCalls fcb $7F
|
|
76 fdb UsrIO-*-2
|
|
77
|
|
78 fcb F$Load
|
|
79 fdb FLoad-*-2
|
|
80
|
|
81 fcb F$PErr
|
|
82 fdb FPErr-*-2
|
|
83
|
|
84 fcb F$IOQu+$80
|
|
85 fdb FIOQu-*-2
|
|
86
|
|
87 fcb $FF
|
|
88 fdb SysIO-*-2
|
|
89
|
|
90 fcb F$IRQ+$80
|
|
91 fdb FIRQ-*-2
|
|
92
|
|
93 fcb F$IODel+$80
|
|
94 fdb FIODel-*-2
|
|
95
|
|
96 fcb $80
|
|
97
|
|
98 FIODel ldx R$X,u
|
|
99 ldu <D.Init
|
|
100 ldb DevCnt,u get device count
|
|
101 ldu <D.DevTbl
|
|
102 L0083 ldy V$DESC,u
|
|
103 beq L0094
|
|
104 cmpx V$DESC,u
|
|
105 beq L009B
|
|
106 cmpx V$DRIV,u
|
|
107 beq L009B
|
|
108 cmpx V$FMGR,u
|
|
109 beq L009B
|
|
110 L0094 leau DEVSIZ,u
|
|
111 decb
|
|
112 bne L0083
|
|
113 clrb
|
|
114 rts
|
|
115 L009B comb
|
|
116 ldb #E$ModBsy
|
|
117 rts
|
|
118
|
|
119 UsrIODis fdb IAttach-UsrIODis
|
|
120 fdb IDetach-UsrIODis
|
|
121 fdb IDup-UsrIODis
|
|
122 fdb IUsrCall-UsrIODis
|
|
123 fdb IUsrCall-UsrIODis
|
|
124 fdb IMakDir-UsrIODis
|
|
125 fdb IChgDir-UsrIODis
|
|
126 fdb IDelete-UsrIODis
|
|
127 fdb UISeek-UsrIODis
|
|
128 fdb UIRead-UsrIODis
|
|
129 fdb UIWrite-UsrIODis
|
|
130 fdb UIRead-UsrIODis
|
|
131 fdb UIWrite-UsrIODis
|
|
132 fdb UIGetStt-UsrIODis
|
|
133 fdb UISeek-UsrIODis
|
|
134 fdb UIClose-UsrIODis
|
|
135 fdb IDeletX-UsrIODis
|
|
136
|
|
137 SysIODis fdb IAttach-SysIODis
|
|
138 fdb IDetach-SysIODis
|
|
139 fdb SIDup-SysIODis
|
|
140 fdb ISysCall-SysIODis
|
|
141 fdb ISysCall-SysIODis
|
|
142 fdb IMakDir-SysIODis
|
|
143 fdb IChgDir-SysIODis
|
|
144 fdb IDelete-SysIODis
|
|
145 fdb SISeek-SysIODis
|
|
146 fdb SIRead-SysIODis
|
|
147 fdb SIWrite-SysIODis
|
|
148 fdb SIRead-SysIODis
|
|
149 fdb SIWrite-SysIODis
|
|
150 fdb SIGetStt-SysIODis
|
|
151 fdb SISeek-SysIODis
|
|
152 fdb SIClose-SysIODis
|
|
153 fdb IDeletX-SysIODis
|
|
154
|
|
155 UsrIO leax <UsrIODis,pcr
|
|
156 bra IODsptch
|
|
157 SysIO leax <SysIODis,pcr
|
|
158 IODsptch cmpb #I$DeletX
|
|
159 bhi L00FA
|
|
160 pshs b
|
|
161 lslb multiply by 2
|
|
162 ldd b,x offset
|
|
163 leax d,x get addr
|
|
164 puls b
|
|
165 jmp ,x jump to it!
|
|
166 L00FA comb
|
|
167 ldb #E$UnkSvc
|
|
168 rts
|
|
169
|
|
170 IAttach ldb #$11
|
|
171 L0100 clr ,-s
|
|
172 decb
|
|
173 bpl L0100
|
|
174 stu <$10,s caller regs
|
|
175 lda R$A,u
|
|
176 sta $09,s device mode
|
|
177 ldx R$X,u
|
|
178 lda #Devic+0
|
|
179 os9 F$Link link to device desc.
|
|
180 bcs L0139
|
|
181 stu $04,s address of mod hdr
|
|
182 ldy <$10,s get caller regs
|
|
183 stx R$X,y save updated ptr
|
|
184 ldd M$Port+1,u get port addr
|
|
185 std $0C,s save on stack
|
|
186 ldd M$PDev,u get driver name
|
|
187 leax d,u point X to driver name
|
|
188 lda #Drivr+0
|
|
189 os9 F$Link link to driver
|
|
190 bcs L0139
|
|
191 stu ,s save driver addr on stack
|
|
192 ldu $04,s get addr of dev desc.
|
|
193 ldd M$FMgr,u get file mgr name
|
|
194 leax d,u point X to fmgr name
|
|
195 lda #FlMgr+0
|
|
196 os9 F$Link link to fmgr
|
|
197 L0139 bcc L0149
|
|
198 * error on attach, so detach
|
|
199 L013B stb <$11,s save fmgr addr on stack
|
|
200 leau ,s point U to S
|
|
201 os9 I$Detach
|
|
202 leas <$11,s clean up stack
|
|
203 comb
|
|
204 puls pc,b return to caller
|
|
205 L0149 stu $06,s save fmgr addr
|
|
206 ldx <D.Init
|
|
207 ldb DevCnt,x
|
|
208 lda DevCnt,x
|
|
209 ldu D.DevTbl
|
|
210 L0153 ldx V$DESC,u get desc addr
|
|
211 beq L0188
|
|
212 cmpx $04,s same?
|
|
213 bne L016E branch if not
|
|
214 ldx V$STAT,u get stat
|
|
215 bne L016C branch if zero
|
|
216 pshs a
|
|
217 lda V$USRS,u get user count
|
|
218 beq L0168
|
|
219 os9 F$IOQu
|
|
220 L0168 puls a
|
|
221 bra L0153
|
|
222 L016C stu $0E,s save dev entry on stack
|
|
223 L016E ldx V$DESC,u get dev desc ptr
|
|
224 ldy M$Port+1,x
|
|
225 cmpy $0C,s compare to port addr on stack
|
|
226 bne L0188
|
|
227 ldx V$DRIV,u
|
|
228 cmpx ,s compare to driver addr on stack
|
|
229 bne L0188
|
|
230 ldx V$STAT,u get static
|
|
231 stx $02,s save static on stack
|
|
232 tst V$USRS,u test user count
|
|
233 beq L0188 branch if zero
|
|
234 sta $0A,s store on stack
|
|
235 L0188 leau DEVSIZ,u go to next entry
|
|
236 decb decrement count
|
|
237 bne L0153 go back to loop if not zero
|
|
238 ldu $0E,s get dev entry off stack
|
|
239 lbne L01E6
|
|
240 ldu D.DevTbl
|
|
241 L0195 ldx V$DESC,u get dev desc ptr
|
|
242 beq L01A6 branch if zero
|
|
243 leau DEVSIZ,u
|
|
244 deca
|
|
245 bne L0195 continue loop
|
|
246 ldb #E$DevOvf device table overflow
|
|
247 bra L013B
|
|
248 L01A2 ldb #E$BMode bad mode
|
|
249 bra L013B
|
|
250 L01A6 ldx $02,s get static storage off stack
|
|
251 lbne L01DD
|
|
252 stu $0E,s save off dev entry on stack
|
|
253 ldx ,s get driver addr off stack
|
|
254 ldd M$Mem,x get memory requirement
|
|
255 addd #$00FF round up to next page
|
|
256 clrb
|
|
257 os9 F$SRqMem
|
|
258 lbcs L013B
|
|
259 stu $02,s save off on stack
|
|
260 L01BF clr ,u+ clear static mem
|
|
261 subd #$0001
|
|
262 bhi L01BF
|
|
263 ldd $0C,s get port addr off stack
|
|
264 ldu $02,s get static storage ptr
|
|
265 clr V.PAGE,u
|
|
266 std V.PORT,u save addr
|
|
267 ldy $04,s get dev desc addr
|
|
268 ldx ,s get driver addr
|
|
269 ldd M$Exec,x get driver exec
|
|
270 jsr d,x call Init routine
|
|
271 lbcs L013B
|
|
272 ldu $0E,s get dev entry
|
|
273 L01DD ldb #$08 copy 8 bytes from stack to dev entry
|
|
274 L01DF lda b,s
|
|
275 sta b,u
|
|
276 decb
|
|
277 bpl L01DF
|
|
278 L01E6 ldx V$DESC,u get dev desc
|
|
279 ldb M$Revs,x
|
|
280 lda $09,s get device mode off stack
|
|
281 anda M$Mode,x AND mode with desc mode
|
|
282 ldx V$DRIV,u get driver ptr
|
|
283 anda M$Mode,x AND mode with driver mode
|
|
284 cmpa $09,s compare with passed mode
|
|
285 lbne L01A2 branch if error
|
|
286 inc V$USRS,u else inc user count of dev entry
|
|
287 bne L01FE branch if not overflow from 255->0
|
|
288 dec V$USRS,u else dec
|
|
289 L01FE ldx <$10,s get caller regs
|
|
290 stu R$U,x
|
|
291 leas <$12,s restore stack
|
|
292 clrb
|
|
293 rts
|
|
294
|
|
295 IDetach ldu R$U,u
|
|
296 ldx V$DESC,u
|
|
297 ldb V$USRS,u get user count
|
|
298 bne L0218 branch if not zero
|
|
299 pshs u,b
|
|
300 ldu V$STAT,u
|
|
301 pshs u
|
|
302 bra L0254
|
|
303 L0218 lda #255
|
|
304 cmpa V$USRS,u 255 users?
|
|
305 lbeq L0283 branch if so
|
|
306 dec V$USRS,u else dec user count
|
|
307 lbne L0271 branch if dec not 0
|
|
308 ldx <D.Init
|
|
309 ldb DevCnt,x
|
|
310 pshs u,b
|
|
311 ldx V$STAT,u
|
|
312 clr V$STAT,u
|
|
313 clr V$STAT+1,u
|
|
314 ldy <D.DevTbl
|
|
315 L0235 cmpx V$STAT,y
|
|
316 beq L0267
|
|
317 leay DEVSIZ,y
|
|
318 decb
|
|
319 bne L0235
|
|
320 ldy <D.Proc
|
|
321 ldb P$ID,y
|
|
322 stb V$USRS,u
|
|
323 ldy V$DESC,u
|
|
324 ldu V$DRIV,u
|
|
325 exg x,u X pts to driver, U pts to static
|
|
326 ldd M$Exec,x
|
|
327 leax d,x
|
|
328 pshs u
|
|
329 jsr $0F,x call term routine
|
|
330 L0254 puls u
|
|
331 ldx 1,s get U from stack (dev entry to detach)
|
|
332 ldx V$DRIV,x
|
|
333 ldd M$Mem,x get memory requirements
|
|
334 addd #$00FF round up to next page
|
|
335 clrb
|
|
336 os9 F$SRtMem return mem
|
|
337 ldx 1,s get U from stack (dev entry to detach)
|
|
338 ldx V$DESC,x get dev desc ptr
|
|
339 L0267 puls u,b get U,B
|
|
340 ldx V$DESC,u
|
|
341 clr V$DESC,u
|
|
342 clr V$DESC+1,u
|
|
343 clr V$USRS,u
|
|
344 L0271 ldy V$DRIV,u
|
|
345 ldu V$FMGR,u
|
|
346 os9 F$UnLink unlink file manager
|
|
347 leau ,y
|
|
348 os9 F$UnLink unlink driver
|
|
349 leau ,x
|
|
350 os9 F$UnLink unlink descriptor
|
|
351 L0283 lbsr L04D9
|
|
352 clrb
|
|
353 rts
|
|
354
|
|
355 * user state I$Dup
|
|
356 IDup bsr FindPath
|
|
357 bcs IDupRTS
|
|
358 pshs x,a
|
|
359 lda R$A,u
|
|
360 lda a,x
|
|
361 bsr L02A1
|
|
362 bcs L029D
|
|
363 puls x,b
|
|
364 stb R$A,u
|
|
365 sta b,x
|
|
366 rts
|
|
367 L029D puls pc,x,a
|
|
368
|
|
369 * system state I$Dup
|
|
370 SIDup lda R$A,u
|
|
371 L02A1 lbsr FindPDsc
|
|
372 bcs IDupRTS
|
|
373 inc PD.CNT,y
|
|
374 IDupRTS rts
|
|
375
|
|
376
|
|
377 * find next free path position in current proc
|
|
378 FindPath ldx <D.Proc
|
|
379 leax <P$PATH,x
|
|
380 clra
|
|
381 L02AF tst a,x
|
|
382 beq L02BC
|
|
383 inca
|
|
384 cmpa #NumPaths
|
|
385 bcs L02AF
|
|
386 comb
|
|
387 ldb #E$PthFul
|
|
388 rts
|
|
389 L02BC andcc #^Carry
|
|
390 rts
|
|
391
|
|
392 IUsrCall bsr FindPath
|
|
393 bcs L02D1
|
|
394 pshs u,x,a
|
|
395 bsr ISysCall
|
|
396 puls u,x,a
|
|
397 bcs L02D1
|
|
398 ldb R$A,u
|
|
399 stb a,x
|
|
400 sta R$A,u
|
|
401 L02D1 rts
|
|
402
|
|
403 ISysCall pshs b
|
|
404 ldb R$A,u
|
|
405 bsr L0349
|
|
406 bcs L02E6
|
|
407 puls b
|
|
408 lbsr CallFMgr
|
|
409 bcs L02F5
|
|
410 lda PD.PD,y
|
|
411 sta R$A,u
|
|
412 rts
|
|
413 L02E6 puls pc,a
|
|
414
|
|
415 * make directory
|
|
416 IMakDir pshs b
|
|
417 ldb #DIR.+WRITE.
|
|
418 L02EC bsr L0349
|
|
419 bcs L02E6
|
|
420 puls b
|
|
421 lbsr CallFMgr
|
|
422 L02F5 pshs b,cc
|
|
423 ldu PD.DEV,y
|
|
424 os9 I$Detach
|
|
425 lda PD.PD,y
|
|
426 ldx <D.PthDBT
|
|
427 os9 F$Ret64
|
|
428 puls pc,b,cc
|
|
429
|
|
430 * change directory
|
|
431 IChgDir pshs b
|
|
432 ldb R$A,u
|
|
433 orb #DIR.
|
|
434 bsr L0349
|
|
435 bcs L02E6
|
|
436 puls b
|
|
437 lbsr CallFMgr
|
|
438 bcs L02F5
|
|
439 ldu <D.Proc
|
|
440 ldb PD.MOD,y
|
|
441 bitb #PWRIT.+PREAD.+UPDAT.
|
|
442 beq L0329
|
|
443 ldx PD.DEV,y
|
|
444 stx <P$DIO,u
|
|
445 inc V$USRS,x
|
|
446 bne L0329
|
|
447 dec V$USRS,x
|
|
448 L0329 bitb #PEXEC.+EXEC.
|
|
449 beq L0338
|
|
450 ldx PD.DEV,y
|
|
451 stx <P$DIO+6,u
|
|
452 inc V$USRS,x
|
|
453 bne L0338
|
|
454 dec V$USRS,x
|
|
455 L0338 clrb
|
|
456 bra L02F5
|
|
457
|
|
458 IDelete pshs b
|
|
459 ldb #$02
|
|
460 bra L02EC
|
|
461
|
|
462 IDeletX ldb #$87
|
|
463 pshs b
|
|
464 ldb $01,u
|
|
465 bra L02EC
|
|
466
|
|
467 * create path descriptor and initialize
|
|
468 * Entry:
|
|
469 * B = path mode
|
|
470 L0349 pshs u
|
|
471 ldx <D.PthDBT
|
|
472 os9 F$All64
|
|
473 bcs L03A8
|
|
474 inc PD.CNT,y
|
|
475 stb PD.MOD,y
|
|
476 ldx R$X,u
|
|
477 L0358 lda ,x+
|
|
478 cmpa #$20
|
|
479 beq L0358
|
|
480 leax -1,x
|
|
481 stx R$X,u
|
|
482 ldb PD.MOD,y
|
|
483 cmpa #PDELIM
|
|
484 beq L037E
|
|
485 ldx <D.Proc
|
|
486 bitb #PEXEC.+EXEC.
|
|
487 beq L0373
|
|
488 ldx <P$DIO+6,x
|
|
489 bra L0376
|
|
490 L0373 ldx <P$DIO,x
|
|
491 L0376 beq L03AA
|
|
492 ldx V$DESC,x
|
|
493 ldd M$Name,x
|
|
494 leax d,x
|
|
495 L037E pshs y
|
|
496 os9 F$PrsNam
|
|
497 puls y
|
|
498 bcs L03AA
|
|
499 lda PD.MOD,y
|
|
500 os9 I$Attach
|
|
501 stu PD.DEV,y
|
|
502 bcs L03AC
|
|
503 ldx V$DESC,u
|
|
504 leax <M$Opt,x
|
|
505 ldb ,x+
|
|
506 leau <PD.DTP,y
|
|
507 cmpb #$20
|
|
508 bls L03A4
|
|
509 ldb #$1F
|
|
510 L03A0 lda ,x+
|
|
511 sta ,u+
|
|
512 L03A4 decb
|
|
513 bpl L03A0
|
|
514 clrb
|
|
515 L03A8 puls pc,u
|
|
516 L03AA ldb #E$BPNam
|
|
517 L03AC pshs b
|
|
518 lda ,y
|
|
519 ldx <D.PthDBT
|
|
520 os9 F$Ret64
|
|
521 puls b
|
|
522 coma
|
|
523 bra L03A8
|
|
524 L03BA lda $01,u
|
|
525 cmpa #$10
|
|
526 bcc L03CB
|
|
527 ldx <D.Proc
|
|
528 leax <$26,x
|
|
529 andcc #^Carry
|
|
530 lda a,x
|
|
531 bne L03CE
|
|
532 L03CB comb
|
|
533 ldb #E$BPNum
|
|
534 L03CE rts
|
|
535
|
|
536 UISeek bsr L03BA
|
|
537 bcc GetPDsc
|
|
538 rts
|
|
539
|
|
540 SISeek lda R$A,u
|
|
541 GetPDsc bsr FindPDsc
|
|
542 lbcc CallFMgr
|
|
543 rts
|
|
544
|
|
545 UIRead bsr L03BA
|
|
546 bcc L03E4
|
|
547 rts
|
|
548
|
|
549 SIRead lda R$A,u
|
|
550 L03E4 pshs b
|
|
551 ldb #$05
|
|
552 L03E8 bsr FindPDsc
|
|
553 bcs L040B
|
|
554 bitb $01,y
|
|
555 beq L0409
|
|
556 ldd $06,u
|
|
557 beq L03F8
|
|
558 addd $04,u
|
|
559 bcs L03FD
|
|
560 L03F8 puls b
|
|
561 lbra CallFMgr
|
|
562 L03FD ldb #$F4
|
|
563 lda ,s
|
|
564 bita #$02
|
|
565 beq L040B
|
|
566 ldb #$F5
|
|
567 bra L040B
|
|
568 L0409 ldb #E$BMode
|
|
569 L040B com ,s+
|
|
570 rts
|
|
571
|
|
572 UIWrite bsr L03BA
|
|
573 bcc L0415
|
|
574 rts
|
|
575
|
|
576 SIWrite lda R$A,u
|
|
577 L0415 pshs b
|
|
578 ldb #$02
|
|
579 bra L03E8
|
|
580
|
|
581
|
|
582 * find path descriptor of path passed in A
|
|
583 * Exit:
|
|
584 * Y = addr of path desc (if no error)
|
|
585 FindPDsc pshs x
|
|
586 ldx <D.PthDBT
|
|
587 os9 F$Find64
|
|
588 puls x
|
|
589 lbcs L03CB
|
|
590 L0428 rts
|
|
591
|
|
592 UIGetStt lbsr L03BA
|
|
593 bcc L0431
|
|
594 rts
|
|
595
|
|
596 SIGetStt lda R$A,u
|
|
597 L0431 pshs b,a
|
|
598 lda R$B,u
|
|
599 sta 1,s place in B on stack
|
|
600 puls a get A
|
|
601 bsr GetPDsc
|
|
602 puls a A holds func code
|
|
603 pshs b,cc
|
|
604 ldb <PD.DTP,y
|
|
605 cmpb #DT.NFM
|
|
606 beq L044D
|
|
607 tsta test func code
|
|
608 beq GSOpt
|
|
609 cmpa #SS.DevNm
|
|
610 beq GSDevNm
|
|
611 L044D puls pc,b,cc
|
|
612 GSOpt leax <PD.DTP,y
|
|
613 L0452 ldy R$X,u
|
|
614 ldb #32
|
|
615 L0457 lda ,x+ copy 32 bytes from X to Y
|
|
616 sta ,y+
|
|
617 decb
|
|
618 bne L0457
|
|
619 leas 2,s fix stack
|
|
620 clrb
|
|
621 rts
|
|
622 * get device name
|
|
623 GSDevNm ldx PD.DEV,y
|
|
624 ldx V$DESC,x
|
|
625 ldd M$Name,x
|
|
626 leax d,x
|
|
627 bra L0452
|
|
628
|
|
629 UIClose lbsr L03BA
|
|
630 bcs L0428
|
|
631 pshs b
|
|
632 ldb R$A,u
|
|
633 clr b,x
|
|
634 puls b
|
|
635 bra L047D
|
|
636
|
|
637 SIClose lda R$A,u
|
|
638 L047D bsr FindPDsc
|
|
639 bcs L0428
|
|
640 dec PD.CNT,y
|
|
641 tst PD.CPR,y
|
|
642 bne L0489
|
|
643 bsr CallFMgr
|
|
644 L0489 tst PD.CNT,y
|
|
645 bne L0428
|
|
646 lbra L02F5
|
|
647
|
|
648 L0490 os9 F$IOQu
|
|
649 comb
|
|
650 ldb <P$Signal,x
|
|
651 bne L04A4
|
|
652 L0499 ldx <D.Proc
|
|
653 ldb P$ID,x
|
|
654 clra
|
|
655 lda PD.CPR,y
|
|
656 bne L0490
|
|
657 stb PD.CPR,y
|
|
658 L04A4 rts
|
|
659
|
|
660 * B = entry point into FMgr
|
|
661 * Y = path desc
|
|
662 CallFMgr pshs u,y,x,b
|
|
663 bsr L0499
|
|
664 bcs L04C1
|
|
665 stu PD.RGS,y
|
|
666 lda <PD.DTP,y
|
|
667 ldx PD.DEV,y
|
|
668 ldx V$FMGR,x
|
|
669 ldd M$Exec,x
|
|
670 leax d,x
|
|
671 ldb ,s
|
|
672 subb #$83 subtract offset from B
|
|
673 lda #$03 size of one entry
|
|
674 mul compute
|
|
675 jsr d,x branch into file manager
|
|
676 L04C1 pshs b,cc
|
|
677 bsr L04D9
|
|
678 ldy $05,s get path desc off stack
|
|
679 lda <PD.DTP,y
|
|
680 ldx <D.Proc
|
|
681 lda P$ID,x
|
|
682 cmpa PD.CPR,y
|
|
683 bne L04D5
|
|
684 clr PD.CPR,y
|
|
685 L04D5 puls b,cc
|
|
686 puls pc,u,y,x,a
|
|
687
|
|
688 L04D9 pshs y,x
|
|
689 ldy <D.Proc
|
|
690 lda <P$IOQN,y
|
|
691 beq L04F3
|
|
692 clr <P$IOQN,y
|
|
693 ldb #S$Wake
|
|
694 os9 F$Send
|
|
695 ldx <D.PrcDBT
|
|
696 os9 F$Find64
|
|
697 clr <P$IOQP,y
|
|
698 L04F3 clrb
|
|
699 puls pc,y,x
|
|
700
|
|
701 * IRQ install routine
|
|
702 FIRQ ldx R$X,u
|
|
703 ldb ,x B = flip byte
|
|
704 ldx 1,x X = mask/priority
|
|
705 clra
|
|
706 pshs cc
|
|
707 pshs x,b
|
|
708 ldx <D.Init
|
|
709 ldb PollCnt,x
|
|
710 ldx <D.PolTbl
|
|
711 ldy R$X,u
|
|
712 beq RmvIRQEn
|
|
713 tst 1,s mask byte
|
|
714 beq L0572
|
|
715 decb dec poll table count
|
|
716 lda #POLSIZ
|
|
717 mul
|
|
718 leax d,x point to last entry in table
|
|
719 lda Q$MASK,x
|
|
720 bne L0572
|
|
721 orcc #FIRQMask+IRQMask
|
|
722 L051C ldb 2,s get priority byte
|
|
723 cmpb -1,x compare with prev entry's prior
|
|
724 bcs L052F
|
|
725 ldb #POLSIZ else copy prev entry
|
|
726 L0524 lda ,-x
|
|
727 sta POLSIZ,x
|
|
728 decb
|
|
729 bne L0524
|
|
730 cmpx <D.PolTbl
|
|
731 bhi L051C
|
|
732 L052F ldd R$D,u get dev stat reg
|
|
733 std Q$POLL,x save it
|
|
734 ldd ,s++ get flip/mask
|
|
735 sta Q$FLIP,x save flip
|
|
736 stb Q$MASK,x save mask
|
|
737 ldb ,s+ get priority
|
|
738 stb Q$PRTY,x save priority
|
|
739 ldd R$Y,u get IRQ svc addr
|
|
740 std Q$SERV,x save
|
|
741 ldd R$U,u get IRQ svc mem ptr
|
|
742 std Q$STAT,x save
|
|
743 puls pc,cc
|
|
744 * remove IRQ poll entry
|
|
745 RmvIRQEn leas 4,s clean stack
|
|
746 ldy R$U,u
|
|
747 L054C cmpy Q$STAT,x
|
|
748 beq L0558
|
|
749 leax POLSIZ,x
|
|
750 decb
|
|
751 bne L054C
|
|
752 clrb
|
|
753 rts
|
|
754 L0558 pshs b,cc
|
|
755 orcc #FIRQMask+IRQMask
|
|
756 bra L0565
|
|
757 L055E ldb POLSIZ,x
|
|
758 stb ,x+
|
|
759 deca
|
|
760 bne L055E
|
|
761 L0565 lda #POLSIZ
|
|
762 dec 1,s dec count
|
|
763 bne L055E
|
|
764 L056B clr ,x+
|
|
765 deca
|
|
766 bne L056B
|
|
767 puls pc,a,cc
|
|
768 L0572 leas 4,s clean stack
|
|
769 L0574 comb
|
|
770 ldb #E$Poll
|
|
771 rts
|
|
772
|
|
773 * IRQ polling routine
|
|
774 DPoll ldy <D.PolTbl
|
|
775 ldx <D.Init
|
|
776 ldb PollCnt,x
|
|
777 bra L0586
|
|
778 L0581 leay POLSIZ,y
|
|
779 decb
|
|
780 beq L0574
|
|
781 L0586 lda [Q$POLL,y]
|
|
782 eora Q$FLIP,y
|
|
783 bita Q$MASK,y
|
|
784 beq L0581
|
|
785 ldu Q$STAT,y
|
|
786 pshs y,b
|
|
787 jsr [<Q$SERV,y]
|
|
788 puls y,b
|
|
789 bcs L0581
|
|
790 rts
|
|
791
|
|
792 * load a module
|
|
793 FLoad pshs u
|
|
794 ldx R$X,u
|
|
795 bsr L05BC
|
|
796 bcs L05BA
|
|
797 inc $02,u increment link count
|
|
798 ldy ,u get mod header addr
|
|
799 ldu ,s get caller regs
|
|
800 stx R$X,u
|
|
801 sty R$U,u
|
|
802 lda M$Type,y
|
|
803 ldb M$Revs,y
|
|
804 std R$D,u
|
|
805 ldd M$Exec,y
|
|
806 leax d,y
|
|
807 stx R$Y,u
|
|
808 L05BA puls pc,u
|
|
809
|
|
810 L05BC lda #EXEC.
|
|
811 os9 I$Open
|
|
812 bcs L0632
|
|
813 leas -$0A,s make room on stack
|
|
814 ldu #$0000
|
|
815 pshs u,y,x
|
|
816 sta 6,s save path
|
|
817 L05CC ldd 4,s get U (caller regs) from stack
|
|
818 bne L05D2
|
|
819 stu 4,s
|
|
820 L05D2 lda 6,s get path
|
|
821 leax 7,s point to place on stack
|
|
822 ldy #M$IDSize read M$IDSize bytes
|
|
823 os9 I$Read
|
|
824 bcs L061E
|
|
825 ldd ,x
|
|
826 cmpd #M$ID12
|
|
827 bne L061C
|
|
828 ldd $09,s get module size
|
|
829 os9 F$SRqMem allocate mem
|
|
830 bcs L061E
|
|
831 ldb #M$IDSize
|
|
832 L05F0 lda ,x+ copy over first M$IDSize bytes
|
|
833 sta ,u+
|
|
834 decb
|
|
835 bne L05F0
|
|
836 lda $06,s get path
|
|
837 leax ,u point X at updated U
|
|
838 ldu $09,s get module size
|
|
839 leay -M$IDSize,u subtract count
|
|
840 os9 I$Read
|
|
841 leax -M$IDSize,x
|
|
842 bcs L060B
|
|
843 os9 F$VModul validate module
|
|
844 bcc L05CC
|
|
845 L060B pshs u,b
|
|
846 leau ,x point U at memory allocated
|
|
847 ldd M$Size,x
|
|
848 os9 F$SRtMem return mem
|
|
849 puls u,b
|
|
850 cmpb #E$KwnMod
|
|
851 beq L05CC
|
|
852 bra L061E
|
|
853 L061C ldb #E$BMID
|
|
854 L061E puls u,y,x
|
|
855 lda ,s get path
|
|
856 stb ,s save error code
|
|
857 os9 I$Close close path
|
|
858 ldb ,s
|
|
859 leas $0A,s clear up stack
|
|
860 cmpu #$0000
|
|
861 bne L0632
|
|
862 coma
|
|
863 L0632 rts
|
|
864
|
|
865
|
|
866 ErrHead fcc /ERROR #/
|
|
867 ErrNum equ *-ErrHead
|
|
868 fcb $2F,$3A,$30,$0D
|
|
869 ErrLen equ *-ErrHead
|
|
870
|
|
871 FPErr ldx <D.Proc
|
|
872 lda <P$PATH+2,x get stderr path
|
|
873 beq L0674
|
|
874 leas -ErrLen,s make room on stack
|
|
875 * copy error message to stack
|
|
876 leax <ErrHead,pcr
|
|
877 leay ,s
|
|
878 L064C lda ,x+
|
|
879 sta ,y+
|
|
880 cmpa #$0D
|
|
881 bne L064C
|
|
882 ldb R$B,u get error #
|
|
883 L0656 inc ErrNum+0,s
|
|
884 subb #$64
|
|
885 bcc L0656
|
|
886 L065C dec ErrNum+1,s
|
|
887 addb #$0A
|
|
888 bcc L065C
|
|
889 addb #$30
|
|
890 stb ErrNum+2,s
|
|
891 ldx <D.Proc
|
|
892 leax ,s point to error message
|
|
893 ldu <D.Proc
|
|
894 lda <P$PATH+2,u
|
|
895 os9 I$WritLn write message
|
|
896 leas ErrLen,s fix up stack
|
|
897 L0674 rts
|
|
898
|
|
899 FIOQu ldy <D.Proc
|
|
900 L0678 lda <P$IOQN,y
|
|
901 beq L06A0
|
|
902 cmpa R$A,u
|
|
903 bne L0699
|
|
904 clr <P$IOQN,y
|
|
905 ldx <D.PrcDBT
|
|
906 os9 F$Find64
|
|
907 lbcs L070F
|
|
908 clr <P$IOQP,y
|
|
909 ldb #S$Wake
|
|
910 os9 F$Send
|
|
911 ldu <D.Proc
|
|
912 bra L06AB
|
|
913 L0699 ldx <D.PrcDBT
|
|
914 os9 F$Find64
|
|
915 bcc L0678
|
|
916 L06A0 lda R$A,u
|
|
917 ldu <D.Proc
|
|
918 ldx <D.PrcDBT
|
|
919 os9 F$Find64
|
|
920 bcs L070F
|
|
921 L06AB leax ,y X = proc desc
|
|
922 lda <P$IOQN,y
|
|
923 beq L06D1
|
|
924 ldx <D.PrcDBT
|
|
925 os9 F$Find64
|
|
926 bcs L070F
|
|
927 ldb P$Age,u
|
|
928
|
|
929 ifeq edition-$0B
|
|
930
|
|
931 * Note: the following line is a bug
|
|
932 cmpd P$Age,y
|
|
933
|
|
934 else
|
|
935
|
|
936 cmpb P$Age,y
|
|
937
|
|
938 endc
|
|
939
|
|
940 bls L06AB
|
|
941 ldb ,u
|
|
942 stb <P$IOQN,x
|
|
943 ldb P$ID,x
|
|
944 stb <P$IOQP,u
|
|
945 clr <P$IOQP,y
|
|
946 exg y,u
|
|
947 bra L06AB
|
|
948 L06D1 lda P$ID,u
|
|
949 sta <P$IOQN,y
|
|
950 lda P$ID,y
|
|
951 sta <P$IOQP,u
|
|
952 ldx #$0000
|
|
953 os9 F$Sleep
|
|
954 ldu <D.Proc
|
|
955 lda <P$IOQP,u
|
|
956 beq L070C
|
|
957 ldx <D.PrcDBT
|
|
958 os9 F$Find64
|
|
959 bcs L070C
|
|
960 lda <P$IOQN,y
|
|
961 beq L070C
|
|
962 lda <P$IOQN,u
|
|
963 sta <P$IOQN,y
|
|
964 beq L070C
|
|
965 clr <P$IOQN,u
|
|
966 ldx <D.PrcDBT
|
|
967 os9 F$Find64
|
|
968 bcs L070C
|
|
969 lda <P$IOQP,u
|
|
970 sta <P$IOQP,y
|
|
971 L070C clr <P$IOQP,u
|
|
972 L070F rts
|
|
973
|
|
974 emod
|
|
975 eom equ *
|
|
976 end
|