(MESS) ql: Expansion WIP. (nw)

This commit is contained in:
Curt Coder 2014-06-03 10:54:04 +00:00
parent 05a0a0fd6d
commit 82f7387896
16 changed files with 446 additions and 12 deletions

4
.gitattributes vendored
View File

@ -3620,6 +3620,8 @@ src/lib/formats/primoptp.c svneol=native#text/plain
src/lib/formats/primoptp.h svneol=native#text/plain
src/lib/formats/pyldin_dsk.c svneol=native#text/plain
src/lib/formats/pyldin_dsk.h svneol=native#text/plain
src/lib/formats/ql_dsk.c svneol=native#text/plain
src/lib/formats/ql_dsk.h svneol=native#text/plain
src/lib/formats/rk_cas.c svneol=native#text/plain
src/lib/formats/rk_cas.h svneol=native#text/plain
src/lib/formats/sc3000_bit.c svneol=native#text/plain
@ -8804,6 +8806,8 @@ src/mess/machine/psxcport.c svneol=native#text/plain
src/mess/machine/psxcport.h svneol=native#text/plain
src/mess/machine/psxmultitap.c svneol=native#text/plain
src/mess/machine/psxmultitap.h svneol=native#text/plain
src/mess/machine/qimi.c svneol=native#text/plain
src/mess/machine/qimi.h svneol=native#text/plain
src/mess/machine/qx10kbd.c svneol=native#text/plain
src/mess/machine/qx10kbd.h svneol=native#text/plain
src/mess/machine/radio86.c svneol=native#text/plain

View File

@ -30,7 +30,8 @@ const device_type QL_EXPANSION_SLOT = &device_creator<ql_expansion_slot_t>;
//-------------------------------------------------
device_ql_expansion_card_interface::device_ql_expansion_card_interface(const machine_config &mconfig, device_t &device) :
device_slot_card_interface(mconfig, device)
device_slot_card_interface(mconfig, device),
m_romoeh(0)
{
m_slot = dynamic_cast<ql_expansion_slot_t *>(device.owner());
}

View File

@ -32,7 +32,7 @@ const device_type QL_ROM_CARTRIDGE_SLOT = &device_creator<ql_rom_cartridge_slot_
device_ql_rom_cartridge_card_interface::device_ql_rom_cartridge_card_interface(const machine_config &mconfig, device_t &device) :
device_slot_card_interface(mconfig, device),
m_rom(*this, "rom"),
m_romoeh(1)
m_romoeh(0)
{
m_slot = dynamic_cast<ql_rom_cartridge_slot_t *>(device.owner());
}

View File

@ -58,6 +58,15 @@ static SLOT_INTERFACE_START( sandy_super_disk_floppies )
SLOT_INTERFACE_END
//-------------------------------------------------
// FLOPPY_FORMATS( floppy_formats )
//-------------------------------------------------
FLOPPY_FORMATS_MEMBER( sandy_super_disk_t::floppy_formats )
FLOPPY_QL_FORMAT
FLOPPY_FORMATS_END
//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( sandy_super_disk )
//-------------------------------------------------
@ -66,8 +75,8 @@ static MACHINE_CONFIG_FRAGMENT( sandy_super_disk )
MCFG_DEVICE_ADD(WD1772_TAG, WD1772x, 8000000)
//MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(sandy_super_disk_t, fdc_intrq_w))
//MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(sandy_super_disk_t, fdc_drq_w))
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":0", sandy_super_disk_floppies, "35dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":1", sandy_super_disk_floppies, NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":0", sandy_super_disk_floppies, "35dd", sandy_super_disk_t::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":1", sandy_super_disk_floppies, NULL, sandy_super_disk_t::floppy_formats)
MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_printers, "printer")
MACHINE_CONFIG_END

View File

@ -16,6 +16,7 @@
#include "exp.h"
#include "bus/centronics/ctronics.h"
#include "formats/ql_dsk.h"
#include "machine/wd_fdc.h"
@ -37,6 +38,8 @@ public:
virtual const rom_entry *device_rom_region() const;
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_FLOPPY_FORMATS( floppy_formats );
protected:
// device-level overrides
virtual void device_start();

View File

