(MESS) p500: Rewrote the driver using the PLAs for address decoding. [Curt Coder]

This commit is contained in:
Curt Coder 2012-09-19 13:56:56 +00:00
parent f4d7dcb19a
commit cd3e8d7955
16 changed files with 2034 additions and 143 deletions

6
.gitattributes vendored
View File

@ -5582,6 +5582,7 @@ src/mess/drivers/c900.c svneol=native#text/plain
src/mess/drivers/camplynx.c svneol=native#text/plain
src/mess/drivers/casloopy.c svneol=native#text/plain
src/mess/drivers/cat.c svneol=native#text/plain
src/mess/drivers/cbm2.c svneol=native#text/plain
src/mess/drivers/cbmb.c svneol=native#text/plain
src/mess/drivers/ccs2422.c svneol=native#text/plain
src/mess/drivers/ccs2810.c svneol=native#text/plain
@ -6060,6 +6061,7 @@ src/mess/includes/c64_legacy.h svneol=native#text/plain
src/mess/includes/c65.h svneol=native#text/plain
src/mess/includes/c80.h svneol=native#text/plain
src/mess/includes/cbm.h svneol=native#text/plain
src/mess/includes/cbm2.h svneol=native#text/plain
src/mess/includes/cbmb.h svneol=native#text/plain
src/mess/includes/cgc7900.h svneol=native#text/plain
src/mess/includes/cgenie.h svneol=native#text/plain
@ -6611,6 +6613,10 @@ src/mess/machine/c65.c svneol=native#text/plain
src/mess/machine/c8280.c svneol=native#text/plain
src/mess/machine/c8280.h svneol=native#text/plain
src/mess/machine/cbm.c svneol=native#text/plain
src/mess/machine/cbm2_std.c svneol=native#text/plain
src/mess/machine/cbm2_std.h svneol=native#text/plain
src/mess/machine/cbm2exp.c svneol=native#text/plain
src/mess/machine/cbm2exp.h svneol=native#text/plain
src/mess/machine/cbmb.c svneol=native#text/plain
src/mess/machine/cbmiec.c svneol=native#text/plain
src/mess/machine/cbmiec.h svneol=native#text/plain

View File

@ -9,11 +9,13 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
<description>Calc Result</description>
<year>198?</year>
<publisher>Handic Software</publisher>
<part name="cart" interface="cbm700_cart">
<dataarea name="rom" size="0x2000">
<part name="cart" interface="cbm2_cart">
<dataarea name="bank1" size="0x2000">
<rom name="calc_result-bx700.bin" size="0x2000" crc="4775ebb3" sha1="5c6928a9cd8a3ce6a1d11221292b832295d6543e" offset="0x0000" />
</dataarea>
</part>
<part name="flop" interface="floppy_5_25">
<dataarea name="flop" size="1070662">
<rom name="calc_result_700_bx_single_version_v1.0.d82" size="1070662" crc="244a2122" sha1="44661ed8e3307bb967f97ce1f5a247ca3cded0b3" offset="0" />

View File

@ -318,6 +318,12 @@ WRITE_LINE_DEVICE_HANDLER( tpi6525_i4_w )
}
}
WRITE_LINE_MEMBER( tpi6525_device::i0_w ) { tpi6525_i0_w(this, state); }
WRITE_LINE_MEMBER( tpi6525_device::i1_w ) { tpi6525_i1_w(this, state); }
WRITE_LINE_MEMBER( tpi6525_device::i2_w ) { tpi6525_i2_w(this, state); }
WRITE_LINE_MEMBER( tpi6525_device::i3_w ) { tpi6525_i3_w(this, state); }
WRITE_LINE_MEMBER( tpi6525_device::i4_w ) { tpi6525_i4_w(this, state); }
READ8_DEVICE_HANDLER( tpi6525_porta_r )
{
@ -500,6 +506,11 @@ READ8_DEVICE_HANDLER( tpi6525_r )
return data;
}
READ8_MEMBER( tpi6525_device::read )
{
return tpi6525_r(this, space, offset);
}
WRITE8_DEVICE_HANDLER( tpi6525_w )
{
@ -574,6 +585,11 @@ WRITE8_DEVICE_HANDLER( tpi6525_w )
}
}
WRITE8_MEMBER( tpi6525_device::write )
{
tpi6525_w(this, space, offset, data);
}
/* this should probably be done better, needed for amigacd.c */

View File

