| ... | ... |
@@ -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 |
}; |
| ... | ... |
@@ -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; |
| ... | ... |
@@ -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 |
}; |
| 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 |
+}; |