mirror of
https://github.com/wfjm/w11.git
synced 2026-02-26 17:13:27 +00:00
- major release w11a_V0.70 (tagged)
- changes from last minor release - rhrp and tm11 bug fixes - no major functionality added
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
$Id: README.txt 687 2015-06-05 09:03:34Z mueller $
|
||||
$Id: README.txt 693 2015-06-21 14:02:46Z mueller $
|
||||
|
||||
Release notes for w11a
|
||||
|
||||
@@ -22,6 +22,67 @@ Release notes for w11a
|
||||
|
||||
2. Change Log ----------------------------------------------------------------
|
||||
|
||||
- w11a_V0.60 -> w11a_V0.70 cummulative summary of key changes
|
||||
- Bugfix for DIV instruction (in w11a_V0.61, see ECO-026-div.txt)
|
||||
- revised rbus protocol V4 (in w11a_V0.62, see README_Rlink_V4.txt)
|
||||
- add basic Vivado support (in w11a_V0.64)
|
||||
- add Nexys4 and Basys3 port of w11a (in w11a_V0.64)
|
||||
- add RH70+RP/RM disk support (in w11a_V0.65)
|
||||
- add TM11/TY10 tape support (in w11a_V0.66)
|
||||
- reference system now ISE 14.7, Vivado 2014.4; Ubuntu 14.04 64 bit, ghdl 0.31
|
||||
|
||||
- trunk (2015-06-21: svn rev 33(oc) 693(wfjm); tagged w11a_V0.70) +++++++++++
|
||||
- Preface
|
||||
- resolved known issue V0.66-2: operation with multiple RP or RM disks
|
||||
under 211bsd works now. Issue was caused by a faulty error check.
|
||||
- resolved bug tracker issue 2015-06-06: the tm11 offline function works
|
||||
now as expected. Issue was caused by de-referencing a null pointer.
|
||||
- resolved bug tracker request 2015-06-05: the values returned as drive
|
||||
serial number were interpreted by 211bsd standalone code as a signature
|
||||
of SI drives, which made disk partitioning a bit cumbersome. Changed the
|
||||
scheme used to generate drive serial numbers such that they never match
|
||||
these 3rd party drive characteristics. The 211bsd installation on a
|
||||
RM05 is documented with the 211bsd_tm oskit.
|
||||
- the w11a designs grow larger, filling the FPGA's on Nexys2 and Nexys3
|
||||
to ~50% (n2) or 67% (n3). To reach timing closure without fine tuning
|
||||
constraints the cpu clock had to be reduced to
|
||||
sys_w11a_n2 now 52 MHz (was 54 MHz)
|
||||
sys_w11a_n3 now 64 MHz (was 68 MHz)
|
||||
|
||||
- w11a has now a complete set of mass storage peripherals. This is a good
|
||||
reason of a major release, thus go for version V0.70.
|
||||
|
||||
- there are many known issues, and in many cases only core functionality
|
||||
used by operating systems has been implemented. The missing parts will
|
||||
be implemented in the upcoming releases towards V0.80, also much more
|
||||
intensive testing, especially with maindecs (aka xxdp) will be done.
|
||||
|
||||
- Summary
|
||||
- rhrp and tm11 bug fixes
|
||||
- no major functionality added
|
||||
|
||||
- New features
|
||||
|
||||
- Changes
|
||||
- renames
|
||||
- tools/oskit/211bsd_tm/211bsd_tm_boot.* -> 211bsd_tm_rp06_boot.*
|
||||
- functional changes
|
||||
- rtl/ibus/ibdr_rhrp - modify sn register to avoid 211bsd issues
|
||||
- tools/bin/create_disk - support RM80 disks
|
||||
- tools/tcl/rutil/util.tcl - add dohook
|
||||
- tools/oskit/*/*_boot.tcl - add preinithook and preboothook
|
||||
|
||||
- Bug fixes
|
||||
- rtl/ibus/ibdr_rhrp - set er1.rmr only when unit busy
|
||||
- set cs2.pge only when controller busy
|
||||
- tools/src/librw11
|
||||
- Rw11CntlTM11 - fix crash when offline function was executed
|
||||
|
||||
- Known issues
|
||||
- all issues: see README_known_issues.txt
|
||||
- resolved issues:
|
||||
- V0.66-2: operation with multiple RP/RM drives works now under 211bsd
|
||||
|
||||
- trunk (2015-06-05: svn rev 31(oc) 687(wfjm); untagged w11a_V0.66) +++++++++
|
||||
- Preface
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
$Id: README_known_issues.txt 687 2015-06-05 09:03:34Z mueller $
|
||||
$Id: README_known_issues.txt 693 2015-06-21 14:02:46Z mueller $
|
||||
|
||||
Known issues for this release.
|
||||
The case id indicates the release when the issue was first recognized.
|
||||
@@ -8,9 +8,6 @@ The case id indicates the release when the issue was first recognized.
|
||||
are currently not supported and rejected as invalid command. Odd byte
|
||||
length records aren't used by OS, if at all, so in practice this limitation
|
||||
isn't relevant.
|
||||
- V0.66-2: using two RP06 drives in parallel under 211bsd leads to a hangup of
|
||||
the system after a short time. Currently only operation of a single drive
|
||||
works reliably.
|
||||
|
||||
- V0.65-1: ti_rri sometimes crashes in normal rundown (exit or ^D) when
|
||||
a cuff: type rlink is active. One gets
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: w11a_tb_guide.txt 687 2015-06-05 09:03:34Z mueller $
|
||||
# $Id: w11a_tb_guide.txt 688 2015-06-05 13:15:10Z mueller $
|
||||
|
||||
Note: Only ISE based test benches are currently documented !
|
||||
The Vivado test environemnt is still in it's infancy !
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- $Id: ibdr_rhrp.vhd 682 2015-05-15 18:35:29Z mueller $
|
||||
-- $Id: ibdr_rhrp.vhd 692 2015-06-21 11:53:24Z mueller $
|
||||
--
|
||||
-- Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
@@ -22,11 +22,15 @@
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2015-06-20 692 14.7 131013 xc6slx16-2 212 406 8 142 s 8.7
|
||||
-- 2015-05-14 680 14.7 131013 xc6slx16-2 211 408 8 131 s 8.8
|
||||
-- 2015-04-06 664 14.7 131013 xc6slx16-2 177 331 8 112 s 8.7
|
||||
--
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2015-06-20 692 1.0.3 BUGFIX: fix func-go when drive/init busy checks
|
||||
-- 2015-06-05 690 1.0.2 use 'not unit' for lsb of rpsn to avoid SI detect
|
||||
-- BUGFIX: set rmr only for write to busy unit
|
||||
-- 2015-05-15 682 1.0.1 correct ibsel range select logic
|
||||
-- 2015-05-14 680 1.0 Initial version
|
||||
-- 2015-03-15 658 0.1 First draft
|
||||
@@ -147,6 +151,7 @@ architecture syn of ibdr_rhrp is
|
||||
constant func_pres : slv5 := "01000"; -- func: readin preset
|
||||
constant func_pack : slv5 := "01001"; -- func: pack acknowledge
|
||||
constant func_sear : slv5 := "01100"; -- func: search
|
||||
constant func_xfer : slv5 := "10100"; -- used to check for xfer type funcs
|
||||
constant func_wcd : slv5 := "10100"; -- func: write check data
|
||||
constant func_wchd : slv5 := "10101"; -- func: write check header&data
|
||||
constant func_write : slv5 := "11000"; -- func: write
|
||||
@@ -169,8 +174,8 @@ architecture syn of ibdr_rhrp is
|
||||
|
||||
constant cs2_ibf_rwco : integer := 15; -- rem: write check odd word
|
||||
constant cs2_ibf_wce : integer := 14; -- write check error
|
||||
constant cs2_ibf_ned : integer := 12; -- non-existant drive
|
||||
constant cs2_ibf_nem : integer := 11; -- non-existant memory
|
||||
constant cs2_ibf_ned : integer := 12; -- non-existent drive
|
||||
constant cs2_ibf_nem : integer := 11; -- non-existent memory
|
||||
constant cs2_ibf_pge : integer := 10; -- programming error
|
||||
constant cs2_ibf_mxf : integer := 9; -- missed transfer
|
||||
constant cs2_ibf_or : integer := 7; -- output ready
|
||||
@@ -269,6 +274,7 @@ architecture syn of ibdr_rhrp is
|
||||
s_wmem, -- wmem: write mem (DA,MR1,OF,DC,MR2)
|
||||
s_wmembe, -- wmem: write mem with be (WC,BA,DB)
|
||||
s_whr, -- whr: write hr (holding reg only)
|
||||
s_funcchk, -- funcchk: check function go
|
||||
s_funcgo, -- funcgo: handle function go
|
||||
s_chkdc, -- chkdc: handle dc check
|
||||
s_chkda, -- chksa: handle da check
|
||||
@@ -297,8 +303,8 @@ architecture syn of ibdr_rhrp is
|
||||
ffunc : slv5; -- func code (frozen on ext func go)
|
||||
fxfer : slbit; -- func is xfer
|
||||
cs2wce : slbit; -- cs2: write check error
|
||||
cs2ned : slbit; -- cs2: non-existant drive
|
||||
cs2nem : slbit; -- cs2: non-existant memory
|
||||
cs2ned : slbit; -- cs2: non-existent drive
|
||||
cs2nem : slbit; -- cs2: non-existent memory
|
||||
cs2pge : slbit; -- cs2: programming error
|
||||
cs2mxf : slbit; -- cs2: missed transfer
|
||||
cs2pat : slbit; -- cs2: parity test
|
||||
@@ -330,7 +336,7 @@ architecture syn of ibdr_rhrp is
|
||||
poredone: slbit; -- cs3 rem: port rel done
|
||||
packdone: slbit; -- cs3 rem: pack ack done
|
||||
seardone: slbit; -- cs3 rem: search done
|
||||
ned : slbit; -- current drive non-existant
|
||||
ned : slbit; -- current drive non-existent
|
||||
cerm : slbit; -- current eff. drive rm controller
|
||||
dtyp : slv6; -- current drive type (5:0)
|
||||
camax : slv10; -- current max cylinder address
|
||||
@@ -473,7 +479,7 @@ begin
|
||||
variable itamax : slv5 := (others=>'0'); -- max track address
|
||||
variable isamax : slv6 := (others=>'0'); -- max sector address
|
||||
|
||||
variable ined : slbit := '0'; -- non-existanrt drive
|
||||
variable ined : slbit := '0'; -- non-existent drive
|
||||
variable icerm : slbit := '0'; -- effectiv drive is rm
|
||||
|
||||
variable iclrreg : slbit := '0'; -- clr enable
|
||||
@@ -590,7 +596,7 @@ begin
|
||||
n.tamax := itamax;
|
||||
n.samax := isamax;
|
||||
|
||||
-- consider drive non-existant if not 'DPR' or unit>=4 selected
|
||||
-- consider drive non-existent if not 'DPR' or unit>=4 selected
|
||||
if r.dsdpr(to_integer(unsigned(r.cs2unit))) = '0' or
|
||||
r.cs2unit2 = '1' then
|
||||
ined := '1';
|
||||
@@ -759,9 +765,14 @@ begin
|
||||
-- some general error catchers
|
||||
if ibrem = '0' and imbreg='1' then -- local massbus write
|
||||
-- for cs1: imbreg=0 !!
|
||||
-- write to non-existent drives
|
||||
if ined = '1' then
|
||||
n.cs2ned := '1';
|
||||
elsif inormr='0' and r.cs1rdy='0' then -- rmr prot reg and RDY=0
|
||||
-- write to a busy unit, can be a search/seek or a transfer
|
||||
elsif inormr='0' and -- rmr protected reg
|
||||
(r.dspip(to_integer(unsigned(r.cs2unit)))='1' or -- busy pip
|
||||
(r.cs1rdy='0' and (r.funit = r.cs2unit)) -- busy xfer
|
||||
) then
|
||||
n.state := s_setrmr;
|
||||
end if;
|
||||
end if;
|
||||
@@ -826,17 +837,16 @@ begin
|
||||
n.ireq := '1'; -- issue software interrupt
|
||||
end if;
|
||||
|
||||
if r.cs1rdy = '1' then -- controller ready
|
||||
if r.ned = '0' and -- drive on
|
||||
IB_MREQ.din(cs1_ibf_go) = '1' then -- GO bit set
|
||||
ibhold := '1';
|
||||
n.state := s_funcgo;
|
||||
end if;
|
||||
else -- cntl not rdy
|
||||
n.cs2pge := '1'; -- issue program error
|
||||
end if;
|
||||
if r.ned = '0' and -- drive on
|
||||
IB_MREQ.din(cs1_ibf_go) = '1' then -- GO bit set
|
||||
ibhold := '1';
|
||||
n.state := s_funcchk;
|
||||
end if;
|
||||
|
||||
-- FIXME_code: that's likely not fully correct, cs1 func bits are
|
||||
-- stored before all error checks are done...
|
||||
imem_we0 := IB_MREQ.be0; -- remember func field per unit
|
||||
|
||||
if r.ned = '1' then -- loc access and drive off
|
||||
n.cs2ned := '1'; -- signal error
|
||||
end if;
|
||||
@@ -1008,6 +1018,22 @@ begin
|
||||
imem_we1 := '1';
|
||||
end if;
|
||||
|
||||
when s_funcchk => -- funcchk: check function go --------
|
||||
n.state := s_idle; -- in general return to s_idle
|
||||
if r.cs1rdy = '0' and
|
||||
unsigned(IB_MREQ.din(cs1_ibf_func)) >= unsigned(func_xfer) then
|
||||
n.cs2pge := '1'; -- issue program error
|
||||
elsif IB_MREQ.din(cs1_ibf_func) = func_dclr then
|
||||
n.eunit := r.cs2unit; -- for follow-up states
|
||||
n.clrmode := clrmode_fdclr;
|
||||
n.state := s_oot_clr0; -- OOT state, no hold!
|
||||
elsif r.dserp(to_integer(unsigned(r.cs2unit))) = '1' then
|
||||
n.er1ilf(to_integer(unsigned(r.cs2unit))) := '1';
|
||||
else
|
||||
ibhold := '1';
|
||||
n.state := s_funcgo;
|
||||
end if;
|
||||
|
||||
when s_funcgo => -- funcgo: handle function go --------
|
||||
n.state := s_idle; -- in general return to s_idle
|
||||
n.dsata(to_integer(unsigned(r.cs2unit))) := '0';
|
||||
@@ -1031,10 +1057,7 @@ begin
|
||||
end if;
|
||||
n.dsata(to_integer(unsigned(r.cs2unit))) := '1';
|
||||
|
||||
when func_dclr => -- func: drive clear -------
|
||||
n.eunit := r.cs2unit; -- for follow-up states
|
||||
n.clrmode := clrmode_fdclr;
|
||||
n.state := s_oot_clr0; -- OOT state, no hold!
|
||||
-- when func_dclr => now handled in funcchk !!
|
||||
|
||||
when func_offs | -- func: offset ------------
|
||||
func_retc => -- func: return to center --
|
||||
@@ -1236,13 +1259,20 @@ begin
|
||||
-- digit 3: always 1
|
||||
-- digit 2: 1 if RM type; 0 if RP type
|
||||
-- digit 1: 0-3 based on encoded drive type
|
||||
-- digit 0: 0-3 taken from unit
|
||||
-- digit 0: 0-3 taken as complement of unit
|
||||
-- Note: the 3lsb are the *complement* of the unit number because
|
||||
-- 211bsd driver code contains a hack to detect SI and CDC
|
||||
-- drives. For those drives the drive type is encode in the
|
||||
-- sn register, and one convention is that the 3 lsb of sn
|
||||
-- equal the unit numnber. To prevent that the SI/CDC hacks
|
||||
-- are actived the 3lsb are set as complement of the unit !
|
||||
idout(12) := '1';
|
||||
idout(8) := r.dtrm(to_integer(unsigned(r.eunit)));
|
||||
idout(5) := r.dte1(to_integer(unsigned(r.eunit)));
|
||||
idout(4) := r.dte0(to_integer(unsigned(r.eunit)));
|
||||
idout(1) := r.eunit(1);
|
||||
idout(0) := r.eunit(0);
|
||||
idout(2) := '1';
|
||||
idout(1) := not r.eunit(1);
|
||||
idout(0) := not r.eunit(0);
|
||||
|
||||
when omux_bae => -- omux: bae reg ---------------
|
||||
idout(bae_ibf_bae) := r.bae;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- $Id: ibdr_tm11.vhd 686 2015-06-04 21:08:08Z mueller $
|
||||
-- $Id: ibdr_tm11.vhd 690 2015-06-07 18:23:51Z mueller $
|
||||
--
|
||||
-- Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
@@ -127,7 +127,7 @@ architecture syn of ibdr_tm11 is
|
||||
srpae: slbit; -- sr: parity error
|
||||
srrle: slbit; -- sr: record length error
|
||||
srbte: slbit; -- sr: bad tape error
|
||||
srnxm: slbit; -- sr: non-existant memory
|
||||
srnxm: slbit; -- sr: non-existent memory
|
||||
sreof: slv4; -- sr: eof-of-file
|
||||
sreot: slv4; -- sr: eof-of-tape
|
||||
sronl: slv4; -- sr: online
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- $Id: sys_conf.vhd 683 2015-05-17 21:54:35Z mueller $
|
||||
-- $Id: sys_conf.vhd 692 2015-06-21 11:53:24Z mueller $
|
||||
--
|
||||
-- Copyright 2010-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
@@ -19,6 +19,7 @@
|
||||
-- Tool versions: xst 11.4-14.7; ghdl 0.26-0.31
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2015-06-21 692 1.4.1 use clksys=52 (no closure after rhrp fixes)
|
||||
-- 2015-03-14 658 1.4 add sys_conf_ibd_* definitions
|
||||
-- 2015-02-15 647 1.3 drop bram and minisys options
|
||||
-- 2015-01-04 630 1.2.2 use clksys=54 (no closure after rlink r4 + RL11)
|
||||
@@ -44,7 +45,7 @@ package sys_conf is
|
||||
|
||||
-- configure clocks --------------------------------------------------------
|
||||
constant sys_conf_clkfx_divide : positive := 25;
|
||||
constant sys_conf_clkfx_multiply : positive := 27; -- ==> 54 MHz
|
||||
constant sys_conf_clkfx_multiply : positive := 26; -- ==> 52 MHz
|
||||
|
||||
-- configure rlink and hio interfaces --------------------------------------
|
||||
constant sys_conf_ser2rri_defbaud : integer := 115200; -- default 115k baud
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- $Id: sys_w11a_n2.vhd 686 2015-06-04 21:08:08Z mueller $
|
||||
-- $Id: sys_w11a_n2.vhd 692 2015-06-21 11:53:24Z mueller $
|
||||
--
|
||||
-- Copyright 2010-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
@@ -34,6 +34,7 @@
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2015-06-21 692 14.7 131013 xc3s1200e-4 2312 6716 414 4192 ok: rhrp fixes
|
||||
-- 2015-06-04 686 14.7 131013 xc3s1200e-4 2311 6725 414 4198 ok: +TM11
|
||||
-- 2015-05-14 680 14.7 131013 xc3s1200e-4 2232 6547 414 4083 ok: +RHRP
|
||||
-- 2015-02-21 649 14.7 131013 xc3s1200e-4 1903 5512 382 3483 ok: +RL11
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- $Id: sys_conf.vhd 683 2015-05-17 21:54:35Z mueller $
|
||||
-- $Id: sys_conf.vhd 692 2015-06-21 11:53:24Z mueller $
|
||||
--
|
||||
-- Copyright 2011-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
@@ -19,6 +19,7 @@
|
||||
-- Tool versions: xst 13.1-14.7; ghdl 0.29-0.31
|
||||
-- Revision History:
|
||||
-- Date Rev Version Comment
|
||||
-- 2015-06-21 692 1.4.1 use clksys=64 (no closure after rhrp fixes)
|
||||
-- 2015-03-14 658 1.4 add sys_conf_ibd_* definitions
|
||||
-- 2015-02-15 647 1.3 drop bram and minisys options
|
||||
-- 2014-12-26 621 1.2.2 use 68 MHz, get occasional problems with 72 MHz
|
||||
@@ -48,8 +49,8 @@ package sys_conf is
|
||||
|
||||
-- configure clocks --------------------------------------------------------
|
||||
constant sys_conf_clksys_vcodivide : positive := 25;
|
||||
constant sys_conf_clksys_vcomultiply : positive := 17; -- dcm 68 MHz
|
||||
constant sys_conf_clksys_outdivide : positive := 1; -- sys 68 MHz
|
||||
constant sys_conf_clksys_vcomultiply : positive := 16; -- dcm 64 MHz
|
||||
constant sys_conf_clksys_outdivide : positive := 1; -- sys 64 MHz
|
||||
constant sys_conf_clksys_gentype : string := "DCM";
|
||||
|
||||
-- configure rlink and hio interfaces --------------------------------------
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- $Id: sys_w11a_n3.vhd 686 2015-06-04 21:08:08Z mueller $
|
||||
-- $Id: sys_w11a_n3.vhd 692 2015-06-21 11:53:24Z mueller $
|
||||
--
|
||||
-- Copyright 2011-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
--
|
||||
@@ -34,6 +34,7 @@
|
||||
--
|
||||
-- Synthesized (xst):
|
||||
-- Date Rev ise Target flop lutl lutm slic t peri
|
||||
-- 2015-06-21 692 14.7 131013 xc6slx16-2 2192 4518 161 1584 ok: rhrp fixes
|
||||
-- 2015-06-04 686 14.7 131013 xc6slx16-2 2189 4492 161 1543 ok: +TM11 67%
|
||||
-- 2015-05-14 680 14.7 131013 xc6slx16-2 2120 4443 161 1546 ok: +ibmon 67%
|
||||
-- 2015-04-06 664 14.7 131013 xc6slx16-2 1991 4350 167 1489 ok: +RHRP 65%
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
; $Id: defs_rp.mac 667 2015-04-18 20:16:05Z mueller $
|
||||
; $Id: defs_rp.mac 691 2015-06-15 21:22:08Z mueller $
|
||||
; Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
; License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
|
||||
;
|
||||
@@ -40,7 +40,7 @@
|
||||
rp.fcl=000010 ; drive clear
|
||||
rp.fse=000030 ; search
|
||||
rp.fwr=000060 ; write
|
||||
rp.fwr=000070 ; read
|
||||
rp.frd=000070 ; read
|
||||
rp.go =000001
|
||||
;
|
||||
; symbol definitions for rp.ds
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/perl -w
|
||||
# $Id: create_disk 686 2015-06-04 21:08:08Z mueller $
|
||||
# $Id: create_disk 692 2015-06-21 11:53:24Z mueller $
|
||||
#
|
||||
# Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
#
|
||||
@@ -14,7 +14,7 @@
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2015-06-04 686 1.1.2 use sysseek rather seek; add RM80
|
||||
# 2015-06-21 692 1.1.2 use sysseek rather seek; add RM80
|
||||
# 2015-04-06 665 1.1.1 add alias RM03 (for RM02) and RP05 (for RP04)
|
||||
# 2014-06-14 562 1.1 BUGFIX: repair --boot; add RM02,RM05,RP04,RP07
|
||||
# 2013-05-20 521 1.0 First draft
|
||||
@@ -43,10 +43,10 @@ my %disktype = (
|
||||
RK05 => {cyl=> 203, hd=> 2, sec=> 12, bps=> 512, bad=>0},
|
||||
RL01 => {cyl=> 256, hd=> 2, sec=> 40, bps=> 256, bad=>1},
|
||||
RL02 => {cyl=> 512, hd=> 2, sec=> 40, bps=> 256, bad=>1},
|
||||
RM02 => {cyl=> 823, hd=> 5, sec=> 32, bps=> 512, bad=>1},
|
||||
RM03 => {cyl=> 823, hd=> 5, sec=> 32, bps=> 512, bad=>1},
|
||||
RM05 => {cyl=> 823, hd=> 19, sec=> 32, bps=> 512, bad=>1},
|
||||
RM80 => {cyl=> 559, hd=> 14, sec=> 31, bps=> 512, bad=>1},
|
||||
RP04 => {cyl=> 411, hd=> 19, sec=> 22, bps=> 512, bad=>1},
|
||||
RP05 => {cyl=> 411, hd=> 19, sec=> 22, bps=> 512, bad=>1},
|
||||
RP06 => {cyl=> 815, hd=> 19, sec=> 22, bps=> 512, bad=>1},
|
||||
RP07 => {cyl=> 630, hd=> 32, sec=> 50, bps=> 512, bad=>1}
|
||||
);
|
||||
@@ -73,8 +73,8 @@ if (-e $fnam) {
|
||||
|
||||
my $typ = uc($opts{typ});
|
||||
|
||||
$typ = "RM02" if defined $typ && $typ eq "RM03"; # RM03 is equivalent to RM02
|
||||
$typ = "RP04" if defined $typ && $typ eq "RP05"; # RM05 is equivalent to RP04
|
||||
$typ = "RM03" if defined $typ && $typ eq "RM02"; # RM02 is equivalent to RM03
|
||||
$typ = "RP05" if defined $typ && $typ eq "RP04"; # RM04 is equivalent to RP05
|
||||
|
||||
unless (defined $typ && exists $disktype{$typ}) {
|
||||
print STDERR "create_disk-E: no or invalid --typ specification, use --help\n";
|
||||
@@ -128,7 +128,7 @@ sub do_inipatt {
|
||||
push @dat, 0xdead,0xbeaf if $ini eq 'dead';
|
||||
}
|
||||
my $buf = pack('v*',@dat);
|
||||
my $rc = $fh->seek(0, SEEK_SET);
|
||||
my $rc = sysseek($fh, 0, SEEK_SET);
|
||||
if (not $rc) {die "seek failed: $!";}
|
||||
for (my $i=0; $i<$nblk; $i++) {
|
||||
$rc = syswrite($fh, $buf, length($buf));
|
||||
@@ -140,7 +140,7 @@ sub do_inipatt {
|
||||
my $cur_sec = 0;
|
||||
my $cur_trk = 0;
|
||||
my $cur_cyl = 0;
|
||||
my $rc = $fh->seek(0, SEEK_SET);
|
||||
my $rc = sysseek($fh, 0, SEEK_SET);
|
||||
if (not $rc) {die "seek failed: $!";}
|
||||
for (my $i=0; $i<$nblk; $i++) {
|
||||
my @dat;
|
||||
@@ -183,7 +183,7 @@ sub do_badtable {
|
||||
my $buf = pack('v*',@dat);
|
||||
|
||||
my $pos = $cap - $sec*$bps; # position of last track
|
||||
my $rc = $fh->seek($pos, SEEK_SET);
|
||||
my $rc = sysseek($fh, $pos, SEEK_SET);
|
||||
if (not $rc) {die "seek failed: $!";}
|
||||
my $nsec = ($sec > 10) ? 10 : $sec; # write last track, at most 10 sec
|
||||
for (my $i=0; $i<$nsec; $i++) {
|
||||
@@ -208,7 +208,7 @@ sub do_boot {
|
||||
push @dat, 0000000; # 3$: halt
|
||||
|
||||
my $buf = pack('v*',@dat);
|
||||
my $rc = $fh->seek(0, SEEK_SET);
|
||||
my $rc = sysseek($fh, 0, SEEK_SET);
|
||||
if (not $rc) {die "seek failed: $!";}
|
||||
$rc = syswrite($fh, $buf, length($buf));
|
||||
if ($rc<=0) {die "write failed: $!";}
|
||||
@@ -233,7 +233,7 @@ sub do_boot {
|
||||
# NOTE: the text above almost fills the first 512 bytes !!
|
||||
# don't add more text, all has been said anyway !!
|
||||
|
||||
$rc = $fh->seek(0100, SEEK_SET);
|
||||
$rc = sysseek($fh ,0100, SEEK_SET);
|
||||
if (not $rc) {die "seek failed: $!";}
|
||||
$rc = syswrite($fh, $buf, length($buf));
|
||||
if ($rc<=0) {die "write failed: $!";}
|
||||
@@ -268,8 +268,8 @@ sub print_help {
|
||||
}
|
||||
|
||||
print "\n";
|
||||
print " RM03 is accepted as an alias for RM02 (same capacity)\n";
|
||||
print " RP05 is accepted as an alias for RP04 (same capacity)\n";
|
||||
print " RM02 is accepted as an alias for RM03 (same capacity)\n";
|
||||
print " RP04 is accepted as an alias for RP05 (same capacity)\n";
|
||||
|
||||
print "\n";
|
||||
print "currently supported initialization patterns:\n";
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = "w11 - cpp"
|
||||
PROJECT_NUMBER = 0.66
|
||||
PROJECT_NUMBER = 0.70
|
||||
PROJECT_BRIEF = "Backend server for Rlink and w11"
|
||||
PROJECT_LOGO =
|
||||
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/cpp
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = "w11 - tcl"
|
||||
PROJECT_NUMBER = 0.66
|
||||
PROJECT_NUMBER = 0.70
|
||||
PROJECT_BRIEF = "Backend server for Rlink and w11"
|
||||
PROJECT_LOGO =
|
||||
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/tcl
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = "w11 - vhd"
|
||||
PROJECT_NUMBER = 0.66
|
||||
PROJECT_NUMBER = 0.70
|
||||
PROJECT_BRIEF = "W11 CPU core and support modules"
|
||||
PROJECT_LOGO =
|
||||
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/vhd
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
*license.pdf
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: 211bsd_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
|
||||
# $Id: 211bsd_rk_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for 211bsd RK05 based system
|
||||
#
|
||||
@@ -10,6 +10,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp (211bsd uses parity -> use 7 bit mode)
|
||||
@@ -24,6 +25,7 @@ cpu0rka3 att 211bsd_rk_bin.dsk
|
||||
cpu0rka4 att 211bsd_rk_usr.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rka0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: README_211bsd_rkset.txt 680 2015-05-14 13:29:46Z mueller $
|
||||
# $Id: README_211bsd_rkset.txt 688 2015-06-05 13:15:10Z mueller $
|
||||
|
||||
Notes on oskit: 2.11BSD system on RK05 volumes
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
*license.pdf
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: 211bsd_rl_boot.tcl 633 2015-01-11 22:58:48Z mueller $
|
||||
# $Id: 211bsd_rl_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for 211bsd RL02 based system
|
||||
#
|
||||
@@ -10,6 +10,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp (211bsd uses parity -> use 7 bit mode)
|
||||
@@ -21,6 +22,7 @@ cpu0rla0 att 211bsd_rl_root.dsk
|
||||
cpu0rla1 att 211bsd_rl_usr.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rla0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: README_211bsd_rlset.txt 680 2015-05-14 13:29:46Z mueller $
|
||||
# $Id: README_211bsd_rlset.txt 688 2015-06-05 13:15:10Z mueller $
|
||||
|
||||
Notes on oskit: 2.11BSD system on RL02 volumes
|
||||
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
*.dsk
|
||||
*.log
|
||||
*.tgz
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
*license.pdf
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: 211bsd_rp_boot.tcl 686 2015-06-04 21:08:08Z mueller $
|
||||
# $Id: 211bsd_rp_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for 211bsd RP06 based system
|
||||
#
|
||||
@@ -10,6 +10,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp (211bsd uses parity -> use 7 bit mode)
|
||||
@@ -23,6 +24,7 @@ cpu0rpa1 set type rp06
|
||||
cpu0rpa0 att 211bsd_rp.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rpa0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: README_211bsd_rpset.txt 680 2015-05-14 13:29:46Z mueller $
|
||||
# $Id: README_211bsd_rpset.txt 688 2015-06-05 13:15:10Z mueller $
|
||||
|
||||
Notes on oskit: 2.11BSD system on a RP06 volume
|
||||
|
||||
|
||||
@@ -3,5 +3,6 @@
|
||||
*.log
|
||||
*.tap
|
||||
*.tgz
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
*license.pdf
|
||||
|
||||
30
tools/oskit/211bsd_tm/211bsd_rm05_boot.tcl
Normal file
30
tools/oskit/211bsd_tm/211bsd_rm05_boot.tcl
Normal file
@@ -0,0 +1,30 @@
|
||||
# $Id: 211bsd_rm05_boot.tcl 690 2015-06-07 18:23:51Z mueller $
|
||||
#
|
||||
# Setup file for 211bsd RM05 based system
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# console_starter -d DL0 &
|
||||
# console_starter -d DL1 &
|
||||
# ti_w11 -xxx @211bsd_rp_boot.tcl ( -xxx depends on sim or fpga connect)
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp (211bsd uses parity -> use 7 bit mode)
|
||||
rw11::setup_tt "cpu0" {to7bit 1}
|
||||
rw11::setup_lp
|
||||
|
||||
# mount disks
|
||||
cpu0rpa0 set type rm05
|
||||
cpu0rpa1 set type rm05
|
||||
|
||||
cpu0rpa0 att 211bsd_rm05.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rpa0
|
||||
26
tools/oskit/211bsd_tm/211bsd_tm_rm05_boot.scmd
Normal file
26
tools/oskit/211bsd_tm/211bsd_tm_rm05_boot.scmd
Normal file
@@ -0,0 +1,26 @@
|
||||
; $Id: 211bsd_tm_rm05_boot.scmd 690 2015-06-07 18:23:51Z mueller $
|
||||
;
|
||||
; Setup file for creating a 211bsd RM05 system from a TM11 dist kit
|
||||
;
|
||||
; Usage:
|
||||
;
|
||||
; pdp11 211bsd_tm_boot.scmd
|
||||
;
|
||||
do ../../simh/setup_w11a_max.scmd
|
||||
set tto 7b
|
||||
set dlo0 7b
|
||||
;
|
||||
set rp0 rm05
|
||||
set rp1 rm05
|
||||
;
|
||||
set rl0 rl02
|
||||
set rl1 rl02
|
||||
set rl2 rl02
|
||||
set rl3 rl02
|
||||
;
|
||||
set tm0 locked
|
||||
;
|
||||
att rp0 211bsd_rm05.dsk
|
||||
att tm0 211bsd_tm.tap
|
||||
;
|
||||
boo tm0
|
||||
34
tools/oskit/211bsd_tm/211bsd_tm_rm05_boot.tcl
Normal file
34
tools/oskit/211bsd_tm/211bsd_tm_rm05_boot.tcl
Normal file
@@ -0,0 +1,34 @@
|
||||
# $Id: 211bsd_tm_rm05_boot.tcl 690 2015-06-07 18:23:51Z mueller $
|
||||
#
|
||||
# Setup file for creating a 211bsd RM05 system from a TM11 dist kit
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# console_starter -d DL0 &
|
||||
# console_starter -d DL1 &
|
||||
# create_disk --typ=rm05 --bad 211bsd_rm05.dsk
|
||||
# ti_w11 -xxx @211bsd_tm_boot.tcl ( -xxx depends on sim or fpga connect)
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp (211bsd uses parity -> use 7 bit mode)
|
||||
rw11::setup_tt "cpu0" {to7bit 1}
|
||||
rw11::setup_lp
|
||||
|
||||
# mount disks
|
||||
cpu0rpa0 set type rm05
|
||||
cpu0rpa1 set type rm05
|
||||
|
||||
cpu0rpa0 att 211bsd_rm05.dsk
|
||||
|
||||
# mount tapes
|
||||
cpu0tma0 att 211bsd_tm.tap?wpro
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot tma0
|
||||
@@ -1,4 +1,4 @@
|
||||
; $Id: $
|
||||
; $Id: 211bsd_tm_rp06_boot.scmd 690 2015-06-07 18:23:51Z mueller $
|
||||
;
|
||||
; Setup file for creating a 211bsd RP06 system from a TM11 dist kit
|
||||
;
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: $
|
||||
# $Id: 211bsd_tm_rp06_boot.tcl 690 2015-06-07 18:23:51Z mueller $
|
||||
#
|
||||
# Setup file for creating a 211bsd RP06 system from a TM11 dist kit
|
||||
#
|
||||
@@ -11,6 +11,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp (211bsd uses parity -> use 7 bit mode)
|
||||
@@ -27,6 +28,7 @@ cpu0rpa0 att 211bsd_rp06.dsk
|
||||
cpu0tma0 att 211bsd_tm.tap?wpro
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot tma0
|
||||
@@ -8,6 +8,7 @@ Notes on oskit: 2.11BSD system on a TM11 tape distribution kit
|
||||
2. Installation
|
||||
3. Usage
|
||||
4. Install 211bsd from tape on a RP06 disk
|
||||
5. Install 211bsd from tape on a RM05 disk
|
||||
|
||||
1. General remarks ---------------------------------------------------
|
||||
|
||||
@@ -32,14 +33,21 @@ Notes on oskit: 2.11BSD system on a TM11 tape distribution kit
|
||||
|
||||
3. Usage -------------------------------------------------------------
|
||||
|
||||
- This is a tape distribution kit and tailoed to be installed on RP06 disks.
|
||||
So first step is to create a disk image which will hold the system
|
||||
- This is a tape distribution kit and tailoed to be installed on massbus
|
||||
disks of RP or RM type. The 211bsd system doesn't contain a ready to
|
||||
used boot block for RP07 disks, while RM03 and RP05 disks are too small
|
||||
for a full 211bsd system. Therefore RP06 and RM05 disks are the supported
|
||||
disk types.
|
||||
|
||||
So first step is to create a disk image, use one of
|
||||
|
||||
create_disk --typ=rp06 --bad 211bsd_rp06.dsk
|
||||
create_disk --typ=rm05 --bad 211bsd_rm05.dsk
|
||||
|
||||
- Start backend server and boot system (see section 3 in w11a_os_guide.txt)
|
||||
boot script: 211bsd_tm_boot.tcl
|
||||
example: ti_w11 <opt> @211bsd_tm_boot.tcl
|
||||
boot script: 211bsd_tm_rp06_boot.tcl or
|
||||
211bsd_tm_rm05_boot.tcl
|
||||
example: ti_w11 <opt> @211bsd_tm_rp06_boot.tcl
|
||||
where <opt> is the proper option set for the board.
|
||||
|
||||
- Hit <ENTER> in the xterm window to connnect to backend server.
|
||||
@@ -225,7 +233,7 @@ End of tape
|
||||
|
||||
erase, kill ^U, intr ^C
|
||||
|
||||
!! make system bootable
|
||||
!! make system bootable {!! different for RM05 !!}
|
||||
# dd if=/mdec/hpuboot of=/dev/rxp0a count=1
|
||||
1+0 records in
|
||||
1+0 records out
|
||||
@@ -272,3 +280,59 @@ on ti_w11 prompt
|
||||
: ## <cr>
|
||||
|
||||
from now on like for README_211bsd_rpset.txt
|
||||
|
||||
5. Install 211bsd from tape on a RM05 disk ---------------------------
|
||||
|
||||
The procedure is very similar to an RP06 install, the only differences are
|
||||
- disk partitioning (creating disklabel)
|
||||
- setup of boot block
|
||||
- initializing the 'c' file system
|
||||
|
||||
In the following only these differences are briefly summarized:
|
||||
|
||||
- use 211bsd_tm_rm05_boot.tcl (instead of 211bsd_tm_rp06_boot.tcl)
|
||||
|
||||
- in disklabel use different sizes and offsets
|
||||
|
||||
'a' size [500384]: ## 34c
|
||||
'b' offset [0]: ## 34c
|
||||
'b' size [0]: ## 13c
|
||||
'c' offset [0]: ## 47c
|
||||
'c' size [0]: ## 775c
|
||||
|
||||
- the final 'd' or display in disklabel show show
|
||||
|
||||
type: SMD
|
||||
disk: SMD
|
||||
label: DEFAULT
|
||||
flags:
|
||||
bytes/sector: 512
|
||||
sectors/track: 32
|
||||
tracks/cylinder: 19
|
||||
sectors/cylinder: 608
|
||||
cylinders: 823
|
||||
rpm: 3600
|
||||
drivedata: 0 0 0 0 0
|
||||
|
||||
3 partitions:
|
||||
# size offset fstype [fsize bsize]
|
||||
a: 20672 0 2.11BSD 1024 1024 # (Cyl. 0 - 33)
|
||||
b: 7904 20672 swap # (Cyl. 34 - 46)
|
||||
c: 471200 28576 2.11BSD 1024 1024 # (Cyl. 47 - 821)
|
||||
|
||||
- after first boot write the correct boot block
|
||||
|
||||
# dd if=/mdec/rm05uboot of=/dev/rxp0a count=1
|
||||
|
||||
Note: the boot code has the disk geometry hard coded, so using the right
|
||||
one is essential. RP06 uses hpuboot, while RM05 uses rm05uboot !!
|
||||
|
||||
- to create file system on partition c use
|
||||
|
||||
# /sbin/mkfs -m 2 -n 304 -i 4096 -s 235600 /dev/rxp0c
|
||||
|
||||
- the final system should give a 'df' output like
|
||||
|
||||
Filesystem 1K-blocks Used Avail Capacity Mounted on
|
||||
root 10173 4503 5670 44% /
|
||||
/dev/xp0c 231917 87043 144874 38% /usr
|
||||
|
||||
7
tools/oskit/hook_blkdev_trace.tcl
Normal file
7
tools/oskit/hook_blkdev_trace.tcl
Normal file
@@ -0,0 +1,7 @@
|
||||
# $Id: hook_blkdev_trace.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
puts "hook: trace all block devices to rlc.log"
|
||||
rlc set logfile rlc.log
|
||||
cpu0rka set trace 2
|
||||
cpu0rla set trace 2
|
||||
cpu0rpa set trace 2
|
||||
cpu0tma set trace 2
|
||||
8
tools/oskit/hook_ibmon_rka.tcl
Normal file
8
tools/oskit/hook_ibmon_rka.tcl
Normal file
@@ -0,0 +1,8 @@
|
||||
# $Id: hook_ibmon_rka.tcl 690 2015-06-07 18:23:51Z mueller $
|
||||
puts "hook: start ibmon for rka"
|
||||
package require ibd_ibmon
|
||||
ibd_ibmon::setup
|
||||
ibd_ibmon::stop
|
||||
cpu0 cp -wibr im.lolim [cpu0 imap rka.ds] \
|
||||
-wibr im.hilim [cpu0 imap rka.mr]
|
||||
ibd_ibmon::start
|
||||
8
tools/oskit/hook_ibmon_rpa.tcl
Normal file
8
tools/oskit/hook_ibmon_rpa.tcl
Normal file
@@ -0,0 +1,8 @@
|
||||
# $Id: hook_ibmon_rpa.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
puts "hook: start ibmon for rpa"
|
||||
package require ibd_ibmon
|
||||
ibd_ibmon::setup
|
||||
ibd_ibmon::stop
|
||||
cpu0 cp -wibr im.lolim [cpu0 imap rpa.cs1] \
|
||||
-wibr im.hilim [cpu0 imap rpa.cs3]
|
||||
ibd_ibmon::start
|
||||
8
tools/oskit/hook_ibmon_tma.tcl
Normal file
8
tools/oskit/hook_ibmon_tma.tcl
Normal file
@@ -0,0 +1,8 @@
|
||||
# $Id: hook_ibmon_tma.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
puts "hook: start ibmon for tma"
|
||||
package require ibd_ibmon
|
||||
ibd_ibmon::setup
|
||||
ibd_ibmon::stop
|
||||
cpu0 cp -wibr im.lolim [cpu0 imap tma.sr] \
|
||||
-wibr im.hilim [cpu0 imap tma.rl]
|
||||
ibd_ibmon::start
|
||||
@@ -1,4 +1,5 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: rsx11m-31_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
|
||||
# $Id: rsx11m-31_rk_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for RSX11-M V3.1 RK05 based system
|
||||
#
|
||||
@@ -10,6 +10,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp,pp (enable rx rate limiter on old DEC OS)
|
||||
@@ -23,6 +24,7 @@ cpu0rka1 att RSX11M_V3.1_SYSTEM1.dsk
|
||||
cpu0rka2 att RSX11M_USER.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rka0
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: rsx11m-40_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
|
||||
# $Id: rsx11m-40_rk_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for RSX11-M V4.0 RK05 based system
|
||||
#
|
||||
@@ -10,6 +10,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp,pp (enable rx rate limiter on old DEC OS)
|
||||
@@ -23,6 +24,7 @@ cpu0rka1 att RSX11M_V4.0_SYSTEM1.dsk
|
||||
cpu0rka2 att RSX11M_USER.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rka0
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
*license.pdf
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: rsx11mp-30_rp_boot.tcl 679 2015-05-13 17:38:46Z mueller $
|
||||
# $Id: rsx11mp-30_rp_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for RSX11-M+ V3.0 RP06 based system
|
||||
#
|
||||
@@ -10,6 +10,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp (211bsd uses parity -> use 7 bit mode)
|
||||
@@ -23,6 +24,7 @@ cpu0rpa1 set type rp06
|
||||
cpu0rpa0 att rsx11mp-30.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rpa0
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: rt11-40_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
|
||||
# $Id: rt11-40_rk_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for RT-11 V4.0 RK05 based system
|
||||
#
|
||||
@@ -9,6 +9,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp,pp (single console; enable rx rate limiter on old DEC OS)
|
||||
@@ -20,6 +21,7 @@ rw11::setup_pp
|
||||
cpu0rka0 att rtv4_rk.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rka0
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp,pp (single console; enable rx rate limiter on old DEC OS)
|
||||
@@ -20,6 +21,7 @@ rw11::setup_pp
|
||||
cpu0rla0 att RT11_V5.3_SYSTEM.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rla0
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
*license.txt
|
||||
*license.pdf
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: uv5_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
|
||||
# $Id: uv5_rk_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for Unix V5 RK05 based system
|
||||
#
|
||||
@@ -8,6 +8,7 @@
|
||||
# ti_w11 -xxx @uv5_boot.tcl ( -xxx depends on sim or fpga connect)
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp (uses only 1 console; uses parity -> use 7 bit mode)
|
||||
@@ -18,6 +19,7 @@ rw11::setup_lp
|
||||
cpu0rka0 att unix_v5_rk.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rka0
|
||||
|
||||
@@ -2,3 +2,4 @@
|
||||
*.dat
|
||||
*.dsk
|
||||
*.log
|
||||
*hook.tcl
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: xxdp22_rl_boot.tcl 654 2015-03-01 18:45:38Z mueller $
|
||||
# $Id: xxdp22_rl_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for XXDP V2.2 RL02 based system
|
||||
#
|
||||
@@ -9,6 +9,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp,pp (single console; enable rx rate limiter on old DEC OS)
|
||||
@@ -20,6 +21,7 @@ rw11::setup_pp
|
||||
cpu0rla0 att xxdp22.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rla0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: xxdp25_rl_boot.tcl 654 2015-03-01 18:45:38Z mueller $
|
||||
# $Id: xxdp25_rl_boot.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Setup file for XXDP V2.5 RL02 based system
|
||||
#
|
||||
@@ -9,6 +9,7 @@
|
||||
#
|
||||
|
||||
# setup w11 cpu
|
||||
rutil::dohook "preinithook"
|
||||
puts [rlw]
|
||||
|
||||
# setup tt,lp,pp (single console; enable rx rate limiter on old DEC OS)
|
||||
@@ -20,6 +21,7 @@ rw11::setup_pp
|
||||
cpu0rla0 att xxdp25.dsk
|
||||
|
||||
# and boot
|
||||
rutil::dohook "preboothook"
|
||||
rw11::cpumon
|
||||
rw11::cpucons
|
||||
cpu0 boot rla0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// $Id: Rw11CntlTM11.cpp 686 2015-06-04 21:08:08Z mueller $
|
||||
// $Id: Rw11CntlTM11.cpp 690 2015-06-07 18:23:51Z mueller $
|
||||
//
|
||||
// Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
// Other credits:
|
||||
@@ -15,13 +15,14 @@
|
||||
//
|
||||
// Revision History:
|
||||
// Date Rev Version Comment
|
||||
// 2015-06-06 690 1.0.1 BUGFIX: AddFastExit() check for Virt() defined
|
||||
// 2015-06-04 686 1.0 Initial version
|
||||
// 2015-05-17 683 0.1 First draft
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version $Id: Rw11CntlTM11.cpp 686 2015-06-04 21:08:08Z mueller $
|
||||
\version $Id: Rw11CntlTM11.cpp 690 2015-06-07 18:23:51Z mueller $
|
||||
\brief Implemenation of Rw11CntlTM11.
|
||||
*/
|
||||
|
||||
@@ -239,20 +240,20 @@ bool Rw11CntlTM11::BootCode(size_t unit, std::vector<uint16_t>& code,
|
||||
0046524, // boot_start: "TM"
|
||||
0012706, kBOOT_START, // mov #boot_start, sp
|
||||
0012700, uint16_t(unit), // mov #unit_num, r0
|
||||
0012701, 0172526, // mov #172526, r1 ; mtcma
|
||||
0005011, // clr (r1)
|
||||
0012741, 0177777, // mov #-1, -(r1) ; mtbrc
|
||||
0012701, 0172526, // mov #172526, r1 ; #tmba
|
||||
0005011, // clr (r1) ; tmba = 0
|
||||
0012741, 0177777, // mov #-1, -(r1) ; tmbc = -1
|
||||
0010002, // mov r0,r2
|
||||
0000302, // swab r2
|
||||
0062702, 0060011, // add #60011, r2
|
||||
0010241, // mov r2, -(r1) ; space + go
|
||||
0105711, // tstb (r1) ; mtc
|
||||
0010241, // mov r2, -(r1) ; tmcr = space + go
|
||||
0105711, // tstb (r1) ; test tmcr.rdy
|
||||
0100376, // bpl .-2
|
||||
0010002, // mov r0,r2
|
||||
0010002, // mov r0,r2 ; note: tmbc=0 now
|
||||
0000302, // swab r2
|
||||
0062702, 0060003, // add #60003, r2
|
||||
0010211, // mov r2, (r1) ; read + go
|
||||
0105711, // tstb (r1) ; mtc
|
||||
0062702, 0060003, // add #60003, r2 ; note: tmbc still = 0!
|
||||
0010211, // mov r2, (r1) ; tmcr = read + go
|
||||
0105711, // tstb (r1) ; test tmcr.rdy
|
||||
0100376, // bpl .-2
|
||||
0005002, // clr r2
|
||||
0005003, // clr r3
|
||||
@@ -313,6 +314,9 @@ int Rw11CntlTM11::AttnHandler(RlinkServer::AttnArgs& args)
|
||||
|
||||
uint32_t addr = uint32_t(ea)<<16 | uint32_t(tmba);
|
||||
|
||||
// Note: a zero tmbc translates into nbyt=64k !
|
||||
// correct behaviour, the boot loaded actually issues a read
|
||||
// with tmbc=0 to read the boot block into memory !!
|
||||
uint32_t nbyt = (~uint32_t(tmbc)&0xffff) + 1; // transfer size in bytes
|
||||
|
||||
//Rw11Cpu& cpu = Cpu();
|
||||
@@ -503,11 +507,17 @@ void Rw11CntlTM11::AddFastExit(RlinkCommandList& clist, int opcode, size_t ndone
|
||||
Rw11Cpu& cpu = Cpu();
|
||||
|
||||
uint16_t tmcr = 0;
|
||||
uint16_t tmds = kTMRL_M_ONL;
|
||||
if (unit.Virt()->WProt()) tmds |= kTMRL_M_WRL;
|
||||
if (unit.Virt()->Bot()) tmds |= kTMRL_M_BOT;
|
||||
if (unit.Virt()->Eot()) tmds |= kTMRL_M_EOT;
|
||||
uint16_t tmds = 0;
|
||||
|
||||
// AddFastExit() is also called after UNLOAD, which calls unit.Detach()
|
||||
// So unlike in all other cases, Virt() may be 0, so check on this
|
||||
if (unit.Virt()) {
|
||||
tmds |= kTMRL_M_ONL;
|
||||
if (unit.Virt()->WProt()) tmds |= kTMRL_M_WRL;
|
||||
if (unit.Virt()->Bot()) tmds |= kTMRL_M_BOT;
|
||||
if (unit.Virt()->Eot()) tmds |= kTMRL_M_EOT;
|
||||
}
|
||||
|
||||
switch (opcode) {
|
||||
|
||||
case Rw11VirtTape::kOpCodeOK:
|
||||
@@ -540,8 +550,9 @@ void Rw11CntlTM11::AddFastExit(RlinkCommandList& clist, int opcode, size_t ndone
|
||||
<< (err ? " err " :" ok ")
|
||||
<< " un=" << unum
|
||||
<< " cr=" << RosPrintBvi(tmcr,8)
|
||||
<< " ds=" << RosPrintBvi(tmds,8)
|
||||
<< " bc=" << RosPrintBvi(tmbc,8);
|
||||
<< " "
|
||||
<< " bc=" << RosPrintBvi(tmbc,8)
|
||||
<< " ds=" << RosPrintBvi(tmds,8);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// $Id: Rw11CntlTM11.hpp 686 2015-06-04 21:08:08Z mueller $
|
||||
// $Id: Rw11CntlTM11.hpp 690 2015-06-07 18:23:51Z mueller $
|
||||
//
|
||||
// Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
//
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version $Id: Rw11CntlTM11.hpp 686 2015-06-04 21:08:08Z mueller $
|
||||
\version $Id: Rw11CntlTM11.hpp 690 2015-06-07 18:23:51Z mueller $
|
||||
\brief Declaration of class Rw11CntlTM11.
|
||||
*/
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace Retro {
|
||||
static const uint16_t kTMSR_M_EOT = kWBit10; //!< EOT: end-of-tape seen
|
||||
static const uint16_t kTMSR_M_RLE = kWBit09; //!< RLE: record lgth error
|
||||
static const uint16_t kTMSR_M_BTE = kWBit08; //!< BTE: bad tape error
|
||||
static const uint16_t kTMSR_M_NXM = kWBit07; //!< NXM: non-existant mem
|
||||
static const uint16_t kTMSR_M_NXM = kWBit07; //!< NXM: non-existent mem
|
||||
static const uint16_t kTMSR_M_ONL = kWBit06; //!< ONL: online
|
||||
static const uint16_t kTMSR_M_BOT = kWBit05; //!< BOT: at begin-of-tape
|
||||
static const uint16_t kTMSR_M_WRL = kWBit02; //!< WRL: write locked
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: rhrp_all.dat 683 2015-05-17 21:54:35Z mueller $
|
||||
# $Id: rhrp_all.dat 692 2015-06-21 11:53:24Z mueller $
|
||||
#
|
||||
## steering file for all rhrp tests
|
||||
#
|
||||
@@ -6,3 +6,4 @@ test_rhrp_basics.tcl
|
||||
test_rhrp_regs.tcl
|
||||
test_rhrp_func_reg.tcl
|
||||
test_rhrp_int.tcl
|
||||
test_rhrp_int2.tcl
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# $Id: test_rhrp_func_reg.tcl 683 2015-05-17 21:54:35Z mueller $
|
||||
# $Id: test_rhrp_func_reg.tcl 692 2015-06-21 11:53:24Z mueller $
|
||||
#
|
||||
# Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2015-06-20 692 1.0.1 de-configure all drives at begin
|
||||
# 2015-03-29 660 1.0 Initial version
|
||||
#
|
||||
# Test functions - register level
|
||||
@@ -19,6 +20,16 @@ ibd_rhrp::setup
|
||||
rlc set statmask $rw11::STAT_DEFMASK
|
||||
rlc set statvalue 0
|
||||
|
||||
# de-configure all drives (and clear errros and reset vv)
|
||||
$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv]
|
||||
|
||||
# configure drives
|
||||
$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol] \
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# $Id: test_rhrp_int.tcl 683 2015-05-17 21:54:35Z mueller $
|
||||
# $Id: test_rhrp_int.tcl 692 2015-06-21 11:53:24Z mueller $
|
||||
#
|
||||
# Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2015-06-20 692 1.1.1 de-configure all drives at begin
|
||||
# 2015-05-04 674 1.1 w11a start/stop/suspend overhaul
|
||||
# 2015-03-29 667 1.0 Initial version
|
||||
#
|
||||
@@ -20,6 +21,16 @@ ibd_rhrp::setup
|
||||
rlc set statmask $rw11::STAT_DEFMASK
|
||||
rlc set statvalue 0
|
||||
|
||||
# de-configure all drives (and clear errros and reset vv)
|
||||
$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv]
|
||||
|
||||
# configure drives
|
||||
$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1} mol] \
|
||||
|
||||
337
tools/tbench/rhrp/test_rhrp_int2.tcl
Normal file
337
tools/tbench/rhrp/test_rhrp_int2.tcl
Normal file
@@ -0,0 +1,337 @@
|
||||
# $Id: test_rhrp_int2.tcl 692 2015-06-21 11:53:24Z mueller $
|
||||
#
|
||||
# Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2015-05-20 692 1.0 Initial version
|
||||
#
|
||||
# Test interrupt response
|
||||
# A:
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
rlc log "test_rhrp_int2: test interrupt response for nested xfer+seek --------"
|
||||
rlc log " setup: unit 0-3: RP06(mol)"
|
||||
package require ibd_rhrp
|
||||
ibd_rhrp::setup
|
||||
|
||||
rlc set statmask $rw11::STAT_DEFMASK
|
||||
rlc set statvalue 0
|
||||
|
||||
# de-configure all drives (and clear errros and reset vv)
|
||||
$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv]
|
||||
|
||||
# configure drives
|
||||
$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS dpr mol] \
|
||||
-wibr rpa.dt $ibd_rhrp::DTE_RP06 \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS dpr mol] \
|
||||
-wibr rpa.dt $ibd_rhrp::DTE_RP06 \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS dpr mol] \
|
||||
-wibr rpa.dt $ibd_rhrp::DTE_RP06 \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS dpr mol] \
|
||||
-wibr rpa.dt $ibd_rhrp::DTE_RP06
|
||||
|
||||
# clear errors: cs1.tre=1 via unit 0
|
||||
$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
|
||||
-wma rpa.cs1 [regbld ibd_rhrp::CS1 tre] \
|
||||
-wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_DCLR] \
|
||||
-wma rpa.as [regbld ibd_rhrp::AS u3 u2 u1 u0] \
|
||||
-rma rpa.ds -edata [regbld ibd_rhrp::DS dpr mol dry]
|
||||
|
||||
# do pack ack on all drives
|
||||
$cpu cp -wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 0}] \
|
||||
-wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_PACK] \
|
||||
-wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 1}] \
|
||||
-wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_PACK] \
|
||||
-wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 2}] \
|
||||
-wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_PACK] \
|
||||
-wma rpa.cs2 [regbld ibd_rhrp::CS2 {unit 3}] \
|
||||
-wma rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::FUNC_PACK]
|
||||
|
||||
# load test code
|
||||
$cpu ldasm -lst lst -sym sym {
|
||||
.include |lib/defs_cpu.mac|
|
||||
.include |lib/defs_rp.mac|
|
||||
;
|
||||
.include |lib/vec_cpucatch.mac|
|
||||
;
|
||||
. = 000254 ; setup RHRP interrupt vector
|
||||
v..rp: .word vh.rp
|
||||
.word cp.pr7
|
||||
;
|
||||
. = 1000 ; data area
|
||||
stack:
|
||||
ibuf: .blkw <3+1+<3*3>> ; input buffer (3 for xfer; #seek; 3 per seek)
|
||||
obuf: .blkw <<4*6>+<4*6>+1> ; output buffer
|
||||
;
|
||||
sdone: .word 0 ; seek done
|
||||
idone: .word 0 ; interrupt done
|
||||
apat: .word 0 ; attn pattern
|
||||
;
|
||||
. = 2000 ; code area
|
||||
start: spl 7 ; lock out interrupts
|
||||
clr sdone ; clear flags
|
||||
clr idone
|
||||
;
|
||||
mov #obuf,r5 ; clear obuf
|
||||
mov #8.,r2 ; clear 8 sections with 6 words
|
||||
1$: clr (r5)+
|
||||
clr (r5)+
|
||||
clr (r5)+
|
||||
clr (r5)+
|
||||
clr (r5)+
|
||||
clr (r5)+
|
||||
sob r2,1$
|
||||
clr (r5)+
|
||||
;
|
||||
mov #obuf,r5 ; setup obuf pointer
|
||||
mov #ibuf,r0 ; setup regs from ibuf
|
||||
clrb @#rp.cs2 ; cs2 (unit=0)
|
||||
mov (r0)+,@#rp.da ; da
|
||||
mov (r0)+,@#rp.dc ; dc
|
||||
mov (r0)+,@#rp.cs1 ; cs1
|
||||
;
|
||||
mov #177000,(r5)+ ; tag: regs after xfer started
|
||||
mov @#rp.cs1,(r5)+ ; cs1
|
||||
mov @#rp.cs2,(r5)+ ; cs2
|
||||
mov @#rp.er1,(r5)+ ; er1
|
||||
mov @#rp.ds,(r5)+ ; ds
|
||||
mov @#rp.as,(r5)+ ; as
|
||||
;
|
||||
mov #1,r2 ; next unit
|
||||
mov #2,r3 ; next abit
|
||||
mov (r0)+,r1 ; # of seeks
|
||||
beq 30$
|
||||
;
|
||||
20$: movb r2,@#rp.cs2 ; cs2 (unit=i)
|
||||
mov (r0)+,@#rp.da ; da
|
||||
mov (r0)+,@#rp.dc ; dc
|
||||
mov (r0)+,@#rp.cs1 ; cs1
|
||||
;
|
||||
mov r2,(r5)
|
||||
add #177100,(r5)+ ; tag: regs after seek started
|
||||
mov @#rp.cs1,(r5)+ ; cs1
|
||||
mov @#rp.cs2,(r5)+ ; cs2
|
||||
mov @#rp.er1,(r5)+ ; er1
|
||||
mov @#rp.ds,(r5)+ ; ds
|
||||
mov @#rp.as,(r5)+ ; as
|
||||
;
|
||||
bis r3,apat ; build apat
|
||||
inc r2 ; next unit
|
||||
asl r3 ; next abit
|
||||
;
|
||||
sob r1,20$
|
||||
;
|
||||
30$: inc sdone ; signal seeks queued
|
||||
spl 0 ; allow interrupts
|
||||
wpnt: wait
|
||||
|
||||
1$: tst idone ; wait for interrupt
|
||||
beq 1$
|
||||
mov #177777,(r5)+ ; tag: all done
|
||||
halt ; halt if done
|
||||
stop:
|
||||
;
|
||||
|
||||
; RHRP interrupt handler
|
||||
vh.rp: clrb @#rp.cs2 ; cs2 (unit=0)
|
||||
mov #177200,(r5)+ ; tag: regs after seek started
|
||||
mov @#rp.cs1,(r5)+ ; cs1
|
||||
mov @#rp.cs2,(r5)+ ; cs2
|
||||
mov @#rp.er1,(r5)+ ; er1
|
||||
mov @#rp.ds,(r5)+ ; ds
|
||||
mov @#rp.as,r4 ;
|
||||
mov r4,(r5)+ ; as
|
||||
;
|
||||
mov #3,r1 ; max # of seeks
|
||||
mov #1,r2 ; next unit
|
||||
mov #2,r3 ; next abit
|
||||
;
|
||||
1$: bit r3,r4 ; bit set in as ?
|
||||
beq 2$
|
||||
;
|
||||
movb r2,@#rp.cs2 ; cs2 (unit=i)
|
||||
mov r2,(r5)
|
||||
add #177300,(r5)+ ; tag: regs after seek started
|
||||
mov @#rp.cs1,(r5)+ ; cs1
|
||||
mov @#rp.cs2,(r5)+ ; cs2
|
||||
mov @#rp.er1,(r5)+ ; er1
|
||||
mov @#rp.ds,(r5)+ ; ds
|
||||
mov r3,@#rp.as ; clear abit in as
|
||||
mov @#rp.as,(r5)+ ; as
|
||||
;
|
||||
2$: inc r2 ; next unit
|
||||
asl r3 ; next abit
|
||||
sob r1,1$
|
||||
;
|
||||
inc idone
|
||||
rti ; and return
|
||||
}
|
||||
|
||||
##puts $lst
|
||||
|
||||
# define tmpproc for readback checks
|
||||
proc tmpproc_dotest {cpu symName opts} {
|
||||
upvar 1 $symName sym
|
||||
|
||||
set tout 10.; # FIXME_code: parameter ??
|
||||
|
||||
# setup defs hash, first defaults, than write over concrete run values
|
||||
array set defs { i.nseek 0 \
|
||||
i.idly 0
|
||||
}
|
||||
array set defs $opts
|
||||
|
||||
set fread [list func $ibd_rhrp::FUNC_READ]
|
||||
set fsear [list func $ibd_rhrp::FUNC_SEAR]
|
||||
set as 0
|
||||
|
||||
# build ibuf
|
||||
set ibuf {}
|
||||
lappend ibuf 01 0100 [regbld ibd_rhrp::CS1 ie $fread go]
|
||||
lappend ibuf $defs(i.nseek)
|
||||
for {set i 1} {$i<=$defs(i.nseek)} {incr i} {
|
||||
set da [expr { 010 + $i}]
|
||||
set dc [expr {0100 + $i}]
|
||||
lappend ibuf $da $dc [regbld ibd_rhrp::CS1 ie $fsear go]
|
||||
set as [expr {$as | [expr {01 << $i} ] } ]
|
||||
}
|
||||
|
||||
# setup idly, write ibuf, setup stack, and start cpu at start:
|
||||
$cpu cp -wibr rpa.cs1 [regbld ibd_rhrp::RCS1 \
|
||||
[list val $defs(i.idly)] \
|
||||
[list func $ibd_rhrp::RFUNC_WIDLY] ] \
|
||||
-wal $sym(ibuf) \
|
||||
-bwm $ibuf \
|
||||
-wsp $sym(stack) \
|
||||
-stapc $sym(start)
|
||||
|
||||
# here do minimal lam handling (harvest + send DONE)
|
||||
# wait for interrupt
|
||||
# and for sdone (all search issued flag) set
|
||||
rlc wtlam $tout apat
|
||||
for {set i 0} {$i<100} {incr i} {
|
||||
$cpu cp -wal $sym(sdone) \
|
||||
-rmi sdone
|
||||
if {$sdone} {break}
|
||||
}
|
||||
$cpu cp -attn \
|
||||
-wibr rpa.cs1 [ibd_rhrp::cs1_func $ibd_rhrp::RFUNC_DONE]
|
||||
|
||||
# wait for halt
|
||||
$cpu wtcpu -reset $tout
|
||||
|
||||
# check context
|
||||
$cpu cp -rpc -edata $sym(stop) \
|
||||
-rsp -edata $sym(stack) \
|
||||
-wal $sym(idone) \
|
||||
-rmi -edata 1
|
||||
|
||||
# check setup xfer
|
||||
set osxcs1 [regbld ibd_rhrp::CS1 dva ie $fread]
|
||||
set osxcs2 [regbld ibd_rhrp::CS2 or ir]
|
||||
set osxds [regbld ibd_rhrp::DS mol dpr vv]
|
||||
$cpu cp -wal $sym(obuf) \
|
||||
-rmi -edata 0177000 \
|
||||
-rmi -edata $osxcs1 \
|
||||
-rmi -edata $osxcs2 \
|
||||
-rmi -edata 0 \
|
||||
-rmi -edata $osxds \
|
||||
-rmi -edata 0
|
||||
|
||||
# check setup search
|
||||
set mskcs1sc [rutil::com16 [regbld ibd_rhrp::CS1 sc]]
|
||||
for {set i 1} {$i<=$defs(i.nseek)} {incr i} {
|
||||
set osscs1 [regbld ibd_rhrp::CS1 dva ie $fsear]
|
||||
set osscs2 [regbld ibd_rhrp::CS2 or ir [list unit $i]]
|
||||
set ossds [regbld ibd_rhrp::DS pip mol dpr vv]
|
||||
$cpu cp -rmi -edata [expr {0177100 + $i}] \
|
||||
-rmi -edata $osscs1 $mskcs1sc\
|
||||
-rmi -edata $osscs2 \
|
||||
-rmi -edata 0 \
|
||||
-rmi -edata $ossds \
|
||||
-rmi
|
||||
}
|
||||
|
||||
# check interrupt xfer
|
||||
set sc [expr {$defs(i.nseek) > 0}]
|
||||
set oixcs1 [regbld ibd_rhrp::CS1 [list sc $sc] dva rdy $fread]
|
||||
set oixcs2 [regbld ibd_rhrp::CS2 or ir]
|
||||
set oixds [regbld ibd_rhrp::DS mol dpr dry vv]
|
||||
set oixas $as
|
||||
$cpu cp -rmi -edata 0177200 \
|
||||
-rmi -edata $oixcs1 \
|
||||
-rmi -edata $oixcs2 \
|
||||
-rmi -edata 0 \
|
||||
-rmi -edata $oixds \
|
||||
-rmi -edata $oixas
|
||||
|
||||
# check interrupt search
|
||||
set oisas $as
|
||||
for {set i 1} {$i<=$defs(i.nseek)} {incr i} {
|
||||
set oiscs1 [regbld ibd_rhrp::CS1 [list sc $sc] dva rdy $fsear]
|
||||
set oiscs2 [regbld ibd_rhrp::CS2 or ir [list unit $i]]
|
||||
set oisds [regbld ibd_rhrp::DS ata mol dpr dry vv]
|
||||
set oisas [expr {$oisas & [expr {~(01<<$i)} ] }]
|
||||
$cpu cp -rmi -edata [expr {0177300 + $i}] \
|
||||
-rmi -edata $oiscs1 \
|
||||
-rmi -edata $oiscs2 \
|
||||
-rmi -edata 0 \
|
||||
-rmi -edata $oisds \
|
||||
-rmi -edata $oisas
|
||||
}
|
||||
|
||||
# ckeck end tag
|
||||
$cpu cp -rmi -edata 0177777
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
# discard pending attn to be on save side
|
||||
rlc wtlam 0.
|
||||
rlc exec -attn
|
||||
|
||||
rlc log " A1: test without search -----------------------------------"
|
||||
|
||||
set opts [list \
|
||||
i.nseek 0 \
|
||||
i.idly 0
|
||||
]
|
||||
tmpproc_dotest $cpu sym $opts
|
||||
|
||||
rlc log " A2: test with 1 search ------------------------------------"
|
||||
|
||||
set opts [list \
|
||||
i.nseek 1 \
|
||||
i.idly 10
|
||||
]
|
||||
tmpproc_dotest $cpu sym $opts
|
||||
|
||||
rlc log " A2: test with 2 search ------------------------------------"
|
||||
|
||||
set opts [list \
|
||||
i.nseek 2 \
|
||||
i.idly 10
|
||||
]
|
||||
tmpproc_dotest $cpu sym $opts
|
||||
|
||||
rlc log " A2: test with 3 search ------------------------------------"
|
||||
|
||||
set opts [list \
|
||||
i.nseek 3 \
|
||||
i.idly 10
|
||||
]
|
||||
tmpproc_dotest $cpu sym $opts
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# $Id: test_rhrp_regs.tcl 683 2015-05-17 21:54:35Z mueller $
|
||||
# $Id: test_rhrp_regs.tcl 692 2015-06-21 11:53:24Z mueller $
|
||||
#
|
||||
# Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2015-06-20 692 1.0.1 de-configure all drives at begin
|
||||
# 2015-03-29 660 1.0 Initial version
|
||||
#
|
||||
# Test register response
|
||||
@@ -24,6 +25,16 @@ ibd_rhrp::setup
|
||||
rlc set statmask $rw11::STAT_DEFMASK
|
||||
rlc set statvalue 0
|
||||
|
||||
# de-configure all drives (and clear errros and reset vv)
|
||||
$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 1] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 2] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv] \
|
||||
-wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 3] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS erp vv]
|
||||
|
||||
# configure drives
|
||||
$cpu cp -wibr rpa.cs1 [ibd_rhrp::rcs1_wunit 0] \
|
||||
-wibr rpa.ds [regbld ibd_rhrp::DS {dpr 1}] \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: util.tcl 678 2015-05-10 16:23:02Z mueller $
|
||||
# $Id: util.tcl 690 2015-06-07 18:23:51Z mueller $
|
||||
#
|
||||
# Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
#
|
||||
@@ -13,6 +13,7 @@
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2015-06-06 690 1.0.1 rdump: all online units now shown by default
|
||||
# 2015-03-21 659 1.0 Initial version
|
||||
#
|
||||
|
||||
@@ -54,7 +55,8 @@ namespace eval ibd_rhrp {
|
||||
regdsc DA {ta 12 5 2d} {sa 5 6 2d}
|
||||
regdsc CS2 {wce 14} {ned 12} {nem 11} {pge 10} {or 7} {ir 6} \
|
||||
{clr 5} {pat 4} {bai 3} {unit 2 3 d}
|
||||
regdsc DS {ata 15} {erp 14} {mol 12} {wrl 11} {lbt 10} {dpr 8} {dry 7} {vv 6}
|
||||
regdsc DS {ata 15} {erp 14} {pip 13} {mol 12} {wrl 11} {lbt 10} {dpr 8} \
|
||||
{dry 7} {vv 6} {om 0}
|
||||
regdsc ER1 {uns 14} {iae 10} {aoe 9} {rmr 2} {ilf 0}
|
||||
regdsc AS {u3 3} {u2 2} {u1 1} {u0 0}
|
||||
regdsc LA {sc 11 6 2d}
|
||||
@@ -108,7 +110,7 @@ namespace eval ibd_rhrp {
|
||||
#
|
||||
# rdump: register dump - rem view ------------------------------------------
|
||||
#
|
||||
proc rdump {{cpu "cpu0"} {unit 0}} {
|
||||
proc rdump {{cpu "cpu0"} {unit -1}} {
|
||||
set rval {}
|
||||
$cpu cp -ribr "rpa.cs1" cs1 \
|
||||
-ribr "rpa.wc" wc \
|
||||
@@ -131,19 +133,35 @@ namespace eval ibd_rhrp {
|
||||
append rval [format "\n ba: %6.6o" $ba]
|
||||
append rval [format "\n bae: %6.6o ea=%8.8o" $bae [expr {($bae<<16)|$ba}] ]
|
||||
|
||||
$cpu cp -wibr "rpa.cs1" [rcs1_wunit $unit] \
|
||||
-ribr "rpa.da" da \
|
||||
-ribr "rpa.ds" ds \
|
||||
-ribr "rpa.er1" er1 \
|
||||
-ribr "rpa.as" as \
|
||||
-ribr "rpa.la" la \
|
||||
-ribr "rpa.mr1" mr1 \
|
||||
-ribr "rpa.dt" dt \
|
||||
-ribr "rpa.sn" sn \
|
||||
-ribr "rpa.of" of \
|
||||
-ribr "rpa.dc" dc
|
||||
$cpu cp -wibr "rpa.cs1" [rcs1_wunit 0] \
|
||||
-ribr "rpa.ds" ds0 \
|
||||
-wibr "rpa.cs1" [rcs1_wunit 1] \
|
||||
-ribr "rpa.ds" ds1 \
|
||||
-wibr "rpa.cs1" [rcs1_wunit 2] \
|
||||
-ribr "rpa.ds" ds2 \
|
||||
-wibr "rpa.cs1" [rcs1_wunit 3] \
|
||||
-ribr "rpa.ds" ds3
|
||||
|
||||
append rval "\nUnit $unit registers:"
|
||||
set dslist [list $ds0 $ds1 $ds2 $ds3]
|
||||
|
||||
set ulist [expr {$unit & 0x03} ]
|
||||
if {$unit < 0} { set ulist {0 1 2 3} }
|
||||
|
||||
foreach u $ulist {
|
||||
set ds [lindex $dslist $u]
|
||||
if {$u == $unit || [regget ibd_rhrp::DS(mol) $ds] } {
|
||||
$cpu cp -wibr "rpa.cs1" [rcs1_wunit $u] \
|
||||
-ribr "rpa.da" da \
|
||||
-ribr "rpa.er1" er1 \
|
||||
-ribr "rpa.as" as \
|
||||
-ribr "rpa.la" la \
|
||||
-ribr "rpa.mr1" mr1 \
|
||||
-ribr "rpa.dt" dt \
|
||||
-ribr "rpa.sn" sn \
|
||||
-ribr "rpa.of" of \
|
||||
-ribr "rpa.dc" dc
|
||||
|
||||
append rval "\nUnit $u registers:"
|
||||
append rval [format "\n da: %6.6o %s" $da [regtxt ibd_rhrp::DA $da ]]
|
||||
append rval [format "\n ds: %6.6o %s" $ds [regtxt ibd_rhrp::DS $ds ]]
|
||||
append rval [format "\n er1: %6.6o %s" $er1 [regtxt ibd_rhrp::ER1 $er1]]
|
||||
@@ -160,6 +178,13 @@ namespace eval ibd_rhrp {
|
||||
append rval [format "\n of: %6.6o %s" $of [regtxt ibd_rhrp::OF $of ]]
|
||||
append rval [format "\n dc: %6.6o dc:%s" $dc [format "%3d" $dc]]
|
||||
|
||||
} else {
|
||||
append rval [format "\nUnit $u offline or disabled: mol:%d dpr:%s" \
|
||||
[regget ibd_rhrp::DS(mol) $ds] \
|
||||
[regget ibd_rhrp::DS(dpr) $ds] ]
|
||||
}
|
||||
}
|
||||
|
||||
return $rval
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: util.tcl 661 2015-04-03 18:28:41Z mueller $
|
||||
# $Id: util.tcl 689 2015-06-05 14:33:18Z mueller $
|
||||
#
|
||||
# Copyright 2011-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
#
|
||||
@@ -13,7 +13,8 @@
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2015-03-28 660 1,0,4 add com8 and com16
|
||||
# 2015-06-05 688 1.0.5 add dohook
|
||||
# 2015-03-28 660 1.0.4 add com8 and com16
|
||||
# 2014-12-23 619 1.0.3 regget: add check for unknown field descriptor
|
||||
# 2014-07-12 569 1.0.2 add sxt16 and sxt32
|
||||
# 2013-05-09 517 1.0.1 add optlist2arr
|
||||
@@ -240,12 +241,24 @@ namespace eval rutil {
|
||||
}
|
||||
|
||||
#
|
||||
# com16: 16 bit complement ------------------------------------------------
|
||||
# com16: 16 bit complement -------------------------------------------------
|
||||
#
|
||||
proc com16 {val} {
|
||||
return [expr (~$val) & 0xffff]
|
||||
}
|
||||
|
||||
#
|
||||
# dohook: source a hook script if is defined -------------------------------
|
||||
#
|
||||
proc dohook {name} {
|
||||
set fname "${name}.tcl"
|
||||
if {[file readable $fname]} {
|
||||
puts "dohook: $fname"
|
||||
source $fname
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
#
|
||||
# ! export reg... procs to global scope ------------------------------------
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user