-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathramp.s
More file actions
286 lines (256 loc) · 4.11 KB
/
ramp.s
File metadata and controls
286 lines (256 loc) · 4.11 KB
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
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
; ramp.s
;
; code placed in RAM to run the NSF
;
;
; external dependencies:
; base_nmi
; BASE_BANK
;
; when compiling the ROM, these are in base.s
; when compiling mods, these are in mod.inc
;
;
; ramp_play must be called from $8000 bank
; base_nmi must reside in $8000 bank
; base_banks must reside in $8000 bank
;
; BASE_BANK will be loaded automatically into $8000 before base_nmi is called
; $9000, $A000, $B000 must be pre-banked by the caller before entering ramp_play
; or returning from base_nmi
; (these values will be cached in bank_9000, bank_A000, bank_B000)
;
;
; https://github.com/bbbradsmith/zensf
.export ramp_play ; begins playing track (call INIT, nsf_playing=1)
.export ramp_nmi
.export ramp_irq
.export ramp_reset
.export ramp_nsf_init
.export ramp_nsf_play
.export sta_5FF8 ; mod replacement for STA $5FF8
.export sta_5FF9
.export sta_5FFA
.export sta_5FFB
.export sta_5FFC
.export sta_5FFD
.export sta_5FFE
.export sta_5FFF
.export sty_5FFA
.export sty_5FFB
.export bank_add ; re-location of original NSF banks
.export bank_8000 ; rembers the last bank required by NSF (so they can be temporarily replaced)
.export bank_9000
.export bank_A000
.export bank_B000
; ramp_play parameters
.export nsf_init
.export nsf_play
.export nsf_init_a ; NSF song
.export nsf_init_x ; 0/1 = NTSC/PAL mode
.export nsf_adjust ; 0 = none, 1 = double every 5th frame, 2 = FT PAL pitch adjust hack + double 5th
.export nsf_playing ; 1 = call PLAY on every NMI
.import base_nmi
.import base_banks
.include "out_info/build.inc"
.segment "RAMP_RAM"
bank_add: .res 1
bank_8000: .res 1
bank_9000: .res 1
bank_A000: .res 1
bank_B000: .res 1
nsf_init: .res 2
nsf_play: .res 2
nsf_init_a: .res 1
nsf_init_x: .res 1
nsf_adjust: .res 1
nsf_playing: .res 1
ramp_nmi_now: .res 1 ; prevents NMI re-entry
.segment "RAMP_CODE"
ramp_play:
; swap out BASE bank
lda bank_8000
sta $5FF8
jsr ramp_nsf_init
; enable music playback in NMI
lda #1
sta nsf_playing
; return to BASE bank
lda #BANK_BASE
sta $5FF8
rts
ramp_nmi:
pha
txa
pha
tya
pha
;
lda ramp_nmi_now
bne @skip
lda #1
sta ramp_nmi_now
; call base_nmi (needs at least $8000 at BASE)
lda #BANK_BASE
sta $5FF8
.assert (base_nmi >= $8000 && base_nmi < $9000), error, "base_nmi must be in $8000 bank"
jsr base_nmi
lda nsf_playing
beq @play_end
lda bank_8000
sta $5FF8
jsr ramp_nsf_play
@play_end:
; restore all BASE banks
lda #BANK_BASE
sta $5FF8
jsr base_banks
lda #0
sta ramp_nmi_now
@skip:
pla
tay
pla
tax
pla
; rti
ramp_irq:
rti
ramp_reset:
lda #$FF
sta $5FFF
jmp ($FFFC)
ramp_nsf_init:
; call NSF INIT
lda nsf_init_a
ldx nsf_init_x
ldy #0
jsr do_nsf_init
lda nsf_adjust
cmp #2
bne :+
; FT pitch adjust hack:
; On FT, the pitch table pointer usually resides at $0C.
; PAL pitch table is 192 bytes past the NTSC pitch table
lda $0C
clc
adc #<192
sta $0C
lda $0D
adc #>192
sta $0D
lda #1
sta nsf_adjust
:
rts
ramp_nsf_play:
; call NSF PLAY
jsr do_nsf_play
; if nsf_adjust, double every 5th frame (NTSC to PAL speed conversion)
lda nsf_adjust
beq :+
inc nsf_adjust
lda nsf_adjust
cmp #6
bcc :+
jsr do_nsf_play
lda #1
sta nsf_adjust
:
rts
; trampolines for playback/init
do_nsf_init:
jmp (nsf_init)
do_nsf_play:
jmp (nsf_play)
; STA ABS bank switching
; (add more of these if needed for STX, STY, indexed, etc.)
sta_5FF8:
php
pha
clc
adc bank_add
sta bank_8000
sta $5FF8
pla
plp
rts
sta_5FF9:
php
pha
clc
adc bank_add
sta bank_9000
sta $5FF9
pla
plp
rts
sta_5FFA:
php
pha
fin_5FFA_:
clc
adc bank_add
sta bank_A000
sta $5FFA
pla
plp
rts
sta_5FFB:
php
pha
fin_5FFB_:
clc
adc bank_add
sta bank_B000
sta $5FFB
pla
plp
rts
sta_5FFC:
php
pha
clc
adc bank_add
sta $5FFC
pla
plp
rts
sta_5FFD:
php
pha
clc
adc bank_add
sta $5FFD
pla
plp
rts
sta_5FFE:
php
pha
clc
adc bank_add
sta $5FFE
pla
plp
rts
sta_5FFF:
php
pha
clc
adc bank_add
sta $5FFF
pla
plp
rts
sty_5FFA:
php
pha
tya
jmp fin_5FFA_
sty_5FFB:
php
pha
tya
jmp fin_5FFB_
; end of file