(MESS) vic20: Refactored VIC to a modern device. (nw)

(MESS) c64: Fixed IDE64 cartridge video corruption. (nw)
(MESS) Added paddles and light pen VCS control devices. [Curt Coder]
This commit is contained in:
Curt Coder 2012-09-06 15:16:03 +00:00
parent a5f74861d4
commit 3722e8ff14
25 changed files with 1145 additions and 857 deletions

4
.gitattributes vendored
View File

@ -7102,6 +7102,10 @@ src/mess/machine/vb_timeshare.c svneol=native#text/plain
src/mess/machine/vb_timeshare.h svneol=native#text/plain
src/mess/machine/vcs_joy.c svneol=native#text/plain
src/mess/machine/vcs_joy.h svneol=native#text/plain
src/mess/machine/vcs_lightpen.c svneol=native#text/plain
src/mess/machine/vcs_lightpen.h svneol=native#text/plain
src/mess/machine/vcs_paddles.c svneol=native#text/plain
src/mess/machine/vcs_paddles.h svneol=native#text/plain
src/mess/machine/vcsctrl.c svneol=native#text/plain
src/mess/machine/vcsctrl.h svneol=native#text/plain
src/mess/machine/vector06.c svneol=native#text/plain

File diff suppressed because it is too large Load Diff

View File

