]> git.sur5r.net Git - cc65/blob - libsrc/atari/sysrename.s
Minor clarification.
[cc65] / libsrc / atari / sysrename.s
1 ;
2 ; Christian Groessler, 2013-07-24
3 ;
4 ; unsigned char __fastcall__ _sysrename (const char* oldname, const char* newname);
5 ;
6
7         .include "atari.inc"
8         .import findfreeiocb
9         .importzp tmp4, sp, ptr2, ptr3
10         .import incsp2, subysp, addysp, popax
11 .ifdef  UCASE_FILENAME
12         .importzp tmp3
13         .import ucase_fn
14 .ifdef  DEFAULT_DEVICE
15         .importzp tmp2
16 .endif
17 .endif
18         .export __sysrename
19
20 .proc   __sysrename
21
22         pha                     ; save input parameter
23         txa
24         pha
25
26         jsr     findfreeiocb
27         beq     iocbok          ; we found one
28
29         pla
30         pla                     ; fix up stack
31         jsr     incsp2
32
33         lda     #TMOF           ; too many open files
34         rts
35
36 iocbok: stx     tmp4            ; remember IOCB index
37
38         pla
39         sta     ptr2+1          ; remember newname
40         pla
41         sta     ptr2            ; ditto.
42
43         jsr     popax           ; get oldname
44
45         ldy     #0
46         sty     sspc+1          ; initialize stack space
47
48 .ifdef  UCASE_FILENAME
49
50 ; uppercase first (old) name and prepend device if needed
51
52 .ifdef  DEFAULT_DEVICE
53         ldy     #$80
54         sty     tmp2            ; set flag for ucase_fn
55 .endif
56         jsr     ucase_fn
57         bcc     ucok1
58
59         lda     #183            ; see oserror.s
60         rts
61
62 ucok1:  sta     ptr3
63         stx     ptr3+1          ; remember pointer to uppercased old name
64         lda     tmp3            ; # of bytes reserved on the stack
65         sta     sspc            ; remember...
66
67 ; uppercase second (new) name and don't prepend device
68
69 .ifdef  DEFAULT_DEVICE
70         ldy     #0
71         sty     tmp2            ; set flag for ucase_fn
72 .endif
73         lda     ptr2
74         ldx     ptr2+1
75
76         jsr     ucase_fn
77         bcc     ucok2
78
79         ldy     tmp3            ; get size
80         jsr     addysp          ; free used space on the stack
81         lda     #183            ; see oserror.s
82         rts
83
84 ucok2:  sta     ptr2            ; remember pointer to uppercased new name
85         stx     ptr2+1
86
87 ; update sspc -- # of bytes used on the stack
88
89         lda     sspc
90         clc
91         adc     tmp3
92         sta     sspc
93         bcc     ukok4
94         inc     sspc+1
95 ukok4:
96
97 .else
98
99         sta     ptr3
100         stx     ptr3+1
101         sty     sspc
102
103 .endif
104
105 ; create a string on the stack with the old filename and the new filename separated by an invalid character (space in our case)
106 ; ptr2 - pointer to new name
107 ; ptr3 - pointer to old name
108
109         lda     #128
110         tay
111         clc
112         adc     sspc
113         sta     sspc
114         bcc     L1
115         inc     sspc+1
116 L1:     jsr     subysp          ; make room on the stack
117
118 ; copy old name
119         ldy     #0
120 con:    lda     (ptr3),y
121         sta     (sp),y
122         beq     copyend
123         iny
124         bne     con
125
126 copyend:lda     #$20            ; space
127         sta     (sp),y
128         iny
129         tya                     ; get current offset (beyond old name)
130         clc
131         adc     sp
132         sta     ptr3
133         lda     sp+1
134         adc     #0
135         sta     ptr3+1          ; ptr3 now contains pointer to space for new filename
136
137 ; copy new name
138         ldy     #0
139 cnn:    lda     (ptr2),y
140         sta     (ptr3),y
141         beq     copend2
142         iny
143         bne     cnn
144
145 copend2:ldx     tmp4
146         lda     sp
147         sta     ICBAL,x
148         lda     sp+1
149         sta     ICBAH,x
150         lda     #RENAME
151         sta     ICCOM,x
152         lda     #0
153         sta     ICAX1,x
154         sta     ICAX2,x
155         sta     ICBLL,x
156         sta     ICBLH,x
157         jsr     CIOV
158         tya
159         pha
160
161 ; clean up stack
162
163         lda     sp
164         clc
165         adc     sspc
166         sta     sp
167         lda     sp+1
168         adc     sspc+1
169         sta     sp+1
170
171 ; handle status
172
173         pla
174         tay
175         bmi     cioerr
176         lda     #0
177         rts
178 cioerr: tya
179         rts
180
181 .endproc        ; __sysrename
182
183         .bss
184
185 sspc:   .res    2               ; stack space used