summaryrefslogtreecommitdiffstats
path: root/src/kprocessorview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kprocessorview.cpp')
-rwxr-xr-xsrc/kprocessorview.cpp208
1 files changed, 208 insertions, 0 deletions
diff --git a/src/kprocessorview.cpp b/src/kprocessorview.cpp
new file mode 100755
index 0000000..f54469a
--- /dev/null
+++ b/src/kprocessorview.cpp
@@ -0,0 +1,208 @@
+#include "kprocessorview.h"
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qscrollview.h>
+#include <qsize.h>
+#include <qmessagebox.h>
+#include <qpopupmenu.h>
+#include <qcursor.h>
+
+MyListView::MyListView(QWidget *parent) : KListView(parent)
+{
+ connect( this, SIGNAL( contextMenu( KListView *, QListViewItem *, const QPoint & ) ),
+ SLOT( slotContextMenu( KListView *, QListViewItem *, const QPoint & ) ) );
+}
+
+MyListView::~MyListView()
+{
+}
+
+void MyListView::slotContextMenu( KListView *, QListViewItem *, const QPoint & )
+{
+// mousePressEvent( NULL ) ;
+ emit showPopupMenu() ;
+}
+/*
+void MyListView::mousePressEvent( QMouseEvent * event )
+{
+ //QMessageBox::information( this, "information", "mouse pressed" ) ;
+
+// if ( event->button() == RightButton )
+ emit showPopupMenu() ;
+// else
+// KListView::mousePressEvent( event ) ;
+}
+*/
+
+KProcessorView::KProcessorView(QWidget *parent, const char *name)
+ : KToolBar(parent)
+{
+ name = name ; // avoid compiler warning
+
+ view = new MyListView( this ) ;
+
+ connect( view, SIGNAL( itemRenamed( QListViewItem*) ), this, SLOT( slotItemRenamed(QListViewItem*) ) ) ;
+ connect( view, SIGNAL( showPopupMenu() ), this, SLOT( showPopupMenu() ) ) ;
+
+ view->addColumn( "Register" ) ;
+ view->addColumn( "Value" ) ;
+ view->setRootIsDecorated( true ) ;
+ view->setRenameable( 1, true ) ; // Column 1 is renameable
+ view->setRenameable( 0, false ) ; // Column 1 is renameable
+ view->setItemsRenameable( true ) ;
+ setWidget( view ) ;
+ setResizeEnabled( true ) ;
+
+ int i ;
+ char str[ 128 ] ;
+
+ QListViewItem *cpu = new QListViewItem( view ) ;
+ cpu->setText( 0, "CPU" ) ;
+
+ QListViewItem *flags = new QListViewItem( cpu ) ;
+ flags->setText( 0, "Flags" ) ;
+
+ zeroFlag = new QListViewItem( flags ) ;
+ zeroFlag->setText( 0, "Zero" ) ;
+ zeroFlag->setText( 1, "0" ) ;
+
+ carryFlag = new QListViewItem( flags ) ;
+ carryFlag->setText( 0, "Carry" ) ;
+ carryFlag->setText( 1, "0" ) ;
+
+ ieFlag = new QListViewItem( flags ) ;
+ ieFlag->setText( 0, "IE" ) ;
+ ieFlag->setText( 1, "0" ) ;
+
+ QListViewItem *reg = new QListViewItem( cpu ) ;
+ reg->setText( 0, "Registers" ) ;
+
+ for ( i = 0 ; i < 16 ; i++ ) {
+ regs[ i ] = new QListViewItem( reg ) ;
+ sprintf( str, "s%X", i ) ;
+ regs[ i ]->setText( 0, str ) ;
+ regs[ i ]->setText( 1, "0" ) ;
+ }
+
+ view->setOpen( cpu, true ) ;
+ view->setOpen( flags, true ) ;
+ view->setOpen( reg, true ) ;
+
+ m_bHexMode = false ;
+}
+
+void KProcessorView::slotHexMode()
+{
+ unsigned char regs[ 16 ] ;
+
+ getRegisterValues(regs) ;
+ m_bHexMode = !m_bHexMode ;
+ setRegisterValues(regs) ;
+}
+
+void KProcessorView::showPopupMenu()
+{
+ QPopupMenu *menu = new QPopupMenu( this ) ;
+ menu->insertItem( "Hexadecimal", this, SLOT( slotHexMode() ), 0, 1 ) ;
+ menu->setItemChecked( 1, m_bHexMode ) ;
+ menu->exec( QCursor::pos() );
+}
+
+void KProcessorView::slotItemRenamed( QListViewItem * item )
+{
+ int i, value, base ;
+ bool ok ;
+
+ if ( m_bHexMode ) base = 16 ;
+ else base = 10 ;
+
+ if ( !item )
+ return ;
+
+ for ( i = 0 ; i < 16 ; i++ ) {
+ if ( item == regs[ i ] ) {
+ value = item->text(1).toInt( &ok, base ) ;
+
+ if ( !ok || value < 0 || value > 255 ) {
+ QMessageBox::warning( parentWidget(), "Modify register", "Value should be between 0-255" ) ;
+ view->rename( item, 1 ) ;
+ } else {
+ emit processorRegsChanged() ;
+ }
+ return ;
+ }
+ }
+
+ if ( zeroFlag == item || carryFlag == item || ieFlag == item ) {
+ value = item->text(1).toInt( &ok ) ;
+ if ( !ok || value < 0 || value > 1 ) {
+ QMessageBox::warning( parentWidget(), "Modify flag", "Value should be between 0-1" ) ;
+ } else
+ emit processorFlagsChanged() ;
+ }
+}
+
+void KProcessorView::resizeEvent( QResizeEvent *event )
+{
+ event = event ;
+// view->resize( width() - 10, height() - 10 ) ;
+}
+
+void KProcessorView::getRegisterValues( unsigned char *values )
+{
+ int i, base ;
+ bool ok ;
+
+ if ( m_bHexMode ) base = 16 ;
+ else base = 10 ;
+
+ for ( i = 0 ; i < 16 ; i++ ) {
+ values[ i ] = regs[ i ]->text(1).toInt( &ok, base ) ;
+ }
+}
+
+void KProcessorView::setRegisterValues( unsigned char *values )
+{
+ int i, base ;
+
+ if ( m_bHexMode ) base = 16 ;
+ else base = 10 ;
+
+ QString str;
+ for ( i = 0 ; i < 16 ; i++ ) {
+ str.setNum( values[ i ], base ) ;
+ regs[ i ]->setText( 1, str ) ;
+ }
+}
+
+void KProcessorView::setFlags( unsigned char flags )
+{
+ if ( flags & 0x01 ) zeroFlag->setText( 1, "1" ) ;
+ else zeroFlag->setText( 1, "0" ) ;
+
+ if ( flags & 0x02 ) carryFlag->setText( 1, "1" ) ;
+ else carryFlag->setText( 1, "0" ) ;
+
+ if ( flags & 0x04 ) ieFlag->setText( 1, "1" ) ;
+ else ieFlag->setText( 1, "0" ) ;
+}
+
+unsigned char KProcessorView::getFlags()
+{
+ unsigned char flags = 0 ;
+
+ if ( zeroFlag->text(1).toInt() == 1 ) flags |= 0x01 ;
+ if ( carryFlag->text(1).toInt() == 1 ) flags |= 0x02 ;
+ if ( ieFlag->text(1).toInt() == 1 ) flags |= 0x04 ;
+
+ return flags ;
+}
+
+KProcessorView::~KProcessorView()
+{
+ delete view ;
+}
+
+
+