Browse code

update for C++17 compliance, update to latest 2sf, add WINE cross-compile makefiles

Adam Higerd authored on 2021/02/11 15:36:17
Showing 1 changed files
... ...
@@ -24,6 +24,17 @@
24 24
 #define cpu (&ARMPROC)
25 25
 #define TEMPLATE template<int PROCNUM>
26 26
 
27
+struct CompressionHeader
28
+{
29
+public:
30
+	CompressionHeader(u32 _value) : value(_value) {}
31
+	u32 DataSize() const { return value&15; }
32
+	u32 Type() const { return (value>>4)&15; }
33
+	u32 DecompressedSize() const { return value>>24; }
34
+private:
35
+	u32 value;
36
+};
37
+
27 38
 static const uint16_t getsinetbl[] =
28 39
 {
29 40
 	0x0000, 0x0324, 0x0648, 0x096A, 0x0C8C, 0x0FAB, 0x12C8, 0x15E2,
... ...
@@ -673,7 +684,7 @@ TEMPLATE static uint32_t UnCompHuffman()
673 684
 {
674 685
 	uint32_t source = cpu->R[0];
675 686
 	uint32_t dest = cpu->R[1];
676
-	uint32_t header = _MMU_read08<PROCNUM>(source);
687
+	uint32_t header = _MMU_read32<PROCNUM>(source);
677 688
 	source += 4;
678 689
 
679 690
 	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
... ...
@@ -688,7 +699,7 @@ TEMPLATE static uint32_t UnCompHuffman()
688 699
 	int len = header >> 8;
689 700
 
690 701
 	uint32_t mask = 0x80000000;
691
-	uint32_t data = _MMU_read08<PROCNUM>(source);
702
+	uint32_t data = _MMU_read32<PROCNUM>(source);
692 703
 	source += 4;
693 704
 
694 705
 	int pos = 0;
... ...
@@ -738,7 +749,7 @@ TEMPLATE static uint32_t UnCompHuffman()
738 749
 				{
739 750
 					byteCount = 0;
740 751
 					byteShift = 0;
741
-					_MMU_write08<PROCNUM>(dest, writeValue & 0xFF);
752
+					_MMU_write32<PROCNUM>(dest, writeValue);
742 753
 					writeValue = 0;
743 754
 					dest += 4;
744 755
 					len -= 4;
... ...
@@ -748,7 +759,7 @@ TEMPLATE static uint32_t UnCompHuffman()
748 759
 			if (!mask)
749 760
 			{
750 761
 				mask = 0x80000000;
751
-				data = _MMU_read08<PROCNUM>(source);
762
+				data = _MMU_read32<PROCNUM>(source);
752 763
 				source += 4;
753 764
 			}
754 765
 		}
... ...
@@ -801,7 +812,7 @@ TEMPLATE static uint32_t UnCompHuffman()
801 812
 					{
802 813
 						byteCount = 0;
803 814
 						byteShift = 0;
804
-						_MMU_write08<PROCNUM>(dest, writeValue & 0xFF);
815
+						_MMU_write32<PROCNUM>(dest, writeValue);
805 816
 						dest += 4;
806 817
 						writeValue = 0;
807 818
 						len -= 4;
... ...
@@ -815,7 +826,7 @@ TEMPLATE static uint32_t UnCompHuffman()
815 826
 			if (!mask)
816 827
 			{
817 828
 				mask = 0x80000000;
818
-				data = _MMU_read08<PROCNUM>(source);
829
+				data = _MMU_read32<PROCNUM>(source);
819 830
 				source += 4;
820 831
 			}
821 832
 		}
... ...
@@ -856,7 +867,7 @@ TEMPLATE static uint32_t BitUnPack()
856 867
 	}
857 868
 
858 869
 	int revbits = 8 - bits;
859
-	uint32_t base = _MMU_read08<PROCNUM>(header + 4);
870
+	uint32_t base = _MMU_read32<PROCNUM>(header + 4);
860 871
 	int addBase = base & 0x80000000 ? 1 : 0;
861 872
 	base &= 0x7fffffff;
862 873
 
... ...
@@ -875,21 +886,21 @@ TEMPLATE static uint32_t BitUnPack()
875 886
 		{
876 887
 			if (bitcount >= 8)
877 888
 				break;
878
-			uint32_t d = b & mask;
879
-			uint32_t temp = d >> bitcount;
880
-			if (!temp && addBase)
881
-				temp += base;
889
+      uint32_t temp = b & mask;
890
+      if (temp || addBase) {
891
+        temp += base;
892
+      }
882 893
 			data |= temp << bitwritecount;
883 894
 			bitwritecount += dataSize;
884 895
 			if (bitwritecount >= 32)
885 896
 			{
886
-				_MMU_write08<PROCNUM>(dest, data);
897
+				_MMU_write32<PROCNUM>(dest, data);
887 898
 				dest += 4;
888 899
 				data = 0;
889 900
 				bitwritecount = 0;
890 901
 			}
891
-			mask <<= bits;
892 902
 			bitcount += bits;
903
+      b >>= bits;
893 904
 		}
894 905
 	}
895 906
 	return 1;
... ...
@@ -899,13 +910,15 @@ TEMPLATE static uint32_t Diff8bitUnFilterWram()
899 910
 {
900 911
 	uint32_t source = cpu->R[0];
901 912
 	uint32_t dest = cpu->R[1];
902
-	uint32_t header = _MMU_read08<PROCNUM>(source);
913
+	CompressionHeader header(_MMU_read32<PROCNUM>(source));
903 914
 	source += 4;
904 915
 
905
-	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
906
-		return 0;
916
+	int len = header.DecompressedSize();
907 917
 
908
-	int len = header >> 8;
918
+  if (PROCNUM == ARMCPU_ARM7) {
919
+    if (!(source & 0xe000000) || !((source + (len & 0x1fffff)) & 0xe000000))
920
+      return 0;
921
+  }
909 922
 
910 923
 	uint8_t data = _MMU_read08<PROCNUM>(source++);
911 924
 	_MMU_write08<PROCNUM>(dest++, data);
... ...
@@ -925,13 +938,10 @@ TEMPLATE static uint32_t Diff16bitUnFilter()
925 938
 {
926 939
 	uint32_t source = cpu->R[0];
927 940
 	uint32_t dest = cpu->R[1];
928
-	uint32_t header = _MMU_read08<PROCNUM>(source);
941
+	CompressionHeader header(_MMU_read32<PROCNUM>(source));
929 942
 	source += 4;
930 943
 
931
-	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
932
-		return 0;
933
-
934
-	int len = header >> 8;
944
+	int len = header.DecompressedSize();
935 945
 
936 946
 	uint16_t data = _MMU_read16<PROCNUM>(source);
937 947
 	source += 2;
... ...
@@ -957,9 +967,15 @@ TEMPLATE static uint32_t bios_sqrt()
957 967
 	return 1;
958 968
 }
959 969
 
960
-TEMPLATE static uint32_t setHaltCR()
970
+TEMPLATE static uint32_t CustomPost()
971
+{
972
+  _MMU_write08<PROCNUM>(REG_POSTFLG, cpu->R[0]);
973
+  return 1;
974
+}
975
+
976
+TEMPLATE static uint32_t CustomHalt()
961 977
 {
962
-	_MMU_write08<PROCNUM>(0x4000300+cpu->proc_ID, cpu->R[0] & 0xFF);
978
+	_MMU_write08<PROCNUM>(REG_HALTCNT, cpu->R[2]);
963 979
 	return 1;
964 980
 }
965 981
 
... ...
@@ -968,7 +984,7 @@ TEMPLATE static uint32_t getSineTab()
968 984
 	// ds returns garbage according to gbatek, but we must protect ourselves
969 985
 	if (cpu->R[0] >= ARRAY_SIZE(getsinetbl))
970 986
 	{
971
-		printf("Invalid SWI getSineTab: %08X\n", cpu->R[0]);
987
+		fprintf(stderr, "Invalid SWI getSineTab: %08X\n", cpu->R[0]);
972 988
 		return 1;
973 989
 	}
974 990
 
... ...
@@ -981,7 +997,7 @@ TEMPLATE static uint32_t getPitchTab()
981 997
 	// ds returns garbage according to gbatek, but we must protect ourselves
982 998
 	if (cpu->R[0] >= ARRAY_SIZE(getpitchtbl))
983 999
 	{
984
-		printf("Invalid SWI getPitchTab: %08X\n", cpu->R[0]);
1000
+		fprintf(stderr, "Invalid SWI getPitchTab: %08X\n", cpu->R[0]);
985 1001
 		return 1;
986 1002
 	}
987 1003
 
... ...
@@ -994,7 +1010,7 @@ TEMPLATE static uint32_t getVolumeTab()
994 1010
 	// ds returns garbage according to gbatek, but we must protect ourselves
995 1011
 	if (cpu->R[0] >= ARRAY_SIZE(getvoltbl))
996 1012
 	{
997
-		printf("Invalid SWI getVolumeTab: %08X\n", cpu->R[0]);
1013
+		fprintf(stderr, "Invalid SWI getVolumeTab: %08X\n", cpu->R[0]);
998 1014
 		return 1;
999 1015
 	}
1000 1016
 
... ...
@@ -1097,7 +1113,7 @@ uint32_t (*ARM_swi_tab[][32])() =
1097 1113
 		bios_nop<ARMCPU_ARM9>,             // 0x1C
1098 1114
 		bios_nop<ARMCPU_ARM9>,             // 0x1D
1099 1115
 		bios_nop<ARMCPU_ARM9>,             // 0x1E
1100
-		setHaltCR<ARMCPU_ARM9>,            // 0x1F
1116
+		CustomPost<ARMCPU_ARM9>,           // 0x1F
1101 1117
 	},
1102 1118
 	{
1103 1119
 		bios_nop<ARMCPU_ARM7>,             // 0x00
... ...
@@ -1122,7 +1138,7 @@ uint32_t (*ARM_swi_tab[][32])() =
1122 1138
 		UnCompHuffman<ARMCPU_ARM7>,        // 0x13
1123 1139
 		RLUnCompWram<ARMCPU_ARM7>,         // 0x14
1124 1140
 		RLUnCompVram<ARMCPU_ARM7>,         // 0x15
1125
-		Diff8bitUnFilterWram<ARMCPU_ARM7>, // 0x16
1141
+		bios_nop<ARMCPU_ARM7>,             // 0x16
1126 1142
 		bios_nop<ARMCPU_ARM7>,             // 0x17
1127 1143
 		bios_nop<ARMCPU_ARM7>,             // 0x18
1128 1144
 		bios_nop<ARMCPU_ARM7>,             // 0x19
... ...
@@ -1131,6 +1147,6 @@ uint32_t (*ARM_swi_tab[][32])() =
1131 1147
 		getVolumeTab<ARMCPU_ARM7>,         // 0x1C
1132 1148
 		getBootProcs<ARMCPU_ARM7>,         // 0x1D
1133 1149
 		bios_nop<ARMCPU_ARM7>,             // 0x1E
1134
-		setHaltCR<ARMCPU_ARM7>,            // 0x1F
1150
+		CustomHalt<ARMCPU_ARM7>,           // 0x1F
1135 1151
 	}
1136 1152
 };
Browse code

Removed a bunch of casts, they seem to be fine without them in most cases.

Naram Qashat authored on 2013/04/18 23:22:54
Showing 1 changed files
... ...
@@ -281,16 +281,16 @@ TEMPLATE static uint32_t sleep()
281 281
 
282 282
 TEMPLATE static uint32_t divide()
283 283
 {
284
-	int32_t num = static_cast<int32_t>(cpu->R[0]);
285
-	int32_t dnum = static_cast<int32_t>(cpu->R[1]);
284
+	int32_t num = cpu->R[0];
285
+	int32_t dnum = cpu->R[1];
286 286
 
287 287
 	if (!dnum)
288 288
 		return 0;
289 289
 
290 290
 	int32_t res = num / dnum;
291
-	cpu->R[0] = static_cast<uint32_t>(res);
292
-	cpu->R[1] = static_cast<uint32_t>(num % dnum);
293
-	cpu->R[3] = static_cast<uint32_t>(std::abs(res));
291
+	cpu->R[0] = res;
292
+	cpu->R[1] = num % dnum;
293
+	cpu->R[3] = std::abs(res);
294 294
 
295 295
 	return 6;
296 296
 }
... ...
@@ -324,7 +324,7 @@ TEMPLATE static uint32_t copy()
324 324
 					cnt &= 0x1FFFFF;
325 325
 					while (cnt)
326 326
 					{
327
-						_MMU_write16<PROCNUM>(dst, static_cast<uint16_t>(val));
327
+						_MMU_write16<PROCNUM>(dst, val);
328 328
 						--cnt;
329 329
 						dst += 2;
330 330
 					}
... ...
@@ -439,7 +439,7 @@ TEMPLATE static uint32_t LZ77UnCompVram()
439 439
 
440 440
 						if (byteCount == 2)
