From cd5dbd5c14178aa8b0bee42d971554581db2a171 Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Mon, 6 Feb 2017 15:32:09 -0800 Subject: [PATCH] Added RL11 bootstrap info --- devices/pdp11/rl11/README.md | 97 ++++++++++++++++++++++++++++++ devices/pdp11/rx11/README.md | 6 +- modules/pdp11/lib/cpustate.js | 4 +- modules/pdp11/lib/defines.js | 42 ++++++------- versions/pdpjs/1.34.0/pdp11-dbg.js | 2 +- versions/pdpjs/1.34.0/pdp11.js | 2 +- 6 files changed, 125 insertions(+), 28 deletions(-) diff --git a/devices/pdp11/rl11/README.md b/devices/pdp11/rl11/README.md index a291cd84c..28c44dce4 100644 --- a/devices/pdp11/rl11/README.md +++ b/devices/pdp11/rl11/README.md @@ -52,3 +52,100 @@ used to control the device, such as choosing which disks should be "auto-mounted ``` + +Loading the RL11 Bootstrap +-------------------------- + +From the [RT-11 v4.0 Installation Manual (March 1981)](/pubs/dec/pdp11/rt11/), p. E-6: + + + Deposit the basic RL01/RL02 disk bootstrap loader in memory as follows: + + 1. Set the ENABLE/HALT switch to HALT. + + 2. Set the first address, 001000, in the switch register (see Table E-7). + + 3. Press the LOAD ADDR switch. + + 4. Set the contents for the first address (from Table E-7) in the switch register. + + 5. Lift the DEP switch. The computer automatically advances to the next address. + + 6. Set the contents for the next address (from Table E-7) in the switch register. + + 7. Lift the DEP switch. + + 8. Repeat steps 6 and 7 until you have deposited all the instructions. + + Now verify that you deposited the bootstrap program properly. + + 1. Set the first address, 001000, in the switch register. + + 2. Press the LOAD ADDR switch. + + 3. Press the EXAM switch to display the contents of that address in the data register. + + 4. Compare the number in the data register with the value for that address in Table E-7. + + 5. If the values are the same, press EXAM again to display the contents of the next address. If the values + are not the same, repeat the entire + +Table E-7: RL01/RL02 Bootstrap Loader +------------------------------------- + + Location Contents + + 001000 012701 + 001002 174400 + 001004 012761 + 001006 000013 + 001010 000004 + 001012 012711 + 001014 000004 + 001016 105711 + 001020 100376 + 001022 005061 + 001024 000002 + 001026 005061 + 001030 000004 + 001032 012761 + 001034 177400 + 001036 000006 + 001040 012711 + 001042 000014 + 001044 105711 + 001046 100376 + 001050 005007 + +Loading the RL11 Bootstrap Loader +---------------------------------- + +Any PDP-11 machine using built-in PCjs Debugger makes it easy to enter the bootstrap code above. Paste +the following commands into the Debugger's command buffer: + + ew 1000 012701 174400 012761 000013 000004 012711 000004 105711 100376 005061; + ew 1024 000002 005061 000004 012761 177400 000006 012711 000014 105711 100376 005007; + r pc 1000 + +You can then review (eg, disassemble) the bootstrap code: + + >> u 1000 1052 + 001000: 012701 174400 MOV #174400,R1 + 001004: 012761 000013 000004 MOV #13,4(R1) + 001012: 012711 000004 MOV #4,@R1 ;RLCS + 001016: 105711 TSTB @R1 ;RLCS + 001020: 100376 BPL 001016 + 001022: 005061 000002 CLR 2(R1) + 001026: 005061 000004 CLR 4(R1) + 001032: 012761 177400 000006 MOV #177400,6(R1) + 001040: 012711 000014 MOV #14,@R1 ;RLCS + 001044: 105711 TSTB @R1 ;RLCS + 001046: 100376 BPL 001044 + 001050: 005007 CLR PC + +Last but not least, make sure you have successfully loaded an RL01 or RL02 disk image into drive RL0. Then execute the +bootstrap code with the Debugger's "g" command. + +Of course, if the machine also includes the RL11 Boot control, then all you *really* need to is select an +RL01 or RL02 disk, click "Load", wait for the diskette image to be successfully loaded (i.e., downloaded) and then click +"Boot". diff --git a/devices/pdp11/rx11/README.md b/devices/pdp11/rx11/README.md index 54946e1f0..12c097774 100644 --- a/devices/pdp11/rx11/README.md +++ b/devices/pdp11/rx11/README.md @@ -68,7 +68,7 @@ used to control the device, such as choosing which disks should be "auto-mounted Loading the RX11 Bootstrap -------------------------- -From the [RT-11 v4.0 Installation Manual (March 1981)](/pubs/dec/pdp11/rt11/), p. E-9: +From the [RT-11 v4.0 Installation Manual (March 1981)](/pubs/dec/pdp11/rt11/), p. E-3: The procedure to deposit the RX11 disk bootstrap loader in memory depends on the type of processor you have. If your computer is a PDP-11V/03, PDP-11/03, or LSI-11, see the PDP-11/03 user's manual for instructions. @@ -114,7 +114,7 @@ From the [RT-11 v4.0 Installation Manual (March 1981)](/pubs/dec/pdp11/rt11/), p 4. Press the START switch. -Table E-3: RX-11 Bootstrap Loader +Table E-3: RX11 Bootstrap Loader --------------------------------- Location Contents @@ -138,7 +138,7 @@ Table E-3: RX-11 Bootstrap Loader 001040 005000 001042 000110 -Loading the RX-11 Bootstrap Loader +Loading the RX11 Bootstrap Loader ---------------------------------- Any PDP-11 machine using built-in PCjs Debugger makes it easy to enter the bootstrap code above. Paste diff --git a/modules/pdp11/lib/cpustate.js b/modules/pdp11/lib/cpustate.js index b19679a33..62aba411d 100644 --- a/modules/pdp11/lib/cpustate.js +++ b/modules/pdp11/lib/cpustate.js @@ -506,7 +506,7 @@ class CPUStatePDP11 extends CPUPDP11 { * If updates to MMR1 have not been shut off (ie, MMR0.ABORT bits are clear), then we are allowed * to sync MMR1 with its real-time counterpart in opLast. */ - if (!(this.regMMR0 & PDP11.MMR0.ABORT)) { + if ((this.regMMR0 & (PDP11.MMR0.ABORT | PDP11.MMR0.ENABLED)) == PDP11.MMR0.ENABLED) { this.regMMR1 = (this.opLast >> 16) & 0xffff; } var result = this.regMMR1; @@ -528,7 +528,7 @@ class CPUStatePDP11 extends CPUPDP11 { * If updates to MMR2 have not been shut off (ie, MMR0.ABORT bits are clear), then we are allowed * to sync MMR2 with its real-time counterpart in opLast. */ - if (!(this.regMMR0 & PDP11.MMR0.ABORT)) { + if ((this.regMMR0 & (PDP11.MMR0.ABORT | PDP11.MMR0.ENABLED)) == PDP11.MMR0.ENABLED) { this.regMMR2 = this.opLast & 0xffff; } return this.regMMR2; diff --git a/modules/pdp11/lib/defines.js b/modules/pdp11/lib/defines.js index 514f6cc9b..a13cc440a 100644 --- a/modules/pdp11/lib/defines.js +++ b/modules/pdp11/lib/defines.js @@ -775,19 +775,19 @@ var PDP11 = { DRIVES: 4, // maximum of 4 drives PREFIX: "DY", RLCS: { // 174400: Control Status Register - DRDY: 0x0001, // Drive Ready (R/O) - FUNC: 0x000E, // Function Code (F2,F1,F0) (R/W) - BAE: 0x0030, // Bus Address Extension bits (BA17,BA16) (R/W) - IE: 0x0040, // Interrupt Enable (R/W) - CRDY: 0x0080, // Controller Ready (R/W) - DS: 0x0300, // Drive Select (DS1,DS0) (R/W) - ERRC: 0x3C00, // Error Code (R/O) - DE: 0x4000, // Drive Error (R/O) - ERR: 0x8000, // Composite Error (R/O) - CLEAR: 0x3F7E, // bits cleared on INIT (bits 1-6 and 8-13 are cleared) - SET: 0x0080, // bits set on INIT (bit 7 is set) - RMASK: 0xFFFF, // no write-only bits - WMASK: 0x03FE, // bits writable + DRDY: 0x0001, // (000001) Drive Ready (R/O) + FUNC: 0x000E, // (000016) Function Code (F2,F1,F0) (R/W) + BAE: 0x0030, // (000060) Bus Address Extension bits (BA17,BA16) (R/W) + IE: 0x0040, // (000100) Interrupt Enable (R/W) + CRDY: 0x0080, // (000200) Controller Ready (R/W) + DS: 0x0300, // (001400) Drive Select (DS1,DS0) (R/W) + ERRC: 0x3C00, // (036000) Error Code (R/O) + DE: 0x4000, // (040000) Drive Error (R/O) + ERR: 0x8000, // (100000) Composite Error (R/O) + CLEAR: 0x3F7E, // (037576) bits cleared on INIT (bits 1-6 and 8-13 are cleared) + SET: 0x0080, // (000200) bits set on INIT (bit 7 is set) + RMASK: 0xFFFF, // (177777) no write-only bits + WMASK: 0x03FE, // (001776) bits writable SHIFT: { FUNC: 1, BAE: 4, @@ -857,14 +857,14 @@ var PDP11 = { MPE: 0x2400 // Memory Parity Error (RLV12 only) }, FUNC: { // NOTE: These function codes are pre-shifted to read/write directly from/to RLCS.FUNC - NOP: 0b0000, // No-Op - WCHK: 0b0010, // Write Check - STATUS: 0b0100, // Get Status - SEEK: 0b0110, // Seek - RHDR: 0b1000, // Read Header - WDATA: 0b1010, // Write Data - RDATA: 0b1100, // Read Data - RDNC: 0b1110 // Read Data without Header Check + NOP: 0b0000, // (00) No-Op + WCHK: 0b0010, // (02) Write Check + STATUS: 0b0100, // (04) Get Status + SEEK: 0b0110, // (06) Seek + RHDR: 0b1000, // (10) Read Header + WDATA: 0b1010, // (12) Write Data + RDATA: 0b1100, // (14) Read Data + RDNC: 0b1110 // (16) Read Data without Header Check } }, RX11: { // RX11 Disk Controller diff --git a/versions/pdpjs/1.34.0/pdp11-dbg.js b/versions/pdpjs/1.34.0/pdp11-dbg.js index 0fa07df7d..2ab390bbf 100644 --- a/versions/pdpjs/1.34.0/pdp11-dbg.js +++ b/versions/pdpjs/1.34.0/pdp11-dbg.js @@ -141,7 +141,7 @@ h.Aa=function(a,b,c,d){Vd.prototype.Aa.call(this,a,b,c,d);this.ad=b.Jd.bind(b);t h.reset=function(){this.status("Model "+this.ka);this.A.V&&this.ba();this.C=65536;this.G=32768;this.L=65535;this.I=32768;this.w=15;this.g=[0,0,0,0,0,0,0,this.Ud,-1,-2,-3,-4,-5,-6,-7,-8];this.qa=[0,0,0,0,0,0];this.W=[0,0,0,0];this.M=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];this.B=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[65535,65535,65535,65535,65535,65535,65535,65535,65535, 65535,65535,65535,65535,65535,65535,65535],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];this.Ha=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];this.xc=[0,0,0,0,0,0,0,0];this.N=0;this.cb=-1;this.u=this.j=this.Wc=this.X=this.Y=this.i=this.uc=0;oc(this);fe(this);this.A.error=!1;Vd.prototype.reset.call(this)};function oc(a){a.S=0;a.vc=0;a.wc=0;a.U=0;a.P=0;a.eb=0;a.xa=255;a.zb=0;a.Ab=0;a.sb=0;a.lb=262143;a.kb=a.g[7];a.O=0;a.R=null;a.D&&(we(a),a.Sd=fd(a.D))} function we(a){a.jc=a.ad;a.kc=a.cd;a.Tc=a.dd;a.lc=a.jd;a.sc&&(a.jc=a.oe,a.kc=a.te);a.tc&&(a.Tc=a.ze,a.lc=a.Ae);a.zb?(a.Ia=65536,a.vb=a.U&16?4186112:253952,a.Ga=a.se,a.oa=a.sc?a.$g:a.Dd,a.Hb=a.tc?a.si:a.Hd,Yc(a.D,a.U&16?22:18)):(a.Ia=0,a.vb=57344,a.Ga=a.Gf,a.oa=a.sc?a.Zg:a.ye,a.Hb=a.tc?a.ri:a.De,Yc(a.D,16))}function sd(a){var b=a.S;b&57344||(b=b&-3199|a.Ab<<5|a.sb<<1);return b} -function td(a,b){b&=-3073;if(a.S!=b){b&57344&&!(a.S&57344)&&(a.vc=a.O>>16&65535,a.wc=a.O&65535);a.S=b;a.Ab=(b&96)>>5;a.sb=(b&30)>>1;var c=0;b&257&&(c=4,b&1&&(c|=2));a.zb!=c&&(a.zb=c,we(a))}}function ud(a){a.S&57344||(a.vc=a.O>>16&65535);a=a.vc;a&65280&&(a=(a<<8|a>>8)&65535);return a}function vd(a){a.S&57344||(a.wc=a.O&65535);return a.wc}function wd(a,b){1170>a.ka&&(b&=-49);a.U!=b&&(a.U=b,a.lb=b&16?4194303:262143,we(a))} +function td(a,b){b&=-3073;if(a.S!=b){b&57344&&!(a.S&57344)&&(a.vc=a.O>>16&65535,a.wc=a.O&65535);a.S=b;a.Ab=(b&96)>>5;a.sb=(b&30)>>1;var c=0;b&257&&(c=4,b&1&&(c|=2));a.zb!=c&&(a.zb=c,we(a))}}function ud(a){1==(a.S&57345)&&(a.vc=a.O>>16&65535);a=a.vc;a&65280&&(a=(a<<8|a>>8)&65535);return a}function vd(a){1==(a.S&57345)&&(a.wc=a.O&65535);return a.wc}function wd(a,b){1170>a.ka&&(b&=-49);a.U!=b&&(a.U=b,a.lb=b&16?4194303:262143,we(a))} function xe(a,b,c,d){a.Ud=b;ye(a,b);zd(a,0);a.D.reset();oc(a);if(c){a.g[0]=d||0;for(b=1;5>=b;b++)a.g[b]=0;a.g[6]=1024;a.A.aa?a.A.V||qc(a):a.A.ra=!0}else a.F&&a.A.aa?a.ba()||a.J.A.reset||(he(a.F),H(a.J,-1)):!1===c&&a.ba();!a.A.V&&a.ta&&a.ta.stop()}h.pe=function(){return 0}; h.save=function(){var a=new G(this);a.set(0,[this.g,this.qa,this.W,this.M,this.B,this.Ha,this.xc,this.P,this.uc,this.eb,this.xa,this.Ab,this.sb,this.kb,this.i,this.O,this.cb,this.Ac,this.Dc]);a.set(1,[yd(this),sd(this),ud(this),vd(this),this.U]);a.set(2,[this.pb,this.ob,this.A.ra]);a.set(3,ze(this));a.set(4,re(this));return a.data()}; h.restore=function(a){var b=ia(a[0]);this.g=b.next().value;this.qa=b.next().value;this.W=b.next().value;this.M=b.next().value;this.B=b.next().value;this.Ha=b.next().value;this.xc=b.next().value;this.P=b.next().value;this.uc=b.next().value;this.eb=b.next().value;this.xa=b.next().value;this.Ab=b.next().value;this.sb=b.next().value;this.kb=b.next().value;this.i=b.next().value;this.O=b.next().value;this.cb=b.next().value;this.Ac=b.next().value;this.Dc=b.next().value;b=a[1];zd(this,b[0]);td(this,b[1]); diff --git a/versions/pdpjs/1.34.0/pdp11.js b/versions/pdpjs/1.34.0/pdp11.js index 9d7987d02..86b678e83 100644 --- a/versions/pdpjs/1.34.0/pdp11.js +++ b/versions/pdpjs/1.34.0/pdp11.js @@ -132,7 +132,7 @@ h.la=function(a,b){for(var c=192,d=0;de. h.reset=function(){this.status("Model "+this.sa);this.j.M&&F(this);this.v=65536;this.m=32768;this.l=65535;this.w=32768;this.i=15;this.b=[0,0,0,0,0,0,0,this.pd,-1,-2,-3,-4,-5,-6,-7,-8];this.ua=[0,0,0,0,0,0];this.ga=[0,0,0,0];this.H=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];this.s=[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[65535,65535,65535,65535,65535,65535,65535,65535,65535,65535, 65535,65535,65535,65535,65535,65535],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];this.Pa=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];this.Rb=[0,0,0,0,0,0,0,0];this.B=0;this.Ea=-1;this.h=this.f=this.qc=this.K=this.S=this.g=this.Ob=0;Db(this);Tc(this);this.j.error=!1;Qc.prototype.reset.call(this)};function Db(a){a.J=0;a.Pb=0;a.Qb=0;a.ta=0;a.F=0;a.$a=0;a.Oa=255;a.kb=0;a.Xa=0;a.Ya=0;a.cb=262143;a.Ka=a.b[7];a.C=0;a.I=null;a.u&&(fd(a),a.od=hc(a.u))} function fd(a){a.kc=a.gd;a.lc=a.xc;a.yc=a.Ac;a.mc=a.Cc;a.kb?(a.Aa=65536,a.jc=a.ta&16?4186112:253952,a.ra=a.Id,a.W=a.Nd,a.Ab=a.Qd,$b(a.u,a.ta&16?22:18)):(a.Aa=0,a.jc=57344,a.ra=a.Ue,a.W=a.og,a.Ab=a.Hh,$b(a.u,16))}function rc(a){var b=a.J;b&57344||(b=b&-3199|a.Xa<<5|a.Ya<<1);return b}function sc(a,b){b&=-3073;if(a.J!=b){b&57344&&!(a.J&57344)&&(a.Pb=a.C>>16&65535,a.Qb=a.C&65535);a.J=b;a.Xa=(b&96)>>5;a.Ya=(b&30)>>1;var c=0;b&257&&(c=4,b&1&&(c|=2));a.kb!=c&&(a.kb=c,fd(a))}} -function tc(a){a.J&57344||(a.Pb=a.C>>16&65535);a=a.Pb;a&65280&&(a=(a<<8|a>>8)&65535);return a}function uc(a){a.J&57344||(a.Qb=a.C&65535);return a.Qb}function vc(a,b){1170>a.sa&&(b&=-49);a.ta!=b&&(a.ta=b,a.cb=b&16?4194303:262143,fd(a))}function gd(a,b,c,d){a.pd=b;hd(a,b);yc(a,0);a.u.reset();Db(a);if(c){a.b[0]=d||0;for(b=1;5>=b;b++)a.b[b]=0;a.b[6]=1024;a.j.R?a.j.M||Fb(a):a.j.Y=!0}else a.D&&a.j.R?F(a)||a.A.j.reset||(a.D.g(),Jb(a.A,-1)):!1===c&&F(a);!a.j.M&&a.pa&&a.pa.stop()}h.Hd=function(){return 0}; +function tc(a){1==(a.J&57345)&&(a.Pb=a.C>>16&65535);a=a.Pb;a&65280&&(a=(a<<8|a>>8)&65535);return a}function uc(a){1==(a.J&57345)&&(a.Qb=a.C&65535);return a.Qb}function vc(a,b){1170>a.sa&&(b&=-49);a.ta!=b&&(a.ta=b,a.cb=b&16?4194303:262143,fd(a))}function gd(a,b,c,d){a.pd=b;hd(a,b);yc(a,0);a.u.reset();Db(a);if(c){a.b[0]=d||0;for(b=1;5>=b;b++)a.b[b]=0;a.b[6]=1024;a.j.R?a.j.M||Fb(a):a.j.Y=!0}else a.D&&a.j.R?F(a)||a.A.j.reset||(a.D.g(),Jb(a.A,-1)):!1===c&&F(a);!a.j.M&&a.pa&&a.pa.stop()}h.Hd=function(){return 0}; h.save=function(){var a=new E(this);a.set(0,[this.b,this.ua,this.ga,this.H,this.s,this.Pa,this.Rb,this.F,this.Ob,this.$a,this.Oa,this.Xa,this.Ya,this.Ka,this.g,this.C,this.Ea,this.Lc,this.Nc]);a.set(1,[xc(this),rc(this),tc(this),uc(this),this.ta]);a.set(2,[this.Na,this.Za,this.j.Y]);a.set(3,id(this));a.set(4,ad(this));return a.data()}; h.restore=function(a){var b=ia(a[0]);this.b=b.next().value;this.ua=b.next().value;this.ga=b.next().value;this.H=b.next().value;this.s=b.next().value;this.Pa=b.next().value;this.Rb=b.next().value;this.F=b.next().value;this.Ob=b.next().value;this.$a=b.next().value;this.Oa=b.next().value;this.Xa=b.next().value;this.Ya=b.next().value;this.Ka=b.next().value;this.g=b.next().value;this.C=b.next().value;this.Ea=b.next().value;this.Lc=b.next().value;this.Nc=b.next().value;b=a[1];yc(this,b[0]);sc(this,b[1]); this.Pb=b[2];this.Qb=b[3];vc(this,b[4]);b=a[2];this.Na=b[0];Wc(this,b[1]);this.j.Y=b[2];for(var b=a[3],c=b.length-1;0<=c;c--){var d;a:{for(d=0;d