forked from zorchenhimer/nes-breakout
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtitle.asm
207 lines (162 loc) · 2.88 KB
/
title.asm
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
; asmsyntax=ca65
TITLE_SpriteTop = 79 ; topmost Y coordinate of cursor
TITLE_MenuLength = 3
Pal_Title:
.byte $0F, $00, $10, $20
Data_Title_Menu1:
.byte "Title", $00
Data_Title_Menu2:
.byte "Game", $00
Data_Title_Menu3:
.byte "Credits", $00
Init_Title:
NMI_Disable
lda #$00
sta $2001
; Load up a palette
bit $2002
lda #$3F
sta $2006
lda #$00
sta $2006
.repeat 4, i
lda Pal_Title+i
sta $2007
.endrepeat
jsr ClearSprites
lda #79
sta Sprites
lda #100
sta Sprites+3
lda #$01 ; tile
sta Sprites+1
lda #$00 ; attr
sta Sprites+2
;jsr WriteSprites
lda #2
jsr LoadChrData
jsr ClearAttrTable0
lda #$00
jsr FillNametable0
; TODO: Draw a menu
lda #$21
sta $2006
lda #$4E
sta $2006
lda #<Data_Title_Menu1
sta AddressPointer0+0
lda #>Data_Title_Menu1
sta AddressPointer0+1
jsr title_DrawText
lda #$21
sta $2006
lda #$8E
sta $2006
lda #<Data_Title_Menu2
sta AddressPointer0+0
lda #>Data_Title_Menu2
sta AddressPointer0+1
jsr title_DrawText
lda #$21
sta $2006
lda #$CE
sta $2006
lda #<Data_Title_Menu3
sta AddressPointer0+0
lda #>Data_Title_Menu3
sta AddressPointer0+1
jsr title_DrawText
jsr WaitForNMI
lda #0
sta $2005
sta $2005
; Currently selected item
sta IdxA
lda #TITLE_MenuLength
sta IdxB
; Select first nametable
lda #%10011000
sta $2000
lda #%00011110
sta $2001
NMI_Set NMI_Title
Frame_Title:
jsr ReadControllers
lda #BUTTON_START
jsr ButtonPressedP1
beq :+
jsr title_SelectMenuOption
jmp @button_done
: lda #BUTTON_A
jsr ButtonPressedP1
beq :+
jsr title_SelectMenuOption
jmp @button_done
: lda #BUTTON_UP
jsr ButtonPressedP1
beq :+
jsr t_sel_up
jmp @button_done
: lda #BUTTON_DOWN
jsr ButtonPressedP1
beq :+
jsr t_sel_down
jmp @button_done
: lda #BUTTON_SELECT
jsr ButtonPressedP1
beq :+
jsr t_sel_down
:
@button_done:
; calculate Y for cursor
lda IdxA
asl a
asl a
asl a
asl a
clc
adc #TITLE_SpriteTop
sta Sprites+0
jsr WaitForNMI
jmp Frame_Title
; Move selection up
t_sel_up:
dec IdxA
bpl :+
; Wrap around to end
lda IdxB
sec
sbc #1
sta IdxA
: rts
; Move selection down
t_sel_down:
inc IdxA
lda IdxA
cmp IdxB
bcc :+
; wrap the index around to zero
lda #0
sta IdxA
: rts
NMI_Title:
jsr WriteSprites
dec Sleeping
rti
; Null terminated string in AddressPointer0, PPU
; address should already be set.
title_DrawText:
ldy #0
:
lda (AddressPointer0), y
beq :+
sta $2007
iny
jmp :-
:
rts
title_SelectMenuOption:
NMI_Disable
jsr WaitForNMI
lda IdxA
jmp JumpToInit