@ -39,7 +39,7 @@ ROM_START( sandy_superqboard )
ROM_LOAD( "sandy_disk_controller_v1.18y_1984.ic2", 0x0000, 0x8000, CRC(d02425be) SHA1(e730576e3e0c6a1acad042c09e15fc62a32d8fbd) )
ROM_REGION( 0x100, "plds", 0 )
ROM_LOAD( "gal16v8.ic5", 0x000, 0x000, NO_DUMP )
ROM_LOAD( "gal16v8.ic5", 0x000, 0x100, NO_DUMP )
ROM_END
@ -63,6 +63,15 @@ static SLOT_INTERFACE_START( sandy_superqboard_floppies )
SLOT_INTERFACE_END
//-------------------------------------------------
// FLOPPY_FORMATS( floppy_formats )
//-------------------------------------------------
FLOPPY_FORMATS_MEMBER( sandy_superqboard_t::floppy_formats )
FLOPPY_QL_FORMAT
FLOPPY_FORMATS_END
//-------------------------------------------------
// centronics
//-------------------------------------------------
@ -80,8 +89,8 @@ WRITE_LINE_MEMBER( sandy_superqboard_t::busy_w )
static MACHINE_CONFIG_FRAGMENT( sandy_superqboard )
MCFG_DEVICE_ADD(WD1772_TAG, WD1772x, XTAL_16MHz/2)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":0", sandy_superqboard_floppies, "35hd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":1", sandy_superqboard_floppies, NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":0", sandy_superqboard_floppies, "35hd", sandy_superqboard_t::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":1", sandy_superqboard_floppies, NULL, sandy_superqboard_t::floppy_formats)
MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_printers, "printer")
MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(sandy_superqboard_t, busy_w))

View File

@ -16,6 +16,7 @@
#include "exp.h"
#include "bus/centronics/ctronics.h"
#include "formats/ql_dsk.h"
#include "machine/wd_fdc.h"
@ -39,6 +40,8 @@ public:
WRITE_LINE_MEMBER( busy_w );
DECLARE_FLOPPY_FORMATS( floppy_formats );
protected:
// device-level overrides
virtual void device_start();

View File

@ -37,8 +37,8 @@ ROM_START( ql_trump_card )
ROM_LOAD( "trumpcard-125.rom", 0x0000, 0x8000, CRC(938eaa46) SHA1(9b3458cf3a279ed86ba395dc45c8f26939d6c44d) )
ROM_REGION( 0x100, "plds", 0 )
ROM_LOAD( "1u4", 0x000, 0x000, NO_DUMP )
ROM_LOAD( "2u4", 0x000, 0x000, NO_DUMP )
ROM_LOAD( "1u4", 0x000, 0x100, NO_DUMP )
ROM_LOAD( "2u4", 0x000, 0x100, NO_DUMP )
ROM_END
@ -61,6 +61,15 @@ static SLOT_INTERFACE_START( ql_trump_card_floppies )
SLOT_INTERFACE_END
//-------------------------------------------------
// FLOPPY_FORMATS( floppy_formats )
//-------------------------------------------------
FLOPPY_FORMATS_MEMBER( ql_trump_card_t::floppy_formats )
FLOPPY_QL_FORMAT
FLOPPY_FORMATS_END
//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( ql_trump_card )
//-------------------------------------------------
@ -69,8 +78,8 @@ static MACHINE_CONFIG_FRAGMENT( ql_trump_card )
MCFG_DEVICE_ADD(WD1772_TAG, WD1772x, 8000000)
//MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(ql_trump_card_t, fdc_intrq_w))
//MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(ql_trump_card_t, fdc_drq_w))
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":0", ql_trump_card_floppies, "35dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":1", ql_trump_card_floppies, NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":0", ql_trump_card_floppies, "35dd", ql_trump_card_t::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG":1", ql_trump_card_floppies, NULL, ql_trump_card_t::floppy_formats)
MACHINE_CONFIG_END

View File

@ -16,6 +16,7 @@
#include "exp.h"
#include "machine/wd_fdc.h"
#include "formats/ql_dsk.h"
@ -36,6 +37,8 @@ public:
virtual const rom_entry *device_rom_region() const;
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_FLOPPY_FORMATS( floppy_formats );
protected:
// device-level overrides
virtual void device_start();

54
src/lib/formats/ql_dsk.c Normal file
View File

@ -0,0 +1,54 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/*********************************************************************
formats/ql_dsk.c
Sinclair QL disk image formats
*********************************************************************/
#include "emu.h"
#include "formats/ql_dsk.h"
ql_format::ql_format() : wd177x_format(formats)
{
}
const char *ql_format::name() const
{
return "ql";
}
const char *ql_format::description() const
{
return "Sinclair QL disk image";
}
const char *ql_format::extensions() const
{
return "dsk,img";
}
// unverified gaps
const ql_format::format ql_format::formats[] = {
{ // QDOS 800KB
floppy_image::FF_35, floppy_image::SSSD, floppy_image::MFM,
2000, 5, 80, 2, 1024, {}, 1, {}, 80, 22, 24
},
{ // 720KB DSDD
floppy_image::FF_35, floppy_image::SSSD, floppy_image::MFM,
2000, 9, 80, 2, 512, {}, 1, {}, 80, 22, 24
},
{ // 1.44MB DSHD
floppy_image::FF_35, floppy_image::SSSD, floppy_image::MFM,
2000, 18, 80, 2, 512, {}, 1, {}, 80, 22, 24
},
{ // 2.88MB DSED
floppy_image::FF_35, floppy_image::SSSD, floppy_image::MFM,
2000, 40, 80, 2, 512, {}, 1, {}, 80, 41, 24
},
{}
};
const floppy_format_type FLOPPY_QL_FORMAT = &floppy_image_format_creator<ql_format>;

