-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patheditDrumKit.asm
568 lines (501 loc) · 9.77 KB
/
editDrumKit.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
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
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
editDrumkit:
.IF SRAM_MAP=32
lda #SRAM_DRUMKIT_BANK
jsr setMMC1r1
.ENDIF
ldx drumkitCursorY
lda drumkitRowsIndex,x
ldx editorCurrentDrumkit
clc
adc editDrumkitAddressLo,x
sta drumkitVector
lda editDrumkitAddressHi,x
adc #$00
sta drumkitVector+1
lda writeScreen ;need to write screen?
beq @a
jsr writeDrumkitScreen ;yes
dec writeScreen ;if writeScreen was 1, only write main window, else
beq @a ; write header and title too
jsr writeDrumkitHeaderFooter
dec writeScreen ;reset screen writing flag
lda #$01
sta dmaUpdateHeader
sta dmaUpdateTitle
@a: jsr globalKeys ;global keys
lda writeScreen ;if mode has changed, this flag will be !=0
beq @b
jmp editDrumkitExit ;if changed, don't do any more keys
@b: jsr processKeys
.IF SRAM_MAP=32
lda #SRAM_DRUMKIT_BANK
jsr setMMC1r1
.ENDIF
ldy drumkitCursorX
jsr drumkitKeysHoldA_UDLR
jsr drumkitKeysTapA
jsr drumkitKeysTapB
jsr drummkitKeysHoldSelect_UDLR
ldy drumkitCursorX ;if editing root, stop L/R movement
cpy #DRUMKIT_COLUMN_ROOT
bne @notRoot
lda #$00
sta keysRepeatLR
sta PAD1_dlr
@notRoot: jsr moveAroundEditor
editDrumkitExit:
updateCursor drumkitCursorX,drumkitCursorY,drumkitCursorColumns,drumkitCursorRows,drumkitColumnCursorType
jsr drumkitPlayMarkers
jsr writeDrumkitThisNote
jmp editorLoop
drumkitPlayMarkers:
ldx editorCurrentTrack
cpx #SONG_TRACK_E
bne @x
lda plyrCurrentInstrument,x
tay
lda plyrCurrentNote,x
cmp SRAM_DRUMKIT_ROOTS,y
bcc @x
sbc SRAM_DRUMKIT_ROOTS,y
cmp #$0C
bcs @x
tay
lda drumkitCursorRows,y
sec
sbc #$01
sta SPR05_Y
lda #SPR_RIGHT_ARROW
sta SPR05_CHAR
lda #26+48
sta SPR05_X
@x: rts
drummkitKeysHoldSelect_UDLR:
;rts ;*new controls*
lda PAD1_sel
beq @x
lda PAD1_fireb
ora PAD1_firea
bne @x
lda PAD1_dud
ora keysRepeatUD
beq @noUD
clc
adc editorCurrentDrumkit
bpl @a
lda #$00
beq @b
@a: cmp #NUMBER_OF_DRUMKITS
bcs @x
@b: sta editorCurrentDrumkit
lda #$02
sta writeScreen
rts
@noUD: lda PAD1_dlr
beq @x
bmi drumkitCopyData
jsr drumkitPasteData
@x: rts
drumkitCopyData: lda editorMode
sta copyBufferObjectType
ldx editorCurrentDrumkit
stx copyBufferObject
lda editDrumkitAddressLo,x
sta tmp0
lda editDrumkitAddressHi,x
sta tmp1
ldx #$00
ldy drumkitCursorY
sty copyBufferStartIndex
lda drumkitRowsIndex,y
tay
@copyLoop: lda (tmp0),y
sta copyBuffer,x
inx
iny
cpy #(STEPS_PER_DRUMKIT*BYTES_PER_DRUMKIT_STEP)
bcc @copyLoop
stx copyBufferLength
@x: jsr editorUpdateCopyInfo
rts
drumkitPasteData: lda copyBufferObjectType
bmi @x ;nothing to copy
cmp editorMode
bne @x ;wrong object type
ldx editorCurrentDrumkit
lda editDrumkitAddressLo,x
sta tmp0
lda editDrumkitAddressHi,x
sta tmp1
ldy drumkitCursorY
lda drumkitRowsIndex,y
tay
ldx #$00
@b: lda copyBuffer,x
sta (tmp0),y
inx
iny
cpx copyBufferLength
bcs @a
cpy #(STEPS_PER_DRUMKIT*BYTES_PER_DRUMKIT_STEP)
bcc @b
@a: lda #$01
sta writeScreen
rts
@x: lda #ERROR_PASTE
sta errorMessageNumber
rts
drumkitKeysHoldA_UDLR:
lda PAD1_fireb;keysHoldB
beq @noB
@x2: rts
@noB: lda PAD1_firea;keysHoldA ;hold A + U/D/L/R = modify value
bne @holdA
lda editBufferFlag
beq @x2
lda editBuffer
cpy #DRUMKIT_COLUMN_ROOT
bne @notRoot2
ldy editorCurrentDrumkit
sta SRAM_DRUMKIT_ROOTS,y
jmp @notEditing
@notRoot2: sta (drumkitVector),y
@notEditing: lda #$00
sta editBufferFlag
lda #$00
sta editorPlayingNote
@killing: jmp @x
@holdA: lda editBufferFlag
bne @editing
inc editBufferFlag
cpy #DRUMKIT_COLUMN_ROOT
bne @notEditRoot
ldy editorCurrentDrumkit
lda SRAM_DRUMKIT_ROOTS,y
sta editBuffer
jmp @editing
@notEditRoot: lda (drumkitVector),y
sta editBuffer
@editing: jsr drumkitPlayNote
ldy drumkitCursorX
lda keysRepeatLR
ora PAD1_dlr
bne @addValue
lda keysRepeatUD
ora PAD1_dud
beq @x
bmi @posAdd
lda drumkitNegativeAdd,y
jmp @addValue
@posAdd: lda drumkitPositiveAdd,y
@addValue: cpy #DRUMKIT_COLUMN_ROOT
bne @notRoot
ldy editorCurrentDrumkit
clc
;adc SRAM_DRUMKIT_ROOTS,y
adc editBuffer
bpl @notNegRoot
lda #$00
beq @notLimitRoot
@notNegRoot: cmp #NUMBER_OF_NOTES
bcc @notLimitRoot
lda #NUMBER_OF_NOTES-1
@notLimitRoot: ;sta SRAM_DRUMKIT_ROOTS,y
sta editBuffer
ldy drumkitCursorX
sta editDrumkitLastValue,y
jsr editDrumkitUpdateScreenValue
rts
@notRoot: clc
adc editBuffer
cpy #DRUMKIT_COLUMN_START_OFFSET
beq @noLimit
cpy #DRUMKIT_COLUMN_END_OFFSET
beq @noLimit
cpy #DRUMKIT_COLUMN_LOOP
bne @notLoop
and #$01
bpl @noLimit
@notLoop: and #$FF
bpl @notNeg
lda #$00
beq @noLimit
@notNeg: cmp drumkitMaxValues,y
bcc @noLimit
lda drumkitMaxValues,y
sec
sbc #$01
@noLimit: sta editBuffer
sta editDrumkitLastValue,y
jsr editDrumkitUpdateScreenValue
lda #$00
sta editorPlayingNote
@x: rts
drumkitKeysTapB:
lda PAD1_sel
beq @x
lda keysTapB
beq @x
lda drumkitClearValues,y
cpy #DRUMKIT_COLUMN_ROOT
bne @notRootClear
ldy editorCurrentDrumkit
sta SRAM_DRUMKIT_ROOTS,y
ldy drumkitCursorX
bpl @clearRoot
@notRootClear: sta (drumkitVector),y
@clearRoot: sta editBuffer
jmp editDrumkitUpdateScreenValue
@x: rts
drumkitKeysTapA: lda keysTapA
beq @x
.IF 0=1
lda PAD1_fireb
beq @notDel
lda drumkitClearValues,y
cpy #DRUMKIT_COLUMN_ROOT
bne @notRootClear
ldy editorCurrentDrumkit
sta SRAM_DRUMKIT_ROOTS,y
ldy drumkitCursorX
bpl @clearRoot
@notRootClear: sta (drumkitVector),y
@clearRoot: sta editBuffer
jmp editDrumkitUpdateScreenValue
.ENDIF
@notDel:
lda editDrumkitLastValue,y
cpy #DRUMKIT_COLUMN_ROOT
bne @tapEdit1
ldy editorCurrentDrumkit
sta SRAM_DRUMKIT_ROOTS,y
ldy drumkitCursorX
jmp @tapEdit0
@tapEdit1: sta (drumkitVector),y
@tapEdit0: sta editBuffer
jsr editDrumkitUpdateScreenValue
@x: rts
drumkitClearValues:
.BYTE $00,$0F,$00,$00,$00
.BYTE $00
drumkitMaxValues:
.BYTE MAX_NUMBER_OF_SAMPLES,$10,$FF,$FF,1
drumkitPositiveAdd:
.BYTE $10,1,$10,$10,1,12
drumkitNegativeAdd:
.BYTE -16,-1,-16,-16,-1,-12
editDrumkitUpdateScreenValue:
pha
ldx drumkitCursorY
lda rowOffsetDrumkit,x
ldx drumkitCursorX
clc
adc columnOffsetDrumkit,x
tax
lda drumkitCursorX
cmp #DRUMKIT_COLUMN_ROOT
bne @notRoot
pla
jsr printEditorNote
rts
@notRoot: cmp #DRUMKIT_COLUMN_LOOP
bne @a
pla
tay
lda yesNoSwitch,y
sta windowBuffer,x
rts
@a: pla
jsr phexWindow
rts
writeDrumkitScreen:
ldx #$00
ldy drumkitFirstRow ;first write row numbers to buffer
@a: tya
jsr phexRow
iny
cpx #(12 *2)
bcc @a
lda #CHR_SPACE ;only 12 rows so clear remaining numbers
@a0: sta rowBuffer,x
inx
cpx #(16 * 2)
bcc @a0
lda #<windowDrumkit
sta tmp0
lda #>windowDrumkit
sta tmp1
ldy #$00
@c: lda (tmp0),y
sta windowBuffer,y
iny
cpy #(14*16)
bcc @c
ldx editorCurrentDrumkit
lda editDrumkitAddressLo,x
sta tmp0
lda editDrumkitAddressHi,x
sta tmp1
ldx #$00
ldy #$00
@b: lda (tmp0),y ;note
jsr phexWindow
lda #CHR_SPACE
sta windowBuffer,x
inx
iny
lda (tmp0),y ;note
jsr phexWindow
lda #CHR_SPACE
sta windowBuffer,x
inx
iny
lda (tmp0),y ;note
jsr phexWindow
lda #CHR_SPACE
sta windowBuffer,x
inx
iny
lda (tmp0),y ;note
jsr phexWindow
lda #CHR_SPACE
sta windowBuffer,x
inx
iny
lda (tmp0),y
beq @d
lda #CHR_Y
bne @d0
@d: lda #CHR_N
@d0: sta windowBuffer,x
inx
lda #CHR_SPACE
sta windowBuffer,x
iny
inx
cpx #(12 * 14)
bcc @b
ldx #(13 *14)+10
ldy editorCurrentDrumkit
lda SRAM_DRUMKIT_ROOTS,y
jsr printEditorNote
writeDrumkitThisNote:
ldx #(14*14)+10
ldy editorCurrentDrumkit
lda drumkitCursorY
cmp #$0C
bcc @a
lda #$0B
@a: clc
adc SRAM_DRUMKIT_ROOTS,y
jsr printEditorNote2
rts
writeDrumkitHeaderFooter:
ldx #$00 ;write header and title bars to buffer
@c: lda titleDrumkit,x
sta titleBuffer,x
lda headerDrumkit,x
sta headerBuffer,x
inx
cpx #$11
bne @c
ldx #$0A ;print current chain number in title bar
lda editorCurrentDrumkit
jsr phexTitle
rts
drumkitPlayNote: ldy drumkitCursorX
cpy #DRUMKIT_COLUMN_ROOT
bne @a
rts
@a: .IF SRAM_MAP=32
lda #SRAM_HEADER_BANK
jsr setMMC1r1
.ENDIF
lda SRAM_HEADER_PRELISTEN
beq @x
@b: lda editorPlayingNote
bne @playing
.IF SRAM_MAP=32
lda #SRAM_DRUMKIT_BANK
jsr setMMC1r1
.ENDIF
ldy drumkitCursorX
lda editBuffer
sta (drumkitVector),y
lda #$01
sta editorPlayingNote
ldy drumkitCursorY
sty tmp2 ;key number
lda drumkitRowsIndex,y
tay
ldx editorCurrentDrumkit
lda SRAM_DRUMKIT_ROOTS,x
clc
adc tmp2
sta plyrCurrentNote+$04
lda editDrumkitAddressLo,x
sta tmp0
lda editDrumkitAddressHi,x
sta tmp1
lda (tmp0),y
sta plyrInstrumentCopyE,y
iny
lda (tmp0),y
sta plyrInstrumentCopyE,y
iny
lda (tmp0),y
sta plyrInstrumentCopyE,y
iny
lda (tmp0),y
sta plyrInstrumentCopyE,y
iny
lda (tmp0),y
sta plyrInstrumentCopyE,y
ldy editorCurrentTrack
lda #$01
sta plyrKeyOn,y
lda #$00
sta plyrRetriggerSpeed,y
@playing: ldx editorCurrentTrack
lda #$08
sta plyrKillCounter,x
@x: .IF SRAM_MAP=32
lda #SRAM_DRUMKIT_BANK
jsr setMMC1r1
.ENDIF
rts
drumkitStopNote: ldy patternCursorX
cpy #PATTERN_COLUMN_NOTE
bne @x
lda SRAM_HEADER_PRELISTEN
beq @x
lda #$00
sta editorPlayingNote
ldy editorCurrentTrack
lda #$01
sta plyrKillCounter,y
lda #$00
sta plyrKeyOn,y
lda #$FF
sta patternLastNote
@x: rts
drumkitCursorColumns:
.BYTE $53,$53+(3*8),$53+(6*8),$53+(9*8),$53+(12*8)
.BYTE $53+(10*8)
drumkitCursorRows:
.REPEAT 16,i
.BYTE $28+(i*8)
.ENDREPEAT
rowOffsetDrumkit:
.REPEAT 16,i
.BYTE i*14
.ENDREPEAT
columnOffsetDrumkit:
.BYTE 0,3,6,9,12
.BYTE 10
;
;0 = no cursor, 1=8x8, 2=8x16, 3=8x24
;
drumkitColumnCursorType:
.BYTE 2,2,2,2,1
.BYTE 3