; 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).
+; 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.
-; OS/A+ DOS:
-; ZCRNAME is slightly different from SpartaDOS. It will convert D:
-; into Dn: where n is the default drive.
+; XDOS support added 05/2016 by Christian Groessler
-MAXARGS = 16 ; max. amount of arguments in arg. table
-CL_SIZE = 64 ; command line buffer size
-SPACE = 32 ; SPACE char.
+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 "ONCE"
- jsr detect
- bcs argdos ; carry set = DOS supports arguments
- rts
+nargdos:rts
-; Initialize ourcl buffer
-
-argdos: lda #ATEOL
- sta ourcl+CL_SIZE
-
-; Move SpartaDOS command line to our own buffer
-
- lda DOSVEC
- clc
- adc #<LBUF
- sta ptr1
- lda DOSVEC+1
- adc #>LBUF
- sta ptr1+1
-
- ldy #0
-cpcl: lda (ptr1),y
- sta ourcl,y
- iny
- cmp #ATEOL
- beq movdon
- cpy #CL_SIZE
- bne cpcl
-
-movdon: lda #0
- sta ourcl,y ; null terminate behind ATEOL
+initmainargs:
+ lda __dos_type ; which DOS?
+ cmp #MAX_DOS_WITH_CMDLINE + 1
+ bcs nargdos
-; 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
+; Initialize ourcl buffer
-; One extra store to avoid the buggy sequence from OS/A+ DOS:
-; <D><RETURN><:> => drive number = <RETURN>
+argdos: ldy #ATEOL
+ sty ourcl+CL_SIZE
- iny
- sta (DOSVEC),y
+; Move SpartaDOS/XDOS command line to our own buffer
-; Create crunch vector
+ cmp #XDOS
+ bne sparta
- ldy #ZCRNAME+1
- lda (DOSVEC),y
- sta crvec+1
- iny
- lda (DOSVEC),y
- sta crvec+2
+ lda #<XLINE
+ sta ptr1
+ lda #>XLINE
+ sta ptr1+1
+ bne cpcl0
-crvec: jsr $FFFF ; will be set to crunch vector
+sparta: lda DOSVEC
+ clc
+ adc #<LBUF
+ sta ptr1
+ lda DOSVEC+1
+ adc #>LBUF
+ sta ptr1+1
-; Get default device
+cpcl0: ldy #0
+cpcl: lda (ptr1),y
+ sta ourcl,y
+ iny
+ cmp #ATEOL
+ beq movdon
+ cpy #CL_SIZE
+ bne cpcl
- ldy #COMFNAM ; COMFNAM is always "Dn:"
- lda (DOSVEC),y
- sta defdev
- iny
- lda (DOSVEC),y
- sta defdev+1
+movdon: lda #0
+ sta ourcl,y ; null terminate behind ATEOL
; Turn command line into argv table
- ldy #0
-eatspc: lda ourcl,y ; eat spaces
- cmp #ATEOL
- beq finargs
- cmp #SPACE
- bne rpar ; begin of argument found
- iny
- cpy #CL_SIZE
- bne eatspc
- beq finargs ; only spaces is no argument
+ ;ldy #0
+ tay
+eatspc: lda ourcl,y ; eat spaces
+ cmp #ATEOL
+ beq finargs
+ cmp #SPACE
+ bne rpar ; begin of argument found
+ iny
+ cpy #CL_SIZE
+ bne eatspc
+ beq finargs ; only spaces is no argument
; Store argument vector
-rpar: lda argc ; low-byte
- asl
- tax ; table index
- tya ; ourcl index
- clc
- adc #<ourcl
- sta argv,x
- lda #>ourcl
- adc #0
- sta argv+1,x
- ldx argc
- inx
- stx argc
- cpx #MAXARGS
- beq finargs
+rpar: lda __argc ; low-byte
+ asl
+ tax ; table index
+ tya ; ourcl index
+ clc
+ adc #<ourcl
+ sta argv,x
+ lda #>ourcl
+ adc #0
+ sta argv+1,x
+ ldx __argc
+ inx
+ stx __argc
+ cpx #MAXARGS
+ beq finargs
; Skip this arg.
skiparg:
- ldx ourcl,y
- cpx #ATEOL ; end of line?
- beq eopar
- cpx #SPACE
- beq eopar
- iny
- cpy #CL_SIZE
- bne skiparg
+ ldx ourcl,y
+ cpx #ATEOL ; end of line?
+ beq eopar
+ cpx #SPACE
+ beq eopar
+ iny
+ cpy #CL_SIZE
+ bne skiparg
; End of arg. -> place 0
eopar:
- lda #0
- sta ourcl,y
- iny ; y behind arg.
- cpx #ATEOL ; was it the last arg?
- bne eatspc
+ lda #0
+ sta ourcl,y
+ iny ; y behind arg.
+ cpx #ATEOL ; was it the last arg?
+ bne eatspc
; Finish args
finargs:
- lda argc
- asl
- tax
- lda #0
- sta argv,x
- sta argv+1,x
- 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
+ lda __argc
+ asl
+ tax
+ lda #0
+ sta argv,x
+ sta argv+1,x
+ lda #<argv
+ ldx #>argv
+ sta __argv
+ stx __argv+1
+ rts
-defdev:
- .byte "D1:", 0
+; --------------------------------------------------------------------------
+; Data
- .bss
+.segment "INIT"
-argc: .res 2
-argv: .res (1 + MAXARGS) * 2
+argv: .res (1 + MAXARGS) * 2
; Buffer for command line / argv strings
-ourcl: .res CL_SIZE+1
+ourcl: .res CL_SIZE+1