1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-03 10:07:02 +00:00
cc65/libsrc/geos-common/system/mainargs.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

78 lines
1.6 KiB
ArmAsm

;
; Ullrich von Bassewitz, 2003-03-07
; Maciej Witkowiak, 2003-05-02
;
; Setup arguments for main
;
; There is always either 1 or 3 arguments:
; <program name>, 0
; or
; <program name>, <data file name>, <data disk name>, 0
; the 2nd case is when using DeskTop user drags an icon of a file and drops it
; on icon of your application
;
.constructor initmainargs, 24
.import __argc, __argv
.include "const.inc"
.include "geossym.inc"
.segment "ONCE"
; Setup arguments for main
initmainargs:
; Setup a pointer to our argv vector
lda #<argv
sta __argv
lda #>argv
sta __argv+1
; Copy program name
ldy #0
@fn_loop:
lda dirEntryBuf+OFF_FNAME,y
.ifdef __GEOS_CBM__
cmp #$a0
.else
cmp #0
.endif
beq @fn_end
sta argv0,y
iny
cpy #16+1
bne @fn_loop
@fn_end:
lda #0
sta argv0,y
sta __argc+1
; Check if there are any more arguments
lda dataFileName
bne @threeargs
ldx #0 ; no dataFileName - NULL the 2nd argument
stx argv+2
stx argv+3
inx ; there is only one argument
bne @setargc
@threeargs:
ldx #3 ; there are three arguments
@setargc:
stx __argc
rts
.data
argv:
.word argv0 ; Pointer to program name
.word dataFileName ; dataFileName or NULL if last one
.word dataDiskName ; dataDiskName
.word $0000 ; last one must be NULL
.segment "INIT"
argv0:
.res 17 ; Program name