diff options
Diffstat (limited to 'src/ksimulator.cpp')
-rwxr-xr-x | src/ksimulator.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/ksimulator.cpp b/src/ksimulator.cpp new file mode 100755 index 0000000..57b2f43 --- /dev/null +++ b/src/ksimulator.cpp @@ -0,0 +1,151 @@ +/*************************************************************************** + * Copyright (C) 2005 by Mark Six * + * marksix@xs4all.nl * + * * + * 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. * + * * + * 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 more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "ksimulator.h" + +KSimulator::KSimulator(QObject *parent, const char *name ) + : QObject(parent, name) +{ + m_picoBlaze = new CPicoBlaze() ; + m_assembler = new CAssembler() ; + + m_assembler->setCode( m_picoBlaze->code ) ; + m_timer = new QTimer( this ) ; + m_bInterrupt = FALSE ; + + m_timer->stop() ; + m_run = false ; + connect( m_timer, SIGNAL( timeout() ), this, SLOT( next() ) ) ; +} + +KSimulator::~KSimulator() +{ + + delete m_picoBlaze ; + delete m_assembler ; +} + +void KSimulator::setMessageList( KListView *messageList ) +{ + m_assembler->setMessageList( messageList ) ; +} + +void KSimulator::reset() +{ + m_picoBlaze->Reset() ; + emit stepped( m_picoBlaze->GetNextSourceLine() ) ; +} + +void KSimulator::clear() +{ + m_picoBlaze->code->ClearCode() ; + m_assembler->clear() ; +} + +void KSimulator::interrupt() +{ + m_bInterrupt = TRUE ; +} + +unsigned int KSimulator::getNextSourceLine() +{ + return m_picoBlaze->GetNextSourceLine() ; +} + +void KSimulator::next() +{ + if ( m_bInterrupt ) { + m_bInterrupt = FALSE ; + m_picoBlaze->Interrupt() ; + } else + m_picoBlaze->Next() ; + emit stepped( m_picoBlaze->GetNextSourceLine() ) ; +} + +CPicoBlaze * KSimulator::getCpu() +{ + return m_picoBlaze ; +} + +unsigned char KSimulator::getFlags() +{ + unsigned char flags = 0 ; + + if ( m_picoBlaze->flags.carry ) + flags |= CARRY_FLAG ; + if ( m_picoBlaze->flags.zero ) + flags |= ZERO_FLAG ; + if ( m_picoBlaze->flags.interrupt_enable ) + flags |= INTERRUPT_FLAG ; + + return flags ; +} + +void KSimulator::setFlags( unsigned char flags ) +{ + m_picoBlaze->flags.carry = flags & CARRY_FLAG ? TRUE : FALSE ; + m_picoBlaze->flags.zero = flags & ZERO_FLAG ? TRUE : FALSE ; + m_picoBlaze->flags.interrupt_enable = flags & INTERRUPT_FLAG ? TRUE : FALSE ; +} + +void KSimulator::run() +{ + m_timer->start( 1 ) ; + m_run = true ; +} + +void KSimulator::stop() +{ + m_timer->stop() ; + m_run = false ; +} + +bool KSimulator::isRunning() +{ + return m_run ; +} + +void KSimulator::getRegisterValues( unsigned char *values ) +{ + int i ; + + for ( i = 0 ; i < 16 ; i++ ) { + values[ i ] = m_picoBlaze->s[ i ] ; + } + +} + +void KSimulator::setRegisterValues( unsigned char *values ) +{ + int i ; + + for ( i = 0 ; i < 16 ; i++ ) { + m_picoBlaze->s[ i ] = values[ i ] ; + } +} + +void KSimulator::getScratchpad( unsigned char * values ) +{ + int i ; + + for ( i = 0 ; i < SCRATCHPAD_SIZE ; i++ ) + values[ i ] = m_picoBlaze->scratch->Get( i ) ; +} + +#include "ksimulator.moc" |