-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWave_EffectEditor.s
More file actions
633 lines (569 loc) · 9.09 KB
/
Wave_EffectEditor.s
File metadata and controls
633 lines (569 loc) · 9.09 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
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
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
;Effect Editor
EffectKeyDescriptionIDList
.byt 8,9,77,14,15,67,18,19,20,22,23,55,56,57,58,59,65,60,38,39,75,63,64,62,27,28,30,31,32,34,35,36,37,73
.byt 102
EffectKeyAreaIDList
.dsb 11,78
.dsb 9,81
.byt 82
.dsb 3,81
.dsb 9,80
.byt 82
.byt 79
EffectKeyVectorLo
.byt <ee_Up
.byt <ee_Down
.byt <GenericHelp
.byt <ee_PreviousEffect
.byt <ee_NextEffect
.byt <ee_Use
.byt <ee_SwitchList
.byt <ee_SwitchPattern
.byt <ee_SwitchSample
.byt <ee_SwitchOrnament
.byt <ee_SwitchMenu
.byt <ee_ToggleNoise
.byt <ee_ToggleEG
.byt <ee_ToneOff
.byt <ee_SetPitch
.byt <ee_SetVolume
.byt <ee_LoopHere
.byt <ee_SetEndLoop
.byt <ee_Increment
.byt <ee_Decrement
.byt <TurnOffMusic
.byt <ee_InsertGap
.byt <ee_DeleteGap
.byt <ee_Delete
.byt <ee_HighlightUp
.byt <ee_HighlightDown
.byt <ee_Copy
.byt <ee_Cut
.byt <ee_Paste
.byt <ee_Grab
.byt <ee_Drop
.byt <ee_CopyLast
.byt <ee_CopyNext
.byt <ee_Play
.byt <ee_WipeEffect
EffectKeyVectorHi
.byt >ee_Up
.byt >ee_Down
.byt >GenericHelp
.byt >ee_PreviousEffect
.byt >ee_NextEffect
.byt >ee_Use
.byt >ee_SwitchList
.byt >ee_SwitchPattern
.byt >ee_SwitchSample
.byt >ee_SwitchOrnament
.byt >ee_SwitchMenu
.byt >ee_ToggleNoise
.byt >ee_ToggleEG
.byt >ee_ToneOff
.byt >ee_SetPitch
.byt >ee_SetVolume
.byt >ee_LoopHere
.byt >ee_SetEndLoop
.byt >ee_Increment
.byt >ee_Decrement
.byt >TurnOffMusic
.byt >ee_InsertGap
.byt >ee_DeleteGap
.byt >ee_Delete
.byt >ee_HighlightUp
.byt >ee_HighlightDown
.byt >ee_Copy
.byt >ee_Cut
.byt >ee_Paste
.byt >ee_Grab
.byt >ee_Drop
.byt >ee_CopyLast
.byt >ee_CopyNext
.byt >ee_Play
.byt >ee_WipeEffect
ee_WipeEffect
jsr FetchEffectAddress
ldy #31
lda #00
.(
loop1 sta (effect),y
dey
bpl loop1
.)
ldx EffectID
lda #128
sta mmEffectLoops,x
rts
ee_Up
lda EffectCursorY
.(
beq skip1
dec EffectCursorY
skip2 rts
skip1 lda EffectBaseIndex
beq skip2
.)
dec EffectBaseIndex
rts
ee_Down
lda EffectCursorY
cmp #7
.(
bcs skip1
inc EffectCursorY
skip2 rts
skip1 lda EffectBaseIndex
cmp #31-7
bcs skip2
.)
inc EffectBaseIndex
rts
ee_PreviousEffect
;Prohibit switching if Effect invalid
jsr ValidateEffectAndReport
bcs ee_PreviousEffectSkip1
lda EffectID
beq ee_PreviousEffectSkip1
dec EffectID
ee_PreviousEffectRent1
lda #00
sta EffectCursorY
sta EffectBaseIndex
jsr DisplayEffectID
ee_PreviousEffectSkip1
rts
ee_NextEffect
;Prohibit switching if Effect invalid
jsr ValidateEffectAndReport
bcs ee_PreviousEffectSkip1
lda EffectID
cmp #14
bcs ee_PreviousEffectSkip1
inc EffectID
jmp ee_PreviousEffectRent1
ee_Use ;Switch to Pattern Editor and Insert this sample in the row
ldy PatternCursorY
jsr FetchPatternRowAddress
;What channel are we on?
ldy PatternCursorX
ldx PatternX2Channel,y
;Convert channel 0,1,2 to 3,6,9
ldy Channel2EffectOffset,x
lda (source),y
and #$F0
sta EffectTemp01
lda EffectID
clc
adc #1
ora EffectTemp01
sta (source),y
;Display it
jsr PatternPlot
;Now switch to PatternEditor
jmp ee_SwitchPattern
Channel2EffectOffset
.byt 3,6,9
ee_SwitchList
lda #LISTEDITOR
ee_SwitchCommon
pha
jsr ValidateEffectAndReport
.(
bcs skip1
pla
sta EditorID
rts
skip1 pla
rts
.)
ee_SwitchPattern
lda #PATTERNEDITOR
jmp ee_SwitchCommon
ee_SwitchOrnament
lda #ORNAMENTEDITOR
jmp ee_SwitchCommon
ee_SwitchSample
lda #SAMPLEVIEWER
jmp ee_SwitchCommon
ee_SwitchMenu
lda #TOPMENU
jmp ee_SwitchCommon
ee_ToggleNoise ;Toggle between Noise Off (1) and Set Noise (5)
jsr TurnOffMusic
jsr FetchEffectAddress
lda (effect),y
and #%00011111
sta EffectTemp01
lda (effect),y
and #%11100000
cmp #%00100000
.(
beq skip1
lda #%00100000
ora EffectTemp01
sta (effect),y
rts
skip1 lda #%10100000
.)
ee_ToggleNoiseRent1
ora EffectTemp01
sta (effect),y
rts
ee_ToggleEG ;Toggle between EG Off (2) and Set EGPer (6)
jsr TurnOffMusic
jsr FetchEffectAddress
lda (effect),y
and #%00011111
sta EffectTemp01
lda (effect),y
and #%11100000
cmp #%01000000
.(
beq skip1
lda #%01000000
ora EffectTemp01
sta (effect),y
rts
skip1 lda #%11000000
.)
jmp ee_ToggleNoiseRent1
ee_SetEndLoop
lda #0
jmp ee_SetPitchRent1
ee_Drop
lda Grabbed_EffectEntryByte
jmp ee_SetPitchRent1
ee_ToneOff
lda #%01100000
jmp ee_SetPitchRent1
ee_SetPitch
lda #32*7
ee_SetPitchRent1
pha
jsr TurnOffMusic
jsr FetchEffectAddress
pla
sta (effect),y
rts
ee_SetVolume
lda #32*4
jmp ee_SetPitchRent1
ee_LoopHere
jsr TurnOffMusic
ldx EffectID
lda EffectCursorY
clc
adc EffectBaseIndex
;If on same row as loop is already set then turn off looping
cmp mmEffectLoops,x
.(
bne skip1
lda #128
skip1 sta mmEffectLoops,x
.)
rts
ee_Increment
jsr TurnOffMusic
jsr FetchEffectAddress
lda (effect),y
and #%11100000
sta EffectTemp01
lda (effect),y
clc
adc #1
jmp ee_DecrementRent1
ee_Decrement
jsr TurnOffMusic
jsr FetchEffectAddress
lda (effect),y
and #%11100000
sta EffectTemp01
lda (effect),y
sec
sbc #1
ee_DecrementRent1
and #31
ora EffectTemp01
sta (effect),y
rts
ee_InsertGap
jsr TurnOffMusic
jsr FetchEffectAddress
sta EffectTemp01
ldy #30
.(
loop1 lda (effect),y
iny
sta (effect),y
dey
dey
bmi skip1
cpy EffectTemp01
bcs loop1
skip1 ldy EffectTemp01
.)
jmp ee_DeleteGapRent1
ee_DeleteGap
jsr TurnOffMusic
jsr FetchEffectAddress
.(
loop1 iny
lda (effect),y
dey
sta (effect),y
iny
cpy #31
bcc loop1
.)
ldy #31
ee_DeleteGapRent1
lda #00
sta (effect),y
rts
ee_Delete
jsr TurnOffMusic
jsr FetchEffectAddress
lda (effect),y
and #%11100000
ora #8*2
sta (effect),y
rts
ee_HighlightUp
;Cannot begin to highlight by highlighting up
lda eeHighlightingFlag
.(
beq skip1
jsr ee_Up
;Recede highlight end to next entry
lda EffectBaseIndex
clc
adc EffectCursorY
cmp eeHighlightStartY
bcs skip1
;Turn off highlighting
lda #00
sta eeHighlightingFlag
skip1 dec eeHighlightEndY
.)
rts
eeHighlightingFlag .byt 0
eeHighlightStartY .byt 0
eeHighlightEndY .byt 0
ee_HighlightDown
lda eeHighlightingFlag
bne eeContinueHighlightingDown
eeInitialiseHighlighting
;Allign Highlight to Channel group start
lda EffectBaseIndex
clc
adc EffectCursorY
sta eeHighlightStartY
sta eeHighlightEndY
lda #EFFECTEDITOR
sta CopyBufferContents
lda #1
sta eeHighlightingFlag
rts
eeContinueHighlightingDown
;Move List Cursor Right
jsr ee_Down
lda EffectBaseIndex
clc
adc EffectCursorY
sta eeHighlightEndY
rts
ee_Copy
lda eeHighlightingFlag
.(
beq skip1
jsr FetchEffectAddress
ldy eeHighlightStartY
ldx #00
loop1 lda (effect),y
sta CopyBuffer,x
inx
iny
cpy eeHighlightEndY
beq loop1
bcc loop1
lda #00
sta eeHighlightingFlag
lda #EFFECTEDITOR
sta CopyBufferContents
skip1 rts
.)
ee_Cut
jsr TurnOffMusic
lda eeHighlightingFlag
.(
beq skip1
jsr FetchEffectAddress
ldy eeHighlightStartY
ldx #00
loop1 lda (effect),y
sta CopyBuffer,x
lda #00
sta (effect),y
inx
iny
cpy eeHighlightEndY
beq loop1
bcc loop1
lda #00
sta eeHighlightingFlag
lda #EFFECTEDITOR
sta CopyBufferContents
skip1 rts
.)
ee_Paste
jsr TurnOffMusic
lda CopyBufferContents
cmp #EFFECTEDITOR
.(
bne skip1
lda eeHighlightEndY
sec
sbc eeHighlightStartY
sta EffectTemp01
jsr FetchEffectAddress
ldx #00
loop1 lda CopyBuffer,x
sta (effect),y
iny
cpy #32
bcs skip1
inx
cpx EffectTemp01
beq loop1
bcc loop1
skip1 rts
.)
ee_Grab
jsr FetchEffectAddress
lda (effect),y
sta Grabbed_EffectEntryByte
DisplayGrabbedEffectEntry
lda #<$BB80+24+40*18
sta screen
lda #>$BB80+24+40*18
sta screen+1
lda #"G"+128
ldy #00
sta (screen),y
jsr FetchEffectAddress
tya
ldy #01
ldx #128
jmp Display2DD
ee_CopyLast
jsr TurnOffMusic
jsr FetchEffectAddress
sty EffectTemp01
beq ee_CopySkip1
ldy EffectCursorY
dey
ee_CopyRent1
tya
clc
adc EffectBaseIndex
tay
lda (effect),y
ldy EffectTemp01
sta (effect),y
ee_CopySkip1
rts
ee_CopyNext
jsr TurnOffMusic
jsr FetchEffectAddress
sty EffectTemp01
cmp #31
beq ee_CopySkip1
ldy EffectCursorY
iny
jmp ee_CopyRent1
ee_Play
jsr ValidateEffectAndReport
.(
bcs skip3
sei
;Ensure music is stopped
lda #00
sta pzMusicElementActivity
sta pzPatternRowPlayFlag
sta pbFlag
sta pmEffectIndex
;Use this effect
lda EffectID
sta pmEffectID
;If Current Pattern Channel holds note then use that otherwise C-3
ldy PatternCursorY
jsr FetchPatternRowAddress
ldx PatternCursorX
ldy PatternX2ChannelsNoteOffset,x
lda (source),y
lsr
lsr
cmp #62
bcc skip1
lda #36
sta pmPatternNote
lda #15
sta pmPatternVolume
jmp skip2
skip1 sta pmPatternNote
;Use volume
lda (source),y
and #3
tax
lda pmEntriesRealVolume,x
sta pmPatternVolume
skip2
;Turn on Effect A
lda #1
sta pzMusicElementActivity
cli
skip3 rts
.)
ValidateEffectAndReport
jsr ValidateEffect
.(
bcc skip3
ldx #94
jsr DisplayPrompt_Message
sec
rts
skip3 ldx #95
.)
jsr DisplayPrompt_Message
clc
rts
ValidateEffect
;Ensure a loop contains at least one Volume or EGPER event
ldx EffectID
clc
lda mmEffectLoops,x
.(
bmi skip3
lda pmEffectAddressLo,x
sta source
lda pmEffectAddressHi,x
sta source+1
ldy #00
loop1 lda (source),y
and #%11100000
beq skip2
cmp #%11000000
beq skip4
cmp #%10000000
bne skip1
skip4 sty LastVolumeIndex
skip1 iny
cpy #31
bcc loop1
skip2 ldx EffectID
lda mmEffectLoops,x
cmp LastVolumeIndex
;Carry Clear Ok
skip3 rts
.)