diff options
author | Michael Zapf <michael.zapf@mizapf.de> | 2014-03-14 20:42:53 +0000 |
---|---|---|
committer | Michael Zapf <michael.zapf@mizapf.de> | 2014-03-14 20:42:53 +0000 |
commit | 9a3885ad4e113354c87fc063908d8bd7e7a4699d (patch) | |
tree | 9678f78213f5c23eb97dc46acabb29e9a09f2434 | |
parent | ffc6b6de22f7745dbfe83eebd32fe5439263b0f9 (diff) |
(MESS) Some more cleanups for 990_x. (nw)
-rw-r--r-- | src/mess/drivers/ti990_10.c | 53 | ||||
-rw-r--r-- | src/mess/drivers/ti990_4.c | 133 | ||||
-rw-r--r-- | src/mess/video/733_asr.c | 110 | ||||
-rw-r--r-- | src/mess/video/733_asr.h | 91 | ||||
-rw-r--r-- | src/mess/video/911_vdt.c | 194 | ||||
-rw-r--r-- | src/mess/video/911_vdt.h | 136 |
6 files changed, 348 insertions, 369 deletions
diff --git a/src/mess/drivers/ti990_10.c b/src/mess/drivers/ti990_10.c index 6a2f2e42acd..c00467a30c3 100644 --- a/src/mess/drivers/ti990_10.c +++ b/src/mess/drivers/ti990_10.c @@ -89,13 +89,11 @@ public: virtual void machine_start(); virtual void machine_reset(); virtual void video_start(); - UINT32 screen_update_ti990_10(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - DECLARE_WRITE_LINE_MEMBER( vdt_interrupt ); + DECLARE_WRITE_LINE_MEMBER( key_interrupt ); + DECLARE_WRITE_LINE_MEMBER( line_interrupt ); DECLARE_WRITE_LINE_MEMBER( tape_interrupt ); - INTERRUPT_GEN_MEMBER(ti990_10_line_interrupt); - void idle_callback(int state); required_device<cpu_device> m_maincpu; }; @@ -112,18 +110,6 @@ void ti990_10_state::machine_reset() ti990_hdc_init(machine(), ti990_set_int13); } -INTERRUPT_GEN_MEMBER(ti990_10_state::ti990_10_line_interrupt) -{ - downcast<vdt911_device*>(m_terminal)->keyboard(); - ti990_line_interrupt(machine()); -} - -#ifdef UNUSED_FUNCTION -void ti990_10_state::idle_callback(int state) -{ -} -#endif - /* static void rset_callback(device_t *device) { @@ -150,15 +136,15 @@ void ti990_10_state::video_start() m_terminal = machine().device("vdt911"); } -UINT32 ti990_10_state::screen_update_ti990_10(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +WRITE_LINE_MEMBER(ti990_10_state::key_interrupt) { - downcast<vdt911_device*>(m_terminal)->refresh(bitmap, cliprect, 0, 0); - return 0; + // set_int10(state); } -WRITE_LINE_MEMBER(ti990_10_state::vdt_interrupt) +WRITE_LINE_MEMBER(ti990_10_state::line_interrupt) { // set_int10(state); + ti990_line_interrupt(machine()); } /* @@ -217,26 +203,13 @@ static MACHINE_CONFIG_START( ti990_10, ti990_10_state ) /* basic machine hardware */ /* TI990/10 CPU @ 4.0(???) MHz */ MCFG_TMS99xx_ADD("maincpu", TI990_10, 4000000, ti990_10_memmap, ti990_10_io, cpuconf) - MCFG_CPU_PERIODIC_INT_DRIVER(ti990_10_state, ti990_10_line_interrupt, 120/*or 100 in Europe*/) - - - /* video hardware - we emulate a single 911 vdt display */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(560, 280) - MCFG_SCREEN_VISIBLE_AREA(0, 560-1, 0, /*250*/280-1) - MCFG_SCREEN_UPDATE_DRIVER(ti990_10_state, screen_update_ti990_10) - MCFG_SCREEN_PALETTE("vdt911:palette") + // VDT 911 terminal MCFG_DEVICE_ADD("vdt911", VDT911, 0) - MCFG_VDT911_INT_HANDLER(WRITELINE(ti990_10_state, vdt_interrupt)) - - /* 911 VDT has a beep tone generator */ - MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("beeper", BEEP, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + MCFG_VDT911_KEYINT_HANDLER(WRITELINE(ti990_10_state, key_interrupt)) + MCFG_VDT911_LINEINT_HANDLER(WRITELINE(ti990_10_state, line_interrupt)) + // Hard disk MCFG_FRAGMENT_ADD( ti990_hdc ) // Tape controller @@ -299,9 +272,5 @@ DRIVER_INIT_MEMBER(ti990_10_state,ti990_10) #endif } -static INPUT_PORTS_START(ti990_10) - VDT911_KEY_PORTS -INPUT_PORTS_END - /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ -COMP( 1975, ti990_10, 0, 0, ti990_10, ti990_10, ti990_10_state, ti990_10, "Texas Instruments", "TI Model 990/10 Minicomputer System" , GAME_NOT_WORKING ) +COMP( 1975, ti990_10, 0, 0, ti990_10, 0, ti990_10_state, ti990_10, "Texas Instruments", "TI Model 990/10 Minicomputer System" , GAME_NOT_WORKING ) diff --git a/src/mess/drivers/ti990_4.c b/src/mess/drivers/ti990_4.c index f0e8fd17667..cc1497cc8be 100644 --- a/src/mess/drivers/ti990_4.c +++ b/src/mess/drivers/ti990_4.c @@ -28,13 +28,13 @@ Note that only interrupt levels 3-7 are supported by the board (8-15 are not wired). TODO: -* Split into two machines for either ASR or VDT * finish ASR emulation * programmer panel * emulate other devices: card reader, printer Original implementation: Raphael Nabet - Rewritten by Michael Zapf 2013 + + Rewritten by Michael Zapf 2014 */ #include "emu.h" @@ -56,25 +56,20 @@ public: m_maincpu(*this, "maincpu"), m_fd800(*this, "fd800") { } - device_t *m_terminal; DECLARE_READ8_MEMBER( panel_read ); DECLARE_WRITE8_MEMBER( panel_write ); DECLARE_WRITE8_MEMBER( external_operation ); DECLARE_READ8_MEMBER( interrupt_level ); DECLARE_WRITE_LINE_MEMBER( fd_interrupt ); - DECLARE_WRITE_LINE_MEMBER( asr_interrupt ); - DECLARE_WRITE_LINE_MEMBER( vdt_interrupt ); + DECLARE_WRITE_LINE_MEMBER( asrkey_interrupt ); + DECLARE_WRITE_LINE_MEMBER( vdtkey_interrupt ); + DECLARE_WRITE_LINE_MEMBER( line_interrupt ); DECLARE_DRIVER_INIT(ti990_4); DECLARE_DRIVER_INIT(ti990_4v); DECLARE_MACHINE_RESET(ti990_4); - virtual void video_start(); - UINT32 screen_update_ti990_4(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(ti990_4_line_interrupt); - void idle_callback(int state); - private: void hold_load(); void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -83,15 +78,9 @@ private: emu_timer* m_nmi_timer; void reset_int_lines(); void set_int_line(int line, int state); - void line_interrupt(); - void set_int3(int state); - void set_int6(int state); - void set_int7(int state); bool m_ckon_state; - bool m_video; - // Connected devices required_device<tms9900_device> m_maincpu; required_device<fd800_legacy_device> m_fd800; @@ -128,6 +117,7 @@ READ8_MEMBER( ti990_4_state::panel_read ) WRITE8_MEMBER( ti990_4_state::panel_write ) { + logerror("ti990_4: writing to panel @CRU %04x: %02x\n", offset<<1, data); } void ti990_4_state::set_int_line(int line, int state) @@ -148,82 +138,38 @@ void ti990_4_state::set_int_line(int line, int state) m_maincpu->set_input_line(INT_9900_INTREQ, CLEAR_LINE); } -void ti990_4_state::set_int3(int state) -{ - set_int_line(3, state); -} - -void ti990_4_state::set_int6(int state) -{ - set_int_line(6, state); -} - -void ti990_4_state::set_int7(int state) -{ - set_int_line(7, state); -} - void ti990_4_state::reset_int_lines() { m_intlines = 0; } -void ti990_4_state::line_interrupt() -{ - if (m_ckon_state) set_int_line(5, ASSERT_LINE); -} - /* Callback from the floppy controller. */ WRITE_LINE_MEMBER(ti990_4_state::fd_interrupt) { - set_int7(state); -} - -INTERRUPT_GEN_MEMBER(ti990_4_state::ti990_4_line_interrupt) -{ - if (m_video) - downcast<vdt911_device*>(m_terminal)->keyboard(); - else - downcast<asr733_device*>(m_terminal)->keyboard(); - - line_interrupt(); + set_int_line(7, state); } /* - TI990/4 video emulation. - We emulate a single VDT911 CRT terminal. + Connection to VDT */ -WRITE_LINE_MEMBER(ti990_4_state::vdt_interrupt) -{ - set_int3(state); -} - -void ti990_4_state::video_start() +WRITE_LINE_MEMBER(ti990_4_state::vdtkey_interrupt) { - if (m_video) - m_terminal = machine().device("vdt911"); - else - m_terminal = machine().device("asr733"); + set_int_line(3, state); } -UINT32 ti990_4_state::screen_update_ti990_4(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +WRITE_LINE_MEMBER(ti990_4_state::line_interrupt) { - if (m_video) - downcast<vdt911_device*>(m_terminal)->refresh(bitmap, cliprect, 0, 0); - else - downcast<asr733_device*>(m_terminal)->refresh(bitmap, 0, 0); - - return 0; + if (m_ckon_state) set_int_line(5, state); } /* Callback from the terminal. */ -WRITE_LINE_MEMBER(ti990_4_state::asr_interrupt) +WRITE_LINE_MEMBER(ti990_4_state::asrkey_interrupt) { - set_int6(state); + set_int_line(6, state); } WRITE8_MEMBER( ti990_4_state::external_operation ) @@ -350,44 +296,19 @@ MACHINE_RESET_MEMBER(ti990_4_state,ti990_4) DRIVER_INIT_MEMBER(ti990_4_state, ti990_4) { - m_video = false; m_nmi_timer = timer_alloc(NMI_TIMER_ID); } -DRIVER_INIT_MEMBER(ti990_4_state, ti990_4v) -{ - m_video = true; - m_nmi_timer = timer_alloc(NMI_TIMER_ID); -} - -static INPUT_PORTS_START(ti990_4) - ASR733_KEY_PORTS -INPUT_PORTS_END - -static INPUT_PORTS_START(ti990_4v) - VDT911_KEY_PORTS -INPUT_PORTS_END - static MACHINE_CONFIG_START( ti990_4, ti990_4_state ) /* basic machine hardware */ /* TMS9900 CPU @ 3.0(???) MHz */ MCFG_TMS99xx_ADD("maincpu", TMS9900, 3000000, memmap, cru_map, cpuconf) - - MCFG_CPU_PERIODIC_INT_DRIVER(ti990_4_state, ti990_4_line_interrupt, 120/*or TIME_IN_HZ(100) in Europe*/) MCFG_MACHINE_RESET_OVERRIDE(ti990_4_state, ti990_4 ) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_UPDATE_DRIVER(ti990_4_state, screen_update_ti990_4) - - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_PALETTE("asr733:palette") - // Terminal MCFG_DEVICE_ADD("asr733", ASR733, 0) - MCFG_ASR733_INT_HANDLER(WRITELINE(ti990_4_state, asr_interrupt)) + MCFG_ASR733_KEYINT_HANDLER(WRITELINE(ti990_4_state, asrkey_interrupt)) + MCFG_ASR733_LINEINT_HANDLER(WRITELINE(ti990_4_state, line_interrupt)) // Floppy controller MCFG_DEVICE_ADD("fd800", FD800, 0) @@ -400,26 +321,12 @@ static MACHINE_CONFIG_START( ti990_4v, ti990_4_state ) /* basic machine hardware */ /* TMS9900 CPU @ 3.0(???) MHz */ MCFG_TMS99xx_ADD("maincpu", TMS9900, 3000000, memmap, cru_map_v, cpuconf) - - MCFG_CPU_PERIODIC_INT_DRIVER(ti990_4_state, ti990_4_line_interrupt, 120/*or TIME_IN_HZ(100) in Europe*/) MCFG_MACHINE_RESET_OVERRIDE(ti990_4_state, ti990_4 ) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_UPDATE_DRIVER(ti990_4_state, screen_update_ti990_4) - - MCFG_SCREEN_SIZE(560, 280) - MCFG_SCREEN_VISIBLE_AREA(0, 560-1, 0, /*250*/280-1) - MCFG_SCREEN_PALETTE("vdt911:palette") - // Terminal MCFG_DEVICE_ADD("vdt911", VDT911, 0) - MCFG_VDT911_INT_HANDLER(WRITELINE(ti990_4_state, vdt_interrupt)) - - MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("beeper", BEEP, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + MCFG_VDT911_KEYINT_HANDLER(WRITELINE(ti990_4_state, vdtkey_interrupt)) + MCFG_VDT911_LINEINT_HANDLER(WRITELINE(ti990_4_state, line_interrupt)) // Floppy controller MCFG_DEVICE_ADD("fd800", FD800, 0) @@ -469,5 +376,5 @@ ROM_START(ti990_4v) ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ -COMP( 1976, ti990_4, 0, 0, ti990_4, ti990_4, ti990_4_state, ti990_4, "Texas Instruments", "TI 990/4 Minicomputer System" , GAME_NOT_WORKING | GAME_NO_SOUND ) -COMP( 1976, ti990_4v, ti990_4, 0, ti990_4v, ti990_4v, ti990_4_state, ti990_4v, "Texas Instruments", "TI 990/4 Minicomputer System with Video Display Terminal" , GAME_NOT_WORKING | GAME_NO_SOUND ) +COMP( 1976, ti990_4, 0, 0, ti990_4, 0, ti990_4_state, ti990_4, "Texas Instruments", "TI 990/4 Minicomputer System" , GAME_NOT_WORKING | GAME_NO_SOUND ) +COMP( 1976, ti990_4v, ti990_4, 0, ti990_4v, 0, ti990_4_state, ti990_4, "Texas Instruments", "TI 990/4 Minicomputer System with Video Display Terminal" , GAME_NOT_WORKING | GAME_NO_SOUND ) diff --git a/src/mess/video/733_asr.c b/src/mess/video/733_asr.c index 33ae264615d..94e1ee94d38 100644 --- a/src/mess/video/733_asr.c +++ b/src/mess/video/733_asr.c @@ -82,7 +82,8 @@ asr733_device::asr733_device(const machine_config &mconfig, const char *tag, dev : device_t(mconfig, ASR733, "733 ASR", tag, owner, clock, "asr733", __FILE__), m_palette(*this, "palette"), m_gfxdecode(*this, "gfxdecode"), - m_int_line(*this) + m_keyint_line(*this), + m_lineint_line(*this) { } @@ -112,7 +113,10 @@ void asr733_device::device_start() m_bitmap->fill(0, visarea); - m_int_line.resolve(); + m_keyint_line.resolve(); + m_lineint_line.resolve(); + + m_line_timer = timer_alloc(0); UINT8 *dst; @@ -183,6 +187,7 @@ void asr733_device::device_reset() m_status = AS_dsr_mask | AS_wrq_mask; m_mode = 0; + m_line_timer->adjust(attotime::from_msec(0), 0, attotime::from_hz(60)); set_interrupt_line(); } @@ -192,12 +197,12 @@ void asr733_device::set_interrupt_line() if ((m_mode & AM_enint_mask) && (m_new_status_flag)) /* right??? */ { m_status |= AS_int_mask; - m_int_line(ASSERT_LINE); + m_keyint_line(ASSERT_LINE); } else { m_status &= ~AS_int_mask; - m_int_line(CLEAR_LINE); + m_keyint_line(CLEAR_LINE); } } @@ -410,6 +415,16 @@ void asr733_device::refresh(bitmap_ind16 &bitmap, int x, int y) } +/* + Time callbacks +*/ +void asr733_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + check_keyboard(); + m_lineint_line(ASSERT_LINE); + m_lineint_line(CLEAR_LINE); +} + static const unsigned char key_translate[3][51] = { { /* unshifted */ @@ -590,7 +605,7 @@ static const unsigned char key_translate[3][51] = keyboard handler: should be called regularly by machine code, for instance every Video Blank Interrupt. */ -void asr733_device::keyboard() +void asr733_device::check_keyboard() { enum modifier_state_t { @@ -615,7 +630,7 @@ void asr733_device::keyboard() /* for (i = 0; i < 6; i++) */ for (i = 0; i < 4; i++) { - key_buf[i] = machine().root_device().ioport(keynames[i])->read(); + key_buf[i] = ioport(keynames[i])->read(); } /* process key modifiers */ @@ -697,13 +712,96 @@ void asr733_device::keyboard() } } +UINT32 asr733_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + refresh(bitmap, 0, 0); + return 0; +} + static MACHINE_CONFIG_FRAGMENT( asr733 ) MCFG_GFXDECODE_ADD("gfxdecode", asr733) MCFG_PALETTE_ADD("palette", 2) MCFG_PALETTE_INIT_OWNER(asr733_device, asr733) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, asr733_device, screen_update) + + MCFG_SCREEN_SIZE(640, 480) + MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) + MCFG_SCREEN_PALETTE("palette") MACHINE_CONFIG_END +INPUT_PORTS_START( asr733 ) + PORT_START("KEY0") /* keys 1-16 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_MINUS) \ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_EQUALS) \ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) \ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) \ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) \ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) \ + \ + PORT_START("KEY1") /* keys 17-32 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LINE FEED") PORT_CODE(KEYCODE_CLOSEBRACE) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) \ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) \ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) \ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) \ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) \ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) \ + \ + PORT_START("KEY2") /* keys 33-48 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RUB OUT") PORT_CODE(KEYCODE_BACKSPACE) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPEAT") PORT_CODE(KEYCODE_RALT) \ + /* hack for my mac that does not disciminate the right ALT key */ \ + /* PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPEAT") PORT_CODE(KEYCODE_LALT) */ \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) \ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) \ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) \ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) \ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) \ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) \ + \ + PORT_START("KEY3") /* keys 49-51 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_RSHIFT) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(SPACE)") PORT_CODE(KEYCODE_SPACE) +INPUT_PORTS_END + +ioport_constructor asr733_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( asr733 ); +} + //------------------------------------------------- // machine_config_additions - return a pointer to // the device's machine fragment diff --git a/src/mess/video/733_asr.h b/src/mess/video/733_asr.h index f526367f7bb..52b4240ed98 100644 --- a/src/mess/video/733_asr.h +++ b/src/mess/video/733_asr.h @@ -18,20 +18,25 @@ public: DECLARE_READ8_MEMBER(cru_r); DECLARE_WRITE8_MEMBER(cru_w); - void refresh(bitmap_ind16 &bitmap, int x, int y); - void keyboard(); - - template<class _Object> static devcb2_base &static_set_int_callback(device_t &device, _Object object) + template<class _Object> static devcb2_base &static_set_keyint_callback(device_t &device, _Object object) + { + return downcast<asr733_device &>(device).m_keyint_line.set_callback(object); + } + template<class _Object> static devcb2_base &static_set_lineint_callback(device_t &device, _Object object) { - return downcast<asr733_device &>(device).m_int_line.set_callback(object); + return downcast<asr733_device &>(device).m_lineint_line.set_callback(object); } + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + protected: // device-level overrides void device_config_complete(); void device_start(); void device_reset(); machine_config_constructor device_mconfig_additions() const; + void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + ioport_constructor device_input_ports() const; private: // internal state @@ -41,11 +46,15 @@ private: int m_OutQueueLen; #endif + void check_keyboard(); + void refresh(bitmap_ind16 &bitmap, int x, int y); + void set_interrupt_line(); void draw_char(int character, int x, int y, int color); void linefeed(); void transmit(UINT8 data); + emu_timer *m_line_timer; // screen line timer UINT8 m_recv_buf; UINT8 m_xmit_buf; @@ -64,72 +73,14 @@ private: required_device<palette_device> m_palette; required_device<gfxdecode_device> m_gfxdecode; - devcb2_write_line m_int_line; + devcb2_write_line m_keyint_line; + devcb2_write_line m_lineint_line; }; extern const device_type ASR733; -#define MCFG_ASR733_INT_HANDLER( _intcallb ) \ - devcb = &asr733_device::static_set_int_callback( *device, DEVCB2_##_intcallb ); - -#define ASR733_KEY_PORTS \ - PORT_START("KEY0") /* keys 1-16 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_MINUS) \ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_EQUALS) \ - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) \ - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) \ - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) \ - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) \ - \ - PORT_START("KEY1") /* keys 17-32 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LINE FEED") PORT_CODE(KEYCODE_CLOSEBRACE) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) \ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) \ - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) \ - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) \ - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) \ - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) \ - \ - PORT_START("KEY2") /* keys 33-48 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RUB OUT") PORT_CODE(KEYCODE_BACKSPACE) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPEAT") PORT_CODE(KEYCODE_RALT) \ - /* hack for my mac that does not disciminate the right ALT key */ \ - /* PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPEAT") PORT_CODE(KEYCODE_LALT) */ \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) \ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) \ - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) \ - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) \ - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) \ - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) \ - \ - PORT_START("KEY3") /* keys 49-51 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_RSHIFT) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(SPACE)") PORT_CODE(KEYCODE_SPACE) +#define MCFG_ASR733_KEYINT_HANDLER( _intcallb ) \ + devcb = &asr733_device::static_set_keyint_callback( *device, DEVCB2_##_intcallb ); + +#define MCFG_ASR733_LINEINT_HANDLER( _intcallb ) \ + devcb = &asr733_device::static_set_lineint_callback( *device, DEVCB2_##_intcallb ); diff --git a/src/mess/video/911_vdt.c b/src/mess/video/911_vdt.c index 6fde63ecd47..82d16186ce2 100644 --- a/src/mess/video/911_vdt.c +++ b/src/mess/video/911_vdt.c @@ -40,25 +40,33 @@ static const gfx_layout fontlayout_8bit = }; static GFXDECODE_START( vdt911 ) - /* array must use same order as vdt911_model_t!!! */ - /* US */ + // Caution: Array must use same order as vdt911_model_t + // US GFXDECODE_ENTRY( vdt911_chr_region, vdt911_US_chr_offset, fontlayout_7bit, 0, 4 ) - /* UK */ + + // UK GFXDECODE_ENTRY( vdt911_chr_region, vdt911_UK_chr_offset, fontlayout_7bit, 0, 4 ) - /* French */ + + // French (without accented characters) GFXDECODE_ENTRY( vdt911_chr_region, vdt911_US_chr_offset, fontlayout_7bit, 0, 4 ) - /* German */ + + // German GFXDECODE_ENTRY( vdt911_chr_region, vdt911_german_chr_offset, fontlayout_7bit, 0, 4 ) - /* Swedish */ + + // Swedish GFXDECODE_ENTRY( vdt911_chr_region, vdt911_swedish_chr_offset, fontlayout_7bit, 0, 4 ) - /* Norwegian */ + + // Norwegian GFXDECODE_ENTRY( vdt911_chr_region, vdt911_norwegian_chr_offset, fontlayout_7bit, 0, 4 ) - /* FrenchWP */ - GFXDECODE_ENTRY( vdt911_chr_region, vdt911_frenchWP_chr_offset, fontlayout_7bit, 0, 4 ) - /* Japanese */ + + // Japanese GFXDECODE_ENTRY( vdt911_chr_region, vdt911_japanese_chr_offset, fontlayout_8bit, 0, 4 ) - /* Arabic */ - /* GFXDECODE_ENTRY( vdt911_chr_region, vdt911_arabic_chr_offset, fontlayout_8bit, 0, 4 ) */ + + // Arabic + // GFXDECODE_ENTRY( vdt911_chr_region, vdt911_arabic_chr_offset, fontlayout_8bit, 0, 4 ) + + // FrenchWP (contains accented characters) + GFXDECODE_ENTRY( vdt911_chr_region, vdt911_frenchWP_chr_offset, fontlayout_7bit, 0, 4 ) GFXDECODE_END static const unsigned char vdt911_colors[] = @@ -135,10 +143,11 @@ const device_type VDT911 = &device_creator<vdt911_device>; vdt911_device::vdt911_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, VDT911, "911 VDT", tag, owner, clock, "vdt911", __FILE__), - m_beeper(*this, ":beeper"), + m_beeper(*this, "beeper"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), - m_int_line(*this) + m_keyint_line(*this), + m_lineint_line(*this) { } @@ -155,7 +164,8 @@ void vdt911_device::device_config_complete() enum { BLINK_TIMER, - BEEP_TIMER + BEEP_TIMER, + LINE_TIMER }; //------------------------------------------------- @@ -166,6 +176,9 @@ void vdt911_device::device_start() { m_last_key_pressed = 0x80; + m_keyint_line.resolve(); + m_lineint_line.resolve(); + /* set up cursor blink clock. 2Hz frequency -> .25s half-period. */ /*m_blink_clock =*/ @@ -173,6 +186,7 @@ void vdt911_device::device_start() m_blink_timer = timer_alloc(BLINK_TIMER); m_beep_timer = timer_alloc(BEEP_TIMER); + m_line_timer = timer_alloc(LINE_TIMER); m_blink_timer->adjust(attotime::from_msec(0), 0, attotime::from_msec(250)); @@ -237,10 +251,12 @@ void vdt911_device::device_reset() m_cursor_address_mask = 0x3ff; /* 1kb of RAM */ else m_cursor_address_mask = 0x7ff; /* 2 kb of RAM */ + + m_line_timer->adjust(attotime::from_msec(0), 0, attotime::from_hz(get_refresh_rate())); } /* - Time callbacks + Timer callbacks */ void vdt911_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { @@ -248,11 +264,15 @@ void vdt911_device::device_timer(emu_timer &timer, device_timer_id id, int param { case BLINK_TIMER: m_blink_state = !m_blink_state; - logerror("Blink timer\n"); break; case BEEP_TIMER: m_beeper->set_state(0); break; + case LINE_TIMER: + check_keyboard(); + m_lineint_line(ASSERT_LINE); + m_lineint_line(CLEAR_LINE); + break; } } @@ -360,7 +380,7 @@ WRITE8_MEMBER( vdt911_device::cru_w ) case 0xc: /* keyboard interrupt enable */ m_keyboard_interrupt_enable = data; - m_int_line(m_keyboard_interrupt_enable && m_keyboard_data_ready); + m_keyint_line(m_keyboard_interrupt_enable && m_keyboard_data_ready); break; case 0xd: @@ -418,7 +438,7 @@ WRITE8_MEMBER( vdt911_device::cru_w ) { m_keyboard_data_ready = 0; if (m_keyboard_interrupt_enable) - m_int_line(CLEAR_LINE); + m_keyint_line(CLEAR_LINE); } /*m_keyboard_parity_error = 0;*/ break; @@ -513,7 +533,7 @@ static const unsigned char (*const key_translate[])[91] = keyboard handler: should be called regularly by machine code, for instance every Video Blank Interrupt. */ -void vdt911_device::keyboard() +void vdt911_device::check_keyboard() { enum modifier_state_t { @@ -538,7 +558,7 @@ void vdt911_device::keyboard() /* read current key state */ for (i = 0; i < 6; i++) { - key_buf[i] = machine().root_device().ioport(keynames[i])->read(); + key_buf[i] = ioport(keynames[i])->read(); } /* parse modifier keys */ @@ -638,7 +658,7 @@ void vdt911_device::keyboard() m_keyboard_data = (int)key_translate[m_model][modifier_state][m_last_key_pressed]; m_keyboard_data_ready = 1; if (m_keyboard_interrupt_enable) - m_int_line(ASSERT_LINE); + m_keyint_line(ASSERT_LINE); return; } } @@ -647,6 +667,18 @@ void vdt911_device::keyboard() } } +int vdt911_device::get_refresh_rate() +{ + // European models have 50 Hz + return ((m_model == vdt911_model_US) || (m_model == vdt911_model_Japanese))? 60 : 50; +} + +UINT32 vdt911_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + refresh(bitmap, cliprect, 0, 0); + return 0; +} + INPUT_PORTS_START( vdt911 ) PORT_START( "LOCALE" ) PORT_CONFNAME( 0x0f, 0x00, "Terminal language" ) @@ -656,17 +688,133 @@ INPUT_PORTS_START( vdt911 ) PORT_CONFSETTING( vdt911_model_German, "German" ) PORT_CONFSETTING( vdt911_model_Swedish, "Swedish" ) PORT_CONFSETTING( vdt911_model_Norwegian, "Norwegian" ) - PORT_CONFSETTING( vdt911_model_FrenchWP, "French Word Processing" ) PORT_CONFSETTING( vdt911_model_Japanese, "Japanese" ) // PORT_CONFSETTING( vdt911_model_Arabic, "Arabic" ) + PORT_CONFSETTING( vdt911_model_FrenchWP, "French Word Processing" ) PORT_START( "SCREEN" ) PORT_CONFNAME( 0x01, char_960, "Terminal screen size" ) PORT_CONFSETTING( char_960, "960 chars (12 lines)") PORT_CONFSETTING( char_1920, "1920 chars (24 lines)") + + PORT_START("KEY0") /* keys 1-16 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CMD") PORT_CODE(KEYCODE_F9) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(red)") PORT_CODE(KEYCODE_F10) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ERASE FIELD") PORT_CODE(KEYCODE_END) \ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ERASE INPUT") PORT_CODE(KEYCODE_PGDN) \ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(grey)") PORT_CODE(KEYCODE_F11) \ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("UPPER CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE\ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) \ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2 @") PORT_CODE(KEYCODE_2) \ + \ + PORT_START("KEY1") /* keys 17-32 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 ^") PORT_CODE(KEYCODE_6) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 *") PORT_CODE(KEYCODE_8) \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9 (") PORT_CODE(KEYCODE_9) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 )") PORT_CODE(KEYCODE_0) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("+ [") PORT_CODE(KEYCODE_MINUS) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("- ]") PORT_CODE(KEYCODE_EQUALS) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("_ =") PORT_CODE(KEYCODE_BACKSPACE) \ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) \ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 (numpad)") PORT_CODE(KEYCODE_7_PAD) \ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 (numpad)") PORT_CODE(KEYCODE_8_PAD) \ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9 (numpad)") PORT_CODE(KEYCODE_9_PAD) \ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PRINT") PORT_CODE(KEYCODE_PRTSCR) \ + \ + PORT_START("KEY2") /* keys 33-48 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(up)") PORT_CODE(KEYCODE_UP) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPEAT") PORT_CODE(KEYCODE_LALT) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER_PAD) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) \ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) \ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) \ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CHAR (left/right)") PORT_CODE(KEYCODE_OPENBRACE) \ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("FIELD (left/right)") PORT_CODE(KEYCODE_CLOSEBRACE) \ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) \ + \ + PORT_START("KEY3") /* keys 49-64 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 (numpad)") PORT_CODE(KEYCODE_4_PAD) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 (numpad)") PORT_CODE(KEYCODE_5_PAD) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 (numpad)") PORT_CODE(KEYCODE_6_PAD) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(left)") PORT_CODE(KEYCODE_LEFT) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(right)") PORT_CODE(KEYCODE_RIGHT) \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CONTROL") PORT_CODE(KEYCODE_LCONTROL) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) \ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) \ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) \ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) \ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) \ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) \ + \ + PORT_START("KEY4") /* keys 65-80 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("; :") PORT_CODE(KEYCODE_COLON) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("' \"") PORT_CODE(KEYCODE_QUOTE) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(not on US keyboard)") PORT_CODE(KEYCODE_BACKSLASH) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SKIP TAB") PORT_CODE(KEYCODE_TAB) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1 (numpad)") PORT_CODE(KEYCODE_1_PAD) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2 (numpad)") PORT_CODE(KEYCODE_2_PAD) \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3 (numpad)") PORT_CODE(KEYCODE_3_PAD) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("INS CHAR") PORT_CODE(KEYCODE_INSERT) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(down)") PORT_CODE(KEYCODE_DOWN) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DEL CHAR") PORT_CODE(KEYCODE_DEL) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) \ + PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) \ + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) \ + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) \ + PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) \ + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) \ + \ + PORT_START("KEY5") /* keys 81-91 */ \ + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) \ + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) \ + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) \ + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) \ + PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) \ + PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_RSHIFT) \ + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 (numpad)") PORT_CODE(KEYCODE_0_PAD) \ + PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". (numpad)") PORT_CODE(KEYCODE_DEL_PAD) \ + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(not on US keyboard)") PORT_CODE(KEYCODE_MINUS_PAD) \ + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) \ + PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(not on US keyboard)") PORT_CODE(KEYCODE_PLUS_PAD) INPUT_PORTS_END static MACHINE_CONFIG_FRAGMENT( vdt911 ) + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, vdt911_device, screen_update) + + MCFG_SCREEN_SIZE(560, 280) + MCFG_SCREEN_VISIBLE_AREA(0, 560-1, 0, /*250*/280-1) + MCFG_SCREEN_PALETTE("palette") + + MCFG_SPEAKER_STANDARD_MONO("speaker") + MCFG_SOUND_ADD("beeper", BEEP, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.50) + MCFG_PALETTE_ADD("palette", 8) MCFG_PALETTE_INDIRECT_ENTRIES(3) MCFG_PALETTE_INIT_OWNER(vdt911_device, vdt911) diff --git a/src/mess/video/911_vdt.h b/src/mess/video/911_vdt.h index 787b92a5569..e1881a51a5e 100644 --- a/src/mess/video/911_vdt.h +++ b/src/mess/video/911_vdt.h @@ -27,9 +27,9 @@ enum vdt911_model_t vdt911_model_German, vdt911_model_Swedish, // Swedish/Finnish vdt911_model_Norwegian, // Norwegian/Danish - vdt911_model_FrenchWP, // French word processing - vdt911_model_Japanese // Katakana Japanese + vdt911_model_Japanese, // Katakana Japanese /*vdt911_model_Arabic,*/ // Arabic + vdt911_model_FrenchWP // French word processing }; class vdt911_device : public device_t @@ -42,13 +42,17 @@ public: DECLARE_PALETTE_INIT(vdt911); - template<class _Object> static devcb2_base &static_set_int_callback(device_t &device, _Object object) + template<class _Object> static devcb2_base &static_set_keyint_callback(device_t &device, _Object object) { - return downcast<vdt911_device &>(device).m_int_line.set_callback(object); + return downcast<vdt911_device &>(device).m_keyint_line.set_callback(object); } - void refresh(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y); - void keyboard(); + template<class _Object> static devcb2_base &static_set_lineint_callback(device_t &device, _Object object) + { + return downcast<vdt911_device &>(device).m_lineint_line.set_callback(object); + } + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -62,8 +66,9 @@ protected: void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); private: - - // internal state + void refresh(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y); + int get_refresh_rate(); + void check_keyboard(); vdt911_screen_size_t m_screen_size; // char_960 for 960-char, 12-line model; char_1920 for 1920-char, 24-line model vdt911_model_t m_model; // country code @@ -76,6 +81,7 @@ private: emu_timer *m_beep_timer; // beep clock (beeps ends when timer times out) emu_timer *m_blink_timer; // cursor blink clock + emu_timer *m_line_timer; // screen line timer UINT8 m_keyboard_data; // last code pressed on keyboard bool m_keyboard_data_ready; // true if there is a new code in keyboard_data @@ -97,114 +103,14 @@ private: required_device<beep_device> m_beeper; required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; - devcb2_write_line m_int_line; + devcb2_write_line m_keyint_line; + devcb2_write_line m_lineint_line; }; extern const device_type VDT911; -#define MCFG_VDT911_INT_HANDLER( _intcallb ) \ - devcb = &vdt911_device::static_set_int_callback( *device, DEVCB2_##_intcallb ); - -#define VDT911_KEY_PORTS \ - PORT_START("KEY0") /* keys 1-16 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CMD") PORT_CODE(KEYCODE_F9) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(red)") PORT_CODE(KEYCODE_F10) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ERASE FIELD") PORT_CODE(KEYCODE_END) \ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ERASE INPUT") PORT_CODE(KEYCODE_PGDN) \ - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(grey)") PORT_CODE(KEYCODE_F11) \ - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("UPPER CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE\ - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) \ - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2 @") PORT_CODE(KEYCODE_2) \ - \ - PORT_START("KEY1") /* keys 17-32 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 ^") PORT_CODE(KEYCODE_6) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 *") PORT_CODE(KEYCODE_8) \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9 (") PORT_CODE(KEYCODE_9) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 )") PORT_CODE(KEYCODE_0) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("+ [") PORT_CODE(KEYCODE_MINUS) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("- ]") PORT_CODE(KEYCODE_EQUALS) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("_ =") PORT_CODE(KEYCODE_BACKSPACE) \ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) \ - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 (numpad)") PORT_CODE(KEYCODE_7_PAD) \ - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 (numpad)") PORT_CODE(KEYCODE_8_PAD) \ - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9 (numpad)") PORT_CODE(KEYCODE_9_PAD) \ - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("PRINT") PORT_CODE(KEYCODE_PRTSCR) \ - \ - PORT_START("KEY2") /* keys 33-48 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(up)") PORT_CODE(KEYCODE_UP) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPEAT") PORT_CODE(KEYCODE_LALT) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER_PAD) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) \ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) \ - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) \ - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CHAR (left/right)") PORT_CODE(KEYCODE_OPENBRACE) \ - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("FIELD (left/right)") PORT_CODE(KEYCODE_CLOSEBRACE) \ - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) \ - \ - PORT_START("KEY3") /* keys 49-64 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 (numpad)") PORT_CODE(KEYCODE_4_PAD) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 (numpad)") PORT_CODE(KEYCODE_5_PAD) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 (numpad)") PORT_CODE(KEYCODE_6_PAD) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(left)") PORT_CODE(KEYCODE_LEFT) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(right)") PORT_CODE(KEYCODE_RIGHT) \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CONTROL") PORT_CODE(KEYCODE_LCONTROL) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) \ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) \ - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) \ - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) \ - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) \ - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) \ - \ - PORT_START("KEY4") /* keys 65-80 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("; :") PORT_CODE(KEYCODE_COLON) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("' \"") PORT_CODE(KEYCODE_QUOTE) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(not on US keyboard)") PORT_CODE(KEYCODE_BACKSLASH) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SKIP TAB") PORT_CODE(KEYCODE_TAB) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1 (numpad)") PORT_CODE(KEYCODE_1_PAD) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2 (numpad)") PORT_CODE(KEYCODE_2_PAD) \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3 (numpad)") PORT_CODE(KEYCODE_3_PAD) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("INS CHAR") PORT_CODE(KEYCODE_INSERT) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(down)") PORT_CODE(KEYCODE_DOWN) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DEL CHAR") PORT_CODE(KEYCODE_DEL) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) \ - PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) \ - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) \ - PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) \ - PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) \ - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) \ - \ - PORT_START("KEY5") /* keys 81-91 */ \ - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) \ - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) \ - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) \ - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) \ - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) \ - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_RSHIFT) \ - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 (numpad)") PORT_CODE(KEYCODE_0_PAD) \ - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". (numpad)") PORT_CODE(KEYCODE_DEL_PAD) \ - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(not on US keyboard)") PORT_CODE(KEYCODE_MINUS_PAD) \ - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) \ - PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(not on US keyboard)") PORT_CODE(KEYCODE_PLUS_PAD) +#define MCFG_VDT911_KEYINT_HANDLER( _intcallb ) \ + devcb = &vdt911_device::static_set_keyint_callback( *device, DEVCB2_##_intcallb ); + +#define MCFG_VDT911_LINEINT_HANDLER( _intcallb ) \ + devcb = &vdt911_device::static_set_lineint_callback( *device, DEVCB2_##_intcallb ); |