1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-05 06:28:57 +00:00
cc65/libsrc/atari/crt0.s
uz 8216bf1d6a Force an import of the special symbol __STARTUP__ in the C compiler when
main() is encountered. Define this symbol in the startup code. This will
automatically force linking of the startup code which can then reside inside
the standard library as any other object file.


git-svn-id: svn://svn.cc65.org/cc65/trunk@3988 b7a2c559-68d2-44c3-8de9-860c34a00d81
2009-07-31 12:05:42 +00:00

191 lines
2.8 KiB
ArmAsm

;
; Startup code for cc65 (ATARI version)
;
; Contributing authors:
; Mark Keates
; Freddy Offenga
; Christian Groessler
;
.export _exit
.export __STARTUP__ : absolute = 1 ; Mark as startup
.constructor initsp, 26
.import initlib, donelib, callmain
.import zerobss, pushax
.import _main, __filetab, getfd
.import __LOWCODE_LOAD__, __ZPSAVE_LOAD__
.import __RESERVED_MEMORY__
.ifdef DYNAMIC_DD
.import __getdefdev
.endif
.include "zeropage.inc"
.include "atari.inc"
.include "_file.inc"
; ------------------------------------------------------------------------
; EXE header
.segment "EXEHDR"
.word $FFFF
.word __LOWCODE_LOAD__
.word __ZPSAVE_LOAD__ - 1
; ------------------------------------------------------------------------
; Actual code
.segment "LOWCODE"
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
sec
lda MEMTOP
sbc #<__RESERVED_MEMORY__
sta APPMHI ; initialize our APPMHI value
lda MEMTOP+1
sbc #>__RESERVED_MEMORY__
sta APPMHI+1
; Call module constructors
jsr initlib
.ifdef DYNAMIC_DD
jsr __getdefdev
.endif
; 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 * .sizeof(_FILE)); setup stdin
lda #0
jsr getfd
sta __filetab + (1 * .sizeof(_FILE)); setup stdout
lda #0
jsr getfd
sta __filetab + (2 * .sizeof(_FILE)); setup stderr
; Push arguments and call main
jsr callmain
; 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
.segment "INIT"
initsp:
lda APPMHI
sta sp
lda APPMHI+1
sta sp+1
rts
.segment "ZPSAVE"
zpsave: .res zpspace
.bss
spsave: .res 1
appmsav: .res 1
old_shflok: .res 1
old_lmargin: .res 1
.segment "AUTOSTRT"
.word RUNAD
.word RUNAD+1
.word __LOWCODE_LOAD__ + 1