mirror of
https://github.com/holub/mame
synced 2025-06-02 10:59:52 +03:00
ygv608.cpp: log registers into own space, handling will follow up (nw)
This commit is contained in:
parent
77c9556b0d
commit
d0aba57fba
@ -39,6 +39,7 @@
|
||||
* - fix attract mode garbage for Namco Collection Vol. 2 (either transparent or page banking select registers);
|
||||
* - fix tilemap dirty flags, move tilemap data in own space prolly helps;
|
||||
* - DMA from/to ROM;
|
||||
* - color palette accessors presumably accesses an internal RAMDAC with controllable auto-increment, convert to that;
|
||||
* - clean-ups & documentation;
|
||||
*
|
||||
*
|
||||
@ -244,24 +245,14 @@ enum {
|
||||
#define GFX_16X16_8BIT 5
|
||||
|
||||
|
||||
/***************************************
|
||||
*
|
||||
* Port Interface map
|
||||
*
|
||||
***************************************/
|
||||
|
||||
DEVICE_ADDRESS_MAP_START( port_map, 8, ygv608_device )
|
||||
AM_RANGE(0x00, 0x00) AM_READWRITE(pattern_name_table_r,pattern_name_table_w)
|
||||
AM_RANGE(0x01, 0x01) AM_READWRITE(sprite_data_r,sprite_data_w)
|
||||
AM_RANGE(0x02, 0x02) AM_READWRITE(scroll_data_r,scroll_data_w)
|
||||
AM_RANGE(0x03, 0x03) AM_READWRITE(palette_data_r,palette_data_w)
|
||||
AM_RANGE(0x04, 0x04) AM_READWRITE(register_data_r,register_data_w)
|
||||
AM_RANGE(0x05, 0x05) AM_WRITE(register_select_w)
|
||||
AM_RANGE(0x06, 0x06) AM_READWRITE(status_port_r,status_port_w)
|
||||
AM_RANGE(0x07, 0x07) AM_READWRITE(system_control_r,system_control_w)
|
||||
ADDRESS_MAP_END
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
// device type definition
|
||||
DEFINE_DEVICE_TYPE(YGV608, ygv608_device, "ygv608", "YGV608 VDP")
|
||||
|
||||
|
||||
/* text-layer characters */
|
||||
|
||||
static const uint32_t pts_4bits_layout_xoffset[64] =
|
||||
@ -360,15 +351,116 @@ static GFXDECODE_START( ygv608 )
|
||||
GFXDECODE_DEVICE( DEVICE_SELF, 0x00000000, pts_16x16_8bits_layout, 0, 1 )
|
||||
GFXDECODE_END
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(YGV608, ygv608_device, "ygv608", "YGV608 VDP")
|
||||
/***************************************
|
||||
*
|
||||
* Internal I/O register structure
|
||||
*
|
||||
***************************************/
|
||||
|
||||
static ADDRESS_MAP_START( regs_map, AS_IO, 8, ygv608_device )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/***************************************
|
||||
*
|
||||
* Port Interface map
|
||||
*
|
||||
***************************************/
|
||||
|
||||
DEVICE_ADDRESS_MAP_START( port_map, 8, ygv608_device )
|
||||
AM_RANGE(0x00, 0x00) AM_READWRITE(pattern_name_table_r,pattern_name_table_w)
|
||||
AM_RANGE(0x01, 0x01) AM_READWRITE(sprite_data_r,sprite_data_w)
|
||||
AM_RANGE(0x02, 0x02) AM_READWRITE(scroll_data_r,scroll_data_w)
|
||||
AM_RANGE(0x03, 0x03) AM_READWRITE(palette_data_r,palette_data_w)
|
||||
AM_RANGE(0x04, 0x04) AM_READWRITE(register_data_r,register_data_w)
|
||||
AM_RANGE(0x05, 0x05) AM_WRITE(register_select_w)
|
||||
AM_RANGE(0x06, 0x06) AM_READWRITE(status_port_r,status_port_w)
|
||||
AM_RANGE(0x07, 0x07) AM_READWRITE(system_control_r,system_control_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ygv608_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
ygv608_device::ygv608_device( const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock )
|
||||
: device_t(mconfig, YGV608, tag, owner, clock)
|
||||
, device_gfx_interface(mconfig, *this, GFXDECODE_NAME(ygv608))
|
||||
: device_t(mconfig, YGV608, tag, owner, clock),
|
||||
device_gfx_interface(mconfig, *this, GFXDECODE_NAME(ygv608)),
|
||||
device_memory_interface(mconfig, *this),
|
||||
m_io_space_config("io", ENDIANNESS_BIG, 8, 6, 0, *ADDRESS_MAP_NAME(regs_map))
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
void ygv608_device::device_start()
|
||||
{
|
||||
memset(&m_ports, 0, sizeof(m_ports));
|
||||
memset(&m_regs, 0, sizeof(m_regs));
|
||||
memset(&m_pattern_name_table, 0, sizeof(m_pattern_name_table));
|
||||
memset(&m_sprite_attribute_table, 0, sizeof(m_sprite_attribute_table));
|
||||
|
||||
memset(&m_scroll_data_table, 0, sizeof(m_scroll_data_table));
|
||||
memset(&m_colour_palette, 0, sizeof(m_colour_palette));
|
||||
|
||||
m_bits16 = 0;
|
||||
m_page_x = 0;
|
||||
m_page_y = 0;
|
||||
m_pny_shift = 0;
|
||||
m_na8_mask = 0;
|
||||
m_col_shift = 0;
|
||||
|
||||
m_ax = 0; m_dx = 0; m_dxy = 0; m_ay = 0; m_dy = 0; m_dyx = 0;
|
||||
|
||||
memset(&m_base_addr, 0, sizeof(m_base_addr));
|
||||
m_base_y_shift = 0;
|
||||
|
||||
// flag rebuild of the tilemaps
|
||||
m_screen_resize = 1;
|
||||
m_tilemap_resize = 1;
|
||||
m_namcond1_gfxbank = 0;
|
||||
save_item(NAME(m_namcond1_gfxbank));
|
||||
|
||||
/* create tilemaps of all sizes and combinations */
|
||||
m_tilemap_A_cache_8[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 32,32);
|
||||
m_tilemap_A_cache_8[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 64,32);
|
||||
m_tilemap_A_cache_8[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 32,64);
|
||||
|
||||
m_tilemap_A_cache_16[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 32,32);
|
||||
m_tilemap_A_cache_16[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 64,32);
|
||||
m_tilemap_A_cache_16[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 32,64);
|
||||
|
||||
m_tilemap_B_cache_8[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 32,32);
|
||||
m_tilemap_B_cache_8[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 64,32);
|
||||
m_tilemap_B_cache_8[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 32,64);
|
||||
|
||||
m_tilemap_B_cache_16[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 32,32);
|
||||
m_tilemap_B_cache_16[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 64,32);
|
||||
m_tilemap_B_cache_16[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 32,64);
|
||||
|
||||
m_tilemap_A = nullptr;
|
||||
m_tilemap_B = nullptr;
|
||||
|
||||
m_iospace = &space(AS_IO);
|
||||
|
||||
register_state_save();
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// memory_space_config - return a description of
|
||||
// any address spaces owned by this device
|
||||
//-------------------------------------------------
|
||||
|
||||
const address_space_config *ygv608_device::memory_space_config(address_spacenum spacenum) const
|
||||
{
|
||||
return (spacenum == AS_IO) ? &m_io_space_config : nullptr;
|
||||
}
|
||||
|
||||
|
||||
void ygv608_device::set_gfxbank(uint8_t gfxbank)
|
||||
{
|
||||
m_namcond1_gfxbank = gfxbank;
|
||||
@ -806,60 +898,13 @@ void ygv608_device::register_state_save()
|
||||
save_item(NAME(m_sprite_attribute_table.b));
|
||||
save_item(NAME(m_scroll_data_table));
|
||||
save_item(NAME(m_colour_palette));
|
||||
// save_item(NAME(register_state_save));
|
||||
save_item(NAME(m_color_state_r));
|
||||
save_item(NAME(m_color_state_w));
|
||||
|
||||
machine().save().register_postload(save_prepost_delegate(FUNC(ygv608_device::postload), this));
|
||||
}
|
||||
|
||||
void ygv608_device::device_start()
|
||||
{
|
||||
memset(&m_ports, 0, sizeof(m_ports));
|
||||
memset(&m_regs, 0, sizeof(m_regs));
|
||||
memset(&m_pattern_name_table, 0, sizeof(m_pattern_name_table));
|
||||
memset(&m_sprite_attribute_table, 0, sizeof(m_sprite_attribute_table));
|
||||
|
||||
memset(&m_scroll_data_table, 0, sizeof(m_scroll_data_table));
|
||||
memset(&m_colour_palette, 0, sizeof(m_colour_palette));
|
||||
|
||||
m_bits16 = 0;
|
||||
m_page_x = 0;
|
||||
m_page_y = 0;
|
||||
m_pny_shift = 0;
|
||||
m_na8_mask = 0;
|
||||
m_col_shift = 0;
|
||||
|
||||
m_ax = 0; m_dx = 0; m_dxy = 0; m_ay = 0; m_dy = 0; m_dyx = 0;
|
||||
|
||||
memset(&m_base_addr, 0, sizeof(m_base_addr));
|
||||
m_base_y_shift = 0;
|
||||
|
||||
// flag rebuild of the tilemaps
|
||||
m_screen_resize = 1;
|
||||
m_tilemap_resize = 1;
|
||||
m_namcond1_gfxbank = 0;
|
||||
save_item(NAME(m_namcond1_gfxbank));
|
||||
|
||||
/* create tilemaps of all sizes and combinations */
|
||||
m_tilemap_A_cache_8[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 32,32);
|
||||
m_tilemap_A_cache_8[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 64,32);
|
||||
m_tilemap_A_cache_8[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 32,64);
|
||||
|
||||
m_tilemap_A_cache_16[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 32,32);
|
||||
m_tilemap_A_cache_16[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 64,32);
|
||||
m_tilemap_A_cache_16[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_A_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 32,64);
|
||||
|
||||
m_tilemap_B_cache_8[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 32,32);
|
||||
m_tilemap_B_cache_8[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 64,32);
|
||||
m_tilemap_B_cache_8[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_8),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 8,8, 32,64);
|
||||
|
||||
m_tilemap_B_cache_16[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 32,32);
|
||||
m_tilemap_B_cache_16[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 64,32);
|
||||
m_tilemap_B_cache_16[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(ygv608_device::get_tile_info_B_16),this), tilemap_mapper_delegate(FUNC(ygv608_device::get_tile_offset),this), 16,16, 32,64);
|
||||
|
||||
m_tilemap_A = nullptr;
|
||||
m_tilemap_B = nullptr;
|
||||
|
||||
register_state_save();
|
||||
}
|
||||
|
||||
void ygv608_device::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
@ -1361,11 +1406,12 @@ 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][p3_state_r];
|
||||
uint8_t res = m_colour_palette[m_regs.s.cc][m_color_state_r];
|
||||
|
||||
if( ++p3_state_r == 3 )
|
||||
if( ++m_color_state_r == 3 )
|
||||
{
|
||||
p3_state_r = 0;
|
||||
m_color_state_r = 0;
|
||||
|
||||
if( m_regs.s.r2 & r2_cpar)
|
||||
m_regs.s.cc++;
|
||||
}
|
||||
@ -1376,26 +1422,37 @@ READ8_MEMBER( ygv608_device::palette_data_r )
|
||||
// P#4R - register data port
|
||||
READ8_MEMBER(ygv608_device::register_data_r)
|
||||
{
|
||||
uint8_t regNum = (m_ports.s.p5) & p5_rn;
|
||||
int regNum = m_register_address & 0x3f;
|
||||
uint8_t res = m_regs.b[regNum];
|
||||
|
||||
if (m_ports.s.p5 & p5_rrai)
|
||||
//m_iospace->read_byte(regNum);
|
||||
|
||||
|
||||
if (m_register_autoinc_r == true)
|
||||
{
|
||||
regNum ++;
|
||||
m_register_address ++;
|
||||
m_register_address &= 0x3f;
|
||||
#if 0
|
||||
// we'll catch this in the logerror anyway
|
||||
if (regNum == 50)
|
||||
{
|
||||
regNum = 0;
|
||||
logerror( "warning: rn=50 after read increment\n" );
|
||||
}
|
||||
|
||||
m_ports.s.p5 &= ~p5_rn;
|
||||
m_ports.s.p5 |= regNum;
|
||||
#endif
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// P#6R - status port
|
||||
/***
|
||||
* ---x ---- FP Specified display position flag (R#15 & 16), reset by writing '1'
|
||||
* ---- x--- FV Vertical border interval start, reset by writing '1'
|
||||
* ---- -x-- FC Sprite collision flag, reset by writing '1'
|
||||
* ---- --x- HB 1 when horizontal border or retrace is in progress (read only)
|
||||
* ---- ---x VB 1 when vertical border or retrace is in progress (read only)
|
||||
***/
|
||||
READ8_MEMBER( ygv608_device::status_port_r )
|
||||
{
|
||||
return (uint8_t)(m_ports.b[6]);
|
||||
@ -1518,10 +1575,10 @@ 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][p3_state_w] = data;
|
||||
if (++p3_state_w == 3)
|
||||
m_colour_palette[m_regs.s.cc][m_color_state_w] = data;
|
||||
if (++m_color_state_w == 3)
|
||||
{
|
||||
p3_state_w = 0;
|
||||
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] ),
|
||||
@ -1535,32 +1592,36 @@ WRITE8_MEMBER( ygv608_device::palette_data_w )
|
||||
// P#4W - register data port
|
||||
WRITE8_MEMBER( ygv608_device::register_data_w )
|
||||
{
|
||||
uint8_t regNum = (m_ports.s.p5) & p5_rn;
|
||||
uint8_t regNum = m_register_address & 0x3f;
|
||||
//logerror( "R#%d = $%02X\n", regNum, data );
|
||||
|
||||
SetPreShortcuts (regNum, data);
|
||||
m_regs.b[regNum] = data;
|
||||
SetPostShortcuts (regNum);
|
||||
m_iospace->write_byte(regNum, data);
|
||||
|
||||
if (m_ports.s.p5 & p5_rwai)
|
||||
if (m_register_autoinc_w == true)
|
||||
{
|
||||
regNum ++;
|
||||
m_register_address ++;
|
||||
m_register_address &= 0x3f;
|
||||
|
||||
#if 0
|
||||
// we'll catch this in the logerror anyway
|
||||
if (regNum == 50)
|
||||
{
|
||||
regNum = 0;
|
||||
logerror( "warning: rn=50 after write increment\n" );
|
||||
}
|
||||
|
||||
m_ports.s.p5 &= ~p5_rn;
|
||||
m_ports.s.p5 |= regNum;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// P#5W - register select port
|
||||
WRITE8_MEMBER( ygv608_device::register_select_w )
|
||||
{
|
||||
m_ports.b[5] = data;
|
||||
m_register_address = data & 0x3f;
|
||||
m_register_autoinc_r = BIT(data,6);
|
||||
m_register_autoinc_w = BIT(data,7);
|
||||
}
|
||||
|
||||
// P#6W - status port
|
||||
@ -1581,7 +1642,7 @@ WRITE8_MEMBER( ygv608_device::system_control_w )
|
||||
}
|
||||
|
||||
|
||||
|
||||
// TODO: actual timing of this
|
||||
void ygv608_device::HandleYGV608Reset()
|
||||
{
|
||||
int i;
|
||||
|
@ -11,7 +11,9 @@
|
||||
* - Mark McDougall
|
||||
*/
|
||||
|
||||
class ygv608_device : public device_t, public device_gfx_interface
|
||||
class ygv608_device : public device_t,
|
||||
public device_gfx_interface,
|
||||
public device_memory_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
@ -49,7 +51,11 @@ protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_IO) const override;
|
||||
|
||||
address_space *m_iospace;
|
||||
private:
|
||||
const address_space_config m_io_space_config;
|
||||
static constexpr unsigned SPRITE_ATTR_TABLE_SIZE = 256;
|
||||
|
||||
struct YGV_PORTS {
|
||||
@ -213,9 +219,14 @@ private:
|
||||
uint8_t m_tilemap_resize; // tilemap requires resize
|
||||
|
||||
/* These were statically allocated in the r/w routines, looks hackish? */
|
||||
int p0_state_r,p3_state_r;
|
||||
int p0_state_w,p3_state_w;
|
||||
int p0_state_r,m_color_state_r;
|
||||
int p0_state_w,m_color_state_w;
|
||||
int pattern_name_base_r,pattern_name_base_w; /* pattern name table base address */
|
||||
|
||||
// new variable handling starts here
|
||||
uint8_t m_register_address; /**< RN: Register address select */
|
||||
bool m_register_autoinc_r; /**< RRAI: Register address auto-increment on read */
|
||||
bool m_register_autoinc_w; /**< RWAI: Register address auto-increment on write */
|
||||
};
|
||||
|
||||
// device type definition
|
||||
|
Loading…
Reference in New Issue
Block a user