0
|
1 ********************************************************************
|
|
2 * IOMan - OS-9 Level Two V3 I/O Manager
|
|
3 *
|
|
4 * $Id$
|
|
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
|
74
|
12 * 15r2 Made minor optimizations as per Curtis Boyle's BGP 98/10/10
|
0
|
13 * optimization document
|
|
14 * Added comments from version provided by BGP 98/10/21
|
|
15 * Curtis Boyle
|
74
|
16 * 15r3 Fixed IDetach static storage wipeout bug BGP 02/05/11
|
0
|
17
|
|
18 nam IOMan
|
|
19 ttl OS-9 Level Two V3 I/O Manager
|
|
20
|
|
21 ifp1
|
|
22 use defsfile
|
|
23 use scfdefs
|
|
24 endc
|
|
25
|
|
26 tylg set Systm+Objct
|
|
27 atrv set ReEnt+rev
|
74
|
28 rev set $03
|
0
|
29 edition set 15
|
|
30
|
|
31 mod eom,name,tylg,atrv,IOManEnt,size
|
|
32
|
|
33 size equ .
|
|
34
|
|
35 name fcs /IOMan/
|
|
36 fcb edition
|
|
37
|
|
38
|
|
39 ******************************
|
|
40 *
|
|
41 * IOMan Main entry
|
|
42 *
|
|
43
|
|
44 IOManEnt equ *
|
|
45 * allocate device table
|
|
46 ldx <D.Init Get pointer to init module
|
|
47 lda DevCnt,x Get number of entrys in device table
|
|
48 ldb #DEVSIZ Get size of each entry
|
|
49 mul Calculate size needed for device table
|
|
50 pshs a,b Preserve it
|
|
51 lda PollCnt,x Get number of entrys in polling table
|
|
52 ldb #POLSIZ Get size of each entry
|
|
53 mul Calculate size needed for polling table
|
|
54 pshs a,b Preserve it
|
|
55 addd 2,s Add memory required for device table
|
|
56 addd #$0018 Add another 24 bytes
|
|
57 addd #$00FF Add another 256
|
|
58 clrb Drop LSB
|
|
59 os9 F$SRqMem Request the memory
|
|
60 bcs Crash Crash system if error
|
|
61 leax ,u Point to the memory
|
|
62 L0033 clr ,x+ Clear a byte
|
|
63 subd #1 Done?
|
|
64 bhi L0033 No, keep goin
|
|
65 stu <D.DevTbl Get pointer to device table
|
|
66 ldd ,s++ Restore size of polling table
|
|
67 std <D.CLTb Save it as VIRQ table address temporarily
|
|
68 ldd ,s++ Restore size of device table
|
|
69 leax d,u Point X to the end of device table
|
|
70 stx <D.PolTbl Initialize polling table address
|
|
71 ldd <D.CLTb Get VIRQ table size
|
|
72 leax d,x Add it to X
|
|
73 stx <D.CLTb Save VIRQ table address
|
|
74 ldx <D.PthDBT Get address of path descriptor table
|
|
75 os9 F$All64 Split it into 64 byte chunks
|
|
76 bcs Crash Crash system if error
|
|
77 stx <D.PthDBT Save the pointer back
|
|
78 os9 F$Ret64
|
|
79 leax >L05F2,pcr Point to polling routine
|
|
80 stx <D.Poll Save the vector address
|
|
81 leay <L0067,pcr Point to service vector table
|
|
82 os9 F$SSvc Set them up
|
|
83 rts Let the system take over
|
|
84
|
|
85 ******************************
|
|
86 *
|
|
87 * Fatal error Crash the system
|
|
88 *
|
|
89
|
|
90 Crash jmp <D.Crash
|
|
91
|
|
92 ******************************
|
|
93 *
|
|
94 * System service routine vector table
|
|
95 *
|
|
96
|
|
97 L0067 fcb $7F
|
|
98 fdb UsrIO-*-2
|
|
99 fcb F$Load
|
|
100 fdb FLoad-*-2
|
|
101 fcb I$Detach
|
|
102 fdb IDetach0-*-2
|
|
103 fcb F$PErr
|
|
104 fdb FPErr-*-2
|
|
105 fcb F$IOQu+$80
|
|
106 fdb FIOQu-*-2
|
|
107 fcb $FF
|
|
108 fdb SysIO-*-2
|
|
109 fcb F$IRQ+$80
|
|
110 fdb FIRQ-*-2
|
|
111 fcb F$IODel+$80
|
|
112 fdb FIODel-*-2
|
|
113 fcb F$NMLink
|
|
114 fdb FNMLink-*-2
|
|
115 fcb F$NMLoad
|
|
116 fdb FNMLoad-*-2
|
|
117 fcb $80
|
|
118
|
|
119 ******************************
|
|
120 *
|
|
121 * Check device status service call?
|
|
122 *
|
|
123 * Entry: U = Callers register stack pointer
|
|
124 *
|
|
125
|
|
126 FIODel ldx R$X,u Get address of module
|
|
127 ldu <D.Init Get pointer to init module
|
|
128 L008A ldb DevCnt,u Get device count
|
|
129 ldu <D.DevTbl Get pointer to device table
|
|
130 L008E ldy V$DESC,u Descriptor exist?
|
|
131 beq L009F No, move to next device
|
|
132 cmpx V$DESC,u Device match?
|
|
133 beq L00A6 Yes, return Module busy
|
|
134 cmpx V$DRIV,u Match driver?
|
|
135 beq L00A6 Yes, return module busy
|
|
136 cmpx V$FMGR,u Match Manager?
|
|
137 beq L00A6 Yes, return module busy
|
|
138 L009F leau DEVSIZ,u Move to next device entry
|
|
139 decb Done them all?
|
|
140 bne L008E No, keep goin
|
|
141 clrb Clear carry
|
|
142 rts Return
|
|
143 L00A6 comb Set carry
|
|
144 ldb #E$ModBsy Get error code for module busy
|
|
145 rts Return
|
|
146
|
|
147 UsrIODis fdb IAttach-UsrIODis
|
|
148 fdb IDetach-UsrIODis
|
|
149 fdb UIDup-UsrIODis
|
|
150 fdb IUsrCall-UsrIODis
|
|
151 fdb IUsrCall-UsrIODis
|
|
152 fdb IMakDir-UsrIODis
|
|
153 fdb IChgDir-UsrIODis
|
|
154 fdb IDelete-UsrIODis
|
|
155 fdb UISeek-UsrIODis
|
|
156 fdb UIRead-UsrIODis
|
|
157 fdb UIWrite-UsrIODis
|
|
158 fdb UIRead-UsrIODis
|
|
159 fdb UIWrite-UsrIODis
|
|
160 fdb UIGetStt-UsrIODis
|
|
161 fdb UISeek-UsrIODis
|
|
162 fdb UIClose-UsrIODis
|
|
163 fdb IDeletX-UsrIODis
|
|
164
|
|
165 SysIODis fdb IAttach-SysIODis
|
|
166 fdb IDetach-SysIODis
|
|
167 fdb SIDup-SysIODis
|
|
168 fdb ISysCall-SysIODis
|
|
169 fdb ISysCall-SysIODis
|
|
170 fdb IMakDir-SysIODis
|
|
171 fdb IChgDir-SysIODis
|
|
172 fdb IDelete-SysIODis
|
|
173 fdb SISeek-SysIODis
|
|
174 fdb SIRead-SysIODis
|
|
175 fdb SIWrite-SysIODis
|
|
176 fdb SIRead-SysIODis
|
|
177 fdb SIWrite-SysIODis
|
|
178 fdb SIGetStt-SysIODis
|
|
179 fdb SISeek-SysIODis
|
|
180 fdb SIClose-SysIODis
|
|
181 fdb IDeletX-SysIODis
|
|
182
|
|
183 UsrIO leax <UsrIODis,pcr
|
|
184 bra L0105
|
|
185 SysIO leax <SysIODis,pcr
|
|
186 L0105 cmpb #I$DeletX
|
|
187 bhi L0114
|
|
188 pshs b
|
|
189 lslb
|
|
190 ldd b,x
|
|
191 leax d,x
|
|
192 puls b
|
|
193 jmp ,x
|
|
194
|
|
195 ******************************
|
|
196 *
|
|
197 * Unknown service code error handler
|
|
198 *
|
|
199
|
|
200 L0114 comb
|
|
201 ldb #E$UnkSvc
|
|
202 rts
|
|
203
|
|
204 * Entry: U=Module header pointer
|
|
205
|
|
206 IAttach ldb #$17
|
|
207 L010B clr ,-s
|
|
208 decb
|
|
209 bpl L010B
|
|
210 stu <$16,s save caller regs
|
67
|
211 lda R$A,u access mode
|
|
212 sta $09,s save on stack
|
0
|
213 ldx <D.Proc
|
|
214 stx <$14,s save proc desc
|
|
215 leay <P$DATImg,x
|
|
216 ldx <D.SysPrc
|
|
217 stx <D.Proc
|
|
218 ldx R$X,u
|
|
219 lda #Devic+0
|
|
220 os9 F$SLink
|
|
221 bcs L0154
|
|
222 stu $04,s save pointer to dev desc
|
|
223 ldy <$16,s get caller regs
|
|
224 stx R$X,y
|
|
225 lda M$Port,u
|
|
226 sta $0B,s save extended port addr
|
|
227 ldd M$Port+1,u
|
|
228 std $0C,s save port addr
|
|
229 ldd M$PDev,u
|
|
230 leax d,u point to driver name in desc
|
|
231 lda #Drivr+0
|
|
232 os9 F$Link link to driver
|
|
233 bcs L0154
|
|
234 stu ,s save pointer to driver
|
|
235 ldu 4,s get dev desc ptr
|
|
236 ldd M$FMgr,u
|
|
237 leax d,u point to fmgr name in desc
|
|
238 lda #FlMgr+0
|
|
239 os9 F$Link
|
|
240 L0154 ldx <$14,s get proc desc
|
|
241 stx <D.Proc
|
|
242 bcc L0169
|
|
243 L015B stb <$17,s save error in B on stack
|
|
244 leau ,s point U at stack
|
|
245 os9 I$Detach detach
|
|
246 leas <$17,s clean up stack
|
|
247 comb
|
|
248 puls pc,b
|
|
249 L0169 stu $06,s save pointer to fmgr
|
|
250 ldx <D.Init
|
|
251 ldb DevCnt,x
|
|
252 lda DevCnt,x
|
|
253 ldu <D.DevTbl
|
|
254 L0173 ldx V$DESC,u
|
|
255 beq L01B0
|
|
256 cmpx 4,s compare to dev desc on stack
|
|
257 * bne L018E --BGP
|
|
258 bne L0191 ++BGP
|
|
259 ldx V$STAT,u get static
|
|
260 bne L018C
|
|
261 pshs a
|
|
262 lda V$USRS,u
|
|
263 beq L0188
|
|
264 os9 F$IOQu
|
|
265 L0188 puls a
|
|
266 bra L0173
|
|
267 L018C stu $0E,s save static storage
|
|
268 L018E ldx V$DESC,u
|
|
269 L0191 ldy M$Port+1,x same port?
|
|
270 cmpy $0C,s
|
|
271 bne L01B0
|
|
272 ldy M$Port,x
|
|
273 cmpy $0B,s same port?
|
|
274 bne L01B0
|
|
275 ldx V$DRIV,u
|
|
276 cmpx ,s same driver?
|
|
277 bne L01B0
|
|
278 ldx V$STAT,u
|
|
279 stx $02,s save static
|
|
280 tst V$USRS,u
|
|
281 beq L01B0
|
|
282 sta $0A,s
|
|
283 L01B0 leau DEVSIZ,u
|
|
284 decb
|
|
285 bne L0173
|
|
286 ldu $0E,s get static storage
|
|
287 lbne L020E
|
|
288 ldu <D.DevTbl
|
|
289 L01BD ldx V$DESC,u
|
|
290 beq L01CE
|
|
291 leau DEVSIZ,u
|
|
292 deca
|
|
293 bne L01BD
|
|
294 ldb #E$DevOvf
|
|
295 bra L015B
|
|
296 L01CA ldb #E$BMode
|
|
297 bra L015B
|
67
|
298 L01CE ldx $02,s get driver static in X
|
|
299 lbne L0205 if not zero, already alloced
|
0
|
300 stu $0E,s
|
|
301 ldx ,s get ptr to driver
|
|
302 ldd M$Mem,x get driver mem size
|
|
303 addd #$00FF round to next page
|
|
304 clrb
|
|
305 os9 F$SRqMem allocate driver mem
|
|
306 lbcs L015B
|
|
307 stu $02,s save ptr to mem
|
|
308 L01E7 clr ,u+ clear driver mem
|
|
309 subd #$0001
|
|
310 bhi L01E7
|
|
311 ldd $0C,s get ???
|
|
312 ldu $02,s
|
|
313 clr ,u
|
|
314 std $01,u
|
|
315 ldy $04,s
|
67
|
316 ldx ,s get ptr to driver
|
|
317 ldd $09,x D holds entry to driver
|
|
318 jsr d,x call init routine
|
0
|
319 lbcs L015B
|
|
320 ldu $0E,s
|
67
|
321 * Copy device table entry here
|
|
322 L0205 ldb #$08 size of device table
|
|
323 L0207 lda b,s get from src
|
|
324 sta b,u save in dest
|
0
|
325 decb
|
|
326 bpl L0207
|
67
|
327 * Here, U points to Device Table
|
|
328 L020E ldx $04,u get desc ptr in X
|
|
329 ldb $07,x get lang byte in desc
|
|
330 lda $09,s get access mode byte passed in A
|
|
331 anda $0D,x AND with mode byte in desc
|
|
332 ldx ,u X points to driver module
|
|
333 anda $0D,x AND with mode byte in driver
|
|
334 cmpa $09,s same as ??
|
|
335 lbne L01CA if not, bad mode error
|
|
336 inc $08,u else inc user count
|
|
337 bne L0226 if not zero, continue
|
|
338 dec $08,u else dec to $FF
|
0
|
339 L0226 ldx <$16,s
|
|
340 stu $08,x
|
|
341 leas <$18,s
|
|
342 clrb
|
|
343 rts
|
|
344
|
|
345 IDetach ldu R$U,u get ptr to dev tbl entry
|
85
|
346 * ldx V$DESC,u
|
74
|
347 tst V$USRS,u
|
|
348 beq IDetach2
|
0
|
349 L0240 lda #$FF
|
|
350 cmpa $08,u
|
|
351 lbeq L02B7
|
|
352 dec $08,u
|
|
353 lbne L0299
|
74
|
354 IDetach2
|
0
|
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
|