From 284a7586ca6e6a61c42eb5e1b0f720875e3c58b9 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Mon, 22 Jul 2019 23:05:59 -0400 Subject: [PATCH] KA10: Fixed Quantum timer to match hardware. --- PDP10/kx10_cpu.c | 25 ++++++++++++++----------- PDP10/kx10_defs.h | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/PDP10/kx10_cpu.c b/PDP10/kx10_cpu.c index 60b10fc..e9ae080 100644 --- a/PDP10/kx10_cpu.c +++ b/PDP10/kx10_cpu.c @@ -813,12 +813,12 @@ int opflags[] = { void set_quantum() { + double us; sim_cancel(&cpu_unit[1]); - if ((qua_time & RSIGN) == 0) { - double us; - us = (double)(RSIGN - qua_time); - (void)sim_activate_after_d(&cpu_unit[1], us); - } + if (qua_time & BIT17) + return; + us = (double)(BIT17 - qua_time); + (void)sim_activate_after_d(&cpu_unit[1], us); } /* @@ -830,7 +830,10 @@ load_quantum() if (sim_is_active(&cpu_unit[1])) { double us; us = sim_activate_time_usecs (&cpu_unit[1]); - qua_time = RSIGN - (uint32)us; + if ((uint32)us > BIT17) + qua_time = BIT17; + else + qua_time = (BIT17 - (uint32)us) & RMASK; sim_cancel(&cpu_unit[1]); } } @@ -841,11 +844,11 @@ load_quantum() uint32 get_quantum() { - uint32 t = 0; + uint32 t = qua_time; if (sim_is_active(&cpu_unit[1])) { double us; us = sim_activate_time_usecs (&cpu_unit[1]); - t = RSIGN - (uint32)us; + t = (BIT17 - (uint32)us) & RMASK; } return t; } @@ -3491,9 +3494,10 @@ dpnorm: AB = (AB + 1) & RMASK; MB = M[AB]; /* WD 3 */ /* Store Quantum */ - qua_time = MB & RMASK; + qua_time = MB & (RMASK|BIT17); set_quantum(); fault_data = (MB >> 18) & RMASK; + fault_data &= ~1; /* Clear high quantum bit */ mem_prot = 0; if ((fault_data & 0777772) != 0) mem_prot = 1; @@ -5997,9 +6001,8 @@ qua_srv(UNIT * uptr) { if ((fault_data & 1) == 0 && pi_enable && !pi_pending && (FLAGS & USER) != 0) { mem_prot = 1; - fault_data |= 1; } - qua_time = RSIGN; + qua_time = BIT17; return SCPE_OK; } #endif diff --git a/PDP10/kx10_defs.h b/PDP10/kx10_defs.h index 26f2b5e..d4bb9ce 100644 --- a/PDP10/kx10_defs.h +++ b/PDP10/kx10_defs.h @@ -167,6 +167,7 @@ extern DEBTAB crd_debug[]; #define BIT9 00000400000000LL #define BIT10 00000200000000LL #define BIT10_35 00000377777777LL +#define BIT17 00000001000000LL #define MANT 00000777777777LL #define EXPO 00377000000000LL #define FPHBIT 01000000000000000000000LL