diff --git a/.gitattributes b/.gitattributes index e9a72308e29..939a9ae50da 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8850,6 +8850,8 @@ src/mess/machine/dec_lk201.c svneol=native#text/plain src/mess/machine/dec_lk201.h svneol=native#text/plain src/mess/machine/dgn_beta.c svneol=native#text/plain src/mess/machine/dgnalpha.c svneol=native#text/plain +src/mess/machine/dmv_keyb.c svneol=native#text/plain +src/mess/machine/dmv_keyb.h svneol=native#text/plain src/mess/machine/docg3.c svneol=native#text/plain src/mess/machine/docg3.h svneol=native#text/plain src/mess/machine/dragon.c svneol=native#text/plain diff --git a/src/mess/drivers/dmv.c b/src/mess/drivers/dmv.c index cf911cfe110..4f23b090ea5 100644 --- a/src/mess/drivers/dmv.c +++ b/src/mess/drivers/dmv.c @@ -14,6 +14,9 @@ #include "cpu/mcs48/mcs48.h" #include "machine/upd765.h" #include "machine/am9517a.h" +#include "machine/pit8253.h" +#include "machine/dmv_keyb.h" +#include "sound/speaker.h" #include "video/upd7220.h" #include "dmv.lh" @@ -25,9 +28,12 @@ public: m_maincpu(*this, "maincpu"), m_hgdc(*this, "upd7220"), m_dmac(*this, "dma8237"), - m_fdc(*this, "upd765"), - m_floppy0(*this, "upd765:0:525dd"), - m_floppy1(*this, "upd765:1:525dd"), + m_pit(*this, "pit8253"), + m_fdc(*this, "i8272"), + m_floppy0(*this, "i8272:0"), + m_floppy1(*this, "i8272:1"), + m_keyboard(*this, "keyboard"), + m_speaker(*this, "speaker"), m_video_ram(*this, "video_ram"), m_palette(*this, "palette") { } @@ -35,9 +41,12 @@ public: required_device m_maincpu; required_device m_hgdc; required_device m_dmac; - required_device m_fdc; - required_device m_floppy0; - required_device m_floppy1; + required_device m_pit; + required_device m_fdc; + required_device m_floppy0; + required_device m_floppy1; + required_device m_keyboard; + required_device m_speaker; virtual void video_start(); virtual void machine_start(); @@ -45,22 +54,38 @@ public: DECLARE_WRITE8_MEMBER(leds_w); DECLARE_WRITE_LINE_MEMBER(dma_hrq_changed); + DECLARE_WRITE_LINE_MEMBER(dmac_eop); + DECLARE_WRITE_LINE_MEMBER(dmac_dack3); + DECLARE_WRITE_LINE_MEMBER(fdc_irq); + DECLARE_WRITE_LINE_MEMBER(pit_out0); DECLARE_WRITE8_MEMBER(fdd_motor_w); DECLARE_READ8_MEMBER(sys_status_r); - DECLARE_READ8_MEMBER(kb_ctrl_mcu_r); - DECLARE_WRITE8_MEMBER(kb_ctrl_mcu_w); - DECLARE_READ8_MEMBER(fdc_dma_r); - DECLARE_WRITE8_MEMBER(fdc_dma_w); + DECLARE_WRITE8_MEMBER(tc_set_w); DECLARE_READ8_MEMBER(memory_read_byte); DECLARE_WRITE8_MEMBER(memory_write_byte); + DECLARE_WRITE8_MEMBER(ramsel_w); + DECLARE_WRITE8_MEMBER(romsel_w); + DECLARE_READ8_MEMBER(kb_mcu_port1_r); + DECLARE_WRITE8_MEMBER(kb_mcu_port1_w); + DECLARE_WRITE8_MEMBER(kb_mcu_port2_w); required_shared_ptr m_video_ram; required_device m_palette; UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels ); UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text ); + + int m_eop_line; + int m_dack3_line; + int m_sd_poll_state; + int m_floppy_motor; + UINT8 m_ram[0x2000]; }; +WRITE8_MEMBER(dmv_state::tc_set_w) +{ + m_fdc->tc_w(true); +} WRITE8_MEMBER(dmv_state::leds_w) { @@ -82,22 +107,24 @@ WRITE8_MEMBER(dmv_state::leds_w) output_set_led_value(8-i, BIT(data, i)); } -READ8_MEMBER(dmv_state::fdc_dma_r) +WRITE8_MEMBER(dmv_state::ramsel_w) { - return m_fdc->dma_r(); + m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x1fff, m_ram); } -WRITE8_MEMBER(dmv_state::fdc_dma_w) +WRITE8_MEMBER(dmv_state::romsel_w) { - m_fdc->dma_w(data); + m_maincpu->space(AS_PROGRAM).install_rom(0x0000, 0x1fff, memregion("maincpu")->base()); } WRITE8_MEMBER(dmv_state::fdd_motor_w) { - // bit 0 defines the state of the FDD motor + m_pit->write_gate0(1); + m_pit->write_gate0(0); - m_floppy0->mon_w(!BIT(data, 0)); - m_floppy1->mon_w(!BIT(data, 0)); + m_floppy_motor = 0; + m_floppy0->get_device()->mon_w(m_floppy_motor); + m_floppy1->get_device()->mon_w(m_floppy_motor); } READ8_MEMBER(dmv_state::sys_status_r) @@ -115,25 +142,21 @@ READ8_MEMBER(dmv_state::sys_status_r) */ UINT8 data = 0x00; + if (m_floppy_motor) + data |= 0x01; + // 16-bit CPU not available data |= 0x02; + if (!m_floppy0->get_device()->ready_r()) + data |= 0x04; + if (m_fdc->get_irq()) data |= 0x08; return data; } -READ8_MEMBER(dmv_state::kb_ctrl_mcu_r) -{ - return machine().device("kb_ctrl_mcu")->upi41_master_r(space, offset); -} - -WRITE8_MEMBER(dmv_state::kb_ctrl_mcu_w) -{ - machine().device("kb_ctrl_mcu")->upi41_master_w(space, offset, data); -} - UPD7220_DISPLAY_PIXELS_MEMBER( dmv_state::hgdc_display_pixels ) { //TODO @@ -188,28 +211,39 @@ static ADDRESS_MAP_START( dmv_io , AS_IO, 8, dmv_state) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_WRITE(leds_w) + AM_RANGE(0x10, 0x10) AM_WRITE(ramsel_w) + AM_RANGE(0x11, 0x11) AM_WRITE(romsel_w) + AM_RANGE(0x12, 0x12) AM_WRITE(tc_set_w) AM_RANGE(0x13, 0x13) AM_READ(sys_status_r) AM_RANGE(0x14, 0x14) AM_WRITE(fdd_motor_w) AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write) - AM_RANGE(0x40, 0x41) AM_READWRITE(kb_ctrl_mcu_r, kb_ctrl_mcu_w) - AM_RANGE(0x50, 0x51) AM_DEVICE("upd765", upd765a_device, map) + AM_RANGE(0x40, 0x41) AM_DEVREADWRITE("kb_ctrl_mcu", upi41_cpu_device, upi41_master_r, upi41_master_w) + AM_RANGE(0x50, 0x51) AM_DEVICE("i8272", i8272a_device, map) + AM_RANGE(0x80, 0x83) AM_DEVREADWRITE("pit8253", pit8253_device, read, write) AM_RANGE(0xa0, 0xa1) AM_DEVREADWRITE("upd7220", upd7220_device, read, write) - //AM_RANGE(0x10, 0x11) boot ROM bankswitch (0x0000-0x1fff) - //AM_RANGE(0x12, 0x12) pulse FDC TC line - //AM_RANGE(0x80, 0x83) PIT8253 //AM_RANGE(0xe0, 0xe7) RAM bankswitch ADDRESS_MAP_END -static ADDRESS_MAP_START( dmv_keyboard_io, AS_IO, 8, dmv_state ) - //AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) keyboard rows input - //AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) bits 0-3 kb cols out -ADDRESS_MAP_END +READ8_MEMBER(dmv_state::kb_mcu_port1_r) +{ + return !(m_keyboard->sd_poll_r() & !m_sd_poll_state); +} + +WRITE8_MEMBER(dmv_state::kb_mcu_port1_w) +{ + m_sd_poll_state = BIT(data, 1); + m_keyboard->sd_poll_w(!m_sd_poll_state); +} + +WRITE8_MEMBER(dmv_state::kb_mcu_port2_w) +{ + m_speaker->level_w(BIT(data, 0)); +} static ADDRESS_MAP_START( dmv_kb_ctrl_io, AS_IO, 8, dmv_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_NOP // bit 0 data from kb, bit 1 data to kb - AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_NOP + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(kb_mcu_port1_r, kb_mcu_port1_w) // bit 0 data from kb, bit 1 data to kb + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(kb_mcu_port2_w) ADDRESS_MAP_END static ADDRESS_MAP_START( upd7220_map, AS_0, 8, dmv_state ) @@ -227,6 +261,11 @@ void dmv_state::machine_start() void dmv_state::machine_reset() { + m_eop_line = 0; + m_dack3_line = 0; + m_sd_poll_state = 0; + m_floppy_motor = 1; + m_maincpu->space(AS_PROGRAM).install_rom(0x0000, 0x1fff, memregion("maincpu")->base()); } void dmv_state::video_start() @@ -264,6 +303,38 @@ WRITE_LINE_MEMBER( dmv_state::dma_hrq_changed ) m_dmac->hack_w(state); } +WRITE_LINE_MEMBER( dmv_state::dmac_eop ) +{ + if (!(m_dack3_line || m_eop_line) && (m_dack3_line || state)) + m_fdc->tc_w(true); + + m_eop_line = state; +} + +WRITE_LINE_MEMBER( dmv_state::dmac_dack3 ) +{ + if (!(m_dack3_line || m_eop_line) && (state || m_eop_line)) + m_fdc->tc_w(true); + + m_dack3_line = state; +} + +WRITE_LINE_MEMBER( dmv_state::pit_out0 ) +{ + if (!state) + { + m_floppy_motor = 1; + m_floppy0->get_device()->mon_w(m_floppy_motor); + m_floppy1->get_device()->mon_w(m_floppy_motor); + } +} + +WRITE_LINE_MEMBER( dmv_state::fdc_irq ) +{ + if (state) + m_fdc->tc_w(false); +} + READ8_MEMBER(dmv_state::memory_read_byte) { address_space& prog_space = m_maincpu->space(AS_PROGRAM); @@ -273,22 +344,22 @@ READ8_MEMBER(dmv_state::memory_read_byte) WRITE8_MEMBER(dmv_state::memory_write_byte) { address_space& prog_space = m_maincpu->space(AS_PROGRAM); - return prog_space.write_byte(offset, data); + prog_space.write_byte(offset, data); } static MACHINE_CONFIG_START( dmv, dmv_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu",Z80, XTAL_4MHz) + MCFG_CPU_ADD("maincpu",Z80, XTAL_24MHz / 6) MCFG_CPU_PROGRAM_MAP(dmv_mem) MCFG_CPU_IO_MAP(dmv_io) MCFG_CPU_ADD("kb_ctrl_mcu", I8741, XTAL_6MHz) MCFG_CPU_IO_MAP(dmv_kb_ctrl_io) - MCFG_CPU_ADD("keyboard_mcu", I8741, XTAL_6MHz) - MCFG_CPU_IO_MAP(dmv_keyboard_io) - MCFG_DEVICE_DISABLE() + MCFG_QUANTUM_PERFECT_CPU("maincpu") + + MCFG_DMV_KEYBOARD_ADD("keyboard") /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -310,14 +381,29 @@ static MACHINE_CONFIG_START( dmv, dmv_state ) MCFG_DEVICE_ADD( "dma8237", AM9517A, XTAL_4MHz ) MCFG_I8237_OUT_HREQ_CB(WRITELINE(dmv_state, dma_hrq_changed)) + MCFG_I8237_OUT_EOP_CB(WRITELINE(dmv_state, dmac_eop)) MCFG_I8237_IN_MEMR_CB(READ8(dmv_state, memory_read_byte)) MCFG_I8237_OUT_MEMW_CB(WRITE8(dmv_state, memory_write_byte)) - MCFG_I8237_IN_IOR_3_CB(READ8(dmv_state, fdc_dma_r)) - MCFG_I8237_OUT_IOW_3_CB(WRITE8(dmv_state, fdc_dma_w)) - MCFG_UPD765A_ADD( "upd765", true, true ) + MCFG_I8237_IN_IOR_3_CB(DEVREAD8("i8272", i8272a_device, mdma_r)) + MCFG_I8237_OUT_IOW_3_CB(DEVWRITE8("i8272", i8272a_device, mdma_w)) + MCFG_I8237_OUT_DACK_3_CB(WRITELINE(dmv_state, dmac_dack3)) + + MCFG_I8272A_ADD( "i8272", true ) + MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(dmv_state, fdc_irq)) MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("dma8237", am9517a_device, dreq3_w)) - MCFG_FLOPPY_DRIVE_ADD("upd765:0", dmv_floppies, "525dd", floppy_image_device::default_floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("upd765:1", dmv_floppies, "525dd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("i8272:0", dmv_floppies, "525dd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("i8272:1", dmv_floppies, "525dd", floppy_image_device::default_floppy_formats) + + MCFG_DEVICE_ADD("pit8253", PIT8253, 0) + MCFG_PIT8253_CLK0(50) + MCFG_PIT8253_OUT0_HANDLER(WRITELINE(dmv_state, pit_out0)) + //MCFG_PIT8253_CLK2(XTAL_24MHz / 3 / 16) + //MCFG_PIT8253_OUT2_HANDLER(WRITELINE(dmv_state, timint_w)) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO( "mono" ) + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END /* ROM definition */ @@ -325,12 +411,8 @@ ROM_START( dmv ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) ROM_LOAD( "dmv_norm.bin", 0x0000, 0x2000, CRC(bf25f3f0) SHA1(0c7dd37704db4799e340cc836f887cd543e5c964)) - ROM_REGION(0x400, "kb_ctrl_mcu", ROMREGION_ERASEFF) + ROM_REGION(0x400, "kb_ctrl_mcu", 0) ROM_LOAD( "dmv_kb_ctrl_mcu.bin", 0x0000, 0x0400, CRC(a03af298) SHA1(144cba41294c46f5ca79b7ad8ced0e4408168775)) - - // i8741/8041 microcontroller inside the Keyboard - ROM_REGION(0x400, "keyboard_mcu", ROMREGION_ERASEFF) - ROM_LOAD( "dmv_kbmcu.bin", 0x0000, 0x0400, CRC(14e376de) SHA1 (ed09048ef03c602dba17ad6fcfe125c082c9bb17)) ROM_END /* Driver */ diff --git a/src/mess/machine/dmv_keyb.c b/src/mess/machine/dmv_keyb.c new file mode 100644 index 00000000000..c11e6c5c357 --- /dev/null +++ b/src/mess/machine/dmv_keyb.c @@ -0,0 +1,313 @@ +// license:BSD-3-Clause +// copyright-holders:Sandro Ronco +/********************************************************************** + + Decision Mate V keyboard emulation + +*********************************************************************/ + +#include "dmv_keyb.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type DMV_KEYBOARD = &device_creator; + + +//*************************************************************************** +// IMPLEMENTATION +//*************************************************************************** + +ROM_START( dmv_keyboard ) + ROM_REGION( 0x400, "mcu", 0 ) + ROM_LOAD( "dmv_kbmcu.bin", 0x0000, 0x0400, CRC(14e376de) SHA1 (ed09048ef03c602dba17ad6fcfe125c082c9bb17)) +ROM_END + + +static ADDRESS_MAP_START( dmv_keyboard_io, AS_IO, 8, dmv_keyboard_device ) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(port1_r) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(port2_r, port2_w) +ADDRESS_MAP_END + + +static MACHINE_CONFIG_FRAGMENT( dmv_keyboard ) + MCFG_CPU_ADD("mcu", I8741, XTAL_6MHz) + MCFG_CPU_IO_MAP(dmv_keyboard_io) +MACHINE_CONFIG_END + + +INPUT_PORTS_START( dmv_keyboard ) + PORT_START("COL.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + + PORT_START("COL.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(UCHAR_MAMEKEY(BACKSLASH)) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("00") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + + PORT_START("COL.2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_NAME("CLR") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + + PORT_START("COL.3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + + PORT_START("COL.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + + PORT_START("COL.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + + PORT_START("COL.6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(BACKSPACE)) PORT_NAME("Backspace") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + + PORT_START("COL.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F14") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(UCHAR_MAMEKEY(ENTER)) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F13") + + PORT_START("COL.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + + PORT_START("COL.9") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F16") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F18") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) + + PORT_START("COL.10") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F19") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + + PORT_START("COL.11") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F15") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT)) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F17") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) + + PORT_START("COL.12") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F20") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + + PORT_START("COL.13") + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("COL.14") + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("COL.15") + PORT_DIPNAME( 0x07, 0x00, "Lanuguage Code" ) + PORT_DIPSETTING( 0x00, "US English" ) + PORT_DIPSETTING( 0x01, "UK/Int. English" ) + PORT_DIPSETTING( 0x02, "Danish" ) + PORT_DIPSETTING( 0x03, "German" ) + PORT_DIPSETTING( 0x04, "Swedish/Finnish" ) + PORT_DIPSETTING( 0x05, "Norwegian" ) + PORT_DIPSETTING( 0x06, "Spanish" ) + PORT_DIPSETTING( 0x07, "Italian" ) + PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor dmv_keyboard_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( dmv_keyboard ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// dmv_keyboard_device - constructor +//------------------------------------------------- + +dmv_keyboard_device::dmv_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, DMV_KEYBOARD, "Decision Mate V Keyboard", tag, owner, clock, "dmv_keyboard", __FILE__), + m_maincpu(*this, "mcu"), + m_keyboard(*this, "COL") +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void dmv_keyboard_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void dmv_keyboard_device::device_reset() +{ + m_col = 0; + m_sd_data_state = 1; + m_sd_poll_state = 1; +} + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor dmv_keyboard_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( dmv_keyboard ); +} + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const rom_entry *dmv_keyboard_device::device_rom_region() const +{ + return ROM_NAME( dmv_keyboard ); +} + + +//------------------------------------------------- +// port1_r - +//------------------------------------------------- + +READ8_MEMBER( dmv_keyboard_device::port1_r ) +{ + return m_keyboard[m_col]->read(); +} + +//------------------------------------------------- +// port2_r +//------------------------------------------------- + +READ8_MEMBER( dmv_keyboard_device::port2_r ) +{ + return ((m_sd_data_state | m_sd_poll_state) << 7) | m_col; +} + +//------------------------------------------------- +// port2_w +//------------------------------------------------- + +WRITE8_MEMBER( dmv_keyboard_device::port2_w ) +{ + /* + P2.0 col 0 + P2.1 col 1 + P2.2 col 2 + P2.3 col 3 + P2.7 SDATA + */ + + m_col = data & 0x0f; + m_sd_data_state = BIT(data, 7); +} + +//------------------------------------------------- +// sd_poll_w +//------------------------------------------------- + +DECLARE_WRITE_LINE_MEMBER(dmv_keyboard_device::sd_poll_w) +{ + if (m_sd_poll_state && !state) + m_maincpu->upi41_master_w(m_maincpu->space(), 0, 0); + + m_sd_poll_state = state; +} + +//------------------------------------------------- +// sd_poll_r +//------------------------------------------------- + +DECLARE_READ_LINE_MEMBER(dmv_keyboard_device::sd_poll_r) +{ + return m_sd_data_state; +} diff --git a/src/mess/machine/dmv_keyb.h b/src/mess/machine/dmv_keyb.h new file mode 100644 index 00000000000..a20f59a27d4 --- /dev/null +++ b/src/mess/machine/dmv_keyb.h @@ -0,0 +1,71 @@ +// license:BSD-3-Clause +// copyright-holders:Sandro Ronco +/********************************************************************** + + Decision Mate V keyboard emulation + +*********************************************************************/ + +#pragma once + +#ifndef __DMV_KEYBOARD__ +#define __DMV_KEYBOARD__ + + +#include "emu.h" +#include "cpu/mcs48/mcs48.h" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_DMV_KEYBOARD_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, DMV_KEYBOARD, 0) + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> dmv_keyboard_device + +class dmv_keyboard_device : public device_t +{ +public: + // construction/destruction + dmv_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + + DECLARE_WRITE_LINE_MEMBER(sd_poll_w); + DECLARE_READ_LINE_MEMBER(sd_poll_r); + + DECLARE_READ8_MEMBER( port1_r ); + DECLARE_READ8_MEMBER( port2_r ); + DECLARE_WRITE8_MEMBER( port2_w ); + +protected: + // device-level overrides + virtual void device_config_complete() { m_shortname = "dmv_keyb"; } + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_maincpu; + required_ioport_array<16> m_keyboard; + + UINT8 m_col; + int m_sd_data_state; + int m_sd_poll_state; +}; + + +// device type definition +extern const device_type DMV_KEYBOARD; + + +#endif diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 9bbe3c0b2dd..e4273a0fc3c 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -2090,6 +2090,7 @@ $(MESSOBJ)/skeleton.a: \ $(MESS_DRIVERS)/dim68k.o \ $(MESS_DRIVERS)/dm7000.o \ $(MESS_DRIVERS)/dmv.o \ + $(MESS_MACHINE)/dmv_keyb.o \ $(MESS_DRIVERS)/dps1.o \ $(MESS_DRIVERS)/dsb46.o \ $(MESS_DRIVERS)/dual68.o \