OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.6/] [tools/] [src/] [librwxxtpp/] [RtclRw11Cpu.cpp] - Diff between revs 20 and 21

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 20 Rev 21
// $Id: RtclRw11Cpu.cpp 511 2013-04-27 13:51:46Z mueller $
// $Id: RtclRw11Cpu.cpp 513 2013-05-01 14:02:06Z mueller $
//
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
//
// This program is free software; you may redistribute and/or modify it under
// 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
// the terms of the GNU General Public License as published by the Free
// Software Foundation, either version 2, or at your option any later version.
// Software Foundation, either version 2, or at your option any later version.
//
//
// This program is distributed in the hope that it will be useful, but
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// for complete details.
// for complete details.
// 
// 
// Revision History: 
// Revision History: 
// Date         Rev Version  Comment
// Date         Rev Version  Comment
// 2013-04-26   511   1.0.1  add M_show
// 2013-04-26   511   1.0.1  add M_show
// 2013-04-02   502   1.0    Initial version
// 2013-04-02   502   1.0    Initial version
// 2013-02-02   480   0.1    First draft
// 2013-02-02   480   0.1    First draft
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
 
 
/*!
/*!
  \file
  \file
  \version $Id: RtclRw11Cpu.cpp 511 2013-04-27 13:51:46Z mueller $
  \version $Id: RtclRw11Cpu.cpp 513 2013-05-01 14:02:06Z mueller $
  \brief   Implemenation of RtclRw11Cpu.
  \brief   Implemenation of RtclRw11Cpu.
*/
*/
 
 
#include <unistd.h>
#include <unistd.h>
#include <errno.h>
#include <errno.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/wait.h>
 
 
#include <vector>
#include <vector>
#include <memory>
#include <memory>
#include <sstream>
#include <sstream>
 
 
#include "boost/bind.hpp"
#include "boost/bind.hpp"
#include "boost/thread/locks.hpp"
#include "boost/thread/locks.hpp"
 
 
#include "librtools/RerrMsg.hpp"
#include "librtools/RerrMsg.hpp"
#include "librtools/RlogMsg.hpp"
#include "librtools/RlogMsg.hpp"
#include "librtools/RosPrintf.hpp"
#include "librtools/RosPrintf.hpp"
#include "librtools/RosPrintBvi.hpp"
#include "librtools/RosPrintBvi.hpp"
#include "librtcltools/Rtcl.hpp"
#include "librtcltools/Rtcl.hpp"
#include "librtcltools/RtclStats.hpp"
#include "librtcltools/RtclStats.hpp"
#include "librtcltools/RtclOPtr.hpp"
#include "librtcltools/RtclOPtr.hpp"
#include "librtcltools/RtclNameSet.hpp"
#include "librtcltools/RtclNameSet.hpp"
#include "librlink/RlinkCommandList.hpp"
#include "librlink/RlinkCommandList.hpp"
 
 
#include "RtclRw11.hpp"
#include "RtclRw11.hpp"
 
 
#include "RtclRw11CntlFactory.hpp"
#include "RtclRw11CntlFactory.hpp"
#include "librw11/Rw11Cntl.hpp"
#include "librw11/Rw11Cntl.hpp"
 
 
#include "RtclRw11Cpu.hpp"
#include "RtclRw11Cpu.hpp"
 
 
using namespace std;
using namespace std;
 
 
/*!
/*!
  \class Retro::RtclRw11Cpu
  \class Retro::RtclRw11Cpu
  \brief FIXME_docs
  \brief FIXME_docs
*/
*/
 
 
// all method definitions in namespace Retro
// all method definitions in namespace Retro
namespace Retro {
namespace Retro {
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! Default constructor
//! Default constructor
 
 
RtclRw11Cpu::RtclRw11Cpu(const std::string& type)
RtclRw11Cpu::RtclRw11Cpu(const std::string& type)
  : RtclProxyBase(type),
  : RtclProxyBase(type),
    fGets()
    fGets()
{
{
  AddMeth("add",      boost::bind(&RtclRw11Cpu::M_add,     this, _1));
  AddMeth("add",      boost::bind(&RtclRw11Cpu::M_add,     this, _1));
  AddMeth("cp",       boost::bind(&RtclRw11Cpu::M_cp,      this, _1));
  AddMeth("cp",       boost::bind(&RtclRw11Cpu::M_cp,      this, _1));
  AddMeth("wtcpu",    boost::bind(&RtclRw11Cpu::M_wtcpu,   this, _1));
  AddMeth("wtcpu",    boost::bind(&RtclRw11Cpu::M_wtcpu,   this, _1));
  AddMeth("deposit",  boost::bind(&RtclRw11Cpu::M_deposit, this, _1));
  AddMeth("deposit",  boost::bind(&RtclRw11Cpu::M_deposit, this, _1));
  AddMeth("examine",  boost::bind(&RtclRw11Cpu::M_examine, this, _1));
  AddMeth("examine",  boost::bind(&RtclRw11Cpu::M_examine, this, _1));
  AddMeth("lsmem",    boost::bind(&RtclRw11Cpu::M_lsmem,   this, _1));
  AddMeth("lsmem",    boost::bind(&RtclRw11Cpu::M_lsmem,   this, _1));
  AddMeth("ldabs",    boost::bind(&RtclRw11Cpu::M_ldabs,   this, _1));
  AddMeth("ldabs",    boost::bind(&RtclRw11Cpu::M_ldabs,   this, _1));
  AddMeth("ldasm",    boost::bind(&RtclRw11Cpu::M_ldasm,   this, _1));
  AddMeth("ldasm",    boost::bind(&RtclRw11Cpu::M_ldasm,   this, _1));
  AddMeth("boot",     boost::bind(&RtclRw11Cpu::M_boot,    this, _1));
  AddMeth("boot",     boost::bind(&RtclRw11Cpu::M_boot,    this, _1));
  AddMeth("get",      boost::bind(&RtclRw11Cpu::M_get,     this, _1));
  AddMeth("get",      boost::bind(&RtclRw11Cpu::M_get,     this, _1));
  AddMeth("set",      boost::bind(&RtclRw11Cpu::M_set,     this, _1));
  AddMeth("set",      boost::bind(&RtclRw11Cpu::M_set,     this, _1));
  AddMeth("stats",    boost::bind(&RtclRw11Cpu::M_stats,   this, _1));
  AddMeth("stats",    boost::bind(&RtclRw11Cpu::M_stats,   this, _1));
  AddMeth("show",     boost::bind(&RtclRw11Cpu::M_show,    this, _1));
  AddMeth("show",     boost::bind(&RtclRw11Cpu::M_show,    this, _1));
  AddMeth("dump",     boost::bind(&RtclRw11Cpu::M_dump,    this, _1));
  AddMeth("dump",     boost::bind(&RtclRw11Cpu::M_dump,    this, _1));
  AddMeth("$default", boost::bind(&RtclRw11Cpu::M_default, this, _1));
  AddMeth("$default", boost::bind(&RtclRw11Cpu::M_default, this, _1));
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! Destructor
//! Destructor
 
 
RtclRw11Cpu::~RtclRw11Cpu()
RtclRw11Cpu::~RtclRw11Cpu()
{}
{}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_add(RtclArgs& args)
int RtclRw11Cpu::M_add(RtclArgs& args)
{
{
  return RtclRw11CntlFactory(args, *this);
  return RtclRw11CntlFactory(args, *this);
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_cp(RtclArgs& args)
int RtclRw11Cpu::M_cp(RtclArgs& args)
{
{
  static RtclNameSet optset("-rr|-rr0|-rr1|-rr2|-rr3|-rr4|-rr5|-rr6|-rr7|"
  static RtclNameSet optset("-rr|-rr0|-rr1|-rr2|-rr3|-rr4|-rr5|-rr6|-rr7|"
                            "-wr|-wr0|-wr1|-wr2|-wr3|-wr4|-wr5|-wr6|-wr7|"
                            "-wr|-wr0|-wr1|-wr2|-wr3|-wr4|-wr5|-wr6|-wr7|"
                            "-rsp|-rpc|-wsp|-wpc|"
                            "-rsp|-rpc|-wsp|-wpc|"
                            "-rps|-wps|"
                            "-rps|-wps|"
                            "-wal|-wah|-rm|-rmi|-wm|-wmi|-brm|-bwm|"
                            "-wal|-wah|-rm|-rmi|-wm|-wmi|-brm|-bwm|"
                            "-stapc|-start|-stop|-continue|-step|-reset|"
                            "-stapc|-start|-stop|-continue|-step|-reset|"
                            "-ribrb|-wibrb|-wibrbbe|-ribr|-wibr|"
                            "-ribrb|-wibrb|-wibrbbe|-ribr|-wibr|"
                            "-rconf|-rstat|"
                            "-rconf|-rstat|"
                            "-edata|-estat|-estatdef"
                            "-edata|-estat|-estatdef"
                            );
                            );
 
 
  Tcl_Interp* interp = args.Interp();
  Tcl_Interp* interp = args.Interp();
 
 
  RlinkCommandList clist;
  RlinkCommandList clist;
  string opt;
  string opt;
  uint16_t base = Obj().Base();
  uint16_t base = Obj().Base();
 
 
  vector<string> vardata;
  vector<string> vardata;
  vector<string> varstat;
  vector<string> varstat;
 
 
  uint8_t estatdef_val = 0x00;
  uint8_t estatdef_val = 0x00;
  uint8_t estatdef_msk = 0xff;
  uint8_t estatdef_msk = 0xff;
 
 
  bool setcpugo = false;
  bool setcpugo = false;
 
 
  while (args.NextOpt(opt, optset)) {
  while (args.NextOpt(opt, optset)) {
    size_t lsize = clist.Size();
    size_t lsize = clist.Size();
 
 
    // map register read/write
    // map register read/write
    if (opt == "-rsp") opt = "-rr6";
    if (opt == "-rsp") opt = "-rr6";
    if (opt == "-rpc") opt = "-rr7";
    if (opt == "-rpc") opt = "-rr7";
    if (opt == "-wsp") opt = "-wr6";
    if (opt == "-wsp") opt = "-wr6";
    if (opt == "-wpc") opt = "-wr7";
    if (opt == "-wpc") opt = "-wr7";
 
 
    int regnum = 0;
    int regnum = 0;
    if (opt.substr(0,3) == "-rr" || opt.substr(0,3) == "-wr" ) {
    if (opt.substr(0,3) == "-rr" || opt.substr(0,3) == "-wr" ) {
      if (opt.length() == 3) {
      if (opt.length() == 3) {
        if (!args.GetArg("regnum", regnum, 0, 7)) return kERR;
        if (!args.GetArg("regnum", regnum, 0, 7)) return kERR;
      } else {
      } else {
        regnum = opt[3] - '0';
        regnum = opt[3] - '0';
        regnum &= 0x7;                      // to be sure...
        regnum &= 0x7;                      // to be sure...
      }
      }
      opt = opt.substr(0,3);
      opt = opt.substr(0,3);
    }
    }
 
 
    if        (opt == "-rr") {              // -rr* ?varData ?varStat --------
    if        (opt == "-rr") {              // -rr* ?varData ?varStat --------
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddRreg(base + Rw11Cpu::kCp_addr_r0 + regnum);
      clist.AddRreg(base + Rw11Cpu::kCp_addr_r0 + regnum);
 
 
    } else if (opt == "-wr") {              // -wr* data ?varStat ------------
    } else if (opt == "-wr") {              // -wr* data ?varStat ------------
      uint16_t data;
      uint16_t data;
      if (!args.GetArg("data", data)) return kERR;
      if (!args.GetArg("data", data)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_r0 + regnum, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_r0 + regnum, data);
 
 
    } else if (opt == "-rps") {             // -rps ?varData ?varStat --------
    } else if (opt == "-rps") {             // -rps ?varData ?varStat --------
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddRreg(base + Rw11Cpu::kCp_addr_psw);
      clist.AddRreg(base + Rw11Cpu::kCp_addr_psw);
 
 
    } else if (opt == "-wps") {             // -wps data ?varStat ------------
    } else if (opt == "-wps") {             // -wps data ?varStat ------------
      uint16_t data;
      uint16_t data;
      if (!args.GetArg("data", data)) return kERR;
      if (!args.GetArg("data", data)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_psw, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_psw, data);
 
 
    } else if (opt == "-wal") {             // -wal data ?varStat ------------
    } else if (opt == "-wal") {             // -wal data ?varStat ------------
      uint16_t data;
      uint16_t data;
      if (!args.GetArg("al", data)) return kERR;
      if (!args.GetArg("al", data)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_al, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_al, data);
 
 
    } else if (opt == "-wah") {             // -wah data ?varStat ------------
    } else if (opt == "-wah") {             // -wah data ?varStat ------------
      uint16_t data;
      uint16_t data;
      if (!args.GetArg("ah", data)) return kERR;
      if (!args.GetArg("ah", data)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_ah, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_ah, data);
 
 
    } else if (opt == "-rm" ||              // -rm(i) ?varData ?varStat ------
    } else if (opt == "-rm" ||              // -rm(i) ?varData ?varStat ------
               opt == "-rmi") {
               opt == "-rmi") {
      uint16_t addr = opt=="-rm" ? Rw11Cpu::kCp_addr_mem : Rw11Cpu::kCp_addr_memi;
      uint16_t addr = opt=="-rm" ? Rw11Cpu::kCp_addr_mem : Rw11Cpu::kCp_addr_memi;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddRreg(base + addr);
      clist.AddRreg(base + addr);
 
 
    } else if (opt == "-wm" ||              // -wm(i) data ?varStat -
    } else if (opt == "-wm" ||              // -wm(i) data ?varStat -
               opt == "-wmi") {
               opt == "-wmi") {
      uint16_t addr = opt=="-wm" ? Rw11Cpu::kCp_addr_mem :
      uint16_t addr = opt=="-wm" ? Rw11Cpu::kCp_addr_mem :
                                   Rw11Cpu::kCp_addr_memi;
                                   Rw11Cpu::kCp_addr_memi;
      uint16_t data;
      uint16_t data;
      if (!args.GetArg("data", data)) return kERR;
      if (!args.GetArg("data", data)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + addr, data);
      clist.AddWreg(base + addr, data);
 
 
    } else if (opt == "-brm") {             // -brm size ?varData ?varStat ---
    } else if (opt == "-brm") {             // -brm size ?varData ?varStat ---
      int32_t bsize;
      int32_t bsize;
      if (!args.GetArg("bsize", bsize, 1, 256)) return kERR;
      if (!args.GetArg("bsize", bsize, 1, 256)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, (size_t) bsize);
      clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, (size_t) bsize);
 
 
    } else if (opt == "-bwm") {             // -bwm block ?varStat -----------
    } else if (opt == "-bwm") {             // -bwm block ?varStat -----------
      vector<uint16_t> block;
      vector<uint16_t> block;
      if (!args.GetArg("data", block, 1, 256)) return kERR;
      if (!args.GetArg("data", block, 1, 256)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWblk(base + Rw11Cpu::kCp_addr_memi, block);
      clist.AddWblk(base + Rw11Cpu::kCp_addr_memi, block);
 
 
    } else if (opt == "-stapc") {           // -stapc addr ?varStat ----------
    } else if (opt == "-stapc") {           // -stapc addr ?varStat ----------
      uint16_t data;
      uint16_t data;
      if (!args.GetArg("data", data)) return kERR;
      if (!args.GetArg("data", data)) return kERR;
      if (!GetVarName(args, "??varStat", lsize+1, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize+1, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_pc, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_pc, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_start);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_start);
      setcpugo = true;
      setcpugo = true;
 
 
    } else if (opt == "-start") {           // -start ?varStat ---------------
    } else if (opt == "-start") {           // -start ?varStat ---------------
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_start);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_start);
      setcpugo = true;
      setcpugo = true;
 
 
    } else if (opt == "-stop") {            // -stop ?varStat ----------------
    } else if (opt == "-stop") {            // -stop ?varStat ----------------
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_stop);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_stop);
 
 
    } else if (opt == "-continue") {        // -continue ?varStat ------------
    } else if (opt == "-continue") {        // -continue ?varStat ------------
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_cont);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_cont);
      setcpugo = true;
      setcpugo = true;
 
 
    } else if (opt == "-step") {            // -step ?varStat ----------------
    } else if (opt == "-step") {            // -step ?varStat ----------------
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_step);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_step);
 
 
    } else if (opt == "-reset") {           // -reset ?varStat ---------------
    } else if (opt == "-reset") {           // -reset ?varStat ---------------
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_reset);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_reset);
 
 
    } else if (opt == "-ribrb") {           // -ribrb ?varData ?varStat ------
    } else if (opt == "-ribrb") {           // -ribrb ?varData ?varStat ------
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddRreg(base + Rw11Cpu::kCp_addr_ibrb);
      clist.AddRreg(base + Rw11Cpu::kCp_addr_ibrb);
 
 
    } else if (opt == "-wibrb") {           // -wibrb base ?varStat ----------
    } else if (opt == "-wibrb") {           // -wibrb base ?varStat ----------
      uint16_t data;
      uint16_t data;
      if (!args.GetArg("base", data)) return kERR;
      if (!args.GetArg("base", data)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      data &= 0177700;                        // clear byte enables 
      data &= 0177700;                        // clear byte enables 
      clist.AddWreg(base + Rw11Cpu::kCp_addr_ibrb, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_ibrb, data);
 
 
    } else if (opt == "-wibrbbe") {         // -wibrbbe base be ?varStat -----
    } else if (opt == "-wibrbbe") {         // -wibrbbe base be ?varStat -----
      uint16_t data;
      uint16_t data;
      uint16_t be;
      uint16_t be;
      if (!args.GetArg("base", data)) return kERR;
      if (!args.GetArg("base", data)) return kERR;
      if (!args.GetArg("be", be, 0x3)) return kERR;
      if (!args.GetArg("be", be, 0x3)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      data &= 0177700;                        // clear byte enables from base
      data &= 0177700;                        // clear byte enables from base
      if (be == 0) be = 0x3;                  // map be 0 -> be 3
      if (be == 0) be = 0x3;                  // map be 0 -> be 3
      data |= be;                             // set byte enables 
      data |= be;                             // set byte enables 
      clist.AddWreg(base + Rw11Cpu::kCp_addr_ibrb, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_ibrb, data);
 
 
    } else if (opt == "-ribr") {           // -ribr off ?varData ?varStat ----
    } else if (opt == "-ribr") {           // -ribr off ?varData ?varStat ----
      uint16_t off;
      uint16_t off;
      if (!args.GetArg("off",  off, 63)) return kERR;
      if (!args.GetArg("off",  off, 63)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddRreg(base + Rw11Cpu::kCp_addr_ibr + off/2);
      clist.AddRreg(base + Rw11Cpu::kCp_addr_ibr + off/2);
 
 
    } else if (opt == "-wibr") {           // -wibrb off data ?varStat --------
    } else if (opt == "-wibr") {           // -wibrb off data ?varStat --------
      uint16_t off;
      uint16_t off;
      uint16_t data;
      uint16_t data;
      if (!args.GetArg("off",  off, 63)) return kERR;
      if (!args.GetArg("off",  off, 63)) return kERR;
      if (!args.GetArg("data", data)) return kERR;
      if (!args.GetArg("data", data)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_ibr + off/2, data);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_ibr + off/2, data);
 
 
    } else if (opt == "-rconf") {           // -rconf ?varData ?varStat ------
    } else if (opt == "-rconf") {           // -rconf ?varData ?varStat ------
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddRreg(base + Rw11Cpu::kCp_addr_conf);
      clist.AddRreg(base + Rw11Cpu::kCp_addr_conf);
 
 
    } else if (opt == "-rstat") {           // -rstat ?varData ?varStat ------
    } else if (opt == "-rstat") {           // -rstat ?varData ?varStat ------
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
      clist.AddRreg(base + Rw11Cpu::kCp_addr_stat);
      clist.AddRreg(base + Rw11Cpu::kCp_addr_stat);
 
 
    } else if (opt == "-edata") {           // -edata data ?mask --------------
    } else if (opt == "-edata") {           // -edata data ?mask --------------
      if (lsize == 0)
      if (lsize == 0)
        return args.Quit("-E: -edata not allowed on empty command list");
        return args.Quit("-E: -edata not allowed on empty command list");
      if (clist[lsize-1].Expect()==0) {
      if (clist[lsize-1].Expect()==0) {
        clist.LastExpect(new RlinkCommandExpect());
        clist.LastExpect(new RlinkCommandExpect());
      }
      }
      if (clist[lsize-1].Command() == RlinkCommand::kCmdRblk) {
      if (clist[lsize-1].Command() == RlinkCommand::kCmdRblk) {
        vector<uint16_t> data;
        vector<uint16_t> data;
        vector<uint16_t> mask;
        vector<uint16_t> mask;
        size_t bsize = clist[lsize-1].BlockSize();
        size_t bsize = clist[lsize-1].BlockSize();
        if (!args.GetArg("data", data, 0, bsize)) return kERR;
        if (!args.GetArg("data", data, 0, bsize)) return kERR;
        if (!args.GetArg("??mask", mask, 0, bsize)) return kERR;
        if (!args.GetArg("??mask", mask, 0, bsize)) return kERR;
        clist[lsize-1].Expect()->SetBlock(data, mask);
        clist[lsize-1].Expect()->SetBlock(data, mask);
      } else {
      } else {
        uint16_t data=0;
        uint16_t data=0;
        uint16_t mask=0;
        uint16_t mask=0;
        if (!args.GetArg("data", data)) return kERR;
        if (!args.GetArg("data", data)) return kERR;
        if (!args.GetArg("??mask", mask)) return kERR;
        if (!args.GetArg("??mask", mask)) return kERR;
        clist[lsize-1].Expect()->SetData(data, mask);
        clist[lsize-1].Expect()->SetData(data, mask);
      }
      }
 
 
    } else if (opt == "-estat") {           // -estat ?stat ?mask -------------
    } else if (opt == "-estat") {           // -estat ?stat ?mask -------------
      if (lsize == 0)
      if (lsize == 0)
        return args.Quit("-E: -estat not allowed on empty command list");
        return args.Quit("-E: -estat not allowed on empty command list");
      uint8_t stat=0;
      uint8_t stat=0;
      uint8_t mask=0;
      uint8_t mask=0;
      if (!args.GetArg("??stat", stat)) return kERR;
      if (!args.GetArg("??stat", stat)) return kERR;
      if (!args.GetArg("??mask", mask)) return kERR;
      if (!args.GetArg("??mask", mask)) return kERR;
      if (args.NOptMiss() == 2)  mask = 0xff;
      if (args.NOptMiss() == 2)  mask = 0xff;
      if (clist[lsize-1].Expect()==0) {
      if (clist[lsize-1].Expect()==0) {
        clist.LastExpect(new RlinkCommandExpect());
        clist.LastExpect(new RlinkCommandExpect());
      }
      }
      clist[lsize-1].Expect()->SetStatus(stat, mask);
      clist[lsize-1].Expect()->SetStatus(stat, mask);
 
 
    } else if (opt == "-estatdef") {        // -estatdef ?stat ?mask -----------
    } else if (opt == "-estatdef") {        // -estatdef ?stat ?mask -----------
      uint8_t stat=0;
      uint8_t stat=0;
      uint8_t mask=0;
      uint8_t mask=0;
      if (!args.GetArg("??stat", stat)) return kERR;
      if (!args.GetArg("??stat", stat)) return kERR;
      if (!args.GetArg("??mask", mask)) return kERR;
      if (!args.GetArg("??mask", mask)) return kERR;
      if (args.NOptMiss() == 2)  mask = 0xff;
      if (args.NOptMiss() == 2)  mask = 0xff;
      estatdef_val = stat;
      estatdef_val = stat;
      estatdef_msk = mask;
      estatdef_msk = mask;
 
 
    }
    }
 
 
    if (lsize != clist.Size()) {            // cmd added to clist (ind=lsize!)
    if (lsize != clist.Size()) {            // cmd added to clist (ind=lsize!)
      if (estatdef_msk != 0xff) {           // estatdef defined
      if (estatdef_msk != 0xff) {           // estatdef defined
        if (clist[lsize].Expect()==0) {
        if (clist[lsize].Expect()==0) {
          clist.LastExpect(new RlinkCommandExpect());
          clist.LastExpect(new RlinkCommandExpect());
        }
        }
        clist[lsize].Expect()->SetStatus(estatdef_val, estatdef_msk);
        clist[lsize].Expect()->SetStatus(estatdef_val, estatdef_msk);
      }
      }
    }
    }
 
 
  }
  }
 
 
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
  if (clist.Size() == 0) return kOK;
  if (clist.Size() == 0) return kOK;
 
 
  // signal cpugo up before clist executed to prevent races
  // signal cpugo up before clist executed to prevent races
  if (setcpugo) Obj().SetCpuGoUp();
  if (setcpugo) Obj().SetCpuGoUp();
 
 
  RerrMsg emsg;
  RerrMsg emsg;
  // this one intentionally on Connect() to allow mixing of rlc + w11 commands
  // this one intentionally on Connect() to allow mixing of rlc + w11 commands
  // FIXME_code: is this a good idea ??
  // FIXME_code: is this a good idea ??
  if (!Connect().Exec(clist, emsg)) return args.Quit(emsg);
  if (!Connect().Exec(clist, emsg)) return args.Quit(emsg);
 
 
  for (size_t icmd=0; icmd<clist.Size(); icmd++) {
  for (size_t icmd=0; icmd<clist.Size(); icmd++) {
    RlinkCommand& cmd = clist[icmd];
    RlinkCommand& cmd = clist[icmd];
 
 
    if (icmd<vardata.size() && !vardata[icmd].empty()) {
    if (icmd<vardata.size() && !vardata[icmd].empty()) {
      RtclOPtr pres;
      RtclOPtr pres;
      vector<uint16_t> retstat;
      vector<uint16_t> retstat;
      RtclOPtr pele;
      RtclOPtr pele;
      switch (cmd.Command()) {
      switch (cmd.Command()) {
        case RlinkCommand::kCmdRreg:
        case RlinkCommand::kCmdRreg:
          pres = Tcl_NewIntObj((int)cmd.Data());
          pres = Tcl_NewIntObj((int)cmd.Data());
          break;
          break;
 
 
        case RlinkCommand::kCmdRblk:
        case RlinkCommand::kCmdRblk:
          pres = Rtcl::NewListIntObj(cmd.Block());
          pres = Rtcl::NewListIntObj(cmd.Block());
          break;
          break;
      }
      }
      if(!Rtcl::SetVar(interp, vardata[icmd], pres)) return kERR;
      if(!Rtcl::SetVar(interp, vardata[icmd], pres)) return kERR;
    }
    }
 
 
    if (icmd<varstat.size() && !varstat[icmd].empty()) {
    if (icmd<varstat.size() && !varstat[icmd].empty()) {
      RtclOPtr pres = Tcl_NewIntObj((int)cmd.Status());
      RtclOPtr pres = Tcl_NewIntObj((int)cmd.Status());
      if (!Rtcl::SetVar(interp, varstat[icmd], pres)) return kERR;
      if (!Rtcl::SetVar(interp, varstat[icmd], pres)) return kERR;
    }
    }
  }
  }
 
 
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_wtcpu(RtclArgs& args)
int RtclRw11Cpu::M_wtcpu(RtclArgs& args)
{
{
  static RtclNameSet optset("-reset");
  static RtclNameSet optset("-reset");
 
 
  string opt;
  string opt;
  bool reset = false;
  bool reset = false;
  double tout;
  double tout;
 
 
  while (args.NextOpt(opt, optset)) {
  while (args.NextOpt(opt, optset)) {
    if (opt == "-reset") reset = true;
    if (opt == "-reset") reset = true;
  }
  }
  if (!args.GetArg("tout", tout, 0.001)) return kERR;
  if (!args.GetArg("tout", tout, 0.001)) return kERR;
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
 
  double twait = -1;
  double twait = -1;
 
 
  if (!Server().IsActive()) {               // server is not active
  if (!Server().IsActive()) {               // server is not active
    RerrMsg emsg;
    RerrMsg emsg;
    twait = Connect().WaitAttn(tout, emsg);
    twait = Connect().WaitAttn(tout, emsg);
    if (twait == -2.) {                     // wait failed, quit
    if (twait == -2.) {                     // wait failed, quit
      return args.Quit(emsg);
      return args.Quit(emsg);
    }
    }
    if (twait >= 0.) {                      // wait succeeded
    if (twait >= 0.) {                      // wait succeeded
      RlinkCommandList clist;                 // get and discard attn pattern 
      RlinkCommandList clist;                 // get and discard attn pattern 
      clist.AddAttn();
      clist.AddAttn();
      if (!Connect().Exec(clist, emsg)) return args.Quit(emsg);
      if (!Connect().Exec(clist, emsg)) return args.Quit(emsg);
    }
    }
 
 
  } else {                                  // server is active
  } else {                                  // server is active
    twait = Obj().WaitCpuGoDown(tout);
    twait = Obj().WaitCpuGoDown(tout);
  }
  }
 
 
  if (twait < 0.) {                         // timeout
  if (twait < 0.) {                         // timeout
    if (Connect().GetLogOpts().printlevel >= 1) {
    if (Connect().GetLogOpts().printlevel >= 1) {
      RlogMsg lmsg(Connect().LogFile());
      RlogMsg lmsg(Connect().LogFile());
      lmsg << "-- wtcpu to=" << RosPrintf(tout, "f", 0,3) << " FAIL timeout";
      lmsg << "-- wtcpu to=" << RosPrintf(tout, "f", 0,3) << " FAIL timeout";
    }
    }
    Connect().Context().IncErrorCount();
    Connect().Context().IncErrorCount();
    if (reset) {                            // reset requested 
    if (reset) {                            // reset requested 
      uint16_t base = Obj().Base();
      uint16_t base = Obj().Base();
      RlinkCommandList clist;
      RlinkCommandList clist;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_stop);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_stop);
      RerrMsg emsg;
      RerrMsg emsg;
      if (!Connect().Exec(clist, emsg)) return args.Quit(emsg);
      if (!Connect().Exec(clist, emsg)) return args.Quit(emsg);
    }
    }
  } else {                                  // no timeout
  } else {                                  // no timeout
    if (Connect().GetLogOpts().printlevel >= 3) {
    if (Connect().GetLogOpts().printlevel >= 3) {
      RlogMsg lmsg(Connect().LogFile());
      RlogMsg lmsg(Connect().LogFile());
      lmsg << "-- wtcpu to=" << RosPrintf(tout, "f", 0,3)
      lmsg << "-- wtcpu to=" << RosPrintf(tout, "f", 0,3)
           << "  T=" << RosPrintf(twait, "f", 0,3)
           << "  T=" << RosPrintf(twait, "f", 0,3)
           << "  OK";
           << "  OK";
    }
    }
  }
  }
 
 
  args.SetResult(twait);
  args.SetResult(twait);
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_deposit(RtclArgs& args)
int RtclRw11Cpu::M_deposit(RtclArgs& args)
{
{
  uint16_t  addr;
  uint16_t  addr;
  vector<uint16_t> data;
  vector<uint16_t> data;
  if (!args.GetArg("addr", addr)) return kERR;
  if (!args.GetArg("addr", addr)) return kERR;
  if (!args.GetArg("data", data, 1)) return kERR;
  if (!args.GetArg("data", data, 1)) return kERR;
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
 
  RerrMsg emsg;
  RerrMsg emsg;
  // FIXME_code: handle memory read/write error
  // FIXME_code: handle memory read/write error
  if (!Obj().MemWrite(addr, data, emsg)) return args.Quit(emsg);
  if (!Obj().MemWrite(addr, data, emsg)) return args.Quit(emsg);
 
 
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_examine(RtclArgs& args)
int RtclRw11Cpu::M_examine(RtclArgs& args)
{
{
  uint16_t  addr;
  uint16_t  addr;
  if (!args.GetArg("addr", addr)) return kERR;
  if (!args.GetArg("addr", addr)) return kERR;
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
 
  RerrMsg emsg;
  RerrMsg emsg;
  vector<uint16_t> data;
  vector<uint16_t> data;
  // FIXME_code: handle memory read/write error
  // FIXME_code: handle memory read/write error
  if (!Obj().MemRead(addr, data, 1, emsg)) return args.Quit(emsg);
  if (!Obj().MemRead(addr, data, 1, emsg)) return args.Quit(emsg);
 
 
  args.SetResult(Rtcl::NewListIntObj(data));
  args.SetResult(Rtcl::NewListIntObj(data));
 
 
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_lsmem(RtclArgs& args)
int RtclRw11Cpu::M_lsmem(RtclArgs& args)
{
{
  uint16_t  abeg;
  uint16_t  abeg;
  if (!args.GetArg("abeg", abeg)) return kERR;
  if (!args.GetArg("abeg", abeg)) return kERR;
  uint16_t  aend = abeg;
  uint16_t  aend = abeg;
  if (!args.GetArg("?aend", aend, 0xffff, abeg)) return kERR;
  if (!args.GetArg("?aend", aend, 0xffff, abeg)) return kERR;
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
 
  RerrMsg emsg;
  RerrMsg emsg;
  vector<uint16_t> data;
  vector<uint16_t> data;
  size_t nword = 1+(aend-abeg)/2;
  size_t nword = 1+(aend-abeg)/2;
  // FIXME_code: handle memory read/write error
  // FIXME_code: handle memory read/write error
  if (!Obj().MemRead(abeg, data, nword, emsg)) return args.Quit(emsg);
  if (!Obj().MemRead(abeg, data, nword, emsg)) return args.Quit(emsg);
 
 
  ostringstream sos;
  ostringstream sos;
  for (size_t i=0; i<nword; i++) {
  for (size_t i=0; i<nword; i++) {
    sos << RosPrintBvi(uint16_t(abeg+i*2), 8)
    sos << RosPrintBvi(uint16_t(abeg+i*2), 8)
        << " : " <<  RosPrintBvi(data[i], 8) << endl;
        << " : " <<  RosPrintBvi(data[i], 8) << endl;
  }
  }
 
 
  args.SetResult(sos);
  args.SetResult(sos);
 
 
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_ldabs(RtclArgs& args)
int RtclRw11Cpu::M_ldabs(RtclArgs& args)
{
{
  string file;
  string file;
  if (!args.GetArg("file", file)) return kERR;
  if (!args.GetArg("file", file)) return kERR;
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
  RerrMsg emsg;
  RerrMsg emsg;
  // FIXME_code: handle memory read/write error
  // FIXME_code: handle memory read/write error
  if (!Obj().LoadAbs(file, emsg, true)) return args.Quit(emsg);
  if (!Obj().LoadAbs(file, emsg, true)) return args.Quit(emsg);
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_ldasm(RtclArgs& args)
int RtclRw11Cpu::M_ldasm(RtclArgs& args)
{
{
  static RtclNameSet optset("-lst|-sym|-opt|-file");
  static RtclNameSet optset("-lst|-sym|-opt|-file");
  Tcl_Interp* interp = args.Interp();
  Tcl_Interp* interp = args.Interp();
 
 
  string varlst;
  string varlst;
  string varsym;
  string varsym;
  string asmopt;
  string asmopt;
  string file;
  string file;
  string code;
  string code;
 
 
  string opt;
  string opt;
  while (args.NextOpt(opt, optset)) {
  while (args.NextOpt(opt, optset)) {
    if (opt == "-lst") {
    if (opt == "-lst") {
      if (!args.GetArg("??varLst", varlst)) return kERR;
      if (!args.GetArg("??varLst", varlst)) return kERR;
    } else if (opt == "-sym") {
    } else if (opt == "-sym") {
      if (!args.GetArg("??varSym", varsym)) return kERR;
      if (!args.GetArg("??varSym", varsym)) return kERR;
    } else if (opt == "-opt") {
    } else if (opt == "-opt") {
      // don't use ?? because the argument will look like an option...
      // don't use ?? because the argument will look like an option...
      if (!args.GetArg("opts", asmopt)) return kERR;
      if (!args.GetArg("opts", asmopt)) return kERR;
    } else if (opt == "-file") {
    } else if (opt == "-file") {
      if (!args.GetArg("??file", file)) return kERR;
      if (!args.GetArg("??file", file)) return kERR;
    }
    }
  }
  }
 
 
  if (file.length() == 0) {
  if (file.length() == 0) {
    if (!args.GetArg("code", code)) return kERR;
    if (!args.GetArg("code", code)) return kERR;
  }
  }
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
 
  // delete sym array, otherwise old entries are preserved
  // delete sym array, otherwise old entries are preserved
  if (varsym.length())
  if (varsym.length())
    Tcl_UnsetVar(interp, varsym.c_str(), 0);
    Tcl_UnsetVar(interp, varsym.c_str(), 0);
 
 
  int pipe_tcl2asm[2];                      // [0] read, [1] write end
  int pipe_tcl2asm[2];                      // [0] read, [1] write end
  int pipe_asm2tcl[2];
  int pipe_asm2tcl[2];
 
 
  if (::pipe(pipe_tcl2asm) < 0)
  if (::pipe(pipe_tcl2asm) < 0)
    return args.Quit(RerrMsg("RtclRw11Cpu::M_ldasm" ,
    return args.Quit(RerrMsg("RtclRw11Cpu::M_ldasm" ,
                             "1st pipe() failed: ", errno));
                             "1st pipe() failed: ", errno));
  if (::pipe(pipe_asm2tcl) < 0)
  if (::pipe(pipe_asm2tcl) < 0)
    return args.Quit(RerrMsg("RtclRw11Cpu::M_ldasm" ,
    return args.Quit(RerrMsg("RtclRw11Cpu::M_ldasm" ,
                             "2nd pipe() failed: ", errno));
                             "2nd pipe() failed: ", errno));
 
 
  pid_t pid = ::fork();
  pid_t pid = ::fork();
  if (pid == (pid_t) 0) {                   // in child here
  if (pid == (pid_t) 0) {                   // in child here
    vector<const char*> argv;
    vector<const char*> argv;
    vector<string>      opts;
    vector<string>      opts;
 
 
    argv.push_back("asm-11");
    argv.push_back("asm-11");
    if (varlst.length()>0) argv.push_back("--olst=-");
    if (varlst.length()>0) argv.push_back("--olst=-");
    argv.push_back("--ocof=-");
    argv.push_back("--ocof=-");
    if (asmopt.length()) {
    if (asmopt.length()) {
      istringstream optstream(asmopt);
      istringstream optstream(asmopt);
      string tok;
      string tok;
      while (optstream >> tok) {
      while (optstream >> tok) {
        opts.push_back(tok);
        opts.push_back(tok);
        argv.push_back(opts[opts.size()-1].c_str());
        argv.push_back(opts[opts.size()-1].c_str());
      }
      }
    }
    }
    if (file.length()) {
    if (file.length()) {
      argv.push_back(file.c_str());
      argv.push_back(file.c_str());
    } else {
    } else {
      argv.push_back("-");
      argv.push_back("-");
    }
    }
    argv.push_back(NULL);
    argv.push_back(NULL);
 
 
    ::dup2(pipe_tcl2asm[0], STDIN_FILENO);
    ::dup2(pipe_tcl2asm[0], STDIN_FILENO);
    ::dup2(pipe_asm2tcl[1], STDOUT_FILENO);
    ::dup2(pipe_asm2tcl[1], STDOUT_FILENO);
    ::dup2(STDOUT_FILENO, STDERR_FILENO);
    ::dup2(STDOUT_FILENO, STDERR_FILENO);
    ::close(pipe_tcl2asm[1]);
    ::close(pipe_tcl2asm[1]);
    ::close(pipe_asm2tcl[0]);
    ::close(pipe_asm2tcl[0]);
    ::execvp("asm-11", (char* const*) argv.data());
    ::execvp("asm-11", (char* const*) argv.data());
    ::perror("execvp() for asm-11 failed");
    ::perror("execvp() for asm-11 failed");
    ::exit(EXIT_FAILURE);
    ::exit(EXIT_FAILURE);
 
 
  } else {                                  // in parent here
  } else {                                  // in parent here
    ::close(pipe_tcl2asm[0]);
    ::close(pipe_tcl2asm[0]);
    ::close(pipe_asm2tcl[1]);
    ::close(pipe_asm2tcl[1]);
    if (pid < (pid_t) 0)
    if (pid < (pid_t) 0)
      return args.Quit(RerrMsg("RtclRw11Cpu::M_ldasm" ,
      return args.Quit(RerrMsg("RtclRw11Cpu::M_ldasm" ,
                               "fork() failed: ", errno));
                               "fork() failed: ", errno));
  }
  }
 
 
  // if first line empty, drop it (created often by using {)
  // if first line empty, drop it (created often by using {)
  if (code.length() && code[0] == '\n') code = code.substr(1);
  if (code.length() && code[0] == '\n') code = code.substr(1);
 
 
  istringstream ostream(code);
  istringstream ostream(code);
  string oline;
  string oline;
  while (std::getline(ostream, oline)) {
  while (std::getline(ostream, oline)) {
    oline += '\n';
    oline += '\n';
    //cout << "+++1:" << oline;
    //cout << "+++1:" << oline;
    if (::write(pipe_tcl2asm[1], oline.data(), oline.length()) < 0) break;
    if (::write(pipe_tcl2asm[1], oline.data(), oline.length()) < 0) break;
  }
  }
  ::close(pipe_tcl2asm[1]);
  ::close(pipe_tcl2asm[1]);
 
 
  FILE* fp = ::fdopen(pipe_asm2tcl[0], "r");
  FILE* fp = ::fdopen(pipe_asm2tcl[0], "r");
  if (fp == NULL) {
  if (fp == NULL) {
    ::close(pipe_asm2tcl[0]);
    ::close(pipe_asm2tcl[0]);
    return args.Quit(RerrMsg("RtclRw11Cpu::M_ldasm" ,
    return args.Quit(RerrMsg("RtclRw11Cpu::M_ldasm" ,
                             "fdopen() failed: ", errno));
                             "fdopen() failed: ", errno));
  }
  }
 
 
  vector<string> ilines;
  vector<string> ilines;
  while(true) {
  while(true) {
    char* pline = NULL;
    char* pline = NULL;
    size_t nchar;
    size_t nchar;
    if (::getline(&pline, &nchar, fp) < 0) break;
    if (::getline(&pline, &nchar, fp) < 0) break;
    //cout << "+++2:" << pline;
    //cout << "+++2:" << pline;
    string line(pline);
    string line(pline);
    if (line.length() && line[line.length()-1] =='\n')
    if (line.length() && line[line.length()-1] =='\n')
      line.resize(line.length()-1);
      line.resize(line.length()-1);
    ilines.push_back(line);
    ilines.push_back(line);
    ::free(pline);
    ::free(pline);
  }
  }
  ::fclose(fp);
  ::fclose(fp);
  ::close(pipe_asm2tcl[0]);
  ::close(pipe_asm2tcl[0]);
 
 
  int wstat;
  int wstat;
  int wexit = -1;
  int wexit = -1;
  waitpid(pid, &wstat, 0);
  waitpid(pid, &wstat, 0);
  if (WIFEXITED(wstat)) wexit = WEXITSTATUS(wstat);
  if (WIFEXITED(wstat)) wexit = WEXITSTATUS(wstat);
 
 
  bool insym = false;
  bool insym = false;
  bool indat = false;
  bool indat = false;
  char dtyp = ' ';
  char dtyp = ' ';
 
 
  ostringstream los;                        // list stream
  ostringstream los;                        // list stream
  ostringstream eos;                        // error stream
  ostringstream eos;                        // error stream
  bool lstbodyseen = false;
  bool lstbodyseen = false;
 
 
  typedef map<uint16_t, uint16_t>  cmap_t;
  typedef map<uint16_t, uint16_t>  cmap_t;
  typedef cmap_t::iterator         cmap_it_t;
  typedef cmap_t::iterator         cmap_it_t;
  typedef cmap_t::value_type       cmap_val_t;
  typedef cmap_t::value_type       cmap_val_t;
 
 
  cmap_t   cmap;
  cmap_t   cmap;
  uint16_t dot = 0;
  uint16_t dot = 0;
 
 
  for (size_t i=0; i<ilines.size(); i++) {
  for (size_t i=0; i<ilines.size(); i++) {
    string& line = ilines[i];
    string& line = ilines[i];
    if (line == "sym {") {
    if (line == "sym {") {
      insym = true;
      insym = true;
      continue;
      continue;
    } else if (line == "dat {") {
    } else if (line == "dat {") {
      indat = true;
      indat = true;
      continue;
      continue;
    } else if (dtyp == ' ' && line == "}") {
    } else if (dtyp == ' ' && line == "}") {
      insym = false;
      insym = false;
      indat = false;
      indat = false;
      continue;
      continue;
    }
    }
 
 
    // handle symbol table
    // handle symbol table
    if (insym) {
    if (insym) {
      if (varsym.length() == 0) continue;
      if (varsym.length() == 0) continue;
      size_t dpos = line.find(" => ");
      size_t dpos = line.find(" => ");
      if (dpos != std::string::npos) {
      if (dpos != std::string::npos) {
        string key = line.substr(0,dpos);
        string key = line.substr(0,dpos);
        string val= line.substr(dpos+4);
        string val= line.substr(dpos+4);
        if (!Tcl_SetVar2Ex(interp, varsym.c_str(), key.c_str(),
        if (!Tcl_SetVar2Ex(interp, varsym.c_str(), key.c_str(),
                           Tcl_NewIntObj((int)strtol(val.c_str(),NULL,8)),
                           Tcl_NewIntObj((int)strtol(val.c_str(),NULL,8)),
                           TCL_LEAVE_ERR_MSG)) return kERR;
                           TCL_LEAVE_ERR_MSG)) return kERR;
      } else {
      } else {
        return args.Quit(string("bad sym spec: ") + line);
        return args.Quit(string("bad sym spec: ") + line);
      }
      }
 
 
    // handle data part
    // handle data part
    } else if (indat) {
    } else if (indat) {
      if (dtyp == ' ') {
      if (dtyp == ' ') {
        if (line.length() != 10)
        if (line.length() != 10)
          return args.Quit(string("bad dat spec: ") + line);
          return args.Quit(string("bad dat spec: ") + line);
        dtyp = line[0];
        dtyp = line[0];
        dot  = (uint16_t)strtol(line.c_str()+2,NULL,8);
        dot  = (uint16_t)strtol(line.c_str()+2,NULL,8);
      } else if (line[0] == '}') {
      } else if (line[0] == '}') {
        dtyp = ' ';
        dtyp = ' ';
      } else {
      } else {
        istringstream datstream(line);
        istringstream datstream(line);
        string dat;
        string dat;
        while (datstream >> dat) {
        while (datstream >> dat) {
          //cout << "+++1 " << dtyp << ":" << dat << endl;
          //cout << "+++1 " << dtyp << ":" << dat << endl;
          uint16_t val = (uint16_t)strtol(dat.c_str(),NULL,8);
          uint16_t val = (uint16_t)strtol(dat.c_str(),NULL,8);
          if (dtyp == 'w') {
          if (dtyp == 'w') {
            cmap[dot] = val;
            cmap[dot] = val;
            dot += 2;
            dot += 2;
          } else {
          } else {
            uint16_t tmp = cmap[dot&0xfffe];
            uint16_t tmp = cmap[dot&0xfffe];
            if (dot & 01) {
            if (dot & 01) {
              tmp = (val&0xff)<<8 | (tmp&0xff); // odd (high) byte
              tmp = (val&0xff)<<8 | (tmp&0xff); // odd (high) byte
            } else {
            } else {
              tmp = (tmp&0xff00)  | (val&0xff); // even (low) byte
              tmp = (tmp&0xff00)  | (val&0xff); // even (low) byte
            }
            }
            cmap[dot&0xfffe] = tmp;
            cmap[dot&0xfffe] = tmp;
            dot += 1;
            dot += 1;
          }
          }
        }
        }
      }
      }
 
 
    // handle listing part (everything not sym{} or dat{}
    // handle listing part (everything not sym{} or dat{}
    } else {
    } else {
      los << line << endl;
      los << line << endl;
      // put lines into error stream if
      // put lines into error stream if
      //  1. before 'Input file list:' and not starting with '--'
      //  1. before 'Input file list:' and not starting with '--'
      //  2. after  'Input file list:' and starting with uppercase letter
      //  2. after  'Input file list:' and starting with uppercase letter
      if (line == "; Input file list:") lstbodyseen = true;
      if (line == "; Input file list:") lstbodyseen = true;
      bool etake = false;
      bool etake = false;
      if (lstbodyseen) {
      if (lstbodyseen) {
        if (line.length() && (line[0]>'A' && line[0]<'Z')) etake = true;
        if (line.length() && (line[0]>'A' && line[0]<'Z')) etake = true;
      } else {
      } else {
        if (line.substr(0,2) != "--") etake = true;
        if (line.substr(0,2) != "--") etake = true;
      }
      }
      if (line.substr(0,6) == "asm-11") etake = true;
      if (line.substr(0,6) == "asm-11") etake = true;
      if (etake) eos << line << endl;
      if (etake) eos << line << endl;
    }
    }
  }
  }
 
 
  if (varlst.length()) {
  if (varlst.length()) {
    if (!Rtcl::SetVar(interp, varlst, Rtcl::NewLinesObj(los))) return kERR;
    if (!Rtcl::SetVar(interp, varlst, Rtcl::NewLinesObj(los))) return kERR;
  }
  }
 
 
  // now, finally, iterate of cmap and write code to memory
  // now, finally, iterate of cmap and write code to memory
 
 
  vector<uint16_t> block;
  vector<uint16_t> block;
  uint16_t base = 0;
  uint16_t base = 0;
  dot = 0;
  dot = 0;
  RerrMsg emsg;
  RerrMsg emsg;
 
 
  for (cmap_it_t it=cmap.begin(); it!=cmap.end(); it++) {
  for (cmap_it_t it=cmap.begin(); it!=cmap.end(); it++) {
    //cout << "+++2 mem[" << RosPrintf(it->first, "o0", 6)
    //cout << "+++2 mem[" << RosPrintf(it->first, "o0", 6)
    //     << "]=" << RosPrintf(it->second, "o0", 6) << endl;
    //     << "]=" << RosPrintf(it->second, "o0", 6) << endl;
    if (dot != it->first || block.size() == 256) {
    if (dot != it->first || block.size() == 256) {
      if (block.size()) {
      if (block.size()) {
        if (!Obj().MemWrite(base, block, emsg)) return args.Quit(emsg);
        if (!Obj().MemWrite(base, block, emsg)) return args.Quit(emsg);
        block.clear();
        block.clear();
      }
      }
      base = dot = it->first;
      base = dot = it->first;
    }
    }
    block.push_back(it->second);
    block.push_back(it->second);
    dot += 2;
    dot += 2;
  }
  }
 
 
  if (block.size()) {
  if (block.size()) {
    if (!Obj().MemWrite(base, block, emsg)) return args.Quit(emsg);
    if (!Obj().MemWrite(base, block, emsg)) return args.Quit(emsg);
    block.clear();
    block.clear();
  }
  }
 
 
  if (wexit != 0) {
  if (wexit != 0) {
    args.AppendResultLines("asm-11 compilation failed with:");
    args.AppendResultLines("asm-11 compilation failed with:");
    args.AppendResultLines(eos);
    args.AppendResultLines(eos);
    return kERR;
    return kERR;
  }
  }
 
 
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_boot(RtclArgs& args)
int RtclRw11Cpu::M_boot(RtclArgs& args)
{
{
  string uname;
  string uname;
  if (!args.GetArg("uname", uname)) return kERR;
  if (!args.GetArg("uname", uname)) return kERR;
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
  RerrMsg emsg;
  RerrMsg emsg;
  if (!Obj().Boot(uname, emsg)) return args.Quit(emsg);
  if (!Obj().Boot(uname, emsg)) return args.Quit(emsg);
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_get(RtclArgs& args)
int RtclRw11Cpu::M_get(RtclArgs& args)
{
{
  // synchronize with server thread
  // synchronize with server thread
  boost::lock_guard<RlinkConnect> lock(Obj().Connect());
  boost::lock_guard<RlinkConnect> lock(Obj().Connect());
  return fGets.M_get(args);
  return fGets.M_get(args);
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_set(RtclArgs& args)
int RtclRw11Cpu::M_set(RtclArgs& args)
{
{
  // synchronize with server thread
  // synchronize with server thread
  boost::lock_guard<RlinkConnect> lock(Obj().Connect());
  boost::lock_guard<RlinkConnect> lock(Obj().Connect());
  return fSets.M_set(args);
  return fSets.M_set(args);
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_show(RtclArgs& args)
int RtclRw11Cpu::M_show(RtclArgs& args)
{
{
  static RtclNameSet optset("-pcps|-r0r5|-mmu|-ubmap"
  static RtclNameSet optset("-pcps|-r0ps|-mmu|-ubmap"
                            );
                            );
 
 
  string opt;
  string opt;
  uint16_t base = Obj().Base();
  uint16_t base = Obj().Base();
  ostringstream sos;
  ostringstream sos;
  RerrMsg emsg;
  RerrMsg emsg;
 
 
  const char* mode[4]  = {"k","s","?","u"};
  const char* mode[4]  = {"k","s","?","u"};
  const char* rust[16] = {"init",     "HALTed",   "reset",   "stopped",
  const char* rust[16] = {"init",     "HALTed",   "reset",   "stopped",
                          "stepped",  "suspend",  "0110",    "..run..",
                          "stepped",  "suspend",  "0110",    "..run..",
                          "F:vecfet", "F:redstk", "1010",    "1011",
                          "F:vecfet", "F:redstk", "1010",    "1011",
                          "F:seq",    "F:vmbox" , "1101",    "1111"};
                          "F:seq",    "F:vmbox" , "1101",    "1111"};
 
 
  while (args.NextOpt(opt, optset)) {
  while (args.NextOpt(opt, optset)) {
    if (opt == "-pcps") {
    if (opt == "-pcps" || opt == "-r0ps") {
      RlinkCommandList clist;
      RlinkCommandList clist;
      size_t i_pc   = clist.AddRreg(base + Rw11Cpu::kCp_addr_pc);
      size_t i_pc   = clist.AddRreg(base + Rw11Cpu::kCp_addr_pc);
      size_t i_sp   = clist.AddRreg(base + Rw11Cpu::kCp_addr_r0+6);
 
      size_t i_psw  = clist.AddRreg(base + Rw11Cpu::kCp_addr_psw);
      size_t i_psw  = clist.AddRreg(base + Rw11Cpu::kCp_addr_psw);
      size_t i_stat = clist.AddRreg(base + Rw11Cpu::kCp_addr_stat);
      size_t i_stat = clist.AddRreg(base + Rw11Cpu::kCp_addr_stat);
      if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
      if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
      uint16_t psw  = clist[i_psw].Data();
      uint16_t psw  = clist[i_psw].Data();
      uint16_t stat = clist[i_stat].Data();
      uint16_t stat = clist[i_stat].Data();
      uint16_t psw_cm    = (psw>>14) & 003;
      uint16_t psw_cm    = (psw>>14) & 003;
      uint16_t psw_pm    = (psw>>12) & 003;
      uint16_t psw_pm    = (psw>>12) & 003;
      uint16_t psw_set   = (psw>>11) & 001;
      uint16_t psw_set   = (psw>>11) & 001;
      uint16_t psw_pri   = (psw>>5)  & 007;
      uint16_t psw_pri   = (psw>>5)  & 007;
      uint16_t psw_tbit  = (psw>>4)  & 001;
      uint16_t psw_tbit  = (psw>>4)  & 001;
      uint16_t psw_nzvc  = (psw)     & 017;
      uint16_t psw_nzvc  = (psw)     & 017;
      uint16_t stat_rust = (stat>>4) & 017;
      uint16_t stat_rust = (stat>>4) & 017;
      sos << "PC=" << RosPrintBvi(clist[i_pc].Data(),8)
      uint16_t regs[8];
          << " SP=" << RosPrintBvi(clist[i_sp].Data(),8)
      regs[7] = clist[i_pc].Data();
          << " PS=" << RosPrintBvi(psw,8)
      bool r0ps = opt == "-r0ps";
 
 
 
      if (r0ps) {
 
        clist.Clear();
 
        for (size_t i=0; i<7; i++) clist.AddRreg(base + Rw11Cpu::kCp_addr_r0+i);
 
        if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
 
        for (size_t i=0; i<7; i++) regs[i] = clist[i].Data();
 
      }
 
 
 
      if (r0ps)  sos << "Processor registers and status:" << endl;
 
      if (!r0ps) sos << "  PC: " << RosPrintBvi(regs[7],8);
 
      sos << "  PS: " << RosPrintBvi(psw,8)
          << " cm,pm=" << mode[psw_cm] << "," << mode[psw_pm]
          << " cm,pm=" << mode[psw_cm] << "," << mode[psw_pm]
          << " s,p,t=" << psw_set << "," << psw_pri << "," << psw_tbit
          << " s,p,t=" << psw_set << "," << psw_pri << "," << psw_tbit
          << " NZVC=" << RosPrintBvi(psw_nzvc,2,4)
          << " NZVC=" << RosPrintBvi(psw_nzvc,2,4)
          << " rust=" << RosPrintBvi(stat_rust,8,4) << " " << rust[stat_rust]
          << "  rust: " << RosPrintBvi(stat_rust,8,4) << " " << rust[stat_rust]
          << endl;
          << endl;
 
 
 
      if (r0ps) {
 
        sos << "  R0: " << RosPrintBvi(regs[0],8)
 
            << "  R1: " << RosPrintBvi(regs[1],8)
 
            << "  R2: " << RosPrintBvi(regs[2],8)
 
            << "  R3: " << RosPrintBvi(regs[3],8) << endl;
 
        sos << "  R4: " << RosPrintBvi(regs[4],8)
 
            << "  R5: " << RosPrintBvi(regs[5],8)
 
            << "  SP: " << RosPrintBvi(regs[6],8)
 
            << "  PC: " << RosPrintBvi(regs[7],8) << endl;
 
      }
 
 
    } else if (opt == "-r0r5") {
    } else if (opt == "-r0r5") {
      RlinkCommandList clist;
      RlinkCommandList clist;
      for (size_t i=0; i<6; i++) clist.AddRreg(base + Rw11Cpu::kCp_addr_r0+i);
      for (size_t i=0; i<6; i++) clist.AddRreg(base + Rw11Cpu::kCp_addr_r0+i);
      if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
      if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
      sos << "R0-R5:";
      sos << "R0-R5:";
      for (size_t i=0; i<6; i++) sos << "  " << RosPrintBvi(clist[i].Data(),8);
      for (size_t i=0; i<6; i++) sos << "  " << RosPrintBvi(clist[i].Data(),8);
      sos << endl;
      sos << endl;
 
 
    } else if (opt == "-mmu") {
    } else if (opt == "-mmu") {
      uint16_t mmr[4];
      uint16_t mmr[4];
      uint16_t asr[3][32];
      uint16_t asr[3][32];
      const char* pmode[3] = {"km","sm","um"};
      const char* pmode[3] = {"km","sm","um"};
      const char* acf[8] = {"nres ",
      const char* acf[8] = {"nres ",
                            "r -r ",
                            "r -r ",
                            "r    ",
                            "r    ",
                            "011  ",
                            "011  ",
                            "rw-rw",
                            "rw-rw",
                            "rw- w",
                            "rw- w",
                            "rw   ",
                            "rw   ",
                            "111  "};
                            "111  "};
      {
      {
        boost::lock_guard<RlinkConnect> lock(Connect());
        boost::lock_guard<RlinkConnect> lock(Connect());
        RlinkCommandList clist;
        RlinkCommandList clist;
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0177572);
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0177572);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, mmr, 3);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, mmr, 3);
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0172516);
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0172516);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, mmr+3, 1);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, mmr+3, 1);
        if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
        if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
        clist.Clear();
        clist.Clear();
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0172300);
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0172300);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, asr[0], 32);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, asr[0], 32);
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0172200);
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0172200);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, asr[1], 32);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, asr[1], 32);
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0177600);
        clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0177600);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, asr[2], 32);
        clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, asr[2], 32);
        if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
        if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
      }
      }
      uint16_t mmr1_0_reg = (mmr[1]    ) & 07;
      uint16_t mmr1_0_reg = (mmr[1]    ) & 07;
       int16_t mmr1_0_val = (mmr[1]>> 3) & 37;
       int16_t mmr1_0_val = (mmr[1]>> 3) & 37;
      uint16_t mmr1_1_reg = (mmr[1]>> 8) & 07;
      uint16_t mmr1_1_reg = (mmr[1]>> 8) & 07;
       int16_t mmr1_1_val = (mmr[1]>>11) & 37;
       int16_t mmr1_1_val = (mmr[1]>>11) & 37;
      uint16_t mmr3_ubmap = (mmr[3]>> 5) & 01;
      uint16_t mmr3_ubmap = (mmr[3]>> 5) & 01;
      uint16_t mmr3_22bit = (mmr[3]>> 4) & 01;
      uint16_t mmr3_22bit = (mmr[3]>> 4) & 01;
      uint16_t mmr3_d_km  = (mmr[3]>> 2) & 01;
      uint16_t mmr3_d_km  = (mmr[3]>> 2) & 01;
      uint16_t mmr3_d_sm  = (mmr[3]>> 1) & 01;
      uint16_t mmr3_d_sm  = (mmr[3]>> 1) & 01;
      uint16_t mmr3_d_um  = (mmr[3]    ) & 01;
      uint16_t mmr3_d_um  = (mmr[3]    ) & 01;
      sos << "mmu:" << endl;
      sos << "mmu:" << endl;
      sos << "mmr0=" << RosPrintBvi(mmr[0],8) << endl;
      sos << "mmr0=" << RosPrintBvi(mmr[0],8) << endl;
      if (mmr1_0_val & 020) mmr1_0_val |= 0177740;
      if (mmr1_0_val & 020) mmr1_0_val |= 0177740;
      if (mmr1_1_val & 020) mmr1_1_val |= 0177740;
      if (mmr1_1_val & 020) mmr1_1_val |= 0177740;
      sos << "mmr1=" << RosPrintBvi(mmr[1],8);
      sos << "mmr1=" << RosPrintBvi(mmr[1],8);
      if (mmr1_0_val) sos << "  r" << mmr1_0_reg
      if (mmr1_0_val) sos << "  r" << mmr1_0_reg
                          << ":" << RosPrintf(mmr1_0_val,"d",3);
                          << ":" << RosPrintf(mmr1_0_val,"d",3);
      if (mmr1_1_val) sos << "  r" << mmr1_1_reg
      if (mmr1_1_val) sos << "  r" << mmr1_1_reg
                          << ":" << RosPrintf(mmr1_1_val,"d",3);
                          << ":" << RosPrintf(mmr1_1_val,"d",3);
      sos << endl;
      sos << endl;
      sos << "mmr2=" << RosPrintBvi(mmr[2],8) << endl;
      sos << "mmr2=" << RosPrintBvi(mmr[2],8) << endl;
      sos << "mmr3=" << RosPrintBvi(mmr[3],8)
      sos << "mmr3=" << RosPrintBvi(mmr[3],8)
          << "  ubmap=" << mmr3_ubmap
          << "  ubmap=" << mmr3_ubmap
          << "  22bit=" << mmr3_22bit
          << "  22bit=" << mmr3_22bit
          << "  d-space k,s,u=" << mmr3_d_km
          << "  d-space k,s,u=" << mmr3_d_km
          << "," << mmr3_d_sm << "," << mmr3_d_um << endl;
          << "," << mmr3_d_sm << "," << mmr3_d_um << endl;
      for (size_t m=0; m<3; m++) {
      for (size_t m=0; m<3; m++) {
        sos << pmode[m] << "   "
        sos << pmode[m] << "   "
            << " I pdr slf aw d acf     I par"
            << " I pdr slf aw d acf     I par"
            << "    "
            << "    "
            << " D pdr slf aw d acf     D par" << endl;
            << " D pdr slf aw d acf     D par" << endl;
        for (size_t i=0; i<=7; i++) {
        for (size_t i=0; i<=7; i++) {
          sos << "   " << i << " ";
          sos << "   " << i << " ";
          for (size_t s=0; s<=1; s++) {
          for (size_t s=0; s<=1; s++) {
            if (s!=0) sos << "    ";
            if (s!=0) sos << "    ";
            uint16_t pdr = asr[m][i   +8*s];
            uint16_t pdr = asr[m][i   +8*s];
            uint16_t par = asr[m][i+16+8*s];
            uint16_t par = asr[m][i+16+8*s];
            uint16_t pdr_slf = (pdr>>8) & 0177;
            uint16_t pdr_slf = (pdr>>8) & 0177;
            uint16_t pdr_a   = (pdr>>7) & 01;
            uint16_t pdr_a   = (pdr>>7) & 01;
            uint16_t pdr_w   = (pdr>>6) & 01;
            uint16_t pdr_w   = (pdr>>6) & 01;
            uint16_t pdr_e   = (pdr>>3) & 01;
            uint16_t pdr_e   = (pdr>>3) & 01;
            uint16_t pdr_acf = (pdr)    & 07;
            uint16_t pdr_acf = (pdr)    & 07;
            sos<< RosPrintBvi(pdr,8)
            sos<< RosPrintBvi(pdr,8)
               << " " << RosPrintf(pdr_slf,"d",3)
               << " " << RosPrintf(pdr_slf,"d",3)
               << " " << pdr_a << pdr_w
               << " " << pdr_a << pdr_w
               << " " << (pdr_e ? "d" : "u")
               << " " << (pdr_e ? "d" : "u")
               << " " << acf[pdr_acf]
               << " " << acf[pdr_acf]
               << "  " << RosPrintBvi(par,8);
               << "  " << RosPrintBvi(par,8);
          }
          }
          sos << endl;
          sos << endl;
        }
        }
      }
      }
 
 
    } else if (opt == "-ubmap") {
    } else if (opt == "-ubmap") {
      uint16_t ubmap[64];
      uint16_t ubmap[64];
      RlinkCommandList clist;
      RlinkCommandList clist;
      clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0170200);
      clist.AddWreg(base + Rw11Cpu::kCp_addr_al, 0170200);
      clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, ubmap, 64);
      clist.AddRblk(base + Rw11Cpu::kCp_addr_memi, ubmap, 64);
      if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
      if (!Server().Exec(clist, emsg)) return args.Quit(emsg);
      sos << "unibus map:" << endl;
      sos << "unibus map:" << endl;
      for (size_t i = 0; i<=7; i++) {
      for (size_t i = 0; i<=7; i++) {
        for (size_t j = 0; j <= 030; j+=010) {
        for (size_t j = 0; j <= 030; j+=010) {
          size_t k = 2*(i+j);
          size_t k = 2*(i+j);
          uint32_t data = uint32_t(ubmap[k]) | (uint32_t(ubmap[k+1]))<<16;
          uint32_t data = uint32_t(ubmap[k]) | (uint32_t(ubmap[k+1]))<<16;
          if (j!=0) sos << "  ";
          if (j!=0) sos << "  ";
          sos << RosPrintBvi(j+i,8,5) << " "
          sos << RosPrintBvi(uint32_t(j+i),8,5) << " "
              << RosPrintBvi(data,8,22);
              << RosPrintBvi(data,8,22);
        }
        }
        sos << endl;
        sos << endl;
      }
      }
    }
    }
  }
  }
 
 
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
  args.SetResult(sos);
  args.SetResult(sos);
 
 
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_stats(RtclArgs& args)
int RtclRw11Cpu::M_stats(RtclArgs& args)
{
{
  RtclStats::Context cntx;
  RtclStats::Context cntx;
  if (!RtclStats::GetArgs(args, cntx)) return kERR;
  if (!RtclStats::GetArgs(args, cntx)) return kERR;
  if (!RtclStats::Collect(args, cntx, Obj().Stats())) return kERR;
  if (!RtclStats::Collect(args, cntx, Obj().Stats())) return kERR;
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_dump(RtclArgs& args)
int RtclRw11Cpu::M_dump(RtclArgs& args)
{
{
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
 
  ostringstream sos;
  ostringstream sos;
  Obj().Dump(sos, 0);
  Obj().Dump(sos, 0);
  args.SetResult(sos);
  args.SetResult(sos);
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRw11Cpu::M_default(RtclArgs& args)
int RtclRw11Cpu::M_default(RtclArgs& args)
{
{
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
  ostringstream sos;
  ostringstream sos;
 
 
  vector<string> cntlnames;
  vector<string> cntlnames;
  Obj().ListCntl(cntlnames);
  Obj().ListCntl(cntlnames);
 
 
  sos << "name type ibbase lam" << endl;
  sos << "name type ibbase lam" << endl;
 
 
  for (size_t i=0; i<cntlnames.size(); i++) {
  for (size_t i=0; i<cntlnames.size(); i++) {
    Rw11Cntl& cntl(Obj().Cntl(cntlnames[i]));
    Rw11Cntl& cntl(Obj().Cntl(cntlnames[i]));
    sos << RosPrintf(cntl.Name().c_str(),"-s",4)
    sos << RosPrintf(cntl.Name().c_str(),"-s",4)
        << " " << RosPrintf(cntl.Type().c_str(),"-s",4)
        << " " << RosPrintf(cntl.Type().c_str(),"-s",4)
        << " " << RosPrintf(cntl.Base(),"o",6)
        << " " << RosPrintf(cntl.Base(),"o",6)
        << " " << RosPrintf(cntl.Lam(),"d",3)
        << " " << RosPrintf(cntl.Lam(),"d",3)
        << endl;
        << endl;
  }
  }
 
 
  args.AppendResultLines(sos);
  args.AppendResultLines(sos);
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
void RtclRw11Cpu::SetupGetSet()
void RtclRw11Cpu::SetupGetSet()
{
{
  Rw11Cpu* pobj = &Obj();
  Rw11Cpu* pobj = &Obj();
  fGets.Add<const string&>("type",  boost::bind(&Rw11Cpu::Type, pobj));
  fGets.Add<const string&>("type",  boost::bind(&Rw11Cpu::Type, pobj));
  fGets.Add<size_t>       ("index", boost::bind(&Rw11Cpu::Index, pobj));
  fGets.Add<size_t>       ("index", boost::bind(&Rw11Cpu::Index, pobj));
  fGets.Add<uint16_t>     ("base",  boost::bind(&Rw11Cpu::Base, pobj));
  fGets.Add<uint16_t>     ("base",  boost::bind(&Rw11Cpu::Base, pobj));
  return;
  return;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
bool RtclRw11Cpu::GetVarName(RtclArgs& args, const char* argname,
bool RtclRw11Cpu::GetVarName(RtclArgs& args, const char* argname,
                             size_t nind,
                             size_t nind,
                             std::vector<std::string>& varname)
                             std::vector<std::string>& varname)
{
{
  while (varname.size() < nind+1) varname.push_back(string());
  while (varname.size() < nind+1) varname.push_back(string());
  string name;
  string name;
  if (!args.GetArg(argname, name)) return false;
  if (!args.GetArg(argname, name)) return false;
  if (name.length()) {                      // if variable defined
  if (name.length()) {                      // if variable defined
    char c = name[0];
    char c = name[0];
    if (isdigit(c) || c=='+' || c=='-' ) {  // check for mistaken number
    if (isdigit(c) || c=='+' || c=='-' ) {  // check for mistaken number
      args.AppendResult("-E: invalid variable name '", name.c_str(),
      args.AppendResult("-E: invalid variable name '", name.c_str(),
                        "': looks like a number", NULL);
                        "': looks like a number", NULL);
      return false;
      return false;
    }
    }
  }
  }
 
 
  varname[nind] = name;
  varname[nind] = name;
  return true;
  return true;
}
}
 
 
} // end namespace Retro
} // end namespace Retro
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.