mos6560: Refactored interface to use devcb. (nw)

This commit is contained in:
Curt Coder 2012-09-05 16:25:28 +00:00
parent 6fbb9a73e0
commit c99cbedd35
5 changed files with 150 additions and 179 deletions

View File

@ -92,17 +92,17 @@ struct _mos6560_state
int total_xsize, total_ysize, total_lines, total_vretracerate;
/* DMA */
mos6560_dma_read dma_read;
mos6560_dma_read_color dma_read_color;
devcb_resolved_read8 dma_read;
devcb_resolved_read8 dma_read_color;
UINT8 last_data;
/* lightpen */
mos6560_lightpen_button_callback lightpen_button_cb;
mos6560_lightpen_x_callback lightpen_x_cb;
mos6560_lightpen_y_callback lightpen_y_cb;
devcb_resolved_read8 lightpen_button_cb;
devcb_resolved_read8 lightpen_x_cb;
devcb_resolved_read8 lightpen_y_cb;
/* paddles */
mos6560_paddle_callback paddle_cb[2];
devcb_resolved_read8 paddle_cb[2];
/* sound part */
int tone1pos, tone2pos, tone3pos,
@ -154,9 +154,9 @@ INLINE const mos6560_interface *get_interface( device_t *device )
/* 2008-05 FP: lightpen code needs to read input port from vc20.c */
#define LIGHTPEN_BUTTON ((mos6560->lightpen_button_cb != NULL) ? mos6560->lightpen_button_cb(device->machine()) : 0)
#define LIGHTPEN_X_VALUE ((mos6560->lightpen_x_cb != NULL) ? mos6560->lightpen_x_cb(device->machine()) : 0)
#define LIGHTPEN_Y_VALUE ((mos6560->lightpen_y_cb != NULL) ? mos6560->lightpen_y_cb(device->machine()) : 0)
#define LIGHTPEN_BUTTON ((!mos6560->lightpen_button_cb.isnull()) ? mos6560->lightpen_button_cb(0) : 0)
#define LIGHTPEN_X_VALUE ((!mos6560->lightpen_x_cb.isnull()) ? mos6560->lightpen_x_cb(0) : 0)
#define LIGHTPEN_Y_VALUE ((!mos6560->lightpen_y_cb.isnull()) ? mos6560->lightpen_y_cb(0) : 0)
/* lightpen delivers values from internal counters
* they do not start with the visual area or frame area */
@ -198,6 +198,37 @@ INLINE const mos6560_interface *get_interface( device_t *device )
#define BACKGROUNDCOLOR (mos6560->reg[0x0f] >> 4)
#define FRAMECOLOR (mos6560->reg[0x0f] & 0x07)
static const rgb_t PALETTE[] =
{
/* ripped from vice, a very excellent emulator */
MAKE_RGB(0x00, 0x00, 0x00),
MAKE_RGB(0xff, 0xff, 0xff),
MAKE_RGB(0xf0, 0x00, 0x00),
MAKE_RGB(0x00, 0xf0, 0xf0),
MAKE_RGB(0x60, 0x00, 0x60),
MAKE_RGB(0x00, 0xa0, 0x00),
MAKE_RGB(0x00, 0x00, 0xf0),
MAKE_RGB(0xd0, 0xd0, 0x00),
MAKE_RGB(0xc0, 0xa0, 0x00),
MAKE_RGB(0xff, 0xa0, 0x00),
MAKE_RGB(0xf0, 0x80, 0x80),
MAKE_RGB(0x00, 0xff, 0xff),
MAKE_RGB(0xff, 0x00, 0xff),
MAKE_RGB(0x00, 0xff, 0x00),
MAKE_RGB(0x00, 0xa0, 0xff),
MAKE_RGB(0xff, 0xff, 0x00)
};
PALETTE_INIT( mos6560 )
{
palette_set_colors(machine, 0, PALETTE, ARRAY_LENGTH(PALETTE));
}
/*****************************************************************************
IMPLEMENTATION
*****************************************************************************/
@ -215,7 +246,7 @@ static void mos6560_draw_character( device_t *device, int ybegin, int yend, int
for (y = ybegin; y <= yend; y++)
{
code = mos6560->dma_read(device->machine(), (mos6560->chargenaddr + ch * mos6560->charheight + y) & 0x3fff);
code = mos6560->dma_read((mos6560->chargenaddr + ch * mos6560->charheight + y) & 0x3fff);
mos6560->last_data = code;
mos6560->bitmap->pix16(y + yoff, xoff + 0) = color[code >> 7];
mos6560->bitmap->pix16(y + yoff, xoff + 1) = color[(code >> 6) & 1];
@ -240,7 +271,7 @@ static void mos6560_draw_character_multi( device_t *device, int ybegin, int yend
for (y = ybegin; y <= yend; y++)
{
code = mos6560->dma_read(device->machine(), (mos6560->chargenaddr + ch * mos6560->charheight + y) & 0x3fff);
code = mos6560->dma_read((mos6560->chargenaddr + ch * mos6560->charheight + y) & 0x3fff);
mos6560->last_data = code;
mos6560->bitmap->pix16(y + yoff, xoff + 0) =
mos6560->bitmap->pix16(y + yoff, xoff + 1) = color[code >> 6];
@ -301,9 +332,9 @@ static void mos6560_drawlines( device_t *device, int first, int last )
for (xoff = mos6560->xpos; (xoff < mos6560->xpos + mos6560->xsize) && (xoff < mos6560->total_xsize); xoff += 8, offs++)
{
ch = mos6560->dma_read(device->machine(), (mos6560->videoaddr + offs) & 0x3fff);
ch = mos6560->dma_read((mos6560->videoaddr + offs) & 0x3fff);
mos6560->last_data = ch;
attr = (mos6560->dma_read_color(device->machine(), (mos6560->videoaddr + offs) & 0x3fff)) & 0xf;
attr = (mos6560->dma_read_color((mos6560->videoaddr + offs) & 0x3fff)) & 0xf;
if (mos6560->type == MOS6560_ATTACKUFO)
{
@ -479,7 +510,7 @@ READ8_DEVICE_HANDLER( mos6560_port_r )
break;
case 8: /* poti 1 */
case 9: /* poti 2 */
val = (mos6560->paddle_cb != NULL) ? mos6560->paddle_cb[offset - 8](device->machine()) : mos6560->reg[offset];
val = (!mos6560->paddle_cb->isnull()) ? mos6560->paddle_cb[offset - 8](0) : mos6560->reg[offset];
break;
default:
val = mos6560->reg[offset];
@ -489,9 +520,9 @@ READ8_DEVICE_HANDLER( mos6560_port_r )
return val;
}
UINT8 mos6560_bus_r( device_t *device )
UINT8 mos6560_device::bus_r()
{
mos6560_state *mos6560 = get_safe_token(device);
mos6560_state *mos6560 = get_safe_token(this);
return mos6560->last_data;
}
@ -527,6 +558,11 @@ UINT32 mos6560_video_update( device_t *device, bitmap_ind16 &bitmap, const recta
return 0;
}
UINT32 mos6560_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
return mos6560_video_update(this, bitmap, cliprect);
}
/*****************************************************************************
SOUND IMPLEMENTATION
*****************************************************************************/
@ -820,18 +856,14 @@ static DEVICE_START( mos6560 )
mos6560->bitmap = auto_bitmap_ind16_alloc(device->machine(), width, height);
assert(intf->dma_read != NULL);
assert(intf->dma_read_color != NULL);
mos6560->dma_read = intf->dma_read;
mos6560->dma_read_color = intf->dma_read_color;
mos6560->lightpen_button_cb = intf->button_cb;
mos6560->lightpen_x_cb = intf->x_cb;
mos6560->lightpen_y_cb = intf->y_cb;
mos6560->paddle_cb[0] = intf->paddle0_cb;
mos6560->paddle_cb[1] = intf->paddle1_cb;
// resolve callbacks
mos6560->dma_read.resolve(intf->dma_read, *device);
mos6560->dma_read_color.resolve(intf->dma_read_color, *device);
mos6560->lightpen_button_cb.resolve(intf->button_cb, *device);
mos6560->lightpen_x_cb.resolve(intf->x_cb, *device);
mos6560->lightpen_y_cb.resolve(intf->y_cb, *device);
mos6560->paddle_cb[0].resolve(intf->paddle0_cb, *device);
mos6560->paddle_cb[1].resolve(intf->paddle1_cb, *device);
switch (mos6560->type)
{

View File

@ -15,15 +15,6 @@
TYPE DEFINITIONS
***************************************************************************/
typedef UINT8 (*mos6560_lightpen_x_callback)(running_machine &machine);
typedef UINT8 (*mos6560_lightpen_y_callback)(running_machine &machine);
typedef UINT8 (*mos6560_lightpen_button_callback)(running_machine &machine);
typedef UINT8 (*mos6560_paddle_callback)(running_machine &machine);
typedef int (*mos6560_dma_read)(running_machine &machine, int);
typedef int (*mos6560_dma_read_color)(running_machine &machine, int);
typedef enum
{
MOS6560_ATTACKUFO, // this is a 6560VIC derivative, missing some of the features
@ -38,14 +29,14 @@ struct _mos6560_interface
mos6560_type type;
mos6560_lightpen_x_callback x_cb;
mos6560_lightpen_y_callback y_cb;
mos6560_lightpen_button_callback button_cb;
devcb_read8 x_cb;
devcb_read8 y_cb;
devcb_read8 button_cb;
mos6560_paddle_callback paddle0_cb, paddle1_cb;
devcb_read8 paddle0_cb, paddle1_cb;
mos6560_dma_read dma_read;
mos6560_dma_read_color dma_read_color;
devcb_read8 dma_read;
devcb_read8 dma_read_color;
};
/***************************************************************************
@ -97,6 +88,11 @@ public:
// access to legacy token
void *token() const { assert(m_token != NULL); return m_token; }
UINT8 bus_r();
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
// device-level overrides
virtual void device_config_complete();
@ -121,6 +117,29 @@ extern const device_type MOS656X;
MCFG_SOUND_ADD(_tag, MOS656X, 0) \
MCFG_DEVICE_CONFIG(_interface)
#define MCFG_MOS6560_ADD(_tag, _screen_tag, _clock, _config) \
MCFG_SCREEN_ADD(_screen_tag, RASTER) \
MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE) \
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) \
MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE) \
MCFG_SCREEN_VISIBLE_AREA(MOS6560_MAME_XPOS, MOS6560_MAME_XPOS + MOS6560_MAME_XSIZE - 1, MOS6560_MAME_YPOS, MOS6560_MAME_YPOS + MOS6560_MAME_YSIZE - 1) \
MCFG_SCREEN_UPDATE_DEVICE(_tag, mos6560_device, screen_update) \
MCFG_PALETTE_LENGTH(16) \
MCFG_PALETTE_INIT(mos6560) \
MCFG_SOUND_ADD(_tag, MOS656X, _clock) \
MCFG_DEVICE_CONFIG(_config)
#define MCFG_MOS6561_ADD(_tag, _screen_tag, _clock, _config) \
MCFG_SCREEN_ADD(_screen_tag, RASTER) \
MCFG_SCREEN_REFRESH_RATE(MOS6561_VRETRACERATE) \
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) \
MCFG_SCREEN_SIZE((MOS6561_XSIZE + 7) & ~7, MOS6561_YSIZE) \
MCFG_SCREEN_VISIBLE_AREA(MOS6561_MAME_XPOS, MOS6561_MAME_XPOS + MOS6561_MAME_XSIZE - 1, MOS6561_MAME_YPOS, MOS6561_MAME_YPOS + MOS6561_MAME_YSIZE - 1) \
MCFG_SCREEN_UPDATE_DEVICE(_tag, mos6560_device, screen_update) \
MCFG_PALETTE_LENGTH(16) \
MCFG_PALETTE_INIT(mos6560) \
MCFG_SOUND_ADD(_tag, MOS656X, _clock) \
MCFG_DEVICE_CONFIG(_config)
/***************************************************************************
I/O PROTOTYPES
@ -129,9 +148,9 @@ extern const device_type MOS656X;
WRITE8_DEVICE_HANDLER( mos6560_port_w );
READ8_DEVICE_HANDLER( mos6560_port_r );
UINT8 mos6560_bus_r( device_t *device );
void mos6560_raster_interrupt_gen( device_t *device );
UINT32 mos6560_video_update( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect );
extern PALETTE_INIT( mos6560 );
#endif /* __MOS6560_H__ */

View File

@ -66,40 +66,11 @@ public:
DECLARE_READ8_MEMBER(attckufo_io_r);
DECLARE_WRITE8_MEMBER(attckufo_io_w);
DECLARE_READ8_MEMBER(dma_read);
DECLARE_READ8_MEMBER(dma_read_color);
};
static const rgb_t attckufo_palette[] =
{
/* ripped from vice, a very excellent emulator */
MAKE_RGB(0x00, 0x00, 0x00),
MAKE_RGB(0xff, 0xff, 0xff),
MAKE_RGB(0xf0, 0x00, 0x00),
MAKE_RGB(0x00, 0xf0, 0xf0),
MAKE_RGB(0x60, 0x00, 0x60),
MAKE_RGB(0x00, 0xa0, 0x00),
MAKE_RGB(0x00, 0x00, 0xf0),
MAKE_RGB(0xd0, 0xd0, 0x00),
MAKE_RGB(0xc0, 0xa0, 0x00),
MAKE_RGB(0xff, 0xa0, 0x00),
MAKE_RGB(0xf0, 0x80, 0x80),
MAKE_RGB(0x00, 0xff, 0xff),
MAKE_RGB(0xff, 0x00, 0xff),
MAKE_RGB(0x00, 0xff, 0x00),
MAKE_RGB(0x00, 0xa0, 0xff),
MAKE_RGB(0xff, 0xff, 0x00)
};
static PALETTE_INIT( attckufo )
{
palette_set_colors(machine, 0, attckufo_palette, ARRAY_LENGTH(attckufo_palette));
}
READ8_MEMBER(attckufo_state::attckufo_io_r)
{
switch(offset)
@ -172,25 +143,24 @@ static SCREEN_UPDATE_IND16( attckufo )
return 0;
}
static int attckufo_dma_read( running_machine &machine, int offset )
READ8_MEMBER(attckufo_state::dma_read)
{
attckufo_state *state = machine.driver_data<attckufo_state>();
return state->m_maincpu->space(AS_PROGRAM)->read_byte(offset);
return m_maincpu->space(AS_PROGRAM)->read_byte(offset);
}
static int attckufo_dma_read_color( running_machine &machine, int offset )
READ8_MEMBER(attckufo_state::dma_read_color)
{
attckufo_state *state = machine.driver_data<attckufo_state>();
return state->m_maincpu->space(AS_PROGRAM)->read_byte(offset + 0x400);
return m_maincpu->space(AS_PROGRAM)->read_byte(offset + 0x400);
}
static const mos6560_interface attckufo_6560_intf =
{
"screen", /* screen */
MOS6560_ATTACKUFO,
NULL, NULL, NULL, /* lightgun cb */
NULL, NULL, /* paddle cb */
attckufo_dma_read, attckufo_dma_read_color /* DMA */
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /* lightgun cb */
DEVCB_NULL, DEVCB_NULL, /* paddle cb */
DEVCB_DRIVER_MEMBER(attckufo_state, dma_read),
DEVCB_DRIVER_MEMBER(attckufo_state, dma_read_color) /* DMA */
};
@ -209,8 +179,8 @@ static MACHINE_CONFIG_START( attckufo, attckufo_state )
MCFG_SCREEN_VISIBLE_AREA(0, 23*8 - 1, 0, 22*8 - 1)
MCFG_SCREEN_UPDATE_STATIC(attckufo)
MCFG_PALETTE_LENGTH(ARRAY_LENGTH(attckufo_palette))
MCFG_PALETTE_INIT(attckufo)
MCFG_PALETTE_LENGTH(16)
MCFG_PALETTE_INIT(mos6560)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -123,7 +123,7 @@ enum
READ8_MEMBER( vic20_state::read )
{
UINT8 data = mos6560_bus_r(m_vic);
UINT8 data = m_vic->bus_r();
int ram1 = 1, ram2 = 1, ram3 = 1;
int blk1 = 1, blk2 = 1, blk3 = 1, blk5 = 1;
@ -250,7 +250,7 @@ WRITE8_MEMBER( vic20_state::write )
break;
case COLOR:
m_color_ram[offset & 0x3ff] = data;
m_color_ram[offset & 0x3ff] = data & 0x0f;
break;
case IO2: io2 = 0; break;
@ -270,36 +270,6 @@ WRITE8_MEMBER( vic20_state::write )
// VIDEO
//**************************************************************************
static const unsigned char mos6560_palette[] =
{
// ripped from vice, a very excellent emulator
// black, white, red, cyan
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf0,
// purple, green, blue, yellow
0x60, 0x00, 0x60, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xf0, 0xd0, 0xd0, 0x00,
// orange, light orange, pink, light cyan,
0xc0, 0xa0, 0x00, 0xff, 0xa0, 0x00, 0xf0, 0x80, 0x80, 0x00, 0xff, 0xff,
// light violett, light green, light blue, light yellow
0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xa0, 0xff, 0xff, 0xff, 0x00
};
static PALETTE_INIT( vic20 )
{
int i;
for (i = 0; i < sizeof(mos6560_palette) / 3; i++)
{
palette_set_color_rgb(machine, i, mos6560_palette[i * 3], mos6560_palette[i * 3 + 1], mos6560_palette[i * 3 + 2]);
}
}
static SCREEN_UPDATE_IND16( vic20 )
{
vic20_state *state = screen.machine().driver_data<vic20_state>();
mos6560_video_update(state->m_vic, bitmap, cliprect);
return 0;
}
static INTERRUPT_GEN( vic20_raster_interrupt )
{
vic20_state *state = device->machine().driver_data<vic20_state>();
@ -644,52 +614,44 @@ static CBM_IEC_INTERFACE( cbm_iec_intf )
#define VC20ADDR2MOS6560ADDR(a) (((a) > 0x8000) ? ((a) & 0x1fff) : ((a) | 0x2000))
#define MOS6560ADDR2VC20ADDR(a) (((a) > 0x2000) ? ((a) & 0x1fff) : ((a) | 0x8000))
static int vic20_dma_read_color( running_machine &machine, int offset )
READ8_MEMBER( vic20_state::vic_dma_read_color )
{
vic20_state *state = machine.driver_data<vic20_state>();
return state->m_color_ram[offset & 0x3ff];
return m_color_ram[offset & 0x3ff];
}
static int vic20_dma_read( running_machine &machine, int offset )
READ8_MEMBER( vic20_state::vic_dma_read )
{
address_space *program = machine.device(M6502_TAG)->memory().space(AS_PROGRAM);
address_space *program = m_maincpu->memory().space(AS_PROGRAM);
return program->read_byte(MOS6560ADDR2VC20ADDR(offset));
}
static UINT8 vic20_lightx_cb( running_machine &machine )
READ8_MEMBER( vic20_state::vic_lightx_cb )
{
return (machine.root_device().ioport("LIGHTX")->read_safe(0) & ~0x01);
return (ioport("LIGHTX")->read_safe(0) & ~0x01);
}
static UINT8 vic20_lighty_cb( running_machine &machine )
READ8_MEMBER( vic20_state::vic_lighty_cb )
{
return (machine.root_device().ioport("LIGHTY")->read_safe(0) & ~0x01);
return (ioport("LIGHTY")->read_safe(0) & ~0x01);
}
static UINT8 vic20_lightbut_cb( running_machine &machine )
READ8_MEMBER( vic20_state::vic_lightbut_cb )
{
return (((machine.root_device().ioport("CTRLSEL")->read() & 0xf0) == 0x20) && (machine.root_device().ioport("JOY")->read() & 0x40));
}
static UINT8 vic20_paddle0_cb( running_machine &machine )
{
return machine.root_device().ioport("PADDLE0")->read();
}
static UINT8 vic20_paddle1_cb( running_machine &machine )
{
return machine.root_device().ioport("PADDLE1")->read();
return (((ioport("CTRLSEL")->read() & 0xf0) == 0x20) && (ioport("JOY")->read() & 0x40));
}
static const mos6560_interface vic_ntsc_intf =
{
SCREEN_TAG,
MOS6560,
vic20_lightx_cb, vic20_lighty_cb, vic20_lightbut_cb, // lightgun cb
vic20_paddle0_cb, vic20_paddle1_cb, // paddle cb
vic20_dma_read, vic20_dma_read_color // DMA
DEVCB_DRIVER_MEMBER(vic20_state, vic_lightx_cb),
DEVCB_DRIVER_MEMBER(vic20_state, vic_lighty_cb),
DEVCB_DRIVER_MEMBER(vic20_state, vic_lightbut_cb),
DEVCB_INPUT_PORT("PADDLE0"),
DEVCB_INPUT_PORT("PADDLE1"),
DEVCB_DRIVER_MEMBER(vic20_state, vic_dma_read),
DEVCB_DRIVER_MEMBER(vic20_state, vic_dma_read_color)
};
@ -701,9 +663,13 @@ static const mos6560_interface vic_pal_intf =
{
SCREEN_TAG,
MOS6561,
vic20_lightx_cb, vic20_lighty_cb, vic20_lightbut_cb, // lightgun cb
vic20_paddle0_cb, vic20_paddle1_cb, // paddle cb
vic20_dma_read, vic20_dma_read_color // DMA
DEVCB_DRIVER_MEMBER(vic20_state, vic_lightx_cb),
DEVCB_DRIVER_MEMBER(vic20_state, vic_lighty_cb),
DEVCB_DRIVER_MEMBER(vic20_state, vic_lightbut_cb),
DEVCB_INPUT_PORT("PADDLE0"),
DEVCB_INPUT_PORT("PADDLE1"),
DEVCB_DRIVER_MEMBER(vic20_state, vic_dma_read),
DEVCB_DRIVER_MEMBER(vic20_state, vic_dma_read_color)
};
@ -820,20 +786,9 @@ static MACHINE_CONFIG_DERIVED( vic20_ntsc, vic20_common )
MCFG_CPU_PROGRAM_MAP(vic20_mem)
MCFG_CPU_PERIODIC_INT(vic20_raster_interrupt, MOS656X_HRETRACERATE)
// video hardware
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE)
MCFG_SCREEN_VISIBLE_AREA(MOS6560_MAME_XPOS, MOS6560_MAME_XPOS + MOS6560_MAME_XSIZE - 1, MOS6560_MAME_YPOS, MOS6560_MAME_YPOS + MOS6560_MAME_YSIZE - 1)
MCFG_SCREEN_UPDATE_STATIC( vic20 )
MCFG_PALETTE_LENGTH(16)
MCFG_PALETTE_INIT( vic20 )
// sound hardware
// video/sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_MOS656X_ADD(M6560_TAG, vic_ntsc_intf)
MCFG_MOS6560_ADD(M6560_TAG, SCREEN_TAG, MOS6560_CLOCK, vic_ntsc_intf)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
@ -857,27 +812,16 @@ static MACHINE_CONFIG_DERIVED( vic20_pal, vic20_common )
MCFG_CPU_PROGRAM_MAP(vic20_mem)
MCFG_CPU_PERIODIC_INT(vic20_raster_interrupt, MOS656X_HRETRACERATE)
// video hardware
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_REFRESH_RATE(MOS6561_VRETRACERATE)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
MCFG_SCREEN_SIZE((MOS6561_XSIZE + 7) & ~7, MOS6561_YSIZE)
MCFG_SCREEN_VISIBLE_AREA(MOS6561_MAME_XPOS, MOS6561_MAME_XPOS + MOS6561_MAME_XSIZE - 1, MOS6561_MAME_YPOS, MOS6561_MAME_YPOS + MOS6561_MAME_YSIZE - 1)
MCFG_SCREEN_UPDATE_STATIC( vic20 )
MCFG_PALETTE_LENGTH(16)
MCFG_PALETTE_INIT( vic20 )
// devices
MCFG_VIC20_EXPANSION_SLOT_ADD(VIC20_EXPANSION_SLOT_TAG, MOS6561_CLOCK, expansion_intf, vic20_expansion_cards, NULL, NULL)
// sound hardware
// video/sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_MOS656X_ADD(M6560_TAG, vic_pal_intf)
MCFG_MOS6561_ADD(M6560_TAG, SCREEN_TAG, MOS6561_CLOCK, vic_pal_intf)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
// devices
MCFG_VIC20_EXPANSION_SLOT_ADD(VIC20_EXPANSION_SLOT_TAG, MOS6561_CLOCK, expansion_intf, vic20_expansion_cards, NULL, NULL)
// software lists
MCFG_SOFTWARE_LIST_FILTER("cart_list", "PAL")
MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")

View File

@ -52,7 +52,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<via6522_device> m_via0;
required_device<via6522_device> m_via1;
required_device<device_t> m_vic;
required_device<mos6560_device> m_vic;
required_device<cbm_iec_device> m_iec;
required_device<vcs_control_port_device> m_joy1;
required_device<vcs_control_port_device> m_joy2;
@ -67,6 +67,12 @@ public:
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_READ8_MEMBER( vic_lightx_cb );
DECLARE_READ8_MEMBER( vic_lighty_cb );
DECLARE_READ8_MEMBER( vic_lightbut_cb );
DECLARE_READ8_MEMBER( vic_dma_read );
DECLARE_READ8_MEMBER( vic_dma_read_color );
DECLARE_READ8_MEMBER( via0_pa_r );
DECLARE_WRITE8_MEMBER( via0_pa_w );