From 5dc6d9a48763db1d9df6b3d39bc1eedfc3e581f8 Mon Sep 17 00:00:00 2001 From: Paul Koning Date: Sat, 4 Feb 2017 13:43:40 -0800 Subject: [PATCH] PDP11: Add initial UC15 support from Bob Supnik Include files I (Mark Pizzolato) missed in prior commit --- PDP11/pdp11_cpumod.c | 11 ++++---- PDP11/pdp11_defs.h | 8 +++++- PDP11/pdp11_io.c | 38 +++++++++----------------- PDP11/pdp11_io_lib.c | 1 - PDP11/pdp11_rh.c | 3 --- PDP11/pdp11_rk.c | 63 ++++++++++++++++++++++++++++---------------- PDP11/pdp11_rl.c | 2 -- PDP11/pdp11_sys.c | 24 ++++++++++++----- PDP11/pdp11_ts.c | 1 - 9 files changed, 83 insertions(+), 68 deletions(-) diff --git a/PDP11/pdp11_cpumod.c b/PDP11/pdp11_cpumod.c index 521d6d01..84dd3c90 100644 --- a/PDP11/pdp11_cpumod.c +++ b/PDP11/pdp11_cpumod.c @@ -1,6 +1,6 @@ /* pdp11_cpumod.c: PDP-11 CPU model-specific features - Copyright (c) 2004-2013, Robert M Supnik + Copyright (c) 2004-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,8 @@ system PDP-11 model-specific registers + 04-Mar-16 RMS Fixed maximum memory sizes to exclude IO page + 14-Mar-16 RMS Modified to keep cpu_memsize in sync with MEMSIZE 06-Jun-13 RMS Fixed change model to set memory size last 20-May-08 RMS Added JCSR default for KDJ11B, KDJ11E 22-Apr-08 RMS Fixed write behavior of 11/70 MBRK, LOSIZE, HISIZE @@ -85,10 +87,7 @@ static int32 clk_tps_map[4] = { 60, 60, 50, 800 }; extern uint16 *M; extern int32 R[8]; -extern DEVICE cpu_dev; -extern UNIT cpu_unit; extern int32 STKLIM, PIRQ; -extern uint32 cpu_model, cpu_type, cpu_opt; extern int32 clk_fie, clk_fnxm, clk_tps, clk_default; t_stat CPU24_rd (int32 *data, int32 addr, int32 access); @@ -1149,9 +1148,11 @@ uint32 i, clim; uint16 *nM; if ((val <= 0) || - (val > (int32) cpu_tab[cpu_model].maxm) || + (val > ((int32) cpu_tab[cpu_model].maxm)) || ((val & 07777) != 0)) return SCPE_ARG; +if (val > ((int32) (cpu_tab[cpu_model].maxm - IOPAGESIZE))) + val = (int32) (cpu_tab[cpu_model].maxm - IOPAGESIZE); for (i = val; i < MEMSIZE; i = i + 2) mc = mc | M[i >> 1]; if ((mc != 0) && !get_yn ("Really truncate memory [N]?", FALSE)) diff --git a/PDP11/pdp11_defs.h b/PDP11/pdp11_defs.h index 2ef573f4..4d5055ca 100644 --- a/PDP11/pdp11_defs.h +++ b/PDP11/pdp11_defs.h @@ -180,7 +180,13 @@ #define CPUT(x) ((cpu_type & (x)) != 0) #define CPUO(x) ((cpu_opt & (x)) != 0) #define UNIBUS (cpu_opt & BUS_U) -extern uint32 cpu_model, cpu_type, cpu_opt; +extern int32 cpu_bme; /* bus map enable */ +extern uint32 cpu_model; /* CPU model */ +extern uint32 cpu_type; /* model as bit mask */ +extern uint32 cpu_opt; /* CPU options */ + +extern DEVICE cpu_dev; +extern UNIT cpu_unit; /* Feature sets diff --git a/PDP11/pdp11_io.c b/PDP11/pdp11_io.c index 7f3585b5..1f54889f 100644 --- a/PDP11/pdp11_io.c +++ b/PDP11/pdp11_io.c @@ -54,14 +54,8 @@ extern uint16 *M; extern int32 int_req[IPL_HLVL]; extern int32 ub_map[UBM_LNT_LW]; -extern uint32 cpu_opt; -extern int32 cpu_bme; extern int32 trap_req, ipl; -extern int32 cpu_log; -extern int32 autcon_enb; extern int32 uba_last; -extern DEVICE cpu_dev; -extern t_addr cpu_memsize; int32 calc_ints (int32 nipl, int32 trq); @@ -264,9 +258,7 @@ if (cpu_bme) { /* map enabled? */ ma = Map_Addr (ba); /* map addr */ if (!ADDR_IS_MEM (ma)) /* NXM? err */ return (lim - ba); - if (ma & 1) /* get byte */ - *buf++ = (M[ma >> 1] >> 8) & 0377; - else *buf++ = M[ma >> 1] & 0377; + *buf++ = (uint8) RdMemB (ma); /* get byte */ } return 0; } @@ -274,12 +266,10 @@ else { /* physical */ if (ADDR_IS_MEM (lim)) /* end ok? */ alim = lim; else if (ADDR_IS_MEM (ba)) /* no, strt ok? */ - alim = cpu_memsize; + alim = MEMSIZE; else return bc; /* no, err */ for ( ; ba < alim; ba++) { /* by bytes */ - if (ba & 1) - *buf++ = (M[ba >> 1] >> 8) & 0377; /* get byte */ - else *buf++ = M[ba >> 1] & 0377; + *buf++ = (uint8) RdMemB (ba); /* get byte */ } return (lim - alim); } @@ -309,7 +299,7 @@ if (cpu_bme) { /* map enabled? */ ma = Map_Addr (ba); /* map addr */ if (!ADDR_IS_MEM (ma)) /* NXM? err */ return (lim - ba); - *buf++ = M[ma >> 1]; + *buf++ = (uint16) RdMemW (ma); } return 0; } @@ -317,10 +307,10 @@ else { /* physical */ if (ADDR_IS_MEM (lim)) /* end ok? */ alim = lim; else if (ADDR_IS_MEM (ba)) /* no, strt ok? */ - alim = cpu_memsize; + alim = MEMSIZE; else return bc; /* no, err */ for ( ; ba < alim; ba = ba + 2) { /* by words */ - *buf++ = M[ba >> 1]; + *buf++ = (uint16) RdMemW (ba); } return (lim - alim); } @@ -346,9 +336,7 @@ if (cpu_bme) { /* map enabled? */ ma = Map_Addr (ba); /* map addr */ if (!ADDR_IS_MEM (ma)) /* NXM? err */ return (lim - ba); - if (ma & 1) M[ma >> 1] = (M[ma >> 1] & 0377) | - ((uint16) *buf++ << 8); - else M[ma >> 1] = (M[ma >> 1] & ~0377) | *buf++; + WrMemB (ma, ((uint16) *buf++)); } return 0; } @@ -356,12 +344,10 @@ else { /* physical */ if (ADDR_IS_MEM (lim)) /* end ok? */ alim = lim; else if (ADDR_IS_MEM (ba)) /* no, strt ok? */ - alim = cpu_memsize; + alim = MEMSIZE; else return bc; /* no, err */ for ( ; ba < alim; ba++) { /* by bytes */ - if (ba & 1) - M[ba >> 1] = (M[ba >> 1] & 0377) | ((uint16) *buf++ << 8); - else M[ba >> 1] = (M[ba >> 1] & ~0377) | *buf++; + WrMemB (ba, ((uint16) *buf++)); } return (lim - alim); } @@ -389,7 +375,7 @@ if (cpu_bme) { /* map enabled? */ ma = Map_Addr (ba); /* map addr */ if (!ADDR_IS_MEM (ma)) /* NXM? err */ return (lim - ba); - M[ma >> 1] = *buf++; + WrMemW (ma, *buf++); } return 0; } @@ -397,10 +383,10 @@ else { /* physical */ if (ADDR_IS_MEM (lim)) /* end ok? */ alim = lim; else if (ADDR_IS_MEM (ba)) /* no, strt ok? */ - alim = cpu_memsize; + alim = MEMSIZE; else return bc; /* no, err */ for ( ; ba < alim; ba = ba + 2) { /* by words */ - M[ba >> 1] = *buf++; + WrMemW (ba, *buf++); } return (lim - alim); } diff --git a/PDP11/pdp11_io_lib.c b/PDP11/pdp11_io_lib.c index 3a949165..fbaf8c10 100644 --- a/PDP11/pdp11_io_lib.c +++ b/PDP11/pdp11_io_lib.c @@ -823,7 +823,6 @@ t_stat auto_config (const char *name, int32 nctrl) uint32 csr = IOPAGEBASE + AUTO_CSRBASE; uint32 vec = AUTO_VECBASE; int32 ilvl, ibit, numc; -extern UNIT cpu_unit; AUTO_CON *autp; DEVICE *dptr; DIB *dibp; diff --git a/PDP11/pdp11_rh.c b/PDP11/pdp11_rh.c index 70f6a352..bb67ae4d 100644 --- a/PDP11/pdp11_rh.c +++ b/PDP11/pdp11_rh.c @@ -160,11 +160,8 @@ typedef struct { MBACTX massbus[MBA_NUM]; -extern uint32 cpu_opt; -extern int32 cpu_bme; extern uint16 *M; extern int32 int_req[IPL_HLVL]; -extern t_addr cpu_memsize; t_stat mba_reset (DEVICE *dptr); t_stat mba_rd (int32 *val, int32 pa, int32 access); diff --git a/PDP11/pdp11_rk.c b/PDP11/pdp11_rk.c index 2d547e24..59d8e5e7 100644 --- a/PDP11/pdp11_rk.c +++ b/PDP11/pdp11_rk.c @@ -1,6 +1,6 @@ /* pdp11_rk.c: RK11/RKV11 cartridge disk simulator - Copyright (c) 1993-2009, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ rk RK11/RKV11/RK05 cartridge disk + 12-Mar-16 RMS Revised to support UC15 (18b IO) 23-Oct-13 RMS Revised for new boot setup routine 20-Mar-09 RMS Fixed bug in read header (Walter F Mueller) 16-Aug-05 RMS Fixed C++ declaration and cast problems @@ -80,6 +81,22 @@ extern int32 int_req[IPL_HLVL]; /* Constants */ +#if defined (UC15) + +#define RKCONTR uint32 /* container format */ +#define RKWRDSZ 18 /* word width */ +#define MAP_RDW(a,b,c) Map_Read18 (a, b, c) +#define MAP_WRW(a,b,c) Map_Write18 (a, b, c) + +#else + +#define RKCONTR uint16 +#define RKWRDSZ 16 +#define MAP_RDW(a,b,c) Map_ReadW (a, b, c) +#define MAP_WRW(a,b,c) Map_WriteW (a, b, c) + +#endif + #define RK_NUMWD 256 /* words/sector */ #define RK_NUMSC 12 /* sectors/surface */ #define RK_NUMSF 2 /* surfaces/cylinder */ @@ -276,7 +293,9 @@ BITFIELD *rk_reg_bits[] = { #define RK_MIN 10 #define MAX(x,y) (((x) > (y))? (x): (y)) -uint16 *rkxb = NULL; /* xfer buffer */ +extern int32 int_req[IPL_HLVL]; + +RKCONTR *rkxb = NULL; /* xfer buffer */ int32 rkcs = 0; /* control/status */ int32 rkds = 0; /* drive status */ int32 rkba = 0; /* memory address */ @@ -399,7 +418,7 @@ MTAB rk_mod[] = { DEVICE rk_dev = { "RK", rk_unit, rk_reg, rk_mod, - RK_NUMDR, 8, 24, 1, 8, 16, + RK_NUMDR, 8, 24, 1, 8, RKWRDSZ, NULL, NULL, &rk_reset, &rk_boot, NULL, NULL, &rk_dib, DEV_DISABLE | DEV_UBUS | DEV_Q18 | DEV_DEBUG | RK_DIS, 0, @@ -629,7 +648,7 @@ t_stat rk_svc (UNIT *uptr) int32 i, drv, err, awc, wc, cma, cda, t; int32 da, cyl, track, sect; uint32 ma; -uint16 comp; +RKCONTR comp; drv = (int32) (uptr - rk_dev.units); /* get drv number */ if (uptr->FUNC == RKCS_SEEK) { /* seek */ @@ -671,7 +690,7 @@ if ((da + wc) > (int32) uptr->capac) { /* overrun? */ rker = rker | RKER_OVR; /* set overrun err */ } -err = fseek (uptr->fileref, da * sizeof (int16), SEEK_SET); +err = fseek (uptr->fileref, da * sizeof (RKCONTR), SEEK_SET); if (wc && (err == 0)) { /* seek ok? */ switch (uptr->FUNC) { /* case on function */ @@ -688,19 +707,19 @@ if (wc && (err == 0)) { /* seek ok? */ } /* end for wc */ } /* end if format */ else { /* normal read */ - i = fxread (rkxb, sizeof (int16), wc, uptr->fileref); + i = fxread (rkxb, sizeof (RKCONTR), wc, uptr->fileref); err = ferror (uptr->fileref); /* read file */ for ( ; i < wc; i++) /* fill buf */ rkxb[i] = 0; } if (rkcs & RKCS_INH) { /* incr inhibit? */ - if ((t = Map_WriteW (ma, 2, &rkxb[wc - 1]))) {/* store last */ + if ((t = MAP_WRW (ma, 2, &rkxb[wc - 1]))) { /* store last */ rker = rker | RKER_NXM; /* NXM? set flag */ wc = 0; /* no transfer */ } } else { /* normal store */ - if ((t = Map_WriteW (ma, wc << 1, rkxb))) { /* store buf */ + if ((t = MAP_WRW (ma, wc << 1, rkxb))) { /* store buf */ rker = rker | RKER_NXM; /* NXM? set flag */ wc = wc - t; /* adj wd cnt */ } @@ -709,7 +728,7 @@ if (wc && (err == 0)) { /* seek ok? */ case RKCS_WRITE: /* write */ if (rkcs & RKCS_INH) { /* incr inhibit? */ - if ((t = Map_ReadW (ma, 2, &comp))) { /* get 1st word */ + if ((t = MAP_RDW (ma, 2, &comp))) { /* get 1st word */ rker = rker | RKER_NXM; /* NXM? set flag */ wc = 0; /* no transfer */ } @@ -717,7 +736,7 @@ if (wc && (err == 0)) { /* seek ok? */ rkxb[i] = comp; } else { /* normal fetch */ - if ((t = Map_ReadW (ma, wc << 1, rkxb))) { /* get buf */ + if ((t = MAP_RDW (ma, wc << 1, rkxb))) { /* get buf */ rker = rker | RKER_NXM; /* NXM? set flg */ wc = wc - t; /* adj wd cnt */ } @@ -726,13 +745,13 @@ if (wc && (err == 0)) { /* seek ok? */ awc = (wc + (RK_NUMWD - 1)) & ~(RK_NUMWD - 1); /* clr to */ for (i = wc; i < awc; i++) /* end of blk */ rkxb[i] = 0; - fxwrite (rkxb, sizeof (int16), awc, uptr->fileref); + fxwrite (rkxb, sizeof (RKCONTR), awc, uptr->fileref); err = ferror (uptr->fileref); } break; /* end write */ case RKCS_WCHK: /* write check */ - i = fxread (rkxb, sizeof (int16), wc, uptr->fileref); + i = fxread (rkxb, sizeof (RKCONTR), wc, uptr->fileref); if ((err = ferror (uptr->fileref))) { /* read error? */ wc = 0; /* no transfer */ break; @@ -741,7 +760,7 @@ if (wc && (err == 0)) { /* seek ok? */ rkxb[i] = 0; awc = wc; /* save wc */ for (wc = 0, cma = ma; wc < awc; wc++) { /* loop thru buf */ - if (Map_ReadW (cma, 2, &comp)) { /* mem wd */ + if (MAP_RDW (cma, 2, &comp)) { /* mem wd */ rker = rker | RKER_NXM; /* NXM? set flg */ break; } @@ -860,7 +879,7 @@ for (i = 0; i < RK_NUMDR; i++) { uptr->flags = uptr->flags & ~UNIT_SWLK; } if (rkxb == NULL) - rkxb = (uint16 *) calloc (RK_MAXFR, sizeof (uint16)); + rkxb = (RKCONTR *) calloc (RK_MAXFR, sizeof (RKCONTR)); if (rkxb == NULL) return SCPE_MEM; return auto_config (0, 0); @@ -868,7 +887,14 @@ return auto_config (0, 0); /* Device bootstrap */ -#if defined (VM_PDP11) +#if defined (UC15) || !defined (VM_PDP11) + +t_stat rk_boot (int32 unitno, DEVICE *dptr) +{ +return SCPE_NOFNC; +} + +#else #define BOOT_START 02000 /* start */ #define BOOT_ENTRY (BOOT_START + 002) /* entry */ @@ -915,13 +941,6 @@ cpu_set_boot (BOOT_ENTRY); return SCPE_OK; } -#else - -t_stat rk_boot (int32 unitno, DEVICE *dptr) -{ -return SCPE_NOFNC; -} - #endif t_stat rk_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) diff --git a/PDP11/pdp11_rl.c b/PDP11/pdp11_rl.c index f070985e..c40fce30 100644 --- a/PDP11/pdp11_rl.c +++ b/PDP11/pdp11_rl.c @@ -95,8 +95,6 @@ #else /* PDP-11 version */ #include "pdp11_defs.h" -extern uint32 cpu_opt; -extern UNIT cpu_unit; #endif /* Constants */ diff --git a/PDP11/pdp11_sys.c b/PDP11/pdp11_sys.c index 5729dcbf..d4307326 100644 --- a/PDP11/pdp11_sys.c +++ b/PDP11/pdp11_sys.c @@ -1,6 +1,6 @@ /* pdp11_sys.c: PDP-11 simulator interface - Copyright (c) 1993-2013, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 14-Mar-16 RMS Added UC15 support 02-Sep-13 RMS Added third Massbus, RS03/RS04 29-Apr-12 RMS Fixed compiler warning (Mark Pizzolato) 19-Nov-08 RMS Moved I/O support routines to I/O library @@ -113,7 +114,7 @@ extern DEVICE dmc_dev; extern DEVICE dup_dev; extern DEVICE dpv_dev; extern DEVICE kmc_dev; -extern UNIT cpu_unit; +extern DEVICE uca_dev, ucb_dev; extern REG cpu_reg[]; extern uint16 *M; extern int32 saved_PC; @@ -137,6 +138,7 @@ int32 sim_emax = 4; DEVICE *sim_devices[] = { &cpu_dev, &sys_dev, +#if !defined (UC15) &mba_dev[0], &mba_dev[1], &mba_dev[2], @@ -181,12 +183,22 @@ DEVICE *sim_devices[] = { &xqb_dev, &xu_dev, &xub_dev, - &ke_dev, &kg_dev, &dmc_dev, &dup_dev, &dpv_dev, &kmc_dev, + &ke_dev, +#else + &clk_dev, + &tti_dev, + &tto_dev, + &cr_dev, + &lpt_dev, + &rk_dev, + &uca_dev, + &ucb_dev, +#endif NULL }; @@ -268,11 +280,9 @@ do { /* block loop */ if ((d = Fgetc (fileref)) == EOF) /* data char */ return SCPE_FMT; csum = csum + d; /* add into csum */ - if (org >= MEMSIZE) /* invalid addr? */ + if (!ADDR_IS_MEM (org)) /* invalid addr? */ return SCPE_NXM; - M[org >> 1] = (org & 1)? /* store data */ - (M[org >> 1] & 0377) | (uint16)(d << 8): - (M[org >> 1] & 0177400) | (uint16)d; + WrMemB (org, ((uint16) d)); org = (org + 1) & 0177777; /* inc origin */ } if ((d = Fgetc (fileref)) == EOF) /* get csum */ diff --git a/PDP11/pdp11_ts.c b/PDP11/pdp11_ts.c index 34f59e2a..efcdb765 100644 --- a/PDP11/pdp11_ts.c +++ b/PDP11/pdp11_ts.c @@ -269,7 +269,6 @@ extern uint32 cpu_opt; #define MAX_PLNT 8 /* max pkt length */ extern int32 int_req[IPL_HLVL]; -extern UNIT cpu_unit; uint8 *tsxb = NULL; /* xfer buffer */ int32 tssr = 0; /* status register */