dos33fsprogs/pt3_player/table_gen/z80_tone.c
2019-09-09 17:10:18 -04:00

323 lines
6.5 KiB
C

#include <stdio.h>
#include <string.h>
// 8*12
static unsigned short PT3NoteTable_ST[]={
0x0EF8,0x0E10,0x0D60,0x0C80,0x0BD8,0x0B28,0x0A88,0x09F0, // 50
0x0960,0x08E0,0x0858,0x07E0,0x077C,0x0708,0x06B0,0x0640, // 58
0x05EC,0x0594,0x0544,0x04F8,0x04B0,0x0470,0x042C,0x03FD, // 60
0x03BE,0x0384,0x0358,0x0320,0x02F6,0x02CA,0x02A2,0x027C, // 68
0x0258,0x0238,0x0216,0x01F8,0x01DF,0x01C2,0x01AC,0x0190, // 70
0x017B,0x0165,0x0151,0x013E,0x012C,0x011C,0x010A,0x00FC, // 78
0x00EF,0x00E1,0x00D6,0x00C8,0x00BD,0x00B2,0x00A8,0x009F, // 80
0x0096,0x008E,0x0085,0x007E,0x0077,0x0070,0x006B,0x0064, // 88 (g#5-D#6)
0x005E,0x0059,0x0054,0x004F,0x004B,0x0047,0x0042,0x003F, // 90 (e6-b6)
0x003B,0x0038,0x0035,0x0032,0x002F,0x002C,0x002A,0x0027, // 98 (c7-g7)
0x0025,0x0023,0x0021,0x001F,0x001D,0x001C,0x001A,0x0019, // a0 (G#7-d#8)
0x0017,0x0016,0x0015,0x0013,0x0012,0x0011,0x0010,0x000F // a8 (e8-b8)
};
/* Table #2 of Pro Tracker 3.4x - 3.5x */
static unsigned short PT3NoteTable_ASM_34_35[] = {
0x0D10,0x0C55,0x0BA4,0x0AFC,0x0A5F,0x09CA,0x093D,0x08B8,0x083B,0x07C5,0x0755,0x06EC,
0x0688,0x062A,0x05D2,0x057E,0x052F,0x04E5,0x049E,0x045C,0x041D,0x03E2,0x03AB,0x0376,
0x0344,0x0315,0x02E9,0x02BF,0x0298,0x0272,0x024F,0x022E,0x020F,0x01F1,0x01D5,0x01BB,
0x01A2,0x018B,0x0174,0x0160,0x014C,0x0139,0x0128,0x0117,0x0107,0x00F9,0x00EB,0x00DD,
0x00D1,0x00C5,0x00BA,0x00B0,0x00A6,0x009D,0x0094,0x008C,0x0084,0x007C,0x0075,0x006F,
0x0069,0x0063,0x005D,0x0058,0x0053,0x004E,0x004A,0x0046,0x0042,0x003E,0x003B,0x0037,
0x0034,0x0031,0x002F,0x002C,0x0029,0x0027,0x0025,0x0023,0x0021,0x001F,0x001D,0x001C,
0x001A,0x0019,0x0017,0x0016,0x0015,0x0014,0x0012,0x0011,0x0010,0x000F,0x000E,0x000D,
};
/* Table #3 of Pro Tracker 3.4r */
static unsigned short PT3NoteTable_REAL_34r[] = {
0x0CDA,0x0C22,0x0B73,0x0ACF,0x0A33,0x09A1,0x0917,0x0894,
0x0819,0x07A4,0x0737,0x06CF,0x066D,0x0611,0x05BA,0x0567,
0x051A,0x04D0,0x048B,0x044A,0x040C,0x03D2,0x039B,0x0367,
0x0337,0x0308,0x02DD,0x02B4,0x028D,0x0268,0x0246,0x0225,
0x0206,0x01E9,0x01CE,0x01B4,0x019B,0x0184,0x016E,0x015A,
0x0146,0x0134,0x0123,0x0113,0x0103,0x00F5,0x00E7,0x00DA,
0x00CE,0x00C2,0x00B7,0x00AD,0x00A3,0x009A,0x0091,0x0089,
0x0082,0x007A,0x0073,0x006D,0x0067,0x0061,0x005C,0x0056,
0x0052,0x004D,0x0049,0x0045,0x0041,0x003D,0x003A,0x0036,
0x0033,0x0031,0x002E,0x002B,0x0029,0x0027,0x0024,0x0022,
0x0020,0x001F,0x001D,0x001B,0x001A,0x0018,0x0017,0x0016,
0x0014,0x0013,0x0012,0x0011,0x0010,0x000F,0x000E,0x000D,
};
#if 0
nt_data:
DB (T_NEW_0-T1_)*2
DB TCNEW_0-T_
DB (T_OLD_0-T1_)*2+1
DB TCOLD_0-T_
DB (T_NEW_1-T1_)*2+1
DB TCNEW_1-T_
DB (T_OLD_1-T1_)*2+1
DB TCOLD_1-T_
DB (T_NEW_2-T1_)*2
DB TCNEW_2-T_
DB (T_OLD_2-T1_)*2
DB TCOLD_2-T_
DB (T_NEW_3-T1_)*2
DB TCNEW_3-T_
DB (T_OLD_3-T1_)*2
DB TCOLD_3-T_
T_
TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1
DB #18+1,#24+1,#3C+1,0
TCOLD_1 DB #5C+1,0
TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C
DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0
TCNEW_3 DB #56+1
TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0
TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1
DB #BC+1,#BE+1,0
TCNEW_1 EQU TCOLD_1
TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1
DB #BA+1,#BC+1,#BE+1,0
#endif
/* first 12 values of tone tables (packed) */
static unsigned char t_pack[]={
0x06EC*2/256,0x06EC*2,
0x0755-0x06EC,
0x07C5-0x0755,
0x083B-0x07C5,
0x08B8-0x083B,
0x093D-0x08B8,
0x09CA-0x093D,
0x0A5F-0x09CA,
0x0AFC-0x0A5F,
0x0BA4-0x0AFC,
0x0C55-0x0BA4,
0x0D10-0x0C55,
0x066D*2/256,0x066D*2,
0x06CF-0x066D,
0x0737-0x06CF,
0x07A4-0x0737,
0x0819-0x07A4,
0x0894-0x0819,
0x0917-0x0894,
0x09A1-0x0917,
0x0A33-0x09A1,
0x0ACF-0x0A33,
0x0B73-0x0ACF,
0x0C22-0x0B73,
0x0CDA-0x0C22,
0x0704*2/256,0x0704*2,
0x076E - 0x0704,
0x07E0-0x076E,
0x0858-0x07E0,
0x08D6-0x0858,
0x095C-0x08D6,
0x09EC-0x095C,
0x0A82-0x09EC,
0x0B22-0x0A82,
0x0BCC-0x0B22,
0x0C80-0x0BCC,
0x0d3e - 0x0c80,
0x07E0*2/256,0x07E0*2,
0x0858-0x07E0,
0x08E0-0x0858,
0x0960-0x08E0,
0x09F0-0x0960,
0x0A88-0x09F0,
0x0B28-0x0A88,
0x0BD8-0x0B28,
0x0C80-0x0BD8,
0x0D60-0x0C80,
0x0E10-0x0D60,
0x0EF8-0x0E10,
};
static unsigned short Tone[256];
// NoteTableCreator (c) Ivan Roshin
// A - NoteTableNumber*2+VersionForNoteTable
// (xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)
void NoteTableCreator(int which) {
unsigned short hl,de;
unsigned char a,b,c,carry,old_carry;
unsigned short ix;
unsigned short s[16];
unsigned int temp1,temp2;
int self_modified=0;
int sp=0;
//LD HL,NT_DATA
s[0]=de; // PUSH DE
sp++;
de=de&0x00ff;
de|=b<<8; //LD D,B
if (a&0x80) carry=1;
else carry=0;
a=a+a; //ADD A,A
de=de&0xff00;
de|=a; //LD E,A
hl=hl+de; //ADD HL,DE
//LD E,(HL)
hl++; // INC HL
//SRL E
//SBC A,A
//AND #A7 ;#00 (NOP) or #A7 (AND A)
//LD (L3),A
//EX DE,HL
//POP BC ;BC=T1_
//ADD HL,BC
//LD A,(DE)
//ADD A,T_
c=a; // LD C,A
//ADC A,T_/256
//SUB C
b=a; // LD B,A
//PUSH BC
//LD DE,NT_
//PUSH DE
b=12; // LD B,12
L1:
//PUSH BC
//LD C,(HL)
//INC HL
//PUSH HL
//LD B,(HL)
//PUSH DE
//EX DE,HL
//LD DE,23
//LD IXH,8
L2:
//SRL B
//RR C
L3:
//DB #19 ;AND A or NOP
a=c; // LD A,C
//ADC A,D ;=ADC 0
//LD (HL),A
hl++; // INC HL
//LD A,B
//ADC A,D
//LD (HL),A
//ADD HL,DE
//DEC IXH
//JR NZ,L2
//POP DE
de++; // INC DE
de++; // INC DE
//POP HL
hl++; // INC HL
//POP BC
//DJNZ L1
//POP HL
//POP DE
a=(de&0xff); // LD A,E
//CP TCOLD_1
//JR NZ,CORR_1
//LD A,#FD
//LD (NT_+#2E),A
CORR_1:
//LD A,(DE)
//AND A
if (a==0) goto TC_EXIT; // JR Z,TC_EXIT
//RRA
//PUSH AF
//ADD A,A
c=a; // LD C,A
//ADD HL,BC
//POP AF
if (carry==0) goto CORR_2; // JR NC,CORR_2
//DEC (HL)
//DEC (HL)
CORR_2:
//INC (HL)
//AND A
//SBC HL,BC
de++; //INC DE
goto CORR_1; // JR CORR_1
TC_EXIT:
sp--;
a=(s[sp]>>8); //POP AF
}
int main(int argc, char **argv) {
int i;
NoteTableCreator(0);
for(i=0;i<8*12;i++) {
if (i%12==0) printf("\n");
printf(" %04X",Tone[i]);
}
printf("\n");
if (!memcmp(Tone,PT3NoteTable_ST,8*12*sizeof(short))) {
printf("MATCH 35\n");
}
else {
printf("NO MATCH 35\n");
}
if (!memcmp(Tone,PT3NoteTable_ASM_34_35,8*12*sizeof(short))) {
printf("MATCH 34\n");
}
else {
printf("NO MATCH 34\n");
}
NoteTableCreator(1);
for(i=0;i<8*12;i++) {
if (i%12==0) printf("\n");
printf(" %04X",Tone[i]);
}
printf("\n");
if (!memcmp(Tone,PT3NoteTable_ST,8*12*sizeof(short))) {
printf("MATCH 35\n");
}
else {
printf("NO MATCH 35\n");
}
if (!memcmp(Tone,PT3NoteTable_ASM_34_35,8*12*sizeof(short))) {
printf("MATCH 34\n");
}
else {
printf("NO MATCH 34\n");
}
}