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