]> git.sur5r.net Git - cc65/blob - libsrc/pce/crt0.s
Merge remote-tracking branch 'upstream/master' into creativision
[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
13         .import         initlib, donelib
14         .import         push0, _main, zerobss
15         .import         initheap
16         .import         IRQStub
17
18         ; Linker generated
19         .import         __RAM_START__, __RAM_SIZE__
20         .import         __ROM0_START__, __ROM0_SIZE__
21         .import         __ROM_START__, __ROM_SIZE__
22         .import         __STARTUP_LOAD__,__STARTUP_RUN__, __STARTUP_SIZE__
23         .import         __CODE_LOAD__,__CODE_RUN__, __CODE_SIZE__
24         .import         __RODATA_LOAD__,__RODATA_RUN__, __RODATA_SIZE__
25         .import         __DATA_LOAD__,__DATA_RUN__, __DATA_SIZE__
26         .import         __BSS_SIZE__
27
28         .include        "pce.inc"
29         .include        "extzp.inc"
30
31         .importzp       sp
32         .importzp       ptr1,ptr2
33         .importzp       tmp1,tmp2,tmp3
34
35 ; ------------------------------------------------------------------------
36 ; Place the startup code in a special segment.
37
38         .segment "STARTUP"
39
40 start:
41
42         ; Set up the CPU and System-IRQ
43
44         ; Initialize CPU
45         sei
46         nop
47         csh                     ; Set high speed CPU mode
48         nop
49         cld
50         nop
51
52         ; Set up stack and memory mapping
53         ldx     #$FF            ; Stack top ($21FF)
54         txs
55
56         ; At startup all MPRs are set to 0, so init them
57         lda     #$ff
58         tam     #%00000001      ; 0000-1FFF = Hardware page
59         lda     #$F8
60         tam     #%00000010      ; 2000-3FFF = Work RAM
61
62         ; FIXME: setup a larger block of memory to use with C-code
63         ;lda     #$F7
64         ;tam     #%00000100      ; 4000-5FFF = Save RAM
65         ;lda     #1
66         ;tam     #%00001000      ; 6000-7FFF  Page 2
67         ;lda     #2
68         ;tam     #%00010000      ; 8000-9FFF  Page 3
69         ;lda     #3
70         ;tam     #%00100000      ; A000-BFFF  Page 4
71         ;lda     #4
72         ;tam     #%01000000      ; C000-DFFF  Page 5
73         ;lda     #0
74         ;tam     #%10000000      ; e000-fFFF  hucard/syscard bank 0
75
76         ; Clear work RAM (2000-3FFF)
77         stz     <$00
78         tii     $2000, $2001, $1FFF
79
80         ; Initialize hardware
81         stz     TIMER_CTRL      ; Timer off
82         lda     #$07
83         sta     IRQ_MASK        ; Interrupts off
84         stz     IRQ_STATUS      ; Acknowledge timer
85
86         ; FIXME; i dont know why the heck this one doesnt work when called from a constructor :/
87         .import vdc_init
88         jsr     vdc_init
89
90         ; Turn on background and VD interrupt/IRQ1
91         lda     #$05
92         sta     IRQ_MASK        ; IRQ1=on
93
94         ; Clear the BSS data
95         jsr     zerobss
96
97         ; Copy the .data segment to RAM
98         tii     __DATA_LOAD__, __DATA_RUN__, __DATA_SIZE__
99
100         ; Set up the stack
101         lda     #<(__RAM_START__+__RAM_SIZE__)
102         ldx     #>(__RAM_START__+__RAM_SIZE__)
103         sta     sp
104         stx     sp + 1
105
106         ; Call module constructors
107         jsr     initlib
108
109         cli     ; allow IRQ only after constructors have run
110
111         ; Pass an empty command line
112         jsr     push0           ; argc
113         jsr     push0           ; argv
114
115         ldy     #4              ; Argument size
116         jsr     _main           ; Call the users code
117
118         ; Call module destructors. This is also the _exit entry.
119 _exit:
120         jsr     donelib         ; Run module destructors
121
122         ; reset the PCEngine (start over)
123         jmp     start
124
125 _nmi:
126         rti
127
128         .export initmainargs
129 initmainargs:
130         rts
131
132 ; ------------------------------------------------------------------------
133 ; hardware vectors
134 ; ------------------------------------------------------------------------
135         .segment "VECTORS"
136
137         .word   IRQStub         ; $fff6 IRQ2 (External IRQ, BRK)
138         .word   IRQStub         ; $fff8 IRQ1 (VDC)
139         .word   IRQStub         ; $fffa Timer
140         .word   _nmi            ; $fffc NMI
141         .word   start           ; $fffe reset