Skip to content

Commit aa0864d

Browse files
committed
Merged DX fork: Reuse macro data
1 parent 91ab921 commit aa0864d

File tree

6 files changed

+284
-98
lines changed

6 files changed

+284
-98
lines changed

driver/Makefile

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#CC=lcc
2+
CC=/home/simon/share/sdcc-3.8.0/bin/sdcc -mgbz80 --no-std-crt0 -I /home/simon/gbdk-n/include -I /home/simon/gbdk-n/include/asm
3+
4+
default: ASMFILES
5+
6+
ASMFILES: freq.asm music.asm noisefreq.asm player.asm vib.asm
7+
8+
%.asm: %.c
9+
$(CC) -S $<; python fixcode.py $@ $@

driver/fixcode.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env python3
2+
import argparse
3+
import re
4+
5+
6+
def main():
7+
parser = argparse.ArgumentParser()
8+
parser.add_argument("infile", help="Code file.", type=str)
9+
parser.add_argument("outfile", help="Outfile file.", type=str)
10+
args = parser.parse_args()
11+
12+
infile = open(args.infile, "r")
13+
lines = infile.readlines()
14+
infile.close()
15+
16+
outfile = open(args.outfile, "w")
17+
for line in lines:
18+
skip = False
19+
20+
if re.match("^\s*\.optsdcc", line):
21+
line = "; " + line
22+
23+
if re.match("^\s*;", line) and len(line) > 128:
24+
line = line[0:127] + "\n"
25+
skip = skip or re.match("^\s*.area\s+_CABS", line) != None
26+
skip = skip or re.match("^\s*.area\s+_DABS", line) != None
27+
28+
if not skip:
29+
outfile.write(line)
30+
31+
outfile.close()
32+
33+
34+
if __name__ == "__main__":
35+
main()

driver/music.c

+100-48
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ UBYTE mus_done1, mus_done2, mus_done3, mus_done4;
1717
UWORD mus_freq1, mus_freq2, mus_freq3;
1818
UBYTE mus_freq4;
1919
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;
2022
UBYTE *mus_loop1, *mus_loop2, *mus_loop3, *mus_loop4;
2123
UBYTE mus_octave1, mus_octave2, mus_octave3, mus_octave4;
2224
UBYTE mus_length1, mus_length2, mus_length3, mus_length4;
@@ -25,7 +27,8 @@ UBYTE mus_env1, mus_env2, mus_env4;
2527
UBYTE mus_pan1, mus_pan2, mus_pan3, mus_pan4;
2628
UBYTE mus_duty1, mus_duty2;
2729
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;
2932
UBYTE mus_slide1, mus_slide2, mus_slide4;
3033
UBYTE mus_porta1, mus_porta2, mus_porta4;
3134
UBYTE mus_vib_speed1, mus_vib_speed2;
@@ -34,6 +37,7 @@ UBYTE mus_vib_pos1, mus_vib_pos2;
3437
UBYTE mus_vib_delay1, mus_vib_delay2;
3538
UBYTE mus_noise_step;
3639
UBYTE mus_po1, mus_po2, mus_po3;
40+
UBYTE mus_macro1, mus_macro2, mus_macro3, mus_macro4;
3741

3842
UBYTE *mus_rep1[MAX_REPEATS], *mus_rep2[MAX_REPEATS], *mus_rep3[MAX_REPEATS], *mus_rep4[MAX_REPEATS];
3943
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) {
6367
mus_step = 0U;
6468

6569
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];
7075

