QProbe2023 shows Idle Patterns of RSX11M+, but they are only visible "by accident" and only on special PDP-11s with memory caches and without private memory (see here). This stimulates creativity, so now we here have the ....
RSX11M+ Update from Mark Matlock
It is now possible to see the idle pattern and also use PMI Memory via the PMI bus and not sacrifice any speed, but it requires adding a MOV instruction to the RSX11M+ executive via a SYSGEN. The RSX idle routine is in the module [11,10]SYSXT.MAC (code shown above). This modification utilizes the QProbe 2023’s display register emulation. On a PDP-11/70 the display register (located at 177570 in the I/O page) can be seen when it is selected by the lower rotary selector knob. On the QProbe 2023, it can be seen when the display switches are set to 0100. It exists whether selected or not and gives us a location on the Q22 bus to send the idle pattern so it can be seen.
However, if your 11/83 is booting and the QProbe 2023 is not connected and the MOV R0,@#177570 is executed, RSX will crash with a bus error. To prevent this problem, we can put two NOP instructions in the RSX idle loop, then after we know that the display register exists, we can change the two NOPs to the MOV instruction.
The way this is done is with a command file and two priviledged Macro-11 tasks. After RSX finishes booting, the command file (QTESTER.CMD) is executed and it runs QTEST.TSK, a priviledge task that attempts write to the display register, if it succeeds it prints a message and exits with <EXSTAT> = 1. If the display register doesn’t exist a Bus Error occurs, causing a TRAP through vector 004, that RSX catches and exits the task with an error status so the command will not run the second task that modifies the RSX idle loop because a bus error in system state is a crash to XDT.
The second priviledged task, RSXIDL.TSK is run when we know the display register exists. RSX11M+ uses I/D (instruction/data) space mapping so for APR 1, the Active Page Register there are two one for data and one for instructions. A priviledged task in RSX11M+ can change executive data structures, but is NOT normally capable of changing executive instruction code. The Data APR for user CPU mode is USDAR1 and the Instruction APR for Kernel mode is KINAR1. We need to first map USDAR1 to the area of the executive pointed to by KINAR1.
Next make sure this version of RSX has the two NOP (240 octal) instruction where we plan to make the change. We locate the changes through a global symbol (QPROBE) we add to SYSXT.MAC at the two NOPs. Once we verify that the NOPs are there, we change them to MOV R0,@#177570.
A real PDP-11/70 displays the contents of R0 on the data bus during a WAIT instruction. We are pushing R0 down the Q22 bus to the QProbe just before the WAIT. This gives us a great looking RSX idle display while using PMI Memory. The are also times when you may want to just see the I/O traffic on the Q22 bus without the RSX idle pattern complicating things so this is one reason to make these changes at the end of a boot routine.
One final comment, these priviledged programs are running in user mode not at system state, minimizing the possibility of a crash. Making a change in the idle routine from user mode is possible because the idle routine code only runs when no tasks are active. However, a device interrupt could take place while the task is running and I have seen RSXIDL.TSK decide not to make the executive modification. Running it a second time is all that is necessary.
You will need to run a SYSGEN using your old SYSGENSAn.CMD answer files after you put the SYSXT.MAC in LB:[11,10]. Then used the .CMD files to assemble and build QTEST.MAC and RSXIDL.MAC. Copy the resulting tasks to [1,54] and put QTESTER.CMD where it can execute at the end of your boot up command file.
Downloads: Mark has provided all necessary files in this archive:
RSX11MP_PMI_Idle_Pattern_Matlock.zip - Sources, Scripts and Docs
2.11BSD UNIX Update from Dave Plummer
... and here is another path for 2.11BSD UNIX .
You need to a kernel source file, then rebuild the kernel.
Edit
edit /usr/src/sys/machine/mch_xxx.s
Add the line right before SPLLOW, though maybe it can go after.. but it works before it.
ENTRY(idle)
mov PS,-(sp) / save current SPL, indicate that no
mov
$1,_noproc / process is running
dec
wcount / if (--wcount <= 0) {
bgt
1f
mov
$2,wcount / wcount = 2
clc / rdisply <<= 1
rol
rdisply
bpl
1f / if (``one shifted out'')
bis
$1,rdisply / rdisply |= 1
1: / }
mov
rdisply,r0 / wait displays contents of r0
mov
r0, *$177570 / PATCH: show on SWITCH register, must exist!
SPLLOW / set SPL low so we can be interrupted
wait
/ wait for something to happen
mov
(sp)+,PS / restore previous SPL
rts
pc / and return
Compile
b) Go into /usr/sys/CONFIG (where CONFIG is your kernel config directory) and run make. Then copy unix and netnix to the root folder.
Run
Shutdown, boot the new build kernel.
Here is a video of Daves Setup ... don't be distracted by the big 11/70 panel: we're talking about the small black&white panel here.
Bugs
The code requires te exsistence of a DISPLAY REGISTER (to directly control the 16 DATA LEDs). This regsiter is only available if QProbe2023 "Mode switches" are at 0100.
Otherwise ... a kernel panic ?