]> git.sur5r.net Git - cc65/blob - libsrc/atari/diopncls.s
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / libsrc / atari / diopncls.s
1 ;
2 ; Christian Groessler, February 2005
3 ;
4 ; This file provides the _dio_open and _dio_close functions
5 ; Since on the Atari no real open and close is necessary, they
6 ; do not open or close something. The _dio_open sets the sector
7 ; size of the drive which is later used by the _dio_read and
8 ; _dio_write functions. To query the sector size, the _dio_open
9 ; accesses the disk drive.
10 ;
11 ; dhandle_t     __fastcall__ dio_open  (unsigned char device);
12 ; unsigned char __fastcall__ dio_close (dhandle_t handle);
13 ;
14
15         .export         _dio_open, _dio_close
16         .export         sectsizetab
17         .import         __oserror, __sio_call, _dio_read
18         .import         pushax, addysp, subysp
19         .importzp       ptr2, sp
20         .include        "atari.inc"
21
22
23 .bss
24
25 sectsizetab:
26         .res    NUMDRVS * sst_size
27
28 .code
29
30 ; code for _dio_open
31
32 _inv_drive:
33         lda     #NONDEV         ; non-existent device
34         sta     __oserror
35         lda     #0
36         tax
37         rts                     ; return NULL
38
39 _dio_open:
40
41         cmp     #NUMDRVS        ; valid drive id?
42         bcs     _inv_drive
43         tay                     ; drive #
44         asl     a               ; make index from drive id
45         asl     a
46         tax
47         lda     #128                            ; preset sectsize
48         sta     sectsizetab+sst_sectsize,x
49         sta     sectsizetab+sst_flag,x          ; set flag that drive is "open"
50         lda     #0
51         sta     sectsizetab+sst_sectsize+1,x
52         sta     __oserror                       ; success
53         tya
54         sta     sectsizetab+sst_driveno,x
55         stx     ptr2
56         lda     #<sectsizetab
57         clc
58         adc     ptr2
59         sta     ptr2
60         lda     #>sectsizetab
61         adc     #0
62         tax
63         stx     ptr2+1          ; ptr2: pointer to sectsizetab entry
64
65 ; query drive for current sector size
66 ; procedure:
67 ;   - read sector #4 (SIO command $54) to update drive status;
68 ;     read length is 128 bytes, buffer is allocated on the stack,
69 ;          sector data is ignored;
70 ;     returned command status is ignored, we will get an error with
71 ;          a DD disk anyway (read size 128 vs. sector size 256);
72 ;   - issue SIO command $53 (get status) to retrieve the sector size;
73 ;     use the DVSTAT system area as return buffer;
74 ;     if the command returns with an error, set sector size to 128
75 ;          bytes;
76 ;
77
78         ldy     #128
79         jsr     subysp          ; allocate buffer on the stack
80
81         lda     sp
82         pha
83         lda     sp+1
84         pha                     ; save sp (buffer address) on processor stack
85
86         lda     ptr2
87         ldx     ptr2+1
88         jsr     pushax          ; handle
89
90         ldx     #0
91         lda     #4
92         jsr     pushax          ; sect_num
93
94         pla
95         tax
96         pla                     ; AX - buffer address
97
98                                 ; sst_sectsize currently 128
99         jsr     _dio_read       ; read sector to update status
100
101         ldy     #128
102         jsr     addysp          ; discard stack buffer
103
104         lda     ptr2
105         ldx     ptr2+1
106         jsr     pushax          ; handle
107
108         ldx     #0
109         lda     #4
110         jsr     pushax          ; dummy sector #, ignored by this SIO command,
111                                 ; but set to circumvent the special 1-3 sector
112                                 ; handling in __sio_call
113
114         ldx     #>DVSTAT
115         lda     #<DVSTAT
116         jsr     pushax          ; buffer address
117
118         ldy     #sst_sectsize
119         lda     #4
120         sta     (ptr2),y        ; 4 bytes transfer
121
122         ldx     #%01000000      ; direction value
123         lda     #SIO_STAT       ; get status
124
125         jsr     __sio_call
126
127         bmi     error
128
129         ldy     #sst_sectsize
130         lda     DVSTAT
131         and     #%100000
132         beq     s128
133
134 ;s256
135         lda     #0
136         sta     (ptr2),y
137         iny
138         lda     #1
139
140 finish: sta     (ptr2),y        ; set default sector size       
141 fini2:  lda     ptr2
142         ldx     ptr2+1
143         rts
144
145 error:  ldy     #sst_sectsize
146 s128:   lda     #128
147         bne     finish
148
149 ; end of _dio_open
150
151
152 .proc   _dio_close
153
154         sta     ptr2
155         stx     ptr2+1
156         lda     #0
157         ldy     #sst_flag
158         sta     (ptr2),y
159         sta     __oserror       ; success
160         tax
161         rts                     ; return no error
162
163 .endproc