mirror of
https://github.com/simh/simh.git
synced 2026-01-26 20:12:23 +00:00
VAX: Add VCB01(QVSS) device to MicroVAX 3900 simulator
This commit is contained in:
13
VAX/vax_io.c
13
VAX/vax_io.c
@@ -118,6 +118,9 @@ extern int32 PSL, SISR, trpirq, mem_err, crd_err, hlt_pin;
|
||||
extern int32 p1;
|
||||
extern int32 ssc_bto;
|
||||
extern jmp_buf save_env;
|
||||
extern int32 vc_mem_rd (int32 pa);
|
||||
extern void vc_mem_wr (int32 pa, int32 val, int32 lnt);
|
||||
extern uint32 *vc_buf;
|
||||
|
||||
t_stat dbl_rd (int32 *data, int32 addr, int32 access);
|
||||
t_stat dbl_wr (int32 data, int32 addr, int32 access);
|
||||
@@ -583,6 +586,7 @@ return;
|
||||
May give master or slave error, depending on where the failure occurs
|
||||
*/
|
||||
|
||||
|
||||
int32 cqmem_rd (int32 pa)
|
||||
{
|
||||
int32 qa = pa & CQMAMASK; /* Qbus addr */
|
||||
@@ -590,6 +594,8 @@ uint32 ma;
|
||||
|
||||
if (qba_map_addr (qa, &ma)) /* map addr */
|
||||
return M[ma >> 2];
|
||||
if (ADDR_IS_QVM(pa) && vc_buf) /* QVSS memory? */
|
||||
return vc_mem_rd (pa);
|
||||
MACH_CHECK (MCHK_READ); /* err? mcheck */
|
||||
return 0;
|
||||
}
|
||||
@@ -608,7 +614,12 @@ if (qba_map_addr (qa, &ma)) { /* map addr */
|
||||
}
|
||||
M[ma >> 2] = val;
|
||||
}
|
||||
else mem_err = 1;
|
||||
else {
|
||||
if (ADDR_IS_QVM(pa) && vc_buf) /* QVSS Memory */
|
||||
vc_mem_wr (pa, val, lnt);
|
||||
else
|
||||
mem_err = 1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -207,6 +207,7 @@ extern jmp_buf save_env;
|
||||
extern int32 p1;
|
||||
extern int32 MSER;
|
||||
extern int32 tmr_poll;
|
||||
extern DEVICE vc_dev, lk_dev, vs_dev;
|
||||
|
||||
uint32 *rom = NULL; /* boot ROM */
|
||||
uint32 *nvr = NULL; /* non-volatile mem */
|
||||
@@ -1814,12 +1815,37 @@ return "system devices";
|
||||
|
||||
t_stat cpu_set_model (UNIT *uptr, int32 val, char *cptr, void *desc)
|
||||
{
|
||||
char gbuf[CBUFSIZE];
|
||||
|
||||
if ((cptr == NULL) || (!*cptr))
|
||||
return SCPE_ARG;
|
||||
if (MATCH_CMD(cptr, "VAXSERVER") == 0)
|
||||
cptr = get_glyph (cptr, gbuf, 0);
|
||||
if (MATCH_CMD(cptr, "VAXSERVER") == 0) {
|
||||
sys_model = 0;
|
||||
else if (MATCH_CMD(cptr, "MICROVAX") == 0)
|
||||
strcpy (sim_name, "VAXServer 3900 (KA655)");
|
||||
}
|
||||
else if (MATCH_CMD(gbuf, "MICROVAX") == 0) {
|
||||
sys_model = 1;
|
||||
strcpy (sim_name, "MicroVAX 3900 (KA655)");
|
||||
#if defined(USE_SIM_VIDEO) && defined(HAVE_LIBSDL)
|
||||
vc_dev.flags = vc_dev.flags | DEV_DIS; /* disable QVSS */
|
||||
lk_dev.flags = lk_dev.flags | DEV_DIS; /* disable keyboard */
|
||||
vs_dev.flags = vs_dev.flags | DEV_DIS; /* disable mouse */
|
||||
reset_all (0); /* reset everything */
|
||||
#endif
|
||||
}
|
||||
else if (MATCH_CMD(gbuf, "VAXSTATION") == 0) {
|
||||
#if defined(USE_SIM_VIDEO) && defined(HAVE_LIBSDL)
|
||||
strcpy (sim_name, "VAXStation 3900 (KA655)");
|
||||
sys_model = 1;
|
||||
vc_dev.flags = vc_dev.flags & ~DEV_DIS; /* enable QVSS */
|
||||
lk_dev.flags = lk_dev.flags & ~DEV_DIS; /* enable keyboard */
|
||||
vs_dev.flags = vs_dev.flags & ~DEV_DIS; /* enable mouse */
|
||||
reset_all (0); /* reset everything */
|
||||
#else
|
||||
return SCPE_ARG;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
return SCPE_ARG;
|
||||
return SCPE_OK;
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
#include "vax_defs.h"
|
||||
|
||||
char sim_name[] = "MicroVAX 3900";
|
||||
char sim_name[64] = "MicroVAX 3900";
|
||||
|
||||
extern DEVICE cpu_dev;
|
||||
extern DEVICE tlb_dev;
|
||||
@@ -50,6 +50,9 @@ extern DEVICE dz_dev;
|
||||
extern DEVICE csi_dev, cso_dev;
|
||||
extern DEVICE xq_dev, xqb_dev;
|
||||
extern DEVICE vh_dev;
|
||||
extern DEVICE vc_dev;
|
||||
extern DEVICE lk_dev;
|
||||
extern DEVICE vs_dev;
|
||||
|
||||
extern void WriteB (uint32 pa, int32 val);
|
||||
extern void rom_wr_B (int32 pa, int32 val);
|
||||
@@ -71,6 +74,11 @@ DEVICE *sim_devices[] = {
|
||||
&vh_dev,
|
||||
&cr_dev,
|
||||
&lpt_dev,
|
||||
#if defined(USE_SIM_VIDEO) && defined(HAVE_LIBSDL)
|
||||
&lk_dev,
|
||||
&vs_dev,
|
||||
&vc_dev,
|
||||
#endif
|
||||
&rl_dev,
|
||||
&rq_dev,
|
||||
&rqb_dev,
|
||||
|
||||
@@ -220,6 +220,17 @@ extern t_stat cpu_show_memory (FILE* st, UNIT* uptr, int32 val, void* desc);
|
||||
#define CQMSIZE (1u << CQMAWIDTH) /* Qmem length */
|
||||
#define CQMAMASK (CQMSIZE - 1) /* Qmem addr mask */
|
||||
#define CQMBASE 0x30000000 /* Qmem base */
|
||||
#define ADDR_IS_CQM(x) ((((uint32) (x)) >= CQMBASE) && \
|
||||
(((uint32) (x)) < (CQMBASE + CQMSIZE)))
|
||||
|
||||
/* QVSS memory space */
|
||||
|
||||
#define QVMAWIDTH 18 /* QVSS mem addr width */
|
||||
#define QVMSIZE (1u << QVMAWIDTH) /* QVSS mem length */
|
||||
#define QVMAMASK (QVMSIZE - 1) /* QVSS mem addr mask */
|
||||
#define QVMBASE (CQMBASE + CQMSIZE - QVMSIZE) /* QVSS mem base - end of Qbus memory space */
|
||||
#define ADDR_IS_QVM(x) ((((uint32) (x)) >= QVMBASE) && \
|
||||
(((uint32) (x)) < (QVMBASE + QVMSIZE)))
|
||||
|
||||
/* Machine specific reserved operand tests (all NOPs) */
|
||||
|
||||
@@ -330,8 +341,9 @@ typedef struct {
|
||||
#define INT_V_VHTX 18
|
||||
#define INT_V_QDSS 19 /* QDSS */
|
||||
#define INT_V_CR 20
|
||||
#define INT_V_DMCRX 21 /* DMC11 */
|
||||
#define INT_V_DMCTX 22
|
||||
#define INT_V_QVSS 21 /* QVSS */
|
||||
#define INT_V_DMCRX 22 /* DMC11 */
|
||||
#define INT_V_DMCTX 23
|
||||
|
||||
#define INT_CLK (1u << INT_V_CLK)
|
||||
#define INT_RQ (1u << INT_V_RQ)
|
||||
@@ -355,6 +367,7 @@ typedef struct {
|
||||
#define INT_VHTX (1u << INT_V_VHTX)
|
||||
#define INT_QDSS (1u << INT_V_QDSS)
|
||||
#define INT_CR (1u << INT_V_CR)
|
||||
#define INT_QVSS (1u << INT_V_QVSS)
|
||||
#define INT_DMCRX (1u << INT_V_DMCRX)
|
||||
#define INT_DMCTX (1u << INT_V_DMCTX)
|
||||
|
||||
@@ -380,6 +393,7 @@ typedef struct {
|
||||
#define IPL_VHTX (0x14 - IPL_HMIN)
|
||||
#define IPL_QDSS (0x14 - IPL_HMIN)
|
||||
#define IPL_CR (0x14 - IPL_HMIN)
|
||||
#define IPL_QVSS (0x14 - IPL_HMIN)
|
||||
#define IPL_DMCRX (0x14 - IPL_HMIN)
|
||||
#define IPL_DMCTX (0x14 - IPL_HMIN)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user