diff --git a/src/mess/drivers/apollo.c b/src/mess/drivers/apollo.c index 2c87b9eb661..595786228a7 100644 --- a/src/mess/drivers/apollo.c +++ b/src/mess/drivers/apollo.c @@ -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 /*************************************************************************** diff --git a/src/mess/includes/apollo.h b/src/mess/includes/apollo.h index 9b4aa126ff5..886245291d5 100644 --- a/src/mess/includes/apollo.h +++ b/src/mess/includes/apollo.h @@ -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 ); diff --git a/src/mess/machine/apollo_kbd.c b/src/mess/machine/apollo_kbd.c index dad93af90b6..07b5a150da4 100644 --- a/src/mess/machine/apollo_kbd.c +++ b/src/mess/machine/apollo_kbd.c @@ -65,20 +65,9 @@ const device_type APOLLO_KBD = &device_creator; 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(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(device); - - static_cast(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) diff --git a/src/mess/machine/apollo_kbd.h b/src/mess/machine/apollo_kbd.h index 142fadbd83e..eaae4538dc6 100644 --- a/src/mess/machine/apollo_kbd.h +++ b/src/mess/machine/apollo_kbd.h @@ -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 static devcb2_base &set_tx_cb(device_t &device, _Object object) { return downcast(device).m_tx_w.set_callback(object); } + template static devcb2_base &set_german_cb(device_t &device, _Object object) { return downcast(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[]; };