mirror of
https://github.com/holub/mame
synced 2025-06-07 05:13:46 +03:00
mos6560: Refactored interface to use devcb. (nw)
This commit is contained in:
parent
6fbb9a73e0
commit
c99cbedd35
@ -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)
|
||||
{
|
||||
|
@ -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__ */
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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 );
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user