4.2d More optmization to banksets and some CPU improvements.

This commit is contained in:
wavemotion-dave 2022-11-09 06:58:51 -05:00
parent f7c4c647ee
commit 1a8f11f129
5 changed files with 102 additions and 123 deletions

Binary file not shown.

View file

@ -1,4 +1,4 @@
VERSION=4.2c
VERSION=4.2d
TARGNAME=A7800DS
#---------------------------------------------------------------------------------

View file

@ -56,7 +56,7 @@ Database_Entry game_list[] = {
{"20660b667df538ec32a8e1b998438604", "Frameless Centipede", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, HSC_YES, 0, 24, 16, 300, 230, 0}, // title=Centipede - Frameless Hack
{"a4b5d742860beb25c29def4530194c1e", "Chase", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, HSC_NO, 0, 8, 19, 269, 233, 0}, // title=Chase
{"93e4387864b014c155d7c17877990d1e", "Choplifter", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, HSC_NO, 0, 0, 12, 256, 220, 0}, // title=Choplifter
{"2e8e28f6ad8b9b9267d518d880c73ebb", "Commando", CT_SUPCAR, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, HSC_NO, 0, 0, 12, 256, 220, 1}, // title=Commando
{"2e8e28f6ad8b9b9267d518d880c73ebb", "Commando", CT_SUPCAR, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, HSC_NO, 20, 0, 12, 256, 220, 1}, // title=Commando
{"db691469128d9a4217ec7e315930b646", "Crack'ed", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, HSC_NO, 0, 0, 18, 256, 229, 0}, // title=Crack'ed
{"299d31c8e181fdd011df2014451bdf0f", "Crazy Brix", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, HSC_YES, 0, 0, 5, 256, 203, 0}, // title=Crazy Brix
{"2d2fe4da9f1bae102fa8ca2d8830a626", "Crazy Otto", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, HSC_NO, 0, 0, 9, 256, 232, 0}, // title=Crazy Otto

View file

@ -61,8 +61,6 @@ static lpair maria_pp __attribute__((section(".dtcm")));
static byte maria_horizontal __attribute__((section(".dtcm")));
static byte maria_palette __attribute__((section(".dtcm")));
static int maria_offset __attribute__((section(".dtcm")));
static byte maria_h08 __attribute__((section(".dtcm")));
static byte maria_h16 __attribute__((section(".dtcm")));
static uint maria_h8_h16 __attribute__((section(".dtcm")));
static u32 maria_wmode __attribute__((section(".dtcm")));
@ -102,8 +100,6 @@ void maria_Reset( ) {
maria_horizontal = 0;
maria_palette = 0;
maria_offset = 0;
maria_h08 = 0;
maria_h16 = 0;
maria_h8_h16 = 0x0000;
maria_wmode = 0;
bg32 = 0x00000000;
@ -149,7 +145,6 @@ static inline void _maria_ClearCells4(void)
*((u32 *)&maria_lineRAM[maria_horizontal]) = 0;
}
}
maria_horizontal += 4;
}
// ----------------------------------------------------------------------------
@ -177,7 +172,6 @@ static inline void _maria_StoreCells4(byte data)
if (data & 0x03) *ptr = maria_palette | (data & 0x03);
}
}
maria_horizontal += 4;
}
// ----------------------------------------------------------------------------
@ -187,18 +181,15 @@ static inline void maria_StoreCellWriteMode(byte data)
{
if(maria_horizontal < MARIA_LINERAM_SIZE)
{
if (data)
byte *ptr = (byte *)&maria_lineRAM[maria_horizontal];
if (data & write_mask_high) // high
{
byte *ptr = (byte *)&maria_lineRAM[maria_horizontal];
if (data & write_mask_high) // high
{
*ptr = (maria_palette & 0x10) | (data >> 4);
}
if (data & write_mask_low) // low
{
ptr++;
*ptr = (maria_palette & 0x10) | (data & 0x0F);
}
*ptr = (maria_palette & 0x10) | (data >> 4);
}
if (data & write_mask_low) // low
{
ptr++;
*ptr = (maria_palette & 0x10) | (data & 0x0F);
}
#ifdef KANGAROO_MODE_SUPPORTED
else
@ -211,7 +202,6 @@ static inline void maria_StoreCellWriteMode(byte data)
}
#endif
}
maria_horizontal += 2;
}
@ -227,6 +217,16 @@ static inline bool maria_IsHoleyDMA( )
return false;
}
static inline bool maria_IsNotHoleyDMA( )
{
if(maria_pp.w & 0x8000)
{
if (maria_pp.w & maria_h8_h16) return false;
}
return true;
}
// ----------------------------------------------------------------------------
// GetColor
// ----------------------------------------------------------------------------
@ -415,36 +415,26 @@ static inline void maria_StoreGraphic( )
byte data = memory_ram[maria_pp.w];
if(maria_wmode)
{
if(maria_IsHoleyDMA())
if (data)
{
maria_horizontal += 2;
}
else
{
maria_StoreCellWriteMode(write_mode_lookup[data]);
if(maria_IsNotHoleyDMA()) maria_StoreCellWriteMode(write_mode_lookup[data]);
}
maria_horizontal += 2;
}
else
{
#ifdef KANGAROO_MODE_SUPPORTED
if(maria_IsHoleyDMA())
if (data)
{
maria_horizontal += 4;
if (maria_IsNotHoleyDMA()) _maria_StoreCells4(data);
}
else if (!data)
#ifdef KANGAROO_MODE_SUPPORTED
else
{
_maria_ClearCells4();
}
#else
if(maria_IsHoleyDMA() || !data)
{
maria_horizontal += 4;
}
#endif
else
{
_maria_StoreCells4(data);
}
#endif
maria_horizontal += 4;
}
maria_pp.w++;
}
@ -564,10 +554,11 @@ ITCM_CODE void maria_RenderScanlineTOP(void)
maria_dpp.b.l = memory_ram[DPPL];
maria_dpp.b.h = memory_ram[DPPH];
maria_h08 = memory_ram[maria_dpp.w] & 32;
maria_h16 = memory_ram[maria_dpp.w] & 64;
maria_h8_h16 = (maria_h08 ? 2048:0) | (maria_h16 ? 4096:0);
maria_offset = memory_ram[maria_dpp.w] & 15;
u8 dl_mode = memory_ram[maria_dpp.w];
maria_h8_h16 = ((uint)dl_mode << 6) & 0x1800;
maria_offset = dl_mode & 15;
maria_dp.b.h = memory_ram[maria_dpp.w + 1];
maria_dp.b.l = memory_ram[maria_dpp.w + 2];
if(memory_ram[maria_dpp.w] & 128)
@ -583,11 +574,10 @@ ITCM_CODE void maria_RenderScanlineTOP(void)
{
maria_cycles += MARIA_CYCLES_STARTUP_SHUTDOWN_LAST_LINE_ZONE;
maria_dpp.w += 3;
maria_h08 = memory_ram[maria_dpp.w] & 32;
maria_h16 = memory_ram[maria_dpp.w] & 64;
maria_h8_h16 = (maria_h08 ? 2048:0) | (maria_h16 ? 4096:0);
maria_offset = memory_ram[maria_dpp.w] & 15;
if(memory_ram[maria_dpp.w] & 128)
u8 dl_mode = memory_ram[maria_dpp.w];
maria_h8_h16 = ((uint)dl_mode << 6) & 0x1800;
maria_offset = dl_mode & 15;
if(dl_mode & 128)
{
maria_cycles += sally_ExecuteNMI( ) << 2;
}
@ -631,11 +621,10 @@ ITCM_CODE void maria_RenderScanline(void)
{
maria_cycles += MARIA_CYCLES_STARTUP_SHUTDOWN_LAST_LINE_ZONE;
maria_dpp.w += 3;
maria_h08 = memory_ram[maria_dpp.w] & 32;
maria_h16 = memory_ram[maria_dpp.w] & 64;
maria_h8_h16 = (maria_h08 ? 2048:0) | (maria_h16 ? 4096:0);
maria_offset = memory_ram[maria_dpp.w] & 15;
if(memory_ram[maria_dpp.w] & 128)
u8 dl_mode = memory_ram[maria_dpp.w];
maria_h8_h16 = ((uint)dl_mode << 6) & 0x1800;
maria_offset = dl_mode & 15;
if(dl_mode & 128)
{
maria_cycles += sally_ExecuteNMI( ) << 2;
}
@ -662,41 +651,30 @@ static inline void mariabank_StoreGraphic( )
byte data = bankset_memory_read(maria_pp.w);
if(maria_wmode)
{
if(maria_IsHoleyDMA())
if (data)
{
maria_horizontal += 2;
}
else
{
maria_StoreCellWriteMode(write_mode_lookup[data]);
if(maria_IsNotHoleyDMA()) maria_StoreCellWriteMode(write_mode_lookup[data]);
}
maria_horizontal += 2;
}
else
{
#ifdef KANGAROO_MODE_SUPPORTED
if(maria_IsHoleyDMA())
if (data)
{
maria_horizontal += 4;
if (maria_IsNotHoleyDMA()) _maria_StoreCells4(data);
}
else if (!data)
#ifdef KANGAROO_MODE_SUPPORTED
else
{
_maria_ClearCells4();
}
#else
if(maria_IsHoleyDMA() || !data)
{
maria_horizontal += 4;
}
#endif
else
{
_maria_StoreCells4(data);
}
#endif
maria_horizontal += 4;
}
maria_pp.w++;
}
// ----------------------------------------------------------------------------
// StoreLineRAM
// ----------------------------------------------------------------------------
@ -791,10 +769,9 @@ ITCM_CODE void mariabank_RenderScanlineTOP(void)
{
maria_dpp.b.l = bankset_memory_read(DPPL);
maria_dpp.b.h = bankset_memory_read(DPPH);
maria_h08 = bankset_memory_read(maria_dpp.w) & 32;
maria_h16 = bankset_memory_read(maria_dpp.w) & 64;
maria_h8_h16 = (maria_h08 ? 2048:0) | (maria_h16 ? 4096:0);
maria_offset = bankset_memory_read(maria_dpp.w) & 15;
u8 dl_mode = bankset_memory_read(maria_dpp.w);
maria_h8_h16 = ((uint)dl_mode << 6) & 0x1800;
maria_offset = dl_mode & 15;
maria_dp.b.h = bankset_memory_read(maria_dpp.w + 1);
maria_dp.b.l = bankset_memory_read(maria_dpp.w + 2);
if(bankset_memory_read(maria_dpp.w) & 128)
@ -810,11 +787,10 @@ ITCM_CODE void mariabank_RenderScanlineTOP(void)
{
maria_cycles += MARIA_CYCLES_STARTUP_SHUTDOWN_LAST_LINE_ZONE;
maria_dpp.w += 3;
maria_h08 = bankset_memory_read(maria_dpp.w) & 32;
maria_h16 = bankset_memory_read(maria_dpp.w) & 64;
maria_h8_h16 = (maria_h08 ? 2048:0) | (maria_h16 ? 4096:0);
maria_offset = bankset_memory_read(maria_dpp.w) & 15;
if(bankset_memory_read(maria_dpp.w) & 128)
u8 dl_mode = bankset_memory_read(maria_dpp.w);
maria_h8_h16 = ((uint)dl_mode << 6) & 0x1800;
maria_offset = dl_mode & 15;
if(dl_mode & 128)
{
maria_cycles += sally_ExecuteNMI( ) << 2;
}
@ -840,11 +816,10 @@ ITCM_CODE void mariabank_RenderScanline(void)
{
maria_cycles += MARIA_CYCLES_STARTUP_SHUTDOWN_LAST_LINE_ZONE;
maria_dpp.w += 3;
maria_h08 = bankset_memory_read(maria_dpp.w) & 32;
maria_h16 = bankset_memory_read(maria_dpp.w) & 64;
maria_h8_h16 = (maria_h08 ? 2048:0) | (maria_h16 ? 4096:0);
maria_offset = bankset_memory_read(maria_dpp.w) & 15;
if(bankset_memory_read(maria_dpp.w) & 128)
u8 dl_mode = bankset_memory_read(maria_dpp.w);
maria_h8_h16 = ((uint)dl_mode << 6) & 0x1800;
maria_offset = dl_mode & 15;
if(dl_mode & 128)
{
maria_cycles += sally_ExecuteNMI( ) << 2;
}

View file

@ -109,6 +109,10 @@ static inline void sally_Flags(byte data)
sally_p = (sally_p & ~(_fN | _fZ)) | ((data) & _fN) | (((data) == 0) ? _fZ : 0);
}
static inline void sally_FlagsFastCmp(byte data) // For faster compare handling...
{
sally_p = (sally_p & 0x7C) | ((data) & _fN) | (((data) == 0) ? (_fZ|_fC) : 0);
}
// ----------------------------------------------------------------------------
// Branch
@ -1614,8 +1618,8 @@ ITCM_CODE void sally_Execute(unsigned int cycles )
sally_IndirectX( );
//sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
if(sally_a >= data_cmp) sally_p |= _fC; else sally_p &= ~_fC;
sally_Flags(sally_a - data_cmp);
sally_FlagsFastCmp(sally_a - data_cmp);
if(sally_a > data_cmp) sally_p |= _fC;
goto next_inst;
l_0xc4:
@ -1627,8 +1631,8 @@ ITCM_CODE void sally_Execute(unsigned int cycles )
sally_ZeroPage( );
//sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
if(sally_a >= data_cmp) sally_p |= _fC; else sally_p &= ~_fC;
sally_Flags(sally_a - data_cmp);
sally_FlagsFastCmp(sally_a - data_cmp);
if(sally_a > data_cmp) sally_p |= _fC;
goto next_inst;
l_0xc6:
@ -1642,10 +1646,10 @@ ITCM_CODE void sally_Execute(unsigned int cycles )
l_0xc9:
sally_Immediate( );
// sally_CMP( );
//sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
if(sally_a >= data_cmp) sally_p |= _fC; else sally_p &= ~_fC;
sally_Flags(sally_a - data_cmp);
sally_FlagsFastCmp(sally_a - data_cmp);
if(sally_a > data_cmp) sally_p |= _fC;
goto next_inst;
l_0xca:
@ -1659,10 +1663,10 @@ ITCM_CODE void sally_Execute(unsigned int cycles )
l_0xcd:
sally_Absolute( );
// sally_CMP( );
//sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
if(sally_a >= data_cmp) sally_p |= _fC; else sally_p &= ~_fC;
sally_Flags(sally_a - data_cmp);
sally_FlagsFastCmp(sally_a - data_cmp);
if(sally_a > data_cmp) sally_p |= _fC;
goto next_inst;
l_0xce:
@ -1677,19 +1681,37 @@ ITCM_CODE void sally_Execute(unsigned int cycles )
l_0xd1:
sally_IndirectY( );
// sally_CMP( );
//sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
if(sally_a >= data_cmp) sally_p |= _fC; else sally_p &= ~_fC;
sally_Flags(sally_a - data_cmp);
sally_FlagsFastCmp(sally_a - data_cmp);
if(sally_a > data_cmp) sally_p |= _fC;
sally_Delay(sally_y);
goto next_inst;
l_0xd5:
sally_ZeroPageX( );
// sally_CMP( );
//sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
if(sally_a >= data_cmp) sally_p |= _fC; else sally_p &= ~_fC;
sally_Flags(sally_a - data_cmp);
sally_FlagsFastCmp(sally_a - data_cmp);
if(sally_a > data_cmp) sally_p |= _fC;
goto next_inst;
l_0xd9:
sally_AbsoluteY( );
//sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
sally_FlagsFastCmp(sally_a - data_cmp);
if(sally_a > data_cmp) sally_p |= _fC;
sally_Delay(sally_y);
goto next_inst;
l_0xdd:
sally_AbsoluteX( );
//sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
sally_FlagsFastCmp(sally_a - data_cmp);
if(sally_a > data_cmp) sally_p |= _fC;
sally_Delay(sally_x);
goto next_inst;
l_0xd6:
@ -1701,24 +1723,6 @@ ITCM_CODE void sally_Execute(unsigned int cycles )
sally_CLD( );
goto next_inst;
l_0xd9:
sally_AbsoluteY( );
// sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
if(sally_a >= data_cmp) sally_p |= _fC; else sally_p &= ~_fC;
sally_Flags(sally_a - data_cmp);
sally_Delay(sally_y);
goto next_inst;
l_0xdd:
sally_AbsoluteX( );
// sally_CMP( );
data_cmp = memory_Read_Fast(sally_address.w);
if(sally_a >= data_cmp) sally_p |= _fC; else sally_p &= ~_fC;
sally_Flags(sally_a - data_cmp);
sally_Delay(sally_x);
goto next_inst;
l_0xde:
sally_AbsoluteX( );
sally_DEC( );