mirror of
https://github.com/holub/mame
synced 2025-06-07 21:33:45 +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;
|
int total_xsize, total_ysize, total_lines, total_vretracerate;
|
||||||
|
|
||||||
/* DMA */
|
/* DMA */
|
||||||
mos6560_dma_read dma_read;
|
devcb_resolved_read8 dma_read;
|
||||||
mos6560_dma_read_color dma_read_color;
|
devcb_resolved_read8 dma_read_color;
|
||||||
UINT8 last_data;
|
UINT8 last_data;
|
||||||
|
|
||||||
/* lightpen */
|
/* lightpen */
|
||||||
mos6560_lightpen_button_callback lightpen_button_cb;
|
devcb_resolved_read8 lightpen_button_cb;
|
||||||
mos6560_lightpen_x_callback lightpen_x_cb;
|
devcb_resolved_read8 lightpen_x_cb;
|
||||||
mos6560_lightpen_y_callback lightpen_y_cb;
|
devcb_resolved_read8 lightpen_y_cb;
|
||||||
|
|
||||||
/* paddles */
|
/* paddles */
|
||||||
mos6560_paddle_callback paddle_cb[2];
|
devcb_resolved_read8 paddle_cb[2];
|
||||||
|
|
||||||
/* sound part */
|
/* sound part */
|
||||||
int tone1pos, tone2pos, tone3pos,
|
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 */
|
/* 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_BUTTON ((!mos6560->lightpen_button_cb.isnull()) ? mos6560->lightpen_button_cb(0) : 0)
|
||||||
#define LIGHTPEN_X_VALUE ((mos6560->lightpen_x_cb != NULL) ? mos6560->lightpen_x_cb(device->machine()) : 0)
|
#define LIGHTPEN_X_VALUE ((!mos6560->lightpen_x_cb.isnull()) ? mos6560->lightpen_x_cb(0) : 0)
|
||||||
#define LIGHTPEN_Y_VALUE ((mos6560->lightpen_y_cb != NULL) ? mos6560->lightpen_y_cb(device->machine()) : 0)
|
#define LIGHTPEN_Y_VALUE ((!mos6560->lightpen_y_cb.isnull()) ? mos6560->lightpen_y_cb(0) : 0)
|
||||||
|
|
||||||
/* lightpen delivers values from internal counters
|
/* lightpen delivers values from internal counters
|
||||||
* they do not start with the visual area or frame area */
|
* 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 BACKGROUNDCOLOR (mos6560->reg[0x0f] >> 4)
|
||||||
#define FRAMECOLOR (mos6560->reg[0x0f] & 0x07)
|
#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
|
IMPLEMENTATION
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@ -215,7 +246,7 @@ static void mos6560_draw_character( device_t *device, int ybegin, int yend, int
|
|||||||
|
|
||||||
for (y = ybegin; y <= yend; y++)
|
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->last_data = code;
|
||||||
mos6560->bitmap->pix16(y + yoff, xoff + 0) = color[code >> 7];
|
mos6560->bitmap->pix16(y + yoff, xoff + 0) = color[code >> 7];
|
||||||
mos6560->bitmap->pix16(y + yoff, xoff + 1) = color[(code >> 6) & 1];
|
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++)
|
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->last_data = code;
|
||||||
mos6560->bitmap->pix16(y + yoff, xoff + 0) =
|
mos6560->bitmap->pix16(y + yoff, xoff + 0) =
|
||||||
mos6560->bitmap->pix16(y + yoff, xoff + 1) = color[code >> 6];
|
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++)
|
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;
|
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)
|
if (mos6560->type == MOS6560_ATTACKUFO)
|
||||||
{
|
{
|
||||||
@ -479,7 +510,7 @@ READ8_DEVICE_HANDLER( mos6560_port_r )
|
|||||||
break;
|
break;
|
||||||
case 8: /* poti 1 */
|
case 8: /* poti 1 */
|
||||||
case 9: /* poti 2 */
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
val = mos6560->reg[offset];
|
val = mos6560->reg[offset];
|
||||||
@ -489,9 +520,9 @@ READ8_DEVICE_HANDLER( mos6560_port_r )
|
|||||||
return val;
|
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;
|
return mos6560->last_data;
|
||||||
}
|
}
|
||||||
@ -527,6 +558,11 @@ UINT32 mos6560_video_update( device_t *device, bitmap_ind16 &bitmap, const recta
|
|||||||
return 0;
|
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
|
SOUND IMPLEMENTATION
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@ -820,18 +856,14 @@ static DEVICE_START( mos6560 )
|
|||||||
|
|
||||||
mos6560->bitmap = auto_bitmap_ind16_alloc(device->machine(), width, height);
|
mos6560->bitmap = auto_bitmap_ind16_alloc(device->machine(), width, height);
|
||||||
|
|
||||||
assert(intf->dma_read != NULL);
|
// resolve callbacks
|
||||||
assert(intf->dma_read_color != NULL);
|
mos6560->dma_read.resolve(intf->dma_read, *device);
|
||||||
|
mos6560->dma_read_color.resolve(intf->dma_read_color, *device);
|
||||||
mos6560->dma_read = intf->dma_read;
|
mos6560->lightpen_button_cb.resolve(intf->button_cb, *device);
|
||||||
mos6560->dma_read_color = intf->dma_read_color;
|
mos6560->lightpen_x_cb.resolve(intf->x_cb, *device);
|
||||||
|
mos6560->lightpen_y_cb.resolve(intf->y_cb, *device);
|
||||||
mos6560->lightpen_button_cb = intf->button_cb;
|
mos6560->paddle_cb[0].resolve(intf->paddle0_cb, *device);
|
||||||
mos6560->lightpen_x_cb = intf->x_cb;
|
mos6560->paddle_cb[1].resolve(intf->paddle1_cb, *device);
|
||||||
mos6560->lightpen_y_cb = intf->y_cb;
|
|
||||||
|
|
||||||
mos6560->paddle_cb[0] = intf->paddle0_cb;
|
|
||||||
mos6560->paddle_cb[1] = intf->paddle1_cb;
|
|
||||||
|
|
||||||
switch (mos6560->type)
|
switch (mos6560->type)
|
||||||
{
|
{
|
||||||
|
@ -15,15 +15,6 @@
|
|||||||
TYPE DEFINITIONS
|
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
|
typedef enum
|
||||||
{
|
{
|
||||||
MOS6560_ATTACKUFO, // this is a 6560VIC derivative, missing some of the features
|
MOS6560_ATTACKUFO, // this is a 6560VIC derivative, missing some of the features
|
||||||
@ -34,18 +25,18 @@ typedef enum
|
|||||||
typedef struct _mos6560_interface mos6560_interface;
|
typedef struct _mos6560_interface mos6560_interface;
|
||||||
struct _mos6560_interface
|
struct _mos6560_interface
|
||||||
{
|
{
|
||||||
const char *screen;
|
const char *screen;
|
||||||
|
|
||||||
mos6560_type type;
|
mos6560_type type;
|
||||||
|
|
||||||
mos6560_lightpen_x_callback x_cb;
|
devcb_read8 x_cb;
|
||||||
mos6560_lightpen_y_callback y_cb;
|
devcb_read8 y_cb;
|
||||||
mos6560_lightpen_button_callback button_cb;
|
devcb_read8 button_cb;
|
||||||
|
|
||||||
mos6560_paddle_callback paddle0_cb, paddle1_cb;
|
devcb_read8 paddle0_cb, paddle1_cb;
|
||||||
|
|
||||||
mos6560_dma_read dma_read;
|
devcb_read8 dma_read;
|
||||||
mos6560_dma_read_color dma_read_color;
|
devcb_read8 dma_read_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -97,6 +88,11 @@ public:
|
|||||||
|
|
||||||
// access to legacy token
|
// access to legacy token
|
||||||
void *token() const { assert(m_token != NULL); return m_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:
|
protected:
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
virtual void device_config_complete();
|
virtual void device_config_complete();
|
||||||
@ -121,6 +117,29 @@ extern const device_type MOS656X;
|
|||||||
MCFG_SOUND_ADD(_tag, MOS656X, 0) \
|
MCFG_SOUND_ADD(_tag, MOS656X, 0) \
|
||||||
MCFG_DEVICE_CONFIG(_interface)
|
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
|
I/O PROTOTYPES
|
||||||
@ -129,9 +148,9 @@ extern const device_type MOS656X;
|
|||||||
WRITE8_DEVICE_HANDLER( mos6560_port_w );
|
WRITE8_DEVICE_HANDLER( mos6560_port_w );
|
||||||
READ8_DEVICE_HANDLER( mos6560_port_r );
|
READ8_DEVICE_HANDLER( mos6560_port_r );
|
||||||
|
|
||||||
UINT8 mos6560_bus_r( device_t *device );
|
|
||||||
void mos6560_raster_interrupt_gen( device_t *device );
|
void mos6560_raster_interrupt_gen( device_t *device );
|
||||||
UINT32 mos6560_video_update( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect );
|
UINT32 mos6560_video_update( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect );
|
||||||
|
|
||||||
|
extern PALETTE_INIT( mos6560 );
|
||||||
|
|
||||||
#endif /* __MOS6560_H__ */
|
#endif /* __MOS6560_H__ */
|
||||||
|
@ -66,40 +66,11 @@ public:
|
|||||||
|
|
||||||
DECLARE_READ8_MEMBER(attckufo_io_r);
|
DECLARE_READ8_MEMBER(attckufo_io_r);
|
||||||
DECLARE_WRITE8_MEMBER(attckufo_io_w);
|
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)
|
READ8_MEMBER(attckufo_state::attckufo_io_r)
|
||||||
{
|
{
|
||||||
switch(offset)
|
switch(offset)
|
||||||
@ -172,25 +143,24 @@ static SCREEN_UPDATE_IND16( attckufo )
|
|||||||
return 0;
|
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 m_maincpu->space(AS_PROGRAM)->read_byte(offset);
|
||||||
return state->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 m_maincpu->space(AS_PROGRAM)->read_byte(offset + 0x400);
|
||||||
return state->m_maincpu->space(AS_PROGRAM)->read_byte(offset + 0x400);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const mos6560_interface attckufo_6560_intf =
|
static const mos6560_interface attckufo_6560_intf =
|
||||||
{
|
{
|
||||||
"screen", /* screen */
|
"screen", /* screen */
|
||||||
MOS6560_ATTACKUFO,
|
MOS6560_ATTACKUFO,
|
||||||
NULL, NULL, NULL, /* lightgun cb */
|
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, /* lightgun cb */
|
||||||
NULL, NULL, /* paddle cb */
|
DEVCB_NULL, DEVCB_NULL, /* paddle cb */
|
||||||
attckufo_dma_read, attckufo_dma_read_color /* DMA */
|
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_VISIBLE_AREA(0, 23*8 - 1, 0, 22*8 - 1)
|
||||||
MCFG_SCREEN_UPDATE_STATIC(attckufo)
|
MCFG_SCREEN_UPDATE_STATIC(attckufo)
|
||||||
|
|
||||||
MCFG_PALETTE_LENGTH(ARRAY_LENGTH(attckufo_palette))
|
MCFG_PALETTE_LENGTH(16)
|
||||||
MCFG_PALETTE_INIT(attckufo)
|
MCFG_PALETTE_INIT(mos6560)
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||||
|
@ -123,7 +123,7 @@ enum
|
|||||||
|
|
||||||
READ8_MEMBER( vic20_state::read )
|
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 ram1 = 1, ram2 = 1, ram3 = 1;
|
||||||
int blk1 = 1, blk2 = 1, blk3 = 1, blk5 = 1;
|
int blk1 = 1, blk2 = 1, blk3 = 1, blk5 = 1;
|
||||||
@ -250,7 +250,7 @@ WRITE8_MEMBER( vic20_state::write )
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case COLOR:
|
case COLOR:
|
||||||
m_color_ram[offset & 0x3ff] = data;
|
m_color_ram[offset & 0x3ff] = data & 0x0f;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IO2: io2 = 0; break;
|
case IO2: io2 = 0; break;
|
||||||
@ -270,36 +270,6 @@ WRITE8_MEMBER( vic20_state::write )
|
|||||||
// VIDEO
|
// 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 )
|
static INTERRUPT_GEN( vic20_raster_interrupt )
|
||||||
{
|
{
|
||||||
vic20_state *state = device->machine().driver_data<vic20_state>();
|
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 VC20ADDR2MOS6560ADDR(a) (((a) > 0x8000) ? ((a) & 0x1fff) : ((a) | 0x2000))
|
||||||
#define MOS6560ADDR2VC20ADDR(a) (((a) > 0x2000) ? ((a) & 0x1fff) : ((a) | 0x8000))
|
#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 m_color_ram[offset & 0x3ff];
|
||||||
|
|
||||||
return state->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));
|
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));
|
return (((ioport("CTRLSEL")->read() & 0xf0) == 0x20) && (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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const mos6560_interface vic_ntsc_intf =
|
static const mos6560_interface vic_ntsc_intf =
|
||||||
{
|
{
|
||||||
SCREEN_TAG,
|
SCREEN_TAG,
|
||||||
MOS6560,
|
MOS6560,
|
||||||
vic20_lightx_cb, vic20_lighty_cb, vic20_lightbut_cb, // lightgun cb
|
DEVCB_DRIVER_MEMBER(vic20_state, vic_lightx_cb),
|
||||||
vic20_paddle0_cb, vic20_paddle1_cb, // paddle cb
|
DEVCB_DRIVER_MEMBER(vic20_state, vic_lighty_cb),
|
||||||
vic20_dma_read, vic20_dma_read_color // DMA
|
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,
|
SCREEN_TAG,
|
||||||
MOS6561,
|
MOS6561,
|
||||||
vic20_lightx_cb, vic20_lighty_cb, vic20_lightbut_cb, // lightgun cb
|
DEVCB_DRIVER_MEMBER(vic20_state, vic_lightx_cb),
|
||||||
vic20_paddle0_cb, vic20_paddle1_cb, // paddle cb
|
DEVCB_DRIVER_MEMBER(vic20_state, vic_lighty_cb),
|
||||||
vic20_dma_read, vic20_dma_read_color // DMA
|
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_PROGRAM_MAP(vic20_mem)
|
||||||
MCFG_CPU_PERIODIC_INT(vic20_raster_interrupt, MOS656X_HRETRACERATE)
|
MCFG_CPU_PERIODIC_INT(vic20_raster_interrupt, MOS656X_HRETRACERATE)
|
||||||
|
|
||||||
// video hardware
|
// video/sound 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
|
|
||||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
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_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
||||||
MCFG_SOUND_ADD("dac", DAC, 0)
|
MCFG_SOUND_ADD("dac", DAC, 0)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
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_PROGRAM_MAP(vic20_mem)
|
||||||
MCFG_CPU_PERIODIC_INT(vic20_raster_interrupt, MOS656X_HRETRACERATE)
|
MCFG_CPU_PERIODIC_INT(vic20_raster_interrupt, MOS656X_HRETRACERATE)
|
||||||
|
|
||||||
// video hardware
|
// video/sound 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
|
|
||||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
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_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
||||||
MCFG_SOUND_ADD("dac", DAC, 0)
|
MCFG_SOUND_ADD("dac", DAC, 0)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
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
|
// software lists
|
||||||
MCFG_SOFTWARE_LIST_FILTER("cart_list", "PAL")
|
MCFG_SOFTWARE_LIST_FILTER("cart_list", "PAL")
|
||||||
MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")
|
MCFG_SOFTWARE_LIST_FILTER("disk_list", "PAL")
|
||||||
|
@ -52,7 +52,7 @@ public:
|
|||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<via6522_device> m_via0;
|
required_device<via6522_device> m_via0;
|
||||||
required_device<via6522_device> m_via1;
|
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<cbm_iec_device> m_iec;
|
||||||
required_device<vcs_control_port_device> m_joy1;
|
required_device<vcs_control_port_device> m_joy1;
|
||||||
required_device<vcs_control_port_device> m_joy2;
|
required_device<vcs_control_port_device> m_joy2;
|
||||||
@ -67,6 +67,12 @@ public:
|
|||||||
DECLARE_READ8_MEMBER( read );
|
DECLARE_READ8_MEMBER( read );
|
||||||
DECLARE_WRITE8_MEMBER( write );
|
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_READ8_MEMBER( via0_pa_r );
|
||||||
DECLARE_WRITE8_MEMBER( via0_pa_w );
|
DECLARE_WRITE8_MEMBER( via0_pa_w );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user