ygv608.cpp: address pointer clean-ups (nw)

This commit is contained in:
angelosa 2017-06-29 04:35:01 +02:00
parent 1f7d4514b5
commit a1a466a5f9
4 changed files with 104 additions and 37 deletions

View File

@ -482,7 +482,7 @@ ROM_START( abcheck )
ROM_REGION( 0x400000,"ygv608", 0 ) /* 4MB character generator */
ROM_LOAD( "an1cg0.10e", 0x000000, 0x200000, CRC(6dae0531) SHA1(2f4a4a22d461eb9a5bb88bdfccc3aff44cd3faee) )
ROM_LOAD( "an1cg1.10f", 0x200000, 0x200000, CRC(8485607a) SHA1(1b9a1950c6db61a2b546fe2f5e56333593e93fb4) )
ROM_REGION( 0x1000000, "c352", 0 ) // Samples
ROM_LOAD( "an1voice.7c", 0x000000, 0x200000, CRC(d2bfa453) SHA1(6b7d6bb4d65290d8fd3df5d12b41ae7dce5f3f1c) )

View File

@ -85,7 +85,7 @@ WRITE16_MEMBER(namcond1_state::cuskey_w)
case (0x0c>>1):
m_ygv608->set_gfxbank((data & 0x0002) >> 1); // i think
// should mark tilemaps dirty but i think they already are
// bit 0 used in abcheck
break;
default :

View File

