summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit9a3885ad4e113354c87fc063908d8bd7e7a4699d (patch)
tree9678f78213f5c23eb97dc46acabb29e9a09f2434
parentffc6b6de22f7745dbfe83eebd32fe5439263b0f9 (diff)
(MESS) Some more cleanups for 990_x. (nw)
-rw-r--r--src/mess/drivers/ti990_10.c53
-rw-r--r--src/mess/drivers/ti990_4.c133
-rw-r--r--src/mess/video/733_asr.c110
-rw-r--r--src/mess/video/733_asr.h91
-rw-r--r--src/mess/video/911_vdt.c194
-rw-r--r--src/mess/video/911_vdt.h136
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 );