30
src/lib/formats/ql_dsk.h Normal file
View File

@ -0,0 +1,30 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/*********************************************************************
formats/ql_dsk.h
Sinclair QL disk image formats
*********************************************************************/
#ifndef QL_DSK_H_
#define QL_DSK_H_
#include "wd177x_dsk.h"
class ql_format : public wd177x_format {
public:
ql_format();
virtual const char *name() const;
virtual const char *description() const;
virtual const char *extensions() const;
private:
static const format formats[];
};
extern const floppy_format_type FLOPPY_QL_FORMAT;
#endif

View File

@ -182,6 +182,7 @@ FORMATSOBJS = \
$(LIBOBJ)/formats/pmd_cas.o \
$(LIBOBJ)/formats/primoptp.o \
$(LIBOBJ)/formats/pyldin_dsk.o \
$(LIBOBJ)/formats/ql_dsk.o \
$(LIBOBJ)/formats/rk_cas.o \
$(LIBOBJ)/formats/sc3000_bit.o \
$(LIBOBJ)/formats/sf7000_dsk.o \

View File

@ -13,7 +13,7 @@
CONSTANTS
***************************************************************************/
#define LOG 1
#define LOG 0
#define MDV_SECTOR_COUNT 255
#define MDV_SECTOR_LENGTH 686

220
src/mess/machine/qimi.c Normal file
View File

