ygv608.cpp: converted ports to AM_DEVICE (nw)

This commit is contained in:
angelosa 2017-06-28 19:23:13 +02:00
parent 73c689e5e5
commit 12824956e9
3 changed files with 374 additions and 300 deletions

View File

@ -200,7 +200,7 @@ Some logic, resistors/caps/transistors, some connectors etc.
static ADDRESS_MAP_START( namcond1_map, AS_PROGRAM, 16, namcond1_state )
AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("shared_ram")
AM_RANGE(0x800000, 0x80000f) AM_DEVREADWRITE8("ygv608", ygv608_device, read, write, 0xff00)
AM_RANGE(0x800000, 0x80000f) AM_DEVICE8("ygv608", ygv608_device, port_map, 0xff00)
AM_RANGE(0xa00000, 0xa00fff) AM_DEVREADWRITE8("at28c16", at28c16_device, read, write, 0xff00)
#ifdef MAME_DEBUG
AM_RANGE(0xb00000, 0xb00001) AM_DEVREAD("ygv608", ygv608_device, debug_trigger_r)
@ -214,7 +214,7 @@ static ADDRESS_MAP_START( abcheck_map, AS_PROGRAM, 16, namcond1_state )
AM_RANGE(0x600000, 0x607fff) AM_RAM AM_SHARE("zpr1")
AM_RANGE(0x608000, 0x60ffff) AM_RAM AM_SHARE("zpr2")
AM_RANGE(0x780000, 0x780001) AM_READ(printer_r)
AM_RANGE(0x800000, 0x80000f) AM_DEVREADWRITE8("ygv608", ygv608_device, read, write, 0xff00)
AM_RANGE(0x800000, 0x80000f) AM_DEVICE8("ygv608", ygv608_device, port_map, 0xff00)
AM_RANGE(0xa00000, 0xa00fff) AM_DEVREADWRITE8("at28c16", at28c16_device, read, write, 0xff00)
#ifdef MAME_DEBUG
AM_RANGE(0xb00000, 0xb00001) AM_DEVREAD("ygv608", ygv608_device, debug_trigger_r)

View File