441 441
 						{
442
-							_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
442
+							_MMU_write16<PROCNUM>(dest, writeValue & 0xFFFF);
443 443
 							dest += 2;
444 444
 							byteCount = 0;
445 445
 							byteShift = 0;
... ...
@@ -457,7 +457,7 @@ TEMPLATE static uint32_t LZ77UnCompVram()
457 457
 					++byteCount;
458 458
 					if (byteCount == 2)
459 459
 					{
460
-						_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
460
+						_MMU_write16<PROCNUM>(dest, writeValue & 0xFFFF);
461 461
 						dest += 2;
462 462
 						byteCount = 0;
463 463
 						byteShift = 0;
... ...
@@ -479,7 +479,7 @@ TEMPLATE static uint32_t LZ77UnCompVram()
479 479
 				++byteCount;
480 480
 				if (byteCount == 2)
481 481
 				{
482
-					_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
482
+					_MMU_write16<PROCNUM>(dest, writeValue & 0xFFFF);
483 483
 					dest += 2;
484 484
 					byteShift = 0;
485 485
 					byteCount = 0;
... ...
@@ -587,7 +587,7 @@ TEMPLATE static uint32_t RLUnCompVram()
587 587
 
588 588
 				if (byteCount == 2)
589 589
 				{
590
-					_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
590
+					_MMU_write16<PROCNUM>(dest, writeValue & 0xFFFF);
591 591
 					dest += 2;
592 592
 					byteCount = 0;
593 593
 					byteShift = 0;
... ...
@@ -609,7 +609,7 @@ TEMPLATE static uint32_t RLUnCompVram()
609 609
 
610 610
 				if (byteCount == 2)
611 611
 				{
612
-					_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
612
+					_MMU_write16<PROCNUM>(dest, writeValue & 0xFFFF);
613 613
 					dest += 2;
614 614
 					byteCount = 0;
615 615
 					byteShift = 0;
... ...
@@ -738,7 +738,7 @@ TEMPLATE static uint32_t UnCompHuffman()
738 738
 				{
739 739
 					byteCount = 0;
740 740
 					byteShift = 0;
741
-					_MMU_write08<PROCNUM>(dest, static_cast<uint8_t>(writeValue));
741
+					_MMU_write08<PROCNUM>(dest, writeValue & 0xFF);
742 742
 					writeValue = 0;
743 743
 					dest += 4;
744 744
 					len -= 4;
... ...
@@ -801,7 +801,7 @@ TEMPLATE static uint32_t UnCompHuffman()
801 801
 					{
802 802
 						byteCount = 0;
803 803
 						byteShift = 0;
804
-						_MMU_write08<PROCNUM>(dest, static_cast<uint8_t>(writeValue));
804
+						_MMU_write08<PROCNUM>(dest, writeValue & 0xFF);
805 805
 						dest += 4;
806 806
 						writeValue = 0;
807 807
 						len -= 4;
... ...
@@ -959,7 +959,7 @@ TEMPLATE static uint32_t bios_sqrt()
959 959
 
960 960
 TEMPLATE static uint32_t setHaltCR()
961 961
 {
962
-	_MMU_write08<PROCNUM>(0x4000300+cpu->proc_ID, static_cast<uint8_t>(cpu->R[0]));
962
+	_MMU_write08<PROCNUM>(0x4000300+cpu->proc_ID, cpu->R[0] & 0xFF);
963 963
 	return 1;
964 964
 }
965 965
 
... ...
@@ -1010,7 +1010,7 @@ TEMPLATE static uint32_t getCRC16()
1010 1010
 	// if this implementation is wrong, then it won't match what the real bios returns,
1011 1011
 	// and savefiles created with a bios will be invalid when loaded with non-bios (and vice-versa)
1012 1012
 
1013
-	uint16_t crc = static_cast<uint16_t>(cpu->R[0]);
1013
+	uint16_t crc = cpu->R[0] & 0xFFFF;
1014 1014
 	uint32_t datap = cpu->R[1];
1015 1015
 	uint32_t size = cpu->R[2] >> 1;
1016 1016
 	uint16_t currVal = 0;
Browse code

Updating in_2sf to use a newish version of DeSmuME, 0.9.9 from SVN. Somewhat cleaned up as well, but not everything because it's a pain in the ass.

Naram Qashat authored on 2013/04/18 17:22:55
Showing 1 changed files
... ...
@@ -17,178 +17,177 @@
17 17
 */
18 18
 
19 19
 #include <cmath>
20
-
21 20
 #include "cp15.h"
22 21
 #include "MMU.h"
23
-//#include "debug.h"
24 22
 #include "NDSSystem.h"
25 23
 
26 24
 #define cpu (&ARMPROC)
27 25
 #define TEMPLATE template<int PROCNUM>
28 26
 
29
-static const uint16_t getsinetbl[] = {
30
-0x0000, 0x0324, 0x0648, 0x096A, 0x0C8C, 0x0FAB, 0x12C8, 0x15E2,
31
-0x18F9, 0x1C0B, 0x1F1A, 0x2223, 0x2528, 0x2826, 0x2B1F, 0x2E11,
32
-0x30FB, 0x33DF, 0x36BA, 0x398C, 0x3C56, 0x3F17, 0x41CE, 0x447A,
33
-0x471C, 0x49B4, 0x4C3F, 0x4EBF, 0x5133, 0x539B, 0x55F5, 0x5842,
34
-0x5A82, 0x5CB3, 0x5ED7, 0x60EB, 0x62F1, 0x64E8, 0x66CF, 0x68A6,
35
-0x6A6D, 0x6C23, 0x6DC9, 0x6F5E, 0x70E2, 0x7254, 0x73B5, 0x7504,
36
-0x7641, 0x776B, 0x7884, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE3,
37
-0x7D89, 0x7E1D, 0x7E9C, 0x7F09, 0x7F61, 0x7FA6, 0x7FD8, 0x7FF5
27
+static const uint16_t getsinetbl[] =
28
+{
29
+	0x0000, 0x0324, 0x0648, 0x096A, 0x0C8C, 0x0FAB, 0x12C8, 0x15E2,
30
+	0x18F9, 0x1C0B, 0x1F1A, 0x2223, 0x2528, 0x2826, 0x2B1F, 0x2E11,
31
+	0x30FB, 0x33DF, 0x36BA, 0x398C, 0x3C56, 0x3F17, 0x41CE, 0x447A,
32
+	0x471C, 0x49B4, 0x4C3F, 0x4EBF, 0x5133, 0x539B, 0x55F5, 0x5842,
33
+	0x5A82, 0x5CB3, 0x5ED7, 0x60EB, 0x62F1, 0x64E8, 0x66CF, 0x68A6,
34
+	0x6A6D, 0x6C23, 0x6DC9, 0x6F5E, 0x70E2, 0x7254, 0x73B5, 0x7504,
35
+	0x7641, 0x776B, 0x7884, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE3,
36
+	0x7D89, 0x7E1D, 0x7E9C, 0x7F09, 0x7F61, 0x7FA6, 0x7FD8, 0x7FF5
38 37
 };
39 38
 
40
-static const uint16_t getpitchtbl[] = {
41
-0x0000, 0x003B, 0x0076, 0x00B2, 0x00ED, 0x0128, 0x0164, 0x019F,
42
-0x01DB, 0x0217, 0x0252, 0x028E, 0x02CA, 0x0305, 0x0341, 0x037D,
43
-0x03B9, 0x03F5, 0x0431, 0x046E, 0x04AA, 0x04E6, 0x0522, 0x055F,
44
-0x059B, 0x05D8, 0x0614, 0x0651, 0x068D, 0x06CA, 0x0707, 0x0743,
45
-0x0780, 0x07BD, 0x07FA, 0x0837, 0x0874, 0x08B1, 0x08EF, 0x092C,
46
-0x0969, 0x09A7, 0x09E4, 0x0A21, 0x0A5F, 0x0A9C, 0x0ADA, 0x0B18,
47
-0x0B56, 0x0B93, 0x0BD1, 0x0C0F, 0x0C4D, 0x0C8B, 0x0CC9, 0x0D07,
48
-0x0D45, 0x0D84, 0x0DC2, 0x0E00, 0x0E3F, 0x0E7D, 0x0EBC, 0x0EFA,
49
-0x0F39, 0x0F78, 0x0FB6, 0x0FF5, 0x1034, 0x1073, 0x10B2, 0x10F1,
50
-0x1130, 0x116F, 0x11AE, 0x11EE, 0x122D, 0x126C, 0x12AC, 0x12EB,
51
-0x132B, 0x136B, 0x13AA, 0x13EA, 0x142A, 0x146A, 0x14A9, 0x14E9,
52
-0x1529, 0x1569, 0x15AA, 0x15EA, 0x162A, 0x166A, 0x16AB, 0x16EB,
53
-0x172C, 0x176C, 0x17AD, 0x17ED, 0x182E, 0x186F, 0x18B0, 0x18F0,
54
-0x1931, 0x1972, 0x19B3, 0x19F5, 0x1A36, 0x1A77, 0x1AB8, 0x1AFA,
55
-0x1B3B, 0x1B7D, 0x1BBE, 0x1C00, 0x1C41, 0x1C83, 0x1CC5, 0x1D07,
56
-0x1D48, 0x1D8A, 0x1DCC, 0x1E0E, 0x1E51, 0x1E93, 0x1ED5, 0x1F17,
57
-0x1F5A, 0x1F9C, 0x1FDF, 0x2021, 0x2064, 0x20A6, 0x20E9, 0x212C,
58
-0x216F, 0x21B2, 0x21F5, 0x2238, 0x227B, 0x22BE, 0x2301, 0x2344,
59
-0x2388, 0x23CB, 0x240E, 0x2452, 0x2496, 0x24D9, 0x251D, 0x2561,
60
-0x25A4, 0x25E8, 0x262C, 0x2670, 0x26B4, 0x26F8, 0x273D, 0x2781,
61
-0x27C5, 0x280A, 0x284E, 0x2892, 0x28D7, 0x291C, 0x2960, 0x29A5,
62
-0x29EA, 0x2A2F, 0x2A74, 0x2AB9, 0x2AFE, 0x2B43, 0x2B88, 0x2BCD,
63
-0x2C13, 0x2C58, 0x2C9D, 0x2CE3, 0x2D28, 0x2D6E, 0x2DB4, 0x2DF9,
64
-0x2E3F, 0x2E85, 0x2ECB, 0x2F11, 0x2F57, 0x2F9D, 0x2FE3, 0x302A,
65
-0x3070, 0x30B6, 0x30FD, 0x3143, 0x318A, 0x31D0, 0x3217, 0x325E,
66
-0x32A5, 0x32EC, 0x3332, 0x3379, 0x33C1, 0x3408, 0x344F, 0x3496,
67
-0x34DD, 0x3525, 0x356C, 0x35B4, 0x35FB, 0x3643, 0x368B, 0x36D3,
68
-0x371A, 0x3762, 0x37AA, 0x37F2, 0x383A, 0x3883, 0x38CB, 0x3913,
69
-0x395C, 0x39A4, 0x39ED, 0x3A35, 0x3A7E, 0x3AC6, 0x3B0F, 0x3B58,
70
-0x3BA1, 0x3BEA, 0x3C33, 0x3C7C, 0x3CC5, 0x3D0E, 0x3D58, 0x3DA1,
71
-0x3DEA, 0x3E34, 0x3E7D, 0x3EC7, 0x3F11, 0x3F5A, 0x3FA4, 0x3FEE,
72
-0x4038, 0x4082, 0x40CC, 0x4116, 0x4161, 0x41AB, 0x41F5, 0x4240,
73
-0x428A, 0x42D5, 0x431F, 0x436A, 0x43B5, 0x4400, 0x444B, 0x4495,
74
-0x44E1, 0x452C, 0x4577, 0x45C2, 0x460D, 0x4659, 0x46A4, 0x46F0,
75
-0x473B, 0x4787, 0x47D3, 0x481E, 0x486A, 0x48B6, 0x4902, 0x494E,
76
-0x499A, 0x49E6, 0x4A33, 0x4A7F, 0x4ACB, 0x4B18, 0x4B64, 0x4BB1,
77
-0x4BFE, 0x4C4A, 0x4C97, 0x4CE4, 0x4D31, 0x4D7E, 0x4DCB, 0x4E18,
78
-0x4E66, 0x4EB3, 0x4F00, 0x4F4E, 0x4F9B, 0x4FE9, 0x5036, 0x5084,
79
-0x50D2, 0x5120, 0x516E, 0x51BC, 0x520A, 0x5258, 0x52A6, 0x52F4,
80
-0x5343, 0x5391, 0x53E0, 0x542E, 0x547D, 0x54CC, 0x551A, 0x5569,
81
-0x55B8, 0x5607, 0x5656, 0x56A5, 0x56F4, 0x5744, 0x5793, 0x57E2,
82
-0x5832, 0x5882, 0x58D1, 0x5921, 0x5971, 0x59C1, 0x5A10, 0x5A60,
83
-0x5AB0, 0x5B01, 0x5B51, 0x5BA1, 0x5BF1, 0x5C42, 0x5C92, 0x5CE3,
84
-0x5D34, 0x5D84, 0x5DD5, 0x5E26, 0x5E77, 0x5EC8, 0x5F19, 0x5F6A,
85
-0x5FBB, 0x600D, 0x605E, 0x60B0, 0x6101, 0x6153, 0x61A4, 0x61F6,
86
-0x6248, 0x629A, 0x62EC, 0x633E, 0x6390, 0x63E2, 0x6434, 0x6487,
87
-0x64D9, 0x652C, 0x657E, 0x65D1, 0x6624, 0x6676, 0x66C9, 0x671C,
88
-0x676F, 0x67C2, 0x6815, 0x6869, 0x68BC, 0x690F, 0x6963, 0x69B6,
89
-0x6A0A, 0x6A5E, 0x6AB1, 0x6B05, 0x6B59, 0x6BAD, 0x6C01, 0x6C55,
90
-0x6CAA, 0x6CFE, 0x6D52, 0x6DA7, 0x6DFB, 0x6E50, 0x6EA4, 0x6EF9,
91
-0x6F4E, 0x6FA3, 0x6FF8, 0x704D, 0x70A2, 0x70F7, 0x714D, 0x71A2,
92
-0x71F7, 0x724D, 0x72A2, 0x72F8, 0x734E, 0x73A4, 0x73FA, 0x7450,
93
-0x74A6, 0x74FC, 0x7552, 0x75A8, 0x75FF, 0x7655, 0x76AC, 0x7702,
94
-0x7759, 0x77B0, 0x7807, 0x785E, 0x78B4, 0x790C, 0x7963, 0x79BA,
95
-0x7A11, 0x7A69, 0x7AC0, 0x7B18, 0x7B6F, 0x7BC7, 0x7C1F, 0x7C77,
96
-0x7CCF, 0x7D27, 0x7D7F, 0x7DD7, 0x7E2F, 0x7E88, 0x7EE0, 0x7F38,
97
-0x7F91, 0x7FEA, 0x8042, 0x809B, 0x80F4, 0x814D, 0x81A6, 0x81FF,
98
-0x8259, 0x82B2, 0x830B, 0x8365, 0x83BE, 0x8418, 0x8472, 0x84CB,
99
-0x8525, 0x857F, 0x85D9, 0x8633, 0x868E, 0x86E8, 0x8742, 0x879D,
100
-0x87F7, 0x8852, 0x88AC, 0x8907, 0x8962, 0x89BD, 0x8A18, 0x8A73,
101
-0x8ACE, 0x8B2A, 0x8B85, 0x8BE0, 0x8C3C, 0x8C97, 0x8CF3, 0x8D4F,
102
-0x8DAB, 0x8E07, 0x8E63, 0x8EBF, 0x8F1B, 0x8F77, 0x8FD4, 0x9030,
103
-0x908C, 0x90E9, 0x9146, 0x91A2, 0x91FF, 0x925C, 0x92B9, 0x9316,
104
-0x9373, 0x93D1, 0x942E, 0x948C, 0x94E9, 0x9547, 0x95A4, 0x9602,
105
-0x9660, 0x96BE, 0x971C, 0x977A, 0x97D8, 0x9836, 0x9895, 0x98F3,
106
-0x9952, 0x99B0, 0x9A0F, 0x9A6E, 0x9ACD, 0x9B2C, 0x9B8B, 0x9BEA,
107
-0x9C49, 0x9CA8, 0x9D08, 0x9D67, 0x9DC7, 0x9E26, 0x9E86, 0x9EE6,
108
-0x9F46, 0x9FA6, 0xA006, 0xA066, 0xA0C6, 0xA127, 0xA187, 0xA1E8,
109
-0xA248, 0xA2A9, 0xA30A, 0xA36B, 0xA3CC, 0xA42D, 0xA48E, 0xA4EF,
110
-0xA550, 0xA5B2, 0xA613, 0xA675, 0xA6D6, 0xA738, 0xA79A, 0xA7FC,
111
-0xA85E, 0xA8C0, 0xA922, 0xA984, 0xA9E7, 0xAA49, 0xAAAC, 0xAB0E,
112
-0xAB71, 0xABD4, 0xAC37, 0xAC9A, 0xACFD, 0xAD60, 0xADC3, 0xAE27,
113
-0xAE8A, 0xAEED, 0xAF51, 0xAFB5, 0xB019, 0xB07C, 0xB0E0, 0xB145,
114
-0xB1A9, 0xB20D, 0xB271, 0xB2D6, 0xB33A, 0xB39F, 0xB403, 0xB468,
115
-0xB4CD, 0xB532, 0xB597, 0xB5FC, 0xB662, 0xB6C7, 0xB72C, 0xB792,
116
-0xB7F7, 0xB85D, 0xB8C3, 0xB929, 0xB98F, 0xB9F5, 0xBA5B, 0xBAC1,
117
-0xBB28, 0xBB8E, 0xBBF5, 0xBC5B, 0xBCC2, 0xBD29, 0xBD90, 0xBDF7,
118
-0xBE5E, 0xBEC5, 0xBF2C, 0xBF94, 0xBFFB, 0xC063, 0xC0CA, 0xC132,
119
-0xC19A, 0xC202, 0xC26A, 0xC2D2, 0xC33A, 0xC3A2, 0xC40B, 0xC473,
120
-0xC4DC, 0xC544, 0xC5AD, 0xC616, 0xC67F, 0xC6E8, 0xC751, 0xC7BB,
121
-0xC824, 0xC88D, 0xC8F7, 0xC960, 0xC9CA, 0xCA34, 0xCA9E, 0xCB08,
122
-0xCB72, 0xCBDC, 0xCC47, 0xCCB1, 0xCD1B, 0xCD86, 0xCDF1, 0xCE5B,
123
-0xCEC6, 0xCF31, 0xCF9C, 0xD008, 0xD073, 0xD0DE, 0xD14A, 0xD1B5,
124
-0xD221, 0xD28D, 0xD2F8, 0xD364, 0xD3D0, 0xD43D, 0xD4A9, 0xD515,
125
-0xD582, 0xD5EE, 0xD65B, 0xD6C7, 0xD734, 0xD7A1, 0xD80E, 0xD87B,
126
-0xD8E9, 0xD956, 0xD9C3, 0xDA31, 0xDA9E, 0xDB0C, 0xDB7A, 0xDBE8,
127
-0xDC56, 0xDCC4, 0xDD32, 0xDDA0, 0xDE0F, 0xDE7D, 0xDEEC, 0xDF5B,
128
-0xDFC9, 0xE038, 0xE0A7, 0xE116, 0xE186, 0xE1F5, 0xE264, 0xE2D4,
129
-0xE343, 0xE3B3, 0xE423, 0xE493, 0xE503, 0xE573, 0xE5E3, 0xE654,
130
-0xE6C4, 0xE735, 0xE7A5, 0xE816, 0xE887, 0xE8F8, 0xE969, 0xE9DA,
131
-0xEA4B, 0xEABC, 0xEB2E, 0xEB9F, 0xEC11, 0xEC83, 0xECF5, 0xED66,
132
-0xEDD9, 0xEE4B, 0xEEBD, 0xEF2F, 0xEFA2, 0xF014, 0xF087, 0xF0FA,
133
-0xF16D, 0xF1E0, 0xF253, 0xF2C6, 0xF339, 0xF3AD, 0xF420, 0xF494,
134
-0xF507, 0xF57B, 0xF5EF, 0xF663, 0xF6D7, 0xF74C, 0xF7C0, 0xF834,
135
-0xF8A9, 0xF91E, 0xF992, 0xFA07, 0xFA7C, 0xFAF1, 0xFB66, 0xFBDC,
136
-0xFC51, 0xFCC7, 0xFD3C, 0xFDB2, 0xFE28, 0xFE9E, 0xFF14, 0xFF8A
39
+static const uint16_t getpitchtbl[] =
40
+{
41
+	0x0000, 0x003B, 0x0076, 0x00B2, 0x00ED, 0x0128, 0x0164, 0x019F,
42
+	0x01DB, 0x0217, 0x0252, 0x028E, 0x02CA, 0x0305, 0x0341, 0x037D,
43
+	0x03B9, 0x03F5, 0x0431, 0x046E, 0x04AA, 0x04E6, 0x0522, 0x055F,
44
+	0x059B, 0x05D8, 0x0614, 0x0651, 0x068D, 0x06CA, 0x0707, 0x0743,
45
+	0x0780, 0x07BD, 0x07FA, 0x0837, 0x0874, 0x08B1, 0x08EF, 0x092C,
46
+	0x0969, 0x09A7, 0x09E4, 0x0A21, 0x0A5F, 0x0A9C, 0x0ADA, 0x0B18,
47
+	0x0B56, 0x0B93, 0x0BD1, 0x0C0F, 0x0C4D, 0x0C8B, 0x0CC9, 0x0D07,
48
+	0x0D45, 0x0D84, 0x0DC2, 0x0E00, 0x0E3F, 0x0E7D, 0x0EBC, 0x0EFA,
49
+	0x0F39, 0x0F78, 0x0FB6, 0x0FF5, 0x1034, 0x1073, 0x10B2, 0x10F1,
50
+	0x1130, 0x116F, 0x11AE, 0x11EE, 0x122D, 0x126C, 0x12AC, 0x12EB,
51
+	0x132B, 0x136B, 0x13AA, 0x13EA, 0x142A, 0x146A, 0x14A9, 0x14E9,
52
+	0x1529, 0x1569, 0x15AA, 0x15EA, 0x162A, 0x166A, 0x16AB, 0x16EB,
53
+	0x172C, 0x176C, 0x17AD, 0x17ED, 0x182E, 0x186F, 0x18B0, 0x18F0,
54
+	0x1931, 0x1972, 0x19B3, 0x19F5, 0x1A36, 0x1A77, 0x1AB8, 0x1AFA,
55
+	0x1B3B, 0x1B7D, 0x1BBE, 0x1C00, 0x1C41, 0x1C83, 0x1CC5, 0x1D07,
56
+	0x1D48, 0x1D8A, 0x1DCC, 0x1E0E, 0x1E51, 0x1E93, 0x1ED5, 0x1F17,
57
+	0x1F5A, 0x1F9C, 0x1FDF, 0x2021, 0x2064, 0x20A6, 0x20E9, 0x212C,
58
+	0x216F, 0x21B2, 0x21F5, 0x2238, 0x227B, 0x22BE, 0x2301, 0x2344,
59
+	0x2388, 0x23CB, 0x240E, 0x2452, 0x2496, 0x24D9, 0x251D, 0x2561,
60
+	0x25A4, 0x25E8, 0x262C, 0x2670, 0x26B4, 0x26F8, 0x273D, 0x2781,
61
+	0x27C5, 0x280A, 0x284E, 0x2892, 0x28D7, 0x291C, 0x2960, 0x29A5,
62
+	0x29EA, 0x2A2F, 0x2A74, 0x2AB9, 0x2AFE, 0x2B43, 0x2B88, 0x2BCD,
63
+	0x2C13, 0x2C58, 0x2C9D, 0x2CE3, 0x2D28, 0x2D6E, 0x2DB4, 0x2DF9,
64
+	0x2E3F, 0x2E85, 0x2ECB, 0x2F11, 0x2F57, 0x2F9D, 0x2FE3, 0x302A,
65
+	0x3070, 0x30B6, 0x30FD, 0x3143, 0x318A, 0x31D0, 0x3217, 0x325E,
66
+	0x32A5, 0x32EC, 0x3332, 0x3379, 0x33C1, 0x3408, 0x344F, 0x3496,
67
+	0x34DD, 0x3525, 0x356C, 0x35B4, 0x35FB, 0x3643, 0x368B, 0x36D3,
68
+	0x371A, 0x3762, 0x37AA, 0x37F2, 0x383A, 0x3883, 0x38CB, 0x3913,
69
+	0x395C, 0x39A4, 0x39ED, 0x3A35, 0x3A7E, 0x3AC6, 0x3B0F, 0x3B58,
70
+	0x3BA1, 0x3BEA, 0x3C33, 0x3C7C, 0x3CC5, 0x3D0E, 0x3D58, 0x3DA1,
71
+	0x3DEA, 0x3E34, 0x3E7D, 0x3EC7, 0x3F11, 0x3F5A, 0x3FA4, 0x3FEE,
72
+	0x4038, 0x4082, 0x40CC, 0x4116, 0x4161, 0x41AB, 0x41F5, 0x4240,
73
+	0x428A, 0x42D5, 0x431F, 0x436A, 0x43B5, 0x4400, 0x444B, 0x4495,
74
+	0x44E1, 0x452C, 0x4577, 0x45C2, 0x460D, 0x4659, 0x46A4, 0x46F0,
75
+	0x473B, 0x4787, 0x47D3, 0x481E, 0x486A, 0x48B6, 0x4902, 0x494E,
76
+	0x499A, 0x49E6, 0x4A33, 0x4A7F, 0x4ACB, 0x4B18, 0x4B64, 0x4BB1,
77
+	0x4BFE, 0x4C4A, 0x4C97, 0x4CE4, 0x4D31, 0x4D7E, 0x4DCB, 0x4E18,
78
+	0x4E66, 0x4EB3, 0x4F00, 0x4F4E, 0x4F9B, 0x4FE9, 0x5036, 0x5084,
79
+	0x50D2, 0x5120, 0x516E, 0x51BC, 0x520A, 0x5258, 0x52A6, 0x52F4,
80
+	0x5343, 0x5391, 0x53E0, 0x542E, 0x547D, 0x54CC, 0x551A, 0x5569,
81
+	0x55B8, 0x5607, 0x5656, 0x56A5, 0x56F4, 0x5744, 0x5793, 0x57E2,
82
+	0x5832, 0x5882, 0x58D1, 0x5921, 0x5971, 0x59C1, 0x5A10, 0x5A60,
83
+	0x5AB0, 0x5B01, 0x5B51, 0x5BA1, 0x5BF1, 0x5C42, 0x5C92, 0x5CE3,
84
+	0x5D34, 0x5D84, 0x5DD5, 0x5E26, 0x5E77, 0x5EC8, 0x5F19, 0x5F6A,
85
+	0x5FBB, 0x600D, 0x605E, 0x60B0, 0x6101, 0x6153, 0x61A4, 0x61F6,
86
+	0x6248, 0x629A, 0x62EC, 0x633E, 0x6390, 0x63E2, 0x6434, 0x6487,
87
+	0x64D9, 0x652C, 0x657E, 0x65D1, 0x6624, 0x6676, 0x66C9, 0x671C,
88
+	0x676F, 0x67C2, 0x6815, 0x6869, 0x68BC, 0x690F, 0x6963, 0x69B6,
89
+	0x6A0A, 0x6A5E, 0x6AB1, 0x6B05, 0x6B59, 0x6BAD, 0x6C01, 0x6C55,
90
+	0x6CAA, 0x6CFE, 0x6D52, 0x6DA7, 0x6DFB, 0x6E50, 0x6EA4, 0x6EF9,
91
+	0x6F4E, 0x6FA3, 0x6FF8, 0x704D, 0x70A2, 0x70F7, 0x714D, 0x71A2,
92
+	0x71F7, 0x724D, 0x72A2, 0x72F8, 0x734E, 0x73A4, 0x73FA, 0x7450,
93
+	0x74A6, 0x74FC, 0x7552, 0x75A8, 0x75FF, 0x7655, 0x76AC, 0x7702,
94
+	0x7759, 0x77B0, 0x7807, 0x785E, 0x78B4, 0x790C, 0x7963, 0x79BA,
95
+	0x7A11, 0x7A69, 0x7AC0, 0x7B18, 0x7B6F, 0x7BC7, 0x7C1F, 0x7C77,
96
+	0x7CCF, 0x7D27, 0x7D7F, 0x7DD7, 0x7E2F, 0x7E88, 0x7EE0, 0x7F38,
97
+	0x7F91, 0x7FEA, 0x8042, 0x809B, 0x80F4, 0x814D, 0x81A6, 0x81FF,
98
+	0x8259, 0x82B2, 0x830B, 0x8365, 0x83BE, 0x8418, 0x8472, 0x84CB,
99
+	0x8525, 0x857F, 0x85D9, 0x8633, 0x868E, 0x86E8, 0x8742, 0x879D,
100
+	0x87F7, 0x8852, 0x88AC, 0x8907, 0x8962, 0x89BD, 0x8A18, 0x8A73,
101
+	0x8ACE, 0x8B2A, 0x8B85, 0x8BE0, 0x8C3C, 0x8C97, 0x8CF3, 0x8D4F,
102
+	0x8DAB, 0x8E07, 0x8E63, 0x8EBF, 0x8F1B, 0x8F77, 0x8FD4, 0x9030,
103
+	0x908C, 0x90E9, 0x9146, 0x91A2, 0x91FF, 0x925C, 0x92B9, 0x9316,
104
+	0x9373, 0x93D1, 0x942E, 0x948C, 0x94E9, 0x9547, 0x95A4, 0x9602,
105
+	0x9660, 0x96BE, 0x971C, 0x977A, 0x97D8, 0x9836, 0x9895, 0x98F3,
106
+	0x9952, 0x99B0, 0x9A0F, 0x9A6E, 0x9ACD, 0x9B2C, 0x9B8B, 0x9BEA,
107
+	0x9C49, 0x9CA8, 0x9D08, 0x9D67, 0x9DC7, 0x9E26, 0x9E86, 0x9EE6,
108
+	0x9F46, 0x9FA6, 0xA006, 0xA066, 0xA0C6, 0xA127, 0xA187, 0xA1E8,
109
+	0xA248, 0xA2A9, 0xA30A, 0xA36B, 0xA3CC, 0xA42D, 0xA48E, 0xA4EF,
110
+	0xA550, 0xA5B2, 0xA613, 0xA675, 0xA6D6, 0xA738, 0xA79A, 0xA7FC,
111
+	0xA85E, 0xA8C0, 0xA922, 0xA984, 0xA9E7, 0xAA49, 0xAAAC, 0xAB0E,
112
+	0xAB71, 0xABD4, 0xAC37, 0xAC9A, 0xACFD, 0xAD60, 0xADC3, 0xAE27,
113
+	0xAE8A, 0xAEED, 0xAF51, 0xAFB5, 0xB019, 0xB07C, 0xB0E0, 0xB145,
114
+	0xB1A9, 0xB20D, 0xB271, 0xB2D6, 0xB33A, 0xB39F, 0xB403, 0xB468,
115
+	0xB4CD, 0xB532, 0xB597, 0xB5FC, 0xB662, 0xB6C7, 0xB72C, 0xB792,
116
+	0xB7F7, 0xB85D, 0xB8C3, 0xB929, 0xB98F, 0xB9F5, 0xBA5B, 0xBAC1,
117
+	0xBB28, 0xBB8E, 0xBBF5, 0xBC5B, 0xBCC2, 0xBD29, 0xBD90, 0xBDF7,
118
+	0xBE5E, 0xBEC5, 0xBF2C, 0xBF94, 0xBFFB, 0xC063, 0xC0CA, 0xC132,
119
+	0xC19A, 0xC202, 0xC26A, 0xC2D2, 0xC33A, 0xC3A2, 0xC40B, 0xC473,
120
+	0xC4DC, 0xC544, 0xC5AD, 0xC616, 0xC67F, 0xC6E8, 0xC751, 0xC7BB,
121
+	0xC824, 0xC88D, 0xC8F7, 0xC960, 0xC9CA, 0xCA34, 0xCA9E, 0xCB08,
122
+	0xCB72, 0xCBDC, 0xCC47, 0xCCB1, 0xCD1B, 0xCD86, 0xCDF1, 0xCE5B,
123
+	0xCEC6, 0xCF31, 0xCF9C, 0xD008, 0xD073, 0xD0DE, 0xD14A, 0xD1B5,
124
+	0xD221, 0xD28D, 0xD2F8, 0xD364, 0xD3D0, 0xD43D, 0xD4A9, 0xD515,
125
+	0xD582, 0xD5EE, 0xD65B, 0xD6C7, 0xD734, 0xD7A1, 0xD80E, 0xD87B,
126
+	0xD8E9, 0xD956, 0xD9C3, 0xDA31, 0xDA9E, 0xDB0C, 0xDB7A, 0xDBE8,
127
+	0xDC56, 0xDCC4, 0xDD32, 0xDDA0, 0xDE0F, 0xDE7D, 0xDEEC, 0xDF5B,
128
+	0xDFC9, 0xE038, 0xE0A7, 0xE116, 0xE186, 0xE1F5, 0xE264, 0xE2D4,
129
+	0xE343, 0xE3B3, 0xE423, 0xE493, 0xE503, 0xE573, 0xE5E3, 0xE654,
130
+	0xE6C4, 0xE735, 0xE7A5, 0xE816, 0xE887, 0xE8F8, 0xE969, 0xE9DA,
131
+	0xEA4B, 0xEABC, 0xEB2E, 0xEB9F, 0xEC11, 0xEC83, 0xECF5, 0xED66,
132
+	0xEDD9, 0xEE4B, 0xEEBD, 0xEF2F, 0xEFA2, 0xF014, 0xF087, 0xF0FA,
133
+	0xF16D, 0xF1E0, 0xF253, 0xF2C6, 0xF339, 0xF3AD, 0xF420, 0xF494,
134
+	0xF507, 0xF57B, 0xF5EF, 0xF663, 0xF6D7, 0xF74C, 0xF7C0, 0xF834,
135
+	0xF8A9, 0xF91E, 0xF992, 0xFA07, 0xFA7C, 0xFAF1, 0xFB66, 0xFBDC,
136
+	0xFC51, 0xFCC7, 0xFD3C, 0xFDB2, 0xFE28, 0xFE9E, 0xFF14, 0xFF8A
137 137
 };
138 138
 
139
-static const uint8_t getvoltbl[] = {
140
-0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
141
-0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
142
-0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
143
-0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
144
-0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
145
-0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
146
-0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
147
-0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
148
-0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03,
149
-0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
150
-0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
151
-0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
152
-0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
153
-0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
154
-0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08,
155
-0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
156
-0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
157
-0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E,
158
-0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10,
159
-0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14,
160
-0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18,
161
-0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C,
162
-0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22,
163
-0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29,
164
-0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31,
165
-0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B,
166
-0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47,
167
-0x48, 0x49, 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x52, 0x53, 0x54, 0x55,
168
-0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67,
169
-0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B,
170
-0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25,
171
-0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D,
172
-0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x36,
173
-0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x40, 0x40,
174
-0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D,
175
-0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D,
176
-0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x70,
177
-0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41, 0x42, 0x43, 0x43,
178
-0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,
179
-0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61,
180
-0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75,
181
-0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46,
182
-0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
183
-0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66,
184
-0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A,
185
-0x7C, 0x7D, 0x7E, 0x7F
139
+static const uint8_t getvoltbl[] =
140
+{
141
+	0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
142
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
143
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
144
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
145
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
146
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
147
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
148
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
149
+	0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03,
150
+	0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
151
+	0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
152
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
153
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
154
+	0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
155
+	0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08,
156
+	0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
157
+	0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
158
+	0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E,
159
+	0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10,
160
+	0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14,
161
+	0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18,
162
+	0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C,
163
+	0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22,
164
+	0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29,
165
+	0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31,
166
+	0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B,
167
+	0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47,
168
+	0x48, 0x49, 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x52, 0x53, 0x54, 0x55,
169
+	0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67,
170
+	0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B,
171
+	0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25,
172
+	0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D,
173
+	0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x36,
174
+	0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x40, 0x40,
175
+	0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D,
176
+	0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D,
177
+	0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x70,
178
+	0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41, 0x42, 0x43, 0x43,
179
+	0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,
180
+	0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61,
181
+	0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75,
182
+	0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46,
183
+	0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
184
+	0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66,
185
+	0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A,
186
+	0x7C, 0x7D, 0x7E, 0x7F
186 187
 };
187 188
 
188 189
 TEMPLATE static uint32_t bios_nop()
189 190
 {
190
-	/*LOG("SWI: ARM%c Unimplemented BIOS function %02X was used. R0:%08X, R1:%08X, R2:%08X\n", PROCNUM?'7':'9',
191
-							(cpu->instruction)&0x1F, cpu->R[0], cpu->R[1], cpu->R[2]);*/
192 191
 	return 3;
193 192
 }
194 193
 
... ...
@@ -196,13 +195,9 @@ TEMPLATE static uint32_t WaitByLoop()
196 195
 {
197 196
 	uint32_t elapsed;
198 197
 
199
-	//printf("%lld waitbyloop\n",nds_timer);
200
-	//INFO("ARM%c: SWI 0x03 (WaitByLoop)\n", PROCNUM?'7':'9');
201 198
 	if (PROCNUM == ARMCPU_ARM9)
202 199
 	{
203
-		armcp15_t *cp = (armcp15_t*)(cpu->coproc[15]);
204
-
205
-		if (cp->ctrl & ((1<<16)|(1<<18)))		// DTCM or ITCM is on (cache)
200
+		if (cp15.ctrl & ((1 << 16) | (1 << 18))) // DTCM or ITCM is on (cache)
206 201
 			elapsed = cpu->R[0] * 2;
207 202
 		else
208 203
 			elapsed = cpu->R[0] * 8;
... ...
@@ -215,45 +210,43 @@ TEMPLATE static uint32_t WaitByLoop()
215 210
 
216 211
 TEMPLATE static uint32_t wait4IRQ()
217 212
 {
218
-   	cpu->waitIRQ = true;
213
+	cpu->waitIRQ = true;
219 214
 	cpu->halt_IE_and_IF = true;
220 215
 	return 1;
221 216
 }
222 217
 
223
-TEMPLATE uint32_t intrWaitARM()
218
+TEMPLATE static uint32_t intrWaitARM()
224 219
 {
225
-	//TODO - account for differences between arm7 and arm9 (according to gbatek, the "bug doesn't work")
220
+	// TODO - account for differences between arm7 and arm9 (according to gbatek, the "bug doesn't work")
226 221
 
227
-	const uint32_t intrFlagAdr = (PROCNUM == ARMCPU_ARM7)
228
-		? 0x380FFF8
229
-		: (((armcp15_t *)(cpu->coproc[15]))->DTCMRegion&0xFFFFF000)+0x3FF8;
222
+	const uint32_t intrFlagAdr = PROCNUM == ARMCPU_ARM7 ? 0x380FFF8 : (cp15.DTCMRegion & 0xFFFFF000) + 0x3FF8;
230 223
 
231
-	//set IME=1
232
-	//without this, no irq handlers can happen (even though IF&IE waits can happily happen)
233
-	//and so no bits in the OS irq flag variable can get set by the handlers
224
+	// set IME=1
225
+	// without this, no irq handlers can happen (even though IF&IE waits can happily happen)
226
+	// and so no bits in the OS irq flag variable can get set by the handlers
234 227
 	_MMU_write32<PROCNUM>(0x04000208, 1);
235 228
 
236
-	//analyze the OS irq flag variable
229
+	// analyze the OS irq flag variable
237 230
 	uint32_t intr = _MMU_read32<PROCNUM>(intrFlagAdr);
238
-	uint32_t intrFlag = (cpu->R[1] & intr);
231
+	uint32_t intrFlag = cpu->R[1] & intr;
239 232
 
240
-	//if the user requested us to discard flags, then clear the flag(s) we're going to be waiting on.
241
-	//(be sure to only do this only on the first run through. use a little state machine to control that)
242
-	if(cpu->intrWaitARM_state==0 && cpu->R[0]==1)
233
+	// if the user requested us to discard flags, then clear the flag(s) we're going to be waiting on.
234
+	// (be sure to only do this only on the first run through. use a little state machine to control that)
235
+	if (!cpu->intrWaitARM_state && cpu->R[0] == 1)
243 236
 	{
244 237
 		intr ^= intrFlag;
245 238
 		_MMU_write32<PROCNUM>(intrFlagAdr, intr);
246 239
 
247
-		//we want to make sure we wait at least once below
240
+		// we want to make sure we wait at least once below
248 241
 		intrFlag = 0;
249 242
 	}
250 243
 
251 244
 	cpu->intrWaitARM_state = 1;
252 245
 
253
-	//now, if the condition is satisfied (and it won't be the first time through, no matter what, due to cares taken above)
254
-	if(intrFlag)
246
+	// now, if the condition is satisfied (and it won't be the first time through, no matter what, due to cares taken above)
247
+	if (intrFlag)
255 248
 	{
256
-		//write back the OS irq flags with the ones we were waiting for cleared
249
+		// write back the OS irq flags with the ones we were waiting for cleared
257 250
 		intr ^= intrFlag;
258 251
 		_MMU_write32<PROCNUM>(intrFlagAdr, intr);
259 252
 
... ...
@@ -261,12 +254,12 @@ TEMPLATE uint32_t intrWaitARM()
261 254
 		return 1;
262 255
 	}
263 256
 
264
-	//the condition wasn't satisfied. this means that we need to halt, wait for some enabled interrupt,
265
-	//and then ensure that we return to this opcode again to check the condition again
257
+	// the condition wasn't satisfied. this means that we need to halt, wait for some enabled interrupt,
258
+	// and then ensure that we return to this opcode again to check the condition again
266 259
 	cpu->waitIRQ = true;
267 260
 	cpu->halt_IE_and_IF = true;
268 261
 
269
-	//(rewire PC to jump back to this opcode)
262
+	// (rewire PC to jump back to this opcode)
270 263
 	uint32_t instructAddr = cpu->instruct_adr;
271 264
 	cpu->R[15] = instructAddr;
272 265
 	cpu->next_instruction = instructAddr;
... ...
@@ -288,713 +281,707 @@ TEMPLATE static uint32_t sleep()
288 281
 
289 282
 TEMPLATE static uint32_t divide()
290 283
 {
291
-     int32_t num = (int32_t)cpu->R[0];
292
-     int32_t dnum = (int32_t)cpu->R[1];
284
+	int32_t num = static_cast<int32_t>(cpu->R[0]);
285
+	int32_t dnum = static_cast<int32_t>(cpu->R[1]);
293 286
 
294
-     if(dnum==0) return 0;
287
+	if (!dnum)
288
+		return 0;
295 289
 
296
-	 int32_t res = num / dnum;
297
-     cpu->R[0] = (uint32_t)res;
298
-     cpu->R[1] = (uint32_t)(num % dnum);
299
-     cpu->R[3] = (uint32_t)abs(res);
290
+	int32_t res = num / dnum;
291
+	cpu->R[0] = static_cast<uint32_t>(res);
292
+	cpu->R[1] = static_cast<uint32_t>(num % dnum);
293
+	cpu->R[3] = static_cast<uint32_t>(std::abs(res));
300 294
 
301
-	 //INFO("ARM%c: SWI 0x09 (divide): in num %i, dnum %i, out R0:%i, R1:%i, R3:%i\n", PROCNUM?'7':'9', num, dnum, cpu->R[0], cpu->R[1], cpu->R[3]);
302
-
303
-     return 6;
295
+	return 6;
304 296
 }
305 297
 
306 298
 TEMPLATE static uint32_t copy()
307 299
 {
308
-     uint32_t src = cpu->R[0];
309
-     uint32_t dst = cpu->R[1];
310
-     uint32_t cnt = cpu->R[2];
311
-
312
-	 //INFO("swi copy from %08X to %08X, cnt=%08X\n", src, dst, cnt);
313
-
314
-     switch(BIT26(cnt))
315
-     {
316
-          case 0:
317
-               src &= 0xFFFFFFFE;
318
-               dst &= 0xFFFFFFFE;
319
-               switch(BIT24(cnt))
320
-               {
321
-                    case 0:
322
-                         cnt &= 0x1FFFFF;
323
-                         while(cnt)
324
-                         {
325
-                              _MMU_write16<PROCNUM>(dst, _MMU_read16<PROCNUM>(src));
326
-                              cnt--;
327
-                              dst+=2;
328
-                              src+=2;
329
-                         }
330
-                         break;
331
-                    case 1:
332
-                         {
333
-                              uint32_t val = _MMU_read16<PROCNUM>(src);
334
-                              cnt &= 0x1FFFFF;
335
-                              while(cnt)
336
-                              {
337
-                                   _MMU_write16<PROCNUM>(dst, static_cast<uint16_t>(val));
338
-                                   cnt--;
339
-                                   dst+=2;
340
-                              }
341
-                         }
342
-                         break;
343
-               }
344
-               break;
345
-          case 1:
346
-               src &= 0xFFFFFFFC;
347
-               dst &= 0xFFFFFFFC;
348
-               switch(BIT24(cnt))
349
-               {
350
-                    case 0:
351
-                         cnt &= 0x1FFFFF;
352
-                         while(cnt)
353
-                         {
354
-                              _MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));
355
-                              cnt--;
356
-                              dst+=4;
357
-                              src+=4;
358
-                         }
359
-                         break;
360
-                    case 1:
361
-                         {
362
-                              uint32_t val = _MMU_read32<PROCNUM>(src);
363
-                              cnt &= 0x1FFFFF;
364
-                              while(cnt)
365
-                              {
366
-                                   _MMU_write32<PROCNUM>(dst, val);
367
-                                   cnt--;
368
-                                   dst+=4;
369
-                              }
370
-                         }
371
-                         break;
372
-               }
373
-               break;
374
-     }
375
-     return 1;
300
+	uint32_t src = cpu->R[0];
301
+	uint32_t dst = cpu->R[1];
302
+	uint32_t cnt = cpu->R[2];
303
+
304
+	switch (BIT26(cnt))
305
+	{
306
+		case 0:
307
+			src &= 0xFFFFFFFE;
308
+			dst &= 0xFFFFFFFE;
309
+			switch (BIT24(cnt))
310
+			{
311
+				case 0:
312
+					cnt &= 0x1FFFFF;
313
+					while (cnt)
314
+					{
315
+						_MMU_write16<PROCNUM>(dst, _MMU_read16<PROCNUM>(src));
316
+						--cnt;
317
+						dst += 2;
318
+						src += 2;
319
+					}
320
+					break;
321
+				case 1:
322
+				{
323
+					uint16_t val = _MMU_read16<PROCNUM>(src);
324
+					cnt &= 0x1FFFFF;
325
+					while (cnt)
326
+					{
327
+						_MMU_write16<PROCNUM>(dst, static_cast<uint16_t>(val));
328
+						--cnt;
329
+						dst += 2;
330
+					}
331
+					break;
332
+				}
333
+			}
334
+			break;
335
+		case 1:
336
+			src &= 0xFFFFFFFC;
337
+			dst &= 0xFFFFFFFC;
338
+			switch (BIT24(cnt))
339
+			{
340
+				case 0:
341
+					cnt &= 0x1FFFFF;
342
+					while (cnt)
343
+					{
344
+						_MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));
345
+						--cnt;
346
+						dst += 4;
347
+						src += 4;
348
+					}
349
+					break;
350
+				case 1:
351
+				{
352
+					uint32_t val = _MMU_read32<PROCNUM>(src);
353
+					cnt &= 0x1FFFFF;
354
+					while (cnt)
355
+					{
356
+						_MMU_write32<PROCNUM>(dst, val);
357
+						--cnt;
358
+						dst += 4;
359
+					}
360
+					break;
361
+				}
362
+			}
363
+			break;
364
+	}
365
+	return 1;
376 366
 }
377 367
 
378 368
 TEMPLATE static uint32_t fastCopy()
379 369
 {
380
-     uint32_t src = cpu->R[0] & 0xFFFFFFFC;
381
-     uint32_t dst = cpu->R[1] & 0xFFFFFFFC;
382
-     uint32_t cnt = cpu->R[2];
383
-
384
-	 //INFO("swi fastcopy from %08X to %08X, cnt=%08X\n", src, dst, cnt);
385
-
386
-     switch(BIT24(cnt))
387
-     {
388
-          case 0:
389
-               cnt &= 0x1FFFFF;
390
-               while(cnt)
391
-               {
392
-                    _MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));
393
-                    cnt--;
394
-                    dst+=4;
395
-                    src+=4;
396
-               }
397
-               break;
398
-          case 1:
399
-               {
400
-                    uint32_t val = _MMU_read32<PROCNUM>(src);
401
-                    cnt &= 0x1FFFFF;
402
-                    while(cnt)
403
-                    {
404
-                         _MMU_write32<PROCNUM>(dst, val);
405
-                         cnt--;
406
-                         dst+=4;
407
-                    }
408
-               }
409
-               break;
410
-     }
411
-     return 1;
370
+	uint32_t src = cpu->R[0] & 0xFFFFFFFC;
371
+	uint32_t dst = cpu->R[1] & 0xFFFFFFFC;
372
+	uint32_t cnt = cpu->R[2];
373
+
374
+	switch (BIT24(cnt))
375
+	{
376
+		case 0:
377
+			cnt &= 0x1FFFFF;
378
+			while (cnt)
379
+			{
380
+				_MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));
381
+				--cnt;
382
+				dst += 4;
383
+				src += 4;
384
+			}
385
+			break;
386
+		case 1:
387
+		{
388
+			uint32_t val = _MMU_read32<PROCNUM>(src);
389
+			cnt &= 0x1FFFFF;
390
+			while (cnt)
391
+			{
392
+				_MMU_write32<PROCNUM>(dst, val);
393
+				--cnt;
394
+				dst += 4;
395
+			}
396
+			break;
397
+		}
398
+	}
399
+	return 1;
412 400
 }
413 401
 
414 402
 TEMPLATE static uint32_t LZ77UnCompVram()
415 403
 {
416
-  int i1, i2;
417
-  int byteCount;
418
-  int byteShift;
419
-  uint32_t writeValue;
420
-  int len;
421
-  uint32_t source = cpu->R[0];
422
-  uint32_t dest = cpu->R[1];
423
-  uint32_t header = _MMU_read32<PROCNUM>(source);
424
-  source += 4;
425
-
426
-  //INFO("swi lz77uncompvram\n");
427
-
428
-  if(((source & 0xe000000) == 0) ||
429
-     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
430
-    return 0;
431
-
432
-  byteCount = 0;
433
-  byteShift = 0;
434
-  writeValue = 0;
435
-
436
-  len = header >> 8;
437
-
438
-  while(len > 0) {
439
-    uint8_t d = _MMU_read08<PROCNUM>(source++);
440
-
441
-    if(d) {
442
-      for(i1 = 0; i1 < 8; i1++) {
443
-        if(d & 0x80) {
444
-          int length;
445
-          int offset;
446
-          uint32_t windowOffset;
447
-          uint16_t data = _MMU_read08<PROCNUM>(source++) << 8;
448
-          data |= _MMU_read08<PROCNUM>(source++);
449
-          length = (data >> 12) + 3;
450
-          offset = (data & 0x0FFF);
451
-          windowOffset = dest + byteCount - offset - 1;
452
-          for(i2 = 0; i2 < length; i2++) {
453
-            writeValue |= (_MMU_read08<PROCNUM>(windowOffset++) << byteShift);
454
-            byteShift += 8;
455
-            byteCount++;
456
-
457
-            if(byteCount == 2) {
458
-              _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
459
-              dest += 2;
460
-              byteCount = 0;
461
-              byteShift = 0;
462
-              writeValue = 0;
463
-            }
464
-            len--;
465
-            if(len == 0)
466
-              return 0;
467
-          }
468
-        } else {
469
-          writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);
470
-          byteShift += 8;
471
-          byteCount++;
472
-          if(byteCount == 2) {
473
-            _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
474
-            dest += 2;
475
-            byteCount = 0;
476
-            byteShift = 0;
477
-            writeValue = 0;
478
-          }
479
-          len--;
480
-          if(len == 0)
481
-            return 0;
482
-        }
483
-        d <<= 1;
484
-      }
485
-    } else {
486
-      for(i1 = 0; i1 < 8; i1++) {
487
-        writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);
488
-        byteShift += 8;
489
-        byteCount++;
490
-        if(byteCount == 2) {
491
-          _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
492
-          dest += 2;
493
-          byteShift = 0;
494
-          byteCount = 0;
495
-          writeValue = 0;
496
-        }
497
-        len--;
498
-        if(len == 0)
499
-          return 0;
500
-      }
501
-    }
502
-  }
503
-  return 1;
404
+	uint32_t source = cpu->R[0];
405
+	uint32_t dest = cpu->R[1];
406
+	uint32_t header = _MMU_read32<PROCNUM>(source);
407
+	source += 4;
408
+
409
+	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
410
+		return 0;
411
+
412
+	int byteCount = 0;
413
+	int byteShift = 0;
414
+	uint32_t writeValue = 0;
415
+
416
+	int len = header >> 8;
417
+
418
+	while (len > 0)
419
+	{
420
+		uint8_t d = _MMU_read08<PROCNUM>(source++);
421
+
422
+		int i1, i2;
423
+		if (d)
424
+		{
425
+			for (i1 = 0; i1 < 8; ++i1)
426
+			{
427
+				if (d & 0x80)
428
+				{
429
+					uint16_t data = _MMU_read08<PROCNUM>(source++) << 8;
430
+					data |= _MMU_read08<PROCNUM>(source++);
431
+					int length = (data >> 12) + 3;
432
+					int offset = data & 0x0FFF;
433
+					uint32_t windowOffset = dest + byteCount - offset - 1;
434
+					for (i2 = 0; i2 < length; ++i2)
435
+					{
436
+						writeValue |= _MMU_read08<PROCNUM>(windowOffset++) << byteShift;
437
+						byteShift += 8;
438
+						++byteCount;
439
+
440
+						if (byteCount == 2)
441
+						{
442
+							_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
443
+							dest += 2;
444
+							byteCount = 0;
445
+							byteShift = 0;
446
+							writeValue = 0;
447
+						}
448
+						--len;
449
+						if (!len)
450
+							return 0;
451
+					}
452
+				}
453
+				else
454
+				{
455
+					writeValue |= _MMU_read08<PROCNUM>(source++) << byteShift;
456
+					byteShift += 8;
457
+					++byteCount;
458
+					if (byteCount == 2)
459
+					{
460
+						_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
461
+						dest += 2;
462
+						byteCount = 0;
463
+						byteShift = 0;
464
+						writeValue = 0;
465
+					}
466
+					--len;
467
+					if (!len)
468
+						return 0;
469
+				}
470
+				d <<= 1;
471
+			}
472
+		}
473
+		else
474
+		{
475
+			for (i1 = 0; i1 < 8; ++i1)
476
+			{
477
+				writeValue |= _MMU_read08<PROCNUM>(source++) << byteShift;
478
+				byteShift += 8;
479
+				++byteCount;
480
+				if (byteCount == 2)
481
+				{
482
+					_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
483
+					dest += 2;
484
+					byteShift = 0;
485
+					byteCount = 0;
486
+					writeValue = 0;
487
+				}
488
+				--len;
489
+				if (!len)
490
+					return 0;
491
+			}
492
+		}
493
+	}
494
+	return 1;
504 495
 }
505 496
 
506 497
 TEMPLATE static uint32_t LZ77UnCompWram()
507 498
 {
508
-  int i1, i2;
509
-  int len;
510
-  uint32_t source = cpu->R[0];
511
-  uint32_t dest = cpu->R[1];
512
-
513
-  uint32_t header = _MMU_read32<PROCNUM>(source);
514
-  source += 4;
515
-
516
-  //INFO("swi lz77uncompwram\n");
517
-
518
-  if(((source & 0xe000000) == 0) ||
519
-     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
520
-    return 0;
521
-
522
-  len = header >> 8;
523
-
524
-  while(len > 0) {
525
-    uint8_t d = _MMU_read08<PROCNUM>(source++);
526
-
527
-    if(d) {
528
-      for(i1 = 0; i1 < 8; i1++) {
529
-        if(d & 0x80) {
530
-          int length;
531
-          int offset;
532
-          uint32_t windowOffset;
533
-          uint16_t data = _MMU_read08<PROCNUM>(source++) << 8;
534
-          data |= _MMU_read08<PROCNUM>(source++);
535
-          length = (data >> 12) + 3;
536
-          offset = (data & 0x0FFF);
537
-          windowOffset = dest - offset - 1;
538
-          for(i2 = 0; i2 < length; i2++) {
539
-            _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(windowOffset++));
540
-            len--;
541
-            if(len == 0)
542
-              return 0;
543
-          }
544
-        } else {
545
-          _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(source++));
546
-          len--;
547
-          if(len == 0)
548
-            return 0;
549
-        }
550
-        d <<= 1;
551
-      }
552
-    } else {
553
-      for(i1 = 0; i1 < 8; i1++) {
554
-        _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(source++));
555
-        len--;
556
-        if(len == 0)
557
-          return 0;
558
-      }
559
-    }
560
-  }
561
-  return 1;
499
+	uint32_t source = cpu->R[0];
500
+	uint32_t dest = cpu->R[1];
501
+	uint32_t header = _MMU_read32<PROCNUM>(source);
502
+	source += 4;
503
+
504
+	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
505
+		return 0;
506
+
507
+	int len = header >> 8;
508
+
509
+	while (len > 0)
510
+	{
511
+		uint8_t d = _MMU_read08<PROCNUM>(source++);
512
+
513
+		int i1, i2;
514
+		if (d)
515
+		{
516
+			for (i1 = 0; i1 < 8; ++i1)
517
+			{
518
+				if (d & 0x80)
519
+				{
520
+					uint16_t data = _MMU_read08<PROCNUM>(source++) << 8;
521
+					data |= _MMU_read08<PROCNUM>(source++);
522
+					int length = (data >> 12) + 3;
523
+					int offset = data & 0x0FFF;
524
+					uint32_t windowOffset = dest - offset - 1;
525
+					for (i2 = 0; i2 < length; ++i2)
526
+					{
527
+						_MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(windowOffset++));
528
+						--len;
529
+						if (!len)
530
+							return 0;
531
+					}
532
+				}
533
+				else
534
+				{
535
+					_MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(source++));
536
+					--len;
537
+					if (!len)
538
+						return 0;
539
+				}
540
+				d <<= 1;
541
+			}
542
+		}
543
+		else
544
+		{
545
+			for (i1 = 0; i1 < 8; ++i1)
546
+			{
547
+				_MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(source++));
548
+				--len;
549
+				if (!len)
550
+					return 0;
551
+			}
552
+		}
553
+	}
554
+	return 1;
562 555
 }
