(MESS) apollo: finish devcb2'ing the keyboard (nw)

This commit is contained in:
R. Belmont 2014-02-24 04:07:11 +00:00
parent a80806293d
commit da20fa8ee4
4 changed files with 33 additions and 85 deletions

View File

@ -45,6 +45,12 @@
// error.log will be 10 MB for 100000 lines
#define APOLLO_MAX_NO_OF_LOG_LINES 1000000
// ISA/AT Bus notes
// I/O space: Apollo address = PC I/O address * 0x80 + 0x40000, so PC I/O addresses from 0 to 0x3ff are supported.
// example: 3c503 Ethernet is at I/O 300h on PC, which is (0x300 * 0x80) + 0x40000 = 0x58000
//
// Memory space: addresses from 0x80000 to 0xffffff are supported, including the possibility of stock PC MDA at a0000
#define ATBUS_IO_BASE 0x040000
#define ATBUS_IO_END 0x05ffff
#define ATBUS_MEMORY_BASE 0x080000
@ -804,18 +810,10 @@ static ADDRESS_MAP_START(dsp3500_map, AS_PROGRAM, 32, apollo_state )
AM_RANGE(0x058000, 0x058007) AM_DEVREADWRITE8_LEGACY(APOLLO_ETH_TAG, threecom3c505_r, threecom3c505_w, 0xffffffff)
AM_RANGE(0x05f800, 0x05f807) AM_DEVICE8(APOLLO_FDC_TAG, pc_fdc_at_device, map, 0xffffffff)
// AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
// AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
//
// AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
// AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
AM_RANGE(0x080000, 0x081fff) AM_ROM /* 3C505 boot ROM */
// FIXME: must match with RAM size in driver/apollo_sio.c
// AM_RANGE(DN3500_RAM_BASE, DN3500_RAM_END) AM_RAM /* 8MB RAM */
AM_RANGE(DN3500_RAM_BASE, DN3500_RAM_END) AM_RAM_WRITE(ram_with_parity_w) AM_SHARE("messram")
AM_RANGE(ATBUS_MEMORY_BASE, ATBUS_MEMORY_END) AM_READWRITE(apollo_atbus_memory_r, apollo_atbus_memory_w)
@ -832,7 +830,6 @@ static ADDRESS_MAP_START(dn3000_map, AS_PROGRAM, 32, apollo_state )
AM_RANGE(0x008400, 0x0087ff) AM_DEVREADWRITE8(APOLLO_SIO_TAG, duartn68681_device, read, write, 0x00ff00ff )
AM_RANGE(0x008800, 0x0088ff) AM_DEVREADWRITE8(APOLLO_PTM_TAG, ptm6840_device, read, write, 0x00ff00ff )
AM_RANGE(0x008900, 0x0089ff) AM_READWRITE8(apollo_rtc_r, apollo_rtc_w, 0xffffffff )
AM_RANGE(0x009000, 0x0090ff) AM_READWRITE8(/*"dma1",*/apollo_dma_1_r, apollo_dma_1_w, 0xffffffff )
AM_RANGE(0x009100, 0x0091ff) AM_READWRITE8(/*"dma2",*/apollo_dma_2_r, apollo_dma_2_w, 0xffffffff )
AM_RANGE(0x009200, 0x0092ff) AM_READWRITE8(apollo_dma_page_register_r, apollo_dma_page_register_w, 0xffffffff )
@ -840,7 +837,6 @@ static ADDRESS_MAP_START(dn3000_map, AS_PROGRAM, 32, apollo_state )
AM_RANGE(0x009400, 0x0094ff) AM_DEVREADWRITE8_LEGACY(APOLLO_PIC1_TAG, apollo_pic8259_master_r, apollo_pic8259_master_w, 0xffffffff)
AM_RANGE(0x009500, 0x0095ff) AM_DEVREADWRITE8_LEGACY(APOLLO_PIC2_TAG, apollo_pic8259_slave_r, apollo_pic8259_slave_w, 0xffffffff)
AM_RANGE(0x009600, 0x0096ff) AM_READWRITE16(apollo_node_id_r, apollo_node_id_w, 0xffffffff)
AM_RANGE(0x04D000, 0x04D007) AM_DEVREADWRITE16_LEGACY(APOLLO_WDC_TAG, omti8621_r, omti8621_w, 0xffffffff)
AM_RANGE(0x050000, 0x050007) AM_DEVREADWRITE8_LEGACY(APOLLO_CTAPE_TAG, sc499_r, sc499_w, 0xffffffff)
AM_RANGE(0x058000, 0x058007) AM_DEVREADWRITE8_LEGACY(APOLLO_ETH_TAG, threecom3c505_r, threecom3c505_w, 0xffffffff)
@ -887,12 +883,6 @@ static ADDRESS_MAP_START(dsp3000_map, AS_PROGRAM, 32, apollo_state )
AM_RANGE(0x058000, 0x058007) AM_DEVREADWRITE8_LEGACY(APOLLO_ETH_TAG, threecom3c505_r, threecom3c505_w, 0xffffffff)
AM_RANGE(0x05f800, 0x05f807) AM_DEVICE8(APOLLO_FDC_TAG, pc_fdc_at_device, map, 0xffffffff)
// AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
// AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
//
// AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
// AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
AM_RANGE(0x080000, 0x081fff) AM_ROM /* 3C505 boot ROM */
@ -990,12 +980,6 @@ static ADDRESS_MAP_START(dsp5500_map, AS_PROGRAM, 32, apollo_state )
AM_RANGE(0x058000, 0x058007) AM_DEVREADWRITE8_LEGACY(APOLLO_ETH_TAG, threecom3c505_r, threecom3c505_w, 0xffffffff)
AM_RANGE(0x05f800, 0x05f807) AM_DEVICE8(APOLLO_FDC_TAG, pc_fdc_at_device, map, 0xffffffff)
// AM_RANGE(0x05d800, 0x05dc07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_mcr_r, apollo_mcr_w, 0xffffffff)
// AM_RANGE(0xfa0000, 0xfdffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_mgm_r, apollo_mgm_w, 0xffffffff)
//
// AM_RANGE(0x05e800, 0x05ec07) AM_DEVREADWRITE8_LEGACY(APOLLO_SCREEN_TAG, apollo_ccr_r, apollo_ccr_w, 0xffffffff)
// AM_RANGE(0x0a0000, 0x0bffff) AM_DEVREADWRITE16_LEGACY(APOLLO_SCREEN_TAG, apollo_cgm_r, apollo_cgm_w, 0xffffffff)
AM_RANGE(ATBUS_IO_BASE, ATBUS_IO_END) AM_READWRITE16(apollo_atbus_io_r, apollo_atbus_io_w, 0xffffffff)
AM_RANGE(0x080000, 0x081fff) AM_ROM /* 3C505 boot ROM */
@ -1163,19 +1147,11 @@ static INPUT_PORTS_START( dsp3500 )
PORT_INCLUDE(apollo_config)
INPUT_PORTS_END
READ8_MEMBER( apollo_state::apollo_kbd_has_beeper ) {
return 1; // apollo_config(APOLLO_CONF_KBD_BEEPER);
READ_LINE_MEMBER( apollo_state::apollo_kbd_is_german )
{
return (apollo_config(APOLLO_CONF_GERMAN_KBD) != 0) ? ASSERT_LINE : CLEAR_LINE;
}
READ8_MEMBER( apollo_state::apollo_kbd_is_german ) {
return apollo_config(APOLLO_CONF_GERMAN_KBD);
}
static APOLLO_KBD_INTERFACE( apollo_kbd_config ) = {
DEVCB_DRIVER_MEMBER(apollo_state, apollo_kbd_has_beeper),
DEVCB_DRIVER_MEMBER(apollo_state, apollo_kbd_is_german)
};
/***************************************************************************
MACHINE DRIVERS
***************************************************************************/
@ -1223,15 +1199,17 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( dn3500_19i, dn3500 )
/* video hardware 19" monochrome */
MCFG_APOLLO_MONO19I_ADD(APOLLO_SCREEN_TAG)
MCFG_APOLLO_KBD_ADD( APOLLO_KBD_TAG, apollo_kbd_config )
MCFG_DEVICE_ADD(APOLLO_KBD_TAG, APOLLO_KBD, 0)
MCFG_APOLLO_KBD_TX_CALLBACK(DEVWRITELINE(APOLLO_SIO_TAG, duartn68681_device, rx_a_w))
MCFG_APOLLO_KBD_GERMAN_CALLBACK(READLINE(apollo_state, apollo_kbd_is_german))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( dn3500_15i, dn3500 )
/* video hardware is 15" monochrome or color */
MCFG_APOLLO_GRAPHICS_ADD(APOLLO_SCREEN_TAG)
MCFG_APOLLO_KBD_ADD( APOLLO_KBD_TAG, apollo_kbd_config )
MCFG_DEVICE_ADD(APOLLO_KBD_TAG, APOLLO_KBD, 0)
MCFG_APOLLO_KBD_TX_CALLBACK(DEVWRITELINE(APOLLO_SIO_TAG, duartn68681_device, rx_a_w))
MCFG_APOLLO_KBD_GERMAN_CALLBACK(READLINE(apollo_state, apollo_kbd_is_german))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( dn3000, dn3500 )
@ -1270,15 +1248,17 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( dn3000_19i, dn3000 )
/* video hardware 19" monochrome */
MCFG_APOLLO_MONO19I_ADD(APOLLO_SCREEN_TAG)
MCFG_APOLLO_KBD_ADD( APOLLO_KBD_TAG, apollo_kbd_config )
MCFG_DEVICE_ADD(APOLLO_KBD_TAG, APOLLO_KBD, 0)
MCFG_APOLLO_KBD_TX_CALLBACK(DEVWRITELINE(APOLLO_SIO_TAG, duartn68681_device, rx_a_w))
MCFG_APOLLO_KBD_GERMAN_CALLBACK(READLINE(apollo_state, apollo_kbd_is_german))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( dn3000_15i, dn3000 )
/* video hardware 15" monochrome */
MCFG_APOLLO_GRAPHICS_ADD(APOLLO_SCREEN_TAG)
MCFG_APOLLO_KBD_ADD( APOLLO_KBD_TAG, apollo_kbd_config )
MCFG_DEVICE_ADD(APOLLO_KBD_TAG, APOLLO_KBD, 0)
MCFG_APOLLO_KBD_TX_CALLBACK(DEVWRITELINE(APOLLO_SIO_TAG, duartn68681_device, rx_a_w))
MCFG_APOLLO_KBD_GERMAN_CALLBACK(READLINE(apollo_state, apollo_kbd_is_german))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( dn5500, dn3500 )
@ -1305,15 +1285,17 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( dn5500_19i, dn5500 )
/* video hardware 19" monochrome */
MCFG_APOLLO_MONO19I_ADD(APOLLO_SCREEN_TAG)
MCFG_APOLLO_KBD_ADD( APOLLO_KBD_TAG, apollo_kbd_config )
MCFG_DEVICE_ADD(APOLLO_KBD_TAG, APOLLO_KBD, 0)
MCFG_APOLLO_KBD_TX_CALLBACK(DEVWRITELINE(APOLLO_SIO_TAG, duartn68681_device, rx_a_w))
MCFG_APOLLO_KBD_GERMAN_CALLBACK(READLINE(apollo_state, apollo_kbd_is_german))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( dn5500_15i, dn5500 )
/* video hardware 15" monochrome */
MCFG_APOLLO_GRAPHICS_ADD(APOLLO_SCREEN_TAG)
MCFG_APOLLO_KBD_ADD( APOLLO_KBD_TAG, apollo_kbd_config )
MCFG_DEVICE_ADD(APOLLO_KBD_TAG, APOLLO_KBD, 0)
MCFG_APOLLO_KBD_TX_CALLBACK(DEVWRITELINE(APOLLO_SIO_TAG, duartn68681_device, rx_a_w))
MCFG_APOLLO_KBD_GERMAN_CALLBACK(READLINE(apollo_state, apollo_kbd_is_german))
MACHINE_CONFIG_END
/***************************************************************************

View File

@ -215,8 +215,7 @@ public:
IRQ_CALLBACK_MEMBER(apollo_pic_acknowledge);
void apollo_bus_error();
DECLARE_WRITE8_MEMBER( apollo_kbd_putchar );
DECLARE_READ8_MEMBER( apollo_kbd_has_beeper );
DECLARE_READ8_MEMBER( apollo_kbd_is_german );
DECLARE_READ_LINE_MEMBER( apollo_kbd_is_german );
DECLARE_READ8_MEMBER( apollo_dma8237_ctape_dack_r );
DECLARE_WRITE8_MEMBER( apollo_dma8237_ctape_dack_w );
DECLARE_READ8_MEMBER( apollo_dma8237_fdc_dack_r );

View File

@ -65,20 +65,9 @@ const device_type APOLLO_KBD = &device_creator<apollo_kbd_device>;
apollo_kbd_device::apollo_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, APOLLO_KBD, "Apollo Keyboard", tag, owner, clock, "apollo_kbd", __FILE__),
device_serial_interface(mconfig, *this),
m_tx_w(*this)
m_tx_w(*this),
m_german_r(*this)
{
memset(static_cast<apollo_kbd_interface *>(this), 0, sizeof(apollo_kbd_interface));
}
//-------------------------------------------------
// static_set_interface - set the interface struct
//-------------------------------------------------
void apollo_kbd_device::static_set_interface(device_t &device, const apollo_kbd_interface &interface)
{
apollo_kbd_device &kbd = downcast<apollo_kbd_device &>(device);
static_cast<apollo_kbd_interface &>(kbd) = interface;
}
//-------------------------------------------------
@ -91,9 +80,7 @@ void apollo_kbd_device::device_start()
LOG1(("start apollo_kbd"));
m_tx_w.resolve_safe();
m_has_beeper.resolve(apollo_kbd_has_beeper_cb, *this);
m_is_german.resolve(apollo_kbd_is_german_cb, *this);
m_german_r.resolve_safe(0);
m_beeper.start(this);
m_mouse.start(this);
@ -214,8 +201,7 @@ void apollo_kbd_device::beeper::on()
int apollo_kbd_device::beeper::keyboard_has_beeper()
{
return !m_device->m_has_beeper.isnull() ?
m_device->m_has_beeper(0) : 0;
return true; // driver has no facility to return false here, so go with it
}
void apollo_kbd_device::beeper::beeper_callback()
@ -333,8 +319,7 @@ void apollo_kbd_device::mouse::read_mouse()
int apollo_kbd_device::keyboard_is_german()
{
return !m_is_german.isnull() ?
m_is_german(0) : 0;
return (m_german_r() == ASSERT_LINE) ? true : false;
}
void apollo_kbd_device::set_mode(UINT16 mode)

View File

@ -30,43 +30,31 @@
// DEVICE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_APOLLO_KBD_ADD(_tag, _interface) \
MCFG_DEVICE_ADD(_tag, APOLLO_KBD, 0) \
apollo_kbd_device::static_set_interface(*device, _interface);
#define MCFG_APOLLO_KBD_TX_CALLBACK(_cb) \
devcb = &apollo_kbd_device::set_tx_cb(*device, DEVCB2_##_cb);
#define MCFG_APOLLO_KBD_GERMAN_CALLBACK(_cb) \
devcb = &apollo_kbd_device::set_german_cb(*device, DEVCB2_##_cb);
INPUT_PORTS_EXTERN(apollo_kbd);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> apollo_kbd_interface
struct apollo_kbd_interface
{
devcb_read8 apollo_kbd_has_beeper_cb;
devcb_read8 apollo_kbd_is_german_cb;
};
#define APOLLO_KBD_INTERFACE(name) const struct apollo_kbd_interface (name)
// ======================> apollo_kbd_device
class apollo_kbd_device : public device_t, public device_serial_interface, public apollo_kbd_interface
class apollo_kbd_device : public device_t, public device_serial_interface
{
public:
// construction/destruction
apollo_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// static configuration helpers
static void static_set_interface(device_t &device, const apollo_kbd_interface &interface);
template<class _Object> static devcb2_base &set_tx_cb(device_t &device, _Object object) { return downcast<apollo_kbd_device &>(device).m_tx_w.set_callback(object); }
template<class _Object> static devcb2_base &set_german_cb(device_t &device, _Object object) { return downcast<apollo_kbd_device &>(device).m_german_r.set_callback(object); }
devcb2_write_line m_tx_w;
devcb2_read_line m_german_r;
private:
// device-level overrides
@ -134,8 +122,6 @@ private:
int m_tx_pending; // mouse data packet is pending
};
// const apollo_kbd_interface &m_config;
static const int XMIT_RING_SIZE = 64;
UINT8 m_xmitring[XMIT_RING_SIZE];
@ -169,10 +155,6 @@ private:
int m_keytime[0x80]; // time until next key press (1 ms)
UINT8 m_keyon[0x80]; // is 1 if key is pressed
devcb_resolved_write8 m_putchar;
devcb_resolved_read8 m_has_beeper;
devcb_resolved_read8 m_is_german;
static UINT16 m_code_table[];
};