;
; Christian Groessler, Dec-2001
;
; ucase_fn
; helper routine to convert a string (file name) to uppercase
; used by open.s and remove.s
;
; 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
;       tmp3 - amount of bytes used on the stack (needed for cleanup)
; Uses:
;       ptr4 - scratch pointer used to remember original AX pointer
;
;

        .include        "atari.inc"

.ifdef  DEFAULT_DEVICE
        .importzp tmp2
        .import __defdev
.endif
        .importzp tmp3,ptr4,sp
        .import subysp,addysp
        .export ucase_fn

.proc   ucase_fn

        ; we make sure that the filename doesn't contain lowercase letters
        ; we copy the filename we got onto the stack, uppercase it and use this
        ; one to open the iocb
        ; we're using tmp3, ptr4

        ; save the original pointer
        sta     ptr4
        stx     ptr4+1

.ifdef  DEFAULT_DEVICE
        lda     tmp2
        beq     hasdev          ; don't fiddle with device part
        ; bit #0 of tmp2 is used as an additional flag whether device name is present in passed string (1 = present, 0 = not present)
        ldy     #1
        inc     tmp2            ; initialize flag: device present
        lda     #':'
        cmp     (ptr4),y
        beq     hasdev
        iny
        cmp     (ptr4),y
        beq     hasdev
        dec     tmp2            ; set flag: no device in passed string
hasdev:
.endif

        ldy     #128
        sty     tmp3            ; save size
        jsr     subysp          ; make room on the stack

        ; copy filename to the temp. place on the stack, while uppercasing it
        ldy     #0

loop2:  lda     (ptr4),y
        sta     (sp),y
        beq     copy_end
        bmi     L1              ; Not lowercase (also, invalid, should reject)
        cmp     #'a'
        bcc     L1              ; Not lowercase
        and     #$DF            ; make upper case char, assume ASCII chars
        sta     (sp),y          ; store back
L1:
        iny
        bpl     loop2           ; bpl: this way we only support a max. length of 127

        ; Filename too long
        jsr     addysp          ; restore the stack
        sec                     ; indicate error
        rts

copy_end:

.ifdef  DEFAULT_DEVICE
        lda     #1
        bit     tmp2            ; is a device present in the string?
        bne     hasdev2         ; yes, don't prepend something
        bpl     hasdev2         ; check input parameter (tmp2 != $80)

        ldy     #128+3          ; no, prepend "Dn:" (__defdev)
        sty     tmp3            ; adjust stack size used
        ldy     #3
        jsr     subysp          ; adjust stack pointer
        dey
cpdev:  lda     __defdev,y
        sta     (sp),y          ; insert device name, number and ':'
        dey
        bpl     cpdev
hasdev2:
.endif

        ; leave A and X pointing to the modified filename
        lda     sp
        ldx     sp+1
        clc                     ; indicate success
        rts

.endproc