@ -29,6 +29,19 @@
* Scaling
* Split-screen scrolling by row (by column supported) (see test mode)
* Everything else! :)
*
* TODO (2017 edition):
* - move ports into device_address_map (done);
* - add registers into own space, improve naming and variable usage;
* - remove code repetition in tilemap drawing functions;
* - add crtc section;
* - fix garbage tiles in Mappy Arrange/Abnormal Check;
* - 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;
* - clean-ups & documentation;
*
*
*/
#include "emu.h"
@ -231,6 +244,24 @@ 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
/* text-layer characters */
static const uint32_t pts_4bits_layout_xoffset[64] =
@ -1208,324 +1239,349 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
return 0;
}
READ8_MEMBER( ygv608_device::read )
/***************************************
*
* Port Interface routines
*
****************************************/
// P#0R - pattern name table data port
READ8_MEMBER( ygv608_device::pattern_name_table_r )
{
int pn=0;
uint8_t data = 0;
int pn = 0;
uint8_t xTile = m_regs.s.r1 & r1_pnx;
uint8_t yTile = m_regs.s.r0 & r0_pny;
switch (offset)
switch (p0_state_r)
{
case 0x00: /* P#0 - pattern name table data port */
{
uint8_t xTile = m_regs.s.r1 & r1_pnx;
uint8_t yTile = m_regs.s.r0 & r0_pny;
case 0:
/* Are we reading from plane B? */
if (!((m_regs.s.r7 & r7_md) & MD_1PLANE) && (m_regs.s.r0 & r0_b_a))
pattern_name_base_r = ((m_page_y << m_pny_shift) << m_bits16);
switch (p0_state_r)
{
case 0:
/* Are we reading from plane B? */
if (!((m_regs.s.r7 & r7_md) & MD_1PLANE) && (m_regs.s.r0 & r0_b_a))
pattern_name_base_r = ((m_page_y << m_pny_shift) << m_bits16);
/* read character from ram */
pn = pattern_name_base_r + (((yTile << m_pny_shift) + xTile) << m_bits16);
break;
case 1:
/* read character from ram */
pn = pattern_name_base_r + (((yTile << m_pny_shift) + xTile) << m_bits16) + 1;
break;
}
if (pn > 4095)
{
logerror( "attempt (%d) to read pattern name %d\n"
"mode = %d, pgs = %d (%dx%d)\n"
"pattern_name_base_r = %d\n"
"pnx = %d, pny = %d, pny_shift = %d, bits16 = %d\n",
p0_state_r,
pn, m_regs.s.r7 & r7_md, m_regs.s.r8 & r8_pgs,
m_page_x, m_page_y,
pattern_name_base_r,
xTile, yTile, m_pny_shift,
m_bits16 );
pn = 0;
}
data = m_pattern_name_table[pn];
p0_state_r++;
if ((m_regs.s.r7 & r7_md) == MD_2PLANE_8BIT )
p0_state_r++;
if (p0_state_r == 2)
{
if (m_regs.s.r0 & r0_pnya)
{
if (yTile++ == (m_page_y - 1))
{
yTile = 0;
if (xTile++ == (m_page_x - 1))
{
xTile = 0;
// we're now off this tile plane, toggle planes
m_regs.s.r0 ^= r0_b_a;
}
}
m_regs.s.r0 &= ~r0_pny;
m_regs.s.r0 |= yTile;
m_regs.s.r1 &= ~r1_pnx;
m_regs.s.r1 |= xTile;
}
else if (m_regs.s.r1 & r1_pnxa)
{
if (xTile++ == (m_page_x - 1))
{
xTile = 0;
if (yTile++ == (m_page_y - 1))
{
yTile = 0;
// we're now off this tile plane, toggle planes
m_regs.s.r0 ^= r0_b_a;
}
}
m_regs.s.r0 &= ~r0_pny;
m_regs.s.r0 |= yTile;
m_regs.s.r1 &= ~r1_pnx;
m_regs.s.r1 |= xTile;
}
p0_state_r = 0;
pattern_name_base_r = 0;
}
return (data);
}
case 0x01: /* P#1 - sprite data port */
data = m_sprite_attribute_table.b[m_regs.s.saa];
if (m_regs.s.r2 & r2_saar)
m_regs.s.saa++;
return (data);
case 0x02: /* P#2 - scroll data port */
data = m_scroll_data_table[(m_regs.s.r2 & r2_b_a) >> 4][m_regs.s.sca];
if (m_regs.s.r2 & r2_scar)
{
m_regs.s.sca++;
/* handle wrap to next plane */
if (m_regs.s.sca == 0)
m_regs.s.r2 ^= r2_b_a;
}
return( data );
case 0x03: /* P#3 - color palette data port */
data = m_colour_palette[m_regs.s.cc][p3_state_r];
if( ++p3_state_r == 3 )
{
p3_state_r = 0;
if( m_regs.s.r2 & r2_cpar)
m_regs.s.cc++;
}
return( data );
case 0x04: /* P#4 - register data port */
{
uint8_t regNum = (m_ports.s.p5) & p5_rn;
data = m_regs.b[regNum];
if (m_ports.s.p5 & p5_rrai)
{
regNum ++;
if (regNum == 50)
{
regNum = 0;
logerror( "warning: rn=50 after read increment\n" );
}
m_ports.s.p5 &= ~p5_rn;
m_ports.s.p5 |= regNum;
}
return (data );
}
case 0x05:
/* read character from ram */
pn = pattern_name_base_r + (((yTile << m_pny_shift) + xTile) << m_bits16);
break;
case 0x06:
case 0x07:
return( (uint8_t)(m_ports.b[offset]) );
default :
logerror( "unknown ygv608 register (%d)\n", offset );
case 1:
/* read character from ram */
pn = pattern_name_base_r + (((yTile << m_pny_shift) + xTile) << m_bits16) + 1;
break;
}
return( 0 );
if (pn > 4095)
{
logerror( "attempt (%d) to read pattern name %d\n"
"mode = %d, pgs = %d (%dx%d)\n"
"pattern_name_base_r = %d\n"
"pnx = %d, pny = %d, pny_shift = %d, bits16 = %d\n",
p0_state_r,
pn, m_regs.s.r7 & r7_md, m_regs.s.r8 & r8_pgs,
m_page_x, m_page_y,
pattern_name_base_r,
xTile, yTile, m_pny_shift,
m_bits16 );
pn = 0;
}
p0_state_r++;
if ((m_regs.s.r7 & r7_md) == MD_2PLANE_8BIT )
p0_state_r++;
if (p0_state_r == 2)
{
if (m_regs.s.r0 & r0_pnya)
{
if (yTile++ == (m_page_y - 1))
{
yTile = 0;
if (xTile++ == (m_page_x - 1))
{
xTile = 0;
// we're now off this tile plane, toggle planes
m_regs.s.r0 ^= r0_b_a;
}
}
m_regs.s.r0 &= ~r0_pny;
m_regs.s.r0 |= yTile;
m_regs.s.r1 &= ~r1_pnx;
m_regs.s.r1 |= xTile;
}
else if (m_regs.s.r1 & r1_pnxa)
{
if (xTile++ == (m_page_x - 1))
{
xTile = 0;
if (yTile++ == (m_page_y - 1))
{
yTile = 0;
// we're now off this tile plane, toggle planes
m_regs.s.r0 ^= r0_b_a;
}
}
m_regs.s.r0 &= ~r0_pny;
m_regs.s.r0 |= yTile;
m_regs.s.r1 &= ~r1_pnx;
m_regs.s.r1 |= xTile;
}
p0_state_r = 0;
pattern_name_base_r = 0;
}
return m_pattern_name_table[pn];
}
WRITE8_MEMBER( ygv608_device::write )
// P#1R - sprite data port
READ8_MEMBER( ygv608_device::sprite_data_r )
{
int pn=0;
uint8_t res = m_sprite_attribute_table.b[m_regs.s.saa];
if (m_regs.s.r2 & r2_saar)
m_regs.s.saa++;
return res;
}
//data = ( data >> 8 ) & 0xff;
// 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];
switch (offset)
if (m_regs.s.r2 & r2_scar)
{
case 0x00: /* P#0 - pattern name table data port */
m_regs.s.sca++;
/* handle wrap to next plane */
if (m_regs.s.sca == 0)
m_regs.s.r2 ^= r2_b_a;
}
return res;
}
// 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];
if( ++p3_state_r == 3 )
{
p3_state_r = 0;
if( m_regs.s.r2 & r2_cpar)
m_regs.s.cc++;
}
return res;
}
// P#4R - register data port
READ8_MEMBER(ygv608_device::register_data_r)
{
uint8_t regNum = (m_ports.s.p5) & p5_rn;
uint8_t res = m_regs.b[regNum];
if (m_ports.s.p5 & p5_rrai)
{
regNum ++;
if (regNum == 50)
{
uint8_t xTile = m_regs.s.r1 & r1_pnx;
uint8_t yTile = m_regs.s.r0 & r0_pny;
switch (p0_state_w)
{
case 0:
/* Are we reading from plane B? */
if (!((m_regs.s.r7 & r7_md) & MD_1PLANE) && (m_regs.s.r0 & r0_b_a))
pattern_name_base_w = ((m_page_y << m_pny_shift) << m_bits16);
/* read character from ram */
pn = pattern_name_base_w + (((yTile << m_pny_shift) + xTile) << m_bits16);
break;
case 1:
/* read character from ram */
pn = pattern_name_base_w + (((yTile << m_pny_shift) + xTile) << m_bits16) + 1;
break;
}
if (pn > 4095)
{
logerror( "attempt (%d) to read pattern name %d\n"
"mode = %d, pgs = %d (%dx%d)\n"
"pattern_name_base_w = %d\n"
"pnx = %d, pny = %d, pny_shift = %d, bits16 = %d\n",
p0_state_w,
pn, m_regs.s.r7 & r7_md, m_regs.s.r8 & r8_pgs,
m_page_x, m_page_y,
pattern_name_base_w,
xTile, yTile, m_pny_shift,
m_bits16 );
pn = 0;
}
m_pattern_name_table[pn] = data;
p0_state_w++;
if ((m_regs.s.r7 & r7_md) == MD_2PLANE_8BIT )
p0_state_w++;
if (p0_state_w == 2)
{
if (m_regs.s.r0 & r0_pnya)
{
if (yTile++ == (m_page_y - 1))
{
yTile = 0;
if (xTile++ == (m_page_x - 1))
{
xTile = 0;
m_regs.s.r0 ^= r0_b_a;
}
}
m_regs.s.r0 &= ~r0_pny;
m_regs.s.r0 |= yTile;
m_regs.s.r1 &= ~r1_pnx;
m_regs.s.r1 |= xTile;
}
else if (m_regs.s.r1 & r1_pnxa)
{
if (xTile++ == (m_page_x - 1))
{
xTile = 0;
if (yTile++ == (m_page_y - 1))
{
yTile = 0;
m_regs.s.r0 ^= r0_b_a;
}
}
m_regs.s.r0 &= ~r0_pny;
m_regs.s.r0 |= yTile;
m_regs.s.r1 &= ~r1_pnx;
m_regs.s.r1 |= xTile;
}
p0_state_w = 0;
pattern_name_base_w = 0;
}
regNum = 0;
logerror( "warning: rn=50 after read increment\n" );
}
break;
m_ports.s.p5 &= ~p5_rn;
m_ports.s.p5 |= regNum;
}
return res;
}
case 0x01: /* P#1 - sprite data port */
m_sprite_attribute_table.b[m_regs.s.saa] = data;
if( m_regs.s.r2 & r2_saaw)
m_regs.s.saa++;
// P#6R - status port
READ8_MEMBER( ygv608_device::status_port_r )
{
return (uint8_t)(m_ports.b[6]);
}
// P#7R - system control port
READ8_MEMBER( ygv608_device::system_control_r )
{
return (uint8_t)(m_ports.b[7]);
}
// P#0W - pattern name table data write
WRITE8_MEMBER(ygv608_device::pattern_name_table_w)
{
int pn = 0;
uint8_t xTile = m_regs.s.r1 & r1_pnx;
uint8_t yTile = m_regs.s.r0 & r0_pny;
switch (p0_state_w)
{
case 0:
/* Are we reading from plane B? */
if (!((m_regs.s.r7 & r7_md) & MD_1PLANE) && (m_regs.s.r0 & r0_b_a))
pattern_name_base_w = ((m_page_y << m_pny_shift) << m_bits16);
/* read character from ram */
pn = pattern_name_base_w + (((yTile << m_pny_shift) + xTile) << m_bits16);
break;
case 0x02: /* P#2 - scroll data port */
m_scroll_data_table[(m_regs.s.r2 & r2_b_a) >> 4][m_regs.s.sca] = data;
if (m_regs.s.r2 & r2_scaw)
{
m_regs.s.sca++;
/* handle wrap to next plane */
if (m_regs.s.sca == 0)
m_regs.s.r2 ^= r2_b_a;
}
break;
case 0x03: /* P#3 - colour palette data port */
m_colour_palette[m_regs.s.cc][p3_state_w] = data;
if (++p3_state_w == 3)
{
p3_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]) );
if (m_regs.s.r2 & r2_cpaw)
m_regs.s.cc++;
}
break;
case 0x04: /* P#4 - register data port */
{
uint8_t regNum = (m_ports.s.p5) & p5_rn;
#if 0
logerror( "R#%d = $%02X\n", regNum, data );
#endif
SetPreShortcuts (regNum, data);
m_regs.b[regNum] = data;
SetPostShortcuts (regNum);
if (m_ports.s.p5 & p5_rwai)
{
regNum ++;
if (regNum == 50)
{
regNum = 0;
logerror( "warning: rn=50 after write increment\n" );
}
m_ports.s.p5 &= ~p5_rn;
m_ports.s.p5 |= regNum;
}
}
break;
case 0x05: /* P#5 - register select port */
m_ports.b[5] = data;
break;
case 0x06: /* P#6 - status port */
/* writing a '1' resets that bit */
m_ports.b[6] &= ~data;
break;
case 0x07: /* P#7 - system control port */
m_ports.b[7] = data;
if (m_ports.b[7] & 0x3e)
HandleRomTransfers();
if (m_ports.b[7] & 0x01)
HandleYGV608Reset();
break;
default:
logerror( "unknown ygv608 register (%d)\n", offset );
case 1:
/* read character from ram */
pn = pattern_name_base_w + (((yTile << m_pny_shift) + xTile) << m_bits16) + 1;
break;
}
if (pn > 4095)
{
logerror( "attempt (%d) to read pattern name %d\n"
"mode = %d, pgs = %d (%dx%d)\n"
"pattern_name_base_w = %d\n"
"pnx = %d, pny = %d, pny_shift = %d, bits16 = %d\n",
p0_state_w,
pn, m_regs.s.r7 & r7_md, m_regs.s.r8 & r8_pgs,
m_page_x, m_page_y,
pattern_name_base_w,
xTile, yTile, m_pny_shift,
m_bits16 );
pn = 0;
}
m_pattern_name_table[pn] = data;
p0_state_w++;
if ((m_regs.s.r7 & r7_md) == MD_2PLANE_8BIT )
p0_state_w++;
if (p0_state_w == 2)
{
if (m_regs.s.r0 & r0_pnya)
{
if (yTile++ == (m_page_y - 1))
{
yTile = 0;
if (xTile++ == (m_page_x - 1))
{
xTile = 0;
m_regs.s.r0 ^= r0_b_a;
}
}
m_regs.s.r0 &= ~r0_pny;
m_regs.s.r0 |= yTile;
m_regs.s.r1 &= ~r1_pnx;
m_regs.s.r1 |= xTile;
}
else if (m_regs.s.r1 & r1_pnxa)
{
if (xTile++ == (m_page_x - 1))
{
xTile = 0;
if (yTile++ == (m_page_y - 1))
{
yTile = 0;
m_regs.s.r0 ^= r0_b_a;
}
}
m_regs.s.r0 &= ~r0_pny;
m_regs.s.r0 |= yTile;
m_regs.s.r1 &= ~r1_pnx;
m_regs.s.r1 |= xTile;
}
p0_state_w = 0;
pattern_name_base_w = 0;
}
}
// P#1W - sprite data port
WRITE8_MEMBER( ygv608_device::sprite_data_w )
{
m_sprite_attribute_table.b[m_regs.s.saa] = data;
if( m_regs.s.r2 & r2_saaw)
m_regs.s.saa++;
}
// 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;
if (m_regs.s.r2 & r2_scaw)
{
m_regs.s.sca++;
/* handle wrap to next plane */
if (m_regs.s.sca == 0)
m_regs.s.r2 ^= r2_b_a;
}
}
// 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)
{
p3_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] ));
if (m_regs.s.r2 & r2_cpaw)
m_regs.s.cc++;
}
}
// P#4W - register data port
WRITE8_MEMBER( ygv608_device::register_data_w )
{
uint8_t regNum = (m_ports.s.p5) & p5_rn;
//logerror( "R#%d = $%02X\n", regNum, data );
SetPreShortcuts (regNum, data);
m_regs.b[regNum] = data;
SetPostShortcuts (regNum);
if (m_ports.s.p5 & p5_rwai)
{
regNum ++;
if (regNum == 50)
{
regNum = 0;
logerror( "warning: rn=50 after write increment\n" );
}
m_ports.s.p5 &= ~p5_rn;
m_ports.s.p5 |= regNum;
}
}
// P#5W - register select port
WRITE8_MEMBER( ygv608_device::register_select_w )
{
m_ports.b[5] = data;
}
// P#6W - status port
WRITE8_MEMBER( ygv608_device::status_port_w )
{
/* writing a '1' resets that bit */
m_ports.b[6] &= ~data;
}
// P#7W - system control port
WRITE8_MEMBER( ygv608_device::system_control_w )
{
m_ports.b[7] = data;
if (m_ports.b[7] & 0x3e)
HandleRomTransfers(data & 0x3e);
if (m_ports.b[7] & 0x01)
HandleYGV608Reset();
}
void ygv608_device::HandleYGV608Reset()
{
int i;
@ -1558,8 +1614,10 @@ void ygv608_device::HandleYGV608Reset()
- So leave it in!
*/
void ygv608_device::HandleRomTransfers()
void ygv608_device::HandleRomTransfers(uint8_t type)
{
popmessage("ROM DMA used %02x",type);
#if 0
static uint8_t *sdt = (uint8_t *)m_scroll_data_table;
static uint8_t *sat = (uint8_t *)m_sprite_attribute_table.b;

View File

@ -17,10 +17,26 @@ public:
// construction/destruction
ygv608_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_WRITE8_MEMBER( write );
DECLARE_READ8_MEMBER( read );
DECLARE_ADDRESS_MAP(port_map, 8);
DECLARE_READ8_MEMBER(pattern_name_table_r);
DECLARE_READ8_MEMBER(sprite_data_r);
DECLARE_READ8_MEMBER(scroll_data_r);
DECLARE_READ8_MEMBER(palette_data_r);
DECLARE_READ8_MEMBER(register_data_r);
// DECLARE_READ8_MEMBER(register_select_r);
DECLARE_READ8_MEMBER(status_port_r);
DECLARE_READ8_MEMBER(system_control_r);
DECLARE_WRITE8_MEMBER(pattern_name_table_w);
DECLARE_WRITE8_MEMBER(sprite_data_w);
DECLARE_WRITE8_MEMBER(scroll_data_w);
DECLARE_WRITE8_MEMBER(palette_data_w);
DECLARE_WRITE8_MEMBER(register_data_w);
DECLARE_WRITE8_MEMBER(register_select_w);
DECLARE_WRITE8_MEMBER(status_port_w);
DECLARE_WRITE8_MEMBER(system_control_w);
// TODO: is this even a real connection?
void set_gfxbank(uint8_t gfxbank);
uint32_t update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -147,7 +163,7 @@ private:
bitmap_ind16 m_work_bitmap;
void HandleYGV608Reset();
void HandleRomTransfers();
void HandleRomTransfers(uint8_t type);
void SetPreShortcuts(int reg, int data );
void SetPostShortcuts(int reg);
void ShowYGV608Registers();