]> git.sur5r.net Git - cc65/blob - libsrc/geos-cbm/drivers/fio_module.s
Renamed 'devel' to 'drivers'.
[cc65] / libsrc / geos-cbm / drivers / fio_module.s
1 ;
2 ; Low level file I/O routines, ONLY for module loading OR sth similar
3 ;
4 ; Maciej 'YTM/Elysium' Witkowiak <ytm@elysium.pl>
5 ; 25.12.2002
6 ;
7 ; only ONE opened file at a time, only O_RDONLY flag
8
9 ; int open (const char* name, int flags, ...);  /* May take a mode argument */
10 ; int __fastcall__ close (int fd);
11 ; int __fastcall__ read (int fd, void* buf, unsigned count);
12
13 FILEDES = 3     ; first free to use file descriptor
14
15         .include        "geossym.inc"
16         .include        "const.inc"
17         .include        "errno.inc"
18         .include        "fcntl.inc"
19
20         .importzp       ptr1, ptr2, ptr3, tmp1
21         .import         addysp, popax
22         .import         __oserror
23         .import         _FindFile, _ReadByte
24
25         .export         _open, _close, _read
26
27
28 ;--------------------------------------------------------------------------
29 ; _open
30
31 _open:
32
33         cpy     #4              ; correct # of arguments (bytes)?
34         beq     @parmok         ; parameter count ok
35         tya                     ; parm count < 4 shouldn't be needed to be...
36         sec                     ; ...checked (it generates a c compiler warning)
37         sbc     #4
38         tay
39         jsr     addysp          ; fix stack, throw away unused parameters
40
41 ; Parameters ok. Pop the flags and save them into tmp3
42
43 @parmok:
44         jsr     popax           ; Get flags
45         sta     tmp1
46         jsr     popax           ; Get name
47         sta     ptr1
48         stx     ptr1+1
49
50         lda     filedesc        ; is there a file already open?
51         bne     @alreadyopen
52
53         lda     tmp1            ; check open mode
54         and     #(O_RDWR | O_CREAT)
55         cmp     #O_RDONLY       ; only O_RDONLY is valid
56         bne     @badmode
57
58         lda     ptr1
59         ldx     ptr1+1
60         jsr     _FindFile       ; try to find the file
61         tax
62         bne     @oserror
63
64         lda     dirEntryBuf + OFF_DE_TR_SC              ; tr&se for ReadByte (r1)
65         sta     f_track
66         lda     dirEntryBuf + OFF_DE_TR_SC + 1
67         sta     f_sector
68         lda     #<diskBlkBuf                            ; buffer for ReadByte (r4)
69         sta     f_buffer
70         lda     #>diskBlkBuf
71         sta     f_buffer+1
72         ldx     #0                                      ; offset for ReadByte (r5)
73         stx     f_offset
74         stx     f_offset+1
75         lda     #0                                      ; clear errors
76         sta     __oserror
77         jsr     __seterrno
78         lda     #FILEDES        ; return fd
79         sta     filedesc
80         rts
81 @badmode:
82         lda     #EINVAL         ; invalid parameters - invalid open mode
83         .byte   $2c             ; skip
84 @alreadyopen:
85         lda     #EMFILE         ; too many opened files (there can be only one)
86         jmp     __directerrno   ; set errno, clear oserror, return -1
87 @oserror:
88         jmp     __mappederrno   ; set platform error code, return -1
89
90 _close:
91         lda     #0
92         sta     __oserror
93         jsr     __seterrno      ; clear errors
94         lda     #0              ; clear fd
95         sta     filedesc
96         tax
97         rts
98
99 _read:
100     ; a/x - number of bytes
101     ; popax - buffer ptr
102     ; popax - fd, must be == to the above one
103     ; return -1+__oserror or number of bytes read
104
105         eor     #$ff
106         sta     ptr1
107         txa
108         eor     #$ff
109         sta     ptr1+1          ; -(# of bytes to read)-1
110         jsr     popax
111         sta     ptr2
112         stx     ptr2+1          ; buffer ptr
113         jsr     popax
114         cmp     #FILEDES        ; lo-byte == FILEDES
115         bne     @filenotopen
116         txa                     ; hi-byte == 0
117         beq     @fileok         ; fd must be == FILEDES
118
119 @filenotopen:
120         lda     #EBADF
121         jmp     __directerrno   ; Sets _errno, clears _oserror, returns -1
122
123 @fileok:
124         lda     #0
125         sta     ptr3
126         sta     ptr3+1          ; put 0 into ptr3 (number of bytes read)
127         sta     __oserror       ; clear error flags
128         jsr     __seterrno
129
130         lda     f_track         ; restore stuff for ReadByte
131         ldx     f_sector
132         sta     r1L
133         stx     r1H
134         lda     f_buffer
135         ldx     f_buffer+1
136         sta     r4L
137         stx     r4H
138         lda     f_offset
139         ldx     f_offset+1
140         sta     r5L
141         stx     r5H
142
143         clc
144         bcc     @L3             ; branch always
145
146 @L0:    jsr     _ReadByte
147         ldy     #0              ; store the byte
148         sta     (ptr2),y
149         inc     ptr2            ; increment target address
150         bne     @L1
151         inc     ptr2+1
152
153 @L1:    inc     ptr3            ; increment byte count
154         bne     @L2
155         inc     ptr3+1
156
157 @L2:    lda     __oserror       ; was there error ?
158         beq     @L3
159         cmp     #BFR_OVERFLOW   ; EOF?
160         beq     @done           ; yes, we're done
161         jmp     __mappederrno   ; no, we're screwed
162
163 @L3:    inc     ptr1            ; decrement the count
164         bne     @L0
165         inc     ptr1+1
166         bne     @L0
167
168 @done:
169         lda     r1L             ; preserve data for ReadByte
170         ldx     r1H
171         sta     f_track
172         stx     f_sector
173         lda     r4L
174         ldx     r4H
175         sta     f_buffer
176         stx     f_buffer+1
177         lda     r5L
178         ldx     r5H
179         sta     f_offset
180         stx     f_offset+1
181
182         lda     ptr3            ; return byte count
183         ldx     ptr3+1
184         rts
185
186 .bss
187 filedesc:       .res 1          ; file open flag - 0 (no file opened) or 1
188 f_track:        .res 1          ; values preserved for ReadByte
189 f_sector:       .res 1
190 f_offset:       .res 2
191 f_buffer:       .res 2