fix z80 memory handling + misc cleanups

This commit is contained in:
Michaël Banaan Ananas 2013-06-05 23:51:10 +00:00
parent bb629f90d3
commit acb5c9f4ae
4 changed files with 505 additions and 394 deletions

View File

@ -559,6 +559,10 @@ void _class :: _name(::address_map &map, device_t &device) \
#define AM_UNMAP \
curentry->set_read_type(AMH_UNMAP); \
curentry->set_write_type(AMH_UNMAP);
#define AM_READUNMAP \
curentry->set_read_type(AMH_UNMAP);
#define AM_WRITEUNMAP \
curentry->set_write_type(AMH_UNMAP);
#define AM_NOP \
curentry->set_read_type(AMH_NOP); \
curentry->set_write_type(AMH_NOP);

File diff suppressed because it is too large Load Diff

View File

@ -10,8 +10,9 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_spi_scrollram(*this, "spi_scrollram"),
m_spimainram(*this, "spimainram"),
m_mainram(*this, "mainram"),
m_scrollram(*this, "scrollram"),
m_z80_rom(*this, "audiocpu"),
m_eeprom(*this, "eeprom"),
m_soundflash1(*this, "soundflash1"),
m_soundflash2(*this, "soundflash2"),
@ -23,8 +24,9 @@ public:
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_audiocpu;
optional_shared_ptr<UINT32> m_spi_scrollram;
required_shared_ptr<UINT32> m_spimainram;
required_shared_ptr<UINT32> m_mainram;
optional_shared_ptr<UINT32> m_scrollram;
optional_memory_region m_z80_rom;
required_device<eeprom_device> m_eeprom;
optional_device<intel_e28f008sa_device> m_soundflash1;
optional_device<intel_e28f008sa_device> m_soundflash2;
@ -33,8 +35,7 @@ public:
optional_device<okim6295_device> m_oki1;
optional_device<okim6295_device> m_oki2;
UINT8 *m_z80_rom;
int m_z80_prg_fifo_pos;
int m_z80_prg_transfer_pos;
int m_z80_lastbank;
UINT8 m_sb_coin_latch;
UINT8 m_ejsakura_input_port;
@ -57,6 +58,7 @@ public:
UINT32 m_bg_fore_layer_position;
UINT8 m_alpha_table[8192];
UINT8 m_sprite_bpp;
DECLARE_READ32_MEMBER(ejanhs_speedup_r);
DECLARE_READ32_MEMBER(spi_layer_bank_r);
DECLARE_WRITE32_MEMBER(spi_layer_bank_w);
@ -75,11 +77,11 @@ public:
DECLARE_READ8_MEMBER(sound_fifo_status_r);
DECLARE_READ32_MEMBER(spi_int_r);
DECLARE_READ32_MEMBER(spi_unknown_r);
DECLARE_WRITE8_MEMBER(z80_prg_fifo_w);
DECLARE_WRITE8_MEMBER(z80_prg_transfer_w);
DECLARE_WRITE8_MEMBER(z80_enable_w);
DECLARE_READ8_MEMBER(z80_soundfifo_status_r);
DECLARE_WRITE8_MEMBER(z80_bank_w);
DECLARE_WRITE32_MEMBER(input_select_w);
DECLARE_WRITE32_MEMBER(ejsakura_input_select_w);
DECLARE_READ32_MEMBER(senkyu_speedup_r);
DECLARE_READ32_MEMBER(senkyua_speedup_r);
DECLARE_READ32_MEMBER(batlball_speedup_r);
@ -96,16 +98,13 @@ public:
DECLARE_DRIVER_INIT(batlball);
DECLARE_DRIVER_INIT(senkyu);
DECLARE_DRIVER_INIT(viprp1);
DECLARE_DRIVER_INIT(rfjet2k);
DECLARE_DRIVER_INIT(viprp1o);
DECLARE_DRIVER_INIT(rdft);
DECLARE_DRIVER_INIT(rfjet);
DECLARE_DRIVER_INIT(rdft22kc);
DECLARE_DRIVER_INIT(senkyua);
DECLARE_DRIVER_INIT(rdft2);
DECLARE_DRIVER_INIT(ejanhs);
DECLARE_DRIVER_INIT(sys386f2);
DECLARE_DRIVER_INIT(rdft2us);
TILE_GET_INFO_MEMBER(get_text_tile_info);
TILE_GET_INFO_MEMBER(get_back_tile_info);
TILE_GET_INFO_MEMBER(get_mid_tile_info);
@ -113,6 +112,7 @@ public:
DECLARE_MACHINE_START(spi);
DECLARE_MACHINE_RESET(spi);
DECLARE_VIDEO_START(spi);
DECLARE_MACHINE_START(seibu386);
DECLARE_MACHINE_RESET(seibu386);
DECLARE_VIDEO_START(sys386f2);
DECLARE_MACHINE_START(sxx2e);
@ -121,15 +121,16 @@ public:
UINT32 screen_update_sys386f2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(spi_interrupt);
IRQ_CALLBACK_MEMBER(spi_irq_callback);
DECLARE_WRITE_LINE_MEMBER(ymf_irqhandler);
void drawgfx_blend(bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy);
void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri_mask);
void set_rowscroll(tilemap_t *layer, int scroll, INT16* rows);
void set_scroll(tilemap_t *layer, int scroll);
void combine_tilemap(bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tile, int x, int y, int opaque, INT16 *rowscroll);
void init_spi();
void init_rf2_common();
void init_rfjet_common();
DECLARE_WRITE_LINE_MEMBER(irqhandler);
void init_spi_common();
void init_sei252();
void init_rise10();
void init_rise11();
};
/*----------- defined in machine/spisprit.c -----------*/

