diff --git a/libsrc/atari/open.s b/libsrc/atari/open.s index 306cf52c2..2188257cb 100644 --- a/libsrc/atari/open.s +++ b/libsrc/atari/open.s @@ -91,7 +91,10 @@ cont: ldy #3 jsr ldaxysp .ifdef UCASE_FILENAME - +.ifdef DEFAULT_DEVICE + ldy #$80 + sty tmp2 ; set flag for ucase_fn +.endif jsr ucase_fn bcc ucok1 invret: lda #<EINVAL ; file name is too long diff --git a/libsrc/atari/syschdir.s b/libsrc/atari/syschdir.s index 16cb3a1fe..d57708384 100644 --- a/libsrc/atari/syschdir.s +++ b/libsrc/atari/syschdir.s @@ -15,6 +15,9 @@ .importzp tmp3 .import addysp .import ucase_fn +.ifdef DEFAULT_DEVICE + .importzp tmp2 +.endif .endif .export __syschdir @@ -40,6 +43,10 @@ iocbok: stx tmp4 ; remember IOCB index .ifdef UCASE_FILENAME +.ifdef DEFAULT_DEVICE + ldy #$80 + sty tmp2 ; set flag for ucase_fn +.endif jsr ucase_fn bcc ucok1 diff --git a/libsrc/atari/sysmkdir.s b/libsrc/atari/sysmkdir.s index 56a068757..cc1b3e2bf 100644 --- a/libsrc/atari/sysmkdir.s +++ b/libsrc/atari/sysmkdir.s @@ -15,6 +15,9 @@ .ifdef UCASE_FILENAME .importzp tmp3 .import ucase_fn +.ifdef DEFAULT_DEVICE + .importzp tmp2 +.endif .endif .export __sysmkdir @@ -46,6 +49,10 @@ iocbok: stx tmp4 ; remember IOCB index .ifdef UCASE_FILENAME +.ifdef DEFAULT_DEVICE + ldy #$80 + sty tmp2 ; set flag for ucase_fn +.endif jsr ucase_fn bcc ucok1 diff --git a/libsrc/atari/sysremove.s b/libsrc/atari/sysremove.s index 1e7b4760f..15bc19e1c 100644 --- a/libsrc/atari/sysremove.s +++ b/libsrc/atari/sysremove.s @@ -12,6 +12,9 @@ .importzp tmp3 .import addysp .import ucase_fn +.ifdef DEFAULT_DEVICE + .importzp tmp2 +.endif .endif .export __sysremove @@ -37,6 +40,10 @@ iocbok: stx tmp4 ; remember IOCB index .ifdef UCASE_FILENAME +.ifdef DEFAULT_DEVICE + ldy #$80 + sty tmp2 ; set flag for ucase_fn +.endif jsr ucase_fn bcc ucok1 diff --git a/libsrc/atari/sysrename.s b/libsrc/atari/sysrename.s new file mode 100644 index 000000000..fef18bded --- /dev/null +++ b/libsrc/atari/sysrename.s @@ -0,0 +1,185 @@ +; +; Christian Groessler, 2013-07-24 +; +; unsigned char __fastcall__ _sysrename (const char* oldname, const char* newname); +; + + .include "atari.inc" + .import findfreeiocb + .importzp tmp4, sp, ptr2, ptr3 + .import incsp2, subysp, addysp, popax +.ifdef UCASE_FILENAME + .importzp tmp3 + .import ucase_fn +.ifdef DEFAULT_DEVICE + .importzp tmp2 +.endif +.endif + .export __sysrename + +.proc __sysrename + + pha ; save input parameter + txa + pha + + jsr findfreeiocb + beq iocbok ; we found one + + pla + pla ; fix up stack + jsr incsp2 + + lda #TMOF ; too many open files + rts + +iocbok: stx tmp4 ; remember IOCB index + + pla + sta ptr2+1 ; remember newname + pla + sta ptr2 ; ditto. + + jsr popax ; get oldname + + ldy #0 + sty sspc+1 ; initialize stack space + +.ifndef UCASE_FILENAME + + sta ptr3 + stx ptr3+1 + sty sspc + +.else + +; uppercase first (old) name and prepend device if needed + +.ifdef DEFAULT_DEVICE + ldy #$80 + sty tmp2 ; set flag for ucase_fn +.endif + jsr ucase_fn + bcc ucok1 + + lda #183 ; see oserror.s + rts + +ucok1: sta ptr3 + stx ptr3+1 ; remember pointer to uppercased old name + lda tmp3 ; # of bytes reserved on the stack + sta sspc ; remember... + +; uppercase second (new) name and don't prepend device + +.ifdef DEFAULT_DEVICE + ldy #0 + sty tmp2 ; set flag for ucase_fn +.endif + lda ptr2 + ldx ptr2+1 + + jsr ucase_fn + bcc ucok2 + + ldy tmp3 ; get size + jsr addysp ; free used space on the stack + lda #183 ; see oserror.s + rts + +ucok2: sta ptr2 ; remember pointer to uppercased new name + stx ptr2+1 + +; update sspc -- # of bytes used on the stack + + lda sspc + clc + adc tmp3 + sta sspc + bcc ukok4 + inc sspc+1 +ukok4: + +.endif + +; create a string on the stack with the old filename and the new filename separated by an invalid character (space in our case) +; ptr2 - pointer to new name +; ptr3 - pointer to old name + + lda #128 + tay + clc + adc sspc + sta sspc + bcc L1 + inc sspc+1 +L1: jsr subysp ; make room on the stack + +; copy old name + ldy #0 +con: lda (ptr3),y + sta (sp),y + beq copyend + iny + bne con + +copyend:lda #$20 ; space + sta (sp),y + iny + tya ; get current offset (beyond old name) + clc + adc sp + sta ptr3 + lda sp+1 + adc #0 + sta ptr3+1 ; ptr3 now contains pointer to space for new filename + +; copy new name + ldy #0 +cnn: lda (ptr2),y + sta (ptr3),y + beq copend2 + iny + bne cnn + +copend2:ldx tmp4 + lda sp + sta ICBAL,x + lda sp+1 + sta ICBAH,x + lda #RENAME + sta ICCOM,x + lda #0 + sta ICAX1,x + sta ICAX2,x + sta ICBLL,x + sta ICBLH,x + jsr CIOV + tya + pha + +; clean up stack + + lda sp + clc + adc sspc + sta sp + lda sp+1 + adc sspc+1 + sta sp+1 + +; handle status + + pla + tay + bmi cioerr + lda #0 + rts +cioerr: tya + rts + +.endproc ; __sysrename + + .bss + +sspc: .res 2 ; stack space used diff --git a/libsrc/atari/sysrmdir.s b/libsrc/atari/sysrmdir.s index 2a2b160c1..126c11cca 100644 --- a/libsrc/atari/sysrmdir.s +++ b/libsrc/atari/sysrmdir.s @@ -12,12 +12,17 @@ .export __sysrmdir .import __sysremove .import __dos_type - .import ucase_fn .import findfreeiocb + .importzp tmp4 +.ifdef UCASE_FILENAME + .import ucase_fn .import addysp .importzp sreg .importzp tmp3 - .importzp tmp4 +.ifdef DEFAULT_DEVICE + .importzp tmp2 +.endif +.endif .proc __sysrmdir @@ -53,6 +58,10 @@ do_sparta: .ifdef UCASE_FILENAME +.ifdef DEFAULT_DEVICE + ldy #$80 + sty tmp2 ; set flag for ucase_fn +.endif jsr ucase_fn bcc ucok1 diff --git a/libsrc/atari/ucase_fn.s b/libsrc/atari/ucase_fn.s index a32ddce23..e53750e29 100644 --- a/libsrc/atari/ucase_fn.s +++ b/libsrc/atari/ucase_fn.s @@ -7,6 +7,8 @@ ; ; Calling parameters: ; AX - points to filename +; tmp2 - 0/$80 for don't/do prepend default device if no device +; is present in the passed string (only .ifdef DEFAULT_DEVICE) ; Return parameters: ; C - 0/1 for OK/Error (filename too long) ; AX - points to uppercased version of the filename on the stack @@ -38,15 +40,16 @@ stx ptr4+1 .ifdef DEFAULT_DEVICE + ; bit #0 of tmp2 is used as a flag whether device name is present in passed string (1 = present, 0 = not present) ldy #1 - sty tmp2 ; initialize flag: device present in passed string + inc tmp2 ; initialize flag: device present lda #':' cmp (ptr4),y beq hasdev iny cmp (ptr4),y beq hasdev - sta tmp2 ; set flag: no device in passed string + dec tmp2 ; set flag: no device in passed string hasdev: .endif @@ -54,7 +57,7 @@ hasdev: sty tmp3 ; save size jsr subysp ; make room on the stack - ; copy filename to the temp. place on the stack, also uppercasing it + ; copy filename to the temp. place on the stack, while uppercasing it ldy #0 loop2: lda (ptr4),y @@ -77,9 +80,10 @@ L1: copy_end: .ifdef DEFAULT_DEVICE - lda tmp2 - cmp #1 ; was device present in passed string? - beq hasdev2 ; yes, don't prepend something + lda #1 + bit tmp2 + bne hasdev2 ; yes, don't prepend something + bpl hasdev2 ldy #128+3 ; no, prepend "D:" (or other device) sty tmp3 ; adjust stack size used