Initial revision
[mazehack:archaicmazehackcode.git] / 64maze / src / diskcheck.s
1 /*
2    Maze generator and solver
3    (c) WWWWolf, started April 4 2000. Under GNU GPL v2 or later.
4    As usual, no warranty of any kind, use at your own risk.
5    $Id: diskcheck.s,v 1.0 2000-04-28 06:37:44 wwwwolf Exp $
6
7    This is MOS 6502 assembly, for Commodore 64.
8    It was written for xa65 cross-assembler, trying to use as few
9    xa-specific things as possible (so you can compile this with inferior
10    products.
11         
12    Description:
13    Checks if there is a disk in the drive.
14
15    $Id: diskcheck.s,v 1.0 2000-04-28 06:37:44 wwwwolf Exp $
16 */
17
18
19 /* This checks if there's a disk in the drive. Carry is SET if there
20    is no disk in the drive.
21 */
22                 
23 DSKCHK: .(
24         ;; Open command channel
25
26         lda #15                 ; lfn is 15
27         ldx #8
28         ldy #15                 ; secondary address 15 = command channel
29         jsr SETLFS
30         lda #3
31         ldx #<Init
32         ldy #>Init
33         jsr SETNAM              ; Initialize command as the name
34         jsr OPEN                ; ...and open our command channel!
35                 
36         ;; Read the stuff from error channel.
37
38         jsr READERR
39
40         ;; Close command channel. Needs to use CLALL!
41         jsr CLALL
42         
43         lda DSKERR              ; Load the error code to regs
44         ldx DSKERR+1
45
46         cmp #"0"
47         bne Wasnt               ; Wail if either of the error code bytes != 0
48         cpx #"0"
49         bne Wasnt
50
51         clc
52         jmp Out                 ; Go out quietly if it was OK.
53 Wasnt:  sec
54
55 Out:    rts
56         
57 Init:   .asc "I0:",0
58         .)
59
60                 
61 /* Reads disk drive error message from the command channel, storing it
62    in DSKERR as a null-terminated string.
63
64    BUG?: Maximum message length is 40 bytes. Is it enough or too much?
65    Could it be stored elsewhere?
66 */
67
68 READERR:.(
69         
70         ;; First, we clear the error message storage space
71         
72 ClrErr: ldx #0
73         lda #0
74 ClLoop: sta DSKERR,X
75         inx
76         cpx #40
77         bne ClLoop
78         
79         ;; and then we read the message from drive.
80         
81         ldx #15
82         jsr CHKIN               ; We're listening to lfn 15
83         ldx #0                  ; Our counter
84 RdLoop:
85         jsr CHRIN               ; Get character from command channel.
86         cmp #13                 ; Error message ends with CR.
87         beq OutLoop
88         sta DSKERR,X
89         inx
90         jmp RdLoop
91 OutLoop:
92         rts
93         .)
94
95 /* Disk error is stored here. */
96 DSKERR: .dsb 40