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