7176
mus_enabled1 = mus_enabled4 = 1U;
7277
mus_done1 = mus_done2 = mus_done3 = mus_done4 = 0U;
@@ -83,6 +88,7 @@ void mus_init(UBYTE *song_data) {
8388
mus_noise_step = 0U;
8489
mus_po1 = mus_po2 = mus_po3 = 128U;
8590
mus_pan1 = mus_pan2 = mus_pan3 = mus_pan4 = 0x11U;
91+
mus_macro1 = mus_macro2 = mus_macro3 = mus_macro4 = 0U;
8692

8793
for(i = 0U; i != MAX_REPEATS; ++i) {
8894
mus_repeats1[i] = 0U;
@@ -120,7 +126,7 @@ void mus_disable4() {
120126
void mus_restore1() {
121127
mus_enabled1 = 2U;
122128
NR51_REG = (NR51_REG & 0xEEU) | mus_pan1;
123-
NR11_REG = mus_duty1 << 5;
129+
NR11_REG = mus_duty1;
124130
NR12_REG = 0U;
125131
NR14_REG = 0x80U;
126132
}
@@ -143,11 +149,12 @@ void mus_update() {
143149
mus_update2();
144150
mus_update3();
145151
mus_update4();
152+
mus_step++;
146153
}
147154

148155
void mus_update1() {
149156
UBYTE note;
150-
UWORD vib_freq;
157+
UWORD tmp_freq;
151158

152159
if(mus_slide1 && !(mus_step & 3U)) {
153160
if(mus_target1 > mus_freq1) {
@@ -173,11 +180,11 @@ void mus_update1() {
173180
}
174181
else if(mus_vib_speed1) {
175182
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];
177184

178185
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;
181188
}
182189
}
183190

@@ -202,10 +209,11 @@ void mus_update1() {
202209
mus_freq1 = 0U;
203210
if(mus_enabled1) NR12_REG = 0U;
204211
} else {
212+
tmp_freq = freq[(mus_octave1 << 4) + note - MUS_FIRST_NOTE] + mus_po1 - 128U;
205213
if(mus_porta1) {
206-
mus_target1 = freq[(mus_octave1 << 4) + note - MUS_FIRST_NOTE] + mus_po1 - 128U;
214+
mus_target1 = tmp_freq;
207215
} else {
208-
mus_freq1 = freq[(mus_octave1 << 4) + note - MUS_FIRST_NOTE] + mus_po1 - 128U;
216+
mus_freq1 = tmp_freq;
209217
}
210218
if(mus_enabled1) NR12_REG = mus_volume1 | mus_env1;
211219
}
@@ -242,7 +250,7 @@ void mus_update1() {
242250
break;
243251
case T_WAVEDUTY:
244252
mus_duty1 = *mus_data1++;
245-
if(mus_enabled1) NR11_REG = mus_duty1 << 5;
253+
if(mus_enabled1) NR11_REG = mus_duty1;
246254
break;
247255
case T_PAN:
248256
mus_pan1 = *mus_data1++;
@@ -314,23 +322,32 @@ void mus_update1() {
314322
break;
315323
case T_WAVE:
316324
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;
317331
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+
}
323342
}
324343
break;
325344
}
326345
}
327-
328-
mus_step++;
329346
}
330347

331348
void mus_update2() {
332349
UBYTE note;
333-
UWORD vib_freq;
350+
UWORD tmp_freq;
334351

335352
if(mus_slide2 && !(mus_step & 3U)) {
336353
if(mus_target2 > mus_freq2) {
@@ -354,10 +371,10 @@ void mus_update2() {
354371
}
355372
else if(mus_vib_speed2) {
356373
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];
358375

359-
NR23_REG = (UBYTE)vib_freq;
360-
NR24_REG = vib_freq >> 8;
376+
NR23_REG = (UBYTE)tmp_freq;
377+
NR24_REG = tmp_freq >> 8;
361378
}
362379

363380
if(mus_wait2) {
@@ -381,10 +398,11 @@ void mus_update2() {
381398
mus_freq2 = 0U;
382399
NR22_REG = 0U;
383400
} else {
401+
tmp_freq = freq[(mus_octave2 << 4) + note - MUS_FIRST_NOTE] + mus_po2 - 128U;
384402
if(mus_porta2) {
385-
mus_target2 = freq[(mus_octave2 << 4) + note - MUS_FIRST_NOTE] + mus_po2 - 128U;
403+
mus_target2 = tmp_freq;
386404
} else {
387-
mus_freq2 = freq[(mus_octave2 << 4) + note - MUS_FIRST_NOTE] + mus_po2 - 128U;
405+
mus_freq2 = tmp_freq;
388406
}
389407
NR22_REG = mus_volume2 | mus_env2;
390408
}
@@ -415,7 +433,7 @@ void mus_update2() {
415433
break;
416434
case T_WAVEDUTY:
417435
mus_duty2 = *mus_data2++;
418-
NR21_REG = mus_duty2 << 5;
436+
NR21_REG = mus_duty2;
419437
break;
420438
case T_PAN:
421439
mus_pan2 = *mus_data2++;
@@ -487,12 +505,23 @@ void mus_update2() {
487505
break;
488506
case T_WAVE:
489507
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;
490514
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+
}
496525
}
497526
break;
498527
}
@@ -594,25 +623,36 @@ void mus_update3() {
594623
case T_WAVE:
595624
note = *mus_data3++;
596625
NR30_REG = 0x0U;
597-
memcpy(0xFF30, mus_song + WAVE_OFFSET + (note << 4), 16U);
626+
memcpy(0xFF30, mus_wave + (note << 4), 16U);
598627
NR30_REG = 0x80U;
599628
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;
600635
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+
}
606646
}
607647
break;
608648
}
609649
}
610650
}
611651

612652
void mus_update4() {
613-
UBYTE note;
653+
UBYTE note, tmp_freq;
614654

615-
if(mus_slide4 & !(mus_step & 3U)) {
655+
if(mus_slide4 && !(mus_step & 3U)) {
616656
if(mus_target4 > mus_freq4) {
617657
mus_freq4 += mus_slide4;
618658
if(mus_freq4 > mus_target4) {
@@ -648,10 +688,11 @@ void mus_update4() {
648688
mus_freq4 = 0U;
649689
if(mus_enabled4) NR42_REG = 0U;
650690
} else {
691+
tmp_freq = noise_freq[((mus_octave4-MUS_NOISE_FIRST_OCTAVE) << 4) + note - MUS_FIRST_NOTE];
651692
if(mus_porta4) {
652-
mus_target4 = noise_freq[((mus_octave4-MUS_NOISE_FIRST_OCTAVE) << 4) + note - MUS_FIRST_NOTE];
693+
mus_target4 = tmp_freq;
653694
} else {
654-
mus_freq4 = noise_freq[((mus_octave4-MUS_NOISE_FIRST_OCTAVE) << 4) + note - MUS_FIRST_NOTE];
695+
mus_freq4 = tmp_freq;
655696
}
656697
if(mus_enabled4) NR42_REG = mus_volume4 | mus_env4;
657698
}
@@ -699,7 +740,7 @@ void mus_update4() {
699740
mus_slide4 = *mus_data4++;
700741
mus_porta4 = 0U;
701742
if(mus_slide4 >= 128U) {
702-
mus_target4 = 0xFFFFU;
743+
mus_target4 = 0xFFU;
703744
mus_slide4 = mus_slide4 - 128U;
704745
} else {
705746
mus_target4 = 0U;
@@ -740,12 +781,23 @@ void mus_update4() {
740781
break;
741782
case T_WAVE:
742783
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;
743790
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+
}
749801
}
750802
break;
751803
}

driver/notes.h

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ enum E_CMD {
2121
T_TEMPO,
2222
T_NOISE_STEP,
2323
T_WAVE,
24+
T_MACRO,
2425
T_EOF,
2526
T_C,
2627
T_Cs,

0 commit comments

Comments
 (0)