/*************************************************************************** * Copyright (C) 2006 Nicolas Hadacek * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include "pic_register.h" #include "pic.h" //----------------------------------------------------------------------------- Pic::RegistersData::RegistersData(const Data &data) : nbBanks(0), accessBankSplit(0), _data(data) {} Address Pic::RegistersData::mirroredAddress(Address address) const { Address mirror = address; for (uint i=0; i=mirrored[i][k].start+mirrored[i][k].length ) continue; delta = address - mirrored[i][k].start; break; } if ( delta==-1 ) continue; for (uint k=0; k::const_iterator it; for (it=sfrs.begin(); it!=sfrs.end(); ++it) { if ( it.data().address!=address ) continue; for (uint i=0; i=unused[i].start && address"; case Sfr: return sfrNames[address]; } Q_ASSERT(false); return TQString(); } bool Pic::RegistersData::hasPort(uint index) const { Q_ASSERT( index Pic::RegistersData::relatedRegisters(const Register::TypeData &data) const { TQValueList list; if ( data.type()==Register::Regular ) { int i = portIndex(data.address()); if ( i==-1 ) list.append(data); else { list.append(Register::TypeData(sfrs[portName(i)].address, nbChars())); if ( hasTris(i) ) list.append(Register::TypeData(sfrs[trisName(i)].address, nbChars())); if ( hasLatch(i) ) list.append(Register::TypeData(sfrs[latchName(i)].address, nbChars())); } } else if ( data.type()==Register::Combined ) { uint nb = nbBitsToNbBytes(4*data.nbChars()) / nbBytes(); for (uint i=0; i::const_iterator it; for (it=sfrNames.begin(); it!=sfrNames.end(); ++it) if ( bankFromAddress(it.key())==i ) return true; return false; } bool Pic::RegistersData::hasSharedGprs(uint &firstIndex, bool &all) const { bool ok = false; all = true; for (uint i=0; i>(TQDataStream &s, RangeData &rd) { s >> rd.start >> rd.length; return s; } TQDataStream &Pic::operator <<(TQDataStream &s, const RegisterBitData &rbd) { s << TQ_UINT8(rbd.properties) << TQ_UINT8(rbd.por) << TQ_UINT8(rbd.mclr); return s; } TQDataStream &Pic::operator >>(TQDataStream &s, RegisterBitData &rbd) { TQ_UINT8 properties, por, mclr; s >> properties >> por >> mclr; rbd.properties = RegisterBitProperties(properties); rbd.por = RegisterBitState(por); rbd.mclr = RegisterBitState(mclr); return s; } TQDataStream &Pic::operator <<(TQDataStream &s, const RegisterData &rd) { s << rd.address; for (int i=0; i>(TQDataStream &s, RegisterData &rd) { s >> rd.address; for (int i=0; i> rd.bits[i]; return s; } TQDataStream &Pic::operator <<(TQDataStream &s, const CombinedData &rd) { s << rd.address << rd.nbChars; return s; } TQDataStream &Pic::operator >>(TQDataStream &s, CombinedData &rd) { s >> rd.address >> rd.nbChars; return s; } TQDataStream &Pic::operator <<(TQDataStream &s, const RegistersData &rd) { s << rd.nbBanks << rd.accessBankSplit << rd.unusedBankMask; s << rd.sfrs << rd.mirrored << rd.unused << rd.combined; return s; } TQDataStream &Pic::operator >>(TQDataStream &s, RegistersData &rd) { s >> rd.nbBanks >> rd.accessBankSplit >> rd.unusedBankMask; s >> rd.sfrs >> rd.mirrored >> rd.unused >> rd.combined; rd.sfrNames.clear(); TQMap::const_iterator it; for(it=rd.sfrs.begin(); it!=rd.sfrs.end(); ++it) rd.sfrNames[it.data().address] = it.key(); return s; }