563 556
 
564 557
 TEMPLATE static uint32_t RLUnCompVram()
565 558
 {
566
-  int i;
567
-  int len;
568
-  int byteCount;
569
-  int byteShift;
570
-  uint32_t writeValue;
571
-  uint32_t source = cpu->R[0];
572
-  uint32_t dest = cpu->R[1];
573
-
574
-  uint32_t header = _MMU_read32<PROCNUM>(source);
575
-  source += 4;
576
-
577
-  //INFO("swi rluncompvram\n");
578
-
579
-  if(((source & 0xe000000) == 0) ||
580
-     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
581
-    return 0;
582
-
583
-  len = header >> 8;
584
-  byteCount = 0;
585
-  byteShift = 0;
586
-  writeValue = 0;
587
-
588
-  while(len > 0) {
589
-    uint8_t d = _MMU_read08<PROCNUM>(source++);
590
-    int l = d & 0x7F;
591
-    if(d & 0x80) {
592
-      uint8_t data = _MMU_read08<PROCNUM>(source++);
593
-      l += 3;
594
-      for(i = 0;i < l; i++) {
595
-        writeValue |= (data << byteShift);
596
-        byteShift += 8;
597
-        byteCount++;
598
-
599
-        if(byteCount == 2) {
600
-          _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
601
-          dest += 2;
602
-          byteCount = 0;
603
-          byteShift = 0;
604
-          writeValue = 0;
605
-        }
606
-        len--;
607
-        if(len == 0)
608
-          return 0;
609
-      }
610
-    } else {
611
-      l++;
612
-      for(i = 0; i < l; i++) {
613
-        writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);
614
-        byteShift += 8;
615
-        byteCount++;
616
-        if(byteCount == 2) {
617
-          _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
618
-          dest += 2;
619
-          byteCount = 0;
620
-          byteShift = 0;
621
-          writeValue = 0;
622
-        }
623
-        len--;
624
-        if(len == 0)
625
-          return 0;
626
-      }
627
-    }
628
-  }
629
-  return 1;
559
+	uint32_t source = cpu->R[0];
560
+	uint32_t dest = cpu->R[1];
561
+	uint32_t header = _MMU_read32<PROCNUM>(source);
562
+	source += 4;
563
+
564
+	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
565
+		return 0;
566
+
567
+	int len = header >> 8;
568
+	int byteCount = 0;
569
+	int byteShift = 0;
570
+	uint32_t writeValue = 0;
571
+
572
+	while (len > 0)
573
+	{
574
+		uint8_t d = _MMU_read08<PROCNUM>(source++);
575
+		int l = d & 0x7F;
576
+
577
+		int i;
578
+		if (d & 0x80)
579
+		{
580
+			uint8_t data = _MMU_read08<PROCNUM>(source++);
581
+			l += 3;
582
+			for (i = 0; i < l; ++i)
583
+			{
584
+				writeValue |= data << byteShift;
585
+				byteShift += 8;
586
+				++byteCount;
587
+
588
+				if (byteCount == 2)
589
+				{
590
+					_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
591
+					dest += 2;
592
+					byteCount = 0;
593
+					byteShift = 0;
594
+					writeValue = 0;
595
+				}
596
+				--len;
597
+				if (!len)
598
+					return 0;
599
+			}
600
+		}
601
+		else
602
+		{
603
+			++l;
604
+			for (i = 0; i < l; ++i)
605
+			{
606
+				writeValue |= _MMU_read08<PROCNUM>(source++) << byteShift;
607
+				byteShift += 8;
608
+				++byteCount;
609
+
610
+				if (byteCount == 2)
611
+				{
612
+					_MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
613
+					dest += 2;
614
+					byteCount = 0;
615
+					byteShift = 0;
616
+					writeValue = 0;
617
+				}
618
+				--len;
619
+				if (!len)
620
+					return 0;
621
+			}
622
+		}
623
+	}
624
+	return 1;
630 625
 }
