; get arguments from command line (when DOS supports it)
-; and supply function to get default device: char *getdefdev(void);
; Freddy Offenga, 4/21/2000
-; SpartaDOS:
-; the ZCRNAME routine is only used to get the default drive because
-; ZCRNAME has two disadvantages:
-; 1. It will convert D: into D1: instead of Dn: (n = default drive)
-; 2. It will give a 'no arguments' status if it detects something
-; like Dn: (without filename).
-
-; OS/A+ DOS:
-; ZCRNAME is slightly different from SpartaDOS. It will convert D:
-; into Dn: where n is the default drive.
+; initmainargs is forcibly included by the C compiler if it encounters a
+; main() function with arguments. Therefore it isn't referenced by the
+; startup code but is nevertheless included in the compiled program when
+; needed.
MAXARGS = 16 ; max. amount of arguments in arg. table
CL_SIZE = 64 ; command line buffer size
SPACE = 32 ; SPACE char.
- .include "atari.inc"
- .export getargs, argc, argv
- .export _getdefdev ; get default device (e.g. "D1:")
- .importzp ptr1
+ .include "atari.inc"
+ .import __argc, __argv
+ .importzp ptr1
+ .import __dos_type
+ .constructor initmainargs,25
+; --------------------------------------------------------------------------
; Get command line
-getargs:
- lda #0
- sta argc
- sta argc+1
- sta argv
- sta argv+1
+.segment "INIT"
- jsr detect
- bcs argdos ; carry set = DOS supports arguments
- rts
+initmainargs:
+ lda #0
+ sta __argc
+ sta __argc+1
+ sta __argv
+ sta __argv+1
+
+ lda __dos_type ; which DOS?
+ cmp #ATARIDOS
+ beq nargdos ; DOS does not support arguments
+ cmp #MYDOS
+ bne argdos ; DOS supports arguments
+nargdos:rts
; Initialize ourcl buffer
argdos: lda #ATEOL
sta ourcl+CL_SIZE
-
+
; Move SpartaDOS command line to our own buffer
lda DOSVEC
movdon: lda #0
sta ourcl,y ; null terminate behind ATEOL
-; Get default device (LBUF will be destroyed!!)
-
- ldy #BUFOFF
- lda #0
- sta (DOSVEC),y ; reset buffer offset
-
-; Store dummy argument
-
- ldy #LBUF
- lda #'X'
- sta (DOSVEC),y
- iny
- lda #ATEOL
- sta (DOSVEC),y
-
-; One extra store to avoid the buggy sequence from OS/A+ DOS:
-; <D><RETURN><:> => drive number = <RETURN>
-
- iny
- sta (DOSVEC),y
-
-; Create crunch vector
-
- ldy #ZCRNAME+1
- lda (DOSVEC),y
- sta crvec+1
- iny
- lda (DOSVEC),y
- sta crvec+2
-
-crvec: jsr $FFFF ; will be set to crunch vector
-
-; Get default device
-
- ldy #COMFNAM ; COMFNAM is always "Dn:"
- lda (DOSVEC),y
- sta defdev
- iny
- lda (DOSVEC),y
- sta defdev+1
-
; Turn command line into argv table
- ldy #0
+ ;ldy #0
+ tay
eatspc: lda ourcl,y ; eat spaces
cmp #ATEOL
beq finargs
; Store argument vector
-rpar: lda argc ; low-byte
+rpar: lda __argc ; low-byte
asl
tax ; table index
tya ; ourcl index
lda #>ourcl
adc #0
sta argv+1,x
- ldx argc
+ ldx __argc
inx
- stx argc
+ stx __argc
cpx #MAXARGS
beq finargs
; Finish args
finargs:
- lda argc
- asl
+ lda __argc
+ asl
tax
lda #0
sta argv,x
sta argv+1,x
+ lda #<argv
+ ldx #>argv
+ sta __argv
+ stx __argv+1
rts
-; DOS type detection
-
-detect:
- lda DOS
- cmp #$53 ; "S" (SpartaDOS)
- beq spdos
-
- ldy #COMTAB
- lda #$4C
- cmp (DOSVEC),y
- bne nordos
-
- ldy #ZCRNAME
- cmp (DOSVEC),y
- bne nordos
-
- ldy #6 ; OS/A+ has a jmp here
- cmp (DOSVEC),y
- beq nordos
-
-spdos: sec ; SpartaDOS, OS/A+ or DOS XL
- rts
-
-nordos: clc ; normal DOS (no args) detected
- rts
-
-; Get default device (set by getargs routine)
-
-_getdefdev:
- lda #<defdev
- ldx #>defdev
- rts
-
- .data
-
-; Default device
-
-defdev:
- .byte "D1:", 0
+; --------------------------------------------------------------------------
+; Data
- .bss
+.bss
-argc: .res 2
argv: .res (1 + MAXARGS) * 2
; Buffer for command line / argv strings