comparison 3rdparty/roms/dos/SuperDos/superdos-e6-02.asm @ 1985:4037b23c848d

SuperDos rom, assembalable for Dragon Dos, Dragon Alpha or RS-DOS
author afra
date Fri, 20 Jan 2006 01:54:33 +0000
parents
children
comparison
equal deleted inserted replaced
1984:cbb405567d04 1985:4037b23c848d
1 ;
2 ; SuperDos E6, Copyright (C) 1986 ???, Compusense.
3 ;
4 ; Disassembled 2004-11-05, P.Harvey-Smith.
5 ;
6 ; Fixed for assembly with "mamou" cross-assembler,
7 ; from NitrOS9 cocotools.
8 ;
9 ; Ported to the Dragon Alpha/Professional hardware,
10 ; 2004-11-21 P.Harvey-Smith.
11 ;
12
13
14 ;DragonAlpha EQU 1 ; Define this if compiling for Dragon Alpha.
15
16 ifp1
17 use dgndefs.asm
18 use romdefs.asm
19 use dosdefs.asm
20 endc
21
22
23 IFNE DragonAlpha
24
25 * Dragon Alpha has a third PIA at FF24, this is used for
26 * Drive select / motor control, and provides FIRQ from the
27 * disk controler.
28
29 DPPIADA EQU DPPIA2DA
30 DPPIACRA EQU DPPIA2CRA
31 DPPIADB EQU DPPIA2DB
32 DPPIACRB EQU DPPIA2CRB
33
34 PIADA EQU DPPIADA+IO ; Side A Data/DDR
35 PIACRA EQU DPPIACRA+IO ; Side A Control.
36 PIADB EQU DPPIADB+IO ; Side A Data/DDR
37 PIACRB EQU DPPIACRB+IO ; Side A Control.
38
39 ;WD2797 Floppy disk controler, used in Alpha Note registers in reverse order !
40 DPCMDREG EQU DPCmdRegA ; command/status
41 DPTRKREG EQU DPTrkRegA ; Track register
42 DPSECREG EQU DPSecRegA ; Sector register
43 DPDATAREG EQU DPDataRegA ; Data register
44
45 CMDREG EQU DPCMDREG+IO ; command/status
46 TRKREG EQU DPTRKREG+IO ; Track register
47 SECREG EQU DPSECREG+IO ; Sector register
48 DATAREG EQU DPDATAREG+IO ; Data register
49
50 ; Disk IO bitmasks
51
52 NMIEn EQU NMIEnA ; Enable/disable NMI
53 WPCEn EQU WPCEnA ; Write precomp enable
54 SDensEn EQU SDensEnA ; Write precomp enable
55 MotorOn EQU MotorOnA ; Motor on enable
56
57 Drive0 EQU Drive0A
58 Drive1 EQU Drive1A
59 Drive2 EQU Drive2A
60 Drive3 EQU Drive3A
61
62 KnownBits EQU Drive0+Drive1+Drive2+Drive3+MotorOn+WPCEn
63
64 ELSE
65
66 DPPIADA EQU DPPIA1DA
67 DPPIACRA EQU DPPIA1CRA
68 DPPIADB EQU DPPIA1DB
69 DPPIACRB EQU DPPIA1CRB
70
71 PIADA EQU DPPIADA+IO ; Side A Data/DDR
72 PIACRA EQU DPPIACRA+IO ; Side A Control.
73 PIADB EQU DPPIADB+IO ; Side A Data/DDR
74 PIACRB EQU DPPIACRB+IO ; Side A Control.
75
76 ;WD2797 Floppy disk controler, used in DragonDos.
77 DPCMDREG EQU DPCmdRegD ; command/status
78 DPTRKREG EQU DPTrkRegD ; Track register
79 DPSECREG EQU DPSecRegD ; Sector register
80 DPDATAREG EQU DPDataRegD ; Data register
81
82 CMDREG EQU DPCMDREG+IO ; command/status
83 TRKREG EQU DPTRKREG+IO ; Track register
84 SECREG EQU DPSECREG+IO ; Sector register
85 DATAREG EQU DPDATAREG+IO ; Data register
86
87 ; Disk IO bitmasks
88
89 NMIEn EQU NMIEnD ; Enable/disable NMI
90 WPCEn EQU WPCEnD ; Write precomp enable
91 SDensEn EQU SDensEnD ; Write precomp enable
92 MotorOn EQU MotorOnD ; Motor on enable
93
94 ENDC
95
96
97 ORG $C000
98
99 ; Disk controler ID, if a cartrage starts with the chars 'DK', then the basic rom routines
100 ; will do a JMP to $C002 to init the cartrage.
101
102 DC000 FCC /DK/
103
104 LC002 BRA DosInit
105
106 ;
107 ; Jump table containing the addresses of the various dos routines, these should be called by :
108 ; JSR [JumpAddr] rather than jumping directly to the routine.
109 ;
110 FDB SuperDosLowLevel ; Low Level disk IO routine
111 FDB DosHWByte ; Address of data table for low level command
112 FDB SuperDosValidFilename ; Validate filename & copy to disk block.
113 FDB SuperDosOpenFile ; Open A file.
114 FDB SuperDosCreateFile ; Create file (make backup)
115 FDB SuperDosGetFLen ; Get file length
116 FDB SuperDosCloseAll ; Close all open files
117 FDB SuperDosCloseFile ; Close file
118 FDB SuperDosFRead ; Read data from file
119 FDB SuperDosFWrite ; Write data to file
120 FDB SuperDosGetFree ; Get free space on a disk
121 FDB SuperDosDeleteFile ; Delete a file
122 FDB SuperDosProtect ; Protect/unprotect file
123 FDB SuperDosRename ; Rename a file
124 FDB SuperDosGetDirEntry ; Get a directory entry
125 FDB SuperDosFindAndRead ; Find free buffer and read sector
126 FDB SuperDosSyncDir ; Copy updated sectors from track 20 to 16 (sync direcories)
127 FDB SuperDosReadAbsSector ; Read absolute sector
128 FDB SuperDosWriteAbsSector ; Write absolute sector (no verify)
129
130 ;
131 ; Init Dos
132 ;
133
134 DosInit LDX #DosAreaStart ; Point to bottom of dos vars area
135 TFR X,Y
136 LC02F CLR ,X+ ; Clear a byte, increment X
137 LEAY -1,Y ; decrement counter
138 BNE LC02F ; loop again if more to do
139
140 ; X now points to the top of the dos variable area
141
142 TFR X,D
143 TFR A,B
144 ADDB #$18
145 STB <BasTextPtr ; Setup new begining of basic
146 JSR >$AA87
147 LDA <GrfBasePtr ; Adjust graphics ram pages
148 ADDA #$06
149 STA <GrfTopPtr
150
151 ;
152 ; Init various low ram stuff, inturrupt vectors, basic stub etc
153 ;
154
155 LDX #DDE24 ; Point to rom copy of data to copy
156 LC049 LDB ,X+ ; Get byte count byte
157 BEQ LC054 ; zero= end of table, exit copy
158 LDU ,X++ ; Get destination address
159 JSR >UtilCopyBXtoU ; do copy
160 BRA LC049 ; do next
161
162 LC054 CLR DosHWMaskFF48 ; clear hardware mask
163 COM $0608 ; function unknown
164 LDX #$0683 ; Adjust usr vector base
165 STX <BasUsrBasePtr
166 LDU #BasFCError ; Setup the 10 usr vectors to point to BasFCError
167 LDB #$0A ; do 10
168 LC064 STU ,X++ ; setup vector
169 DECB ; decrement count
170 BNE LC064 ; loop again if more to do
171
172 INC DosDefDriveNo
173 BSR LC09D
174
175 LDX #RamHooks ; Point to ram hooks
176 LDY #RamHookTable ; Point to ram hook table in rom
177 LDD #$137E ; load A with number of vectors B with opcode for JMP
178 LC078 STB ,X+ ; setup jump
179 LDU ,Y++ ; setup vector
180 STU ,X++
181 DECA ; decrement counter
182 BNE LC078 ; Loop again if more to do
183
184 LDX #ResetVector ; Setup new reset vector
185 STX <ResetVecAddr
186 ANDCC #$AF ; reenable inturrupts
187
188 LDX #BasSignonMess ; Print staandard Basic signon message
189 JSR >BasPrintStr
190 JSR >DosDoRestore
191
192 LDX #DosSignonMess
193 JSR >BasPrintStr
194 JSR >LDC08
195 JMP >CmdMode ; Jump to normal basic command mode
196
197
198 LC09D LDA #WDCmdForceInt ; Force WD2797 to inturrupt & reset
199 STA cmdreg
200 LDX #DosD0Online ; Clear drive online flags
201 LDD <Zero16Bit ; load D with 16 bit zero !!!!
202 STD ,X
203 STD 2,X
204
205 LDX #Drv0Details+5 ; last byte of drive details for each drive
206 CLR ,X
207 CLR 6,X
208 CLR 12,X
209 CLR $12,X
210
211 CLR <DosIOInProgress ; Flag to check for timeout
212
213 LDX #DosDirSecStatus ; Clear Dirctory status, FCBs etc
214 LC0BC CLR ,X+
215 CMPX #$07F3
216 BNE LC0BC
217
218
219 LDB #$04 ; Count of buffers to process
220 LDX #Buff1Details ; Setup disk buffer initial values
221 LDU #$0800 ; addr of buffer
222 LC0CB CLR 2,X
223 STB 4,X
224 STU 5,X
225 LEAU $0100,U ; Increment addr for next buffer
226 LEAX 7,X ; do next buffer
227 DECB ; done all ?
228 BNE LC0CB ; no : do next
229 RTS
230
231 FCB $2A
232 FCB $20
233
234 LC0DD LDB DosTimeout ; Get timeout
235 STA DosTimeout
236 TSTB ; Timeout ?
237 BNE LC0ED ; no : return
238 LDX #SpinUpDelay ; wait some time for drive to spin up
239 LC0E9 LEAX -1,X
240 BNE LC0E9
241 LC0ED RTS
242
243 FCC / /
244
245 ;
246 ; The following code is quite clever, there are actually multiple code paths.
247 ; This involves having a 2 byte instruction encoded as the oprand to a 3
248 ; byte instruction eg :-
249 ;
250 ; L00FA CMPX #$C605
251 ;
252 ; CMPX is one byte long, so a jump to L00DB, will execute the oprand to the
253 ; CMPX, which decodes as LDB #$05 this saves a few bytes by not having LDB #xx,
254 ; BRA label.
255 ;
256 ; There are several examples of this in the Dos ROM !
257 ;
258
259 LC0F8 LDB #DosFnReadAddr
260
261 FCB $8C ; CMPX
262 DosDoWriteTrack
263 LDB #DosFnWriteTrack
264
265 FCB $8C ; CMPX
266 DosDoWriteSec2
267 LDB #DosFnWriteSec2
268
269 FCB $8C ; CMPX
270 DosDoWriteSec
271 LDB #DosFnWriteSec
272
273 FCB $8C ; CMPX
274 DosDoReadSec
275 LDB #DosFnReadSec
276
277 DosDoFuncinB
278 PSHS A
279 LEAS -2,S ; Make room on stack
280 CLR $0600
281 LC10D LDA #$03 ; retry count ?
282 STD ,S ; save on stack
283
284 LC111 BSR DosDoSeek ; Try to seek to track
285 BCS LC11D ; Error ?
286 LDB 1,S ; No error, get dos op code
287 STB <DosHWByte ; Save operation to perform
288 BSR SuperDosLowLevel
289 BCC LC159 ; No error
290
291 LC11D CMPB #$84
292 BEQ LC148
293
294 DEC ,S ; Dec retry count
295 BEQ LC13A ; Any retries left ?
296 LDB ,S ; get retry count
297 LSRB ; gety lsbit
298 BCC LC132 ; on even numbered retry, do recal
299
300 INC <DskTrackNo ; step out a track
301 BSR DosDoSeek
302 DEC <DskTrackNo ; step back in when retrying
303 BRA LC111
304
305 LC132 LDA <DskTrackNo ; Save Track no whilst doing restore
306 BSR DosDoRestore ; Restore & Recalibrate
307 STA <DskTrackNo ; Put track no back
308 BRA LC111 ; Try again
309
310 LC13A CMPB #$80
311 BNE LC156
312 TST $0600
313 BNE LC156
314 COM $0600
315 BRA LC152
316
317 ; Something to do with dir track ?
318 LC148 LDA <DskTrackNo ; Get track number
319 CMPA #$14 ; Track 20 ?
320 BNE LC156 ; no : error
321 LDA #$10 ; set track to 16
322 STA <DskTrackNo
323 LC152 LDB 1,S ; Get Dos op code
324 BRA LC10D ; So same to track 16
325
326 LC156 ORCC #$01 ; Flag error
327 FCB $21 ; opcocode for BRN
328 LC159 CLRB ; Flag no error
329 LEAS 2,S ; Drop bytes from stack
330 PULS A,PC ; restore & return
331
332 ;
333 ; Another LDB, enbeded in CMPX sequence....
334 ;
335
336 DosDoReadSec2
337 LDB #DosFnReadSec2
338
339 FCB $8C ; CMPX
340 DosDoSeek
341 LDB #DosFnSeek
342
343 FCB $8C ; CMPX
344 DosDoRestore
345 LDB #DosFnRestore
346 STB <DosHWByte ; save in hardware byte
347
348 ;
349 ; Low level hardware command, operation is in $00E8
350 ;
351
352 SuperDosLowLevel
353 PSHS CC,A,DP,X,Y,U
354 ORCC #$50 ; Disable inturrupts
355 ROR ,S
356 CLR <DosDiskError ; Flag no disk error
357 LDA <DosHWByte ; get HW byte
358 CMPA #$07 ; Valid op
359 BLS LC178 ; yes : do it !
360 BRA LC180 ; No: error
361
362 LC178 JSR >ResetAndStartDrive
363 BCC LC18B ; Error ?
364 LDB #$FD ; yes flag error
365
366 FCB $8C ; Andothe CMPX saving.....
367
368 LC180 LDB #$FC ; Set error code
369 ORCC #$01 ; and carry bit
370 ROL ,S
371 STB <DosDiskError ; Flag disk error
372 JMP >LC24D
373
374 ; Disable IRQ
375
376 LC18B LDX #PIA0CRA ; Point to PIA CR A
377 LC18E LDA ,X ; Get old value
378 PSHS A ; save on stack
379 ANDA #$FC ; Turn off inturrupt
380 STA ,X++ ; Save it and point to CR B
381 LDA ,X ; Get old CRB value
382 PSHS A ; save it on stack
383 ANDA #$FC ; Disable Inturrupt
384 STA ,X
385 LEAX $1E,X ; Point to next PIA
386 CMPX #PIA1CRB ; PIA1 ?
387 BCS LC18E ; No : do disable
388
389 LDA PIACRB ; Enable FIRQ from FDC
390 ORA #$37
391 STA PIACRB
392 LDA #$03
393 PSHS A
394 LDA <DskSectorNo ; Get disk sector no
395 CMPA #$12 ; >$12, therefore on second side
396 BLS LC1C2 ; no: don't adjust
397
398 SUBA #$12 ; Calculate sector number on second side
399 LDB #$02 ; Flag as side 2
400 ORB DosHWMaskFF40
401 STB DosHWMaskFF40
402
403 LC1C2 STA secreg ; Save in sector register
404 STA <DosSectorSeek ; Save sector we are looking for
405 LC1C7 LDY <Zero16Bit
406 LDX <DiskBuffPtr ; Point to buffer
407 LDB <DosHWByte ; Get hardware byte (function code)
408 ASLB ; Calculate offset in table
409 LDU #DosFunctionTable ; Point to function dispatch table
410 LDA <DosSectorSeek ; Get sector we are seeking to
411 CMPA secreg ; Found it yet ?
412 BNE LC1C2
413
414 LDA #$FF ; Set DP=$FF, to make IO quicker
415 TFR A,DP
416 LC1DD JSR [B,U] ; Jump to function handler
417 STA <DosDiskError ; Save error code
418 BCC LC1E5 ; No error : check verify
419 BRA LC213
420
421 LC1E5 ANDA DosErrorMask ; Mask out error bits we are not interested in
422 STA <DosDiskError ; save errors for later use
423 BEQ LC1FA ; No error : jump ahead
424
425 LDA <DosHWByte ; Get operation code
426 CMPA #DosFnReadSec2 ; ReadSec2 command ?
427 BEQ LC1F6
428 DEC ,S ; Dec retry count
429 BNE LC1C7 ; retry
430
431 LC1F6 ORCC #$01 ; Flag error
432 BRA LC213
433
434 LC1FA TST DosErrorMask ; is this write sector ?
435 BPL LC213 ; no : jump ahead
436
437 LDA <DskTrackNo ; Get track number
438 CMPA #$14 ; Primary Dir track ?
439 BEQ LC210
440
441 CMPA #$10 ; Secondary dir track ?
442 BEQ LC210
443
444 TST $0608
445 ANDCC #$FE ; re-enable inturrupts
446 BPL LC213
447
448 LC210 LBSR DosDoReadSec2
449 LC213 LEAS 1,S
450 ROL 4,S
451 LDX #DosD0Track-1 ; Point to drive track table
452 LDB <LastActiveDrv ; Get last used drive
453 ABX ; get pointer to track for current drive
454 LDA trkreg ; Get current track number from WD
455 CMPA <DskTrackNo ; Same as current track no ?
456 BEQ LC235 ; yes : update table
457
458 LDB DosErrorMask ; is this a seek ?
459 CMPB #$19
460 BNE LC235
461
462 LDB #$FF
463 STB <DosDiskError
464 ROR 4,S
465 ORCC #$01 ; flag error
466 ROL 4,S
467
468 LC235 STA ,X ; Update current track for current drive
469 LDX #PIA1CRB ; Restore state of PIA from stack
470 LC23A PULS A
471 STA ,X
472 PULS A
473 STA ,--X
474
475 LEAX -$1E,X ; Do PIA0
476 CMPX #PIA0CRA
477 BHI LC23A
478
479 CLR DosHWMaskFF40 ; Clear hardware mask
480 LC24D CLRB ; Flag no error
481 PULS CC,A,DP,X,Y,U ; Restore regs
482
483 BCC LC289
484 LDB <DosDiskError ; get last error code
485 BEQ LC289 ; no error : exit
486
487 BPL LC278
488
489 ;
490 ; Work out the dragon error code that coresponds to the hardware
491 ; error reported by WD.
492 ;
493
494 CMPB #$FC
495 BNE LC260
496
497 LDB #$A4
498 BRA LC287
499
500 LC260 CMPB #$FD
501 BNE LC268
502
503 LDB #$28
504 BRA LC287
505
506 LC268 CMPB #$FE
507 BNE LC270
508
509 LDB #$80
510 BRA LC287
511
512 LC270 CMPB #$FF
513 BNE LC285
514
515 LDB #$82
516 BRA LC287
517
518 LC278 TFR B,A
519 LDB #$82
520 ROLA
521 LC27D ADDB #$02
522 ROLA
523 TSTA
524 BCS LC287
525 BNE LC27D
526 LC285 LDB #$A6
527 LC287 ORCC #$01
528 LC289 RTS
529
530 ;
531 ; Reset controler chip, and spin up drive.
532 ;
533
534 ResetAndStartDrive
535 LDA #WDCmdForceInt ; Force inturrupt
536 STA cmdreg
537 LDA <DosLastDrive ; Get last active drive no
538 BMI LC29A ; invalid, flag error & exit
539 BEQ StartDrive ; Zero ? : yes branch on
540 DECA ; Make drive number 0..3 from 1..4
541 CMPA #$03 ; Drive valid ?
542 BLS StartDrive2 ; yes : continue
543
544 LC29A ORCC #$01 ; flag error
545 DosHookRetDevParam RTS ; return
546
547 ;
548 ; Select drive, and start motor & load track reg.
549 ;
550
551 StartDrive
552 INC <DosLastDrive ; Flag drive 1
553 StartDrive2
554 ORA #NMIEn+MotorOn ; Mask in nmi enable & Motor on bits
555 PSHS A
556 LDA DosHWMaskFF48 ; Get HW byte mask
557 ANDA #$FC ; Mask out drive bits
558 ORA ,S+ ; Mask in drive bits
559
560 ifne DragonAlpha
561 LBSR AlphaDskCtl ; Write to control reg
562 else
563 STA DskCtl ; Write to control reg
564 endc
565
566 STA DosHWMaskFF48 ; Resave hardware mask
567 LDX #DosD0Track-1 ; Point to current track table
568 LDA <LastActiveDrv ; Get active drive
569 LDA A,X ; Get drive current track
570 STA trkreg ; Write to controler
571 LDA #$D2
572 JSR >LC0DD
573 CLRB ; no error ?
574 RTS
575 ;
576 ; Dos function 0 comes here
577 ;
578
579 DosFunctionRestore
580 CLRA
581 STA >DskTrackNo ; Save Track number
582 BRA LC2D9
583
584 ;
585 ; Dos function 1
586 ;
587
588 DosFunctionSeek
589 LDA >DskTrackNo ; Get current track no
590 CMPA dptrkreg ; Are we over it ?
591 BNE SeekTrackinA ; no : seek to it
592 CLRA
593 STA DosErrorMask ; Turn off verify
594 TFR A,DP ; Reset DP
595 RTS
596
597 ;
598 ; Seek to a track, routine will exit either with an error, or via NMI.
599 ; On entry A contains track to seek to.
600 ;
601
602 SeekTrackinA
603 STA dpdatareg
604 LDA #WDCmdSeek ; Seek command
605
606 LC2D9 LDB #$19
607 STB DosErrorMask
608 LDX #DosD0StepRate-1 ; Point to step rate table
609 LDB >LastActiveDrv ; Get active drive
610 ORA B,X ; Mask in that drive's step rate
611 STA dpcmdreg ; save in command reg
612 LC2E8 MUL ; burn up CPU time waiting....
613 MUL ; NMI will exit this loop
614 LEAY -1,Y ; decrement timeout counter
615 BNE LC2E8 ; count exhausted ? : no keep going
616 BRA LC337 ; yes : error
617
618 ;
619 ; Dos function 6 : Read address mark
620 ;
621
622 DosFunctionReadAddr LDA #WDCmdReadAddr ; Read address mark
623
624 FCB $8C ; CMPX again :)
625 ;
626 ; Dos function 2 : Read sector
627 ;
628
629 DosFunctionReadSec
630 LDA #WDCmdReadSec ; Read a sector
631 LDB #$3F
632 STB DosErrorMask
633 LDB #$05 ; try 5x$FFFF for timeout
634 ORA DosHWMaskFF40 ; Mask in side etc
635 STA dpcmdreg
636
637 LC301 LDA dppiacrb ; Check for INT from WD
638 BMI LC311 ; yes : start reading bytes
639 LEAY -1,Y ; decrement timeout count
640 BNE LC301 ; check for int again, if no timeout
641 LDA dppiadb
642 DECB ; decrement retry wait count
643 BNE LC301 ; count=0 ?, no continue waiting
644 BRA LC337 ; yes : error and exit
645
646 ;
647 ; Read sector/address mark loop, exits with NMI.
648 ;
649
650 LC310 SYNC ; Syncronise to FIRQ (INT from WD)
651 LC311 LDB dppiadb ; clear iunturrupt
652 LDA dpdatareg ; read byte from WD
653 STA ,X+ ; save in buffer
654 BRA LC310 ; do next byte
655
656 ;
657 ; Dos function 7 read first two bytes of a sector, used by BOOT command.
658 ;
659
660 DosFunctionReadSec2
661 LDX #$004F
662 LDA #$3F
663 STA DosErrorMask
664 LDB #$05 ; Wait 5x$FFFF
665 LDA #WDCmdReadSec ; Read sector command
666 ORA DosHWMaskFF40 ; mask in heads etc
667 STA dpcmdreg ; write it to WD
668
669 LC32A LDA dppiacrb ; Check for Int from WD
670 BMI LC343 ; yes : start reading
671 LEAY -1,Y ; decrement timeout
672 BNE LC32A ; check again
673 LDA dppiadb ; try clearing int
674 DECB ; decrement outer count
675 BNE LC32A ; keep going ?
676
677 LC337 LDA #WDCmdForceInt ; Force the WD to abort
678 STA dpcmdreg
679 CLRA ; Reset DP to page 0
680 TFR A,DP
681 LDA #$FE ; return error
682 ORCC #$01
683 RTS
684
685 ; Read data from WD, as normal exited with NMI
686
687 LC343 LDA dpdatareg ; read byte from WD
688 TST dppiadb ; clear inturrupt
689 STA ,X+ ; save in memory
690 SYNC ; wait for next
691 LDA dpdatareg ; get next byte
692 TST dppiadb ; clear inturrupt
693 STA ,X ; save byte
694 LC350 SYNC ; wait for next
695 TST dppiadb ; clear inturrupt
696 LDA dpdatareg ; read byte
697 BRA LC350 ; do next
698
699 ;
700 ; Dos function 4
701 ;
702
703 DosFunctionWriteSec2
704 LDA #$5F
705
706 FCB $8C
707
708 ;
709 ; Dos function 3
710 ;
711
712 DosFunctionWriteSec
713 LDA #$DF
714 STA DosErrorMask
715 BSR DosSetPrecomp ; Setup write precomp
716
717 LC361 LDA #WDCmdWriteSec ; Write sector
718 ORA DosHWMaskFF40 ; Mask in side etc
719 STA dpcmdreg ; write to WD
720 LDA ,X+ ; fetch first byte to write
721
722 LC36A LDB dppiacrb ; Int from WD ?
723 BMI LC377 ; yes : start writing
724 LEAY -1,Y ; decrement timeout
725 BNE LC36A ; if not timed out continue waiting
726 BRA LC337 ; timout, abort, and return error
727
728 ; Write sector loop, NMI breaks out of here
729
730 LC374 LDA ,X+ ; get byte to write
731 SYNC ; wait for WD
732 LC377 STA dpdatareg ; write byte to WD
733 LDA dppiadb ; clear inturrupt
734 BRA LC374 ; Do next byte
735
736 ;
737 ; Dos function 5 : Write (format) track
738 ;
739
740 DosFunctionWriteTrack
741 LDA #$47
742 STA DosErrorMask
743 BSR DosSetPrecomp ; Set write precomp
744
745 LDA #WDCmdWriteTrack ; Write (format) track
746 ORA DosHWMaskFF40 ; Mask in head etc
747 STA dpcmdreg
748 LC38B LDD ,X++ ; Get bytes to write A=count, B=byte
749 LC38D SYNC ; Wait for WD
750 CMPA dppiadb ; Clear inturrupt
751 STB dpdatareg ; Write a byte on track
752 DECA ; decrement byte count
753 BNE LC38D ; continue until count=0
754
755 LDA ,X+ ; get next
756 SYNC
757 CMPA dppiadb ; Clear int
758 STA dpdatareg ; write to wd
759 BRA LC38B ; do next block
760
761 ;
762 ; Set write precompensation based on track
763 ;
764
765 DosSetPrecomp
766 LDA dptrkreg ; Get track
767 CMPA #TrackPrecomp ; track < 16
768 BLS LC3AB ; no : no write precomp
769
770 LDA DosHWMaskFF48 ; Enable precomp
771 ORA #WPCEn
772 BRA LC3B0 ; Write to controler
773
774 LC3AB LDA DosHWMaskFF48 ; Turn off precomp
775 ANDA #~WPCEn ;#$EF
776 LC3B0
777 ifne DragonAlpha
778 LBSR AlphaDskCtl ; Write control reg
779 else
780 STA DskCtl ; Write control reg
781 endc
782
783 RTS
784
785 ;
786 ; Dskinit dispatch routine
787 ;
788 ; Syntax :
789 ; DSKINIT drive,sides,tracks
790 ;
791
792 CmdDskInit
793 BEQ LC3D9
794 JSR >GetDriveNoInB
795 STB <$EB
796 JSR >GetCommaThen8Bit
797 BEQ LC3DE
798 DECB
799 CMPB #$01
800 BHI LC3D6
801 STB <$F4
802 JSR >GetCommaThen8Bit
803 BEQ LC3E0
804 CMPB #$28
805 BEQ LC3E2
806 NEG <$F4
807 CMPB #$50
808 BEQ LC3E2
809 LC3D6 JMP >DosPRError
810
811 LC3D9 LDB $060A
812 STB <$EB
813 LC3DE CLR <$F4
814 LC3E0 LDB #$28
815 LC3E2 STB <$F2
816 JSR >DosHookCloseSingle
817 LBNE LC471
818 LDX #$0800
819 STX <$EE
820 JSR DosDoRestore
821 BNE LC471
822 LDA #$01
823 STA <$ED
824 JSR >DosDoReadSec2
825 CMPB #$80
826 BEQ LC471
827 LC400 CLR <$F3
828 CLR <$ED
829 JSR >LC509
830 JSR >DosDoWriteTrack
831 BCS LC471
832 TST <$F4
833 BEQ LC41F
834 LDA #$01
835 STA <$F3
836 NEGA
837 STA <$ED
838 JSR >LC509
839 JSR >DosDoWriteTrack
840 BCS LC471
841 LC41F INC <$EC
842 LDA <$EC
843 CMPA <$F2
844 BCS LC400
845 JSR >DosDoRestore
846 BCS LC471
847 LC42C JSR >DosDoSeek
848 BCS LC471
849 CLRA
850 JSR >LC4F2
851 INC <$EC
852 LDA <$EC
853 CMPA <$F2
854 BCS LC42C
855 LDX <$EE
856 LDD <Zero16Bit
857 LC441 STD ,X++
858 CMPX #$0B00
859 BNE LC441
860 LDA #$01
861 STA <$ED
862 LDA #$14
863 BSR LC45A
864 DEC <$ED
865 DEC <$EE
866 LDA #$10
867 BSR LC460
868 BRA LC474
869
870 LC45A PSHS A
871 BSR LC49B
872 PULS A
873 LC460 STA <$EC
874 JSR >DosDoWriteSec
875 BCS LC471
876 INC <$ED
877 INC <$EE
878 JSR >DosDoWriteSec
879 BCS LC471
880 RTS
881
882 LC471 JMP >DosHookSysError
883
884 LC474 INC <$EE
885 LDX <$EE
886 LDD #$890A
887 LC47B STA ,X
888 LEAX $19,X
889 DECB
890 BNE LC47B
891 BSR LC489
892 LDA #$14
893 STA <$EC
894 LC489 LDD #$1003
895 STB <$ED
896 LC48E JSR >DosDoWriteSec
897 BCS LC471
898 INC <$ED
899 DECA
900 BNE LC48E
901 JMP >LC09D
902
903 LC49B STA <$EC
904 LDA #$12
905 LDB #$5A
906 TST <$F4
907 BEQ LC4A7
908 ASLB
909 ASLA
910 LC4A7 STA $08FD
911 COMA
912 STA $08FF
913 LDA <$F2
914 STA $08FC
915 TST <$F4
916 BNE LC4BC
917 CMPA #$50
918 BNE LC4BC
919 ASLB
920 LC4BC COMA
921 STA $08FE
922 LDX <$EE
923 LDU #$0900
924 LDA #$FF
925 LC4C7 STA ,X+
926 DECB
927 BNE LC4C7
928 LDD #$242D
929 TST <$F4
930 BEQ LC4E0
931 BPL LC4DD
932 LDD #$B4FF
933 LC4D8 STB ,U+
934 DECA
935 BNE LC4D8
936 LC4DD LDD #$485A
937 LC4E0 LDU <Zero16Bit
938 PSHS A
939 BSR LC4E8
940 PULS B
941 LC4E8 LDX <$EE
942 ABX
943 LDA #$FC
944 STU ,X++
945 STA ,X
946 RTS
947
948 LC4F2 CLR <$ED
949 TST <$F4
950 BEQ LC4FA
951 BSR LC4FA
952 LC4FA LDA #$12
953 LC4FC INC <$ED
954 JSR >DosDoReadSec2
955 LBCS LC471
956 DECA
957 BNE LC4FC
958 LC508 RTS
959
960 LC509 LDU <$EE
961 LDX #DDDFD
962 LDY #DDDEA
963 LDB #$0C
964 BSR LC537
965 LC516 LDX #DDE09
966 LDB #$06
967 BSR LC537
968 LDA #$01
969 LDB <$EC
970 STD ,U++
971 LDB <$F3
972 STB ,U+
973 LDB ,Y+
974 STD ,U++
975 STA ,U+
976 LDB #$12
977 BSR LC537
978 TST ,Y
979 BNE LC516
980 LDB #$03
981 LC537 JMP >UtilCopyBXtoU
982
983 ;
984 ; GetCommaThen8Bit, scan for comma, error if not found, then fetch 8 bit that follows (or error).
985 ;
986
987 GetCommaThen8Bit
988 JSR <BasChrGetCurr ; Get current basic char
989 BEQ LC508 ; Any left no: return
990 JSR >VarCKComma ; check for comma
991 JMP >Get8BitorError ; go get it
992
993 ;
994 ; Backup command dispatch routine
995 ;
996 ; Syntax :-
997 ; BACKUP SrcDrive TO Destdrive,heads,tracks
998 ;
999 ; Stack frame as follows :
1000 ; 16 bytes cleared on stack, U points to base of this area as with OS-9.
1001 ;
1002 ; 0,U Drive number of source ?
1003 ; 1,U $00 Source track
1004 ; 2,U $01 Source sector
1005 ; 3,U $DF5A ???
1006 ; 5,U Source buffer addr
1007 ; 7,U Drive number of dest ?
1008 ; 8,U $00 Dest track
1009 ; 9,U $01 Dest sector ????
1010 ; 10,U $DF6D ???
1011 ; 12,U dest buff addr
1012 ; 14,U $12 Sector count per track to copy ?
1013 ; 15,U Page number of top of usable RAM
1014
1015
1016 CmdBackup
1017 LEAS -16,S ; Make tempory space on stack
1018 TFR S,U ; Point U at base of tempory space (Like OS-9 !)
1019 TFR U,D
1020 SUBD #$0040 ; reserve room for working stack
1021 SUBD <BasEndInUse ; Check that we have suficient memory available
1022 LBMI BasOMError ; NO: report ?OM error
1023
1024 CMPA #$01 ; At least 1 sector's worth of ram (256 bytes) available
1025 LBLT BasOMError ; NO: report ?OM error
1026 STA BupAvailPages,U ; Store memory page count of avaiable RAM
1027 LDA #$12 ; Sectors per track, initially 18 for SS disk
1028 STA BupSecTrk,U
1029 LDD <BasEndInUse ; Get end of RAM in use by basic
1030 STD BupSrcBuff,U ; save in buffer pointers for source and dest
1031 STD BupDestBuff,U
1032
1033 LDD #$DF5A ; Error masks ?
1034 STD 3,U
1035 LDD #$DF6D
1036 STD 10,U
1037
1038 LDD #$0001 ; Set source and dest track and sector to 0 & 1
1039 STD BupSrcTrk,U
1040 STD BupDestTrk,U
1041 LDA DosDefDriveNo ; Get default drive no
1042 STA BupSrcDrive,U ; save in source drive
1043 STA BupDestDrive,U ; and dest
1044 LDY #$02D0 ; sector count 720 sectors=ss40 disk
1045
1046 JSR <BasChrGetCurr
1047 BEQ DoCmdBackup ; No params backup from default drive to default
1048 JSR >Get8BitorError
1049 CMPB #$04 ; greater than Max drive (4)?
1050 LBHI DosDNError
1051
1052 STB BupSrcDrive,U ; Save source drive
1053 STB BupDestDrive,U ; and default dest to same drive
1054
1055 JSR <BasChrGetCurr ; Get current character from basic
1056 BEQ DoCmdBackup ; end of line : yes do backup
1057
1058 CMPA #$BC ; is this the "TO" token ?
1059 BNE CmdBackupErrorExit ; no : error, exit
1060
1061 JSR <BasChrGet ; Get next char, skip over "TO"
1062 JSR >Get8BitorError ; Get dest drive in B
1063 CMPB #$04 ; Invalid drive no ?
1064 LBHI DosDNError ; yes : error, exit
1065 STB BupDestDrive,U ; Save in Dest driveno
1066
1067 BSR GetCommaThen8Bit ; Skip comma, and get next param
1068 BEQ DoCmdBackup ; nothing : do backup
1069 CMPB #$02 ; 2 sided disk specified ?
1070 BEQ BackupDS ; yes backup double sided
1071 CMPB #$01 ; 1 sided disk specified ?
1072 BEQ BackupSS ; yes backup single sided
1073
1074 CmdBackupErrorExit
1075 JMP >BasSNError ; error : exit
1076
1077 BackupDS
1078 TFR Y,D ; Double sector count if double sided
1079 LEAY D,Y
1080 ASL BupSecTrk,U ; Set sectors per track for DS disk
1081
1082 BackupSS
1083 JSR >GetCommaThen8Bit ; Get next param (if any)
1084 BEQ DoCmdBackup ; none: continue
1085 CMPB #$50 ; Is this an 80 track backup ?
1086 BEQ Backup80
1087 CMPB #$28 ; Or a 40 track backup ?
1088 BEQ DoCmdBackup
1089 BRA CmdBackupErrorExit ; neither error and exit
1090
1091 Backup80
1092 TFR Y,D ; Double sector count if 80 track
1093 LEAY D,Y
1094
1095 DoCmdBackup
1096 CLRA
1097
1098 BupReadFromSrc
1099 LEAY 1,Y ; Get sector count
1100 LEAX BupSrcDrive,U ; point to source drive on stack frame
1101 BSR LC643 ; read 1 sector
1102 LC5D6 LEAY -1,Y ; decrement sector count
1103 BNE LC5E0 ; if more sectors, do next
1104 BSR BupWriteToDest ; no : write final sectors to destination
1105 LEAS $10,U ; Clear stack frame
1106 LC5DF RTS ; return to caller
1107
1108 LC5E0 CMPA BupAvailPages,U ; Filled all available RAM pages ?
1109 BNE LC5F2 ; no : do next sector
1110 BSR BupWriteToDest ; Yes : write to destination
1111 PSHS D
1112 LDD <BasEndInUse ; Get end of basic storage
1113 STD BupDestBuff,U ; Save in source and dest buffer pointers
1114 STD BupSrcBuff,U
1115 PULS D
1116 BRA BupReadFromSrc ; Do next sector
1117
1118 LC5F2 LDB #$02
1119 BSR LC608
1120 INCA
1121 BRA LC5D6
1122
1123 BupWriteToDest
1124 TSTA
1125 BEQ LC5DF
1126 LEAX BupDestDrive,U ; Point to dest drive vars
1127 BSR LC643
1128 DC600 LDB #$03
1129 LC602 BSR LC608
1130 DC604 DECA
1131 BNE LC602
1132 LC607 RTS
1133
1134 LC608 PSHS D
1135 LDA BupDrive,X ; Get drive
1136 STA <LastActiveDrv ; Set last active drive
1137
1138 LDD BupBuff,X
1139 STD <DiskBuffPtr ; Setup disk buffer pointer
1140 LDD BupTrk,X
1141 STD <DskTrackNo ; and disk track no
1142 LDB 1,S ; Get function, read or write
1143 JSR >DosDoFuncinB
1144 BCC LC631 ; no error continue
1145 STB $0603 ; Temp storage (error code from dos)
1146
1147 LDA 1,S ; Get function, read or write
1148 CMPA #DosFnReadSec ; Read ?
1149 BRA LC62B
1150
1151 PULS D,X
1152 ; FCB $35
1153 ; FCB $16
1154
1155 JSR BupWriteToDest
1156
1157 ; FCB $BD
1158 ; FCB $C5
1159 ; FCB $F9
1160
1161 LC62B LDB $0603 ; Retrieve error code
1162 JMP >DosHookSysError
1163
1164 LC631 INC 2,X ; Increment sector number
1165 LDA 2,X ; check sector number
1166 CMPA 14,U ; Done all sectors on track ?
1167 BLS LC63F ; No: do next sector
1168
1169 LDA #$01 ; Reset sector count to 1
1170 STA 2,X
1171 INC 1,X ; Increment track count
1172 LC63F INC 5,X ; Move to next page of buffer
1173 PULS D,PC ; restore and return
1174
1175 LC643 LDB ,U ; get source drive
1176 CMPB 7,U ; same as dest drive ?
1177 BNE LC607 ; no : continue
1178
1179 PSHS A,X,Y,U
1180 JSR >TextCls ; clear screen
1181 LDX 1,S ; get message pointer
1182 LDX 3,X
1183 JSR >BasPrintStr ; Print message (insert source/insert dest)
1184 LDX #MessPressAnyKey
1185 JSR >BasPrintStr ; Print press any key
1186 JSR >TextWaitKey ; Wait for a kepress
1187 JSR >TextCls
1188 PULS A,X,Y,U,PC
1189 ;
1190 ; Get8BitorError, get non zero 8 bit value in B, or generate error
1191 ;
1192 Get8BitorError
1193 PSHS Y,U
1194 JSR >VarGet8Bit ; Get 8 bit value into B
1195 TSTB ; B non zero ?
1196 BNE LC66E
1197 JMP >BasFCError ; No : error
1198
1199 LC66E PULS Y,U,PC ; Restore and return
1200
1201 LC670 CMPA #$FF
1202 LBEQ BasSNError
1203 SUBA #$CE
1204 BPL LC67D
1205 LC67A JMP >BasSNError
1206
1207 LC67D CMPA #$1A
1208 BCC LC687
1209 LDX #CommandDispatchTable
1210 JMP >$84ED
1211
1212 LC687 JMP [>$0137]
1213
1214 LC68B SUBB #$44
1215 BPL LC691
1216 BRA LC67A
1217
1218 LC691 CMPB #$0E
1219 BCC LC69D
1220 LDX #FunctionDipatchTable
1221 JSR [B,X]
1222 JMP >$8874
1223
1224 LC69D JMP [>$013C]
1225
1226 LC6A1 LDX #$0634
1227 LC6A4 JSR >LD2E2
1228 BNE DosHookSysError
1229 CLR 2,X
1230 LEAX 7,X
1231 CMPX #$0650
1232 BCS LC6A4
1233 LC6B2 RTS
1234
1235 ;
1236 ; Get drive no in B, returns drive no (from command) in B,
1237 ; or causes error if (drive < 0 ) or (drive > 4)
1238 ;
1239
1240 GetDriveNoInB
1241 JSR >VarGet8Bit ; Get 8 bit var
1242 TSTB
1243 BMI DosDNError ; Minus, invalid drive
1244 BNE LC6BC ; greater than 0, check < 4
1245 INCB ; =0 increment so drive 0 = drive 1
1246 LC6BC CMPB #$04 ; Drive in range
1247 BLS LC6B2 ; Yes : return it in B
1248
1249 DosDNError
1250 LDB #$28
1251
1252 FCB $8C ; CMPX
1253 DosPRError
1254 LDB #$A4
1255
1256 DosHookSysError
1257 STB DosErrLast ; save last error code
1258 LDX <BasCurrentLine ; Get current line no
1259 STX DosErrLineNo ; save for ERR routine
1260 JSR >BasResetStack ; reset basic stack
1261 CLR <DosIOInProgress ; Flag no IO in progress
1262 CLR <BasDeviceNo ; Set device no back to console
1263 TST DosErrGotoFlag ; Do we have an error handler ?
1264 BPL LC6DF ; Yes, handle errors
1265 LDX <BasCurrentLine ; Get current line no
1266 LEAX 1,X
1267 BNE LC6F9
1268
1269 LC6DF JSR >TextOutCRLF ; Output a return
1270 JSR >CasMotorOff ; turn off cassette motor
1271 JSR >SndDisable ; disable cassette sound
1272 JSR >TextOutQuestion ; output '?'
1273 LDX #$82A9
1274 LDB DosErrLast ; Get last error code
1275 BPL LC6F6
1276 LDX #DDF2A
1277 LC6F6 JMP >$835E
1278
1279 LC6F9 LDX #$84DA
1280 DC6FC PSHS X
1281 LDD $0615
1282 STD <$2B
1283 JMP >$85E7
1284
1285 ;
1286 ; New reset vector
1287 ;
1288
1289 ResetVector
1290 NOP ; Main ROM checks for reset->NOP
1291 CLRA ; Reset DP=0
1292 TFR A,DP
1293 JSR >LC09D ; Reset WD, and various Dos vars.
1294 CLR DosErrorMask ; reset various flags
1295 CLR DosTimeout
1296 CLR DosAutoFlag
1297 LDA #$35 ; Re-enable NMI
1298 STA PIA0CRB
1299 JMP >$B44F ; Jump back to Main ROM reset routine
1300
1301 ;
1302 ; NMI vector, called to break out of read & write loops between 6809 & WD
1303 ; This allows the IO routines to handle sectors of all lengths.
1304 ;
1305
1306 NMISrv
1307 LDA dpcmdreg ; Read status register.
1308 CLRB ; Reset DP=0
1309 TFR B,DP
1310 LEAS 12,S ; Drop registers from stack
1311 TSTA ; Setup CC
1312 LC726 RTS ; Return to caller
1313
1314 ;
1315 ; New IRQ vector, used to count down and shut off drives.
1316 ;
1317
1318 IRQSrv CLRA ; Reset DP=0
1319 TFR A,DP
1320 TST <DosIOInProgress ; Doing IO ?
1321 BNE LC748 ; Yes: don't time out
1322 LDA DosTimeout ; Get timeout byte
1323 BEQ LC748 ; Already timed out : exit
1324 DECA ; Decrement timeout count
1325 STA DosTimeout
1326 BNE LC748 ; not zero, don't timeout yet
1327 BSR SuperDosSyncDir ; syncronsise directory
1328 BNE LC74B ; Error : report it
1329 LDA DosHWMaskFF48 ; turn off motor in hw byte
1330 ANDA #~MotorOn
1331 STA DosHWMaskFF48
1332
1333 ifne DragonAlpha
1334 LBSR AlphaDskCtl ; Actually turn off motor
1335 else
1336 STA DskCtl ; Actually turn off motor
1337 endc
1338
1339 LC748 JMP >$9D3D ; Jump to BASIC IRQ
1340
1341 LC74B JMP >DosHookSysError ; Jump to system error trap
1342
1343 LC74E TFR S,D
1344 SUBD #$0100
1345 SUBD <$1F
1346 BMI LC75B
1347 CLRB
1348 TSTA
1349 BNE LC726
1350 LC75B JMP >$8342
1351
1352 ;
1353 ; Copy directory from track 20 to track 16.
1354 ;
1355
1356 SuperDosSyncDir
1357 JSR >LC6A1
1358 LEAS -8,S
1359 LEAU ,S
1360 LEAY 4,U
1361 LDX #$0800
1362 STX <$EE
1363 CLR 2,U
1364 LDB <$EB
1365 STB 1,U
1366 LDB #$01
1367 STB ,U
1368 CLR <$EB
1369 LDX #$06AA
1370 LC77B LDB #$12
1371 STB 3,U
1372 INC <$EB
1373 LC781 LDB 3,U
1374 LDA B,X
1375 BITA ,U
1376 BEQ LC7A7
1377 COMA
1378 ANDA B,X
1379 STA B,X
1380 INC 2,U
1381 STB <$ED
1382 STB ,Y+
1383 LDB #$14
1384 STB <$EC
1385 JSR >DosDoReadSec
1386 BNE LC7BE
1387 INC <$EE
1388 LDB 2,U
1389 CMPB #$04
1390 BCS LC7A7
1391 BSR LC7C1
1392 LC7A7 DEC 3,U
1393 BNE LC781
1394 TST 2,U
1395 BEQ LC7B1
1396 BSR LC7C1
1397 LC7B1 ASL ,U
1398 LDA ,U
1399 CMPA #$08
1400 BLS LC77B
1401 LDA 1,U
1402 STA <$EB
1403 CLRB
1404 LC7BE LEAS 8,U
1405 RTS
1406
1407 LC7C1 LDA #$10
1408 STA <$EC
1409 LC7C5 DEC <$EE
1410 LEAY -1,Y
1411 LDA ,Y
1412 STA <$ED
1413 JSR >DosDoWriteSec
1414 BEQ LC7D5
1415 LEAS 8,U
1416 RTS
1417
1418 LC7D5 DEC 2,U
1419 BNE LC7C5
1420 RTS
1421
1422 FIRQSrv
1423 TST PIACRA ; Clear Inturrupt conditions
1424 TST PIACRB
1425 RTI ; and return
1426
1427 LC7E1 BSR SuperDosValidFilename ; Validate filename
1428 BNE LC857 ; Error : exit
1429 JMP >SuperDosOpenFile ; Open file if valid
1430
1431 ;
1432 ; Validate filename and copy to current drive block
1433 ;
1434
1435 SuperDosValidFilename
1436 LDA $060A
1437 STA $065B
1438 CLR $0660
1439 LDU #$0650
1440 LDA #$07
1441 LC7F6 CLR A,U
1442 DECA
1443 BPL LC7F6
1444 LDA 2,Y
1445 STA $065A
1446 LDA 1,Y
1447 STA $0659
1448 LDA ,Y
1449 STA $0658
1450 CMPB #$0E
1451 BHI LC855
1452 TSTB
1453 BEQ LC855
1454 CMPB #$03
1455 BCS LC83D
1456 SUBB #$02
1457 LDA B,X
1458 CMPA #$3A
1459 BNE LC823
1460 INCB
1461 LDA B,X
1462 INCB
1463 BRA LC82D
1464
1465 LC823 ADDB #$02
1466 LDA 1,X
1467 CMPA #$3A
1468 BNE LC83D
1469 LDA ,X++
1470 LC82D SUBA #$30
1471 BLS LC835
1472 CMPA #$04
1473 BLS LC838
1474 LC835 LDB #$1C
1475 RTS
1476
1477 LC838 STA $065B
1478 SUBB #$02
1479 LC83D LDA ,X+
1480 DECB
1481 BMI LC8A6
1482 CMPA #$2F
1483 BEQ LC84A
1484 CMPA #$2E
1485 BNE LC866
1486 LC84A CMPU #$0650
1487 BEQ LC855
1488 TST $0660
1489 BEQ LC858
1490 LC855 LDB #$96
1491 LC857 RTS
1492
1493 LC858 INC $0660
1494 LDU #$0658
1495 CLR ,U
1496 CLR 1,U
1497 CLR 2,U
1498 BRA LC83D
1499
1500 LC866 CMPA #$41
1501 BCS LC87A
1502 CMPA #$5A
1503 BLS LC886
1504 SUBA #$20
1505 CMPA #$41
1506 BCS LC855
1507 CMPA #$5A
1508 BLS LC886
1509 BRA LC855
1510
1511 LC87A CMPA #$2D
1512 BEQ LC886
1513 CMPA #$30
1514 BCS LC855
1515 CMPA #$39
1516 BHI LC855
1517 LC886 STA ,U+
1518 CMPU #$065B
1519 BNE LC893
1520 TSTB
1521 BNE LC855
1522 BRA LC8A6
1523
1524 LC893 CMPU #$0658
1525 BNE LC83D
1526 LDA ,X+
1527 DECB
1528 BMI LC8A6
1529 CMPA #$2E
1530 BEQ LC84A
1531 CMPA #$2F
1532 BEQ LC84A
1533 LC8A6 CLRB
1534 RTS
1535
1536 ;
1537 ; Open a file and copy dir entry into FCB.
1538 ;
1539
1540 SuperDosOpenFile
1541 LDX #$06BD
1542 CLR <$F1
1543 LDD $0650
1544 LC8B0 CMPD ,X
1545 BNE LC8CB
1546 LDU #$0652
1547 LEAY 2,X
1548 LDB #$0A
1549 LC8BC LDA ,U+
1550 CMPA ,Y+
1551 BNE LC8C8
1552 DECB
1553 BNE LC8BC
1554 JMP >LC973
1555
1556 LC8C8 LDD $0650
1557 LC8CB LEAX $1F,X
1558 INC <$F1
1559 CMPX #$07F3
1560 BCS LC8B0
1561 CLR <$F1
1562 LDX #$06BD
1563 LC8DA TST ,X
1564 BEQ LC8EB
1565 LEAX $1F,X
1566 INC <$F1
1567 CMPX #$07F3
1568 BCS LC8DA
1569 LDB #$A2
1570 LC8EA RTS
1571
1572 LC8EB LDB #$0C
1573 TFR X,Y
1574 LDU #$0650
1575 LC8F2 LDA ,U+
1576 STA ,Y+
1577 DECB
1578 BNE LC8F2
1579 STA <$EB
1580 LDU #$0616
1581 LDB #$06
1582 MUL
1583 LEAU D,U
1584 INC 5,U
1585 LDB #$13
1586 LC907 CLR ,Y+
1587 DECB
1588 BNE LC907
1589 LDA #$80
1590 STA 15,X
1591 CLR $0681
1592 JSR >LD1A3
1593 BNE LC8EA
1594 LDY ,X
1595 LEAY 2,Y
1596 LDA #$10
1597 STA $0660
1598 LC922 STY $065C
1599 JSR >SuperDosFindAndRead
1600 BNE LC8EA
1601 LDX 5,X
1602 LEAU $00FA,X
1603 STU $065E
1604 LC934 LDA ,X
1605 BITA #$81
1606 BNE LC954
1607 LDD $0650
1608 CMPD 1,X
1609 BNE LC954
1610 LDU #$0652
1611 LEAY 3,X
1612 LDB #$09
1613 LC949 LDA ,U+
1614 CMPA ,Y+
1615 BNE LC954
1616 DECB
1617 BNE LC949
1618 BRA LC980
1619
1620 LC954 LDA ,X
1621 BITA #$08
1622 BNE LC970
1623 INC $0681
1624 LEAX $19,X
1625 CMPX $065E
1626 BCS LC934
1627 LDY $065C
1628 LEAY 1,Y
1629 DEC $0660
1630 BNE LC922
1631 LC970 JSR >DosFCBNoToAddr
1632 LC973 CLRB
1633 TST 15,X
1634 BPL LC97A
1635 LDB #$A0
1636 LC97A LEAX 12,X
1637 LDA <$F1
1638 TSTB
1639 RTS
1640
1641 LC980 PSHS X
1642 JSR >DosFCBNoToAddr
1643 PULS Y
1644 LDA $0681
1645 STA $1D,X
1646 LDA ,Y
1647 STA 15,X
1648 LDD 12,Y
1649 STD $15,X
1650 LDA 14,Y
1651 STA $17,X
1652 STA $19,X
1653 CLR $18,X
1654 CLR $13,X
1655 CLR $14,X
1656 LDD 15,Y
1657 STD $1A,X
1658 LDA $11,Y
1659 STA $1C,X
1660 LDD #$FFFF
1661 STD $10,X
1662 STA $12,X
1663 BRA LC973
1664
1665 ;
1666 ; Read some data from a file into memory
1667 ;
1668
1669 SuperDosFRead
1670 CLR <$F5
1671 STA <$F1
1672 BRA LC9CA
1673
1674 LC9C3 LDA #$01
1675
1676 FCB $8C
1677
1678 LC9C6 LDA #$FF
1679 STA <$F5
1680 LC9CA STY $0661
1681 LBEQ LCAB0
1682 STU $0669
1683 STB $0663
1684 PSHS X
1685 JSR >DosFCBNoToAddr
1686 LDA 11,X
1687 STA <$EB
1688 TST <$F5
1689 BNE LC9F0
1690 LDD $0661
1691 ADDD 13,X
1692 BCC LC9EE
1693 INC 12,X
1694 LC9EE STD 13,X
1695 LC9F0 PULS X
1696 LDB $0663
1697 LC9F5 CLRA
1698 NEGB
1699 BNE LC9FA
1700 INCA
1701 LC9FA CMPD $0661
1702 BLS LCA03
1703 LDD $0661
1704 LCA03 PSHS D,X
1705 LDU $0669
1706 JSR >LCAB2
1707 BNE LCA1B
1708 TFR D,Y
1709 LDA 15,X
1710 BITA #$02
1711 BEQ LCA1E
1712 TST <$F5
1713 BEQ LCA1E
1714 LDB #$98
1715 LCA1B LEAS 4,S
1716 RTS
1717
1718 LCA1E LDX 2,S
1719 TST 1,S
1720 BNE LCA4E
1721 TST <$F5
1722 BEQ LCA2F
1723 BPL LCA34
1724 JSR >LD330
1725 BRA LCA37
1726
1727 LCA2F JSR >SuperDosReadAbsSector
1728 BRA LCA37
1729
1730 LCA34 JSR >SuperDosWriteAbsSector
1731 LCA37 BNE LCA1B
1732 INC 2,S
1733 LDX $0669
1734 LEAX 1,X
1735 STX $0669
1736 DEC $0661
1737 LDD $0661
1738 PULS D,X
1739 BNE LC9F5
1740 RTS
1741
1742 LCA4E TST <$F5
1743 BMI LCA93
1744 JSR >SuperDosFindAndRead
1745 BNE LCA1B
1746 STX $0667
1747 LDY 2,S
1748 LDB $0663
1749 TST <$F5
1750 BEQ LCA87
1751 LDA #$FF
1752 STA 2,X
1753 LDX 5,X
1754 ABX
1755 LDB 1,S
1756 LCA6D LDA ,Y+
1757 STA ,X+
1758 DECB
1759 BNE LCA6D
1760 TFR X,D
1761 TSTB
1762 BNE LCA93
1763 LDX $0667
1764 PSHS Y
1765 JSR >LD2E2
1766 PULS Y
1767 BNE LCA1B
1768 BRA LCA93
1769
1770 LCA87 LDX 5,X
1771 ABX
1772 LDB 1,S
1773 LCA8C LDA ,X+
1774 STA ,Y+
1775 DECB
1776 BNE LCA8C
1777 LCA93 LDX $0669
1778 LEAX 1,X
1779 STX $0669
1780 TFR Y,X
1781 LDD $0661
1782 SUBD ,S++
1783 STD $0661
1784 LEAS 2,S
1785 BEQ LCAB0
1786 CLR $0663
1787 CLRB
1788 JMP >LC9F5
1789
1790 LCAB0 CLRB
1791 RTS
1792
1793 LCAB2 JSR >DosFCBNoToAddr
1794 LCAB5 TFR U,D
1795 SUBD $13,X
1796 BCS LCAC9
1797 TSTA
1798 BNE LCAC9
1799 CMPB $17,X
1800 BCC LCAC9
1801 ADDD $15,X
1802 BRA LCADB
1803
1804 LCAC9 TFR U,D
1805 SUBD $18,X
1806 BCS LCADE
1807 TSTA
1808 BNE LCADE
1809 CMPB $1C,X
1810 BCC LCADE
1811 ADDD $1A,X
1812 LCADB ORCC #$04
1813 RTS
1814
1815 LCADE PSHS U
1816 BSR LCB20
1817 BNE LCAEF
1818 LDD $066B
1819 CMPD $066D
1820 BHI LCAF1
1821 LDB #$9A
1822 LCAEF PULS U,PC
1823
1824 LCAF1 SUBB 2,Y
1825 SBCA #$00
1826 STD $13,X
1827 LDA 2,Y
1828 STA $17,X
1829 LDD ,Y
1830 STD $15,X
1831 TFR Y,D
1832 PSHS U
1833 SUBD ,S++
1834 PULS U
1835 CMPB #$13
1836 BCC LCB1E
1837 LDA 5,Y
1838 STA $1C,X
1839 LDD 3,Y
1840 STD $1A,X
1841 LDD $066B
1842 STD $18,X
1843 LCB1E BRA LCAB5
1844
1845 LCB20 PSHS X
1846 CLR $066C
1847 CLR $066B
1848 STU $066D
1849 LDB $1D,X
1850 STB $0682
1851 JSR >SuperDosGetDirEntry
1852 BNE LCB7C
1853 TFR X,U
1854 PULS X
1855 LEAY 12,U
1856 LDB #$04
1857 LCB3E LDA ,U
1858 ANDA #$20
1859 BEQ LCB47
1860 LDA $18,U
1861 LCB47 PSHS D
1862 LCB49 LDD $066B
1863 ADDB 2,Y
1864 ADCA #$00
1865 STD $066B
1866 CMPD $066D
1867 BHI LCB7B
1868 LEAY 3,Y
1869 DEC 1,S
1870 BNE LCB49
1871 LDB ,S
1872 BEQ LCB79
1873 LEAS 2,S
1874 STB $0682
1875 PSHS X
1876 JSR >SuperDosGetDirEntry
1877 TFR X,U
1878 PULS X
1879 BNE LCB7E
1880 LEAY 1,U
1881 LDB #$07
1882 BRA LCB3E
1883
1884 LCB79 LEAY -3,Y
1885 LCB7B CLRB
1886 LCB7C LEAS 2,S
1887 LCB7E RTS
1888
1889 ;
1890 ; Write data from memory to file, verify if verify on.
1891 ;
1892
1893 SuperDosFWrite
1894 STA <$F1
1895 STX $0671
1896 STU $0673
1897 STY $0675
1898 STB $0677
1899 JSR >DosFCBNoToAddr
1900 LDB 11,X
1901 STB <$EB
1902 LCB95 JSR >SuperDosGetFLen
1903 BEQ LCBA8
1904 CMPB #$9C
1905 BEQ LCB9F
1906 RTS
1907
1908 LCB9F LDA <$F1
1909 JSR >SuperDosCreateFile
1910 BNE LCB7E
1911 BRA LCB95
1912
1913 LCBA8 CMPU $0675
1914 BHI LCBB8
1915 BCS LCBB5
1916 CMPA $0677
1917 BCC LCBB8
1918 LCBB5 LDB #$9A
1919 LCBB7 RTS
1920
1921 LCBB8 PSHS A
1922 LDD $0673
1923 ADDB $0677
1924 ADCA $0676
1925 PSHS B
1926 TFR A,B
1927 LDA $0675
1928 ADCA #$00
1929 PSHS U
1930 SUBD ,S++
1931 TFR B,A
1932 PULS B
1933 BHI LCBDE
1934 BCS LCBE6
1935 SUBB ,S
1936 BCC LCBE2
1937 BRA LCBE6
1938
1939 LCBDE SUBB ,S
1940 SBCA #$00
1941 LCBE2 BSR LCC12
1942 BNE LCC0F
1943 LCBE6 LEAS 1,S
1944 LDB $0677
1945 LDX $0671
1946 LDY $0673
1947 LDU $0675
1948 JSR >LC9C3
1949 BNE LCBB7
1950 TST $0608
1951 BEQ LCBB7
1952 LDB $0677
1953 LDX $0671
1954 LDY $0673
1955 LDU $0675
1956 JMP >LC9C6
1957
1958 LCC0F LEAS 1,S
1959 RTS
1960
1961 LCC12 LEAS -12,S
1962 STD ,S
1963 STD 10,S
1964 LDA #$01
1965 STA <$F6
1966 JSR >LD1A3
1967 LBNE LCD08
1968 STX 8,S
1969 JSR >DosFCBNoToAddr
1970 LDB $1E,X
1971 JSR >SuperDosGetDirEntry
1972 LBNE LCD08
1973 STX 4,S
1974 LDU $067F
1975 LDA #$FF
1976 STA 2,U
1977 CLRA
1978 LDB $18,X
1979 BNE LCC42
1980 INCA
1981 LCC42 ADDD ,S
1982 TSTB
1983 BNE LCC48
1984 DECA
1985 LCC48 STD ,S
1986 TSTA
1987 LBEQ LCCF0
1988 LDB #$04
1989 LEAY 12,X
1990 LDA ,X
1991 BITA #$01
1992 BEQ LCC5D
1993 LEAY 1,X
1994 LDB #$07
1995 LCC5D TST 2,Y
1996 BNE LCC75
1997 LDD #$FFFF
1998 STD 6,S
1999 LEAY -3,Y
2000 STY 2,S
2001 LDX 8,S
2002 TST 2,X
2003 LBNE LCD0E
2004 BRA LCCB3
2005
2006 LCC75 TST 2,Y
2007 BEQ LCC7E
2008 LEAY 3,Y
2009 DECB
2010 BNE LCC75
2011 LCC7E LEAY -3,Y
2012 LDD ,Y
2013 ADDB 2,Y
2014 ADCA #$00
2015 STD 6,S
2016 STY 2,S
2017 LDX 8,S
2018 TST 2,X
2019 BEQ LCCB3
2020 LDD 6,S
2021 SUBD 3,X
2022 BEQ LCCC3
2023 JSR >LCD57
2024 BEQ LCCA2
2025 CMPB #$94
2026 BNE LCD08
2027 BRA LCD0E
2028
2029 LCCA2 LDX 8,S
2030 PSHS A,U
2031 LDB 2,X
2032 LDX 3,X
2033 JSR >LD03B
2034 PULS A,U
2035 BNE LCD08
2036 BRA LCCB8
2037
2038 LCCB3 JSR >LCD57
2039 BNE LCD08
2040 LCCB8 LDX 8,S
2041 STU 3,X
2042 STA 2,X
2043 CMPU 6,S
2044 BNE LCD0E
2045 LCCC3 LDA ,S
2046 CMPA 2,X
2047 BCS LCCCB
2048 LDA 2,X
2049 LCCCB LDY 2,S
2050 PSHS A
2051 ADDA 2,Y
2052 BCC LCCD8
2053 PULS A
2054 BRA LCD0E
2055
2056 LCCD8 STA 2,Y
2057 LDA 2,X
2058 SUBA ,S
2059 STA 2,X
2060 LDD 3,X
2061 ADDB ,S
2062 ADCA #$00
2063 STD 3,X
2064 LDA 1,S
2065 SUBA ,S+
2066 STA ,S
2067 BNE LCCB3
2068 LCCF0 LDX 4,S
2069 TFR X,U
2070 JSR >DosFCBNoToAddr
2071 LDD 10,S
2072 ADDD $11,X
2073 BCC LCD01
2074 INC $10,X
2075 LCD01 STD $11,X
2076 STB $18,U
2077 CLRB
2078 LCD08 LEAS 12,S
2079 CLR <$F6
2080 TSTB
2081 RTS
2082
2083 LCD0E LDD 2,S
2084 TFR D,Y
2085 SUBD 4,S
2086 CMPB #$13
2087 BCC LCD23
2088 LEAY 3,Y
2089 STY 2,S
2090 LCD1D LDD 3,X
2091 STD ,Y
2092 BRA LCCC3
2093
2094 LCD23 LDA #$01
2095 JSR >LD123
2096 BNE LCD08
2097 LDY 4,S
2098 STA $18,Y
2099 LDB ,Y
2100 ORB #$20
2101 STB ,Y
2102 LDB #$FF
2103 STB 2,X
2104 LDB #$01
2105 STB ,U
2106 STU 4,S
2107 JSR >DosFCBNoToAddr
2108 STA $1E,X
2109 LEAY $19,U
2110 LDB #$18
2111 LCD4B CLR ,-Y
2112 DECB
2113 BNE LCD4B
2114 STY 2,S
2115 LDX 8,S
2116 BRA LCD1D
2117
2118 LCD57 STS $0601
2119 LEAS -9,S
2120 CLR 4,S
2121 JSR >LD1A3
2122 LBNE LCE5A
2123 LDY ,X
2124 LDU $11,S
2125 STU 5,S
2126 LEAX 1,U
2127 BEQ LCD81
2128 BSR LCDB2
2129 BNE LCDAF
2130 CMPU #$05A0
2131 BCS LCD81
2132 LDU #$058E
2133 BRA LCDA2
2134
2135 LCD81 LEAU ,Y
2136 LCD83 LDA #$FF
2137 STA ,S
2138 LCD87 LEAU -$12,U
2139 STU -2,S
2140 BMI LCD9A
2141 BSR LCDB2
2142 BEQ LCD83
2143 TST ,S
2144 BPL LCDAF
2145 STU ,S
2146 BRA LCD87
2147
2148 LCD9A LDU ,S
2149 STU -2,S
2150 BPL LCDAF
2151 LEAU ,Y
2152 LCDA2 LEAU $12,U
2153 CMPU #$0B40
2154 BHI LCDB5
2155 BSR LCDB2
2156 BEQ LCDA2
2157 LCDAF JMP >LCE34
2158
2159 LCDB2 JMP >LCE60
2160
2161 LCDB5 LDA #$FF
2162 STA 7,S
2163 LDA 4,S
2164 LCDBB LDU <Zero16Bit
2165 LSRA
2166 BCS LCDC3
2167 LDU #$05A0
2168 LCDC3 BSR LCDB2
2169 LDB #$B4
2170 LCDC7 LDA ,X+
2171 BNE LCDD2
2172 LEAU 8,U
2173 DECB
2174 BNE LCDC7
2175 BRA LCE13
2176
2177 LCDD2 CLRB
2178 STB 8,S
2179 PSHS U
2180 LCDD7 INCB
2181 LDA ,X+
2182 INCA
2183 BEQ LCDD7
2184 CMPB 10,S
2185 BLS LCDE5
2186 STB 10,S
2187 STU ,S
2188 LCDE5 LEAX -1,X
2189 LDA #$08
2190 MUL
2191 LEAU D,U
2192 LCDEC CLRB
2193 LDA ,X+
2194 BNE LCDD7
2195 LEAU 8,U
2196 TFR X,D
2197 CMPB #$B4
2198 BCS LCDEC
2199 PULS U
2200 BSR LCE60
2201 LEAU 8,U
2202 LDA ,X
2203 LDB 8,S
2204 CMPB #$01
2205 BHI LCE0C
2206 LCE07 LEAU -1,U
2207 ASLA
2208 BCC LCE07
2209 LCE0C ASLA
2210 BCC LCE13
2211 LEAU -1,U
2212 BRA LCE0C
2213
2214 LCE13 CMPB #$02
2215 BCC LCE34
2216 CMPB 7,S
2217 BHI LCE34
2218 LDA 7,S
2219 INCA
2220 BNE LCE2A
2221 STB 7,S
2222 STU 5,S
2223 LDA 4,S
2224 EORA #$03
2225 BRA LCDBB
2226
2227 LCE2A LDU 5,S
2228 BSR LCE60
2229 BNE LCE34
2230 LDB #$94
2231 BRA LCE5A
2232
2233 LCE34 BSR LCE60
2234 CLRB
2235 LCE37 INCB
2236 BEQ LCE51
2237 PSHS A
2238 COMA
2239 ANDA ,X
2240 STA ,X
2241 PULS A
2242 ASLA
2243 BCC LCE4A
2244 LDA #$01
2245 LEAX 1,X
2246 LCE4A BITA ,X
2247 BNE LCE37
2248 TFR B,A
2249 LCE51 EQU *+1
2250 CMPX #$86FF
2251 LDX 2,S
2252 LDB #$FF
2253 STB 2,X
2254 CLRB
2255 LCE5A LDS $0601
2256 TSTB
2257 RTS
2258
2259 LCE60 PSHS Y,U
2260 LDA #$01
2261 CMPU #$05A0
2262 BCS LCE71
2263 LEAY 1,Y
2264 LEAU $FA60,U
2265 ASLA
2266 LCE71 PSHS U
2267 BITA 12,S
2268 BNE LCE84
2269 STA 12,S
2270 JSR >SuperDosFindAndRead
2271 BNE LCE5A
2272 STX 10,S
2273 LDA #$FF
2274 STA 2,X
2275 LCE84 LDX 10,S
2276 LDX 5,X
2277 PULS D
2278 LSRA
2279 RORB
2280 LSRA
2281 RORB
2282 LSRA
2283 RORB
2284 LDA 3,S
2285 ANDA #$07
2286 LDU #$A672
2287 NEGA
2288 LDA A,U
2289 ABX
2290 BITA ,X
2291 PULS Y,U,PC
2292
2293 ;
2294 ; Get length of a file
2295 ;
2296
2297 SuperDosGetFLen
2298 STA <$F1
2299 BSR DosFCBNoToAddr
2300 TST 15,X
2301 BPL LCEAA
2302 LDB #$9C
2303 LCEA9 RTS
2304
2305 LCEAA LDA $12,X
2306 LDU $10,X
2307 LEAY 1,U
2308 BNE LCED0
2309 JSR >LCB20
2310 BNE LCEA9
2311 LDB $0682
2312 STB $1E,X
2313 LCEBF LDA $18,U
2314 STA $12,X
2315 LDU $066B
2316 TSTA
2317 BEQ LCECD
2318 LEAU -1,U
2319 LCECD STU $10,X
2320 LCED0 CLRB
2321 RTS
2322
2323 ;
2324 ; Converts current FCB number in DosCurrCtrlBlk to the FCB's address
2325 ; Exits with :
2326 ; X=FCB address
2327 ;
2328
2329 DosFCBNoToAddr
2330 PSHS D
2331 LDA <DosCurrCtrlBlk ; Get current FCB no
2332 LDB #DosFCBLength ; FCB len ?
2333 MUL ; Work out offset to FCB
2334 TFR D,X
2335 LEAX DosFCB0Addr,X ; Get offset of FCB
2336 PULS D,PC
2337
2338 ;
2339 ; Close all open files.
2340 ;
2341
2342 SuperDosCloseAll
2343 LDA #$09
2344 STA <$F1
2345 LCEE5 BSR DosFCBNoToAddr
2346 LDA 11,X
2347 CMPA <$EB
2348 BNE LCEF1
2349 BSR LCEF9
2350 BNE LCEA9
2351 LCEF1 DEC <$F1
2352 BPL LCEE5
2353 LCEF5 CLRB
2354 RTS
2355
2356 ;
2357 ; Close a single file
2358 ;
2359
2360 SuperDosCloseFile
2361 STA <$F1
2362 LCEF9 BSR DosFCBNoToAddr
2363 TST ,X
2364 BEQ LCEF5
2365 LDA <$EB
2366 PSHS A
2367 LDA 11,X
2368 STA <$EB
2369 CLR ,X
2370 JSR >LD1A3
2371 BNE LCF34
2372 TST 5,X
2373 BEQ LCF19
2374 DEC 5,X
2375 BEQ LCF19
2376 CLRB
2377 BRA LCF34
2378
2379 LCF19 LDB 2,X
2380 BEQ LCF2A
2381 PSHS X
2382 LDX 3,X
2383 JSR >LD03B
2384 PULS X
2385 BNE LCF34
2386 CLR 2,X
2387 LCF2A JSR >SuperDosSyncDir
2388 LDU #$0696
2389 LDA <$EB
2390 CLR A,U
2391 LCF34 PULS A
2392 STA <$EB
2393 TSTB
2394 LCF39 RTS
2395
2396 ;
2397 ; Create a file, with backup.
2398 ;
2399
2400 SuperDosCreateFile
2401 STA $067D
2402 JSR >DosFCBNoToAddr
2403 STX $0678
2404 LDB #$0C
2405 LDU #$0650
2406 LCF48 LDA ,X+
2407 STA ,U+
2408 DECB
2409 BNE LCF48
2410 LDD -4,U
2411 STD $067A
2412 LDA -2,U
2413 STA $067C
2414 LDD #$4241
2415 STD -4,U
2416 LDA #$4B
2417 STA -2,U
2418 TST 3,X
2419 BMI LCF92
2420 JSR >SuperDosOpenFile
2421 CMPB #$A0
2422 BEQ LCF74
2423 TSTB
2424 BNE LCF39
2425 BSR SuperDosDeleteFile
2426 BNE LCF39
2427 LCF74 JSR >LCEF9
2428 NOP
2429 LDA $067D
2430 TST [$0678]
2431 BEQ LCF92
2432 JSR >SuperDosRename
2433 BEQ LCF8A
2434 CMPB #$9C
2435 BNE LCF39
2436 LCF8A LDA $067D
2437 JSR >SuperDosCloseFile
2438 BNE LCF39
2439 LCF92 LDD $067A
2440 STD $0658
2441 LDA $067C
2442 STA $065A
2443 JSR >SuperDosOpenFile
2444 BEQ LCFA7
2445 CMPB #$A0
2446 BNE LCF39
2447 LCFA7 STA <$F1
2448 JSR >DosFCBNoToAddr
2449 TST 15,X
2450 BMI LCFB3
2451 LDB #$9E
2452 LCFB2 RTS
2453
2454 LCFB3 CLRA
2455 JSR >LD123
2456 BNE LCFB2
2457 JSR >DosFCBNoToAddr
2458 STA $1D,X
2459 STA $1E,X
2460 LDB #$1C
2461 LCFC4 CLR B,X
2462 DECB
2463 CMPB #$0C
2464 BCC LCFC4
2465 LDB #$18
2466 LCFCD CLR B,U
2467 DECB
2468 BPL LCFCD
2469 LEAU 1,U
2470 LDB #$0B
2471 LCFD6 LDA ,X+
2472 STA ,U+
2473 DECB
2474 BNE LCFD6
2475 CLRB
2476 RTS
2477
2478 ;
2479 ; Delete a file from disk.
2480 ;
2481
2482 SuperDosDeleteFile
2483 JSR >LD0E4
2484 BNE LCFB2
2485 PSHS X
2486 LDB $1D,X
2487 JSR >LD237
2488 BNE LD035
2489 TFR X,U
2490 PULS X
2491 LEAY 12,U
2492 LDB #$04
2493 LCFF6 LDA ,U
2494 ANDA #$20
2495 BEQ LCFFF
2496 LDA $18,U
2497 LCFFF PSHS D
2498 LDB #$81
2499 STB ,U
2500 PSHS X
2501 LD007 LDX ,Y++
2502 LDB ,Y+
2503 BEQ LD017
2504 PSHS Y
2505 BSR LD03B
2506 PULS Y
2507 LBNE LCA1B
2508 LD017 DEC 3,S
2509 BNE LD007
2510 PULS X
2511 LDB ,S
2512 BEQ LD034
2513 LEAS 2,S
2514 PSHS X
2515 JSR >LD237
2516 TFR X,U
2517 PULS X
2518 BNE LCFB2
2519 LEAY 1,U
2520 LDB #$07
2521 BRA LCFF6
2522
2523 LD034 CLRB
2524 LD035 CLR <$F6
2525 LEAS 2,S
2526 TSTB
2527 RTS
2528
2529 LD03B CLRA
2530 PSHS A
2531 PSHS D,X
2532 JSR >LD1A3
2533 BNE LD0C2
2534 LDY ,X
2535 LDD 2,S
2536 SUBD #$05A0
2537 BCS LD05A
2538 LEAY 1,Y
2539 STD 2,S
2540 ADDD ,S
2541 SUBD #$05A0
2542 BCC LD0C0
2543 LD05A LDD 2,S
2544 ADDD ,S
2545 SUBD #$05A0
2546 BCS LD06A
2547 STB 4,S
2548 NEGB
2549 ADDB 1,S
2550 STB 1,S
2551 LD06A JSR >SuperDosFindAndRead
2552 BNE LD0C2
2553 LDA #$FF
2554 STA 2,X
2555 LDD 2,S
2556 LSRA
2557 RORB
2558 ROR ,S
2559 LSRA
2560 RORB
2561 ROR ,S
2562 LSRA
2563 RORB
2564 ROR ,S
2565 LDX 5,X
2566 ABX
2567 LDB #$01
2568 LDA ,S
2569 BEQ LD08F
2570 LD08A ASLB
2571 SUBA #$20
2572 BNE LD08A
2573 LD08F STB ,S
2574 LDB 1,S
2575 LD093 LDA ,S
2576 ORA ,X
2577 STA ,X
2578 DECB
2579 BEQ LD0B4
2580 ASL ,S
2581 BCC LD093
2582 LDA #$01
2583 STA ,S
2584 LEAX 1,X
2585 LD0A6 CMPB #$10
2586 BCS LD093
2587 LDA #$FF
2588 STA ,X+
2589 STA ,X+
2590 SUBB #$10
2591 BNE LD0A6
2592 LD0B4 LDX #$05A0
2593 LEAS 4,S
2594 LDB ,S+
2595 BEQ LD0C4
2596 JMP >LD03B
2597
2598 LD0C0 LDB #$90
2599 LD0C2 LEAS 5,S
2600 LD0C4 RTS
2601
2602 ;
2603 ; Protect/unprotect a file.
2604 ;
2605
2606 SuperDosProtect
2607 STA <$F1
2608 JSR >DosFCBNoToAddr
2609 LDA 15,X
2610 BMI LD0F4
2611 TSTB
2612 BEQ LD0D4
2613 ORA #$02
2614 LD0D4 EQU *+1
2615 CMPX #$84FD
2616 STA 15,X
2617 LDB $1D,X
2618 JSR >LD237
2619 BNE LD0C4
2620 STA ,X
2621 CLRB
2622 RTS
2623
2624 LD0E4 STA <$F1
2625 JSR >DosFCBNoToAddr
2626 LDA 15,X
2627 BMI LD0F4
2628 BITA #$02
2629 BEQ LD122
2630 LDB #$98
2631 RTS
2632
2633 LD0F4 LDB #$9C
2634 RTS
2635
2636 ;
2637 ; Rename a file.
2638 ;
2639
2640 SuperDosRename
2641 BSR LD0E4
2642 BNE LD122
2643 LDB #$0B
2644 LDU #$0650
2645 LD100 LDA ,U+
2646 STA ,X+
2647 DECB
2648 BNE LD100
2649 LEAX -11,X
2650 LDB $1D,X
2651 JSR >LD237
2652 BNE LD122
2653 LDU #$0650
2654 LDB #$0B
2655 LEAX 1,X
2656 LD118 LDA ,U+
2657 STA ,X+
2658 DECB
2659 BNE LD118
2660 CLR <$F6
2661 CLRB
2662 LD122 RTS
2663
2664 LD123 CLRB
2665 STD $067D
2666 BSR LD1A3
2667 BNE LD122
2668 LDX ,X
2669 PSHS X
2670 LEAX 2,X
2671 LD131 STX $066F
2672 TFR X,Y
2673 JSR >SuperDosFindAndRead
2674 BNE LD170
2675 LDU 5,X
2676 LDB #$0A
2677 TST $067D
2678 BEQ LD149
2679 CLR $067D
2680 BRA LD14D
2681
2682 LD149 LDA ,U
2683 BMI LD168
2684 LD14D INC $067E
2685 LEAU $19,U
2686 DECB
2687 BNE LD149
2688 JSR >LDFF3
2689 LEAX 1,X
2690 TFR X,D
2691 SUBD ,S
2692 CMPB #$12
2693 BCS LD131
2694 LEAS 2,S
2695 LDB #$92
2696 RTS
2697
2698 LD168 LDA #$FF
2699 STA 2,X
2700 LDA $067E
2701 CLRB
2702 LD170 LEAS 2,S
2703 RTS
2704
2705 ;
2706 ; Get free space on disk
2707 ;
2708
2709 SuperDosGetFree
2710 BSR LD1A3
2711 BNE LD187
2712 LDY ,X
2713 LDX <Zero16Bit
2714 BSR LD188
2715 BNE LD187
2716 LEAY 1,Y
2717 BSR LD188
2718 BNE LD187
2719 CLRB
2720 LD187 RTS
2721
2722 LD188 PSHS X
2723 JSR >SuperDosFindAndRead
2724 BNE LD170
2725 LDU 5,X
2726 PULS X
2727 LDB #$B4
2728 LD195 LDA ,U+
2729 LD197 LSRA
2730 BCC LD19C
2731 LEAX 1,X
2732 LD19C TSTA
2733 BNE LD197
2734 DECB
2735 BNE LD195
2736 RTS
2737
2738 LD1A3 LDX #$061C
2739 LDU #$0696
2740 LDB #$06
2741 LDA <$EB
2742 LEAU A,U
2743 DECA
2744 MUL
2745 LEAX D,X
2746 TST ,U
2747 BNE LD1FF
2748 LDY #$0168
2749 LDA #$12
2750 STA $10,U
2751 TST 12,U
2752 BNE LD1CA
2753 JSR >DosDoRestore
2754 BCC LD1CA
2755 RTS
2756
2757 LD1CA PSHS X
2758 JSR >SuperDosFindAndRead
2759 BNE LD170
2760 CLR 2,X
2761 LDX 5,X
2762 LDD $00FE,X
2763 COMA
2764 COMB
2765 CMPD $00FC,X
2766 PULS X
2767 BNE LD201
2768 STB $10,U
2769 STA 12,U
2770 DEC ,U
2771 CMPB #$12
2772 BEQ LD1F0
2773 CLRB
2774 LD1F0 PSHS B
2775 CLR 2,X
2776 LDD #$0168
2777 TST ,S+
2778 BNE LD1FD
2779 ASLB
2780 ROLA
2781 LD1FD STD ,X
2782 LD1FF CLRB
2783 RTS
2784
2785 LD201 LDB #$90
2786 RTS
2787
2788 ;
2789 ; Get directory entry.
2790 ;
2791
2792 SuperDosGetDirEntry
2793 LDA #$FF
2794 LD206 INCA
2795 SUBB #$0A
2796 BCC LD206
2797 ADDB #$0A
2798 PSHS D
2799 BSR LD1A3
2800 LBNE LCB7C
2801 LDD ,X
2802 ADDD #$0002
2803 ADDB ,S+
2804 ADCA #$00
2805 STD $066F
2806 TFR D,Y
2807 BSR SuperDosFindAndRead
2808 PULS A
2809 BNE LD236
2810 TFR X,U
2811 LDB #$19
2812 MUL
2813 STX $067F
2814 LDX 5,X
2815 LEAX D,X
2816 CLRB
2817 LD236 RTS
2818
2819 LD237 PSHS D
2820 BSR SuperDosGetDirEntry
2821 LBNE LCB7C
2822 LDY $067F
2823 LDA #$FE
2824 STA 2,Y
2825 CLRB
2826 PULS D,PC
2827
2828 LD24A LDX #$0634
2829 LDU <Zero16Bit
2830 LDB #$04
2831 LD251 LDA 2,X
2832 BEQ LD26C
2833 CMPA #$55
2834 BEQ LD26E
2835 CMPY ,X
2836 BNE LD268
2837 LDA <$EB
2838 CMPA 3,X
2839 BNE LD268
2840 BSR LD2CB
2841 CLRB
2842 RTS
2843
2844 LD268 TST 2,X
2845 BNE LD26E
2846 LD26C TFR X,U
2847 LD26E LEAX 7,X
2848 DECB
2849 BNE LD251
2850 LDB #$FF
2851 RTS
2852
2853 ;
2854 ; Find a free buffer and read sector.
2855 ;
2856
2857 SuperDosFindAndRead
2858 PSHS U
2859 BSR LD24A
2860 LBEQ LCB7C
2861 LEAX ,U
2862 PULS U
2863 BNE LD288
2864 BSR LD2A2
2865 BNE LD2A1
2866 LD288 CLR 2,X
2867 STY ,X
2868 LDA <$EB
2869 STA 3,X
2870 PSHS X
2871 LDX 5,X
2872 JSR >SuperDosReadAbsSector
2873 PULS X
2874 BNE LD2A1
2875 LDA #$01
2876 STA 2,X
2877 CLRB
2878 LD2A1 RTS
2879
2880 LD2A2 PSHS D,Y,U
2881 LD2A4 LDX #$0634
2882 LDB #$04
2883 LD2A9 LDA 4,X
2884 CMPA #$01
2885 BEQ LD2B4
2886 LEAX 7,X
2887 DECB
2888 BNE LD2A9
2889 LD2B4 BSR LD2CB
2890 LDA 2,X
2891 CMPA #$55
2892 BEQ LD2A4
2893 INCA
2894 BNE LD2C3
2895 DEC 2,X
2896 BRA LD2A4
2897
2898 LD2C3 BSR LD2E2
2899 BEQ LD2C9
2900 STB 1,S
2901 LD2C9 PULS D,Y,U,PC
2902
2903 LD2CB LDB #$04
2904 LDA 4,X
2905 LDU #$0634
2906 LD2D2 CMPA 4,U
2907 BHI LD2D8
2908 DEC 4,U
2909 LD2D8 LEAU 7,U
2910 DECB
2911 BNE LD2D2
2912 LDA #$04
2913 STA 4,X
2914 RTS
2915
2916 LD2E2 TST 2,X
2917 BMI LD2E8
2918 CLRB
2919 RTS
2920
2921 LD2E8 LDA <$EB
2922 PSHS A
2923 PSHS X
2924 LDA #$FF
2925 STA <$F6
2926 CLR 2,X
2927 LDA 3,X
2928 STA <$EB
2929 LDY ,X
2930 LDX 5,X
2931 BSR SuperDosWriteAbsSector
2932 PULS X
2933 BNE LD31F
2934 LDA <$EC
2935 CMPA #$14
2936 BNE LD31A
2937 LDU #$A673
2938 LDA <$EB
2939 NEGA
2940 LDA A,U
2941 LDU #$06AA
2942 LDB <$ED
2943 ORA B,U
2944 STA B,U
2945 LD31A LDA #$01
2946 STA 2,X
2947 CLRB
2948 LD31F PULS A
2949 STA <$EB
2950 CLR <$F6
2951 TSTB
2952 RTS
2953
2954 ;
2955 ; Write absolute sector.
2956 ;
2957
2958 SuperDosWriteAbsSector
2959 BSR LD33E
2960 JSR >DosDoWriteSec2
2961 LD32C LDX <$EE
2962 TSTB
2963 RTS
2964
2965 LD330 BSR LD33E
2966 JSR >DosDoReadSec2
2967 BRA LD32C
2968
2969 ;
2970 ; Read absolute sector.
2971 ;
2972
2973 SuperDosReadAbsSector
2974 BSR LD33E
2975 JSR >DosDoReadSec
2976 BRA LD32C
2977
2978 LD33E STX <$EE
2979 LDX #$06A6
2980 LDB <$EB
2981 LDB B,X
2982 CLRA
2983 PSHS D
2984 CLR ,-S
2985 TFR Y,D
2986 LD34E INC ,S
2987 SUBD 1,S
2988 BPL LD34E
2989 ADDB 2,S
2990 LDA ,S
2991 DECA
2992 INCB
2993 LEAS 3,S
2994 STD <$EC
2995 RTS
2996
2997 ;
2998 ; Copy command dispatch routine
2999 ;
3000 ; Syntax :
3001 ; COPY filespec TO filespec
3002 ;
3003 ; Stack setup as follows
3004 ;
3005 ; offset size purpose
3006 ; 0 1 Source FCB number
3007 ; 1 1 Destination FCB number
3008 ; 2 2 Buffer pointer ?
3009 ; 4 3 File pointer pos
3010 ;
3011
3012 CmdCopy
3013 JSR >SuperDosCloseAll ; Close all files & devices
3014 BNE LD39F ; Error : exit
3015 LEAS -7,S ; Make room on stack
3016
3017 ;
3018 ; Make a buffer for copying the file.
3019 ;
3020
3021 TFR S,D ; move to D
3022 SUBD #$0100 ; Make room for 1 sector
3023 SUBD <BasEndInUse ; Will we overwrite basic ?
3024 LBMI BasOMError ; yes : error, exit
3025
3026 CLRB
3027 TSTA ; overwrite zero page ?
3028 LBEQ BasOMError ; yes : error, exit
3029 STD 2,S ; IO buffer pointer
3030 JSR >DosGetFilenameAndOpen ; Get source filename FCB number in A
3031 BNE LD39F ; Error : exit
3032 STA ,S ; save FCB no of source
3033
3034 JSR >SuperDosGetFLen ; Get file length
3035 BNE LD39F ; Error : exit
3036 JSR <BasChrGetCurr ; scan current char from params
3037 CMPA #$BC ; "TO" token
3038 LBNE BasSNError ; no : Error
3039
3040 JSR <BasChrGet ; Get next character
3041 JSR >DosGetFilenameAndOpen ; Get dest filename FCB number in A
3042 BEQ LD398 ; No error : continue
3043 CMPB #$A0
3044 BNE LD39F ; Error : exit
3045 LD398 STA 1,S ; Save destination FCB number
3046 JSR >SuperDosCreateFile ; re-write destination file
3047 BEQ LD3A2 ; no error : continue
3048 LD39F JMP >DosHookSysError ; Error : exit
3049
3050 LD3A2 LDA ,S ; Get source FCB no
3051 STA <DosCurrCtrlBlk ; Save current FCB
3052 JSR >DosFCBNoToAddr ; Get FCB address
3053
3054 ; Compare file pointer position with file length for source file
3055
3056 LDD 12,X
3057 CMPD $10,X
3058 BCS LD3B8
3059 LDA 14,X
3060 CMPA $12,X
3061 BEQ LD408
3062
3063 LD3B8 LDU 12,X
3064 LDA 14,X
3065 STA 6,S
3066 STU 4,S
3067 LDD 2,S
3068 ADDD 5,S
3069 STD 5,S
3070 BCC LD3CA
3071 INC 4,S
3072 LD3CA LDA 4,S
3073 SUBA $10,X
3074 BCS LD3DF
3075 LDD 5,S
3076 SUBD $11,X
3077 BLS LD3DF
3078 LDD $11,X
3079 SUBD 13,X
3080 STD 2,S
3081
3082 LD3DF LDA ,S ; Get source FCB no
3083 LDU 12,X ; Get number of bytes to read
3084 LDB 14,X ; Y:B=position to read from
3085 LDY 2,S
3086 LDX <BasEndInUse ; Point to end of basic memory
3087 JSR >SuperDosFRead ; Read from source file
3088 BNE LD39F ; error : exit
3089
3090 LDA 1,S ; Get destination FCB No
3091 STA <DosCurrCtrlBlk ; Save in current ctrl block no
3092 JSR >DosFCBNoToAddr ; Get addres of Dest FCB
3093
3094 LDY $10,X
3095 LDB $12,X
3096 LDU 2,S
3097 LDX <BasEndInUse ; Point to end of basic memory
3098 JSR >SuperDosFWrite ; Write to destination
3099 BNE LD39F ; Error : exit
3100 BRA LD3A2 ; continue copying
3101
3102 LD408 JSR >SuperDosCloseAll ; Close all files, finished copy
3103 BNE LD39F ; Error !
3104 LEAS 7,S ; drop stack frame
3105 RTS
3106 ;
3107 ; Merge command dispatch routine.
3108 ;
3109 ; Syntax :
3110 ; MERGE filespec
3111 ;
3112
3113 CmdMerge
3114 JSR >LD6CB
3115 BNE LD39F
3116 BSR LD494
3117 BNE LD39F
3118 CMPA #$01
3119 BNE LD45B
3120 LDU <$1B
3121 LDY <$19
3122 PSHS Y,U
3123 LEAU 1,U
3124 STU <$19
3125 JSR >LD507
3126 PULS X,U
3127 STU <$1B
3128 STX <$19
3129 LEAU 1,U
3130 LD433 LDD ,U++
3131 BEQ LD455
3132 LDD ,U++
3133 STD $02DA
3134 STD <$2B
3135 CLRB
3136 LDX #$02DC
3137 LD442 INCB
3138 LDA ,U+
3139 STA ,X+
3140 BNE LD442
3141 ADDB #$04
3142 STB <$03
3143 PSHS U
3144 BSR LD45E
3145 PULS U
3146 BRA LD433
3147
3148 LD455 CLR $0611
3149 JMP >LD4E4
3150
3151 LD45B JMP >$B848
3152
3153 LD45E JSR >$83FF
3154 BCS LD475
3155 LDD <$47
3156 SUBD ,X
3157 ADDD <$1B
3158 STD <$1B
3159 LDU ,X
3160 LD46D LDA ,U+
3161 STA ,X+
3162 CMPX <$1B
3163 BNE LD46D
3164 LD475 LDD <$1B
3165 STD <$43
3166 ADDB <$03
3167 ADCA #$00
3168 STD <$41
3169 JSR >$831C
3170 LDU #$02D8
3171 LD485 LDA ,U+
3172 STA ,X+
3173 CMPX <$45
3174 BNE LD485
3175 LDX <$41
3176 STX <$1B
3177 JMP >$83ED
3178
3179 LD494 LDX #$0650
3180 LDY #$0009
3181 LDU <Zero16Bit
3182 CLRB
3183 LDA <$F1
3184 JSR >SuperDosFRead
3185 BNE LD4B6
3186 LDA #$55
3187 LDX #$0650
3188 CMPA ,X
3189 BNE LD45B
3190 COMA
3191 CMPA 8,X
3192 BNE LD45B
3193 LDA 1,X
3194 CLRB
3195 LD4B6 RTS
3196
3197 DosHookRun CLR $0614
3198 CLR $0619
3199 CLR $0617
3200 CLR $0618
3201 CMPA #$22
3202 BEQ LD4C9
3203 TSTA
3204 RTS
3205
3206 LD4C9 LEAS 2,S
3207 LDB #$01
3208
3209 FCB $21
3210
3211 ;
3212 ; Load command dispatch routine
3213 ;
3214 ; Syntax :
3215 ; LOAD filespec
3216 ; LOAD filespec,offset
3217 ;
3218
3219 CmdLoad
3220 CLRB
3221 STB $0611
3222 JSR >LD6CB
3223 BNE LD4DB
3224 BSR LD494
3225 BEQ LD4DE
3226 LD4DB JMP >DosHookSysError
3227
3228 LD4DE CMPA #$01
3229 BNE LD529
3230 BSR LD507
3231 LD4E4 CLR <$F6
3232 LDX <$19
3233 JSR >$85EE
3234 LDX <$27
3235 STX <$23
3236 LDX <$1B
3237 STX <$1D
3238 STX <$1F
3239 LD4F5 JSR >$8514
3240 JSR >$8434
3241 TST $0611
3242 BEQ LD503
3243 JMP >$849F
3244
3245 LD503 CLRA
3246 JMP >$8371
3247
3248 LD507 LDD 4,X
3249 TFR D,Y
3250 ADDD <$19
3251 STD <$1F
3252 LDB #$40
3253 JSR >$8331
3254 LD514 LDA <$F1
3255 LDB #$09
3256 LDX <$19
3257 LDU <Zero16Bit
3258 JSR >SuperDosFRead
3259 BNE LD4DB
3260 JSR >$83ED
3261 LEAX 2,X
3262 STX <$1B
3263 RTS
3264
3265 LD529 CMPA #$02
3266 DD52E EQU *+3
3267 LBNE LD45B
3268 LDU 6,X
3269 STU <$9D
3270 JSR <$A5
3271 BEQ LD549
3272 PSHS X
3273 BSR LD5AA
3274 TFR X,U
3275 PULS X
3276 LDD 6,X
3277 SUBD 2,X
3278 STU 2,X
3279 ADDD 2,X
3280 STD <$9D
3281 LD549 LDY 4,X
3282 LDA <$F1
3283 LDB #$09
3284 LDU <Zero16Bit
3285 LDX 2,X
3286 JSR >SuperDosFRead
3287 BNE LD5A1
3288 TST $0611
3289 BEQ LD5A9
3290 JMP [>$009D]
3291
3292 ;
3293 ; Save command dispatch routine.
3294 ;
3295 ; Syntax :
3296 ; SAVE filespec
3297 ; SAVE filespec,start_addr,end_addr,entry_addr
3298 ;
3299
3300 CmdSave
3301 JSR >$8887
3302 JSR >$8877
3303 JSR <$A5
3304 BEQ LD5B0
3305 LDY #DosExtBin
3306 BSR LD598
3307 BSR LD5AA
3308 STX $0652
3309 BSR LD5AA
3310 TFR X,D
3311 CMPX $0652
3312 LBCS DosPRError
3313 SUBD $0652
3314 LBMI BasFCError
3315 ADDD #$0001
3316 STD $0654
3317 BSR LD5AA
3318 STX $0656
3319 LDB #$02
3320 BRA LD5CA
3321
3322 LD598 JSR >LD6DF
3323 BEQ LD5A4
3324 CMPB #$A0
3325 BEQ LD5A4
3326 LD5A1 JMP >DosHookSysError
3327
3328 LD5A4 JSR >SuperDosCreateFile
3329 BNE LD5A1
3330 LD5A9 RTS
3331
3332 LD5AA JSR >$89AA
3333 JMP >$8E83
3334
3335 LD5B0 LDY #DosExtBas
3336 BSR LD598
3337 LDX <$19
3338 STX $0652
3339 LDD <$1B
3340 SUBD <$19
3341 STD $0654
3342 LDX #BasFCError
3343 STX $0656
3344 LDB #$01
3345 LD5CA LDX #$0650
3346 LDA #$55
3347 STA ,X
3348 COMA
3349 STA 8,X
3350 STB 1,X
3351 LDA <$F1
3352 CLRB
3353 LDY <Zero16Bit
3354 LDU #$0009
3355 JSR >SuperDosFWrite
3356 BNE LD5A1
3357 LDA <$F1
3358 LDB #$09
3359 LDX $0652
3360 LDU $0654
3361 LDY <Zero16Bit
3362 JSR >SuperDosFWrite
3363 BNE LD5A1
3364 CLR <$F6
3365 RTS
3366
3367 ;
3368 ; Chain command dispatch routine.
3369 ;
3370 ; Syntax :
3371 ; CHAIN filespec
3372 ;
3373
3374 CmdChain
3375 BSR LD670
3376 JSR >LD6CB
3377 BNE LD5A1
3378 JSR >LD494
3379 BNE LD5A1
3380 CMPA #$01
3381 LBNE LD45B
3382 JSR <$A5
3383 BEQ LD61E
3384 JSR >$89AA
3385 JSR >$869A
3386 BSR LD629
3387 LDD <$2B
3388 JSR >$85E7
3389 BRA LD626
3390
3391 LD61E BSR LD629
3392 LDU <$19
3393 LEAU -1,U
3394 STU <$A6
3395 LD626 JMP >LD4F5
3396
3397 LD629 LDD $0654
3398 TFR D,Y
3399 ADDD <$19
3400 SUBD <$1B
3401 PSHS D
3402 ADDD <$1F
3403 STD <$1F
3404 LDB #$40
3405 STB $0611
3406 JSR >$8331
3407 LDD ,S
3408 BPL LD653
3409 LDX <$1B
3410 LEAU D,X
3411 LD648 LDA ,X+
3412 STA ,U+
3413 CMPU <$1F
3414 BLS LD648
3415 BRA LD661
3416
3417 LD653 LDX <$1F
3418 LEAX 1,X
3419 LEAU D,X
3420 LD659 LDA ,-X
3421 STA ,-U
3422 CMPX <$1B
3423 BCC LD659
3424 LD661 LDD ,S
3425 ADDD <$1B
3426 STD <$1B
3427 PULS D
3428 ADDD <$1D
3429 STD <$1D
3430 JMP >LD514
3431
3432 LD670 LDX <BasVarsPtr ; Get pointer to start of vars
3433 LEAX 2,X
3434 LD674 CMPX <BasArrayPtr ; More than 2 bytes of vars ?
3435 BCC LD682
3436
3437 TST -1,X
3438 BPL LD67E
3439 BSR LD6AA
3440 LD67E LEAX 7,X
3441 BRA LD674
3442
3443 LD682 LDU <BasArrayPtr ; Array pointer
3444 LD684 CMPU <BasEndInUse ; any arrays in use ?
3445 BCC LD6A7
3446 LDD 2,U
3447 LEAX D,U
3448 PSHS X
3449 TST 1,U
3450 BPL LD6A3
3451 LDB 4,U
3452 CLRA
3453 ASLB
3454 LEAX D,U
3455 LEAX 5,X
3456 LD69B BSR LD6AA
3457 LEAX 5,X
3458 CMPX ,S
3459 BCS LD69B
3460 LD6A3 PULS U
3461 BRA LD684
3462
3463 LD6A7 JMP >$8CD7
3464
3465 LD6AA PSHS X,U
3466 CMPX <$21
3467 BCC LD6C3
3468 LDB ,X
3469 BEQ LD6C3
3470 JSR >$8CB3
3471 TFR X,U
3472 LDY ,S
3473 LDX 2,Y
3474 STU 2,Y
3475 JSR >UtilCopyBXtoU
3476 LD6C3 PULS X,U,PC
3477
3478 LD6C5 LDY #DosExtDat
3479 BRA LD6D5
3480
3481 LD6CB LDY #DosExtBas
3482 BRA LD6D5
3483
3484 ;
3485 ; Get a filename from Dos and open it
3486 ; Takes a string supplied on command name, fetches it and
3487 ; tries to open the file of that name.
3488 ;
3489 ;
3490 ; Exits with :-
3491 ; A=FCB number for opened file
3492 ; B= Error code ?
3493 ; Y=ptr to error code table !
3494 ;
3495
3496
3497 DosGetFilenameAndOpen
3498 LDY #DosErrorCodeTable ; Point to error messages
3499 LD6D5 PSHS Y
3500 JSR >VarGetStr ; get string into temp variable
3501 JSR >VarGetExpr ; Get address of string in FAC
3502 PULS Y
3503 LD6DF LDX <BasStrAddr ; Get string address
3504 PSHS X
3505 LDB ,X ; Get string length
3506 LDX 2,X ; Get pointer to actual string data
3507 JSR >LC7E1 ; Validate & open file (if valid)
3508 PULS X
3509 PSHS D
3510 JSR >VarDelVar ; Delete tempory variable
3511 PULS D
3512 TSTB ; Get error?
3513 RTS
3514
3515 DosHookCloseSingle
3516 LDA #$09
3517 STA <$F1
3518 LD6F9 JSR >LCEF9
3519 BNE LD717
3520 DEC <$F1
3521 BPL LD6F9
3522 LD702 CLR <$F6
3523 CMPX #$39FD
3524 LD707 CLRA
3525 CLRB
3526 STD $0697
3527 STD $0699
3528 RTS
3529
3530 LD710 BSR LD707
3531 JMP >$BA77
3532
3533 LD715 BEQ LD702
3534 LD717 JMP >DosHookSysError
3535
3536 LD71A JSR >LCEF9
3537 BRA LD715
3538
3539 ;
3540 ; Create command dispatch routine.
3541 ;
3542 ; Syntax :
3543 ; CREATE filespec,length
3544 ;
3545
3546 CmdCreate
3547 BSR LD6C5
3548 BEQ LD72B
3549 CMPB #$9E
3550 BEQ LD72B
3551 CMPB #$A0
3552 BNE LD717
3553 LD72B LDA <$F1
3554 JSR >SuperDosCreateFile
3555 BNE LD717
3556 JSR <$A5
3557 BEQ LD76C
3558 JSR >$89AA
3559 JSR >$8887
3560 JSR >LD879
3561 LD73F TST <$51
3562 BEQ LD755
3563 LDD #$FF00
3564 BSR LD767
3565 LDD <$52
3566 SUBD #$FF00
3567 STD <$52
3568 BCC LD73F
3569 DEC <$51
3570 BNE LD73F
3571 LD755 LDD <$52
3572 BEQ LD76C
3573 CMPD #$FF00
3574 BLS LD767
3575 SUBD #$FF00
3576 BSR LD767
3577 LDD #$FF00
3578 LD767 JSR >LCC12
3579 BNE LD717
3580 LD76C RTS
3581
3582 ;
3583 ; Kill command dispatch routine
3584 ;
3585 ; Syntax :
3586 ; KILL filespec
3587 ;
3588
3589 CmdKill
3590 JSR >DosGetFilenameAndOpen
3591 BNE LD777
3592 JSR >SuperDosDeleteFile
3593 LD775 BEQ LD71A
3594 LD777 JMP >DosHookSysError
3595
3596 ;
3597 ; Protect command dispatch routine.
3598 ;
3599 ; Syntax :
3600 ; PROTECT ON filespec
3601 ; PROTECT OFF filespec
3602 ;
3603
3604 CmdProtect
3605 TSTA
3606 BPL LD787
3607 CMPA #$C2
3608 BEQ LD798
3609 CMPA #$88
3610 LBNE BasSNError
3611 LD787 BSR LD790
3612 LDB #$01
3613 LD78B JSR >SuperDosProtect
3614 BRA LD775
3615
3616 LD790 JSR <$9F
3617 JSR >DosGetFilenameAndOpen
3618 BNE LD7BB
3619 RTS
3620
3621 LD798 BSR LD790
3622 CLRB
3623 BRA LD78B
3624
3625 ;
3626 ; Rename command dispatch routine
3627 ;
3628 ; Syntax :
3629 ; RENAME filespec TO filespec
3630 ;
3631
3632 CmdRename
3633 JSR >DosGetFilenameAndOpen
3634 BNE LD7BB
3635 PSHS A
3636 LDB #$BC
3637 JSR >$89AC
3638 JSR >DosGetFilenameAndOpen
3639 BEQ LD7B9
3640 CMPB #$A0
3641 BNE LD7BB
3642 PULS A
3643 JSR >SuperDosRename
3644 BRA LD775
3645
3646 LD7B9 LDB #$9E
3647 LD7BB JMP >DosHookSysError
3648
3649 ;
3650 ; FLread command dispatch routine
3651 ;
3652 ; Syntax :
3653 ; FLREAD filespec;string
3654 ; FLREAD filespec, FROM first_byte,FOR count;string
3655 ;
3656
3657 CmdFLRead
3658 BSR LD7CD
3659 LDA #$FF
3660 STA $0612
3661 JSR >LD95D
3662 BSR LD7F8
3663 JMP >$9DD9
3664
3665 LD7CD JSR >LD6C5
3666 BNE LD822
3667 BSR LD825
3668 JSR >DosFCBNoToAddr
3669 TST $067E
3670 BEQ LD7E6
3671 LDU $0664
3672 LDB $0666
3673 STU 12,X
3674 STB 14,X
3675 LD7E6 JSR >LD9CF
3676 LDX #$02DC
3677 CLR ,X
3678 JMP <$9F
3679
3680 ;
3681 ; Fread command dispatch routine
3682 ;
3683 ; Syntax :
3684 ; FREAD filespec;variable list
3685 ; FREAD filespec,FROM startpos,FOR numbytes;variable list
3686 ;
3687
3688 CmdFRead
3689 BSR LD7CD
3690 CLR $0612
3691 JSR >$877A
3692 LD7F8 JSR >DosFCBNoToAddr
3693 LDB $0604
3694 BEQ LD80E
3695 CLR $0603
3696 LDD 13,X
3697 SUBD $0603
3698 STD 13,X
3699 BCC LD80E
3700 DEC 12,X
3701 LD80E TST <$F4
3702 BEQ LD81F
3703 LDB <$F3
3704 BEQ LD81F
3705 CLRA
3706 ADDD 13,X
3707 STD 13,X
3708 BCC LD81F
3709 INC 12,X
3710 LD81F CLR <$6F
3711 RTS
3712
3713 LD822 JMP >DosHookSysError
3714
3715 LD825 JSR >$9C76
3716 LDA <$F1
3717 JSR >SuperDosGetFLen
3718 BNE LD822
3719 STU $0664
3720 STA $0666
3721 CLR <$F4
3722 CLR $067E
3723 LDA #$01
3724 STA <$6F
3725 LD83E JSR <$A5
3726 CMPA #$3B
3727 BEQ LD896
3728 JSR >$89AA
3729 CMPA #$E5
3730 BNE LD85F
3731 JSR <$9F
3732 JSR >$8887
3733 BSR LD879
3734 STU $0664
3735 STA $0666
3736 LDA #$FF
3737 STA $067E
3738 BRA LD83E
3739
3740 LD85F CMPA #$80
3741 BNE LD870
3742 JSR <$9F
3743 JSR >Get8BitorError
3744 STB <$F3
3745 LDB #$FF
3746 STB <$F4
3747 BRA LD83E
3748
3749 LD870 JMP >BasSNError
3750
3751 LD873 JMP >BasFCError
3752
3753 LD876 JMP >$8882
3754
3755 LD879 TST <$54
3756 BMI LD873
3757 TST <$06
3758 BNE LD876
3759 LDA #$A0
3760 SUBA <$4F
3761 BEQ LD892
3762 LD887 LSR <$50
3763 ROR <$51
3764 ROR <$52
3765 ROR <$53
3766 DECA
3767 BNE LD887
3768 LD892 LDU <$51
3769 LDA <$53
3770 LD896 RTS
3771
3772 ;
3773 ; FWrite command dispatch routine.
3774 ;
3775 ; Syntax :
3776 ; FWRITE filespec;variable list
3777 ; FWRITE filespec,FROM startpos,FOR numbytes;variable list
3778 ;
3779
3780 CmdFWrite
3781 JSR >LD6C5
3782 BEQ LD8A5
3783 CMPB #$A0
3784 BNE LD908
3785 JSR >SuperDosCreateFile
3786 BNE LD908
3787 LD8A5 JSR >LD825
3788 JSR >LD2A2
3789 BNE LD908
3790 STX $060B
3791 LDA #$55
3792 STA 2,X
3793 CLR <$F2
3794 JSR <$9F
3795 JSR >$903D
3796 TST <$F4
3797 BEQ LD8CA
3798 LDB <$F3
3799 BEQ LD8CA
3800 LDA #$20
3801 LD8C5 BSR LD911
3802 DECB
3803 BNE LD8C5
3804 LD8CA TST <$F2
3805 BEQ LD8E6
3806 LDX $060B
3807 LDX 5,X
3808 CLRA
3809 LDB <$F2
3810 TFR D,U
3811 LDA <$F1
3812 LDY $0664
3813 LDB $0666
3814 JSR >SuperDosFWrite
3815 BNE LD908
3816 LD8E6 LDX $060B
3817 CLR 2,X
3818 LD8EB RTS
3819
3820 DosHookCheckIONum BLE LD8EB
3821 CMPB #$04
3822 BHI LD906
3823 PULS X,PC
3824
3825 DosHookOpenDev LEAS 2,S
3826 JSR >$8887
3827 JSR >$8DEA
3828 PSHS B
3829 JSR >$B7D4
3830 TSTB
3831 LBLE $B835
3832 LD906 LDB #$28
3833 LD908 JMP >DosHookSysError
3834
3835 DosHookCharOut TST <$6F
3836 BLE LD8EB
3837 LEAS 2,S
3838 LD911 PSHS D,X,Y,U
3839 LDB <$F4
3840 BEQ LD91B
3841 LDB <$F3
3842 BEQ LD952
3843 LD91B LDX $060B
3844 LDX 5,X
3845 LDB <$F2
3846 ABX
3847 STA ,X
3848 DEC <$F3
3849 INC <$F2
3850 BNE LD952
3851 LDA <$F1
3852 LDX $060B
3853 LDX 5,X
3854 LDU #$0100
3855 LDY $0664
3856 LDB $0666
3857 JSR >SuperDosFWrite
3858 BEQ LD944
3859 JMP >DosHookSysError
3860
3861 LD944 LDD $0665
3862 ADDD #$0100
3863 BCC LD94F
3864 INC $0664
3865 LD94F STD $0665
3866 LD952 PULS D,X,Y,U,PC
3867
3868 DosHookDiskItem TST <$6F
3869 BLE LD9BB
3870 LDX #$879A
3871 STX ,S
3872 LD95D LDA <$F4
3873 BEQ LD965
3874 LDA <$F3
3875 BEQ LD9B2
3876 LD965 LDX #$02DD
3877 LDB <$F2
3878 STB $0603
3879 ABX
3880 LDB $0604
3881 STB $0611
3882 CLRB
3883 STB -1,X
3884 STB <$00
3885 LD979 DEC <$F3
3886 DEC $0604
3887 INC <$F2
3888 LDA ,X+
3889 BEQ LD9B2
3890 CMPA #$0D
3891 BEQ LD9B2
3892 TST $0612
3893 BNE LD995
3894 CMPA #$2C
3895 BEQ LD9B2
3896 CMPA #$3A
3897 BEQ LD9B2
3898 LD995 LDA <$F4
3899 BEQ LD99D
3900 LDA <$F3
3901 BEQ LD9B2
3902 LD99D INCB
3903 CMPB #$FF
3904 BEQ LD9B0
3905 LDA $0604
3906 BNE LD979
3907 LDB <$00
3908 BNE LD9B0
3909 BSR LD9BC
3910 CLRB
3911 BRA LD979
3912
3913 LD9B0 LEAX 1,X
3914 LD9B2 LDB $0603
3915 CLR -1,X
3916 LDX #$02DC
3917 ABX
3918 LD9BB RTS
3919
3920 LD9BC JSR >DosFCBNoToAddr
3921 CLRA
3922 LDB $0611
3923 PSHS D
3924 LDD 13,X
3925 SUBD ,S++
3926 STD 13,X
3927 BCC LD9CF
3928 DEC 12,X
3929 LD9CF PSHS Y,U
3930 LDU #$00FF
3931 BSR LD9EF
3932 LDU #$02DD
3933 CLR D,U
3934 LDA <$F1
3935 LDB 14,X
3936 LDX 12,X
3937 EXG X,U
3938 JSR >SuperDosFRead
3939 BNE LDA25
3940 LDX #$02DD
3941 CLR -1,X
3942 PULS Y,U,PC
3943
3944 LD9EF PSHS U
3945 LDD 13,X
3946 ADDD ,S
3947 PSHS D
3948 LDA 12,X
3949 ADCA #$00
3950 SUBA $10,X
3951 PULS D
3952 BCS LDA14
3953 BHI LDA23
3954 SUBD $11,X
3955 BLS LDA14
3956 LDD $11,X
3957 SUBD 13,X
3958 BEQ LDA23
3959 STD ,S
3960 COM <$00
3961 LDA14 LDD ,S
3962 STB $0604
3963 STB $0611
3964 CLR $0603
3965 CLR <$F2
3966 PULS Y,PC
3967
3968 LDA23 LDB #$9A
3969 LDA25 JMP >DosHookSysError
3970
3971 ;
3972 ; Dir command dispatch routine
3973 ;
3974 ; Syntax :
3975 ; DIR drivenum
3976 ;
3977
3978 CmdDir
3979 BEQ LDA2F
3980 JSR >GetDriveNoInB
3981 BRA LDA32
3982
3983 LDA2F LDB $060A
3984 LDA32 STB <$EB
3985 CLR ,-S
3986 JSR >LD710
3987 CLRB
3988 LDA3A JSR >$851B
3989 JSR >SuperDosGetDirEntry
3990 BNE LDA25
3991 LDA ,X
3992 BITA #$08
3993 BNE LDAA2
3994 BITA #$81
3995 BNE LDA9A
3996 LEAX 1,X
3997 LDB #$08
3998 BSR LDAB2
3999 LDB #$04
4000 LDA #$2E
4001 BSR LDAB8
4002 LDA -12,X
4003 BITA #$02
4004 BEQ LDA61
4005 LDA #$70
4006 LDA61 EQU *+1
4007 CMPX #$8620
4008 JSR >$B54A
4009 JSR >$90F5
4010 LDU #$FFFF
4011 LDX #$06BD
4012 LDB ,S
4013 STB $1D,X
4014 JSR >LCB20
4015 BNE LDA25
4016 JSR >LCEBF
4017 BSR LDABF
4018 LDD <$88
4019 CMPD #$05A0
4020 BLS LDA97
4021 PSHS D,X,Y,U
4022 LDX #DDFE0
4023 JSR >BasPrintStr
4024 JSR >$852B
4025 JSR >$BA77
4026 PULS D,X,Y,U
4027 LDA97 EQU *+1
4028 LDA #$BD
4029 SUBA <$A1
4030 LDA9A INC ,S
4031 LDB ,S
4032 CMPB #$A0
4033 BCS LDA3A
4034 LDAA2 PULS A
4035 JSR >SuperDosGetFree
4036 CLRA
4037 TFR X,U
4038 BSR LDABF
4039 LDX #DDAD4
4040 JMP >BasPrintStr
4041
4042 LDAB2 LDA ,X+
4043 BNE LDAB8
4044 LDA #$20
4045 LDAB8 JSR >$B54A
4046 DECB
4047 BNE LDAB2
4048 RTS
4049
4050 LDABF JSR >LDD9B
4051 JMP >$9582
4052
4053 DosHookReadInput PSHS D,X,U
4054 LDX #$837D
4055 CMPX 8,S
4056 BNE LDAD3
4057 JSR >DosHookCloseSingle
4058 BRA LDB2D
4059
4060 DDAD4 EQU *+1
4061 LDAD3 PULS D,X,U,PC
4062
4063 FCC / BYTES FREE/
4064 FCB $0D
4065 FCB $00
4066 FCB $00
4067 FCB $00
4068 FCB $00
4069
4070 ;
4071 ; Auto command dispatch routine
4072 ;
4073 ; Syntax :
4074 ;
4075 ; AUTO startline,increment
4076 ;
4077
4078
4079 CmdAuto
4080 LDX <BasCurrentLine ; Get current line number
4081 LEAX 1,X ; Increment it
4082 LBNE BasFCError ; to big : ?FC error
4083 LDX #$000A ; Default line no increment 10
4084 TFR X,D
4085 PSHS D,X ; make room on stack & setup default start and increment
4086 JSR <BasChrGetCurr ; Fetch current char pointed to by basic
4087 BEQ CmdAutoDoAuto ; Last char : yes proceed
4088 JSR >VarGet16Bit ; get start line no
4089 LDD <$52 ; check for error
4090 STD 2,S
4091 JSR <BasChrGetCurr ; Fetch current char pointed to by basic
4092 BEQ CmdAutoDoAuto ; Last char : yes proceed
4093 JSR >VarCKComma ; check for comma
4094 JSR >VarGet16Bit ; Get Line increment
4095 LDD <$52
4096 BEQ CmdAutoErrorExit
4097 STD ,S
4098 JSR <BasChrGetCurr ; Fetch current char pointed to by basic
4099 BEQ CmdAutoDoAuto ; Last char : yes proceed
4100 CmdAutoErrorExit
4101 JMP >BasSNError ; More chars left, SN? error
4102
4103 CmdAutoDoAuto
4104 ORCC #$50 ; Disable inturrupts ???
4105 LDD ,S++ ; Get Increment off stack
4106 STD DosAutoInc
4107 LDD ,S++ ; Get start line off stack
4108 SUBD $060F ; Subtrack increment
4109 STD DosAutoCurrent ; Save in current
4110 LDA #AutoFlag ; Flag in AUTO mode
4111 STA DosAutoFlag
4112 RTS
4113
4114 FCB $34
4115 FCB $56
4116
4117 LDB2D TST $0613
4118 BNE LDB34
4119 LDB32 PULS D,X,U,PC
4120
4121 LDB34 LDD $060D
4122 ADDD $060F
4123 CMPD #$F9FF
4124 BHI LDB32
4125 STD ,S
4126 JSR >$957A
4127 LDA #$20
4128 JSR >$B54A
4129 LDU #$03DA
4130 LDD ,S
4131 STD $060D
4132 LDX #$02DD
4133 CLRB
4134 LDB56 LDA ,U+
4135 BEQ LDB5F
4136 STA ,X+
4137 INCB
4138 BRA LDB56
4139
4140 LDB5F LDA #$20
4141 STA ,X+
4142 INCB
4143 LDB64 JSR >$B505
4144 CMPA #$0D
4145 BEQ LDB6F
4146 CMPA #$03
4147 BNE LDB85
4148 LDB6F CLR $0613
4149 LDA #$0D
4150 JSR >$B54A
4151 LEAS 8,S
4152 CLR <$85
4153 LDX #$02DD
4154 LDA #$0D
4155 LDB #$01
4156 JMP >$B5D3
4157
4158 LDB85 CMPA #$20
4159 BCS LDB64
4160 CMPA #$7B
4161 BCC LDB64
4162 LEAS 8,S
4163 CLR <$85
4164 JMP >$B5D3
4165
4166 LDB94 CLRA ; A=0
4167 LDX #$0008 ; Repeat 8 times
4168 LDB98 JSR >CasByteOut ; Output A to cassette
4169 LEAX -1,X ; Decrement count
4170 BNE LDB98 ; Loop again if all not done
4171 RTS
4172
4173 ;
4174 ; Beep command dispatch routine
4175 ;
4176 ; Syntax :
4177 ; BEEP nobeeps
4178 ;
4179
4180 CmdBeep
4181 BEQ LDBA6 ; if no params, default to 1 beep
4182 JSR >Get8BitorError ; get beep count
4183 LDBA6 EQU *+1
4184 CMPX #$C601 ; LDB #$01 (default beep count)
4185 PSHS B ; save count on stack
4186 CLRB
4187 JSR >SndDTOAOn ; switch dound to D to A
4188 LDBAE BSR LDB94
4189 JSR >$851B
4190 DEC ,S ; decrement beep count
4191 BEQ LDBC1 ; done all : restore and exit
4192 LDY #$6000 ; wait a short while
4193 LDBBB LEAY -1,Y
4194 BEQ LDBAE ; loop back and do next beep
4195 BRA LDBBB
4196
4197 LDBC1 PULS B,PC ; restore and return
4198
4199 ;
4200 ; Wait command dispatch routine.
4201 ;
4202 ; Syntax :
4203 ; WAIT miliseconds
4204 ;
4205
4206 CmdWait
4207 BEQ LDBD6
4208 JSR >$8E83
4209 LDX <$52
4210 LDBCA JSR >$851B
4211 LDB #$A0
4212 LDBCF DECB
4213 BNE LDBCF
4214 LEAX -1,X
4215 BNE LDBCA
4216 LDBD6 RTS
4217
4218 ;
4219 ; Swap command dispatch routine.
4220 ;
4221 ; Syntax :
4222 ; SWAP var1,var2
4223 ;
4224
4225 CmdSwap
4226 JSR >$8A94
4227 LDX <$39
4228 LDA <$06
4229 PSHS A,X
4230 JSR >$89AA
4231 JSR >$8A94
4232 PULS A,Y
4233 CMPA <$06
4234 LBNE $8882
4235 LDU <$39
4236 LDX #$0005
4237 LDBF3 LDA ,U
4238 LDB ,Y
4239 STB ,U+
4240 STA ,Y+
4241 LEAX -1,X
4242 BNE LDBF3
4243 RTS
4244
4245 LDC00 LDB #$8E
4246 LDC02 TST <$71
4247 NOP
4248 LBRA DosHookSysError
4249
4250 LDC08 LDA #$55
4251 STA <$71
4252 RTS
4253
4254 ;
4255 ; If assembling for the DragonDos cartrage, this is the dispatch for
4256 ; the boot command, if assembling for the dragon Alpha, I have used
4257 ; the space occupied by the boot command to store the code used to
4258 ; activate the Alpha's drive selects and motor on, this is reasonable
4259 ; because the Alpha has a graphical boot menu, which allows it to boot
4260 ; from disk, so this routine seemed expendable.
4261 ;
4262
4263 ifne DragonAlpha
4264
4265 ; Translate DragonDos Drive select mechinisim to work on Alpha
4266 ; Takes byte that would be output to $FF48, reformats it and
4267 ; outputs to Alpha AY-8912's IO port, which is connected to
4268 ; Drive selects, motor on and enable precomp.
4269 ; We do not need to preserve the ROM select bit as this code
4270 ; operates in RAM only mode.
4271
4272
4273 AlphaDskCtl
4274 PSHS x,A,B,CC,DP
4275
4276 pshs a ; Convert drives
4277 anda #%00000011 ; mask out drive number
4278 leax ADriveTab,pcr ; point at table
4279 lda a,x ; get bitmap
4280 ldb ,s
4281 andb #%11111100 ; mask out drive number
4282 stb ,s
4283 ora ,s ; recombine
4284
4285 bita #MotorOn ; test motor on ?
4286 bne MotorRunning
4287
4288 clra ; No, turn off other bits.
4289 MotorRunning
4290 anda #KnownBits ; Mask out bits we do not know the function of
4291 sta ,s
4292
4293 lda #AYIOREG ; AY-8912 IO register
4294 sta PIA2DB ; Output to PIA
4295 ldb #AYREGLatch ; Latch register to modify
4296 stb PIA2DA
4297
4298 clr PIA2DA ; Idle AY
4299
4300 lda ,s+ ; Fetch saved Drive Selects
4301 sta PIA2DB ; output to PIA
4302 ldb #AYWriteReg ; Write value to latched register
4303 stb PIA2DA ; Set register
4304
4305 clr PIA2DA ; Idle AY
4306
4307 PULS dp,x,A,B,CC,pc
4308
4309 else
4310 ;
4311 ; Boot command dispatch routine (DragonDos only).
4312 ;
4313 ; Syntax :
4314 ; BOOT drivenum
4315 ;
4316
4317 CmdBoot
4318 BEQ LDC14 ; No drive supplied, use default
4319 JSR >GetDriveNoInB ; Get drive number
4320 BRA LDC17
4321
4322 LDC14 LDB DosDefDriveNo ; use default drive no
4323 LDC17 LDA #BootFirstSector; Read boot sector
4324 STA <DskSectorNo
4325 STB <LastActiveDrv ; Set drive number
4326 JSR >DosDoRestore ; Restore to track 0
4327 BCS LDC02 ; Error : exit
4328
4329 JSR >DosDoReadSec2 ; Read first 2 chars of boot sec
4330 BCS LDC02 ; error : exit
4331
4332 LDD #BootSignature ; Boot signature found ?
4333 CMPD <$4F
4334 BNE LDC00 ; no : error
4335
4336 LDD #BootLoadAddr ; start at boot load address
4337 STD <DiskBuffPtr ; Set disk buffer to point there
4338 LDC34 JSR >DosDoReadSec ; Read a sector
4339 BCS LDC02 ; Error : exit
4340
4341 INC <DiskBuffPtr ; increment page of buffer pointer
4342 INC <DskSectorNo ; increment sector number
4343 LDA <DskSectorNo ; get sector number
4344 CMPA #BootLastSector ; Read the whole boot area ?
4345 BLS LDC34 ; no : read next sector
4346
4347 JMP >BootEntryAddr ; jump to loaded boot code
4348
4349 endc
4350
4351 org $DC46
4352
4353 ;
4354 ;Drive command dispatch routine.
4355 ;
4356 ; Syntax :
4357 ; DRIVE drivenum
4358 ;
4359
4360 CmdDrive
4361 BEQ LDC4F
4362 JSR >GetDriveNoInB
4363 STB $060A
4364 RTS
4365
4366 LDC4F JMP >BasSNError
4367
4368 ;
4369 ; Error command dispatch routine.
4370 ;
4371 ; Syntax :
4372 ; ERROR GOTO lineno
4373 ;
4374
4375 CmdError2
4376 CMPA #$81
4377 BNE LDC4F
4378 JSR <$9F
4379 CMPA #$BC
4380 BNE LDC4F
4381 JSR <$9F
4382 JSR >$869A
4383 LDX <$2B
4384 CMPX #$F9FF
4385 LBHI BasFCError
4386 STX $0615
4387 BEQ LDC75
4388 LDA #$FF
4389 STA $0614
4390 RTS
4391
4392 LDC75 CLR $0614
4393 RTS
4394
4395 LDC79 JSR >$89AA
4396 JSR >$8A94
4397 JMP >$8877
4398
4399 ;
4400 ;Sread command dispatch routine.
4401 ;
4402 ; Syntax :
4403 ; SREAD driveno,trackno,secno,part1$,part2$
4404 ;
4405
4406 CmdSread
4407 JSR >LDD21
4408 BSR LDC79
4409 PSHS X
4410 BSR LDC79
4411 PSHS X
4412 LDB #$FF
4413 STB <$F6
4414 JSR >LD2A2
4415 BNE LDCBA
4416 CLR 2,X
4417 LDX 5,X
4418 STX <$EE
4419 JSR >DosDoReadSec
4420 STB $0603
4421 LDU <$EE
4422 LEAU $0080,U
4423 PULS X
4424 BSR LDCBD
4425 LDU <$EE
4426 PULS X
4427 BSR LDCBD
4428 CLR <$F6
4429 LDB $0603
4430 BNE LDCBA
4431 RTS
4432
4433 LDCBA JMP >DosHookSysError
4434
4435 LDCBD PSHS X,U
4436 LDB #$80
4437 JSR >$8C52
4438 LEAU ,X
4439 PULS X
4440 STB ,X
4441 STU 2,X
4442 PULS X
4443 JMP >UtilCopyBXtoU
4444
4445 ;
4446 ; Swrite command dispatch routine.
4447 ;
4448 ; Syntax :
4449 ; SWRITE driveno,side,sector,part1$,part2$
4450 ;
4451
4452 CmdSwrite
4453 BSR LDD21
4454 BSR LDD1B
4455 JSR >$8877
4456 LDX <$52
4457 PSHS X
4458 BSR LDD1B
4459 JSR >$8D9A
4460 PSHS B,X
4461 LDB #$FF
4462 STB <$F6
4463 JSR >LD2A2
4464 BNE LDCBA
4465 CLR 2,X
4466 LDX 5,X
4467 STX <$EE
4468 CLRB
4469 LDCF3 CLR ,X+
4470 DECB
4471 BNE LDCF3
4472 PULS B,X
4473 LDU <$EE
4474 LEAU $0080,U
4475 TSTB
4476 BEQ LDD06
4477 JSR >UtilCopyBXtoU
4478 LDD06 PULS X
4479 JSR >$8D9F
4480 LDU <$EE
4481 TSTB
4482 BEQ LDD13
4483 JSR UtilCopyBXtoU
4484 LDD13 JSR >DosDoWriteSec
4485 BCS LDCBA
4486 CLR <$F6
4487 RTS
4488
4489 LDD1B JSR $89AA
4490 JMP >$8887
4491
4492 LDD21 BNE LDD26
4493 JMP >BasSNError
4494
4495 LDD26 JSR GetDriveNoInB
4496 STB <$EB
4497 JSR $8E7E
4498 CMPB #$4F
4499 BHI LDD3A
4500 STB <$EC
4501 JSR $8E7E
4502 STB <$ED
4503 LDD39 RTS
4504
4505 LDD3A JMP >BasFCError
4506
4507 ;
4508 ; Verify command dispatch routine.
4509 ;
4510 ; Syntax :
4511 ; VERIFY ON
4512 ; VERIFY OFF
4513 ;
4514
4515 CmdVerify
4516 BEQ LDD4D
4517 CMPA #$C2
4518 BNE LDD46
4519 CLRB
4520 BRA LDD4F
4521
4522 LDD46 CMPA #$88
4523 BEQ LDD4D
4524 JMP >BasSNError
4525
4526 LDD4D LDB #$FF
4527 LDD4F STB $0608
4528 JMP <$9F
4529
4530 DosHookEOF TST <$06
4531 BEQ LDD39
4532 CLR <$06
4533 LEAS 2,S
4534 LDY #DosExtDat
4535 JSR LD6DF
4536 BNE LDD7E
4537 JSR SuperDosGetFLen
4538 BNE LDD7E
4539 JSR DosFCBNoToAddr
4540 CMPU 12,X
4541 BHI LDD76
4542 CMPA 14,X
4543 BLS LDD78
4544 LDD76 CLRA
4545 LDD78 EQU *+1
4546 CMPX #$8601
4547 LDU <Zero16Bit
4548 BRA LDD99
4549
4550 LDD7E JMP >DosHookSysError
4551
4552 FuncLoc
4553 JSR LD6C5
4554 BNE LDD7E
4555 JSR DosFCBNoToAddr
4556 LDU 12,X
4557 LDA 14,X
4558 BRA LDD99
4559
4560 FuncLof
4561 JSR LD6C5
4562 BNE LDD7E
4563 JSR SuperDosGetFLen
4564 BNE LDD7E
4565 LDD99 CLR <$06
4566 LDD9B CLRB
4567 STU <$51
4568 STD <$53
4569 CLR <$63
4570 LDA #$A0
4571 STD <$4F
4572 JMP >$9165
4573
4574 FuncFree
4575 JSR <$A5
4576 BEQ LDDB2
4577 JSR GetDriveNoInB
4578 BRA LDDB5
4579
4580 LDDB2 LDB $060A
4581 LDDB5 STB <$EB
4582 JSR SuperDosGetFree
4583 BNE LDD7E
4584 TFR X,U
4585 CLRA
4586 BRA LDD99
4587
4588 FuncErl
4589 LDD $0617
4590 LDDC4 JMP >$8C37
4591
4592 FuncErr
4593 CLRA
4594 LDB $0619
4595 BRA LDDC4
4596
4597 FuncHimem
4598 LDD <$27
4599 BRA LDDC4
4600
4601 FuncFres
4602 JSR $8CD7
4603 LDD <$23
4604 SUBD <$21
4605 BRA LDDC4
4606
4607 ;
4608 ; The actual core disk IO routine, accepts a function code $00..$07
4609 ; these are dispatched through this table
4610 ;
4611
4612 DosFunctionTable
4613 FDB DosFunctionRestore ; Restore to track 0
4614 FDB DosFunctionSeek ; Seek to a track
4615 FDB DosFunctionReadSec ; Read a sector
4616 FDB DosFunctionWriteSec ; Write a sector
4617 FDB DosFunctionWriteSec2
4618 FDB DosFunctionWriteTrack ; Write (format) track
4619 FDB DosFunctionReadAddr ; Read address mark
4620 FDB DosFunctionReadSec2 ; Read first two bytes of a sector
4621
4622 ;
4623 ; Data table for Format ?
4624 ;
4625
4626 DDDEA FCB $01
4627 FCB $0A
4628 FCB $02
4629 FCB $0B
4630 FCB $03
4631 FCB $0C
4632 FCB $04
4633 FCB $0D
4634 FCB $05
4635 FCB $0E
4636 FCB $06
4637 FCB $0F
4638 FCB $07
4639 FCB $10
4640 FCB $08
4641 FCB $11
4642 FCB $09
4643 FCB $12
4644 FCB $00
4645 DDDFD FCC /5NN/
4646 FCB $08
4647 FCB $00
4648 FCB $00
4649 FCB $03
4650 FCB $F6
4651 FCB $FC
4652 FCB $1F
4653 FCB $4E
4654 FCB $4E
4655 DDE09 FCB $07
4656 FCB $00
4657 FCB $00
4658 FCB $03
4659 FCB $F5
4660 FCB $FE
4661 FCB $01
4662 FCB $F7
4663 FCB $4E
4664 FCB $14
4665 FCB $4E
4666 FCB $4E
4667 FCB $0B
4668 FCB $00
4669 FCB $00
4670 FCB $03
4671 FCB $F5
4672 FCB $FB
4673 FCB $00
4674 FCB $E5
4675 FCB $F7
4676 FCB $17
4677 FCB $4E
4678 FCB $4E
4679 FCB $00
4680 FCB $4E
4681 FCB $4E
4682
4683 ;
4684 ; Data copied into low ram at init, inturrupt vectors etc
4685 ;
4686
4687 DDE24 FCB $09 ; No bytes
4688 FDB $0109 ; address to copy
4689
4690 ; Inturrupt vectors
4691
4692 LDE27 JMP >NMISrv
4693
4694 LDE2A JMP >IRQSrv
4695
4696 LDE2D JMP >FIRQSrv
4697
4698 ; Dos vars, step rates for drives ?
4699
4700 FCB $04 ; No bytes
4701 FDB $069F ; address to copy
4702 FCB $02
4703 FCB $02
4704 FCB $02
4705 FCB $02
4706
4707 ; New basic dispatch stub
4708
4709 FCB $1E ; No bytes
4710 FDB $012A ; address to copy
4711 FCB $1A
4712 FDB DDEDA
4713 FDB LC670
4714 FCB $07
4715 FDB DDEC1
4716 FDB LC68B
4717 FCB $00
4718 FDB $0000
4719 FDB BasSNError
4720 FCB $00
4721 FDB $0000
4722 FDB BasSNError
4723 FCB $00
4724 FCB $00
4725 FCB $00
4726 FCB $00
4727 FCB $00
4728 FCB $00
4729 FCB $00
4730 FCB $00
4731 FCB $00
4732
4733 FCB $00 ; No bytes : terminate
4734 FCB $00
4735
4736 CommandDispatchTable
4737 FDB CmdAuto ; Commented
4738 FDB CmdBackup
4739 FDB CmdBeep
4740
4741 ifne DragonAlpha
4742 FDB BasSNError ; If assembling for Alpha, just redirect to ?SN error
4743 else
4744 FDB CmdBoot ; Else, if dragondos, boot command
4745 endc
4746
4747 FDB CmdChain
4748 FDB CmdCopy
4749 FDB CmdCreate
4750 FDB CmdDir
4751 FDB CmdDrive
4752 FDB CmdDskInit
4753 FDB CmdFRead
4754 FDB CmdFWrite
4755 FDB CmdError2
4756 FDB CmdKill
4757 FDB CmdLoad
4758 FDB CmdMerge
4759 FDB CmdProtect
4760 FDB CmdWait
4761 FDB CmdRename
4762 FDB CmdSave
4763 FDB CmdSread
4764 FDB CmdSwrite
4765 FDB CmdVerify
4766 FDB BasSNError
4767 FDB CmdFLRead
4768 FDB CmdSwap
4769
4770 FunctionDipatchTable
4771 FDB FuncLof
4772 FDB FuncFree
4773 FDB FuncErl
4774 FDB FuncErr
4775 FDB FuncHimem
4776 FDB FuncLoc
4777 FDB FuncFres
4778
4779 ;
4780 ; New ram hook table copied into low ram
4781 ;
4782
4783 RamHookTable
4784 FDB DosHookOpenDev ; open dev/file
4785 FDB DosHookCheckIONum ; check io num
4786 FDB DosHookRetDevParam ; return dev parameters
4787 FDB DosHookCharOut ; char output
4788 FDB DosHookRetDevParam ; char input
4789 FDB DosHookRetDevParam ; check dev open for input
4790 FDB DosHookRetDevParam ; check dev open for output
4791 FDB DosHookRetDevParam ; close all devs and files
4792 FDB DosHookCloseSingle ; close single dev/file
4793 FDB DosHookRetDevParam ; first char of new statement
4794 FDB DosHookDiskItem ; Disk file item scanner
4795 FDB DosHookRetDevParam ; poll for break
4796 FDB DosHookReadInput ; read line of input
4797 FDB DosHookRetDevParam ; finish loading ASCII program
4798 FDB DosHookEOF ; EOF function
4799 FDB DosHookRetDevParam ; Eval expression
4800 FDB DosHookRetDevParam ; User error trap
4801 FDB DosHookSysError ; System error trap
4802 FDB DosHookRun ; run statement
4803
4804 DDEC1 FCC /LO/
4805 FCB $C6
4806 FCC /FRE/
4807 FCB $C5
4808 FCC /ER/
4809 FCB $CC
4810 FCC /ER/
4811 FCB $D2
4812 FCC /HIME/
4813 FCB $CD
4814 FCC /LO/
4815 FCB $C3
4816 FCC /FRE/
4817 FCB $A4
4818 DDEDA FCC /AUT/
4819 FCB $CF
4820 FCC /BACKU/
4821 FCB $D0
4822 FCC /BEE/
4823 FCB $D0
4824 FCC /BOO/
4825 FCB $D4
4826 FCC /CHAI/
4827 FCB $CE
4828 FCC /COP/
4829 FCB $D9
4830 FCC /CREAT/
4831 FCB $C5
4832 FCC /DI/
4833 FCB $D2
4834 FCC /DRIV/
4835 FCB $C5
4836 FCC /DSKINI/
4837 FCB $D4
4838 FCC /FREA/
4839 FCB $C4
4840 FCC /FWRIT/
4841 FCB $C5
4842 FCC /ERRO/
4843 FCB $D2
4844 FCC /KIL/
4845 FCB $CC
4846 FCC /LOA/
4847 FCB $C4
4848 FCC /MERG/
4849 FCB $C5
4850 DDF2A EQU *+3
4851 FCC /PROTEC/
4852 FCB $D4
4853 FCC /WAI/
4854 FCB $D4
4855 FCC /RENAM/
4856 FCB $C5
4857 FCC /SAV/
4858 FCB $C5
4859 FCC /SREA/
4860 FCB $C4
4861 FCC /SWRIT/
4862 FCB $C5
4863 FCC /VERIF/
4864 FCB $D9
4865 FCC /FRO/
4866 FCB $CD
4867 FCC /FLREA/
4868 FCB $C4
4869 FCC /SWA/
4870 FCB $D0
4871 FCC /INSERT SOURCE /
4872 FCB $0D
4873 FCB $00
4874 FCC /INSERT DESTINATION /
4875 FCB $0D
4876 MessPressAnyKey
4877 FCB $00
4878 FCC /PRESS ANY KEY /
4879 FCB $0D
4880 FCB $00
4881 DosExtBas
4882 FCC /BAS/
4883 DosExtDat
4884 FCC /DAT/
4885 DosExtBin
4886 FCC /BIN/
4887
4888 DosErrorCodeTable
4889 FCC / NRSKWPRTRFCCLDBTIVFDDFFSPTPEF/
4890 FCC /FFENETFPR?/
4891
4892 DosSignonMess
4893 ifne DragonAlpha
4894 FCC /?SUPERDOS E7a/
4895 else
4896 FCC /?SUPERDOS E6 /
4897 endc
4898
4899 FCB $0D
4900 FCB $00
4901 DDFE0 FCB $00
4902 FCC / MORE:/
4903 FCB $00
4904 FCB $00
4905
4906 ifne DragonAlpha
4907 FCC / /
4908 ADriveTab
4909 FCB Drive0,Drive1,Drive2,Drive3
4910 else
4911 FCC / /
4912 endc
4913
4914 LDFF3 LDA 2,X
4915 DECA
4916 BNE LDFFA
4917 STA 2,X
4918 LDFFA LDX $066F
4919 RTS
4920
4921 FCB $61
4922 FCB $34
4923
4924 ;DE000 END