631 626
 
632 627
 TEMPLATE static uint32_t RLUnCompWram()
633 628
 {
634
-  int i;
635
-  int len;
636
-  uint32_t source = cpu->R[0];
637
-  uint32_t dest = cpu->R[1];
638
-
639
-  uint32_t header = _MMU_read32<PROCNUM>(source);
640
-  source += 4;
641
-
642
-  //INFO("swi rluncompwram\n");
643
-
644
-  if(((source & 0xe000000) == 0) ||
645
-     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
646
-    return 0;
647
-
648
-  len = header >> 8;
649
-
650
-  while(len > 0) {
651
-    uint8_t d = _MMU_read08<PROCNUM>(source++);
652
-    int l = d & 0x7F;
653
-    if(d & 0x80) {
654
-      uint8_t data = _MMU_read08<PROCNUM>(source++);
655
-      l += 3;
656
-      for(i = 0;i < l; i++) {
657
-        _MMU_write08<PROCNUM>(dest++, data);
658
-        len--;
659
-        if(len == 0)
660
-          return 0;
661
-      }
662
-    } else {
663
-      l++;
664
-      for(i = 0; i < l; i++) {
665
-        _MMU_write08<PROCNUM>(dest++,  _MMU_read08<PROCNUM>(source++));
666
-        len--;
667
-        if(len == 0)
668
-          return 0;
669
-      }
670
-    }
671
-  }
672
-  return 1;
629
+	uint32_t source = cpu->R[0];
630
+	uint32_t dest = cpu->R[1];
631
+	uint32_t header = _MMU_read32<PROCNUM>(source);
632
+	source += 4;
633
+
634
+	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
635
+		return 0;
636
+
637
+	int len = header >> 8;
638
+
639
+	while (len > 0)
640
+	{
641
+		uint8_t d = _MMU_read08<PROCNUM>(source++);
642
+		int l = d & 0x7F;
643
+
644
+		int i;
645
+		if (d & 0x80)
646
+		{
647
+			uint8_t data = _MMU_read08<PROCNUM>(source++);
648
+			l += 3;
649
+			for (i = 0; i < l; ++i)
650
+			{
651
+				_MMU_write08<PROCNUM>(dest++, data);
652
+				--len;
653
+				if (!len)
654
+					return 0;
655
+			}
656
+		}
657
+		else
658
+		{
659
+			++l;
660
+			for (i = 0; i < l; ++i)
661
+			{
662
+				_MMU_write08<PROCNUM>(dest++,  _MMU_read08<PROCNUM>(source++));
663
+				--len;
664
+				if (!len)
665
+					return 0;
666
+			}
667
+		}
668
+	}
669
+	return 1;
673 670
 }
674 671
 
675 672
 TEMPLATE static uint32_t UnCompHuffman()
676 673
 {
677
-  uint32_t source, dest, writeValue, header, treeStart, mask;
678
-  uint32_t data;
679
-  uint8_t treeSize, currentNode, rootNode;
680
-  int byteCount, byteShift, len, pos;
681
-  int writeData;
682
-
683
-  source = cpu->R[0];
684
-  dest = cpu->R[1];
685
-
686
-  header = _MMU_read08<PROCNUM>(source);
687
-  source += 4;
688
-
689
-  //INFO("swi uncomphuffman\n");
690
-
691
-  if(((source & 0xe000000) == 0) ||
692
-     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
693
-    return 0;
694
-
695
-  treeSize = _MMU_read08<PROCNUM>(source++);
696
-
697
-  treeStart = source;
698
-
699
-  source += ((treeSize+1)<<1)-1; // minus because we already skipped one byte
700
-
701
-  len = header >> 8;
702
-
703
-  mask = 0x80000000;
704
-  data = _MMU_read08<PROCNUM>(source);
705
-  source += 4;
706
-
707
-  pos = 0;
708
-  rootNode = _MMU_read08<PROCNUM>(treeStart);
709
-  currentNode = rootNode;
710
-  writeData = 0;
711
-  byteShift = 0;
712
-  byteCount = 0;
713
-  writeValue = 0;
714
-
715
-  if((header & 0x0F) == 8) {
716
-    while(len > 0) {
717
-      // take left
718
-      if(pos == 0)
719
-        pos++;
720
-      else
721
-        pos += (((currentNode & 0x3F)+1)<<1);
722
-
723
-      if(data & mask) {
724
-        // right
725
-        if(currentNode & 0x40)
726
-          writeData = 1;
727
-        currentNode = _MMU_read08<PROCNUM>(treeStart+pos+1);
728
-      } else {
729
-        // left
730
-        if(currentNode & 0x80)
731
-          writeData = 1;
732
-        currentNode = _MMU_read08<PROCNUM>(treeStart+pos);
733
-      }
734
-
735
-      if(writeData) {
736
-        writeValue |= (currentNode << byteShift);
737
-        byteCount++;
738
-        byteShift += 8;
739
-
740
-        pos = 0;
741
-        currentNode = rootNode;
742
-        writeData = 0;
743
-
744
-        if(byteCount == 4) {
745
-          byteCount = 0;
746
-          byteShift = 0;
747
-          _MMU_write08<PROCNUM>(dest, static_cast<uint8_t>(writeValue));
748
-          writeValue = 0;
749
-          dest += 4;
750
-          len -= 4;
751
-        }
752
-      }
753
-      mask >>= 1;
754
-      if(mask == 0) {
755
-        mask = 0x80000000;
756
-        data = _MMU_read08<PROCNUM>(source);
757
-        source += 4;
758
-      }
759
-    }
760
-  } else {
761
-    int halfLen = 0;
762
-    int value = 0;
763
-    while(len > 0) {
764
-      // take left
765
-      if(pos == 0)
766
-        pos++;
767
-      else
768
-        pos += (((currentNode & 0x3F)+1)<<1);
769
-
770
-      if((data & mask)) {
771
-        // right
772
-        if(currentNode & 0x40)
773
-          writeData = 1;
774
-        currentNode = _MMU_read08<PROCNUM>(treeStart+pos+1);
775
-      } else {
776
-        // left
777
-        if(currentNode & 0x80)
778
-          writeData = 1;
779
-        currentNode = _MMU_read08<PROCNUM>(treeStart+pos);
780
-      }
781
-
782
-      if(writeData) {
783
-        if(halfLen == 0)
784
-          value |= currentNode;
785
-        else
786
-          value |= (currentNode<<4);
787
-
788
-        halfLen += 4;
789
-        if(halfLen == 8) {
790
-          writeValue |= (value << byteShift);
791
-          byteCount++;
792
-          byteShift += 8;
793
-
794
-          halfLen = 0;
795
-          value = 0;
796
-
797
-          if(byteCount == 4) {
798
-            byteCount = 0;
799
-            byteShift = 0;
800
-            _MMU_write08<PROCNUM>(dest, static_cast<uint8_t>(writeValue));
801
-            dest += 4;
802
-            writeValue = 0;
803
-            len -= 4;
804
-          }
805
-        }
806
-        pos = 0;
807
-        currentNode = rootNode;
808
-        writeData = 0;
809
-      }
810
-      mask >>= 1;
811
-      if(mask == 0) {
812
-        mask = 0x80000000;
813
-        data = _MMU_read08<PROCNUM>(source);
814
-        source += 4;
815
-      }
816
-    }
817
-  }
818
-  return 1;
674
+	uint32_t source = cpu->R[0];
675
+	uint32_t dest = cpu->R[1];
676
+	uint32_t header = _MMU_read08<PROCNUM>(source);
677
+	source += 4;
678
+
679
+	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
680
+		return 0;
681
+
682
+	uint8_t treeSize = _MMU_read08<PROCNUM>(source++);
683
+
684
+	uint32_t treeStart = source;
685
+
686
+	source += ((treeSize + 1) << 1) - 1; // minus because we already skipped one byte
687
+
688
+	int len = header >> 8;
689
+
690
+	uint32_t mask = 0x80000000;
691
+	uint32_t data = _MMU_read08<PROCNUM>(source);
692
+	source += 4;
693
+
694
+	int pos = 0;
695
+	uint8_t rootNode = _MMU_read08<PROCNUM>(treeStart);
696
+	uint8_t currentNode = rootNode;
697
+	int writeData = 0;
698
+	int byteShift = 0;
699
+	int byteCount = 0;
700
+	uint32_t writeValue = 0;
701
+
702
+	if ((header & 0x0F) == 8)
703
+	{
704
+		while (len > 0)
705
+		{
706
+			// take left
707
+			if (!pos)
708
+				++pos;
709
+			else
710
+				pos += ((currentNode & 0x3F) + 1) << 1;
711
+
712
+			if (data & mask)
713
+			{
714
+				// right
715
+				if (currentNode & 0x40)
716
+					writeData = 1;
717
+				currentNode = _MMU_read08<PROCNUM>(treeStart + pos + 1);
718
+			}
719
+			else
720
+			{
721
+				// left
722
+				if (currentNode & 0x80)
723
+					writeData = 1;
724
+				currentNode = _MMU_read08<PROCNUM>(treeStart + pos);
725
+			}
726
+
727
+			if (writeData)
728
+			{
729
+				writeValue |= currentNode << byteShift;
730
+				++byteCount;
731
+				byteShift += 8;
732
+
733
+				pos = 0;
734
+				currentNode = rootNode;
735
+				writeData = 0;
736
+
737
+				if (byteCount == 4)
738
+				{
739
+					byteCount = 0;
740
+					byteShift = 0;
741
+					_MMU_write08<PROCNUM>(dest, static_cast<uint8_t>(writeValue));
742
+					writeValue = 0;
743
+					dest += 4;
744
+					len -= 4;
745
+				}
746
+			}
747
+			mask >>= 1;
748
+			if (!mask)
749
+			{
750
+				mask = 0x80000000;
751
+				data = _MMU_read08<PROCNUM>(source);
752
+				source += 4;
753
+			}
754
+		}
755
+	}
756
+	else
757
+	{
758
+		int halfLen = 0;
759
+		int value = 0;
760
+		while (len > 0)
761
+		{
762
+			// take left
763
+			if (!pos)
764
+				++pos;
765
+			else
766
+				pos += ((currentNode & 0x3F) + 1) << 1;
767
+
768
+			if (data & mask)
769
+			{
770
+				// right
771
+				if (currentNode & 0x40)
772
+					writeData = 1;
773
+				currentNode = _MMU_read08<PROCNUM>(treeStart + pos + 1);
774
+			}
775
+			else
776
+			{
777
+				// left
778
+				if (currentNode & 0x80)
779
+					writeData = 1;
780
+				currentNode = _MMU_read08<PROCNUM>(treeStart + pos);
781
+			}
782
+
783
+			if (writeData)
784
+			{
785
+				if (!halfLen)
786
+					value |= currentNode;
787
+				else
788
+					value |= currentNode << 4;
789
+
790
+				halfLen += 4;
791
+				if (halfLen == 8)
792
+				{
793
+					writeValue |= value << byteShift;
794
+					++byteCount;
795
+					byteShift += 8;
796
+
797
+					halfLen = 0;
798
+					value = 0;
799
+
800
+					if (byteCount == 4)
801
+					{
802
+						byteCount = 0;
803
+						byteShift = 0;
804
+						_MMU_write08<PROCNUM>(dest, static_cast<uint8_t>(writeValue));
805
+						dest += 4;
806
+						writeValue = 0;
807
+						len -= 4;
808
+					}
809
+				}
810
+				pos = 0;
811
+				currentNode = rootNode;
812
+				writeData = 0;
813
+			}
814
+			mask >>= 1;
815
+			if (!mask)
816
+			{
817
+				mask = 0x80000000;
818
+				data = _MMU_read08<PROCNUM>(source);
819
+				source += 4;
820
+			}
821
+		}
822
+	}
823
+	return 1;
819 824
 }
820 825
 
821 826
 TEMPLATE static uint32_t BitUnPack()
822 827
 {
823
-  uint32_t source,dest,header,base,d,temp;
824
-  int len,bits,revbits,dataSize,data,bitwritecount,mask,bitcount,addBase;
825
-  uint8_t b;
826
-
827
-  source = cpu->R[0];
828
-  dest = cpu->R[1];
829
-  header = cpu->R[2];
830
-
831
-  len = _MMU_read16<PROCNUM>(header);
832
-  bits = _MMU_read08<PROCNUM>(header+2);
833
-  switch (bits)
834
-  {
835
-	case 1:
836
-	case 2:
837
-	case 4:
838
-	case 8:
839
-	  break;
840
-	default: return 0;	// error
841
-  }
842
-  dataSize = _MMU_read08<PROCNUM>(header+3);
843
-  switch (dataSize)
844
-  {
845
-	case 1:
846
-	case 2:
847
-	case 4:
848
-	case 8:
849
-	case 16:
850
-	case 32:
851
-	  break;
852
-	default: return 0;	// error
853
-  }
854
-
855
-  revbits = 8 - bits;
856
-  // uint32_t value = 0;
857
-  base = _MMU_read08<PROCNUM>(header+4);
858
-  addBase = (base & 0x80000000) ? 1 : 0;
859
-  base &= 0x7fffffff;
860
-
861
-  //INFO("SWI10: bitunpack src 0x%08X dst 0x%08X hdr 0x%08X (src len %05i src bits %02i dst bits %02i)\n\n", source, dest, header, len, bits, dataSize);
862
-
863
-  data = 0;
864
-  bitwritecount = 0;
865
-  while(1) {
866
-    len -= 1;
867
-    if(len < 0)
868
-      break;
869
-    mask = 0xff >> revbits;
870
-    b = _MMU_read08<PROCNUM>(source);
871
-    source++;
872
-    bitcount = 0;
873
-    while(1) {
874
-      if(bitcount >= 8)
875
-        break;
876
-      d = b & mask;
877
-      temp = d >> bitcount;
878
-      if(!temp && addBase) {
879
-        temp += base;
880
-      }
881
-      data |= temp << bitwritecount;
882
-      bitwritecount += dataSize;
883
-      if(bitwritecount >= 32) {
884
-        _MMU_write08<PROCNUM>(dest, data);
885
-        dest += 4;
886
-        data = 0;
887
-        bitwritecount = 0;
888
-      }
889
-      mask <<= bits;
890
-      bitcount += bits;
891
-    }
892
-  }
893
-  return 1;
894
-}
828
+	uint32_t source = cpu->R[0];
829
+	uint32_t dest = cpu->R[1];
830
+	uint32_t header = cpu->R[2];
895 831
 
896
-TEMPLATE static uint32_t Diff8bitUnFilterWram()
897
-{
898
-  uint32_t source,dest,header;
899
-  uint8_t data,diff;
900
-  int len;
832
+	int len = _MMU_read16<PROCNUM>(header);
833
+	int bits = _MMU_read08<PROCNUM>(header + 2);
834
+	switch (bits)
835
+	{
836
+		case 1:
837
+		case 2:
838
+		case 4:
839
+		case 8:
840
+			break;
841
+		default:
842
+			return 0; // error
843
+	}
844
+	int dataSize = _MMU_read08<PROCNUM>(header + 3);
845
+	switch (dataSize)
846
+	{
847
+		case 1:
848
+		case 2:
849
+		case 4:
850
+		case 8:
851
+		case 16:
852
+		case 32:
853
+			break;
854
+		default:
855
+			return 0; // error
856
+	}
901 857
 
902
-  source = cpu->R[0];
903
-  dest = cpu->R[1];
858
+	int revbits = 8 - bits;
859
+	uint32_t base = _MMU_read08<PROCNUM>(header + 4);
860
+	int addBase = base & 0x80000000 ? 1 : 0;
861
+	base &= 0x7fffffff;
904 862
 
905
-  header = _MMU_read08<PROCNUM>(source);
906
-  source += 4;
863
+	int data = 0;
864
+	int bitwritecount = 0;
865
+	while (1)
866
+	{
867
+		len -= 1;
868
+		if (len < 0)
869
+			break;
870
+		int mask = 0xff >> revbits;
871
+		uint8_t b = _MMU_read08<PROCNUM>(source);
872
+		++source;
873
+		int bitcount = 0;
874
+		while (1)
875
+		{
876
+			if (bitcount >= 8)
877
+				break;
878
+			uint32_t d = b & mask;
879
+			uint32_t temp = d >> bitcount;
880
+			if (!temp && addBase)
881
+				temp += base;
882
+			data |= temp << bitwritecount;
883
+			bitwritecount += dataSize;
884
+			if (bitwritecount >= 32)
885
+			{
886
+				_MMU_write08<PROCNUM>(dest, data);
887
+				dest += 4;
888
+				data = 0;
889
+				bitwritecount = 0;
890
+			}
891
+			mask <<= bits;
892
+			bitcount += bits;
893
+		}
894
+	}
895
+	return 1;
896
+}
907 897
 
908
-  //INFO("swi diff8bitunfilterwram\n");
898
+TEMPLATE static uint32_t Diff8bitUnFilterWram()
899
+{
900
+	uint32_t source = cpu->R[0];
901
+	uint32_t dest = cpu->R[1];
902
+	uint32_t header = _MMU_read08<PROCNUM>(source);
903
+	source += 4;
909 904
 
910
-  if(((source & 0xe000000) == 0) ||
911
-     (( (source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0))
912
-    return 0;
905
+	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
906
+		return 0;
913 907
 
914
-  len = header >> 8;
908
+	int len = header >> 8;
915 909
 
916
-  data = _MMU_read08<PROCNUM>(source++);
917
-  _MMU_write08<PROCNUM>(dest++, data);
918
-  len--;
910
+	uint8_t data = _MMU_read08<PROCNUM>(source++);
911
+	_MMU_write08<PROCNUM>(dest++, data);
912
+	--len;
919 913
 
920
-  while(len > 0) {
921
-    diff = _MMU_read08<PROCNUM>(source++);
922
-    data += diff;
923
-    _MMU_write08<PROCNUM>(dest++, data);
924
-    len--;
925
-  }
926
-  return 1;
914
+	while (len > 0)
915
+	{
916
+		uint8_t diff = _MMU_read08<PROCNUM>(source++);
917
+		data += diff;
918
+		_MMU_write08<PROCNUM>(dest++, data);
919
+		--len;
920
+	}
921
+	return 1;
927 922
 }
928 923
 
929 924
 TEMPLATE static uint32_t Diff16bitUnFilter()
930 925
 {
931
-  uint32_t source,dest,header;
932
-  uint16_t data;
933
-  int len;
934
-
935
-  source = cpu->R[0];
936
-  dest = cpu->R[1];
937
-
938
-  //INFO("swi diff16bitunfilter\n");
939
-
940
-  header = _MMU_read08<PROCNUM>(source);
941
-  source += 4;
942
-
943
-  if(((source & 0xe000000) == 0) ||
944
-     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
945
-    return 0;
946
-
947
-  len = header >> 8;
948
-
949
-  data = _MMU_read16<PROCNUM>(source);
950
-  source += 2;
951
-  _MMU_write16<PROCNUM>(dest, data);
952
-  dest += 2;
953
-  len -= 2;
954
-
955
-  while(len >= 2) {
956
-    uint16_t diff = _MMU_read16<PROCNUM>(source);
957
-    source += 2;
958
-    data += diff;
959
-    _MMU_write16<PROCNUM>(dest, data);
960
-    dest += 2;
961
-    len -= 2;
962
-  }
963
-  return 1;
926
+	uint32_t source = cpu->R[0];
927
+	uint32_t dest = cpu->R[1];
928
+	uint32_t header = _MMU_read08<PROCNUM>(source);
929
+	source += 4;
930
+
931
+	if (!(source & 0xe000000) || !((source + ((header >> 8) & 0x1fffff)) & 0xe000000))
932
+		return 0;
933
+
934
+	int len = header >> 8;
935
+
936
+	uint16_t data = _MMU_read16<PROCNUM>(source);
937
+	source += 2;
938
+	_MMU_write16<PROCNUM>(dest, data);
939
+	dest += 2;
940
+	len -= 2;
941
+
942
+	while (len >= 2)
943
+	{
944
+		uint16_t diff = _MMU_read16<PROCNUM>(source);
945
+		source += 2;
946
+		data += diff;
947
+		_MMU_write16<PROCNUM>(dest, data);
948
+		dest += 2;
949
+		len -= 2;
950
+	}
951
+	return 1;
964 952
 }
965 953
 
966 954
 TEMPLATE static uint32_t bios_sqrt()
967 955
 {
968
-     cpu->R[0] = (uint32_t)sqrt((double)(cpu->R[0]));
969
-     return 1;
956
+	cpu->R[0] = static_cast<uint32_t>(std::sqrt(static_cast<double>(cpu->R[0])));
957
+	return 1;
970 958
 }
971 959
 
972 960
 TEMPLATE static uint32_t setHaltCR()
973 961
 {
974
-     _MMU_write08<PROCNUM>(0x4000300+cpu->proc_ID, static_cast<uint8_t>(cpu->R[0]));
975
-     return 1;
962
+	_MMU_write08<PROCNUM>(0x4000300+cpu->proc_ID, static_cast<uint8_t>(cpu->R[0]));
963
+	return 1;
976 964
 }
977 965
 
978 966
 TEMPLATE static uint32_t getSineTab()
979 967
 {
980
-	//ds returns garbage according to gbatek, but we must protect ourselves
981
-	if(cpu->R[0] >= ARRAY_SIZE(getsinetbl))
968
+	// ds returns garbage according to gbatek, but we must protect ourselves
969
+	if (cpu->R[0] >= ARRAY_SIZE(getsinetbl))
982 970
 	{
983
-		printf("Invalid SWI getSineTab: %08X\n",cpu->R[0]);
971
+		printf("Invalid SWI getSineTab: %08X\n", cpu->R[0]);
984 972
 		return 1;
985 973
 	}
986 974
 
987
-
988 975
 	cpu->R[0] = getsinetbl[cpu->R[0]];
989 976
 	return 1;
990 977
 }
991 978
 
992 979
 TEMPLATE static uint32_t getPitchTab()
993 980
 {
994
-	//ds returns garbage according to gbatek, but we must protect ourselves
995
-	if(cpu->R[0] >= ARRAY_SIZE(getpitchtbl))
981
+	// ds returns garbage according to gbatek, but we must protect ourselves
982
+	if (cpu->R[0] >= ARRAY_SIZE(getpitchtbl))
996 983
 	{
997
-		printf("Invalid SWI getPitchTab: %08X\n",cpu->R[0]);
984
+		printf("Invalid SWI getPitchTab: %08X\n", cpu->R[0]);
998 985
 		return 1;
999 986
 	}
1000 987
 
... ...
@@ -1004,73 +991,44 @@ TEMPLATE static uint32_t getPitchTab()
1004 991
 
1005 992
 TEMPLATE static uint32_t getVolumeTab()
1006 993
 {
1007
-	//ds returns garbage according to gbatek, but we must protect ourselves
1008
-	if(cpu->R[0] >= ARRAY_SIZE(getvoltbl))
994
+	// ds returns garbage according to gbatek, but we must protect ourselves
995
+	if (cpu->R[0] >= ARRAY_SIZE(getvoltbl))
1009 996
 	{
1010
-		printf("Invalid SWI getVolumeTab: %08X\n",cpu->R[0]);
997
+		printf("Invalid SWI getVolumeTab: %08X\n", cpu->R[0]);
1011 998
 		return 1;
1012 999
 	}
1013 1000
 
1014
-
1015
-    cpu->R[0] = getvoltbl[cpu->R[0]];
1016
-    return 1;
1001
+	cpu->R[0] = getvoltbl[cpu->R[0]];
1002
+	return 1;
1017 1003
 }
1018 1004
 
1019
-
1020
-//TEMPLATE static uint32_t getCRC16_old(uint32_t crc, uint32_t datap, uint32_t size)
1021
-//{
1022
-//  unsigned int i,j;
1023
-//
1024
-//  const uint16_t val[] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 };
1025
-//  for(i = 0; i < size; i++)
1026
-//  {
1027
-//    crc = crc ^ _MMU_read08<PROCNUM>(datap + i);
1028
-//
1029
-//    for(j = 0; j < 8; j++) {
1030
-//      int do_bit = 0;
1031
-//
1032
-//      if ( crc & 0x1)
1033
-//        do_bit = 1;
1034
-//
1035
-//      crc = crc >> 1;
1036
-//
1037
-//      if ( do_bit) {
1038
-//        crc = crc ^ (val[j] << (7-j));
1039
-//      }
1040
-//    }
1041
-//  }
1042
-//  return crc;
1043
-//}
1044
-
1045 1005
 TEMPLATE static uint32_t getCRC16()
1046 1006
 {
1047
-	//gbatek is wrong.
1048
-
1049
-	//dawn of sorrow uses this to checksum its save data;
1050
-	//if this implementation is wrong, then it won't match what the real bios returns,
1051
-	//and savefiles created with a bios will be invalid when loaded with non-bios (and vice-versa)
1007
+	// gbatek is wrong.
1052 1008
 
1053
-	//uint32_t old = getCRC16_old<PROCNUM>(cpu->R[0],cpu->R[1],cpu->R[2]);
1009
+	// dawn of sorrow uses this to checksum its save data;
1010
+	// if this implementation is wrong, then it won't match what the real bios returns,
1011
+	// and savefiles created with a bios will be invalid when loaded with non-bios (and vice-versa)
1054 1012
 
1055
-	uint16_t crc = (uint16_t)cpu->R[0];
1013
+	uint16_t crc = static_cast<uint16_t>(cpu->R[0]);
1056 1014
 	uint32_t datap = cpu->R[1];
1057
-	uint32_t size = cpu->R[2]>>1;
1015
+	uint32_t size = cpu->R[2] >> 1;
1058 1016
 	uint16_t currVal = 0;
1059 1017
 
1060
-	const uint16_t val[] = { 0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,0xA001,0x6C00,0x7800,0xB401,0x5000,0x9C01,0x8801,0x4400};
1018
+	const uint16_t val[] = { 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400 };
1061 1019
 
1062
-	for(uint32_t i = 0; i < size; i++)
1020
+	for (uint32_t i = 0; i < size; ++i)
1063 1021
 	{
1064
-		currVal = _MMU_read16<PROCNUM>(datap + i*2);
1022
+		currVal = _MMU_read16<PROCNUM>(datap + i * 2);
1065 1023
 
1066
-		for(int j=0;j<4;j++)
1024
+		for (int j = 0; j < 4; ++j)
1067 1025
 		{
1068
-			uint16_t tabVal = val[crc&0xF];
1026
+			uint16_t tabVal = val[crc & 0xF];
1069 1027
 			crc >>= 4;
1070 1028
 			crc ^= tabVal;
1071 1029
 
1072
-			uint16_t tempVal = currVal >> (4*j);
1073
-			tabVal = val[tempVal&0xF];
1030
+			uint16_t tempVal = currVal >> (4 * j);
1031
+			tabVal = val[tempVal & 0xF];
1074 1032
 			crc ^= tabVal;
1075 1033
 		}
1076 1034
 	}
... ...
@@ -1082,23 +1040,19 @@ TEMPLATE static uint32_t getCRC16()
1082 1040
 
1083 1041
 TEMPLATE static uint32_t isDebugger()
1084 1042
 {
1085
-	//gbatek has additional specifications which are not emulated here
1086
-/*#ifdef DEVELOPER
1087
-	cpu->R[0] = 1;
1088
-#else*/
1043
+	// gbatek has additional specifications which are not emulated here
1089 1044
 	cpu->R[0] = 0;
1090
-//#endif
1091 1045
 	return 1;
1092 1046
 }
1093 1047
 
1094 1048
 TEMPLATE static uint32_t SoundBias()
1095 1049
 {
1096
-     uint32_t curBias = _MMU_read32<ARMCPU_ARM7>(0x04000504);
1097
-	 uint32_t newBias = (curBias == 0) ? 0x000:0x200;
1098
-	 uint32_t delay = (newBias > curBias) ? (newBias-curBias) : (curBias-newBias);
1050
+	uint32_t curBias = _MMU_read32<ARMCPU_ARM7>(0x04000504);
1051
+	uint32_t newBias = !curBias ? 0x000:0x200;
1052
+	uint32_t delay = newBias > curBias ? newBias - curBias : curBias - newBias;
1099 1053
 
1100
-	 _MMU_write32<ARMCPU_ARM7>(0x04000504, newBias);
1101
-     return cpu->R[1] * delay;
1054
+	_MMU_write32<ARMCPU_ARM7>(0x04000504, newBias);
1055
+	return cpu->R[1] * delay;
1102 1056
 }
1103 1057
 
1104 1058
 TEMPLATE static uint32_t getBootProcs()
... ...
@@ -1109,72 +1063,74 @@ TEMPLATE static uint32_t getBootProcs()
1109 1063
 	return 1;
1110 1064
 }
1111 1065
 
1112
-uint32_t (* ARM9_swi_tab[32])()={
1113
-         bios_nop<ARMCPU_ARM9>,             // 0x00
1114
-         bios_nop<ARMCPU_ARM9>,             // 0x01
1115
-         bios_nop<ARMCPU_ARM9>,             // 0x02
1116
-         WaitByLoop<ARMCPU_ARM9>,           // 0x03
1117
-         intrWaitARM<ARMCPU_ARM9>,          // 0x04
1118
-         waitVBlankARM<ARMCPU_ARM9>,        // 0x05
1119
-         wait4IRQ<ARMCPU_ARM9>,             // 0x06
1120
-         bios_nop<ARMCPU_ARM9>,             // 0x07
1121
-         bios_nop<ARMCPU_ARM9>,             // 0x08
1122
-         divide<ARMCPU_ARM9>,               // 0x09
1123
-         bios_nop<ARMCPU_ARM9>,             // 0x0A
1124
-         copy<ARMCPU_ARM9>,                 // 0x0B
1125
-         fastCopy<ARMCPU_ARM9>,             // 0x0C
1126
-         bios_sqrt<ARMCPU_ARM9>,            // 0x0D
1127
-         getCRC16<ARMCPU_ARM9>,             // 0x0E
1128
-         isDebugger<ARMCPU_ARM9>,           // 0x0F
1129
-         BitUnPack<ARMCPU_ARM9>,            // 0x10
1130
-         LZ77UnCompWram<ARMCPU_ARM9>,       // 0x11
1131
-         LZ77UnCompVram<ARMCPU_ARM9>,       // 0x12
1132
-         UnCompHuffman<ARMCPU_ARM9>,        // 0x13
1133
-         RLUnCompWram<ARMCPU_ARM9>,         // 0x14
1134
-         RLUnCompVram<ARMCPU_ARM9>,         // 0x15
1135
-         Diff8bitUnFilterWram<ARMCPU_ARM9>, // 0x16
1136
-         bios_nop<ARMCPU_ARM9>,             // 0x17
1137
-         Diff16bitUnFilter<ARMCPU_ARM9>,    // 0x18
1138
-         bios_nop<ARMCPU_ARM9>,             // 0x19
1139
-         bios_nop<ARMCPU_ARM9>,             // 0x1A
1140
-         bios_nop<ARMCPU_ARM9>,             // 0x1B
1141
-         bios_nop<ARMCPU_ARM9>,             // 0x1C
1142
-         bios_nop<ARMCPU_ARM9>,             // 0x1D
1143
-         bios_nop<ARMCPU_ARM9>,             // 0x1E
1144
-         setHaltCR<ARMCPU_ARM9>,            // 0x1F
1145
-};
1146
-
1147
-uint32_t (* ARM7_swi_tab[32])()={
1148
-         bios_nop<ARMCPU_ARM7>,             // 0x00
1149
-         bios_nop<ARMCPU_ARM7>,             // 0x01
1150
-         bios_nop<ARMCPU_ARM7>,             // 0x02
1151
-         WaitByLoop<ARMCPU_ARM7>,           // 0x03
1152
-         intrWaitARM<ARMCPU_ARM7>,          // 0x04
1153
-         waitVBlankARM<ARMCPU_ARM7>,        // 0x05
1154
-         wait4IRQ<ARMCPU_ARM7>,             // 0x06
1155
-         sleep<ARMCPU_ARM7>,                // 0x07
1156
-         SoundBias<ARMCPU_ARM7>,            // 0x08
1157
-         divide<ARMCPU_ARM7>,               // 0x09
1158
-         bios_nop<ARMCPU_ARM7>,             // 0x0A
1159
-         copy<ARMCPU_ARM7>,                 // 0x0B
1160
-         fastCopy<ARMCPU_ARM7>,             // 0x0C
1161
-         bios_sqrt<ARMCPU_ARM7>,            // 0x0D
1162
-         getCRC16<ARMCPU_ARM7>,             // 0x0E
1163
-		 isDebugger<ARMCPU_ARM7>,           // 0x0F
1164
-         BitUnPack<ARMCPU_ARM7>,            // 0x10
1165
-         LZ77UnCompWram<ARMCPU_ARM7>,       // 0x11
1166
-         LZ77UnCompVram<ARMCPU_ARM7>,       // 0x12
1167
-         UnCompHuffman<ARMCPU_ARM7>,        // 0x13
1168
-         RLUnCompWram<ARMCPU_ARM7>,         // 0x14
1169
-         RLUnCompVram<ARMCPU_ARM7>,         // 0x15
1170
-         Diff8bitUnFilterWram<ARMCPU_ARM7>, // 0x16
1171
-         bios_nop<ARMCPU_ARM7>,             // 0x17
1172
-         bios_nop<ARMCPU_ARM7>,             // 0x18
1173
-         bios_nop<ARMCPU_ARM7>,             // 0x19
1174
-         getSineTab<ARMCPU_ARM7>,           // 0x1A
1175
-         getPitchTab<ARMCPU_ARM7>,          // 0x1B
1176
-         getVolumeTab<ARMCPU_ARM7>,         // 0x1C
1177
-         getBootProcs<ARMCPU_ARM7>,         // 0x1D
1178
-         bios_nop<ARMCPU_ARM7>,             // 0x1E
1179
-         setHaltCR<ARMCPU_ARM7>,            // 0x1F
1066
+uint32_t (*ARM_swi_tab[][32])() =
1067
+{
1068
+	{
1069
+		bios_nop<ARMCPU_ARM9>,             // 0x00
1070
+		bios_nop<ARMCPU_ARM9>,             // 0x01
1071
+		bios_nop<ARMCPU_ARM9>,             // 0x02
1072
+		WaitByLoop<ARMCPU_ARM9>,           // 0x03
1073
+		intrWaitARM<ARMCPU_ARM9>,          // 0x04
1074
+		waitVBlankARM<ARMCPU_ARM9>,        // 0x05
1075
+		wait4IRQ<ARMCPU_ARM9>,             // 0x06
1076
+		bios_nop<ARMCPU_ARM9>,             // 0x07
1077
+		bios_nop<ARMCPU_ARM9>,             // 0x08
1078
+		divide<ARMCPU_ARM9>,               // 0x09
1079
+		bios_nop<ARMCPU_ARM9>,             // 0x0A
1080
+		copy<ARMCPU_ARM9>,                 // 0x0B
1081
+		fastCopy<ARMCPU_ARM9>,             // 0x0C
1082
+		bios_sqrt<ARMCPU_ARM9>,            // 0x0D
1083
+		getCRC16<ARMCPU_ARM9>,             // 0x0E
1084
+		isDebugger<ARMCPU_ARM9>,           // 0x0F
1085
+		BitUnPack<ARMCPU_ARM9>,            // 0x10
1086
+		LZ77UnCompWram<ARMCPU_ARM9>,       // 0x11
1087
+		LZ77UnCompVram<ARMCPU_ARM9>,       // 0x12
1088
+		UnCompHuffman<ARMCPU_ARM9>,        // 0x13
1089
+		RLUnCompWram<ARMCPU_ARM9>,         // 0x14
1090
+		RLUnCompVram<ARMCPU_ARM9>,         // 0x15
1091
+		Diff8bitUnFilterWram<ARMCPU_ARM9>, // 0x16
1092
+		bios_nop<ARMCPU_ARM9>,             // 0x17
1093
+		Diff16bitUnFilter<ARMCPU_ARM9>,    // 0x18
1094
+		bios_nop<ARMCPU_ARM9>,             // 0x19
1095
+		bios_nop<ARMCPU_ARM9>,             // 0x1A
1096
+		bios_nop<ARMCPU_ARM9>,             // 0x1B
1097
+		bios_nop<ARMCPU_ARM9>,             // 0x1C
1098
+		bios_nop<ARMCPU_ARM9>,             // 0x1D
1099
+		bios_nop<ARMCPU_ARM9>,             // 0x1E
1100
+		setHaltCR<ARMCPU_ARM9>,            // 0x1F
1101
+	},
1102
+	{
1103
+		bios_nop<ARMCPU_ARM7>,             // 0x00
1104
+		bios_nop<ARMCPU_ARM7>,             // 0x01
1105
+		bios_nop<ARMCPU_ARM7>,             // 0x02
1106
+		WaitByLoop<ARMCPU_ARM7>,           // 0x03
1107
+		intrWaitARM<ARMCPU_ARM7>,          // 0x04
1108
+		waitVBlankARM<ARMCPU_ARM7>,        // 0x05
1109
+		wait4IRQ<ARMCPU_ARM7>,             // 0x06
1110
+		sleep<ARMCPU_ARM7>,                // 0x07
1111
+		SoundBias<ARMCPU_ARM7>,            // 0x08
1112
+		divide<ARMCPU_ARM7>,               // 0x09
1113
+		bios_nop<ARMCPU_ARM7>,             // 0x0A
1114
+		copy<ARMCPU_ARM7>,                 // 0x0B
1115
+		fastCopy<ARMCPU_ARM7>,             // 0x0C
1116
+		bios_sqrt<ARMCPU_ARM7>,            // 0x0D
1117
+		getCRC16<ARMCPU_ARM7>,             // 0x0E
1118
+		isDebugger<ARMCPU_ARM7>,           // 0x0F
1119
+		BitUnPack<ARMCPU_ARM7>,            // 0x10
1120
+		LZ77UnCompWram<ARMCPU_ARM7>,       // 0x11
1121
+		LZ77UnCompVram<ARMCPU_ARM7>,       // 0x12
1122
+		UnCompHuffman<ARMCPU_ARM7>,        // 0x13
1123
+		RLUnCompWram<ARMCPU_ARM7>,         // 0x14
1124
+		RLUnCompVram<ARMCPU_ARM7>,         // 0x15
1125
+		Diff8bitUnFilterWram<ARMCPU_ARM7>, // 0x16
1126
+		bios_nop<ARMCPU_ARM7>,             // 0x17
1127
+		bios_nop<ARMCPU_ARM7>,             // 0x18
1128
+		bios_nop<ARMCPU_ARM7>,             // 0x19
1129
+		getSineTab<ARMCPU_ARM7>,           // 0x1A
1130
+		getPitchTab<ARMCPU_ARM7>,          // 0x1B
1131
+		getVolumeTab<ARMCPU_ARM7>,         // 0x1C
1132
+		getBootProcs<ARMCPU_ARM7>,         // 0x1D
1133
+		bios_nop<ARMCPU_ARM7>,             // 0x1E
1134
+		setHaltCR<ARMCPU_ARM7>,            // 0x1F
1135
+	}
1180 1136
 };
Browse code

Import actual code.

Naram Qashat authored on 2013/03/26 02:41:19
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,1180 @@
1
+/*
2
+	Copyright (C) 2006 yopyop
3
+	Copyright (C) 2008-2012 DeSmuME team
4
+
5
+	This file is free software: you can redistribute it and/or modify
6
+	it under the terms of the GNU General Public License as published by
7
+	the Free Software Foundation, either version 2 of the License, or
8
+	(at your option) any later version.
9
+
10
+	This file is distributed in the hope that it will be useful,
11
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+	GNU General Public License for more details.
14
+
15
+	You should have received a copy of the GNU General Public License
16
+	along with the this software.  If not, see <http://www.gnu.org/licenses/>.
17
+*/
18
+
19
+#include <cmath>
20
+
21
+#include "cp15.h"
22
+#include "MMU.h"
23
+//#include "debug.h"
24
+#include "NDSSystem.h"
25
+
26
+#define cpu (&ARMPROC)
27
+#define TEMPLATE template<int PROCNUM>
28
+
29
+static const uint16_t getsinetbl[] = {
30
+0x0000, 0x0324, 0x0648, 0x096A, 0x0C8C, 0x0FAB, 0x12C8, 0x15E2,
31
+0x18F9, 0x1C0B, 0x1F1A, 0x2223, 0x2528, 0x2826, 0x2B1F, 0x2E11,
32
+0x30FB, 0x33DF, 0x36BA, 0x398C, 0x3C56, 0x3F17, 0x41CE, 0x447A,
33
+0x471C, 0x49B4, 0x4C3F, 0x4EBF, 0x5133, 0x539B, 0x55F5, 0x5842,
34
+0x5A82, 0x5CB3, 0x5ED7, 0x60EB, 0x62F1, 0x64E8, 0x66CF, 0x68A6,
35
+0x6A6D, 0x6C23, 0x6DC9, 0x6F5E, 0x70E2, 0x7254, 0x73B5, 0x7504,
36
+0x7641, 0x776B, 0x7884, 0x7989, 0x7A7C, 0x7B5C, 0x7C29, 0x7CE3,
37
+0x7D89, 0x7E1D, 0x7E9C, 0x7F09, 0x7F61, 0x7FA6, 0x7FD8, 0x7FF5
38
+};
39
+
40
+static const uint16_t getpitchtbl[] = {
41
+0x0000, 0x003B, 0x0076, 0x00B2, 0x00ED, 0x0128, 0x0164, 0x019F,
42
+0x01DB, 0x0217, 0x0252, 0x028E, 0x02CA, 0x0305, 0x0341, 0x037D,
43
+0x03B9, 0x03F5, 0x0431, 0x046E, 0x04AA, 0x04E6, 0x0522, 0x055F,
44
+0x059B, 0x05D8, 0x0614, 0x0651, 0x068D, 0x06CA, 0x0707, 0x0743,
45
+0x0780, 0x07BD, 0x07FA, 0x0837, 0x0874, 0x08B1, 0x08EF, 0x092C,
46
+0x0969, 0x09A7, 0x09E4, 0x0A21, 0x0A5F, 0x0A9C, 0x0ADA, 0x0B18,
47
+0x0B56, 0x0B93, 0x0BD1, 0x0C0F, 0x0C4D, 0x0C8B, 0x0CC9, 0x0D07,
48
+0x0D45, 0x0D84, 0x0DC2, 0x0E00, 0x0E3F, 0x0E7D, 0x0EBC, 0x0EFA,
49
+0x0F39, 0x0F78, 0x0FB6, 0x0FF5, 0x1034, 0x1073, 0x10B2, 0x10F1,
50
+0x1130, 0x116F, 0x11AE, 0x11EE, 0x122D, 0x126C, 0x12AC, 0x12EB,
51
+0x132B, 0x136B, 0x13AA, 0x13EA, 0x142A, 0x146A, 0x14A9, 0x14E9,
52
+0x1529, 0x1569, 0x15AA, 0x15EA, 0x162A, 0x166A, 0x16AB, 0x16EB,
53
+0x172C, 0x176C, 0x17AD, 0x17ED, 0x182E, 0x186F, 0x18B0, 0x18F0,
54
+0x1931, 0x1972, 0x19B3, 0x19F5, 0x1A36, 0x1A77, 0x1AB8, 0x1AFA,
55
+0x1B3B, 0x1B7D, 0x1BBE, 0x1C00, 0x1C41, 0x1C83, 0x1CC5, 0x1D07,
56
+0x1D48, 0x1D8A, 0x1DCC, 0x1E0E, 0x1E51, 0x1E93, 0x1ED5, 0x1F17,
57
+0x1F5A, 0x1F9C, 0x1FDF, 0x2021, 0x2064, 0x20A6, 0x20E9, 0x212C,
58
+0x216F, 0x21B2, 0x21F5, 0x2238, 0x227B, 0x22BE, 0x2301, 0x2344,
59
+0x2388, 0x23CB, 0x240E, 0x2452, 0x2496, 0x24D9, 0x251D, 0x2561,
60
+0x25A4, 0x25E8, 0x262C, 0x2670, 0x26B4, 0x26F8, 0x273D, 0x2781,
61
+0x27C5, 0x280A, 0x284E, 0x2892, 0x28D7, 0x291C, 0x2960, 0x29A5,
62
+0x29EA, 0x2A2F, 0x2A74, 0x2AB9, 0x2AFE, 0x2B43, 0x2B88, 0x2BCD,
63
+0x2C13, 0x2C58, 0x2C9D, 0x2CE3, 0x2D28, 0x2D6E, 0x2DB4, 0x2DF9,
64
+0x2E3F, 0x2E85, 0x2ECB, 0x2F11, 0x2F57, 0x2F9D, 0x2FE3, 0x302A,
65
+0x3070, 0x30B6, 0x30FD, 0x3143, 0x318A, 0x31D0, 0x3217, 0x325E,
66
+0x32A5, 0x32EC, 0x3332, 0x3379, 0x33C1, 0x3408, 0x344F, 0x3496,
67
+0x34DD, 0x3525, 0x356C, 0x35B4, 0x35FB, 0x3643, 0x368B, 0x36D3,
68
+0x371A, 0x3762, 0x37AA, 0x37F2, 0x383A, 0x3883, 0x38CB, 0x3913,
69
+0x395C, 0x39A4, 0x39ED, 0x3A35, 0x3A7E, 0x3AC6, 0x3B0F, 0x3B58,
70
+0x3BA1, 0x3BEA, 0x3C33, 0x3C7C, 0x3CC5, 0x3D0E, 0x3D58, 0x3DA1,
71
+0x3DEA, 0x3E34, 0x3E7D, 0x3EC7, 0x3F11, 0x3F5A, 0x3FA4, 0x3FEE,
72
+0x4038, 0x4082, 0x40CC, 0x4116, 0x4161, 0x41AB, 0x41F5, 0x4240,
73
+0x428A, 0x42D5, 0x431F, 0x436A, 0x43B5, 0x4400, 0x444B, 0x4495,
74
+0x44E1, 0x452C, 0x4577, 0x45C2, 0x460D, 0x4659, 0x46A4, 0x46F0,
75
+0x473B, 0x4787, 0x47D3, 0x481E, 0x486A, 0x48B6, 0x4902, 0x494E,
76
+0x499A, 0x49E6, 0x4A33, 0x4A7F, 0x4ACB, 0x4B18, 0x4B64, 0x4BB1,
77
+0x4BFE, 0x4C4A, 0x4C97, 0x4CE4, 0x4D31, 0x4D7E, 0x4DCB, 0x4E18,
78
+0x4E66, 0x4EB3, 0x4F00, 0x4F4E, 0x4F9B, 0x4FE9, 0x5036, 0x5084,
79
+0x50D2, 0x5120, 0x516E, 0x51BC, 0x520A, 0x5258, 0x52A6, 0x52F4,
80
+0x5343, 0x5391, 0x53E0, 0x542E, 0x547D, 0x54CC, 0x551A, 0x5569,
81
+0x55B8, 0x5607, 0x5656, 0x56A5, 0x56F4, 0x5744, 0x5793, 0x57E2,
82
+0x5832, 0x5882, 0x58D1, 0x5921, 0x5971, 0x59C1, 0x5A10, 0x5A60,
83
+0x5AB0, 0x5B01, 0x5B51, 0x5BA1, 0x5BF1, 0x5C42, 0x5C92, 0x5CE3,
84
+0x5D34, 0x5D84, 0x5DD5, 0x5E26, 0x5E77, 0x5EC8, 0x5F19, 0x5F6A,
85
+0x5FBB, 0x600D, 0x605E, 0x60B0, 0x6101, 0x6153, 0x61A4, 0x61F6,
86
+0x6248, 0x629A, 0x62EC, 0x633E, 0x6390, 0x63E2, 0x6434, 0x6487,
87
+0x64D9, 0x652C, 0x657E, 0x65D1, 0x6624, 0x6676, 0x66C9, 0x671C,
88
+0x676F, 0x67C2, 0x6815, 0x6869, 0x68BC, 0x690F, 0x6963, 0x69B6,
89
+0x6A0A, 0x6A5E, 0x6AB1, 0x6B05, 0x6B59, 0x6BAD, 0x6C01, 0x6C55,
90
+0x6CAA, 0x6CFE, 0x6D52, 0x6DA7, 0x6DFB, 0x6E50, 0x6EA4, 0x6EF9,
91
+0x6F4E, 0x6FA3, 0x6FF8, 0x704D, 0x70A2, 0x70F7, 0x714D, 0x71A2,
92
+0x71F7, 0x724D, 0x72A2, 0x72F8, 0x734E, 0x73A4, 0x73FA, 0x7450,
93
+0x74A6, 0x74FC, 0x7552, 0x75A8, 0x75FF, 0x7655, 0x76AC, 0x7702,
94
+0x7759, 0x77B0, 0x7807, 0x785E, 0x78B4, 0x790C, 0x7963, 0x79BA,
95
+0x7A11, 0x7A69, 0x7AC0, 0x7B18, 0x7B6F, 0x7BC7, 0x7C1F, 0x7C77,
96
+0x7CCF, 0x7D27, 0x7D7F, 0x7DD7, 0x7E2F, 0x7E88, 0x7EE0, 0x7F38,
97
+0x7F91, 0x7FEA, 0x8042, 0x809B, 0x80F4, 0x814D, 0x81A6, 0x81FF,
98
+0x8259, 0x82B2, 0x830B, 0x8365, 0x83BE, 0x8418, 0x8472, 0x84CB,
99
+0x8525, 0x857F, 0x85D9, 0x8633, 0x868E, 0x86E8, 0x8742, 0x879D,
100
+0x87F7, 0x8852, 0x88AC, 0x8907, 0x8962, 0x89BD, 0x8A18, 0x8A73,
101
+0x8ACE, 0x8B2A, 0x8B85, 0x8BE0, 0x8C3C, 0x8C97, 0x8CF3, 0x8D4F,
102
+0x8DAB, 0x8E07, 0x8E63, 0x8EBF, 0x8F1B, 0x8F77, 0x8FD4, 0x9030,
103
+0x908C, 0x90E9, 0x9146, 0x91A2, 0x91FF, 0x925C, 0x92B9, 0x9316,
104
+0x9373, 0x93D1, 0x942E, 0x948C, 0x94E9, 0x9547, 0x95A4, 0x9602,
105
+0x9660, 0x96BE, 0x971C, 0x977A, 0x97D8, 0x9836, 0x9895, 0x98F3,
106
+0x9952, 0x99B0, 0x9A0F, 0x9A6E, 0x9ACD, 0x9B2C, 0x9B8B, 0x9BEA,
107
+0x9C49, 0x9CA8, 0x9D08, 0x9D67, 0x9DC7, 0x9E26, 0x9E86, 0x9EE6,
108
+0x9F46, 0x9FA6, 0xA006, 0xA066, 0xA0C6, 0xA127, 0xA187, 0xA1E8,
109
+0xA248, 0xA2A9, 0xA30A, 0xA36B, 0xA3CC, 0xA42D, 0xA48E, 0xA4EF,
110
+0xA550, 0xA5B2, 0xA613, 0xA675, 0xA6D6, 0xA738, 0xA79A, 0xA7FC,
111
+0xA85E, 0xA8C0, 0xA922, 0xA984, 0xA9E7, 0xAA49, 0xAAAC, 0xAB0E,
112
+0xAB71, 0xABD4, 0xAC37, 0xAC9A, 0xACFD, 0xAD60, 0xADC3, 0xAE27,
113
+0xAE8A, 0xAEED, 0xAF51, 0xAFB5, 0xB019, 0xB07C, 0xB0E0, 0xB145,
114
+0xB1A9, 0xB20D, 0xB271, 0xB2D6, 0xB33A, 0xB39F, 0xB403, 0xB468,
115
+0xB4CD, 0xB532, 0xB597, 0xB5FC, 0xB662, 0xB6C7, 0xB72C, 0xB792,
116
+0xB7F7, 0xB85D, 0xB8C3, 0xB929, 0xB98F, 0xB9F5, 0xBA5B, 0xBAC1,
117
+0xBB28, 0xBB8E, 0xBBF5, 0xBC5B, 0xBCC2, 0xBD29, 0xBD90, 0xBDF7,
118
+0xBE5E, 0xBEC5, 0xBF2C, 0xBF94, 0xBFFB, 0xC063, 0xC0CA, 0xC132,
119
+0xC19A, 0xC202, 0xC26A, 0xC2D2, 0xC33A, 0xC3A2, 0xC40B, 0xC473,
120
+0xC4DC, 0xC544, 0xC5AD, 0xC616, 0xC67F, 0xC6E8, 0xC751, 0xC7BB,
121
+0xC824, 0xC88D, 0xC8F7, 0xC960, 0xC9CA, 0xCA34, 0xCA9E, 0xCB08,
122
+0xCB72, 0xCBDC, 0xCC47, 0xCCB1, 0xCD1B, 0xCD86, 0xCDF1, 0xCE5B,
123
+0xCEC6, 0xCF31, 0xCF9C, 0xD008, 0xD073, 0xD0DE, 0xD14A, 0xD1B5,
124
+0xD221, 0xD28D, 0xD2F8, 0xD364, 0xD3D0, 0xD43D, 0xD4A9, 0xD515,
125
+0xD582, 0xD5EE, 0xD65B, 0xD6C7, 0xD734, 0xD7A1, 0xD80E, 0xD87B,
126
+0xD8E9, 0xD956, 0xD9C3, 0xDA31, 0xDA9E, 0xDB0C, 0xDB7A, 0xDBE8,
127
+0xDC56, 0xDCC4, 0xDD32, 0xDDA0, 0xDE0F, 0xDE7D, 0xDEEC, 0xDF5B,
128
+0xDFC9, 0xE038, 0xE0A7, 0xE116, 0xE186, 0xE1F5, 0xE264, 0xE2D4,
129
+0xE343, 0xE3B3, 0xE423, 0xE493, 0xE503, 0xE573, 0xE5E3, 0xE654,
130
+0xE6C4, 0xE735, 0xE7A5, 0xE816, 0xE887, 0xE8F8, 0xE969, 0xE9DA,
131
+0xEA4B, 0xEABC, 0xEB2E, 0xEB9F, 0xEC11, 0xEC83, 0xECF5, 0xED66,
132
+0xEDD9, 0xEE4B, 0xEEBD, 0xEF2F, 0xEFA2, 0xF014, 0xF087, 0xF0FA,
133
+0xF16D, 0xF1E0, 0xF253, 0xF2C6, 0xF339, 0xF3AD, 0xF420, 0xF494,
134
+0xF507, 0xF57B, 0xF5EF, 0xF663, 0xF6D7, 0xF74C, 0xF7C0, 0xF834,
135
+0xF8A9, 0xF91E, 0xF992, 0xFA07, 0xFA7C, 0xFAF1, 0xFB66, 0xFBDC,
136
+0xFC51, 0xFCC7, 0xFD3C, 0xFDB2, 0xFE28, 0xFE9E, 0xFF14, 0xFF8A
137
+};
138
+
139
+static const uint8_t getvoltbl[] = {
140
+0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
141
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
142
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
143
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
144
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
145
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
146
+0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
147
+0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
148
+0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03,
149
+0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
150
+0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
151
+0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
152
+0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
153
+0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
154
+0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08,
155
+0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
156
+0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
157
+0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E,
158
+0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10,
159
+0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14,
160
+0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18,
161
+0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C,
162
+0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22,
163
+0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29,
164
+0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31,
165
+0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B,
166
+0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47,
167
+0x48, 0x49, 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x52, 0x53, 0x54, 0x55,
168
+0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67,
169
+0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B,
170
+0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25,
171
+0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D,
172
+0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x36,
173
+0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x40, 0x40,
174
+0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D,
175
+0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D,
176
+0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x70,
177
+0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41, 0x42, 0x43, 0x43,
178
+0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,
179
+0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61,
180
+0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75,
181
+0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46,
182
+0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
183
+0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66,
184
+0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A,
185
+0x7C, 0x7D, 0x7E, 0x7F
186
+};
187
+
188
+TEMPLATE static uint32_t bios_nop()
189
+{
190
+	/*LOG("SWI: ARM%c Unimplemented BIOS function %02X was used. R0:%08X, R1:%08X, R2:%08X\n", PROCNUM?'7':'9',
191
+							(cpu->instruction)&0x1F, cpu->R[0], cpu->R[1], cpu->R[2]);*/
192
+	return 3;
193
+}
194
+
195
+TEMPLATE static uint32_t WaitByLoop()
196
+{
197
+	uint32_t elapsed;
198
+
199
+	//printf("%lld waitbyloop\n",nds_timer);
200
+	//INFO("ARM%c: SWI 0x03 (WaitByLoop)\n", PROCNUM?'7':'9');
201
+	if (PROCNUM == ARMCPU_ARM9)
202
+	{
203
+		armcp15_t *cp = (armcp15_t*)(cpu->coproc[15]);
204
+
205
+		if (cp->ctrl & ((1<<16)|(1<<18)))		// DTCM or ITCM is on (cache)
206
+			elapsed = cpu->R[0] * 2;
207
+		else
208
+			elapsed = cpu->R[0] * 8;
209
+	}
210
+	else
211
+		elapsed = cpu->R[0] * 4;
212
+	cpu->R[0] = 0;
213
+	return elapsed;
214
+}
215
+
216
+TEMPLATE static uint32_t wait4IRQ()
217
+{
218
+   	cpu->waitIRQ = true;
219
+	cpu->halt_IE_and_IF = true;
220
+	return 1;
221
+}
222
+
223
+TEMPLATE uint32_t intrWaitARM()
224
+{
225
+	//TODO - account for differences between arm7 and arm9 (according to gbatek, the "bug doesn't work")
226
+
227
+	const uint32_t intrFlagAdr = (PROCNUM == ARMCPU_ARM7)
228
+		? 0x380FFF8
229
+		: (((armcp15_t *)(cpu->coproc[15]))->DTCMRegion&0xFFFFF000)+0x3FF8;
230
+
231
+	//set IME=1
232
+	//without this, no irq handlers can happen (even though IF&IE waits can happily happen)
233
+	//and so no bits in the OS irq flag variable can get set by the handlers
234
+	_MMU_write32<PROCNUM>(0x04000208, 1);
235
+
236
+	//analyze the OS irq flag variable
237
+	uint32_t intr = _MMU_read32<PROCNUM>(intrFlagAdr);
238
+	uint32_t intrFlag = (cpu->R[1] & intr);
239
+
240
+	//if the user requested us to discard flags, then clear the flag(s) we're going to be waiting on.
241
+	//(be sure to only do this only on the first run through. use a little state machine to control that)
242
+	if(cpu->intrWaitARM_state==0 && cpu->R[0]==1)
243
+	{
244
+		intr ^= intrFlag;
245
+		_MMU_write32<PROCNUM>(intrFlagAdr, intr);
246
+
247
+		//we want to make sure we wait at least once below
248
+		intrFlag = 0;
249
+	}
250
+
251
+	cpu->intrWaitARM_state = 1;
252
+
253
+	//now, if the condition is satisfied (and it won't be the first time through, no matter what, due to cares taken above)
254
+	if(intrFlag)
255
+	{
256
+		//write back the OS irq flags with the ones we were waiting for cleared
257
+		intr ^= intrFlag;
258
+		_MMU_write32<PROCNUM>(intrFlagAdr, intr);
259
+
260
+		cpu->intrWaitARM_state = 0;
261
+		return 1;
262
+	}
263
+
264
+	//the condition wasn't satisfied. this means that we need to halt, wait for some enabled interrupt,
265
+	//and then ensure that we return to this opcode again to check the condition again
266
+	cpu->waitIRQ = true;
267
+	cpu->halt_IE_and_IF = true;
268
+
269
+	//(rewire PC to jump back to this opcode)
270
+	uint32_t instructAddr = cpu->instruct_adr;
271
+	cpu->R[15] = instructAddr;
272
+	cpu->next_instruction = instructAddr;
273
+	return 1;
274
+}
275
+
276
+TEMPLATE static uint32_t waitVBlankARM()
277
+{
278
+	cpu->R[0] = 1;
279
+	cpu->R[1] = 1;
280
+	return intrWaitARM<PROCNUM>();
281
+}
282
+
283
+TEMPLATE static uint32_t sleep()
284
+{
285
+	_MMU_write08<PROCNUM>(0x04000301, 0xC0);
286
+	return 1;
287
+}
288
+
289
+TEMPLATE static uint32_t divide()
290
+{
291
+     int32_t num = (int32_t)cpu->R[0];
292
+     int32_t dnum = (int32_t)cpu->R[1];
293
+
294
+     if(dnum==0) return 0;
295
+
296
+	 int32_t res = num / dnum;
297
+     cpu->R[0] = (uint32_t)res;
298
+     cpu->R[1] = (uint32_t)(num % dnum);
299
+     cpu->R[3] = (uint32_t)abs(res);
300
+
301
+	 //INFO("ARM%c: SWI 0x09 (divide): in num %i, dnum %i, out R0:%i, R1:%i, R3:%i\n", PROCNUM?'7':'9', num, dnum, cpu->R[0], cpu->R[1], cpu->R[3]);
302
+
303
+     return 6;
304
+}
305
+
306
+TEMPLATE static uint32_t copy()
307
+{
308
+     uint32_t src = cpu->R[0];
309
+     uint32_t dst = cpu->R[1];
310
+     uint32_t cnt = cpu->R[2];
311
+
312
+	 //INFO("swi copy from %08X to %08X, cnt=%08X\n", src, dst, cnt);
313
+
314
+     switch(BIT26(cnt))
315
+     {
316
+          case 0:
317
+               src &= 0xFFFFFFFE;
318
+               dst &= 0xFFFFFFFE;
319
+               switch(BIT24(cnt))
320
+               {
321
+                    case 0:
322
+                         cnt &= 0x1FFFFF;
323
+                         while(cnt)
324
+                         {
325
+                              _MMU_write16<PROCNUM>(dst, _MMU_read16<PROCNUM>(src));
326
+                              cnt--;
327
+                              dst+=2;
328
+                              src+=2;
329
+                         }
330
+                         break;
331
+                    case 1:
332
+                         {
333
+                              uint32_t val = _MMU_read16<PROCNUM>(src);
334
+                              cnt &= 0x1FFFFF;
335
+                              while(cnt)
336
+                              {
337
+                                   _MMU_write16<PROCNUM>(dst, static_cast<uint16_t>(val));
338
+                                   cnt--;
339
+                                   dst+=2;
340
+                              }
341
+                         }
342
+                         break;
343
+               }
344
+               break;
345
+          case 1:
346
+               src &= 0xFFFFFFFC;
347
+               dst &= 0xFFFFFFFC;
348
+               switch(BIT24(cnt))
349
+               {
350
+                    case 0:
351
+                         cnt &= 0x1FFFFF;
352
+                         while(cnt)
353
+                         {
354
+                              _MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));
355
+                              cnt--;
356
+                              dst+=4;
357
+                              src+=4;
358
+                         }
359
+                         break;
360
+                    case 1:
361
+                         {
362
+                              uint32_t val = _MMU_read32<PROCNUM>(src);
363
+                              cnt &= 0x1FFFFF;
364
+                              while(cnt)
365
+                              {
366
+                                   _MMU_write32<PROCNUM>(dst, val);
367
+                                   cnt--;
368
+                                   dst+=4;
369
+                              }
370
+                         }
371
+                         break;
372
+               }
373
+               break;
374
+     }
375
+     return 1;
376
+}
377
+
378
+TEMPLATE static uint32_t fastCopy()
379
+{
380
+     uint32_t src = cpu->R[0] & 0xFFFFFFFC;
381
+     uint32_t dst = cpu->R[1] & 0xFFFFFFFC;
382
+     uint32_t cnt = cpu->R[2];
383
+
384
+	 //INFO("swi fastcopy from %08X to %08X, cnt=%08X\n", src, dst, cnt);
385
+
386
+     switch(BIT24(cnt))
387
+     {
388
+          case 0:
389
+               cnt &= 0x1FFFFF;
390
+               while(cnt)
391
+               {
392
+                    _MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));
393
+                    cnt--;
394
+                    dst+=4;
395
+                    src+=4;
396
+               }
397
+               break;
398
+          case 1:
399
+               {
400
+                    uint32_t val = _MMU_read32<PROCNUM>(src);
401
+                    cnt &= 0x1FFFFF;
402
+                    while(cnt)
403
+                    {
404
+                         _MMU_write32<PROCNUM>(dst, val);
405
+                         cnt--;
406
+                         dst+=4;
407
+                    }
408
+               }
409
+               break;
410
+     }
411
+     return 1;
412
+}
413
+
414
+TEMPLATE static uint32_t LZ77UnCompVram()
415
+{
416
+  int i1, i2;
417
+  int byteCount;
418
+  int byteShift;
419
+  uint32_t writeValue;
420
+  int len;
421
+  uint32_t source = cpu->R[0];
422
+  uint32_t dest = cpu->R[1];
423
+  uint32_t header = _MMU_read32<PROCNUM>(source);
424
+  source += 4;
425
+
426
+  //INFO("swi lz77uncompvram\n");
427
+
428
+  if(((source & 0xe000000) == 0) ||
429
+     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
430
+    return 0;
431
+
432
+  byteCount = 0;
433
+  byteShift = 0;
434
+  writeValue = 0;
435
+
436
+  len = header >> 8;
437
+
438
+  while(len > 0) {
439
+    uint8_t d = _MMU_read08<PROCNUM>(source++);
440
+
441
+    if(d) {
442
+      for(i1 = 0; i1 < 8; i1++) {
443
+        if(d & 0x80) {
444
+          int length;
445
+          int offset;
446
+          uint32_t windowOffset;
447
+          uint16_t data = _MMU_read08<PROCNUM>(source++) << 8;
448
+          data |= _MMU_read08<PROCNUM>(source++);
449
+          length = (data >> 12) + 3;
450
+          offset = (data & 0x0FFF);
451
+          windowOffset = dest + byteCount - offset - 1;
452
+          for(i2 = 0; i2 < length; i2++) {
453
+            writeValue |= (_MMU_read08<PROCNUM>(windowOffset++) << byteShift);
454
+            byteShift += 8;
455
+            byteCount++;
456
+
457
+            if(byteCount == 2) {
458
+              _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
459
+              dest += 2;
460
+              byteCount = 0;
461
+              byteShift = 0;
462
+              writeValue = 0;
463
+            }
464
+            len--;
465
+            if(len == 0)
466
+              return 0;
467
+          }
468
+        } else {
469
+          writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);
470
+          byteShift += 8;
471
+          byteCount++;
472
+          if(byteCount == 2) {
473
+            _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
474
+            dest += 2;
475
+            byteCount = 0;
476
+            byteShift = 0;
477
+            writeValue = 0;
478
+          }
479
+          len--;
480
+          if(len == 0)
481
+            return 0;
482
+        }
483
+        d <<= 1;
484
+      }
485
+    } else {
486
+      for(i1 = 0; i1 < 8; i1++) {
487
+        writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);
488
+        byteShift += 8;
489
+        byteCount++;
490
+        if(byteCount == 2) {
491
+          _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
492
+          dest += 2;
493
+          byteShift = 0;
494
+          byteCount = 0;
495
+          writeValue = 0;
496
+        }
497
+        len--;
498
+        if(len == 0)
499
+          return 0;
500
+      }
501
+    }
502
+  }
503
+  return 1;
504
+}
505
+
506
+TEMPLATE static uint32_t LZ77UnCompWram()
507
+{
508
+  int i1, i2;
509
+  int len;
510
+  uint32_t source = cpu->R[0];
511
+  uint32_t dest = cpu->R[1];
512
+
513
+  uint32_t header = _MMU_read32<PROCNUM>(source);
514
+  source += 4;
515
+
516
+  //INFO("swi lz77uncompwram\n");
517
+
518
+  if(((source & 0xe000000) == 0) ||
519
+     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
520
+    return 0;
521
+
522
+  len = header >> 8;
523
+
524
+  while(len > 0) {
525
+    uint8_t d = _MMU_read08<PROCNUM>(source++);
526
+
527
+    if(d) {
528
+      for(i1 = 0; i1 < 8; i1++) {
529
+        if(d & 0x80) {
530
+          int length;
531
+          int offset;
532
+          uint32_t windowOffset;
533
+          uint16_t data = _MMU_read08<PROCNUM>(source++) << 8;
534
+          data |= _MMU_read08<PROCNUM>(source++);
535
+          length = (data >> 12) + 3;
536
+          offset = (data & 0x0FFF);
537
+          windowOffset = dest - offset - 1;
538
+          for(i2 = 0; i2 < length; i2++) {
539
+            _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(windowOffset++));
540
+            len--;
541
+            if(len == 0)
542
+              return 0;
543
+          }
544
+        } else {
545
+          _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(source++));
546
+          len--;
547
+          if(len == 0)
548
+            return 0;
549
+        }
550
+        d <<= 1;
551
+      }
552
+    } else {
553
+      for(i1 = 0; i1 < 8; i1++) {
554
+        _MMU_write08<PROCNUM>(dest++, _MMU_read08<PROCNUM>(source++));
555
+        len--;
556
+        if(len == 0)
557
+          return 0;
558
+      }
559
+    }
560
+  }
561
+  return 1;
562
+}
563
+
564
+TEMPLATE static uint32_t RLUnCompVram()
565
+{
566
+  int i;
567
+  int len;
568
+  int byteCount;
569
+  int byteShift;
570
+  uint32_t writeValue;
571
+  uint32_t source = cpu->R[0];
572
+  uint32_t dest = cpu->R[1];
573
+
574
+  uint32_t header = _MMU_read32<PROCNUM>(source);
575
+  source += 4;
576
+
577
+  //INFO("swi rluncompvram\n");
578
+
579
+  if(((source & 0xe000000) == 0) ||
580
+     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
581
+    return 0;
582
+
583
+  len = header >> 8;
584
+  byteCount = 0;
585
+  byteShift = 0;
586
+  writeValue = 0;
587
+
588
+  while(len > 0) {
589
+    uint8_t d = _MMU_read08<PROCNUM>(source++);
590
+    int l = d & 0x7F;
591
+    if(d & 0x80) {
592
+      uint8_t data = _MMU_read08<PROCNUM>(source++);
593
+      l += 3;
594
+      for(i = 0;i < l; i++) {
595
+        writeValue |= (data << byteShift);
596
+        byteShift += 8;
597
+        byteCount++;
598
+
599
+        if(byteCount == 2) {
600
+          _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
601
+          dest += 2;
602
+          byteCount = 0;
603
+          byteShift = 0;
604
+          writeValue = 0;
605
+        }
606
+        len--;
607
+        if(len == 0)
608
+          return 0;
609
+      }
610
+    } else {
611
+      l++;
612
+      for(i = 0; i < l; i++) {
613
+        writeValue |= (_MMU_read08<PROCNUM>(source++) << byteShift);
614
+        byteShift += 8;
615
+        byteCount++;
616
+        if(byteCount == 2) {
617
+          _MMU_write16<PROCNUM>(dest, static_cast<uint16_t>(writeValue));
618
+          dest += 2;
619
+          byteCount = 0;
620
+          byteShift = 0;
621
+          writeValue = 0;
622
+        }
623
+        len--;
624
+        if(len == 0)
625
+          return 0;
626
+      }
627
+    }
628
+  }
629
+  return 1;
630
+}
631
+
632
+TEMPLATE static uint32_t RLUnCompWram()
633
+{
634
+  int i;
635
+  int len;
636
+  uint32_t source = cpu->R[0];
637
+  uint32_t dest = cpu->R[1];
638
+
639
+  uint32_t header = _MMU_read32<PROCNUM>(source);
640
+  source += 4;
641
+
642
+  //INFO("swi rluncompwram\n");
643
+
644
+  if(((source & 0xe000000) == 0) ||
645
+     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
646
+    return 0;
647
+
648
+  len = header >> 8;
649
+
650
+  while(len > 0) {
651
+    uint8_t d = _MMU_read08<PROCNUM>(source++);
652
+    int l = d & 0x7F;
653
+    if(d & 0x80) {
654
+      uint8_t data = _MMU_read08<PROCNUM>(source++);
655
+      l += 3;
656
+      for(i = 0;i < l; i++) {
657
+        _MMU_write08<PROCNUM>(dest++, data);
658
+        len--;
659
+        if(len == 0)
660
+          return 0;
661
+      }
662
+    } else {
663
+      l++;
664
+      for(i = 0; i < l; i++) {
665
+        _MMU_write08<PROCNUM>(dest++,  _MMU_read08<PROCNUM>(source++));
666
+        len--;
667
+        if(len == 0)
668
+          return 0;
669
+      }
670
+    }
671
+  }
672
+  return 1;
673
+}
674
+
675
+TEMPLATE static uint32_t UnCompHuffman()
676
+{
677
+  uint32_t source, dest, writeValue, header, treeStart, mask;
678
+  uint32_t data;
679
+  uint8_t treeSize, currentNode, rootNode;
680
+  int byteCount, byteShift, len, pos;
681
+  int writeData;
682
+
683
+  source = cpu->R[0];
684
+  dest = cpu->R[1];
685
+
686
+  header = _MMU_read08<PROCNUM>(source);
687
+  source += 4;
688
+
689
+  //INFO("swi uncomphuffman\n");
690
+
691
+  if(((source & 0xe000000) == 0) ||
692
+     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
693
+    return 0;
694
+
695
+  treeSize = _MMU_read08<PROCNUM>(source++);
696
+
697
+  treeStart = source;
698
+
699
+  source += ((treeSize+1)<<1)-1; // minus because we already skipped one byte
700
+
701
+  len = header >> 8;
702
+
703
+  mask = 0x80000000;
704
+  data = _MMU_read08<PROCNUM>(source);
705
+  source += 4;
706
+
707
+  pos = 0;
708
+  rootNode = _MMU_read08<PROCNUM>(treeStart);
709
+  currentNode = rootNode;
710
+  writeData = 0;
711
+  byteShift = 0;
712
+  byteCount = 0;
713
+  writeValue = 0;
714
+
715
+  if((header & 0x0F) == 8) {
716
+    while(len > 0) {
717
+      // take left
718
+      if(pos == 0)
719
+        pos++;
720
+      else
721
+        pos += (((currentNode & 0x3F)+1)<<1);
722
+
723
+      if(data & mask) {
724
+        // right
725
+        if(currentNode & 0x40)
726
+          writeData = 1;
727
+        currentNode = _MMU_read08<PROCNUM>(treeStart+pos+1);
728
+      } else {
729
+        // left
730
+        if(currentNode & 0x80)
731
+          writeData = 1;
732
+        currentNode = _MMU_read08<PROCNUM>(treeStart+pos);
733
+      }
734
+
735
+      if(writeData) {
736
+        writeValue |= (currentNode << byteShift);
737
+        byteCount++;
738
+        byteShift += 8;
739
+
740
+        pos = 0;
741
+        currentNode = rootNode;
742
+        writeData = 0;
743
+
744
+        if(byteCount == 4) {
745
+          byteCount = 0;
746
+          byteShift = 0;
747
+          _MMU_write08<PROCNUM>(dest, static_cast<uint8_t>(writeValue));
748
+          writeValue = 0;
749
+          dest += 4;
750
+          len -= 4;
751
+        }
752
+      }
753
+      mask >>= 1;
754
+      if(mask == 0) {
755
+        mask = 0x80000000;
756
+        data = _MMU_read08<PROCNUM>(source);
757
+        source += 4;
758
+      }
759
+    }
760
+  } else {
761
+    int halfLen = 0;
762
+    int value = 0;
763
+    while(len > 0) {
764
+      // take left
765
+      if(pos == 0)
766
+        pos++;
767
+      else
768
+        pos += (((currentNode & 0x3F)+1)<<1);
769
+
770
+      if((data & mask)) {
771
+        // right
772
+        if(currentNode & 0x40)
773
+          writeData = 1;
774
+        currentNode = _MMU_read08<PROCNUM>(treeStart+pos+1);
775
+      } else {
776
+        // left
777
+        if(currentNode & 0x80)
778
+          writeData = 1;
779
+        currentNode = _MMU_read08<PROCNUM>(treeStart+pos);
780
+      }
781
+
782
+      if(writeData) {
783
+        if(halfLen == 0)
784
+          value |= currentNode;
785
+        else
786
+          value |= (currentNode<<4);
787
+
788
+        halfLen += 4;
789
+        if(halfLen == 8) {
790
+          writeValue |= (value << byteShift);
791
+          byteCount++;
792
+          byteShift += 8;
793
+
794
+          halfLen = 0;
795
+          value = 0;
796
+
797
+          if(byteCount == 4) {
798
+            byteCount = 0;
799
+            byteShift = 0;
800
+            _MMU_write08<PROCNUM>(dest, static_cast<uint8_t>(writeValue));
801
+            dest += 4;
802
+            writeValue = 0;
803
+            len -= 4;
804
+          }
805
+        }
806
+        pos = 0;
807
+        currentNode = rootNode;
808
+        writeData = 0;
809
+      }
810
+      mask >>= 1;
811
+      if(mask == 0) {
812
+        mask = 0x80000000;
813
+        data = _MMU_read08<PROCNUM>(source);
814
+        source += 4;
815
+      }
816
+    }
817
+  }
818
+  return 1;
819
+}
820
+
821
+TEMPLATE static uint32_t BitUnPack()
822
+{
823
+  uint32_t source,dest,header,base,d,temp;
824
+  int len,bits,revbits,dataSize,data,bitwritecount,mask,bitcount,addBase;
825
+  uint8_t b;
826
+
827
+  source = cpu->R[0];
828
+  dest = cpu->R[1];
829
+  header = cpu->R[2];
830
+
831
+  len = _MMU_read16<PROCNUM>(header);
832
+  bits = _MMU_read08<PROCNUM>(header+2);
833
+  switch (bits)
834
+  {
835
+	case 1:
836
+	case 2:
837
+	case 4:
838
+	case 8:
839
+	  break;
840
+	default: return 0;	// error
841
+  }
842
+  dataSize = _MMU_read08<PROCNUM>(header+3);
843
+  switch (dataSize)
844
+  {
845
+	case 1:
846
+	case 2:
847
+	case 4:
848
+	case 8:
849
+	case 16:
850
+	case 32:
851
+	  break;
852
+	default: return 0;	// error
853
+  }
854
+
855
+  revbits = 8 - bits;
856
+  // uint32_t value = 0;
857
+  base = _MMU_read08<PROCNUM>(header+4);
858
+  addBase = (base & 0x80000000) ? 1 : 0;
859
+  base &= 0x7fffffff;
860
+
861
+  //INFO("SWI10: bitunpack src 0x%08X dst 0x%08X hdr 0x%08X (src len %05i src bits %02i dst bits %02i)\n\n", source, dest, header, len, bits, dataSize);
862
+
863
+  data = 0;
864
+  bitwritecount = 0;
865
+  while(1) {
866
+    len -= 1;
867
+    if(len < 0)
868
+      break;
869
+    mask = 0xff >> revbits;
870
+    b = _MMU_read08<PROCNUM>(source);
871
+    source++;
872
+    bitcount = 0;
873
+    while(1) {
874
+      if(bitcount >= 8)
875
+        break;
876
+      d = b & mask;
877
+      temp = d >> bitcount;
878
+      if(!temp && addBase) {
879
+        temp += base;
880
+      }
881
+      data |= temp << bitwritecount;
882
+      bitwritecount += dataSize;
883
+      if(bitwritecount >= 32) {
884
+        _MMU_write08<PROCNUM>(dest, data);
885
+        dest += 4;
886
+        data = 0;
887
+        bitwritecount = 0;
888
+      }
889
+      mask <<= bits;
890
+      bitcount += bits;
891
+    }
892
+  }
893
+  return 1;
894
+}
895
+
896
+TEMPLATE static uint32_t Diff8bitUnFilterWram()
897
+{
898
+  uint32_t source,dest,header;
899
+  uint8_t data,diff;
900
+  int len;
901
+
902
+  source = cpu->R[0];
903
+  dest = cpu->R[1];
904
+
905
+  header = _MMU_read08<PROCNUM>(source);
906
+  source += 4;
907
+
908
+  //INFO("swi diff8bitunfilterwram\n");
909
+
910
+  if(((source & 0xe000000) == 0) ||
911
+     (( (source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0))
912
+    return 0;
913
+
914
+  len = header >> 8;
915
+
916
+  data = _MMU_read08<PROCNUM>(source++);
917
+  _MMU_write08<PROCNUM>(dest++, data);
918
+  len--;
919
+
920
+  while(len > 0) {
921
+    diff = _MMU_read08<PROCNUM>(source++);
922
+    data += diff;
923
+    _MMU_write08<PROCNUM>(dest++, data);
924
+    len--;
925
+  }
926
+  return 1;
927
+}
928
+
929
+TEMPLATE static uint32_t Diff16bitUnFilter()
930
+{
931
+  uint32_t source,dest,header;
932
+  uint16_t data;
933
+  int len;
934
+
935
+  source = cpu->R[0];
936
+  dest = cpu->R[1];
937
+
938
+  //INFO("swi diff16bitunfilter\n");
939
+
940
+  header = _MMU_read08<PROCNUM>(source);
941
+  source += 4;
942
+
943
+  if(((source & 0xe000000) == 0) ||
944
+     ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)
945
+    return 0;
946
+
947
+  len = header >> 8;
948
+
949
+  data = _MMU_read16<PROCNUM>(source);
950
+  source += 2;
951
+  _MMU_write16<PROCNUM>(dest, data);
952
+  dest += 2;
953
+  len -= 2;
954
+
955
+  while(len >= 2) {
956
+    uint16_t diff = _MMU_read16<PROCNUM>(source);
957
+    source += 2;
958
+    data += diff;
959
+    _MMU_write16<PROCNUM>(dest, data);
960
+    dest += 2;
961
+    len -= 2;
962
+  }
963
+  return 1;
964
+}
965
+
966
+TEMPLATE static uint32_t bios_sqrt()
967
+{
968
+     cpu->R[0] = (uint32_t)sqrt((double)(cpu->R[0]));
969
+     return 1;
970
+}
971
+
972
+TEMPLATE static uint32_t setHaltCR()
973
+{
974
+     _MMU_write08<PROCNUM>(0x4000300+cpu->proc_ID, static_cast<uint8_t>(cpu->R[0]));
975
+     return 1;
976
+}
977
+
978
+TEMPLATE static uint32_t getSineTab()
979
+{
980
+	//ds returns garbage according to gbatek, but we must protect ourselves
981
+	if(cpu->R[0] >= ARRAY_SIZE(getsinetbl))
982
+	{
983
+		printf("Invalid SWI getSineTab: %08X\n",cpu->R[0]);
984
+		return 1;
985
+	}
986
+
987
+
988
+	cpu->R[0] = getsinetbl[cpu->R[0]];
989
+	return 1;
990
+}
991
+
992
+TEMPLATE static uint32_t getPitchTab()
993
+{
994
+	//ds returns garbage according to gbatek, but we must protect ourselves
995
+	if(cpu->R[0] >= ARRAY_SIZE(getpitchtbl))
996
+	{
997
+		printf("Invalid SWI getPitchTab: %08X\n",cpu->R[0]);
998
+		return 1;
999
+	}
1000
+
1001
+	cpu->R[0] = getpitchtbl[cpu->R[0]];
1002
+	return 1;
1003
+}
1004
+
1005
+TEMPLATE static uint32_t getVolumeTab()
1006
+{
1007
+	//ds returns garbage according to gbatek, but we must protect ourselves
1008
+	if(cpu->R[0] >= ARRAY_SIZE(getvoltbl))
1009
+	{
1010
+		printf("Invalid SWI getVolumeTab: %08X\n",cpu->R[0]);
1011
+		return 1;
1012
+	}
1013
+
1014
+
1015
+    cpu->R[0] = getvoltbl[cpu->R[0]];
1016
+    return 1;
1017
+}
1018
+
1019
+
1020
+//TEMPLATE static uint32_t getCRC16_old(uint32_t crc, uint32_t datap, uint32_t size)
1021
+//{
1022
+//  unsigned int i,j;
1023
+//
1024
+//  const uint16_t val[] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 };
1025
+//  for(i = 0; i < size; i++)
1026
+//  {
1027
+//    crc = crc ^ _MMU_read08<PROCNUM>(datap + i);
1028
+//
1029
+//    for(j = 0; j < 8; j++) {
1030
+//      int do_bit = 0;
1031
+//
1032
+//      if ( crc & 0x1)
1033
+//        do_bit = 1;
1034
+//
1035
+//      crc = crc >> 1;
1036
+//
1037
+//      if ( do_bit) {
1038
+//        crc = crc ^ (val[j] << (7-j));
1039
+//      }
1040
+//    }
1041
+//  }
1042
+//  return crc;
1043
+//}
1044
+
1045
+TEMPLATE static uint32_t getCRC16()
1046
+{
1047
+	//gbatek is wrong.
1048
+
1049
+	//dawn of sorrow uses this to checksum its save data;
1050
+	//if this implementation is wrong, then it won't match what the real bios returns,
1051
+	//and savefiles created with a bios will be invalid when loaded with non-bios (and vice-versa)
1052
+
1053
+	//uint32_t old = getCRC16_old<PROCNUM>(cpu->R[0],cpu->R[1],cpu->R[2]);
1054
+
1055
+	uint16_t crc = (uint16_t)cpu->R[0];
1056
+	uint32_t datap = cpu->R[1];
1057
+	uint32_t size = cpu->R[2]>>1;
1058
+	uint16_t currVal = 0;
1059
+
1060
+	const uint16_t val[] = { 0x0000,0xCC01,0xD801,0x1400,0xF001,0x3C00,0x2800,0xE401,0xA001,0x6C00,0x7800,0xB401,0x5000,0x9C01,0x8801,0x4400};
1061
+
1062
+	for(uint32_t i = 0; i < size; i++)
1063
+	{
1064
+		currVal = _MMU_read16<PROCNUM>(datap + i*2);
1065
+
1066
+		for(int j=0;j<4;j++)
1067
+		{
1068
+			uint16_t tabVal = val[crc&0xF];
1069
+			crc >>= 4;
1070
+			crc ^= tabVal;
1071
+
1072
+			uint16_t tempVal = currVal >> (4*j);
1073
+			tabVal = val[tempVal&0xF];
1074
+			crc ^= tabVal;
1075
+		}
1076
+	}
1077
+
1078
+	// R3 contains the last processed halfword
1079
+	cpu->R[3] = currVal;
1080
+	return 1;
1081
+}
1082
+
1083
+TEMPLATE static uint32_t isDebugger()
1084
+{
1085
+	//gbatek has additional specifications which are not emulated here
1086
+/*#ifdef DEVELOPER
1087
+	cpu->R[0] = 1;
1088
+#else*/
1089
+	cpu->R[0] = 0;
1090
+//#endif
1091
+	return 1;
1092
+}
1093
+
1094
+TEMPLATE static uint32_t SoundBias()
1095
+{
1096
+     uint32_t curBias = _MMU_read32<ARMCPU_ARM7>(0x04000504);
1097
+	 uint32_t newBias = (curBias == 0) ? 0x000:0x200;
1098
+	 uint32_t delay = (newBias > curBias) ? (newBias-curBias) : (curBias-newBias);
1099
+
1100
+	 _MMU_write32<ARMCPU_ARM7>(0x04000504, newBias);
1101
+     return cpu->R[1] * delay;
1102
+}
1103
+
1104
+TEMPLATE static uint32_t getBootProcs()
1105
+{
1106
+	cpu->R[0] = 0x00000A2E;
1107
+	cpu->R[1] = 0x00002C3C;
1108
+	cpu->R[3] = 0x000005FF;
1109
+	return 1;
1110
+}
1111
+
1112
+uint32_t (* ARM9_swi_tab[32])()={
1113
+         bios_nop<ARMCPU_ARM9>,             // 0x00
1114
+         bios_nop<ARMCPU_ARM9>,             // 0x01
1115
+         bios_nop<ARMCPU_ARM9>,             // 0x02
1116
+         WaitByLoop<ARMCPU_ARM9>,           // 0x03
1117
+         intrWaitARM<ARMCPU_ARM9>,          // 0x04
1118
+         waitVBlankARM<ARMCPU_ARM9>,        // 0x05
1119
+         wait4IRQ<ARMCPU_ARM9>,             // 0x06
1120
+         bios_nop<ARMCPU_ARM9>,             // 0x07
1121
+         bios_nop<ARMCPU_ARM9>,             // 0x08
1122
+         divide<ARMCPU_ARM9>,               // 0x09
1123
+         bios_nop<ARMCPU_ARM9>,             // 0x0A
1124
+         copy<ARMCPU_ARM9>,                 // 0x0B
1125
+         fastCopy<ARMCPU_ARM9>,             // 0x0C
1126
+         bios_sqrt<ARMCPU_ARM9>,            // 0x0D
1127
+         getCRC16<ARMCPU_ARM9>,             // 0x0E
1128
+         isDebugger<ARMCPU_ARM9>,           // 0x0F
1129
+         BitUnPack<ARMCPU_ARM9>,            // 0x10
1130
+         LZ77UnCompWram<ARMCPU_ARM9>,       // 0x11
1131
+         LZ77UnCompVram<ARMCPU_ARM9>,       // 0x12
1132
+         UnCompHuffman<ARMCPU_ARM9>,        // 0x13
1133
+         RLUnCompWram<ARMCPU_ARM9>,         // 0x14
1134
+         RLUnCompVram<ARMCPU_ARM9>,         // 0x15
1135
+         Diff8bitUnFilterWram<ARMCPU_ARM9>, // 0x16
1136
+         bios_nop<ARMCPU_ARM9>,             // 0x17
1137
+         Diff16bitUnFilter<ARMCPU_ARM9>,    // 0x18
1138
+         bios_nop<ARMCPU_ARM9>,             // 0x19
1139
+         bios_nop<ARMCPU_ARM9>,             // 0x1A
1140
+         bios_nop<ARMCPU_ARM9>,             // 0x1B
1141
+         bios_nop<ARMCPU_ARM9>,             // 0x1C
1142
+         bios_nop<ARMCPU_ARM9>,             // 0x1D
1143
+         bios_nop<ARMCPU_ARM9>,             // 0x1E
1144
+         setHaltCR<ARMCPU_ARM9>,            // 0x1F
1145
+};
1146
+
1147
+uint32_t (* ARM7_swi_tab[32])()={
1148
+         bios_nop<ARMCPU_ARM7>,             // 0x00
1149
+         bios_nop<ARMCPU_ARM7>,             // 0x01
1150
+         bios_nop<ARMCPU_ARM7>,             // 0x02
1151
+         WaitByLoop<ARMCPU_ARM7>,           // 0x03
1152
+         intrWaitARM<ARMCPU_ARM7>,          // 0x04
1153
+         waitVBlankARM<ARMCPU_ARM7>,        // 0x05
1154
+         wait4IRQ<ARMCPU_ARM7>,             // 0x06
1155
+         sleep<ARMCPU_ARM7>,                // 0x07
1156
+         SoundBias<ARMCPU_ARM7>,            // 0x08
1157
+         divide<ARMCPU_ARM7>,               // 0x09
1158
+         bios_nop<ARMCPU_ARM7>,             // 0x0A
1159
+         copy<ARMCPU_ARM7>,                 // 0x0B
1160
+         fastCopy<ARMCPU_ARM7>,             // 0x0C
1161
+         bios_sqrt<ARMCPU_ARM7>,            // 0x0D
1162
+         getCRC16<ARMCPU_ARM7>,             // 0x0E
1163
+		 isDebugger<ARMCPU_ARM7>,           // 0x0F
1164
+         BitUnPack<ARMCPU_ARM7>,            // 0x10
1165
+         LZ77UnCompWram<ARMCPU_ARM7>,       // 0x11
1166
+         LZ77UnCompVram<ARMCPU_ARM7>,       // 0x12
1167
+         UnCompHuffman<ARMCPU_ARM7>,        // 0x13
1168
+         RLUnCompWram<ARMCPU_ARM7>,         // 0x14
1169
+         RLUnCompVram<ARMCPU_ARM7>,         // 0x15
1170
+         Diff8bitUnFilterWram<ARMCPU_ARM7>, // 0x16
1171
+         bios_nop<ARMCPU_ARM7>,             // 0x17
1172
+         bios_nop<ARMCPU_ARM7>,             // 0x18
1173
+         bios_nop<ARMCPU_ARM7>,             // 0x19
1174
+         getSineTab<ARMCPU_ARM7>,           // 0x1A
1175
+         getPitchTab<ARMCPU_ARM7>,          // 0x1B
1176
+         getVolumeTab<ARMCPU_ARM7>,         // 0x1C
1177
+         getBootProcs<ARMCPU_ARM7>,         // 0x1D
1178
+         bios_nop<ARMCPU_ARM7>,             // 0x1E
1179
+         setHaltCR<ARMCPU_ARM7>,            // 0x1F
1180
+};