blob: 9978bf2295febf39b65edefcb8bbd29d2e1311e9 [file] [log] [blame] [raw]
HP 2100 SIMULATOR BUG FIX WRITEUPS
==================================
Last update: 2016-07-28
1. PROBLEM: Booting from magnetic tape reports "HALT instruction, P: 77756
(000400)". However, [77755] is HLT 77 (102077), [77756] is ALF,ALF (001727).
VERSION: 3.2-0
OBSERVATION: The value 000400 is supposed to be "ALF,ALF", i.e., the
decoded memory value at P.
CAUSE: "fprint_stopped" in "scp.c" calls "cpu_ex" in "hp2100_cpu.c", which
calls "dms_cons" to display the virtual (logical) address. However, at the
halt in the mag tape boot loader, DMS is not enabled, so the map registers
are meaningless (they happen to be zeros, so the access is to physical
address 001756).
RESOLUTION: Alter "dms_cons" in "hp2100_cpu.c" to condition DMS mapping on
"dms_enb".
STATUS: Fixed in version 3.2-1.
2. PROBLEM: Terminal output from RTE is indented three spaces, e.g., "START
RECONFIGURATION" appears as " START RECONFIGURATION", and the "- " prompts
after answering "YES" to "I/O RECONFIGURATION?" do not appear.
VERSION: 3.2-0
OBSERVATION: Use of a debugger reveals that the output sequence to the TTY
is <nul><nul><nul>- <cr><nul><nul><nul><nul><nul><lf>.
CAUSE: RTE is outputting nulls to allow the (physical) TTY carriage time to
move, but these are overwriting the prompt character in the simulation (note
that a real TTY absorbs nulls, i.e., they don't affect the printed output).
The TTY emulator should strip nulls from output to console.
RESOLUTION: Alter "tto_out" in "hp2100_stddev.c" to suppress nulls sent to
the TTY printer.
STATUS: Fixed in version 3.2-1.
3. PROBLEM: Completing the reconfiguration and exiting hangs the system after
printing the first few characters of the output line. RTE is stuck in a
loop in $CIC.
VERSION: 3.2-0
OBSERVATION: At the entry to $CIC (system map address 43221), RTE uses the
undocumented instruction "SFS 0,C" to both test and turn off the interrupt
system. This is confirmed in the "RTE-6/VM Technical Specifications" manual
(HP 92084-90015), section 2.3.1 "Process the Interrupt", subsection "A.1
$CIC":
"Test to see if the interrupt system is on or off. This is done with the
SFS 0,C instruction. In either case, turn it off (the ,C does it)."
...and in section 5.8, "Parity Error Detection":
"Because parity error interrupts can occur even when the interrupt system
is off, the code at $CIC must be able to save the complete system status.
The major hole in being able to save the complete state is in saving the
interrupt system state. In order to do this in both the 21MX and the 21XE
the instruction 103300 was used to both test the interrupt system and
turn it off."
CAUSE: The simulator does not respond to the "H/C bit" on the "SFS 0"
instruction, so the interrupt system is not turned off.
RESOLUTION: Modify "hp2100_cpu.c" and the various devices to respond to the
"H/C bit" on the "SFS" and "SFC" instructions, and modify "hp2100_sys.c" to
decode the "H/C bit" on those instructions (note that while the
documentation refers specifically only to "SFS 0", the schematics of the
21MX appear to indicate that the bit will work on any SFS instruction -- and
the SFC instruction too, for that matter).
STATUS: Fixed in version 3.2-1.
4. PROBLEM: RTE sits in the idle loop. TBG/TTY interrupts are not occurring,
so "SET TIME" is not output.
VERSION: 3.2-0
OBSERVATION: The memory protect flag is set, inhibiting all lower-priority
interrupts, such as the TBG and TTY. If the MP flag is cleared manually,
RTE prints "SET TIME" and comes up sufficiently to respond to operator
attention commands. The system time is seen to increment properly.
Unlike most other I/O devices, the MP flag flip-flop is cleared
automatically when the interrupt is acknowledged and not by a programmed
instruction (CLF and STF affect the parity error enable FF instead).
Section 4.4.3 "Memory Protect and I/O Interrupt Generation" of the "HP 1000
M/E/F-Series Computers Engineering and Reference Documentation" (HP
92851-90001) says:
"When IAK occurs and IRQ5 is asserted, the FLAGBFF is cleared, FLAGFF
clocked off at next T2, and IRQ5 will no longer occur."
CAUSE: The MP flag flip-flop is not being cleared automatically when the
interrupt is acknowledged.
RESOLUTION: Modify "hp2100_cpu.c" to reset the MP flag on IAK5.
STATUS: Fixed in version 3.2-1.
OBSERVATION: The MEV flag indicates the source of the interrupt (set for
DMS violation, clear for MP violation). If this is tested with a SFS or SFC
instruction after an MP interrupt, it is observed that DMS interrupts are
not being indicated properly. SFS 05 never skips.
CAUSE: The MP flag is being used to condition the response for SFS 05 and
SFC 05. Examination of the schematics for the MP card in the engineering
documentation shows that the SFS and SFC I/O backplane signals gate the
output of the MEVFF onto the SKF line unconditionally.
RESOLUTION: Modify "hp2100_cpu.c" to remove conditioning on MP flag for SFS
05, SFC 05.
STATUS: Fixed in version 3.2-1.
5. PROBLEM: Attempting to run any program causes a DM violation.
VERSION: 3.2-0
OBSERVATION: BCKOF is scheduled when the system starts and is the first
program to DM abort. Examining the DMS maps seems to indicate that the user
and system maps are set up reasonably. However, examining memory with
the "ex -u" and "ex -s" commands reveals the same data in both sets of
locations. The "ex" command isn't using the DMS maps properly.
CAUSE: String constants are used instead of character constants,
preventing the DMS map switches from being recognized.
RESOLUTION: Modify "hp2100_cpu.c" to use character constants rather than
string constants in "dms_cons" so that DMS map switches work correctly.
STATUS: Fixed in version 3.2-1.
OBSERVATION: The DM abort is occurring when JSB EXEC is done from a user
program. The EXEC target is below the MP fence, and the expected action is
an MP violation interrupt that is recognized and processed by the system as
a legal call to the system executive. However, the MP violation isn't
occurring, so the SJP instruction at the actual EXEC entry point (present
to catch EXEC calls made with the interrupt system off) is attempted, and
that causes the DM violation, due to execution of a protected instruction
from the user map.
CAUSE: Memory writes aren't being checked for an MP violation if DMS is
enabled, i.e., if DMS is enabled, and the page is writable, then whether
the target is below the MP fence is not checked.
RESOLUTION: Modify "hp2100_cpu.c" to do MP check on all writes after DMS
translation and violation checks are done (so, to pass, the page must be
writable AND the target must be above the MP fence).
STATUS: Fixed in version 3.2-1.
6. PROBLEM: The "WHZAT" program isn't showing the current time, program type,
priority, etc.
VERSION: 3.2-0
OBSERVATION: Running the program with "RU,WHZAT" shows that the current
time (etc.) is simply missing, as though zero-length strings are being
written, or all characters in the string are being written to the same
location.
CAUSE: The SBT instruction isn't incrementing the B register, so all
characters are being overwritten.
RESOLUTION: Modify the processing of the SBT instruction in "hp2100_cpu.c"
to increment B.
STATUS: Fixed in version 3.2-1.
7. PROBLEM: The simulator may abort with an access exception when examining
memory.
VERSION: 3.2-0
OBSERVATION: If DMS is enabled but a map register contains a page greater
than defined memory, attempting to examine the logical address corresponding
to that page register causes an access exception.
CAUSE: The "cpu_ex" and "cpu_dep" routines attempt to prevent this, but the
validation is being made on the logical, not the physical address.
RESOLUTION: Modify "cpu_ex" and "cpu_dep" in "hp2100_cpu.c" to check the
physical addresses against the physical memory limit.
STATUS: Fixed in version 3.2-1.
8. PROBLEM: Pressing a key during output does not give an RTE prompt.
VERSION: 3.2-0
OBSERVATION: Running, e.g., WHZAT and pressing a key during the listing
does not interrupt the system as expected. Pressing a key when the system
is idle does give a prompt.
CAUSE: Detection of key presses during output is accomplished by DVR00 with
the 12531C card by reading the data register after output is complete. If
no key was pressed, the register will have the value of 377 octal. If a key
was pressed, the value will be something other than this. SIMH is not
passing the keystrokes into the output data register.
RESOLUTION: Modify tty routines in "hp2100_stddev.c" to simulate the shift
of a character into the data register concurrently with an output operation.
STATUS: Fixed in version 3.2-1.
9. ENHANCEMENT: Programmed halt should report the halt code (i.e., the numeric
HLT instruction).
VERSION: 3.2-0
OBSERVATION: When a programmed halt occurs on the actual 21MX, the T
register (current memory contents) is automatically selected on the CPU
front panel. The T register displays the numeric HLT instruction. Many HP
programs communicate program status via the numeric halt instruction codes
themselves. For example, a HLT 77 (102077) is universally used to mean
"proper operation completed." The mag tape boot loader, for instance, will
HLT 11 (102011) if a checksum error is detected and HLT 00 (102000) if the
mag tape status is anything unexpected. The HP diagnostics also make
extensive use of halt codes, and their numeric values are tabulated in the
diagnostic manuals to correspond with certain results.
Currently, the simulator displays only the P register value (which points to
HLT + 1) and the contents of the memory location at P (which displays the
instruction one beyond the HLT), e.g.:
HALT instruction, P: 77756 (ALF,ALF)
sim>
This, however, fails to communicate the status implied by the HLT code,
which must be obtained by entering "ex 77755" after the halt.
RESOLUTION: Modify "hp2100_sys.c" to make the halt status message a
variable instead of a constant string, and modify "hp2100_cpu.c" to format
the status message with the halt code, as follows:
HALT instruction 102077, P: 77756 (ALF,ALF)
sim>
STATUS: Fixed in version 3.2-1.
10. ENHANCEMENT: Add an M register (current pointer to memory) and a T register
(contents of the memory location at P).
VERSION: 3.2-0
OBSERVATION: The 21MX computer presents eight hardware registers: A, B, M,
T, P, S, O, and E. From the 21MX M-Series Computer Operating and Reference
Manual (02108-90037):
"The M-register hold the address of the memory cell currently being read
from or written into by the CPU.
"The data transferred into or out of memory is routed through the
T-register. When displayed, the T-register indicates the contents of the
memory location currently pointed to by the M-register. The A- or
B-register contents are displayed if the M-register contents are 000000
or 000001, respectively."
However, the simulator does not expose these registers as part of the CPU
state. Internally, they are not needed, but the simulation user would
expect to be able to view and set their contents, so they should be
implemented.
When the machine halts, the front panel microroutines display the T
register after initiating a read of memory via the M register. So T always
reflects the contents of memory addressed by M. For machine halts due to
the front panel HALT button being pressed or due to execution of a HLT
instruction not in an interrupt trap cell, M is set to P-1. If, however,
the machine halts due to the execution of a HLT instruction in an interrupt
trap cell, M is set instead to the address of the trap cell (P still points
to the next instruction to be executed).
RESOLUTION: Modify "hp2100_cpu.c" to add M and T registers to the CPU
state. T must be read-only, because there is no way to determine positively
when a store into T has been done.
STATUS: Fixed in version 3.2-1.
11. ENHANCEMENT: Change the DMS map register contents to display and enter in
the format as documented by the HP hardware manual.
VERSION: 3.2-0
OBSERVATION: The simulated DMS map registers are stored in an internal
format that does not correspond to the real DMS hardware. Specifically, the
physical page address is shifted left by ten bits, and the read- and
write-protect bits are in bits 1-0 rather than 15-14. This is done for
performance reasons and is reasonable and proper. However, this internal
format is exposed as the external representation, which is unfamiliar to the
simulation user. The user expects to be able to view and set the DMS map
registers in the same format as the real machine.
RESOLUTION: Modify "hp2100_cpu.c" and "hp2100_defs.h" to use the documented
format.
STATUS: Fixed in version 3.2-1.
12. ENHANCEMENT: Provide map-specific simulation breakpoints.
VERSION: 3.2-0
OBSERVATION: When DMS is enabled, separate address spaces exist for system
and user programs. In debugging, one may have to set breakpoints in either
address space. Currently, breakpoints are map-agnostic, i.e., only the
address needs to match. This leads to the potential for breaking when not
intended and can be frustrating if, for example, the desired user-mode break
location happens to correspond with the TBG handling code in the system.
RESOLUTION: Modify "hp2100_cpu.c" to add map-specific breakpoints.
STATUS: Fixed in version 3.2-1.
13. ENHANCEMENT: Rename the F register to MPFR.
VERSION: 3.2-0
OBSERVATION: There is no F register defined in the 21MX register set. Its
name is confusing to the new simulation user. Moreover, there is an MPVR
(memory protect violation register), but the memory protect fence register
appears to be missing. Renaming makes the exposed register set more
consistent with HP nomenclature.
RESOLUTION: Modify "hp2100_cpu.c" to change the name of the register from
"F" to "MPFR", and move the location in the CPU state to precede the memory
protect violation register "MPVR", so that these two MP-related values
appear together.
STATUS: Fixed in version 3.2-1.
14. ENHANCEMENT: Rename the IADDR register to CIR.
VERSION: 3.2-0
OBSERVATION: The address of the currently interrupting device is contained
in the Central Interrupt Register (CIR) in HP documentation. Renaming makes
the exposed register set more consistent with HP nomenclature.
RESOLUTION: Modify "hp2100_cpu.c" to change the name of the register from
"IADDR" to "CIR".
STATUS: Fixed in version 3.2-1.
15. PROBLEM: Under RTE, the backspace key deletes the entire line, rather than
just the last character entered.
VERSION: 3.2-0
OBSERVATION: Pressing the backspace key should delete the last character
entered. Pressing the DEL key (CTRL+BACKSPACE) should delete the entire
line. RTE is behaving as though DEL were being sent when the backspace key
is pressed.
CAUSE: The simulator is unconditionally translating backspace (CTRL+H) to
DEL (CTRL+BACKSPACE), ostensibly for the convenience of some DEC operating
system.
STATUS: Fixed in version 3.2-1.
16. ENHANCEMENT: Provide a settable "auto linefeed" mode so that the TTY will
follow each CR with LF (DSGEN and DOS itself require that lines end with CR
and LF, contrary to RTE, which uses CR only).
VERSION: 3.2-0
OBSERVATION: Always following ENTER with CTRL+J is awkward. An "AUTO LF"
mode is desirable.
RESOLUTION: Implement a "SET TTY AUTOLF" command to implement "auto
linefeed" mode.
STATUS: Fixed in version 3.2-1.
17. PROBLEM: Loading an absolute binary paper tape image with "BOOT PTR" causes
the boot loader to hang.
VERSION: 3.2-0
OBSERVATION: BOOT PTR looks for 12 feed frames (nulls) to signify EOT. A
real paper tape would have feed frames punched after the file data for a
trailer.
CAUSE: At the end of the attached file, "ptr_svc" (hp2100_stddev.c) fails
if STOP_IOE is set, otherwise silently does nothing. SIMH wrongly requires
that the feed frames appear in the attached file, rather than supplying the
feed frames from the PTR simulation. If they are not in the file, the
simulation hangs, just as the real paper tape reader would do if the tape
ran out.
RESOLUTION: Alter "ptr_svc" (hp2100_stddev.c) to fail if STOP_IOE is set,
or to supply feed frames upon encountering the end of the attached file.
"SET PTR TRLLIM" sets the maximum number of feed frames to supply. Note
that RTE needs at least 30 feed frames before signaling EOT.
STATUS: Fixed in version 3.2-1.
18. PROBLEM: The 7900 boot loader fails to load any data from the disc into
memory.
VERSION: 3.2-0
OBSERVATION: The loader completes, but memory is untouched.
CAUSE: There is a transcription error in the boot loader code.
RESOLUTION: Alter "dp_rom" (hp2100_dp.c) to change the erroneous "OTA 6,C"
to the correct "SFS 6,C".
STATUS: Fixed in version 3.2-1.
19. PROBLEM: Using the DOS-III D2607 (DVR12) driver with the LPT (2607/12845)
simulation results in garbled output.
VERSION: 3.2-0
OBSERVATION: Doing an "ATTACH LPT 2607.printer" and then a ":JOB,FRED" in
DOS results in the following:
00000000 0C 0A 4A 4F 20 52 44 20-32 4D 59 37 20 54 4D 3D ..JO RD 2MY7 TM=
00000010 30 33 4D 4E 20 32 34 53-43 2E 4A 61 46 56 46 7F 03MN 24SC.JaFVF.
00000020 7F 7F 7F 47 18 73 43 46-21 4D 09 1A 0B 31 1C 67 ...G.sCF!M...1.g
00000030 0A .
...instead of the expected:
00000000 4A 4F 42 20 46 52 45 44-20 20 31 32 2D 4D 41 59 JOB FRED 12-MAY
00000010 2D 37 35 20 20 54 49 4D-45 3D 31 30 35 33 20 4D -75 TIME=1053 M
00000020 49 4E 2E 20 33 32 2E 31-20 53 45 43 53 2E 0D 0A IN. 32.1 SECS...
CAUSE: The intercharacter wait time is too long (1000 instructions). The
driver waits a maximum of 300 instructions before exiting to wait for the
interrupt. However, there is a bug in the driver that garbles output if the
wait time expires. It never does when using a real printer, so the bug
wasn't seen.
Note that the interline time (100 instructions) is actually shorter than the
intercharacter time! Also, the interline time appears to be set to the
"serial output time," which bears no relation to the parallel line printer!
RESOLUTION: Change the intercharacter time to 5 instructions and the interline
time to 10,000 instructions in hp2100_lpt.c.
STATUS: Fixed in version 3.2-1.
20. PROBLEM: Issuing a read on a magnetic tape for fewer words than are in the
pending record (e.g., doing ":LI,8,B" when there are more than 128 words in
the next record) results in a parity error ("IOPE L 8 E 8 S 0 22").
VERSION: 3.2-0
OBSERVATION: FMGR only reads the first 128 words of a record. Records
longer than 256 bytes should be truncated when listing. Instead, timing
errors (status 22) are reported. Records shorter than 128 words are listed
properly.
CAUSE: DMA termination before the end-of-record is not being handled
properly by the 7970E simulator. The RTE driver sets up DMA control word 1
with the STC bit (bit 15) clear and the CLC bit (bit 13) set. The DMA
transfer proceeds apace until DMA control word 3 (word count) goes to zero.
At this point, the last cycle logic in "dma_cycle" (hp2100_cpu.c, lines
2477-2480) issues a CLC to the mag tape data channel. In "msdio"
(hp2100_ms.c, lines 272-275), the command and control flags are cleared in
response.
The catch here is that the next I/O data transfer is still pending; it was
set in "msc_svc" (hp2100_ms.c, lines 461-467) via "sim_activate", because
there were still words in the buffer to transfer. When that time expires,
"msc_svc" is called again, and because the data flag is still set (the CLC
to the data channel issued by DMA to end the transfer occurred _instead_ of
the CLF that is issued between data transfers), the parity error and timing
overrun bits are set into the return status at line 462 of hp2100_ms.c.
RESOLUTION: Alter "msc_svc" (hp2100_ms.c) to terminate a read if the
control flip-flop is reset (by DMA termination).
STATUS: Fixed in version 3.2-1.
21. PROBLEM: Switching pending line edit modes (under EDIT or EDITR) by
entering the appropriate control codes (e.g., CTRL+I or CTRL+C) print
graphic characters that disrupt the one-for-one alignment needed for
editing.
VERSION: 3.2-1
OBSERVATION: Output of control characters that normally do not print or
cause observable actions (e.g., CR or BEL) should be suppressed, so that
simulated behavior mimics the action of a real terminal.
CAUSE: All characters except NULs are output by the TTY routine.
RESOLUTION: Alter "tto_out" (hp2100_stddev.c) to suppress output for all
control characters (characters < 40 octal), except for BEL, BS, LF, and CR.
STATUS: Fixed in version 3.2-2.
22. PROBLEM: Doing an EDIT pending line character insert with CTRL+S doesn't
work.
VERSION: 3.2-1
OBSERVATION: CTRL+S is not passed through to the simulated program.
Instead, pressing CTRL+S and typing simply absorbs the first character, and
the editor stays in "replace" mode for the succeeding characters.
CAUSE: The keyboard "peek" routine that checks for a pending input
character does not operate in "raw" mode. The simulator calls "_kbhit" to
determine if an input character is pending and "_getch" to retrieve that
character. "_getch" calls the Windows routine "SetConsoleMode" to set the
input mode to "raw" (i.e., no processing of the input characters). However,
"_kbhit" does not, and so the CTRL+S is intercepted and processed by
Windows.
RESOLUTION: Modify "sim_ttrun" and "sim_ttcmd" (sim_console.c) to switch
the console into and out of "raw" mode. This inhibits "_kbhit" from
interpreting the input character stream. As an added benefit, CTRL+C is no
longer interpreted as SIGINT, so all of the associated signal-handling code
("win_handler", etc.) may be removed.
STATUS: Fixed in version 3.2-2.
23. PROBLEM: The documentation for the DMSMAP register set is wrong.
VERSION: 3.2-1
OBSERVATION: "hp2100_doc.txt" says:
CPU registers include the visible state of the processor as well as the
control registers for the interrupt system.
name models size comments
DMSMAP[4][16] 21MX 16 DMS maps
should be:
DMSMAP[4][32] 21MX 16 DMS maps
...as there are 32 map registers (1 per 1K page) per set.
RESOLUTION: Fix the text.
STATUS: Fixed in version 3.2-2.
24. PROBLEM: The documentation for the 7900 disc boot is wrong.
VERSION: 3.2-1
OBSERVATION: "hp2100_doc.txt" says:
The 12557A/13210A supports the BOOT command. BOOT DPC copies the IBL
for 7900 class disks into memory and starts it running. BOOT -R DP
boots from the removable platter (head 2).
Entering "boot -r dp" gives "Non-existent device." The correct command
is "boot -r dpc".
RESOLUTION: Fix the text.
STATUS: Fixed in version 3.2-2.
25. PROBLEM: Logging console output to a file produces CR CR LF as line
terminators.
VERSION: 3.2-1
OBSERVATION: When console logging is enabled, simulator messages as well as
the console output from the simulated system are written to the log file.
The former outputs CR LF at the end of each line. The latter outputs CR CR
LF.
CAUSE: The log file is opened in "text mode" by default, which translates
LFs (C newlines) to CR LF sequences. Simulator messages terminate with
newlines, and these are translated to CR LF sequences. When the simulated
system writes characters to the console, they are also written to the log
file. When the simulated system outputs a CR, it is output verbatim. When
it follows that with an LF, however, that gets translated into a CR LF, so
the log file then has CR CR LF as the end of line sequence.
RESOLUTION: Flush the accumulated file stream buffer and change the file
mode from TEXT to BINARY in "sim_ttrun" (sim_console.c) when the simulation
starts, and then back to TEXT in "sim_ttcmd" when the simulation ends.
STATUS: Fixed in version 3.2-2.
26. ENHANCEMENT: For certain errors that stop the simulation, reset the PC to
report the instruction causing the error, rather than reporting the next
instruction.
VERSION: 3.2-2
OBSERVATION: Some stops are triggered by the attempted execution of
instructions. In these cases, it is more helpful to report the instruction
causing the error than the next instruction. Currently, all stops report
the instruction beyond the cause of the stop (i.e., "P + 1"). The table
below indicates those stops where it would be more helpful to report the
instruction causing the stop (i.e., "P"):
PC Code Message Text
===== =========== ====================================
P STOP_RSRV Unimplemented instruction
P STOP_IODV Non-existent I/O device
P STOP_IND Indirect address loop
P STOP_NOCONN No connection on interprocessor link
RESOLUTION: Before exiting "sim_instr" (hp2100_cpu.c), reset "PC" to
"err_PC" for the above cases.
STATUS: Fixed in version 3.2-3.
27. ENHANCEMENT: Add an "echo" command to print arbitrary strings on the
simulation console for use in simulation command files.
VERSION: 3.2-2
OBSERVATION: Simulation command files allow automation of complex or
tedious simulator setups. Because of the potentially lengthy sequence, it
would be helpful if the command file had a way to inform the user where it
was in the process. Providing a command to do this allows messages such as
"Loading diagnostic," "Configuring diagnostic," etc., to be printed during
command file execution.
RESOLUTION: Implement an "echo <string>" command (scp.c).
STATUS: Fixed in version 3.2-3.
28. PROBLEM: Booting 2000E TSB hangs after printing "READY".
VERSION: 3.2-2
OBSERVATION: The code is stuck in a loop, waiting for the 7900 disc data
channel flag to set.
CAUSE: To perform a disc read, the TSB disc driver issues a seek command
but does not wait for seek completion before issuing the read command to the
interface. This is allowed by the interface manual. The eventual interrupt
signifies the completion of both the seek and the read commands.
However, the "drive attention" flag that is normally generated at the end of
the seek isn't set if the commands overlap in this manner. When a read
command is received with a seek in progress, the simulator cancels the seek
timer and establishes a read timer of a longer duration in its place. But
the cancellation of the seek timer also cancels the setting of the "drive
attention" bit that would have occurred had the seek completed normally, and
the simulator doesn't supply it explicitly in this case.
The HP "7900A Disc Drive Operating and Service Manual" (07900-90002) says,
in section 4-67, "Attention is set high every time a seek has been
completed and Access Ready comes high."
TSB code loads the "drive attention" word from the command channel to create
a "request status" command. The code assumes that either bit 0 or bit 1
will be set, so an "ADA =D-1" is done to transform the retrieved 000001 or
000010 into 000000 or 000001, respectively. This effectively becomes a
"request status for unit 0/1" command, which is output to the drive as a
command.
However, the simulator bug causes the drive attention word to be 0, so the
ADA makes the value 177777. This is an illegal command, so the data channel
flag never sets.
RESOLUTION: Alter "dp_goc" (hp2100_dp.c) to set drive attention when seek
completion is simulated.
STATUS: Fixed in version 3.2-3.
29. PROBLEM: Running 2000/Access, the 7900 disc fails to format.
VERSION: 3.2-2
OBSERVATION: The code is hung in a loop, waiting for a drive attention flag
after the execution of an "Initialize Data" command.
CAUSE: The 13210A disc interface passes through attention flags that the
drives generate as a result of seek completions. However, the interface
also generates its own drive attention flag at the conclusion of every
command except "Status Check." This internally generated flag is not being
provided by the 7900 simulator.
The schematics and flowcharts in the 13210A manual indicate that a local
attention bit, derived from the unit number in the last command, is provided
at the conclusion of every command issued except:
* "Status Check" -- executing this command clears the attention bit.
* "Seek" -- if the drive is not ready, then a local attention bit is
provided immediately, else the attention bit from the drive is provided
when the seek completes.
RESOLUTION: Alter (hp2100_dp.c) to provide the needed attention bits.
STATUS: Fixed in version 3.2-3.
30. PROBLEM: Booting 2000/Access reports "CAN'T USE TAPE" when loading from
7970.
VERSION: 3.2-2
OBSERVATION: No data is returned in response to reading the first tape
record.
CAUSE: Rewind at BOT should return immediately but is not. Access does not
wait for rewind to complete, so it issues the read command while the
transport is busy. The command is rejected, so Access tries a CLEAR and
then a retry, but a bug in Access causes DMA to be started after the CLEAR
is sent. When CLEAR completes, READ is attempted again, but DMA is not
reset.
Also, the simulator is processing rejected commands when STC CC,C follows a
rejection. This should be a NOP.
RESOLUTION: Change hp2100_ms.c to do immediate completion for REWIND at
BOT and to NOP an STC CC,C after a command reject.
Note that this "fixes" the problem as long as the tape is at load point when
the Access bootstrap is run. This would normally be the case, but it
appears as though Access wouldn't work if the tape had to be rewound!
STATUS: Fixed in version 3.2-3.
31. PROBLEM: Running the 7970 diagnostic reports "Unit not attached, P: 02741
(CLF 77)" when executing Test 0.
VERSION: 3.2-2
OBSERVATION: The error is occurring in the basic I/O test for the command
channel. The test for the data channel is succeeding.
CAUSE: The diagnostic does a STC CC as part of the I/O test. The last
command sent was to the interface was SL3. Unit selects are not supposed to
be executed, but examination of the card schematics reveals that this will
set the command FF and the card busy bit and take no further action. The
simulator, however, is scheduling an I/O event in response, and when the
event occurs, unit 3 is not attached, so an error is reported.
RESOLUTION: Modify "mscio" (hp2100_ms.c) to not schedule an I/O event if
the last command was a unit select.
STATUS: Fixed in version 3.2-3.
32. PROBLEM: Running the 7970 diagnostic reports "Magtape library I/O error:
Invalid argument" when executing Test 4.
VERSION: 3.2-2
OBSERVATION: The error occurs when a write is aborted with a clear command.
CAUSE: If a CLR command is issued with a write in progress, the simulator
attempts to mark the record as bad on the tape by adding the "MTR_ERF" flag
to the "sim_tape_wrrecf" call. Unfortunately, that function does not remove
the flag before calling "sim_fwrite", and so the eventual OS call sees the
equivalent of a very large record length and therefore returns EINVAL.
RESOLUTION: Modify "sim_tape_wrrecf" (sim_tape.c) to mask off the "MTR_ERF"
flag when determining the record length.
STATUS: Fixed in version 3.2-3.
OBSERVATION: The library error is not stopping the simulator, even though
the STOP_IOE variable is set.
CAUSE: "sim_tape_ioerr" is returning "SCPE_IOERR" instead of "MTSE_IOERR",
and "ms_map_err" maps this to "SCPE_OK", so the simulator isn't halted.
RESOLUTION: Modify "sim_tape_ioerr" (sim_tape.c) to return "MTSE_IOERR"
instead of "SCPE_IOERR".
STATUS: Fixed in version 3.2-3.
33. PROBLEM: Running the 7970 diagnostic reports a number of timing errors,
with events taking longer or shorter than expected.
VERSION: 3.2-2
OBSERVATION: The diagnostic times certain tape functions (e.g., the time
from issuing a WRITE command until the first data is requested). Most of
these are reported as diagnostic failures.
CAUSE: I/O time modeling is not done properly. In some cases, the times
indicated are incorrect. In others, certain characteristics (e.g., that
operations from BOT take longer, due to the initial gap) aren't modeled at
all.
RESOLUTION: Revise "mscio" and "msc_svc" (hp2100_ms.c) to model actual I/O
timing characteristics correctly.
STATUS: Fixed in version 3.2-3.
34. ENHANCEMENT: Provide a method of selecting between realistic and fast
(optimized) command execution times for the 7970 simulator.
VERSION: 3.2-2
OBSERVATION: The 7970 diagnostic checks command execution times, so to
pass, the simulator must model these times. However, they are generally
much longer than are required by the various operating systems.
RESOLUTION: Modify "hp2100_ms.c" to add SET MSC REALTIME, SET MSC FASTTIME,
and SHOW MSC TIMING commands. Timing is now set according to the timing
and interface models in use.
STATUS: Fixed in version 3.2-3.
35. ENHANCEMENT: Provide a means of printing the internal state of the 7970
tape simulator.
VERSION: 3.2-2
OBSERVATION: Debugging tape errors would be easier if the tape interface
commands and status were observable and recordable. SIMH provides a "DEBUG"
mode command set to allow devices to provide this information.
RESOLUTION: Modify "hp2100_ms.c" to add debug-mode calls.
STATUS: Fixed in version 3.2-3.
36. PROBLEM: The 7970 tape diagnostic fails Test 12, Subtest 4.
VERSION: 3.2-2
OBSERVATION: Test 12 forces data and timing errors. Execution reports:
H154 UNIT 000000
H102 RECORD 000103
H054 COMMAND 000223
H155 STATUS IS 1 000 100 010 000 010
H155 AND SHOULD BE 1 000 000 010 010 010
TEST 12
E100 DATA OR ODD BYTE ERROR
In test 12, step 3, a 100-word WRITE is interrupted after 64 words with a
CLEAR command, followed by a WRITE FILE MARK. The diagnostic manual says,
"This procedure creates a record with a known parity error." The simulator
CLEAR command processing detects the write-in-progress and writes a
simulated tape record with the MTR_ERF flag to indicate a bad record.
In step 4, the records are backspaced, and a READ UNTIL FILE MARK command is
issued without transferring any data. This should set the timing error bit
(bit 4) in the status word. In the status word reported, it is not set.
CAUSE: The simulator implementation of the CLEAR command erroneously clears
the data channel command FF. When the READ UNTIL FILE MARK command is
issued, no data transfer is attempted, so the timing error does not occur.
RESOLUTION: Modify the CLR command in "mscio" (hp2100_ms.c) to leave the
data channel control and flag FFs untouched.
STATUS: Fixed in version 3.2-3.
37. PROBLEM: Running the RTE off-line disc backup program DBKUP and doing a
save to tape with verify hangs after printing "VERIFYING."
VERSION: 3.2-2
OBSERVATION: Using the 7970 debug mode reveals that the program does a
rewind in preparation for verifying. Then, after the command completes but
while the rewind is in progress, a read is issued. This is rejected due to
REW + TBUSY being set (rewind still in progress). After rejection, a clear
is issued and completes. At this point, the program appears to hang.
CAUSE: The RTE tape driver retries rejected commands by clearing the
interface and reissuing the originally rejected command. However, the
simulator erroneously clears both command and data channel control FFs and
sets both flag FFs in response to the CLR command. Clearing the control FFs
means that no completion interrupt is generated as a result of the CLR, so
the driver is never reentered to reissue the rejected command, and the
program stays in the I/O suspend state forever.
RESOLUTION: Modify the CLR command in "mscio" (hp2100_ms.c) to set both
the command control and data FFs.
STATUS: Fixed in version 3.2-3.
38. PROBLEM: The 13183A (7970) simulator reports "odd byte" status when an EOF
is detected.
VERSION: 3.2-2
OBSERVATION: For the NRZI (13181A) interface, an EOF is a single special
character in the data stream, so odd byte status is set when it is detected.
For the PE (13183A) interface, EOF is an erasure pattern that is detected by
the drive itself and communicated to the interface as a status line. Odd
byte status is not set when the 13183A interface indicates an EOF.
CAUSE: Odd byte status on EOF is not conditional on interface type.
RESOLUTION: Modify "ms_map_err" (hp2100_ms.c) to condition odd byte status
with EOF on interface type.
OBSERVATION: The FSF and BSF processors in "msc_svc" treat EOF separately
from other tape errors, but the separate code takes precisely the same
action as does the generic error mapper.
RESOLUTION: Modify "msc_svc" (hp2100_ms.c) to remove the separate
treatment and call the generic error mapper unconditionally.
STATUS: Fixed in version 3.2-3.
39. PROBLEM: The 7970 simulator does not report "odd byte" status when a tape
record with an odd byte length is read.
VERSION: 3.2-2
OBSERVATION: A tape record containing an odd number of bytes is read, but
the odd byte status bit isn't set at completion of the read.
CAUSE: The RC and RFF processors in "msc_svc" are not testing for this
condition.
RESOLUTION: Modify "msc_svc" (hp2100_ms.c) to set the odd byte status bit
if the last record read contained an odd number of bytes and to zero the
unused byte (as specified on page 4-11 of the 13181B manual).
STATUS: Fixed in version 3.2-3.
40. PROBLEM: The 7970 simulator fails Test 12, Subtest 2 when configured as a
13183A interface.
VERSION: 3.2-2
OBSERVATION: The test issues a RFF command and waits for the first data
flag. It then reads status in a loop and waits for the odd byte bit to set
before continuing. If this bit doesn't set within 65K iterations, the test
fails.
CAUSE: The 13183A hardware passes the odd/even byte FF output through as
the odd byte status bit, so this bit will be seen to toggle as data is
received. The simulator, by contrast, sets the odd byte flag only at the
end of the transfer. While the interface manual states that the odd byte
status is only valid after the command flag FF sets, the diagnostic depends
on seeing this bit toggle once during the transfer.
The 13181A hardware enables the odd byte status bit only when the
end-of-record is detected. However, because odd byte status occurs when EOF
is detected, the diagnostic test will still succeed, albeit at the end of
the RFF command rather than at the beginning.
RESOLUTION: Modify "msc_svc" (hp2100_ms.c) to set the odd byte status bit
at the beginning of the transfer if configured as a 13183A interface and
then to set or clear it as appropriate at the end of the transfer.
STATUS: Fixed in version 3.2-3.
41. ENHANCEMENT: Add a configurable reel length setting to the 7970 simulator
and provide end-of-tape status returns.
VERSION: 3.2-2
OBSERVATION: The 7970 diagnostic provides an option to inhibit rewinds
during test loops to allow the EOT status to be tested. The simulated tape,
however, is effectively infinite; EOT is never returned, as there is no
predefined tape length. An option to provide a simulated end-of-tape
indication would be helpful.
RESOLUTION: Modify "hp2100_ms.c" to add SET MSCn REEL=<length> and SHOW
MSCn REEL and to return EOT status if motion beyond the defined tape length
is attempted. Reel lengths may be set to 600, 1200, or 2400 (feet).
Setting the length to 0 inhibits EOT, i.e., the reel length is effectively
unlimited.
Modify "mscio" to return EOT status when current tape position is beyond a
calculated end-of-tape marker position (marker position is calculated as the
ideal tape reel capacity, i.e., the number of bytes per inch times the
length of the tape in inches).
STATUS: Fixed in version 3.2-3.
42. PROBLEM: Running the RTE off-line disc backup program PSAVE and doing a
save to a new tape gives an initial "IOPE" after specifying the tape label.
VERSION: 3.2-2
OBSERVATION: Upping the driver causes the program to continue properly.
Saving to a "used" tape does not exhibit this problem.
CAUSE: The PSAVE program is attempting to read the new tape. The tape
simulation library is reporting MTSE_EOM (end of medium), as the newly
created tape image file is zero-length. This is translated to STA_PAR by
"ms_map_err". In response, the RTE tape driver retries the read ten times
and then gives up and reports the parity error.
RESOLUTION: End-of-medium has no hardware analog; one cannot have a
physical tape of zero length. So the translation to simulated tape status
is arbitrary. A new physical tape will "run away," i.e., never return data.
Some programs, e.g., the RTE tape driver, are written to detect this.
However, those that aren't will simply hang. A more useful translation is
to return EOF marks when a motion is attempted beyond the end of the medium,
as many programs interpret two successive EOFs as "logical end-of-medium."
Modify "ms_map_err" (hp2100_ms.c) to return EOF status for MSTE_EOM.
STATUS: Fixed in version 3.2-3.
43. PROBLEM: EDIT/1000 uses the HT character (CTRL+I) to insert a tab, but
printing of this character is suppressed.
VERSION: 3.2-2
OBSERVATION: There is no visual indication that the TAB key was pressed to
insert a HT character.
CAUSE: "CNTL_SET" does not include the HT character.
RESOLUTION: Modify "hp2100_stddev.c" to add "HT_FLAG", defined as
"CHAR_FLAG('\t')", to "CNTL_SET".
STATUS: Fixed in version 3.2-3.
44. PROBLEM: The 7900 disc diagnostic fails Step 55 if two or more units are
connected.
VERSION: 3.2-2
OBSERVATION: Altering the unit table at the start of the diagnostic to
include two units (e.g., "0,1") and then running a short pass produces this
output:
H65 SHORT PASS 0004,HEADS 0/1,UNIT 00, 0000 ERRORS
H44 SEEK IN STEP 55
E10 NO COMMAND FLAG
H33 ATTENTION/SEEK-STATUS
000002 000000
H51 CYL 0202 HEAD 01 SECTOR 19 WORD COUNT 0128 UNIT 00
The step tests overlapping seeks.
CAUSE: The command channel flag set that normally indicates seek command
completion is not being deferred by the CLC CC issued in preparation for
sending another command. The simulator must defer the flag set until a
subsequent STATUS CHECK command is issued (this command normally does not
set the command channel flag but will do so if a pending drive attention
bit is set).
RESOLUTION: Add a "poll attention" state to the simulator and set the
command channel flag if polling is enabled and one or more drive attention
bits are set.
STATUS: Fixed in version 3.2-3.
45. PROBLEM: The 7900 disc diagnostic fails the not-ready tests in Step 14.
VERSION: 3.2-2
OBSERVATION: Running the 7900 diagnostic with S bit 4 set to execute the
interactive part of Section 1 causes this failure:
H70 UNLOAD UNIT 0,PUSH RUN
HALT instruction 102002, P: 03364 (JSB 1430)
sim> detach dpc0
sim> go
H46 READ IN STEP 14
E64 STATUS IS 000101 SHOULD BE 000105
H51 CYL 0202 HEAD 00 SECTOR 00 WORD COUNT 1024 UNIT 00
The diagnostic is expecting the DRIVE BUSY bit to be set.
CAUSE: The "unit not attached" simulator state maps to the "drive not
ready" hardware state. In this state, both the NOT READY and the DRIVE BUSY
status bits should be set.
Referring to the "Drive Control Assembly A9" schematic on page 5-43 of the
"7900A Disc Drive Operating and Service Manual" (HP 07900-90002), the "Drive
Ready" signal is forced low via U22B if the "Load Switch Off" signal is
asserted (setting the "Load Switch" off unloads the heads). Also, the
"Access Ready" signal is forced low via U35A if the "Drive Ready" signal is
low. Schematic "Input/Output Multiplex Assembly A7" on page 5-39 shows that
these signals are inverted and driven onto the cable to the CPU interface.
The 13210A interface manual schematic for "Disc Interface PCA 1" shows that
both signals are inverted twice and presented to the CPU as status bits 6
and 2, respectively. So "not Drive Ready" becomes NOT READY, and "not
Access Ready" becomes DRIVE BUSY.
RESOLUTION: Modify "dpd_svc" (hp2100_dp.c) to set both the NOT READY and
DRIVE BUSY bits when the unit is not attached.
STATUS: Fixed in version 3.2-3.
46. PROBLEM: The 7900 disc diagnostic loops forever in Step 15.
VERSION: 3.2-2
OBSERVATION: Running the 7900 diagnostic with S bit 4 set to execute the
interactive part of Section 1 causes this failure:
H40 PROTECT U/D THEN READY UNIT 0
[CTRL+E]
Simulation stopped, P: 76734 (TIMER)
sim> set dpc0 locked
sim> att dpc0 7900-U0.scratch.disc
sim> go
H40 PROTECT U/D THEN READY UNIT 0
H40 PROTECT U/D THEN READY UNIT 0
H40 PROTECT U/D THEN READY UNIT 0
The diagnostic is waiting for the CC flag to set when the drive becomes
ready (i.e., when the unit is attached).
CAUSE: Section 4-67 of the "7900A Disc Drive Operating and Service Manual"
(HP 07900-90002) says, "Attention is set high every time a seek has
completed and Access Ready comes high." This includes the initial
head-loading seek when the drive becomes ready. The "Troubleshooting
Diagrams (Sheet 2 of 4)" on page 5-17 show that after the heads load, Drive
Ready, First Status, Access Ready (a.k.a. not Busy), and Attention are
asserted. The corresponding code in "dpc_attach" sets First Status but not
Attention.
In addition, the last diagnostic command prior to the loop is a STATUS
CHECK. This leaves the 13210A interface polling for attention bits, and
when one is asserted, the command channel flag FF is set. However, the
simulator makes no provision for this; the flag is checked once at the end
of the status command, but no further checks are made thereafter.
RESOLUTION: Modify "dpc_attach" (hp2100_dp.c) to set the ATN flag when the
unit is attached and, if drive polling is enabled, to set the command
channel flag.
STATUS: Fixed in version 3.2-3.
47. PROBLEM: The 7900 disc diagnostic fails the write-protect tests in Step 16.
VERSION: 3.2-2
OBSERVATION: Running the 7900 diagnostic with S bit 4 set to execute the
interactive part of Section 1 causes this failure:
H40 PROTECT U/D THEN READY UNIT 0
[CTRL+E]
Simulation stopped, P: 76734 (TIMER)
sim> set dpc0 locked
sim> attach dpc0 7900-U0.scratch.disc
sim> go
H44 SEEK IN STEP 16
E64 STATUS IS 040001 SHOULD BE 042001
H51 CYL 0000 HEAD 00 SECTOR 00 WORD COUNT 0128 UNIT 00
The diagnostic is expecting the DATA PROTECT bit to be set.
CAUSE: The UNIT_WPRT flag is being checked in the FNC_STA processing in
"dpd_svc", but the referenced unit is the data channel unit, not the command
channel unit where the flag is actually set.
RESOLUTION: Alter "dpd_svc" (hp2100_dp.c) to check the command channel unit
instead of the data channel unit when looking for write-protect indication.
STATUS: Fixed in version 3.2-3.
48. PROBLEM: The 7970E diagnostic hangs in test 33 if the tape is not at BOT.
VERSION: 3.2-2
OBSERVATION: The test issues a REWIND/OFFLINE to each unit in turn and
looks for the REW status bit to deny before proceeding.
CAUSE: The simulator resets this bit for the REWIND command but not for
REWIND/OFFLINE. More generically, though, the simulator is reporting unit
status (REW, BOT) when the unit is off-line.
RESOLUTION: Modify "mscio" (hp2100_ms.c) to remove unit-specific status
from the status return when the unit is not attached.
STATUS: Fixed in version 3.2-3.
OBSERVATION: The status for REWIND/OFFLINE when not at BOT isn't quite
correct. The hardware indicates "Rewinding" (bit 10) for a short time
before going off-line.
CAUSE: The simulator is detaching (i.e., going off-line) immediately upon
command execution.
RESOLUTION: Modify "mscio" (hp2100_ms.c) to detach after the interface
execution delay.
STATUS: Fixed in version 3.2-3.
OBSERVATION: The status for REWIND and REWIND/OFFLINE when at BOT isn't
quite correct. The hardware does not indicate "Tape Unit Busy" (bit 9) if
the unit is at BOT, because the tape never moves.
CAUSE: The simulator generates "Tape Unit Busy" whenever a service event is
scheduled, but this status should not occur if a rewind is issued at BOT.
RESOLUTION: Modify "mscio" (hp2100_ms.c) to condition STA_TBSY on rewind at
BOT.
STATUS: Fixed in version 3.2-3.
49. PROBLEM: The "do" command does not obey the "-v" ("verbose") option switch
when console logging is in effect.
VERSION: 3.2-2
OBSERVATION: Command file commands are always written to the console log
file, regardless of the setting of the "-v" switch. Commands are only
displayed on the console when "-v" is specified. The console log file,
therefore, is not a copy of what appeared on the console.
CAUSE: Output of the file commands is not conditional on the "-v" switch.
RESOLUTION: Modify "do_cmd" (scp.c) to condition writing file commands to
the console log on the "-v" switch.
STATUS: Fixed in version 3.2-3.
50. PROBLEM: The "echo" command does not echo to the console log file.
VERSION: 3.2-2
OBSERVATION: The "echo" command writes its argument only to the console.
If logging is in effect, the echoed strings will not appear in the file.
CAUSE: This action was omitted.
RESOLUTION: Modify "echo_cmd" (scp.c) to copy the echoed argument string to
the console log file if logging is in effect.
STATUS: Fixed in version 3.2-3.
51. PROBLEM: The diagnostic configurator misidentifies the host CPU.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic configurator in conversational mode
produces these hardware detection results using various CPU settings (note
that STOP_INST must first be set to 0 to prevent unimplemented instruction
traps):
set cpu 2116 --> "2114, DMA, NO MPRT, 32K MEMORY"
set cpu 2100 --> "21MX E, DMA, NO MPRT, 32K MEMORY"
set cpu 21MX --> "21MX E, DMA, MPRT, 32K MEMORY"
CAUSE: Two model-specific behaviors are not implemented:
* The S-register is read-only on the 2115/2116.
* LIA 6/7 (actually, the "floating" state of the internal S-bus) returns
-1 on the 21MX, and 0 on the 2114/2115/2116/2100.
These behaviors are tested by the configurator to determine the CPU type.
NOTE: the 21MX is detected as a "E-Series" model. This is due to the
presence of the TIMER instruction (TIMER is not implemented on the
"M-Series" and is decoded as an MPY instruction on that system).
RESOLUTION: Modify "ovfio", "dmpio", and "nulio" (hp2100_cpu.c) to
implement the above behaviors.
STATUS: Fixed in version 3.3-0.
52. PROBLEM: Displaying the CCA, CCB, and CCE instructions via "examine -m"
prints "CLA,CMA", "CLB,CMB", and "CLE,CME" respectively.
VERSION: 3.2-3
OBSERVATION: While "CLA,CMA" (e.g.) is logically what the "CCA" instruction
does, it is invalid assembler syntax (although it is accepted by the
"deposit" routine).
CAUSE: The "mtab" array contains values to mask the instruction under
consideration to the significant bits. For the CLA/B, CMA/B, and CCA/B
instructions, the mask values are 006400, 007000, and 007400, respectively.
They should all be 007400. For the CLE, CME, and CCE instructions, the mask
values are 002100, 002200, and 002300. They should all be 002300.
RESOLUTION: Modify "mtab" (hp2100_sys.c) to use the proper masks for these
alter-skip group instructions.
STATUS: Fixed in version 3.3-0.
53. PROBLEM: The paper tape diagnostic has several tests that depend on
creating and using a tape loop.
VERSION: 3.2-3
OBSERVATION: Tests 4, 5, and 11 use a loop of tape. The pattern for the
loop is punched by test 7. To run tests 4, 5, and 11, multiple copies of
the pattern must be stored in a "loop" file, and the tests must be exited
before the "loop" runs out. A better solution would be to have a settable
"loop mode" that rewinds the tape image file when EOF is encountered.
RESOLUTION: Modify "ptr_mod" (hp2100_stddev.c) to add SET PTR DIAG and
SET PTR READER commands, and modify "ptr_svc" to add support for loop mode.
STATUS: Fixed in version 3.3-0.
54. PROBLEM: The time base generator (CLK) cannot be disabled.
VERSION: 3.2-3
OBSERVATION: The TBG was an option for HP systems, and certain DOS
operating system features behave differently, depending on the presence or
absence of the TBG. It is desirable to allow those features to be observed
during simulation.
CAUSE: The "clk_dev" structure lacks the DEV_DISABLE flag.
RESOLUTION: Modify "clk_dev" (hp2100_stddev.c) to add the DEV_DISABLE flag.
STATUS: Fixed in version 3.3-0.
55. ENHANCEMENT: Move the memory protect simulation from the CPU to a new MP
device, allow MP to be disabled, and add the 12892B memory protect feature
jumpers W5 (JSB), W6 (INT), and W7 (SEL1).
VERSION: 3.2-3
OBSERVATION: Memory protect is an option card in 2116/21MX systems and
should have its own device entry in the simulator. The device should be
disabled to indicate that the card is absent.
Setting the CPU model to 2100 or 21MX should enable MP, although it may be
subsequently disabled if desired. Setting the CPU model to 2116 should
disable MP. The simulator should initialize with MP disabled.
The "B" version of the 21MX memory protect card added three jumpers to
modify the "standard" memory protect behavior. The W5 (JSB) option
prohibited JSB to locations 0 and 1. The W6 (INT) option inhibited the
indirect interrupt holdoff. The W7 (SEL1) option allowed I/O instructions
referencing select codes other than 1.
RESOLUTION: Modify "hp2100_cpu.c" to create the MP device and add commands
for setting the above options and support for the associated features.
STATUS: Fixed in version 3.3-0.
56. ENHANCEMENT: Allow DMA to be disabled.
VERSION: 3.2-3
OBSERVATION: DMA is an option card on all machines, so disabling it should
be allowed. Note that disabling DMA0 should disable DMA1 and vice-versa.
(There was no single-channel DMA option except on the 2114.)
RESOLUTION: Modify "hp2100_cpu.c" to permit DMA to be disabled.
STATUS: Fixed in version 3.3-0.
57. PROBLEM: Setting the CPU to 21MX and a memory size > 32K and then changing
the CPU to either 2100 or 2116 does not reset the memory size to a legal
value.
VERSION: 3.2-3
OBSERVATION: The 2100 and 2116 machines have a maximum memory size of 32K.
This limit is enforced when setting the memory size, i.e., "Invalid
argument" is reported when attempting to set these machines to a memory size
> 32K. However, if the machine is first set to 21MX, the memory size is
increased beyond 32K, and then the machine is reset to 2100 or 2116, the
memory size will remain larger than 32K.
CAUSE: No check on memory size is made when the machine type is set.
RESOLUTION: Modify "cpu_mod[]" (hp2100_cpu.c) to call "cpu_set_opt" when
changing the CPU model, and modify "cpu_set_opt" to call "cpu_set_size"
if the current memory size is > 32K and the new model is 2100 or 2116. If
the memory above 32K is not empty, and the "Really truncate memory" question
is answered in the negative, "Command not completed" is printed, and the CPU
change is aborted.
STATUS: Fixed in version 3.3-0.
58. PROBLEM: According to the HELP display, SET <dev>, SET <unit>, and SET
CONSOLE should allow a comma-separated list of parameters, but such commands
are rejected with "Non-existent parameter."
VERSION: 3.2-3
OBSERVATION: Doing HELP SET lists the following syntax for the above
commands:
set console arg{,arg...} set console options
set <dev> arg{,arg...} set device parameters
set <unit> arg{,arg...} set unit parameters
None of these work, however, as each accepts only a single argument. Note
that the corresponding SHOWs do accept multiple arguments.
CAUSE: The "get_glyph" routines that parse the command parameters are
missing the option to indicate that commas are glyph separators.
RESOLUTION: Modify the appropriate calls to "get_glyph" (scp.c,
sim_console.c) to specify ',' as the "optional end of glyph character"
parameter.
STATUS: Fixed in version 3.3-0.
59. ENHANCEMENT: The 2607 line printer simulator (LPT) now supports local
OFFLINE/ONLINE and POWEROFF/POWERON settings.
VERSION: 3.2-3
OBSERVATION: The 2607 printer returns different status for power-off and
offline conditions. A local "power off" command is needed to simulate the
power-off or cable-disconnected state, and a local offline command is needed
to simulate the PRINT button up state. This allows proper status to be
returned to programs that expect it (e.g., RTE, diagnostics).
RESOLUTION: Modify "lptio" (hp2100_lpt.c) to implement local power off and
offline settings and to return proper status for these conditions.
STATUS: Fixed in version 3.3-0.
60. PROBLEM: The 2607 line printer simulator (LPT) does not supply the proper
status for the paper-out condition.
VERSION: 3.2-3
OBSERVATION: Paper-out is simulated by detaching the printer image file.
When detached, the simulator returns status 040000 (paper out). However,
the 12845 Line Printer Operating and Service Manual (HP 12845-90001) states
in section 2-33, "[The paper-out] signal is asserted only when the format
tape in the line printer has reached the bottom of form." So the expected
status should be 000000 unless the printer is positioned at BOF.
CAUSE: "lptio" is not checking for BOF before returning paper-out status.
RESOLUTION: Modify "lptio" (hp2100_lpt.c) to set the paper-out status bit
only if the current print location is BOF.
STATUS: Fixed in version 3.3-0.
61. PROBLEM: Issuing a TOF to the 2607 line printer (LPT) leaves the paper on
the second line instead of the first.
VERSION: 3.2-3
OBSERVATION: The RTE driver for the 2607 printer implements a top-of-form
request by issuing a VFU call to channel zero. On a real printer, this
leaves the paper positioned at the first line on the page. The simulator,
however, leaves the paper positioned at the second line. Examining the LPT
registers shows that LCNT is 0 immediately after an ATTACH but is 1 after a
TOF request.
CAUSE: The TOF is simulated by sending a form-feed to the printer image
file. This is being incorrectly followed by a line-feed and a line counter
increment.
RESOLUTION: Modify "lpt_svc" (hp2100_lpt.c) to suppress the line-feed and
line counter increment after a TOF request.
STATUS: Fixed in version 3.3-0.
62. ENHANCEMENT: The 2767 line printer simulator (LPS) now supports local
OFFLINE/ONLINE and POWEROFF/POWERON settings.
VERSION: 3.2-3
OBSERVATION: The 2767 printer returns different status for power-off and
offline conditions. A local "power off" command is needed to simulate the
power-off or cable-disconnected state, and a local offline command is needed
to simulate the PRINT button up state. This allows proper status to be
returned to programs that expect it (e.g., RTE, diagnostics).
RESOLUTION: Modify "lpsio" (hp2100_lps.c) to implement local power off and
offline settings and to return proper status for these conditions.
STATUS: Fixed in version 3.3-0.
63. PROBLEM: Command files that reduce CPU memory size cannot run unattended.
VERSION: 3.2-3
OBSERVATION: Command files that change CPU settings will pause for operator
intervention if memory size is being reduced, previous memory size was more
than 32K, and the memory being truncated contained non-zero data. In this
case, a prompt ("Really truncate memory?") is issued to the console. As the
response is not taken from the command file, there is no way to continue
without user intervention.
CAUSE: The "cpu_set_size" routine calls "get_yn", which reads from "stdin."
RESOLUTION: Modify "cpu_set_size" (hp2100_cpu.c) to respond to a new "-F"
switch that indicates that truncation should be forced without prompting.
STATUS: Fixed in version 3.3-0.
64. PROBLEM: Attempting to output to the 2767 simulator (LPS) via RTE-IVB
causes not-ready and illegal interrupt errors.
VERSION: 3.2-3
OBSERVATION: With the 2767 printer assigned to select code 21 and logical
unit 12, attempting to print results in "IONR L 12 E12 S 0 0", followed by
one "ILL INT 21" error for each character output.
CAUSE: The RTE driver understands that the 2767 prints in four 20-character
zones and that character output within a zone is buffered. It therefore
assumes that a buffered character will be accepted within three instruction
times. If the printer is still busy after that, the printer is declared "not
ready" and is downed. Subsequent interrupts are not expected (the printer
is assumed to be malfunctioning), resulting in the illegal interrupt
messages.
The 2767 simulator defines the character transfer time as four instructions
and has no provision for detecting print zones. The driver assumes that it
can fill a zone rapidly within the driver and will have to exit the driver
to wait for an interrupt at the end of each zone.
RESOLUTION: Modify "lpsio" and "lps_svc" (hp2100_lps.c) to reduce the
buffer transfer time to two instructions and to determine the end of a zone
in order to take an appropriately longer time before interrupting.
STATUS: Fixed in version 3.3-0.
65. ENHANCEMENT: Provide a method of selecting between realistic and fast
(optimized) command execution times for the 2767 simulator.
VERSION: 3.2-3
OBSERVATION: The 2767 diagnostic checks command execution times, so to
pass, the simulator must model these times. However, they are generally
much longer than are required by the various operating systems.
RESOLUTION: Modify "hp2100_lps.c" to add SET LPS REALTIME and SET LPS
FASTTIME commands. Timing is now set according to the timing model in use.
STATUS: Fixed in version 3.3-0.
66. ENHANCEMENT: Provide a means of printing the internal state of the 2767
printer simulator.
VERSION: 3.2-3
OBSERVATION: Debugging printer errors would be easier if the printer
interface commands and status were observable and recordable. SIMH provides
a "DEBUG" mode command set to allow devices to provide this information.
RESOLUTION: Modify "hp2100_lps.c" to add debug-mode printouts.
STATUS: Fixed in version 3.3-0.
67. PROBLEM: The console "break" and "delete" character settings are not saved
across a simulation SAVE/RESTORE.
VERSION: 3.2-3
OBSERVATION: The console interrupt character set via SET CONSOLE WRU=<val>
is preserved when the simulation is SAVEd and then later RESTOREd. However,
the values set via SET CONSOLE BRK=<val> and SET CONSOLE DEL=<val> are lost
and revert to their default settings.
CAUSE: Only "sim_int_char" is included in the hidden CPU state.
RESOLUTION: Modify "cpu_reg" (hp2100_cpu.c) to include BRK and DEL
registers corresponding to "sim_brk_char" and "sim_del_char".
STATUS: Fixed in version 3.3-0.
68. PROBLEM: Attached device output files and debug log files cannot be
examined after a simulation stop.
VERSION: 3.2-3
OBSERVATION: After stopping simulation, either via a breakpoint or CTRL+E,
viewing attached device output files or the device debug log file reveals
incomplete data, limiting the ability to determine what has been output at
the point of interruption.
CAUSE: All files are buffered, and the last bytes output haven't been
flushed to disk.
RESOLUTION: Modify "run_cmd" (scp.c) to flush the console log file, the
debug log file, and any attached output files before returning.
STATUS: Fixed in version 3.3-0.
69. PROBLEM: Attempting to disable the DP controller by doing SET DPD DISABLED
is rejected with "Command not allowed." Attempting to disable the DR
controller by doing SET DRD DISABLED is accepted, but the controller remains
enabled.
VERSION: 3.2-3
OBSERVATION: Section 2.3 of "hp2100_doc.txt" states, "For devices with more
than one device number, disabling or enabling any device in the set disables
all the devices." This is not true, however, for most multiple-card
devices. SET <dev> DISABLED is rejected for the DPD, DQD, MSD, MUXL, and
MUXM devices. For the DRD, IPLI, and MTD devices, the command is accepted
but does not disable the device.
CAUSE: The "DEV_DISABLE" flag is missing from the "DEVICE" structures of
the DPD, DQD, MSD, MUXL, and MUXM devices. Also, for all multiple devices,
the device "dev_reset" function must call "hp_enbdis_pair" with the
appropriate parameter to synchronize the enable/disable state of both
devices.
RESOLUTION: Modify the "DEVICE" structures and "dev_reset" routines as
needed to the affected source files (hp2100_dp.c, hp2100_dq.c, hp2100_dr.c,
hp2100_ipl.c, hp2100_ms.c, hp2100_mt.c, and hp2100_mux.c).
STATUS: Fixed in version 3.3-0.
70. PROBLEM: The 2871 disc diagnostic fails Status Checks in Step 1. The
checks are related to the ANY ERROR bit.
VERSION: 3.2-3
OBSERVATION: Running the 2871 diagnostic causes this failure:
H44 SEEK IN S1
E64 STATUS IS 000001 SHOULD BE 000000
H51 CYL 0000 HEAD 00 SECTOR 00 WORD COUNT 0000 UNIT 00
The diagnostic is not expecting the ANY ERROR bit (bit 0) to be set with the
ATTENTION bit (bit 15). The simulator is returning status 100001 from the
seek operation (bit 15 is always masked by the diagnostic before reporting).
Resuming the diagnostic produces this error:
H44 SEEK IN S1
E64 STATUS IS 000005 SHOULD BE 000004
H51 CYL 0001 HEAD 00 SECTOR 00 WORD COUNT 0000 UNIT 00
The diagnostic is not expecting the ANY ERROR bit (bit 0) to be set with the
BUSY bit (bit 2).
CAUSE: The ANY ERROR bit is set by the simulator if any status bit is set
other than bit 10 (HUNTING) or bit 7 (unused). This is correct for the
13210A interface but not for the 12557A interface.
From the "12557A Cartridge Disc Interface Operating and Service Manual" (HP
12557-90001, September 1970), Table 2.6, "Disc Status Word" lists the
following meanings for the status bits:
Bit 0: ANY ERROR. A "1" indicates that any of the remaining 15 bits
(except bits 2, 3, and 7) is a "1".
Bit 15: ATTENTION. A "1" indicates that an operation previously in
progress on the selected disc drive unit has terminated either
through normal completion or due to occurrence of an error or
other unusual condition. During execution of all commands except
Status Check, the condition is generated when command execution
terminates regardless of the cause for termination.
This would imply that the ANY ERROR bit would set with the ATTENTION bit.
However, on page 2-16, Section 2.50, "Design Considerations," this
statement appears:
Following each interrupt, the program must issue a Status Check command to
the disc drive unit that executed the storage command and verify that the
ANY ERROR bit (bit 0) is not a "1" in the disc status word.
Given that the ATTENTION bit sets for each command completion, and given
that the ANY ERROR bit is expected to be zero after a normal command
completion, the implication is that ATTENTION does not set ANY ERROR.
RESOLUTION: Modify "dpcio" (hp2100_dp.c) to set the ANY ERROR bit for all
status bits except bits 2, 3, 7, and 15 if the 12557A interface is selected.
STATUS: Fixed in version 3.3-0.
71. PROBLEM: The 2871 disc diagnostic fails not-ready Status Checks in Step 0.
VERSION: 3.2-3
OBSERVATION: Running the 2871 diagnostic causes this failure:
H43 UNIT 0 NOT READY CHECK IN S0
E64 STATUS IS 000105 SHOULD BE 000101
H51 CYL 0202 HEAD 00 SECTOR 00 WORD COUNT 3072 UNIT 00
The diagnostic is not expecting the DRIVE BUSY bit (bit 2) to be set when
the drive is not ready.
CAUSE: The simulator is returning both NOT READY and DRIVE BUSY. This is
correct for the 13210A interface but not for the 12557A interface.
RESOLUTION: Modify "dpd_svc" (hp2100_dp.c) to set the DRIVE BUSY bit for
the "drive not ready" condition only if the 13210A interface is selected.
STATUS: Fixed in version 3.3-0.
72. PROBLEM: The 2871 disc diagnostic fails the head-load test in Step 0.
VERSION: 3.2-3
OBSERVATION: Running the 2871 diagnostic reports this message to test for
head loading:
H40 READY UNIT 0
After stopping the simulation, attaching a disc image file, and resuming,
the above message continues to repeat. The diagnostic is expecting the
command-channel flag to set and drive status to return ATTENTION (bit 15)
and FIRST SEEK (bit 14).
CAUSE: To prepare the interface to poll for drive attention, the diagnostic
issues a Status Check command to the interface. However, because the
returned status word is not of interest, the diagnostic does not precede
this with an STC,C to the data channel. As the data command flip-flop is
not set, the simulator waits in "dpd_svc" in state "FNC_STA", rather than
proceeding to state "FNC_STA1", where the poll flag is set. With the poll
flag clear, the subsequent file attach does not set the command-channel flag
or the associated drive status.
Figure 3-7, "Status Check Operation Flow Diagram", on page 3-17 of the
"12557A Cartridge Disc Interface Operating and Service Manual" (HP
12557-90001, September 1970) implies that the data-channel command flip-flop
must be set before the command-channel control flip-flop is set to initiate
the command. However, there is no hardware interlock on the interface to
require this. Moreover, the diagnostic clearly expects the drive attention
to be detected, so the drive poll must occur, even without the data
transfer.
The STC DC asserts the "data encode" signal to the disc controller, and the
STC CC asserts the "command encode" signal. The latter initiates the Status
Check operation, but there is no indication as to what happens if the "data
encode" assertion does not precede it. Typical operation would be that
"device encode" initiates the operation and "device flag" signals the
termination. Without "device encode", "device flag" wouldn't occur. Based
on the diagnostic expectation, the implication is that the data-channel flag
does not set, but the Status Check command does complete, and drive polling
does start.
RESOLUTION: Modify "dpd_svc" (hp2100_dp.c) to complete the Status Check
command and proceed to polling without setting the data-channel flag if the
command flip-flop is not set, and the 12557A interface is selected.
STATUS: Fixed in version 3.3-0.
73. PROBLEM: The 2883 diagnostic fails the cyclic-check test in Step 4.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H22 CYCLIC CHECK IN S4
E10 NO COMMAND FLAG
H51 CYL 0000 HEAD 00 SECTOR 00 WORD COUNT 0000 UNIT 00
The error is a result of the diagnostic executing a Cyclic Check command
with a sector count of 0. Coupled with an initial seek to cylinder 0,
head 0, and sector 0, this should check the maximum of 460 sectors before
terminating with an End of Cylinder status.
CAUSE: The diagnostic is timing out. The "12565A Disc Interface Kit
Operating and Service Manual" (HP 12565-90003, August 1973) states in
Section 2-45 on page 2-11, "The data rate of the disc drive is 156,000 words
per second," giving a transfer time of 6.41 microseconds. At an average of
2 microseconds per instruction, the transfer time should be 3 instructions.
It is currently set to 5.
RESOLUTION: Change "dqc_xtime" (hp2100_dq.c) from 5 to 3.
STATUS: Fixed in version 3.3-0.
74. PROBLEM: The 2883 disc diagnostic fails not-ready Status Checks in Step 0.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H43 UNIT 0 NOT READY CHECK IN S0
E64 STATUS IS 000104 SHOULD BE 000101
H51 CYL 0202 HEAD 19 SECTOR 00 WORD COUNT 0046 UNIT 00
The diagnostic is expecting the ANY ERROR bit (bit 0) and is not expecting
the POSITIONER BUSY bit (bit 2) to be set when the drive is not ready.
CAUSE: The simulator is returning both NOT READY and POSITIONER BUSY. From
the "12565A Disc Interface Kit Operating and Service Manual" (12565-90003,
Aug-1973), page 2-12, Table 2-5, "Disc Status Word," we have:
Bit 6, NOT READY. A "1" indicates that the selected disc drive unit is
not connected to the disc controller, or is not sequenced up with disc
spinning and heads loaded, or is in an unsafe condition.
Bit 2, POSITIONER BUSY. A "1" indicates the selected drive is busy
executing a Position command.
Bit 0, ANY ERROR. A "1" indicates that "PL0 unsafe" condition has been
detected or that one or more of the remaining 7 bits is a "1".
RESOLUTION: Modify "dqd_svc" (hp2100_dq.c) to set the ANY ERROR bit and
remove the POSITIONER BUSY bit for the "drive not ready" condition.
STATUS: Fixed in version 3.3-0.
75. PROBLEM: Doing an OTA/OTB to the command channel of the 13210A interface
fails to clear the control and command flip-flops.
VERSION: 3.2-3
OBSERVATION: From the "13210A Disc Drive Interface Kit Operating and
Service Manual" (13210-90003, Nov-1974), examination of Figure 5-2, "Disc
Interface 1 PCA Schematic Diagram" shows that doing an OTA or OTB to the
command channel will clear the control and command flip-flops. Gate U16C
feeds both the qualified CLC and IOO signals to the reset side of the
command-channel control flip-flop. Therefore, an output operation
additionally will act as though a CLC had been done.
CAUSE: The action was omitted.
RESOLUTION: Modify "dpcio" (hp2100_dp.c) to perform a CLC CC if an OTA or
OTB CC occurs, and the 13210A interface is selected.
STATUS: Fixed in version 3.3-0.
76. PROBLEM: The 2883 disc diagnostic fails the multi-unit Cyclic Check test in
Step 5.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H22 CYCLIC CHECK IN S5
E64 STATUS IS 000000 SHOULD BE 000021
H51 CYL 0001 HEAD 00 SECTOR 00 WORD COUNT 0128 UNIT 00
The diagnostic does a seek to CHS 0/0/0 of unit 0, followed by a seek to CHS
1/0/0 of unit 1, followed by a Cyclic Check of one sector of unit 0. This
should cause ADDRESS ERROR, because the second seek sets the controller
Record Address Register (RAR) to 1/0/0, the read of unit 0 is done from
0/0/0 (set by the first seek), and the two do not compare. However, the
simulator returns NO ERROR.
CAUSE: The DQ simulator has separate RARs for each unit. The 12565A
controller has a single RAR that is shared between all units. (Note that
the DP simulator has the same problem.)
RESOLUTION: Modify "hp2100_dq.c" and "hp2100_dp.c" to implement a single,
shared RAR and per-unit current positions.
STATUS: Fixed in version 3.3-0.
77. PROBLEM: The 2773 (DR) drum diagnostic is unable to determine the number of
sectors per track during initialization.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H46 DEVICE PARAMETER DETERMINATION
E47 UNABLE TO DETERMINE SECTORS PER TRACK
H44 TRACK 0000 SECTOR 00 WORD COUNT 0000
The diagnostic is attempting to determine the number of sectors per track by
repeatedly reading the disc status word and examining the current sector
field.
CAUSE: The disc status word is malformed. The next sector address should
appear in bits 14-8, but instead they are ORed with the lower-byte status
flags, corrupting the status return value.
RESOLUTION: Modify "drcio" (hp2100_dr.c) to shift the next sector address
to the upper byte before merging the status flags.
STATUS: Fixed in version 3.3-0.
78. PROBLEM: The 2773 (DR) drum diagnostic reports read/write status failures.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H41 WRITE IN ST
E35 STATUS IS 0 000 110 010 000 000
SHOULD BE D DDD DDD D10 D00 1D0
H44 TRACK 0000 SECTOR 00 WORD COUNT 0064
The diagnostic is expecting the Writing Enabled Flag bit to be set.
CAUSE: The simulation fails to return Writing Enabled status on tracks for
which writing is permitted (all tracks).
RESOLUTION: Modify "drcio" (hp2100_dr.c) to set the Writing Enabled status
when the track control word is output.
STATUS: Fixed in version 3.3-0.
79. PROBLEM: The 7900 disc drive (DP) fails to seek check if an invalid sector
is supplied.
VERSION: 3.2-3
OBSERVATION: From the "13210A Disc Drive Interface Kit Operating and
Service Manual" (13210-90003, Nov-1974), section 3-55 states that Seek Check
status is set during a Seek command for three conditions: the cylinder
addressed is greater than 202, the sector addressed is greater than 23, or a
head-positioning operation is still in progress. The simulator fails to
implement the second condition.
CAUSE: The check is omitted.
RESOLUTION: Modify "dpd_svc" (hp2100_dp.c) to set Seek Check status if the
sector is out of range and the 13210A interface is selected.
STATUS: Fixed in version 3.3-0.
80. PROBLEM: The 2773 (DR) drum diagnostic fails the read test in Step 2.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H42 READ IN S2
E43 DATA WORD 0063 IS 000000 SHOULD BE 046160
H44 TRACK 0000 SECTOR 00 WORD COUNT 0064
Examination of the data file reveals that the failure is occurring on write.
The last word of the buffer is not being written to the drum (64 words are
to be transferred via DMA, but only 63 are output).
CAUSE: The DMA control word is set up to do a CLC on the last word. On all
words but the last, DMA dispatches an OTA DC followed by a CLF DC. On the
last word, DMA dispatches OTA DC followed by CLC DC,C. This does a
"sim_cancel", causing the scheduled transfer of the last word to be aborted.
RESOLUTION: Modify "hp2100_dr.c" to add "drc_run" to model the "Run
Flip-Flop" from the hardware interface, and call "sim_cancel" in "drdio"
only if "drc_run" is zero (i.e., not during a transfer).
STATUS: Fixed in version 3.3-0.
81. PROBLEM: If a partial sector is written to the 2773 drum, the remainder of
the sector is filled with zeroes instead of replicating the last word
written.
VERSION: 3.2-3
OBSERVATION: The "12606B Disc Memory Interface Kit Operating and Service
Manual" (12606-90012, Mar-1970) and "12610B Drum Memory Interface Kit
Operating and Service Manual" (12610-9001, Feb-1970) state in Section 4-91
and 4-92, respectively, that "...The last word will be repeated on the drum
until the end of the sector is reached." The simulator replicates zeros
instead.
CAUSE: The wrong value was used.
RESOLUTION: Modify "drc_svc" (hp2100_dr.c) to use "drd_obuf" instead of "0"
to fill out the remainder of a sector.
STATUS: Fixed in version 3.3-0.
82. PROBLEM: The 2773 (DR) diagnostic fails the sector address check in Step 1.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H21 SECTOR ADDRESS CHECK IN S1
E55 SECTOR 27 MISSING IN STATUS
H44 TRACK 0000 SECTOR 00 WORD COUNT 0000
The number of the missing sector is random.
The diagnostic checks to ensure that each sector in the track is detected by
checking current sector field of the status word. The loop to read status
words is 13 instructions long. The simulator computes a current sector
number from the current time; this sector changes every 10 instructions.
Therefore, in a 13-instruction loop, a sector eventually will be skipped.
CAUSE: The timing model of the drum is incorrect. Sectors should increment
about every 256 instructions for the 2770/2771 and every 384 instructions
for the 2773/2774/2775.
RESOLUTION: Modify "dr_set_size" (hp2100_dr.c) to set the per-word transfer
time to reflect the model in use, and modify "GET_CURSEC" to determine the
sector number properly from the current simulation time.
STATUS: Fixed in version 3.3-0.
83. PROBLEM: The 2770 (DR) diagnostic fails the write test in step T.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H41 WRITE IN ST
E7 PARITY BIT ERROR
H44 TRACK 0000 SECTOR 00 WORD COUNT 0064
The diagnostic is expecting the parity error bit (bit 1) to be set at the
conclusion of writes when using the 12606 interface. This is an artifact of
the interface design.
CAUSE: The status return from the 12606 interface is not modeled properly.
RESOLUTION: Modify "drv_svc" (hp2100_dr.c) to return DRS_PER at the
conclusion of writes when configured as a 2770/2771 disk.
STATUS: Fixed in version 3.3-0.
84. PROBLEM: The 2770 (DR) diagnostic fails the track origin test in step T.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
E2 CLF OR SFS FAILED-CHANNEL 27
The diagnostic is expecting an SFS CC instruction to skip when the track
origin is detected. Section 3-62 of the "12606B Disc Memory Interface Kit
Operating and Service Manual" (12606-90012, March 1970) states, "If the
track origin has been passed since performance of the CLF instruction, a
program skip occurs." This is not occurring.
CAUSE: The track origin detection feature of the 12606 interface is not
implemented.
RESOLUTION: Modify "drcio" (hp2100_dr.c) to schedule an "origin passed"
event on the data channel when CLF is executed and to check to see if that
event timer is still running when SFS is executed to determine if the track
origin has passed.
STATUS: Fixed in version 3.3-0.
85. PROBLEM: The 2770 (DR) diagnostic fails the SCP flip-flop test in step T.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
E3 SFC FAILED WITH FLAG CLEAR-CHANNEL 27
The diagnostic is expecting an SFC CC instruction to skip when the SCP
(Sector Clock Phase) flip-flop is clear. Section 3-65 of the "12606B Disc
Memory Interface Kit Operating and Service Manual" (12606-90012, March 1970)
states, "If the SCP flip-flop is clear, a program skip takes place. If the
flip-flop is in the set state, no skip occurs." This is not occurring.
Also, the SCP flip-flop state is not being reflected in status bit 15
("Sector Flag").
Finally, the 12610 command-channel interface does not drive the SKF
backplane signal, so SFC CC on that interface should never skip.
CAUSE: The SCP test feature of the 12606 interface is not implemented.
RESOLUTION: Modify "drcio" (hp2100_dr.c) to skip when SFC CC is executed if
the simulated head position is more than three words from the end of the
current sector and the 12606 interface is selected, not to skip when SFC CC
is executed and the 12610 interface is selected, and to reflect the SCP
flip-flop state in bit 15 of the status word for both interfaces.
STATUS: Fixed in version 3.3-0.
86. PROBLEM: The 2770 (DR) diagnostic fails the read inhibit test in step 1.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H53 READ INHIBIT CHECK IN S1
E35 STATUS IS 0 011 001 110 000 100
SHOULD BE D DDD DDD D11 D00 100
H44 TRACK 0000 SECTOR 00 WORD COUNT 0000
The diagnostic is expecting the read inhibit bit (bit 6) to be set for one
sector time after an OTA/OTB instruction specifies a read operation when
using the 12606 interface. Section 4-113 of the "12606B Disc Memory
Interface Kit Operating and Service Manual" (12606-90012, March 1970)
states, "...The RI [Read Inhibit] signal from the disc ensures that at least
a full sector elapses between the occurrence of sector coincidence and the
setting of the SAC FF." This is not occurring.
CAUSE: The read-inhibit feature of the 12606 interface is not implemented.
RESOLUTION: Modify "drcio" (hp2100_dr.c) to save the simulation time when
an OTA/OTB is executed that specifies a read operation and to compare that
to the current simulation time when LIA/LIB is executed and set the Read
Inhibit status bit if one sector time has not elapsed.
STATUS: Fixed in version 3.3-0.
87. PROBLEM: The 2770 (DR) diagnostic fails the sector address check in step
1.
VERSION: 3.2-3
OBSERVATION: Running the diagnostic causes this failure:
H66 BEGIN S1
H21 SECTOR ADDRESS CHECK IN S1
E55 SECTOR 90 MISSING IN STATUS
H44 TRACK 0000 SECTOR 00 WORD COUNT 0000
The diagnostic checks to ensure that each sector in the track is detected by
checking current sector field of the status word. The sector counter is one
ahead of the sector currently under the head. For the 90-sector 2770/2771
disk, sector numbers are expected to range from 0 to 90, with the 90 state
being provided while the last sector is under the head, and the 0 state
being provided transiently between the "Track Origin" signal and the start
of the first sector.
Note that this problem does not occur on the 32-sector 2773/2774/2775 drum,
because the sector counter is only five bits long, so instead of indicating
sector 32 while sector 31 is under the head, the counter wraps around to
zero while the last sector is under the head, and the 0 state persists a
bit longer than the others.
CAUSE: The simulated sector counter is calculated incorrectly.
RESOLUTION: Replace the previous "GET_CURSEC" macro with a new "dr_seccntr"
function (hp2100_dr.c) to model the sector counter accurately.
STATUS: Fixed in version 3.3-0.
88. ENHANCEMENT: Add a TRACKPROT=n modifier to specify the number of protected
tracks and PROTECTED and UNPROTECTED modifiers to change the protection
state of the designated tracks to the 277x (DR) simulator.
VERSION: 3.2-3
OBSERVATION: The 12606/12610 interfaces provide a track protection switch
on the data channel card and specification of the number of tracks to be
protected. The simulation should provide this feature.
RESOLUTION: Modify "drc_mod" (hp2100_dr.c) to add track protection features
to the command channel (Bob says that this is a "controller" feature).
STATUS: Fixed in version 3.3-0.
89. PROBLEM: The 2767 line printer should not print non-printing characters.
VERSION: 3.2-3
OBSERVATION: The 2767 printer repertoire is the 64 character ASCII subset
from codes 32 to 95 (SPACE to "_"). Section 4-6 of the "2767A Line Printer
Operating and Service Manual" (HP 02767-90002) says, in part, "On entering
the print cycle, the characters in memory are checked for nonprintable
characters and scanned and compared against the output of the character
counter. Nonprintable characters are immediately erased from memory." This
does not occur with the LPS simulator; all characters are passed through to
the line printer image file.
CAUSE: There is no check for non-printing characters.
RESOLUTION: Modify "lps_svc" (hp2100_lps.c) to replace non-printing
characters with blanks (equivalent to the hardware not firing the associated
print hammer).
STATUS: Fixed in version 3.3-0.
90. PROBLEM: The 2767 line printer should overprint the current line if sent
more than 80 characters.
VERSION: 3.2-3
OBSERVATION: The 2767 printer drum is 80 columns wide. Section 4-4 of the
"2767A Line Printer Operating and Service Manual" (HP 02767-90002) says, in
part, "The 80 print positions are divided into four zones, each having 20
consecutive print positions," and Section 4-5 says, in part, "Up to 20
characters can be received and stored in this manner, and the print cycle is
started on receipt of either the 20th character or a format control
character." Section 4-8 says, "If the print cycle is originally initiated
on receipt of the 20th printable character, then signal ZCAV is generated
upon completion of printing. The zone control register is incremented by 1
and DEMAND LINE enabled. The next printable character received will be
printed in the leftmost position of zone 2." The implication is that
the 81st printable character sent will be printed in zone 1, column 1.
CAUSE: There is no check for the maximum character count per line.
RESOLUTION: Modify "lps_svc" (hp2100_lps.c) to output a CR after every 80
characters sent without an intervening LF or FF to simulate overprinting.
STATUS: Fixed in version 3.3-0.
91. PROBLEM: The DO command does not report errors to the log file.
VERSION: 3.3-0
OBSERVATION: Commands contained in a DO file that cause errors do not
report the errors to the console log file. They are reported to the
console. For example:
sim> set console log=wibble.log
Logging to file "wibble.log"
sim> wibble
Unknown command
sim> do wibble.sim (contains "wibble" as a command)
Unknown command
sim> quit
Goodbye
Log file closed
But wibble.log contains:
Logging to file "wibble.log"
sim> wibble
Unknown command
sim> do wibble.sim
sim> quit
Goodbye
Log file closed
Note that the second "Unknown command" message is missing from the log file.
CAUSE: "do_cmd" reports errors "stdout" only.
RESOLUTION: Modify "do_cmd" to report errors to "sim_log" if it is not
null.
STATUS: Fixed in version 3.3-1.
92. ENHANCEMENT: The T register now reflects changes to the M register made
during simulation stop.
VERSION: 3.3-0
OBSERVATION: On a real HP 21xx, the T (memory contents) register is updated
automatically after changing the M (memory address) register while the CPU
is halted. Under simulation during a simulation stop, this does not occur.
Providing it would very useful, though, as it would allow the ASSERT command
to test the contents of memory locations. In particular, it would allow the
diagnostics command file to test the Diagnostic Serial Number of the loaded
program to ensure that the expected value is present.
RESOLUTION: Modify "hp2100_cpu.c" to add a "sim_vm_post" routine that
updates the T register.
STATUS: Fixed in version 3.3-1.
93. PROBLEM: The 2767 and 2607 (LPS and LPT) simulators do not respond properly
to output operations initiated when the printers are powered off, offline,
or out of paper.
VERSION: 3.3-0
OBSERVATION: On the hardware, issuing an STC to start a print operation
with the power off or with the printer offline or out of paper sets the
control and command flip-flops, sending the "device command" signal to the
printer. The operation then "hangs" until the error is corrected, at which
point the "device flag" signal is returned to the card. This causes the
flag buffer and flag flip-flops to set, completing the operation.
On the simulator, the operation hangs forever if the paper is out, or
completes normally if the printer is powered off or offline. Both actions
are wrong.
CAUSE: There is no provision for detecting the correction of the foregoing
situations and rescheduling the I/O event.
RESOLUTION: Modify "lpt_svc" and "lps_svc" to stop execution if STOP_IOE is
set and the printer is powered off, offline, or out of paper. Add
"lpt_restart" and "lps_restart" routines to restart a hung I/O operation
when the printer is powered on, set online, or attached.
Modify "hp2100_defs.h" and "sim_stop_messages" (hp2100_sys.c) to add support
for STOP_OFFLINE and STOP_PWROFF simulator stop codes.
STATUS: Fixed in version 3.3-1.
94. PROBLEM: The column count on the 2767 printer doesn't increment when blanks
are substituted for non-printing characters.
VERSION: 3.3-0
OBSERVATION: Control characters sent to the printer are replaced by blanks
before being output to the file. However, the column counter does not
increment for the replaced characters.
CAUSE: Logic error in "lpsio".
RESOLUTION: Modify "lpsio" (hp2100_lps.c) to count replaced non-printing
characters in the column count.
STATUS: Fixed in version 3.3-1.
95. PROBLEM: Attempting to reboot RTE-IVB after a successful boot fails with
HLT 02.
VERSION: 3.3-0
OBSERVATION: Starting SIMH and booting RTE-IVB works as expected. However,
if the simulation is halted, and an attempt is made to boot RTE a second
time, the boot fails. Examination of memory shows that the bootstrap
extension is being loaded at the wrong address.
The 7900 boot loader outputs DMA control word 2 to select code 2, then sets
the control flip-flop on select code 2, then outputs DMA control word 3.
This sequence depends on the select code 2 control flip-flop (CTL2FF) being
clear before the loader executes. Examination shows that the BOOT command
is not clearing this flip-flop, so both outputs write to control word 3,
leaving control word 2 (the target address) set to 0.
CAUSE: The "dma0_reset" function is not clearing CTL2FF (on the hardware,
the front panel PRESET button clears CTL2FF).
RESOLUTION: Modify "dma0_reset" and "dma1_reset" (hp2100_cpu.c) to clear
the control flip-flops on select codes 2 and 3, respectively, as well as
clearing the control flip-flops on select codes 6 and 7.
STATUS: Fixed in version 3.3-1.
96. PROBLEM: The control flip-flops on select codes 2 and 3 (the DMA
initialization channels) are not visible.
VERSION: 3.3-0
OBSERVATION: Displaying the DMA channels shows the values of the control
(and flag, etc.) flip-flops for select codes 6 and 7. The control
flip-flops of channels 2 and 3 are not visible and may not be altered via
the simulator user interface.
CAUSE: CTL(2) and CTL(3) have no register assignments in the DMA devices.
RESOLUTION: Modify "dma0_dev" and "dma1_dev" (hp2100_cpu.c) to add
registers for the control flip-flops on select codes 2 and 3.
STATUS: Fixed in version 3.3-1.
97. PROBLEM: RESET erroneously clears the DMA control words 1-3.
VERSION: 3.3-0
OBSERVATION: Attempting to slow-boot RTE from a 7905 disc fails with a
"Data Overrun" error from the disc controller. Examination shows that the
disc read isn't performed because DMA Control Word 1 (select code) is zero.
CAUSE: The RESET (preset) that is done as part of the slow-boot process is
calling "dma0_reset", which is clearing the three DMA control words. The
12897B schematic shows that CRS does not alter the control registers.
RESOLUTION: Modify "dma0_reset" and "dma1_reset" (hp2100_cpu.c) to clear
the control words only on power-on reset.
STATUS: Fixed in version 3.3-1.
98. PROBLEM: DMA transfers to addresses 0/1 erroneously overwrite the A/B
register contents.
VERSION: 3.3-0
OBSERVATION: Attempting to boot RTE from a 7905 disc fails with a "Indirect
address loop" simulation halt. Examination shows that the B register, which
is being used as an address pointer, is corrupted by a DMA transfer from the
disc to address 00001. The disc read succeeds but overwrites the A and B
register contents in the process.
Section I, Paragraph 4-17, "Store Field", of the "HP 1000 M/E/F-Series
Computers Engineering and Reference Documentation" (HP 92851-90001) says:
"The A and B addressable flip-flops (ABFF) [38A] can be clocked at the
end of every microcycle. Addresses 0 and 1 are detected on the M-bus and
the flip-flops are set accordingly. When DCPC uses the M-bus the ABFFST
signal is suppressed."
CAUSE: The "ReadIO" and "WriteIO" routines, used by DMA, are not separating
accesses to locations 0/1 from accesses to A/B.
RESOLUTION: Modify hp2100_cpu.c to separate the A/B registers from memory
locations 0/1 and to map them equivalently, except during DMA accesses.
STATUS: Fixed in version 3.3-1.
99. ENHANCEMENT: Add SET CPU modifiers for 21MX-M and 21MX-E variants.
VERSION: 3.3-0
OBSERVATION: The RTE-6/VM startup routine ($STRT) determines whether it is
executing on a M-series or E-series by executing the TIMER instruction and
seeing if the B register is incremented. If it is, then OS microcode
instructions are used, but these are not supported by SIMH, and an
"Unimplemented instruction" simulation stop occurs. RTE-6/VM will boot if
the CPU is detected as an M-series.
RESOLUTION: Modify hp2100_cpu.c to add SET CPU 21MX-M and SET CPU 21MX-E
modifiers, and enable the TIMER instruction only if the E-series variant is
selected.
STATUS: Fixed in version 3.3-1.
100. PROBLEM: The JPY instruction does not work.
VERSION: 3.3-0
OBSERVATION: JPY is supposed to add the contents of P+1 to the Y register
and use the result as the jump target address. Actually, JPY is adding the
contents of P+2.
CAUSE: The "e_inst" array that indicates how to process operands for the
extended instructions has the wrong value for the JPY entry.
RESOLUTION: Modify "e_inst" (hp2100_cpu.c) to replace the erroneous "X_MR"
value with the correct "X_NO" value.
STATUS: Fixed in version 3.3-1.
101. PROBLEM: The JRS instruction does not perform a memory protect check on
the jump target.
VERSION: 3.3-1
OBSERVATION: A JRS to a location below the MP fence is allowed, presuming
that DMS conditions are satisfied.
CAUSE: The JRS simulation routine is missing a memory protect check on the
target address.
RESOLUTION: Add a call to "mp_dms_jmp" in the JRS simulator routine
(hp2100_cpu1.c) to validate the target address.
STATUS: Fixed in version 3.3-2.
102. PROBLEM: The EXECUTE instruction was never implemented on the 21MX-E.
VERSION: 3.3-1
OBSERVATION: Section 5.7, "Special Instructions," of the "HP 1000
M/E/F-Series Computers Engineering and Reference Documentation" (HP
92851-90001) documents three "unsupported" instructions added to the 21MX-E
series CPU: DIAG, TIMER, and EXECUTE. Examination of the microcode reveals
that the EXECUTE instruction (100120) was never implemented; the microcode
executes a NOP for this instruction code.
CAUSE: Improper documentation.
RESOLUTION: Alter "cpu_eau" (hp2100_cpu1.c) to handle EXECUTE as an
undefined instruction.
STATUS: Fixed in version 3.3-2.
103. PROBLEM: Rounding negative unpacked floating-point numbers may yield
unnormalized results.
VERSION: 3.3-1
OBSERVATION: The floating-point pack routine first rounds by adding +/-
1/2 LSB to the mantissa. If rounding causes a carry, the resulting value
is unnormalized. An overflow check is made on positive numbers (i.e.,
"011..." becoming "100..."), but no check for carry into the MSB-1 is made
for negative numbers ("101..." becoming "110...").
CAUSE: The case was omitted.
RESOLUTION: Modify "StoreFP" (hp2100_fp.c) to add a normalization check
for negative numbers.
STATUS: Fixed in version 3.3-2.
104. ENHANCEMENT: Add a command to abort command file execution if a specified
simulator condition is not met.
VERSION: 3.3-1
OBSERVATION: Command files need a means of reacting to unexpected program
behavior. Currently, if a program deviates from expected behavior, e.g.,
if a diagnostic fails, the command file will become unsynchronized with the
program, leading to nonsensical operation.
To provide an escape mechanism for this situation, a command that tests
assertions of the simulator state and aborts a running command file if the
assertion fails is needed. The syntax is:
ASSERT {<dev>} <reg>{<logical-op><value>}<conditional-op><value>
If <dev> is not specified, CPU is assumed. <reg> is a register (scalar or
subscripted) belonging to the indicated device. The <conditional-op> and
optional <logical-op> are the same as those provided by the "examine" and
"deposit" commands. The <value>s are expressed in the radix specified for
<reg>, not in the radix for the device.
If the <logical-op> and <value> are specified, the target register value is
first altered as indicated. The result is then compared to the <value> via
the <conditional-op>. If the result is false, an "Assertion failed"
message is printed, and any running command file is aborted. Otherwise,
the command has no effect.
RESOLUTION: Modify "scp.c" to add "assert_cmd" and associated command
table entries.
STATUS: Fixed in version 3.3-2.
105. ENHANCEMENT: The option flags for the various CPU models and options were
reorganized.
VERSION: 3.3-2
OBSERVATION: To simplify handling of optional instruction sets, the flags
describing the configuration of the simulated system are reorganized into
CPU type, model, and options. This allows simple testing of a class of
machines (e.g., all 21MX models) or installed options (e.g., IOP microcode
on any CPU), without having to test each possible machine/option
combination.
RESOLUTION: Modify option flags in "hp2100_cpu.c" and "hp2100_cpu.h" to
reflect logical hardware grouping and change "cpu_set_opt" accordingly.
STATUS: Fixed in version 3.4-0.
106. ENHANCEMENT: Modularize the handling of optional instruction sets to allow
for future microcode option simulations.
VERSION: 3.3-2
OBSERVATION: The current CPU simulation decodes all UIG instructions
inline, so that microcode options that share instruction codes (e.g., the
2100 IOP and the 2100 FP/FFP) must have tests for CPU type at each code
point. Also, tabular instruction operand processing is complicated when
instructions with differing requirements share code points.
RESOLUTION: Split optional CPU instruction (EAU/UIG) processing into its
own source file (hp2100_cpu1.c), represent each option as a function that
determines CPU applicability and decodes its own instructions, and
restructure operand processing so that it is per-option-module, rather than
global for all options.
STATUS: Fixed in version 3.4-0.
107. ENHANCEMENT: Add the Fast FORTRAN Processor (FFP) microcode option.
VERSION: 3.3-2
OBSERVATION: The Pascal/1000 compiler will not load in an RTE system with
a three-page driver partition if the FFP option is not present (required to
reduce code size to fit the logical address space). Also, RTE systems
generated with the FFP option will not run unless the option is present.
RESOLUTION: Add a simulation of the FFP to "hp2100_cpu1.c", add a new
extended-precision floating point module "hp2100_fp1.c", and add FFP
helpers to "hp2100_fp.c" for single-precision operations.
STATUS: Fixed in version 3.4-0.
108. ENHANCEMENT: Separate the online/offline and attach/detach functions for
the magnetic tape and disc drive simulations.
VERSION: 3.3-2
OBSERVATION: Currently, devices that have loadable media and an offline
mode simulate both via attach and detach, i.e., attached implies online,
and detached implies offline. It is desirable to separate the two, so that
performing a magnetic tape "rewind/offline" command or disc "head unload"
action does not detach the image file.
The RTE tape backup programs set the tape units offline when they are
exited, and it is awkward to have to respecify the image filename in an
attach command in order to put the unit back online for a succeeding
operation (the real tape drive merely requires pressing the "ONLINE"
button). Also, being able to "down" untargeted disc drives when performing
certain read/write operations, e.g., new system installation, is a useful
safety measure (simply toggling the "UNLOAD" switch accomplishes this on a
real disc drive).
RESOLUTION: Modify "hp2100_ms.c" to add SET OFFLINE/ONLINE and
"hp2100_dp.c", "hp2100_dq.c", and "hp2100_ds.c" to add SET UNLOADED/LOADED
commands, as well as to decouple setting a device offline from detaching
the associated image file.
STATUS: Fixed in version 3.4-0.
109. ENHANCEMENT: Allow the DO command to nest to some finite level.
VERSION: 3.3-2
OBSERVATION: Allowing a limited depth of nested DO invocations is useful
for modularizing simulator command files. The current prohibition is not
necessary, as "do_cmd" is reentrant.
RESOLUTION: Modify "do_cmd" (scp.c) to allow DO command nesting, provide a
recursion counter to disallow infinite nesting, and alter the text of the
SCPE_NEST error to reflect allowed nesting.
STATUS: Fixed in version 3.4-0.
110. PROBLEM: SET <device> DEBUG=n1,n2,... doesn't work.
VERSION: 3.3-2
OBSERVATION: For devices with multiple debug flags, trying to set more
than one with the above command fails with "Non-existent parameter."
Setting the flags one at a time with separate commands works as expected.
CAUSE: The command parser breaks SET commands at commas, so "n2" is
interpreted as the next top-level SET command, rather than as another debug
flag.
RESOLUTION: Alter the debug flag separator from "," to ";".
STATUS: Fixed in version 3.4-0.
111. ENHANCEMENT: Allow SET <device> DEBUG to mean "set all debug flags."
VERSION: 3.3-2
OBSERVATION: Currently, if a device has multiple debug flags, SET <device>
DEBUG is rejected. To set all flags, they must be specified individually.
RESOLUTION: Alter "set_dev_debug" (scp.c) to set all debug flags if none
are specified in the SET <device> DEBUG command.
STATUS: Fixed in version 3.4-0.
112. ENHANCEMENT: Improve reporting of conflicting I/O assignments.
VERSION: 3.5-1
OBSERVATION: The current "dev_conflict" (hp2100_cpu.c) routine has
three behaviors that might be improved:
1. It reports only the first device conflict encountered.
2. It reports the name and select code of only one of the two
conflicting devices.
3. It reports the select code in decimal.
Here is a console log demonstrating these behaviors:
sim> set ds dev=12
sim> set muxm dev=12
sim> set lpt dev=13
sim> run
DS device number conflict, devno = 10
Simulation stopped, P: 00000 (NOP)
We altered the default configuration to place PTP, DS, and MUXM at
select code 12 (octal), and CLK and LPT at select code 13 (octal).
Note that the above reported select code (10) is decimal.
RESOLUTION: Modify "dev_conflict" behavior as follows:
1. Report all device conflicts in ascending select code order.
2. Report device names for all conflicting devices.
3. Report conflicting select codes in octal.
Here is the same console log demonstrating the enhanced behaviors:
sim> set ds dev=12
sim> set muxm dev=12
sim> set lpt dev=13
sim> run
Select code 12 conflict: PTP and DS and MUXM
Select code 13 conflict: CLK and LPT
Simulation stopped, P: 00000 (NOP)
STATUS: Fixed in version 3.5-2.
113. PROBLEM: "SET CONSOLE DEBUG" with no parameter crashes the simulator.
VERSION: 3.6-0
OBSERVATION: Entering "SET CONSOLE DEBUG" without the "=<parameter>"
causes the simulator to crash with an access error.
CAUSE: Null pointer dereferenced in "sim_set_debon".
RESOLUTION: Return SCPE_2FARG if "cptr" is null (no parameter supplied) or
points to a null character (empty parameter supplied).
STATUS: Fixed in version 3.6-1.
114. PROBLEM: Nested command files do not abort on assertion failure.
VERSION: 3.6-0
OBSERVATION: While a failed assertion will abort a running command file,
it will not abort if the assertion is in a nested command file invocation.
CAUSE: "do_cmd" is always passing back SCPE_OK, regardless of whether an
invoked command returns an error status. This is apparently an attempt to
avoid duplicate error messages if the last command in a command file fails
(the error is printed within "do_cmd" and then again in the main command
loop).
RESOLUTION: Modify "do_cmd" (scp.c) to return all command error codes and
to return SCPE_OK on command file EOF.
STATUS: Fixed in version 3.7-0.
115. ENHANCEMENT: Provide an -E switch to DO to abort a command file on any
error.
VERSION: 3.6-0
OBSERVATION: Current DO processing ignores command errors. That is, if a
command returns an error, the error message is printed, but processing
continues with the next command in the file. This is inherently risky, as
command files must be written with the expectation that every command will
succeed (because there is no error trapping or conditional execution).
RESOLUTION: Add a new -E switch to cause command file execution to be
aborted at the first error encountered. Note that SCPE_STEP is not
considered an error, and simulator-specific errors, e.g., "infinite
indirect loop," does not cause an error abort (simulator limitation).
STATUS: Fixed in version 3.7-0.
116. ENHANCEMENT: Two gcc compiler warnings are corrected.
VERSION: 3.6-0
OBSERVATION: Running gcc in strict ISO C99 standard mode (-std=c99 -Wall
-pedantic) reveals two warnings:
HP2100/hp2100_mux.c:160: warning: missing braces around initializer
HP2100/hp2100_mux.c:160: warning: (near initialization for `mux_ldsc[0]')
and:
sim_ether.c: In function `eth_mac_scan':
sim_ether.c:271: warning: short unsigned int format, short int arg (arg 3)
CAUSE: The first warning is due to an incompletely specified declaration.
The variable is an array of structures, so the (partial) initializer should
be "{ { 0 } }" but is actually "{ 0 }".
The second warning is due to a mismatch between a "sscanf" format and the
corresponding parameter type. The format, "%hx", requires a short unsigned
int parameter, but the parameter is declared as short int.
RESOLUTION: The code causing the warnings is corrected.
STATUS: Fixed in version 3.7-0.
117. PROBLEM: The 7970 magnetic tape simulator defaults tape capacity to a
300-foot reel instead of to an unlimited-size reel.
VERSION: 3.6-0
OBSERVATION: In the absence of an explicit size command, the 7970 tape
drive reel size is intended to default to an unlimited size, wherein EOT
never occurs. In fact, EOT occurs after 300 feet.
CAUSE: The logic was inadvertently broken on February 16, 2006 when the
"revision for new EOT test" was made.
RESOLUTION: Remove the "capac" assignments in "mscio" and "msc_svc" and
add an assignment to "ms_set_reelsize" (hp2100_ms.c), allowing the default
capacity to remain as 0 (a zero capacity causes "sim_tape_eot" to return
FALSE).
STATUS: Fixed in version 3.6-1.
118. ENHANCEMENT: Add CAPACITY to 7970 simulator as an alternate to REEL.
VERSION: 3.6-0
OBSERVATION: Other magnetic tape simulators allow setting a CAPACITY to
indicate the number of megabytes to read or write before returning EOT.
The 7970 simulator REEL size predated CAPACITY, but it's desirable for
commonality if both were allowed.
RESOLUTION: Alter hp2100_ms.c to support SET CAPACITY in addition to
SET REEL, and enhance SHOW to display the capacity in MB or feet as
appropriate.
STATUS: Fixed in version 3.6-1.
119. PROBLEM: The RTE off-line magnetic tape restore program (DSKUP) hangs on
the first write to the 79xx/13037 disc.
VERSION: 3.6-1
OBSERVATION: The RTE offline restore program hangs when it tries to write
to the 79xx disc. The program is looping in a routine that obtains drive
status by sending the REQUEST STATUS command to the drive.
CAUSE: The program expects that the REQUEST STATUS operation will clear
the status. If this operation returns DRIVE ATTENTION, the program loops
until it does not. However, the simulator does not the clear status value,
so after the seek completes, DRIVE ATTENTION is returned forever.
Page 10-10 of the 13037 Disc Controller Technical Information Package (HP
13037-90902, August 1980) contains this description of the REQUEST STATUS
command:
"After receipt of this command, the controller returns two status words
to the interface. [...] The controller then clears Status-1 and waits
for a command from the same interface or a timeout to occur."
The controller firmware routine STATS handles the status request. It calls
routine CLRST. The comment for the CLRST routine is, "Subroutine CLRST
clears status for all commands but status request," but examination of the
routine shows that it is unconditional.
RESOLUTION: Modify the "DSC_RSTA" case in "ds_docmd" (hp2100_ds.c) to
clear status-1 after returning it.
STATUS: Fixed in version 3.7-0.
120. ENHANCEMENT: Separate TTY mode settings so that keyboard and display may
be set independently.
VERSION: 3.6-1
OBSERVATION: HP terminals had a CAPS LOCK setting that allowed upper-case
input with mixed-case output. The current TTY simulator allows several I/O
options, but the keyboard and display settings are locked together.
RESOLUTION: Modified "tty_set_opt" (hp2100_stddev.c) to allow keyboard
(TTY0) and display (TTY1) to be set independently.
STATUS: Fixed in version 3.7-0.
121. ENHANCEMENT: Add the HP 93585A double integer instruction set firmware
option.
VERSION: 3.6-1
OBSERVATION: Later versions of RTE-6/VM were not supported on the 21MX
M-Series due to logical address space limitations. The RTE-6 OS and VMA
firmware options were not available for the M-Series, and some vital system
programs exceeded the available address space and failed to load when the
software equivalents were used. To run these programs, either the OS/VMA
or double integer firmware support must be added to reduce the address
space required.
RESOLUTION: Add an implementation of the double integer instruction set to
"hp2100_cpu1.c" and add "DBI/NODBI" options to "cpu_mod[]" (hp2100_cpu.c)
to enable and disable the instructions. Note that the 93585A product
worked only on the E-Series, but it is available under simulation on the
M-Series as well.
STATUS: Fixed in version 3.7-0.
122. ENHANCEMENT: Add "1000-M" and "1000-E" CPU options as synonyms for
"21MX-M" and "21MX-E".
VERSION: 3.6-1
OBSERVATION: The 21MX computer series was renamed the 1000 series with the
introduction of the F-Series in 1978. The 21MX/21MX-M became the 1000
M-Series, and the 21XE/21MX-E became the 1000 E-Series. There is some
internal HP documentation that refers to the F-Series as the 21MX-F, but
the machine was introduced as the 1000 F-Series, and the other machines
were renamed at the same time.
RESOLUTION: Modify "cpu_mod[]" (hp2100_cpu.c) to add "1000-M" and "1000-E"
options.
STATUS: Fixed in version 3.7-0.
123. ENHANCEMENT: The DMA device is automatically assigned the logical name
"DCPC" when SET CPU 21MX is done.
VERSION: 3.6-1
OBSERVATION: The term "DMA" is used with the 2116 and 2100 machines. For
the 21MX, the equivalent card is termed the "Dual Channel Port Controller."
"DCPC" is used exclusively in the HP 21MX literature, and users are used to
working with the "DCPC" name.
RESOLUTION: Modify "cpu_set_opt" (hp2100_cpu.c) to assign and deassign
logical names in response to SET CPU 2116/2100/21MX commands, and add
"assign_device" and "deassign_device" (scp.h) to the list of global
routines.
Note that this enhancement does not proscribe users from using the DMA
device name with 21MX simulations.
STATUS: Fixed in version 3.7-0.
124. PROBLEM: Running FC under RTE aborts the simulation with an "Invalid
magtape record length" error.
VERSION: 3.6-1
OBSERVATION: Attempting to run the RTE "FC" ("File Copy") tape archive
program to generate a tape image fails. The Read command is failing with
tape library error 4, "Invalid record length."
Enabling the debug mode of the 7970 tape drive simulator reveals that FC is
attempting to leave space at the beginning of the tape for the archive
directory by issuing a series of GAP commands. After the files are stored,
the tape is rewound, and the directory is written, intending to overwrite
the erased area.
CAUSE: FC writes items to the tape in this order: header, marker, comment,
directory, data file(s), and two EOFs. FC is issuing GAP commands to leave
space at the start of the tape for the tape header, which must be written
after the tape is complete, because the header indicates the number of data
files that fit on the tape.
The SIMH mag tape library does not implement the "erase gap" feature, and
the 7970 simulator treats GAP as a NOP, so no space is reserved at the
start of the tape image. When FC rewinds and writes the directory, it
overwrites the existing records, resulting in a corrupt tape image.
RESOLUTION: Implement an "erase gap" feature in the SIMH tape library by
defining GAP metadata markers, adding a "sim_tape_wrgap" command and
enhancing the "sim_tape_rdlntf" and "sim_tape_rdlntr" internal functions to
skip over GAP metadata markers (sim_tape.c). Alter the 7970 simulator
(hp2100_ms.c) to use it. Also, update the "mtdump" utility to report erase
gaps in tape images.
Note: All HP 7970 mag tape drivers (SIO, BCS, DOS, RTE) employ the GFM
(erase gap and write file mark) command to write an EOF to tape. Also, the
tape diagnostic tests that an initial gap precedes the first data record or
EOF written at BOT (a function of the interface card). Consequently,
generated tape images contain substantial amounts of GAP metadata. In
almost all cases, they are unnecessary. Therefore, these gaps are written
only if the REALTIME option is selected. Note that this does not affect
the GAP command itself, which always writes gap metadata to tape images.
STATUS: Fixed in version 3.7-0.
125. ENHANCEMENT: Improve error reporting from the 7970 tape simulator.
VERSION: 3.6-1
OBSERVATION: The new "erase gap" support is only implemented for
SIMH-format tape images. Attempting to write an erase gap with other
formats selected correctly returns MTSE_FMT from the library. However, the
7970 simulator maps that error (and the MTSE_UNATT error) to SCPE_IERR.
The resulting "Internal error" message does not help the user identify the
source of the problem.
RESOLUTION: Modify "ms_map_err" (hp2100_ms.c) to return SCPE_FMT and
SCPE_UNATT for the tape library errors MTSE_FMT and MTSE_UNATT,
respectively.
STATUS: Fixed in version 3.7-0.
126. PROBLEM: "calc_dma" and "calc_int" are being called needlessly for most
UIG 0 and UIG 1 instructions.
VERSION: 3.6-1
OBSERVATION: The "calc_dma" and "calc_int" routines must be called after
any routine that might change the I/O priority chain or set SRQ. This
would be after any I/O Group instruction or card I/O action (i.e., card
service routine called).
In "hp2100_cpu.c", the dispatch points for "cpu_uig_0" and "cpu_uig_1" call
these routines unconditionally, but they're only needed if an IOP "PRFIO"
or "PRFEI" instruction is executed (these execute standard I/O instructions
as part of their actions).
CAUSE: The current code was a temporary expediency when the IOP
instructions were moved into a separate source module.
RESOLUTION: Define a new "NOTE_IOG" status return (hp2100_defs.h) to
request recalculation of I/O interrupts after instruction execution
completes, and rename "STOP_INDINT" to "NOTE_INDINT" to reflect that it
notifies the main instruction execution loop of an interruptibility
condition, rather than stopping the simulation. Alter "iogrp" and
"resolve" (hp2100_cpu.c) respectively, to use these notification codes.
STATUS: Fixed in version 3.7-0.
127. ENHANCEMENT: Use the tape simulator library routine "sim_tape_bot" to
determine BOT status dynamically for the 7970 simulator.
VERSION: 3.6-1.
OBSERVATION: The 7970 simulator maintains its own BOT status by tracking
rewinds and motion commands. It would be simpler to use the routine
provided by the tape simulation library for this, rather than tracking each
tape movement.
Note that prior to the addition of erase gap support, this would not work.
The diagnostic moved the tape off of BOT by using the GAP command, but this
was a NOP for the tape simulation library, and the tape remained at BOT,
leading to diagnostic failures.
RESOLUTION: Modify "hp2100_ms.c" to use "sim_tape_bot" instead of tracking
BOT internally.
STATUS: Fixed in version 3.7-0.
128. PROBLEM: Sending a "controller clear" command to the 7970 magnetic tape
simulator may cause an unintended write.
VERSION: 3.6-1
OBSERVATION: Clearing a write-in-progress properly writes any accumulated
partial record. Sending a second clear may write the record again.
CAUSE: Receipt of a CLR command initiates a check for a write-in-progress
among active units. If the data buffer pointer is non-zero, then partial
data has been accumulated, and this is written to the tape image. The data
buffer pointer is normally zeroed when a write record command is received
and the command time delay has transpired.
If a second write command is sent, and another CLR is done before the
command time has transpired (and therefore before any data has been
received from the CPU), then the previous partial record will be written
again. This happens because the buffer pointer was not cleared and so
implies the presence of another partial buffer of data.
RESOLUTION: Modify "mscio" (hp2100_ms.c) to clear the buffer pointer
after a partial record is written.
STATUS: Fixed in version 3.7-0.
129. ENHANCEMENT: Improve debugging information from the 7970 simulator.
VERSION: 3.6-1
OBSERVATION: Debugging problems such as the "controller clear" bug would
be easier if the debug logging decoded the tape commands and included all
controller actions. Currently, tape commands are reported in octal, and
only some actions are reported.
RESOLUTION: Modify "hp2100_ms.c" to add additional debug logging and debug
flags to select subsets of the available information.
STATUS: Fixed in version 3.7-0.
130. ENHANCEMENT: Partition the various microcode options in "hp2100_cpu1.c"
into separate modules for easier maintenance.
VERSION: 3.6-1
OBSERVATION: With the addition of the double integer instructions and
potential addition of the RTE-6/VM OS and VMA instructions, the microcode
option source module, "hp2100_cpu1.c", is becoming unwieldy. It is
currently the largest HP source module -- about 50% larger than the rest of
the CPU implementation.
RESOLUTION: Move the microcode options into separate source files, grouped
by function, and restrict "hp2100_cpu1.c" to contain dispatching and common
routines.
STATUS: Fixed in version 3.7-0.
131. PROBLEM: Errors in nested command files give no indication where the error
occurred.
VERSION: 3.6-1
OBSERVATION: Unless the -V switch is specified, errors in command files
report the error message but not the offending command. With the advent of
nested command files, the problem becomes more acute, as there is no
indication in which of perhaps several nested command files the offending
command is located, nor even which command is causing the error. And
because -V is not transitive, each DO command appearing in each command
file must be edited to add the -V switch if the error is to be located.
CAUSE: The implication of errors in nested command files was overlooked
when nesting was enabled.
RESOLUTION: Modify "do_cmd" (scp.c) to echo commands causing errors,
regardless of the -V switch, unless -Q (quiet) is supplied when starting
SIMH. Also, report the name of the file containing an offending command.
Note: because commands returning error status are now displayed, error
message processing for the ASSERT command is simplified. In particular,
the extra code that merged the assertion into the error message is no
longer required.
STATUS: Fixed in version 3.7-0.
132. PROBLEM: The simulator stops with an "Indirect address loop" error when
running the HP 1000-F FFP diagnostic .GOTO test.
VERSION: 3.6-1
OBSERVATION: According to the HP 2100 documentation, the simulator will
stop if "more than INDMAX indirect references are detected during memory
reference address decoding." INDMAX defaults to 16. However, attempting
a reference with exactly 16 indirects stops the simulator with an "Indirect
address loop" error.
CAUSE: The indirect address resolution loop in the "resolve" function
executes a maximum of INDMAX times. However, the decision to report an
error considers only whether the loop counter reached INDMAX and not
whether the indirect chain was resolved. Therefore, resolution on the last
available pass through the loop is still reported as an error.
RESOLUTION: Modify "resolve" (hp2100_cpu.c) to report an error if the
indirect chain is not resolved after exiting the loop.
STATUS: Fixed in version 3.7-0.
133. ENHANCEMENT: Add support for the HP 1000 F-Series CPU model.
VERSION: 3.6-1
OBSERVATION: The Fast FORTRAN Processor option adds simulation support for
three-word floating-point operations. Generalizing these to support two,
three, and four-word operations would allow simulation of the F-Series
floating-point processor.
RESOLUTION: Rework the FFP arithmetic simulations (hp2100_cpu3.c) into
general operations on multiple-precision operands. Add support for the
F-Series FPP instructions. Add support for the F-Series Scientific
Instruction Set (SIS) firmware. Add "1000-F" as a CPU option
(hp2100_cpu.c).
Note: rather than have two floating-point simulations (hp2100_fp.c and
hp2100_fp1.c) that provide the two-word single-precision floating-point
instructions, they are alternately conditionally compiled, depending on
whether 64-bit integers are supported. As the FPP depends on this support,
compiling with it enables the FPP and therefore the F-Series option, and
"hp2100_fp1.c" handles the single-precision instructions for the other CPU
models. If 64-bit support is not available, then "hp2100_fp.c" handles the
single-precision instructions, and the F-Series is not available.
STATUS: Fixed in version 3.7-0.
134. ENHANCEMENT: Add support for the 2114 and 2115 CPU models.
VERSION: 3.6-1
OBSERVATION: The 2114 and 2115 are reduced-feature versions of the 2116
computer. One could restrict the 2116 environment to give an approximation
of the 2114 and 2115. However, these units used a unique DMA card that
behaved somewhat differently than that used in the 2100 and 1000 (the 12607
card for the 2114 supported only one DMA channel, for example). So it
would be desirable to support the 2114 and 2115 directly and therefore more
faithfully.
RESOLUTION: Add "2114" and "2115" CPU model options (hp2100_cpu.c).
STATUS: Fixed in version 3.7-0.
135. ENHANCEMENT: Add support for 12K and 24K memory sizes.
VERSION: 3.6-1
OBSERVATION: The 2114 and 2115 CPUs supported up to 16K of memory in 4K
increments. For accurate simulation, finer granularity than the current
4K/8K/16K/32K choices is needed.
RESOLUTION: Alter the table of memory size (hp2100_cpu.c) to add 12K and
24K options.
STATUS: Fixed in version 3.7-0.
136. PROBLEM: The DMS self-test instruction (10x701) should be a NOP on 1000-M
machines.
VERSION: 3.6-1
OBSERVATION: The DMS self-test instruction should complement the A or B
register only on the 1000-E and F. On the M, it should be a NOP. In fact,
it complements on the M as well.
CAUSE: Oversight.
RESOLUTION: Modify "cpu_dms" (hp2100_cpu2.c) to execute 10x701 as NOP on
M-Series machines.
STATUS: Fixed in version 3.7-0.
137. ENHANCEMENT: Add support for 21xx loader enable and disable.
VERSION: 3.6-1
OBSERVATION: The 21xx CPUs are core-based machines. Binary loaders are
kept in the top 64 memory locations and are protected from reading and
writing by front panel LOADER ENABLE switches. When the switch is off,
main memory effectively ends 64 locations earlier, i.e., the loader area is
treated as non-existent. Some 21xx diagnostics test for this feature and
will not proceed if the loader area is unprotected.
RESOLUTION: Modify hp2100_cpu.c to add loader protection for 21xx models.
STATUS: Fixed in version 3.7-0.
138. PROBLEM: The General Purpose Register Diagnostic fails when run on a 2100.
VERSION: 3.6-1
OBSERVATION: The GP register diagnostic and other diagnostics that test
the I/O system fail when run on 21xx CPUs. The failure is in the Basic I/O
test, Test 00. The failure is, "E015 INT RTN ADDR ERROR."
CAUSE: The 21xx and 1000 CPUs behave differently when holding off
interrupt requests after executing certain instructions. At instruction
fetch time, a pending interrupt request may be deferred if the previous
instruction was a JMP indirect, JSB indirect, STC, CLC, STF, CLF, SFS (1000
only), or SFC (1000 only), or was executing from an interrupt trap cell.
If the CPU is a 1000, then the request is always deferred until after the
current instruction completes. If the CPU is a 21xx, then the request is
deferred unless the current instruction is an MRG instruction other than
JMP or JMP,I or JSB,I. Note that for the 21xx, SFS and SFC are not
included in the deferral criteria.
RESOLUTION: Modify "sim_instr" (hp2100_cpu.c) to clear "ion_defer" if
executing on a 21xx-series CPU and the current instruction is an MRG
instruction other than JMP or JMP,I or JSB,I.
STATUS: Fixed in version 3.7-0.
139. PROBLEM: The 2100-specific Memory Protect Diagnostic fails when testing
indirect holdoffs.
VERSION: 3.6-1
OBSERVATION: Running the 2100-specific MP diagnostic fails, even though
the combined 2100/21MX MP diagnostic passes. The failure is:
E26. RETURN ADDRESS INCORRECT FOR CHAINED JMP,I INTERRUPTS
CAUSE: The memory protect feature adds an indirect counter that allows a
pending interrupt to be serviced if more than three levels of indirection
are encountered. Currently, the "resolve" routine handles this by
returning a status code that aborts the current instruction if an interrupt
is pending and the third indirect level is encountered. However, the
actual action of the hardware is to clear any interrupt deferral at the
third level and to abort the instruction at the fourth. The diagnostic
tests that a two-level JMP,I jumps and defers interrupts, a three-level
JMP,I jumps and then allows interrupts, and a four-level JMP,I aborts and
then allows interrupts.
RESOLUTION: Modify "resolve" (hp2100_cpu.c) to obey the foregoing rules,
and modify "sim_instr" to set "ion_defer" before calling "resolve" for
JMP,I and JSB,I instructions.
STATUS: Fixed in version 3.7-0.
140. PROBLEM: The 2114/2115/2116/2100 DMA diagnostic fails with an unexpected
trap cell halt.
VERSION: 3.6-1
OBSERVATION: Running the 21xx-specific DMA diagnostic fails, even though
the combined 2100/21MX DMA diagnostic passes. The failure manifests itself
as an unexpected trap cell halt, 106002.
CAUSE: The diagnostic issues STF 6 and STC 6 instructions to cause a DMA
interrupt without a transfer to test the priority chain. This sets the
transfer (command) flip-flop on SC 6. In the next test, it does a CLC 0
and then sets up a one-word DMA transfer from the test device. Then it
asserts device SRQ by doing CLC SC and STF SC, and finally it starts the
device and DMA with STC SC and STC 6,C.
However, with command set, asserting SRQ starts the transfer immediately,
even though the control flip-flop is clear. So the word count has rolled
over to zero and the transfer terminated by the time the STC 6,C is done to
"start" the transfer. At that point, a second transfer is started, and the
word count of zero implies a transfer of 64K words, which begins scribbling
over memory. As the value 140000 had been written to the card before the
transfer, and as the card is in a loopback mode, 140000 is read from the
card on each transfer, and so this value overwrites memory. Eventually,
the diagnostic attempts a jump indirect through an overwritten location.
The target value 140000 is interpreted as a DEF 40000,I, and because
location 40000 contains zero, control transfers to location 0, leading to
execution of the trap cell halt 106002 in location 2.
The problem is that the simulator incorrectly implements CRS ("Control
Reset," the backplane signal that is generated by the CLC 0 instruction) by
sending a CLC SC to each I/O card. For many cards, CLC 0 (CRS) and CLC SC
(CLC) invoke the same action. They do not on the DMA card, which clears
the control flip-flop for CLC, but clears the control and command
flip-flops for CRS. Clearing the command flip-flop prevents the DMA
transfer from starting until the STC 6,C instruction in the diagnostic is
executed.
RESOLUTION: Modify "cpuio" (hp2100_cpu.c) to send a new signal, "ioCRS",
in response to CLC 0 and modify the I/O handlers of all devices to handle
"ioCRS" as "ioCTL" temporarily until each card response can be verified
from the schematics.
STATUS: Fixed in version 3.7-0.
141. PROBLEM: The 12566B diagnostic interface card (LPS) does not clear the
command flip-flop when CLC is done.
VERSION: 3.6-1
OBSERVATION: In SET LPS DIAG mode, a 12566B microcircuit interface card
with a loopback connector is simulated. This is provided for the use of
certain diagnostics that test the I/O system. Attempting to use this
simulation with the 2114/2115/2116/2100 DMA diagnostic fails with:
E136. D1-I/O FLG SET
even though the combined 2100/21MX DMA diagnostic passes.
CAUSE: The diagnostic requires that jumper W9 be set to the "A" position.
This enables clearing of the device command flip-flop when the CLC
instruction is executed. Clearing CMD is intended to stop any I/O in
progress.
The diagnostic sets up a one-word output with STC and CLC specified in the
control word. At the end of the transfer, "dma_cycle" (hp2100_cpu.c)
correctly sends LPS a STC,C followed by a CLC,C. The STC,C starts a
transfer and therefore schedules an I/O event for completion in one
instruction. The CLC,C clears the control flip-flop and the device flag,
but because "sim_cancel" is not called, the I/O event remains. When it
fires, the device flag is set. The diagnostic is expecting the flag to be
clear.
The 2100/21MX diagnostic tests for flag clear by using a control word that
has neither STC nor CLC present. This generates a CLF to the interface,
which correctly clears the device flag (without starting another
operation).
RESOLUTION: Modify "lpsio" (hp2100_lps.c) diagnostic mode to latch the
input data on STC and schedule the command clear and flag set in two
instructions. Also, clear the command flip-flop and cancel any pending I/O
event if CLC is executed in diagnostic mode. This more correctly
implements the response of the hardware under DMA control.
STATUS: Fixed in version 3.7-0.
142. ENHANCEMENT: Add diagnostic loopback capability to the 12920A multiplexer.
VERSION: 3.7-0
OBSERVATION: To run the HP multiplexer diagnostic, a loopback cable is
needed that interconnects two ports. To test all sixteen ports, eight
cables are needed, or the diagnostic must be run eight times while moving
the single cable from port pair to port pair. The diagnostic cannot be run
under simulation, because the 12920A simulator does not provide loopback
capability.
RESOLUTION: Add DIAG/TERM commands to switch between diagnostic cable
(loopback) mode and terminal cable (Telnet connection) mode.
STATUS: Fixed in version 3.7-1.
143. PROBLEM: The 12920A multiplexer control card diagnostic fails in test 0.
VERSION: 3.7-0
OBSERVATION: Running the control diagnostic reports this failure:
TEST 00
E027 PRESET DID NOT CLEAR STATUS ON PORT 01
The diagnostic is testing each channel after PRESET to verify that the
status is reset, but the value returned is not as expected.
CAUSE: Page 3-6, paragraph 3-38 of the multiplexer service manual states,
"The channel number is four bits (10 through 13) of every output or input
word. When the scan bit is cleared (logic 0) during an OTA/B command, the
channel number does not change and the status of the same channel is loaded
by the next LIA/B command." The diagnostic sets the channel number by an
OTA to the control card select code. However, the "ioOTX" handler in
"muxcio" is not setting the channel to the supplied value for subsequent
LIA/B use.
RESOLUTION: Set "muxc_chan" (hp2100_mux.c) to the channel number supplied
in the "ioOTX" handler in "muxcio."
STATUS: Fixed in version 3.7-1.
144. PROBLEM: The 12920A multiplexer control card diagnostic fails in test 4.
VERSION: 3.7-0
OBSERVATION: Running the control diagnostic reports this failure:
TEST 04
E034 STORED STATUS NO. 1 FAILED TO INTERRUPT
The diagnostic sets the multiplexer channel to interrupt on a change in S1
status, but the interrupt did not occur as expected.
CAUSE: The "mux_cntl_int" returns immediately if "muxc_scan" (the scan
bit) is zero. This behavior is incorrect; with the scan bit set to zero,
only the current channel should be tested for interrupt.
Note that Figure 3-3, the "Simplified Schematic Diagram" on page 3-9 of the
service manual shows that the status interrupt is conditional on the scan
bit, but the actual schematic in figure 5-4 on page 5-15 shows that this is
not the case.
RESOLUTION: Modify "mux_cntl_int" (hp2100_mux.c) to test the current
channel for a status interrupt condition if "muxc_scan" is zero, rather
than returning directly.
STATUS: Fixed in version 3.7-1.
145. PROBLEM: The 12920A multiplexer data card diagnostic fails in test 1.
VERSION: 3.7-0
OBSERVATION: Running the data diagnostic reports this failure:
TEST 01
E032 SEND PORT NUMBER IS 00 SHOULD BE 01
The diagnostic is reading the transmitted data from the lower select code
to determine the transmit channel, but the channel number is wrong.
CAUSE: The "mux_data_int" function is setting only the upper select code
status value in response to a transmit interrupt. The lower select code
card schematic, figure 5-3 on page 5-11 of the service manual, shows that
the interrupting channel number is presented on bits 14-10 of the status
words supplied by both the upper and lower cards.
RESOLUTION: Modify "mux_data_int" (hp2100_mux.c) to set "muxl_ibuf" as
well as "muxu_ibuf" in response to a transmit interrupt.
STATUS: Fixed in version 3.7-1.
146. PROBLEM: The 12920A multiplexer data card diagnostic fails in test 1.
VERSION: 3.7-0
OBSERVATION: Running the data diagnostic reports this failure:
TEST 01
E034 DATA RECEIVED ON PORT 00 IS 2125 SHOULD BE 3525
Data is sent out on one channel is compared for equality when received on
the other channel. The values are not equal.
CAUSE: Characters delivered to the multiplexer are contained in bits 10-0
of data words output from the CPU. In the "ioCTL" handler in "muxlio," the
output word is masked with OTL_CHAR (01777) to retain just the data before
storing the result in "mux_xbuf". However, "mux_xbuf" and the
corresponding "mux_rbuf" are declared as "uint8", so the upper three bits
are lost.
RESOLUTION: Change the declarations of "mux_xbuf" and "mux_rbuf"
(hp2100_mux.c) from "uint8" to "uint16" to retain all of the character data
bits.
STATUS: Fixed in version 3.7-1.
147. PROBLEM: The 12920A multiplexer data card diagnostic fails in test 2.
VERSION: 3.7-0
OBSERVATION: Running the data diagnostic reports this failure:
TEST 02
E041 BREAK BIT SHOULD BE SET
The diagnostic is transmitting an all-space character and testing whether
the receiver detects this as a break. The break bit is not being set.
CAUSE: The error is misleading. The actual cause is that an interrupt is
not occurring on the receive channel, because "mux_rchp" is not being set
for the target line in "muxi_svc" if SCPE_BREAK is detected, even though
the break flag is being set in the status word.
RESOLUTION: Modify "muxi_svc" (hp2100_mux.c) to indicate a pending
character if a break is detected.
STATUS: Fixed in version 3.7-1.
148. PROBLEM: The 12920A multiplexer data card diagnostic fails in test 3.
VERSION: 3.7-0
OBSERVATION: Running the data diagnostic reports this failure:
TEST 03
E042 PARITY BIT SHOULD BE SET
The diagnostic is checking that the "parity check" bit (bit 15) of the
received status word is 1 when odd parity is sent. The bit is 0.
CAUSE: The "odd_par" table has numerous errors in it. For example, the
values in columns 006 and 007 should be the opposite of the values in
columns 016 and 017, but in many cases they are not.
Also, the "RCV_PAR" macro is setting LIL_PAR if the data has even parity,
not odd parity. For example, it returns LIL_PAR on a data value of zero.
Paragraph 3-23 on page 3-6 of the service manual says, "The parity bit is
set (logic 1) for odd parity and turned off (logic 0) for even parity."
RESOLUTION: Correct the "odd_par" table (hp2100_mux.c) to reflect the
correct odd parity for all values. Reverse the sense of the test in
"RCV_PAR" so that "LIL_PAR" is returned if the received value has odd
parity.
STATUS: Fixed in version 3.7-1.
149. PROBLEM: The 12920A multiplexer data card diagnostic fails in test 3.
VERSION: 3.7-0
OBSERVATION: Running the data diagnostic reports this failure:
TEST 03
E043 RAW PARITY BIT 7
The diagnostic is checking that bit 7 of the data word contains the desired
parity (odd or even). Bit 7 has the wrong value.
CAUSE: Parity is not being generated for transmitted characters.
RESOLUTION: Modify the "ioCTL" handler in "muxlio" (hp2100_mux.c) to
generate odd parity and add it to the data if bit 12 of the transmission
configuration word is set.
STATUS: Fixed in version 3.7-1.
150. PROBLEM: The 12920A multiplexer data card diagnostic fails in test 4.
VERSION: 3.7-0
OBSERVATION: Running the data diagnostic reports this failure:
TEST 04
E033 RECEIVE PORT NUMBER IS 00 SHOULD BE 16
The diagnostic is configuring the diagnose channels and presuming that an
initial CLC 0 will clear the configuration parameters for all channels.
CAUSE: The CLC handler is not performing the master clear function, so
the previously configured channel 0 is interrupting before the expected
channel 16.
Also, the interrupting channel number is truncated to four bits by the
"PUT_CCH" macro in "mux_data_int", so an interrupt on channel 16 is
reported as being on channel 0. Control card channel numbers are four bits
in size, but data channel numbers are five bits; the wrong macro is being
used to form the status word.
RESOLUTION: Modify the "ioCRS" handler in "muxlio" (hp2100_mux.c) to clear
all 37 channel transmit and receive parameters in response to a CLC 0.
Modify "mux_data_int" to use the "PUT_DCH" macro to put the data channel
number into the return status.
STATUS: Fixed in version 3.7-1.
151. ENHANCEMENT: Add debug printouts to the 12920A multiplexer.
VERSION: 3.7-0
OBSERVATION: Debugging multiplexer behavior would be easier if the
internal state of the simulator was observable and recordable.
RESOLUTION: Modify "hp2100_mux.c" to add debug-mode printouts.
STATUS: Fixed in version 3.7-1.
152. ENHANCEMENT: Add debug printouts to the 12875A Interprocessor Link.
VERSION: 3.7-0
OBSERVATION: Debugging HP 2000 Time Shared BASIC systems would be
easier if the internal state of the link simulator was observable and
recordable.
RESOLUTION: Modify "hp2100_ipl.c" to add debug-mode printouts. Modify
"sim_defs.h" to add a "DEBUG_PRJ" macro.
STATUS: Fixed in version 3.7-1.
153. PROBLEM: The 2000 Access terminal multiplexer does not initialize properly
approximately three starts in ten on multiprocessor host systems.
VERSION: 3.7-0
OBSERVATION: Booting the 2000 Access Time Shared BASIC system appears to
start the system correctly, but the terminal multiplexer does not work.
Typing a CR does not produce the expected "PLEASE LOG IN" message, even
though the system console is responsive. Restarting the system often
corrects the problem.
CAUSE: There is a race condition between the system processor (SP) and the
I/O processor (IOP) during initialization. A 321-word DMA transfer is done
from the IOP to the SP. Immediately after DMA completion, the SP pulses
the interprocessor link to "set correct flag direction" (according to the
Access source). The SP depends on the IOP still being in the DMA
completion interrupt handler when that pulse occurs, so that it does not
cause an interrupt and subsequent command processing.
On a multiprocessor host system, the SP and IOP SIMH processes may run in
parallel. If the SP is blocked after DMA completion and before the IPL
pulse, the IOP may complete its own DMA completion interrupt handling and
therefore see the pulse as a second DMA command request. If that occurs,
the IOP hangs in the DMA transfer, so it never completes initialization of
the terminal multiplexer.
RESOLUTION: Modify the "ioEDT" handler in "iplio" (hp2100_ipl.c) to sleep
for one millisecond before signaling a DMA completion interrupt for an
output transfer. This allows the SP time to pulse the IPL before the IOP
processes the DMA completion interrupt. Modify "dma_cycle" (hp2100_cpu.c)
to pass the DMA channel number and I/O direction flag in the "dat"
parameter to EDT handlers.
Note that this is a workaround, and not a solution, as the SP can still
block between DMA completion and IPL pulsing, which would allow the IOP to
complete its DMA handling first.
STATUS: Fixed in version 3.7-1.
154. PROBLEM: The 12920A multiplexer simulator encounters a buffer overrun
error when the five "diagnose" lines are employed.
VERSION: 3.7-0
OBSERVATION: Multiplexer line status is kept in "mux_sta", which is
defined with 16 elements. However, there are 21 receive lines for which
status is kept. When "mux_diag" is called to service the "diagnose" lines
(lines 16-20), "mux_sta" is indexed beyond the end of its definition.
CAUSE: The size should be "MUX_LINES + MUX_ILINES" instead of "MUX_LINES".
RESOLUTION: Modify the size of "mux_sta" (hp2100_mux.c) from 16 to 21
elements.
STATUS: Fixed in version 3.7-1.
155. PROBLEM: Resetting the 12920A multiplexer does not clear status for the
receive-only "diagnose" lines.
VERSION: 3.7-0
OBSERVATION: Line status is kept in "mux_sta[0..20]". Doing a multiplexer
reset (e.g. RESET, RUN, etc.) clears line status only in lines 0-15.
CAUSE: Multiplexer line reset is handled by "mux_reset_ln" in response to
a device reset. "mux_reset_ln" is called only for lines 0-15.
RESOLUTION: Modify "muxc_reset" (hp2100_mux.c) to clear the variables
associated with lines 16-20.
STATUS: Fixed in version 3.7-1.
156. PROBLEM: Breakpoint actions aren't executed properly if the breakpoint
occurs in a DO file.
VERSION: 3.7-0
OBSERVATION: Breakpoint actions are not reliably executed if they appear
in a DO file. Given this "t.sim" command file:
break 100; e 0-1
go
break 200; e 2-3
go
e 4-5
...then entering "do t.sim" at the command prompt produces this output:
Breakpoint, P: 00100 (NOP)
Breakpoint, P: 00200 (NOP)
4: 000000
5: 000000
sim> e 2-3
2: 000000
3: 000000
Note that the "e 0-1" is not executed at all, and the "e 2-3" is executed
after the "e 4-5".
CAUSE: Breakpoint actions are executed by a call to "sim_brk_getact" in
the main execution loop. The call is missing from the execution loop in
"do_cmd".
In the test case, the "e 2-3" is being executed by the "sim_brk_getact" in
the main execution loop after command file execution terminates. This
out-of-sequence execution could have serious consequences, e.g. if the
command were intended to clear a log file prior to a debug run ("! del
big.log") but instead deleted it at the end of the run when the DO file
terminated.
RESOLUTION: Modify "do_cmd" (scp.c) to incorporate a call to
"sim_brk_getact" to process breakpoint commands as they occur.
STATUS: Fixed in version 3.7-1.
157. PROBLEM: The .DMP instruction returns erroneous results.
VERSION: 3.7-3
OBSERVATION: After creating a FMGR file that occupies the rest of the
cartridge, the "next track" field in the directory list is wildly
incorrect.
CAUSE: An unsigned multiply is done instead of a signed multiply.
Multiplying by a small negative number returns an overflow condition.
RESOLUTION: Convert the operands to signed integers before multiplying in
"hp2100_cpu3.c".
STATUS: Fixed in version 3.8-0.
158. PROBLEM: The .DDI instruction returns erroneous results.
VERSION: 3.7-3
OBSERVATION: Attempting to scan an indexed library file that is split into
multiple extents returns FMGR -012 (SOF or EOF error). Accessing the
library file sequentially avoids the error.
CAUSE: Extent calculations are in error. An unsigned divide is done
instead of a signed divide.
RESOLUTION: Convert the operands to signed integers before dividing in
"hp2100_cpu3.c"
STATUS: Fixed in version 3.8-0.
159. ENHANCEMENT: Portable unsigned-to-signed conversions were added.
VERSION: 3.7-3
OBSERVATION: Conversions from unsigned to signed values, e.g., from
"uint16" to "int16", using casts or union store/load are not portable.
They will fail if the size in bits is > 16. Portable versions are needed.
RESOLUTION: Add portable "INT16" and "INT32" macros (hp2100_defs.h) to
provide uint16-to-int16 and uint32-to-int32 conversions.
STATUS: Fixed in version 3.8-0.
160. PROBLEM: The action of jumpers W5 (JSB), W6 (INT), and W7 (SEL1) for the
12892B Memory Protect card are reversed.
VERSION: 3.7-3
OBSERVATION: The SET/SHOW MP command sets/reports the jumpers in the wrong
state. A jumper flag of 1 is reported as "in" but it is treated as "out"
by the simulation.
CAUSE: The "mp_mod" table treats a jumper flag bit on as indicating an
installed jumper, but the flag bit actually indicates a removed jumper.
RESOLUTION: Reverse the jumper sense in the "mp_mod" table (hp2100_cpu.c).
STATUS: Fixed in version 3.8-0.
161. PROBLEM: The action of jumper W5 (JSB) is incorrect.
VERSION: 3.7-3
OBSERVATION: Executing a JSB below the MP fence and to a write-protected
page should cause a DM violation. This occurs if W5 is in, but an MP
violation is reported if W5 is out.
CAUSE: The W5 check is wrong.
RESOLUTION: Correct the JSB handler in "sim_instr" (hp2100_cpu.c) to
report a DM error with W5 out (unless the instruction is JSB 0 or JSB 1, in
which case an MP error is correct).
STATUS: Fixed in version 3.8-0.
162. PROBLEM: The memory protect MEVFF is not reset when an I/O instruction is
executed from a trap cell during an interrupt.
VERSION: 3.7-3
OBSERVATION: The Memory Expansion Violation Flip-Flop (MEVFF) is set
on any DMS violation: read protect, write protect, base-page protect, or
privilege. The MEVFF is cleared when MP is re-enabled after the violation
is handled.
Any interrupt request automatically disables MP. MP is re-enabled
explicitly via an STC 5 instruction or implicitly after a non-HLT I/O
instruction is executed in the interrupt trap cell. This latter case does
not clear the MEVFF under simulation.
CAUSE: Improper coding in the interrupt handler.
RESOLUTION: Modify "sim_instr" (hp2100_cpu.c) to set "mp_mevff" to zero if
a non-HLT I/O instruction is executed from a trap cell.
STATUS: Fixed in version 3.8-0.
163. PROBLEM: Running certain RTE-6/VM configurations will cause an
"unimplemented instruction" stop for the DIAG (100000) instruction.
VERSION: 3.7-3
OBSERVATION: If an RTE-6/VM system is generated with a firmware
replacement for the $LIBR routine, and a program using the software
equivalent is run under that system, an "unimplemented instruction" stop
occurs. This is actually due to a bug in $RQST (EXEC6). The instruction
sequence executed is:
XOR INSTR NOW HAVE THE ADDRESS
RAL,CLE,SLA,ERA IF INDIRECT
INDR XLA A,I GET NEXT LEVEL
RAL,CLE,SLA,ERA CHECK FOR MULTI LEVEL
JMP INDR FOUND ONE SO LOOP (MUST END)
If the sign bit of the A register is zero, the first "RAL,CLE,SLA,ERA"
improperly skips the first word of the two-word instruction "XLA A,I" and
executes the second word (100000). This decodes as a DIAG instruction.
DIAG should execute as a NOP with the CPU running, as it is only effective
when executed from single-step mode. This would mask the bug, as the
second "RAL,CLE,SLA,ERA" would also skip, taking execution out of the
sequence; the bug fix would be to replace the first "RAL,CLE,SLA,ERA" with
a "JMP *+3". However, the simulator stops instead.
CAUSE: The DIAG processor executes as NOP on the E-Series, but no
equivalent test is made for the F-Series.
RESOLUTION: Modify "cpu_eau" (hp2100_cpu1.c) to allow DIAG as NOP on the
F-Series as well as the E-Series.
STATUS: Fixed in version 3.8-0.
164. ENHANCEMENT: Add the RTE-6/VM operating system accelerator and virtual
memory firmware instructions.
VERSION: 3.7-3
OBSERVATION: RTE-6/VM "primary" (i.e., factory distribution) systems after
revision 2401 were generated with the OS/VMA firmware replacements. Such
systems will not run under SIMH due to the lack of firmware support. To
get later revision systems running without firmware replacements requires a
bootstrapping process that begins with revision 2340 and generates
successive systems until the desired revision is reached. Moreover, later
revisions of some programs (e.g., TF) will not load due to exceeding the
logical address space available when software replacements are used.
RESOLUTION: Add the OS/VMA instructions (hp2100_cpu5.c, hp2100_cpu6.c) to
support later primaries and to provide address space reductions in later
programs. Add CPU debug support and flags for OS and VMA instructions.
STATUS: Fixed in version 3.8-0.
165. ENHANCEMENT: Change the default breakpoint type from the current static
setting of "-e" (break unconditionally) to a dynamic setting that matches
the current DMS mapping ("-n", "-s", or "-u").
VERSION: 3.2-1
OBSERVATION: After reaching a map-specific breakpoint (e.g., a system-map
breakpoint to debug a device driver), the most common action is to examine
memory locations and set another breakpoint farther ahead in the code. That
breakpoint will, of course, be set in the same mapping mode as the one just
reached, i.e., in the current DMS mapping mode. Therefore, defaulting to
"the same map as is currently enabled" leads to the most-used cases not
requiring additional switches (and therefore the chance of operator error).
RESOLUTION: Before exiting "sim_instr" (hp2100_cpu.c), set "sim_brk_dflt"
to a switch corresponding to the current DMS mapping mode.
STATUS: Fixed in version 3.8-0.
166. ENHANCEMENT: Change the default examine/deposit addressing mode from the
current static setting of "address is physical" to a dynamic setting that
matches the current DMS mapping ("-s" or "-u"), and provide a new modifier
option ("-n") to specify that an address is a physical address.
VERSION: 3.2-1
OBSERVATION: After reaching a breakpoint, it is common to examine memory
contents. The most common requirement is to examine memory under the
currently enabled map, i.e., if a break occurred under the system map, then
examination of system memory is most likely to be requested (and
correspondingly for user-map breakpoints). However, the current default is
to examine the first 32K of physical memory. This is a reasonable default
for non-DMS systems, or when DMS is not enabled, but is awkward when
debugging mapped environments.
A switch ("-v") is currently provided to request access under the current
DMS map, but debugging with DMS active essentially requires specifying that
switch on every EXAMINE and DEPOSIT command. It would be more useful if
this action were the default.
RESOLUTION: Modify "cpu_ex", "cpu_dep", and "dms_cons" (hp2100_cpu.c) to
respond to redefined switch modifiers as follows:
Old New Description
=== === ===========================================================
-v if DMS enabled, use current map, else use unmapped
-n use unmapped
-s -s if DMS enabled, use system map, else illegal
-u -u if DMS enabled, use user map, else illegal
-p -p if DMS enabled, use DCPC port A map, else illegal
-q -q if DMS enabled, use DCPC port B map, else illegal
If a map specifier is used when DMS is not enabled, "Command not allowed"
results. Note that the SAVE and RESTORE commands always access memory
unmapped. Also, note that operation in non-DMS environments is unchanged,
i.e., EXAMINE and DEPOSIT with no modifiers still access physical memory as
before.
STATUS: Fixed in version 3.8-0.
167. ENHANCEMENT: NOBR with no argument clears breakpoint at the current PC.
VERSION: 3.7-0
OBSERVATION: Breakpoints are often required only once, e.g., when
establishing which of several paths through a routine is taken. In this
case, when a breakpoint is reached, it is immediately removed.
The existing breakpoint clear syntax requires specification of the address.
It would be helpful if the address defaulted to the current PC, i.e., the
location of the breakpoint just hit.
RESOLUTION: Modify "ssh_break" (scp.c) to allow omission of the address
argument and, if omitted, to clear the breakpoint corresponding to the
current PC.
STATUS: Fixed in version 3.8-0.
168. ENHANCEMENT: The SHOW VERSION command now reports the patch level.
VERSION: 3.3-2
OBSERVATION: Having multiple patched versions of SIMH that report the
same version number leads to confusion. But official releases often
increment the minor version only.
RESOLUTION: Modify "show_version" (scp.c) and "sim_rev.h" to add a
reported "patch delta" version number.
STATUS: Fixed in version 3.8-0.
169. PROBLEM: The DPTR register in the DS device cannot be set to any value
other than 0 or 1.
VERSION: 3.7-3
OBSERVATION: The DPTR register is documented as an 8-bit "sector buffer
pointer." However, it is implemented as a single-bit flag in the REG
structure. This prohibits setting any value other than 0/1.
CAUSE: DPTR is improperly defined with the FLDATA macro. It should use
DRDATA instead.
RESOLUTION: Modify "ds_reg" (hp2100_ds.c) to define the DPTR register as
DRDATA instead of FLDATA.
STATUS: Fixed in version 3.8-0.
170. ENHANCEMENT: Add an implementation of the 12966A Buffered Asynchronous
Communications Interface (BACI) card.
VERSION: 3.7-3
OBSERVATION: Newer RTE primary systems will not run without a system
console connected to a BACI card using DVR05, as support for the Teletype
interface using DVR00 had been dropped. Reconfiguring to a DVR00 driver is
problematic if another "type 00 driver" (e.g., DVM00) is present in the
equipment table ahead of DVR00. Also, some RTE features, such as
command-stack editing, don't work with the Teletype interface. Having a
BACI simulation would allow these systems to run "out of the box."
RESOLUTION: Add a BACI simulation (hp2100_baci.c) to the HP simulator.
STATUS: Fixed in version 3.8-0.
171. ENHANCEMENT: Expose the current time base generator (CLK) poll time via a
device register.
VERSION: 3.7-3
OBSERVATION: It is often helpful to know the number of simulated CPU
instructions per second on a host machine. As the CLK device is calibrated
to real time, knowing the tick rate and the service poll time would allow
the calculation of the simulated MIPS. The tick rate is given by the "SEL"
register, but the poll time is set using a local variable and is not
visible to the user.
RESOLUTION: Added global variable "clk_tick" and register "IPTICK"
(instructions per tick) to the CLK device (hp2100_stddev.c).
STATUS: Fixed in version 3.8-0.
172. PROBLEM: The "ioCRS" actions are incorrect in several devices.
VERSION: 3.7-3
OBSERVATION: The "ioCRS" signal was added in 3.7-0 to all devices. As an
expedient, the action was defaulted to CLC SC, which was how CRS was
handled before. Most devices handle CRS as CLC, but not all do. In
particular, the TTY and DS devices do not.
CAUSE: Expediency.
RESOLUTION: Modified the "ioCRS" handlers in "tty_svc" (hp2100_stddev.c)
and "ds_svc" (hp2100_ds.c) to implement the control reset signal correctly.
STATUS: Fixed in version 3.8-0.
173. PROBLEM: The paper tape reader hangs at EOT after "rewinding" a tape.
VERSION: 3.7-3
OBSERVATION: The POS register records the current position of the file
attached to the PTR device. The manual says, "...by changing POS, the user
can backspace or advance the reader." Attempting to re-read a tape by
setting POS to 0 causes the reader to hang when the end-of-tape is
encountered the second time.
CAUSE: The trailing-null counter, "ptr_trlcnt", is not reset when the
position is. Therefore, the automatic trailer function does not work the
second time, and the reader hangs.
RESOLUTION: Reset "ptr_trlcnt" when a non-null character is read.
STATUS: Fixed in version 3.8-0.
174. PROBLEM: The .PWR2 instruction returns the wrong value in the A register.
VERSION: 3.7-3
OBSERVATION: The .PWR2 instruction returns the result of the expression
(ab * 2 ^ n) in the A and B registers. The B-register value is correct,
but the A-register value is always 0.
CAUSE: The conversion of the high-word value in "fp_unpack" from "fop" to
"mantissa" is incorrect. Specifically, the cast to 16 bits should be done
on the shifted value, but it is improperly done on the unshifted value, so
that shifting right by 16 always yields a zero value.
Note that the only other instruction to use "fp_unpack" is .FLUN, but that
discards the A-register (high mantissa) value and instead returns the
exponent in A, so the error does not manifest itself there.
Also note that there are two "fp_unpack" implementations. The one in error
is the firmware floating-point version. The hardware floating-point
version in "hp2100_fp1.c" is correct and is used when HAVE_INT64 is defined
during compilation.
RESOLUTION: Modify "fp_unpack" (hp2100_fp.c) to correct the conversion.
STATUS: Fixed in version 3.8-0.
175. PROBLEM: The DBI self-test instruction does not skip.
VERSION: 3.7-3
OBSERVATION: The double-integer firmware self-test is supposed to set the
S register to 102077 octal and return to P+1. Neither of these actions
occur.
CAUSE: At the time that the DBI firmware was implemented, the source
microcode and the installation manual were unavailable. Subsequently, the
source microcode was located, and the self-test action is now known.
RESOLUTION: Modify "cpu_dbi" (hp2100_cpu3.c) to add the proper
implementation of the DBI self-test instruction.
STATUS: Fixed in version 3.8-0.
176. PROBLEM: The DEPOSIT <dev> <reg> <value> command will change <reg> in some
other device if the name is unique to that other device.
VERSION: 3.7-3
OBSERVATION: Entering "deposit ptr ppos 0" actually changes the "ppos"
register in the "tty" device. It should give an error that "ppos" does not
exist in the "ptr" device.
CAUSE: The "exdep_cmd" routine is calling "find_reg_glob" if the
"find_reg" routine returns a not-found error for the selected device.
"find_reg_glob" searches for a unique name among all devices and returns it
if found.
RESOLUTION: Modify "exdep_cmd" (scp.c) to search for a global register
name only if the device was not explicitly specified.
STATUS: Fixed in version 3.8-0.
177. PROBLEM: The four-word double-precision sine and cosine functions return
erroneous results.
VERSION: 3.7-3
OBSERVATION: The .SIN and .COS functions return improper values when SIS
firmware is present. When the firmware is absent, the results are correct.
CAUSE: .SIN and .COS call /CMRT, the common range reduction routine. This
routine is implemented in the SIS firmware. The /CMRT firmware simulation
is not setting the B register properly to the lower 16 bits of the
reduction multiple.
RESOLUTION: Correct "cpu_sis" (hp2100_cpu4.c) to return the proper value
in the B register for the /CMRT instruction.
STATUS: Fixed in version 3.8-0.
178. PROBLEM: The free HP 700/92 terminal emulator, QCTERM from AICS, does not
work with SIMH.
VERSION: 3.7-0
OBSERVATION: Attempting to run QCTERM as a Telnet client with SIMH loses
characters. Specifically, the first character typed after a CR is lost.
CAUSE: QCTERM is sending "bare" carriage-return characters to SIMH. SIMH
presumes that CR will always be followed by LF or NUL in text mode, so it
simply drops the next character. For QCTERM, this is the first character
of the subsequent transmission.
Examination of the Telnet connection initiation code shows that SIMH is
sending several command sequences but is not checking the client replies
(except for binary mode). A correct negotiation mechanism must be
implemented to handle the variety of Telnet clients properly.
RESOLUTION: Modify the TNS_SKIP case in "tmxr_poll_rx" (sim_txmxr.c) to
skip only LF or NUL following CR. Any other character is processed as is.
STATUS: Fixed in version 3.8-0.
179. ENHANCEMENT: Add infrastructure changes to support CPU idling in a future
release.
VERSION: 3.7-3
OBSERVATION: Idle support would be a welcome addition to the HP simulator.
RESOLUTION: Modify hp2100_stddev.c to change the TTY (console) input poll
to use a 10 millisecond calibrated timer, to provide a synchronization
routine for use by other devices with input polls, and to synchronize the
CLK to the console poll if it is set for a 10-millisecond period. Add
UNIT_IDLE flags to the CLK and TTY input units. Modify hp2100_mux.c and
hp2100_baci.c to synchronize Telnet polling with the console poll.
STATUS: Fixed in version 3.8-0.
180. PROBLEM: There is some dead code in hp2100_stddev.c, now that control
character handling is in sim_console.c.
VERSION: 3.7-0
OBSERVATION: In version 3.2-2, "tto_out" (hp2100_stddev.c) was altered to
suppress output for all control characters (characters < 40 octal), except
for BEL, BS, LF, and CR. This was in support of the RTE line editor.
In version 3.5-2, generalized support for control character output
suppression was added to sim_console.c. This obviated the HP-specific
handling. However, some of that code remained in hp2100_stddev.c.
CAUSE: Oversight.
RESOLUTION: Removed the redundant code.
STATUS: Fixed in version 3.8-0.
181. ENHANCEMENT: Add the RTE-IVB extended memory area firmware instructions.
VERSION: 3.7-3
OBSERVATION: The Pascal/1000 compiler (HP 92832A) relies on EMA
instructions to manage its internal memory. EMA software is available, but
the compiler can exceed the available logical address space if they are
employed, due to the size of the software routines.
RESOLUTION: Add the EMA instructions (hp2100_cpu5.c) to provide address
space reductions in the Pascal compiler. Add CPU debug support and flags
for the EMA instructions.
STATUS: Fixed in version 3.8-0.
182. ENHANCEMENT: Add the Vector Instruction Set firmware instructions.
VERSION: 3.7-3
OBSERVATION: VIS was used in some HP programs, notably SPICE.
RESOLUTION: Add the VIS instructions (hp2100_cpu7.c) to provide support
for HP-SPICE. Add CPU debug support and flags for the VIS instructions.
STATUS: Fixed in version 3.8-0.
183. PROBLEM: Single-stepping through interrupts does not report instruction
execution properly.
VERSION: 3.7-3
OBSERVATION: When single-stepping, the simulator prints the next
instruction to be executed before pausing for a command. When an interrupt
is pending, the instruction printed is not correct. Moreover, a
single-step command at this point will execute two instructions.
CAUSE: There are two problems with the simulator.
The first is with the simulator routine that prints the next instruction to
be executed at the end of a step. It is not checking whether an interrupt
is pending. The instruction printed is the next instruction that would
have been executed, if there had not been an interrupt pending. But
because there was an interrupt pending, the next instruction actually
executed is the trap-cell instruction.
The second problem is that the simulator is not counting down events during
the trap cell instruction execution. During each normal instruction, the
simulator decreases the event counter, including the step counter. But it
omits the decrement for the trap cell instruction. So single-stepping with
an interrupt pending actually causes two instruction executions: the
trap-cell instruction, and the subsequent instruction (usually the target
of the JMP or JSB in the trap cell).
RESOLUTION: Modify "fprint_sym" (hp2100_sys.c) to check for a pending
interrupt, and if so, to print the trap cell instruction instead of the
instruction at PC. Modify "sim_instr" (hp2100_cpu.c) to decrement the
event counter for trap cell instructions.
STATUS: Fixed in version 3.8-0.
184. PROBLEM: The TTY output interrupt time is too short for MSU BASIC.
VERSION: 3.7-3
OBSERVATION: When running MSU BASIC, this code eventually produces an
"Indirect address loop, P: 37001 (STA 1,I)" error:
10 PRINT "HELLO WORLD!"
20 GOTO 10
30 END
CAUSE: The TTY output rate is abnormally fast compared to the original
hardware. The ASR-33 operated at 10 characters per second. The HP 2116
processor ran at about 600 instructions per millisecond. Therefore, the
TTY would interrupt approximately every 60000 CPU instructions. But the
default SIMH configuration (SERIAL_OUT_WAIT) is to interrupt every 100
instructions -- about 600x the rate of the actual Teletype.
MSU BASIC (a contributed library program) maintains per-user I/O state
buffers, one for each of four users, plus one for the I/O system. When a
TTY interrupt occurs, the program copies the per-user state into the I/O
state buffer, enters the TTY driver to output a character, copies the
updated I/O state back to the per-user buffer, and returns to a monitor
loop to wait for the completion interrupt, which would occur 100
milliseconds later on a real machine.
It takes 85 instructions from the STC that starts the TTY output until the
updated state copy is completed. With the TTIME default of 100
instructions, that is normally just enough time to complete the buffer
transfer before another interrupt occurs.
However, MSU BASIC also runs the time base generator (CLK) with a
one-second period. The TBG interrupt handler takes from 25 to 71
instructions. If the TBG interrupts while the TTY event is active, it will
absorb enough instructions to cause the TTY interrupt to occur before the
updated state copy is finished. That leaves the per-user state buffer
inconsistent. As a result of the TTY interrupt, that inconsistent buffer
is copied to the I/O state buffer, and mayhem ensues.
RESOLUTION: Lengthened the TTY output time in "tty_unit" (hp2100_stddev.c)
from 100 to 200 instructions.
STATUS: Fixed in version 3.8-0.
185. ENHANCEMENT: Add the SIGNAL/1000 firmware instructions.
VERSION: 3.7-3
OBSERVATION: SIGNAL provides firmware acceleration for Fast Fourier
Transforms and was used in some signal processing applications.
RESOLUTION: Add the SIGNAL instructions (hp2100_cpu7.c). Add CPU debug
support and flags for the SIGNAL instructions.
STATUS: Fixed in version 3.8-0.
186. ENHANCEMENT: Add idle support to the HP 2100 simulator.
VERSION: 3.8-0
OBSERVATION: The DOS and RTE operating systems keep the current time of
day by counting TBG ticks. To maintain accurate time, a simulation must
run continuously. Given this requirement for continuous operation, it
would be helpful if the simulator idled the host processor when these
operating systems were idle themselves.
RESOLUTION: Alter "cpu_mod" to add SET CPU IDLE/NOIDLE commands, and alter
"sim_instr" to add idle detection for DOS and RTE (hp2100_cpu.c).
STATUS: Fixed in version 3.8-1.
187. ENHANCEMENT: Report the device and line number for Telnet connections.
VERSION: 3.8-0
OBSERVATION: When connecting a Telnet client to a simulator device via the
multiplexer library, the client receives a "welcome" message of the format:
Connected to the HP2100 simulator
It would be helpful if the user knew to which device and line the client
had connected. For example:
Connected to the HP2100 simulator MUX device, line 3
The report for single-line devices, e.g., additional terminal devices,
would suppress the line number:
Connected to the HP2100 simulator BACI device
RESOLUTION: Modify sim_tmxr.h to add a "DEVICE *dptr" field at the end of
the TMXR structure. Change tmxr_attach() to look up the device from the
unit via find_dev_from_unit() and set "dptr" to point at the device.
Change tmxr_poll_conn() to print the device name and line number (if more
than one line defined) in the greeting message.
STATUS: Fixed in version 3.8-1.
188. ENHANCEMENT: Add a simulation of the 12792C eight-channel multiplexer.
VERSION: 3.8-0
OBSERVATION: The main terminal multiplexer for later RTEs was the 12792,
and direct support was generated into primary systems from HP. The A/B/C
revisions of the multiplexer firmware used the same protocol and drivers on
RTE-IVB and RTE-6/VM. The D revision used an incompatible protocol and
required different drivers that were supported only on RTE-6/VM.
RESOLUTION: Add the MPX device (hp2100_mpx.c) to simulate the 12792A/B/C,
and alter "hp2100_sys.c" and "hp2100_defs.h" to add the device structure
and default select code assignment.
STATUS: Fixed in version 3.8-1.
189. ENHANCEMENT: Add a mechanism to provide a device-specified connection
order for terminal multiplexers.
VERSION: 3.8-0
OBSERVATION: Some operating systems allow per-line device drivers for
multiplexers (e.g., the HP 12792 and 12920 under RTE). These change the
line behavior, so that the existing model of multiplexers as pools of
identical lines is no longer valid. A method of specifying line connection
order is needed, so that connection to specific device drivers is possible.
RESOLUTION: Modify the TMXR structure (sim_tmxr.h) to add an "int32
*lnorder" field that points at an array specifying the line connection
order. Modify "tmxr_poll_conn" (sim_tmxr.c) to connect in the order given
by *lnorder, if defined, else to connect in ascending port number order.
Add "tmxr_set_lnorder" and "tmxr_show_lnorder" routines to provide support
for SET <dev> LINEORDER=<range> and SHOW <dev> LINEORDER commands.
STATUS: Fixed in version 3.8-1.
190. ENHANCEMENT: Add a simulation of the 12620A/12936A Privileged Interrupt
Fences.
VERSION: 3.8-0
OBSERVATION: Privileged DOS and RTE systems require the use of a
privileged interrupt fence card. This is needed to run the 12920A
16-channel multiplexer under RTE. When configured for DIAG operation, the
LPS device may be used as an RTE fence, although the corresponding line
printer function is then lost. The DOS fence (12936A) had a unique
operation that is not duplicated by any existing simulation.
RESOLUTION: Add the PIF device (hp2100_pif.c) to simulate the 12620A and
12936A, and alter "hp2100_sys.c" and "hp2100_defs.h" to add the device
structure and default select code assignment.
STATUS: Fixed in version 3.8-1.
191. PROBLEM: The action of certain I/O cards (e.g., the 12936A Privileged
Interrupt Fence) cannot be modeled by SIMH.
VERSION: 3.8-0
OBSERVATION: Certain I/O actions cannot be implemented within the current
design of the I/O simulation. For example, the 12936A card breaks the
interrupt priority chain when flag OR control is set. Simulation assumes
that priority is broken when flag AND control are set.
CAUSE: The hardware has I/O signals for interrupt request (IRQ) and
interrupt priority to lower-priority devices (PRL). These signals are not
modeled directly in SIMH. Rather, they are implied by control, flag, and
flag buffer set (for IRQ) and control and flag set (for PRL). If an I/O
card does not follow these conventions, then the proper action cannot be
simulated.
RESOLUTION: Modify the I/O simulation structure to model hardware signals,
rather than I/O instructions. Verify each simulated device's action in
response to each I/O backplane signal. Verify each device's reset routine
to ensure the proper response to RESET (POPIO signal) and RESET -P (PON
signal).
STATUS: Fixed in version 3.8-1.
192. PROBLEM: Escaping backslashes in DO commands does not work.
VERSION: 3.8-0
OBSERVATION: The SIMH User's Guide says in Section 3.13, "Executing
Command Files:"
The string %n is recognized as meaning argument n from the DO command
line. The character \ has the usual UNIX meaning of an escape character;
the next character is interpreted literally, even if it is % or \.
The sequence "\%" is recognized as a literal "%" character. The sequence
"\\" is not recognized as a literal "\" character; instead, it is left
unaltered. In fact, "\%" is the only recognized escape; "\" followed by
any other character will not be processed, i.e., the "\" and that character
will remain. This makes using parameters in Windows file paths
impossible, as this:
attach dev c:\path\to\\%1
substitutes for "%1" but leaves the double-backslashes, and this:
attach dev c:\path\to\%1
...does not substitute for "%1" and parses as "c:\path\to%1".
Actually, the documented behavior (escaping every character) is
undesirable, as it will invalidate every current command file that uses
Windows path names. Were it implemented as documented, then a path such as
"c:\path\to\file" would be parsed as "c:pathtofile". Even restricting the
change to escaping just "\" and "%" will still invalidate current command
files that use network paths (e.g., "\\server\\share\\path\to\file" will
become "\server\share\path\to\file", which is a local path. This at least
is fixable, whereas there is no workaround for the current situation.
CAUSE: The argument substituter is checking only for the "\%" case.
RESOLUTION: Modify "sub_args" (scp.c) to accept "\\" as a literal
backslash, in addition to "\%" as a literal percent sign.
STATUS: Fixed in version 3.8-1.
193. PROBLEM: The DR and IPL boot loaders do not work.
VERSION: 3.8-0
OBSERVATION: Attempting to boot the DR or IPL devices results in a hang in
the bootstrap. Examination shows that the I/O instructions are not being
configured.
CAUSE: The loader protection feature added at revision 3.7-0 must be
turned off in order to write programmatically to the boot loader area.
Protection is automatically disabled for the devices using the "ibl_copy"
function in the CPU, but the DR and IPL devices install their bootstraps
within their boot routines and do not call "ibl_copy".
RESOLUTION: Modify "ipl_boot" (hp2100_ipl.c) and "drc_boot" (hp2100_dr.c)
to use the "ibl_copy" routine.
STATUS: Fixed in version 3.8-1.
194. PROBLEM: Omitted parameters to DO command files do not substitute null
strings for the corresponding arguments.
VERSION: 3.8-0
OBSERVATION: Given a command file "cmdfile" containing "echo %1 and %2",
the command "do cmdfile a b" results in:
a and b
...which is as expected. However, "do cmdfile a" results in:
a and %2
...which is unexpected; the expected response is:
a and
...i.e., the null string is substituted for "%2". This would be consistent
with argument substitution in operating system command shells.
CAUSE: Arguments for omitted parameters are not being considered for
substitution.
RESOLUTION: Modify "do_cmd" (scp.c) to initialize omitted arguments to
NULL and modify "sub_args" to skip null arguments during substitution.
STATUS: Fixed in version 3.8-1.
195. PROBLEM: JSB to 0/1 with W5 out and fence = 0 erroneously causes MP abort.
VERSION: 3.8-0
OBSERVATION: The upper bound of protected memory is set by the memory
protect fence, and the lower bound is normally location 2. However, the
lower bound is 0 if the instruction is a JMP, or if the instruction is a
JSB and jumper W5 is out. That is, a JMP or a JSB (with W5 out) to any
location under the memory protect fence will cause a violation. If the
fence is set to or below the lower bound, though, then MP violations will
not occur.
However, a JSB 0 or JSB 1 with the fence set to 0 or 1 and jumper W5 out
still causes an MP abort.
CAUSE: Improper coding of the W5 test in the JSB simulation.
RESOLUTION: Modify the instruction dispatcher "sim_instr" (hp2100_cpu.c)
to set the protected lower bound for JSB as indicated by W5 and to test the
target address against the lower bound as well as the MP fence.
STATUS: Fixed in version 3.8-1.
196. PROBLEM: The MEM (DMS) violation register is not being set properly.
VERSION: 3.8-0
OBSERVATION: The STC handler within the MP I/O instruction routine "proio"
contains an explicit clear of the MEM violation register. There is no such
action shown on either the MP or MEM card schematics. When the statement
is removed, the Memory Expansion Module Diagnostic (DSN 102103) fails in
TST21, the "Violation Register Map Bits Test," with an "E302 VR MAP 00"
error.
TST21 generates three MEM violations and one MP violation. The value of
the MEM violation register is checked after all four violations to confirm
that the map register address corresponds to the violation location. The
value after the MP violation is in error; the violation register still
contains the value from the prior MEM violation.
CAUSE: The simulator updates the violation register whenever a MEM
violation occurs. The hardware actually updates the violation register for
every memory read, every memory write above the lower bound of protected
memory, and every execution of a privileged DMS instruction. The register
is "frozen" when MP is disabled by an MP or DM error to capture the state
of the MEM (MEVFF sets or CTL5FF clears).
Examining the violation register value after each MEM violation produces
the expected result. Examining it after the MP violation does not, because
the register is not being set. As it happens, the MP violation in the
diagnostic occurs on page 0, so the problem is masked if the violation
register is set to 0 when MP is enabled. Other bits in the register are
wrong in this case, but the diagnostic does not check them.
It would be proper to fix this problem by updating the violation register
after each memory access, as is done in hardware. Fortunately, this isn't
necessary, as the visible state of the violation register is only available
via a programmed RVA/B instruction or via the SCP interface. Therefore, it
is sufficient if the register is updated:
- at a DM violation (when freezing)
- at an MP violation (when freezing)
- during RVA/B execution (if not frozen)
- before returning to SCP after a simulator stop (if not frozen)
The first of these conditions is currently implemented. The other three
must be added to address the issue.
RESOLUTION: Add a new "dms_upd_vr" routine (hp2100_cpu.c) to update the
MEM violation register value. Modify the ABORT macro to take the address
of the last memory access as the parameter. Modify the MP abort handler to
use the memory address to update the MEM violation register. Add new
update calls to the RVA/B simulator and to the cleanup code at the end of
"sim_instr" before returning to SCP.
STATUS: Fixed in version 3.8-1.
197. PROBLEM: The ME Bus Enabled bit in the MEM violation register is not being
set properly.
VERSION: 3.8-0
OBSERVATION: The ME Bus Enabled bit in the violation register reflects the
state of the MEBEN (ME Bus Enable) signal on the MEM card. MEBEN is
asserted if the MEM is enabled (MAPON signal) and the last memory access
was not to the unmapped portion of the base page (OFA signal).
Under simulation, this bit is set if a MEM violation is either a read
violation or a write violation, and it is clear otherwise (base page or
privileged instruction violation). This is correct only for the base page
violation case; for the other three cases, MEBEN may be either high or low.
CAUSE: Incorrect logic in the "dms_viol" routine.
A base page violation, by definition, occurs if a write is attempted to the
unmapped portion of the base page. MEBEN must be off in this case (BPV is
qualified by -MEBEN). Each of the other three violations could occur with
MEBEN either asserted or denied.
Consider a read from the base page with map 0 indicating read protection.
If the read is from the mapped portion, MEBEN will be asserted. If the
read is from the unmapped portion, MEBEN will be denied. In either case, a
read violation will be indicated. The same conditions pertain to a write
to the base page with map 0 indicating write protection, and to an
attempted privileged instruction execution from the base page.
RESOLUTION: Modify "dms_upd_vr" (hp2100_cpu.c) to call a new "is_mapped"
routine to determine if an access is to unmapped memory.
STATUS: Fixed in version 3.8-1.
198. PROBLEM: JMP to a write-protected page fails to signal a DMS violation.
VERSION: 3.8-0
OBSERVATION: The "21MX M-Series Computer Operating and Reference Manual"
states on page 4-2:
Any attempt to write to a write-protected page will result in a write
violation and the memory will not be altered. In addition, if a page is
write-protected, a jump or jump indirect instruction to that page will
cause a write violation and the jump will not occur.
The write violation for a JMP to a write-protected page does not occur.
CAUSE: Coding error in "mp_dms_jmp".
MEM write and base-page violations are checked when an MPCK micro-order is
executed. MPCK asserts the MPCND signal if the address is above the lower
bound of protected memory (0 for a JMP). MPCND is qualified with the
accessed page's write-protect bit for write violations, and with an
"unmapped access to the base page" signal for base-page violations. Any
instruction that executes MPCK will enable these two violation checks, and
all jump-type instructions do.
Under simulation, the MEM check for base-page violations is done by the
"mp_dms_jmp" routine. However, this routine does not check for write
violations.
RESOLUTION: Modify "mp_dms_jmp" (hp2100_cpu.c) to check for write
violations as well as base-page violations.
STATUS: Fixed in version 3.8-1.
199. PROBLEM: .GOTO to A/B causes incorrect MP violation.
VERSION: 3.8-0
OBSERVATION: The lower bound of protected memory is normally location 2,
allowing unrestricted access to the A and B registers (locations 0 and 1,
respectively). The MP card checks the instruction register and uses a
lower bound of 0 for JMP, as well as for JSB if jumper W5 is out. The JLY
and JPY microcode also requests a lower bound of 0 by setting the IR to the
JMP opcode before the MP check.
Under simulation, the MP check against a lower bound of 0 is done by the
"mp_dms_jmp" routine (hp2100_cpu.c). However, this routine is also called
for the DJP, SJP, UJP, JRS, and .GOTO instructions. These latter
instructions should allow access to the A/B registers, but they don't.
CAUSE: Logic error.
RESOLUTION: Modify "mp_dms_jmp" (hp2100_cpu.c) to accept the protected
lower bound as a parameter, and modify the JMP, JSB, JLY, JPY, DJP, SJP,
UJP, JRS, and .GOTO instruction handlers (hp2100_cpu.c, hp2100_cpu2.c, and
hp2100_cpu3.c) to pass the desired lower bound value.
STATUS: Fixed in version 3.8-1.
200. PROBLEM: UJP fails erroneously with a write-protect violation.
VERSION: 3.8-0
OBSERVATION: Attempting to enable the user map with a UJP instruction
fails if the target page in the system map is write-protected.
CAUSE: The instruction is checking the jump target in the wrong map.
The DJP, SJP, and UJP instructions validate that the target address is not
below the MP fence and on a write-protected page. In firmware, these
instructions alter the Memory Expansion Unit before validating the jump
address. For example, UJP enables the user map and then checks the target
address using the user map. Under simulation, the "mp_dms_jmp" check is
issued before the map is changed, leading to failures.
RESOLUTION: Modify "cpu_dms" (hp2100_cpu2.c) to move the "mp_dms_jmp"
checks to after the MEU update for the DJP, SJP, and UJP instructions.
STATUS: Fixed in version 3.8-1.
201. PROBLEM: Several HP 2100 devices use registers variables < 32 bits without
REG_FIT.
VERSION: 3.8-0
OBSERVATION: Scalar register variables must be either 32 bits in size or
declared with the REG_FIT flag. In the absence of REG_FIT, a 32-bit access
is assumed by the examine and deposit routines. Several HP 2100 devices
use 8- or 16-bit scalar variables as registers without REG_FIT. This will
cause failures on big-endian machines.
Note that arrayed registers are automatically accessed at the minimum size
implied by the "width" and "offset" values and therefore do not need
REG_FIT.
CAUSE: Coding errors.
RESOLUTION: Modify hp2100_baci.c, hp2100_dp.c, hp2100_dq.c, and
hp2100_mpx.c to add REG_FIT where needed.
STATUS: Fixed in version 3.8-1.
202. PROBLEM: The HP 2100 CPU simulation shadows the A and B registers
unnecessarily.
VERSION: 3.8-0
OBSERVATION: The A and B register values are stored in two places: as
"uint16 ABREG[2]" during execution, and as "uint32 saved_AR" and "uint32
saved_BR" between executions. The latter was to accommodate the
requirement that register variables must be 32 bits in size. That
requirement was removed in version 3.5-2 for registers declared with the
REG_FIT flag.
With REG_FIT, "ABREG[0]" and "ABREG[1]" can be used directly as register
values, and the code associated with saving and restoring the A and B
registers can be eliminated.
CAUSE: The code wasn't updated to take advantage of the new feature.
RESOLUTION: Modify hp2100_cpu.c to use "ABREG[]" variables as register
values with REG_FIT, and remove the "saved_AR" and "saved_BR" values and
associated code. Modify "msc_boot" (hp2100_ms.c) to use "AR" instead of
"saved_AR".
STATUS: Fixed in version 3.8-1.
203. PROBLEM: RTE break mode does not work with the 12920A multiplexer on fast
host machines.
VERSION: 3.8-0
OBSERVATION: Hitting the BREAK key when the terminal is idle or output is
in progress should produce an RTE prompt. BREAK works properly when the
terminal is idle, but hitting BREAK when output is in progress does not
produce a prompt. This means that long outputs can be neither paused nor
aborted.
CAUSE: The RTE multiplexer driver is a privileged driver. Privileged
drivers bypass RTE to provide rapid interrupt handling. To inform RTE that
an operation is complete, e.g., that a line has been written, the interrupt
section of the driver sets a device timeout of one clock tick (10
milliseconds). When that timeout occurs, RTE is entered normally to
complete the I/O transaction. While the completion timeout is pending, the
driver ignores any further interrupts from the multiplexer line.
The maximum communication rate for the multiplexer is 2400 baud, or
approximately 4.2 milliseconds per character transferred. A typical line
of 20 characters would therefore take ~85 milliseconds, plus the 10
millisecond completion timeout, or about 95 milliseconds total. BREAK
recognition would be ignored for roughly 10% of that time. At lower baud
rates, recognition would be ignored for a correspondingly smaller
percentage of the time.
However, SIMH uses an optimized timing of 500 instructions per character
transfer, rather than the ~6600 instructions that a character transfer
should take, and so a typical 20-character line will take about 11,000
instructions. On the other hand, the clock tick is calibrated to real
time, and 10 milliseconds of real time takes about 420,000 instructions on
a 2.0 GHz PC. To be recognized, then, the BREAK key must be pressed in a
window that is open for about 2.5% of the time. Therefore, the BREAK key
will be ignored about 97.5% of the time, and RTE break-mode effectively
will not work.
RESOLUTION: Defer BREAK recognition until either a character is output or
a second successive input poll occurs, providing that we are not in
diagnostic mode. This ensures that the BREAK interrupt will be accepted.
Added a "mux_defer[]" flag (hp2100_mux.c) to record break deferrals.
STATUS: Fixed in version 3.8-1.
204. ENHANCEMENT: Add line connection order support to the 12920A multiplexer.
VERSION: 3.8-0
OBSERVATION: RTE and DOS provide per-line device drivers for the 12920A
multiplexer. A method of specifying line connection order is needed, so
that connection to specific device drivers is possible.
RESOLUTION: Add "SET MUX LINEORDER=<range>" and "SHOW MUX LINEORDER"
commands to the 12920A simulator.
STATUS: Fixed in version 3.8-1.
205. PROBLEM: The LOCKED, WRITEENABLED, and FORMAT commands do not work as
documented.
VERSION: 3.8-0
OBSERVATION: The HP2100 documentation says that the "SET MTC LOCKED"
command write-locks the tape drive. Attempting this, however, results in a
"Non-existent parameter" error.
CAUSE: The commands are part of the wrong command table (MTD instead of
MTC).
RESOLUTION: Modify "mtd_mod" and "mtc_mod" (hp2100_mt.c) to move the
LOCKED, WRITEENABLED, and FORMAT commands to the command channel to be
compatible with the MS tape device.
STATUS: Fixed in version 3.8-1.
206. PROBLEM: Wrong mnemonic reported in IAK display for RTE-6/VM OS dual-use
microcode instructions.
VERSION: 3.8-0
OBSERVATION: RTE-6/VM OS instructions have four "dual-use" opcodes. These
have different meanings, and thus different mnemonics, depending on whether
they are used in interrupt trap cells or not. For example, the 105357
opcode is $TBG (time-base generator interrupt handler) if in a trap cell
and .DSPI (set display indicator) if not. The mnemonic is correct for the
EXAMINE command. A single-step through an interrupt acknowledgement
displays the wrong mnemonic:
[CTRL+E]
Simulation stopped, P: 02040 (JMP 2037)
sim> s
Step expired, P: 02037 (IAK 15: .DSPI)
sim> e -m 15
15: $TBG
The IAK report should also display $TBG.
CAUSE: The "fprint_sym" routine detects the IAK and obtains the trap cell
value, but it fails to change the instruction address, so the address
remains that of the interrupted instruction. As dual-use mnemonics depend
on the instruction address, the mnemonic reported is incorrect.
RESOLUTION: Modify "fprint_sym" (hp2100_sys.c) to set the instruction
address for an interrupt acknowledgement to the interrupt trap cell
address.
STATUS: Fixed in version 3.8-1.
207. PROBLEM: The 3030 mag tape does not interrupt after a CLR command.
VERSION: 3.8-0
OBSERVATION: Page 2-5 of the 12559A 9-Track Magnetic Tape Unit Interface
Kit Operating and Service Manual says that the command channel flag
flip-flop sets when the CLR command completes. The MT simulator does not
do this, so the command channel does not interrupt.
CAUSE: Coding error.
RESOLUTION: Modify "mtcio" (hp2100_mt.c) to set the command channel flag
when the command completes.
STATUS: Fixed in version 3.8-1.
208. PROBLEM: Exiting the simulator does not report "Disconnected from the HP
2100 simulator" on MUX sessions.
VERSION: 3.8-0
OBSERVATION: Exiting the simulator detaches all devices. Detaching
multiplexer-type devices, such as BACI and MPX, reports "Disconnected from
the <sss> simulator" on each connected Telnet session. However, no such
report appears on MUX sessions. Doing a DETACH ALL does report the
disconnection on MUX sessions.
CAUSE: As part of simulator shutdown, "detach_all" is called with the
"shutdown" parameter set to TRUE. This causes the detach routines for
non-attachable units to be called. "ds_detach" calls "detach_unit", which
returns SCPE_NOATT for unit 8 (the controller unit). "detach_all" exits on
a non-zero status return from a device detach routine, so the devices after
DS in the device array are never detached.
Doing a DETACH ALL calls "detach_all" with the "shutdown" parameter set to
FALSE. This calls device detach routines only for attached units. All of
these return SCPE_OK, so MUX is eventually detached, and the disconnection
reports are sent to the MUX sessions.
Note that the same problem would arise if an attached unit fails to detach
cleanly, e.g., due to a file write error. The remaining devices would not
be detached before simulator exit.
RESOLUTION: Modify "detach_all" (scp.c) to ignore errors from device
detach routines during shutdown, so that all devices will be detached.
STATUS: Fixed in version 3.8-1.
209. ENHANCEMENT: Add a microcode simulation module for site-specific
microprograms.
VERSION: 3.8-0
OBSERVATION: The 2100 and 1000 CPUs supported user microprogramming. A
user of the HP2100 simulator may have user-written microcode that he would
like to add to SIMH. It would be helpful to have the infrastructure in
place to aid in the implementation of site-specific microprogram
simulations.
RESOLUTION: Add a new "cpu_user" microcode dispatcher and an example
skeleton microcode simulator (hp2100_cpu0.c). Alter "cpu_uig_0" and
"cpu_uig_1" (hp2100_cpu1.c) to route any instruction not allocated to an
installed firmware option to the user-microcode dispatcher. In the absence
of a user-microcode simulation for a given instruction, execution will
cause an undefined instruction stop.
STATUS: Fixed in version 3.8-1.
210. PROBLEM: The VIS and IOP options conflict on the 1000-F.
VERSION: 3.8-0
OBSERVATION: The Vector Instruction Set and 2000/Access I/O Processor
instructions share the same opcode range. Only one or the other should be
present at a time. The SET CPU option processor does not enforce this.
CAUSE: The case was overlooked when VIS was added.
RESOLUTION: Modify "cpu_set_opt" (hp2100_cpu.c) to make the VIS and IOP
options mutually exclusive on the 1000-F.
STATUS: Fixed in version 3.8-1.
211. PROBLEM: Pressing BREAK on a BACI terminal under RTE locks the card.
VERSION: 3.8-0
OBSERVATION: Under RTE, pressing the BREAK key on a BACI terminal session
will cause that session to lock up. If the session was writing, it will
resume in four seconds. If it was reading or idle, it will re-enable after
the timeout period specified for the device in RTE. If no timeout was
specified, then the session will remain locked forever.
CAUSE: The RTE driver operates the BACI in character mode. Normally,
pressing a key while the session is writing or idle will bring up the RTE
system prompt.
Pressing BREAK enters a NUL into the FIFO and interrupts with the BREAK
CONDITION bit set in the status word. The driver ignores this by sending a
"reset break status" command and then re-enabling interrupts with an STC
sc,C instruction. But the original interrupt was caused not by the BREAK
status (there is no explicit interrupt-on-BREAK function) but rather by the
presence of a received character in the FIFO. So the BACI attempts to
interrupt again, this time with the BREAK CONDITION bit clear.
This second interrupt would normally be allowed, as the STC sc,C
instruction clears the "interrupt lockout" flag that was set when the first
interrupt was generated. However, the STC signal handler checks for
interrupt status between the STC and the succeeding CLF, rather than after
the CLF. The result is that the STC clears lockout, then the FIFO status
sets the flag and lockout, and then the CLF clears the flag, leaving
interrupt lockout set. At that point, no interrupt is pending, and no
future interrupts can occur, because the lockout flag prevents them.
When device timeout occurs, the card is reinitialized and then re-enabled,
so it becomes responsive again.
RESOLUTION: Modify "baci_io" (hp2100_baci.c) to update the interrupt
status after the CLF of a STC sc,C instruction.
STATUS: Fixed in version 3.8-1.
212. PROBLEM: Setting a breakpoint on an interrupt trap cell does not work.
VERSION: 3.8-0
OBSERVATION: If a breakpoint is set on an interrupt trap cell, the
breakpoint does not trip when the corresponding interrupt occurs and the
trap cell contents are executed.
CAUSE: The breakpoint detection code is only in the "normal instruction"
execution path.
RESOLUTION: Modify "sim_instr" (hp2100_cpu.c) to add breakpoint detection
to the "interrupt trap cell" execution path.
STATUS: Fixed in version 3.8-1.
213. PROBLEM: A DO command without a filename prints the wrong error message.
VERSION: 3.8-1
OBSERVATION: The DO command requires a file argument and zero or more
parameter arguments. Entering DO without the file argument should print
"Too few arguments," as other commands that require arguments do (e.g.,
ATTACH, BOOT, etc.). Instead, it prints "File open error."
CAUSE: A test in "do_cmd" attempts to detect when no arguments are passed
and return SCPE_2FARG in response, but the test always fails. As a result,
"fopen" is called with a NULL filename parameter. The call fails,
resulting in the "File open error" message.
The test follows the initialization of the "do_arg" array and depends on
initialization stopping when a null argument is encountered. The bug fix
of 25-Jul-2008 ("DO cmd missing params now default to null string")
modified "do_arg" initialization to cover the entire array. Therefore, the
test to determine if "do_arg" was not initialized (which implies that the
file argument was not passed) never trips.
RESOLUTION: Modify "do_arg" (scp.c) to test "do_arg[0]" for NULL and to
return SCPE_2FARG if so.
STATUS: Fixed in version 3.9-0.
214. PROBLEM: DMA/DCPC cannot steal consecutive I/O cycles.
VERSION: 3.8-1
OBSERVATION: All DMA and DCPC cards are capable of stealing consecutive
I/O cycles, presuming that SRQ is asserted at the proper time before each
cycle. The current SIMH implementation of DMA/DCPC is capable of stealing
only every other cycle, even if SRQ is asserted continuously. The 12821A
Disc Interface diagnostic checks for consecutive cycle-steal capability and
fails when run.
CAUSE: Each pass through the instruction simulation loop does a device
timeout check, then a potential DMA cycle, and then an instruction cycle.
The device timeout calls the card unit service routine, which sets SRQ and
schedules the next service. The SRQ is then processed with the DMA cycle,
which dispatches ioIOI/IOO and ioCLF to the device. At the end of the DMA
cycle, the next instruction is executed.
A device capable of transferring data continuously would leave SRQ asserted
after the I/O cycle. But because SRQ is not checked after the DMA cycle,
the next instruction execution is performed unconditionally. Therefore,
even with continuous SRQ assertion, the simulator will interleave DMA
cycles and instructions.
RESOLUTION: Modify the instruction execution loop (hp2100_cpu.c) to
recalculate SRQ requests after each DMA cycle, and if a request is still
pending, skip instruction execution. This allows consecutive DMA cycles
without intervening instruction executions if SRQ is asserted continuously.
STATUS: Fixed in version 3.9-0.
215. PROBLEM: DMA/DCPC does not give priority to channel 1 during contention.
VERSION: 3.8-1
OBSERVATION: Dual-channel DMA/DCPC cards give priority to channel 1 if
both channels are requesting a DMA cycle. If channel 1 SRQ is asserted
continuously, then no channel 2 cycles will occur until channel 1
completes.
Under simulation, channel cycle requests alternate unconditionally. If
channel 2 requests a DMA cycle, it will always be granted, regardless of
any pending channel 1 requests.
CAUSE: Each pass through the instruction simulation loop checks for a
channel 1 request and then a channel 2 request, dispatching DMA cycles as
indicated. The check for a channel 2 request should not occur if a channel
1 request is still pending at the end of its DMA cycle.
RESOLUTION: Modify the instruction execution loop (hp2100_cpu.c) to
inhibit DMA channel 2 if a channel 1 request is still pending after a
channel 1 cycle.
STATUS: Fixed in version 3.9-0.
216. ENHANCEMENT: Rename DMA channels 0 and 1 to 1 and 2 to match the
documentation.
VERSION: 3.8-1
OBSERVATION: The HP 2100 simulator presents DMA0 and DMA1 as the DMA
devices. However, all HP literature refers to these as channel 1 and
channel 2.
RESOLUTION: Modify the device names (hp2100_cpu.c, hp2100_defs.h, and
hp2100_sys.c) from 0 and 1 to 1 and 2 to align with HP usage.
STATUS: Fixed in version 3.9-0.
217. PROBLEM: The comments for "cpu_set_idle" (hp2100_cpu.c) are obsolete.
VERSION: 3.8-1
OBSERVATION: The comments for the above routine note the requirement for
clock stabilization. This was added in 3.8-1, but the comments were not
changed.
CAUSE: Oversight.
RESOLUTION: Removed obsolete comments.
STATUS: Fixed in version 3.9-0.
218. PROBLEM: The 12578A DMA device is modeled incorrectly.
VERSION: 3.8-1
OBSERVATION: The 12578A DMA device simulation incorporates a latency
counter that delays the first DMA cycle for one instruction after the STC
is issued to enable the channel. This is incorrect; if SRQ is already
asserted, the first cycle occurs immediately after the channel is enabled.
CAUSE: Incorrect understanding.
RESOLUTION: Modify hp2100_cpu.c to remove the latency counter.
STATUS: Fixed in version 3.9-0.
219. PROBLEM: DMA IOO and CLF/EDT signals are not concurrent.
VERSION: 3.8-1
OBSERVATION: A DMA transfer to the 12821A Disc Interface should not set
the end-of-data-transfer flip-flop on the DI card until the last word has
been sent. Instead, each word transferred sets the flip-flop.
CAUSE: In the packed output mode, the end-of-data-transfer flip-flop is
set either if the the OTx instruction does not clear the flag (i.e., if OTA
used instead of OTA,C), or if the DMA EDT signal is asserted. DMA
transfers are programmed to clear the flag with each write to prevent the
flip-flop from setting until the EDT signal asserts when the last word is
output.
In hardware, CLF or EDT is asserted concurrently with IOO. In simulation,
"dma_cycle" calls the device's I/O signal handler with ioIOO, then with
ioCLF, and then, for the last cycle only, with ioEDT. At the time that the
handler receives ioIOO, it has no way of knowing whether ioCLF will follow.
Therefore, the DI sets its end-of-data-transfer flip-flop on the first word
transferred instead of on the last word transferred.
The fundamental problem is that DMA hardware may assert multiple concurrent
signals, upon which I/O card designs may test and act, but simulation
serializes the signals and therefore prevents concurrency detection.
RESOLUTION: Modify "dma_cycle" (hp2100_cpu.c) to send one set of
concurrent I/O signals to the target handler for each DMA I/O cycle, and
modify all I/O device handlers to allow processing of multiple concurrent
signals.
STATUS: Fixed in version 3.9-0.
220. ENHANCEMENT: Enhance the I/O signal dispatcher to provide for multiple
devices controlled by the same device signal handler.
VERSION: 3.8-1
OBSERVATION: Currently, the DCPC, IPL, and DI simulations control multiple
devices. The first two control a pair of devices each and determine the
desired device by checking the select code. The DI will control three,
complicating the test that would have to be done at each signal handler
entry.
RESOLUTION: Modify "devdisp" (hp2100_cpu.c) to pass the Device Information
Block (DIB) pointer instead of the select code to device signal handlers,
and modify all signal handlers accordingly. Modify all device DIBs to add
card numbers to allow for multiple-device handlers.
STATUS: Fixed in version 3.9-0.
221. PROBLEM: The LPS diagnostic mode is modeled incorrectly.
VERSION: 3.8-1
OBSERVATION: The 12578A DMA simulation was modified to remove the latency
from enabling a channel to issuing the first DMA cycle. After this change
was made, the card failed DMA diagnostic test 17.
CAUSE: The LPS device offers a diagnostic mode that simulates a 12566B
Microcircuit Interface card equipped with a loopback connector. This
configuration is used for a number of diagnostics that require an I/O card
in addition to the card under test. Typically, this is to test I/O or
interrupt capability. Jumpers on the card configure it for the diagnostic
response expected. The SET LPS DIAG mode configures the card properly for
all diagnostics except the 12578A DMA diagnostic.
SET LPS DIAG simulates jumper W1 in position C and W2 in position B. In
these positions, an STC will set the card flag one instruction later. When
used for a DMA transfer, instructions and DMA cycles will interleave 1:1,
i.e., DMA will steal every other cycle.
The 12578A diagnostic requires jumper W1 in position B and W2 in position
C. In these positions, an STC will set the card flag two instructions
later, so DMA will steal every third cycle, allowing two instructions
between DMA cycles. The 12578A diagnostic depends on this and will report
errors otherwise.
RESOLUTION: Modify "lpsio" (hp2100_lps.c) to schedule device service in
DIAG mode in three instructions if the CPU is a 2114, 2115, or 2116 and in
two instructions otherwise.
STATUS: Fixed in version 3.9-0.
222. PROBLEM: The 12821A Disc Interface diagnostic aborts with "Unit not
attached."
VERSION: 3.8-1
OBSERVATION: The 12821A Disc Interface diagnostic locates the card to test
by issuing a CLC sc,C / OTA sc / LIA sc sequence to each card in the card
cage; this writes a zero value and then looks for a specific response that
is characteristic of the DI. When the zero value is written to the MT
device (HP 3030 tape drive), it responds with "Unit not attached."
CAUSE: The MT device is unusual in that commands are executed when they
are written to the card, rather than in response to STC. Therefore, when
the zero value is written, the MT device attempts to interpret that value
as a command.
The IOO processor checks for a valid command before proceeding. Zero is
not a valid command, but the check is not coded properly. The search
through the command table loops for the number of bytes in the table, not
for the number of entries. One of the values beyond the end of the table
equals zero, so the command is considered valid, and unit service is
scheduled. The unit service routine determines that the unit is not
attached and returns an error code, causing a simulator stop.
RESOLUTION: Modify "mtcio" (hp2100_mt.c) to use the count of command table
entries as the loop count.
STATUS: Fixed in version 3.9-0.
223. ENHANCEMENT: Consolidate reporting of consecutive CRS signals.
VERSION: 3.8-1
OBSERVATION: HP 2000 Time Shared BASIC begins its start sequence by
issuing 128K CLC 0 instructions. This sequence is required by the 12920A
Terminal Multiplexer. If debugging is enabled, the IPL device writes 128K
lines to the log file. It would be more helpful if the ioCRS processor
detected consecutive calls and summarized them in a single line.
RESOLUTION: Modify "iplio" (hp2100_ipl.c) to add a CRS invocation counter
and to report a single debug line for consecutive CRS calls.
STATUS: Fixed in version 3.9-0.
224. PROBLEM: Simulation stops are ignored during DMA cycles.
VERSION: 3.8-1
OBSERVATION: An I/O routine may return an error code other than SCPE_OK to
stop the simulator. For example, IPL may return SCPE_IOERR if STC is
issued to a card with a disconnected socket. If the device is invoked via
programmed I/O, an error value return will cause a simulation stop. If the
device is invoked by DMA, it will not.
CAUSE: The "iogrp" function returns the status code to the instruction
loop, but the "dma_cycle" function ignores status returns from the I/O
handlers.
RESOLUTION: Modify "dma_cycle" (hp2100_cpu.c) to return the status from
the device signal handler, and modify "sim_instr" to stop instruction
execution if the returned status is not SCPE_OK.
STATUS: Fixed in version 3.9-0.
225. PROBLEM: Simulation stops do not always preserve the CPU state for
restarting.
VERSION: 3.8-1
OBSERVATION: If the CPU simulator is stopped by certain errors, e.g., an
unimplemented instruction execution, simulation control returns with the
CPU state set as it was just prior to the error. This allows the error to
be corrected and simulation to be resumed. It also allows identification
of the problem instruction.
Other errors, e.g., SCPE_IOERR returned by the IPL device signal handler,
stop the CPU after processing the offending instruction. In this case, the
PC points to the instruction after the offending instruction, so
identification, correction, and resumption are more difficult. DMA cycles
are also affected, as DMA registers are updated even if the I/O cycle
fails.
CAUSE: The CPU instruction and DMA cycle routines do not back out properly
when a simulation stop is indicated by a device signal handler.
RESOLUTION: Modify "sim_instr" (hp2100_cpu.c) to back out the current
instruction if it indicates a simulation stop (except for the HLT
instruction), modify "dma_cycle" to update the address and word count only
if the I/O cycle completes successfully, and modify "iplio" (hp2100_ipl.c)
to allow for restarting of a failed I/O cycle.
STATUS: Fixed in version 3.9-0.
226. PROBLEM: The comments for the floating-point divide routine are
incomplete.
VERSION: 3.8-1
OBSERVATION: In the comments for the "divide" function in "hp2100_fp1.c",
the explanation of the simulation implementation trails off with, "The
resulting 32-bit quotient is ..." It appears that the comments were never
finished before release.
CAUSE: Oversight.
RESOLUTION: Expanded and completed the comments in the "divide" function
(hp2100_fp1.c).
STATUS: Fixed in version 3.9-0.
227. PROBLEM: The 13037 disc controller returns incorrect status for a disabled
drive.
VERSION: 3.8-1
OBSERVATION: The same "unit present; heads unloaded" status is reported
for both an enabled but unattached unit and a disabled unit. The latter
should report "unit not present" status.
CAUSE: SIMH initially defines the DS device as having eight 7905 drives
connected to the controller. Each drive reports "heads unloaded" status
(Status-2 bits 1-0 = 11) until it has a disc image attached. If a unit is
disabled, it continues to report "heads unloaded" status. It should be
reporting "unit not present" (Status-2 bits 1-0 = 10) status.
RESOLUTION: Modify "ds_updds2" (hp2100_ds.c) to report an "enabled and
unloaded" condition as Not Ready and Busy, and a "disabled" condition as
Not Ready only.
STATUS: Fixed in version 3.9-0.
228. PROBLEM: The 13037 disc controller returns incorrect status for an
auto-seek beyond the drive limits.
VERSION: 3.8-1
OBSERVATION: When an auto-seek causes the disc address to move beyond the
drive limits, the wrong status is returned. For example, the following
OPDSN program:
SM,3 -- set file mask to auto-seek, cylinder mode, incremental
SK,410,2,47 -- seek to last sector of the drive
RD,256 -- read two sectors
EN
...results in Cylinder Compare Error status; status-2 shows a seek check.
The result is identical if SM,1 (surface auto-seek, rather than cylinder
auto-seek) is used.
If the RD,256 is replaced by RF,276, the result is Normal Completion and a
seek check. The resulting disc address is 411,0,1.
If decremental seeks are used:
SM,13 -- set file mask to auto-seek, cylinder mode, decremental
SK,0,2,47 -- seek to last sector of the first cylinder
RD,256 -- read two sectors
EN
...the status return is the same as above.
In each of these cases, the result should be Status-2 (Seek Check) on the
second sector transfer.
CAUSE: If an auto-seek exceeds the drive bounds, a seek check is correctly
detected, but it is not reported back to the host.
RESOLUTION: Modify "ds_start_rw" (hp2100_ds.c) to check for Seek Check on
an auto-seek and to report Status-2 if set. Also, a reseek resulting from
a cylinder miscompare now either succeeds if the cylinder is valid or
reports Status-2 and Seek Check if the cylinder is invalid. Finally, an
invalid head or sector value reports Status-2 and Seek Check instead of
Head-Sector Compare Error (Head-Sector and Cylinder Compare Errors can only
occur during sparing operations which are not supported in simulation).
STATUS: Fixed in version 3.9-0.
229. PROBLEM: The 13037 Read Without Verify command does not verify the address
when a track boundary is crossed.
VERSION: 3.8-1
OBSERVATION: The Read Without Verify command is identical to the Read
command except that it skips address verification before beginning the
read. If the read continues past a track boundary and auto-seek is
enabled, the new track location should be verified. This does not occur.
The following OPDSN program illustrates the problem:
SM,3 -- set file mask to auto-seek, cylinder mode, incremental
SK,0,0,47 -- seek to last sector on cylinder 0 head 0
DB,128,000047 -- fill the sector buffer with the CHS address
WD,128 -- write sector 0/0/47
DB,128,000100 -- fill the sector buffer with the CHS address
WD,128 -- write sector 0/1/0
SK,1,0,47 -- seek to the last sector on cylinder 1 head 0
DB,128,100047 -- fill the sector buffer with the CHS address
WD,128 -- write sector 1/0/47
DB,128,100100 -- fill the sector buffer with the CHS address
WD,128 -- write sector 1/1/0
SK,0,0,47 -- seek to last sector on cylinder 0 head 0
AR,1,0,47 -- change controller address to cylinder 1
RW,256 -- read two sectors
DR,120,135 -- display end of first sector and start of second sector
EN
If address verification is performed at the end of track 0, the second
sector will be read from 1,1,0 instead of 0,1,0 because of the cylinder
miscompare after the auto-seek:
0120: 000047 000047 000047 000047 000047 000047 000047 000047
0128: 100100 100100 100100 100100 100100 100100 100100 100100
However, the above program prints:
0120: 000047 000047 000047 000047 000047 000047 000047 000047
0128: 000100 000100 000100 000100 000100 000100 000100 000100
...indicating that address verification was not done for either sector.
Note that if the Read Without Verify above is changed to Read (RD,256), the
result is:
0120: 100047 100047 100047 100047 100047 100047 100047 100047
0128: 100100 100100 100100 100100 100100 100100 100100 100100
...indicating that address verification was done correctly for the first
sector.
CAUSE: The Read Without Verify handler disables address verification for
the entire transfer. It should be disabled only until a track switch
occurs.
RESOLUTION: Modify the Read Without Verify command handler in "ds_svc_u"
(hp2100_ds.c) to begin verifying if a track boundary is crossed.
STATUS: Fixed in version 3.9-0.
230. PROBLEM: The 13037 Request Sector Address command does not check the unit
number.
VERSION: 3.8-1
OBSERVATION: The Request Sector Address command accepts invalid, unloaded,
or missing units without reporting status errors. Also, the specified unit
number is not reported in the status-1 field of a subsequent Request Status
command. Assuming that unit "ds1" is not attached (heads unloaded) and
unit "ds2" is disabled, the following OPDSN programs illustrate the
problem:
SD,1
RA
ST
SC,0001001100000001,1XXXXXX000X00011
DR,0
EN
SD,2
RA
ST
SC,0001001100000010,1XXXXXX000X00010
DR,0
EN
SD,10
RA
ST
SC
DR,0
EN
All of these should return Status-2 but instead return Normal Completion.
SD,15
RA
ST
SC,0001011100001111,1XXXXXX000X00010
DR,0
EN
This should return Unit Unavailable but instead returns Normal Completion.
CAUSE: The Request Sector Address command handler is not checking the unit
range or status.
RESOLUTION: Modify "ds_docmd" (hp2100_ds.c) to set the unit number into
the status-1 field and to check for invalid units and report Unit
Unavailable if so. Modify "ds_svc_u" to check that the heads are loaded on
the target unit and report Status-2 if not.
STATUS: Fixed in version 3.9-0.
231. PROBLEM: The 13037 Wakeup command does not check the unit number.
VERSION: 3.8-1
OBSERVATION: The Wakeup command accepts invalid units without reporting
status errors. Also, the specified unit number is not reported in the
status-1 field of a subsequent Request Status command.
CAUSE: The Wakeup command handler is not checking the unit range.
RESOLUTION: Modify "ds_docmd" (hp2100_ds.c) to set the unit number into
the status-1 field and to check for invalid units and report Unit
Unavailable if so.
STATUS: Fixed in version 3.9-0.
232. PROBLEM: SHOW <dev> doesn't show the unit number when all but one unit are
disabled.
VERSION: 3.8-1
OBSERVATION: For multi-unit devices, the SHOW <dev> command prints device
information on the first line and then prints each unit's information on
succeeding lines. For single-unit devices, the device and unit information
are combined on one line, as the device name is allowed as a synonym for
unit 0. However, if a multi-unit device has all but one unit disabled, the
SHOW <dev> command reports the remaining unit as though the device had only
one unit, implying that the enabled unit is unit 0.
For example, HP device DQC has two units. Attaching a file to unit 1 and
disabling unit 0 produces this output for the SHOW DQC command:
DQC, devno=24/25, 11MW, attached to file.tmp, heads loaded, write enabled
There is no indication that the file is attached to unit 1, and indeed if
the attachment and disabled units are reversed, the command output is the
same as above.
CAUSE: Routine "show_device" (scp.c) combines the device and unit display
when a device has only one enabled unit. This is intended to hide the
implementation detail of single-unit devices, e.g., paper tape readers,
while allowing additional permanently-disabled units to be used by the
device for scheduling. However, it should not combine the device and units
when user-disabled units exist.
RESOLUTION: Modify "show_device" (scp.c) to count units that have been
disabled by the user instead of units that may be disabled by the user, and
to report the unit number if user-disabled units are present. Also change
the count of reported units from the number of enabled units to the sum of
the enabled and user-disabled units.
STATUS: Fixed in version 3.9-0.
233. ENHANCEMENT: Add a simulation of the ICD series of disc drives and the
12821A Disc Interface.
VERSION: 3.8-1
OBSERVATION: The ICD drives were lower-cost versions of the earlier MAC
drives that incorporated single-drive controllers in the drive chassis.
This obviated the requirement for the separate 13037 disc controller. They
were interfaced via the 12821A HP-IB Disc Interface card; this card was
also used to interface CS/80 disc and Amigo tape drives, such as the 7912
and 7974A.
The addition of an ICD simulation allows preparation and direct exchange of
image files with the "HPDrive" disc emulator to enable hardware CPUs to run
with emulated drives.
RESOLUTION: Add a simulation of the 12821A Disc Interface (hp2100_di.c
and hp2100_di.h). Add the DA device to simulate the ICD disc drives and
the ICD disc loader ROM (hp2100_di_da.c). Generalize the controller code
in the DS simulation into a common disc simulation library (hp_disclib.c
and hp_disclib.h). Alter "hp2100_sys.c" and "hp2100_defs.h" to add the
device structure and default select code assignment.
STATUS: Fixed in version 3.9-0.
234. ENHANCEMENT: Revise the simulator and documentation to use the term
"select code" instead of "device number."
VERSION: 3.8-1
OBSERVATION: The HP2100 simulator and documentation use the terms "device
number," "device address," and "DEVNO" to refer to the I/O addresses of the
CPU interface cards. These terms are alien to HP users; all of the CPU and
interface documentation, from the 2116 through the 1000, use the term
"select code" for this property.
With the addition of the 12821A disc interface and associated HP-IB drives,
the terms in use are now confusing as well. The switches on the drives
that set the bus addresses are labelled, "HP-IB DEVICE ADDRESS." Other HP
disc and tape drive manuals refer to "unit addresses" or "unit numbers" to
indicate the addresses that differentiate multiple drives on a given
interface.
It would be clearer, especially to new users, if the existing terms were
deprecated in preference to "select code" in the simulator and
documentation.
RESOLUTION: Modify all I/O device simulators to add "SC" as an alias for
"DEVNO" in the register and modifier tables, retaining "DEVNO" to preserve
backward compatibility with existing procedures and command files. Add
MTAB_NMO to the DEVNO modifier entry so that it does not appear in EXAMINE
or SHOW lists but can still be displayed or modified if requested
explicitly. Add hp_setsc and hp_showsc functions (hp2100_sys.c) to set and
show the select code, and modify hp_setdev and hp_showdev to call hp_setsc
and hp_showsc, respectively, and to work around newline suppression for
MTAB_NMO entries. Modify the documentation to change device number
references to select code references.
STATUS: Fixed in version 3.9-0.
235. ENHANCEMENT: Deprecate the device name CLK in favor of TBG.
VERSION: 3.8-1
OBSERVATION: The CLK device provides a simulation of the 12539C Time Base
Generator interface. This interface is universally known to HP users as
the TBG. It would be clearer for these users if the device were named TBG.
RESOLUTION: Modify clk_dev (hp_stddev.c) to add "TBG" as the logical name.
This still allows use of the CLK name for existing command files.
STATUS: Fixed in version 3.9-0.
236. PROBLEM: The 13037 disc controller indicates a data under/overrun
incorrectly.
VERSION: 3.8-1
OBSERVATION: The 13037 disc simulator monitors the data transfer during a
read or write operation. A data overrun is indicated if SRQ is still set
when a data transfer is ready, indicating that the previous transfer has
not been handled yet by DCPC. However, the interface contains a 16-word
FIFO, so an overrun should be indicated only if the FIFO is full when a
read transfer is ready or empty when a write transfer is ready.
A read transfer writes a word to the FIFO and sets SRQ. Currently, DCPC
must remove the word and clear SRQ before the next read transfer occurs,
even though 15 empty slots still remain in the FIFO. Similarly, a write
transfer reads a word from the FIFO and sets SRQ. DCPC must supply the
next word and clear SRQ before the next write transfer occurs, even though
available words may remain in the FIFO. Effectively, the FIFO doesn't
exist, as the simulator treats it as a single-word register.
Moreover, the SRQ generation logic does not attempt to keep the FIFO full
for a write or empty for a read. If DCPC activity on the other channel
delays the DS channel, even by one word, an overrun is indicated, even
though available space remains in the FIFO.
CAUSE: Incomplete FIFO implementation.
RESOLUTION: Modify the read and write data transfer logic (hp2100_ds.c) to
indicate a data overrun when the FIFO is full or empty, respectively, and
extend the SRQ logic to continue requesting DCPC transfers until the FIFO
is empty (read) or has five words present (write), as in the hardware.
STATUS: Fixed in version 3.9-0.
237. PROBLEM: The 13037 disc controller Clear command clears too much.
VERSION: 3.8-1
OBSERVATION: In hardware, the Clear command issues a Controller Preset
(CPS) tag to all connected disc drives. The description of CPS says that
it clears drive faults, the drive head and sector registers, the drive
illegal head and sector address flip-flops, and the seek check, first
status, drive fault, and attention status bits. In simulation, the
"ds_clear" routine clears the drive current cylinder register and all
status bits.
CAUSE: Incorrect implementation.
RESOLUTION: Modify "ds_clear" (hp_disclib.c) to clear just the indicted
drive status.
STATUS: Fixed in version 3.9-0.
238. PROBLEM: The 13037 Recalibrate command clears the End-of-Cylinder flag.
VERSION: 3.8-1
OBSERVATION: The 13037 disc controller provides the Recalibrate command to
recover from Cylinder Compare errors. Recalibrate does not alter the
cylinder, head, or sector address in the controller. This allows a Read to
follow the Recalibrate directly without requiring an intervening Seek.
However, the DS simulator clears the EOC flag. This flag indicates that
the controller cylinder address must be incremented before it is used by
the read or write routines. Therefore, a Read following a Recalibrate will
begin at the wrong address if the last successful read ended after the
last sector on a track.
CAUSE: Oversight.
RESOLUTION: Modify the "ds_opflags" table (hp2100_ds.c) to remove the
CMF_CLREC flag from the Recalibrate entry.
STATUS: Fixed in version 3.9-0.
239. PROBLEM: The 13037 Request Status command reports Normal Completion for an
invalid unit.
VERSION: 3.8-1
OBSERVATION: The Request Status command includes a unit number field to
specify the disc drive whose status is returned in the second word. The
unit number is checked for validity, and a "unit not present" status is
returned if the number is invalid. However, if the unit number is illegal
(i.e., > 10), the command sets Normal Completion status instead of Unit
Unavailable status.
CAUSE: The status is set without checking for unit number legality.
RESOLUTION: Modify "ds_svc_c" (hp2100_ds.c) to set Unit Unavailable status
if the supplied unit number is greater than 10.
STATUS: Fixed in version 3.9-0.
240. PROBLEM: The 13037 Cold Load Read and Seek commands do not set Seek Check
if issued while a seek is in progress.
VERSION: 3.8-1
OBSERVATION: In hardware, the read, write, and recalibrate commands wait
for seek completion if they are issued while the heads are positioning.
The Cold Load Read and Seek commands do not; they issue a seek to the drive
without checking. The drive rejects a seek while the heads are in motion
and sets Seek Check status. In simulation, however, the Cold Load Read and
Seek commands wait for seek completion before seeking.
CAUSE: Oversight.
RESOLUTION: Modify the "ds_opflags" table (hp2100_ds.c) to remove the
CMF_UIDLE flag from the Cold Load Read and Seek entries, and modify
"ds_docmd" to check for a seek in progress when processing the Cold Load
Read and Seek commands.
STATUS: Fixed in version 3.9-0.
241. PROBLEM: A 13037 Seek command followed by Read does not set the busy flag.
VERSION: 3.8-1
OBSERVATION: In hardware, a Read command (e.g.) may be issued while a seek
is in progress. The controller firmware sets the busy flag to indicate
that the command was accepted. In simulation, however, the Read command is
not started until the seek is complete, so the busy flag is clear. A
program checking the busy flag will conclude that the Read was rejected.
CAUSE: The busy flag is set after the check for a seek in progress, and
the firmware wait is modeled by leaving the command pending on the
interface until the seek completes.
RESOLUTION: Modify "ds_docmd" (hp2100_ds.c) to eliminate the command
holdoff and instead model the wait for seek completion by changing the unit
function from "seek completion" to "read initiation" (e.g.).
STATUS: Fixed in version 3.9-0.
242. ENHANCEMENT: Modify the 13037 disc simulator to use the common disc
controller library.
VERSION: 3.8-1
OBSERVATION: The 13037 (MAC) and 13365 (ICD) disc controllers are almost
identical. Altering the DS simulator to use the controller library
introduced with the DA simulator would reduce code size, ease maintenance,
and ensure that controller bug fixes propagate to both simulators.
RESOLUTION: Modify the 13037 simulator (hp2100_ds.c) to call routines in
the common disc controller library (hp_disclib.c).
STATUS: Fixed in version 3.9-0.
243. ENHANCEMENT: Add debug printout support to the 13037 disc simulator.
VERSION: 3.8-1
OBSERVATION: Debugging the disc controller behavior would be easier if the
internal state of the simulator was observable and recordable.
RESOLUTION: Modify "hp2100_ds.c" to add debug-mode printouts.
STATUS: Fixed in version 3.9-0.
244. ENHANCEMENT: Eliminate the poll for parameters to 13037 disc commands.
VERSION: 3.8-1
OBSERVATION: The DS simulator repeatedly polls the CPU interface for the
parameters to certain disc commands, such as Seek. It would be more
efficient to wait for a parameter to be output by the CPU.
RESOLUTION: Modify "ds_io" (hp2100_ds.c) to activate the controller
service only when a parameter word has been received with an ioIOO signal.
STATUS: Fixed in version 3.9-0.
245. PROBLEM: The EMA diagnostic sometimes aborts with a DM error.
VERSION: 3.8-1
OBSERVATION: Running the RTE-IV EMA diagnostic "#EMA" may abort with a DMS
violation:
DM VIOL = 160377
DM INST = 105257
ABE 177750 15 1
XYO 116123 72137 0
DM #EMA 16521
#EMA ABORTED
The abort occurs in test 8, which executes the .EMAP instruction and passes
a negative number of dimensions.
CAUSE: The test supplies a dimension count of -32768. The offset of the
specified array element is calculated by the "cpu_ema_resolve" routine by
iterating through the array subscripts. The 16-bit word containing the
dimension count is loaded into a 32-bit signed integer variable as an
unsigned value. Therefore, +32678 dimensions are assumed. However, only
one subscript value is supplied in the call, so subsequent instructions
after the call are interpreted as subscript addresses, yielding random
values from memory. Also, the array descriptor only defines one subscript,
so subsequent memory values are interpreted as subscript bounds and element
counts.
If one of subscript offsets evaluates to a negative value, the routine
returns FALSE, and the instruction fails. The diagnostic interprets the
cause of the failure as the negative dimension count and passes test 8.
However, if a subscript address points at a protected page of memory, the
instruction causes a DM violation when the value is retrieved.
RESOLUTION: Modify "cpu_ema_resolve" (hp2100_cpu5.c) to sign-extend the
16-bit dimension count.
STATUS: Fixed in version 3.9-0.
246. PROBLEM: SHOW MTC SHOW lists the FORMAT modifier twice.
VERSION: 3.8-1
OBSERVATION: Entering the planned SHOW MTC SHOW command results in the
following display:
sim> SHOW MTC SHOW
sh{ow} MTC FORMAT, SC, DEVNO
sh{ow} MTCn FORMAT
FORMAT is listed both as a device and as a unit modifier.
CAUSE: The FORMAT entry in the modifier table contains both the MTAB_VDV
and the MTAB_VUN flags.
RESOLUTION: Remove the redundant MTAB_VUN flag from the "mtc_mod" array
(hp2100_mt.c).
STATUS: Fixed in version 3.9-0.
247. PROBLEM: The ICD disc read end-of-track delay is not optimal.
VERSION: 3.9-0
OBSERVATION: To avoid End of Cylinder errors when reading the last sector
of a track, the ICD controller must delay more than the usual intersector
time to allow the OS driver to send an Untalk if a read is to be
terminated. Currently, the longer delay is used if an end-of-cylinder
condition is present. However, the delay is needed only if the resulting
seek attempt would cause an error if the read is continued; the normal
delay should be used if the seek is permitted and would succeed.
Also, if the host does send an Untalk during this time, the longer delay
should be cancelled, and command termination should be scheduled for
immediate processing.
CAUSE: Suboptimal implementation.
RESOLUTION: Modify "end_read" (hp_disclib.c) to use the longer time only
if the seek would fail, and modify "complete_read" (hp2100_di_da.c) to
cancel the intersector delay and schedule the completion phase immediately.
STATUS: Fixed in version 4.0-0.
248. PROBLEM: Calling a VMA routine from a non-VMA program does not MP abort.
VERSION: 3.9-0
OBSERVATION: If a virtual memory routine, such as .LBP, is called from a
non-VMA program, it should be aborted with a memory protect error.
Instead, a dynamic mapping error occurs instead:
ASMB,R
NAM MAPPR
EXT EXEC,.LBP
START CLA
CLB
JSB .LBP
NOP
JSB EXEC
DEF *+2
DEF *+1
DEC 6
END START
DM VIOL = 160377
DM INST = 105257
ABE 0 0 0
XYO 0 0 0
DM MAPPR 2014
MAPPR ABORTED
CAUSE: The page mapping routine, "cpu_vma_mapte", returns TRUE if the page
table is set up and valid and FALSE if not. If a program is not a VMA
program, then it has no page table, but "cpu_vma_mapte" is returning TRUE
erroneously. That results in a DM error when the invalid page entry is
used.
The microcode explicitly tests for a non-VMA program, i.e., one with no ID
extension, and generates an MP error in this case.
RESOLUTION: Modify "cpu_vma_mapte" (hp2100_cpu5.c) to return FALSE if
called for a non-VMA program.
STATUS: Fixed in version 4.0-0.
249. PROBLEM: RESTORing a previously SAVEd session fails if the 12792C
multiplexer is attached.
VERSION: 3.9-0
OBSERVATION: If the MPX device has a listening port attached when a
session is saved, attempting to restore that session results in a "Unit not
attachable" error.
CAUSE: The MPX attach routine only allows attachment to unit 0, i.e.,
ATTACH MPX <port>, but the actual attachment is made to the Telnet poll
unit (unit 9). As SAVE finds the port attached to unit 9, RESTORE attempts
to reattach it to unit 9.
RESOLUTION: Modify "mpx_attach" (hp2100_mpx.c) to allow attachment to unit
9 only during a RESTORE.
STATUS: Fixed in version 4.0-0.
250. PROBLEM: DEASSIGNing the TBG device generates a debug warning.
VERSION: 3.9-0
OBSERVATION: When running the simulator under a debugger, entering the
command DEASSIGN TBG prints "warning: Invalid Address specified to
RtlFreeHeap."
CAUSE: The TBG logical name is specified statically in the DEVICE
structure, but "deassign_device" calls "free" on the pointer. The
developer's manual does not state that the logical name must be dynamically
allocated, but deassigning assumes that it was.
RESOLUTION: Modify "clk_reset" (hp2100_stddev.c) to allocate the logical
name during a power-on reset.
STATUS: Fixed in version 4.0-0.
251. PROBLEM: Constants required for exdep_cmd and brk_cmd aren't in scp.h.
VERSION: 3.9-0
OBSERVATION: The scp.h header file exports the exdep_cmd and brk_cmd
functions, but the constants that must be passed in the "flag" parameters
for proper operation are not present. The run_cmd function also requires
constants for the "flag" parameter, but these are present.
CAUSE: Oversight.
RESOLUTION: Move the EX_D, EX_E, EX_I, SSH_ST, SSH_CL, and SSH_SH
constants from scp.c to scp.h.
STATUS: Fixed in version 4.0-0.
252. PROBLEM: Stop calls VM-provided address printer for PC without REG_VMAD.
VERSION: 3.9-0
OBSERVATION: For a simulator stop, sim_vm_fprint_addr (if defined) is
called to print the value of the program counter, regardless of whether or
not the register was defined with REG_VMAD. However, displaying the PC
value with "examine" calls sim_vm_fprint_addr only if the REG_VMAD flag is
present. The displayed value of the PC should be the same in both cases.
CAUSE: The call to sim_vm_fprint_addr in fprint_stopped_gen is not
conditional on the PC register having the REG_VMAD flag.
RESOLUTION: Modify "fprint_stopped_gen" (scp.c) to require REG_VMAD before
calling the VM-specific address printer for the program counter value.
STATUS: Fixed in version 4.0-0.
253. PROBLEM: Cannot show radix, etc. for a device that has no modifiers.
VERSION: 3.9-0
OBSERVATION: The default data radix for a device may be set with the SET
<dev> OCT|DEC|HEX command. However, if the device does not have a modifier
table, SHOW <dev> RADIX is rejected with "No settable parameters".
The same problem occurs for SHOW <dev> DEBUG and SHOW <dev> NAMES. For a
device that provides debug printouts, SHOW <dev> MOD will list "DEBUG,
NODEBUG" among the modifiers, and the SHOW <dev> DEBUG command will display
the current debug status. However, if the device does not contain a
modifier table, SHOW <dev> MOD and SHOW <dev> DEBUG will report "No
settable parameters", even though SET <dev> DEBUG is accepted and works as
expected. For such a device, SHOW MOD will show "DEBUG, NODEBUG" as
acceptable modifiers.
CAUSE: The "show_cmd_fi" routine checks for a modifier table and returns
an error without checking for global actions.
RESOLUTION: Modify "show_cmd_fi" (scp.c) to continue to process global
actions if the modifier table is not defined.
STATUS: Fixed in version 4.0-0.
254. PROBLEM: SET and SHOW responses for invalid entry are inconsistent.
VERSION: 3.9-0
OBSERVATION: Entering SET <dev> <mod> where <mod> is not defined in the
device's modifier table displays "Non-existent parameter." Entering SHOW
with the same parameters displays "Invalid argument."
Similarly, entering SET <dev> DEBUG for a device that does not have
debugging capability displays "Command not allowed." Entering SHOW with
the same parameters displays nothing.
In both cases, the messages displayed should be the same for the same
error.
CAUSE: Oversight.
RESOLUTION: Modify "show_cmd_fi" (scp.c) to return the same status codes
as "set_cmd" does.
STATUS: Fixed in version 4.0-0.
255. ENHANCEMENT: Add a "-N" (new file) option to the SET CONSOLE LOG and SET
CONSOLE DEBUG commands.
VERSION: 3.9-0
OBSERVATION: These commands normally append to their respective log files.
If the user wants to recreate the log file instead, it must be deleted
first with OS-specific commands. Adding a "-N" option to perform the
delete removes commands dependent on a specific OS.
RESOLUTION: Modify "sim_set_logon" and "sim_set_debon" (sim_console.c) to
check for a "-N" option and to open for writing instead of appending if
detected.
STATUS: Fixed in version 4.0-0.
256. ENHANCEMENT: Add tape runaway support to the simulator tape library.
VERSION: 3.9-0
OBSERVATION: The ANSI specifications for NRZI, PE, and GCR tape recording
mandate a maximum length of 25 feet for erase gaps. Currently, an erase
gap of any length is ignored when reading or spacing. To allow detection
of non-compliant tape images, the simulator tape library is enhanced to
halt positioning and return tape runaway status if a gap of 25 feet or more
is encountered.
Runaway detection is enabled by calling the tape library to set the tape
density in bits per inch. If this call is not made, erase gaps present in
a tape image are effectively ignored. Also, with the addition of a
separate "set density" call, it is no longer necessary to supply the
density when writing erase gaps.
RESOLUTION: Modify "sim_tape_rdlntf" and "sim_tape_rdlntr" (sim_tape.c) to
detect tape runaway, and add a new MTSE_RUNAWAY status to sim_tape.h. Add
new "sim_tape_set_dens" and "sim_tape_show_dens" functions to set and show
the bits per inch for a unit, respectively, and eliminate the "bpi"
parameter to "sim_tape_wrgap" in preference to using the density
established by a previous "sim_tape_set_dens" call. Add named constants
to "sim_tape.h" that specify the density.
STATUS: Fixed in version 4.0-0.
257. ENHANCEMENT: Improve performance when reading or spacing over erase gaps.
VERSION: 3.9-0
OBSERVATION: Performance when reading or spacing over erase gaps is poor,
especially in the reverse direction. Currently, each 4-byte gap marker is
read individually, and in the reverse direction, each read is preceded by a
seek to move the file pointer backward. This combination causes stream
cache invalidation and a physical disc access for each gap marker. As a
single gap consists of over 1000 markers, performance is far worse than if
a gap was read as a block.
RESOLUTION: Modify "sim_tape_rdlntf" and "sim_tape_rdlntr" (sim_tape.c) to
buffer reads of gap markers. Using a 128-element buffer, performance
improves about thirty-fold.
STATUS: Fixed in version 4.0-0.
258. PROBLEM: Writing an end-of-medium positions the tape image after the mark.
VERSION: 3.9-0
OBSERVATION: The "sim_tape_wreom" simulator tape library function writes
an end-of-medium marker on the tape image. The intent is to erase the
remainder of the tape. The "SIMH Magtape Representation and Handling"
document states that the tape position is not updated by this function.
However, the function leaves the tape positioned after the marker.
A subsequent read would stop at the EOM marker. However, writing a new
marker over that one would then allow reading of the data following the EOM
that supposedly had been erased by the original "sim_tape_wreom" call.
CAUSE: The tape position is updated by the internal "sim_tape_wrdata" call
that is used to write the EOM marker, but it is not reset afterward by the
function.
RESOLUTION: Modify "sim_tape_wreom" (sim_tape.c) to reset the tape
position to point at the EOM marker before returning. This prevents
reading past an EOM marker, and a subsequent write will overwrite the
marker rather than embed it between data records.
STATUS: Fixed in version 4.0-0.
259. PROBLEM: Reading through an erase gap in reverse may return EOM status.
VERSION: 3.9-0
OBSERVATION: A reverse read or spacing operation through an erase gap may
return end-of-medium status. Reading or spacing forward through the same
gap works properly.
CAUSE: Writing an erase gap over existing records may produce a gap that
is longer than requested. This occurs when truncating the last record to
be overlaid by the gap would leave a record that is shorter than the
minimum size allowed (eight bytes for the length words plus two bytes for
the data). In this case, the gap is lengthened to overlay the entire
record. If the new gap size is not evenly divisible by four, a half-gap is
metadata marker of value 0xFFFF added to the beginning of the gap.
If a gap that begins with a half-gap marker is written immediately after
a previous gap, the "seam" between gaps will contain the bytes FE FF FF FF
( FF FF ) FE FF FF FF.... Reading forward across this seam will yield a
metadata value of 0xFFFEFFFF, which is recognized and handled by seeking
two bytes back to resynchronize reading. However, reading in reverse will
yield the value 0xFFFFFFFF, which is interpreted as end-of-medium.
RESOLUTION: Modify "sim_tape_rdlntr" (sim_tape.c) to recognize 0xFFFFFFFF
as a half-gap marker and resynchronize in response. End of medium cannot
occur when reading in reverse, as it is impossible to position the tape
image beyond an EOM marker. Therefore, any 0xFFFFFFFF value encountered
must be a half-gap "seam" originating as above.
STATUS: Fixed in version 4.0-0.
260. PROBLEM: sim_tape_wrgap fails when format is changed from SIMH format.
VERSION: 3.9-0
OBSERVATION: The HP 2100 magnetic tape simulator supports erase gaps and
calls sim_tape_wrgap when commanded to write a gap. However, if a tape
format other than SIMH format is selected, the call fails with MTSE_FMT.
CAUSE: Erase gaps are not supported in formats other than SIMH, but the
call should not fail. Instead, the call should be a "no-operation" if the
underlying format does not support gaps.
RESOLUTION: Modify "sim_tape_wrgap" (sim_tape.c) to return MTSE_OK with no
action performed if a tape format other than SIMH is selected.
STATUS: Fixed in version 4.0-0.
261. PROBLEM: The magnetic tape format of an attached unit may be changed.
VERSION: 3.9-0
OBSERVATION: The magnetic tape library supports several tape image
formats. The format to use may be specified either by an "ATTACH -F"
command or by a "SET <unit> FORMAT" command. The latter calls the
"sim_tape_set_fmt" function, which allows the format of a file currently
attached to be changed. However, the format is an intrinsic property of
the tape image file, so changing it once the file has been attached makes
no sense.
CAUSE: Oversight.
RESOLUTION: Modify "sim_tape_set_fmt" (sim_tape.c) to return an error
(SCPE_ALATT, "Unit already attached") if the unit is attached.
STATUS: Fixed in version 4.0-0.
262. ENHANCEMENT: Add CRCC and LRCC support to the HP 2100 MS simulation.
VERSION: 3.9-0
OBSERVATION: The HP 2100 MS device simulates the HP 7970 B/E magnetic tape
drives. The 7970B uses NRZI format, and its associated controller supports
returning the cyclic redundancy check character and longitudinal redundancy
check character (CRCC and LRCC) to the CPU. Typically, these are used only
by the controller diagnostic, but support is easy to add.
RESOLUTION: Modify "hp2100_ms.c" to add a function that calculates CRCC
and LRCC for reads and writes, and call that function when the CPU requests
that the controller deliver the values.
STATUS: Fixed in version 4.0-0.
263. ENHANCEMENT: Allow the VM to print simulator stop message information in
lieu of, or in addition to, the default message.
VERSION: 3.9-0
OBSERVATION: The current implementation of "run_cmd" in scp.c calls
"fprint_stopped_gen" (via "fprint_stopped") to print the message associated
with the "sim_instr" return status. Messages associated with VM stops must
be provided to the SCP via the "sim_stop_messages" array.
"fprint_stopped_gen" prints the status message in a rigid format: the
message string, a comma, the program counter register name, a colon, the
current PC value, and the instruction at that address in symbolic format.
For example:
HALT instruction, P: 24713 (LDA 1)
Only the message string is under the control of the VM. If additional
information is needed, it can only be added before the first comma.
The HP2100 simulator does this for halt instructions, which contain device
select code and flag hold/clear bit fields that, in practice, are used to
communicate to the operator the significance of the particular halt
encountered, rather than to affect the device interface:
HALT instruction 102077, P: 24713 (LDA 1)
To implement this, the simulator must define the message as a variable and
then copy the formatted octal value into the buffer at the appropriate
location before returning from "sim_instr".
However, if the VM wants to display a different register value, e.g.:
Self test #13 complete, STAT: 000020
...this cannot be done without also displaying the program counter, which
may be irrelevant for the given stop condition.
RESOLUTION: Modify "fprint_stopped_gen" (scp.c) to check a VM-specific
simulation stop printer pointer ("sim_vm_fprint_stopped") that is
initialized to NULL and can be overridden by the VM, and, if overridden,
call it after printing the message string and before printing the program
counter. If the VM printer returns TRUE, print the comma and the program
counter as before. If the VM routine returns FALSE, print just the
terminating newline.
STATUS: Fixed in version 4.0-0.
264. ENHANCEMENT: Indicate that "examine" is being called for a simulator stop.
VERSION: 3.9-0
OBSERVATION: As part of the simulator stop message, the fprint_stopped_gen
routine prints the instruction pointed to by the program counter. In
addition to the "M" (mnemonic) switch, it passes the SIM_SW_STOP flag to
the fprint_sym routine to indicate that it is being called for a simulator
stop. This allows the VM-defined routine to take any action specifically
appropriate to the stop.
To get the instruction value, fprint_stopped_gen calls the CPU's "examine"
routine and passes the program counter value as the address. However,
interpretation of addresses may differ, depending on context. For example,
a given address may be relative to a code, data, or stack space pointer.
To attempt to address this, the "examine" call includes the "V" (virtual)
switch. However, "virtual" (and the associated "-v" command line switch)
may have a different meaning assigned by a given VM. What is needed is an
unequivocal indication that a machine instruction value is being retrieved.
RESOLUTION: Modify "fprint_stopped_gen" (scp.c) to pass SIM_SW_STOP to
"examine" as well as "fprint_sym", so that these routines have unambiguous
indications that they are being called in the context of a simulator stop.
STATUS: Fixed in version 4.0-0.
265. PROBLEM: Compiling the HP simulator for 64-bit addressing produces many
conversion warnings.
VERSION: 3.9-0
OBSERVATION: Compiling the simulator and defining USE_INT64 and USE_ADDR64
with implicit conversion warnings enabled reveals a number of places where
assumptions were made that addresses would always be 32 bits. This is a
reasonable assumption, as there are no devices (CPU or peripherals) that
can handle gigabyte addressing. Still, many of these assumptions are not
necessary, and some future peripheral simulator may exceed this limit.
CAUSE: Future expansion to 64-bit addressing was not envisioned.
RESOLUTION: Modify source files to ensure that "t_addr" and "t_value"
types are used instead of "uint32" and "int32" types where addressing and
data values may be 64 bits. Also ensure that valid conversions to smaller
sizes use explicit casts.
STATUS: Fixed in version 4.0-0.
266. PROBLEM: BOOT devices require a duplicate S-register declaration.
VERSION: 3.9-0
OBSERVATION: All of the peripheral devices that support the BOOT command
set the select code and other parameters into the S register during the
boot process. This direct register access requires an external declaration
that duplicates the one in the full CPU declarations file (hp2100_cpu.h).
A better method that avoids the duplicate declaration would be for the
"ibl_copy" routine to modify the S register on behalf of the caller.
CAUSE: Poor original implementation.
RESOLUTION: Modify "ibl_copy" (hp2100_cpu.c) to take two additional
parameters that clear and set bits, respectively, in the S register on
behalf of the caller. Modify the boot routines for the CPU, DA, DP, DQ,
DR, DS, IPL, MS, and PTR devices to use the new parameters instead of
modifying the S register directly.
STATUS: Fixed in version 4.0-0.
267. ENHANCEMENT: Add a register to the IPLI device to configure the DMA delay.
VERSION: 3.9-0
OBSERVATION: Occasionally, the 2000 Access terminal multiplexer does not
initialize properly; the problem is more prevalent on multiprocessor
systems.
There is a race condition between the system processor (SP) and the I/O
processor (IOP) during initialization. The problem occurs if the IOP DMA
completion interrupt routine finishes before the SP DMA completion
interrupt routine. As a workaround, the simulator suspends the IOP process
for one millisecond before signaling a DMA completion (EDT) interrupt.
Depending on system loading, this time may be insufficient.
RESOLUTION: Modify "ipli_reg" (hp2100_ipl.c) to add a hidden register,
EDTDELAY, that allows the user to configure the completion delay. The
register value is expressed in milliseconds and defaults to one
millisecond.
STATUS: Fixed in version 4.0-0.
268. ENHANCEMENT: Provide "fprint_sym" and "parse_sym" with register-specific
information when a register is being examined or deposited.
VERSION: 3.9-0
OBSERVATION: When EXAMINE or DEPOSIT specifies a register that has the
REG_VMIO flag, "fprint_sym" or "parse_sym", respectively, is called in lieu
of "fprint_val" or "get_uint". This allows VM-specific interpretations,
such as symbolic display of a status or current instruction register value,
by specifying a switch with the command:
sim> examine STAT-CIR
STAT: 060001
CIR: 030020
sim> examine -s STAT
STAT: mITroc CCG 001
sim> examine -m CIR
CIR: PAUS 0
The REG definition contains a radix field that allows a register to have a
default radix that is different than that of the device. This is
particularly helpful in connection with the EXAMINE STATE command, as
different registers may have different preferred radices:
sim> examine state
P: 012077 (defaults to octal)
CNTR: 9 (defaults to decimal)
MASK: FFF0 (defaults to hex)
However, there is no way to specify that the preferred display or input is
symbolic. So a CPU state that contains such registers would have to be
displayed multiple times -- once to get most of the values in their default
forms, and again to display those registers whose preferred form is
symbolic:
sim> examine state
PB: 000100
P: 012077
PL: 023000
STAT: 060001
CIR: 030020
sim> examine -s STAT
STAT: mITroc CCG 001
sim> examine -m CIR
CIR: PAUS 0
It would be useful if a default symbolic interpretation could be specified
in the REG structure and passed to "fprint_sym" and "parse_sym" to be used
in the absence of overriding command-line switches. Currently, no
information is provided to these routines to indicate which register is
being manipulated, so there is no way to provide register-specific default
interpretations within the routines.
RESOLUTION: Reserve space for register-specific flags in the "flags" field
of the REG structure (sim_defs.h) starting at REG_V_UF. Modify "ex_reg"
and "dep_reg" (scp.c) to merge the register-specific flags into the radix
value passed as the "addr" parameter to "fprint_sym" and "parse_sym".
A VM that defines register-specific flags will know to separate them from
the passed radix value by the presence of the SIM_SW_REG value in the
"switch" parameter. VMs that do not define register-specific flags are not
affected by this change.
STATUS: Fixed in version 4.0-0.
269. PROBLEM: Tape read reports "end of medium" even if a gap precedes it.
VERSION: 4.0-0
OBSERVATION: Calling "sim_tape_rdrecf" to read a tape record sometimes
returns MTSE_EOM and sets the "position not updated" (PNU) flag, even when
an erase gap precedes the EOM. The correct response should be to return
MTSE_RUNAWAY to indicate that spacing over a gap did not end with a data
record or tape mark. Moreover, PNU should not be set, as the position has
been updated.
CAUSE: The routine attempts to handle this case by returning MTSE_RUNAWAY
if the EOF was detected while reading a buffer of gap markers. However, if
a buffer read ends immediately before an EOM marker or the physical EOF,
the next read attempt will return a zero buffer length. The routine
misinterprets this to mean that no gap was present and returns MTSE_EOM and
sets the PNU flag.
RESOLUTION: Modify "sim_tape_rdlntf" (sim_tape.c) to determine whether the
EOM marker or physical EOF was seen on the first or a subsequent buffer
read, and to return MTSE_EOM with PNU or MTSE_RUNAWAY without PNU,
respectively.
STATUS: Fixed in version 4.0-0.
270. PROBLEM: The disc libraries in the HP2100 and HP3000 directories differ.
VERSION: 4.0-0
OBSERVATION: The "hp_disclib.c" and "hp_disclib.h" files appear in both
the HP2100 and HP3000 subdirectories. However, the contents of the files
are different. If both source sets are compiled to a common object
subdirectory, one of the two executables will not link, due to unresolved
externals.
CAUSE: The disc library in the HP3000 subdirectory is an extension of the
one in the HP2100 subdirectory. It is intended as an eventual replacement
for the HP2100 version, so that both simulators can share the library.
Until then, however, they are not interchangeable, as they export different
routines, leading to link errors if one is accidentally substituted for the
other.
RESOLUTION: Rename "hp_disclib.c/h" in the HP2100 subdirectory to
"hp2100_disclib.c/h" to indicate that it is HP2100-specific. Alter
"hp2100_ds.c" and "hp2100_di_da.c" to use the new include file name.
STATUS: Fixed in version 4.0-0.
271. PROBLEM: The MPX device incorrectly reports a currently filling read
buffer as complete.
VERSION: 4.0-0
OBSERVATION: Using Kermit to upload a file to RTE and specifying a packet
size larger than 254 bytes fails with transmission errors. Uploads with
packet sizes under 254 bytes work properly.
CAUSE: The 12792 multiplexer provides two 254-byte receive buffers per
line. A single reception larger than 254 bytes returns "partial buffer"
status when the initial read terminates because of the buffer full
condition. This informs RTE that the reception is incomplete and that it
should issue additional reads to obtain the remainder of the data.
Complete reception is indicated by the final read not returning "partial
buffer" status.
When Kermit sends a large packet, the multiplexer fills the first 254-byte
buffer, terminating on the buffer-full condition, and sends an unsolicited
interrupt to the CPU with "read buffer available" status. In response, RTE
sends an "acknowledge" command to the multiplexer, which returns the
"partial buffer" status and the buffer length. RTE then follows with a
"read buffer" command and prepares to receive the first buffer data.
Concurrently, the multiplexer begins filling the second 254-byte buffer.
RTE uses DCPC to transfer the data from the multiplexer, which is faster
than the incoming data rate. Therefore, the transfer completes while the
second buffer is still filling. On DCPC completion, the multiplexer checks
to see if the other receive buffer is complete, and if it is, issues
another unsolicited interrupt with "read buffer available" status.
The buffer completion check incorrectly returns TRUE if the buffer contains
received data. It should return TRUE only if the buffer contains data and
it is not currently being filled.
For short reads, such as EDIT screen reads, the second buffer fill
completes before the first buffer DCPC transfer, and the returned "read
buffer available" status is appropriate. For long reads, such as Kermit
transfers, the incorrect buffer check causes RTE to transfer data from the
second buffer while it is incomplete. This leads to corrupted data and
Kermit transmission errors.
RESOLUTION: Modify "mpx_cntl_svc" (hp2100_mpx.c) to indicate read buffer
availability only when filling is complete.
STATUS: Fixed in version 4.0-0.
272. PROBLEM: An MPX binary read larger than 254 bytes never completes.
VERSION: 4.0-0.
OBSERVATION: The MPX device may be configured to terminate a read on
reception of either a special character (e.g., CR) or a certain character
count. Counts up to 64K bytes are permitted, and such reads will succeed
if the alternating buffers are concurrently transferred to the CPU before
filling completely. However, while reads that specify character counts of
254 or less complete as expected, reads of more than 254 bytes never
complete.
CAUSE: As each character is received, the current character count is
compared to the termination count, and the read completes if the counts are
equal. However, the current character count is determined by the number of
characters in the current buffer and not the accumulated count of all
characters received. As the read buffers are 254 bytes long, the current
count will never exceed 254. Therefore, any read terminating on a count
greater than that will never complete.
RESOLUTION: Define a new "mpx_termcnt" array to hold the termination
counts for the eight lines, and reassign the "mpx_charcnt" array to hold
the current character counts. Modify "exec_command" and "mpx_line_svc"
(hp2100_mpx.c) to set the termination count, compare it against the current
character count as characters are received, and terminate reception if
enabled and the values are equal.
STATUS: Fixed in version 4.0-0.