]> git.sur5r.net Git - cc65/blob - libsrc/atari/sysrename.s
rename libsrc/atari/tvtype.s to libsrc/atari/get_tv.s
[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 .ifndef  UCASE_FILENAME
49
50         sta     ptr3
51         stx     ptr3+1
52         sty     sspc
53
54 .else
55
56 ; uppercase first (old) name and prepend device if needed
57
58 .ifdef  DEFAULT_DEVICE
59         ldy     #$80
60         sty     tmp2            ; set flag for ucase_fn
61 .endif
62         jsr     ucase_fn
63         bcc     ucok1
64
65         lda     #183            ; see oserror.s
66         rts
67
68 ucok1:  sta     ptr3
69         stx     ptr3+1          ; remember pointer to uppercased old name
70         lda     tmp3            ; # of bytes reserved on the stack
71         sta     sspc            ; remember...
72
73 ; uppercase second (new) name and don't prepend device
74
75 .ifdef  DEFAULT_DEVICE
76         ldy     #0
77         sty     tmp2            ; set flag for ucase_fn
78 .endif
79         lda     ptr2
80         ldx     ptr2+1
81
82         jsr     ucase_fn
83         bcc     ucok2
84
85         ldy     tmp3            ; get size
86         jsr     addysp          ; free used space on the stack
87         lda     #183            ; see oserror.s
88         rts
89
90 ucok2:  sta     ptr2            ; remember pointer to uppercased new name
91         stx     ptr2+1
92
93 ; update sspc -- # of bytes used on the stack
94
95         lda     sspc
96         clc
97         adc     tmp3
98         sta     sspc
99         bcc     ukok4
100         inc     sspc+1
101 ukok4:
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