]> git.sur5r.net Git - cc65/blob - libsrc/pce/crt0.s
simple conio test works again
[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     ; set high speed CPU mode
51                 nop
52                 cld
53                 nop
54
55                 ; Setup stack and memory mapping
56                 ldx     #$FF    ; Stack top ($21FF)
57                 txs
58
59                 ; at startup all MPRs are set to 0, so init them
60                 lda     #$ff
61                 tam     #1         ; 0000-1FFF = Hardware page
62                 lda     #$F8
63                 tam     #2         ; 2000-3FFF = Work RAM
64                 ;lda     #$F7
65                 ;tam     #2      ; 4000-5FFF = Save RAM
66                 ;lda     #1
67                 ;tam     #3      ; 6000-7FFF  Page 2
68                 ;lda     #2
69                 ;tam     #4      ; 8000-9FFF  Page 3
70                 ;lda     #3
71                 ;tam     #5      ; A000-BFFF  Page 4
72                 ;lda     #4
73                 ;tam     #6      ; C000-DFFF  Page 5
74                 ;lda     #0
75                 ;tam     #7      ; e000-fFFF  hucard/syscard bank 0
76
77                 ; Clear work RAM (2000-3FFF)
78                 stz     <$00
79                 tii     $2000, $2001, $1FFF
80
81                 ; Initialize hardware
82                 stz     TIMER_COUNT   ; Timer off
83                 lda     #$07
84                 sta     IRQ_MASK     ; Interrupts off
85                 stz     IRQ_STATUS   ; Acknowledge timer
86
87                 ;; i dont know why the heck this one doesnt
88                 ;; work when called from a constructor :/
89                         .import vdc_init
90                         jsr     vdc_init
91
92 ;;                        jsr     joy_init
93
94                 ; Turn on background and VD interrupt/IRQ1
95
96                 lda     #$05
97                 sta     IRQ_MASK           ; IRQ1=on
98
99                 cli
100
101 ; Clear the BSS data
102
103                 jsr     zerobss
104
105 ; Copy the .data segment to RAM
106
107                 lda #<(__DATA_LOAD__)
108                 ;;lda #<(__ROM0_START__ + __STARTUP_SIZE__+ __CODE_SIZE__+ __RODATA_SIZE__)
109                 ;;lda #<(__ROM_START__ + __CODE_SIZE__+ __RODATA_SIZE__)
110                 sta ptr1
111                 lda #>(__DATA_LOAD__)
112                 ;;lda #>(__ROM_START__ + __CODE_SIZE__+ __RODATA_SIZE__)
113                 sta ptr1+1
114                 lda #<(__DATA_RUN__)
115                 ;;lda #<(__SRAM_START__)
116                 sta ptr2
117                 lda #>(__DATA_RUN__)
118                 ;;lda #>(__SRAM_START__)
119                 sta ptr2+1
120
121                 ldx #>(__DATA_SIZE__)
122
123 @l2:
124                 beq @s1 ; no more full pages
125
126                 ; copy one page
127                 ldy #0
128 @l1:
129                 lda (ptr1),y
130                 sta (ptr2),y
131                 iny
132                 bne @l1
133
134                 inc ptr1+1
135                 inc ptr2+1
136
137                 dex
138                 bne @l2
139
140                 ; copy remaining bytes
141 @s1:
142
143                 ; copy one page
144                 ldy #0
145 @l3:
146                 lda (ptr1),y
147                 sta (ptr2),y
148                 iny
149                 cpy #<(__DATA_SIZE__)
150                 bne @l3
151
152 ; setup the stack
153
154 ;               lda #<(__RAM_START__ + __DATA_SIZE__ + __BSS_SIZE__)
155         lda #<(__RAM_START__+__RAM_SIZE__)
156                 sta     sp
157 ;               lda     #>(__RAM_START__ + __DATA_SIZE__ + __BSS_SIZE__)
158         lda #>(__RAM_START__+__RAM_SIZE__)
159         sta     sp+1            ; Set argument stack ptr
160
161 ; Init the Heap
162                 jsr initheap
163
164 ;jmp *
165
166 ; Call module constructors
167
168                 jsr     initlib
169
170                 .import initconio
171                 jsr initconio
172
173 ; Pass an empty command line
174
175
176 ;jmp *
177
178                 jsr push0               ; argc
179                 jsr     push0           ; argv
180 go:
181                 ldy     #4              ; Argument size
182         jsr     _main   ; call the users code
183
184 ; Call module destructors. This is also the _exit entry.
185
186 _exit:
187                 jsr     donelib         ; Run module destructors
188
189 ; reset the PCEngine
190
191                 jmp start
192
193 ; ------------------------------------------------------------------------
194 ; System V-Blank Interupt
195 ; ------------------------------------------------------------------------
196
197 _irq1:
198                 pha
199                 phx
200                 phy
201
202
203                 inc _tickcount
204                 bne @s
205                 inc _tickcount+1
206 @s:
207
208                 ; Acknowlege interrupt
209                 ldaio VDC_CTRL
210
211                 ply
212                 plx
213                 pla
214                 rti
215 _irq2:
216                 rti
217 _nmi:
218                 rti
219 _timer:
220                 stz     IRQ_STATUS
221                 rti
222
223                 .export initmainargs
224 initmainargs:
225                 rts
226
227 ; ------------------------------------------------------------------------
228 ; hardware vectors
229 ; ------------------------------------------------------------------------
230     .segment "VECTORS"
231     ;;.org    $fff6
232
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
238
239
240