mirror of
https://github.com/open-simh/simh.git
synced 2026-01-28 13:00:07 +00:00
HP3000: Release 9
This commit is contained in:
committed by
Mark Pizzolato
parent
0e119d70bb
commit
6da2ce719e
@@ -1,6 +1,6 @@
|
||||
SIMH/HP 3000 DIAGNOSTICS PERFORMANCE
|
||||
====================================
|
||||
Last update: 2016-12-01
|
||||
Last update: 2020-10-22
|
||||
|
||||
|
||||
The HP 32230 diagnostic suite has been run against the SIMH HP 3000 simulation.
|
||||
@@ -52,7 +52,7 @@ The results of the diagnostic runs are summarized below:
|
||||
PD429A Selector Channel Maintenance Board 01.01 Passed
|
||||
PD430A Error Correction Memory Series II 01.01 No simulation
|
||||
PD430B Error Correction Memory Series III 00.00 No simulation
|
||||
PD431A Extended Instruction Set 01.00 No simulation
|
||||
PD431A Extended Instruction Set 01.00 Passed
|
||||
PD432A Hardwired Serial Interface 01.00 No simulation
|
||||
PD433A 7970B/E Nine-Track Magnetic Tape 01.04 Partial
|
||||
PD434A Synchronous Line Controller 01.03 No simulation
|
||||
@@ -1130,6 +1130,57 @@ TEST RESULT: Passed.
|
||||
|
||||
|
||||
|
||||
-----------------------------------------
|
||||
D431A - Extended Instruction Set Firmware
|
||||
-----------------------------------------
|
||||
|
||||
TESTED DEVICE: CPU (hp3000_cpu_eis.c)
|
||||
|
||||
CONFIGURATION: sim> set cpu eis
|
||||
sim> go
|
||||
|
||||
TEST REPORT: [CR entered]
|
||||
|
||||
D01 HP30012A EXTENDED-INSTRUCTION SET DIAGNOSTIC (D431.01.00)
|
||||
(C)COPYRIGHT HEWLETT PACKARD COMPANY 1976.
|
||||
|
||||
|
||||
Q01 SELECT SWREG OPTIONS
|
||||
|
||||
Programmed halt, CIR: 030366 (HALT 6), P: 010117 (RSW)
|
||||
|
||||
sim> deposit SWCH 140000
|
||||
sim> go
|
||||
|
||||
Q02 SELECT SECTION SWREG. OPTIONS
|
||||
|
||||
Programmed halt, CIR: 030365 (HALT 5), P: 010165 (RSW)
|
||||
|
||||
sim> deposit SWCH 160000
|
||||
sim> go
|
||||
|
||||
Q03 RESTORE SWREG OPTIONS
|
||||
|
||||
Programmed halt, CIR: 030367 (HALT 7), P: 010203 (RSW)
|
||||
|
||||
sim> deposit SWCH 100011
|
||||
sim> go
|
||||
|
||||
Q04 ENTER MAXIMUM ERROR COUNT# = 50
|
||||
Q05 ENTER PASS NUMBER =1
|
||||
|
||||
D02 1 PASS COMPLETED
|
||||
|
||||
Programmed halt, CIR: 030375 (HALT 15), P: 046030 (BR P+1,I)
|
||||
|
||||
TEST RESULT: Passed.
|
||||
|
||||
TEST NOTES: The diagnostic nominally executes 200 passes per program cycle.
|
||||
It is reconfigured to execute a single pass, as multiple passes
|
||||
are not relevant under simulation.
|
||||
|
||||
|
||||
|
||||
----------------------------------------------------
|
||||
D433A - 7970B Nine-Track Magnetic Tape (single unit)
|
||||
----------------------------------------------------
|
||||
@@ -1858,7 +1909,7 @@ TEST RESULT: Passed.
|
||||
D441A - COBOL-II A Firmware
|
||||
---------------------------
|
||||
|
||||
TESTED DEVICE: CPU (hp3000_cpu.c)
|
||||
TESTED DEVICE: CPU (hp3000_cpu_cis.c)
|
||||
|
||||
CONFIGURATION: sim> set cpu cis
|
||||
sim> go
|
||||
@@ -1987,7 +2038,7 @@ TEST RESULT: Passed.
|
||||
D442A - COBOL-II B Firmware
|
||||
---------------------------
|
||||
|
||||
TESTED DEVICE: CPU (hp3000_cpu.c)
|
||||
TESTED DEVICE: CPU (hp3000_cpu_cis.c)
|
||||
|
||||
CONFIGURATION: sim> set cpu cis
|
||||
sim> go
|
||||
|
||||
12657
doc/hp3000_guide.pdf
12657
doc/hp3000_guide.pdf
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
SIMH/HP 3000 RELEASE NOTES
|
||||
================================
|
||||
J. David Bryan <jdbryan@acm.org>
|
||||
Last update: 2020-02-14
|
||||
Last update: 2020-11-07
|
||||
|
||||
|
||||
This file documents the release history of the simulator for the Hewlett-Packard
|
||||
@@ -249,6 +249,294 @@ the MPE version used:
|
||||
|
||||
|
||||
|
||||
=====================
|
||||
Release 9, 2020-11-07
|
||||
=====================
|
||||
|
||||
This release of the HP 3000 simulator adds the following features:
|
||||
|
||||
- A new concurrent-mode FLUSH command has been added to flush terminal logs and
|
||||
attached device files that otherwise would be flushed only when the simulator
|
||||
is stopped. This allows external examination of these files while the
|
||||
simulator continues to run.
|
||||
|
||||
- Terminal multiplexer line logs are now flushed each time the simulator stops.
|
||||
Prior to this, closing and then reopening a line log was the only way to post
|
||||
all buffered writes to disc.
|
||||
|
||||
- The Extended Instruction Set firmware is now available. The new SET CPU EIS
|
||||
option enables the firmware.
|
||||
|
||||
- A new LINEORDER option has been added to the ATCD device to allow a
|
||||
user-specified connection order or to restrict connections to a subset of the
|
||||
available lines.
|
||||
|
||||
- The -N (new file) option has been added to the SET ATCD LOG command to create
|
||||
a new, blank log file. Without the option, the command will append to an
|
||||
existing log file.
|
||||
|
||||
- Microcode traps, such as bounds violations, now print the register values if
|
||||
the REG trace option is enabled.
|
||||
|
||||
|
||||
--------------------
|
||||
Implementation Notes
|
||||
--------------------
|
||||
|
||||
- Prior releases relied upon MPE to trap and simulate EIS instructions. Those
|
||||
instructions are now implemented directly, resulting in a large reduction in
|
||||
execution time for the individual instructions. Programs that made heavy use
|
||||
of double-precision floating-point calculations or decimal (BCD) arithmetic
|
||||
may see an increase in performance.
|
||||
|
||||
- The HP 30012A Extended Instruction Set was standard equipment on the Series
|
||||
II and III. As such, the simulator should reject a SET CPU NOEIS command
|
||||
with the "Command not allowed" message. However, the NOEIS option is allowed
|
||||
to enable performance comparisons between hardware and software instruction
|
||||
emulations. Executing SET CPU NOEIS will revert to emulation of the EIS
|
||||
instructions by MPE.
|
||||
|
||||
|
||||
----------
|
||||
Bugs Fixed
|
||||
----------
|
||||
|
||||
1. PROBLEM: Breakpoint actions after an included true IF are discarded.
|
||||
|
||||
VERSION: Release 8.
|
||||
|
||||
OBSERVATION: If a breakpoint has actions that include an IF command
|
||||
followed by additional actions, and the IF command evaluates to TRUE, then
|
||||
the IF actions executed, but the remaining breakpoint actions are
|
||||
discarded. For example:
|
||||
|
||||
sim> set environment X=0
|
||||
sim> break 10 ; if "%X%" == "0" echo X is 0 ; echo Done
|
||||
sim> go
|
||||
|
||||
One would expect to see:
|
||||
|
||||
Breakpoint, P: 000010 (NOP,NOP)
|
||||
sim> if "0" == "0" echo X is 0
|
||||
sim> echo X is 0
|
||||
X is 0
|
||||
sim> echo Done
|
||||
Done
|
||||
sim>
|
||||
|
||||
Instead, only the first ECHO is performed. The second one is discarded.
|
||||
However, execution is correct if the IF condition is false:
|
||||
|
||||
sim> set environment X=1
|
||||
sim> break 10 ; if "%X%" == "0" echo X is 0 ; echo Done
|
||||
sim> go
|
||||
|
||||
Breakpoint, P: 000010 (NOP,NOP)
|
||||
sim> if "1" == "0" echo X is 0
|
||||
sim> echo Done
|
||||
Done
|
||||
sim>
|
||||
|
||||
CAUSE: IF actions are executed by setting the breakpoint action pointer to
|
||||
the action list and returning to the command loop. While the IF command is
|
||||
executing, the pointer is pointing at the "echo Done" part of the
|
||||
breakpoint action list. However, if the IF condition is true, the pointer
|
||||
is changed to point at the "echo X is 0" command, and the remaining
|
||||
breakpoint actions are lost.
|
||||
|
||||
RESOLUTION: Modify "if_cmd" (sim_extension.c) to append the remaining
|
||||
breakpoint actions to the actions specified by the IF command, so that the
|
||||
former are not lost.
|
||||
|
||||
STATUS: Fixed in Release 9.
|
||||
|
||||
|
||||
2. PROBLEM: Linking with recent compilers results in duplicate symbol errors.
|
||||
|
||||
VERSION: Release 8.
|
||||
|
||||
OBSERVATION: If the simulator is compiled with a recent compiler version,
|
||||
the link step fails with duplicate symbol errors. The symbols reported are
|
||||
"sim_vm_release", "vm_sim_vm_init", "vm_console_input_unit", and
|
||||
"vm_console_output_unit".
|
||||
|
||||
CAUSE: The VM hook extension mechanism is implemented with "tentative
|
||||
definitions" of the hook variables. The C standard says:
|
||||
|
||||
"If a translation unit contains one or more tentative definitions for an
|
||||
identifier, and the translation unit contains no external definition for
|
||||
that identifier, then the behavior is exactly as if the translation unit
|
||||
contains a file scope declaration of that identifier, with the composite
|
||||
type as of the end of the translation unit, with an initializer equal to
|
||||
0."
|
||||
|
||||
This behavior is such that if no module contains a definition with an
|
||||
initializer, the hook will have a zero value. However, if a module
|
||||
contains a definition with an initializer, the hook is assigned that value.
|
||||
This allows hooks to be set without changing the hook's tentative
|
||||
definition simply by including a VM module that declares it with an
|
||||
initializer.
|
||||
|
||||
This mechanism relies on the linker to resolve the multiple definitions of
|
||||
a given hook to a single reference. For this to occur, the compiler must
|
||||
mark tentative definitions as "common" allocations, e.g., with the
|
||||
"-fcommon" option to gcc. Traditionally, gcc (and clang, etc.) defaults to
|
||||
common allocations for tentative definitions. However, the gcc manual
|
||||
claims that, "This behavior is not required by ISO C, and on some targets
|
||||
may carry a speed or code size penalty on variable references."
|
||||
|
||||
Newer versions (starting with gcc 10) default to data allocations instead
|
||||
("-fno-common"), and multiple tentative definitions now result in duplicate
|
||||
symbol errors rather than merged accesses.
|
||||
|
||||
RESOLUTION: Modify sim_extension.h to declare "vm_sim_vm_init" only if the
|
||||
USE_VM_INIT symbol is defined. Modify "ex_initialize" (sim_extension.c) to
|
||||
remove the tentative definition and to make the external "vm_sim_vm_init"
|
||||
call conditional on USE_VM_INIT. Modify "one_time_init" (hp3000_sys.c) to
|
||||
set the "sim_vm_release" hook directly. Modify "atcd_reset" (hp3000_atc.c)
|
||||
to set the console unit hooks directly. This removes all tentative
|
||||
definitions from the simulators.
|
||||
|
||||
STATUS: Fixed in Release 9.
|
||||
|
||||
|
||||
3. PROBLEM: Trace output to stdout on Unix results in stair-step output.
|
||||
|
||||
VERSION: Release 8.
|
||||
|
||||
OBSERVATION: Directing the trace output to "stdout" on a Unix system
|
||||
results in lines stair-stepping across the screen. For example:
|
||||
|
||||
sim> set console debug=stdout
|
||||
sim> set cpu debug=instr
|
||||
sim> step 2
|
||||
|
||||
...produces this output:
|
||||
|
||||
>>CPU instr: 00.000000 000000 NOP,NOP
|
||||
>>CPU instr: 00.000001 000000 NOP,NOP
|
||||
|
||||
CAUSE: Trace statements are output with LF ('\n') line ends and depend on
|
||||
host-system translation to the proper line-end convention when the lines
|
||||
are written to the trace log. However, while the simulator is executing
|
||||
instructions, the console is placed in "raw" mode so that output
|
||||
translation, which would interfere with the output from the target
|
||||
operating system, is not done. As there are no carriage returns in the
|
||||
trace output stream when writing to stdout, the console cursor simply drops
|
||||
in place to the next line, so that each line begins at the same column
|
||||
where the previous line ended.
|
||||
|
||||
RESOLUTION: Modify "hp_trace" (hp3000_sys.c) to convert a terminating LF
|
||||
to a CR LF sequence if output is to stdout. Also modify "sim_instr"
|
||||
(hp3000_cpu.c) and "edit" (hp3000_cpu_cis.c) to add CR characters to the
|
||||
stdout stream where line termination is done explicitly.
|
||||
|
||||
STATUS: Fixed in Release 9.
|
||||
|
||||
|
||||
4. PROBLEM: CPU EXEC traces can include unrelated process clock events.
|
||||
|
||||
VERSION: Release 8.
|
||||
|
||||
OBSERVATION: When the SET CPU DEBUG=EXEC command is used to trace specific
|
||||
CPU instruction executions, process clock event traces may be embedded.
|
||||
For example, tracing the ABSD instruction is seen to produce:
|
||||
|
||||
>>CPU exec: *****************
|
||||
>>CPU reg: 00.045172 000002 A 000005, B 000316, X 000001, M i t r o C CCG
|
||||
>>CPU fetch: 00.042440 000047 instruction fetch
|
||||
>>CPU instr: 00.042437 020477 ABSD 1
|
||||
>>CPU data: 00.045172 020040 stack read
|
||||
>>CPU data: 00.045171 020040 stack read
|
||||
>>CPU fetch: 00.042441 140003 instruction fetch
|
||||
>>CPU opnd: 00.045113 000316 source 5,"12345D"
|
||||
>>CPU data: 00.045114 056400 data read
|
||||
>>CPU data: 00.045114 057400 data write
|
||||
>>CPU opnd: 00.045113 000316 target 5,"12345F"
|
||||
>>CPU pserv: Process clock delay 3890 service entered on the user stack
|
||||
>>CPU pserv: Simulation rate 1x
|
||||
>>CPU reg: 00.045170 000002 A 020040, B 020040, X 000001, M i t r o C CCL
|
||||
>>CPU exec: *****************
|
||||
|
||||
The PSERV trace is unrelated to instruction execution.
|
||||
|
||||
CAUSE: EXEC tracing works by enabling all trace options when the target
|
||||
instruction is present in the CIR. However, it should enable just the
|
||||
trace options relevant to execution.
|
||||
|
||||
RESOLUTION: Modify the definition of DEB_ALL (hp3000_cpu.h) to exclude the
|
||||
DEB_PSERV trace option.
|
||||
|
||||
STATUS: Fixed in Release 9.
|
||||
|
||||
|
||||
5. PROBLEM: A bounds violation can occur with valid CVND operands.
|
||||
|
||||
VERSION: Release 8.
|
||||
|
||||
OBSERVATION: The following valid SPL program:
|
||||
|
||||
BEGIN
|
||||
BYTE ARRAY X (0:5) := "-31416";
|
||||
|
||||
PROCEDURE CVND (DISPLAY);
|
||||
BYTE ARRAY DISPLAY;
|
||||
|
||||
BEGIN
|
||||
BYTE ARRAY ASCII (0:5);
|
||||
|
||||
TOS := @ASCII;
|
||||
TOS := DISPLAY;
|
||||
TOS := 6;
|
||||
ASSEMBLE (CON %020477; << CVND LS,1 >>
|
||||
CON %000021);
|
||||
END;
|
||||
|
||||
CVND (X);
|
||||
END.
|
||||
|
||||
...produces this error:
|
||||
|
||||
PROGRAM ERROR #24 :BOUNDS VIOLATION
|
||||
|
||||
CAUSE: Tracing the instruction execution shows:
|
||||
|
||||
>>CPU reg: 01.042453 000003 A 000006, B 000002, C 000042, X 000000, m I T r o c CCG
|
||||
>>CPU reg: 01.000000 000301 PB 177630, PL 177653, DL 042274, DB 042430, Q 042447, Z 044714
|
||||
>>CPU fetch: 04.177644 000021 instruction fetch
|
||||
>>CPU instr: 04.177643 020477 CVND LS,1
|
||||
>>CPU data: 01.042453 042430 stack read
|
||||
>>CPU fetch: 04.177645 031401 instruction fetch
|
||||
>>CPU reg: 01.042452 000004 A 000006, B 000002, C 000042, D 042430, X 000000, m I T r o c CCG
|
||||
>>CPU instr: 04.177645 000000 bounds violation trap
|
||||
|
||||
The HP 3000 microcode preloads four top-of-stack registers before calling
|
||||
any of the firmware extension instruction routines. However, only three
|
||||
TOS values are pushed for the CVND instruction, so the fourth register
|
||||
actually contains a word from whatever was on the stack before the
|
||||
instruction was executed. If the source or target buffer resides on the
|
||||
stack immediately below the three CVND parameters, preloading the fourth
|
||||
TOS register sets SM to point below the last word of the buffer, and a
|
||||
bounds violation results.
|
||||
|
||||
In the above trace, the stack preload shows the fourth TOS register is read
|
||||
from location 042453. This increments SR and decrements SM to point at
|
||||
042452, as shown in the REG trace two lines later. The C register contains
|
||||
the relative byte address of the target array -- in this case, 42 (octal)
|
||||
relative to the DB register contents. The starting word address is
|
||||
therefore 42 / 2 + 042430 = 042451. The buffer is 6 bytes or 3 words long,
|
||||
so the ending address is 042453. But because the preload pulled in a
|
||||
fourth stack word (that was never pushed), the end of the buffer is under
|
||||
SM, and a bounds violation occurs.
|
||||
|
||||
RESOLUTION: Modify the CVND executor in "cpu_cis_op" (hp3000_cpu_cis.c) to
|
||||
queue down (i.e., transfer from a register back to memory) the fourth TOS
|
||||
register value before checking the buffer legality.
|
||||
|
||||
STATUS: Fixed in Release 9.
|
||||
|
||||
|
||||
|
||||
=====================
|
||||
Release 8, 2020-02-15
|
||||
=====================
|
||||
|
||||
Reference in New Issue
Block a user