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
50 csh ; set high speed CPU mode
55 ; Setup stack and memory mapping
56 ldx #$FF ; Stack top ($21FF)
59 ; at startup all MPRs are set to 0, so init them
61 tam #1 ; 0000-1FFF = Hardware page
63 tam #2 ; 2000-3FFF = Work RAM
65 ;tam #2 ; 4000-5FFF = Save RAM
67 ;tam #3 ; 6000-7FFF Page 2
69 ;tam #4 ; 8000-9FFF Page 3
71 ;tam #5 ; A000-BFFF Page 4
73 ;tam #6 ; C000-DFFF Page 5
75 ;tam #7 ; e000-fFFF hucard/syscard bank 0
77 ; Clear work RAM (2000-3FFF)
79 tii $2000, $2001, $1FFF
82 stz TIMER_COUNT ; Timer off
84 sta IRQ_MASK ; Interrupts off
85 stz IRQ_STATUS ; Acknowledge timer
87 ;; i dont know why the heck this one doesnt
88 ;; work when called from a constructor :/
94 ; Turn on background and VD interrupt/IRQ1
97 sta IRQ_MASK ; IRQ1=on
105 ; Copy the .data segment to RAM
107 lda #<(__DATA_LOAD__)
108 ;;lda #<(__ROM0_START__ + __STARTUP_SIZE__+ __CODE_SIZE__+ __RODATA_SIZE__)
109 ;;lda #<(__ROM_START__ + __CODE_SIZE__+ __RODATA_SIZE__)
111 lda #>(__DATA_LOAD__)
112 ;;lda #>(__ROM_START__ + __CODE_SIZE__+ __RODATA_SIZE__)
115 ;;lda #<(__SRAM_START__)
118 ;;lda #>(__SRAM_START__)
121 ldx #>(__DATA_SIZE__)
124 beq @s1 ; no more full pages
140 ; copy remaining bytes
149 cpy #<(__DATA_SIZE__)
154 ; lda #<(__RAM_START__ + __DATA_SIZE__ + __BSS_SIZE__)
155 lda #<(__RAM_START__+__RAM_SIZE__)
157 ; lda #>(__RAM_START__ + __DATA_SIZE__ + __BSS_SIZE__)
158 lda #>(__RAM_START__+__RAM_SIZE__)
159 sta sp+1 ; Set argument stack ptr
166 ; Call module constructors
173 ; Pass an empty command line
181 ldy #4 ; Argument size
182 jsr _main ; call the users code
184 ; Call module destructors. This is also the _exit entry.
187 jsr donelib ; Run module destructors
193 ; ------------------------------------------------------------------------
194 ; System V-Blank Interupt
195 ; ------------------------------------------------------------------------
208 ; Acknowlege interrupt
227 ; ------------------------------------------------------------------------
229 ; ------------------------------------------------------------------------
233 .word _irq2 ; $fff6 IRQ2 (External IRQ, BRK)
234 .word _irq1 ; $fff8 IRQ1 (VDC)
235 .word _timer ; $fffa Timer
236 .word _nmi ; $fffc NMI
237 .word start ; $fffe reset