diff --git a/pt3_player/table_gen/table_gen.c b/pt3_player/table_gen/table_gen.c
new file mode 100644
index 00000000..1f4926da
--- /dev/null
+++ b/pt3_player/table_gen/table_gen.c
@@ -0,0 +1,304 @@
+#include <stdio.h>
+#include <string.h>
+
+static unsigned char out[256];
+
+static unsigned char PT3VolumeTable_33_34[]={
+	0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,   //0
+	0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,   //1
+	0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2,   //2
+	0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x3,0x3,0x3,0x3,   //3
+	0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x4,   //4
+	0x0,0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x4,0x5,0x5,   //5
+	0x0,0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x5,0x5,0x6,0x6,   //6
+	0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x5,0x6,0x6,0x7,0x7,   //7
+	0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x4,0x5,0x5,0x6,0x6,0x7,0x7,0x8,   //8
+	0x0,0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x5,0x6,0x6,0x7,0x8,0x8,0x9,   //9
+	0x0,0x0,0x1,0x2,0x2,0x3,0x4,0x4,0x5,0x6,0x6,0x7,0x8,0x8,0x9,0xA,   //a
+	0x0,0x0,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x6,0x7,0x8,0x9,0x9,0xA,0xB,   //b
+	0x0,0x0,0x1,0x2,0x3,0x4,0x4,0x5,0x6,0x7,0x8,0x8,0x9,0xA,0xB,0xC,   //c
+	0x0,0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x7,0x8,0x9,0xA,0xB,0xC,0xD,   //d
+	0x0,0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,   //e
+	0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,   //f
+};
+
+
+static unsigned char PT3VolumeTable_35[]={
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
+ 0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,
+ 0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2,0x3,0x3,0x3,
+ 0x0,0x0,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x3,0x3,0x3,0x3,0x4,0x4,
+ 0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x4,0x5,0x5,
+ 0x0,0x0,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x4,0x4,0x4,0x5,0x5,0x6,0x6,
+ 0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x5,0x6,0x6,0x7,0x7,
+ 0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x5,0x6,0x6,0x7,0x7,0x8,
+ 0x0,0x1,0x1,0x2,0x2,0x3,0x4,0x4,0x5,0x5,0x6,0x7,0x7,0x8,0x8,0x9,
+ 0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x5,0x6,0x7,0x7,0x8,0x9,0x9,0xA,
+ 0x0,0x1,0x1,0x2,0x3,0x4,0x4,0x5,0x6,0x7,0x7,0x8,0x9,0xA,0xA,0xB,
+ 0x0,0x1,0x2,0x2,0x3,0x4,0x5,0x6,0x6,0x7,0x8,0x9,0xA,0xA,0xB,0xC,
+ 0x0,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xA,0xB,0xC,0xD,
+ 0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,
+ 0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
+};
+
+static unsigned char gen1[]={
+// 16 0
+	0xf0,
+//  8 0,8 1
+	0x70,0x71,
+//   6 0,5 1,5 2
+	0x50,0x41,0x42,
+//   4 0,4 1,4 2,4 3
+	0x30,0x31,0x32,0x33,
+//   4 0,3 1,3 2,3 3,3 4
+	0x30,0x21,0x22,0x23,0x24,
+//   3 0,3 1,2 2,3 3,3 4,2 5
+	0x20,0x21,0x12,0x23,0x24,0x15,
+//   3 0,2 1,2 2,3 3,2 4,2 5,2 6
+	0x20,0x11,0x12,0x23,0x14,0x15,0x16,
+//   2 0,2 1,2 2,2 3,2 4,2 5,2 6,2 7
+	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+//   2 0,2 1,2 2,2 3,1 4,2 5,2 6,2 7,1 8
+	0x10,0x11,0x12,0x13,0x04,0x15,0x16,0x17,0x08,
+//   2 0,2 1,1 2,2 3,1 4,2 5,2 6,1 7,2 8,1 9
+	0x10,0x11,0x02,0x13,0x04,0x15,0x16,0x07,0x18,0x09,
+//   2 0,1 1,2 2,1 3,2 4,1 5,2 6,1 7,2 8,1 9,1 A
+	0x10,0x01,0x12,0x03,0x14,0x05,0x16,0x07,0x18,0x09,0x0a,
+//   2 0,1 1,1 2,2 3,1 4,1 5,2 6,1 7,1 8,2 9,1 A,1 B
+	0x10,0x01,0x02,0x13,0x04,0x05,0x16,0x07,0x08,0x19,0x0a,0x0b,
+//   2 0,1 1,1 2,1 3,2 4,1 5,1 6,1 7,2 8,1 9,1 A,1 B,1 C
+	0x10,0x01,0x02,0x03,0x14,0x05,0x06,0x07,0x18,0x09,0x0a,0x0b,0x0c,
+//   2 0,1 1,1 2,1 3,1 4,1 5,1 6,2 7,1 8,1 9,1 A,1 B,1 C,1 D
+	0x10,0x01,0x02,0x03,0x04,0x05,0x06,0x17,0x08,0x09,0x0a,0x0b,0x0c,0x0d,
+//   2 0,1 1,1 2,1 3,1 4,1 5,1 6,1 7,1 8,1 9,1 A,1 B,1 C,1 D,1 E
+	0x10,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,
+//   1 0,1 1,1 2,1 3,1 4,1 5,1 6,1 7,1 8,1 9,1 A,1 B,1 C,1 D,1 E,1 F
+	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+};
+
+static void gen_table_1(void) {
+	int total=0,temp,index=0,i;
+
+	while(total<256) {
+		temp=gen1[index];
+		for(i=0;i<(temp>>4)+1;i++) {
+			out[total]=temp&0xf;
+			total++;
+		}
+		index++;
+	}
+}
+
+
+
+static unsigned char gen2[]={
+// 16 0		SKIP this always 0
+
+//  8 0,8 1
+//	770 = 111 1,11 00
+	0xfc,
+//   6 0,5 1,5 2
+//	544 = 101 1,00 00 -- 400 = 100,0 0000
+	0xb0,0x80,
+//   4 0,4 1,4 2,4 3
+//	330 330 = 011 0,11 00 011 0,11 00
+	0x6c,0x6c,
+//   4 0,3 1,3 2,3 3,3 4
+//   323 220    = 0110,1011	0100,1000
+	0x6b,0x48,
+//   3 0,3 1,2 2,3 3,3 4,2 5
+//	222 222	= 010 0,10 10 010 0,10 10
+	0x4a,0x4a,
+//   3 0,2 1,2 2,3 3,2 4,2 5,2 6
+//	212 212 100 = 010 0,01 10   010 0,10 01   00100000
+	0x46,0x46,0x20,
+//   2 0,2 1,2 2,2 3,2 4,2 5,2 6,2 7
+//	112 112 110 = 0010,0110 0010,0110 0010,01 00
+	0x26,0x26,0x24,
+//   2 0,2 1,2 2,2 3,1 4,2 5,2 6,2 7,1 8
+//	112 102 111 - 0010,0110 0010,0010 0010,0101
+	0x26,0x22,0x25,
+//   2 0,2 1,1 2,2 3,1 4,2 5,2 6,1 7,2 8,1 9
+//	111 102 102 000 = 0010,0101 0010,0010 0010,0010 0000,0000
+	0x25,0x22,0x22,0x00,
+//   2 0,1 1,2 2,1 3,2 4,1 5,2 6,1 7,2 8,1 9,1 A
+//	102 011 102 000	- 0010,0010 0000,0101 0010,0010 0000,0000
+	0x22,0x05,0x22,0x00,
+//   2 0,1 1,1 2,    2 3,1 4,1 5,    2 6,1 7,1 8,   2 9,1 A,1 B
+//	101 101 101 101 = 0010,0001
+	0x21,0x21,0x21,0x21,
+//   2 0,1 1,1 2,  1 3,2 4,1 5,   1 6,1 7,2 8,  1 9,1 A,1 B,   1 C
+//	101 011 002 001 000 = 0010,0001 0000,0101 0000,0010 0000,0001 0000,0000
+	0x21,0x05,0x02,0x01,0x00,
+//   2 0,1 1,1 2,    1 3,1 4,1 5,    1 6,2 7,1 8,    1 9,1 A,1 B,    1 C,1 D
+//	101 001 011 001 000 = 0010,0001 0000,0001 0000,0101 0000,0001 0000,0000
+	0x21,0x01,0x05,0x1,0x0,
+//   2 0,1 1,1 2,1 3,1 4,1 5,1 6,1 7,1 8,1 9,1 A,1 B,1 C,1 D,1 E
+//	101 001 001 001 001 000 = 001 0,00 01 000 000 01
+	0x21,0x01,0x01,0x01,0x01,0x00,
+//   1 0,1 1,1 2,1 3,1 4,1 5,1 6,1 7,1 8,1 9,1 A,1 B,1 C,1 D,1 E,1 F
+//	001 001 001 001 001 000 = 000 000 01
+	0x01,0x01,0x01,0x01,0x01,0x00,
+};
+
+
+static unsigned char gen3[]={
+// 16 0		SKIP this always 0
+
+
+//  8 0,8 1
+//	770 = 111 1,11 00
+	0xfc,
+//   4 0,8 1,4 2
+//	370 300 = 011 1,11 00 -- 011,0 0000
+	0x7c,0x60,
+//   3 0,5 1,5 2, 3 3
+//	240 420 = 0101,000 1000,1000
+	0x50,0x88,
+//   2 0,4 1, 4 2,4 3,2 4
+//   130 332    = 0010,1100, 0110,1110
+	0x2c,0x6e,
+//   2 0,3 1,3 2,  3 3,3 4,2 5
+//	123 222	= 001 0,10 11 010 0,10 10
+	0x2b,0x4a,
+//   2 0,2 1,3 2,  2 3,3 4,2 5, 2 6
+//	113 122 100 = 001 0,01 11   001 0,10 10   00100000
+	0x27,0x2a,0x20,
+//   2 0,2 1,2 2,2 3,2 4,2 5,2 6,2 7
+//	112 112 110 = 0010,0110 0010,0110 0010,01 00
+	0x26,0x26,0x24,
+//   1 0,2 1,2 2,   2 3,2 4,2 5,   2 6,2 7,1 8
+//	012 112 111 - 0000,0110 0010,0110 0010,0101
+	0x06,0x26,0x25,
+//   1 0,2 1,2 2,   1 3,2 4,2 5,   1 6,2 7,2 8,   1 9
+//	012 012 012 000 = 0000,0110 0000,0000
+	0x06,0x06,0x06,0x00,
+//   1 0,2 1,1 2,   2 3,1 4,2 5,   1 6,2 7,1 8,  2 9,1 A
+//	011 102 011 100	- 0000,0101 0010,0010 0010,0010 0010,0000
+	0x05,0x22,0x05,0x20,
+//   1 0,2 1,1 2,    1 3,2 4,1 5,    1 6,2 7,1 8,   1 9,2 A,1 B
+//	011 111 011 011 = 0000,0101
+	0x05,0x05,0x05,0x05,
+//   1 0,1 1,2 2,  1 3,1 4,1 5,   2 6,1 7,1 8,  1 9,2 A,1 B,   1 C
+//	002 001 101 011 000 = 0000,0010 0000,0001 0010,0001 0000,0101 0000,0000
+	0x02,0x01,0x21,0x05,0x00,
+//   1 0,1 1,1 2,    2 3,1 4,1 5,    1 6,1 7,1 8,    1 9,2 A,1 B,    1 C,1 D
+//	001 101 001 011 000 = 0010,0001 0000,0001 0000,0101 0000,0001 0000,0000
+	0x01,0x21,0x01,0x05,0x00,
+//   1 0,1 1,1 2,  1 3,1 4,1 5,  1 6,2 7,1 8,   1 9,1 A,1 B,  1 C,1 D,1 E
+//	001 001 011 001 001 000 = 001 0,00 01 000 000 01
+	0x01,0x01,0x05,0x01,0x01,0x01,
+
+//   1 0,1 1,1 2,1 3,1 4,1 5,1 6,1 7,1 8,1 9,1 A,1 B,1 C,1 D,1 E,1 F
+//	001 001 001 001 001 000 = 000 000 01
+	0x01,0x01,0x01,0x01,0x01,0x00,
+};
+
+static void gen_table_2(unsigned char *g) {
+
+	int row=0,column=0,val,index=0,temp,i,total=0;
+
+	while(row<15) {
+		val=0;
+		column=0;
+		printf("\n");
+		while(1) {
+			temp=(g[index]>>5)&0x7;
+			for(i=0;i<temp+1;i++) {
+				out[16+total]=val;
+				printf("%x ",val);
+				total++;
+				column++;
+			}
+
+			if (column>=16) break;
+
+			val++;
+			temp=(g[index]>>2)&0x7;
+			for(i=0;i<temp+1;i++) {
+				out[16+total]=val;
+				printf("%x ",val);
+				total++;
+				column++;
+			}
+
+			if (column>=16) break;
+
+			temp=(g[index])&0x3;
+			if (temp!=0) {
+			val++;
+			for(i=0;i<temp;i++) {
+				out[16+total]=val;
+				printf("%x ",val);
+				total++;
+				column++;
+			}
+			}
+			val++;
+			if (column>=16) break;
+			index++;
+		}
+		index++;
+
+		row++;
+	}
+}
+
+
+
+int main(int argc, char **argv) {
+
+
+
+	int i;
+
+	printf("Default is 256 bytes!\n");
+
+
+	printf("\nNext is %ld bytes\n",sizeof(gen1));
+	memset(out,0,256);
+	gen_table_1();
+
+	for(i=0;i<256;i++) {
+		if (out[i]!=PT3VolumeTable_33_34[i]) {
+			fprintf(stderr,"Mismatch at %d (%x) expected %d got %d!\n",
+				i,i,PT3VolumeTable_33_34[i],out[i]);
+			return -1;
+		}
+	}
+
+
+	printf("\nNext is %ld bytes\n",sizeof(gen2));
+	memset(out,0,256);
+	gen_table_2(gen2);
+
+	for(i=0;i<256;i++) {
+		if (out[i]!=PT3VolumeTable_33_34[i]) {
+			fprintf(stderr,"Mismatch at %d (%x) expected %d got %d!\n",
+				i,i,PT3VolumeTable_33_34[i],out[i]);
+			return -1;
+		}
+	}
+
+
+
+
+
+
+
+	printf("\nGNext is %ld bytes\n",sizeof(gen3));
+	memset(out,0,256);
+	gen_table_2(gen3);
+
+	for(i=0;i<256;i++) {
+		if (out[i]!=PT3VolumeTable_35[i]) {
+			fprintf(stderr,"Mismatch at %d (%x) expected %d got %d!\n",
+				i,i,PT3VolumeTable_35[i],out[i]);
+			return -1;
+		}
+	}
+
+
+	return 0;
+}
diff --git a/pt3_player/table_gen/z80_table.c b/pt3_player/table_gen/z80_table.c
new file mode 100644
index 00000000..c704fcc9
--- /dev/null
+++ b/pt3_player/table_gen/z80_table.c
@@ -0,0 +1,211 @@
+#include <stdio.h>
+#include <string.h>
+
+
+static unsigned char PT3VolumeTable_33_34[]={
+	0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,   //0
+	0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,   //1
+	0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2,   //2
+	0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x3,0x3,0x3,0x3,   //3
+	0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x4,   //4
+	0x0,0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x4,0x5,0x5,   //5
+	0x0,0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x5,0x5,0x6,0x6,   //6
+	0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x5,0x6,0x6,0x7,0x7,   //7
+	0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x4,0x5,0x5,0x6,0x6,0x7,0x7,0x8,   //8
+	0x0,0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x5,0x6,0x6,0x7,0x8,0x8,0x9,   //9
+	0x0,0x0,0x1,0x2,0x2,0x3,0x4,0x4,0x5,0x6,0x6,0x7,0x8,0x8,0x9,0xA,   //a
+	0x0,0x0,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x6,0x7,0x8,0x9,0x9,0xA,0xB,   //b
+	0x0,0x0,0x1,0x2,0x3,0x4,0x4,0x5,0x6,0x7,0x8,0x8,0x9,0xA,0xB,0xC,   //c
+	0x0,0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x7,0x8,0x9,0xA,0xB,0xC,0xD,   //d
+	0x0,0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,   //e
+	0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,   //f
+};
+
+
+static unsigned char PT3VolumeTable_35[]={
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
+ 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
+ 0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,
+ 0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2,0x3,0x3,0x3,
+ 0x0,0x0,0x1,0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x3,0x3,0x3,0x3,0x4,0x4,
+ 0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x4,0x5,0x5,
+ 0x0,0x0,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x4,0x4,0x4,0x5,0x5,0x6,0x6,
+ 0x0,0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x5,0x6,0x6,0x7,0x7,
+ 0x0,0x1,0x1,0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x5,0x6,0x6,0x7,0x7,0x8,
+ 0x0,0x1,0x1,0x2,0x2,0x3,0x4,0x4,0x5,0x5,0x6,0x7,0x7,0x8,0x8,0x9,
+ 0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x5,0x6,0x7,0x7,0x8,0x9,0x9,0xA,
+ 0x0,0x1,0x1,0x2,0x3,0x4,0x4,0x5,0x6,0x7,0x7,0x8,0x9,0xA,0xA,0xB,
+ 0x0,0x1,0x2,0x2,0x3,0x4,0x5,0x6,0x6,0x7,0x8,0x9,0xA,0xA,0xB,0xC,
+ 0x0,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xA,0xB,0xC,0xD,
+ 0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,
+ 0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
+};
+
+
+static unsigned char VT[256];
+
+//VolTableCreator (c) Ivan Roshin
+//A - VersionForVolumeTable (0..4 - 3.xx..3.4x;
+//5.. - 3.5x..3.6x..VTII1.0)
+
+void VolTableCreator(int which) {
+
+	unsigned char h,l,d,e,a,c,carry,old_carry;
+	unsigned short ix;
+	unsigned char s[16];
+	unsigned int temp1,temp2;
+	int self_modified=0;
+
+	//cp 005h			; compare accumulator with 5?
+
+	carry=which;
+
+	h=0;	//ld hl,00011h		; load 16-bit value at address $11 to hl?
+	l=0x11;	//			; does not affect flags
+	d=h;	//ld d,h			; d=h
+	e=h;	//ld e,h			; e=h
+	a=0x17;	//ld a,017h	RLA	; a=$17
+	if (!carry) goto m1;	//jr nc,m1		; if (carry==1) {
+	l--;	//dec l			;	l--;
+	e=l;	//ld e,l			;	e=l;
+	a=a^a;	//xor a			;	a=a^a; (a=0?)
+	self_modified=1;
+m1:		//		; }
+	//	ld (m2),a	set m2 to NOP (0) or RLA ($17)
+	ix=16;	//ld ix,VT_+16		; IX is 16 entries into table (
+	c=0x10;	//ld c,010h		; c=16
+pt3_initv2:
+	s[0]=h;
+	s[1]=l;	// push hl			; save hl
+
+		// add hl,de		; hl=hl+de
+	temp1=(h<<8)|l;
+	temp2=(d<<8)|e;
+	temp1=temp1+temp2;
+	h=(temp1>>8)&0xff;
+	l=temp1&0xff;
+	if (temp1&(1<<16)) carry=1;
+	else carry=0;
+
+		// ex de,hl		; swap
+	temp1=(h<<8)|l;
+	temp2=(d<<8)|e;
+	h=(temp2>>8);
+	l=temp2&0xff;
+	d=(temp1>>8);
+	e=temp1&0xff;
+
+		// sbc hl,hl
+//	temp1=(h<<8)|l;
+//	temp2=(h<<8)|l;
+//	temp1=temp1-temp2-carry;
+//	h=(temp1>>8);
+//	l=temp1&0xff;
+	if (carry==0) { h=0; l=0;}
+	else {h=0xff; l=0xff;}
+
+pt3_initv1:
+	a=l;	// ld a,l	7d		; ?
+//m2:
+	// Self modified, RLA or NOP depending
+		// ld a,l	7d  00=nop	; this is self modified
+	if (self_modified) {
+		/* nop */
+	}
+	else {
+		/* rla $17 */
+		old_carry=carry;
+		carry=!!(a&0x80);
+		a=a<<1;
+		a|=old_carry;
+	}
+
+	a=h;	// ld a,h	7c		; ?
+		// adc a,000h
+	a=a+carry;
+
+	VT[ix]=a;//ld (ix+000h),a
+	ix++;	// inc ix
+
+		// add hl,de
+	temp1=(h<<8)|l;
+	temp2=(d<<8)|e;
+	temp1=temp1+temp2;
+	h=(temp1>>8);
+	l=temp1&0xff;
+
+	c++;	// inc c
+	a=c;	// ld a,c
+	a=a&0xf;// and 00fh
+	if (a!=0) goto pt3_initv1; //	jr nz,pt3_initv1
+	h=s[0];
+	l=s[1];	// pop hl
+	a=e;	// ld a,e
+		// cp 077h
+		// jr nz,m3
+	if ((a-0x77)!=0) goto m3;
+	e++; //inc e
+m3:
+	a=c;	// ld a,c
+	a=a&a;	// and a
+	if (a!=0) goto pt3_initv2; //	jr nz,pt3_initv2
+}
+
+
+int main(int argc, char **argv) {
+
+	int i;
+
+	VolTableCreator(0);
+
+	for(i=0;i<256;i++) {
+		if (i%16==0) printf("\n");
+		printf(" %02X",VT[i]);
+	}
+	printf("\n");
+
+	if (!memcmp(VT,PT3VolumeTable_35,256)) {
+		printf("MATCH 35\n");
+	}
+	else {
+		printf("NO MATCH 35\n");
+	}
+
+	if (!memcmp(VT,PT3VolumeTable_33_34,256)) {
+		printf("MATCH 34\n");
+	}
+	else {
+		printf("NO MATCH 34\n");
+	}
+
+
+
+
+	VolTableCreator(1);
+
+	for(i=0;i<256;i++) {
+		if (i%16==0) printf("\n");
+		printf(" %02X",VT[i]);
+	}
+	printf("\n");
+
+	if (!memcmp(VT,PT3VolumeTable_35,256)) {
+		printf("MATCH 35\n");
+	}
+	else {
+		printf("NO MATCH 35\n");
+	}
+
+	if (!memcmp(VT,PT3VolumeTable_33_34,256)) {
+		printf("MATCH 34\n");
+	}
+	else {
+		printf("NO MATCH 34\n");
+	}
+
+
+
+}
+
+
+