diff --git a/VAX/vax_io.c b/VAX/vax_io.c index d87b22ed..e361b304 100644 --- a/VAX/vax_io.c +++ b/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; } diff --git a/VAX/vax_sysdev.c b/VAX/vax_sysdev.c index c006919b..b900d48e 100644 --- a/VAX/vax_sysdev.c +++ b/VAX/vax_sysdev.c @@ -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; diff --git a/VAX/vax_syslist.c b/VAX/vax_syslist.c index 7a61a100..ccc2b051 100644 --- a/VAX/vax_syslist.c +++ b/VAX/vax_syslist.c @@ -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, diff --git a/VAX/vaxmod_defs.h b/VAX/vaxmod_defs.h index bc491b08..d78cb99b 100644 --- a/VAX/vaxmod_defs.h +++ b/VAX/vaxmod_defs.h @@ -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) diff --git a/Visual Studio Projects/VAX.vcproj b/Visual Studio Projects/VAX.vcproj index 55001561..bd2f1119 100644 --- a/Visual Studio Projects/VAX.vcproj +++ b/Visual Studio Projects/VAX.vcproj @@ -27,7 +27,7 @@ + + + + @@ -324,6 +332,10 @@ RelativePath="..\VAX\vax_io.c" > + + @@ -352,6 +364,14 @@ RelativePath="..\VAX\vax_syslist.c" > + + + + + + + + diff --git a/descrip.mms b/descrip.mms index 03b0a085..93d9afda 100644 --- a/descrip.mms +++ b/descrip.mms @@ -645,7 +645,9 @@ VAX_SOURCE2 = $(PDP11_DIR)PDP11_IO_LIB.C,\ $(PDP11_DIR)PDP11_TS.C,$(PDP11_DIR)PDP11_DZ.C,\ $(PDP11_DIR)PDP11_LP.C,$(PDP11_DIR)PDP11_TQ.C,\ $(PDP11_DIR)PDP11_XQ.C,$(PDP11_DIR)PDP11_VH.C,\ - $(PDP11_DIR)PDP11_CR.C + $(PDP11_DIR)PDP11_CR.C,\ + $(VAX_DIR)VAX_VC.C,$(VAX_DIR)VAX_LK.C,\ + $(VAX_DIR)VAX_VS.C,$(VAX_DIR)VAX_2681.C .IFDEF ALPHA_OR_IA64 VAX_OPTIONS = /INCL=($(SIMH_DIR),$(VAX_DIR),$(PDP11_DIR)$(PCAP_INC))\ /DEF=($(CC_DEFS),"VM_VAX=1","USE_ADDR64=1","USE_INT64=1"$(PCAP_DEFS)) diff --git a/makefile b/makefile index 2f8c640b..d3a8fe40 100644 --- a/makefile +++ b/makefile @@ -60,7 +60,7 @@ endif BUILD_SINGLE := $(MAKECMDGOALS) $(BLANK_SUFFIX) ifneq (,$(or $(findstring pdp11,$(MAKECMDGOALS)),$(findstring vax,$(MAKECMDGOALS)),$(findstring all,$(MAKECMDGOALS)))) NETWORK_USEFUL = true - ifneq (,$(or $(findstring microvax1,$(MAKECMDGOALS)),$(findstring microvax2,$(MAKECMDGOALS)))) + ifneq (,$(or $(findstring microvax1,$(MAKECMDGOALS)),$(findstring microvax2,$(MAKECMDGOALS)),$(findstring microvax3900,$(MAKECMDGOALS)))) VIDEO_USEFUL = true endif ifneq (,$(findstring all,$(MAKECMDGOALS))$(word 2,$(MAKECMDGOALS))) @@ -945,11 +945,12 @@ VAX = ${VAXD}/vax_cpu.c ${VAXD}/vax_cpu1.c ${VAXD}/vax_fpa.c ${VAXD}/vax_io.c \ ${VAXD}/vax_cis.c ${VAXD}/vax_octa.c ${VAXD}/vax_cmode.c \ ${VAXD}/vax_mmu.c ${VAXD}/vax_stddev.c ${VAXD}/vax_sysdev.c \ ${VAXD}/vax_sys.c ${VAXD}/vax_syscm.c ${VAXD}/vax_syslist.c \ + ${VAXD}/vax_vc.c ${VAXD}/vax_lk.c ${VAXD}/vax_vs.c ${VAXD}/vax_2681.c \ ${PDP11D}/pdp11_rl.c ${PDP11D}/pdp11_rq.c ${PDP11D}/pdp11_ts.c \ ${PDP11D}/pdp11_dz.c ${PDP11D}/pdp11_lp.c ${PDP11D}/pdp11_tq.c \ ${PDP11D}/pdp11_xq.c ${PDP11D}/pdp11_vh.c ${PDP11D}/pdp11_cr.c \ ${PDP11D}/pdp11_io_lib.c -VAX_OPT = -DVM_VAX -DUSE_INT64 -DUSE_ADDR64 -I ${VAXD} -I ${PDP11D} ${NETWORK_OPT} +VAX_OPT = -DVM_VAX -DUSE_INT64 -DUSE_ADDR64 -DUSE_SIM_VIDEO -I ${VAXD} -I ${PDP11D} ${NETWORK_OPT} ${VIDEO_CCDEFS} ${VIDEO_LDFLAGS} VAX610 = ${VAXD}/vax_cpu.c ${VAXD}/vax_cpu1.c ${VAXD}/vax_fpa.c \