mirror of
https://github.com/cc65/cc65.git
synced 2024-11-18 00:07:21 +00:00
148 lines
3.2 KiB
ArmAsm
148 lines
3.2 KiB
ArmAsm
; get arguments from command line (when DOS supports it)
|
|
|
|
; Freddy Offenga, 4/21/2000
|
|
|
|
; 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.
|
|
|
|
; 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.
|
|
|
|
.include "atari.inc"
|
|
.import __argc, __argv
|
|
.importzp ptr1
|
|
.import __dos_type
|
|
.constructor initmainargs, 25
|
|
|
|
; --------------------------------------------------------------------------
|
|
; Get command line
|
|
|
|
.segment "ONCE"
|
|
|
|
nargdos:rts
|
|
|
|
initmainargs:
|
|
lda __dos_type ; which DOS?
|
|
cmp #MAX_DOS_WITH_CMDLINE + 1
|
|
bcs nargdos
|
|
|
|
; Initialize ourcl buffer
|
|
|
|
argdos: ldy #ATEOL
|
|
sty ourcl+CL_SIZE
|
|
|
|
; Move SpartaDOS/XDOS command line to our own buffer
|
|
|
|
cmp #XDOS
|
|
bne sparta
|
|
|
|
lda #<XLINE
|
|
sta ptr1
|
|
lda #>XLINE
|
|
sta ptr1+1
|
|
bne cpcl0
|
|
|
|
sparta: lda DOSVEC
|
|
clc
|
|
adc #<LBUF
|
|
sta ptr1
|
|
lda DOSVEC+1
|
|
adc #>LBUF
|
|
sta ptr1+1
|
|
|
|
cpcl0: 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
|
|
|
|
; Turn command line into argv table
|
|
|
|
;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
|
|
|
|
; Skip this arg.
|
|
|
|
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
|
|
|
|
; Finish args
|
|
|
|
finargs:
|
|
lda __argc
|
|
asl
|
|
tax
|
|
lda #0
|
|
sta argv,x
|
|
sta argv+1,x
|
|
lda #<argv
|
|
ldx #>argv
|
|
sta __argv
|
|
stx __argv+1
|
|
rts
|
|
|
|
; --------------------------------------------------------------------------
|
|
; Data
|
|
|
|
.segment "INIT"
|
|
|
|
argv: .res (1 + MAXARGS) * 2
|
|
|
|
; Buffer for command line / argv strings
|
|
|
|
ourcl: .res CL_SIZE+1
|