mirror of
https://github.com/holub/mame
synced 2025-05-22 13:48:55 +03:00
Ported code from MESS, not worth
This commit is contained in:
parent
0b464fb4d6
commit
72a66946fd
@ -48,6 +48,8 @@ struct snes_cart_info snes_cart;
|
|||||||
#include "machine/snesst10.c"
|
#include "machine/snesst10.c"
|
||||||
#include "machine/snesbsx.c"
|
#include "machine/snesbsx.c"
|
||||||
|
|
||||||
|
#define USE_CYCLE_STEAL 1
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
|
|
||||||
Timers
|
Timers
|
||||||
@ -844,6 +846,7 @@ address | | | | | | |
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
/*FIXME: missing work RAM access steal / we need to do this less "aggressive" otherwise we lose too much CPU horsepower, why? */
|
/*FIXME: missing work RAM access steal / we need to do this less "aggressive" otherwise we lose too much CPU horsepower, why? */
|
||||||
static int snes_bank_0x00_0x3f_cycles(running_machine *machine,UINT32 offset)
|
static int snes_bank_0x00_0x3f_cycles(running_machine *machine,UINT32 offset)
|
||||||
{
|
{
|
||||||
@ -905,6 +908,7 @@ static int snes_bank_0x80_0xbf_cycles(running_machine *machine,UINT32 offset)
|
|||||||
|
|
||||||
return 0; //TODO: 6
|
return 0; //TODO: 6
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 0x000000 - 0x2fffff */
|
/* 0x000000 - 0x2fffff */
|
||||||
READ8_HANDLER( snes_r_bank1 )
|
READ8_HANDLER( snes_r_bank1 )
|
||||||
@ -957,8 +961,10 @@ READ8_HANDLER( snes_r_bank1 )
|
|||||||
else
|
else
|
||||||
value = snes_ram[offset];
|
value = snes_ram[offset];
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -snes_bank_0x00_0x3f_cycles(space->machine, offset));
|
cpu_adjust_icount(space->cpu, -snes_bank_0x00_0x3f_cycles(space->machine, offset));
|
||||||
|
#endif
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -1020,8 +1026,10 @@ READ8_HANDLER( snes_r_bank2 )
|
|||||||
else
|
else
|
||||||
value = snes_ram[0x300000 + offset];
|
value = snes_ram[0x300000 + offset];
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -snes_bank_0x00_0x3f_cycles(space->machine, offset));
|
cpu_adjust_icount(space->cpu, -snes_bank_0x00_0x3f_cycles(space->machine, offset));
|
||||||
|
#endif
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -1061,8 +1069,10 @@ READ8_HANDLER( snes_r_bank3 )
|
|||||||
else /* Mode 21 & 25 + SuperFX games */
|
else /* Mode 21 & 25 + SuperFX games */
|
||||||
value = snes_ram[0x400000 + offset];
|
value = snes_ram[0x400000 + offset];
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -8);
|
cpu_adjust_icount(space->cpu, -8);
|
||||||
|
#endif
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -1099,8 +1109,10 @@ READ8_HANDLER( snes_r_bank4 )
|
|||||||
else if (state->cart[0].mode & 0x0a) /* Mode 21 & 25 */
|
else if (state->cart[0].mode & 0x0a) /* Mode 21 & 25 */
|
||||||
value = snes_ram[0x600000 + offset];
|
value = snes_ram[0x600000 + offset];
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -8);
|
cpu_adjust_icount(space->cpu, -8);
|
||||||
|
#endif
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -1135,8 +1147,10 @@ READ8_HANDLER( snes_r_bank5 )
|
|||||||
else
|
else
|
||||||
value = snes_ram[0x700000 + offset];
|
value = snes_ram[0x700000 + offset];
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -8);
|
cpu_adjust_icount(space->cpu, -8);
|
||||||
|
#endif
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -1183,8 +1197,10 @@ READ8_HANDLER( snes_r_bank6 )
|
|||||||
else
|
else
|
||||||
value = snes_ram[0x800000 + offset];
|
value = snes_ram[0x800000 + offset];
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -snes_bank_0x80_0xbf_cycles(space->machine, offset));
|
cpu_adjust_icount(space->cpu, -snes_bank_0x80_0xbf_cycles(space->machine, offset));
|
||||||
|
#endif
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -1236,8 +1252,10 @@ READ8_HANDLER( snes_r_bank7 )
|
|||||||
else /* Mode 21 & 25 + SuperFX Games */
|
else /* Mode 21 & 25 + SuperFX Games */
|
||||||
value = snes_ram[0xc00000 + offset];
|
value = snes_ram[0xc00000 + offset];
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -((snes_ram[MEMSEL] & 1) ? 6 : 8));
|
cpu_adjust_icount(space->cpu, -((snes_ram[MEMSEL] & 1) ? 6 : 8));
|
||||||
|
#endif
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -1290,8 +1308,10 @@ WRITE8_HANDLER( snes_w_bank1 )
|
|||||||
else
|
else
|
||||||
logerror( "(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset );
|
logerror( "(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset );
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -snes_bank_0x00_0x3f_cycles(space->machine, offset));
|
cpu_adjust_icount(space->cpu, -snes_bank_0x00_0x3f_cycles(space->machine, offset));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x300000 - 0x3fffff */
|
/* 0x300000 - 0x3fffff */
|
||||||
@ -1347,8 +1367,10 @@ WRITE8_HANDLER( snes_w_bank2 )
|
|||||||
else
|
else
|
||||||
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x300000);
|
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x300000);
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -snes_bank_0x00_0x3f_cycles(space->machine, offset));
|
cpu_adjust_icount(space->cpu, -snes_bank_0x00_0x3f_cycles(space->machine, offset));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x600000 - 0x6fffff */
|
/* 0x600000 - 0x6fffff */
|
||||||
@ -1373,8 +1395,10 @@ WRITE8_HANDLER( snes_w_bank4 )
|
|||||||
else if (state->cart[0].mode & 0x0a)
|
else if (state->cart[0].mode & 0x0a)
|
||||||
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x600000);
|
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x600000);
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -8);
|
cpu_adjust_icount(space->cpu, -8);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x700000 - 0x7dffff */
|
/* 0x700000 - 0x7dffff */
|
||||||
@ -1398,8 +1422,10 @@ WRITE8_HANDLER( snes_w_bank5 )
|
|||||||
else if (state->cart[0].mode & 0x0a)
|
else if (state->cart[0].mode & 0x0a)
|
||||||
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x700000);
|
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x700000);
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -8);
|
cpu_adjust_icount(space->cpu, -8);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1446,8 +1472,10 @@ WRITE8_HANDLER( snes_w_bank6 )
|
|||||||
else
|
else
|
||||||
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x800000);
|
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0x800000);
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -snes_bank_0x80_0xbf_cycles(space->machine, offset));
|
cpu_adjust_icount(space->cpu, -snes_bank_0x80_0xbf_cycles(space->machine, offset));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1486,8 +1514,10 @@ WRITE8_HANDLER( snes_w_bank7 )
|
|||||||
else if (state->cart[0].mode & 0x0a)
|
else if (state->cart[0].mode & 0x0a)
|
||||||
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0xc00000);
|
logerror("(PC=%06x) Attempt to write to ROM address: %X\n",cpu_get_pc(space->cpu),offset + 0xc00000);
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
if(!space->debugger_access())
|
if(!space->debugger_access())
|
||||||
cpu_adjust_icount(space->cpu, -((snes_ram[MEMSEL] & 1) ? 6 : 8));
|
cpu_adjust_icount(space->cpu, -((snes_ram[MEMSEL] & 1) ? 6 : 8));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1597,7 +1627,7 @@ static void snes_init_timers( running_machine *machine )
|
|||||||
|
|
||||||
// SNES hcounter has a 0-339 range. hblank starts at counter 260.
|
// SNES hcounter has a 0-339 range. hblank starts at counter 260.
|
||||||
// clayfighter sets an HIRQ at 260, apparently it wants it to be before hdma kicks off, so we'll delay 2 pixels.
|
// clayfighter sets an HIRQ at 260, apparently it wants it to be before hdma kicks off, so we'll delay 2 pixels.
|
||||||
state->hblank_offset = 268;
|
state->hblank_offset = 274;
|
||||||
timer_adjust_oneshot(state->hblank_timer, machine->primary_screen->time_until_pos(((snes_ram[STAT78] & 0x10) == SNES_NTSC) ? SNES_VTOTAL_NTSC - 1 : SNES_VTOTAL_PAL - 1, state->hblank_offset), 0);
|
timer_adjust_oneshot(state->hblank_timer, machine->primary_screen->time_until_pos(((snes_ram[STAT78] & 0x10) == SNES_NTSC) ? SNES_VTOTAL_NTSC - 1 : SNES_VTOTAL_PAL - 1, state->hblank_offset), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1988,8 +2018,10 @@ INLINE void snes_dma_transfer( address_space *space, UINT8 dma, UINT32 abus, UIN
|
|||||||
{
|
{
|
||||||
snes_state *state = space->machine->driver_data<snes_state>();
|
snes_state *state = space->machine->driver_data<snes_state>();
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
/* every byte transfer takes 8 master cycles */
|
/* every byte transfer takes 8 master cycles */
|
||||||
cpu_adjust_icount(space->cpu,-8);
|
cpu_adjust_icount(space->cpu,-8);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (state->dma_channel[dma].dmap & 0x80) /* PPU->CPU */
|
if (state->dma_channel[dma].dmap & 0x80) /* PPU->CPU */
|
||||||
{
|
{
|
||||||
@ -2197,8 +2229,10 @@ static void snes_dma( address_space *space, UINT8 channels )
|
|||||||
|
|
||||||
/* FIXME: we also need to round to the nearest 8 master cycles */
|
/* FIXME: we also need to round to the nearest 8 master cycles */
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
/* overhead steals 8 master cycles, correct? */
|
/* overhead steals 8 master cycles, correct? */
|
||||||
cpu_adjust_icount(space->cpu,-8);
|
cpu_adjust_icount(space->cpu,-8);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Assume priority of the 8 DMA channels is 0-7 */
|
/* Assume priority of the 8 DMA channels is 0-7 */
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
@ -2309,13 +2343,17 @@ static void snes_dma( address_space *space, UINT8 channels )
|
|||||||
state->dma_channel[i].src_addr = abus;
|
state->dma_channel[i].src_addr = abus;
|
||||||
state->dma_channel[i].trans_size = 0;
|
state->dma_channel[i].trans_size = 0;
|
||||||
|
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
/* active channel takes 8 master cycles */
|
/* active channel takes 8 master cycles */
|
||||||
cpu_adjust_icount(space->cpu,-8);
|
cpu_adjust_icount(space->cpu,-8);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* finally, take yet another 8 master cycles for the aforementioned overhead */
|
/* finally, take yet another 8 master cycles for the aforementioned overhead */
|
||||||
|
#if USE_CYCLE_STEAL
|
||||||
cpu_adjust_icount(space->cpu,-8);
|
cpu_adjust_icount(space->cpu,-8);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
READ8_HANDLER( superfx_r_bank1 )
|
READ8_HANDLER( superfx_r_bank1 )
|
||||||
|
@ -2233,7 +2233,8 @@ READ8_HANDLER( snes_ppu_read )
|
|||||||
return snes_ppu.ppu2_open_bus;
|
return snes_ppu.ppu2_open_bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
return snes_ppu.ppu1_open_bus;
|
/* note: remaining registers (Namely TM in Super Kick Boxing) returns MDR open bus, not PPU Open Bus! */
|
||||||
|
return snes_open_bus_r(space, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user