@ -1,47 +1,96 @@
/*****************************************************************************
*
* audio/vic6560.h
*
****************************************************************************/
#ifndef __MOS6560_H__
#define __MOS6560_H__
#include "devlegcy.h"
#include "devcb.h"
/***************************************************************************
TYPE DEFINITIONS
MOS 6560/6561 Video Interface Chip (VIC) emulation
Copyright the MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
****************************************************************************
_____ _____
N/C 1 |* \_/ | 40 Vdd
CHROMA 2 | | 39 phi1
LUMA/SYNC 3 | | 38 phi2
R/W 4 | | 37 OPTION
D11 5 | | 36 Pphi2
D10 6 | | 35 Pphi1
D9 7 | | 34 A13
D8 8 | | 33 A12
D7 9 | | 32 A11
D6 10 | MOS6560 | 31 A10
D5 11 | MOS6561 | 30 A9
D4 12 | | 29 A8
D3 13 | | 28 A7
D2 14 | | 27 A6
D1 15 | | 26 A5
D0 16 | | 25 A4
POT X 17 | | 24 A3
POT Y 18 | | 23 A2
AUDIO 19 | | 22 A1
Vss 20 |_____________| 21 A0
***************************************************************************/
typedef enum
{
MOS6560_ATTACKUFO, // this is a 6560VIC derivative, missing some of the features
MOS6560, // this is the NTSC version
MOS6561 // this is the PAL version
} mos6560_type;
#pragma once
typedef struct _mos6560_interface mos6560_interface;
struct _mos6560_interface
{
const char *screen;
#ifndef __MOS6560__
#define __MOS6560__
mos6560_type type;
#include "emu.h"
devcb_read8 x_cb;
devcb_read8 y_cb;
devcb_read8 button_cb;
devcb_read8 paddle0_cb, paddle1_cb;
devcb_read8 dma_read;
devcb_read8 dma_read_color;
};
//***************************************************************************
// DEVICE CONFIGURATION MACROS
//***************************************************************************
/***************************************************************************
CONSTANTS
***************************************************************************/
#define MCFG_MOS6560_ADD(_tag, _screen_tag, _clock, _config, _videoram_map, _colorram_map) \
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_SOUND_ADD(_tag, MOS6560, _clock) \
MCFG_DEVICE_CONFIG(_config) \
MCFG_DEVICE_ADDRESS_MAP(AS_0, _videoram_map) \
MCFG_DEVICE_ADDRESS_MAP(AS_1, _colorram_map)
#define MCFG_MOS6561_ADD(_tag, _screen_tag, _clock, _config, _videoram_map, _colorram_map) \
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_SOUND_ADD(_tag, MOS6561, _clock) \
MCFG_DEVICE_CONFIG(_config) \
MCFG_DEVICE_ADDRESS_MAP(AS_0, _videoram_map) \
MCFG_DEVICE_ADDRESS_MAP(AS_1, _colorram_map)
#define MCFG_MOS656X_ATTACK_UFO_ADD(_tag, _screen_tag, _clock, _config, _videoram_map, _colorram_map) \
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(0, 23*8 - 1, 0, 22*8 - 1) \
MCFG_SCREEN_UPDATE_DEVICE(_tag, mos6560_device, screen_update) \
MCFG_PALETTE_LENGTH(16) \
MCFG_SOUND_ADD(_tag, MOS656X_ATTACK_UFO, _clock) \
MCFG_DEVICE_CONFIG(_config) \
MCFG_DEVICE_ADDRESS_MAP(AS_0, _videoram_map) \
MCFG_DEVICE_ADDRESS_MAP(AS_1, _colorram_map)
#define MOS6560_INTERFACE(_name) \
const mos6560_interface (_name) =
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define MOS6560_VRETRACERATE 60
#define MOS6561_VRETRACERATE 50
@ -75,25 +124,53 @@ struct _mos6560_interface
#define MOS6561_CLOCK (4433618/4)
/***************************************************************************
INFO PROTOTYPES
***************************************************************************/
//***************************************************************************
// TYPE DEFINITIONS
//***************************************************************************
// ======================> mos6560_interface
struct mos6560_interface
{
const char *m_screen_tag;
devcb_read8 m_potx_cb;
devcb_read8 m_poty_cb;
};
// ======================> mos6560_device
class mos6560_device : public device_t,
public device_sound_interface
public device_memory_interface,
public device_sound_interface,
public mos6560_interface
{
public:
mos6560_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
mos6560_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~mos6560_device() { global_free(m_token); }
// access to legacy token
void *token() const { assert(m_token != NULL); return m_token; }
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const;
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
UINT8 bus_r();
DECLARE_WRITE_LINE_MEMBER( lp_w );
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void raster_interrupt_gen();
protected:
enum
{
TYPE_6560, // NTSC-M
TYPE_6561, // PAL-B
TYPE_ATTACK_UFO // NTSC-M, less features
};
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
@ -101,56 +178,89 @@ protected:
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
private:
// internal state
void *m_token;
inline void initialize_palette();
inline UINT8 read_videoram(offs_t offset);
inline UINT8 read_colorram(offs_t offset);
void draw_character( int ybegin, int yend, int ch, int yoff, int xoff, UINT16 *color );
void draw_character_multi( int ybegin, int yend, int ch, int yoff, int xoff, UINT16 *color );
void drawlines( int first, int last );
void soundport_w( int offset, int data );
void sound_start();
int m_variant;
const address_space_config m_videoram_space_config;
const address_space_config m_colorram_space_config;
screen_device *m_screen;
UINT8 m_reg[16];
bitmap_ind16 m_bitmap;
int m_rasterline, m_lastline;
double m_lightpenreadtime;
int m_charheight, m_matrix8x16, m_inverted;
int m_chars_x, m_chars_y;
int m_xsize, m_ysize, m_xpos, m_ypos;
int m_chargenaddr, m_videoaddr;
/* values in videoformat */
UINT16 m_backgroundcolor, m_framecolor, m_helpercolor;
/* arrays for bit to color conversion without condition checking */
UINT16 m_mono[2], m_monoinverted[2], m_multi[4], m_multiinverted[4];
/* video chip settings */
int m_total_xsize, m_total_ysize, m_total_lines, m_total_vretracerate;
/* DMA */
UINT8 m_last_data;
/* paddles */
devcb_resolved_read8 m_paddle_cb[2];
/* sound part */
int m_tone1pos, m_tone2pos, m_tone3pos,
m_tonesize, m_tone1samples, m_tone2samples, m_tone3samples,
m_noisesize, /* number of samples */
m_noisepos, /* pos of tone */
m_noisesamples; /* count of samples to give out per tone */
sound_stream *m_channel;
INT16 *m_tone;
INT8 *m_noise;
};
extern const device_type MOS656X;
// ======================> mos6561_device
class mos6561_device : public mos6560_device
{
public:
// construction/destruction
mos6561_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
// ======================> mos656x_attack_ufo_device
#define MCFG_MOS656X_ADD(_tag, _interface) \
MCFG_SOUND_ADD(_tag, MOS656X, 0) \
MCFG_DEVICE_CONFIG(_interface)
class mos656x_attack_ufo_device : public mos6560_device
{
public:
// construction/destruction
mos656x_attack_ufo_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
#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)
// device type definitions
extern const device_type MOS6560;
extern const device_type MOS6561;
extern const device_type MOS656X_ATTACK_UFO;
/***************************************************************************
I/O PROTOTYPES
***************************************************************************/
WRITE8_DEVICE_HANDLER( mos6560_port_w );
READ8_DEVICE_HANDLER( mos6560_port_r );
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__ */
#endif

View File

@ -67,8 +67,8 @@ public:
DECLARE_READ8_MEMBER(attckufo_io_r);
DECLARE_WRITE8_MEMBER(attckufo_io_w);
DECLARE_READ8_MEMBER(dma_read);
DECLARE_READ8_MEMBER(dma_read_color);
DECLARE_READ8_MEMBER( vic_videoram_r );
DECLARE_READ8_MEMBER( vic_colorram_r );
};
READ8_MEMBER(attckufo_state::attckufo_io_r)
@ -93,15 +93,33 @@ WRITE8_MEMBER(attckufo_state::attckufo_io_w)
*/
}
READ8_MEMBER(attckufo_state::vic_videoram_r)
{
return m_maincpu->space(AS_PROGRAM)->read_byte(offset);
}
READ8_MEMBER(attckufo_state::vic_colorram_r)
{
return m_maincpu->space(AS_PROGRAM)->read_byte(offset + 0x400);
}
static ADDRESS_MAP_START( cpu_map, AS_PROGRAM, 8, attckufo_state )
ADDRESS_MAP_GLOBAL_MASK(0x3fff)
AM_RANGE(0x0000, 0x0fff) AM_RAM AM_SHARE("mainram")
AM_RANGE(0x1000, 0x100f) AM_DEVREADWRITE_LEGACY("mos6560", mos6560_port_r, mos6560_port_w)
AM_RANGE(0x1000, 0x100f) AM_DEVREADWRITE("mos6560", mos6560_device, read, write)
AM_RANGE(0x1400, 0x1403) AM_READWRITE(attckufo_io_r, attckufo_io_w)
AM_RANGE(0x1c00, 0x1fff) AM_RAM AM_SHARE("tileram")
AM_RANGE(0x2000, 0x3fff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START( vic_videoram_map, AS_0, 8, attckufo_state )
AM_RANGE(0x0000, 0x3fff) AM_READ(vic_videoram_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( vic_colorram_map, AS_1, 8, attckufo_state )
AM_RANGE(0x000, 0x3ff) AM_READ(vic_colorram_r)
ADDRESS_MAP_END
static INPUT_PORTS_START( attckufo )
PORT_START("DSW")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
@ -133,59 +151,25 @@ INPUT_PORTS_END
static INTERRUPT_GEN( attckufo_raster_interrupt )
{
attckufo_state *state = device->machine().driver_data<attckufo_state>();
mos6560_raster_interrupt_gen(state->m_mos6560);
state->m_mos6560->raster_interrupt_gen();
}
static SCREEN_UPDATE_IND16( attckufo )
static MOS6560_INTERFACE( vic_intf )
{
attckufo_state *state = screen.machine().driver_data<attckufo_state>();
mos6560_video_update(state->m_mos6560, bitmap, cliprect);
return 0;
}
READ8_MEMBER(attckufo_state::dma_read)
{
return m_maincpu->space(AS_PROGRAM)->read_byte(offset);
}
READ8_MEMBER(attckufo_state::dma_read_color)
{
return m_maincpu->space(AS_PROGRAM)->read_byte(offset + 0x400);
}
static const mos6560_interface attckufo_6560_intf =
{
"screen", /* screen */
MOS6560_ATTACKUFO,
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 */
"screen",
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_CONFIG_START( attckufo, attckufo_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6502, 14318181/14)
MCFG_CPU_PROGRAM_MAP(cpu_map)
MCFG_CPU_PERIODIC_INT(attckufo_raster_interrupt, MOS656X_HRETRACERATE)
/* video hardware */
MCFG_SCREEN_ADD("screen", 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(0, 23*8 - 1, 0, 22*8 - 1)
MCFG_SCREEN_UPDATE_STATIC(attckufo)
MCFG_PALETTE_LENGTH(16)
MCFG_PALETTE_INIT(mos6560)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_MOS656X_ADD("mos6560", attckufo_6560_intf)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_MOS656X_ATTACK_UFO_ADD("mos6560", "screen", 14318181/14, vic_intf, vic_videoram_map, vic_colorram_map)
MACHINE_CONFIG_END
ROM_START( attckufo )

View File

@ -67,8 +67,8 @@ void c64_state::check_interrupts()
void c64_state::bankswitch(offs_t offset, offs_t va, int rw, int aec, int ba, int cas, int *casram, int *basic, int *kernal, int *charom, int *grw, int *io, int *roml, int *romh)
{
int game = m_exp->game_r(offset, rw, ba, m_hiram);
int exrom = m_exp->exrom_r(offset, rw, ba, m_hiram);
int game = m_exp->game_r(offset, ba, rw, m_hiram);
int exrom = m_exp->exrom_r(offset, ba, rw, m_hiram);
UINT16 input = VA12 << 15 | VA13 << 14 | game << 13 | exrom << 12 | rw << 11 | aec << 10 | ba << 9 | A12 << 8 | A13 << 7 | A14 << 6 | A15 << 5 | m_va14 << 4 | m_charen << 3 | m_hiram << 2 | m_loram << 1 | cas;
UINT8 data = m_pla->read(input);
@ -92,7 +92,12 @@ UINT8 c64_state::read_memory(address_space &space, offs_t offset, int ba, int ca
{
int io1 = 1, io2 = 1;
UINT8 data = m_vic->bus_r();
UINT8 data = 0xff;
if (ba)
{
data = m_vic->bus_r();
}
if (!casram)
{
@ -1029,8 +1034,8 @@ static MACHINE_CONFIG_START( ntsc, c64_state )
MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
MCFG_CBM_IEC_ADD(iec_intf, "c1541")
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL)
MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6567_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL)
MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
@ -1128,8 +1133,8 @@ static MACHINE_CONFIG_START( pal, c64_state )
MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
MCFG_CBM_IEC_ADD(iec_intf, "c1541")
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL)
MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL)
MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
@ -1203,8 +1208,8 @@ static MACHINE_CONFIG_START( pal_gs, c64gs_state )
MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
MCFG_CBM_IEC_BUS_ADD(iec_intf)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL)
MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL)
MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)

View File

@ -135,7 +135,7 @@ READ8_MEMBER( vic20_state::read )
switch ((offset >> 10) & 0x07)
{
case RAM0:
data = m_ram->pointer()[offset];
data = m_ram->pointer()[offset & 0x3ff];
break;
case RAM1: ram1 = 0; break;
@ -170,7 +170,7 @@ READ8_MEMBER( vic20_state::read )
}
else if (offset >= 0x9000 && offset < 0x9010)
{
data = mos6560_port_r(m_vic, offset & 0x0f);
data = m_vic->read(space, offset & 0x0f);
}
break;
@ -245,7 +245,7 @@ WRITE8_MEMBER( vic20_state::write )
}
else if (offset >= 0x9000 && offset < 0x9010)
{
mos6560_port_w(m_vic, offset & 0x0f, data);
m_vic->write(space, offset & 0x0f, data);
}
break;
@ -265,6 +265,44 @@ WRITE8_MEMBER( vic20_state::write )
}
//-------------------------------------------------
// vic_videoram_r -
//-------------------------------------------------
READ8_MEMBER( vic20_state::vic_videoram_r )
{
int ram1 = 1, ram2 = 1, ram3 = 1;
int blk1 = 1, blk2 = 1, blk3 = 1, blk5 = 1;
int io2 = 1, io3 = 1;
UINT8 data = 0;
if (BIT(offset, 13))
{
switch ((offset >> 10) & 0x07)
{
case RAM0:
data = m_ram->pointer()[offset & 0x3ff];
break;
case RAM1: ram1 = 0; break;
case RAM2: ram2 = 0; break;
case RAM3: ram3 = 0; break;
default:
data = m_ram->pointer()[0x400 + (offset & 0xfff)];
break;
}
}
else
{
data = m_charom[offset & 0xfff];
}
return m_exp->cd_r(space, offset & 0x1fff, data, ram1, ram2, ram3, blk1, blk2, blk3, blk5, io2, io3);
}
//**************************************************************************
// VIDEO
@ -273,7 +311,7 @@ WRITE8_MEMBER( vic20_state::write )
static INTERRUPT_GEN( vic20_raster_interrupt )
{
vic20_state *state = device->machine().driver_data<vic20_state>();
mos6560_raster_interrupt_gen(state->m_vic);
state->m_vic->raster_interrupt_gen();
}
@ -291,40 +329,29 @@ static ADDRESS_MAP_START( vic20_mem, AS_PROGRAM, 8, vic20_state )
ADDRESS_MAP_END
//-------------------------------------------------
// ADDRESS_MAP( vic_videoram_map )
//-------------------------------------------------
static ADDRESS_MAP_START( vic_videoram_map, AS_0, 8, vic20_state )
AM_RANGE(0x0000, 0x3fff) AM_READ(vic_videoram_r)
ADDRESS_MAP_END
//-------------------------------------------------
// ADDRESS_MAP( vic_colorram_map )
//-------------------------------------------------
static ADDRESS_MAP_START( vic_colorram_map, AS_1, 8, vic20_state )
AM_RANGE(0x000, 0x3ff) AM_RAM AM_SHARE("color_ram")
ADDRESS_MAP_END
//**************************************************************************
// INPUT PORTS
//**************************************************************************
#ifdef UNUSED_FUNCTION
//-------------------------------------------------
// INPUT_PORTS( vic_lightpen_6560 )
//-------------------------------------------------
static INPUT_PORTS_START( vic_lightpen_6560 )
PORT_START( "LIGHTX" )
PORT_BIT( 0xff, 0, IPT_PADDLE ) PORT_NAME("Lightpen X Axis") PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(30) PORT_KEYDELTA(2) PORT_MINMAX(0,(MOS6560_MAME_XSIZE - 1)) PORT_CODE_DEC(KEYCODE_LEFT) PORT_CODE_INC(KEYCODE_RIGHT) PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START( "LIGHTY" )
PORT_BIT( 0xff, 0, IPT_PADDLE ) PORT_NAME("Lightpen Y Axis") PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(30) PORT_KEYDELTA(2) PORT_MINMAX(0,(MOS6560_MAME_YSIZE - 1)) PORT_CODE_DEC(KEYCODE_UP) PORT_CODE_INC(KEYCODE_DOWN) PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
INPUT_PORTS_END
//-------------------------------------------------
// INPUT_PORTS( vic_lightpen_6561 )
//-------------------------------------------------
static INPUT_PORTS_START( vic_lightpen_6561 )
PORT_START( "LIGHTX" )
PORT_BIT( 0xff, 0, IPT_PADDLE ) PORT_NAME("Lightpen X Axis") PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(30) PORT_KEYDELTA(2) PORT_MINMAX(0,(MOS6560_MAME_XSIZE - 1)) PORT_CODE_DEC(KEYCODE_LEFT) PORT_CODE_INC(KEYCODE_RIGHT) PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH) PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
PORT_START( "LIGHTY" )
PORT_BIT( 0x1ff, 0, IPT_PADDLE ) PORT_NAME("Lightpen Y Axis") PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(30) PORT_KEYDELTA(2) PORT_MINMAX(0,(MOS6561_MAME_YSIZE - 1)) PORT_CODE_DEC(KEYCODE_UP) PORT_CODE_INC(KEYCODE_DOWN) PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
INPUT_PORTS_END
#endif
//-------------------------------------------------
// INPUT_PORTS( vic20 )
//-------------------------------------------------
@ -333,8 +360,6 @@ static INPUT_PORTS_START( vic20 )
PORT_INCLUDE( vic_keyboard ) // ROW0 -> ROW7
PORT_INCLUDE( vic_special ) // SPECIAL
PORT_INCLUDE( vic_controls ) // CTRLSEL, JOY, FAKE0, FAKE1, PADDLE0, PADDLE1
INPUT_PORTS_END
@ -396,10 +421,10 @@ READ8_MEMBER( vic20_state::via0_pa_r )
PA0 SERIAL CLK IN
PA1 SERIAL DATA IN
PA2 JOY 0
PA3 JOY 1
PA4 JOY 2
PA5 LITE PEN
PA2 JOY 0 (UP)
PA3 JOY 1 (DOWN)
PA4 JOY 2 (LEFT)
PA5 LITE PEN (FIRE)
PA6 CASS SWITCH
PA7
@ -413,18 +438,17 @@ READ8_MEMBER( vic20_state::via0_pa_r )
// serial data in
data |= m_iec->data_r() << 1;
// user port
data |= m_user->joy0_r() << 2;
data |= m_user->joy1_r() << 3;
data |= m_user->joy2_r() << 4;
data |= m_user->light_pen_r() << 5;
// joystick / user port
UINT8 joy = m_joy1->joy_r();
data |= (m_user->joy0_r() && BIT(joy, 0)) << 2;
data |= (m_user->joy1_r() && BIT(joy, 1)) << 3;
data |= (m_user->joy2_r() && BIT(joy, 2)) << 4;
data |= (m_user->light_pen_r() && BIT(joy, 5)) << 5;
// cassette switch
data |= (m_user->cassette_switch_r() && m_cassette->sense_r()) << 6;
// joystick
data &= ~(ioport("JOY")->read() & 0x3c);
return data;
}
@ -511,18 +535,20 @@ READ8_MEMBER( vic20_state::via1_pb_r )
PB0 COL 0
PB1 COL 1
PB2 COL 2
PB3 COL 3, CASS WRITE
PB3 COL 3
PB4 COL 4
PB5 COL 5
PB6 COL 6
PB7 COL 7, JOY 3
PB7 COL 7, JOY 3 (RIGHT)
*/
UINT8 data = 0xff;
// joystick
data &= ~(ioport("JOY")->read() & 0x80);
UINT8 joy = m_joy1->joy_r();
data &= BIT(joy, 3) << 7;
return data;
}
@ -540,7 +566,7 @@ WRITE8_MEMBER( vic20_state::via1_pb_w )
PB4 COL 4
PB5 COL 5
PB6 COL 6
PB7 COL 7, JOY 3
PB7 COL 7
*/
@ -611,65 +637,11 @@ static CBM_IEC_INTERFACE( cbm_iec_intf )
// mos6560_interface vic_ntsc_intf
//-------------------------------------------------
#define VC20ADDR2MOS6560ADDR(a) (((a) > 0x8000) ? ((a) & 0x1fff) : ((a) | 0x2000))
#define MOS6560ADDR2VC20ADDR(a) (((a) > 0x2000) ? ((a) & 0x1fff) : ((a) | 0x8000))
READ8_MEMBER( vic20_state::vic_dma_read_color )
{
return m_color_ram[offset & 0x3ff];
}
READ8_MEMBER( vic20_state::vic_dma_read )
{
address_space *program = m_maincpu->memory().space(AS_PROGRAM);
return program->read_byte(MOS6560ADDR2VC20ADDR(offset));
}
READ8_MEMBER( vic20_state::vic_lightx_cb )
{
return (ioport("LIGHTX")->read_safe(0) & ~0x01);
}
READ8_MEMBER( vic20_state::vic_lighty_cb )
{
return (ioport("LIGHTY")->read_safe(0) & ~0x01);
}
READ8_MEMBER( vic20_state::vic_lightbut_cb )
{
return (((ioport("CTRLSEL")->read() & 0xf0) == 0x20) && (ioport("JOY")->read() & 0x40));
}
static const mos6560_interface vic_ntsc_intf =
static MOS6560_INTERFACE( vic_intf )
{
SCREEN_TAG,
MOS6560,
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)
};
//-------------------------------------------------
// mos6560_interface vic_pal_intf
//-------------------------------------------------
static const mos6560_interface vic_pal_intf =
{
SCREEN_TAG,
MOS6561,
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)
DEVCB_DEVICE_MEMBER(CONTROL1_TAG, vcs_control_port_device, pot_x_r),
DEVCB_DEVICE_MEMBER(CONTROL1_TAG, vcs_control_port_device, pot_y_r)
};
@ -699,6 +671,7 @@ static VIC20_EXPANSION_INTERFACE( expansion_intf )
static VIC20_USER_PORT_INTERFACE( user_intf )
{
DEVCB_DEVICE_LINE_MEMBER(M6560_TAG, mos6560_device, lp_w),
DEVCB_DEVICE_LINE_MEMBER(M6522_0_TAG, via6522_device, write_cb1),
DEVCB_DEVICE_LINE_MEMBER(M6522_0_TAG, via6522_device, write_cb2),
DEVCB_DRIVER_LINE_MEMBER(vic20_state, exp_reset_w)
@ -721,9 +694,6 @@ void vic20_state::machine_start()
m_kernal = memregion("kernal")->base();
m_charom = memregion("charom")->base();
// allocate memory
m_color_ram = auto_alloc_array(machine(), UINT8, 0x400);
// state saving
save_item(NAME(m_key_col));
}
@ -752,7 +722,7 @@ void vic20_state::machine_reset()
// MACHINE_CONFIG( vic20_common )
//-------------------------------------------------
static MACHINE_CONFIG_START( vic20_common, vic20_state )
static MACHINE_CONFIG_START( vic20, vic20_state )
// devices
MCFG_VIA6522_ADD(M6522_0_TAG, 0, via0_intf)
MCFG_VIA6522_ADD(M6522_1_TAG, 0, via1_intf)
@ -762,8 +732,7 @@ static MACHINE_CONFIG_START( vic20_common, vic20_state )
MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
MCFG_CBM_IEC_ADD(cbm_iec_intf, "c1541")
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
MCFG_VIC20_USER_PORT_ADD(VIC20_USER_PORT_TAG, user_intf, vic20_user_port_cards, NULL, NULL)
// software lists
@ -777,10 +746,10 @@ MACHINE_CONFIG_END
//-------------------------------------------------
// MACHINE_CONFIG( vic20_ntsc )
// MACHINE_CONFIG( ntsc )
//-------------------------------------------------
static MACHINE_CONFIG_DERIVED( vic20_ntsc, vic20_common )
static MACHINE_CONFIG_DERIVED( ntsc, vic20 )
// basic machine hardware
MCFG_CPU_ADD(M6502_TAG, M6502, MOS6560_CLOCK)
MCFG_CPU_PROGRAM_MAP(vic20_mem)
@ -788,7 +757,7 @@ static MACHINE_CONFIG_DERIVED( vic20_ntsc, vic20_common )
// video/sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_MOS6560_ADD(M6560_TAG, SCREEN_TAG, MOS6560_CLOCK, vic_ntsc_intf)
MCFG_MOS6560_ADD(M6560_TAG, SCREEN_TAG, MOS6560_CLOCK, vic_intf, vic_videoram_map, vic_colorram_map)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
@ -803,10 +772,10 @@ MACHINE_CONFIG_END
//-------------------------------------------------
// MACHINE_CONFIG( vic20_pal )
// MACHINE_CONFIG( pal )
//-------------------------------------------------
static MACHINE_CONFIG_DERIVED( vic20_pal, vic20_common )
static MACHINE_CONFIG_DERIVED( pal, vic20 )
// basic machine hardware
MCFG_CPU_ADD(M6502_TAG, M6502, MOS6561_CLOCK)
MCFG_CPU_PROGRAM_MAP(vic20_mem)
@ -814,7 +783,7 @@ static MACHINE_CONFIG_DERIVED( vic20_pal, vic20_common )
// video/sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_MOS6561_ADD(M6560_TAG, SCREEN_TAG, MOS6561_CLOCK, vic_pal_intf)
MCFG_MOS6561_ADD(M6560_TAG, SCREEN_TAG, MOS6561_CLOCK, vic_intf, vic_videoram_map, vic_colorram_map)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
@ -908,8 +877,8 @@ ROM_END
// GAME DRIVERS
//**************************************************************************
// YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS
COMP( 1980, vic1001, 0, 0, vic20_ntsc, vic1001, driver_device, 0, "Commodore Business Machines", "VIC-1001 (Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
COMP( 1981, vic20, vic1001, 0, vic20_ntsc, vic20, driver_device, 0, "Commodore Business Machines", "VIC-20 (NTSC)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
COMP( 1981, vic20p, vic1001, 0, vic20_pal, vic20, driver_device, 0, "Commodore Business Machines", "VIC-20 / VC-20 (PAL)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
COMP( 1981, vic20s, vic1001, 0, vic20_pal, vic20s, driver_device, 0, "Commodore Business Machines", "VIC-20 (Sweden/Finland)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
// YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS
COMP( 1980, vic1001, 0, 0, ntsc, vic1001, driver_device, 0, "Commodore Business Machines", "VIC-1001 (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
COMP( 1981, vic20, vic1001, 0, ntsc, vic20, driver_device, 0, "Commodore Business Machines", "VIC-20 (NTSC)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
COMP( 1981, vic20p, vic1001, 0, pal, vic20, driver_device, 0, "Commodore Business Machines", "VIC-20 / VC-20 (PAL)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
COMP( 1981, vic20s, vic1001, 0, pal, vic20s, driver_device, 0, "Commodore Business Machines", "VIC-20 (Sweden/Finland)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -29,7 +29,6 @@
#define IEC_TAG "iec"
#define SCREEN_TAG "screen"
#define CONTROL1_TAG "joy1"
#define CONTROL2_TAG "joy2"
class vic20_state : public driver_device
{
@ -42,11 +41,11 @@ public:
m_vic(*this, M6560_TAG),
m_iec(*this, CBM_IEC_TAG),
m_joy1(*this, CONTROL1_TAG),
m_joy2(*this, CONTROL2_TAG),
m_exp(*this, VIC20_EXPANSION_SLOT_TAG),
m_user(*this, VIC20_USER_PORT_TAG),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
m_ram(*this, RAM_TAG)
m_ram(*this, RAM_TAG),
m_color_ram(*this, "color_ram")
{ }
required_device<cpu_device> m_maincpu;
@ -55,7 +54,6 @@ public:
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;
required_device<vic20_expansion_slot_device> m_exp;
required_device<vic20_user_port_device> m_user;
required_device<pet_datassette_port_device> m_cassette;
@ -67,11 +65,10 @@ public:
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_READ8_MEMBER( vic_videoram_r );
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 );
@ -90,7 +87,7 @@ public:
UINT8 *m_charom;
// video state
UINT8 *m_color_ram;
required_shared_ptr<UINT8> m_color_ram;
// keyboard state
int m_key_col;

View File

@ -12,7 +12,6 @@
TODO:
- fast loader does not work with 1541
- graphics corruption during Ultimax mode (VIC issue?)
- IDE unknown command (E8)
- FT245 USB
- CompactFlash slot
@ -219,7 +218,8 @@ UINT8 c64_ide64_cartridge_device::c64_cd_r(address_space &space, offs_t offset,
{
m_rtc->sclk_w(0);
data = m_rtc->io_r();
data &= ~0x01;
data |= m_rtc->io_r();
m_rtc->sclk_w(1);
}
@ -232,6 +232,7 @@ UINT8 c64_ide64_cartridge_device::c64_cd_r(address_space &space, offs_t offset,
if (!rom_oe)
{
offs_t addr = (m_bank << 14) | (offset & 0x3fff);
data = m_flash_rom->read(addr);
}
else if (!ram_oe)
@ -328,3 +329,23 @@ void c64_ide64_cartridge_device::c64_cd_w(address_space &space, offs_t offset, U
}
}
}
//-------------------------------------------------
// c64_game_r - GAME read
//-------------------------------------------------
int c64_ide64_cartridge_device::c64_game_r(offs_t offset, int ba, int rw, int hiram)
{
return ba ? m_game : 1;
}
//-------------------------------------------------
// c64_exrom_r - EXROM read
//-------------------------------------------------
int c64_ide64_cartridge_device::c64_exrom_r(offs_t offset, int ba, int rw, int hiram)
{
return ba ? m_exrom : 1;
}

View File

@ -48,6 +48,8 @@ protected:
// device_c64_expansion_card_interface overrides
virtual UINT8 c64_cd_r(address_space &space, offs_t offset, UINT8 data, int ba, int roml, int romh, int io1, int io2);
virtual void c64_cd_w(address_space &space, offs_t offset, UINT8 data, int ba, int roml, int romh, int io1, int io2);
virtual int c64_game_r(offs_t offset, int ba, int rw, int hiram);
virtual int c64_exrom_r(offs_t offset, int ba, int rw, int hiram);
private:
required_device<atmel_29c010_device> m_flash_rom;

View File

@ -1050,51 +1050,6 @@ INPUT_PORTS_START( vic_special )
INPUT_PORTS_END
/* Paddle buttons are read in the same bits as some joystick inputs */
static CUSTOM_INPUT( vic_custom_inputs )
{
int bit_mask = (FPTR)param;
UINT8 port = 0;
if ((field.machine().root_device().ioport("CTRLSEL")->read() & 0xf0) == 0x10)
port |= (field.machine().root_device().ioport("FAKE0")->read() & bit_mask) ? 1 : 0;
if ((field.machine().root_device().ioport("CTRLSEL")->read() & 0xf0) == 0x00)
port |= (field.machine().root_device().ioport("FAKE1")->read() & bit_mask) ? 1 : 0;
return port;
}
INPUT_PORTS_START( vic_controls )
PORT_START( "CTRLSEL" )
PORT_CONFNAME( 0xf0, 0x00, DEF_STR( Controller ) )
PORT_CONFSETTING( 0x00, DEF_STR( Joystick ) )
PORT_CONFSETTING( 0x10, "Paddles" )
PORT_CONFSETTING( 0x20, "Lightpen" )
PORT_START( "JOY" )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(vic_custom_inputs, (void *)0x02)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Lightpen Signal") PORT_CODE(KEYCODE_LALT) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x20)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(vic_custom_inputs, (void *)0x01)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x00)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x00)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x00)
PORT_START( "FAKE0" )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Paddle 2 Button") PORT_CODE(KEYCODE_DEL) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x10)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Paddle 1 Button") PORT_CODE(KEYCODE_INSERT) PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x10)
PORT_START( "FAKE1" )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x00)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CONDITION("CTRLSEL", 0x0f, EQUALS, 0x00)
PORT_START( "PADDLE0" )
PORT_BIT( 0xff,128,IPT_PADDLE) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0,255) PORT_CODE_DEC(KEYCODE_HOME) PORT_CODE_INC(KEYCODE_PGUP) PORT_REVERSE PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x10)
PORT_START( "PADDLE1" )
PORT_BIT( 0xff,128,IPT_PADDLE) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0,255) PORT_CODE_DEC(KEYCODE_END) PORT_CODE_INC(KEYCODE_PGDN) PORT_PLAYER(2) PORT_REVERSE PORT_CONDITION("CTRLSEL", 0xf0, EQUALS, 0x10)
INPUT_PORTS_END
SLOT_INTERFACE_START( cbm_datassette_devices )
SLOT_INTERFACE("c1530", C1530)
SLOT_INTERFACE_END
@ -1146,10 +1101,6 @@ SLOT_INTERFACE_START( cbm_ieee488_devices )
SLOT_INTERFACE("softbox", SOFTBOX)
SLOT_INTERFACE_END
SLOT_INTERFACE_START( vic20_control_port_devices )
SLOT_INTERFACE("joy", VCS_JOYSTICK)
SLOT_INTERFACE_END
SLOT_INTERFACE_START( vic20_expansion_cards )
SLOT_INTERFACE("exp", VIC1010)
SLOT_INTERFACE("3k", VIC1210)

View File

@ -86,7 +86,6 @@
#include "machine/vic10std.h"
#include "machine/vic20std.h"
#include "machine/vic20_megacart.h"
#include "machine/vcs_joy.h"
#define MCFG_CBM_IEC_ADD(_intf, _default_drive) \
@ -147,7 +146,6 @@ INPUT_PORTS_EXTERN( cbmb_special );
INPUT_PORTS_EXTERN( vic_keyboard );
INPUT_PORTS_EXTERN( vic_special );
INPUT_PORTS_EXTERN( vic_controls );

View File

@ -81,7 +81,7 @@ static MACHINE_CONFIG_FRAGMENT( plus4_sid )
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vic20_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
MACHINE_CONFIG_END

View File

@ -65,7 +65,7 @@ void vcs_joystick_device::device_start()
//-------------------------------------------------
// c64_pb_r - port B read
// vcs_joy_r - joystick read
//-------------------------------------------------
UINT8 vcs_joystick_device::vcs_joy_r()

View File

@ -0,0 +1,82 @@
/**********************************************************************
Atari Video Computer System lightpen emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#include "vcs_lightpen.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type VCS_LIGHTPEN = &device_creator<vcs_lightpen_device>;
INPUT_CHANGED_MEMBER( vcs_lightpen_device::trigger )
{
// TODO trigger timer at correct screen position
}
static INPUT_PORTS_START( vcs_lightpen )
PORT_START("JOY")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vcs_lightpen_device, trigger, 0)
PORT_BIT( 0xdf, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("LIGHTX")
PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X) PORT_NAME("Lightpen X Axis") PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_PLAYER(1)
PORT_START("LIGHTY")
PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y) PORT_NAME("Lightpen Y Axis") PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_PLAYER(1)
INPUT_PORTS_END
//-------------------------------------------------
// input_ports - device-specific input ports
//-------------------------------------------------
ioport_constructor vcs_lightpen_device::device_input_ports() const
{
return INPUT_PORTS_NAME( vcs_lightpen );
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// vcs_lightpen_device - constructor
//-------------------------------------------------
vcs_lightpen_device::vcs_lightpen_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, VCS_LIGHTPEN, "Light Pen", tag, owner, clock),
device_vcs_control_port_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void vcs_lightpen_device::device_start()
{
}
//-------------------------------------------------
// vcs_joy_r - lightpen read
//-------------------------------------------------
UINT8 vcs_lightpen_device::vcs_joy_r()
{
return ioport("JOY")->read();
}

View File

@ -0,0 +1,53 @@
/**********************************************************************
Atari Video Computer System lightpen emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#pragma once
#ifndef __VCS_LIGHTPEN__
#define __VCS_LIGHTPEN__
#include "emu.h"
#include "machine/vcsctrl.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> vcs_lightpen_device
class vcs_lightpen_device : public device_t,
public device_vcs_control_port_interface
{
public:
// construction/destruction
vcs_lightpen_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// optional information overrides
virtual ioport_constructor device_input_ports() const;
DECLARE_INPUT_CHANGED_MEMBER( trigger );
protected:
// device-level overrides
virtual void device_config_complete() { m_shortname = "vcs_lightpen"; }
virtual void device_start();
// device_vcs_control_port_interface overrides
virtual UINT8 vcs_joy_r();
};
// device type definition
extern const device_type VCS_LIGHTPEN;
#endif

View File

@ -0,0 +1,97 @@
/**********************************************************************
Atari Video Computer System analog paddles emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#include "vcs_paddles.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type VCS_PADDLES = &device_creator<vcs_paddles_device>;
static INPUT_PORTS_START( vcs_paddles )
PORT_START("JOY")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0xf3, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("POTX")
PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_PLAYER(1) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0, 255)
PORT_START("POTY")
PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_PLAYER(2) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_MINMAX(0, 255)
INPUT_PORTS_END
//-------------------------------------------------
// input_ports - device-specific input ports
//-------------------------------------------------
ioport_constructor vcs_paddles_device::device_input_ports() const
{
return INPUT_PORTS_NAME( vcs_paddles );
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// vcs_paddles_device - constructor
//-------------------------------------------------
vcs_paddles_device::vcs_paddles_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, VCS_PADDLES, "Digital paddles", tag, owner, clock),
device_vcs_control_port_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void vcs_paddles_device::device_start()
{
}
//-------------------------------------------------
// vcs_joy_r - joystick read
//-------------------------------------------------
UINT8 vcs_paddles_device::vcs_joy_r()
{
return ioport("JOY")->read();
}
//-------------------------------------------------
// vcs_pot_x_r - potentiometer X read
//-------------------------------------------------
UINT8 vcs_paddles_device::vcs_pot_x_r()
{
return ioport("POTX")->read();
}
//-------------------------------------------------
// vcs_pot_y_r - potentiometer Y read
//-------------------------------------------------
UINT8 vcs_paddles_device::vcs_pot_y_r()
{
return ioport("POTY")->read();
}

View File

@ -0,0 +1,53 @@
/**********************************************************************
Atari Video Computer System analog paddles emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#pragma once
#ifndef __VCS_PADDLES__
#define __VCS_PADDLES__
#include "emu.h"
#include "machine/vcsctrl.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> vcs_paddles_device
class vcs_paddles_device : public device_t,
public device_vcs_control_port_interface
{
public:
// construction/destruction
vcs_paddles_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// optional information overrides
virtual ioport_constructor device_input_ports() const;
protected:
// device-level overrides
virtual void device_config_complete() { m_shortname = "vcs_paddles"; }
virtual void device_start();
// device_vcs_control_port_interface overrides
virtual UINT8 vcs_joy_r();
virtual UINT8 vcs_pot_x_r();
virtual UINT8 vcs_pot_y_r();
};
// device type definition
extern const device_type VCS_PADDLES;
#endif

View File

@ -78,8 +78,20 @@ void vcs_control_port_device::device_start()
}
READ8_MEMBER( vcs_control_port_device::joy_r ) { UINT8 data = 0xff; if (m_device != NULL) data = m_device->vcs_joy_r(); return data; }
UINT8 vcs_control_port_device::joy_r() { UINT8 data = 0xff; if (m_device != NULL) data = m_device->vcs_joy_r(); return data; }
READ8_MEMBER( vcs_control_port_device::joy_r ) { return joy_r(); }
UINT8 vcs_control_port_device::pot_x_r() { UINT8 data = 0xff; if (m_device != NULL) data = m_device->vcs_pot_x_r(); return data; }
READ8_MEMBER( vcs_control_port_device::pot_x_r ) { return pot_x_r(); }
UINT8 vcs_control_port_device::pot_y_r() { UINT8 data = 0xff; if (m_device != NULL) data = m_device->vcs_pot_y_r(); return data; }
READ8_MEMBER( vcs_control_port_device::pot_y_r ) { return pot_y_r(); }
//-------------------------------------------------
// SLOT_INTERFACE( vcs_control_port_devices )
//-------------------------------------------------
SLOT_INTERFACE_START( vcs_control_port_devices )
SLOT_INTERFACE("joy", VCS_JOYSTICK)
SLOT_INTERFACE("pad", VCS_PADDLES)
SLOT_INTERFACE("lp", VCS_LIGHTPEN)
SLOT_INTERFACE_END

View File

@ -46,6 +46,7 @@ public:
virtual ~vcs_control_port_device();
// computer interface
UINT8 joy_r();
DECLARE_READ8_MEMBER( joy_r );
UINT8 pot_x_r();
DECLARE_READ8_MEMBER( pot_x_r );
@ -83,5 +84,12 @@ protected:
extern const device_type VCS_CONTROL_PORT;
// slot devices
#include "machine/vcs_joy.h"
#include "machine/vcs_lightpen.h"
#include "machine/vcs_paddles.h"
SLOT_INTERFACE_EXTERN( vcs_control_port_devices );
#endif

View File

@ -51,19 +51,19 @@ UINT8 vic20_standard_cartridge_device::vic20_cd_r(address_space &space, offs_t o
{
if (!blk1 && (m_blk1 != NULL))
{
data = m_blk1[offset & 0x1fff];
data = m_blk1[offset];
}
else if (!blk2 && (m_blk2 != NULL))
{
data = m_blk2[offset & 0x1fff];
data = m_blk2[offset];
}
else if (!blk3 && (m_blk3 != NULL))
{
data = m_blk3[offset & 0x1fff];
data = m_blk3[offset];
}
else if (!blk5 && (m_blk5 != NULL))
{
data = m_blk5[offset & 0x1fff];
data = m_blk5[offset];
}
return data;

View File

@ -102,6 +102,7 @@ void vic20_user_port_device::device_start()
m_cart = dynamic_cast<device_vic20_user_port_interface *>(get_card_device());
// resolve callbacks
m_out_light_pen_func.resolve(m_out_light_pen_cb, *this);
m_out_cb1_func.resolve(m_out_cb1_cb, *this);
m_out_cb2_func.resolve(m_out_cb2_cb, *this);
m_out_reset_func.resolve(m_out_reset_cb, *this);
@ -131,6 +132,7 @@ WRITE_LINE_MEMBER( vic20_user_port_device::cb2_w ) { if (m_cart != NULL) m_cart-
WRITE_LINE_MEMBER( vic20_user_port_device::atn_w ) { if (m_cart != NULL) m_cart->vic20_atn_w(state); }
WRITE_LINE_MEMBER( vic20_user_port_device::port_reset_w ) { if (m_cart != NULL) m_cart->vic20_reset_w(state); }
WRITE_LINE_MEMBER( vic20_user_port_device::light_pen_w ) { m_out_light_pen_func(state); }
WRITE_LINE_MEMBER( vic20_user_port_device::via_cb1_w ) { m_out_cb1_func(state); }
WRITE_LINE_MEMBER( vic20_user_port_device::via_cb2_w ) { m_out_cb2_func(state); }
WRITE_LINE_MEMBER( vic20_user_port_device::reset_w ) { m_out_reset_func(state); }

View File

@ -62,6 +62,7 @@
struct vic20_user_port_interface
{
devcb_write_line m_out_light_pen_cb;
devcb_write_line m_out_cb1_cb;
devcb_write_line m_out_cb2_cb;
devcb_write_line m_out_reset_cb;
@ -95,6 +96,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( port_reset_w );
// cartridge interface
DECLARE_WRITE_LINE_MEMBER( light_pen_w );
DECLARE_WRITE_LINE_MEMBER( via_cb1_w );
DECLARE_WRITE_LINE_MEMBER( via_cb2_w );
DECLARE_WRITE_LINE_MEMBER( reset_w );
@ -105,6 +107,7 @@ protected:
virtual void device_reset();
virtual void device_config_complete();
devcb_resolved_write_line m_out_light_pen_func;
devcb_resolved_write_line m_out_cb1_func;
devcb_resolved_write_line m_out_cb2_func;
devcb_resolved_write_line m_out_reset_func;

View File

@ -553,6 +553,8 @@ $(MESSOBJ)/shared.a: \
$(MESS_MACHINE)/null_modem.o \
$(MESS_MACHINE)/vcsctrl.o \
$(MESS_MACHINE)/vcs_joy.o \
$(MESS_MACHINE)/vcs_lightpen.o \
$(MESS_MACHINE)/vcs_paddles.o \

View File

@ -535,10 +535,10 @@ mos6566_device::mos6566_device(const machine_config &mconfig, const char *tag, d
device_memory_interface(mconfig, *this),
device_execute_interface(mconfig, *this),
m_icount(0),
m_variant(TYPE_6566),
m_videoram_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, NULL, *ADDRESS_MAP_NAME(mos6566_videoram_map)),
m_colorram_space_config("colorram", ENDIANNESS_LITTLE, 8, 10, 0, NULL, *ADDRESS_MAP_NAME(mos6566_colorram_map))
{
m_variant = TYPE_6566;
}
mos6566_device::mos6566_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock)
@ -586,6 +586,7 @@ void mos6566_device::device_config_complete()
// or initialize to defaults if none provided
else
{
// TODO
}
}

View File

@ -80,16 +80,16 @@
#pragma once
#ifndef __MOS656X__
#define __MOS656X__
#ifndef __MOS6566__
#define __MOS6566__
#include "emu.h"
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
//***************************************************************************
// DEVICE CONFIGURATION MACROS
//***************************************************************************
#define MCFG_MOS6566_ADD(_tag, _screen_tag, _clock, _config, _videoram_map, _colorram_map) \
MCFG_DEVICE_ADD(_tag, MOS6566, _clock) \
@ -254,9 +254,9 @@
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
//***************************************************************************
// TYPE DEFINITIONS
//***************************************************************************
// ======================> mos6566_interface
@ -479,7 +479,7 @@ public:
};
// device type definition
// device type definitions
extern const device_type MOS6566;
extern const device_type MOS6567;
extern const device_type MOS8562;