271 lines
12 KiB
C
271 lines
12 KiB
C
/* hp2100_cpu0.c: HP 1000 user microcode and unimplemented instruction set stubs
|
|
|
|
Copyright (c) 2006-2012, 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.
|
|
|
|
CPU0 User microcode and unimplemented firmware options
|
|
|
|
09-May-12 JDB Separated assignments from conditional expressions
|
|
04-Nov-10 JDB Removed DS note regarding PIF card (is now implemented)
|
|
18-Sep-08 JDB .FLUN and self-tests for VIS and SIGNAL are NOP if not present
|
|
11-Sep-08 JDB Moved microcode function prototypes to hp2100_cpu1.h
|
|
05-Sep-08 JDB Removed option-present tests (now in UIG dispatchers)
|
|
Added "user microcode" dispatcher for unclaimed instructions
|
|
26-Feb-08 HV Removed and implemented "cpu_vis" and "cpu_signal"
|
|
22-Nov-07 JDB Removed and implemented "cpu_rte_ema"
|
|
12-Nov-07 JDB Removed and implemented "cpu_rte_vma" and "cpu_rte_os"
|
|
01-Dec-06 JDB Removed and implemented "cpu_sis".
|
|
26-Sep-06 JDB Created
|
|
|
|
Primary references:
|
|
- HP 1000 M/E/F-Series Computers Technical Reference Handbook
|
|
(5955-0282, Mar-1980)
|
|
- HP 1000 M/E/F-Series Computers Engineering and Reference Documentation
|
|
(92851-90001, Mar-1981)
|
|
- Macro/1000 Reference Manual (92059-90001, Dec-1992)
|
|
|
|
Additional references are listed with the associated firmware
|
|
implementations, as are the HP option model numbers pertaining to the
|
|
applicable CPUs.
|
|
|
|
|
|
This file contains template simulations for the firmware options that have
|
|
not yet been implemented. When a given firmware option is implemented, it
|
|
should be moved out of this file and into another (or its own, depending on
|
|
complexity).
|
|
|
|
It also contains a user-microprogram dispatcher to allow simulation of
|
|
site-specific firmware. All UIG instructions unclaimed by installed firmware
|
|
options are directed here and may be simulated by writing the appropriate
|
|
code.
|
|
*/
|
|
|
|
|
|
#include "hp2100_defs.h"
|
|
#include "hp2100_cpu.h"
|
|
#include "hp2100_cpu1.h"
|
|
|
|
|
|
/* Distributed System.
|
|
|
|
Distributed System firmware was provided with the HP 91740A DS/1000 product
|
|
for use with the HP 12771A (12665A) Serial Interface and 12773A Modem
|
|
Interface system interconnection kits. Firmware permitted high-speed
|
|
transfers with minimum impact to the processor. The advent of the
|
|
"intelligent" 12794A and 12825A HDLC cards, the 12793A and 12834A Bisync
|
|
cards, and the 91750A DS-1000/IV software obviated the need for CPU firmware,
|
|
as essentially the firmware was moved onto the I/O cards.
|
|
|
|
Primary documentation for the DS instructions has not been located. However,
|
|
examination of the DS/1000 sources reveals that two instruction were used by
|
|
the DVA65 Serial Interface driver (91740-18071) and placed in the trap cells
|
|
of the communications interfaces. Presumably they handled interrupts from
|
|
the cards.
|
|
|
|
Implementation of the DS instructions will also require simulation of the
|
|
12665A Hardwired Serial Data Interface Card.
|
|
|
|
Option implementation by CPU was as follows:
|
|
|
|
2114 2115 2116 2100 1000-M 1000-E 1000-F
|
|
------ ------ ------ ------ ------ ------ ------
|
|
N/A N/A N/A N/A 91740A 91740B 91740B
|
|
|
|
The routines are mapped to instruction codes as follows:
|
|
|
|
Instr. 1000-M 1000-E/F Description
|
|
------ ------ -------- ----------------------------------------------
|
|
105520 105300 "Open loop" (trap cell handler)
|
|
105521 105301 "Closed loop" (trap cell handler)
|
|
105522 105302 [unknown]
|
|
[test] 105524 105304 [self test]
|
|
-- 105310 7974 boot loader ROM extension
|
|
|
|
Notes:
|
|
|
|
1. The E/F-Series opcodes were moved from 105340-357 to 105300-317 at
|
|
revision 1813.
|
|
|
|
2. DS/1000 ROM data are available from Bitsavers.
|
|
|
|
Additional references (documents unavailable):
|
|
- HP 91740A M-Series Distributed System (DS/1000) Firmware Installation
|
|
Manual (91740-90007).
|
|
- HP 91740B Distributed System (DS/1000) Firmware Installation Manual
|
|
(91740-90009).
|
|
*/
|
|
|
|
static const OP_PAT op_ds[16] = {
|
|
OP_N, OP_N, OP_N, OP_N, /* --- --- --- --- */
|
|
OP_N, OP_N, OP_N, OP_N, /* --- --- --- --- */
|
|
OP_N, OP_N, OP_N, OP_N, /* --- --- --- --- */
|
|
OP_N, OP_N, OP_N, OP_N /* --- --- --- --- */
|
|
};
|
|
|
|
t_stat cpu_ds (uint32 IR, uint32 intrq)
|
|
{
|
|
t_stat reason = SCPE_OK;
|
|
OPS op;
|
|
uint32 entry;
|
|
|
|
entry = IR & 017; /* mask to entry point */
|
|
|
|
if (op_ds [entry] != OP_N) {
|
|
reason = cpu_ops (op_ds[entry], op, intrq); /* get instruction operands */
|
|
if (reason != SCPE_OK) /* did the evaluation fail? */
|
|
return reason; /* return the reason for failure */
|
|
}
|
|
|
|
switch (entry) { /* decode IR<3:0> */
|
|
|
|
default: /* others undefined */
|
|
reason = stop_inst;
|
|
}
|
|
|
|
return reason;
|
|
}
|
|
|
|
|
|
/* User firmware dispatcher.
|
|
|
|
All UIG instructions unclaimed by installed firmware options are directed
|
|
here. User- or site-specific firmware may be simulated by dispatching to the
|
|
appropriate simulator routine. Unimplemented instructions should return
|
|
"stop_inst" to cause a simulator stop if enabled.
|
|
|
|
Implementation notes:
|
|
|
|
1. This routine may be passed any opcode in the ranges 101400-101737 and
|
|
105000-105737. The 10x740-777 range is dedicated to the EIG instructions
|
|
and is unavailable for user microprograms.
|
|
|
|
2. HP operating systems and subsystems depend on the following instructions
|
|
to execute as NOP and return success if the corresponding firmware is not
|
|
installed:
|
|
|
|
105226 -- Fast FORTRAN Processor .FLUN instruction
|
|
105355 -- RTE-6/VM OS self-test instruction
|
|
105477 -- Vector Instruction Set self-test
|
|
105617 -- SIGNAL/1000 self-test
|
|
|
|
These instructions are executed to determine firmware configuration
|
|
dynamically. If you use any of these opcodes for your own use, be aware
|
|
that certain HP programs may fail.
|
|
|
|
3. User microprograms occupied one or more firmware modules, each containing
|
|
16 potential instruction entry points. A skeleton dispatcher for the 32
|
|
possible modules is implemented below, along with a sample module.
|
|
*/
|
|
|
|
t_stat cpu_user (uint32 IR, uint32 intrq)
|
|
{
|
|
t_stat reason = SCPE_OK;
|
|
|
|
if (UNIT_CPU_TYPE == UNIT_TYPE_211X) /* 2116/15/14 CPU? */
|
|
return stop_inst; /* user microprograms not supported */
|
|
|
|
switch (IR) {
|
|
case 0105226: /* firmware detection: FFP .FLUN */
|
|
case 0105355: /* firmware detection: RTE-6/VM OS self-test */
|
|
case 0105477: /* firmware detection: VIS self-test */
|
|
case 0105617: /* firmware detection: SIGNAL/1000 self-test */
|
|
return SCPE_OK; /* execute as NOP */
|
|
}
|
|
|
|
switch ((IR >> 4) & 037) { /* decode IR<8:4> */
|
|
|
|
/* case 000: ** 105000-105017 */
|
|
/* return cpu_user_00 (IR, intrq); ** uncomment to handle instruction */
|
|
|
|
/* case 001: ** 105020-105037 */
|
|
/* return cpu_user_01 (IR, intrq); ** uncomment to handle instruction */
|
|
|
|
/* case 0nn: ** other cases as needed */
|
|
/* return cpu_user_nn (IR, intrq); ** uncomment to handle instruction */
|
|
|
|
case 020: /* 10x400-10x417 */
|
|
return cpu_user_20 (IR, intrq); /* call sample dispatcher */
|
|
|
|
/* case 021: ** 10x420-10x437 */
|
|
/* return cpu_user_21 (IR, intrq); ** uncomment to handle instruction */
|
|
|
|
/* case 0nn: ** other cases as needed */
|
|
/* return cpu_user_nn (IR, intrq); ** uncomment to handle instruction */
|
|
|
|
default: /* others undefined */
|
|
reason = stop_inst;
|
|
}
|
|
|
|
return reason;
|
|
}
|
|
|
|
|
|
/* Example user microprogram simulator.
|
|
|
|
User- or site-specific firmware may be simulated by writing the appropriate
|
|
code below. Unimplemented instructions should return "stop_inst" to cause a
|
|
simulator stop if enabled.
|
|
|
|
For information on the operand patterns used in the "op_user" array, see the
|
|
comments preceding the "cpu_ops" routine in "hp2100_cpu1.c" and the "operand
|
|
processing encoding" constants in "hp2100_cpu1.h".
|
|
*/
|
|
|
|
static const OP_PAT op_user_20[16] = {
|
|
OP_N, OP_N, OP_N, OP_N, /* --- --- --- --- */
|
|
OP_N, OP_N, OP_N, OP_N, /* --- --- --- --- */
|
|
OP_N, OP_N, OP_N, OP_N, /* --- --- --- --- */
|
|
OP_N, OP_N, OP_N, OP_N /* --- --- --- --- */
|
|
};
|
|
|
|
t_stat cpu_user_20 (uint32 IR, uint32 intrq)
|
|
{
|
|
t_stat reason = SCPE_OK;
|
|
OPS op;
|
|
uint32 entry;
|
|
|
|
entry = IR & 017; /* mask to entry point */
|
|
|
|
if (op_user_20 [entry] != OP_N) {
|
|
reason = cpu_ops (op_user_20 [entry], op, intrq); /* get instruction operands */
|
|
if (reason != SCPE_OK) /* did the evaluation fail? */
|
|
return reason; /* return the reason for failure */
|
|
}
|
|
|
|
switch (entry) { /* decode IR<4:0> */
|
|
|
|
case 000: /* 10x400 */
|
|
/* break; ** uncomment to handle instruction */
|
|
|
|
case 001: /* 10x401 */
|
|
/* break; ** uncomment to handle instruction */
|
|
|
|
/* case 0nn: ** other cases as needed */
|
|
/* break; ** uncomment to handle instruction */
|
|
|
|
default: /* others undefined */
|
|
reason = stop_inst;
|
|
}
|
|
|
|
return reason;
|
|
}
|