You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kpicosim/src/ksimulator.cpp

152 lines
3.8 KiB

/***************************************************************************
* 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(TQObject *parent, const char *name )
: TQObject(parent, name)
{
m_picoBlaze = new CPicoBlaze() ;
m_assembler = new CAssembler() ;
m_assembler->setCode( m_picoBlaze->code ) ;
m_timer = new TQTimer( this ) ;
m_bInterrupt = FALSE ;
m_timer->stop() ;
m_run = false ;
connect( m_timer, TQT_SIGNAL( timeout() ), this, TQT_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"