aboutsummaryrefslogtreecommitdiff
path: root/src/jetpac.s
blob: d3eef5aac364dd23a95ea5b719befd765950d140 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
;; NOTE: automatically generated by the build system.
.include "../config/generated.s"

.segment "HEADER"
    ;; Bytes 0-3: NES\0 magic header.
    .byte 'N', 'E', 'S', $1A

    ;; Standard 32KB + 8KB NROM cartridge.
    .byte $02, $01

    ;; Horizontal mirroring, no battery.
    .byte $00

    ;; We use the NES 2.0 header mainly to differentiate between NTSC vs PAL in
    ;; a way that emulators won't ignore it.
    .byte $08

    ;; Blanked out stuff.
    .res $04, $00

    ;; NTSC vs PAL
    .ifdef PAL
        .byte $01
    .else
        .byte $00
    .endif

    ;; Blanked out stuff.
    .res $03, $00

.segment "CODE"

.include "../include/apu.s"
.include "../include/oam.s"
.include "../include/ppu.s"
.include "../include/asm.s"
.include "../include/joypad.s"
.include "../include/globals.s"

.include "assets.s"
.include "driver.s"
.include "title.s"
.include "vectors.s"

.proc main
    ;; Disable the PPU.
    lda #0
    sta PPU::MASK

    ;; Initialize the assets for the game.
    jsr Assets::init

    ;; We shadow the PPU control register in memory. Depending on the `make`
    ;; target we might need to switch directly to the main game. Otherwise we go
    ;; into the title as expected.
    .ifdef PARTIAL
        jsr Driver::switch

        lda PPU::zp_control
        sta PPU::CONTROL
    .else
        jsr Title::init

        lda #%10001000
        sta PPU::zp_control
        sta PPU::CONTROL
    .endif

    cli

    ;; Enable back the PPU
    lda #%00011110
    sta PPU::MASK

@main_game_loop:
    READ_JOYPAD1

    lda Globals::zp_flags
    and #%00000011
    beq @title_screen
    cmp #1
    beq @game_screen
    jmp @over

@title_screen:
    jsr Title::update
    beq @set_flags

    ;; Start was pressed by the player, switch to the main game.
    jsr Driver::switch
    jmp @set_flags

@game_screen:
    jsr Driver::update
    ;; NOTE: fallthrough

@set_flags:
    lda #%10000000
    ora Globals::zp_flags
    sta Globals::zp_flags
@wait_for_render:
    bit Globals::zp_flags
    bmi @wait_for_render

    ;; Rendering is done, we can perform another iteration of the loop!
    jmp @main_game_loop

@over:
    ;; TODO: allow to start over, reset flags, control register, etc.
    jmp @over
.endproc