Fixed the autoMount setting the PC11 demo config, and updated some the demo READMEs
This commit is contained in:
parent
e9164c4deb
commit
ed59b61013
5 changed files with 208 additions and 17 deletions
|
|
@ -23,6 +23,196 @@ Third-party resources include:
|
|||
Debugging Notes
|
||||
---------------
|
||||
|
||||
### PDPjs Debugger vs. SIMH
|
||||
|
||||
When I first tried to run BASIC in a PDPjs machine, it crashed almost immediately. It was attempting to use memory beyond
|
||||
the 16Kb of installed RAM. After a bit of poking around, I found BASIC's memory sizing code here:
|
||||
|
||||
016142: 012701 160000 MOV #160000,R1
|
||||
016146: 022626 CMP (SP)+,(SP)+
|
||||
016150: 014111 MOV -(R1),@R1
|
||||
|
||||
The code sets R1 to highest possible RAM address and starts scanning backwards for the first valid memory location. However,
|
||||
the scanning process wasn't clear to me at first glance, and the `CMP (SP)+,(SP)+` was a bit of a head-scratcher, so I decided
|
||||
to do an instruction-by-instruction comparison with SIMH.
|
||||
|
||||
After cloning the [SIMH project](https://github.com/simh/simh) and building the *pdp11* binary, I created a *pdp11.ini* text file
|
||||
that contained:
|
||||
|
||||
ECHO Configuring PDP-11/20 with 16Kb of RAM...
|
||||
SET CPU 11/20
|
||||
SET CPU 16K
|
||||
|
||||
; Throttle SIMH to limit CPU usage, heat and fan noise
|
||||
SET THROTTLE 5%
|
||||
|
||||
; Disable devices that we don't need
|
||||
SET HK DISABLE
|
||||
; SET RHA DISABLE
|
||||
SET DZ DISABLE
|
||||
SET RL DISABLE
|
||||
SET RX DISABLE
|
||||
SET RP DISABLE
|
||||
SET RQ DISABLE
|
||||
SET TM DISABLE
|
||||
SET TQ DISABLE
|
||||
SET RK DISABLE
|
||||
|
||||
; Enable the high-speed paper tape reader
|
||||
SET PTR ENABLE
|
||||
; SET PTP ENABLE
|
||||
|
||||
ECHO Loading BASIC paper tape image directly into memory...
|
||||
LOAD DEC-11-AJPB-PB.ptap
|
||||
|
||||
ECHO Setting breakpoint at 016142...
|
||||
break -e 016142
|
||||
|
||||
along with a *tr* text file that contained:
|
||||
|
||||
step
|
||||
examine r0,r1,r2,r3,r4,r5,sp,psw
|
||||
|
||||
Then I ran *pdp11* and typed "g" to start the machine:
|
||||
|
||||
PDP-11 simulator V4.0-0 Beta git commit id: 592deb8f
|
||||
Configuring PDP-11/20 with 16Kb of RAM...
|
||||
Disabling XQ
|
||||
Loading BASIC paper tape image directly into memory...
|
||||
Setting breakpoint at 016142...
|
||||
sim> g
|
||||
|
||||
Breakpoint, PC: 016142 (MOV #160000,R1)
|
||||
sim> do tr
|
||||
|
||||
Step expired, PC: 016146 (CMP (SP)+,(SP)+)
|
||||
R0: 004106
|
||||
R1: 160000
|
||||
R2: 000000
|
||||
R3: 000000
|
||||
R4: 000000
|
||||
R5: 000000
|
||||
SP: 013654
|
||||
PSW: 000010 CM=K PM=K RS0 FPD0 IPL=0 TBIT0 N1 Z0 V0 C0
|
||||
sim> do tr
|
||||
|
||||
Step expired, PC: 016150 (MOV -(R1),(R1))
|
||||
R0: 004106
|
||||
R1: 160000
|
||||
R2: 000000
|
||||
R3: 000000
|
||||
R4: 000000
|
||||
R5: 000000
|
||||
SP: 013660
|
||||
PSW: 000011 CM=K PM=K RS0 FPD0 IPL=0 TBIT0 N1 Z0 V0 C1
|
||||
sim> do tr
|
||||
|
||||
Step expired, PC: 016152 (SUB #302,R1)
|
||||
R0: 004106
|
||||
R1: 157776
|
||||
R2: 000000
|
||||
R3: 000000
|
||||
R4: 000000
|
||||
R5: 000000
|
||||
SP: 013660
|
||||
PSW: 000011 CM=K PM=K RS0 FPD0 IPL=0 TBIT0 N1 Z0 V0 C1
|
||||
sim> do tr
|
||||
|
||||
Step expired, PC: 016150 (MOV -(R1),(R1))
|
||||
R0: 004106
|
||||
R1: 157776
|
||||
R2: 000000
|
||||
R3: 000000
|
||||
R4: 000000
|
||||
R5: 000000
|
||||
SP: 013660
|
||||
PSW: 000000 CM=K PM=K RS0 FPD0 IPL=0 TBIT0 N0 Z0 V0 C0
|
||||
|
||||
After typing several "do tr" commands, I was surprised to see SIMH execution continually returning to this instruction:
|
||||
|
||||
Step expired, PC: 016150 (MOV -(R1),(R1))
|
||||
|
||||
until I remembered that when the PDP-11 accesses an invalid address, it's supposed to trap to vector 000004, and that BASIC
|
||||
must have modified vector 000004 to jump into the middle of this code.
|
||||
|
||||
This code fragment was simply marching down the address space until it reached an address that didn't trap. The odd-looking
|
||||
`CMP (SP)+,(SP)+` instruction was throwing away the PC and PSW that each trap pushed onto the stack, by effectively adding
|
||||
4 to SP.
|
||||
|
||||
The problem with PDPjs was that it wasn't generating a trap to vector 000004 when an invalid address was accessed. After fixing
|
||||
that, I verified with the PDPjs Debugger that the memory sizing code was working properly:
|
||||
|
||||
PDPjs v1.30.1
|
||||
Copyright © 2012-2016 Jeff Parsons <Jeff@pcjs.org>
|
||||
License: GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
||||
Portions adapted from the PDP-11/70 Emulator v1.4 by Paul Nankervis <paulnank@hotmail.com>
|
||||
bus: 00016Kb RAM at 000000
|
||||
bus: 00008Kb H/W at 160000
|
||||
cpu: model 1120
|
||||
Type ? for help with PDP11 Debugger commands
|
||||
R0=000000 R1=000000 R2=000000 R3=000000 R4=000000 R5=000000
|
||||
SP=000000 PC=016104 PS=000013 T0 N1 Z0 V1 C1
|
||||
016104: 016706 175602 MOV 013712,SP
|
||||
>> bp 016142
|
||||
bp 016142 set
|
||||
>> g
|
||||
running
|
||||
|
||||
bp 016142 hit
|
||||
stopped (821 instructions, 7443 cycles, 23 ms, 323609 hz)
|
||||
R0=004106 R1=000000 R2=000000 R3=000000 R4=000000 R5=000000
|
||||
SP=013654 PC=016142 PS=000000 T0 N0 Z0 V0 C0
|
||||
016142: 012701 160000 MOV #160000,R1
|
||||
>> u
|
||||
016146: 022626 CMP (SP)+,(SP)+
|
||||
016150: 014111 MOV -(R1),@R1
|
||||
016152: 162701 000302 SUB #302,R1
|
||||
016156: 010167 001300 MOV R1,017462
|
||||
016162: 012700 013540 MOV #13540,R0
|
||||
016166: 104552 TRAP 152
|
||||
016170: 122702 000114 CMPB #114,R2
|
||||
016174: 001433 BEQ 016264
|
||||
>> dw 4 l2
|
||||
000004 016146 000000
|
||||
>> tr
|
||||
R0=004106 R1=160000 R2=000000 R3=000000 R4=000000 R5=000000
|
||||
SP=013654 PC=016146 PS=000010 T0 N1 Z0 V0 C0
|
||||
016146: 022626 CMP (SP)+,(SP)+ ;cycles=7
|
||||
>> tr
|
||||
R0=004106 R1=160000 R2=000000 R3=000000 R4=000000 R5=000000
|
||||
SP=013660 PC=016150 PS=000011 T0 N1 Z0 V0 C1
|
||||
016150: 014111 MOV -(R1),@R1 ;cycles=11
|
||||
>> tr
|
||||
trapped to 004 (157776)
|
||||
R0=004106 R1=157776 R2=000000 R3=000000 R4=000000 R5=000000
|
||||
SP=013654 PC=016146 PS=000000 T0 N0 Z0 V0 C0
|
||||
016146: 022626 CMP (SP)+,(SP)+ ;cycles=0
|
||||
>> tr
|
||||
R0=004106 R1=157776 R2=000000 R3=000000 R4=000000 R5=000000
|
||||
SP=013660 PC=016150 PS=000000 T0 N0 Z0 V0 C0
|
||||
016150: 014111 MOV -(R1),@R1 ;cycles=11
|
||||
>> tr
|
||||
trapped to 004 (157774)
|
||||
R0=004106 R1=157774 R2=000000 R3=000000 R4=000000 R5=000000
|
||||
SP=013654 PC=016146 PS=000000 T0 N0 Z0 V0 C0
|
||||
016146: 022626 CMP (SP)+,(SP)+ ;cycles=0
|
||||
>> tr
|
||||
R0=004106 R1=157774 R2=000000 R3=000000 R4=000000 R5=000000
|
||||
SP=013660 PC=016150 PS=000000 T0 N0 Z0 V0 C0
|
||||
016150: 014111 MOV -(R1),@R1 ;cycles=11
|
||||
>> g
|
||||
running
|
||||
PDP-11 BASIC, VERSION 007A
|
||||
*O
|
||||
READY
|
||||
|
||||
I like to think that the PDPjs Debugger (and in fact, *all* PCjs Debuggers) is considerably simpler to use, and more
|
||||
informative, too. For example, when you're single-stepping ("t" or "tr"), the Debugger will alert you if the previous
|
||||
instruction triggered a trap.
|
||||
|
||||
There are also a variety of diagnostic "bus" and "memory" messages that can be enabled, if you want to see more detail
|
||||
about each instruction's operation; see the Debugger's "m" command for details.
|
||||
|
||||
### TRAP Handling
|
||||
|
||||
One of the first things I noticed when debugging PDP-11 BASIC was its heavy reliance on TRAP instructions.
|
||||
|
|
@ -64,19 +254,5 @@ by shifting it left again, and then a large offset is added to it, transforming
|
|||
an *even* value) into a jump table index.
|
||||
|
||||
The final instruction, `MOV @(SP)+,PC`, moves the address at the jump table index into PC, while also removing the TRAP
|
||||
instruction from the stack, leaving only the *previous PC* on the stack.
|
||||
|
||||
### The PDPjs Debugger vs. SIMH
|
||||
|
||||
How to set (and display) a breakpoint in PDPjs:
|
||||
|
||||
>> bp 016220
|
||||
bp 016220 set
|
||||
>> bl
|
||||
bp 016220
|
||||
|
||||
How to set (and display) the same breakpoint in SIMH:
|
||||
|
||||
sim> break -e 016220
|
||||
sim> show break
|
||||
16220: E
|
||||
instruction from the stack, leaving only the *previous PC* on the stack, so that when the TRAP handler is done, it can execute
|
||||
`RTS PC` to return to the caller.
|
||||
|
|
|
|||
|
|
@ -19,4 +19,8 @@ This machine pre-loads the **[DEC PDP-11 BASIC](/apps/pdp11/tapes/basic/)** tape
|
|||
You can also manually load it into memory using the **[Bootstrap Loader](/apps/pdp11/boot/bootstrap/)**.
|
||||
See the [Bootstrap Loader Demo (with Debugger)](/devices/pdp11/machine/1120/bootstrap/debugger/) for details.
|
||||
|
||||
There are also some [Debugging Notes](/apps/pdp11/tapes/basic/#debugging-notes) on the
|
||||
[DEC PDP-11 BASIC](/apps/pdp11/tapes/basic/) page, if you're inclined to do some debugging with the built-in
|
||||
PDPjs Debugger.
|
||||
|
||||
{% include machine.html id="test1120" %}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,13 @@ leaving the **[Absolute Loader](/apps/pdp11/tapes/absloader/)** ready to run imm
|
|||
You can then select another tape image in the Absolute Loader format, such as **[BASIC (Single User)](/apps/pdp11/tapes/basic/)**,
|
||||
click "Attach" and then "Run".
|
||||
|
||||
If you need to start over, select "Bootstrap Loader (16Kb)" from the list of tapes and click "Load" instead of
|
||||
"Attach", re-installing the **[Bootstrap Loader](/apps/pdp11/boot/bootstrap/)** directly into RAM.
|
||||
|
||||
Alternatively, just press the "Reset" button. The RAM component was recently updated to restore pre-loaded images whenever
|
||||
the entire machine is reset. You'll still need to manually re-attach the **[Absolute Loader](/apps/pdp11/tapes/absloader/)**
|
||||
tape image, however.
|
||||
|
||||
{% include machine.html id="test1120" %}
|
||||
|
||||
This machine is also available with our built-in [Debugger](debugger/).
|
||||
|
|
|
|||
|
|
@ -29,4 +29,8 @@ click "Attach" and then "Run".
|
|||
If you need to start over, select "Bootstrap Loader (16Kb)" from the list of tapes and click "Load" instead of
|
||||
"Attach", re-installing the **[Bootstrap Loader](/apps/pdp11/boot/bootstrap/)** directly into RAM.
|
||||
|
||||
Alternatively, just press the "Reset" button. The RAM component was recently updated to restore pre-loaded images whenever
|
||||
the entire machine is reset. You'll still need to manually re-attach the **[Absolute Loader](/apps/pdp11/tapes/absloader/)**
|
||||
tape image, however.
|
||||
|
||||
{% include machine.html id="test1120" %}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<device id="pc11" type="pc11" baudReceive="9600" autoMount='{path:"/apps/pdp11/tapes/DEC-11-L2PC-PO.json"}' pos="left" width="35%" padLeft="8px" padBottom="8px">
|
||||
<device id="pc11" type="pc11" baudReceive="9600" autoMount='{path:"/apps/pdp11/tapes/absloader/DEC-11-L2PC-PO.json"}' pos="left" width="35%" padLeft="8px" padBottom="8px">
|
||||
<name>Paper Tape Controls</name>
|
||||
<control type="container">
|
||||
<control type="list" binding="listTapes">
|
||||
|
|
|
|||
Loading…
Reference in a new issue