]> git.sur5r.net Git - cc65/blob - libsrc/pce/crt0.s
c9a8e8c8f19fa77f550d45f5b52d13c426d462f0
[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 ; 2018-02-11, Greg King
8 ;
9
10         .export         _exit
11         .export         __STARTUP__ : absolute = 1      ; Mark as startup
12
13         .import         initlib, donelib
14         .import         push0, _main
15         .import         IRQStub
16
17         ; Linker-generated
18         .import         __CARTSIZE__
19         .import         __DATA_LOAD__, __DATA_RUN__, __DATA_SIZE__
20         .import         __BSS_RUN__, __BSS_SIZE__
21         .import         __MAIN_START__, __MAIN_SIZE__, __STACKSIZE__
22
23         .include        "pce.inc"
24         .include        "extzp.inc"
25
26         .importzp       sp
27
28 ; ------------------------------------------------------------------------
29 ; Place the startup code in a special segment.
30
31         .segment "STARTUP"
32
33 start:
34
35         ; Set up the CPU and System-IRQ
36
37         ; Initialize CPU
38         sei
39         nop
40         csh                     ; Set high speed CPU mode
41         nop
42         nop
43
44         ; Set up stack and memory mapping
45         ldx     #$FF            ; Stack top ($21FF)
46         txs
47
48         ; At power-on, most MPRs have random values; so, initiate them.
49         lda     #$FF
50         tam     #%00000001      ; $0000-$1FFF = Hardware bank
51         lda     #$F8
52         tam     #%00000010      ; $2000-$3FFF = Work RAM
53         ;lda     #$F7
54         ;tam     #%00000100      ; $4000-$47FF = 2K Battery-backed RAM
55         ;lda     #4
56         ;tam     #%00001000      ; $6000-$7FFF
57
58         lda     #$01
59         ldx     #>$8000
60         cpx     #>__CARTSIZE__
61         bcc     @L1             ;(blt)
62         tam     #%00010000      ; $8000-$9FFF = ROM bank 1 (32K block of ROM)
63         inc     a
64         tam     #%00100000      ; $A000-$BFFF = ROM bank 2
65         inc     a
66 @L1:    tam     #%01000000      ; $C000-$DFFF = ROM bank 3 (32K) or 1 (16K)
67         ;lda    #$00            ; (The reset default)
68         ;tam    #%10000000      ; $E000-$FFFF  hucard/syscard bank 0
69
70         ; Initialize hardware
71         stz     TIMER_CTRL      ; Timer off
72         lda     #$07
73         sta     IRQ_MASK        ; Interrupts off
74         stz     IRQ_STATUS      ; Acknowledge timer
75
76         ; FIXME; i dont know why the heck this one doesnt work when called from a constructor :/
77         .import vdc_init
78         jsr     vdc_init
79
80         ; Turn on background and VD interrupt/IRQ1
81         lda     #$05
82         sta     IRQ_MASK        ; IRQ1=on
83
84         ; Copy the .data segment to RAM
85         tii     __DATA_LOAD__, __DATA_RUN__, __DATA_SIZE__
86
87         ; Clear the .bss segment
88         stz     __BSS_RUN__
89         tii     __BSS_RUN__, __BSS_RUN__ + 1, __BSS_SIZE__ - 1
90
91         ; Set up the stack
92         lda     #<(__MAIN_START__ + __MAIN_SIZE__ + __STACKSIZE__)
93         ldx     #>(__MAIN_START__ + __MAIN_SIZE__ + __STACKSIZE__)
94         sta     sp
95         stx     sp + 1
96
97         ; Call module constructors
98         jsr     initlib
99
100         cli     ; allow IRQ only after constructors have run
101
102         ; Pass an empty command line
103         jsr     push0           ; argc
104         jsr     push0           ; argv
105
106         ldy     #4              ; Argument size
107         jsr     _main           ; Call the users code
108
109         ; Call module destructors. This is also the _exit entry.
110 _exit:
111         jsr     donelib         ; Run module destructors
112
113         ; reset the PCEngine (start over)
114         jmp     start
115
116 _nmi:
117         rti
118
119         .export initmainargs
120 initmainargs:
121         rts
122
123 ; ------------------------------------------------------------------------
124 ; hardware vectors
125 ; ------------------------------------------------------------------------
126         .segment "VECTORS"
127
128         .word   IRQStub         ; $fff6 IRQ2 (External IRQ, BRK)
129         .word   IRQStub         ; $fff8 IRQ1 (VDC)
130         .word   IRQStub         ; $fffa Timer
131         .word   _nmi            ; $fffc NMI
132         .word   start           ; $fffe reset