diff --git a/VAX/vax610_stddev.c b/VAX/vax610_stddev.c index 153da770..698d80b9 100644 --- a/VAX/vax610_stddev.c +++ b/VAX/vax610_stddev.c @@ -74,6 +74,7 @@ extern jmp_buf save_env; extern int32 p1; int32 tti_csr = 0; /* control/status */ +uint32 tti_buftime; /* time input character arrived */ int32 tto_csr = 0; /* control/status */ int32 tto_leds = 0; /* processor board LEDs */ int32 clk_csr = 0; /* control/status */ @@ -332,7 +333,11 @@ t_stat tti_svc (UNIT *uptr) { int32 c; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmr_poll)); /* continue poll */ +sim_clock_coschedule (uptr, KBD_WAIT (uptr->wait, tmr_poll)); + /* continue poll */ +if ((tti_csr & CSR_DONE) && /* input still pending and < 500ms? */ + ((sim_os_msec () - tti_buftime) < 500)) + return SCPE_OK; if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) { /* break? */ @@ -341,6 +346,7 @@ if (c & SCPE_BREAK) { /* break? */ tti_unit.buf = TTIBUF_ERR | TTIBUF_FRM | TTIBUF_RBR; } else tti_unit.buf = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags)); +tti_buftime = sim_os_msec (); uptr->pos = uptr->pos + 1; tti_csr = tti_csr | CSR_DONE; if (tti_csr & CSR_IE) diff --git a/VAX/vax630_stddev.c b/VAX/vax630_stddev.c index 95751080..6db71b1f 100644 --- a/VAX/vax630_stddev.c +++ b/VAX/vax630_stddev.c @@ -52,6 +52,7 @@ extern int32 int_req[IPL_HLVL]; extern int32 hlt_pin; int32 tti_csr = 0; /* control/status */ +uint32 tti_buftime; /* time input character arrived */ int32 tto_csr = 0; /* control/status */ int32 clk_csr = 0; /* control/status */ int32 clk_tps = 100; /* ticks/second */ @@ -267,7 +268,11 @@ t_stat tti_svc (UNIT *uptr) { int32 c; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmr_poll)); /* continue poll */ +sim_clock_coschedule (uptr, KBD_WAIT (uptr->wait, tmr_poll)); + /* continue poll */ +if ((tti_csr & CSR_DONE) && /* input still pending and < 500ms? */ + ((sim_os_msec () - tti_buftime) < 500)) + return SCPE_OK; if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) { /* break? */ @@ -276,6 +281,7 @@ if (c & SCPE_BREAK) { /* break? */ tti_unit.buf = TTIBUF_ERR | TTIBUF_FRM | TTIBUF_RBR; } else tti_unit.buf = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags)); +tti_buftime = sim_os_msec (); uptr->pos = uptr->pos + 1; tti_csr = tti_csr | CSR_DONE; if (tti_csr & CSR_IE) diff --git a/VAX/vax730_stddev.c b/VAX/vax730_stddev.c index 72287b94..0e060a70 100644 --- a/VAX/vax730_stddev.c +++ b/VAX/vax730_stddev.c @@ -158,6 +158,7 @@ #define TD_INIT 9 /* empty buffer */ int32 tti_csr = 0; /* control/status */ +uint32 tti_buftime; /* time input character arrived */ int32 tti_buf = 0; /* buffer */ int32 tti_int = 0; /* interrupt */ int32 tto_csr = 0; /* control/status */ @@ -660,12 +661,17 @@ t_stat tti_svc (UNIT *uptr) { int32 c; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmr_poll)); /* continue poll */ +sim_clock_coschedule (uptr, KBD_WAIT (uptr->wait, tmr_poll)); + /* continue poll */ +if ((tti_csr & CSR_DONE) && /* input still pending and < 500ms? */ + ((sim_os_msec () - tti_buftime) < 500)) + return SCPE_OK; if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) /* break? */ tti_buf = RXDB_ERR; else tti_buf = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags)); +tti_buftime = sim_os_msec (); uptr->pos = uptr->pos + 1; tti_csr = tti_csr | CSR_DONE; if (tti_csr & CSR_IE) diff --git a/VAX/vax750_stddev.c b/VAX/vax750_stddev.c index 8f3f5abf..b818681d 100644 --- a/VAX/vax750_stddev.c +++ b/VAX/vax750_stddev.c @@ -157,6 +157,7 @@ #define TD_INIT 9 /* empty buffer */ int32 tti_csr = 0; /* control/status */ +uint32 tti_buftime; /* time input character arrived */ int32 tti_buf = 0; /* buffer */ int32 tti_int = 0; /* interrupt */ int32 tto_csr = 0; /* control/status */ @@ -653,12 +654,17 @@ t_stat tti_svc (UNIT *uptr) { int32 c; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmr_poll)); /* continue poll */ +sim_clock_coschedule (uptr, KBD_WAIT (uptr->wait, tmr_poll)); + /* continue poll */ +if ((tti_csr & CSR_DONE) && /* input still pending and < 500ms? */ + ((sim_os_msec () - tti_buftime) < 500)) + return SCPE_OK; if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) /* break? */ tti_buf = RXDB_ERR | RXDB_FRM; else tti_buf = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags)); +tti_buftime = sim_os_msec (); uptr->pos = uptr->pos + 1; tti_csr = tti_csr | CSR_DONE; if (tti_csr & CSR_IE) diff --git a/VAX/vax780_stddev.c b/VAX/vax780_stddev.c index 415f1b5d..f2d07da5 100644 --- a/VAX/vax780_stddev.c +++ b/VAX/vax780_stddev.c @@ -182,6 +182,7 @@ #define CALC_DA(t,s) (((t) * FL_NUMSC) + ((s) - 1)) * FL_NUMBY int32 tti_csr = 0; /* control/status */ +uint32 tti_buftime; /* time input character arrived */ int32 tti_buf = 0; /* buffer */ int32 tti_int = 0; /* interrupt */ int32 tto_csr = 0; /* control/status */ @@ -475,13 +476,15 @@ t_stat tti_svc (UNIT *uptr) int32 c; sim_clock_coschedule (uptr, tmxr_poll); /* continue poll */ -if (tti_csr & CSR_DONE) /* is last input processed yet? */ - return SCPE_OK; /* wait */ +if ((tti_csr & CSR_DONE) && /* input still pending and < 500ms? */ + ((sim_os_msec () - tti_buftime) < 500)) + return SCPE_OK; if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) /* break? */ tti_buf = RXDB_ERR | RXDB_FRM; else tti_buf = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags)); +tti_buftime = sim_os_msec (); uptr->pos = uptr->pos + 1; tti_csr = tti_csr | CSR_DONE; if (tti_csr & CSR_IE) diff --git a/VAX/vax_stddev.c b/VAX/vax_stddev.c index fd2a3368..a116f149 100644 --- a/VAX/vax_stddev.c +++ b/VAX/vax_stddev.c @@ -97,6 +97,7 @@ extern int32 int_req[IPL_HLVL]; extern int32 hlt_pin; int32 tti_csr = 0; /* control/status */ +uint32 tti_buftime; /* time input character arrived */ int32 tto_csr = 0; /* control/status */ int32 clk_csr = 0; /* control/status */ int32 clk_tps = 100; /* ticks/second */ @@ -331,6 +332,9 @@ int32 c; sim_clock_coschedule (uptr, KBD_WAIT (uptr->wait, tmr_poll)); /* continue poll */ +if ((tti_csr & CSR_DONE) && /* input still pending and < 500ms? */ + ((sim_os_msec () - tti_buftime) < 500)) + return SCPE_OK; if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) { /* break? */ @@ -339,6 +343,7 @@ if (c & SCPE_BREAK) { /* break? */ tti_unit.buf = TTIBUF_ERR | TTIBUF_FRM | TTIBUF_RBR; } else tti_unit.buf = sim_tt_inpcvt (c, TT_GET_MODE (uptr->flags)); +tti_buftime = sim_os_msec (); uptr->pos = uptr->pos + 1; tti_csr = tti_csr | CSR_DONE; if (tti_csr & CSR_IE)