summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/ecbbus/grip.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/ecbbus/grip.c')
-rw-r--r--src/devices/bus/ecbbus/grip.c902
1 files changed, 902 insertions, 0 deletions
diff --git a/src/devices/bus/ecbbus/grip.c b/src/devices/bus/ecbbus/grip.c
new file mode 100644
index 00000000000..f2db25938d8
--- /dev/null
+++ b/src/devices/bus/ecbbus/grip.c
@@ -0,0 +1,902 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Conitec Datensysteme GRIP graphics card emulation
+
+**********************************************************************/
+
+#include "grip.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define SCREEN_TAG "screen"
+#define Z80_TAG "grip_z1"
+#define MC6845_TAG "z30"
+#define HD6345_TAG "z30"
+#define I8255A_TAG "z6"
+#define Z80STI_TAG "z9"
+#define CENTRONICS_TAG "centronics"
+
+
+#define VIDEORAM_SIZE 0x10000
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ECB_GRIP21 = &device_creator<grip_device>;
+
+
+
+//**************************************************************************
+// ROMS
+//**************************************************************************
+
+//-------------------------------------------------
+// ROM( grip21 )
+//-------------------------------------------------
+
+ROM_START( grip21 )
+ ROM_REGION( 0x4000, Z80_TAG, 0 )
+ ROM_LOAD( "grip21.z2", 0x0000, 0x4000, CRC(7f6a37dd) SHA1(2e89f0b0c378257ff7e41c50d57d90865c6e214b) )
+ROM_END
+
+
+#if 0
+//-------------------------------------------------
+// ROM( grip25 )
+//-------------------------------------------------
+
+ROM_START( grip25 )
+ ROM_REGION( 0x4000, Z80_TAG, 0 )
+ ROM_LOAD( "grip25.z2", 0x0000, 0x4000, CRC(49ebb284) SHA1(0a7eaaf89da6db2750f820146c8f480b7157c6c7) )
+ROM_END
+
+
+//-------------------------------------------------
+// ROM( grip26 )
+//-------------------------------------------------
+
+ROM_START( grip26 )
+ ROM_REGION( 0x4000, Z80_TAG, 0 )
+ ROM_LOAD( "grip26.z2", 0x0000, 0x4000, CRC(a1c424f0) SHA1(83942bc75b9475f044f936b8d9d7540551d87db9) )
+ROM_END
+
+
+//-------------------------------------------------
+// ROM( grip31 )
+//-------------------------------------------------
+
+ROM_START( grip31 )
+ ROM_REGION( 0x4000, Z80_TAG, 0 )
+ ROM_LOAD( "grip31.z2", 0x0000, 0x4000, CRC(e0e4e8ab) SHA1(73d3d14c9b06fed0c187fb0fffe5ec035d8dd256) )
+ROM_END
+
+
+//-------------------------------------------------
+// ROM( grip562 )
+//-------------------------------------------------
+
+ROM_START( grip562 )
+ ROM_REGION( 0x8000, Z80_TAG, 0 )
+ ROM_LOAD( "grip562.z2", 0x0000, 0x8000, CRC(74be0455) SHA1(1c423ecca6363345a8690ddc45dbafdf277490d3) )
+ROM_END
+
+
+//-------------------------------------------------
+// ROM( grips115 )
+//-------------------------------------------------
+
+ROM_START( grips115 )
+ ROM_REGION( 0x4000, Z80_TAG, 0 )
+ ROM_LOAD( "grips115.z2", 0x0000, 0x4000, CRC(505706ef) SHA1(05fb032fb1a504c534c30c352ba4bd47623503d0) )
+ROM_END
+#endif
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *grip_device::device_rom_region() const
+{
+ return ROM_NAME( grip21 );
+}
+
+
+
+//**************************************************************************
+// ADDRESS MAPS
+//**************************************************************************
+
+//-------------------------------------------------
+// ADDRESS_MAP( grip_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( grip_mem, AS_PROGRAM, 8, grip_device )
+ AM_RANGE(0x0000, 0x3fff) AM_ROM
+ AM_RANGE(0x4000, 0x47ff) AM_RAM
+ AM_RANGE(0x8000, 0xffff) AM_RAMBANK("videoram")
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( grip_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( grip_io, AS_IO, 8, grip_device )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x00, 0x00) AM_READWRITE(cxstb_r, cxstb_w)
+// AM_RANGE(0x10, 0x10) AM_WRITE(ccon_w)
+ AM_RANGE(0x11, 0x11) AM_WRITE(vol0_w)
+// AM_RANGE(0x12, 0x12) AM_WRITE(rts_w)
+ AM_RANGE(0x13, 0x13) AM_WRITE(page_w)
+// AM_RANGE(0x14, 0x14) AM_WRITE(cc1_w)
+// AM_RANGE(0x15, 0x15) AM_WRITE(cc2_w)
+ AM_RANGE(0x16, 0x16) AM_WRITE(flash_w)
+ AM_RANGE(0x17, 0x17) AM_WRITE(vol1_w)
+ AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE(Z80STI_TAG, z80sti_device, read, write)
+ AM_RANGE(0x30, 0x30) AM_READWRITE(lrs_r, lrs_w)
+ AM_RANGE(0x40, 0x40) AM_READ(stat_r)
+ AM_RANGE(0x50, 0x50) AM_DEVWRITE(MC6845_TAG, mc6845_device, address_w)
+ AM_RANGE(0x52, 0x52) AM_DEVWRITE(MC6845_TAG, mc6845_device, register_w)
+ AM_RANGE(0x53, 0x53) AM_DEVREAD(MC6845_TAG, mc6845_device, register_r)
+ AM_RANGE(0x60, 0x60) AM_DEVWRITE("cent_data_out", output_latch_device, write)
+ AM_RANGE(0x70, 0x73) AM_DEVREADWRITE(I8255A_TAG, i8255_device, read, write)
+// AM_RANGE(0x80, 0x80) AM_WRITE(bl2out_w)
+// AM_RANGE(0x90, 0x90) AM_WRITE(gr2out_w)
+// AM_RANGE(0xa0, 0xa0) AM_WRITE(rd2out_w)
+// AM_RANGE(0xb0, 0xb0) AM_WRITE(clrg2_w)
+// AM_RANGE(0xc0, 0xc0) AM_WRITE(bluout_w)
+// AM_RANGE(0xd0, 0xd0) AM_WRITE(grnout_w)
+// AM_RANGE(0xe0, 0xe0) AM_WRITE(redout_w)
+// AM_RANGE(0xf0, 0xf0) AM_WRITE(clrg1_w)
+ADDRESS_MAP_END
+
+/*
+//-------------------------------------------------
+// ADDRESS_MAP( grip5_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( grip5_mem, AS_PROGRAM, 8, grip5_state )
+ AM_RANGE(0x0000, 0x3fff) AM_ROMBANK("eprom")
+ AM_RANGE(0x4000, 0x5fff) AM_RAM
+ AM_RANGE(0x8000, 0xffff) AM_RAMBANK("videoram")
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( grip5_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( grip5_io, AS_IO, 8, grip5_device )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x00, 0x00) AM_READWRITE(cxstb_r, cxstb_w)
+ AM_RANGE(0x10, 0x10) AM_WRITE(eprom_w)
+ AM_RANGE(0x11, 0x11) AM_WRITE(vol0_w)
+// AM_RANGE(0x12, 0x12) AM_WRITE(rts_w)
+ AM_RANGE(0x13, 0x13) AM_WRITE(page_w)
+// AM_RANGE(0x14, 0x14) AM_WRITE(str_w)
+// AM_RANGE(0x15, 0x15) AM_WRITE(intl_w)
+ AM_RANGE(0x16, 0x16) AM_WRITE(dpage_w)
+ AM_RANGE(0x17, 0x17) AM_WRITE(vol1_w)
+ AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE(Z80STI_TAG, z80sti_device, read, write)
+ AM_RANGE(0x30, 0x30) AM_READWRITE(lrs_r, lrs_w)
+ AM_RANGE(0x40, 0x40) AM_READ(stat_r)
+ AM_RANGE(0x50, 0x50) AM_DEVWRITE(HD6345_TAG, hd6345_device, address_w)
+ AM_RANGE(0x52, 0x52) AM_DEVWRITE(HD6345_TAG, hd6345_device, register_w)
+ AM_RANGE(0x53, 0x53) AM_DEVREAD(HD6345_TAG, hd6345_device, register_r)
+ AM_RANGE(0x60, 0x60) AM_DEVWRITE("cent_data_out", output_latch_device, write)
+ AM_RANGE(0x70, 0x73) AM_DEVREADWRITE(I8255A_TAG, i8255_device, read, write)
+
+// AM_RANGE(0x80, 0x80) AM_WRITE(xrflgs_w)
+// AM_RANGE(0xc0, 0xc0) AM_WRITE(xrclrg_w)
+// AM_RANGE(0xe0, 0xe0) AM_WRITE(xrclu0_w)
+// AM_RANGE(0xe1, 0xe1) AM_WRITE(xrclu1_w)
+// AM_RANGE(0xe2, 0xe2) AM_WRITE(xrclu2_w)
+
+// AM_RANGE(0x80, 0x80) AM_WRITE(bl2out_w)
+// AM_RANGE(0x90, 0x90) AM_WRITE(gr2out_w)
+// AM_RANGE(0xa0, 0xa0) AM_WRITE(rd2out_w)
+// AM_RANGE(0xb0, 0xb0) AM_WRITE(clrg2_w)
+// AM_RANGE(0xc0, 0xc0) AM_WRITE(bluout_w)
+// AM_RANGE(0xd0, 0xd0) AM_WRITE(grnout_w)
+// AM_RANGE(0xe0, 0xe0) AM_WRITE(redout_w)
+// AM_RANGE(0xf0, 0xf0) AM_WRITE(clrg1_w)
+ADDRESS_MAP_END
+*/
+
+
+
+//**************************************************************************
+// DEVICE CONFIGURATION
+//**************************************************************************
+
+//-------------------------------------------------
+// mc6845
+//-------------------------------------------------
+
+MC6845_UPDATE_ROW( grip_device::crtc_update_row )
+{
+ for (int column = 0; column < x_count; column++)
+ {
+ UINT16 address = (m_page << 12) | (((ma + column) & 0xfff) << 3) | (ra & 0x07);
+ UINT8 data = m_video_ram[address];
+
+ for (int bit = 0; bit < 8; bit++)
+ {
+ int x = (column * 8) + bit;
+ int color = (m_flash ? 0 : BIT(data, bit)) && de;
+
+ bitmap.pix32(vbp + y, hbp + x) = m_palette->pen(color);
+ }
+ }
+}
+/*
+MC6845_UPDATE_ROW( grip_device::grip5_update_row )
+{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ int column, bit;
+
+ for (column = 0; column < x_count; column++)
+ {
+ UINT16 address = (m_dpage << 12) | (((ma + column) & 0xfff) << 3) | (ra & 0x07);
+ UINT8 data = m_video_ram[address];
+
+ for (bit = 0; bit < 8; bit++)
+ {
+ int x = (column * 8) + bit;
+ int color = m_flash ? 0 : BIT(data, bit);
+
+ bitmap.pix32(y, x) = palette[color];
+ }
+ }
+}
+
+MC6845_ON_UPDATE_ADDR_CHANGED( grip_device::grip5_addr_changed )
+{
+}
+*/
+
+static const INT16 speaker_levels[] = { -32768, 0, 32767, 0 };
+
+//-------------------------------------------------
+// I8255A interface
+//-------------------------------------------------
+
+READ8_MEMBER( grip_device::ppi_pa_r )
+{
+ /*
+
+ bit description
+
+ PA0 ECB bus D0
+ PA1 ECB bus D1
+ PA2 ECB bus D2
+ PA3 ECB bus D3
+ PA4 ECB bus D4
+ PA5 ECB bus D5
+ PA6 ECB bus D6
+ PA7 ECB bus D7
+
+ */
+
+ return m_ppi_pa;
+}
+
+WRITE8_MEMBER( grip_device::ppi_pa_w )
+{
+ /*
+
+ bit description
+
+ PA0 ECB bus D0
+ PA1 ECB bus D1
+ PA2 ECB bus D2
+ PA3 ECB bus D3
+ PA4 ECB bus D4
+ PA5 ECB bus D5
+ PA6 ECB bus D6
+ PA7 ECB bus D7
+
+ */
+
+ m_ppi_pa = data;
+}
+
+READ8_MEMBER( grip_device::ppi_pb_r )
+{
+ /*
+
+ bit description
+
+ PB0 Keyboard input
+ PB1 Keyboard input
+ PB2 Keyboard input
+ PB3 Keyboard input
+ PB4 Keyboard input
+ PB5 Keyboard input
+ PB6 Keyboard input
+ PB7 Keyboard input
+
+ */
+
+ return m_keydata;
+}
+
+WRITE8_MEMBER( grip_device::ppi_pc_w )
+{
+ /*
+
+ bit signal description
+
+ PC0 INTRB interrupt B output (keyboard)
+ PC1 KBF input buffer B full output (keyboard)
+ PC2 _KBSTB strobe B input (keyboard)
+ PC3 INTRA interrupt A output (PROF-80)
+ PC4 _STBA strobe A input (PROF-80)
+ PC5 IBFA input buffer A full output (PROF-80)
+ PC6 _ACKA acknowledge A input (PROF-80)
+ PC7 _OBFA output buffer full output (PROF-80)
+
+ */
+
+ // keyboard interrupt
+ m_ib = BIT(data, 0);
+ m_sti->i4_w(m_ib);
+
+ // keyboard buffer full
+ m_kbf = BIT(data, 1);
+
+ // PROF-80 interrupt
+ m_ia = BIT(data, 3);
+ m_sti->i7_w(m_ia);
+
+ // PROF-80 handshaking
+ m_ppi_pc = (!BIT(data, 7) << 7) | (!BIT(data, 5) << 6) | (m_ppi->pa_r() & 0x3f);
+}
+
+//-------------------------------------------------
+// Z80STI_INTERFACE( sti_intf )
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(grip_device::write_centronics_busy)
+{
+ m_centronics_busy = state;
+}
+
+READ8_MEMBER( grip_device::sti_gpio_r )
+{
+ /*
+
+ bit signal description
+
+ I0 _CTS RS-232 clear to send input
+ I1 DE MC6845 display enable input
+ I2 CURSOR MC6845 cursor input
+ I3 BUSY Centronics busy input
+ I4 IB PPI8255 PC0 input
+ I5 _SKBD Serial keyboard input
+ I6 EXIN External interrupt input
+ I7 IA PPI8255 PC3 input
+
+ */
+
+ UINT8 data = 0x20;
+
+ // display enable
+ data |= m_crtc->de_r() << 1;
+
+ // cursor
+ data |= m_crtc->cursor_r() << 2;
+
+ // centronics busy
+ data |= m_centronics_busy << 3;
+
+ // keyboard interrupt
+ data |= m_ib << 4;
+
+ // PROF-80 interrupt
+ data |= m_ia << 7;
+
+ return data;
+}
+
+WRITE_LINE_MEMBER( grip_device::speaker_w )
+{
+ int level = state && ((m_vol1 << 1) | m_vol0);
+
+ m_speaker->level_w(level);
+}
+
+//-------------------------------------------------
+// z80_daisy_config grip_daisy_chain
+//-------------------------------------------------
+
+static const z80_daisy_config grip_daisy_chain[] =
+{
+ { Z80STI_TAG },
+ { NULL }
+};
+
+
+//-------------------------------------------------
+// ASCII_KEYBOARD_INTERFACE( kb_intf )
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip_device::kb_w )
+{
+ if (!m_kbf)
+ {
+ m_keydata = data;
+
+ // trigger GRIP 8255 port C bit 2 (_STBB)
+ m_ppi->pc2_w(0);
+ m_ppi->pc2_w(1);
+ }
+}
+
+//**************************************************************************
+// MACHINE CONFIGURATION
+//**************************************************************************
+
+//-------------------------------------------------
+// MACHINE_CONFIG_FRAGMENT( grip )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( grip )
+ // basic machine hardware
+ MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_16MHz/4)
+ MCFG_CPU_CONFIG(grip_daisy_chain)
+ MCFG_CPU_PROGRAM_MAP(grip_mem)
+ MCFG_CPU_IO_MAP(grip_io)
+
+ // video hardware
+ MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate
+ MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
+ MCFG_SCREEN_SIZE(640, 480)
+ MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
+
+ MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
+
+ // sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SPEAKER_LEVELS(4, speaker_levels)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ // devices
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/4)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(grip_device, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(DEVWRITELINE(Z80STI_TAG, z80sti_device, i1_w))
+ MCFG_MC6845_OUT_CUR_CB(DEVWRITELINE(Z80STI_TAG, z80sti_device, i1_w))
+
+// MCFG_MC6845_ADD(HD6345_TAG, HD6345, SCREEN_TAG, XTAL_16MHz/4)
+
+ MCFG_DEVICE_ADD(I8255A_TAG, I8255A, 0)
+ MCFG_I8255_IN_PORTA_CB(READ8(grip_device, ppi_pa_r))
+ MCFG_I8255_OUT_PORTA_CB(WRITE8(grip_device, ppi_pa_w))
+ MCFG_I8255_IN_PORTB_CB(READ8(grip_device, ppi_pb_r))
+ MCFG_I8255_OUT_PORTC_CB(WRITE8(grip_device, ppi_pc_w))
+
+ MCFG_DEVICE_ADD(Z80STI_TAG, Z80STI, XTAL_16MHz/4)
+ MCFG_Z80STI_OUT_INT_CB(INPUTLINE(Z80_TAG, INPUT_LINE_IRQ0))
+ MCFG_Z80STI_IN_GPIO_CB(READ8(grip_device, sti_gpio_r))
+ MCFG_Z80STI_OUT_TBO_CB(WRITELINE(grip_device, speaker_w))
+ MCFG_Z80STI_OUT_TCO_CB(DEVWRITELINE(Z80STI_TAG, z80sti_device, tc_w))
+ MCFG_Z80STI_OUT_TDO_CB(DEVWRITELINE(Z80STI_TAG, z80sti_device, tc_w))
+
+ MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_devices, "printer")
+ MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(grip_device, write_centronics_busy))
+ MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(grip_device, write_centronics_fault))
+
+ MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
+
+ MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
+ MCFG_GENERIC_KEYBOARD_CB(WRITE8(grip_device, kb_w))
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor grip_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( grip );
+}
+
+
+//**************************************************************************
+// INPUT PORTS
+//**************************************************************************
+
+//-------------------------------------------------
+// INPUT_PORTS( grip )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( grip )
+ PORT_START("J1")
+ PORT_CONFNAME( 0x01, 0x00, "J1 EPROM Type")
+ PORT_CONFSETTING( 0x00, "2732" )
+ PORT_CONFSETTING( 0x01, "2764/27128" )
+
+ PORT_START("J2")
+ PORT_CONFNAME( 0x03, 0x00, "J2 Centronics Mode")
+ PORT_CONFSETTING( 0x00, "Mode 1" )
+ PORT_CONFSETTING( 0x01, "Mode 2" )
+ PORT_CONFSETTING( 0x02, "Mode 3" )
+
+ PORT_START("J3A")
+ PORT_CONFNAME( 0x07, 0x00, "J3 Host")
+ PORT_CONFSETTING( 0x00, "ECB Bus" )
+ PORT_CONFSETTING( 0x01, "V24 9600 Baud" )
+ PORT_CONFSETTING( 0x02, "V24 4800 Baud" )
+ PORT_CONFSETTING( 0x03, "V24 1200 Baud" )
+ PORT_CONFSETTING( 0x04, "Keyboard" )
+
+ PORT_START("J3B")
+ PORT_CONFNAME( 0x07, 0x00, "J3 Keyboard")
+ PORT_CONFSETTING( 0x00, "Parallel" )
+ PORT_CONFSETTING( 0x01, "Serial (1200 Baud, 8 Bits)" )
+ PORT_CONFSETTING( 0x02, "Serial (1200 Baud, 7 Bits)" )
+ PORT_CONFSETTING( 0x03, "Serial (600 Baud, 8 Bits)" )
+ PORT_CONFSETTING( 0x04, "Serial (600 Baud, 7 Bits)" )
+
+ PORT_START("J4")
+ PORT_CONFNAME( 0x01, 0x00, "J4 COLOR")
+ PORT_CONFSETTING( 0x00, DEF_STR( No ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( Yes ) )
+
+ PORT_START("J5")
+ PORT_CONFNAME( 0x01, 0x01, "J5 Power On Reset")
+ PORT_CONFSETTING( 0x00, "External" )
+ PORT_CONFSETTING( 0x01, "Internal" )
+
+ PORT_START("J6")
+ PORT_CONFNAME( 0x03, 0x00, "J6 Serial Clock")
+ PORT_CONFSETTING( 0x00, "TC/16, TD/16, TD" )
+ PORT_CONFSETTING( 0x01, "TD/16, TD/16, TD" )
+ PORT_CONFSETTING( 0x02, "TC/16, BAUD/16, input" )
+ PORT_CONFSETTING( 0x03, "BAUD/16, BAUD/16, input" )
+
+ PORT_START("J7")
+ PORT_CONFNAME( 0xff, 0xc0, "J7 ECB Bus Address")
+ PORT_CONFSETTING( 0xc0, "C0/C1" )
+ PORT_CONFSETTING( 0xa0, "A0/A1" )
+
+ PORT_START("J8")
+ PORT_CONFNAME( 0x01, 0x00, "J8 Video RAM")
+ PORT_CONFSETTING( 0x00, "32 KB" )
+ PORT_CONFSETTING( 0x01, "64 KB" )
+
+ PORT_START("J9")
+ PORT_CONFNAME( 0x01, 0x01, "J9 CPU Clock")
+ PORT_CONFSETTING( 0x00, "2 MHz" )
+ PORT_CONFSETTING( 0x01, "4 MHz" )
+
+ PORT_START("J10")
+ PORT_CONFNAME( 0x01, 0x01, "J10 Pixel Clock")
+ PORT_CONFSETTING( 0x00, "External" )
+ PORT_CONFSETTING( 0x01, "Internal" )
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor grip_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( grip );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// grip_device - constructor
+//-------------------------------------------------
+
+grip_device::grip_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, ECB_GRIP21, "GRIP-2.1", tag, owner, clock, "grip", __FILE__),
+ device_ecbbus_card_interface(mconfig, *this),
+ m_ppi(*this, I8255A_TAG),
+ m_sti(*this, Z80STI_TAG),
+ m_crtc(*this, MC6845_TAG),
+ m_centronics(*this, CENTRONICS_TAG),
+ m_palette(*this, "palette"),
+ m_speaker(*this, "speaker"),
+ m_video_ram(*this, "video_ram"),
+ m_j3a(*this, "J3A"),
+ m_j3b(*this, "J3B"),
+ m_j7(*this, "J7")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void grip_device::device_start()
+{
+ // allocate video RAM
+ m_video_ram.allocate(VIDEORAM_SIZE);
+
+ // setup GRIP memory banking
+ membank("videoram")->configure_entries(0, 2, m_video_ram, 0x8000);
+ membank("videoram")->set_entry(0);
+
+ // allocate keyboard scan timer
+ m_kb_timer = timer_alloc();
+ m_kb_timer->adjust(attotime::zero, 0, attotime::from_hz(2500));
+
+ // register for state saving
+ save_item(NAME(m_vol0));
+ save_item(NAME(m_vol1));
+ save_item(NAME(m_keydata));
+ save_item(NAME(m_kbf));
+ save_item(NAME(m_lps));
+ save_item(NAME(m_page));
+ save_item(NAME(m_flash));
+}
+
+/*
+void grip5_state::machine_start()
+{
+ grip_device::machine_start();
+
+ // setup ROM banking
+ membank("eprom")->configure_entries(0, 2, memregion(Z80_TAG)->base(), 0x4000);
+ *this.root_device().membank("eprom")->set_entry(0);
+
+ // register for state saving
+ save_item(NAME(m_dpage));
+}
+*/
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void grip_device::device_reset()
+{
+ m_base = m_j7->read();
+ m_page = 0;
+ m_lps = 0;
+}
+
+
+//-------------------------------------------------
+// vol0_w - volume 0
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip_device::vol0_w )
+{
+ m_vol0 = BIT(data, 7);
+}
+
+
+//-------------------------------------------------
+// vol1_w - volume 1
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip_device::vol1_w )
+{
+ m_vol1 = BIT(data, 7);
+}
+
+
+//-------------------------------------------------
+// flash_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip_device::flash_w )
+{
+ m_flash = BIT(data, 7);
+}
+
+
+//-------------------------------------------------
+// page_w - video page select
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip_device::page_w )
+{
+ m_page = BIT(data, 7);
+
+ membank("videoram")->set_entry(m_page);
+}
+
+
+//-------------------------------------------------
+// stat_r -
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(grip_device::write_centronics_fault)
+{
+ m_centronics_fault = state;
+}
+
+READ8_MEMBER( grip_device::stat_r )
+{
+ /*
+
+ bit signal description
+
+ 0 LPA0
+ 1 LPA1
+ 2 LPA2
+ 3 SENSE
+ 4 JS0
+ 5 JS1
+ 6 _ERROR
+ 7 LPSTB light pen strobe
+
+ */
+
+ UINT8 data = 0;
+ int js0 = 0, js1 = 0;
+
+ // JS0
+ switch (m_j3a->read())
+ {
+ case 0: js0 = 0; break;
+ case 1: js0 = 1; break;
+ case 2: js0 = m_vol0; break;
+ case 3: js0 = m_vol1; break;
+ case 4: js0 = m_page; break;
+ }
+
+ data |= js0 << 4;
+
+ // JS1
+ switch (m_j3b->read())
+ {
+ case 0: js1 = 0; break;
+ case 1: js1 = 1; break;
+ case 2: js1 = m_vol0; break;
+ case 3: js1 = m_vol1; break;
+ case 4: js1 = m_page; break;
+ }
+
+ data |= js1 << 5;
+
+ // centronics fault
+ data |= m_centronics_fault << 6;
+
+ // light pen strobe
+ data |= m_lps << 7;
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// lrs_r -
+//-------------------------------------------------
+
+READ8_MEMBER( grip_device::lrs_r )
+{
+ m_lps = 0;
+
+ return 0;
+}
+
+
+//-------------------------------------------------
+// lrs_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip_device::lrs_w )
+{
+ m_lps = 0;
+}
+
+
+//-------------------------------------------------
+// cxstb_r - centronics strobe
+//-------------------------------------------------
+
+READ8_MEMBER( grip_device::cxstb_r )
+{
+ m_centronics->write_strobe(0);
+ m_centronics->write_strobe(1);
+
+ return 0;
+}
+
+
+//-------------------------------------------------
+// cxstb_w - centronics strobe
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip_device::cxstb_w )
+{
+ m_centronics->write_strobe(0);
+ m_centronics->write_strobe(1);
+}
+
+/*
+//-------------------------------------------------
+// eprom_w - EPROM bank select
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip5_state::eprom_w )
+{
+ membank("eprom")->set_entry(BIT(data, 0));
+}
+
+
+//-------------------------------------------------
+// dpage_w - display page select
+//-------------------------------------------------
+
+WRITE8_MEMBER( grip5_state::dpage_w )
+{
+ m_dpage = BIT(data, 7);
+}
+*/
+
+
+//-------------------------------------------------
+// ecbbus_io_r - I/O read
+//-------------------------------------------------
+
+UINT8 grip_device::ecbbus_io_r(offs_t offset)
+{
+ UINT8 data = 0;
+
+ if ((offset & 0xfe) == m_base)
+ {
+ if (BIT(offset, 0))
+ {
+ data = m_ppi_pa;
+
+ // acknowledge PPI port A
+ m_ppi->pc6_w(0);
+ m_ppi->pc6_w(1);
+ }
+ else
+ {
+ data = m_ppi_pc;
+ }
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// ecbbus_io_w - I/O write
+//-------------------------------------------------
+
+void grip_device::ecbbus_io_w(offs_t offset, UINT8 data)
+{
+ if ((offset & 0xfe) == m_base)
+ {
+ if (BIT(offset, 0))
+ {
+ m_ppi_pa = data;
+
+ // strobe PPI port A
+ m_ppi->pc4_w(0);
+ m_ppi->pc4_w(1);
+ }
+ }
+}