From 8555376f43fd1d55d507d788b58c1a16ab5ea2e6 Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Thu, 23 Aug 2012 18:56:52 +0000 Subject: [PATCH] (MESS) c1541: Added ProLogic-DOS Classic kernal. (nw) --- src/mess/drivers/c64.c | 4 +- src/mess/machine/c1541.c | 156 +++++++++++++++++++++++++++++++++++--- src/mess/machine/c1541.h | 30 +++++++- src/mess/machine/cbmipt.c | 1 + 4 files changed, 179 insertions(+), 12 deletions(-) diff --git a/src/mess/drivers/c64.c b/src/mess/drivers/c64.c index d1e85728cf7..7427b63f859 100644 --- a/src/mess/drivers/c64.c +++ b/src/mess/drivers/c64.c @@ -1512,7 +1512,7 @@ ROM_START( c64n ) ROM_REGION( 0x2000, "basic", 0 ) ROM_LOAD( "901226-01.u3", 0x0000, 0x2000, CRC(f833d117) SHA1(79015323128650c742a3694c9429aa91f355905e) ) - ROM_REGION( 0x2000, "kernal", 0 ) + ROM_REGION( 0x4000, "kernal", 0 ) ROM_DEFAULT_BIOS("r3") ROM_SYSTEM_BIOS(0, "r1", "Kernal rev. 1" ) ROMX_LOAD( "901227-01.u4", 0x0000, 0x2000, CRC(dce782fa) SHA1(87cc04d61fc748b82df09856847bb5c2754a2033), ROM_BIOS(1) ) @@ -1568,6 +1568,8 @@ ROM_START( c64n ) ROMX_LOAD( "exos3.u4", 0x0000, 0x2000, CRC(4e54d020) SHA1(f8931b7c0b26807f4de0cc241f0b1e2c8f5271e9), ROM_BIOS(26) ) ROM_SYSTEM_BIOS(26, "exos4", "EXOS v4" ) ROMX_LOAD( "exos4.u4", 0x0000, 0x2000, CRC(d5cf83a9) SHA1(d5f03a5c0e9d00032d4751ecc6bcd6385879c9c7), ROM_BIOS(27) ) + ROM_SYSTEM_BIOS(27, "pdc", "ProLogic-DOS Classic" ) + ROMX_LOAD( "pdc.u4", 0x0000, 0x4000, CRC(6b653b9c) SHA1(0f44a9c62619424a0cd48a90e1b377b987b494e0), ROM_BIOS(28) ) ROM_REGION( 0x1000, "charom", 0 ) ROM_LOAD( "901225-01.u5", 0x0000, 0x1000, CRC(ec4272ee) SHA1(adc7c31e18c7c7413d54802ef2f4193da14711aa) ) diff --git a/src/mess/machine/c1541.c b/src/mess/machine/c1541.c index 86447186f70..78b3032ea8c 100644 --- a/src/mess/machine/c1541.c +++ b/src/mess/machine/c1541.c @@ -150,6 +150,9 @@ #define M6522_1_TAG "ucd4" #define C64H156_TAG "64h156" +#define MC6821_TAG "pia" +#define CENTRONICS_TAG "centronics" + enum { @@ -171,6 +174,7 @@ const device_type SX1541 = &device_creator; const device_type FSD2 = &device_creator; const device_type C1541_DOLPHIN_DOS = &device_creator; const device_type C1541_PROFESSIONAL_DOS_V1 = &device_creator; +const device_type C1541_PROLOGIC_DOS_CLASSIC = &device_creator; //------------------------------------------------- @@ -215,6 +219,10 @@ void base_c1541_device::device_config_complete() case TYPE_1541_PROFESSIONAL_DOS_V1: m_shortname = "c1541pd"; break; + + case TYPE_1541_PROLOGIC_DOS_CLASSIC: + m_shortname = "c1541pdc"; + break; } } @@ -347,6 +355,21 @@ ROM_START( c1541pd ) ROM_END +//------------------------------------------------- +// ROM( c1541pdc ) +//------------------------------------------------- + +ROM_START( c1541pdc ) + ROM_REGION( 0x8000, M6502_TAG, 0 ) + ROM_LOAD( "325302-01.uab4", 0x0000, 0x2000, CRC(29ae9752) SHA1(8e0547430135ba462525c224e76356bd3d430f11) ) + ROM_LOAD( "901229-06 aa.uab5", 0x2000, 0x2000, CRC(3a235039) SHA1(c7f94f4f51d6de4cdc21ecbb7e57bb209f0530c0) ) + ROM_LOAD( "kernal.bin", 0x4000, 0x4000, CRC(79032ed5) SHA1(0ca4d5ef41c7e3d18d8945476d1481573af3e27c) ) + + ROM_REGION( 0x2000, "mmu", 0 ) + ROM_LOAD( "mmu.bin", 0x0000, 0x2000, CRC(4c41392c) SHA1(78846af2ee6a56fceee44f9246659685ab2cbb7e) ) +ROM_END + + //------------------------------------------------- // rom_region - device-specific ROM region //------------------------------------------------- @@ -379,6 +402,9 @@ const rom_entry *base_c1541_device::device_rom_region() const case TYPE_1541_PROFESSIONAL_DOS_V1: return ROM_NAME( c1541pd ); + + case TYPE_1541_PROLOGIC_DOS_CLASSIC: + return ROM_NAME( c1541pdc ); } } @@ -423,6 +449,22 @@ static ADDRESS_MAP_START( c1541pd_mem, AS_PROGRAM, 8, base_c1541_device ) ADDRESS_MAP_END +//------------------------------------------------- +// ADDRESS_MAP( c1541pdc_mem ) +//------------------------------------------------- + +static ADDRESS_MAP_START( c1541pdc_mem, AS_PROGRAM, 8, c1541_prologic_dos_classic_device ) + AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x6000) AM_RAM AM_SHARE("share1") + AM_RANGE(0x1800, 0x180f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_0_TAG, via6522_device, read, write) + AM_RANGE(0x1c00, 0x1c0f) AM_MIRROR(0x63f0) AM_DEVREADWRITE(M6522_1_TAG, via6522_device, read, write) + AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0x8800, 0x9fff) AM_RAM + AM_RANGE(0xa000, 0xb7ff) AM_ROM AM_REGION(M6502_TAG, 0x0000) + AM_RANGE(0xb800, 0xb80f) AM_READWRITE(pia_r, pia_w) + AM_RANGE(0xf000, 0xffff) AM_ROM AM_REGION(M6502_TAG, 0x2000) +ADDRESS_MAP_END + + //------------------------------------------------- // via6522_interface via0_intf //------------------------------------------------- @@ -727,6 +769,68 @@ const floppy_interface c1541_floppy_interface = }; +//------------------------------------------------- +// pia6821_interface pia0_intf +//------------------------------------------------- + +READ8_MEMBER( c1541_prologic_dos_classic_device::pia_r ) +{ + return m_pia->read(space, (offset >> 2) & 0x03); +} + +WRITE8_MEMBER( c1541_prologic_dos_classic_device::pia_w ) +{ + m_pia->write(space, (offset >> 2) & 0x03, data); +} + +WRITE8_MEMBER( c1541_prologic_dos_classic_device::pia_pa_w ) +{ + /* + + bit description + + 0 1/2 MHz + 1 + 2 + 3 35/40 tracks + 4 + 5 + 6 + 7 Hi + + */ +} + +READ8_MEMBER( c1541_prologic_dos_classic_device::pia_pb_r ) +{ + return m_parallel_data; +} + +WRITE8_MEMBER( c1541_prologic_dos_classic_device::pia_pb_w ) +{ + m_parallel_data = data; + + m_centronics->write(space, 0, data); +} + +static const pia6821_interface pia_intf = +{ + DEVCB_NULL, + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c1541_prologic_dos_classic_device, pia_pb_r), + DEVCB_DEVICE_LINE_MEMBER(CENTRONICS_TAG, centronics_device, ack_r), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c1541_prologic_dos_classic_device, pia_pa_w), + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c1541_prologic_dos_classic_device, pia_pb_w), + DEVCB_DEVICE_LINE_MEMBER(CENTRONICS_TAG, centronics_device, strobe_w), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL +}; + + //------------------------------------------------- // MACHINE_DRIVER( c1541 ) //------------------------------------------------- @@ -795,6 +899,25 @@ static MACHINE_CONFIG_FRAGMENT( c1541pd ) MACHINE_CONFIG_END +//------------------------------------------------- +// MACHINE_DRIVER( c1541pdc ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( c1541pdc ) + MCFG_CPU_ADD(M6502_TAG, M6502, XTAL_16MHz/16) + MCFG_CPU_PROGRAM_MAP(c1541pdc_mem) + MCFG_QUANTUM_PERFECT_CPU(M6502_TAG) + + MCFG_VIA6522_ADD(M6522_0_TAG, XTAL_16MHz/16, c1541_via0_intf) + MCFG_VIA6522_ADD(M6522_1_TAG, XTAL_16MHz/16, c1541_via1_intf) + + MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1541_floppy_interface) + MCFG_64H156_ADD(C64H156_TAG, XTAL_16MHz, ga_intf) + MCFG_PIA6821_ADD(MC6821_TAG, pia_intf) + MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, standard_centronics) +MACHINE_CONFIG_END + + //------------------------------------------------- // machine_config_additions - device-specific // machine configurations @@ -815,6 +938,9 @@ machine_config_constructor base_c1541_device::device_mconfig_additions() const case TYPE_1541_PROFESSIONAL_DOS_V1: return MACHINE_CONFIG_NAME( c1541pd ); + + case TYPE_1541_PROLOGIC_DOS_CLASSIC: + return MACHINE_CONFIG_NAME( c1541pdc ); } } @@ -845,7 +971,7 @@ inline void base_c1541_device::set_iec_data() // base_c1541_device - constructor //------------------------------------------------- -base_c1541_device::base_c1541_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant) +base_c1541_device:: base_c1541_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant) : device_t(mconfig, type, name, tag, owner, clock), device_cbm_iec_interface(mconfig, *this), device_c64_floppy_parallel_interface(mconfig, *this), @@ -867,7 +993,7 @@ base_c1541_device::base_c1541_device(const machine_config &mconfig, device_type //------------------------------------------------- c1540_device::c1540_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - :base_c1541_device(mconfig, C1540, "C1540", tag, owner, clock, TYPE_1540) { } + : base_c1541_device(mconfig, C1540, "C1540", tag, owner, clock, TYPE_1540) { } //------------------------------------------------- @@ -875,7 +1001,7 @@ c1540_device::c1540_device(const machine_config &mconfig, const char *tag, devic //------------------------------------------------- c1541_device::c1541_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - :base_c1541_device(mconfig, C1541, "C1541", tag, owner, clock, TYPE_1541) { } + : base_c1541_device(mconfig, C1541, "C1541", tag, owner, clock, TYPE_1541) { } //------------------------------------------------- @@ -883,7 +1009,7 @@ c1541_device::c1541_device(const machine_config &mconfig, const char *tag, devic //------------------------------------------------- c1541c_device::c1541c_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - :base_c1541_device(mconfig, C1541C, "C1541C", tag, owner, clock, TYPE_1541C) { } + : base_c1541_device(mconfig, C1541C, "C1541C", tag, owner, clock, TYPE_1541C) { } //------------------------------------------------- @@ -891,7 +1017,7 @@ c1541c_device::c1541c_device(const machine_config &mconfig, const char *tag, dev //------------------------------------------------- c1541ii_device::c1541ii_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - :base_c1541_device(mconfig, C1541II, "C1541-II", tag, owner, clock, TYPE_1541II) { } + : base_c1541_device(mconfig, C1541II, "C1541-II", tag, owner, clock, TYPE_1541II) { } //------------------------------------------------- @@ -899,7 +1025,7 @@ c1541ii_device::c1541ii_device(const machine_config &mconfig, const char *tag, d //------------------------------------------------- sx1541_device::sx1541_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - :base_c1541_device(mconfig, SX1541, "SX1541", tag, owner, clock, TYPE_SX1541) { } + : base_c1541_device(mconfig, SX1541, "SX1541", tag, owner, clock, TYPE_SX1541) { } //------------------------------------------------- @@ -907,7 +1033,7 @@ sx1541_device::sx1541_device(const machine_config &mconfig, const char *tag, dev //------------------------------------------------- fsd2_device::fsd2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - :base_c1541_device(mconfig, FSD2, "FSD-2", tag, owner, clock, TYPE_FSD2) { } + : base_c1541_device(mconfig, FSD2, "FSD-2", tag, owner, clock, TYPE_FSD2) { } //------------------------------------------------- @@ -915,7 +1041,7 @@ fsd2_device::fsd2_device(const machine_config &mconfig, const char *tag, device_ //------------------------------------------------- c1541_dolphin_dos_device::c1541_dolphin_dos_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - :base_c1541_device(mconfig, C1541_DOLPHIN_DOS, "C1541 Dolphin-DOS 2.0", tag, owner, clock, TYPE_1541_DOLPHIN_DOS) { } + : base_c1541_device(mconfig, C1541_DOLPHIN_DOS, "C1541 Dolphin-DOS 2.0", tag, owner, clock, TYPE_1541_DOLPHIN_DOS) { } //------------------------------------------------- @@ -923,7 +1049,19 @@ c1541_dolphin_dos_device::c1541_dolphin_dos_device(const machine_config &mconfig //------------------------------------------------- c1541_professional_dos_v1_device::c1541_professional_dos_v1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - :base_c1541_device(mconfig, C1541_PROFESSIONAL_DOS_V1, "C1541 Professional-DOS v1", tag, owner, clock, TYPE_1541_PROFESSIONAL_DOS_V1) { } + : base_c1541_device(mconfig, C1541_PROFESSIONAL_DOS_V1, "C1541 Professional-DOS v1", tag, owner, clock, TYPE_1541_PROFESSIONAL_DOS_V1) { } + + +//------------------------------------------------- +// c1541_prologic_dos_classic_device - constructor +//------------------------------------------------- + +c1541_prologic_dos_classic_device::c1541_prologic_dos_classic_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : base_c1541_device(mconfig, C1541_PROLOGIC_DOS_CLASSIC, "C1541 ProLogic-DOS Classic", tag, owner, clock, TYPE_1541_PROLOGIC_DOS_CLASSIC), + m_pia(*this, MC6821_TAG), + m_centronics(*this, CENTRONICS_TAG) +{ +} //------------------------------------------------- diff --git a/src/mess/machine/c1541.h b/src/mess/machine/c1541.h index a6af2d1044d..7e3c7e247e6 100644 --- a/src/mess/machine/c1541.h +++ b/src/mess/machine/c1541.h @@ -20,8 +20,10 @@ #include "formats/g64_dsk.h" #include "machine/64h156.h" #include "machine/6522via.h" -#include "machine/cbmiec.h" +#include "machine/6821pia.h" #include "machine/c64_bn1541.h" +#include "machine/cbmiec.h" +#include "machine/ctronics.h" @@ -58,7 +60,8 @@ public: // extended hardware TYPE_1541_DOLPHIN_DOS, - TYPE_1541_PROFESSIONAL_DOS_V1 + TYPE_1541_PROFESSIONAL_DOS_V1, + TYPE_1541_PROLOGIC_DOS_CLASSIC }; // not really public @@ -200,6 +203,28 @@ public: }; +// ======================> c1541_prologic_dos_classic_device + +class c1541_prologic_dos_classic_device : public base_c1541_device +{ +public: + // construction/destruction + c1541_prologic_dos_classic_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // not really public + DECLARE_READ8_MEMBER( pia_r ); + DECLARE_WRITE8_MEMBER( pia_w ); + + DECLARE_WRITE8_MEMBER( pia_pa_w ); + DECLARE_READ8_MEMBER( pia_pb_r ); + DECLARE_WRITE8_MEMBER( pia_pb_w ); + +protected: + required_device m_pia; + required_device m_centronics; +}; + + // device type definition extern const device_type C1540; extern const device_type C1541; @@ -209,6 +234,7 @@ extern const device_type SX1541; extern const device_type FSD2; extern const device_type C1541_DOLPHIN_DOS; extern const device_type C1541_PROFESSIONAL_DOS_V1; +extern const device_type C1541_PROLOGIC_DOS_CLASSIC; // floppy interface diff --git a/src/mess/machine/cbmipt.c b/src/mess/machine/cbmipt.c index 92ce4324890..cd7787ba784 100644 --- a/src/mess/machine/cbmipt.c +++ b/src/mess/machine/cbmipt.c @@ -1103,6 +1103,7 @@ SLOT_INTERFACE_START( cbm_iec_devices ) SLOT_INTERFACE("fsd2", FSD2) SLOT_INTERFACE("c1541dd", C1541_DOLPHIN_DOS) SLOT_INTERFACE("c1541pd", C1541_PROFESSIONAL_DOS_V1) + SLOT_INTERFACE("c1541pdc", C1541_PROLOGIC_DOS_CLASSIC) SLOT_INTERFACE("c1570", C1570) SLOT_INTERFACE("c1571", C1571) SLOT_INTERFACE("c1581", C1581)