@ -364,6 +364,13 @@ GFXDECODE_END
// we use decimals here to match documentation
static ADDRESS_MAP_START( regs_map, AS_IO, 8, ygv608_device )
// address pointers
AM_RANGE( 3, 3) AM_READWRITE(sprite_address_r,sprite_address_w)
AM_RANGE( 4, 4) AM_READWRITE(scroll_address_r,scroll_address_w)
AM_RANGE( 5, 5) AM_READWRITE(palette_address_r,palette_address_w)
AM_RANGE( 6, 6) AM_READWRITE(sprite_bank_r,sprite_bank_w)
// interrupt section
AM_RANGE(14, 14) AM_READWRITE(irq_mask_r,irq_mask_w)
AM_RANGE(15, 16) AM_READWRITE(irq_ctrl_r,irq_ctrl_w)
@ -527,6 +534,7 @@ void ygv608_device::device_timer(emu_timer &timer, device_timer_id id, int param
void ygv608_device::set_gfxbank(uint8_t gfxbank)
{
m_namcond1_gfxbank = gfxbank;
m_tilemap_resize = 1;
}
@ -984,7 +992,7 @@ void ygv608_device::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
switch( size ) {
case SZ_8X8 :
code = ( (int)m_regs.s.sba << 8 ) | (int)sa->sn;
code = ( (int)m_sprite_bank << 8 ) | (int)sa->sn;
if (spf != 0)
color = ( code >> ( (spf - 1) * 2 ) ) & 0x0f;
if( code >= layout_total(GFX_8X8_4BIT) ) {
@ -1014,7 +1022,7 @@ void ygv608_device::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
break;
case SZ_16X16 :
code = ( ( (int)m_regs.s.sba & 0xfc ) << 6 ) | (int)sa->sn;
code = ( ( (int)m_sprite_bank & 0xfc ) << 6 ) | (int)sa->sn;
if (spf != 0)
color = ( code >> (spf * 2) ) & 0x0f;
if( code >= layout_total(GFX_16X16_4BIT) ) {
@ -1044,7 +1052,7 @@ void ygv608_device::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
break;
case SZ_32X32 :
code = ( ( (int)m_regs.s.sba & 0xf0 ) << 4 ) | (int)sa->sn;
code = ( ( (int)m_sprite_bank & 0xf0 ) << 4 ) | (int)sa->sn;
if (spf != 0)
color = ( code >> ( (spf + 1) * 2 ) ) & 0x0f;
if( code >= layout_total(GFX_32X32_4BIT) ) {
@ -1074,7 +1082,7 @@ void ygv608_device::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
break;
case SZ_64X64 :
code = ( ( (int)m_regs.s.sba & 0xc0 ) << 2 ) | (int)sa->sn;
code = ( ( (int)m_sprite_bank & 0xc0 ) << 2 ) | (int)sa->sn;
if (spf != 0)
color = ( code >> ( (spf + 1) * 2 ) ) & 0x0f;
if( code >= layout_total(GFX_64X64_4BIT) ) {
@ -1405,10 +1413,10 @@ READ8_MEMBER( ygv608_device::pattern_name_table_r )
// P#1R - sprite data port
READ8_MEMBER( ygv608_device::sprite_data_r )
{
uint8_t res = m_sprite_attribute_table.b[m_regs.s.saa];
uint8_t res = m_sprite_attribute_table.b[m_sprite_address];
if (m_regs.s.r2 & r2_saar)
m_regs.s.saa++;
m_sprite_address++;
return res;
}
@ -1416,13 +1424,13 @@ READ8_MEMBER( ygv608_device::sprite_data_r )
// P#2R - scroll data port
READ8_MEMBER( ygv608_device::scroll_data_r )
{
uint8_t res = m_scroll_data_table[(m_regs.s.r2 & r2_b_a) >> 4][m_regs.s.sca];
uint8_t res = m_scroll_data_table[(m_regs.s.r2 & r2_b_a) >> 4][m_scroll_address];
if (m_regs.s.r2 & r2_scar)
{
m_regs.s.sca++;
m_scroll_address++;
/* handle wrap to next plane */
if (m_regs.s.sca == 0)
if (m_scroll_address == 0)
m_regs.s.r2 ^= r2_b_a;
}
@ -1432,14 +1440,14 @@ READ8_MEMBER( ygv608_device::scroll_data_r )
// P#3 - color palette data port
READ8_MEMBER( ygv608_device::palette_data_r )
{
uint8_t res = m_colour_palette[m_regs.s.cc][m_color_state_r];
uint8_t res = m_colour_palette[m_palette_address][m_color_state_r];
if( ++m_color_state_r == 3 )
{
m_color_state_r = 0;
if( m_regs.s.r2 & r2_cpar)
m_regs.s.cc++;
m_palette_address++;
}
return res;
@ -1579,22 +1587,22 @@ WRITE8_MEMBER(ygv608_device::pattern_name_table_w)
// P#1W - sprite data port
WRITE8_MEMBER( ygv608_device::sprite_data_w )
{
m_sprite_attribute_table.b[m_regs.s.saa] = data;
m_sprite_attribute_table.b[m_sprite_address] = data;
if( m_regs.s.r2 & r2_saaw)
m_regs.s.saa++;
m_sprite_address++;
}
// P#2W - scroll data port
WRITE8_MEMBER( ygv608_device::scroll_data_w )
{
m_scroll_data_table[(m_regs.s.r2 & r2_b_a) >> 4][m_regs.s.sca] = data;
m_scroll_data_table[(m_regs.s.r2 & r2_b_a) >> 4][m_scroll_address] = data;
if (m_regs.s.r2 & r2_scaw)
{
m_regs.s.sca++;
m_scroll_address++;
/* handle wrap to next plane */
if (m_regs.s.sca == 0)
if (m_scroll_address == 0)
m_regs.s.r2 ^= r2_b_a;
}
}
@ -1602,17 +1610,17 @@ WRITE8_MEMBER( ygv608_device::scroll_data_w )
// P#3W - colour palette data port
WRITE8_MEMBER( ygv608_device::palette_data_w )
{
m_colour_palette[m_regs.s.cc][m_color_state_w] = data;
m_colour_palette[m_palette_address][m_color_state_w] = data;
if (++m_color_state_w == 3)
{
m_color_state_w = 0;
palette().set_pen_color(m_regs.s.cc,
pal6bit( m_colour_palette[m_regs.s.cc][0] ),
pal6bit( m_colour_palette[m_regs.s.cc][1] ),
pal6bit( m_colour_palette[m_regs.s.cc][2] ));
palette().set_pen_color(m_palette_address,
pal6bit( m_colour_palette[m_palette_address][0] ),
pal6bit( m_colour_palette[m_palette_address][1] ),
pal6bit( m_colour_palette[m_palette_address][2] ));
if (m_regs.s.r2 & r2_cpaw)
m_regs.s.cc++;
m_palette_address++;
}
}
@ -1748,7 +1756,7 @@ void ygv608_device::HandleRomTransfers(uint8_t type)
/* sprite attribute table */
if( m_ports.s.ts ) {
int dest = (int)m_regs.s.saa;
int dest = (int)m_sprite_address;
/* fudge a transfer for now... */
for( i=0; i<bytes; i++ ) {
@ -1768,6 +1776,55 @@ void ygv608_device::HandleRomTransfers(uint8_t type)
*
****************************************/
// R#3R - sprite attribute table access pointer
READ8_MEMBER( ygv608_device::sprite_address_r )
{
return m_sprite_address;
}
// R#3W - sprite attribute table access pointer
WRITE8_MEMBER( ygv608_device::sprite_address_w )
{
m_sprite_address = data;
}
// R#4R - scroll table access pointer
READ8_MEMBER( ygv608_device::scroll_address_r )
{
return m_scroll_address;
}
// R#4W - scroll table access pointer
WRITE8_MEMBER( ygv608_device::scroll_address_w )
{
m_scroll_address = data;
}
// R#5R - color palette access pointer
READ8_MEMBER( ygv608_device::palette_address_r )
{
return m_palette_address;
}
// R#5W - color palette access pointer
WRITE8_MEMBER( ygv608_device::palette_address_w )
{
m_palette_address = data;
}
// R#6R - sprite generator base address
READ8_MEMBER( ygv608_device::sprite_bank_r )
{
return m_sprite_bank;
}
// R#6W - sprite generator base address
WRITE8_MEMBER( ygv608_device::sprite_bank_w )
{
m_sprite_bank = data;
}
// R#14R interrupt mask control
READ8_MEMBER( ygv608_device::irq_mask_r )
{
@ -2086,11 +2143,7 @@ void ygv608_device::SetPostShortcuts(int reg )
}
break;
case 6:
#if 0
logerror( "SBA = $%08X\n", (int)m_regs.s.sba << 13 );
#endif
break;
case 7:
m_na8_mask = ((m_regs.s.r7 & r7_flip) ? 0x03 : 0x0f );
@ -2188,7 +2241,7 @@ void ygv608_device::ShowYGV608Registers()
logerror(
"\tR#03: $%02X : SAA($%02X)\n",
m_regs.b[3],
m_regs.s.saa );
m_sprite_address );
logerror(
"\tR#04: $%02X : SCA($%02X)\n",
@ -2203,7 +2256,7 @@ void ygv608_device::ShowYGV608Registers()
logerror(
"\tR#06: $%02X : SBA($%02X)\n",
m_regs.b[6],
m_regs.s.sba );
m_sprite_bank );
logerror(
"\tR#07: $%02X : DSPE(%d),MD(%d),ZRON(%d),FLIP(%d),DCKM(%d)\n",

View File

@ -42,6 +42,14 @@ public:
DECLARE_WRITE8_MEMBER(system_control_w);
// register section
DECLARE_READ8_MEMBER(sprite_address_r);
DECLARE_WRITE8_MEMBER(sprite_address_w);
DECLARE_READ8_MEMBER(scroll_address_r);
DECLARE_WRITE8_MEMBER(scroll_address_w);
DECLARE_READ8_MEMBER(palette_address_r);
DECLARE_WRITE8_MEMBER(palette_address_w);
DECLARE_READ8_MEMBER(sprite_bank_r);
DECLARE_WRITE8_MEMBER(sprite_bank_w);
DECLARE_READ8_MEMBER(irq_mask_r);
DECLARE_WRITE8_MEMBER(irq_mask_w);
DECLARE_READ8_MEMBER(irq_ctrl_r);
@ -255,6 +263,11 @@ private:
int m_raster_irq_hpos; /**< IH: horizontal position where raster irq occurs x 32 */
int m_raster_irq_vpos; /**< IV: vertical position where raster irq occurs */
bool m_raster_irq_mode; /**< FPM: if 1 vertical position becomes invalid for raster irqs (irqs occur for every line) */
uint8_t m_scroll_address; /**< SCA: scroll table access pointer */
uint8_t m_palette_address; /**< CC: color palette access pointer */
uint8_t m_sprite_address; /**< SAA: sprite attribute table access pointer */
uint8_t m_sprite_bank; /**< SBA: sprite generator base address (MA20 to MA13) */
// screen section
devcb_write_line m_vblank_handler;
@ -263,6 +276,11 @@ private:
emu_timer *m_vblank_timer;
emu_timer *m_raster_timer;
void screen_configure(); /**< Adjust screen parameters based off CRTC ones */
attotime raster_sync_offset(); /**< adjust based off raster & CRTC parameters */
void vblank_irq_check();
void raster_irq_check();
enum
{
VBLANK_TIMER,
@ -302,11 +320,7 @@ private:
// for raw to ROZ conversion
uint32_t roz_convert_raw24(uint32_t *raw_reg, uint8_t offset, uint8_t data);
uint32_t roz_convert_raw16(uint16_t *raw_reg, uint8_t offset, uint8_t data);
void screen_configure(); /**< Adjust screen parameters based off CRTC ones */
attotime raster_sync_offset(); /**< adjust based off raster & CRTC parameters */
void vblank_irq_check();
void raster_irq_check();
};
// device type definition