]> git.sur5r.net Git - cc65/blob - libsrc/pce/crt0.s
Protect random counter against ProDOS.
[cc65] / libsrc / pce / crt0.s
1 ;
2 ; Start-up code for cc65 (PC-Engine version)
3 ;
4 ; by Groepaz/Hitmen <groepaz@gmx.net>,
5 ; based on code by Ullrich von Bassewitz <uz@cc65.org>
6 ;
7 ; 2018-02-24, Greg King
8 ;
9
10         .export         _exit
11         .export         __STARTUP__ : absolute = 1      ; Mark as start-up
12
13         .import         initlib, donelib
14         .import         push0, _main
15         .import         IRQStub, __nmi
16         .importzp       sp
17
18         ; Linker-generated
19         .import         __CARTSIZE__
20         .import         __DATA_LOAD__, __DATA_RUN__, __DATA_SIZE__
21         .import         __BSS_RUN__, __BSS_SIZE__
22         .import         __MAIN_START__, __MAIN_SIZE__, __STACKSIZE__
23
24         .include        "pce.inc"
25         .include        "extzp.inc"
26
27 ; ------------------------------------------------------------------------
28 ; Place the start-up code in a special segment.
29
30 .segment        "STARTUP"
31
32         ; Initialize the CPU.
33 start:  sei
34         nop
35         csh                     ; Set high-speed CPU mode
36         nop
37
38         ; Set up the stack and the memory mapping.
39         ldx     #$FF            ; Stack top ($21FF)
40         txs
41
42         ; At power-on, most MPRs have random values; so, initiate them.
43         lda     #$FF
44         tam     #%00000001      ; $0000-$1FFF = Hardware bank
45         lda     #$F8
46         tam     #%00000010      ; $2000-$3FFF = Work RAM
47         ;lda     #$F7
48         ;tam     #%00000100      ; $4000-$47FF = 2K Battery-backed RAM
49         ;lda     #4
50         ;tam     #%00001000      ; $6000-$7FFF
51
52         lda     #$01
53         ldx     #>$8000
54         cpx     #>__CARTSIZE__
55         bcc     @L1             ;(blt)
56         tam     #%00010000      ; $8000-$9FFF = ROM bank 1 (32K block of ROM)
57         inc     a
58         tam     #%00100000      ; $A000-$BFFF = ROM bank 2
59         inc     a
60 @L1:    tam     #%01000000      ; $C000-$DFFF = ROM bank 3 (32K) or 1 (16K)
61         ;lda    #$00            ; (The reset default)
62         ;tam    #%10000000      ; $E000-$FFFF  Hucard/Syscard bank 0
63
64         ; Initialize the hardware.
65         stz     TIMER_CTRL      ; Timer off
66         lda     #%00000111
67         sta     IRQ_MASK        ; Interrupts off
68
69         ; FIXME; I don't know why the heck this one doesn't work when called from a constructor. -Groepaz :-/
70 .if 0   ; It now seems to work (at least, in Mednafen). -Greg King
71         .import vdc_init
72         jsr     vdc_init
73 .endif
74
75         ; Allow interrupts from the VDC.
76         lda     #%00000101
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 the module constructors.
93         jsr     initlib
94
95         stz     IRQ_STATUS      ; Clear IRQs
96         cli                     ; Allow IRQ only after constructors have run
97
98         ; Pass an empty command line
99         jsr     push0           ; argc
100         jsr     push0           ; argv
101
102         ldy     #4              ; Argument size
103         jsr     _main           ; Call the user's code
104
105         ; Call the module destructors. This is also the exit() entry.
106 _exit:  jsr     donelib
107
108         ; Reset the PCEngine (start over).
109         jmp     start
110
111         .export initmainargs
112 initmainargs:
113         rts
114
115 ; ------------------------------------------------------------------------
116 ; hardware vectors
117 ; ------------------------------------------------------------------------
118 .segment        "VECTORS"
119
120         .word   IRQStub         ; $FFF6 IRQ2 (External IRQ, BRK)
121         .word   IRQStub         ; $FFF8 IRQ1 (VDC)
122         .word   IRQStub         ; $FFFA Timer
123         .word   __nmi           ; $FFFC NMI
124         .word   start           ; $FFFE reset