comparison CoCoOS9/level2v3/MODULES/ioman.asm @ 31:bd2b07db8917 cocoos9lv2v3

CoCoOS9 version
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Jul 2018 15:16:13 +0900
parents
children
comparison
equal deleted inserted replaced
30:7b1b25ff010a 31:bd2b07db8917
1 ********************************************************************
2 * IOMan - OS-9 Level Two V3 I/O Manager
3 *
4 * $Id: ioman.asm,v 1.1.1.1 2001/02/21 23:30:54 boisy Exp $
5 *
6 * Ed. Comments Who YY/MM/DD
7 * ------------------------------------------------------------------
8 * ?? Cleaned up some formatting KDM 87/05/15
9 * 14 IOMAN ignores device address high byte now ??? ??/??/??
10 * (FFXXXX vs 07XXXX etc ignored)
11 * 15 Fixed IOQueue sort bug BGP 98/10/08
12 * 15b Made minor optimizations as per Curtis Boyle's BGP 98/10/10
13 * optimization document
14 * Added comments from version provided by BGP 98/10/21
15 * Curtis Boyle
16
17 nam IOMan
18 ttl OS-9 Level Two V3 I/O Manager
19
20 ifp1
21 use defsfile
22 * use scfdefs
23 endc
24
25 tylg set Systm+Objct
26 atrv set ReEnt+rev
27 rev set $02
28 edition set 15
29
30 mod eom,name,tylg,atrv,IOManEnt,size
31
32 size equ .
33
34 name fcs /IOMan/
35 fcb edition
36
37
38 ******************************
39 *
40 * IOMan Main entry
41 *
42
43 IOManEnt equ *
44 * allocate device table
45 ldx <D.Init Get pointer to init module
46 lda DevCnt,x Get number of entrys in device table
47 ldb #DEVSIZ Get size of each entry
48 mul Calculate size needed for device table
49 pshs a,b Preserve it
50 lda PollCnt,x Get number of entrys in polling table
51 ldb #POLSIZ Get size of each entry
52 mul Calculate size needed for polling table
53 pshs a,b Preserve it
54 addd 2,s Add memory required for device table
55 addd #$0018 Add another 24 bytes
56 addd #$00FF Add another 256
57 clrb Drop LSB
58 os9 F$SRqMem Request the memory
59 bcs Crash Crash system if error
60 leax ,u Point to the memory
61 L0033 clr ,x+ Clear a byte
62 subd #1 Done?
63 bhi L0033 No, keep goin
64 stu <D.DevTbl Get pointer to device table
65 ldd ,s++ Restore size of polling table
66 std <D.CLTb Save it as VIRQ table address temporarily
67 ldd ,s++ Restore size of device table
68 leax d,u Point X to the end of device table
69 stx <D.PolTbl Initialize polling table address
70 ldd <D.CLTb Get VIRQ table size
71 leax d,x Add it to X
72 stx <D.CLTb Save VIRQ table address
73 ldx <D.PthDBT Get address of path descriptor table
74 os9 F$All64 Split it into 64 byte chunks
75 bcs Crash Crash system if error
76 stx <D.PthDBT Save the pointer back
77 os9 F$Ret64
78 leax >L05F2,pcr Point to polling routine
79 stx <D.Poll Save the vector address
80 leay <L0067,pcr Point to service vector table
81 os9 F$SSvc Set them up
82 rts Let the system take over
83
84 ******************************
85 *
86 * Fatal error Crash the system
87 *
88
89 Crash jmp <D.Crash
90
91 ******************************
92 *
93 * System service routine vector table
94 *
95
96 L0067 fcb $7F
97 fdb UsrIO-*-2
98 fcb F$Load
99 fdb FLoad-*-2
100 fcb I$Detach
101 fdb IDetach0-*-2
102 fcb F$PErr
103 fdb FPErr-*-2
104 fcb F$IOQu+$80
105 fdb FIOQu-*-2
106 fcb $FF
107 fdb SysIO-*-2
108 fcb F$IRQ+$80
109 fdb FIRQ-*-2
110 fcb F$IODel+$80
111 fdb FIODel-*-2
112 fcb F$NMLink
113 fdb FNMLink-*-2
114 fcb F$NMLoad
115 fdb FNMLoad-*-2
116 fcb $80
117
118 ******************************
119 *
120 * Check device status service call?
121 *
122 * Entry: U = Callers register stack pointer
123 *
124
125 FIODel ldx R$X,u Get address of module
126 ldu <D.Init Get pointer to init module
127 L008A ldb DevCnt,u Get device count
128 ldu <D.DevTbl Get pointer to device table
129 L008E ldy V$DESC,u Descriptor exist?
130 beq L009F No, move to next device
131 cmpx V$DESC,u Device match?
132 beq L00A6 Yes, return Module busy
133 cmpx V$DRIV,u Match driver?
134 beq L00A6 Yes, return module busy
135 cmpx V$FMGR,u Match Manager?
136 beq L00A6 Yes, return module busy
137 L009F leau DEVSIZ,u Move to next device entry
138 decb Done them all?
139 bne L008E No, keep goin
140 clrb Clear carry
141 rts Return
142 L00A6 comb Set carry
143 ldb #E$ModBsy Get error code for module busy
144 rts Return
145
146 UsrIODis fdb IAttach-UsrIODis
147 fdb IDetach-UsrIODis
148 fdb UIDup-UsrIODis
149 fdb IUsrCall-UsrIODis
150 fdb IUsrCall-UsrIODis
151 fdb IMakDir-UsrIODis
152 fdb IChgDir-UsrIODis
153 fdb IDelete-UsrIODis
154 fdb UISeek-UsrIODis
155 fdb UIRead-UsrIODis
156 fdb UIWrite-UsrIODis
157 fdb UIRead-UsrIODis
158 fdb UIWrite-UsrIODis
159 fdb UIGetStt-UsrIODis
160 fdb UISeek-UsrIODis
161 fdb UIClose-UsrIODis
162 fdb IDeletX-UsrIODis
163
164 SysIODis fdb IAttach-SysIODis
165 fdb IDetach-SysIODis
166 fdb SIDup-SysIODis
167 fdb ISysCall-SysIODis
168 fdb ISysCall-SysIODis
169 fdb IMakDir-SysIODis
170 fdb IChgDir-SysIODis
171 fdb IDelete-SysIODis
172 fdb SISeek-SysIODis
173 fdb SIRead-SysIODis
174 fdb SIWrite-SysIODis
175 fdb SIRead-SysIODis
176 fdb SIWrite-SysIODis
177 fdb SIGetStt-SysIODis
178 fdb SISeek-SysIODis
179 fdb SIClose-SysIODis
180 fdb IDeletX-SysIODis
181
182 UsrIO leax <UsrIODis,pcr
183 bra L0105
184 SysIO leax <SysIODis,pcr
185 L0105 cmpb #I$DeletX
186 bhi L0114
187 pshs b
188 lslb
189 ldd b,x
190 leax d,x
191 puls b
192 jmp ,x
193
194 ******************************
195 *
196 * Unknown service code error handler
197 *
198
199 L0114 comb
200 ldb #E$UnkSvc
201 rts
202
203 * Entry: U=Module header pointer
204
205 IAttach ldb #$17
206 L010B clr ,-s
207 decb
208 bpl L010B
209 stu <$16,s save caller regs
210 lda $01,u
211 sta $09,s
212 ldx <D.Proc
213 stx <$14,s save proc desc
214 leay <P$DATImg,x
215 ldx <D.SysPrc
216 stx <D.Proc
217 ldx R$X,u
218 lda #Devic+0
219 os9 F$SLink
220 bcs L0154
221 stu $04,s save pointer to dev desc
222 ldy <$16,s get caller regs
223 stx R$X,y
224 lda M$Port,u
225 sta $0B,s save extended port addr
226 ldd M$Port+1,u
227 std $0C,s save port addr
228 ldd M$PDev,u
229 leax d,u point to driver name in desc
230 lda #Drivr+0
231 os9 F$Link link to driver
232 bcs L0154
233 stu ,s save pointer to driver
234 ldu 4,s get dev desc ptr
235 ldd M$FMgr,u
236 leax d,u point to fmgr name in desc
237 lda #FlMgr+0
238 os9 F$Link
239 L0154 ldx <$14,s get proc desc
240 stx <D.Proc
241 bcc L0169
242 L015B stb <$17,s save error in B on stack
243 leau ,s point U at stack
244 os9 I$Detach detach
245 leas <$17,s clean up stack
246 comb
247 puls pc,b
248 L0169 stu $06,s save pointer to fmgr
249 ldx <D.Init
250 ldb DevCnt,x
251 lda DevCnt,x
252 ldu <D.DevTbl
253 L0173 ldx V$DESC,u
254 beq L01B0
255 cmpx 4,s compare to dev desc on stack
256 * bne L018E --BGP
257 bne L0191 ++BGP
258 ldx V$STAT,u get static
259 bne L018C
260 pshs a
261 lda V$USRS,u
262 beq L0188
263 os9 F$IOQu
264 L0188 puls a
265 bra L0173
266 L018C stu $0E,s save static storage
267 L018E ldx V$DESC,u
268 L0191 ldy M$Port+1,x same port?
269 cmpy $0C,s
270 bne L01B0
271 ldy M$Port,x
272 cmpy $0B,s same port?
273 bne L01B0
274 ldx V$DRIV,u
275 cmpx ,s same driver?
276 bne L01B0
277 ldx V$STAT,u
278 stx $02,s save static
279 tst V$USRS,u
280 beq L01B0
281 sta $0A,s
282 L01B0 leau DEVSIZ,u
283 decb
284 bne L0173
285 ldu $0E,s get static storage
286 lbne L020E
287 ldu <D.DevTbl
288 L01BD ldx V$DESC,u
289 beq L01CE
290 leau DEVSIZ,u
291 deca
292 bne L01BD
293 ldb #E$DevOvf
294 bra L015B
295 L01CA ldb #E$BMode
296 bra L015B
297 L01CE ldx $02,s
298 lbne L0205
299 stu $0E,s
300 ldx ,s get ptr to driver
301 ldd M$Mem,x get driver mem size
302 addd #$00FF round to next page
303 clrb
304 os9 F$SRqMem allocate driver mem
305 lbcs L015B
306 stu $02,s save ptr to mem
307 L01E7 clr ,u+ clear driver mem
308 subd #$0001
309 bhi L01E7
310 ldd $0C,s get ???
311 ldu $02,s
312 clr ,u
313 std $01,u
314 ldy $04,s
315 ldx ,s
316 ldd $09,x
317 jsr d,x
318 lbcs L015B
319 ldu $0E,s
320 L0205 ldb #$08
321 L0207 lda b,s
322 sta b,u
323 decb
324 bpl L0207
325 L020E ldx $04,u
326 ldb $07,x
327 lda $09,s
328 anda $0D,x
329 ldx ,u
330 anda $0D,x
331 cmpa $09,s
332 lbne L01CA
333 inc $08,u
334 bne L0226
335 dec $08,u
336 L0226 ldx <$16,s
337 stu $08,x
338 leas <$18,s
339 clrb
340 rts
341
342 IDetach ldu R$U,u get ptr to dev tbl entry
343 ldx V$DESC,u
344 ldb V$USRS,u
345 bne L0240
346 pshs u,b
347 ldu V$STAT,u
348 pshs u
349 bra L027C
350 L0240 lda #$FF
351 cmpa $08,u
352 lbeq L02B7
353 dec $08,u
354 lbne L0299
355 ldx <D.Init
356 ldb DevCnt,x
357 pshs u,b
358 ldx $02,u
359 clr $02,u
360 clr $03,u
361 ldy <D.DevTbl
362 L025D cmpx $02,y
363 beq L028F
364 leay $09,y
365 decb
366 bne L025D
367 ldy <D.Proc
368 ldb ,y
369 stb $08,u
370 ldy $04,u
371 ldu ,u
372 exg x,u
373 ldd $09,x
374 leax d,x
375 pshs u
376 jsr $0F,x
377 L027C puls u
378 ldx $01,s get ptr to dev tbl
379 ldx ,x load X with driver addr
380 ldd M$Mem,x get static storage size
381 addd #$00FF round up one page
382 clrb
383 os9 F$SRtMem return mem
384 ldx $01,s get ptr to dev tbl
385 ldx V$DESC,x
386 L028F puls u,b
387 ldx $04,u
388 clr $04,u
389 clr $05,u
390 clr $08,u
391 L0299 ldd <D.Proc
392 pshs b,a
393 ldd <D.SysPrc
394 std <D.Proc
395 ldy ,u
396 ldu $06,u
397 os9 F$UnLink
398 leau ,y
399 os9 F$UnLink
400 leau ,x
401 os9 F$UnLink
402 puls b,a
403 std <D.Proc
404 L02B7 lbsr L0556
405 clrb
406 rts
407
408 UIDup bsr LocFrPth
409 bcs L02DC
410 pshs x,a
411 lda R$A,u
412 lda a,x
413 bsr L02D5
414 bcs L02D1
415 puls x,b
416 stb R$A,u
417 sta b,x
418 rts
419 L02D1 puls pc,x,a
420
421 SIDup lda R$A,u
422 L02D5 lbsr GetPDesc
423 bcs L02DC
424 inc PD.CNT,y
425 L02DC rts
426
427 * Locate a free path in D.Proc
428 LocFrPth ldx <D.Proc
429 leax <P$Path,x
430 clra
431 L02E3 tst a,x
432 beq L02F0
433 inca
434 cmpa #Numpaths
435 bcs L02E3
436 comb
437 ldb #E$PthFul
438 rts
439 L02F0 andcc #^Carry
440 rts
441
442 IUsrCall bsr LocFrPth
443 bcs L0305
444 pshs u,x,a
445 bsr ISysCall
446 puls u,x,a
447 bcs L0305
448 ldb R$A,u
449 stb a,x
450 sta R$A,u
451 L0305 rts
452
453 ISysCall pshs b
454 ldb R$A,u
455 bsr AllcPDsc
456 bcs L031A
457 puls b
458 lbsr CallFMgr
459 bcs L0329
460 lda PD.PD,y
461 sta R$A,u
462 rts
463 L031A puls pc,a
464
465 IMakDir pshs b
466 ldb #DIR.!WRITE.
467 L0320 bsr AllcPDsc
468 bcs L031A
469 puls b
470 lbsr CallFMgr
471 L0329 pshs b,cc
472 ldu PD.DEV,y
473 os9 I$Detach
474 lda PD.PD,y
475 ldx <D.PthDBT
476 os9 F$Ret64
477 puls pc,b,cc
478
479 IChgDir pshs b
480 ldb R$A,u
481 orb #DIR.
482 bsr AllcPDsc
483 bcs L031A
484 puls b
485 lbsr CallFMgr
486 bcs L0329
487 ldu <D.Proc
488 ldb PD.MOD,y
489 bitb #PWRIT.+PREAD.+WRITE.+READ.
490 beq IChgExec
491 ldx PD.DEV,y
492 stx <P$DIO,u
493 inc V$USRS,x
494 bne IChgExec
495 dec V$USRS,x
496 IChgExec bitb #PEXEC.+EXEC.
497 beq IChgRts
498 ldx PD.DEV,y
499 stx <P$DIO+6,u
500 inc V$USRS,x
501 bne IChgRts
502 dec V$USRS,x
503 IChgRts clrb
504 bra L0329
505
506 IDelete pshs b
507 ldb #WRITE.
508 bra L0320
509
510 IDeletX ldb #DIR.+EXEC.+UPDAT.
511 pshs b
512 ldb R$A,u
513 bra L0320
514
515 * allocate path descriptor
516 AllcPDsc ldx <D.Proc
517 pshs u,x
518 ldx <D.PthDBT
519 os9 F$All64
520 bcs L03E9
521 inc PD.CNT,y
522 stb PD.MOD,y
523 ldx <D.Proc
524 ldb P$Task,x
525 ldx R$X,u X points to pathlist
526 L0392 os9 F$LDABX
527 leax 1,x
528 cmpa #C$SPAC skip over spaces
529 beq L0392
530 leax -$01,x back up
531 stx R$X,u save back pointer
532 * ldb PD.MOD,y moved down --BGP
533 cmpa #PDELIM leading slash?
534 beq L03BF yep...
535 ldb PD.MOD,y ++BGP
536 ldx <D.Proc
537 bitb #EXEC. exec. dir relative?
538 beq L03B0 nope...
539 ldx <P$DIO+6,x
540 bra L03B3
541 L03B0 ldx <P$DIO,x
542 L03B3 beq L03EE
543 ldd <D.SysPrc
544 std <D.Proc
545 ldx $04,x
546 ldd $04,x
547 leax d,x
548 L03BF pshs y save off path desc ptr in Y
549 os9 F$PrsNam
550 puls y restore path desc ptr
551 bcs L03EE
552 lda PD.MOD,y
553 os9 I$Attach attach to device
554 stu PD.DEV,y save dev tbl entry
555 bcs L03F0
556 ldx V$DESC,u
557 * copy options from dev desc to path desc
558 leax <M$Opt,x
559 ldb ,x+ get options count
560 leau <PD.OPT,y
561 cmpb #$20
562 bls L03E5
563 ldb #$1F
564 L03E1 lda ,x+
565 sta ,u+
566 L03E5 decb
567 bpl L03E1
568 clrb
569 L03E9 puls u,x
570 stx <D.Proc
571 rts
572
573 L03EE ldb #E$BPNam
574 L03F0 pshs b
575 lda ,y
576 ldx <D.PthDBT
577 os9 F$Ret64
578 puls b
579 coma
580 bra L03E9
581
582 * System to User Path routine
583 *
584 * Returns:
585 * A = user path #
586 * X = path table in path desc. of current proc.
587 S2UPth lda R$A,u
588 cmpa #NumPaths
589 bcc L040F illegal path number
590 ldx <D.Proc
591 leax <P$Path,x
592 andcc #^Carry
593 lda a,x
594 bne L0412
595 L040F comb
596 ldb #E$BPNum
597 L0412 rts
598
599 UISeek bsr S2UPth get user path #
600 bcc GtPDClFM get PD, call FM
601 rts
602
603 SISeek lda R$A,u
604 GtPDClFM bsr GetPDesc
605 lbcc CallFMgr
606 rts
607
608 UIRead bsr S2UPth get user path #
609 bcc L0428
610 rts
611
612 SIRead lda R$A,u
613 L0428 pshs b
614 ldb #EXEC.+READ.
615 L042C bsr GetPDesc
616 bcs L0479
617 bitb PD.MOD,y
618 beq L0477
619 ldd R$Y,u get count from user
620 beq L0466
621 addd R$X,u update buffer pointer
622 bcs L046B
623 subd #$0001 subtract 1 from count
624 lsra
625 lsra
626 lsra
627 lsra
628 lsra
629 ldb R$X,u
630 lsrb
631 lsrb
632 lsrb
633 lsrb
634 lsrb
635 pshs b
636 suba ,s+
637 ldx <D.Proc
638 leax <P$DATImg,x
639 lslb
640 * leax b,x --BGP
641 abx ++BGP
642 L0457 pshs a
643 ldd ,x++
644 cmpd #$333E
645 puls a
646 beq L046B
647 deca
648 bpl L0457
649 L0466 puls b
650 lbra CallFMgr
651 L046B ldb #E$Read
652 lda ,s
653 bita #READ.
654 bne L0479
655 ldb #E$Write
656 bra L0479
657 L0477 ldb #E$BMode
658 L0479 com ,s+
659 rts
660
661 UIWrite bsr S2UPth get user path #
662 bcc L0483
663 rts
664
665 SIWrite lda R$A,u
666 L0483 pshs b
667 ldb #WRITE.
668 bra L042C
669
670 * get path descriptor
671 * Passed: A = path number
672 * Returned: Y = address of path desc for path num
673 GetPDesc pshs x
674 ldx <D.PthDBT
675 os9 F$Find64
676 puls x
677 lbcs L040F
678 L0496 rts
679
680 UIGetStt lbsr S2UPth get user path #
681 ldx <D.Proc
682 bcc L04A3
683 rts
684
685 SIGetStt lda R$A,u
686 ldx <D.SysPrc
687 L04A3 pshs x,b,a
688 lda R$B,u get func code
689 sta 1,s place func code on stack
690 puls a get path off stack
691 lbsr GtPDClFM
692 puls x,a
693 pshs u,y,b,cc
694 ldb <$20,y
695 cmpb #$04
696 beq L04C0
697 tsta SS.Opt?
698 beq L04C2
699 cmpa #SS.DevNm
700 beq SSDevNm
701 L04C0 puls pc,u,y,b,cc
702 L04C2 lda <D.SysTsk
703 ldb P$Task,x
704 leax <PD.OPT,y
705 SSCopy ldy #32
706 ldu R$X,u
707 os9 F$Move
708 leas 2,s
709 clrb
710 puls pc,u,y
711
712 SSDevNm lda <D.SysTsk
713 ldb P$Task,x
714 pshs b,a
715 ldx PD.DEV,y
716 ldx V$DESC,x
717 ldd M$Name,x
718 leax d,x
719 puls b,a
720 bra SSCopy
721
722 UIClose lbsr S2UPth get user path #
723 bcs L0496
724 pshs b
725 ldb R$A,u
726 clr b,x zero path entry
727 puls b
728 bra L04FA
729
730 SIClose lda R$A,u
731 L04FA bsr GetPDesc
732 bcs L0496
733 dec PD.CNT,y
734 tst PD.CPR,y
735 bne L0506
736 bsr CallFMgr
737 L0506 tst PD.CNT,y
738 bne L0496
739 lbra L0329
740 L050D os9 F$IOQu
741 comb
742 ldb <$19,x
743 bne L0521
744 L0516 ldx <D.Proc
745 ldb P$ID,x
746 clra
747 lda PD.CPR,y
748 bne L050D
749 stb PD.CPR,y
750 L0521 rts
751
752 CallFMgr pshs u,y,x,b
753 bsr L0516
754 bcs L053E
755 stu PD.RGS,y
756 lda <$20,y
757 ldx PD.DEV,y
758 ldx V$FMGR,x
759 ldd M$Exec,x
760 leax d,x
761 ldb ,s get B off stack
762 subb #$83
763 lda #$03
764 mul
765 jsr d,x
766 L053E pshs b,cc
767 bsr L0556
768 ldy $05,s get Y off stack
769 lda <$20,y
770 ldx <D.Proc
771 lda P$ID,x
772 cmpa PD.CPR,y
773 bne L0552
774 clr PD.CPR,y
775 L0552 puls b,cc
776 puls pc,u,y,x,a
777 *L0556 pshs y,x --BGP
778 L0556 pshs y ++BGP
779 ldy <D.Proc
780 lda <P$IOQN,y
781 beq L056D
782 clr <P$IOQN,y
783 ldb #S$Wake
784 os9 F$Send
785 os9 F$GProcP
786 clr P$IOQP,y
787 L056D clrb
788 * puls pc,y,x --BGP
789 puls pc,y ++BGP
790
791 FIRQ ldx R$X,u get ptr to IRQ packet
792 ldb ,x get flip byte
793 ldx 1,x get mask/priority byte
794 clra
795 pshs cc
796 pshs x,b
797 ldx <D.Init
798 ldb PollCnt,x
799 ldx <D.PolTbl
800 ldy R$X,u
801 beq L05C1
802 tst $01,s test mask byte on stack
803 beq L05EC
804 decb
805 lda #POLSIZ
806 mul
807 leax d,x point to last entry in table
808 lda Q$MASK,x
809 bne L05EC
810 orcc #IntMasks
811 L0596 ldb $02,s get priority byte on stack
812 cmpb -$01,x compare to priority of prev entry
813 bcs L05A9
814 ldb #$09
815 L059E lda ,-x
816 sta $09,x
817 decb
818 bne L059E
819 cmpx <D.PolTbl
820 bhi L0596
821 L05A9 ldd R$D,u
822 std Q$POLL,x
823 ldd ,s++ get flip/byte off stack
824 sta Q$FLIP,x store flip
825 stb Q$MASK,x store mask
826 ldb ,s+ get priority off stack
827 stb Q$PRTY,x
828 ldd R$Y,u get IRQ SVC entry
829 std Q$SERV,x
830 ldd R$U,u get IRQ static storage ptr
831 std Q$STAT,x
832 puls pc,cc
833 * Remove the ISR
834 L05C1 leas $04,s clean up stack
835 ldy R$U,u
836 L05C6 cmpy Q$STAT,x
837 beq L05D2
838 leax POLSIZ,x
839 decb
840 bne L05C6
841 clrb
842 rts
843 L05D2 pshs b,cc
844 orcc #IntMasks
845 bra L05DF
846 * Move prev poll entry up one
847 L05D8 ldb POLSIZ,x
848 stb ,x+
849 deca
850 bne L05D8
851 L05DF lda #POLSIZ
852 dec 1,s dec poll count on stack
853 bne L05D8
854 L05E5 clr ,x+
855 deca
856 bne L05E5
857 puls pc,a,cc
858 L05EC leas $04,s
859 L05EE comb
860 ldb #E$Poll
861 rts
862
863 ******************************
864 *
865 * Device polling routine
866 *
867 * Entry: None
868 *
869
870 L05F2 ldy <D.PolTbl Get pointer to polling table
871 ldx <D.Init Get pointer to init module
872 ldb PollCnt,x Get number of entries in table
873 bra L0600 Get check em
874 L05FB leay POLSIZ,y Move to next entry
875 decb Done?
876 beq L05EE Yep, exit with polling table full error
877 L0600 lda [Q$POLL,y] Get device's status register
878 eora 2,y Flip it
879 bita 3,y Origin of IRQ?
880 beq L05FB No, go to next device
881 ldu Q$STAT,y Get device static storage
882 pshs y,b Preserve device # & poll address
883 jsr [Q$SERV,y] Execute service routine
884 puls y,b Restore device # & poll address
885 bcs L05FB Go to next device if error
886 rts Return
887
888 FNMLoad pshs u
889 ldx R$X,u
890 lbsr L06B5
891 bcs L066C
892 ldy ,s
893 stx $04,y
894 ldy ,u
895 ldx $04,u
896 ldd #$0006
897 os9 F$LDDDXY
898 * minor optimization
899 * puls y --BGP
900 * exg y,u --BGP
901 leay ,u ++BGP
902 puls u ++BGP
903 bra L0649
904
905 FNMLink ldx <D.Proc
906 leay <P$DATImg,x
907 pshs u
908 ldx R$X,u
909 lda R$A,u
910 os9 F$FModul
911 bcs L066C
912 leay ,u
913 puls u
914 stx R$X,u
915 L0649 std R$D,u
916 ldx $06,y
917 beq L0653
918 bitb #$80
919 beq L0669
920 L0653 leax $01,x
921 beq L0659
922 stx $06,y
923 L0659 ldx $04,y
924 ldy ,y
925 ldd #$000B
926 os9 F$LDDDXY
927 bcs L0668
928 std $06,u
929 L0668 rts
930 L0669 comb
931 ldb #E$ModBsy
932 L066C puls pc,u
933
934 ******************************
935 *
936 * F$Load Entry point
937 *
938 * Entry: U = Callers register stack
939 *
940
941 FLoad pshs u Save register stack pointer
942 ldx R$X,u Get pointer to pathname
943 bsr L06B5 Aloocate a process descriptor
944 bcs L0699 Exit if error
945 puls y Restore register stack pointer
946 L0678 pshs y Preserve Y
947 stx R$X,y Update pathname pointer
948 ldy ,u Get DAT Image pointer
949 ldx $04,u Get offset within the DAT image
950 ldd #$0006 Get offset to the offset
951 os9 F$LDDDXY Get language & type
952 ldx ,s Get register pointer
953 std R$D,x Update language/type codes
954 leax ,u
955 os9 F$ELink
956 bcs L0699
957 ldx ,s
958 sty $06,x
959 stu $08,x
960 L0699 puls pc,u
961
962 IDetach0 pshs u
963 ldx R$X,u
964 bsr L06B5
965 bcs L06B3
966 puls y
967 ldd <D.Proc
968 pshs y,b,a
969 ldd $08,y
970 std <D.Proc
971 bsr L0678
972 puls x
973 stx <D.Proc
974 L06B3 puls pc,u
975 L06B5 os9 F$AllPrc
976 bcc L06BB
977 rts
978
979 L06BB leay ,u
980 ldu #$0000
981 pshs u,y,x,b,a
982 leas <-$11,s
983 clr $07,s
984 stu ,s
985 stu $02,s
986 ldu <D.Proc
987 stu $04,s
988 clr $06,s
989 lda $0A,u
990 sta $0A,y
991 sta $0B,y
992 lda #EXEC.
993 os9 I$Open
994 lbcs L0770
995 sta $06,s
996 stx <$13,s
997 ldx <$15,s
998 os9 F$AllTsk
999 lbcs L0770
1000 stx <D.Proc
1001 L06F1 ldx <$15,s
1002 lda $0A,x
1003 adda #$08
1004 bcc L06FC
1005 lda #$FF
1006 L06FC sta $0A,x
1007 sta $0B,x
1008 ldd #$0009
1009 ldx $02,s
1010 lbsr L07F7
1011 bcs L0770
1012 ldu <$15,s
1013 lda $06,u
1014 ldb <D.SysTsk
1015 leau $08,s
1016 pshs x
1017 ldx $04,s
1018 os9 F$Move
1019 puls x
1020 ldd ,u
1021 cmpd #M$ID12
1022 bne L076E
1023 ldd $02,u
1024 subd #$0009
1025 lbsr L07F7
1026 bcs L0770
1027 ldx $04,s
1028 lda $0A,x
1029 ldy <$15,s
1030 sta $0A,y
1031 sta $0B,y
1032 leay <$40,y
1033 tfr y,d
1034 ldx $02,s
1035 os9 F$VModul
1036 bcc L074C
1037 cmpb #$E7
1038 beq L0752
1039 bra L0770
1040 L074C ldd $02,s
1041 addd $0A,s
1042 std $02,s
1043 L0752 ldd <$17,s
1044 bne L06F1
1045 ldd $04,u
1046 std <$11,s
1047 * ldx ,u --BGP
1048 * ldd ,x --BGP
1049 ldd [,u] ++BGP
1050 std <$17,s
1051 ldd $06,u
1052 addd #$0001
1053 beq L06F1
1054 std $06,u
1055 bra L06F1
1056 L076E ldb #$CD
1057 L0770 stb $07,s
1058 ldd $04,s
1059 beq L0778
1060 std <D.Proc
1061 L0778 lda $06,s
1062 beq L077F
1063 os9 I$Close
1064 L077F ldd $02,s
1065 addd #$1FFF
1066 lsra
1067 lsra
1068 lsra
1069 lsra
1070 lsra
1071 sta $02,s
1072 ldb ,s
1073 beq L07AE
1074 lsrb
1075 lsrb
1076 lsrb
1077 lsrb
1078 lsrb
1079 subb $02,s
1080 beq L07AE
1081 ldx <$15,s
1082 leax <$40,x
1083 lsla
1084 leax a,x
1085 clra
1086 tfr d,y
1087 ldu <D.BlkMap
1088 L07A6 ldd ,x++
1089 clr d,u
1090 leay -$01,y
1091 bne L07A6
1092 L07AE ldx <$15,s
1093 lda ,x
1094 os9 F$DelPrc
1095 ldd <$17,s
1096 bne L07C3
1097 ldb $07,s
1098 stb <$12,s
1099 comb
1100 bra L07F2
1101 L07C3 ldu <D.ModDir
1102 ldx <$11,s
1103 ldd <$17,s
1104 leau -$08,u
1105 L07CD leau $08,u
1106 cmpu <D.ModEnd
1107 bcs L07DC
1108 comb
1109 ldb #$DD
1110 stb <$12,s
1111 bra L07F2
1112 L07DC cmpx $04,u
1113 bne L07CD
1114 cmpd [,u]
1115 bne L07CD
1116 ldd $06,u
1117 beq L07EE
1118 subd #$0001
1119 std $06,u
1120 L07EE stu <$17,s
1121 clrb
1122 L07F2 leas <$11,s
1123 puls pc,u,y,x,b,a
1124 L07F7 pshs y,x,b,a
1125 addd $02,s
1126 std $04,s
1127 cmpd $08,s
1128 bls L0858
1129 addd #$1FFF
1130 lsra
1131 lsra
1132 lsra
1133 lsra
1134 lsra
1135 cmpa #$07
1136 bhi L0838
1137 ldb $08,s
1138 lsrb
1139 lsrb
1140 lsrb
1141 lsrb
1142 lsrb
1143 pshs b
1144 exg b,a
1145 subb ,s+
1146 lsla
1147 ldu <$1D,s
1148 leau <$40,u
1149 leau a,u
1150 clra
1151 tfr d,x
1152 ldy <D.BlkMap
1153 * clra --BGP
1154 clrb
1155 L082C tst ,y+
1156 beq L083D
1157 L0830 addd #$0001
1158 cmpy <D.BlkMap+2
1159 bne L082C
1160 L0838 comb
1161 ldb #E$MemFul
1162 bra L0862
1163 L083D inc -$01,y
1164 std ,u++
1165 * pshs b,a --BGP
1166 * ldd $0A,s --BGP
1167 * addd #$2000 --BGP
1168 * std $0A,s --BGP
1169 * puls b,a --BGP
1170 pshs a ++BGP
1171 lda 9,s ++BGP
1172 adda #$20 ++BGP
1173 sta 9,s ++BGP
1174 puls a ++BGP
1175 leax -1,x
1176 bne L0830
1177 ldx <$1D,s
1178 os9 F$SetTsk
1179 bcs L0862
1180 L0858 lda $0E,s
1181 ldx $02,s
1182 ldy ,s
1183 os9 I$Read
1184 L0862 leas $04,s
1185 puls pc,x
1186
1187 ******************************
1188 *
1189 * F$PErr System call entry point
1190 *
1191 * Entry: U = Register stack pointer
1192 *
1193
1194 ErrMess fcc /ERROR #/
1195 fcb $2F,$3A,$30
1196 fcb C$CR
1197 ErrMessL equ *-Errmess
1198
1199 FPErr ldx <D.Proc Get current process pointer
1200 lda <P$Path+2,x Get standard error path
1201 beq L08B8 Return if not there
1202 leas -ErrMessL,s Make a buffer on the stack
1203 leax <ErrMess,pcr Point to error text
1204 leay ,s Point to buffer
1205 L087F lda ,x+ Get a byte
1206 sta ,y+ Store it
1207 cmpa #C$CR Done?
1208 bne L087F No, keep goin
1209 ldb R$B,u Get error code
1210
1211 * Convert error code to decimal
1212
1213 L0889 inc 7,s
1214 subb #$64
1215 bcc L0889
1216 L088F dec $08,s
1217 addb #$0A
1218 bcc L088F
1219 addb #$30
1220 stb $09,s
1221
1222 ldx <D.Proc Get current process pointer
1223 ldu P$SP,x Get the stack pointer
1224 leau -ErrMessL,u Put a buffer on it
1225 lda <D.SysTsk Get system task number
1226 ldb P$Task,x Get task number of process
1227 leax ,s Point to error text
1228 ldy #ErrMessL Get length of text
1229 L08A9 os9 F$Move Move it to the process
1230 leax ,u Point to the moved text
1231 ldu <D.Proc Get process pointer
1232 lda <P$Path+2,u Get path number
1233 os9 I$WritLn Write the text
1234 leas ErrMessL,s Purge the buffer
1235 L08B8 rts Return
1236
1237 FIOQu ldy <D.Proc
1238 L08BC lda <P$IOQN,y
1239 beq L08DF
1240 cmpa R$A,u
1241 bne L08DA
1242 clr <P$IOQN,y
1243 os9 F$GProcP
1244 lbcs L093F
1245 clr $0F,y
1246 ldb #S$Wake
1247 os9 F$Send
1248 ldu <D.Proc
1249 bra L08E8
1250 L08DA os9 F$GProcP
1251 bcc L08BC
1252 L08DF lda R$A,u
1253 ldu <D.Proc
1254 os9 F$GProcP
1255 bcs L093F
1256 L08E8 leax ,y
1257 lda <P$IOQN,y
1258 beq L090A
1259 os9 F$GProcP
1260 bcs L093F
1261 ldb P$Age,u
1262 cmpb P$Age,y minor queue sort bug fixed - BGP
1263 bls L08E8
1264 ldb P$ID,u
1265 stb <P$IOQN,x
1266 ldb P$ID,x
1267 stb P$IOQP,u
1268 clr P$IOQP,y
1269 exg y,u
1270 bra L08E8
1271 L090A lda P$ID,u
1272 sta <P$IOQN,y
1273 lda P$ID,y
1274 sta P$IOQP,u
1275 ldx #$0000
1276 os9 F$Sleep
1277 ldu <D.Proc
1278 lda P$IOQP,u
1279 beq L093D
1280 os9 F$GProcP
1281 bcs L093D
1282 lda <P$IOQN,y
1283 beq L093D
1284 lda <P$IOQN,u
1285 sta <P$IOQN,y
1286 beq L093D
1287 clr <P$IOQN,u
1288 os9 F$GProcP
1289 bcs L093D
1290 lda P$IOQP,u
1291 sta P$IOQP,y
1292 L093D clr P$IOQP,u
1293 L093F rts
1294
1295 emod
1296 eom equ *
1297 end
1298