@ -64,6 +64,16 @@ public:
// access to legacy token
void *token() const { assert(m_token != NULL); return m_token; }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( i0_w );
DECLARE_WRITE_LINE_MEMBER( i1_w );
DECLARE_WRITE_LINE_MEMBER( i2_w );
DECLARE_WRITE_LINE_MEMBER( i3_w );
DECLARE_WRITE_LINE_MEMBER( i4_w );
protected:
// device-level overrides
virtual void device_config_complete();

View File

@ -64,7 +64,7 @@ inline void pla_device::parse_fusemap()
// get_product -
//-------------------------------------------------
inline int pla_device::get_product(int term)
inline bool pla_device::get_product(int term)
{
UINT32 input_true = m_and_true[term] | m_i;
UINT32 input_comp = m_and_comp[term] | ~m_i;

View File

@ -72,7 +72,7 @@ protected:
virtual void device_start();
inline void parse_fusemap();
inline int get_product(int term);
inline bool get_product(int term);
inline void update_outputs();
int m_inputs;

1228
src/mess/drivers/cbm2.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -146,33 +146,6 @@ static ADDRESS_MAP_START(cbmb_mem , AS_PROGRAM, 8, cbmb_state )
AM_RANGE(0xfe000, 0xfffff) AM_ROM AM_SHARE("kernal")
ADDRESS_MAP_END
static ADDRESS_MAP_START(p500_mem , AS_PROGRAM, 8, cbmb_state )
AM_RANGE(0x00000, 0x1ffff) AM_RAM
AM_RANGE(0x20000, 0x2ffff) AM_READONLY AM_WRITENOP
AM_RANGE(0x30000, 0x7ffff) AM_RAM
AM_RANGE(0x80000, 0x8ffff) AM_READONLY AM_WRITENOP
AM_RANGE(0x90000, 0xf07ff) AM_RAM
#if 0
AM_RANGE(0xf0800, 0xf0fff) AM_READ_LEGACY(SMH_ROM)
#endif
AM_RANGE(0xf1000, 0xf1fff) AM_ROM /* cartridges or ram */
AM_RANGE(0xf2000, 0xf3fff) AM_ROM /* cartridges or ram */
AM_RANGE(0xf4000, 0xf5fff) AM_ROM
AM_RANGE(0xf6000, 0xf7fff) AM_ROM
AM_RANGE(0xf8000, 0xfbfff) AM_ROM AM_SHARE("basic")
AM_RANGE(0xfd000, 0xfd3ff) AM_RAM AM_SHARE("videoram") /* videoram */
AM_RANGE(0xfd400, 0xfd7ff) AM_RAM_WRITE(cbmb_colorram_w) AM_SHARE("colorram") /* colorram */
AM_RANGE(0xfd800, 0xfd8ff) AM_DEVREADWRITE("vic6567", mos6566_device, read, write)
/* disk units */
AM_RANGE(0xfda00, 0xfdaff) AM_DEVREADWRITE("sid6581", sid6581_device, read, write)
/* db00 coprocessor */
AM_RANGE(0xfdc00, 0xfdcff) AM_DEVREADWRITE_LEGACY("cia", mos6526_r, mos6526_w)
/* dd00 acia */
AM_RANGE(0xfde00, 0xfdeff) AM_DEVREADWRITE_LEGACY("tpi6525_0", tpi6525_r, tpi6525_w)
AM_RANGE(0xfdf00, 0xfdfff) AM_DEVREADWRITE_LEGACY("tpi6525_1", tpi6525_r, tpi6525_w)
AM_RANGE(0xfe000, 0xfffff) AM_ROM AM_SHARE("kernal")
ADDRESS_MAP_END
/*************************************
*
@ -311,61 +284,6 @@ static const mc6845_interface cbm700_crtc = {
NULL
};
/* p500 uses a VIC II chip */
READ8_MEMBER( cbmb_state::vic_lightpen_x_cb )
{
return ioport("LIGHTX")->read() & ~0x01;
}
READ8_MEMBER( cbmb_state::vic_lightpen_y_cb )
{
return ioport("LIGHTY")->read() & ~0x01;
}
READ8_MEMBER( cbmb_state::vic_lightpen_button_cb )
{
return ioport("OTHER")->read() & 0x04;
}
READ8_MEMBER( cbmb_state::vic_dma_read )
{
if (offset >= 0x1000)
return m_videoram[offset & 0x3ff];
else
return m_chargen[offset & 0xfff];
}
READ8_MEMBER( cbmb_state::vic_dma_read_color )
{
return m_colorram[offset & 0x3ff];
}
READ8_MEMBER( cbmb_state::vic_rdy_cb )
{
return ioport("CTRLSEL")->read() & 0x08;
}
static ADDRESS_MAP_START( vic_videoram_map, AS_0, 8, cbmb_state )
AM_RANGE(0x0000, 0x3fff) AM_READ(vic_dma_read)
ADDRESS_MAP_END
static ADDRESS_MAP_START( vic_colorram_map, AS_1, 8, cbmb_state )
AM_RANGE(0x000, 0x3ff) AM_READ(vic_dma_read_color)
ADDRESS_MAP_END
static MOS6567_INTERFACE( vic_intf )
{
"screen",
"maincpu",
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(cbmb_state, vic_lightpen_x_cb),
DEVCB_DRIVER_MEMBER(cbmb_state, vic_lightpen_y_cb),
DEVCB_DRIVER_MEMBER(cbmb_state, vic_lightpen_button_cb),
DEVCB_DRIVER_MEMBER(cbmb_state, vic_rdy_cb)
};
static const sid6581_interface sid_intf =
{
DEVCB_NULL,
@ -494,41 +412,6 @@ static MACHINE_CONFIG_DERIVED( bx256hp, cbm700 )
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( p500, cbmb_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6509, VIC6567_CLOCK) /* 7.8336 MHz */
MCFG_CPU_PROGRAM_MAP(p500_mem)
//MCFG_CPU_PERIODIC_INT_DRIVER(cbmb_state, vic2_raster_irq, VIC6567_HRETRACERATE)
MCFG_MACHINE_RESET_OVERRIDE(cbmb_state, cbmb )
/* video hardware */
MCFG_MOS6567_ADD("vic6567", "screen", VIC6567_CLOCK, vic_intf, vic_videoram_map, vic_colorram_map)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("sid6581", SID6581, 1000000)
MCFG_SOUND_CONFIG(sid_intf)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
/* devices */
MCFG_QUICKLOAD_ADD("quickload", p500, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
/* cia */
MCFG_MOS6526R1_ADD("cia", VIC6567_CLOCK, 60, cbmb_cia)
/* tpi */
MCFG_TPI6525_ADD("tpi6525_0", cbmb_tpi_0_intf)
MCFG_TPI6525_ADD("tpi6525_1", cbmb_tpi_1_intf)
/* IEEE bus */
MCFG_CBM_IEEE488_ADD(ieee488_intf, "c8250")
MCFG_FRAGMENT_ADD(cbmb_cartslot)
MACHINE_CONFIG_END
/*************************************
*
* ROM definition(s)
@ -678,26 +561,6 @@ ROM_START( cbm720se )
ROM_LOAD( "906114-05.bin", 0x00, 0xf5, CRC(ff6ba6b6) SHA1(45808c570eb2eda7091c51591b3dbd2db1ac646a) )
ROM_END
ROM_START( p500 )
ROM_REGION( 0x101000, "maincpu", 0 )
ROM_SYSTEM_BIOS(0, "default", "BASIC 4.0 new" )
ROMX_LOAD( "901236-02.bin", 0xf8000, 0x2000, CRC(c62ab16f) SHA1(f50240407bade901144f7e9f489fa9c607834eca), ROM_BIOS(1) )
ROMX_LOAD( "901235-02.bin", 0xfa000, 0x2000, CRC(20b7df33) SHA1(1b9a55f12f8cf025754d8029cc5324b474c35841), ROM_BIOS(1) )
ROMX_LOAD( "901234-02.bin", 0xfe000, 0x2000, CRC(f46bbd2b) SHA1(097197d4d08e0b82e0466a5f1fbd49a24f3d2523), ROM_BIOS(1) )
ROM_SYSTEM_BIOS(1, "old", "BASIC 4.0 old" )
ROMX_LOAD( "901236-01.bin", 0xf8000, 0x2000, CRC(33eb6aa2) SHA1(7e3497ae2edbb38c753bd31ed1bf3ae798c9a976), ROM_BIOS(2) )
ROMX_LOAD( "901235-01.bin", 0xfa000, 0x2000, CRC(18a27feb) SHA1(951b5370dd7db762b8504a141f9f26de345069bb), ROM_BIOS(2) )
ROMX_LOAD( "901234-01.bin", 0xfe000, 0x2000, CRC(67962025) SHA1(24b41b65c85bf30ab4e2911f677ce9843845b3b1), ROM_BIOS(2) )
ROM_LOAD( "901225-01.bin", 0x100000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) )
ROM_REGION( 0xf5, "pla1", 0 )
ROM_LOAD( "906114-02.bin", 0x00, 0xf5, CRC(6436b20b) SHA1(57ebebe771791288051afd1abe9b7500bd2df847) )
ROM_REGION( 0xf5, "pla2", 0 )
ROM_LOAD( "906114-03.bin", 0x00, 0xf5, CRC(668c073e) SHA1(1115858bb2dc91ea9e2016ba2e23ec94239358b4) )
ROM_END
/***************************************************************************
@ -720,5 +583,3 @@ COMP( 1983, cbm720, cbm610, 0, cbm700pal, cbm700, cbmb_state, cbm700,
COMP( 1983, cbm720se, cbm610, 0, cbm700pal, cbm700, cbmb_state, cbm700, "Commodore Business Machines", "CBM 720 (Sweden/Finland, 50Hz)", GAME_NOT_WORKING )
COMP( 1983, bx256hp, cbm610, 0, bx256hp, cbm700, cbmb_state, cbm700, "Commodore Business Machines", "BX256-80HP (60Hz)", GAME_NOT_WORKING )
COMP( 1983, p500, 0, 0, p500, p500, cbmb_state, p500, "Commodore Business Machines", "P500 (proto, a.k.a. B128-40 or Pet-II)", GAME_NOT_WORKING )

164
src/mess/includes/cbm2.h Normal file
View File

@ -0,0 +1,164 @@
#pragma once
#ifndef __P500__
#define __P500__
#include "emu.h"
#include "cpu/m6502/m6509.h"
#include "formats/cbm_snqk.h"
#include "includes/cbm.h"
#include "machine/6525tpi.h"
#include "machine/6526cia.h"
#include "machine/6551acia.h"
#include "machine/cbm2exp.h"
#include "machine/cbmipt.h"
#include "machine/ieee488.h"
#include "machine/petcass.h"
#include "machine/pla.h"
#include "machine/ram.h"
#include "machine/vcsctrl.h"
#include "sound/dac.h"
#include "sound/sid6581.h"
#include "video/mos6566.h"
#define M6509_TAG "u13"
#define PLA1_TAG "u78"
#define PLA2_TAG "u88"
#define MOS6567_TAG "u23"
#define MOS6569_TAG "u23"
#define MOS6851_TAG "u4"
#define MOS6525_1_TAG "u20"
#define MOS6525_2_TAG "u102"
#define MOS6551A_TAG "u19"
#define MOS6526_TAG "u2"
#define SCREEN_TAG "screen"
#define CONTROL1_TAG "joy1"
#define CONTROL2_TAG "joy2"
class p500_state : public driver_device
{
public:
p500_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, M6509_TAG),
m_pla1(*this, PLA1_TAG),
m_pla2(*this, PLA2_TAG),
m_vic(*this, MOS6569_TAG),
m_sid(*this, MOS6851_TAG),
m_tpi1(*this, MOS6525_1_TAG),
m_tpi2(*this, MOS6525_2_TAG),
m_acia(*this, MOS6551A_TAG),
m_cia(*this, MOS6526_TAG),
m_joy1(*this, CONTROL1_TAG),
m_joy2(*this, CONTROL2_TAG),
m_exp(*this, CBM2_EXPANSION_SLOT_TAG),
m_ram(*this, RAM_TAG),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
m_ieee(*this, IEEE488_TAG),
m_buffer_ram(*this, "buffer_ram"),
m_dramon(1),
m_video_ram(*this, "video_ram"),
m_color_ram(*this, "color_ram"),
m_statvid(1),
m_vicdotsel(1),
m_vicbnksel(0x03),
m_todclk(0),
m_vic_irq(CLEAR_LINE),
m_tpi1_irq(CLEAR_LINE),
m_cass_rd(1),
m_user_flag(0),
m_tpi2_pa(0),
m_tpi2_pb(0)
{ }
required_device<cpu_device> m_maincpu;
required_device<pls100_device> m_pla1;
required_device<pls100_device> m_pla2;
required_device<mos6566_device> m_vic;
required_device<sid6581_device> m_sid;
required_device<tpi6525_device> m_tpi1;
required_device<tpi6525_device> m_tpi2;
required_device<acia6551_device> m_acia;
required_device<mos6526_device> m_cia;
required_device<vcs_control_port_device> m_joy1;
required_device<vcs_control_port_device> m_joy2;
required_device<cbm2_expansion_slot_device> m_exp;
required_device<ram_device> m_ram;
required_device<pet_datassette_port_device> m_cassette;
required_device<ieee488_device> m_ieee;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
virtual void machine_start();
virtual void machine_reset();
void check_interrupts();
void bankswitch(offs_t offset, offs_t va, int srw, int sphi0, int sphi1, int sphi2, int ba, int ae, int bras, int bcas, int busy2, int refen,
int *datxen, int *dramxen, int *clrniben, int *_64kcasen, int *casenb, int *viddaten, int *viddat_tr,
int *clrnibcs, int *extbufcs, int *discromcs, int *buframcs, int *charomcs, int *viccs, int *vidmatcs,
int *csbank1, int *csbank2, int *csbank3, int *basiclocs, int *basichics, int *kernalcs,
int *cs1, int *sidcs, int *extprtcs, int *ciacs, int *aciacs, int *tript1cs, int *tript2cs, int *aec, int *vsysaden);
UINT8 read_memory(address_space &space, offs_t offset, offs_t va, int sphi0, int sphi1, int sphi2, int ba, int ae, int bras, int bcas);
void write_memory(address_space &space, offs_t offset, UINT8 data, int sphi0, int sphi1, int sphi2, int ba, int ae, int bras, int bcas);
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_READ8_MEMBER( vic_videoram_r );
DECLARE_WRITE_LINE_MEMBER( vic_irq_w );
DECLARE_READ8_MEMBER( sid_potx_r );
DECLARE_READ8_MEMBER( sid_poty_r );
DECLARE_WRITE_LINE_MEMBER( tpi1_irq_w );
DECLARE_READ8_MEMBER( tpi1_pa_r );
DECLARE_WRITE8_MEMBER( tpi1_pa_w );
DECLARE_READ8_MEMBER( tpi1_pb_r );
DECLARE_WRITE8_MEMBER( tpi1_pb_w );
DECLARE_WRITE_LINE_MEMBER( tpi1_ca_w );
DECLARE_WRITE_LINE_MEMBER( tpi1_cb_w );
DECLARE_WRITE8_MEMBER( tpi2_pa_w );
DECLARE_WRITE8_MEMBER( tpi2_pb_w );
DECLARE_READ8_MEMBER( tpi2_pc_r );
DECLARE_WRITE8_MEMBER( tpi2_pc_w );
DECLARE_READ8_MEMBER( cia_pa_r );
DECLARE_WRITE8_MEMBER( cia_pa_w );
DECLARE_READ8_MEMBER( cia_pb_r );
DECLARE_WRITE8_MEMBER( cia_pb_w );
DECLARE_WRITE_LINE_MEMBER( tape_read_w );
// memory state
optional_shared_ptr<UINT8> m_buffer_ram;
UINT8 *m_basic;
UINT8 *m_kernal;
UINT8 *m_charom;
int m_dramon;
// video state
optional_shared_ptr<UINT8> m_video_ram;
optional_shared_ptr<UINT8> m_color_ram;
int m_statvid;
int m_vicdotsel;
int m_vicbnksel;
// interrupt state
int m_todclk;
int m_vic_irq;
int m_tpi1_irq;
int m_cass_rd;
int m_user_flag;
// keyboard state;
UINT8 m_tpi2_pa;
UINT8 m_tpi2_pb;
UINT8 m_cia_pa;
// timers
emu_timer *m_todclk_timer;
};
#endif

View File

@ -0,0 +1,66 @@
/**********************************************************************
Commodore CBM-II Standard cartridge emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#include "cbm2_std.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type CBM2_STD = &device_creator<cbm2_standard_cartridge_device>;
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// cbm2_standard_cartridge_device - constructor
//-------------------------------------------------
cbm2_standard_cartridge_device::cbm2_standard_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, CBM2_STD, "CBM-II standard cartridge", tag, owner, clock),
device_cbm2_expansion_card_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void cbm2_standard_cartridge_device::device_start()
{
}
//-------------------------------------------------
// cbm2_bd_r - cartridge data read
//-------------------------------------------------
UINT8 cbm2_standard_cartridge_device::cbm2_bd_r(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3)
{
if (!csbank1 && m_bank1_mask)
{
data = m_bank1[offset & m_bank1_mask];
}
else if (!csbank2 && m_bank2_mask)
{
data = m_bank2[offset & m_bank2_mask];
}
else if (!csbank3 && m_bank3_mask)
{
data = m_bank3[offset & m_bank3_mask];
}
return data;
}

View File

@ -0,0 +1,49 @@
/**********************************************************************
Commodore CBM-II Standard cartridge emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#pragma once
#ifndef __CBM2_STANDARD_CARTRIDGE__
#define __CBM2_STANDARD_CARTRIDGE__
#include "emu.h"
#include "imagedev/cartslot.h"
#include "machine/cbm2exp.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> cbm2_standard_cartridge_device
class cbm2_standard_cartridge_device : public device_t,
public device_cbm2_expansion_card_interface
{
public:
// construction/destruction
cbm2_standard_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
// device-level overrides
virtual void device_config_complete() { m_shortname = "cbm2_standard"; }
virtual void device_start();
// device_cbm2_expansion_card_interface overrides
virtual UINT8 cbm2_bd_r(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3);
};
// device type definition
extern const device_type CBM2_STD;
#endif

323
src/mess/machine/cbm2exp.c Normal file
View File

@ -0,0 +1,323 @@
/**********************************************************************
Commodore CBM-II Expansion Port emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#include "machine/cbm2exp.h"
//**************************************************************************
// MACROS/CONSTANTS
//**************************************************************************
#define LOG 0
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type CBM2_EXPANSION_SLOT = &device_creator<cbm2_expansion_slot_device>;
//**************************************************************************
// DEVICE CBM2_EXPANSION CARD INTERFACE
//**************************************************************************
//-------------------------------------------------
// device_cbm2_expansion_card_interface - constructor
//-------------------------------------------------
device_cbm2_expansion_card_interface::device_cbm2_expansion_card_interface(const machine_config &mconfig, device_t &device)
: device_slot_card_interface(mconfig, device),
m_bank1(NULL),
m_bank2(NULL),
m_bank3(NULL),
m_ram(NULL),
m_nvram(NULL),
m_nvram_size(0),
m_bank1_mask(0),
m_bank2_mask(0),
m_bank3_mask(0),
m_ram_mask(0)
{
m_slot = dynamic_cast<cbm2_expansion_slot_device *>(device.owner());
}
//-------------------------------------------------
// ~device_cbm2_expansion_card_interface - destructor
//-------------------------------------------------
device_cbm2_expansion_card_interface::~device_cbm2_expansion_card_interface()
{
}
//-------------------------------------------------
// cbm2_bank1_pointer - get bank 1 pointer
//-------------------------------------------------
UINT8* device_cbm2_expansion_card_interface::cbm2_bank1_pointer(running_machine &machine, size_t size)
{
if (m_bank1 == NULL)
{
m_bank1 = auto_alloc_array(machine, UINT8, size);
m_bank1_mask = size - 1;
}
return m_bank1;
}
//-------------------------------------------------
// cbm2_bank2_pointer - get bank 2 pointer
//-------------------------------------------------
UINT8* device_cbm2_expansion_card_interface::cbm2_bank2_pointer(running_machine &machine, size_t size)
{
if (m_bank2 == NULL)
{
m_bank2 = auto_alloc_array(machine, UINT8, size);
m_bank2_mask = size - 1;
}
return m_bank2;
}
//-------------------------------------------------
// cbm2_bank3_pointer - get bank 3 pointer
//-------------------------------------------------
UINT8* device_cbm2_expansion_card_interface::cbm2_bank3_pointer(running_machine &machine, size_t size)
{
if (m_bank3 == NULL)
{
m_bank3 = auto_alloc_array(machine, UINT8, size);
m_bank3_mask = size - 1;
}
return m_bank1;
}
//-------------------------------------------------
// cbm2_ram_pointer - get RAM pointer
//-------------------------------------------------
UINT8* device_cbm2_expansion_card_interface::cbm2_ram_pointer(running_machine &machine, size_t size)
{
if (m_ram == NULL)
{
m_ram = auto_alloc_array(machine, UINT8, size);
m_ram_mask = size - 1;
}
return m_ram;
}
//-------------------------------------------------
// cbm2_ram_pointer - get NVRAM pointer
//-------------------------------------------------
UINT8* device_cbm2_expansion_card_interface::cbm2_nvram_pointer(running_machine &machine, size_t size)
{
if (m_nvram == NULL)
{
m_nvram = auto_alloc_array(machine, UINT8, size);
m_nvram_mask = size - 1;
m_nvram_size = size;
}
return m_nvram;
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// cbm2_expansion_slot_device - constructor
//-------------------------------------------------
cbm2_expansion_slot_device::cbm2_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, CBM2_EXPANSION_SLOT, "PET-II expansion port", tag, owner, clock),
device_slot_interface(mconfig, *this),
device_image_interface(mconfig, *this)
{
}
//-------------------------------------------------
// cbm2_expansion_slot_device - destructor
//-------------------------------------------------
cbm2_expansion_slot_device::~cbm2_expansion_slot_device()
{
}
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void cbm2_expansion_slot_device::device_config_complete()
{
// set brief and instance name
update_names();
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void cbm2_expansion_slot_device::device_start()
{
m_cart = dynamic_cast<device_cbm2_expansion_card_interface *>(get_card_device());
// inherit bus clock
if (clock() == 0)
{
cbm2_expansion_slot_device *root = machine().device<cbm2_expansion_slot_device>(CBM2_EXPANSION_SLOT_TAG);
assert(root);
set_unscaled_clock(root->clock());
}
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void cbm2_expansion_slot_device::device_reset()
{
}
//-------------------------------------------------
// call_load -
//-------------------------------------------------
bool cbm2_expansion_slot_device::call_load()
{
size_t size = 0;
if (m_cart)
{
if (software_entry() == NULL)
{
size = length();
if (!mame_stricmp(filetype(), "20"))
{
fread(m_cart->cbm2_bank1_pointer(machine(), size), size);
}
else if (!mame_stricmp(filetype(), "40"))
{
fread(m_cart->cbm2_bank2_pointer(machine(), size), size);
}
else if (!mame_stricmp(filetype(), "60"))
{
fread(m_cart->cbm2_bank3_pointer(machine(), size), size);
}
}
else
{
size = get_software_region_length("bank1");
if (size) memcpy(m_cart->cbm2_bank1_pointer(machine(), size), get_software_region("bank1"), size);
size = get_software_region_length("bank2");
if (size) memcpy(m_cart->cbm2_bank2_pointer(machine(), size), get_software_region("bank2"), size);
size = get_software_region_length("bank3");
if (size) memcpy(m_cart->cbm2_bank3_pointer(machine(), size), get_software_region("bank3"), size);
size = get_software_region_length("ram");
if (size) memset(m_cart->cbm2_ram_pointer(machine(), size), 0, size);
size = get_software_region_length("nvram");
if (size) memset(m_cart->cbm2_nvram_pointer(machine(), size), 0, size);
}
}
return IMAGE_INIT_PASS;
}
//-------------------------------------------------
// call_softlist_load -
//-------------------------------------------------
bool cbm2_expansion_slot_device::call_softlist_load(char *swlist, char *swname, rom_entry *start_entry)
{
load_software_part_region(this, swlist, swname, start_entry);
return true;
}
//-------------------------------------------------
// get_default_card_software -
//-------------------------------------------------
const char * cbm2_expansion_slot_device::get_default_card_software(const machine_config &config, emu_options &options)
{
return software_get_default_slot(config, options, this, "standard");
}
//-------------------------------------------------
// read - cartridge data read
//-------------------------------------------------
UINT8 cbm2_expansion_slot_device::read(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3)
{
if (m_cart != NULL)
{
data = m_cart->cbm2_bd_r(space, offset, data, csbank1, csbank2, csbank3);
}
return data;
}
//-------------------------------------------------
// write - cartridge data write
//-------------------------------------------------
void cbm2_expansion_slot_device::write(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3)
{
if (m_cart != NULL)
{
m_cart->cbm2_bd_w(space, offset, data, csbank1, csbank2, csbank3);
}
}
//-------------------------------------------------
// phi2 - system clock frequency
//-------------------------------------------------
int cbm2_expansion_slot_device::phi2()
{
return clock();
}

157
src/mess/machine/cbm2exp.h Normal file
View File

@ -0,0 +1,157 @@
/**********************************************************************
Commodore CBM-II Expansion Port emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************
A0 1 A BD0
A1 2 B BD1
A2 3 C BD2
A3 4 D BD3
A4 5 E BD4
A5 6 F BD5
A6 7 H BD6
A7 8 J BD7
A8 9 K GND
A9 10 L GND
A10 11 M SR/_W
A11 12 N Sphi2
A12 13 P _CSBANK1
+5V 14 R _CSBANK2
+5V 15 S _CSBANK2
**********************************************************************/
#pragma once
#ifndef __CBM2_EXPANSION_SLOT__
#define __CBM2_EXPANSION_SLOT__
#include "emu.h"
//**************************************************************************
// CONSTANTS
//**************************************************************************
#define CBM2_EXPANSION_SLOT_TAG "exp"
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define CBM2_EXPANSION_INTERFACE(_name) \
const pet_expansion_slot_interface (_name) =
#define MCFG_CBM2_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot, _def_inp) \
MCFG_DEVICE_ADD(_tag, CBM2_EXPANSION_SLOT, _clock) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false)
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> cbm2_expansion_slot_device
class device_cbm2_expansion_card_interface;
class cbm2_expansion_slot_device : public device_t,
public device_slot_interface,
public device_image_interface
{
public:
// construction/destruction
cbm2_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~cbm2_expansion_slot_device();
// computer interface
UINT8 read(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3);
void write(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3);
// cartridge interface
int phi2();
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
virtual void device_reset();
// image-level overrides
virtual bool call_load();
virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry);
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
virtual bool is_readable() const { return 1; }
virtual bool is_writeable() const { return 0; }
virtual bool is_creatable() const { return 0; }
virtual bool must_be_loaded() const { return 0; }
virtual bool is_reset_on_load() const { return 1; }
virtual const char *image_interface() const { return "cbm2_cart"; }
virtual const char *file_extensions() const { return "20,40,60"; }
virtual const option_guide *create_option_guide() const { return NULL; }
// slot interface overrides
virtual const char * get_default_card_software(const machine_config &config, emu_options &options);
device_cbm2_expansion_card_interface *m_cart;
};
// ======================> device_cbm2_expansion_card_interface
class device_cbm2_expansion_card_interface : public device_slot_card_interface
{
friend class cbm2_expansion_slot_device;
public:
// construction/destruction
device_cbm2_expansion_card_interface(const machine_config &mconfig, device_t &device);
virtual ~device_cbm2_expansion_card_interface();
protected:
// initialization
virtual UINT8* cbm2_bank1_pointer(running_machine &machine, size_t size);
virtual UINT8* cbm2_bank2_pointer(running_machine &machine, size_t size);
virtual UINT8* cbm2_bank3_pointer(running_machine &machine, size_t size);
virtual UINT8* cbm2_ram_pointer(running_machine &machine, size_t size);
virtual UINT8* cbm2_nvram_pointer(running_machine &machine, size_t size);
// runtime
virtual UINT8 cbm2_bd_r(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3) { return data; };
virtual void cbm2_bd_w(address_space &space, offs_t offset, UINT8 data, int csbank1, int csbank2, int csbank3) { };
cbm2_expansion_slot_device *m_slot;
UINT8 *m_bank1;
UINT8 *m_bank2;
UINT8 *m_bank3;
UINT8 *m_ram;
UINT8 *m_nvram;
size_t m_nvram_size;
size_t m_bank1_mask;
size_t m_bank2_mask;
size_t m_bank3_mask;
size_t m_ram_mask;
size_t m_nvram_mask;
};
// device type definition
extern const device_type CBM2_EXPANSION_SLOT;
#endif

View File

@ -1043,6 +1043,10 @@ INPUT_PORTS_START( vic_special )
INPUT_PORTS_END
SLOT_INTERFACE_START( cbm2_expansion_cards )
SLOT_INTERFACE_INTERNAL("standard", CBM2_STD)
SLOT_INTERFACE_END
SLOT_INTERFACE_START( cbm_datassette_devices )
SLOT_INTERFACE("c1530", C1530)
SLOT_INTERFACE_END

View File

@ -60,6 +60,7 @@
#include "machine/c64_xl80.h"
#include "machine/c64_zaxxon.h"
#include "machine/c128_comal80.h"
#include "machine/cbm2_std.h"
#include "machine/c1541.h"
#include "machine/c1551.h"
#include "machine/c1571.h"
@ -149,6 +150,7 @@ INPUT_PORTS_EXTERN( vic_special );
SLOT_INTERFACE_EXTERN( cbm2_expansion_cards );
SLOT_INTERFACE_EXTERN( cbm_datassette_devices );
SLOT_INTERFACE_EXTERN( cbm_iec_devices );
SLOT_INTERFACE_EXTERN( sx1541_iec_devices );

View File

@ -888,6 +888,9 @@ $(MESSOBJ)/cbm.a: \
$(MESS_DRIVERS)/cbmb.o \
$(MESS_MACHINE)/cbmb.o \
$(MESS_VIDEO)/cbmb.o \
$(MESS_DRIVERS)/cbm2.o \
$(MESS_MACHINE)/cbm2exp.o \
$(MESS_MACHINE)/cbm2_std.o \
$(MESS_DRIVERS)/c65.o \
$(MESS_MACHINE)/c65.o \
$(MESS_DRIVERS)/c128.o \