From 3ddb9e992921b5051a75504f4f0c98e286b19b97 Mon Sep 17 00:00:00 2001 From: Leo Broukhis Date: Wed, 31 Dec 2014 17:26:34 -0800 Subject: [PATCH] BESM6: Reverted IO scheduling to model time; the time unit is 100 ns. --- BESM6/besm6_cpu.c | 6 +++++- BESM6/besm6_defs.h | 2 +- BESM6/besm6_disk.c | 4 ++-- BESM6/besm6_drum.c | 4 ++-- BESM6/besm6_printer.c | 6 +++--- BESM6/besm6_punch.c | 2 +- BESM6/besm6_tty.c | 6 ++++-- 7 files changed, 18 insertions(+), 12 deletions(-) diff --git a/BESM6/besm6_cpu.c b/BESM6/besm6_cpu.c index 3e52ecbf..0b0aad80 100644 --- a/BESM6/besm6_cpu.c +++ b/BESM6/besm6_cpu.c @@ -1434,7 +1434,11 @@ void cpu_one_inst () /* Если периферия простаивает, освобождаем процессор * до следующего тика таймера. */ - sim_idle (0, TRUE); + if (vt_is_idle() && + printer_is_idle() && fs_is_idle()) { + check_initial_setup (); + sim_idle (0, TRUE); + } } } diff --git a/BESM6/besm6_defs.h b/BESM6/besm6_defs.h index c1110a87..96fb27cb 100644 --- a/BESM6/besm6_defs.h +++ b/BESM6/besm6_defs.h @@ -121,7 +121,7 @@ enum { /* * Считаем, что моделируеммая машина имеет опорную частоту 10 МГц. */ -#define USEC 1 /* одна микросекунда - десять тактов */ +#define USEC 10 /* одна микросекунда - десять тактов */ #define MSEC (1000*USEC) /* одна миллисекунда */ #define CLK_TPS 250 /* Fast Clock Ticks Per Second (every 4ms) */ #define CLK_DELAY 4000 /* Uncalibrated instructions per clock tick */ diff --git a/BESM6/besm6_disk.c b/BESM6/besm6_disk.c index 22a870c1..40e5065c 100644 --- a/BESM6/besm6_disk.c +++ b/BESM6/besm6_disk.c @@ -519,7 +519,7 @@ void disk_ctl (int ctlr, uint32 cmd) } /* Ждём события от устройства. */ - sim_activate_after (u, 20*USEC); /* Ускорим для отладки. */ + sim_activate (u, 20*USEC); /* Ускорим для отладки. */ } else if (cmd & BBIT(11)) { /* Выбора номера устройства и занесение в регистр маски КМД. @@ -614,7 +614,7 @@ void disk_ctl (int ctlr, uint32 cmd) disk_read_header (u); /* Ждём события от устройства. */ - sim_activate_after (u, 20*USEC); /* Ускорим для отладки. */ + sim_activate (u, 20*USEC); /* Ускорим для отладки. */ break; case 010: /* гашение PC */ #if 0 diff --git a/BESM6/besm6_drum.c b/BESM6/besm6_drum.c index 6bbb02ed..e29df468 100644 --- a/BESM6/besm6_drum.c +++ b/BESM6/besm6_drum.c @@ -346,8 +346,8 @@ void drum (int ctlr, uint32 cmd) /* Ждём события от устройства. * Согласно данным из книжки Мазного Г.Л., * даём 20 мсек на обмен, или 200 тыс.тактов. */ - /*sim_activate_after (u, 20*MSEC);*/ - sim_activate_after (u, 20*USEC); /* Ускорим для отладки. */ + /*sim_activate (u, 20*MSEC);*/ + sim_activate (u, 20*USEC); /* Ускорим для отладки. */ } /* diff --git a/BESM6/besm6_printer.c b/BESM6/besm6_printer.c index 6270e486..79cf647e 100644 --- a/BESM6/besm6_printer.c +++ b/BESM6/besm6_printer.c @@ -159,7 +159,7 @@ void printer_control (int num, uint32 cmd) dev->feed = LINEFEED_SYNC; READY &= ~(PRN1_LINEFEED >> num); if (dev->rampup) - sim_activate_after (u, dev->rampup); + sim_activate (u, dev->rampup); dev->rampup = 0; break; case 10: /* motor and ribbon off */ @@ -208,7 +208,7 @@ t_stat printer_event (UNIT *u) GRP |= GRP_PRN1_SYNC >> num; ++dev->curchar; /* For next char */ - sim_activate_after (u, 1400*USEC); + sim_activate (u, 1400*USEC); if (dev->feed && --dev->feed == 0) { READY |= PRN1_LINEFEED >> num; } @@ -219,7 +219,7 @@ t_stat printer_event (UNIT *u) if (printer_dev.dctrl) besm6_debug(">>> АЦПУ%d 'ноль'", num); /* For first sync after "zero" */ - sim_activate_after (u, 1000*USEC); + sim_activate (u, 1000*USEC); } return SCPE_OK; } diff --git a/BESM6/besm6_punch.c b/BESM6/besm6_punch.c index e1b65705..1051430f 100644 --- a/BESM6/besm6_punch.c +++ b/BESM6/besm6_punch.c @@ -168,7 +168,7 @@ void fs_control (int num, uint32 cmd) if (fs_state[num] == FS_IDLE) besm6_debug("<<< ФС1500-%d протяжка без мотора", num); else if (fs_state[num] != FS_TAIL) { - sim_activate_after (u, FS_RATE); + sim_activate (u, FS_RATE); bytecnt++; } else { if (! isfifo[num]) { diff --git a/BESM6/besm6_tty.c b/BESM6/besm6_tty.c index d2d77f5c..c59d2f5a 100644 --- a/BESM6/besm6_tty.c +++ b/BESM6/besm6_tty.c @@ -161,7 +161,8 @@ t_stat tty_reset (DEVICE *dptr) /* Готовность устройства в READY2 инверсная, а устройство всегда готово */ /* Провоцируем передачу */ PRP |= CONS_CAN_PRINT[0] | CONS_CAN_PRINT[1]; - return sim_clock_coschedule (tty_unit, 5*tmr_poll); + return sim_activate (tty_unit, 1000*MSEC/300); + // return sim_clock_coschedule (tty_unit, 5*tmr_poll); } /* 19 р ГРП, 300 Гц */ @@ -224,7 +225,8 @@ t_stat vt_clk (UNIT * this) /* Опрашиваем сокеты на передачу. */ tmxr_poll_tx (&tty_desc); - return sim_clock_coschedule (this, 5*tmr_poll); + return sim_activate (tty_unit, 1000*MSEC/300); + // return sim_clock_coschedule (this, 5*tmr_poll); } t_stat tty_setmode (UNIT *u, int32 val, char *cptr, void *desc)