; ; Startup code for cc65 (ATARI version) ; ; Contributing authors: ; Mark Keates ; Freddy Offenga ; Christian Groessler ; ; This must be the *first* file on the linker command line ; .export _exit .constructor initsp,26 .import getargs, argc, argv .import initlib, donelib .import zerobss, pushax .import _main,__filetab,getfd .import __CODE_LOAD__, __BSS_LOAD__ .include "zeropage.inc" .include "atari.inc" .include "_file.inc" ; ------------------------------------------------------------------------ ; EXE header .segment "EXEHDR" .word $FFFF .word __CODE_LOAD__ .word __BSS_LOAD__ - 1 ; ------------------------------------------------------------------------ ; Actual code .code rts ; fix for SpartaDOS / OS/A+ ; they first call the entry point from AUTOSTRT and ; then the load addess (this rts here). ; We point AUTOSTRT directly after the rts. ; Real entry point: ; Save the zero page locations we need ldx #zpspace-1 L1: lda sp,x sta zpsave,x dex bpl L1 ; Clear the BSS data jsr zerobss ; setup the stack tsx stx spsave ; report memory usage lda APPMHI sta appmsav ; remember old APPMHI value lda APPMHI+1 sta appmsav+1 lda MEMTOP sta APPMHI ; initialize our APPMHI value ldx MEMTOP+1 stx APPMHI+1 ; Call module constructors jsr initlib ; set left margin to 0 lda LMARGN sta old_lmargin lda #0 sta LMARGN ; set keyb to upper/lowercase mode ldx SHFLOK stx old_shflok sta SHFLOK ; Initialize conio stuff lda #$FF sta CH ; set stdio stream handles lda #0 jsr getfd sta __filetab + (0 * _FILE_size) ; setup stdin lda #0 jsr getfd sta __filetab + (1 * _FILE_size) ; setup stdout lda #0 jsr getfd sta __filetab + (2 * _FILE_size) ; setup stderr ; Pass command line if present jsr getargs lda argc ldx argc+1 jsr pushax ; argc lda #argv jsr pushax ; argv ldy #4 ; Argument size jsr _main ; call the users code ; Call module destructors. This is also the _exit entry. _exit: jsr donelib ; Run module destructors ; Restore system stuff ldx spsave txs ; Restore stack pointer ; restore left margin lda old_lmargin sta LMARGN ; restore kb mode lda old_shflok sta SHFLOK ; restore APPMHI lda appmsav sta APPMHI lda appmsav+1 sta APPMHI+1 ; Copy back the zero page stuff ldx #zpspace-1 L2: lda zpsave,x sta sp,x dex bpl L2 ; turn on cursor inx stx CRSINH ; Back to DOS rts ; *** end of main startup code ; setup sp initsp: lda APPMHI sta sp lda APPMHI+1 sta sp+1 rts .data zpsave: .res zpspace .bss spsave: .res 1 appmsav: .res 1 old_shflok: .res 1 old_lmargin: .res 1 .segment "AUTOSTRT" .word $02E0 .word $02E1 .word __CODE_LOAD__ + 1