1
0
mirror of https://github.com/wfjm/w11.git synced 2026-01-13 15:37:43 +00:00

Rw11CntlTM11 and tap2file updates

- tap2file
  - BUGFIX in rlmax calculation
  - add -v option
- Rw11CntlTM11
  - BUGFIX: AddNormalExit(): get tmds logic right
  - support odd record length
This commit is contained in:
wfjm 2019-07-14 09:45:17 +02:00
parent 5b5cd277ef
commit 5b52e5418d
8 changed files with 140 additions and 109 deletions

View File

@ -25,7 +25,7 @@ The full set of tests is only run for tagged releases.
### Summary
- use vivado 2019.1 as default
- finalize coverity fixups, now defect free
- finalize coverity fixups, now defect free ([see blog](https://wfjm.github.io/blogs/w11/2019-06-14-coverity-fixes-done.html))
- use SPDX license tags, remove boilerplate license disclaimers
### New features
@ -39,17 +39,24 @@ The full set of tests is only run for tagged releases.
- librtools/Rstats: add Reset(); drop operator-=() and operator*=()
- librtcltools/RtclStats: Rename Collect->Exec, not longer const; add -reset
- libr*/*: Stats() not longer const; use RtclStats::Exec()
- librtools/RparseUrl: add DirName,FileName,FileStem,FileType
- librw11/Rw11VirtDisk(File): use RfileFd
- librw11/Rw11Cpu: MemWriteByte(): use AddMembe()
- derive ReventFd and RtimerFd from Rfd
- other backend updates
- RparseUrl: add DirName,FileName,FileStem,FileType
- derive ReventFd and RtimerFd from Rfd
- Rw11VirtDiskFile,Rw11VirtTapeTap: use RfileFd
- Rw11Cpu: MemWriteByte(): use AddMembe()
- Rw11CntlTM11: support odd record length
- generic_so.mk: use -scrUuv for ar to avoid "'u' modifier ignored"
- tools/oskit/hook/hook_ibmon_*.tcl: check ibmon availability
- tap2file: add -v option
- firmware changes
- sys_w11a_arty: down-rate to 72 MHz, viv 2019.1 fails with 75 MHz
- sys_w11a_*.vmfset: add new rule for vivado 2019.1
- pdp11_vmbox: support membe for em cacc access
### Bug Fixes
- tap2file: correct rlmax calculation
- Rw11CntlTM11: AddNormalExit(): get tmds logic right
<!-- --------------------------------------------------------------------- -->
---
## <a id="w11a_V0.78">2019-06-01: [w11a_V0.78](https://github.com/wfjm/w11/releases/tag/w11a_V0.78) - rev 1158(wfjm)</a>

View File

@ -1,10 +1,11 @@
#!/usr/bin/perl -w
# $Id: tap2file 1172 2019-06-29 07:27:24Z mueller $
# $Id: tap2file 1180 2019-07-08 15:46:59Z mueller $
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright 2015-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# Revision History:
# Date Rev Version Comment
# 2019-07-08 1180 1.0.3 BUGFIX in rlmax calculation; add -v option
# 2018-12-18 1089 1.0.2 add and use bailout
# 2015-06-03 686 1.0.1 add print_usage; cleanups
# 2015-05-24 684 1.0 Initial version
@ -20,7 +21,7 @@ use Getopt::Long;
my %opts = ();
GetOptions(\%opts, "pref=s", "help")
GetOptions(\%opts, "pref=s", "v", "help")
or bailout("bad command options");
if (scalar(@ARGV) == 0 || exists $opts{help}) {
@ -53,11 +54,13 @@ while ($nb = read(IFILE, $block, 4)) {
my $metabeg = unpack("V", $block);
if ($metabeg == 0x00000000) {
printf "%4d,%5d : ---EOF---\n",$nfile,$nrec if $opts{v};
close_ofile();
$nfile += 1;
next;
}
if ($metabeg == 0xffffffff) {
printf "%4d,%5d : ---EOT---\n",$nfile,$nrec if $opts{v};
last;
}
@ -73,7 +76,13 @@ while ($nb = read(IFILE, $block, 4)) {
$rlmax = $metabeg;
} else {
$rlmin = $metabeg if $metabeg < $rlmin;
$rlmax = $metabeg if $metabeg > $rlmin;
$rlmax = $metabeg if $metabeg > $rlmax;
}
if ($opts{v}) {
printf "%4d,%5d : %6d :",$nfile,$nrec,$metabeg;
foreach (unpack("C16", $block)) {printf " %2.2x", $_};
print " ..." if $metabeg > 16;
print "\n";
}
$nrec += 1;
@ -122,5 +131,6 @@ sub print_usage {
print " ifile input tap file\n";
print " Options\n";
print " --pref=p use p as prefix for generated files\n";
print " --v verbose, trace each record\n";
print " --help this message\n";
}

View File

@ -1,11 +1,11 @@
.\" -*- nroff -*-
.\" $Id: tap2file.1 686 2015-06-04 21:08:08Z mueller $
.\" $Id: tap2file.1 1180 2019-07-08 15:46:59Z mueller $
.\"
.\" Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
.\" Copyright 2015-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
.\"
.\" ------------------------------------------------------------------
.
.TH TAP2FILE 1 2015-06-03 "Retro Project" "Retro Project Manual"
.TH TAP2FILE 1 2019-07-08 "Retro Project" "Retro Project Manual"
.\" ------------------------------------------------------------------
.SH NAME
tap2file \- split a tap format tape container into individual files
@ -14,6 +14,7 @@ tap2file \- split a tap format tape container into individual files
.
.SY tap2file
.OP \-\-pref=p
.OP \-\-v
.I FILE
.
.SY tap2file
@ -35,14 +36,20 @@ the record length is variable the minimal and the maximal record length is given
.SH OPTIONS
.
.\" ----------------------------------------------
.IP "\fB\-\-pref\fR=\fIp\fR"
.IP "\fB\-pref\fR=\fIp\fR"
use \fIp\fR as prefix to generate the names of all generated file. If not
specified the stem of the input file name is taken.
.
.\" ----------------------------------------------
.IP "\fB\-v\fR"
verbose mode, prints a message per processed record which contains file number,
record number, record length and the first 16 bytes as hex dump. EOF and
EOT markers are also indicated. Can be useful for tapes with varying record
length files or for debugging.
.
.\" ----------------------------------------------
.IP "\fB\-help\fR"
print full help text and exit.
.
.\" ------------------------------------------------------------------
.SH EXAMPLES
.IP "\fBtap2file tmscptape.tap\fR" 4
@ -67,6 +74,30 @@ byte records, and the remaining ones 10240 byte records. In case of a tape
generated by a Unix system a record length of 10240 is a good hint this the
file contains a \fBtar\fR(1) archive.
.IP "\fBtap2file -v test.tap\fR" 4
reads the file \fItest.tap\fR and writes a one line trace info for each record.
The stdout output might look like
.EX
0, 0 : 80 : 00 00 00 00 50 00 06 07 08 09 0a 0b 0c 0d ...
0, 1 : 80 : 00 00 01 00 50 00 06 07 08 09 0a 0b 0c 0d ...
0, 2 : 160 : 00 00 02 00 a0 00 06 07 08 09 0a 0b 0c 0d ...
0, 3 : 160 : 00 00 03 00 a0 00 06 07 08 09 0a 0b 0c 0d ...
0, 4 : ---EOF---
test_00.dat: 4 records, length min= 80, max= 160
1, 0 : 92 : 01 00 00 00 5c 00 06 07 08 09 0a 0b 0c 0d ...
1, 1 : 92 : 01 00 01 00 5c 00 06 07 08 09 0a 0b 0c 0d ...
1, 2 : 92 : 01 00 02 00 5c 00 06 07 08 09 0a 0b 0c 0d ...
1, 3 : 100 : 01 00 03 00 64 00 06 07 08 09 0a 0b 0c 0d ...
1, 4 : 100 : 01 00 04 00 64 00 06 07 08 09 0a 0b 0c 0d ...
1, 5 : 96 : 01 00 05 00 60 00 06 07 08 09 0a 0b 0c 0d ...
1, 6 : 96 : 01 00 06 00 60 00 06 07 08 09 0a 0b 0c 0d ...
1, 7 : ---EOF---
test_01.dat: 7 records, length min= 92, max= 100
5, 0 : ---EOF---
6, 0 : ---EOT---
.EE
.\" ------------------------------------------------------------------
.SH "SEE ALSO"
.BR file2tap (1)

View File

@ -1,20 +1,13 @@
// $Id: Rw11CntlTM11.cpp 1133 2019-04-19 18:43:00Z mueller $
//
// $Id: Rw11CntlTM11.cpp 1183 2019-07-10 18:48:41Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2015-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Other credits:
// the boot code is from the simh project and Copyright Robert M Supnik
//
// 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
// Software Foundation, either version 3, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for complete details.
//
// Revision History:
// Date Rev Version Comment
// 2019-07-10 1183 1.1 support odd record length
// 2019-07-08 1182 1.0.11 BUGFIX: AddNormalExit(): get tmds logic right
// 2019-04-19 1133 1.0.10 use ExecWibr()
// 2019-04-14 1131 1.0.9 proper unit init, call UnitSetupAll() in Start()
// 2019-02-23 1114 1.0.8 use std::bind instead of lambda
@ -30,7 +23,6 @@
// ---------------------------------------------------------------------------
/*!
\file
\brief Implemenation of Rw11CntlTM11.
*/
@ -138,10 +130,10 @@ Rw11CntlTM11::Rw11CntlTM11()
fRd_tmsr(0),
fRd_tmbc(0),
fRd_tmba(0),
fRd_bc(0),
fRd_addr(0),
fRd_nwrd(0),
fRd_fu(0),
fRd_rddone(0),
fRd_opcode(0),
fBuf(),
fRdma(this,
@ -292,10 +284,10 @@ void Rw11CntlTM11::Dump(std::ostream& os, int ind, const char* text,
os << bl << " fRd_tmsr: " << RosPrintBvi(fRd_tmsr,8) << endl;
os << bl << " fRd_tmbc: " << RosPrintBvi(fRd_tmbc,8) << endl;
os << bl << " fRd_tmba: " << RosPrintBvi(fRd_tmba,8) << endl;
os << bl << " fRd_bc: " << RosPrintf(fRd_bc,"d",6) << endl;
os << bl << " fRd_addr: " << RosPrintBvi(fRd_addr,8,18) << endl;
os << bl << " fRd_nwrd: " << RosPrintf(fRd_nwrd,"d",6) << endl;
os << bl << " fRd_fu: " << fRd_fu << endl;
os << bl << " fRd_rddone: " << RosPrintf(fRd_rddone,"d",6) << endl;
os << bl << " fRd_opcode: " << fRd_opcode << endl;
os << bl << " fBuf.size: " << RosPrintf(fBuf.size(),"d",6) << endl;
fRdma.Dump(os, ind+2, "fRdma: ", detail);
@ -400,16 +392,13 @@ int Rw11CntlTM11::AttnHandler(RlinkServer::AttnArgs& args)
fStats.Inc(kStatNFuncRead);
size_t nwalloc = (nbyt+1)/2;
if (fBuf.size() < nwalloc) fBuf.resize(nwalloc);
size_t ndone;
bool rc = unit.VirtReadRecord(nbyt, reinterpret_cast<uint8_t*>(fBuf.data()),
ndone, fRd_opcode, emsg);
fRd_rddone, fRd_opcode, emsg);
if (!rc) WriteLog("read", emsg);
if ((!rc) || ndone == 0) {
if ((!rc) || fRd_rddone == 0) {
AddFastExit(clist, fRd_opcode, 0);
} else if (ndone&0x1) { // FIXME_code: add odd rlen handling
AddErrorExit(clist, kTMCR_M_RICMD|kTMSR_M_BTE); // now just bail out !!
} else {
size_t nwdma = ndone/2;
size_t nwdma = fRd_rddone/2;
fRdma.QueueWMem(addr, fBuf.data(), nwdma, Rw11Cpu::kCPAH_M_UBM22);
}
@ -418,11 +407,7 @@ int Rw11CntlTM11::AttnHandler(RlinkServer::AttnArgs& args)
fStats.Inc((fu==kFUNC_WRITE) ? kStatNFuncWrite : kStatNFuncWrteg);
size_t nwdma = (nbyt+1)/2;
if (fBuf.size() < nwdma) fBuf.resize(nwdma);
if (nbyt&0x1) { // FIXME_code: add odd rlen handling
AddErrorExit(clist, kTMCR_M_RICMD|kTMSR_M_BTE); // now just bail out !!
} else {
fRdma.QueueRMem(addr, fBuf.data(), nwdma, Rw11Cpu::kCPAH_M_UBM22);
}
fRdma.QueueRMem(addr, fBuf.data(), nwdma, Rw11Cpu::kCPAH_M_UBM22);
} else if (fu == kFUNC_WEOF) { // Write Eof ---------------------
fStats.Inc(kStatNFuncWeof);
@ -547,16 +532,7 @@ void Rw11CntlTM11::AddFastExit(RlinkCommandList& clist, int opcode, size_t ndone
tmcr |= (kRFUNC_DONE<<kTMCR_V_FUNC);
cpu.AddWibr(clist, fBase+kTMCR, tmcr);
if (fTraceLevel>1) {
RlogMsg lmsg(LogFile());
bool err = tmcr & (kTMCR_M_RBTE);
lmsg << "-I " << Name() << (err ? ": err " : ": ok ")
<< " un=" << unum
<< " cr=" << RosPrintBvi(tmcr,8)
<< " "
<< " bc=" << RosPrintBvi(tmbc,8)
<< " ds=" << RosPrintBvi(tmds,8);
}
if (fTraceLevel>1) WriteExitLog(tmcr, fRd_addr, tmbc, tmds);
return;
}
@ -570,19 +546,26 @@ void Rw11CntlTM11::AddNormalExit(RlinkCommandList& clist, size_t ndone,
uint16_t unum = (fRd_tmcr>>kTMCR_V_UNIT) & kTMCR_B_UNIT;
Rw11UnitTM11& unit = *fspUnit[unum];
Rw11Cpu& cpu = Cpu();
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;
uint32_t addr = fRd_addr + 2*ndone;
uint16_t tmbc = fRd_tmbc + 2*uint16_t(ndone);
size_t nbyt = 2*ndone;
if (fRd_fu == kFUNC_READ) { // handle READ
if (fRd_rddone & 0x1) { // odd rlen corrections
addr += 1;
tmbc += 1;
}
switch (fRd_opcode) {
case Rw11VirtTape::kOpCodeOK:
case Rw11VirtTape::kOpCodeOK:
if (fRd_rddone & 0x1) { // write trailing byte
nbyt += 1;
Cpu().AddLalh(clist, fRd_addr + 2*ndone, Rw11Cpu::kCPAH_M_UBM22);
Cpu().AddMembe(clist, Rw11Cpu::kCPMEMBE_M_BE0);
clist.AddWreg(Rw11Cpu::kCPMEM, fBuf[ndone]);
}
break;
case Rw11VirtTape::kOpCodeRecLenErr:
@ -601,12 +584,23 @@ void Rw11CntlTM11::AddNormalExit(RlinkCommandList& clist, size_t ndone,
} else { // handle WRITE or WEIRG
int opcode;
RerrMsg emsg;
size_t nbyt = 2*ndone;
if (fRd_tmbc & 0x1) { // odd rlen corrections
nbyt -= 1;
addr -= 1;
tmbc -= 1;
}
if (!unit.VirtWriteRecord(nbyt, reinterpret_cast<uint8_t*>(fBuf.data()),
opcode, emsg))
WriteLog("write", emsg);
}
// now Virt status up-to-date, even for writes
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 tmba = uint16_t(addr & 0xfffe);
uint16_t ea = uint16_t((addr>>16)&0x0003);
tmcr |= kTMCR_M_REAENA | (ea<<kTMCR_V_REA);
@ -620,16 +614,7 @@ void Rw11CntlTM11::AddNormalExit(RlinkCommandList& clist, size_t ndone,
tmcr |= (kRFUNC_DONE<<kTMCR_V_FUNC);
cpu.AddWibr(clist, fBase+kTMCR, tmcr);
if (fTraceLevel>1) {
RlogMsg lmsg(LogFile());
bool err = tmcr & (kTMCR_M_RPAE|kTMCR_M_RRLE|kTMCR_M_RBTE|kTMCR_M_RNXM);
lmsg << "-I " << Name() << (err ? ": err " : ": ok ")
<< " un=" << unum
<< " cr=" << RosPrintBvi(tmcr,8)
<< " ad=" << RosPrintBvi(addr,8,18)
<< " bc=" << RosPrintBvi(tmbc,8)
<< " ds=" << RosPrintBvi(tmds,8);
}
if (fTraceLevel>1) WriteExitLog(tmcr, addr, tmbc, tmds);
return;
}
@ -647,5 +632,28 @@ void Rw11CntlTM11::WriteLog(const char* func, RerrMsg& emsg)
return;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
void Rw11CntlTM11::WriteExitLog(uint16_t tmcr, uint32_t addr,
uint16_t tmbc, uint16_t tmds)
{
uint16_t unum = (fRd_tmcr>>kTMCR_V_UNIT) & kTMCR_B_UNIT;
RlogMsg lmsg(LogFile());
bool err = tmcr & (kTMCR_M_RPAE|kTMCR_M_RRLE|kTMCR_M_RBTE|kTMCR_M_RNXM);
uint16_t nbyt = tmbc - fRd_tmbc;
lmsg << "-I " << Name() << (err ? ": err " : ": ok ")
<< " un=" << unum
<< " cr=" << RosPrintBvi(tmcr,8)
<< " ad=" << RosPrintBvi(addr,8,18)
<< " bc=" << RosPrintBvi(tmbc,8)
<< " nb=" << RosPrintf(nbyt,"d",5)
<< " ds=" << RosPrintBvi(tmds,8);
if (tmds & kTMRL_M_EOF) lmsg << " EOF";
if (tmds & kTMRL_M_EOT) lmsg << " EOT";
if (tmds & kTMRL_M_BOT) lmsg << " BOT";
return;
}
} // end namespace Retro

View File

@ -1,18 +1,10 @@
// $Id: Rw11CntlTM11.hpp 1160 2019-06-07 17:30:17Z mueller $
//
// $Id: Rw11CntlTM11.hpp 1183 2019-07-10 18:48:41Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2015-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// 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
// Software Foundation, either version 3, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for complete details.
//
// Revision History:
// Date Rev Version Comment
// 2019-07-10 1183 1.1 support odd record length
// 2019-06-07 1160 1.0.2 RdmaStats() not longer const
// 2017-04-02 865 1.0.1 Dump(): add detail arg
// 2015-06-04 686 1.0 Initial version
@ -21,7 +13,6 @@
/*!
\file
\brief Declaration of class Rw11CntlTM11.
*/
@ -155,6 +146,8 @@ namespace Retro {
void AddNormalExit(RlinkCommandList& clist, size_t ndone,
uint16_t tmcr=0);
void WriteLog(const char* func, RerrMsg& emsg);
void WriteExitLog(uint16_t tmcr, uint32_t addr,
uint16_t tmbc, uint16_t tmds);
protected:
size_t fPC_tmcr; //!< PrimClist: tmcr index
@ -166,10 +159,10 @@ namespace Retro {
uint16_t fRd_tmsr; //!< Rdma: request tmsr
uint16_t fRd_tmbc; //!< Rdma: request tmbc
uint16_t fRd_tmba; //!< Rdma: request tmba
uint32_t fRd_bc; //!< Rdma: request bc
uint32_t fRd_addr; //!< Rdma: current addr
uint32_t fRd_nwrd; //!< Rdma: current nwrd
uint16_t fRd_fu; //!< Rdma: request fu code
size_t fRd_rddone; //!< Rdma: bytes read
int fRd_opcode; //!< Rdma: read opcode
std::vector<uint16_t> fBuf; //!< data buffer
Rw11Rdma fRdma; //!< Rdma controller

View File

@ -1,15 +1,6 @@
// $Id: Rw11CntlTM11.ipp 1160 2019-06-07 17:30:17Z mueller $
//
// $Id: Rw11CntlTM11.ipp 1183 2019-07-10 18:48:41Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2015-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// 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
// Software Foundation, either version 3, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for complete details.
//
// Revision History:
// Date Rev Version Comment
@ -18,7 +9,6 @@
// ---------------------------------------------------------------------------
/*!
\file
\brief Implemenation (inline) of Rw11CntlTM11.
*/

View File

@ -1,15 +1,6 @@
// $Id: Rw11UnitTM11.cpp 1081 2018-12-14 22:29:42Z mueller $
//
// Copyright 2015-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// 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
// Software Foundation, either version 3, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for complete details.
// $Id: Rw11UnitTM11.cpp 1180 2019-07-08 15:46:59Z mueller $
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2015-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
// Revision History:
// Date Rev Version Comment
@ -44,7 +35,7 @@ Rw11UnitTM11::Rw11UnitTM11(Rw11CntlTM11* pcntl, size_t index)
: Rw11UnitTapeBase<Rw11CntlTM11>(pcntl, index),
fTmds(0)
{
// setup disk geometry: only rk05 supported, no rk05f !
// setup tape unit type: only tu10 supported !
fType = "tu10";
fEnabled = true;
}

View File

@ -1,9 +1,10 @@
# $Id: util.tcl 1177 2019-06-30 12:34:07Z mueller $
# $Id: util.tcl 1180 2019-07-08 15:46:59Z mueller $
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2015-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# Revision History:
# Date Rev Version Comment
# 2019-07-08 1180 1.0.2 add sym def for CR.den values
# 2015-12-26 719 1.0.1 add regmap_add defs
# 2015-05-17 683 1.0 Initial version
#
@ -22,8 +23,8 @@ namespace eval ibd_tm11 {
regdsc SR {icmd 15} {eof 14} {pae 12} {eot 10} {rle 9} {bte 8} {nxm 7} \
{onl 6} {bot 5} {wrl 2} {rew 1} {tur 0}
regdsc CR {err 15} {den 14 2} {ini 12} {pevn 11} {unit 10 3} \
{rdy 7} {ie 6} {ea 5 2} \
regdsc CR {err 15} {den 14 2 "s:D72:D75:D78:D98"} \
{ini 12} {pevn 11} {unit 10 3} {rdy 7} {ie 6} {ea 5 2} \
{func 3 3 "s:UNLOAD:READ:WRITE:WEOF:SFORW:SBACK:WRTEG:REWIND"} \
{go 0}
variable FUNC_UNLOAD [bvi b3 "000"]
@ -99,7 +100,7 @@ namespace eval ibd_tm11 {
append rval "Controller registers:"
append rval [format "\n sr: %6.6o %s" $sr [regtxt ibd_tm11::SR $sr]]
append rval [format "\n cr: %6.6o %s" $cr [regtxt ibd_tm11::CR $cr]]
append rval [format "\n bc: %6.6o nw=%s" $bc $fbc]
append rval [format "\n bc: %6.6o nb=%s" $bc $fbc]
append rval [format "\n ba: %6.6o" $ba]
append rval "\nUnit registers:"