File: posixdirent.s

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (164 lines) | stat: -rw-r--r-- 4,705 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
; Native: Shawn Jefferson, December 2005
; POSIX: Stefan Haubenthal, April 2008

                .include  "atari.inc"
                .export   _opendir, _readdir, _closedir
                .import   findfreeiocb, clriocb
                .import   __oserror, return0, __do_oserror
                .importzp ptr1, tmp1
.ifdef  DEFAULT_DEVICE
                .import __defdev
.endif


.proc   _opendir
                sta     ptr1
                stx     ptr1+1
                jsr     findfreeiocb
                beq     @iocbok
                bne     cioerr
@iocbok:        stx     diriocb
                jsr     clriocb
                ldx     diriocb
                ldy     #0              ; '.' -> "D:*.*"
                lda     (ptr1),y
                cmp     #'.'
                bne     @use_parm

; "." was given as parameter, use default device/dir

.ifdef DEFAULT_DEVICE
                ; construct a "Dn:*.*" like string from the default drive
                lda     __defdev+1
                sta     dddefdev+1      ; copy drive number (overwrite 2nd 'D')
                lda     #<dddefdev
                sta     ICBAL,x
                lda     #>dddefdev
                sta     ICBAH,x
                bne     @cont
.else
                lda     #<defdev
                sta     ICBAL,x
                lda     #>defdev
                sta     ICBAH,x
                bne     @cont
.endif

@use_parm:      lda     ptr1
                sta     ICBAL,x
                lda     ptr1+1
                sta     ICBAH,x

@cont:          lda     #OPEN
                sta     ICCOM,x
                lda     #OPNIN|DIRECT
                sta     ICAX1,x
                jsr     CIOV
                bmi     cioerr
                lda     #0
                sta     __oserror
                tax
                lda     diriocb
                rts
.endproc

cioerr:         sty     __oserror
                lda     #CLOSE
                sta     ICCOM,x
                jsr     CIOV            ; close IOCB again since open failed
                jmp     return0

.proc   _readdir
                tax
                lda     #GETREC
                sta     ICCOM,x
                lda     #<entry
                sta     ICBAL,x
                sta     ptr1
                lda     #>entry
                sta     ICBAH,x
                sta     ptr1+1
                lda     #DSCTSZ
                sta     ICBLL,x
                lda     #0
                sta     ICBLH,x
                jsr     CIOV
                bmi     cioerr
                ldy     #0              ; FREE SECTORS
                lda     (ptr1),y
                cmp     #'0'
                bcs     cioerr
                dey
@next:          iny                     ; remove trailing spaces
                iny
                iny
                lda     (ptr1),y
                dey
                dey
                sta     (ptr1),y
                cpy     #8
                bcs     @break
                cmp     #' '
                bne     @next

@break:         lda     #'.'            ; extension dot
                sta     (ptr1),y
                iny                     ; copy extension
                sty     tmp1
                ldy     #10
                lda     (ptr1),y
                cmp     #' '
                bne     @hasext

; no extension present: remove the trailing dot and be done
                ldy     tmp1
                dey
                bne     @done

@hasext:        jsr     copychar
                ldy     #13             ; d_type
                sta     (ptr1),y
                ldy     #11
                jsr     copychar
                ldy     #12
                jsr     copychar

@done:          lda     #0              ; end of string
                sta     (ptr1),y
                lda     ptr1
                ldx     ptr1+1
                rts


copychar:       lda     (ptr1),y        ; src=y dest=tmp1
                ldy     tmp1
                cmp     #' '
                beq     @break
                sta     (ptr1),y
                iny
                sty     tmp1
@break:         rts
.endproc

.proc   _closedir
                tax
                lda     #CLOSE
                sta     ICCOM,x
                jsr     CIOV
                bmi     @cioerr
                ldx     #0
                stx     __oserror               ; clear system specific error code
                txa
                rts
@cioerr:        jmp     __do_oserror
.endproc

                .data
.ifdef DEFAULT_DEVICE
dddefdev:       .byte   "D"
.endif
defdev:         .asciiz "D:*.*"

                .bss
diriocb:        .res    1
entry:          .res    DSCTSZ