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