]> git.sur5r.net Git - cc65/blob - libsrc/pce/crt0.s
Merge remote-tracking branch 'upstream/master' into pcenginetarget
[cc65] / libsrc / pce / crt0.s
1 ;
2 ; Startup code for cc65 (PCEngine version)
3 ;
4 ; by Groepaz/Hitmen <groepaz@gmx.net>
5 ; based on code by Ullrich von Bassewitz <uz@cc65.org>
6 ;
7 ; This must be the *first* file on the linker command line
8 ;
9
10         .export         _exit
11         .export         __STARTUP__ : absolute = 1      ; Mark as startup
12         .import         initlib, donelib
13         .import     push0, _main, zerobss
14         .import     initheap
15         .import         tmp1,tmp2,tmp3
16
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
25         .import __BSS_SIZE__
26
27         .include "pcengine.inc"
28
29     .importzp       sp
30         .importzp       ptr1,ptr2
31
32 ; ------------------------------------------------------------------------
33 ; Create an empty LOWCODE segment to avoid linker warnings
34
35 .segment        "LOWCODE"
36
37 ; ------------------------------------------------------------------------
38 ; Place the startup code in a special segment.
39
40 .segment        "STARTUP"
41
42 start:
43
44 ; setup the CPU and System-IRQ
45
46                         ; Initialize CPU
47
48                         sei
49                         nop
50                         csh
51                         nop
52                         cld
53                         nop
54
55                         ; Setup stack and memory mapping
56                         ldx     #$FF    ; Stack top ($21FF)
57                         txs
58                         txa
59                         tam     #0      ; 0000-1FFF = Hardware page
60
61                         lda     #$F8
62                         tam     #1      ; 2000-3FFF = Work RAM
63
64                         lda     #$F7
65                         tam     #2      ; 4000-5FFF = Save RAM
66
67                                                 lda     #1
68                         tam     #3      ; 6000-7FFF  Page 2
69                                                 lda     #2
70                         tam     #4      ; 8000-9FFF  Page 3
71                                                 lda     #3
72                         tam     #5      ; A000-BFFF  Page 4
73                                                 lda     #4
74                         tam     #6      ; C000-DFFF  Page 5
75
76                         ; Initialize hardware
77                         stz     TIMER_COUNT   ; Timer off
78                         lda     #$07
79                         sta     IRQ_MASK     ; Interrupts off
80                         stz     IRQ_STATUS   ; Acknowledge timer
81
82                         ; Clear work RAM
83                         stz     <$00
84                         tii     $2000, $2001, $1FFF
85
86                                                 ;; i dont know why the heck this one doesnt
87                                                 ;; work when called from a constructor :/
88                                                 .import vdc_init
89                                                 jsr     vdc_init
90 ;;                        jsr     joy_init
91
92                         ; Turn on background and VD interrupt/IRQ1
93                         lda     #$05
94                         sta     IRQ_MASK           ; IRQ1=on
95                         cli
96
97 ; Clear the BSS data
98
99                 jsr     zerobss
100
101 ; Copy the .data segment to RAM
102
103                 lda #<(__DATA_LOAD__)
104                 ;;lda #<(__ROM0_START__ + __STARTUP_SIZE__+ __CODE_SIZE__+ __RODATA_SIZE__)
105                 ;;lda #<(__ROM_START__ + __CODE_SIZE__+ __RODATA_SIZE__)
106                 sta ptr1
107                 lda #>(__DATA_LOAD__)
108                 ;;lda #>(__ROM_START__ + __CODE_SIZE__+ __RODATA_SIZE__)
109                 sta ptr1+1
110                 lda #<(__DATA_RUN__)
111                 ;;lda #<(__SRAM_START__)
112                 sta ptr2
113                 lda #>(__DATA_RUN__)
114                 ;;lda #>(__SRAM_START__)
115                 sta ptr2+1
116
117                 ldx #>(__DATA_SIZE__)
118
119 @l2:
120                 beq @s1 ; no more full pages
121
122                 ; copy one page
123                 ldy #0
124 @l1:
125                 lda (ptr1),y
126                 sta (ptr2),y
127                 iny
128                 bne @l1
129
130                 inc ptr1+1
131                 inc ptr2+1
132
133                 dex
134                 bne @l2
135
136                 ; copy remaining bytes
137 @s1:
138
139                 ; copy one page
140                 ldy #0
141 @l3:
142                 lda (ptr1),y
143                 sta (ptr2),y
144                 iny
145                 cpy #<(__DATA_SIZE__)
146                 bne @l3
147
148 ; setup the stack
149
150 ;               lda #<(__RAM_START__ + __DATA_SIZE__ + __BSS_SIZE__)
151         lda #<(__RAM_START__+__RAM_SIZE__)
152                 sta     sp
153 ;               lda     #>(__RAM_START__ + __DATA_SIZE__ + __BSS_SIZE__)
154         lda #>(__RAM_START__+__RAM_SIZE__)
155         sta     sp+1            ; Set argument stack ptr
156
157 ; Init the Heap
158                 jsr initheap
159
160 ;jmp *
161
162 ; Call module constructors
163
164                 jsr     initlib
165 ;               .import initconio
166 ;               jsr initconio
167 ; Pass an empty command line
168
169
170 ;jmp *
171
172                 jsr push0               ; argc
173                 jsr     push0           ; argv
174 go:
175                 ldy     #4              ; Argument size
176         jsr     _main   ; call the users code
177
178 ; Call module destructors. This is also the _exit entry.
179
180 _exit:
181                 jsr     donelib         ; Run module destructors
182
183 ; reset the PCEngine
184
185                 jmp start
186
187 ; ------------------------------------------------------------------------
188 ; System V-Blank Interupt
189 ; ------------------------------------------------------------------------
190
191 _irq1:
192                         pha
193                         phx
194                         phy
195
196
197                 inc _tickcount
198                 bne @s
199                 inc _tickcount+1
200 @s:
201
202                         ; Acknowlege interrupt
203                                                 ldaio VDC_CTRL
204
205                                                 ply
206                         plx
207                         pla
208                         rti
209 _irq2:
210                         rti
211 _nmi:
212                         rti
213 _timer:
214                         stz     IRQ_STATUS
215                         rti
216
217         .export initmainargs
218 initmainargs:
219         rts
220
221 ; ------------------------------------------------------------------------
222 ; hardware vectors
223 ; ------------------------------------------------------------------------
224     .segment "VECTORS"
225     ;;.org    $fff6
226
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
232
233
234