; 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 _strupr,subysp
+ .import subysp,addysp
.export ucase_fn
-ucase_fn: .proc
+.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
sta ptr4
stx ptr4+1
- ; now we need the length of the name
- ldy #0
-loop: lda (ptr4),y
- beq str_end
- cmp #ATEOL ; we also accept Atari EOF char as end of string
- beq str_end
+.ifdef DEFAULT_DEVICE
+ ldy #1
+ sty tmp2 ; initialize flag: device present in passed string
+ lda #':'
+ cmp (ptr4),y
+ beq hasdev
iny
- bne loop ; not longer than 255 chars (127 real limit)
-toolong:sec ; indicate error
- rts
+ cmp (ptr4),y
+ beq hasdev
+ sta tmp2 ; set flag: no device in passed string
+hasdev:
+.endif
-str_end:iny ; room for terminating zero
- cpy #128 ; we only can handle lenght < 128
- bcs toolong
+ ldy #128
sty tmp3 ; save size
jsr subysp ; make room on the stack
- ; copy filename to the temp. place on the stack
- lda #0 ; end-of-string
- sta (sp),y ; Y still contains length + 1
- dey
+ ; copy filename to the temp. place on the stack, also uppercasing it
+ ldy #0
+
loop2: lda (ptr4),y
sta (sp),y
- dey
+ 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
- ; uppercase the temp. filename
- ldx sp+1
- lda sp
- jsr _strupr
+ ; Filename too long
+ jsr addysp ; restore the stack
+ sec ; indicate error
+ rts
+
+copy_end:
+
+.ifdef DEFAULT_DEVICE
+ lda tmp2
+ cmp #1 ; was device present in passed string?
+ beq hasdev2 ; yes, don't prepend something
+
+ ldy #128+3 ; no, prepend "D:" (or other device)
+ 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 X and Y pointing to the modified filename
+ ; leave A and X pointing to the modified filename
lda sp
ldx sp+1
clc ; indicate success
rts
-ucase_fn: .endproc
+.endproc