blob: ba8fb178e978e5f704fce6a73f7d4240bf0f485a [file] [log] [blame] [raw]
/* pdp11_cpumod.h: PDP-11 CPU model definitions
Copyright (c) 2004-2008, 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"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
ROBERT M SUPNIK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Robert M Supnik shall not 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.
22-Apr-08 RMS Added 11/70 MBRK register
30-Aug-05 RMS Added additional 11/60 registers
*/
#ifndef PDP11_CPUMOD_H_
#define PDP11_CPUMOD_H_ 0
#define SOP_1103 (BUS_Q)
#define OPT_1103 (OPT_EIS|OPT_FIS)
#define PSW_1103 0000377
#define SOP_1104 (BUS_U)
#define OPT_1104 0
#define PSW_1104 0000377
#define SOP_1105 (BUS_U)
#define OPT_1105 0
#define PSW_1105 0000377
#define SOP_1120 (BUS_U)
#define OPT_1120 0
#define PSW_1120 0000377
#define SOP_1123 (BUS_Q|OPT_EIS|OPT_FPP|OPT_MMU)
#define OPT_1123 (OPT_FPP|OPT_CIS)
#define PSW_F 0170777
#define PAR_F 0177777
#define PDR_F 0077516
#define MM0_F 0160157
#define MM3_F 0000060
#define SOP_1123P (BUS_Q|OPT_EIS|OPT_FPP|OPT_MMU)
#define OPT_1123P (OPT_FPP|OPT_CIS)
#define SOP_1124 (BUS_U|OPT_EIS|OPT_FPP|OPT_MMU|OPT_UBM)
#define OPT_1124 (OPT_FPP|OPT_CIS)
#define SOP_1134 (BUS_U|OPT_EIS|OPT_MMU)
#define OPT_1134 (OPT_FPP)
#define PSW_1134 0170377
#define PAR_1134 0007777
#define PDR_1134 0077516
#define MM0_1134 0160557
#define SOP_1140 (BUS_U|OPT_EIS|OPT_MMU)
#define OPT_1140 (OPT_FIS)
#define PSW_1140 0170377
#define PAR_1140 0007777
#define PDR_1140 0077516
#define MM0_1140 0160557
#define SOP_1144 (BUS_U|OPT_EIS|OPT_FPP|OPT_MMU|OPT_UBM)
#define OPT_1144 (OPT_FPP|OPT_CIS)
#define PSW_1144 0170777
#define PAR_1144 0177777
#define PDR_1144 0177516
#define MM0_1144 0160557
#define MM3_1144 0000077
#define SOP_1145 (BUS_U|OPT_EIS|OPT_FPP|OPT_MMU|OPT_RH11)
#define OPT_1145 (OPT_FPP)
#define PSW_1145 0174377
#define PAR_1145 0007777
#define PDR_1145 0077717
#define MM0_1145 0171777
#define MM3_1145 0000007
#define SOP_1160 (BUS_U|OPT_EIS|OPT_FPP|OPT_MMU)
#define OPT_1160 0
#define PSW_1160 0170377
#define PAR_1160 0007777
#define PDR_1160 0077516
#define MM0_1160 0160557
#define SOP_1170 (BUS_U|OPT_EIS|OPT_FPP|OPT_MMU|OPT_UBM)
#define OPT_1170 (OPT_FPP|OPT_RH11)
#define PSW_1170 0174377
#define PAR_1170 0177777
#define PDR_1170 0077717
#define MM0_1170 0171777
#define MM3_1170 0000067
#define SOP_1173 (BUS_Q|OPT_EIS|OPT_FPP|OPT_MMU)
#define OPT_1173 (OPT_CIS)
#define PSW_J 0174777
#define PAR_J 0177777
#define PDR_J 0177516
#define MM0_J 0160177
#define MM3_J 0000077
#define SOP_1153 (BUS_Q|OPT_EIS|OPT_FPP|OPT_MMU)
#define OPT_1153 (OPT_CIS)
#define SOP_1173B (BUS_Q|OPT_EIS|OPT_FPP|OPT_MMU)
#define OPT_1173B (OPT_CIS)
#define SOP_1183 (BUS_Q|OPT_EIS|OPT_FPP|OPT_MMU)
#define OPT_1183 (OPT_CIS)
#define SOP_1184 (BUS_U|OPT_EIS|OPT_FPP|OPT_MMU|OPT_UBM|OPT_RH11)
#define OPT_1184 (OPT_CIS)
#define SOP_1193 (BUS_Q|OPT_EIS|OPT_FPP|OPT_MMU)
#define OPT_1193 (OPT_CIS)
#define SOP_1194 (BUS_U|OPT_EIS|OPT_FPP|OPT_MMU|OPT_UBM|OPT_RH11)
#define OPT_1194 (OPT_CIS)
#define MOD_MAX 20
/* MFPT codes */
#define MFPT_44 1
#define MFPT_F 3
#define MFPT_T 4
#define MFPT_J 5
/* KDF11B specific register */
#define PCRFB_RW 0037477 /* page ctrl reg */
#define CDRFB_RD 0000377 /* config reg */
#define CDRFB_WR 0000017
/* KT24 Unibus map specific registers */
#define LMAL_RD 0177777 /* last mapped low */
#define LMAH_RD 0000177 /* last mapped high */
#define LMAH_WR 0000100
/* 11/44 specific registers */
#define CCR44_RD 0033315 /* cache control */
#define CCR44_WR 0003315
#define CMR44_RD 0177437 /* cache maint */
#define CMR44_WR 0000037
#define CPUE44_BUSE 0004000
/* 11/60 specific registers */
#define WCS60_RD 0161776 /* WCS control */
#define WCS60_WR 0061676
#define MEME60_RD 0100340 /* memory error */
#define CCR60_RD 0000315 /* cache control */
#define CCR60_WR 0000115
#define MBRK60_WR 0007777 /* microbreak */
#define CPUE60_RD (CPUE_ODD|CPUE_TMO|CPUE_RED)
/* 11/70 specific registers */
#define MBRK70_WR 0000377 /* microbreak */
/* J11 specific registers */
/* Maintenance register */
#define MAINT_V_UQ 9 /* Q/U flag */
#define MAINT_Q (0 << MAINT_V_UQ) /* Qbus */
#define MAINT_U (1 << MAINT_V_UQ)
#define MAINT_V_FPA 8 /* FPA flag */
#define MAINT_NOFPA (0 << MAINT_V_FPA)
#define MAINT_FPA (1 << MAINT_V_FPA)
#define MAINT_V_TYP 4 /* system type */
#define MAINT_KDJA (1 << MAINT_V_TYP) /* KDJ11A */
#define MAINT_KDJB (2 << MAINT_V_TYP) /* KDJ11B */
#define MAINT_KDJD (4 << MAINT_V_TYP) /* KDJ11D */
#define MAINT_KDJE (5 << MAINT_V_TYP) /* KDJ11E */
#define MAINT_V_HTRAP 3 /* trap 4 on HALT */
#define MAINT_HTRAP (1 << MAINT_V_HTRAP)
#define MAINT_V_POM 1 /* power on option */
#define MAINT_POODT (0 << MAINT_V_POM) /* power up ODT */
#define MAINT_POROM (2 << MAINT_V_POM) /* power up ROM */
#define MAINT_V_BPOK 0 /* power OK */
#define MAINT_BPOK (1 << MAINT_V_BPOK)
/* KDJ11B control */
#define CSRJB_RD 0177767
#define CSRJB_WR 0037767
#define CSRJ_LTCI 0020000 /* force LTC int */
#define CSRJ_LTCD 0010000 /* disable LTC reg */
#define CSRJ_V_LTCSEL 10
#define CSRJ_M_LTCSEL 03
#define CSRJ_LTCSEL(x) (((x) >> CSRJ_V_LTCSEL) & CSRJ_M_LTCSEL)
#define CSRJ_HBREAK 0001000 /* halt on break */
#define PCRJB_RW 0077176 /* page ctrl reg */
#define CDRJB_RD 0000377 /* config register */
#define CDRJB_WR 0000377
/* KDJ11D control */
#define CSRJD_RD 0157777 /* native register */
#define CSRJD_WR 0000377
#define CSRJD_15M 0040000 /* 1.5M mem on board */
/* KDJ11E control */
#define CSRJE_RD 0137360 /* control reg */
#define CSRJE_WR 0037370
#define PCRJE_RW 0177376 /* page ctrl reg */
#define CDRJE_RD 0000377 /* config register */
#define CDRJE_WR 0000077
#define ASRJE_RW 0030462 /* additional status */
#define ASRJE_V_TOY 8
#define ASRJE_TOY (1u << ASRJE_V_TOY) /* TOY serial bit */
#define ASRJE_TOYBIT(x) (((x) >> ASRJE_V_TOY) & 1)
/* KDJ11E TOY clock */
#define TOY_HSEC 0
#define TOY_SEC 1
#define TOY_MIN 2
#define TOY_HR 3
#define TOY_DOW 4
#define TOY_DOM 5
#define TOY_MON 6
#define TOY_YR 7
#define TOY_LNT 8
/* KTJ11B Unibus map */
#define DCRKTJ_RD 0100616 /* diag control */
#define DCRKTJ_WR 0000416
#define DDRKTJ_RW 0177777 /* diag data */
#define MCRKTJ_RD 0000377 /* control register */
#define MCRKTJ_WR 0000177
/* Data tables */
struct cpu_table {
char *name; /* model name */
uint32 std; /* standard flags */
uint32 opt; /* set/clear flags */
uint32 maxm; /* max memory */
uint32 psw; /* PSW mask */
uint32 mfpt; /* MFPT code */
uint32 par; /* PAR mask */
uint32 pdr; /* PDR mask */
uint32 mm0; /* MMR0 mask */
uint32 mm3; /* MMR3 mask */
};
typedef struct cpu_table CPUTAB;
struct conf_table {
uint32 cpum;
uint32 optm;
DIB *dib;
};
typedef struct conf_table CNFTAB;
/* Prototypes */
t_stat cpu_set_model (UNIT *uptr, int32 val, char *cptr, void *desc);
t_stat cpu_show_model (FILE *st, UNIT *uptr, int32 val, void *desc);
t_stat cpu_set_opt (UNIT *uptr, int32 val, char *cptr, void *desc);
t_stat cpu_clr_opt (UNIT *uptr, int32 val, char *cptr, void *desc);
t_stat cpu_set_size (UNIT *uptr, int32 val, char *cptr, void *desc);
t_stat cpu_set_bus (int32 opt);
#endif