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