1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-07 07:29:33 +00:00
cc65/libsrc/atari/getargs.s
Oliver Schmidt 1d1ba3ed3b Adjusted constructors.
The constructors are _NOT_ allowed anymore to access the BSS. Rather they must use the DATA segment or the INIT segment. The latter isn't cleared at any point so the constructors may use it to expose values to the main program. However they must make sure to always write the values as they are not pre-initialized.
2016-03-16 16:28:32 +01:00

138 lines
3.1 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.
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"
initmainargs:
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
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
; 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