The makefile now works for Linux and most Unix's. Howevr, for Solaris and MacOS, you must first export the OSTYPE environment variable: > export OSTYPE > make Otherwise, you will get build errors. 1. New Features 1.1 3.8-0 1.1.1 SCP and Libraries - BREAK, NOBREAK, and SHOW BREAK with no argument will set, clear, and show (respectively) a breakpoint at the current PC. 1.1.2 GRI - Added support for the GRI-99 processor. 1.1.3 HP2100 - Added support for the BACI terminal interface. - Added support for RTE OS/VMA/EMA, SIGNAL, VIS firmware extensions. 1.1.4 Nova - Added support for 64KW memory (implemented in third-party CPU's). 1.1.5 PDP-11 - Added support for DC11, RC11, KE11A, KG11A. - Added modem control support for DL11. - Added ASCII character support for all 8b devices. 1.2 3.8-1 1.2.1 SCP and libraries - Added capability to set line connection order for terminal multiplexers. 1.2.2 HP2100 - Added support for 12620A/12936A privileged interrupt fence. - Added support for 12792C eight-channel asynchronous multiplexer. 2. Bugs Fixed Please see the revision history on http://simh.trailing-edge.com or in the source module sim_rev.h.
315 lines
16 KiB
C
315 lines
16 KiB
C
/* hp2100_cpu1.h: HP 2100/1000 firmware dispatcher definitions
|
|
|
|
Copyright (c) 2006-2008, J. David Bryan
|
|
|
|
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
|
|
THE AUTHOR 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 the author shall not
|
|
be used in advertising or otherwise to promote the sale, use or other dealings
|
|
in this Software without prior written authorization from the author.
|
|
|
|
11-Sep-08 JDB Moved microcode function prototypes here
|
|
30-Apr-08 JDB Corrected OP_AFF to OP_AAFF for SIGNAL/1000
|
|
Removed unused operand patterns
|
|
23-Feb-08 HV Added more OP_* for SIGNAL/1000 and VIS
|
|
28-Nov-07 JDB Added fprint_ops, fprint_regs for debug printouts
|
|
19-Oct-07 JDB Revised OP_KKKAKK operand profile to OP_CCCACC for $LOC
|
|
16-Oct-06 JDB Generalized operands for F-Series FP types
|
|
26-Sep-06 JDB Split from hp2100_cpu1.c
|
|
*/
|
|
|
|
#ifndef _HP2100_CPU1_H_
|
|
#define _HP2100_CPU1_H_
|
|
|
|
|
|
/* Register print encoding */
|
|
|
|
#define REG_COUNT 9 /* count of print flags */
|
|
|
|
#define REG_CIR (1 << 0) /* print central interrupt register */
|
|
#define REG_A (1 << 1) /* print A register */
|
|
#define REG_B (1 << 2) /* print B register */
|
|
#define REG_E (1 << 3) /* print E register */
|
|
#define REG_X (1 << 4) /* print X register */
|
|
#define REG_Y (1 << 5) /* print Y register */
|
|
#define REG_O (1 << 6) /* print O register */
|
|
#define REG_P (1 << 7) /* print P register */
|
|
#define REG_P_REL (1 << 8) /* print P register as relative */
|
|
|
|
|
|
/* Operand processing encoding */
|
|
|
|
/* Base operand types. Note that all address encodings must be grouped together
|
|
after OP_ADR.
|
|
*/
|
|
|
|
#define OP_NUL 0 /* no operand */
|
|
#define OP_IAR 1 /* 1-word int in A reg */
|
|
#define OP_JAB 2 /* 2-word int in A/B regs */
|
|
#define OP_FAB 3 /* 2-word FP const in A/B regs */
|
|
#define OP_CON 4 /* inline 1-word constant */
|
|
#define OP_VAR 5 /* inline 1-word variable */
|
|
|
|
#define OP_ADR 6 /* inline address */
|
|
#define OP_ADK 7 /* addr of 1-word int const */
|
|
#define OP_ADD 8 /* addr of 2-word int const */
|
|
#define OP_ADF 9 /* addr of 2-word FP const */
|
|
#define OP_ADX 10 /* addr of 3-word FP const */
|
|
#define OP_ADT 11 /* addr of 4-word FP const */
|
|
#define OP_ADE 12 /* addr of 5-word FP const */
|
|
|
|
#define OP_N_FLAGS 4 /* number of bits needed for flags */
|
|
#define OP_M_FLAGS ((1 << OP_N_FLAGS) - 1) /* mask for flag bits */
|
|
|
|
#define OP_N_F (8 * sizeof (uint32) / OP_N_FLAGS) /* max number of op fields */
|
|
|
|
#define OP_V_F1 (0 * OP_N_FLAGS) /* 1st operand field */
|
|
#define OP_V_F2 (1 * OP_N_FLAGS) /* 2nd operand field */
|
|
#define OP_V_F3 (2 * OP_N_FLAGS) /* 3rd operand field */
|
|
#define OP_V_F4 (3 * OP_N_FLAGS) /* 4th operand field */
|
|
#define OP_V_F5 (4 * OP_N_FLAGS) /* 5th operand field */
|
|
#define OP_V_F6 (5 * OP_N_FLAGS) /* 6th operand field */
|
|
#define OP_V_F7 (6 * OP_N_FLAGS) /* 7th operand field */
|
|
#define OP_V_F8 (7 * OP_N_FLAGS) /* 8th operand field */
|
|
|
|
/* Operand processing patterns */
|
|
|
|
#define OP_N (OP_NUL << OP_V_F1)
|
|
#define OP_I (OP_IAR << OP_V_F1)
|
|
#define OP_J (OP_JAB << OP_V_F1)
|
|
#define OP_R (OP_FAB << OP_V_F1)
|
|
#define OP_C (OP_CON << OP_V_F1)
|
|
#define OP_V (OP_VAR << OP_V_F1)
|
|
#define OP_A (OP_ADR << OP_V_F1)
|
|
#define OP_K (OP_ADK << OP_V_F1)
|
|
#define OP_D (OP_ADD << OP_V_F1)
|
|
#define OP_X (OP_ADX << OP_V_F1)
|
|
#define OP_T (OP_ADT << OP_V_F1)
|
|
#define OP_E (OP_ADE << OP_V_F1)
|
|
|
|
#define OP_IA ((OP_IAR << OP_V_F1) | (OP_ADR << OP_V_F2))
|
|
#define OP_JA ((OP_JAB << OP_V_F1) | (OP_ADR << OP_V_F2))
|
|
#define OP_JD ((OP_JAB << OP_V_F1) | (OP_ADD << OP_V_F2))
|
|
#define OP_RC ((OP_FAB << OP_V_F1) | (OP_CON << OP_V_F2))
|
|
#define OP_RK ((OP_FAB << OP_V_F1) | (OP_ADK << OP_V_F2))
|
|
#define OP_RF ((OP_FAB << OP_V_F1) | (OP_ADF << OP_V_F2))
|
|
#define OP_CV ((OP_CON << OP_V_F1) | (OP_VAR << OP_V_F2))
|
|
#define OP_AC ((OP_ADR << OP_V_F1) | (OP_CON << OP_V_F2))
|
|
#define OP_AA ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2))
|
|
#define OP_AK ((OP_ADR << OP_V_F1) | (OP_ADK << OP_V_F2))
|
|
#define OP_AX ((OP_ADR << OP_V_F1) | (OP_ADX << OP_V_F2))
|
|
#define OP_AT ((OP_ADR << OP_V_F1) | (OP_ADT << OP_V_F2))
|
|
#define OP_KV ((OP_ADK << OP_V_F1) | (OP_VAR << OP_V_F2))
|
|
#define OP_KA ((OP_ADK << OP_V_F1) | (OP_ADR << OP_V_F2))
|
|
#define OP_KK ((OP_ADK << OP_V_F1) | (OP_ADK << OP_V_F2))
|
|
|
|
#define OP_IIF ((OP_IAR << OP_V_F1) | (OP_IAR << OP_V_F2) | \
|
|
(OP_ADF << OP_V_F3))
|
|
|
|
#define OP_IAT ((OP_IAR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADT << OP_V_F3))
|
|
|
|
#define OP_CVA ((OP_CON << OP_V_F1) | (OP_VAR << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3))
|
|
|
|
#define OP_AAA ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3))
|
|
|
|
#define OP_AAF ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADF << OP_V_F3))
|
|
|
|
#define OP_AAX ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADX << OP_V_F3))
|
|
|
|
#define OP_AAT ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADT << OP_V_F3))
|
|
|
|
#define OP_AKA ((OP_ADR << OP_V_F1) | (OP_ADK << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3))
|
|
|
|
#define OP_AKK ((OP_ADR << OP_V_F1) | (OP_ADK << OP_V_F2) | \
|
|
(OP_ADK << OP_V_F3))
|
|
|
|
#define OP_AXX ((OP_ADR << OP_V_F1) | (OP_ADX << OP_V_F2) | \
|
|
(OP_ADX << OP_V_F3))
|
|
|
|
#define OP_ATT ((OP_ADR << OP_V_F1) | (OP_ADT << OP_V_F2) | \
|
|
(OP_ADT << OP_V_F3))
|
|
|
|
#define OP_AEE ((OP_ADR << OP_V_F1) | (OP_ADE << OP_V_F2) | \
|
|
(OP_ADE << OP_V_F3))
|
|
|
|
#define OP_AAXX ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADX << OP_V_F3) | (OP_ADX << OP_V_F4))
|
|
|
|
#define OP_AAFF ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADF << OP_V_F3) | (OP_ADF << OP_V_F4))
|
|
|
|
#define OP_AAKK ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADK << OP_V_F3) | (OP_ADK << OP_V_F4))
|
|
|
|
#define OP_KKKK ((OP_ADK << OP_V_F1) | (OP_ADK << OP_V_F2) | \
|
|
(OP_ADK << OP_V_F3) | (OP_ADK << OP_V_F4))
|
|
|
|
#define OP_AAAKK ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3) | (OP_ADK << OP_V_F4) | \
|
|
(OP_ADK << OP_V_F5))
|
|
|
|
#define OP_AKAKK ((OP_ADR << OP_V_F1) | (OP_ADK << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3) | (OP_ADK << OP_V_F4) | \
|
|
(OP_ADK << OP_V_F5))
|
|
|
|
#define OP_AAACCC ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3) | (OP_CON << OP_V_F4) | \
|
|
(OP_CON << OP_V_F5) | (OP_CON << OP_V_F6))
|
|
|
|
#define OP_AAFFKK ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADF << OP_V_F3) | (OP_ADF << OP_V_F4) | \
|
|
(OP_ADK << OP_V_F5) | (OP_ADK << OP_V_F6))
|
|
|
|
#define OP_AAKAKK ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADK << OP_V_F3) | (OP_ADR << OP_V_F4) | \
|
|
(OP_ADK << OP_V_F5) | (OP_ADK << OP_V_F6))
|
|
|
|
#define OP_CATAKK ((OP_CON << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADT << OP_V_F3) | (OP_ADR << OP_V_F4) | \
|
|
(OP_ADK << OP_V_F5) | (OP_ADK << OP_V_F6))
|
|
|
|
#define OP_CCCACC ((OP_CON << OP_V_F1) | (OP_CON << OP_V_F2) | \
|
|
(OP_CON << OP_V_F3) | (OP_ADR << OP_V_F4) | \
|
|
(OP_CON << OP_V_F5) | (OP_CON << OP_V_F6))
|
|
|
|
#define OP_AAAFFKK ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3) | (OP_ADF << OP_V_F4) | \
|
|
(OP_ADF << OP_V_F5) | (OP_ADK << OP_V_F6) | \
|
|
(OP_ADK << OP_V_F7))
|
|
|
|
#define OP_AKAKAKK ((OP_ADR << OP_V_F1) | (OP_ADK << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3) | (OP_ADK << OP_V_F4) | \
|
|
(OP_ADR << OP_V_F5) | (OP_ADK << OP_V_F6) | \
|
|
(OP_ADK << OP_V_F7))
|
|
|
|
#define OP_AAKAKAKK ((OP_ADR << OP_V_F1) | (OP_ADR << OP_V_F2) | \
|
|
(OP_ADK << OP_V_F3) | (OP_ADR << OP_V_F4) | \
|
|
(OP_ADK << OP_V_F5) | (OP_ADR << OP_V_F6) | \
|
|
(OP_ADK << OP_V_F7) | (OP_ADK << OP_V_F8))
|
|
|
|
#define OP_CCACACCA ((OP_CON << OP_V_F1) | (OP_CON << OP_V_F2) | \
|
|
(OP_ADR << OP_V_F3) | (OP_CON << OP_V_F4) | \
|
|
(OP_ADR << OP_V_F5) | (OP_CON << OP_V_F6) | \
|
|
(OP_CON << OP_V_F7) | (OP_ADR << OP_V_F8))
|
|
|
|
|
|
/* Operand precisions (compatible with F-Series FPP):
|
|
|
|
- S = 1-word integer
|
|
- D = 2-word integer
|
|
- F = 2-word single-precision floating-point
|
|
- X = 3-word extended-precision floating-point
|
|
- T = 4-word double-precision floating-point
|
|
- E = 5-word expanded-exponent floating-point
|
|
- A = null operand (operand is in FPP accumulator)
|
|
|
|
5-word floating-point numbers are supported by the F-Series Floating-Point
|
|
Processor hardware, but the instruction codes are not documented.
|
|
|
|
Note that ordering is important, as we depend on the "fp" type codes to
|
|
reflect the number of words needed.
|
|
*/
|
|
|
|
typedef enum { in_s, in_d, fp_f, fp_x, fp_t, fp_e, fp_a } OPSIZE;
|
|
|
|
|
|
/* Conversion from operand size to word count */
|
|
|
|
#define TO_COUNT(s) ((s == fp_a) ? 0 : (uint32) (s + (s < fp_f)))
|
|
|
|
|
|
/* HP in-memory representation of a packed floating-point number.
|
|
Actual value will use two, three, four, or five words, as needed.
|
|
*/
|
|
|
|
typedef uint16 FPK[5];
|
|
|
|
|
|
/* Operand processing types.
|
|
|
|
NOTE: Microsoft VC++ 6.0 does not support the C99 standard, so we cannot
|
|
initialize unions by arbitrary variant ("designated initializers").
|
|
Therefore, we follow the C90 form of initializing via the first named
|
|
variant. The FPK variant must appear first in the OP structure, as we define
|
|
a number of FPK constants in other modules.
|
|
*/
|
|
|
|
typedef union { /* general operand */
|
|
FPK fpk; /* floating-point value */
|
|
uint16 word; /* 16-bit integer */
|
|
uint32 dword; /* 32-bit integer */
|
|
} OP;
|
|
|
|
typedef OP OPS[OP_N_F]; /* operand array */
|
|
|
|
typedef uint32 OP_PAT; /* operand pattern */
|
|
|
|
|
|
/* Microcode dispatcher functions (grouped by cpu module number) */
|
|
|
|
extern t_stat cpu_ds (uint32 IR, uint32 intrq); /* [0] Distributed System stub */
|
|
extern t_stat cpu_user (uint32 IR, uint32 intrq); /* [0] User firmware dispatcher */
|
|
extern t_stat cpu_user_20 (uint32 IR, uint32 intrq); /* [0] Module 20 user microprograms stub */
|
|
|
|
extern t_stat cpu_eau (uint32 IR, uint32 intrq); /* [1] EAU group simulator */
|
|
extern t_stat cpu_uig_0 (uint32 IR, uint32 intrq, uint32 iotrap); /* [1] UIG group 0 dispatcher */
|
|
extern t_stat cpu_uig_1 (uint32 IR, uint32 intrq, uint32 iotrap); /* [1] UIG group 1 dispatcher */
|
|
|
|
#if !defined (HAVE_INT64) /* int64 support unavailable */
|
|
extern t_stat cpu_fp (uint32 IR, uint32 intrq); /* [2] Firmware Floating Point */
|
|
#endif
|
|
extern t_stat cpu_dms (uint32 IR, uint32 intrq); /* [2] Dynamic mapping system */
|
|
extern t_stat cpu_eig (uint32 IR, uint32 intrq); /* [2] Extended instruction group */
|
|
extern t_stat cpu_iop (uint32 IR, uint32 intrq); /* [2] 2000 I/O Processor */
|
|
|
|
extern t_stat cpu_ffp (uint32 IR, uint32 intrq); /* [3] Fast FORTRAN Processor */
|
|
extern t_stat cpu_dbi (uint32 IR, uint32 intrq); /* [3] Double-Integer instructions */
|
|
|
|
#if defined (HAVE_INT64) /* int64 support available */
|
|
extern t_stat cpu_fpp (uint32 IR, uint32 intrq); /* [4] Floating Point Processor */
|
|
extern t_stat cpu_sis (uint32 IR, uint32 intrq); /* [4] Scientific Instruction Set */
|
|
#endif
|
|
|
|
extern t_stat cpu_rte_vma (uint32 IR, uint32 intrq); /* [5] RTE-6 VMA */
|
|
extern t_stat cpu_rte_ema (uint32 IR, uint32 intrq); /* [5] RTE-IV EMA */
|
|
|
|
extern t_stat cpu_rte_os (uint32 IR, uint32 intrq, uint32 iotrap); /* [6] RTE-6 OS */
|
|
|
|
#if defined (HAVE_INT64) /* int64 support available */
|
|
extern t_stat cpu_vis (uint32 IR, uint32 intrq); /* [7] Vector Instruction Set */
|
|
extern t_stat cpu_signal (uint32 IR, uint32 intrq); /* [7] SIGNAL/1000 Instructions */
|
|
#endif
|
|
|
|
|
|
/* Microcode helper functions */
|
|
|
|
OP ReadOp (uint32 va, OPSIZE precision); /* generalized operand read */
|
|
void WriteOp (uint32 va, OP operand, OPSIZE precision); /* generalized operand write */
|
|
t_stat cpu_ops (OP_PAT pattern, OPS op, uint32 irq); /* operand processor */
|
|
|
|
void fprint_ops (OP_PAT pattern, OPS op); /* debug print operands */
|
|
void fprint_regs (char *caption, uint32 regs, uint32 base); /* debug print CPU registers */
|
|
|
|
#endif
|