View File

@ -19,12 +19,14 @@ WRITE32_MEMBER(seibuspi_state::spi_layer_bank_w)
{
COMBINE_DATA( &m_layer_bank );
if (m_layer_bank & 0x80000000) {
if (m_layer_bank & 0x80000000)
{
m_fore_layer_offset = 0x1000 / 4;
m_mid_layer_offset = 0x2000 / 4;
m_text_layer_offset = 0x3000 / 4;
}
else {
else
{
m_fore_layer_offset = 0x800 / 4;
m_mid_layer_offset = 0x1000 / 4;
m_text_layer_offset = 0x1800 / 4;
@ -77,9 +79,11 @@ WRITE32_MEMBER(seibuspi_state::tilemap_dma_start_w)
if (m_layer_bank & 0x80000000)
{
/* back layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = m_spimainram[index];
if (m_tilemap_ram[i] != tile) {
for (i=0; i < 0x800/4; i++)
{
UINT32 tile = m_mainram[index];
if (m_tilemap_ram[i] != tile)
{
m_tilemap_ram[i] = tile;
m_back_layer->mark_tile_dirty((i * 2) );
m_back_layer->mark_tile_dirty((i * 2) + 1 );
@ -88,13 +92,15 @@ WRITE32_MEMBER(seibuspi_state::tilemap_dma_start_w)
}
/* back layer row scroll */
memcpy(&m_tilemap_ram[0x800/4], &m_spimainram[index], 0x800/4);
memcpy(&m_tilemap_ram[0x800/4], &m_mainram[index], 0x800/4);
index += 0x800/4;
/* fore layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = m_spimainram[index];
if (m_tilemap_ram[i+m_fore_layer_offset] != tile) {
for (i=0; i < 0x800/4; i++)
{
UINT32 tile = m_mainram[index];
if (m_tilemap_ram[i+m_fore_layer_offset] != tile)
{
m_tilemap_ram[i+m_fore_layer_offset] = tile;
m_fore_layer->mark_tile_dirty((i * 2) );
m_fore_layer->mark_tile_dirty((i * 2) + 1 );
@ -103,13 +109,15 @@ WRITE32_MEMBER(seibuspi_state::tilemap_dma_start_w)
}
/* fore layer row scroll */
memcpy(&m_tilemap_ram[0x1800/4], &m_spimainram[index], 0x800/4);
memcpy(&m_tilemap_ram[0x1800/4], &m_mainram[index], 0x800/4);
index += 0x800/4;
/* mid layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = m_spimainram[index];
if (m_tilemap_ram[i+m_mid_layer_offset] != tile) {
for (i=0; i < 0x800/4; i++)
{
UINT32 tile = m_mainram[index];
if (m_tilemap_ram[i+m_mid_layer_offset] != tile)
{
m_tilemap_ram[i+m_mid_layer_offset] = tile;
m_mid_layer->mark_tile_dirty((i * 2) );
m_mid_layer->mark_tile_dirty((i * 2) + 1 );
@ -118,13 +126,15 @@ WRITE32_MEMBER(seibuspi_state::tilemap_dma_start_w)
}
/* mid layer row scroll */
memcpy(&m_tilemap_ram[0x1800/4], &m_spimainram[index], 0x800/4);
memcpy(&m_tilemap_ram[0x1800/4], &m_mainram[index], 0x800/4);
index += 0x800/4;
/* text layer */
for (i=0; i < 0x1000/4; i++) {
UINT32 tile = m_spimainram[index];
if (m_tilemap_ram[i+m_text_layer_offset] != tile) {
for (i=0; i < 0x1000/4; i++)
{
UINT32 tile = m_mainram[index];
if (m_tilemap_ram[i+m_text_layer_offset] != tile)
{
m_tilemap_ram[i+m_text_layer_offset] = tile;
m_text_layer->mark_tile_dirty((i * 2) );
m_text_layer->mark_tile_dirty((i * 2) + 1 );
@ -135,9 +145,11 @@ WRITE32_MEMBER(seibuspi_state::tilemap_dma_start_w)
else
{
/* back layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = m_spimainram[index];
if (m_tilemap_ram[i] != tile) {
for (i=0; i < 0x800/4; i++)
{
UINT32 tile = m_mainram[index];
if (m_tilemap_ram[i] != tile)
{
m_tilemap_ram[i] = tile;
m_back_layer->mark_tile_dirty((i * 2) );
m_back_layer->mark_tile_dirty((i * 2) + 1 );
@ -146,9 +158,11 @@ WRITE32_MEMBER(seibuspi_state::tilemap_dma_start_w)
}
/* fore layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = m_spimainram[index];
if (m_tilemap_ram[i+m_fore_layer_offset] != tile) {
for (i=0; i < 0x800/4; i++)
{
UINT32 tile = m_mainram[index];
if (m_tilemap_ram[i+m_fore_layer_offset] != tile)
{
m_tilemap_ram[i+m_fore_layer_offset] = tile;
m_fore_layer->mark_tile_dirty((i * 2) );
m_fore_layer->mark_tile_dirty((i * 2) + 1 );
@ -157,9 +171,11 @@ WRITE32_MEMBER(seibuspi_state::tilemap_dma_start_w)
}
/* mid layer */
for (i=0; i < 0x800/4; i++) {
UINT32 tile = m_spimainram[index];
if (m_tilemap_ram[i+m_mid_layer_offset] != tile) {
for (i=0; i < 0x800/4; i++)
{
UINT32 tile = m_mainram[index];
if (m_tilemap_ram[i+m_mid_layer_offset] != tile)
{
m_tilemap_ram[i+m_mid_layer_offset] = tile;
m_mid_layer->mark_tile_dirty((i * 2) );
m_mid_layer->mark_tile_dirty((i * 2) + 1 );
@ -168,9 +184,11 @@ WRITE32_MEMBER(seibuspi_state::tilemap_dma_start_w)
}
/* text layer */
for (i=0; i < 0x1000/4; i++) {
UINT32 tile = m_spimainram[index];
if (m_tilemap_ram[i+m_text_layer_offset] != tile) {
for (i=0; i < 0x1000/4; i++)
{
UINT32 tile = m_mainram[index];
if (m_tilemap_ram[i+m_text_layer_offset] != tile)
{
m_tilemap_ram[i+m_text_layer_offset] = tile;
m_text_layer->mark_tile_dirty((i * 2) );
m_text_layer->mark_tile_dirty((i * 2) + 1 );
@ -188,8 +206,9 @@ WRITE32_MEMBER(seibuspi_state::palette_dma_start_w)
int i;
for (i=0; i < ((m_video_dma_length+1) * 2) / 4; i++)
{
UINT32 color = m_spimainram[(m_video_dma_address / 4) + i - 0x200];
if (m_palette_ram[i] != color) {
UINT32 color = m_mainram[(m_video_dma_address / 4) + i - 0x200];
if (m_palette_ram[i] != color)
{
m_palette_ram[i] = color;
palette_set_color_rgb( machine(), (i * 2), pal5bit(m_palette_ram[i] >> 0), pal5bit(m_palette_ram[i] >> 5), pal5bit(m_palette_ram[i] >> 10) );
palette_set_color_rgb( machine(), (i * 2) + 1, pal5bit(m_palette_ram[i] >> 16), pal5bit(m_palette_ram[i] >> 21), pal5bit(m_palette_ram[i] >> 26) );
@ -202,7 +221,7 @@ WRITE32_MEMBER(seibuspi_state::sprite_dma_start_w)
{
if (m_video_dma_address != 0)
{
memcpy( m_sprite_ram, &m_spimainram[(m_video_dma_address / 4) - 0x200], m_sprite_dma_length);
memcpy( m_sprite_ram, &m_mainram[(m_video_dma_address / 4) - 0x200], m_sprite_dma_length);
}
}
@ -354,7 +373,8 @@ void seibuspi_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprec
if( m_layer_enable & 0x10 )
return;
for( a = (m_sprite_dma_length / 4) - 2; a >= 0; a -= 2 ) {
for( a = (m_sprite_dma_length / 4) - 2; a >= 0; a -= 2 )
{
tile_num = (m_sprite_ram[a + 0] >> 16) & 0xffff;
if( m_sprite_ram[a + 1] & 0x1000 )
tile_num |= 0x10000;
@ -381,21 +401,26 @@ void seibuspi_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprec
x1 = 0;
y1 = 0;
if( flip_x ) {
if( flip_x )
{
x1 = 8 - width;
width = width + x1;
}
if( flip_y ) {
if( flip_y )
{
y1 = 8 - height;
height = height + y1;
}
for( x=x1; x < width; x++ ) {
for( y=y1; y < height; y++ ) {
for( x=x1; x < width; x++ )
{
for( y=y1; y < height; y++ )
{
drawgfx_blend(bitmap, cliprect, gfx, tile_num, color, flip_x, flip_y, xpos + sprite_xtable[flip_x][x], ypos + sprite_ytable[flip_y][y]);
/* xpos seems to wrap-around to 0 at 512 */
if( (xpos + (16 * x) + 16) >= 512 ) {
if( (xpos + (16 * x) + 16) >= 512 )
{
drawgfx_blend(bitmap, cliprect, gfx, tile_num, color, flip_x, flip_y, xpos - 512 + sprite_xtable[flip_x][x], ypos + sprite_ytable[flip_y][y]);
}
@ -483,7 +508,8 @@ VIDEO_START_MEMBER(seibuspi_state,spi)
m_sprite_bpp = 6;
m_sprite_dma_length = 0x1000;
for (i=0; i < 6144; i++) {
for (i=0; i < 6144; i++)
{
palette_set_color(machine(), i, MAKE_RGB(0, 0, 0));
}
@ -528,10 +554,11 @@ VIDEO_START_MEMBER(seibuspi_state,spi)
void seibuspi_state::set_rowscroll(tilemap_t *layer, int scroll, INT16* rows)
{
int i;
int x = m_spi_scrollram[scroll] & 0xffff;
int y = (m_spi_scrollram[scroll] >> 16) & 0xffff;
int x = m_scrollram[scroll] & 0xffff;
int y = (m_scrollram[scroll] >> 16) & 0xffff;
layer->set_scroll_rows(512);
for( i=0; i < 512; i++ ) {
for( i=0; i < 512; i++ )
{
layer->set_scrollx(i, x + rows[i]);
}
layer->set_scrolly(0, y);
@ -539,8 +566,8 @@ void seibuspi_state::set_rowscroll(tilemap_t *layer, int scroll, INT16* rows)
void seibuspi_state::set_scroll(tilemap_t *layer, int scroll)
{
int x = m_spi_scrollram[scroll] & 0xffff;
int y = (m_spi_scrollram[scroll] >> 16) & 0xffff;
int x = m_scrollram[scroll] & 0xffff;
int y = (m_scrollram[scroll] >> 16) & 0xffff;
layer->set_scrollx(0, x);
layer->set_scrolly(0, y);
}
@ -596,11 +623,14 @@ void seibuspi_state::combine_tilemap(bitmap_rgb32 &bitmap, const rectangle &clip
UINT32 seibuspi_state::screen_update_spi(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
INT16 *back_rowscroll, *mid_rowscroll, *fore_rowscroll;
if( m_layer_bank & 0x80000000 ) {
if( m_layer_bank & 0x80000000 )
{
back_rowscroll = (INT16*)&m_tilemap_ram[0x200];
mid_rowscroll = (INT16*)&m_tilemap_ram[0x600];
fore_rowscroll = (INT16*)&m_tilemap_ram[0xa00];
} else {
}
else
{
back_rowscroll = NULL;
mid_rowscroll = NULL;
fore_rowscroll = NULL;
@ -610,7 +640,7 @@ UINT32 seibuspi_state::screen_update_spi(screen_device &screen, bitmap_rgb32 &bi
bitmap.fill(0, cliprect);
if (!(m_layer_enable & 0x1))
combine_tilemap(bitmap, cliprect, m_back_layer, m_spi_scrollram[0] & 0xffff, (m_spi_scrollram[0] >> 16) & 0xffff, 1, back_rowscroll);
combine_tilemap(bitmap, cliprect, m_back_layer, m_scrollram[0] & 0xffff, (m_scrollram[0] >> 16) & 0xffff, 1, back_rowscroll);
draw_sprites(bitmap, cliprect, 0);
@ -619,7 +649,7 @@ UINT32 seibuspi_state::screen_update_spi(screen_device &screen, bitmap_rgb32 &bi
draw_sprites(bitmap, cliprect, 1);
if (!(m_layer_enable & 0x2))
combine_tilemap(bitmap, cliprect, m_mid_layer, m_spi_scrollram[1] & 0xffff, (m_spi_scrollram[1] >> 16) & 0xffff, 0, mid_rowscroll);
combine_tilemap(bitmap, cliprect, m_mid_layer, m_scrollram[1] & 0xffff, (m_scrollram[1] >> 16) & 0xffff, 0, mid_rowscroll);
// if fore layer is disabled, draw priority 1 sprites above mid layer
if ((m_layer_enable & 0x4))
@ -628,7 +658,7 @@ UINT32 seibuspi_state::screen_update_spi(screen_device &screen, bitmap_rgb32 &bi
draw_sprites(bitmap, cliprect, 2);
if (!(m_layer_enable & 0x4))
combine_tilemap(bitmap, cliprect, m_fore_layer, m_spi_scrollram[2] & 0xffff, (m_spi_scrollram[2] >> 16) & 0xffff, 0, fore_rowscroll);
combine_tilemap(bitmap, cliprect, m_fore_layer, m_scrollram[2] & 0xffff, (m_scrollram[2] >> 16) & 0xffff, 0, fore_rowscroll);
draw_sprites(bitmap, cliprect, 3);
@ -647,7 +677,8 @@ VIDEO_START_MEMBER(seibuspi_state,sys386f2)
m_sprite_dma_length = 0x2000;
m_layer_enable = 0;
for (i=0; i < 8192; i++) {
for (i=0; i < 8192; i++)
{
palette_set_color(machine(), i, MAKE_RGB(0, 0, 0));
}