diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-24 18:42:24 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-24 18:42:24 +0000 |
commit | f508189682b6fba62e08feeb1596f682bad5fff9 (patch) | |
tree | 28aeb0e6c19386c385c1ce5edf8a92c1bca15281 /src/tools/gputils/gputils_generator.cpp | |
download | piklab-f508189682b6fba62e08feeb1596f682bad5fff9.tar.gz piklab-f508189682b6fba62e08feeb1596f682bad5fff9.zip |
Added KDE3 version of PikLab
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/piklab@1095639 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/tools/gputils/gputils_generator.cpp')
-rw-r--r-- | src/tools/gputils/gputils_generator.cpp | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/src/tools/gputils/gputils_generator.cpp b/src/tools/gputils/gputils_generator.cpp new file mode 100644 index 0000000..3bcebac --- /dev/null +++ b/src/tools/gputils/gputils_generator.cpp @@ -0,0 +1,256 @@ +/*************************************************************************** + * Copyright (C) 2007 Nicolas Hadacek <[email protected]> * + * * + * 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 "gputils_generator.h" + +#include "devices/pic/pic/pic_memory.h" +#include "devices/pic/base/pic_register.h" +#include "devices/list/device_list.h" + +//---------------------------------------------------------------------------- +QValueList<const Device::Data *> GPUtils::getSupportedDevices(const QString &s) +{ + QStringList devices = QStringList::split(' ', s.simplifyWhiteSpace().upper()); + QValueList<const Device::Data *> list; + for (uint i=0; i<devices.count(); i++) { + QString name = devices[i]; + if ( devices[i].startsWith("P1") ) name = name.mid(1); + const Device::Data *data = Device::lister().data(name); + if (data) list.append(data); + } + return list; +} + +//---------------------------------------------------------------------------- +SourceLine::List GPUtils::SourceGenerator::configLines(PURL::ToolType, const Device::Memory &memory, bool &ok) const +{ + return GPUtils::generateConfigLines(static_cast<const Pic::Memory &>(memory), ok); +} + +SourceLine::List GPUtils::SourceGenerator::includeLines(PURL::ToolType, const Device::Data &data) const +{ + return GPUtils::includeLines(data); +} + +SourceLine::List GPUtils::SourceGenerator::sourceFileContent(PURL::ToolType, const Device::Data &data, bool &ok) const +{ + ok = true; + SourceLine::List lines; + lines.appendSeparator(); + const Pic::Data &pdata = static_cast<const Pic::Data &>(data); + const Pic::RegistersData &rdata = static_cast<const Pic::RegistersData &>(*data.registersData()); + switch (pdata.architecture().type()) { + case Pic::Architecture::P10X: + lines.appendTitle(i18n("relocatable code")); + lines.appendNotIndentedCode("PROG CODE"); + lines.appendNotIndentedCode("start"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert code") + " >>"); + lines.appendIndentedCode("goto $", i18n("loop forever")); + lines.appendEmpty(); + lines.appendNotIndentedCode("END"); + break; + case Pic::Architecture::P16X: { + lines.appendTitle(i18n("Variables declaration")); + bool needPCLATH = ( pdata.nbWords(Pic::MemoryRangeType::Code)>0x400 ); + uint first; + bool allShared; + bool hasShared = rdata.hasSharedGprs(first, allShared); + if ( hasShared && !allShared ) lines.appendNotIndentedCode("INT_VAR UDATA_SHR"); + else { + first = rdata.firstGprIndex(); + lines.appendNotIndentedCode("INT_VAR UDATA " + toHexLabel(first, rdata.nbCharsAddress())); + } + lines.appendNotIndentedCode("w_saved RES 1", i18n("variable used for context saving")); + lines.appendNotIndentedCode("status_saved RES 1", i18n("variable used for context saving")); + first += 2; + if (needPCLATH) { + lines.appendNotIndentedCode("pclath_saved RES 1", i18n("variable used for context saving")); + first++; + } + lines.appendEmpty(); + lines.appendNotIndentedCode("var1 RES 1", i18n("example variable")); + if ( !hasShared ) { + for (uint i=1; i<rdata.nbBanks; i++) { + uint address = first + i*rdata.nbBytesPerBank(); + lines.appendNotIndentedCode(QString("INT_VAR%1 UDATA ").arg(i) + toHexLabel(address, rdata.nbCharsAddress()), i18n("variables used for context saving")); + lines.appendNotIndentedCode(QString("w_saved%1 RES 1").arg(i), i18n("variable used for context saving")); + } + } + lines.appendEmpty(); + lines.appendSeparator(); + lines.appendTitle(i18n("reset vector")); + lines.appendNotIndentedCode("STARTUP CODE 0x000"); + lines.appendIndentedCode("nop", i18n("needed for ICD2 debugging")); + lines.appendIndentedCode("movlw high start", i18n("load upper byte of 'start' label")); + lines.appendIndentedCode("movwf PCLATH", i18n("initialize PCLATH")); + lines.appendIndentedCode("goto start", i18n("go to start of main code")); + lines.appendEmpty(); + lines.appendTitle(i18n("interrupt vector")); + lines.appendNotIndentedCode("INT_VECTOR CODE 0x004"); + lines.appendIndentedCode("goto interrupt", i18n("go to start of interrupt code")); + lines.appendEmpty(); + lines.appendTitle(i18n("relocatable code")); + lines.appendNotIndentedCode("PROG CODE"); + lines.appendNotIndentedCode("interrupt"); + lines.appendIndentedCode("movwf w_saved", i18n("save context")); + lines.appendIndentedCode("swapf STATUS,w"); + if ( !hasShared ) lines.appendIndentedCode("clrf STATUS"); + lines.appendIndentedCode("movwf status_saved"); + if (needPCLATH) { + lines.appendIndentedCode("movf PCLATH,w", i18n("only required if using more than first page")); + lines.appendIndentedCode("movwf pclath_saved"); + lines.appendIndentedCode("clrf PCLATH"); + } + lines.appendIndentedCode(QString::null, "<< " + i18n("insert interrupt code") + " >>"); + if (needPCLATH) { + lines.appendIndentedCode("movf pclath_saved,w", i18n("restore context")); + lines.appendIndentedCode("movwf PCLATH"); + lines.appendIndentedCode("swapf status_saved,w"); + } else lines.appendIndentedCode("swapf status_saved,w", i18n("restore context")); + lines.appendIndentedCode("movwf STATUS"); + lines.appendIndentedCode("swapf w_saved,f"); + lines.appendIndentedCode("swapf w_saved,w"); + lines.appendIndentedCode("retfie"); + lines.appendEmpty(); + lines.appendNotIndentedCode("start"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert main code") + " >>"); + lines.appendIndentedCode("goto $", i18n("loop forever")); + lines.appendEmpty(); + lines.appendNotIndentedCode("END"); + break; + } + case Pic::Architecture::P17C: + lines.appendTitle(i18n("Variables declaration")); + lines.appendNotIndentedCode("INT_VAR UDATA " + toHexLabel(rdata.accessBankSplit, rdata.nbCharsAddress())); + lines.appendNotIndentedCode("wred_saved RES 1", i18n("variable used for context saving (for low-priority interrupts only)")); + lines.appendNotIndentedCode("alusta_saved RES 1", i18n("variable used for context saving (for low-priority interrupts only)")); + lines.appendNotIndentedCode("bsr_saved RES 1", i18n("variable used for context saving (for low-priority interrupts only)")); + lines.appendNotIndentedCode("pclath_saved RES 1", i18n("variable used for context saving (for low-priority interrupts only)")); + lines.appendEmpty(); + lines.appendNotIndentedCode("var1 RES 1", i18n("example variable")); + lines.appendEmpty(); + lines.appendSeparator(); + lines.appendTitle(i18n("Macros")); + lines.appendNotIndentedCode("PUSH MACRO", i18n("for saving context")); + lines.appendIndentedCode("movpf WREG,wred_saved"); + lines.appendIndentedCode("movpf ALUSTA,alusta_saved"); + lines.appendIndentedCode("movpf BSR,bsr_saved"); + lines.appendIndentedCode("movpf PCLATH,pclath_saved"); + lines.appendIndentedCode("ENDM"); + lines.appendEmpty(); + lines.appendNotIndentedCode("POP MACRO", i18n("for restoringing context")); + lines.appendIndentedCode("movfp pclath_saved,PCLATH"); + lines.appendIndentedCode("movfp bsr_saved,BSR"); + lines.appendIndentedCode("movfp alusta_saved,ALUSTA"); + lines.appendIndentedCode("movfp wred_saved,WREG"); + lines.appendIndentedCode("ENDM"); + lines.appendSeparator(); + lines.appendTitle(i18n("reset vector")); + lines.appendNotIndentedCode("STARTUP CODE 0x0000"); + lines.appendIndentedCode("nop", i18n("needed for ICD2 debugging")); + lines.appendIndentedCode("nop", i18n("needed for ICD2 debugging")); + lines.appendIndentedCode("goto start", i18n("go to start of main code")); + lines.appendEmpty(); + lines.appendNotIndentedCode("INT_PIN_VECTOR CODE 0x0008"); + lines.appendIndentedCode("PUSH"); + lines.appendIndentedCode("goto int_pin_isr", i18n("go to start of int pin interrupt code")); + lines.appendEmpty(); + lines.appendNotIndentedCode("TIMER0_VECTOR CODE 0x0010"); + lines.appendIndentedCode("PUSH"); + lines.appendIndentedCode("goto timer0_isr", i18n("go to start of timer0 interrupt code")); + lines.appendEmpty(); + lines.appendNotIndentedCode("T0CKI_VECTOR CODE 0x00018"); + lines.appendIndentedCode("PUSH"); + lines.appendIndentedCode("goto t0cki_isr", i18n("go to start of t0cki interrupt code")); + lines.appendEmpty(); + lines.appendNotIndentedCode("PERIPHERAL_VECTOR CODE 0x0020"); + lines.appendIndentedCode("PUSH"); + lines.appendIndentedCode("goto peripheral_isr", i18n("go to start of peripheral interrupt code")); + lines.appendEmpty(); + lines.appendNotIndentedCode("start:"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert main code") + " >>"); + lines.appendIndentedCode("goto $", i18n("loop forever")); + lines.appendEmpty(); + lines.appendTitle(i18n("INT pin interrupt service routine")); + lines.appendNotIndentedCode("int_pin_isr:"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert INT pin interrupt code") + " >>"); + lines.appendIndentedCode("POP"); + lines.appendIndentedCode("retfie"); + lines.appendEmpty(); + lines.appendTitle(i18n("TIMER0 interrupt service routine")); + lines.appendNotIndentedCode("timer0_isr:"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert TIMER0 interrupt code") + " >>"); + lines.appendIndentedCode("POP"); + lines.appendIndentedCode("retfie"); + lines.appendEmpty(); + lines.appendTitle(i18n("T0CKI interrupt service routine")); + lines.appendNotIndentedCode("t0cki_isr:"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert T0CKI interrupt code") + " >>"); + lines.appendIndentedCode("POP"); + lines.appendIndentedCode("retfie"); + lines.appendEmpty(); + lines.appendTitle(i18n("peripheral interrupt service routine")); + lines.appendNotIndentedCode("peripheral_isr:"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert peripheral interrupt code") + " >>"); + lines.appendIndentedCode("POP"); + lines.appendIndentedCode("retfie"); + lines.appendEmpty(); + lines.appendNotIndentedCode("END"); + break; + case Pic::Architecture::P18C: + case Pic::Architecture::P18F: + case Pic::Architecture::P18J: // ?? + lines.appendTitle(i18n("Variables declaration")); + lines.appendNotIndentedCode("INT_VAR UDATA " + toHexLabel(rdata.accessBankSplit, rdata.nbCharsAddress())); + lines.appendNotIndentedCode("w_saved RES 1", i18n("variable used for context saving (for low-priority interrupts only)")); + lines.appendNotIndentedCode("status_saved RES 1", i18n("variable used for context saving (for low-priority interrupts only)")); + lines.appendNotIndentedCode("bsr_saved RES 1", i18n("variable used for context saving (for low-priority interrupts only)")); + lines.appendEmpty(); + lines.appendNotIndentedCode("var1 RES 1", i18n("example variable")); + lines.appendEmpty(); + lines.appendSeparator(); + lines.appendTitle(i18n("reset vector")); + lines.appendNotIndentedCode("STARTUP CODE 0x0000"); + lines.appendIndentedCode("nop", i18n("needed for ICD2 debugging")); + lines.appendIndentedCode("nop", i18n("needed for ICD2 debugging")); + lines.appendIndentedCode("goto start", i18n("go to start of main code")); + lines.appendEmpty(); + lines.appendTitle(i18n("high priority interrupt vector")); + lines.appendNotIndentedCode("HIGH_INT_VECTOR CODE 0x0008"); + lines.appendIndentedCode("bra high_interrupt", i18n("go to start of high priority interrupt code")); + lines.appendEmpty(); + lines.appendTitle(i18n("low priority interrupt vector")); + lines.appendNotIndentedCode("LOW_INT_VECTOR CODE 0x0018"); + lines.appendIndentedCode("movff STATUS,status_saved", i18n("save context")); + lines.appendIndentedCode("movff WREG,w_saved"); + lines.appendIndentedCode("movff BSR,bsr_saved"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert low priority interrupt code") + " >>"); + lines.appendIndentedCode("movff bsr_saved,BSR", i18n("restore context")); + lines.appendIndentedCode("movff w_saved,WREG"); + lines.appendIndentedCode("movff status_saved,STATUS"); + lines.appendIndentedCode("retfie"); + lines.appendEmpty(); + lines.appendTitle(i18n("high priority interrupt service routine")); + lines.appendNotIndentedCode("high_interrupt:"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert high priority interrupt code") + " >>"); + lines.appendIndentedCode("retfie FAST"); + lines.appendEmpty(); + lines.appendNotIndentedCode("start:"); + lines.appendIndentedCode(QString::null, "<< " + i18n("insert main code") + " >>"); + lines.appendIndentedCode("goto $", i18n("loop forever")); + lines.appendEmpty(); + lines.appendNotIndentedCode("END"); + break; + case Pic::Architecture::P24F: + case Pic::Architecture::P24H: + case Pic::Architecture::P30F: + case Pic::Architecture::P33F: ok = false; break; + case Pic::Architecture::Nb_Types: Q_ASSERT(false); break; + } + return lines; +} |