diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Instructions/IntegerMath.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Instructions/IntegerMath.cs index 7ef8ab2a..d3ae1a72 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Instructions/IntegerMath.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Instructions/IntegerMath.cs @@ -1186,6 +1186,54 @@ namespace cpu.m68000 } + //void CMP() + //{ + // int dReg = (op >> 9) & 7; + // int size = (op >> 6) & 3; + // int mode = (op >> 3) & 7; + // int reg = (op >> 0) & 7; + + // switch (size) + // { + // case 0: // byte + // { + // sbyte a = D[dReg].s8; + // sbyte b = ReadValueB(mode, reg); + // int result = a - b; + // N = (result & 0x80) != 0; + // Z = result == 0; + // V = result > sbyte.MaxValue || result < sbyte.MinValue; + // C = ((a < b) ^ ((a ^ b) >= 0) == false); + // pendingCycles -= 4 + EACyclesBW[mode, reg]; + // return; + // } + // case 1: // word + // { + // short a = D[dReg].s16; + // short b = ReadValueW(mode, reg); + // int result = a - b; + // N = (result & 0x8000) != 0; + // Z = result == 0; + // V = result > short.MaxValue || result < short.MinValue; + // C = ((a < b) ^ ((a ^ b) >= 0) == false); + // pendingCycles -= 4 + EACyclesBW[mode, reg]; + // return; + // } + // case 2: // long + // { + // int a = D[dReg].s32; + // int b = ReadValueL(mode, reg); + // long result = (long)a - (long)b; + // N = (result & 0x80000000) != 0; + // Z = (uint)result == 0; + // V = result > int.MaxValue || result < int.MinValue; + // C = ((a < b) ^ ((a ^ b) >= 0) == false); + // pendingCycles -= 6 + EACyclesL[mode, reg]; + // return; + // } + // } + //} + void CMP() { int dReg = (op >> 9) & 7; @@ -1197,7 +1245,7 @@ namespace cpu.m68000 { case 0: // byte { - sbyte a = D[dReg].s8; + sbyte a = (D + dReg)->s8; sbyte b = ReadValueB(mode, reg); int result = a - b; N = (result & 0x80) != 0; @@ -1209,7 +1257,7 @@ namespace cpu.m68000 } case 1: // word { - short a = D[dReg].s16; + short a = (D+ dReg)->s16; short b = ReadValueW(mode, reg); int result = a - b; N = (result & 0x8000) != 0; @@ -1221,7 +1269,7 @@ namespace cpu.m68000 } case 2: // long { - int a = D[dReg].s32; + int a = (D + dReg)->s32; int b = ReadValueL(mode, reg); long result = (long)a - (long)b; N = (result & 0x80000000) != 0; diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Memory.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Memory.cs index 74b6759b..02ea0d74 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Memory.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Memory.cs @@ -223,7 +223,8 @@ namespace MAME.Core address &= 0xffffff; if (address >= 0x000000 && address + 1 <= 0x00007f) { - byte* ptr = &Memory.mainrom[address]; + byte* ptr_0 = &Memory.mainrom[0]; + byte* ptr = ptr_0 + (address); if (main_cpu_vector_table_source == 0) { return (short)(*ptr * 0x100 + *(ptr + 1)); @@ -236,7 +237,8 @@ namespace MAME.Core } else if (address >= 0x000080 && address + 1 <= 0x0fffff) { - byte* ptr = &Memory.mainrom[address]; + byte* ptr_0 = &Memory.mainrom[0]; + byte* ptr = ptr_0 + (address); //if (address >= 0x142B9 && address <= 0x142C9) //{ // //m68000Form.iStatus = 1; @@ -245,19 +247,22 @@ namespace MAME.Core } else if (address >= 0x100000 && address + 1 <= 0x1fffff) { - byte* Memory_mainrom_address_and_0xffff = &Memory.mainrom[address & 0xffff]; + byte* ptr_0 = &Memory.mainram[0]; + byte* ptr = ptr_0 + (address & 0xffff); //result = (short)(Memory.mainram[address & 0xffff] * 0x100 + Memory.mainram[(address & 0xffff) + 1]); - return (short)(*Memory_mainrom_address_and_0xffff * 0x100 + *(Memory_mainrom_address_and_0xffff + 1)); + return (short)(*ptr * 0x100 + *(ptr + 1)); } else if (address >= 0x200000 && address + 1 <= 0x2fffff) { - byte* ptr = &Memory.mainrom[main_cpu_bank_address + (address & 0xfffff)]; + byte* ptr_0 = &Memory.mainram[0]; + byte* ptr = ptr_0 + (main_cpu_bank_address + (address & 0xfffff)); //result = (short)(Memory.mainrom[main_cpu_bank_address + (address & 0xfffff)] * 0x100 + Memory.mainrom[main_cpu_bank_address + (address & 0xfffff) + 1]); return (short)(*ptr * 0x100 + *(ptr + 1)); } else if (address >= 0xc00000 && address + 1 <= 0xcfffff) { - byte* ptr = &mainbiosrom[address & 0x1ffff]; + byte* ptr_0 = &mainbiosrom[0]; + byte* ptr = ptr_0 + (address & 0x1ffff); return (short)(*ptr * 0x100 + *(ptr + 1)); } else @@ -265,97 +270,6 @@ namespace MAME.Core return 0; } } - public static short MReadWord(int address) - { - address &= 0xffffff; - short result = 0; - if (address >= 0x000000 && address + 1 <= 0x00007f) - { - if (main_cpu_vector_table_source == 0) - { - result = (short)(mainbiosrom[address] * 0x100 + mainbiosrom[address + 1]); - } - else if (main_cpu_vector_table_source == 1) - { - result = (short)(Memory.mainrom[address] * 0x100 + Memory.mainrom[address + 1]); - } - } - else if (address >= 0x000080 && address + 1 <= 0x0fffff) - { - if (address >= 0x142B9 && address <= 0x142C9) - { - //m68000Form.iStatus = 1; - } - result = (short)(Memory.mainrom[address] * 0x100 + Memory.mainrom[address + 1]); - } - else if (address >= 0x100000 && address + 1 <= 0x1fffff) - { - if (address == 0x101410) - { - int i1 = 1; - } - result = (short)(Memory.mainram[address & 0xffff] * 0x100 + Memory.mainram[(address & 0xffff) + 1]); - } - else if (address >= 0x200000 && address <= 0x2fffff) - { - result = (short)(Memory.mainrom[main_cpu_bank_address + (address & 0xfffff)] * 0x100 + Memory.mainrom[main_cpu_bank_address + (address & 0xfffff) + 1]); - } - /*else if (address >= 0x300000 && address <= 0x300001) - { - result = (short)((ushort)short0 | dsw); - } - else if (address >= 0x300080 && address <= 0x300081) - { - result = short4; - }*/ - else if (address >= 0x300000 && address <= 0x31ffff) - { - int add = address & 0x81; - if (add >= 0x00 && add + 1 <= 0x01) - { - result = (short)((ushort)short0 | dsw); - } - else if (add >= 0x80 && add + 1 <= 0x81) - { - result = short4; - } - } - else if (address >= 0x320000 && address <= 0x33ffff) - { - result = (short)((ushort)short3 | (ushort)((get_calendar_status() & 0x03) << 6) | (get_audio_result() << 8)); - } - else if (address >= 0x340000 && address <= 0x35ffff) - { - result = short1; - } - else if (address >= 0x380000 && address <= 0x39ffff) - { - result = short2; - } - else if (address >= 0x3c0000 && address + 1 <= 0x3dffff) - { - result = (short)neogeo_video_register_r((address & 0x07) >> 1); - } - else if (address >= 0x400000 && address + 1 <= 0x7fffff) - { - result = (short)palettes[palette_bank, (address & 0x1fff) >> 1]; - } - else if (address >= 0xc00000 && address + 1 <= 0xcfffff) - { - result = (short)(mainbiosrom[address & 0x1ffff] * 0x100 + mainbiosrom[(address & 0x1ffff) + 1]); - } - else if (address >= 0xd00000 && address + 1 <= 0xdfffff) - { - result = (short)(mainram2[address & 0xffff] * 0x100 + mainram2[(address & 0xffff) + 1]); - } - else - { - int i1 = 1; - } - return result; - } - - //public static short MReadWord(int address) //{ // address &= 0xffffff; @@ -364,49 +278,32 @@ namespace MAME.Core // { // if (main_cpu_vector_table_source == 0) // { - // byte* ptr_0 = &mainbiosrom[0]; - // byte* ptr = ptr_0 + address; - // //result = (short)(mainbiosrom[address] * 0x100 + mainbiosrom[address + 1]); - // result = (short)(*ptr * 0x100 + *(ptr + 1)); + // result = (short)(mainbiosrom[address] * 0x100 + mainbiosrom[address + 1]); // } // else if (main_cpu_vector_table_source == 1) // { - // byte* ptr_0 = &Memory.mainrom[0]; - // byte* ptr = ptr_0 + address; - // //result = (short)(Memory.mainrom[address] * 0x100 + Memory.mainrom[address + 1]); - // result = (short)(*ptr * 0x100 + *(ptr + 1)); + // result = (short)(Memory.mainrom[address] * 0x100 + Memory.mainrom[address + 1]); // } // } // else if (address >= 0x000080 && address + 1 <= 0x0fffff) // { - // //if (address >= 0x142B9 && address <= 0x142C9) - // //{ - // // //m68000Form.iStatus = 1; - // //} - - // byte* ptr_0 = &Memory.mainrom[0]; - // byte* ptr = ptr_0 + address; - // //result = (short)(Memory.mainrom[address] * 0x100 + Memory.mainrom[address + 1]); - // result = (short)(*ptr * 0x100 + *(ptr + 1)); + // if (address >= 0x142B9 && address <= 0x142C9) + // { + // //m68000Form.iStatus = 1; + // } + // result = (short)(Memory.mainrom[address] * 0x100 + Memory.mainrom[address + 1]); // } // else if (address >= 0x100000 && address + 1 <= 0x1fffff) // { - // //if (address == 0x101410) - // //{ - // // int i1 = 1; - // //} - - // byte* ptr_0 = &Memory.mainrom[0]; - // byte* ptr = ptr_0 + (address & 0xffff); - // //result = (short)(Memory.mainram[address & 0xffff] * 0x100 + Memory.mainram[(address & 0xffff) + 1]); - // result = (short)(*ptr * 0x100 + *(ptr + 1)); + // if (address == 0x101410) + // { + // int i1 = 1; + // } + // result = (short)(Memory.mainram[address & 0xffff] * 0x100 + Memory.mainram[(address & 0xffff) + 1]); // } // else if (address >= 0x200000 && address <= 0x2fffff) // { - // byte* ptr_0 = &Memory.mainrom[0]; - // byte* ptr = ptr_0 + (main_cpu_bank_address + (address & 0xfffff)); - // //result = (short)(Memory.mainrom[main_cpu_bank_address + (address & 0xfffff)] * 0x100 + Memory.mainrom[main_cpu_bank_address + (address & 0xfffff) + 1]); - // result = (short)(*ptr * 0x100 + *(ptr + 1)); + // result = (short)(Memory.mainrom[main_cpu_bank_address + (address & 0xfffff)] * 0x100 + Memory.mainrom[main_cpu_bank_address + (address & 0xfffff) + 1]); // } // /*else if (address >= 0x300000 && address <= 0x300001) // { @@ -450,24 +347,132 @@ namespace MAME.Core // } // else if (address >= 0xc00000 && address + 1 <= 0xcfffff) // { - // byte* ptr_0 = &Memory.mainrom[0]; - // byte* ptr = ptr_0 + (address & 0x1ffff); - // //result = (short)(mainbiosrom[address & 0x1ffff] * 0x100 + mainbiosrom[(address & 0x1ffff) + 1]); - // result = (short)(*ptr * 0x100 + *(ptr + 1)); + // result = (short)(mainbiosrom[address & 0x1ffff] * 0x100 + mainbiosrom[(address & 0x1ffff) + 1]); // } // else if (address >= 0xd00000 && address + 1 <= 0xdfffff) // { - // byte* ptr_0 = &Memory.mainrom[0]; - // byte* ptr = ptr_0 + (address & 0xffff); - // //result = (short)(mainram2[address & 0xffff] * 0x100 + mainram2[(address & 0xffff) + 1]); - // result = (short)(*ptr * 0x100 + *(ptr + 1)); + // result = (short)(mainram2[address & 0xffff] * 0x100 + mainram2[(address & 0xffff) + 1]); + // } + // else + // { + // int i1 = 1; // } - // //else - // //{ - // // int i1 = 1; - // //} // return result; //} + + + public static short MReadWord(int address) + { + address &= 0xffffff; + short result = 0; + if (address >= 0x000000 && address + 1 <= 0x00007f) + { + if (main_cpu_vector_table_source == 0) + { + byte* ptr_0 = &mainbiosrom[0]; + byte* ptr = ptr_0 + address; + //result = (short)(mainbiosrom[address] * 0x100 + mainbiosrom[address + 1]); + result = (short)(*ptr * 0x100 + *(ptr + 1)); + } + else if (main_cpu_vector_table_source == 1) + { + byte* ptr_0 = &Memory.mainrom[0]; + byte* ptr = ptr_0 + address; + //result = (short)(Memory.mainrom[address] * 0x100 + Memory.mainrom[address + 1]); + result = (short)(*ptr * 0x100 + *(ptr + 1)); + } + } + else if (address >= 0x000080 && address + 1 <= 0x0fffff) + { + //if (address >= 0x142B9 && address <= 0x142C9) + //{ + // //m68000Form.iStatus = 1; + //} + + byte* ptr_0 = &Memory.mainrom[0]; + byte* ptr = ptr_0 + address; + //result = (short)(Memory.mainrom[address] * 0x100 + Memory.mainrom[address + 1]); + result = (short)(*ptr * 0x100 + *(ptr + 1)); + } + else if (address >= 0x100000 && address + 1 <= 0x1fffff) + { + //if (address == 0x101410) + //{ + // int i1 = 1; + //} + + byte* ptr_0 = &Memory.mainram[0]; + byte* ptr = ptr_0 + (address & 0xffff); + //result = (short)(Memory.mainram[address & 0xffff] * 0x100 + Memory.mainram[(address & 0xffff) + 1]); + result = (short)(*ptr * 0x100 + *(ptr + 1)); + } + else if (address >= 0x200000 && address <= 0x2fffff) + { + byte* ptr_0 = &Memory.mainrom[0]; + byte* ptr = ptr_0 + (main_cpu_bank_address + (address & 0xfffff)); + //result = (short)(Memory.mainrom[main_cpu_bank_address + (address & 0xfffff)] * 0x100 + Memory.mainrom[main_cpu_bank_address + (address & 0xfffff) + 1]); + result = (short)(*ptr * 0x100 + *(ptr + 1)); + } + /*else if (address >= 0x300000 && address <= 0x300001) + { + result = (short)((ushort)short0 | dsw); + } + else if (address >= 0x300080 && address <= 0x300081) + { + result = short4; + }*/ + else if (address >= 0x300000 && address <= 0x31ffff) + { + int add = address & 0x81; + if (add >= 0x00 && add + 1 <= 0x01) + { + result = (short)((ushort)short0 | dsw); + } + else if (add >= 0x80 && add + 1 <= 0x81) + { + result = short4; + } + } + else if (address >= 0x320000 && address <= 0x33ffff) + { + result = (short)((ushort)short3 | (ushort)((get_calendar_status() & 0x03) << 6) | (get_audio_result() << 8)); + } + else if (address >= 0x340000 && address <= 0x35ffff) + { + result = short1; + } + else if (address >= 0x380000 && address <= 0x39ffff) + { + result = short2; + } + else if (address >= 0x3c0000 && address + 1 <= 0x3dffff) + { + result = (short)neogeo_video_register_r((address & 0x07) >> 1); + } + else if (address >= 0x400000 && address + 1 <= 0x7fffff) + { + result = (short)palettes[palette_bank, (address & 0x1fff) >> 1]; + } + else if (address >= 0xc00000 && address + 1 <= 0xcfffff) + { + byte* ptr_0 = &mainbiosrom[0]; + byte* ptr = ptr_0 + (address & 0x1ffff); + //result = (short)(mainbiosrom[address & 0x1ffff] * 0x100 + mainbiosrom[(address & 0x1ffff) + 1]); + result = (short)(*ptr * 0x100 + *(ptr + 1)); + } + else if (address >= 0xd00000 && address + 1 <= 0xdfffff) + { + byte* ptr_0 = &mainram2[0]; + byte* ptr = ptr_0 + (address & 0xffff); + //result = (short)(mainram2[address & 0xffff] * 0x100 + mainram2[(address & 0xffff) + 1]); + result = (short)(*ptr * 0x100 + *(ptr + 1)); + } + //else + //{ + // int i1 = 1; + //} + return result; + } public static int MReadOpLong(int address) { address &= 0xffffff; diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Neoprot.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Neoprot.cs index ed12435d..482dab95 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Neoprot.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Neoprot.cs @@ -82,6 +82,8 @@ namespace MAME.Core { return 0x9a37; } + //public const sbyte prot_9a37_r_sbyte = 0x37; + //public const short prot_9a37_r_short = -25929; public static ushort sma_random_r() { ushort old = neogeo_rng;