From 4ff0b57a7ad6196e8237fb4c8a9a76da0c5ef4a7 Mon Sep 17 00:00:00 2001 From: wfjm Date: Sat, 11 May 2019 09:29:17 +0200 Subject: [PATCH] add mcodes bootw11,noboot; add ram:&noboot --- doc/CHANGELOG.md | 5 + tools/asm-11/lib/defs_rl.mac | 50 ++++ tools/asm-11/lib/defs_rp.mac | 22 +- tools/mcode/README.md | 1 + tools/mcode/m9312/bootw11.mac | 352 ++++++++++++++++++++++++++ tools/mcode/sys/README.md | 1 + tools/mcode/sys/noboot.mac | 35 +++ tools/src/librw11/Rw11VirtDiskRam.cpp | 59 ++++- tools/src/librw11/Rw11VirtDiskRam.hpp | 6 +- 9 files changed, 522 insertions(+), 9 deletions(-) create mode 100644 tools/asm-11/lib/defs_rl.mac create mode 100644 tools/mcode/m9312/bootw11.mac create mode 100644 tools/mcode/sys/noboot.mac diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md index 0e1a62b3..abf556ed 100644 --- a/doc/CHANGELOG.md +++ b/doc/CHANGELOG.md @@ -30,8 +30,13 @@ The full set of tests is only run for tagged releases. - ibd_m9312: new boot prom emulation - new verification codes - test_m9312_all.tcl: tbench for m9312 +- new test and demonstration codes under tools/mcode + - m9312/bootw11.mac: w11 boot for m9312 + - sys/noboot.mac: boot blocker code for block 0 of disks ### Changes +- tools changes + - Rw11VirtDiskRam: add noboot attach option - renamed kw11p tbench from w11a_kw11p to kw11p ### Bug Fixes diff --git a/tools/asm-11/lib/defs_rl.mac b/tools/asm-11/lib/defs_rl.mac new file mode 100644 index 00000000..f055481e --- /dev/null +++ b/tools/asm-11/lib/defs_rl.mac @@ -0,0 +1,50 @@ +; $Id: $ +; Copyright 2019- by Walter F.J. Mueller +; License disclaimer see License.txt in $RETROBASE directory +; +; definitions for RL11 controler +; +; vector address/priority definition +; + va.rl=000160 + vp.rl=5 +; +; register addresses +; + rl.cs=174400 + rl.ba=174402 + rl.da=174404 + rl.mp=174406 +; +; symbol definitions for rl.cs +; + rl.err=100000 + rl.de=040000 + rl.crd=000200 + rl.ie=000100 + rl.fwc=000002 ; write check + rl.fgs=000004 ; get status + rl.fse=000006 ; seek + rl.frh=000010 ; read header + rl.fwr=000012 ; write data + rl.frd=000014 ; read data + rl.frn=000016 ; read data no header check + rl.drd=000001 +; +; symbol definitions for rl.mp after get statu command +; + rl.wge=002000 ; write gate error + rl.dse=000400 ; drive select error + rl.dt2=000200 ; drive type (rl02 when set) + rl.hs=000100 ; head select + rl.co=000040 ; cover open + rl.ho=000020 ; heads out + rl.bh=000010 ; brush home + rl.ssu=00001 ; status: spin up + rl.sbr=00002 ; status: brushing + rl.slh=00003 ; status: load(ing) heads + rl.sse=00004 ; status: seek(ing) + rl.slo=00005 ; status: lock(ed) + rl.suh=00006 ; status: unload(ing) + rl.ssd=00007 ; status: spin down + \ No newline at end of file diff --git a/tools/asm-11/lib/defs_rp.mac b/tools/asm-11/lib/defs_rp.mac index e709f439..0016278f 100644 --- a/tools/asm-11/lib/defs_rp.mac +++ b/tools/asm-11/lib/defs_rp.mac @@ -1,5 +1,5 @@ -; $Id: defs_rp.mac 1122 2019-03-17 08:15:42Z mueller $ -; Copyright 2015- by Walter F.J. Mueller +; $Id: defs_rp.mac 1143 2019-05-01 13:25:51Z mueller $ +; Copyright 2015-2019 by Walter F.J. Mueller ; License disclaimer see License.txt in $RETROBASE directory ; ; definitions for RH70/RPRM controler @@ -43,11 +43,25 @@ rp.ie =000100 rp.fsk=000004 ; seek rp.fcl=000010 ; drive clear + rp.frp=000020 ; read-in preset rp.fse=000030 ; search rp.fwr=000060 ; write rp.frd=000070 ; read rp.go =000001 ; +; symbol definitions for rp.cs2 +; + rp.wce=040000 + rp.ned=010000 + rp.nem=004000 + rp.pge=002000 + rp.mxf=001000 + rp.or=000200 + rp.ir=000100 + rp.clr=000040 + rp.pat=000020 + rp.bai=000010 +; ; symbol definitions for rp.ds ; rp.ata=100000 @@ -80,3 +94,7 @@ rp.rmr=000004 rp.ilr=000002 rp.ilf=000001 +; +; symbol definitions for rp.of +; + rp.f16=010000 ; 16bit format diff --git a/tools/mcode/README.md b/tools/mcode/README.md index 46fedaed..134170a7 100644 --- a/tools/mcode/README.md +++ b/tools/mcode/README.md @@ -4,5 +4,6 @@ This directory tree contains **miscellaneous codes** and is organized in | --------- | ------- | | [dl11](dl11) | for DL11 | | [lp11](lp11) | for LP11 | +| [m9312](m9312) | for M9312 (boot codes) | | [pc11](pc11) | for PC11 | | [sys](sys) | for whole system | diff --git a/tools/mcode/m9312/bootw11.mac b/tools/mcode/m9312/bootw11.mac new file mode 100644 index 00000000..2821acf7 --- /dev/null +++ b/tools/mcode/m9312/bootw11.mac @@ -0,0 +1,352 @@ +; $Id: bootw11.mac 1143 2019-05-01 13:25:51Z mueller $ +; Copyright 2019- by Walter F.J. Mueller +; License disclaimer see License.txt in $RETROBASE directory +; +; Revision History: +; Date Rev Version Comment +; 2019-05-01 1143 1.0 Initial version +; 2019-04-19 1133 0.1 First draft +; +; +; definitions ---------------------------------------------- +; + .include |lib/defs_cpu.mac| + .include |lib/defs_dl.mac| + + lorom = 165000 + hirom = 173000 +; + CR = 015 + LF = 012 +; +; low rom area ############################################# +; + . = lorom + +start: spl 7 + mov #160000,sp ; default stack + mov @#cp.los,r0 ; get memory size in clicks + cmp r0,#1600 ; > 56k + bhis 1$ ; if his yes, use 160000 + inc r0 ; otherwise sp=(los+1)<<6 + ash #6,r0 + mov r0,sp +1$: +; +; print prompt +; + mov #strpro,r1 +nxtpro: jsr pc,prtstr +; +; read boot device name and unit +; +getnam: jsr pc,getlet ; get 1st char + mov r0,r2 ; move into low byte + jsr pc,getlet ; get 2nd char + swab r0 + bis r0,r2 ; move into high byte + jsr pc,getchr ; get unit number or + cmp #CR,r0 ; is ? + beq fnddev ; if eq yes, done + mov r0,r3 + sub #'0,r3 ; convert ascii to binary + blt errpro ; below 0, error quit + cmp r3,#7 ; check 0-7 range + bgt errpro ; above 7, error quit + jsr pc,prtchr ; echo character + jsr pc,getchr ; get + cmp #CR,r0 ; is ? + bne errpro +; +; find boot loader +; in r2 device code +; in r3 unit number +; use r0,r1,r4 +; +fnddev: mov #devtbl,r4 +1$: tst (r4) ; end of list ? + beq errpro ; if eq yes, error quit + cmp (r4)+,r2 ; match ? + beq 2$ ; if eq yes + cmp (r4)+,(r4)+ ; skip two words + br 1$ ; and try next device in table +2$: cmp r3,(r4)+ ; is unit number in range ? + bgt errpro ; if gt not, error quit + mov #strnl,r1 ; print + jsr pc,prtstr + mov r3,r0 ; get unit to r0 + jmp @(r4)+ ; and execute boot code + +; +errpro: mov #strerr,r1 ; point to error string + br nxtpro +; +; getlet: read drive name letter --------------------------- +; out r0 character (only A-Z, other error quit) +; +getlet: jsr pc,getchr + cmp r0,#'Z ; above Z ? + ble 1$ ; if le not + sub #<'a-'A>,r0 ; otherwise convert to upper +1$: cmp r0,#'A ; below A ? + blt 2$ ; if lt yes, error quit + cmp r0,#'Z ; above Z ? + bgt 2$ ; if gt yes, error quit + jsr pc,prtchr ; echo character + rts pc +2$: tst (sp)+ ; drop return address + br errpro ; error quit +; +; getchr: read character routine --------------------------- +; out r0 character +; +getchr: tstb @#ti.csr ; wait ti ready + bpl getchr + mov @#ti.buf,r0 ; and read character + rts pc +; +; prtstr: print string routine ----------------------------- +; in r1 pointer to zero terminated string +; use r0 +; +prtstr: movb (r1)+,r0 ; get next char + beq prtrts ; if eq return + jsr pc,prtchr ; else print char + br prtstr ; and go for next +; +; prtchr: print character routine -------------------------- +; in r0 character to be printed +; +prtchr: tstb @#to.csr ; wait to ready + bpl prtchr + movb r0,@#to.buf ; and print +prtrts: rts pc +; +; rstoff: reset/restart after unit offline detected -------- +; +rstoff: reset + spl 7 + mov #stroff,r1 ; load string pointer + br nxtpro ; and go for error re-prompt +; +stroff: .ascii /off/ ; to print "off?\n@" +strerr: .ascii /?/ ; to print "?\n@" +strpro: .asciz /@/ ; to print "\n@" +strnl: .asciz ; to print "\n" + .even +; +; device descriptor table ---------------------------------- +; +devtbl: .word "DK, 7, bootrk ; "DK --> RK11/RK05 boot + .word "DL, 3, bootrl ; "DL --> RL11/RL02 boot + .word "DB, 3, bootrp ; "DB --> RH70/RP06 boot + .word "MT, 3, boottm ; "MT --> TM11 boot + .word "PR, 0, bootpc ; "PR --> PC11 boot + .word 0 +; +; common boot exit ----------------------------------------- +; +bootgo: clr r2 ; why ? + clr r3 ; why ? + clr r4 ; why ? + clr r5 ; why ? + clr pc +; +; RK11 boot loader +++++++++++++++++++++++++++++++++++++++++ +; RK boot loader code adapted from simh project +; + .include |lib/defs_rk.mac| +; +bootrk: mov r0,r3 + ash #13.,r3 + mov r3,@#rk.da ; load da with unit number + tstb @#rk.ds ; drive ready ? + bmi 1$ ; if mi, ready + jmp rstoff ; else offline fail +1$: clr @#rk.ba ; clear ba + mov #-512.,@#rk.wc ; set wc (2 blocks) + mov #rk.cs,r1 + mov #,(r1) ; start read +2$: tstb (r1) ; wait ready + bpl 2$ + tst @#rk.er ; did read succeed ? + beq 3$ ; if eq yes + halt ; else halt +3$: clrb (r1) + jmp bootgo +; +; RL11 boot loader +++++++++++++++++++++++++++++++++++++++++ +; RL boot loader code adapted from simh project +; + .include |lib/defs_rl.mac| +; +bootrl: mov r0,r3 + swab r3 + mov #rl.cs,r1 + mov #13,4(r1) ; clr err + bis #rl.fgs,r3 ; unit+gstat + mov r3,(r1) ; issue cmd +1$: tstb (r1) ; wait + bpl 1$ + mov 6(r1),r2 ; inspect status + bit #,r2 ; select error or cover open ? + beq 2$ ; if eq not + jmp rstoff ; else offline fail +2$: clrb r3 + bis #rl.frh,r3 ; unit+rdhdr + mov r3,(r1) ; issue cmd +3$: tstb (r1) ; wait + bpl 3$ + mov 6(r1),r2 ; get hdr + bic #077,r2 ; clr head+sector + inc r2 ; magic bit + mov r2,4(r1) ; seek to 0 + clrb r3 + bis #rl.fse,r3 ; unit+seek + mov r3,(r1) ; issue cmd +4$: tstb (r1) ; wait + bpl 4$ + clr 2(r1) ; clr ba + clr 4(r1) ; clr da + mov #-512., 6(r1) ; set wc + clrb r3 + bis #rl.frd,r3 ; unit+read + mov r3, (r1) ; issue cmd +5$: tstb (r1) ; wait + bpl 5$ + tst (r1) ; did read succeed ? + bpl 6$ ; if pl yes (cs.err = 0) + halt ; else halt +6$: bic #377, (r1) + jmp bootgo +; +; RH70 boot loader +++++++++++++++++++++++++++++++++++++++++ +; RH70 boot loader code adapted from simh project +; + .include |lib/defs_rp.mac| +; +bootrp: mov #rp.cs1,r1 ; + mov #rp.clr,@#rp.cs2 ; #CS2_CLR + mov r0,@#rp.cs2 ; set unit + tstb @#rp.ds ; check drive ready + bmi 1$ ; if mi yes + jmp rstoff ; else offline fail +1$: mov #,(r1) ; #RIP+GO: pack ack + mov #rp.f16, @#rp.of ; #FMT16B: 16b mode + mov #-512., @#rp.wc ; set wc + clr @#rp.ba ; clr ba + clr @#rp.da ; clr da + clr @#rp.dc ; clr cyl + mov #,(r1) ; read +2$: tstb (r1) ; wait + bpl 2$ + tst @#rp.ds ; did read succeed ? + bpl 3$ ; if pl yes (ds.ata = 0) + halt ; else halt +3$: clrb (r1) + jmp bootgo +; +; high rom area ############################################ +; + . = hirom +; +; TM11 boot loader +++++++++++++++++++++++++++++++++++++++++ +; TM boot loader code adapted from simh project +; + .include |lib/defs_tm.mac| +boottm: mov #tm.cr,r1 ; load csr + mov r0,r2 + swab r2 + mov r2,(r1) ; load unit number to cr + bit #tm.onl,@#tm.sr ; is unit online ? + bne 1$ ; if ne yes + jmp rstoff ; else offline fail +1$: clr @#tm.ba ; tmba = 0 + mov #-1,@#tm.bc ; tmbc = -1 + bis #,r2 + mov r2,(r1) ; tmcr = space + go +2$: tstb (r1) ; test tmcr.rdy + bpl 2$ + mov r0,r2 ; note: tmbc=0 now + swab r2 + bis #,r2 ; note: tmbc still = 0! + mov r2,(r1) ; tmcr = read + go +3$: tstb (r1) ; test tmcr.rdy + bpl 3$ + tstb #tm.sr+1 ; check upper 8 error bits + beq 4$ ; if eq, all fine + halt ; else error halt +4$: jmp bootgo +; +; PC11 boot loader +++++++++++++++++++++++++++++++++++++++++ +; RL boot loader code adapted pc11boot.mac +; + .include |lib/defs_pc.mac| +; +; register usage +; r0 byte +; r1 word +; r2 checksum +; r3 addr +; r4 count +; r5 #pr.csr +; +bootpc: mov #pr.csr,r5 + tst (r5) ; error bit set ? + bpl pcrec ; if pl no, continue + jmp rstoff ; otherwise quit offline +; +pcrec: clr r2 ; clear checksum +1$: jsr pc,pcbyte ; read 000 prefix or 001 + tstb r0 ; is zero ? + beq 1$ ; if eq yes, keep trying + dec r0 ; decrement to test for 001 + bne pcerr1 ; if ne, quit + jsr pc,pcbyte ; read 000 after 001 + tstb r0 ; is zero ? + bne pcerr1 ; if ne fail + jsr pc,pcword ; read count + mov r1,r4 ; store count + jsr pc,pcword ; read addr + mov r1,r3 ; store addr + sub #6,r4 ; subtract 6 from count + blt pcerr2 ; if <6 fail + bgt pcdata ; if >6 read data + jsr pc,pcbyte ; read checksum + tstb r2 ; test checksum + bne pcerr3 ; if ne bad, fail + bit #1,r3 ; address odd ? + beq 2$ ; if eq fine, use address + mov #200,r3 ; else use default start addres +2$: jmp (r3) ; and start code +; +pcerr1: halt ; halt: bad frame +pcerr2: halt ; halt: bad count +pcerr3: halt ; halt: bad checksum +pcerr4: halt ; halt: error bit set +; +pcdata: jsr pc,pcbyte ; read byte + movb r0,(r3)+ ; store byte + sob r4,pcdata ; dec count and loop if >0 + jsr pc,pcbyte ; get checksum + tstb r2 ; test checksum + bne pcerr3 ; if ne bad, fail + br pcrec ; otherwise next record + +pcword: jsr pc,pcbyte ; read low byte + mov r0,r1 ; low byte to r1 + jsr pc,pcbyte ; read high byte + swab r0 + bis r0,r1 ; high byte to r1 + rts pc + +pcbyte: inc (r5) ; set enable +1$: tst (r5) ; error set ? + bmi pcerr4 ; if mi yes, fail + tstb (r5) ; done set ? + bpl 1$ ; if pl not yet + mov 2(r5),r0 ; read byte + add r0,r2 ; accumulate checksum + rts pc +; + .end start diff --git a/tools/mcode/sys/README.md b/tools/mcode/sys/README.md index e35eadaf..634d2140 100644 --- a/tools/mcode/sys/README.md +++ b/tools/mcode/sys/README.md @@ -3,3 +3,4 @@ This directory tree contains **system codes** and contains | File | Docu | Comments | | --------- | --------- | ------- | | [blink.mac](blink.mac) | - | _blinking lights_ demo | +| [noboot.mac](noboot.mac) | - | boot blocker (for disk block 0) | diff --git a/tools/mcode/sys/noboot.mac b/tools/mcode/sys/noboot.mac new file mode 100644 index 00000000..25c99ac9 --- /dev/null +++ b/tools/mcode/sys/noboot.mac @@ -0,0 +1,35 @@ +; $Id: noboot.mac 1143 2019-05-01 13:25:51Z mueller $ +; Copyright 2019- by Walter F.J. Mueller +; License disclaimer see License.txt in $RETROBASE directory +; +; Boot blocker, when loaded and started at 0, writes +; This is not a hardware bootable disk +; + .include |lib/defs_dl.mac| +; + CR = 015 + LF = 012 +; +; starts at 0 ! +; + .asect + . = 0 +; +start: mov #text, r0 +1$: tstb (r0) + beq 3$ +2$: tstb @#to.csr + bpl 2$ + movb (r0)+,@#to.buf + br 1$ +3$: halt +; +text: .ascii + .ascii /++======================================++/ + .ascii /|| This is not a hardware bootable disk ||/ + .ascii /++======================================++/ + .ascii + .ascii /CPU WILL HALT/ + .asciz +; + .end start diff --git a/tools/src/librw11/Rw11VirtDiskRam.cpp b/tools/src/librw11/Rw11VirtDiskRam.cpp index e6dd45d7..05620cf0 100644 --- a/tools/src/librw11/Rw11VirtDiskRam.cpp +++ b/tools/src/librw11/Rw11VirtDiskRam.cpp @@ -1,6 +1,6 @@ -// $Id: Rw11VirtDiskRam.cpp 1063 2018-10-29 18:37:42Z mueller $ +// $Id: Rw11VirtDiskRam.cpp 1143 2019-05-01 13:25:51Z mueller $ // -// Copyright 2018- by Walter F.J. Mueller +// Copyright 2018-2019 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2019-05-01 1143 1.1 add noboot option // 2018-10-28 1063 1.0 Initial version // 2018-10-27 1061 0.1 First draft // --------------------------------------------------------------------------- @@ -27,6 +28,8 @@ #include #include +#include + #include "librtools/RosFill.hpp" #include "librtools/RosPrintf.hpp" @@ -47,6 +50,7 @@ namespace Retro { Rw11VirtDiskRam::Rw11VirtDiskRam(Rw11Unit* punit) : Rw11VirtDisk(punit), + fNoBoot(false), fPatTyp(kPatZero), fBlkMap() { @@ -74,8 +78,9 @@ bool Rw11VirtDiskRam::Open(const std::string& url, RerrMsg& emsg) bool Rw11VirtDiskRam::Open(const std::string& url, const std::string& scheme, RerrMsg& emsg) { - if (!fUrl.Set(url, "|wpro|pat=|", scheme, emsg)) return false; - fWProt = fUrl.FindOpt("wpro"); + if (!fUrl.Set(url, "|wpro|noboot|pat=|", scheme, emsg)) return false; + fWProt = fUrl.FindOpt("wpro"); + fNoBoot = fUrl.FindOpt("noboot"); string pat; fPatTyp = kPatZero; @@ -178,6 +183,7 @@ void Rw11VirtDiskRam::Dump(std::ostream& os, int ind, const char* text, RosFill bl(ind); os << bl << (text?text:"--") << "Rw11VirtDiskRam @ " << this << endl; + os << bl << " fNoBoot: " << fNoBoot << endl; os << bl << " fPatTyp: " << fPatTyp << endl; os << bl << " fBlkMap.size: " << fBlkMap.size() << endl; Rw11VirtDisk::Dump(os, ind, " ^", detail); @@ -189,10 +195,53 @@ void Rw11VirtDiskRam::Dump(std::ostream& os, int ind, const char* text, void Rw11VirtDiskRam::ReadPattern(size_t lba, uint8_t* data) { + + if (lba == 0 && fNoBoot) { // block 0 with 'not bootable' msg + uint16_t bootcode[] = { + 0012700, 0000026, // start: mov #text, r0 + 0105710, // 1$: tstb (r0) + 0001406, // beq 3$ + 0105737, 0177564, // 2$: tstb @#to.csr + 0100375, // bpl 2$ + 0112037, 0177566, // movb (r0)+,@#to.buf + 0000770, // br 1$ + 0000000 // 3$: halt + // text: .ascii .... + }; + + uint16_t* pdata = reinterpret_cast(data); + for (uint16_t& o : bootcode) *pdata++ = o; + + ostringstream boottext; + boottext << "\r\n"; + boottext << "++======================================++\r\n"; + boottext << "|| This is not a hardware bootable disk ||\r\n"; + boottext << "++======================================++\r\n"; + boottext << "\r\n"; + boottext << "Virtual disk: CHS=" + << fNCyl << "," << fNHead << "," << fNSect; + boottext << " blocks=" << fNBlock << "(" << fBlkSize << ")"; + boottext << " name=" << fUrl.Path(); + boottext << "\r\n"; + boottext << "CPU WILL HALT\r\n"; + boottext << "\r\n"; + + char* pchar = reinterpret_cast(pdata); + char* pend = reinterpret_cast(data+fBlkSize); + for (char& o : boottext.str()) { // append boot text + *pchar++ = o; + if (pchar >= pend) break; // ensure block isn't overrrun + } + while (pchar < pend) { *pchar++ = '\0'; } // zero fill rest + pend[-1] = '\0'; // ensure text 0 terminated + + return; + } + uint16_t* p = reinterpret_cast(data); uint16_t* pend = reinterpret_cast(data+fBlkSize); size_t addr = lba*fBlkSize; - + switch (fPatTyp) { case kPatZero: while (p < pend) { *p++ = 0x0000; } diff --git a/tools/src/librw11/Rw11VirtDiskRam.hpp b/tools/src/librw11/Rw11VirtDiskRam.hpp index 9bfe9a38..149a94fd 100644 --- a/tools/src/librw11/Rw11VirtDiskRam.hpp +++ b/tools/src/librw11/Rw11VirtDiskRam.hpp @@ -1,6 +1,6 @@ -// $Id: Rw11VirtDiskRam.hpp 1066 2018-11-10 11:21:53Z mueller $ +// $Id: Rw11VirtDiskRam.hpp 1143 2019-05-01 13:25:51Z mueller $ // -// Copyright 2018- by Walter F.J. Mueller +// Copyright 2018-2019 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2019-05-01 1143 1.1 add noboot option // 2018-10-28 1063 1.0 Initial version // 2018-10-27 1061 0.1 First draft // --------------------------------------------------------------------------- @@ -74,6 +75,7 @@ namespace Retro { kPatTest }; + bool fNoBoot; pattyp fPatTyp; //!< pattern type bmap_t fBlkMap; };