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