@ -0,0 +1,220 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
QL Internal Mouse Interface emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#include "qimi.h"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define QL_CONFIG_PORT "config"
#define QIMI_PORT_MASK 0x01
#define QIMI_NONE 0x00
#define QIMI_MOUSE 0x01
#define MOUSEX_TAG "MOUSEX"
#define MOUSEY_TAG "MOUSEY"
#define MOUSEB_TAG "MOUSEB"
// Mouse bits in Sandy port order
#define MOUSE_MIDDLE 0x02
#define MOUSE_RIGHT 0x04
#define MOUSE_LEFT 0x08
#define MOUSE_DIRY 0x10
#define MOUSE_DIRX 0x20
#define MOUSE_INTY 0x40
#define MOUSE_INTX 0x80
#define MOUSE_INT_MASK (MOUSE_INTX | MOUSE_INTY)
#define QIMI_INTX 0x04
#define QIMI_INTY 0x20
#define QIMI_DIRX 0x10
#define QIMI_DIRY 0x01
#define QIMI_LEFT 0x20
#define QIMI_RIGHT 0x10
#define QIMI_INT_MASK (QIMI_INTX | QIMI_INTY)
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type QIMI = &device_creator<qimi_t>;
//-------------------------------------------------
// INPUT_PORTS( qimi )
//-------------------------------------------------
INPUT_PORTS_START( qimi )
PORT_START(QL_CONFIG_PORT)
PORT_CONFNAME( QIMI_PORT_MASK, QIMI_NONE, "QIMI enabled")
PORT_CONFSETTING( QIMI_NONE, "No" )
PORT_CONFSETTING( QIMI_MOUSE, "Yes" )
PORT_START(MOUSEX_TAG)
PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(1)
PORT_START(MOUSEY_TAG)
PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(1)
PORT_START(MOUSEB_TAG) /* Mouse buttons */
PORT_BIT( MOUSE_RIGHT, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Mouse Button 1") PORT_CODE(MOUSECODE_BUTTON1)
PORT_BIT( MOUSE_LEFT, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("Mouse Button 2") PORT_CODE(MOUSECODE_BUTTON2)
PORT_BIT( MOUSE_MIDDLE, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("Mouse Button 3") PORT_CODE(MOUSECODE_BUTTON3)
INPUT_PORTS_END
//-------------------------------------------------
// input_ports - device-specific input ports
//-------------------------------------------------
ioport_constructor qimi_t::device_input_ports() const
{
return INPUT_PORTS_NAME( qimi );
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// qimi_t - constructor
//-------------------------------------------------
qimi_t::qimi_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, QIMI, "QL Internal Mouse Interface", tag, owner, clock, "qimi", __FILE__),
m_write_extint(*this),
m_mousex(*this, MOUSEX_TAG),
m_mousey(*this, MOUSEY_TAG),
m_mouseb(*this, MOUSEB_TAG),
m_config(*this, QL_CONFIG_PORT)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void qimi_t::device_start()
{
// resolve callbacks
m_write_extint.resolve_safe();
// allocate timer
m_mouse_timer = timer_alloc();
m_mouse_timer->adjust(attotime::zero, 0, attotime::from_hz(500));
}
//-------------------------------------------------
// device_timer - handler timer events
//-------------------------------------------------
void qimi_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
UINT8 x = m_mousex->read();
UINT8 y = m_mousey->read();
UINT8 do_int = 0;
//m_mouse_int = 0;
// Set X interupt flag and direction if x has changed
if (x > m_ql_mouse_x)
{
m_mouse_int |= MOUSE_INTX;
m_mouse_int |= MOUSE_DIRX;
}
else if (x < m_ql_mouse_x)
{
m_mouse_int |= MOUSE_INTX;
m_mouse_int &= ~MOUSE_DIRX;
}
// Set Y interupt flag and direction if y has changed
if (y > m_ql_mouse_y)
{
m_mouse_int |= MOUSE_INTY;
m_mouse_int &= ~MOUSE_DIRY;
}
else if (y < m_ql_mouse_y)
{
m_mouse_int |= MOUSE_INTY;
m_mouse_int |= MOUSE_DIRY;
}
// Update saved location
m_ql_mouse_x = x;
m_ql_mouse_y = y;
// if it is a QIMI, then always do int if triggered.
// if this is a Sandy mouse, only trigger an int if it is enabled in the mask register
do_int = 1;
//logerror("m_mouse_int=%02X, MOUSE_INT_MASK=%02X, m_disk_io_byte=%02X, (m_disk_io_byte & SANDY_MOUSE_INTMASK)=%02x\n",m_mouse_int,MOUSE_INT_MASK,m_disk_io_byte,(m_disk_io_byte & SANDY_MOUSE_INTMASK));
// if mouse moved trigger external int
if((m_mouse_int & MOUSE_INT_MASK) && do_int)
{
m_write_extint(ASSERT_LINE);
}
}
//-------------------------------------------------
// read -
//-------------------------------------------------
READ8_MEMBER( qimi_t::read )
{
UINT8 result = 0;
UINT8 buttons;
switch (offset)
{
// 0x1bf9c, button status
case 0x00 :
buttons = m_mouseb->read();
result = ((buttons & MOUSE_RIGHT) << 2) | ((buttons & MOUSE_LEFT) << 2);
break;
// 0x1bfbc, direction status
case 0x20 :
result = ((m_mouse_int & MOUSE_INTX) >> 5) | ((m_mouse_int & MOUSE_INTY) >> 1) |
((m_mouse_int & MOUSE_DIRX) >> 1) | ((m_mouse_int & MOUSE_DIRY) >> 4);
break;
case 0x22 :
m_mouse_int &= ~MOUSE_INT_MASK;
break;
}
return result;
}
//-------------------------------------------------
// write -
//-------------------------------------------------
WRITE8_MEMBER( qimi_t::write )
{
// write to 0x1bfbe resets int status
if (offset == 0x22)
{
m_mouse_int = 0;
}
}

87
src/mess/machine/qimi.h Normal file
View File

@ -0,0 +1,87 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
QL Internal Mouse Interface emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#pragma once
#ifndef __QIMI__
#define __QIMI__
#include "emu.h"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define QIMI_IO_BASE 0x1bf9c
#define QIMI_IO_LEN 0x22
#define QIMI_IO_END (QIMI_IO_BASE + QIMI_IO_LEN )
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_QIMI_EXTINT_CALLBACK(_write) \
devcb = &qimi_t::set_exting_wr_callback(*device, DEVCB_##_write);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> qimi_t
class qimi_t : public device_t
{
public:
// construction/destruction
qimi_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb_base &set_exting_wr_callback(device_t &device, _Object object) { return downcast<qimi_t &>(device).m_write_extint.set_callback(object); }
// optional information overrides
virtual ioport_constructor device_input_ports() const;
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
protected:
// device-level overrides
virtual void device_start();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
devcb_write_line m_write_extint;
required_ioport m_mousex;
required_ioport m_mousey;
required_ioport m_mouseb;
required_ioport m_config;
UINT8 m_mouse_int;
emu_timer *m_mouse_timer;
UINT8 m_ql_mouse_x;
UINT8 m_ql_mouse_y;
};
// device type definition
extern const device_type QIMI;
#endif

View File

@ -1763,6 +1763,7 @@ $(MESSOBJ)/sinclair.a: \
$(MESS_MACHINE)/beta.o \
$(MESS_MACHINE)/spec_snqk.o \
$(MESS_DRIVERS)/ql.o \
$(MESS_MACHINE)/qimi.o \
$(MESS_VIDEO)/zx8301.o \
$(MESS_MACHINE)/zx8302.o \