diff --git a/src/mess/drivers/compucolor.c b/src/mess/drivers/compucolor.c index 0078f8ba946..de230a5fc0e 100644 --- a/src/mess/drivers/compucolor.c +++ b/src/mess/drivers/compucolor.c @@ -8,14 +8,27 @@ */ +/* + + TODO: + + - keyboard + - cursor + - floppy + - option ROM + +*/ + #define I8080_TAG "ua2" -#define TMS5501_TAG "uf1" +#define TMS5501_TAG "ud2" #define CRT5027_TAG "uf9" +#define RS232_TAG "rs232" #include "emu.h" #include "cpu/i8085/i8085.h" #include "imagedev/floppy.h" #include "machine/ram.h" +#include "machine/serial.h" #include "machine/tms5501.h" #include "video/tms9927.h" @@ -25,17 +38,57 @@ public: compucolor2_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, I8080_TAG), - //m_mioc(*this, TMS5501_TAG), + m_mioc(*this, TMS5501_TAG), m_vtac(*this, CRT5027_TAG), + m_floppy0(*this, TMS5501_TAG":0"), + m_floppy1(*this, TMS5501_TAG":1"), + m_rs232(*this, RS232_TAG), m_char_rom(*this, "chargen"), - m_video_ram(*this, "videoram") + m_video_ram(*this, "videoram"), + m_y0(*this, "Y0"), + m_y1(*this, "Y1"), + m_y2(*this, "Y2"), + m_y3(*this, "Y3"), + m_y4(*this, "Y4"), + m_y5(*this, "Y5"), + m_y6(*this, "Y6"), + m_y7(*this, "Y7"), + m_y8(*this, "Y8"), + m_y9(*this, "Y9"), + m_y10(*this, "Y10"), + m_y11(*this, "Y11"), + m_y12(*this, "Y12"), + m_y13(*this, "Y13"), + m_y14(*this, "Y14"), + m_y15(*this, "Y15"), + m_y128(*this, "Y128") { } required_device m_maincpu; - //required_device m_mioc; + required_device m_mioc; required_device m_vtac; + required_device m_floppy0; + required_device m_floppy1; + required_device m_rs232; required_memory_region m_char_rom; required_shared_ptr m_video_ram; + required_ioport m_y0; + required_ioport m_y1; + required_ioport m_y2; + required_ioport m_y3; + required_ioport m_y4; + required_ioport m_y5; + required_ioport m_y6; + required_ioport m_y7; + required_ioport m_y8; + required_ioport m_y9; + required_ioport m_y10; + required_ioport m_y11; + required_ioport m_y12; + required_ioport m_y13; + required_ioport m_y14; + required_ioport m_y15; + required_ioport m_y128; virtual void machine_start(); virtual void palette_init(); @@ -44,10 +97,14 @@ public: DECLARE_READ8_MEMBER( xi_r ); DECLARE_WRITE8_MEMBER( xo_w ); + DECLARE_WRITE_LINE_MEMBER( xmt_w ); IRQ_CALLBACK_MEMBER( int_ack ); rgb_t m_palette[8]; + + UINT8 m_xo; + UINT8 m_xo_kbd; }; static ADDRESS_MAP_START( compucolor2_mem, AS_PROGRAM, 8, compucolor2_state ) @@ -57,14 +114,14 @@ static ADDRESS_MAP_START( compucolor2_mem, AS_PROGRAM, 8, compucolor2_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( compucolor2_io, AS_IO, 8, compucolor2_state ) - //AM_RANGE(0x00, 0x0f) AM_MIRROR(0x10) AM_DEVREADWRITE(TMS5501_TAG, tms5501_device, read, write) + //AM_RANGE(0x00, 0x0f) AM_MIRROR(0x10) AM_DEVICE(TMS5501_TAG, tms5501_device, io_map) AM_RANGE(0x60, 0x6f) AM_MIRROR(0x10) AM_DEVREADWRITE(CRT5027_TAG, crt5027_device, read, write) - AM_RANGE(0x80, 0x9f) AM_MIRROR(0x60) AM_ROM AM_REGION("crt", 0) + AM_RANGE(0x80, 0x9f) AM_MIRROR(0x60) AM_ROM AM_REGION("ua1", 0) ADDRESS_MAP_END static INPUT_PORTS_START( compucolor2 ) PORT_START("Y0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('=') PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) @@ -232,6 +289,13 @@ static INPUT_PORTS_START( compucolor2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + + PORT_START("Y128") + PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) // COMMAND, CONTROL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) // SHIFT, SHIFT, COMMAND + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) // REPEAT + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) INPUT_PORTS_END UINT32 compucolor2_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -279,17 +343,109 @@ static struct tms9927_interface crtc_intf = READ8_MEMBER( compucolor2_state::xi_r ) { - return 0; + UINT8 data = 0xff; + + switch (m_xo_kbd & 0x0f) + { + case 0: data &= m_y0->read(); break; + case 1: data &= m_y1->read(); break; + case 2: data &= m_y2->read(); break; + case 3: data &= m_y3->read(); break; + case 4: data &= m_y4->read(); break; + case 5: data &= m_y5->read(); break; + case 6: data &= m_y6->read(); break; + case 7: data &= m_y7->read(); break; + case 8: data &= m_y8->read(); break; + case 9: data &= m_y9->read(); break; + case 10: data &= m_y10->read(); break; + case 11: data &= m_y11->read(); break; + case 12: data &= m_y12->read(); break; + case 13: data &= m_y13->read(); break; + case 14: data &= m_y14->read(); break; + case 15: data &= m_y15->read(); break; + } + + if (BIT(m_xo_kbd, 7)) + { + data = m_y128->read() | (data & 0x0f); + } + + return data; } WRITE8_MEMBER( compucolor2_state::xo_w ) { + /* + bit description + + 0 Keyboard A0, Stepper Phase 0 + 1 Keyboard A1, Stepper Phase 1 + 2 Keyboard A2, Stepper Phase 2 + 3 Keyboard A3, Disk _R/W + 4 00=Keyboard/Modem, 01=Internal Drive (CD0), 10=External Drive (CD1) + 5 ^ + 6 LED + 7 0=Normal Keyboard, 1=SHIFT/CONTROL/REPEAT/CAPS LOCK + + */ + + m_xo = data; + + floppy_image_device *floppy = NULL; + + switch ((m_xo >> 4) & 0x03) + { + case 0: + // keyboard + m_xo_kbd = m_xo; + logerror("keyboard Y%u\n", m_xo_kbd&0x0f); + break; + + case 1: + // floppy 0 + floppy = m_floppy0->get_device(); + logerror("internal floppy"); + break; + + case 2: + // floppy 1 + floppy = m_floppy1->get_device(); + logerror("external floppy"); + break; + } + + if (floppy) + { + logerror(" stp %u rw %u\n", data&0x07,BIT(data,3)); + // TODO stepper + + // motor + floppy->mon_w(0); + } +} + +WRITE_LINE_MEMBER( compucolor2_state::xmt_w ) +{ + switch ((m_xo >> 4) & 0x03) + { + case 0: + m_rs232->tx(state); + break; + + case 1: + // TODO floppy 0 + break; + + case 2: + // TODO floppy 1 + break; + } } IRQ_CALLBACK_MEMBER( compucolor2_state::int_ack ) { - return 0;//m_mioc->get_vector(); + return 0;// m_mioc->get_vector(); } void compucolor2_state::machine_start() @@ -324,14 +480,18 @@ static MACHINE_CONFIG_START( compucolor2, compucolor2_state ) MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1) MCFG_DEVICE_ADD(CRT5027_TAG, CRT5027, XTAL_17_9712MHz/12) MCFG_DEVICE_CONFIG(crtc_intf) + //MCFG_TMS9927_VSYN_CALLBACK(DEVWRITELINE(TMS5501_TAG, tms5501_device, sens_w)) // devices MCFG_DEVICE_ADD(TMS5501_TAG, TMS5501, XTAL_17_9712MHz/9) - /*MCFG_TMS5501_IRQ_CALLBACK(INPUTLINE(I8080_TAG, I8085_INTR_LINE)) - MCFG_TMS5501_XI_CALLBACK(READ8(compucolor2_state, xi_r)) - MCFG_TMS5501_XO_CALLBACK(WRITE8(compucolor2_state, xo_w))*/ + //MCFG_TMS5501_IRQ_CALLBACK(INPUTLINE(I8080_TAG, I8085_INTR_LINE)) + //MCFG_TMS5501_XMT_CALLBACK(WRITELINE(compucolor2_state, xmt_w)) + //MCFG_TMS5501_XI_CALLBACK(READ8(compucolor2_state, xi_r)) + //MCFG_TMS5501_XO_CALLBACK(WRITE8(compucolor2_state, xo_w)) MCFG_FLOPPY_DRIVE_ADD(TMS5501_TAG":0", compucolor2_floppies, "525sssd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_ADD(TMS5501_TAG":1", compucolor2_floppies, NULL, floppy_image_device::default_floppy_formats) + MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL) + //MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE(TMS5501_TAG, tms5501_device, rcv_w)) // internal ram MCFG_RAM_ADD(RAM_TAG) @@ -353,7 +513,7 @@ ROM_START( compclr2 ) ROM_LOAD( "chargen.uf6", 0x000, 0x400, BAD_DUMP CRC(7eef135a) SHA1(be488ef32f54c6e5f551fb84ab12b881aef72dd9) ) ROM_LOAD( "chargen.uf7", 0x400, 0x400, BAD_DUMP CRC(2bee7cf6) SHA1(808e0fc6f2332b4297de190eafcf84668703e2f4) ) - ROM_REGION( 0x20, "crt", 0 ) + ROM_REGION( 0x20, "ua1", 0 ) ROM_LOAD( "82s123.ua1", 0x00, 0x20, BAD_DUMP CRC(27ae54bc) SHA1(ccb056fbc1ec2132f2602217af64d77237494afb) ) // I/O PROM ROM_REGION( 0x20, "proms", 0 )