// $Id: Rw11UnitTape.cpp 1090 2018-12-21 12:17:35Z mueller $ // // Copyright 2015-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free // 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 // 2018-12-19 1090 1.0.3 use RosPrintf(bool) // 2018-12-09 1080 1.0.2 use HasVirt(); Virt() returns ref // 2017-04-07 868 1.0.1 Dump(): add detail arg // 2015-06-04 686 1.0 Initial version // 2015-05-17 683 0.1 First draft // --------------------------------------------------------------------------- /*! \file \brief Implemenation of Rw11UnitTape. */ #include "librtools/Rexception.hpp" #include "librtools/RosFill.hpp" #include "librtools/RosPrintf.hpp" #include "Rw11UnitTape.hpp" using namespace std; /*! \class Retro::Rw11UnitTape \brief FIXME_docs */ // all method definitions in namespace Retro namespace Retro { //------------------------------------------+----------------------------------- //! Constructor Rw11UnitTape::Rw11UnitTape(Rw11Cntl* pcntl, size_t index) : Rw11UnitVirt(pcntl, index), fType(), fEnabled(false), fWProt(false), fCapacity(0) {} //------------------------------------------+----------------------------------- //! Destructor Rw11UnitTape::~Rw11UnitTape() {} //------------------------------------------+----------------------------------- //! FIXME_docs void Rw11UnitTape::SetType(const std::string& /*type*/) { throw Rexception("Rw11UnitTape::SetType", string("Bad args: only type '") + fType + "' supported"); } //------------------------------------------+----------------------------------- //! FIXME_docs void Rw11UnitTape::SetWProt(bool wprot) { if (HasVirt()) throw Rexception("Rw11UnitTape::SetWProt", "not allowed when tape attached"); fWProt = wprot; return; } //------------------------------------------+----------------------------------- //! FIXME_docs void Rw11UnitTape::SetCapacity(size_t nbyte) { if (HasVirt()) throw Rexception("Rw11UnitTape::SetCapacity", "not allowed when tape attached"); fCapacity = nbyte; return; } //------------------------------------------+----------------------------------- //! FIXME_docs void Rw11UnitTape::SetPosFile(int posfile) { if (!HasVirt()) throw Rexception("Rw11UnitTape::SetPosFile", "no tape attached"); Virt().SetPosFile(posfile); return; } //------------------------------------------+----------------------------------- //! FIXME_docs void Rw11UnitTape::SetPosRecord(int posrec) { if (!HasVirt()) throw Rexception("Rw11UnitTape::SetPosRecord", "no tape attached"); Virt().SetPosRecord(posrec); return; } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::Bot() const { if (!HasVirt()) return false; return Virt().Bot(); } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::Eot() const { if (!HasVirt()) return false; return Virt().Eot(); } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::Eom() const { if (!HasVirt()) return false; return Virt().Eom(); } //------------------------------------------+----------------------------------- //! FIXME_docs int Rw11UnitTape::PosFile() const { if (!HasVirt()) return -1; return Virt().PosFile(); } //------------------------------------------+----------------------------------- //! FIXME_docs int Rw11UnitTape::PosRecord() const { if (!HasVirt()) return -1; return Virt().PosRecord(); } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::VirtReadRecord(size_t nbyte, uint8_t* data, size_t& ndone, int& opcode, RerrMsg& emsg) { if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtReadRecord", "no tape attached"); return false; } return Virt().ReadRecord(nbyte, data, ndone, opcode, emsg); } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::VirtWriteRecord(size_t nbyte, const uint8_t* data, int& opcode, RerrMsg& emsg) { if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtWriteRecord", "no tape attached"); return false; } return Virt().WriteRecord(nbyte, data, opcode, emsg); } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::VirtWriteEof(RerrMsg& emsg) { if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtWriteEof", "no tape attached"); return false; } return Virt().WriteEof(emsg); } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::VirtSpaceForw(size_t nrec, size_t& ndone, int& opcode, RerrMsg& emsg) { if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtSpaceForw", "no tape attached"); return false; } return Virt().SpaceForw(nrec, ndone, opcode, emsg); } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::VirtSpaceBack(size_t nrec, size_t& ndone, int& opcode, RerrMsg& emsg) { if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtSpaceBack", "no tape attached"); return false; } return Virt().SpaceBack(nrec, ndone, opcode, emsg); } //------------------------------------------+----------------------------------- //! FIXME_docs bool Rw11UnitTape::VirtRewind(int& opcode, RerrMsg& emsg) { if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtRewind", "no tape attached"); return false; } return Virt().Rewind(opcode, emsg); } //------------------------------------------+----------------------------------- //! FIXME_docs void Rw11UnitTape::Dump(std::ostream& os, int ind, const char* text, int detail) const { RosFill bl(ind); os << bl << (text?text:"--") << "Rw11UnitTape @ " << this << endl; os << bl << " fType: " << fType << endl; os << bl << " fEnabled: " << RosPrintf(fEnabled) << endl; os << bl << " fWProt: " << RosPrintf(fWProt) << endl; os << bl << " fCapacity: " << fCapacity << endl; Rw11UnitVirt::Dump(os, ind, " ^", detail); return; } } // end namespace Retro