2 ; Startup code for cc65 (PCEngine version)
4 ; by Groepaz/Hitmen <groepaz@gmx.net>
5 ; based on code by Ullrich von Bassewitz <uz@cc65.org>
7 ; This must be the *first* file on the linker command line
11 .export __STARTUP__ : absolute = 1 ; Mark as startup
12 .import initlib, donelib
13 .import push0, _main, zerobss
15 .import tmp1,tmp2,tmp3
17 .import __RAM_START__, __RAM_SIZE__ ; Linker generated
18 ;; .import __SRAM_START__, __SRAM_SIZE__ ; Linker generated
19 .import __ROM0_START__, __ROM0_SIZE__ ; Linker generated
20 .import __ROM_START__, __ROM_SIZE__ ; Linker generated
21 .import __STARTUP_LOAD__,__STARTUP_RUN__, __STARTUP_SIZE__ ; Linker generated
22 .import __CODE_LOAD__,__CODE_RUN__, __CODE_SIZE__ ; Linker generated
23 .import __RODATA_LOAD__,__RODATA_RUN__, __RODATA_SIZE__ ; Linker generated
24 .import __DATA_LOAD__,__DATA_RUN__, __DATA_SIZE__ ; Linker generated
27 .include "pcengine.inc"
32 ; ------------------------------------------------------------------------
33 ; Create an empty LOWCODE segment to avoid linker warnings
37 ; ------------------------------------------------------------------------
38 ; Place the startup code in a special segment.
44 ; setup the CPU and System-IRQ
55 ; Setup stack and memory mapping
56 ldx #$FF ; Stack top ($21FF)
59 tam #0 ; 0000-1FFF = Hardware page
62 tam #1 ; 2000-3FFF = Work RAM
65 tam #2 ; 4000-5FFF = Save RAM
68 tam #3 ; 6000-7FFF Page 2
70 tam #4 ; 8000-9FFF Page 3
72 tam #5 ; A000-BFFF Page 4
74 tam #6 ; C000-DFFF Page 5
77 stz TIMER_COUNT ; Timer off
79 sta IRQ_MASK ; Interrupts off
80 stz IRQ_STATUS ; Acknowledge timer
84 tii $2000, $2001, $1FFF
86 ;; i dont know why the heck this one doesnt
87 ;; work when called from a constructor :/
92 ; Turn on background and VD interrupt/IRQ1
94 sta IRQ_MASK ; IRQ1=on
101 ; Copy the .data segment to RAM
103 lda #<(__DATA_LOAD__)
104 ;;lda #<(__ROM0_START__ + __STARTUP_SIZE__+ __CODE_SIZE__+ __RODATA_SIZE__)
105 ;;lda #<(__ROM_START__ + __CODE_SIZE__+ __RODATA_SIZE__)
107 lda #>(__DATA_LOAD__)
108 ;;lda #>(__ROM_START__ + __CODE_SIZE__+ __RODATA_SIZE__)
111 ;;lda #<(__SRAM_START__)
114 ;;lda #>(__SRAM_START__)
117 ldx #>(__DATA_SIZE__)
120 beq @s1 ; no more full pages
136 ; copy remaining bytes
145 cpy #<(__DATA_SIZE__)
150 ; lda #<(__RAM_START__ + __DATA_SIZE__ + __BSS_SIZE__)
151 lda #<(__RAM_START__+__RAM_SIZE__)
153 ; lda #>(__RAM_START__ + __DATA_SIZE__ + __BSS_SIZE__)
154 lda #>(__RAM_START__+__RAM_SIZE__)
155 sta sp+1 ; Set argument stack ptr
162 ; Call module constructors
167 ; Pass an empty command line
175 ldy #4 ; Argument size
176 jsr _main ; call the users code
178 ; Call module destructors. This is also the _exit entry.
181 jsr donelib ; Run module destructors
187 ; ------------------------------------------------------------------------
188 ; System V-Blank Interupt
189 ; ------------------------------------------------------------------------
202 ; Acknowlege interrupt
221 ; ------------------------------------------------------------------------
223 ; ------------------------------------------------------------------------
227 .word _irq2 ; $fff6 IRQ2 (External IRQ, BRK)
228 .word _irq1 ; $fff8 IRQ1 (VDC)
229 .word _timer ; $fffa Timer
230 .word _nmi ; $fffc NMI
231 .word start ; $fffe reset