持续优化

This commit is contained in:
sin365 2025-11-17 18:34:15 +08:00
parent a806deed55
commit bb32fd3736
3 changed files with 197 additions and 142 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;