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 ; 2018-02-11, Greg King
11 .export __STARTUP__ : absolute = 1 ; Mark as startup
13 .import initlib, donelib
19 .import __DATA_LOAD__, __DATA_RUN__, __DATA_SIZE__
20 .import __BSS_RUN__, __BSS_SIZE__
21 .import __MAIN_START__, __MAIN_SIZE__, __STACKSIZE__
28 ; ------------------------------------------------------------------------
29 ; Place the startup code in a special segment.
35 ; Set up the CPU and System-IRQ
40 csh ; Set high speed CPU mode
43 ; Set up stack and memory mapping
44 ldx #$FF ; Stack top ($21FF)
47 ; At power-on, most MPRs have random values; so, initiate them.
49 tam #%00000001 ; $0000-$1FFF = Hardware bank
51 tam #%00000010 ; $2000-$3FFF = Work RAM
53 ;tam #%00000100 ; $4000-$47FF = 2K Battery-backed RAM
55 ;tam #%00001000 ; $6000-$7FFF
61 tam #%00010000 ; $8000-$9FFF = ROM bank 1 (32K block of ROM)
63 tam #%00100000 ; $A000-$BFFF = ROM bank 2
65 @L1: tam #%01000000 ; $C000-$DFFF = ROM bank 3 (32K) or 1 (16K)
66 ;lda #$00 ; (The reset default)
67 ;tam #%10000000 ; $E000-$FFFF hucard/syscard bank 0
70 stz TIMER_CTRL ; Timer off
72 sta IRQ_MASK ; Interrupts off
73 stz IRQ_STATUS ; Acknowledge timer
75 ; FIXME; i dont know why the heck this one doesnt work when called from a constructor :/
79 ; Turn on background and VD interrupt/IRQ1
81 sta IRQ_MASK ; IRQ1=on
83 ; Copy the .data segment to RAM
84 tii __DATA_LOAD__, __DATA_RUN__, __DATA_SIZE__
86 ; Clear the .bss segment
88 tii __BSS_RUN__, __BSS_RUN__ + 1, __BSS_SIZE__ - 1
91 lda #<(__MAIN_START__ + __MAIN_SIZE__ + __STACKSIZE__)
92 ldx #>(__MAIN_START__ + __MAIN_SIZE__ + __STACKSIZE__)
96 ; Call module constructors
99 cli ; allow IRQ only after constructors have run
101 ; Pass an empty command line
105 ldy #4 ; Argument size
106 jsr _main ; Call the users code
108 ; Call module destructors. This is also the _exit entry.
110 jsr donelib ; Run module destructors
112 ; reset the PCEngine (start over)
122 ; ------------------------------------------------------------------------
124 ; ------------------------------------------------------------------------
127 .word IRQStub ; $fff6 IRQ2 (External IRQ, BRK)
128 .word IRQStub ; $fff8 IRQ1 (VDC)
129 .word IRQStub ; $fffa Timer
130 .word _nmi ; $fffc NMI
131 .word start ; $fffe reset