]> git.sur5r.net Git - cc65/blob - libsrc/atari/posixdirent.s
Minor clarification.
[cc65] / libsrc / atari / posixdirent.s
1 ; Native: Shawn Jefferson, December 2005
2 ; POSIX: Stefan Haubenthal, April 2008
3
4                 .include  "atari.inc"
5                 .export   _opendir, _readdir, _closedir
6                 .import   findfreeiocb, clriocb
7                 .import   __oserror, return0, __do_oserror
8                 .importzp ptr1, tmp1
9 .ifdef  DEFAULT_DEVICE
10                 .import __defdev
11 .endif
12
13
14 .proc   _opendir
15                 sta     ptr1
16                 stx     ptr1+1
17                 jsr     findfreeiocb
18                 beq     @iocbok
19                 bne     cioerr
20 @iocbok:        stx     diriocb
21                 jsr     clriocb
22                 ldx     diriocb
23                 ldy     #0              ; '.' -> "D:*.*"
24                 lda     (ptr1),y
25                 cmp     #'.'
26                 bne     @use_parm
27
28 ; "." was given as parameter, use default device/dir
29
30 .ifdef DEFAULT_DEVICE
31                 ; construct a "Dn:*.*" like string from the default drive
32                 lda     __defdev+1
33                 sta     dddefdev+1      ; copy drive number (overwrite 2nd 'D')
34                 lda     #<dddefdev
35                 sta     ICBAL,x
36                 lda     #>dddefdev
37                 sta     ICBAH,x
38                 bne     @cont
39 .else
40                 lda     #<defdev
41                 sta     ICBAL,x
42                 lda     #>defdev
43                 sta     ICBAH,x
44                 bne     @cont
45 .endif
46
47 @use_parm:      lda     ptr1
48                 sta     ICBAL,x
49                 lda     ptr1+1
50                 sta     ICBAH,x
51
52 @cont:          lda     #OPEN
53                 sta     ICCOM,x
54                 lda     #OPNIN|DIRECT
55                 sta     ICAX1,x
56                 jsr     CIOV
57                 bmi     cioerr
58                 lda     #0
59                 sta     __oserror
60                 tax
61                 lda     diriocb
62                 rts
63 .endproc
64
65 cioerr:         sty     __oserror
66                 lda     #CLOSE
67                 sta     ICCOM,x
68                 jsr     CIOV            ; close IOCB again since open failed
69                 jmp     return0
70
71 .proc   _readdir
72                 tax
73                 lda     #GETREC
74                 sta     ICCOM,x
75                 lda     #<entry
76                 sta     ICBAL,x
77                 sta     ptr1
78                 lda     #>entry
79                 sta     ICBAH,x
80                 sta     ptr1+1
81                 lda     #DSCTSZ
82                 sta     ICBLL,x
83                 lda     #0
84                 sta     ICBLH,x
85                 jsr     CIOV
86                 bmi     cioerr
87                 ldy     #0              ; FREE SECTORS
88                 lda     (ptr1),y
89                 cmp     #'0'
90                 bcs     cioerr
91                 dey
92 @next:          iny                     ; remove trailing spaces
93                 iny
94                 iny
95                 lda     (ptr1),y
96                 dey
97                 dey
98                 sta     (ptr1),y
99                 cpy     #8
100                 bcs     @break
101                 cmp     #' '
102                 bne     @next
103
104 @break:         lda     #'.'            ; extension dot
105                 sta     (ptr1),y
106                 iny                     ; copy extension
107                 sty     tmp1
108                 ldy     #10
109                 lda     (ptr1),y
110                 cmp     #' '
111                 bne     @hasext
112
113 ; no extension present: remove the trailing dot and be done
114                 ldy     tmp1
115                 dey
116                 bne     @done
117
118 @hasext:        jsr     copychar
119                 ldy     #13             ; d_type
120                 sta     (ptr1),y
121                 ldy     #11
122                 jsr     copychar
123                 ldy     #12
124                 jsr     copychar
125
126 @done:          lda     #0              ; end of string
127                 sta     (ptr1),y
128                 lda     ptr1
129                 ldx     ptr1+1
130                 rts
131
132
133 copychar:       lda     (ptr1),y        ; src=y dest=tmp1
134                 ldy     tmp1
135                 cmp     #' '
136                 beq     @break
137                 sta     (ptr1),y
138                 iny
139                 sty     tmp1
140 @break:         rts
141 .endproc
142
143 .proc   _closedir
144                 tax
145                 lda     #CLOSE
146                 sta     ICCOM,x
147                 jsr     CIOV
148                 bmi     @cioerr
149                 ldx     #0
150                 stx     __oserror               ; clear system specific error code
151                 txa
152                 rts
153 @cioerr:        jmp     __do_oserror
154 .endproc
155
156                 .data
157 .ifdef DEFAULT_DEVICE
158 dddefdev:       .byte   "D"
159 .endif
160 defdev:         .asciiz "D:*.*"
161
162                 .bss
163 diriocb:        .res    1
164 entry:          .res    DSCTSZ