mirror of
https://github.com/open-simh/simh.git
synced 2026-05-02 22:33:04 +00:00
Notes For V3.3
RESTRICTION: The HP DS disk is not debugged. DO NOT enable this feature for normal operations. WARNING: Massive changes in the PDP-11 make all previous SAVEd file obsolete. Do not attempt to use a PDP-11 SAVE file from a prior release with V3.3! 1. New Features in 3.3 1.1 SCP - Added -p (powerup) qualifier to RESET - Changed SET <unit> ONLINE/OFFLINE to SET <unit> ENABLED/DISABLED - Moved SET DEBUG under SET CONSOLE hierarchy - Added optional parameter value to SHOW command - Added output file option to SHOW command 1.2 PDP-11 - Separated RH Massbus adapter from RP controller - Added TU tape support - Added model emulation framework - Added model details 1.3 VAX - Separated out CVAX-specific features from core instruction simulator - Implemented capability for CIS, octaword, compatibility mode instructions - Added instruction display and parse for compatibility mode - Changed SET CPU VIRTUAL=n to SHOW CPU VIRTUAL=n - Added =n optional parameter to SHOW CPU HISTORY 1.4 Unibus/Qbus simulators (PDP-11, VAX, PDP-10) - Simplified DMA API's - Modified DMA peripherals to use simplified API's 1.5 HP2100 (all changes from Dave Bryan) CPU - moved MP into its own device; added MP option jumpers - modified DMA to allow disabling - modified SET CPU 2100/2116 to truncate memory > 32K - added -F switch to SET CPU to force memory truncation - modified WRU to be REG_HRO - added BRK and DEL to save console settings DR - provided protected tracks and "Writing Enabled" status bit - added "parity error" status return on writes for 12606 - added track origin test for 12606 - added SCP test for 12606 - added "Sector Flag" status bit - added "Read Inhibit" status bit for 12606 - added TRACKPROT modifier LPS - added SET OFFLINE/ONLINE, POWEROFF/POWERON - added fast/realistic timing - added debug printouts LPT - added SET OFFLINE/ONLINE, POWEROFF/POWERON PTR - added paper tape loop mode, DIAG/READER modifiers to PTR - added PV_LEFT to PTR TRLLIM register CLK - modified CLK to permit disable 1.6 IBM 1401, IBM 1620, Interdata 16b, SDS 940, PDP-10 - Added instruction history 1.7 H316, PDP-15, PDP-8 - Added =n optional value to SHOW CPU HISTORY 2. Bugs Fixed in 3.3 2.1 SCP - Fixed comma-separated SET options (from Dave Bryan) - Fixed duplicate HELP displays with user-specified commands 2.2 PDP-10 - Replicated RP register state per drive - Fixed TU to set FCE on short record - Fixed TU to return bit<15> in drive type - Fixed TU format specification, 1:0 are don't cares - Fixed TU handling of TMK status - Fixed TU handling of DONE, ATA at end of operation - Implemented TU write check 2.3 PDP-11 - Replicated RP register state per drive - Fixed RQ, TQ to report correct controller type and stage 1 configuration flags on a Unibus system - Fixed HK CS2<output_ready> flag 2.4 VAX - Fixed parsing of indirect displacement modes in instruction input 2.5 HP2100 (all fixes from Dave Bryan) CPU - fixed S-register behavior on 2116 - fixed LIx/MIx behavior for DMA on 2116 and 2100 - fixed LIx/MIx behavior for empty I/O card slots DP - fixed enable/disable from either device - fixed ANY ERROR status for 12557A interface - fixed unattached drive status for 12557A interface - status cmd without prior STC DC now completes (12557A) - OTA/OTB CC on 13210A interface also does CLC CC - fixed RAR model - fixed seek check on 13210 if sector out of range DQ - fixed enable/disable from either device - shortened xtime from 5 to 3 (drive avg 156KW/second) - fixed not ready/any error status - fixed RAR model DR - fixed enable/disable from either device - fixed sector return in status word - fixed DMA last word write, incomplete sector fill value - fixed 12610 SFC operation - fixed current-sector determination IPL - fixed enable/disable from either device LPS - fixed status returns for error conditions - fixed handling of non-printing characters - fixed handling of characters after column 80 - improved timing model accuracy for RTE LPT - fixed status returns for error conditions - fixed TOF handling so form remains on line 0 SYS - fixed display of CCA/CCB/CCE instructions 2.5 PDP-15 FPP - fixed URFST to mask low 9b of fraction - fixed exception PC setting
This commit is contained in:
committed by
Mark Pizzolato
parent
2e00e1122f
commit
b6393b36b4
145
VAX/vax_sysdev.c
145
VAX/vax_sysdev.c
@@ -1,4 +1,4 @@
|
||||
/* vax_sysreg.c: VAX system registers simulator
|
||||
/* vax_sysdev.c: VAX 3900 system-specific logic
|
||||
|
||||
Copyright (c) 1998-2004, Robert M Supnik
|
||||
|
||||
@@ -23,9 +23,8 @@
|
||||
be used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from Robert M Supnik.
|
||||
|
||||
This module contains the CVAX system-specific devices implemented in the
|
||||
CMCTL memory controller and the SSC system support chip. (The architecturally
|
||||
specified devices are implemented in module vax_stddev.c.)
|
||||
This module contains the CVAX chip and VAX 3900 system-specific registers
|
||||
and devices.
|
||||
|
||||
rom bootstrap ROM (no registers)
|
||||
nvr non-volatile ROM (no registers)
|
||||
@@ -33,6 +32,11 @@
|
||||
cso console storage output
|
||||
sysd system devices (SSC miscellany)
|
||||
|
||||
30-Sep-04 RMS Moved CADR, MSER, CONPC, CONPSL, machine_check, cpu_boot,
|
||||
con_halt here from vax_cpu.c
|
||||
Moved model-specific IPR's here from vax_cpu1.c
|
||||
09-Sep-04 RMS Integrated powerup into RESET (with -p)
|
||||
Added model-specific registers and routines from CPU
|
||||
23-Jan-04 MP Added extended physical memory support (Mark Pizzolato)
|
||||
07-Jun-03 MP Added calibrated delay to ROM reads (Mark Pizzolato)
|
||||
Fixed calibration problems interval timer (Mark Pizzolato)
|
||||
@@ -162,6 +166,17 @@
|
||||
|
||||
#define SSCADS_MASK 0x3FFFFFFC /* match or mask */
|
||||
|
||||
extern int32 R[16];
|
||||
extern int32 STK[5];
|
||||
extern int32 PSL;
|
||||
extern int32 SISR;
|
||||
extern int32 mapen;
|
||||
extern int32 pcq[PCQ_SIZE];
|
||||
extern int32 pcq_p;
|
||||
extern int32 ibcnt, ppc;
|
||||
extern int32 in_ie;
|
||||
extern int32 mchk_va, mchk_ref;
|
||||
extern int32 fault_PC;
|
||||
extern int32 int_req[IPL_HLVL];
|
||||
extern UNIT cpu_unit;
|
||||
extern UNIT clk_unit;
|
||||
@@ -174,6 +189,9 @@ extern int32 cpu_extmem;
|
||||
|
||||
uint32 *rom = NULL; /* boot ROM */
|
||||
uint32 *nvr = NULL; /* non-volatile mem */
|
||||
int32 CADR = 0; /* cache disable reg */
|
||||
int32 MSER = 0; /* mem sys error reg */
|
||||
int32 conpc, conpsl; /* console reg */
|
||||
int32 csi_csr = 0; /* control/status */
|
||||
int32 cso_csr = 0; /* control/status */
|
||||
int32 cmctl_reg[CMCTLSIZE >> 2] = { 0 }; /* CMCTL reg */
|
||||
@@ -232,7 +250,10 @@ void tmr_incr (int32 tmr, uint32 inc);
|
||||
int32 tmr0_inta (void);
|
||||
int32 tmr1_inta (void);
|
||||
int32 parity (int32 val, int32 odd);
|
||||
t_stat sysd_powerup (void);
|
||||
|
||||
extern void Write (uint32 va, int32 val, int32 lnt, int32 acc);
|
||||
extern int32 intexc (int32 vec, int32 cc, int32 ipl, int ei);
|
||||
extern int32 cqmap_rd (int32 pa);
|
||||
extern void cqmap_wr (int32 pa, int32 val, int32 lnt);
|
||||
extern int32 cqipc_rd (int32 pa);
|
||||
@@ -377,6 +398,10 @@ UNIT sysd_unit[] = {
|
||||
{ UDATA (&tmr_svc, 0, 0) } };
|
||||
|
||||
REG sysd_reg[] = {
|
||||
{ HRDATA (CADR, CADR, 8) },
|
||||
{ HRDATA (MSER, MSER, 8) },
|
||||
{ HRDATA (CONPC, conpc, 32) },
|
||||
{ HRDATA (CONPSL, conpsl, 32) },
|
||||
{ BRDATA (CMCSR, cmctl_reg, 16, 32, CMCTLSIZE >> 2) },
|
||||
{ HRDATA (CACR, ka_cacr, 8) },
|
||||
{ HRDATA (BDR, ka_bdr, 8) },
|
||||
@@ -478,15 +503,12 @@ int32 rg = ((pa - ROMBASE) & ROMAMASK) >> 2;
|
||||
return rom_read_delay (rom[rg]);
|
||||
}
|
||||
|
||||
void rom_wr (int32 pa, int32 val, int32 lnt)
|
||||
void rom_wr_B (int32 pa, int32 val)
|
||||
{
|
||||
int32 rg = ((pa - ROMBASE) & ROMAMASK) >> 2;
|
||||
int32 sc = (pa & 3) << 3;
|
||||
|
||||
if (lnt < L_LONG) { /* byte or word? */
|
||||
int32 sc = (pa & 3) << 3; /* merge */
|
||||
int32 mask = (lnt == L_WORD)? 0xFFFF: 0xFF;
|
||||
rom[rg] = ((val & mask) << sc) | (rom[rg] & ~(mask << sc)); }
|
||||
else rom[rg] = val;
|
||||
rom[rg] = ((val & 0xFF) << sc) | (rom[rg] & ~(0xFF << sc));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -590,7 +612,7 @@ uptr->flags = uptr->flags | (UNIT_ATTABLE | UNIT_BUFABLE);
|
||||
r = attach_unit (uptr, cptr);
|
||||
if (r != SCPE_OK)
|
||||
uptr->flags = uptr->flags & ~(UNIT_ATTABLE | UNIT_BUFABLE);
|
||||
else { uptr->hwmark = uptr->capac;
|
||||
else { uptr->hwmark = (uint32) uptr->capac;
|
||||
ssc_cnf = ssc_cnf & ~SSCCNF_BLO; }
|
||||
return r;
|
||||
}
|
||||
@@ -736,6 +758,21 @@ case MT_TXDB: /* TXDB */
|
||||
case MT_TODR:
|
||||
val = todr_rd ();
|
||||
break;
|
||||
case MT_CADR: /* CADR */
|
||||
val = CADR & 0xFF;
|
||||
break;
|
||||
case MT_MSER: /* MSER */
|
||||
val = MSER & 0xFF;
|
||||
break;
|
||||
case MT_CONPC: /* console PC */
|
||||
val = conpc;
|
||||
break;
|
||||
case MT_CONPSL: /* console PSL */
|
||||
val = conpsl;
|
||||
break;
|
||||
case MT_SID: /* SID */
|
||||
val = CVAX_SID | CVAX_UREV;
|
||||
break;
|
||||
default:
|
||||
ssc_bto = ssc_bto | SSCBTO_BTO; /* set BTO */
|
||||
val = 0;
|
||||
@@ -774,9 +811,19 @@ case MT_TXCS: /* TXCS */
|
||||
case MT_TXDB: /* TXDB */
|
||||
txdb_wr (val);
|
||||
break;
|
||||
case MT_CADR: /* CADR */
|
||||
CADR = (val & CADR_RW) | CADR_MBO;
|
||||
break;
|
||||
case MT_MSER: /* MSER */
|
||||
MSER = MSER & MSER_HM;
|
||||
break;
|
||||
case MT_IORESET: /* IORESET */
|
||||
ioreset_wr (val);
|
||||
break;
|
||||
case MT_SID:
|
||||
case MT_CONPC:
|
||||
case MT_CONPSL: /* halt reg */
|
||||
RSVD_OPND_FAULT;
|
||||
default:
|
||||
ssc_bto = ssc_bto | SSCBTO_BTO; /* set BTO */
|
||||
break; }
|
||||
@@ -878,7 +925,7 @@ case 16: /* err status */
|
||||
case 17: /* csr */
|
||||
return cmctl_reg[rg] & CMCSR_MASK;
|
||||
case 18: /* KA655X ext mem */
|
||||
if (cpu_extmem) return MEMSIZE;
|
||||
if (cpu_extmem) return ((int32) MEMSIZE);
|
||||
MACH_CHECK (MCHK_READ); }
|
||||
return 0;
|
||||
}
|
||||
@@ -941,7 +988,7 @@ int32 sysd_hlt_enb (void)
|
||||
return ka_bdr & BDR_BRKENB;
|
||||
}
|
||||
|
||||
/* Cache diagnostic space - byte/word merges done in WriteReg */
|
||||
/* Cache diagnostic space */
|
||||
|
||||
int32 cdg_rd (int32 pa)
|
||||
{
|
||||
@@ -1260,12 +1307,82 @@ int32 tmr1_inta (void)
|
||||
return tmr_tivr[1];
|
||||
}
|
||||
|
||||
/* Machine check */
|
||||
|
||||
int32 machine_check (int32 p1, int32 opc, int32 cc, int32 delta)
|
||||
{
|
||||
int32 i, st1, st2, p2, hsir, acc;
|
||||
|
||||
if (p1 & 0x80) p1 = p1 + mchk_ref; /* mref? set v/p */
|
||||
p2 = mchk_va + 4; /* save vap */
|
||||
for (i = hsir = 0; i < 16; i++) { /* find hsir */
|
||||
if ((SISR >> i) & 1) hsir = i; }
|
||||
st1 = ((((uint32) opc) & 0xFF) << 24) |
|
||||
(hsir << 16) |
|
||||
((CADR & 0xFF) << 8) |
|
||||
(MSER & 0xFF);
|
||||
st2 = 0x00C07000 + (delta & 0xFF);
|
||||
cc = intexc (SCB_MCHK, cc, 0, IE_SVE); /* take exception */
|
||||
acc = ACC_MASK (KERN); /* in kernel mode */
|
||||
in_ie = 1;
|
||||
SP = SP - 20; /* push 5 words */
|
||||
Write (SP, 16, L_LONG, WA); /* # bytes */
|
||||
Write (SP + 4, p1, L_LONG, WA); /* mcheck type */
|
||||
Write (SP + 8, p2, L_LONG, WA); /* address */
|
||||
Write (SP + 12, st1, L_LONG, WA); /* state 1 */
|
||||
Write (SP + 16, st2, L_LONG, WA); /* state 2 */
|
||||
in_ie = 0;
|
||||
return cc;
|
||||
}
|
||||
|
||||
/* Console entry */
|
||||
|
||||
int32 con_halt (int32 code, int32 cc)
|
||||
{
|
||||
int32 temp;
|
||||
|
||||
conpc = PC; /* save PC */
|
||||
conpsl = ((PSL | cc) & 0xFFFF00FF) | CON_HLTINS; /* PSL, param */
|
||||
temp = (PSL >> PSL_V_CUR) & 0x7; /* get is'cur */
|
||||
if (temp > 4) conpsl = conpsl | CON_BADPSL; /* invalid? */
|
||||
else STK[temp] = SP; /* save stack */
|
||||
if (mapen) conpsl = conpsl | CON_MAPON; /* mapping on? */
|
||||
mapen = 0; /* turn off map */
|
||||
SP = IS; /* set SP from IS */
|
||||
PSL = PSL_IS | PSL_IPL1F; /* PSL = 41F0000 */
|
||||
JUMP (ROMBASE); /* PC = 20040000 */
|
||||
return 0; /* new cc = 0 */
|
||||
}
|
||||
|
||||
/* Bootstrap */
|
||||
|
||||
t_stat cpu_boot (int32 unitno, DEVICE *dptr)
|
||||
{
|
||||
extern t_stat load_cmd (int32 flag, char *cptr);
|
||||
extern FILE *sim_log;
|
||||
t_stat r;
|
||||
|
||||
PC = ROMBASE;
|
||||
PSL = PSL_IS | PSL_IPL1F;
|
||||
conpc = 0;
|
||||
conpsl = PSL_IS | PSL_IPL1F | CON_PWRUP;
|
||||
if (rom == NULL) return SCPE_IERR;
|
||||
if (*rom == 0) { /* no boot? */
|
||||
printf ("Loading boot code from ka655x.bin\n");
|
||||
if (sim_log) fprintf (sim_log,
|
||||
"Loading boot code from ka655x.bin\n");
|
||||
r = load_cmd (0, "-R ka655x.bin");
|
||||
if (r != SCPE_OK) return r; }
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
/* SYSD reset */
|
||||
|
||||
t_stat sysd_reset (DEVICE *dptr)
|
||||
{
|
||||
int32 i;
|
||||
|
||||
if (sim_switches & SWMASK ('P')) sysd_powerup (); /* powerup? */
|
||||
for (i = 0; i < 2; i++) {
|
||||
tmr_csr[i] = tmr_tnir[i] = tmr_tir[i] = 0;
|
||||
tmr_inc[i] = tmr_sav[i] = 0;
|
||||
@@ -1296,6 +1413,6 @@ ssc_base = SSCBASE;
|
||||
ssc_cnf = ssc_cnf & SSCCNF_BLO;
|
||||
ssc_bto = 0;
|
||||
ssc_otp = 0;
|
||||
return sysd_reset (&sysd_dev);
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user