@@ -17,6 +17,8 @@ UBYTE mus_done1, mus_done2, mus_done3, mus_done4;
17
17
UWORD mus_freq1 , mus_freq2 , mus_freq3 ;
18
18
UBYTE mus_freq4 ;
19
19
UBYTE * mus_data1 , * mus_data2 , * mus_data3 , * mus_data4 ;
20
+ UBYTE * mus_data1_bak , * mus_data2_bak , * mus_data3_bak , * mus_data4_bak ;
21
+ UBYTE * mus_wave ;
20
22
UBYTE * mus_loop1 , * mus_loop2 , * mus_loop3 , * mus_loop4 ;
21
23
UBYTE mus_octave1 , mus_octave2 , mus_octave3 , mus_octave4 ;
22
24
UBYTE mus_length1 , mus_length2 , mus_length3 , mus_length4 ;
@@ -25,7 +27,8 @@ UBYTE mus_env1, mus_env2, mus_env4;
25
27
UBYTE mus_pan1 , mus_pan2 , mus_pan3 , mus_pan4 ;
26
28
UBYTE mus_duty1 , mus_duty2 ;
27
29
UBYTE mus_wait1 , mus_wait2 , mus_wait3 , mus_wait4 ;
28
- UWORD mus_target1 , mus_target2 , mus_target4 ;
30
+ UWORD mus_target1 , mus_target2 ;
31
+ UBYTE mus_target4 ;
29
32
UBYTE mus_slide1 , mus_slide2 , mus_slide4 ;
30
33
UBYTE mus_porta1 , mus_porta2 , mus_porta4 ;
31
34
UBYTE mus_vib_speed1 , mus_vib_speed2 ;
@@ -34,6 +37,7 @@ UBYTE mus_vib_pos1, mus_vib_pos2;
34
37
UBYTE mus_vib_delay1 , mus_vib_delay2 ;
35
38
UBYTE mus_noise_step ;
36
39
UBYTE mus_po1 , mus_po2 , mus_po3 ;
40
+ UBYTE mus_macro1 , mus_macro2 , mus_macro3 , mus_macro4 ;
37
41
38
42
UBYTE * mus_rep1 [MAX_REPEATS ], * mus_rep2 [MAX_REPEATS ], * mus_rep3 [MAX_REPEATS ], * mus_rep4 [MAX_REPEATS ];
39
43
UBYTE mus_repeats1 [MAX_REPEATS ], mus_repeats2 [MAX_REPEATS ], mus_repeats3 [MAX_REPEATS ], mus_repeats4 [MAX_REPEATS ];
@@ -63,10 +67,11 @@ void mus_init(UBYTE *song_data) {
63
67
mus_step = 0U ;
64
68
65
69
mus_song = song_data ;
66
- mus_data1 = mus_loop1 = mus_song + ((UWORD * )mus_song )[CHN1_OFFSET ];
67
- mus_data2 = mus_loop2 = mus_song + ((UWORD * )mus_song )[CHN2_OFFSET ];
68
- mus_data3 = mus_loop3 = mus_song + ((UWORD * )mus_song )[CHN3_OFFSET ];
69
- mus_data4 = mus_loop4 = mus_song + ((UWORD * )mus_song )[CHN4_OFFSET ];
70
+ mus_data1 = mus_loop1 = song_data + ((UWORD * )song_data )[0 ];
71
+ mus_data2 = mus_loop2 = song_data + ((UWORD * )song_data )[1 ];
72
+ mus_data3 = mus_loop3 = song_data + ((UWORD * )song_data )[2 ];
73
+ mus_data4 = mus_loop4 = song_data + ((UWORD * )song_data )[3 ];
74
+ mus_wave = song_data + ((UWORD * )song_data )[4 ];
70
75
71
76
mus_enabled1 = mus_enabled4 = 1U ;
72
77
mus_done1 = mus_done2 = mus_done3 = mus_done4 = 0U ;
@@ -83,6 +88,7 @@ void mus_init(UBYTE *song_data) {
83
88
mus_noise_step = 0U ;
84
89
mus_po1 = mus_po2 = mus_po3 = 128U ;
85
90
mus_pan1 = mus_pan2 = mus_pan3 = mus_pan4 = 0x11U ;
91
+ mus_macro1 = mus_macro2 = mus_macro3 = mus_macro4 = 0U ;
86
92
87
93
for (i = 0U ; i != MAX_REPEATS ; ++ i ) {
88
94
mus_repeats1 [i ] = 0U ;
@@ -120,7 +126,7 @@ void mus_disable4() {
120
126
void mus_restore1 () {
121
127
mus_enabled1 = 2U ;
122
128
NR51_REG = (NR51_REG & 0xEEU ) | mus_pan1 ;
123
- NR11_REG = mus_duty1 << 5 ;
129
+ NR11_REG = mus_duty1 ;
124
130
NR12_REG = 0U ;
125
131
NR14_REG = 0x80U ;
126
132
}
@@ -143,11 +149,12 @@ void mus_update() {
143
149
mus_update2 ();
144
150
mus_update3 ();
145
151
mus_update4 ();
152
+ mus_step ++ ;
146
153
}
147
154
148
155
void mus_update1 () {
149
156
UBYTE note ;
150
- UWORD vib_freq ;
157
+ UWORD tmp_freq ;
151
158
152
159
if (mus_slide1 && !(mus_step & 3U )) {
153
160
if (mus_target1 > mus_freq1 ) {
@@ -173,11 +180,11 @@ void mus_update1() {
173
180
}
174
181
else if (mus_vib_speed1 ) {
175
182
mus_vib_pos1 = (mus_vib_pos1 + mus_vib_speed1 ) & 63U ;
176
- vib_freq = mus_freq1 - * mus_vib_table1 + mus_vib_table1 [mus_vib_pos1 ];
183
+ tmp_freq = mus_freq1 - * mus_vib_table1 + mus_vib_table1 [mus_vib_pos1 ];
177
184
178
185
if (mus_enabled1 ) {
179
- NR13_REG = (UBYTE )vib_freq ;
180
- NR14_REG = vib_freq >> 8 ;
186
+ NR13_REG = (UBYTE )tmp_freq ;
187
+ NR14_REG = tmp_freq >> 8 ;
181
188
}
182
189
}
183
190
@@ -202,10 +209,11 @@ void mus_update1() {
202
209
mus_freq1 = 0U ;
203
210
if (mus_enabled1 ) NR12_REG = 0U ;
204
211
} else {
212
+ tmp_freq = freq [(mus_octave1 << 4 ) + note - MUS_FIRST_NOTE ] + mus_po1 - 128U ;
205
213
if (mus_porta1 ) {
206
- mus_target1 = freq [( mus_octave1 << 4 ) + note - MUS_FIRST_NOTE ] + mus_po1 - 128U ;
214
+ mus_target1 = tmp_freq ;
207
215
} else {
208
- mus_freq1 = freq [( mus_octave1 << 4 ) + note - MUS_FIRST_NOTE ] + mus_po1 - 128U ;
216
+ mus_freq1 = tmp_freq ;
209
217
}
210
218
if (mus_enabled1 ) NR12_REG = mus_volume1 | mus_env1 ;
211
219
}
@@ -242,7 +250,7 @@ void mus_update1() {
242
250
break ;
243
251
case T_WAVEDUTY :
244
252
mus_duty1 = * mus_data1 ++ ;
245
- if (mus_enabled1 ) NR11_REG = mus_duty1 << 5 ;
253
+ if (mus_enabled1 ) NR11_REG = mus_duty1 ;
246
254
break ;
247
255
case T_PAN :
248
256
mus_pan1 = * mus_data1 ++ ;
@@ -314,23 +322,32 @@ void mus_update1() {
314
322
break ;
315
323
case T_WAVE :
316
324
break ;
325
+ case T_MACRO :
326
+ note = * mus_data1 ++ ;
327
+ mus_data1_bak = mus_data1 ;
328
+ mus_data1 = mus_song + ((UWORD * )mus_song )[5 + note ];
329
+ mus_macro1 = 1U ;
330
+ break ;
317
331
case T_EOF :
318
- mus_data1 = mus_loop1 ;
319
- mus_done1 = 1U ;
320
- if (* mus_data1 == T_EOF ) {
321
- mus_wait1 = 255U ;
322
- return ;
332
+ if (mus_macro1 ) {
333
+ mus_data1 = mus_data1_bak ;
334
+ mus_macro1 = 0U ;
335
+ } else {
336
+ mus_data1 = mus_loop1 ;
337
+ mus_done1 = 1U ;
338
+ if (* mus_data1 == T_EOF ) {
339
+ mus_wait1 = 255U ;
340
+ return ;
341
+ }
323
342
}
324
343
break ;
325
344
}
326
345
}
327
-
328
- mus_step ++ ;
329
346
}
330
347
331
348
void mus_update2 () {
332
349
UBYTE note ;
333
- UWORD vib_freq ;
350
+ UWORD tmp_freq ;
334
351
335
352
if (mus_slide2 && !(mus_step & 3U )) {
336
353
if (mus_target2 > mus_freq2 ) {
@@ -354,10 +371,10 @@ void mus_update2() {
354
371
}
355
372
else if (mus_vib_speed2 ) {
356
373
mus_vib_pos2 = (mus_vib_pos2 + mus_vib_speed2 ) & 63U ;
357
- vib_freq = mus_freq2 - * mus_vib_table2 + mus_vib_table2 [mus_vib_pos2 ];
374
+ tmp_freq = mus_freq2 - * mus_vib_table2 + mus_vib_table2 [mus_vib_pos2 ];
358
375
359
- NR23_REG = (UBYTE )vib_freq ;
360
- NR24_REG = vib_freq >> 8 ;
376
+ NR23_REG = (UBYTE )tmp_freq ;
377
+ NR24_REG = tmp_freq >> 8 ;
361
378
}
362
379
363
380
if (mus_wait2 ) {
@@ -381,10 +398,11 @@ void mus_update2() {
381
398
mus_freq2 = 0U ;
382
399
NR22_REG = 0U ;
383
400
} else {
401
+ tmp_freq = freq [(mus_octave2 << 4 ) + note - MUS_FIRST_NOTE ] + mus_po2 - 128U ;
384
402
if (mus_porta2 ) {
385
- mus_target2 = freq [( mus_octave2 << 4 ) + note - MUS_FIRST_NOTE ] + mus_po2 - 128U ;
403
+ mus_target2 = tmp_freq ;
386
404
} else {
387
- mus_freq2 = freq [( mus_octave2 << 4 ) + note - MUS_FIRST_NOTE ] + mus_po2 - 128U ;
405
+ mus_freq2 = tmp_freq ;
388
406
}
389
407
NR22_REG = mus_volume2 | mus_env2 ;
390
408
}
@@ -415,7 +433,7 @@ void mus_update2() {
415
433
break ;
416
434
case T_WAVEDUTY :
417
435
mus_duty2 = * mus_data2 ++ ;
418
- NR21_REG = mus_duty2 << 5 ;
436
+ NR21_REG = mus_duty2 ;
419
437
break ;
420
438
case T_PAN :
421
439
mus_pan2 = * mus_data2 ++ ;
@@ -487,12 +505,23 @@ void mus_update2() {
487
505
break ;
488
506
case T_WAVE :
489
507
break ;
508
+ case T_MACRO :
509
+ note = * mus_data2 ++ ;
510
+ mus_data2_bak = mus_data2 ;
511
+ mus_data2 = mus_song + ((UWORD * )mus_song )[5 + note ];
512
+ mus_macro2 = 1U ;
513
+ break ;
490
514
case T_EOF :
491
- mus_data2 = mus_loop2 ;
492
- mus_done2 = 1U ;
493
- if (* mus_data2 == T_EOF ) {
494
- mus_wait2 = 255U ;
495
- return ;
515
+ if (mus_macro2 ) {
516
+ mus_data2 = mus_data2_bak ;
517
+ mus_macro2 = 0U ;
518
+ } else {
519
+ mus_data2 = mus_loop2 ;
520
+ mus_done2 = 1U ;
521
+ if (* mus_data2 == T_EOF ) {
522
+ mus_wait2 = 255U ;
523
+ return ;
524
+ }
496
525
}
497
526
break ;
498
527
}
@@ -594,25 +623,36 @@ void mus_update3() {
594
623
case T_WAVE :
595
624
note = * mus_data3 ++ ;
596
625
NR30_REG = 0x0U ;
597
- memcpy (0xFF30 , mus_song + WAVE_OFFSET + (note << 4 ), 16U );
626
+ memcpy (0xFF30 , mus_wave + (note << 4 ), 16U );
598
627
NR30_REG = 0x80U ;
599
628
break ;
629
+ case T_MACRO :
630
+ note = * mus_data3 ++ ;
631
+ mus_data3_bak = mus_data3 ;
632
+ mus_data3 = mus_song + ((UWORD * )mus_song )[5 + note ];
633
+ mus_macro3 = 1U ;
634
+ break ;
600
635
case T_EOF :
601
- mus_data3 = mus_loop3 ;
602
- mus_done3 = 1U ;
603
- if (* mus_data3 == T_EOF ) {
604
- mus_wait3 = 255U ;
605
- return ;
636
+ if (mus_macro3 ) {
637
+ mus_data3 = mus_data3_bak ;
638
+ mus_macro3 = 0U ;
639
+ } else {
640
+ mus_data3 = mus_loop3 ;
641
+ mus_done3 = 1U ;
642
+ if (* mus_data3 == T_EOF ) {
643
+ mus_wait3 = 255U ;
644
+ return ;
645
+ }
606
646
}
607
647
break ;
608
648
}
609
649
}
610
650
}
611
651
612
652
void mus_update4 () {
613
- UBYTE note ;
653
+ UBYTE note , tmp_freq ;
614
654
615
- if (mus_slide4 & !(mus_step & 3U )) {
655
+ if (mus_slide4 && !(mus_step & 3U )) {
616
656
if (mus_target4 > mus_freq4 ) {
617
657
mus_freq4 += mus_slide4 ;
618
658
if (mus_freq4 > mus_target4 ) {
@@ -648,10 +688,11 @@ void mus_update4() {
648
688
mus_freq4 = 0U ;
649
689
if (mus_enabled4 ) NR42_REG = 0U ;
650
690
} else {
691
+ tmp_freq = noise_freq [((mus_octave4 - MUS_NOISE_FIRST_OCTAVE ) << 4 ) + note - MUS_FIRST_NOTE ];
651
692
if (mus_porta4 ) {
652
- mus_target4 = noise_freq [(( mus_octave4 - MUS_NOISE_FIRST_OCTAVE ) << 4 ) + note - MUS_FIRST_NOTE ] ;
693
+ mus_target4 = tmp_freq ;
653
694
} else {
654
- mus_freq4 = noise_freq [(( mus_octave4 - MUS_NOISE_FIRST_OCTAVE ) << 4 ) + note - MUS_FIRST_NOTE ] ;
695
+ mus_freq4 = tmp_freq ;
655
696
}
656
697
if (mus_enabled4 ) NR42_REG = mus_volume4 | mus_env4 ;
657
698
}
@@ -699,7 +740,7 @@ void mus_update4() {
699
740
mus_slide4 = * mus_data4 ++ ;
700
741
mus_porta4 = 0U ;
701
742
if (mus_slide4 >= 128U ) {
702
- mus_target4 = 0xFFFFU ;
743
+ mus_target4 = 0xFFU ;
703
744
mus_slide4 = mus_slide4 - 128U ;
704
745
} else {
705
746
mus_target4 = 0U ;
@@ -740,12 +781,23 @@ void mus_update4() {
740
781
break ;
741
782
case T_WAVE :
742
783
break ;
784
+ case T_MACRO :
785
+ note = * mus_data4 ++ ;
786
+ mus_data4_bak = mus_data4 ;
787
+ mus_data4 = mus_song + ((UWORD * )mus_song )[5 + note ];
788
+ mus_macro4 = 1U ;
789
+ break ;
743
790
case T_EOF :
744
- mus_data4 = mus_loop4 ;
745
- mus_done4 = 1U ;
746
- if (* mus_data4 == T_EOF ) {
747
- mus_wait4 = 255U ;
748
- return ;
791
+ if (mus_macro4 ) {
792
+ mus_data4 = mus_data4_bak ;
793
+ mus_macro4 = 0U ;
794
+ } else {
795
+ mus_data4 = mus_loop4 ;
796
+ mus_done4 = 1U ;
797
+ if (* mus_data4 == T_EOF ) {
798
+ mus_wait4 = 255U ;
799
+ return ;
800
+ }
749
801
}
750
802
break ;
751
803
}
0 commit comments