[Avida-cvs] [avida-svn] r828 - in development: Avida.xcodeproj source/cpu source/targets/avida-viewer

brysonda@myxo.css.msu.edu brysonda at myxo.css.msu.edu
Wed Jul 12 18:41:37 PDT 2006


Author: brysonda
Date: 2006-07-12 21:41:37 -0400 (Wed, 12 Jul 2006)
New Revision: 828

Removed:
   development/source/cpu/cHardwareTracer_4Stack.h
   development/source/cpu/cHardwareTracer_CPU.h
   development/source/cpu/cHardwareTracer_SMT.h
   development/source/cpu/cHardwareTracer_TestCPU.h
Modified:
   development/Avida.xcodeproj/project.pbxproj
   development/source/cpu/SConscript
   development/source/cpu/cHardware4Stack.cc
   development/source/cpu/cHardware4Stack.h
   development/source/cpu/cHardwareBase.h
   development/source/cpu/cHardwareCPU.cc
   development/source/cpu/cHardwareCPU.h
   development/source/cpu/cHardwareSMT.cc
   development/source/cpu/cHardwareSMT.h
   development/source/cpu/cHardwareStatusPrinter.cc
   development/source/cpu/cHardwareStatusPrinter.h
   development/source/cpu/cHardwareTracer.h
   development/source/cpu/cHeadCPU.cc
   development/source/cpu/cHeadCPU.h
   development/source/cpu/cHeadMultiMem.cc
   development/source/cpu/cHeadMultiMem.h
   development/source/cpu/cTestCPU.cc
   development/source/targets/avida-viewer/cZoomScreen.cc
   development/source/targets/avida-viewer/cZoomScreen.h
Log:
Adjust cHardwareStatusPrinter/cHardwareTracer setup to be more generic, removing hardware specific method wrappers and dynamic casting.

Cleanup various hardware specific sections within cZoomScreen.  Added more base class methods attempting to remove the necessity for casting references to the base class.   There are still two places where cZoomScreen assumes that it is working with a cHardwareCPU object.   One is a fairly safe assumption (within the type specific UpdateCPU method).    The second is unsafe in that even though the option to view components is not advertised on the SMT/4Stack component zoom, it can still be accessed via the assigned key.   In debug mode this will cause an assert, the behavior in release mode is undefined.

Modified: development/Avida.xcodeproj/project.pbxproj
===================================================================
--- development/Avida.xcodeproj/project.pbxproj	2006-07-11 19:52:25 UTC (rev 827)
+++ development/Avida.xcodeproj/project.pbxproj	2006-07-13 01:41:37 UTC (rev 828)
@@ -2248,29 +2248,7 @@
 		700E2B7F085DE50C00CF158A /* Development */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				GCC_ALTIVEC_EXTENSIONS = YES;
-				GCC_AUTO_VECTORIZATION = YES;
-				GCC_DEBUGGING_SYMBOLS = full;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_FAST_MATH = YES;
-				GCC_MODEL_CPU = G4;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					DEBUG,
-					REVISION_SUPPORT,
-				);
-				GCC_UNROLL_LOOPS = YES;
-				HEADER_SEARCH_PATHS = source/event/;
-				INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)/work";
-				LIBRARY_SEARCH_PATHS = "";
 				PRODUCT_NAME = "avida-viewer";
-				SKIP_INSTALL = YES;
-				WARNING_CFLAGS = (
-					"-Wmost",
-					"-Wno-four-char-constants",
-					"-Wno-unknown-pragmas",
-				);
-				ZERO_LINK = YES;
 			};
 			name = Development;
 		};

Modified: development/source/cpu/SConscript
===================================================================
--- development/source/cpu/SConscript	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/SConscript	2006-07-13 01:41:37 UTC (rev 828)
@@ -17,10 +17,6 @@
   'cHardwareSMT.h',
   'cHardwareStatusPrinter.h',
   'cHardwareTracer.h',
-  'cHardwareTracer_4Stack.h',
-  'cHardwareTracer_CPU.h',
-  'cHardwareTracer_SMT.h',
-  'cHardwareTracer_TestCPU.h',
   'cHeadCPU.h',
   'cHeadMultiMem.h',
   'cInstLibCPU.h',

Modified: development/source/cpu/cHardware4Stack.cc
===================================================================
--- development/source/cpu/cHardware4Stack.cc	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardware4Stack.cc	2006-07-13 01:41:37 UTC (rev 828)
@@ -18,7 +18,6 @@
 #include "cInstSet.h"
 #include "cHardwareManager.h"
 #include "cHardwareTracer.h"
-#include "cHardwareTracer_4Stack.h"
 #include "cMutation.h"
 #include "cMutationLib.h"
 #include "nMutation.h"
@@ -337,13 +336,7 @@
 #endif
     
     // Print the status of this CPU at each step...
-    if (m_tracer != NULL) {
-      if (cHardwareTracer_4Stack * tracer
-          = dynamic_cast<cHardwareTracer_4Stack *>(m_tracer)
-          ){
-        tracer->TraceHardware_4Stack(*this);
-      }
-    }
+    if (m_tracer != NULL) m_tracer->TraceHardware(*this);
     
     // Find the instruction to be executed
     const cInstruction& cur_inst = IP().GetInst();
@@ -448,15 +441,7 @@
   bool prev_run_state = organism->GetIsRunning();
   organism->SetRunning(true);
   
-  // @CAO FIX PRINTING TO INDICATE THIS IS A BONUS
-  // Print the status of this CPU at each step...
-  if (m_tracer != NULL) {
-    if (cHardwareTracer_4Stack * tracer
-        = dynamic_cast<cHardwareTracer_4Stack *>(m_tracer)
-        ){
-      tracer->TraceHardware_4StackBonus(*this);
-    }
-  }
+  if (m_tracer != NULL) m_tracer->TraceHardware(*this, true);
   
   SingleProcess_ExecuteInst(ctx, inst);
   

Modified: development/source/cpu/cHardware4Stack.h
===================================================================
--- development/source/cpu/cHardware4Stack.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardware4Stack.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -179,6 +179,7 @@
 
   // --------  Stack Manipulation...  --------
   inline int GetStack(int depth=0, int stack_id=-1, int in_thread=-1) const;
+  inline int GetNumStacks() const { return nHardware4Stack::NUM_STACKS; }
 
   
   // --------  Head Manipulation (including IP)  --------
@@ -208,6 +209,7 @@
   // --------  Register Manipulation  --------
   const int GetRegister(int reg_id) const { return Stack(reg_id).Peek(); }
   int& GetRegister(int reg_id) { return Stack(reg_id).Peek(); }
+  int GetNumRegisters() const { return nHardware4Stack::NUM_STACKS; }
 
   
   // --------  Thread Manipulation  --------

Modified: development/source/cpu/cHardwareBase.h
===================================================================
--- development/source/cpu/cHardwareBase.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareBase.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -85,6 +85,7 @@
   
   // --------  Stack Manipulation...  --------
   virtual int GetStack(int depth = 0, int stack_id = -1, int in_thread = -1) const = 0;
+  virtual int GetNumStacks() const = 0;
   
   
   // --------  Head Manipulation (including IP)  --------
@@ -114,6 +115,7 @@
   // --------  Register Manipulation  --------
   virtual const int GetRegister(int reg_id) const = 0;
   virtual int& GetRegister(int reg_id) = 0;
+  virtual int GetNumRegisters() const = 0;
   
   
   // --------  Thread Manipulation  --------

Modified: development/source/cpu/cHardwareCPU.cc
===================================================================
--- development/source/cpu/cHardwareCPU.cc	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareCPU.cc	2006-07-13 01:41:37 UTC (rev 828)
@@ -18,7 +18,6 @@
 #include "cGenotype.h"
 #include "cHardwareManager.h"
 #include "cHardwareTracer.h"
-#include "cHardwareTracer_CPU.h"
 #include "cInstLibCPU.h"
 #include "cInstSet.h"
 #include "cMutation.h"
@@ -464,13 +463,7 @@
 #endif
     
     // Print the status of this CPU at each step...
-    if (m_tracer != NULL) {
-      if (cHardwareTracer_CPU * tracer
-          = dynamic_cast<cHardwareTracer_CPU *>(m_tracer)
-          ){
-        tracer->TraceHardware_CPU(*this);
-      }
-    }
+    if (m_tracer != NULL) m_tracer->TraceHardware(*this);
     
     // Find the instruction to be executed
     const cInstruction& cur_inst = IP().GetInst();
@@ -576,15 +569,7 @@
   bool prev_run_state = organism->GetIsRunning();
   organism->SetRunning(true);
   
-  // @CAO FIX PRINTING TO INDICATE THIS IS A BONUS
-  // Print the status of this CPU at each step...
-  if (m_tracer != NULL) {
-    if (cHardwareTracer_CPU * tracer
-        = dynamic_cast<cHardwareTracer_CPU *>(m_tracer)
-        ){
-      tracer->TraceHardware_CPUBonus(*this);
-    }
-  }
+  if (m_tracer != NULL) m_tracer->TraceHardware(*this, true);
   
   SingleProcess_ExecuteInst(ctx, inst);
   

Modified: development/source/cpu/cHardwareCPU.h
===================================================================
--- development/source/cpu/cHardwareCPU.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareCPU.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -169,6 +169,7 @@
 
   // --------  Stack Manipulation...  --------
   inline int GetStack(int depth=0, int stack_id=-1, int in_thread=-1) const;
+  inline int GetNumStacks() const { return 2; }
 
 
   // --------  Head Manipulation (including IP)  --------
@@ -198,6 +199,7 @@
   // --------  Register Manipulation  --------
   const int GetRegister(int reg_id) const { return threads[cur_thread].reg[reg_id]; }
   int& GetRegister(int reg_id) { return threads[cur_thread].reg[reg_id]; }
+  int GetNumRegisters() const { return nHardwareCPU::NUM_REGISTERS; }
 
   
   // --------  Thread Manipulation  --------
@@ -494,12 +496,13 @@
 
 inline int cHardwareCPU::GetStack(int depth, int stack_id, int in_thread) const
 {
-  // @DMB - warning: cHardwareCPU::GetStack ignores in_thread
   int value = 0;
 
-  if (stack_id == -1) stack_id = threads[cur_thread].cur_stack;
+  if(in_thread >= threads.GetSize() || in_thread < 0) in_thread = cur_thread;
 
-  if (stack_id == 0) value = threads[cur_thread].stack.Get(depth);
+  if (stack_id == -1) stack_id = threads[in_thread].cur_stack;
+
+  if (stack_id == 0) value = threads[in_thread].stack.Get(depth);
   else if (stack_id == 1) value = global_stack.Get(depth);
 
   return value;

Modified: development/source/cpu/cHardwareSMT.cc
===================================================================
--- development/source/cpu/cHardwareSMT.cc	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareSMT.cc	2006-07-13 01:41:37 UTC (rev 828)
@@ -14,7 +14,6 @@
 #include "cInstLibBase.h"
 #include "cInstSet.h"
 #include "cHardwareTracer.h"
-#include "cHardwareTracer_SMT.h"
 #include "cMutation.h"
 #include "cMutationLib.h"
 #include "cOrganism.h"
@@ -215,11 +214,7 @@
 #endif
     
     // Print the status of this CPU at each step...
-    if (m_tracer)
-    {
-      cHardwareTracer_SMT* tracer = dynamic_cast<cHardwareTracer_SMT *>(m_tracer);
-      if (tracer) tracer->TraceHardware_SMT(*this);
-    }
+    if (m_tracer) m_tracer->TraceHardware(*this);
     
     // Find the instruction to be executed
     const cInstruction& cur_inst = IP().GetInst();
@@ -325,11 +320,7 @@
   organism->SetRunning(true);
 	
   // Print the status of this CPU at each step...
-  if (m_tracer != NULL) {
-    if (cHardwareTracer_SMT* tracer = dynamic_cast<cHardwareTracer_SMT *>(m_tracer)) {
-      tracer->TraceHardware_SMTBonus(*this);
-    }
-  }
+  if (m_tracer != NULL) m_tracer->TraceHardware(*this, true);
   
   SingleProcess_ExecuteInst(ctx, inst);
   

Modified: development/source/cpu/cHardwareSMT.h
===================================================================
--- development/source/cpu/cHardwareSMT.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareSMT.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -205,6 +205,7 @@
 	
   // --------  Stack Manipulation...  --------
   inline int GetStack(int depth=0, int stack_id=-1, int in_thread=-1) const;
+  inline int GetNumStacks() const { return NUM_STACKS; }
 	
 
   // --------  Head Manipulation (including IP)  --------
@@ -234,6 +235,7 @@
   // --------  Register Manipulation  --------
   const int GetRegister(int reg_id) const { return Stack(reg_id).Peek(); }
   int& GetRegister(int reg_id) { return Stack(reg_id).Peek(); }
+  int GetNumRegisters() const { return NUM_STACKS; }
   
   
   // --------  Thread Manipulation  --------
@@ -381,8 +383,8 @@
 
 inline cCPUStack& cHardwareSMT::Stack(int stack_id, int in_thread) 
 {
-  if(stack_id >= NUM_STACKS) stack_id = 0;
-  if(in_thread >= m_threads.GetSize()) in_thread = m_cur_thread;
+  if(stack_id >= NUM_STACKS || stack_id < 0) stack_id = 0;
+  if(in_thread >= m_threads.GetSize() || in_thread < 0) in_thread = m_cur_thread;
 	
   if(stack_id < NUM_LOCAL_STACKS)
     return m_threads[in_thread].local_stacks[stack_id];
@@ -392,8 +394,8 @@
 
 inline const cCPUStack& cHardwareSMT::Stack(int stack_id, int in_thread) const 
 {
-  if(stack_id >= NUM_STACKS) stack_id = 0;
-  if(in_thread >= m_threads.GetSize()) in_thread = m_cur_thread;
+  if(stack_id >= NUM_STACKS || stack_id < 0) stack_id = 0;
+  if(in_thread >= m_threads.GetSize() || in_thread < 0) in_thread = m_cur_thread;
 	
   if(stack_id < NUM_LOCAL_STACKS)
     return m_threads[in_thread].local_stacks[stack_id];

Modified: development/source/cpu/cHardwareStatusPrinter.cc
===================================================================
--- development/source/cpu/cHardwareStatusPrinter.cc	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareStatusPrinter.cc	2006-07-13 01:41:37 UTC (rev 828)
@@ -10,84 +10,32 @@
 
 #include "cHardwareStatusPrinter.h"
 
-#include "cHeadCPU.h"
-#include "cHardware4Stack.h"
 #include "cHardwareBase.h"
-#include "cHardwareCPU.h"
-#include "cHardwareSMT.h"
+#include "cHeadCPU.h"
 #include "cInstSet.h"
 #include "cOrganism.h"
 #include "cString.h"
 #include "cStringUtil.h"
 
-cString cHardwareStatusPrinter::Bonus(const cString &next_name)
+void cHardwareStatusPrinter::TraceHardware(cHardwareBase& hardware, bool bonus)
 {
-  return cStringUtil::Stringf("%s (bonus instruction)", static_cast<const char*>(next_name));
-}
+  cString next_name(hardware.GetInstSet().GetName(hardware.IP().GetInst()));
+  if (bonus) next_name = cStringUtil::Stringf("%s (bonus instruction)", static_cast<const char*>(next_name));
 
-void cHardwareStatusPrinter::PrintStatus(cHardwareBase& hardware, const cString& next_name)
-{
-  cOrganism *organism = hardware.GetOrganism();
-  if(organism) organism->PrintStatus(m_trace_fp, next_name);
+  cOrganism* organism = hardware.GetOrganism();
+  if (organism) organism->PrintStatus(m_trace_fp, next_name);
 }
 
-// CPU
-const cString& cHardwareStatusPrinter::GetNextInstName(cHardwareCPU& hardware)
+void cHardwareStatusPrinter::TraceTestCPU(int time_used, int time_allocated, int size, 
+                                          const cString& final_memory, const cString& child_memory)
 {
-  return hardware.GetInstSet().GetName(hardware.IP().GetInst());
-}
-void cHardwareStatusPrinter::TraceHardware_CPU(cHardwareCPU &hardware)
-{
-  PrintStatus(hardware, GetNextInstName(hardware));
-}
-void cHardwareStatusPrinter::TraceHardware_CPUBonus(cHardwareCPU &hardware)
-{
-  PrintStatus(hardware, Bonus(GetNextInstName(hardware)));
-}
-
-// 4Stack
-const cString& cHardwareStatusPrinter::GetNextInstName(cHardware4Stack& hardware)
-{
-  return hardware.GetInstSet().GetName(hardware.IP().GetInst());
-}
-void cHardwareStatusPrinter::TraceHardware_4Stack(cHardware4Stack &hardware)
-{
-  PrintStatus(hardware, GetNextInstName(hardware));
-}
-void cHardwareStatusPrinter::TraceHardware_4StackBonus(cHardware4Stack &hardware)
-{
-  PrintStatus(hardware, Bonus(GetNextInstName(hardware)));
-}
-
-// SMT
-const cString& cHardwareStatusPrinter::GetNextInstName(cHardwareSMT& hardware)
-{
-  return hardware.GetInstSet().GetName(hardware.IP().GetInst());
-}
-void cHardwareStatusPrinter::TraceHardware_SMT(cHardwareSMT &hardware)
-{
-  PrintStatus(hardware, GetNextInstName(hardware));
-}
-void cHardwareStatusPrinter::TraceHardware_SMTBonus(cHardwareSMT &hardware)
-{
-  PrintStatus(hardware, Bonus(GetNextInstName(hardware)));
-}
-
-void cHardwareStatusPrinter::TraceHardware_TestCPU(
-  int time_used,
-  int time_allocated,
-  int size,
-  const cString &final_memory,
-  const cString &child_memory
-)
-{
   if (time_used == time_allocated) {
     m_trace_fp << endl << "# TIMEOUT: No offspring produced." << endl;
   } else if (size == 0) {
     m_trace_fp << endl << "# ORGANISM DEATH: No offspring produced." << endl;
   } else {
-    m_trace_fp
-    << endl << "# Final Memory: " << final_memory
-    << endl << "# Child Memory: " << child_memory << endl;
+    m_trace_fp << endl;
+    m_trace_fp << "# Final Memory: " << final_memory << endl;
+    m_trace_fp << "# Child Memory: " << child_memory << endl;
   }
 }

Modified: development/source/cpu/cHardwareStatusPrinter.h
===================================================================
--- development/source/cpu/cHardwareStatusPrinter.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareStatusPrinter.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -16,53 +16,28 @@
 #ifndef cHardwareTracer_h
 #include "cHardwareTracer.h"
 #endif
-#ifndef cHardwareTracer_4Stack_h
-#include "cHardwareTracer_4Stack.h"
-#endif
-#ifndef cHardwareTracer_SMT_h
-#include "cHardwareTracer_SMT.h"
-#endif
-#ifndef cHardwareTracer_CPU_h
-#include "cHardwareTracer_CPU.h"
-#endif
-#ifndef cHardwareTracer_TestCPU_h
-#include "cHardwareTracer_TestCPU.h"
-#endif
 #ifndef cString_h
 #include "cString.h"
 #endif
 
 class cHardwareBase;
 
-class cHardwareStatusPrinter :
-  public cHardwareTracer,
-  public cHardwareTracer_CPU,
-  public cHardwareTracer_4Stack,
-  public cHardwareTracer_SMT,
-  public cHardwareTracer_TestCPU
+class cHardwareStatusPrinter : public cHardwareTracer
 {
 protected:
   std::ostream& m_trace_fp;
-protected:
-  const cString& GetNextInstName(cHardwareCPU& hardware);
-  const cString& GetNextInstName(cHardware4Stack& hardware);
-  const cString& GetNextInstName(cHardwareSMT& hardware);
-  cString Bonus(const cString& next_name);
-  void PrintStatus(cHardwareBase& hardware, const cString& next_name);
-  
+
+
+private: 
   cHardwareStatusPrinter(); // @not_implemented
 
+
 public:
-  cHardwareStatusPrinter(std::ostream& trace_fp) : m_trace_fp(trace_fp) {;}
+  cHardwareStatusPrinter(std::ostream& trace_fp) : m_trace_fp(trace_fp) { ; }
 
-  virtual void TraceHardware_CPU(cHardwareCPU &hardware);
-  virtual void TraceHardware_4Stack(cHardware4Stack &hardware);
-  virtual void TraceHardware_SMT(cHardwareSMT &hardware);
-  virtual void TraceHardware_CPUBonus(cHardwareCPU &hardware);
-  virtual void TraceHardware_4StackBonus(cHardware4Stack &hardware);
-  virtual void TraceHardware_SMTBonus(cHardwareSMT &hardware);
-  virtual void TraceHardware_TestCPU(int time_used, int time_allocated, int size,
-                                     const cString& final_memory, const cString& child_memory);
+  virtual void TraceHardware(cHardwareBase& hardware, bool bonus);
+  virtual void TraceTestCPU(int time_used, int time_allocated, int size,
+                            const cString& final_memory, const cString& child_memory);
 };
 
 

Modified: development/source/cpu/cHardwareTracer.h
===================================================================
--- development/source/cpu/cHardwareTracer.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareTracer.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -11,10 +11,16 @@
 #ifndef cHardwareTracer_h
 #define cHardwareTracer_h
 
+class cHardwareBase;
+class cString;
+
 class cHardwareTracer
 {
 public:
   virtual ~cHardwareTracer() { ; }
+  virtual void TraceHardware(cHardwareBase&, bool bonus = false) = 0;
+  virtual void TraceTestCPU(int time_used, int time_allocated, int size,
+                            const cString& final_memory, const cString& child_memory) = 0;
 };
 
 #endif

Deleted: development/source/cpu/cHardwareTracer_4Stack.h
===================================================================
--- development/source/cpu/cHardwareTracer_4Stack.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareTracer_4Stack.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -1,22 +0,0 @@
-/*
- *  cHardwareTracer_4Stack.h
- *  Avida
- *
- *  Created by David on 11/30/05.
- *  Copyright 2005-2006 Michigan State University. All rights reserved.
- *  Copyright 1999-2004 California Institute of Technology.
- *
- */
-
-#ifndef cHardwareTracer_4Stack_h
-#define cHardwareTracer_4Stack_h
-
-class cHardware4Stack;
-class cHardwareTracer_4Stack {
-public:
-  virtual ~cHardwareTracer_4Stack() { ; }
-  virtual void TraceHardware_4Stack(cHardware4Stack &) = 0;
-  virtual void TraceHardware_4StackBonus(cHardware4Stack &) = 0;
-};
-
-#endif

Deleted: development/source/cpu/cHardwareTracer_CPU.h
===================================================================
--- development/source/cpu/cHardwareTracer_CPU.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareTracer_CPU.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -1,23 +0,0 @@
-/*
- *  cHardwareTracer_CPU.h
- *  Avida
- *
- *  Created by David on 11/30/05.
- *  Copyright 2005-2006 Michigan State University. All rights reserved.
- *  Copyright 1999-2004 California Institute of Technology.
- *
- */
-
-
-#ifndef cHardwareTracer_CPU_h
-#define cHardwareTracer_CPU_h
-
-class cHardwareCPU;
-class cHardwareTracer_CPU {
-public:
-  virtual ~cHardwareTracer_CPU() { ; }
-  virtual void TraceHardware_CPU(cHardwareCPU &) = 0;
-  virtual void TraceHardware_CPUBonus(cHardwareCPU &) = 0;
-};
-
-#endif

Deleted: development/source/cpu/cHardwareTracer_SMT.h
===================================================================
--- development/source/cpu/cHardwareTracer_SMT.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareTracer_SMT.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -1,22 +0,0 @@
-/*
- *  cHardwareTracer_SMT.h
- *  Avida
- *
- *  Created by David on 11/30/05.
- *  Copyright 2005-2006 Michigan State University. All rights reserved.
- *  Copyright 1999-2004 California Institute of Technology.
- *
- */
-
-#ifndef cHardwareTracer_SMT_h
-#define cHardwareTracer_SMT_h
-
-class cHardwareSMT;
-class cHardwareTracer_SMT {
-public:
-  virtual ~cHardwareTracer_SMT() { ; }
-  virtual void TraceHardware_SMT(cHardwareSMT &) = 0;
-  virtual void TraceHardware_SMTBonus(cHardwareSMT &) = 0;
-};
-
-#endif

Deleted: development/source/cpu/cHardwareTracer_TestCPU.h
===================================================================
--- development/source/cpu/cHardwareTracer_TestCPU.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHardwareTracer_TestCPU.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -1,28 +0,0 @@
-/*
- *  cHardwareTracer_TestCPU.h
- *  Avida
- *
- *  Created by David on 11/30/05.
- *  Copyright 2005-2006 Michigan State University. All rights reserved.
- *  Copyright 1999-2004 California Institute of Technology.
- *
- */
-
-#ifndef cHardwareTracer_TestCPU_h
-#define cHardwareTracer_TestCPU_h
-
-class cString;
-class cHardwareTracer_TestCPU {
-public:
-  virtual ~cHardwareTracer_TestCPU() { ; }
-  virtual void TraceHardware_TestCPU(
-    int time_used,
-    int time_allocated,
-    int size,
-    const cString &final_memory,
-    const cString &child_memory
-  ) = 0;
-};
-
-#endif
-

Modified: development/source/cpu/cHeadCPU.cc
===================================================================
--- development/source/cpu/cHeadCPU.cc	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHeadCPU.cc	2006-07-13 01:41:37 UTC (rev 828)
@@ -16,6 +16,7 @@
 #include "cHardwareBase.h"
 #include "cInstSet.h"
 #include "cInstruction.h"
+#include "cStringUtil.h"
 
 #include <assert.h>
 
@@ -507,3 +508,8 @@
   // If CPU has a head in another creature, mark it as a parasite.
   return (cur_hardware != main_hardware);
 }
+
+cString cHeadCPU::GetPositionString() const
+{
+  return cStringUtil::Stringf("%2d", position);
+}

Modified: development/source/cpu/cHeadCPU.h
===================================================================
--- development/source/cpu/cHeadCPU.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHeadCPU.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -24,6 +24,7 @@
 class cCPUMemory;
 class cGenome;
 class cInstruction;
+class cString;
 
 class cHeadCPU
 {
@@ -122,6 +123,8 @@
 
   // Test functions...
   int TestParasite() const;
+  
+  virtual cString GetPositionString() const;
 };
 
 

Modified: development/source/cpu/cHeadMultiMem.cc
===================================================================
--- development/source/cpu/cHeadMultiMem.cc	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHeadMultiMem.cc	2006-07-13 01:41:37 UTC (rev 828)
@@ -14,6 +14,7 @@
 #include "cHardwareBase.h"
 #include "cInstSet.h"
 #include "cInstruction.h"
+#include "cStringUtil.h"
 
 #include <assert.h>
 
@@ -241,3 +242,7 @@
   return (position >= 0 && position < GetMemory().GetSize());
 }
 
+cString cHeadMultiMem::GetPositionString() const
+{
+  return cStringUtil::Stringf("(%2d, %2d)", mem_space, position);
+}

Modified: development/source/cpu/cHeadMultiMem.h
===================================================================
--- development/source/cpu/cHeadMultiMem.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cHeadMultiMem.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -61,6 +61,8 @@
   bool operator==(const cHeadMultiMem& in_cpu_head) const; 
   bool AtEnd() const;
   bool InMemory() const;
+  
+  cString GetPositionString() const;
 };
 
 

Modified: development/source/cpu/cTestCPU.cc
===================================================================
--- development/source/cpu/cTestCPU.cc	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/cpu/cTestCPU.cc	2006-07-13 01:41:37 UTC (rev 828)
@@ -116,17 +116,8 @@
   organism.GetHardware().SetTrace(NULL);
 
   // Print out some final info in trace...
-  if (tracer != NULL) {
-    if (cHardwareTracer_TestCPU* tracer_test_cpu = dynamic_cast<cHardwareTracer_TestCPU*>(tracer)) {
-      tracer_test_cpu->TraceHardware_TestCPU(
-        time_used,
-        time_allocated,
-        organism.GetHardware().GetMemory().GetSize(),
-        organism.GetHardware().GetMemory().AsString(),
-        organism.ChildGenome().AsString()
-      );
-    }
-  }
+  if (tracer != NULL) tracer->TraceTestCPU(time_used, time_allocated, organism.GetHardware().GetMemory().GetSize(),
+                                           organism.GetHardware().GetMemory().AsString(), organism.ChildGenome().AsString());
 
   // For now, always return true.
   return true;

Modified: development/source/targets/avida-viewer/cZoomScreen.cc
===================================================================
--- development/source/targets/avida-viewer/cZoomScreen.cc	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/targets/avida-viewer/cZoomScreen.cc	2006-07-13 01:41:37 UTC (rev 828)
@@ -18,9 +18,10 @@
 #include "cStringUtil.h"
 #include "cTaskEntry.h"
 
+#include "cHardwareBase.h"
 #include "cHardwareCPU.h"
-#include "cHardware4Stack.h"
-#include "cHardwareSMT.h"
+#include "nHardware.h"
+#include "cHeadMultiMem.h"
 
 #include "cView.h"
 #include "cMenuWindow.h"
@@ -91,9 +92,7 @@
   {
     if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_ORIGINAL) 
       DrawCPU_Original();
-    if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_4STACK) 
-      DrawCPU_4Stack();
-    if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_SMT) 
+    else
       DrawCPU_SMT();
   }
   else if (mode == ZOOM_MODE_STATS) DrawStats();
@@ -132,30 +131,19 @@
   Print(10, 27, "Thread:");
   Print(11, 27, "IP....:");
   
-  if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_ORIGINAL)
-  {
+  if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_ORIGINAL) {
     Print(12, 27, "AX....:");
     Print(13, 27, "BX....:");
     Print(14, 27, "CX....:");
     Print(15, 27, "Stack.:");
     Print(16, 27, "---- Memory ----");
-  }
-  else if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_4STACK)
-  {
+  } else {
     Print(12, 27, "Stack AX:");
     Print(13, 27, "Stack BX:");
     Print(14, 27, "Stack CX:");
     Print(15, 27, "Stack DX:");
     Print(16, 27, "---- Memory ----");
   }
-  else if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_SMT)
-  {
-    Print(12, 27, "Stack AX:");
-    Print(13, 27, "Stack BX:");
-    Print(14, 27, "Stack CX:");
-    Print(15, 27, "Stack DX:");
-    Print(16, 27, "---- Memory ----");
-  }
   
   Print(CPU_FLAGS_Y, CPU_FLAGS_X, "---- Flags ----");
   
@@ -290,109 +278,6 @@
   Print(19, 52, "Thread.......:");
 }
 
-void cZoomScreen::DrawCPU_4Stack()
-{
-  SetColor(COLOR_WHITE);
-  
-  // --== Registers ==--
-  Box(REG_X, REG_Y-1, 19, 8);
-  Print(REG_Y, REG_X + 2, "Stacks:");
-  HLine(REG_Y + 1, REG_X, 19);
-  
-  SetBoldColor(COLOR_WHITE);
-  Print(REG_Y + 2, REG_X + 2, "AX:");
-  Print(REG_Y + 3, REG_X + 2, "BX:");
-  Print(REG_Y + 4, REG_X + 2, "CX:");
-  Print(REG_Y + 5, REG_X + 2, "DX:");
-  SetColor(COLOR_WHITE);
-  
-  // --== Inputs ==--
-  Box(INPUT_X, INPUT_Y-1, 16, 8);
-  Print(INPUT_Y, INPUT_X + 2, "Inputs:");
-  HLine(INPUT_Y+1, INPUT_X, 16);
-  
-  // --== Mini-Map ==--
-  Box(MINI_MAP_X, MINI_MAP_Y, 17, 3);
-  Print(MINI_MAP_Y + 1, MINI_MAP_X + 2, "Mini-Map");
-  //HLine(MINI_MAP_Y + 2, MINI_MAP_X, 19);
-  
-  SetBoldColor(COLOR_WHITE);
-  Print(MINI_MAP_Y + 11, MINI_MAP_X,  "[ ]           [ ]");
-  SetBoldColor(COLOR_CYAN);
-  Print(MINI_MAP_Y + 11, MINI_MAP_X + 1,  '-');
-  Print(MINI_MAP_Y + 11, MINI_MAP_X + 15, '+');
-  SetColor(COLOR_WHITE);
-  
-  // --== Memory ==--
-  Box(MEMORY_X, MEMORY_Y, 36, 5 + MEMORY_PRE_SIZE + MEMORY_POST_SIZE);
-  Print(MEMORY_Y + 1, MEMORY_X + 2,  "Memory Space");
-  HLine(MEMORY_Y + 2, MEMORY_X, 36);
-  
-  // --== Stack ==--
-  Box(STACK_X, STACK_Y-1, 15, 8);
-  HLine(STACK_Y + 1, STACK_X, 15);
-  
-  // --== Options ==--
-  SetBoldColor(COLOR_YELLOW);
-  Print(OPTIONS_Y, OPTIONS_X+4,    "Component Zoom");
-  SetBoldColor(COLOR_WHITE);
-  
-  //Print(OPTIONS_Y+6, OPTIONS_X+2, "[E]dit Component");
-  //Print(OPTIONS_Y+7, OPTIONS_X+2, "[V]iew Component");
-  Print(OPTIONS_Y+5, OPTIONS_X+2, "Next Stac[K]");
-  if(info.GetConfig().MAX_CPU_THREADS.Get() >1)
-    Print(OPTIONS_Y+6, OPTIONS_X+2, "Next [T]hread");
-  //Print(OPTIONS_Y+9, OPTIONS_X+2, "[TAB] Shift Active");
-  
-  if (info.GetPauseLevel()) {
-    Print(OPTIONS_Y+7, OPTIONS_X+2, "[UP, DOWN]");
-    Print(OPTIONS_Y+8, OPTIONS_X+2, "Scroll Instruction");
-    Print(OPTIONS_Y+9, OPTIONS_X+2, "[LEFT, RIGHT]");
-    Print(OPTIONS_Y+10, OPTIONS_X+2, "Change Mem Space");
-  } else {
-    Print(OPTIONS_Y+7, OPTIONS_X+2, "               ");
-    Print(OPTIONS_Y+8, OPTIONS_X+2, "                  ");
-    Print(OPTIONS_Y+9, OPTIONS_X+2, "               ");
-    Print(OPTIONS_Y+10, OPTIONS_X+2, "                 ");
-  }
-  
-  
-  SetBoldColor(COLOR_CYAN);
-  Print(OPTIONS_Y+5, OPTIONS_X+12, "K");
-  if(info.GetConfig().MAX_CPU_THREADS.Get() >1)
-    Print(OPTIONS_Y+6, OPTIONS_X+8, "T");
-  
-  if (info.GetPauseLevel()) {
-    Print(OPTIONS_Y+7, OPTIONS_X+3, "UP, DOWN");
-    Print(OPTIONS_Y+9, OPTIONS_X+3, "LEFT, RIGHT");
-  }
-  
-  // Highlight the active section...
-  SetActiveSection(active_section);
-  
-  // Add on a bunch of special characters to smooth the view out...
-  Print(INPUT_Y - 1, INPUT_X, CHAR_TTEE);
-  Print(INPUT_Y + 1, INPUT_X, CHAR_PLUS);
-  Print(INPUT_Y + 6, INPUT_X, CHAR_BTEE);
-  
-  Print(STACK_Y - 1, STACK_X, CHAR_TTEE);
-  Print(STACK_Y + 1, STACK_X, CHAR_PLUS);
-  Print(STACK_Y + 6, STACK_X, CHAR_BTEE);
-  
-  
-  // A few stats on this screen...
-  
-  SetBoldColor(COLOR_WHITE);
-  
-  Print(13, 52, "Location.....:");
-  Print(14, 52, "Genotype ID..:");
-  Print(15, 52, "Genotype Name:");
-  
-  Print(17, 52, "Faults.......:");
-  Print(18, 52, "Offspring....:");
-  Print(19, 52, "Thread.......:");
-}
-
 void cZoomScreen::DrawCPU_SMT()
 {
   SetColor(COLOR_WHITE);
@@ -596,9 +481,7 @@
   
   if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_ORIGINAL)
     UpdateStats_CPU(hardware);
-  else if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_4STACK)
-    UpdateStats_4Stack(hardware);
-  else if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_SMT)
+  else
     UpdateStats_SMT(hardware);
   
   if (phenotype.ParentTrue()) SetBoldColor(COLOR_CYAN);
@@ -672,21 +555,19 @@
   
 }
 
-void cZoomScreen::UpdateStats_CPU(cHardwareBase & hardware)
+void cZoomScreen::UpdateStats_CPU(cHardwareBase& hardware)
 {
-  cHardwareCPU & hardwareCPU = (cHardwareCPU &) hardware;
+  Print(10, 43, "%2d/%2d", hardware.GetCurThread() + 1,
+        hardware.GetNumThreads());
   
-  Print(10, 43, "%2d/%2d", hardwareCPU.GetCurThread() + 1,
-        hardwareCPU.GetNumThreads());
+  Print(12, 34, "%14d", hardware.GetRegister(0));
+  Print(13, 34, "%14d", hardware.GetRegister(1));
+  Print(14, 34, "%14d", hardware.GetRegister(2));
+  Print(15, 34, "%14d", hardware.GetStack(0));
   
-  Print(12, 34, "%14d", hardwareCPU.GetRegister(0));
-  Print(13, 34, "%14d", hardwareCPU.GetRegister(1));
-  Print(14, 34, "%14d", hardwareCPU.GetRegister(2));
-  Print(15, 34, "%14d", hardwareCPU.GetStack(0));
+  cHeadCPU inst_ptr(hardware.IP());
+  const cInstSet & inst_set = hardware.GetInstSet();
   
-  cHeadCPU inst_ptr(hardwareCPU.IP());
-  const cInstSet & inst_set = hardwareCPU.GetInstSet();
-  
   for (int pos = 0; pos < 3; pos++) {
     // Clear the line
     Print(17+pos, 29, "                    ");
@@ -699,12 +580,13 @@
   }
   
   // Flags...
-  if (hardwareCPU.GetMalActive()) SetBoldColor(COLOR_CYAN);
-  else SetColor(COLOR_CYAN);
+//  if (hardware.GetMalActive()) SetBoldColor(COLOR_CYAN);
+//  else SetColor(COLOR_CYAN);
+  SetColor(COLOR_CYAN);
   Print(CPU_FLAGS_Y + 1, CPU_FLAGS_X + 1, "Mem Allocated");
   
   // And print the IP.
-  const cHeadCPU & active_inst_ptr = hardwareCPU.IP();
+  const cHeadCPU & active_inst_ptr = hardware.IP();
   // @CAO assume no parasites for now.
   int cur_id = info.GetActiveCell()->GetID();
   //active_inst_ptr.GetCurHardware()->GetOrganism()->GetEnvironment()->GetID();
@@ -713,21 +595,19 @@
                                              active_inst_ptr.GetPosition())) );
 }
 
-void cZoomScreen::UpdateStats_4Stack(cHardwareBase & hardware)
+void cZoomScreen::UpdateStats_SMT(cHardwareBase& hardware)
 {
-  cHardware4Stack & hardware4Stack = (cHardware4Stack &) hardware;
+  Print(10, 43, "%2d/%2d", hardware.GetCurThread() + 1,
+        hardware.GetNumThreads());
   
-  Print(10, 43, "%2d/%2d", hardware4Stack.GetCurThread() + 1,
-        hardware4Stack.GetNumThreads());
+  Print(12, 34, "%14d", hardware.GetStack(0, 0));
+  Print(13, 34, "%14d", hardware.GetStack(0, 1));
+  Print(14, 34, "%14d", hardware.GetStack(0, 2));
+  Print(15, 34, "%14d", hardware.GetStack(0, 3));
   
-  Print(12, 34, "%14d", hardware4Stack.GetStack(0, 0));
-  Print(13, 34, "%14d", hardware4Stack.GetStack(0, 1));
-  Print(14, 34, "%14d", hardware4Stack.GetStack(0, 2));
-  Print(15, 34, "%14d", hardware4Stack.GetStack(0, 3));
+  cHeadCPU inst_ptr(hardware.IP());
+  const cInstSet& inst_set = hardware.GetInstSet();
   
-  cHeadMultiMem inst_ptr(hardware4Stack.IP());
-  const cInstSet & inst_set = hardware4Stack.GetInstSet();
-  
   for (int pos = 0; pos < 3; pos++) {
     // Clear the line
     Print(17+pos, 29, "                    ");
@@ -740,51 +620,13 @@
   }
   
   // And print the IP.
-  const cHeadMultiMem & active_inst_ptr = hardware4Stack.IP();
+  const cHeadCPU& active_inst_ptr = hardware.IP();
   // @CAO assume no parasites for now.
   //int cur_id = info.GetActiveCell()->GetID();
   //active_inst_ptr.GetCurHardware()->GetOrganism()->GetEnvironment()->GetID();
-  Print(11, 36, "%12s", static_cast<const char*>(cStringUtil::Stringf("(%2d, %2d)",
-                                             active_inst_ptr.GetMemSpace(),
-                                             active_inst_ptr.GetPosition())) );
+  Print(11, 36, "%12s", static_cast<const char*>(active_inst_ptr.GetPositionString()));
 }
 
-void cZoomScreen::UpdateStats_SMT(cHardwareBase & hardware)
-{
-  cHardwareSMT& hardware4Stack = (cHardwareSMT&) hardware;
-  
-  Print(10, 43, "%2d/%2d", hardware4Stack.GetCurThread() + 1,
-        hardware4Stack.GetNumThreads());
-  
-  Print(12, 34, "%14d", hardware4Stack.GetStack(0, 0));
-  Print(13, 34, "%14d", hardware4Stack.GetStack(0, 1));
-  Print(14, 34, "%14d", hardware4Stack.GetStack(0, 2));
-  Print(15, 34, "%14d", hardware4Stack.GetStack(0, 3));
-    
-  cHeadMultiMem inst_ptr(hardware4Stack.IP());
-  const cInstSet & inst_set = hardware4Stack.GetInstSet();
-  
-  for (int pos = 0; pos < 3; pos++) {
-    // Clear the line
-    Print(17+pos, 29, "                    ");
-    if (inst_ptr.InMemory() == false) continue;
-    if (pos == 1) SetColor(COLOR_CYAN);
-    
-    // Draw the current instruction.
-    Print(17+pos, 29, "%s",	static_cast<const char*>(inst_set.GetName(inst_ptr.GetInst())));
-    inst_ptr.Advance();
-  }
-  
-  // And print the IP.
-  const cHeadMultiMem & active_inst_ptr = hardware4Stack.IP();
-  // @CAO assume no parasites for now.
-  //int cur_id = info.GetActiveCell()->GetID();
-  //active_inst_ptr.GetCurHardware()->GetOrganism()->GetEnvironment()->GetID();
-  Print(11, 36, "%12s", static_cast<const char*>(cStringUtil::Stringf("(%2d, %2d)",
-                                             active_inst_ptr.GetMemSpace(),
-                                             active_inst_ptr.GetPosition())) );
-}
-
 void cZoomScreen::UpdateCPU(cHardwareBase & hardware)
 {
   // Place the visible section of the current memory onto the screen.
@@ -809,9 +651,7 @@
   
   if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_ORIGINAL)
     UpdateCPU_Original(hardware);
-  else if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_4STACK)
-    UpdateCPU_4Stack(hardware);
-  else if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_SMT)
+  else
     UpdateCPU_SMT(hardware);
   
   // Place the input buffer on the screen.
@@ -844,15 +684,22 @@
   Refresh();
 }
 
-void cZoomScreen::UpdateCPU_Original(cHardwareBase & hardware)
+void cZoomScreen::UpdateCPU_Original(cHardwareBase& hardware)
 {
-  cHardwareCPU & hardwareCPU = (cHardwareCPU &) hardware;
-  //hardwareCPU.SetThread(cur_view_thread);
+  // @DMB - This is making a relatively safe assumption of hardware type, but it IS an assumption
+#ifdef DEBUG
+  cHardwareCPU* p_hw = dynamic_cast<cHardwareCPU*>(&hardware);
+  assert(p_hw);
+  cHardwareCPU& hardwareCPU = *p_hw;
+#else
+  cHardwareCPU& hardwareCPU = static_cast<cHardwareCPU&>(hardware);
+#endif
   
+  
   // Place the registers onto the screen.
   SetBoldColor(COLOR_CYAN);
-  for (int i = 0; i < nHardwareCPU::NUM_REGISTERS; i++) {
-    Print(REG_Y+3 + i, REG_X+6, "%11d", hardwareCPU.GetRegister(i));
+  for (int i = 0; i < hardware.GetNumRegisters(); i++) {
+    Print(REG_Y+3 + i, REG_X+6, "%11d", hardware.GetRegister(i));
   }
   
   // Place the active stack onto the screen.
@@ -860,13 +707,13 @@
   // Stack A
   // SetBoldColor(COLOR_CYAN);   // -Redundant
   SetColor(COLOR_WHITE);
-  Print(STACK_Y + 1, STACK_X + 2, "Stack %s", 'A' + hardwareCPU.GetActiveStack());
+  Print(STACK_Y + 1, STACK_X + 2, "Stack %c", 'A' + hardwareCPU.GetActiveStack());
   
   SetBoldColor(COLOR_CYAN);
-  Print(STACK_Y+3, STACK_X + 2, "%11d", hardwareCPU.GetStack(0));
+  Print(STACK_Y+3, STACK_X + 2, "%11d", hardware.GetStack(0));
   SetColor(COLOR_CYAN);
   for (int i = 1; i <= 2; i++) {
-    Print(STACK_Y+3 + i, STACK_X+2, "%11d", hardwareCPU.GetStack(i));
+    Print(STACK_Y+3 + i, STACK_X+2, "%11d", hardware.GetStack(i));
   }
   
   // Place the input buffer on the screen.
@@ -879,15 +726,15 @@
     Print(INPUT_Y+3+i, INPUT_X+2, "%12d", info.GetActiveCell()->GetInput(i));
   }
   
-  Print(19, 74, "%2d/%2d", hardwareCPU.GetCurThread() + 1,
-        hardwareCPU.GetNumThreads());
+  Print(19, 74, "%2d/%2d", hardware.GetCurThread() + 1,
+        hardware.GetNumThreads());
   
   // This line gets the creature that is currently executing. Usually the
   // creature we are viewing, but can also be a different one (if this is a
   // parasite).
   
   const cCPUMemory & memory = (parasite_zoom) ?
-    hardware.GetMemory() : hardwareCPU.IP().GetMemory();
+    hardware.GetMemory() : hardware.IP().GetMemory();
   SetColor(COLOR_WHITE);
   Print(MEMORY_Y + 1, MEMORY_X + 9, "%4d", memory.GetSize());
   
@@ -902,10 +749,10 @@
   }
   
   int adj_inst_ptr = 0;
-  int base_inst_ptr = hardwareCPU.IP().GetPosition();
+  int base_inst_ptr = hardware.IP().GetPosition();
   if (base_inst_ptr < 0 || parasite_zoom == true) base_inst_ptr = 0;
   
-  const cInstSet & inst_set = hardwareCPU.GetInstSet();
+  const cInstSet & inst_set = hardware.GetInstSet();
   
   // Determine the center (must be between 0 and size - 1)
   int center_pos = (base_inst_ptr + memory_offset) % memory.GetSize();
@@ -964,13 +811,13 @@
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 27, "Bp");
       }
       
-      if (adj_inst_ptr == hardwareCPU.GetHead(nHardware::HEAD_READ).GetPosition()) {
+      if (adj_inst_ptr == hardware.GetHead(nHardware::HEAD_READ).GetPosition()) {
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 30, "R");
       }
-      if (adj_inst_ptr == hardwareCPU.GetHead(nHardware::HEAD_WRITE).GetPosition()) {
+      if (adj_inst_ptr == hardware.GetHead(nHardware::HEAD_WRITE).GetPosition()) {
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 31, "W");
       }
-      if (adj_inst_ptr == hardwareCPU.GetHead(nHardware::HEAD_FLOW).GetPosition()) {
+      if (adj_inst_ptr == hardware.GetHead(nHardware::HEAD_FLOW).GetPosition()) {
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 32, "F");
       }
     }
@@ -980,165 +827,33 @@
   DrawMiniMap();
 }
 
-void cZoomScreen::UpdateCPU_4Stack(cHardwareBase & hardware)
+
+void cZoomScreen::UpdateCPU_SMT(cHardwareBase& hardware)
 {
-  cHardware4Stack & hardware4Stack = (cHardware4Stack &) hardware;
-  
-  if(cur_view_thread>=hardware4Stack.GetNumThreads())
+  if (cur_view_thread >= hardware.GetNumThreads())
   {
-    cur_view_thread=0;
-    cur_mem_space = hardware4Stack.IP(cur_view_thread).GetMemSpace();
+    cur_view_thread = 0;
+#ifdef DEBUG
+    cHeadMultiMem* p_cur_ip = dynamic_cast<cHeadMultiMem*>(&hardware.IP(cur_view_thread));
+    assert(p_cur_ip);
+    cur_mem_space = p_cur_ip->GetMemSpace();
+#else
+    cur_mem_space = static_cast<cHeadMultiMem&>(hardware.IP(cur_view_thread)).GetMemSpace();
+#endif
   }
-  //hardware4Stack.SetThread(cur_view_thread);
-  cHeadMultiMem & cur_ip = hardware4Stack.IP(cur_view_thread);
-  
-  // Place the stacks onto the screen.
-  SetBoldColor(COLOR_CYAN);
-  for (int i = 0; i < 4; i++) {
-    Print(REG_Y+2 + i, REG_X+6, "%11d", hardware4Stack.GetStack(0, i, cur_view_thread));
-  }
-  
-  // Place the active stack onto the screen.
-  
-  // Stack AX
-  //SetBoldColor(COLOR_CYAN);   // -Redundant
-  SetColor(COLOR_WHITE);
-  
-  Print(STACK_Y, STACK_X + 2, "Stack   :");
-  Print(STACK_Y, STACK_X + 8, "%cX" , 'A' + cur_stack);
-  
-  //SetBoldColor(COLOR_CYAN);
-  //Print(STACK_Y+2, STACK_X + 2, "%11d", hardware4Stack.GetStack(0, cur_stack));
-  SetColor(COLOR_CYAN);
-  for (int i = 0; i <= 3; i++) {
-    Print(STACK_Y+2 + i, STACK_X+2, "%11d", hardware4Stack.GetStack(i, cur_stack, cur_view_thread));
-  }
-  
-  Print(19, 74, "%2d/%2d", cur_view_thread + 1,
-        hardware4Stack.GetNumThreads());
-  
-  // This line gets the creature that is currently executing. Usually the
-  // creature we are viewing, but can also be a different one (if this is a
-  // parasite).
-  
-  const cCPUMemory & memory = hardware4Stack.GetMemory(cur_mem_space);
-  SetBoldColor(COLOR_BLUE);
-  Print(MEMORY_Y + 1, MEMORY_X + 8, " Space ");	
-  SetColor(COLOR_WHITE);
-  Print(MEMORY_Y + 1, MEMORY_X + 15, "%2d", cur_mem_space);
-  
-  Print(MEMORY_Y + 1, MEMORY_X + 17, ":");	
-  Print(MEMORY_Y + 1, MEMORY_X + 18, "%4d", memory.GetSize());
-  
-  
-  
-  // Nothing past this point gets executed for empty creatures....
-  if (memory.GetSize() == 0) {
-    for (int i = -MEMORY_PRE_SIZE; i <= MEMORY_POST_SIZE; i++) {
-      HLine(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X, 36);
-    }
-    return;
-  }
-  
-  int adj_inst_ptr = 0;
-  int base_inst_ptr = cur_ip.GetPosition();
-  if (base_inst_ptr < 0 || parasite_zoom == true) base_inst_ptr = 0;
-  
-  const cInstSet & inst_set = hardware4Stack.GetInstSet();
-  
-  // Determine the center (must be between 0 and size - 1)
-  int center_pos = (base_inst_ptr + memory_offset) % memory.GetSize();
-  if (center_pos < 0) center_pos += memory.GetSize();
-  
-  for (int i = -MEMORY_PRE_SIZE; i <= MEMORY_POST_SIZE; i++) {
-    adj_inst_ptr = (center_pos + i) % (memory.GetSize() + 1);
-    if (adj_inst_ptr < 0) adj_inst_ptr += memory.GetSize() + 1;
-    
-    if (adj_inst_ptr == memory.GetSize()) {
-      HLine(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X, 36);
-    } else {
-      Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X, CHAR_VLINE);
-      Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 35, CHAR_VLINE);
-      
-      // If we are on the instruction about to be executed by the CPU,
-      // hilight it...
-      if (adj_inst_ptr == base_inst_ptr && 
-          hardware4Stack.IP(cur_view_thread).GetMemSpace() == cur_mem_space) {
-        SetBoldColor(COLOR_WHITE);
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 1, "%3d: ",
-              adj_inst_ptr);
-        SetBoldColor(COLOR_CYAN);
-      } else {
-        if (i == 0) SetBoldColor(COLOR_YELLOW);
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 1, "%3d: ",
-              adj_inst_ptr);
-        // If we are scrolling through memory, make the current position
-        // yellow.
-        if (i == 0) SetColor(COLOR_YELLOW);
-        else SetColor(COLOR_CYAN);
-      }
-      
-      // Print the instruction...
-      Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 6, "%8s ",
-            static_cast<const char*>(inst_set.GetName(memory[adj_inst_ptr])));
-      
-      Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 15,
-            "                    ");
-      
-      // Only list the "Cpy" flag or the "Inj" flag...
-      if (memory.FlagCopied(adj_inst_ptr)) {
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 16, "Cpy");
-      }
-      if (memory.FlagInjected(adj_inst_ptr)) {
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 16, "Inj");
-      }
-      
-      // Other flags we're interested in...
-      if (memory.FlagMutated(adj_inst_ptr)) {
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 20, "Mut");
-      }
-      if (memory.FlagExecuted(adj_inst_ptr)) {
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 24, "Exe");
-      }
-      if (memory.FlagBreakpoint(adj_inst_ptr)) {
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 28, "Bp");
-      }
-      
-      if (adj_inst_ptr == hardware4Stack.GetHead(nHardware::HEAD_READ, cur_view_thread).GetPosition() &&
-          cur_mem_space == hardware4Stack.GetHead(nHardware::HEAD_READ, cur_view_thread).GetMemSpace()) {
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 31, "R");
-      }
-      if (adj_inst_ptr == hardware4Stack.GetHead(nHardware::HEAD_WRITE, cur_view_thread).GetPosition() &&
-          cur_mem_space == hardware4Stack.GetHead(nHardware::HEAD_WRITE, cur_view_thread).GetMemSpace()) {
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 32, "W");
-      }
-      if (adj_inst_ptr == hardware4Stack.GetHead(nHardware::HEAD_FLOW, cur_view_thread).GetPosition() &&
-          cur_mem_space == hardware4Stack.GetHead(nHardware::HEAD_FLOW, cur_view_thread).GetMemSpace()) {
-        Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 33, "F");
-      }
-    }
-    SetColor(COLOR_WHITE);
-  }
-  
-  DrawMiniMap();
-}
 
-void cZoomScreen::UpdateCPU_SMT(cHardwareBase & hardware)
-{
-  cHardwareSMT& hardware4Stack = (cHardwareSMT&) hardware;
+#ifdef DEBUG
+  cHeadMultiMem* p_cur_ip = dynamic_cast<cHeadMultiMem*>(&hardware.IP(cur_view_thread));
+  assert(p_cur_ip);
+  cHeadMultiMem& cur_ip = *p_cur_ip;
+#else
+  cHeadMultiMem& cur_ip = static_cast<cHeadMultiMem&>(hardware.IP(cur_view_thread));
+#endif
   
-  if(cur_view_thread>=hardware4Stack.GetNumThreads())
-  {
-    cur_view_thread=0;
-    cur_mem_space = hardware4Stack.IP(cur_view_thread).GetMemSpace();
-  }
-  //hardware4Stack.SetThread(cur_view_thread);
-  cHeadMultiMem & cur_ip = hardware4Stack.IP(cur_view_thread);
-  
   // Place the stacks onto the screen.
   SetBoldColor(COLOR_CYAN);
   for (int i = 0; i < 4; i++) {
-    Print(REG_Y+2 + i, REG_X+6, "%11d", hardware4Stack.GetStack(0, i, cur_view_thread));
+    Print(REG_Y+2 + i, REG_X+6, "%11d", hardware.GetStack(0, i, cur_view_thread));
   }
   
   // Place the active stack onto the screen.
@@ -1151,20 +866,20 @@
   Print(STACK_Y, STACK_X + 8, "%cX" , 'A' + cur_stack);
   
   //SetBoldColor(COLOR_CYAN);
-  //Print(STACK_Y+2, STACK_X + 2, "%11d", hardware4Stack.GetStack(0, cur_stack));
+  //Print(STACK_Y+2, STACK_X + 2, "%11d", hardware.GetStack(0, cur_stack));
   SetColor(COLOR_CYAN);
   for (int i = 0; i <= 3; i++) {
-    Print(STACK_Y+2 + i, STACK_X+2, "%11d", hardware4Stack.GetStack(i, cur_stack, cur_view_thread));
+    Print(STACK_Y+2 + i, STACK_X+2, "%11d", hardware.GetStack(i, cur_stack, cur_view_thread));
   }
   
   Print(19, 74, "%2d/%2d", cur_view_thread + 1,
-        hardware4Stack.GetNumThreads());
+        hardware.GetNumThreads());
   
   // This line gets the creature that is currently executing. Usually the
   // creature we are viewing, but can also be a different one (if this is a
   // parasite).
   
-  const cCPUMemory & memory = hardware4Stack.GetMemory(cur_mem_space);
+  const cCPUMemory & memory = hardware.GetMemory(cur_mem_space);
   SetBoldColor(COLOR_BLUE);
   Print(MEMORY_Y + 1, MEMORY_X + 8, " Space ");	
   SetColor(COLOR_WHITE);
@@ -1187,7 +902,7 @@
   int base_inst_ptr = cur_ip.GetPosition();
   if (base_inst_ptr < 0 || parasite_zoom == true) base_inst_ptr = 0;
   
-  const cInstSet & inst_set = hardware4Stack.GetInstSet();
+  const cInstSet & inst_set = hardware.GetInstSet();
   
   // Determine the center (must be between 0 and size - 1)
   int center_pos = (base_inst_ptr + memory_offset) % memory.GetSize();
@@ -1205,8 +920,7 @@
       
       // If we are on the instruction about to be executed by the CPU,
       // hilight it...
-      if (adj_inst_ptr == base_inst_ptr && 
-          hardware4Stack.IP(cur_view_thread).GetMemSpace() == cur_mem_space) {
+      if (adj_inst_ptr == base_inst_ptr && cur_ip.GetMemSpace() == cur_mem_space) {
         SetBoldColor(COLOR_WHITE);
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 1, "%3d: ",
               adj_inst_ptr);
@@ -1247,16 +961,16 @@
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 28, "Bp");
       }
       
-      if (adj_inst_ptr == hardware4Stack.GetHead(nHardware::HEAD_READ, cur_view_thread).GetPosition() &&
-          cur_mem_space == hardware4Stack.GetHead(nHardware::HEAD_READ, cur_view_thread).GetMemSpace()) {
+      if (adj_inst_ptr == hardware.GetHead(nHardware::HEAD_READ, cur_view_thread).GetPosition() &&
+          cur_mem_space == static_cast<cHeadMultiMem&>(hardware.GetHead(nHardware::HEAD_READ, cur_view_thread)).GetMemSpace()) {
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 31, "R");
       }
-      if (adj_inst_ptr == hardware4Stack.GetHead(nHardware::HEAD_WRITE, cur_view_thread).GetPosition() &&
-          cur_mem_space == hardware4Stack.GetHead(nHardware::HEAD_WRITE, cur_view_thread).GetMemSpace()) {
+      if (adj_inst_ptr == hardware.GetHead(nHardware::HEAD_WRITE, cur_view_thread).GetPosition() &&
+          cur_mem_space == static_cast<cHeadMultiMem&>(hardware.GetHead(nHardware::HEAD_WRITE, cur_view_thread)).GetMemSpace()) {
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 32, "W");
       }
-      if (adj_inst_ptr == hardware4Stack.GetHead(nHardware::HEAD_FLOW, cur_view_thread).GetPosition() &&
-          cur_mem_space == hardware4Stack.GetHead(nHardware::HEAD_FLOW, cur_view_thread).GetMemSpace()) {
+      if (adj_inst_ptr == hardware.GetHead(nHardware::HEAD_FLOW, cur_view_thread).GetPosition() &&
+          cur_mem_space == static_cast<cHeadMultiMem&>(hardware.GetHead(nHardware::HEAD_FLOW, cur_view_thread)).GetMemSpace()) {
         Print(MEMORY_Y + MEMORY_PRE_SIZE + 3 + i, MEMORY_X + 33, "F");
       }
     }
@@ -1338,8 +1052,7 @@
 void cZoomScreen::EditMemory()
 {
   // Collect all of the needed variables.
-  cHardwareCPU & hardware =
-  (cHardwareCPU &) info.GetActiveCell()->GetOrganism()->GetHardware();
+  cHardwareBase& hardware = info.GetActiveCell()->GetOrganism()->GetHardware();
   const cInstSet & inst_set = hardware.GetInstSet();
   cHeadCPU edit_head( hardware.IP() );
   if (parasite_zoom == true) {
@@ -1410,7 +1123,7 @@
 void cZoomScreen::ViewMemory()
 {
   // Collect all of the needed variables.
-  cHardwareCPU& hardware = (cHardwareCPU&) info.GetActiveCell()->GetOrganism()->GetHardware();
+  cHardwareBase& hardware = info.GetActiveCell()->GetOrganism()->GetHardware();
   cHeadCPU view_head( hardware.IP() );
   if (parasite_zoom == true) {
     view_head.Set(0, &(info.GetActiveCell()->GetOrganism()->GetHardware()) );
@@ -1445,8 +1158,7 @@
     case THREAD_OPTIONS_LOCK:
       if (info.GetThreadLock() != -1) info.SetThreadLock(-1);
       else {
-        cHardwareCPU & hardware =
-        (cHardwareCPU &) info.GetActiveCell()->GetOrganism()->GetHardware();
+        cHardwareBase& hardware = info.GetActiveCell()->GetOrganism()->GetHardware();
         info.SetThreadLock( hardware.GetCurThread() );
       }
         
@@ -1460,14 +1172,13 @@
 
 void cZoomScreen::ViewInstruction()
 {
-  cTextWindow * window = new cTextWindow(10, 40, 7, 20);
+  cTextWindow* window = new cTextWindow(10, 40, 7, 20);
   window->SetBoldColor(COLOR_WHITE);
   window->Box();
   
   // Place the data.
   
-  cHardwareCPU & hardware =
-    (cHardwareCPU &) info.GetActiveCell()->GetOrganism()->GetHardware();
+  cHardwareBase& hardware = info.GetActiveCell()->GetOrganism()->GetHardware();
   cHeadCPU inst_ptr( hardware.IP() );
   if (parasite_zoom == true) {
     inst_ptr.Set(0, &(info.GetActiveCell()->GetOrganism()->GetHardware()) );
@@ -1537,9 +1248,8 @@
 
 void cZoomScreen::ViewRegisters()
 {
-  cTextWindow * window = new cTextWindow(9, 54, 4, 13);
-  cHardwareCPU & hardware =
-    (cHardwareCPU &) info.GetActiveCell()->GetOrganism()->GetHardware();
+  cTextWindow* window = new cTextWindow(9, 54, 4, 13);
+  cHardwareBase& hardware = info.GetActiveCell()->GetOrganism()->GetHardware();
   
   window->SetBoldColor(COLOR_WHITE);
   window->Box();
@@ -1583,10 +1293,20 @@
 
 void cZoomScreen::ViewStack()
 {
-  cTextWindow * window = new cTextWindow(16, 50, 4, 15);
-  cHardwareCPU & hardware =
-    (cHardwareCPU &) info.GetActiveCell()->GetOrganism()->GetHardware();
+  cTextWindow* window = new cTextWindow(16, 50, 4, 15);
   
+  // @DMB - Warning: This is making an unsafe assumption of hardware type.
+  //                 While this option is not listed on the ZoomScreen for other hardware types,
+  //                 it nonetheless is still possible to press the key to trigger it
+#ifdef DEBUG
+  cHardwareCPU* p_hw = dynamic_cast<cHardwareCPU*>(&info.GetActiveCell()->GetOrganism()->GetHardware());
+  assert(p_hw);
+  cHardwareCPU& hardware = *p_hw;
+#else
+  cHardwareCPU& hardware = static_cast<cHardwareCPU&>(info.GetActiveCell()->GetOrganism()->GetHardware());
+#endif
+  
+  
   bool finished = false;
   int active_stack = hardware.GetActiveStack();
   
@@ -1697,47 +1417,23 @@
       
     case ZOOM_SECTION_REGISTERS:
       if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_ORIGINAL)
-      {
         return cCoords(REG_X, REG_Y);
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_4STACK)
-      {
+      else
         return cCoords(REG_X, REG_Y-1);
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_SMT)
-      {
-        return cCoords(REG_X, REG_Y-1);
-      }
       break;
       
     case ZOOM_SECTION_STACK:
       if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_ORIGINAL)
-      {
         return cCoords(STACK_X, STACK_Y);
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_4STACK)
-      {
+      else
         return cCoords(STACK_X, STACK_Y-1);
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_SMT)
-      {
-        return cCoords(STACK_X, STACK_Y-1);
-      }
       break;
       
     case ZOOM_SECTION_INPUTS:
       if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_ORIGINAL)
-      {
         return cCoords(INPUT_X, INPUT_Y);
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_4STACK)
-      {
+      else
         return cCoords(INPUT_X, INPUT_Y-1);
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_SMT)
-      {
-        return cCoords(INPUT_X, INPUT_Y-1);
-      }
       break;
       
     case ZOOM_SECTION_MAP:
@@ -1748,79 +1444,22 @@
   return cCoords(0,0);
 }
 
-/*
- cString cZoomScreen::GetSectionName(int in_section)
- {
-   switch (in_section) {
-     case ZOOM_SECTION_MEMORY:
-       if(cConfig::GetHardwareType()==HARDWARE_TYPE_CPU_ORIGINAL)
-       {
-         return cString("Memory");
-       }
-       else if(cConfig::GetHardwareType()==HARDWARE_TYPE_CPU_4STACK)
-       {
-         return cString("Memory Space");
-       }
-       break;
-       
-     case ZOOM_SECTION_REGISTERS:
-       if(cConfig::GetHardwareType()==HARDWARE_TYPE_CPU_ORIGINAL)
-       {
-         return cString("Registers:");
-       }
-       else if(cConfig::GetHardwareType()==HARDWARE_TYPE_CPU_4STACK)
-       {
-         return cString("Stacks:");
-       }
-       break;
-       
-     case ZOOM_SECTION_STACK:
-       return cString("Stack ");
-       break;
-       
-     case ZOOM_SECTION_INPUTS:
-       return cString("Inputs:");
-       break;
-       
-     case ZOOM_SECTION_MAP:
-       return cString("Mini-Map");
-       break;
-   }
-   
-   return cString("Unknown!");
- }*/
 
 char* cZoomScreen::GetSectionName(int in_section)
 {
   switch (in_section) {
     case ZOOM_SECTION_MEMORY:
       if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_ORIGINAL)
-      {
         return "Memory";
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_4STACK)
-      {
+      else
         return "Memory Space";
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_SMT)
-      {
-        return "Memory Space";
-      }
       break;
       
     case ZOOM_SECTION_REGISTERS:
       if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_ORIGINAL)
-      {
         return "Registers:";
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_4STACK)
-      {
+      else
         return "Stacks:";
-      }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_SMT)
-      {
-        return "Stacks:";
-      }
       break;
       
     case ZOOM_SECTION_STACK:
@@ -1861,6 +1500,8 @@
 
 void cZoomScreen::DoInput(int in_char)
 {
+  cHardwareBase& hardware = info.GetActiveCell()->GetOrganism()->GetHardware();
+
   // First do the Mode specific io...
   
   if (mode == ZOOM_MODE_CPU      && DoInputCPU(in_char)) return;
@@ -1869,7 +1510,7 @@
   
   int num_threads = 0;
   if (info.GetActiveCell()->GetOrganism() != NULL) {
-    num_threads = info.GetActiveCell()->GetOrganism()->GetHardware().GetNumThreads();
+    num_threads = hardware.GetNumThreads();
   }
   switch(in_char) {
     case 't':
@@ -1878,18 +1519,16 @@
       {
         memory_offset=0;
         ++cur_view_thread%=num_threads;
-        if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_4STACK)
+        if(info.GetConfig().HARDWARE_TYPE.Get() != HARDWARE_TYPE_CPU_ORIGINAL)
         {
-          cHardware4Stack & hardware4Stack = 
-          (cHardware4Stack &) info.GetActiveCell()->GetOrganism()->GetHardware();
-          cur_mem_space=hardware4Stack.IP(cur_view_thread).GetMemSpace();
+#ifdef DEBUG
+          cHeadMultiMem* p_cur_ip = dynamic_cast<cHeadMultiMem*>(&hardware.IP(cur_view_thread));
+          assert(p_cur_ip);
+          cur_mem_space = p_cur_ip->GetMemSpace();
+#else
+          cur_mem_space = static_cast<cHeadMultiMem&>(hardware.IP(cur_view_thread)).GetMemSpace();
+#endif
         }
-        else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_SMT)
-        {
-          cHardwareSMT & hardwareSMT = 
-          (cHardwareSMT&) info.GetActiveCell()->GetOrganism()->GetHardware();
-          cur_mem_space=hardwareSMT.IP(cur_view_thread).GetMemSpace();
-        }
         Update();
       }
       break;
@@ -1969,14 +1608,9 @@
         }
       }
       else if (active_section == ZOOM_SECTION_MEMORY) {
-        if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_4STACK)
+        if(info.GetConfig().HARDWARE_TYPE.Get() != HARDWARE_TYPE_CPU_ORIGINAL)
         {
           cur_mem_space++;
-          cur_mem_space %= nHardware4Stack::NUM_MEMORY_SPACES;
-        }
-        else if(info.GetConfig().HARDWARE_TYPE.Get() == HARDWARE_TYPE_CPU_SMT)
-        {
-          cur_mem_space++;
           // @DMB - Should handle the extensibility of SMT Memory Spaces
           cur_mem_space %= 1;
         }
@@ -1994,12 +1628,8 @@
         }
       }
       else if (active_section == ZOOM_SECTION_MEMORY) {
-        if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_4STACK) {
+        if(info.GetConfig().HARDWARE_TYPE.Get() != HARDWARE_TYPE_CPU_ORIGINAL) {
           cur_mem_space--;
-          if (cur_mem_space < 0) cur_mem_space = nHardware4Stack::NUM_MEMORY_SPACES - 1;
-        }
-        else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_SMT) {
-          cur_mem_space--;
           // @DMB - Should handle the extensibility of SMT Memory Spaces
           if (cur_mem_space < 0) cur_mem_space = 0;
         }
@@ -2008,12 +1638,9 @@
       break;
     case 'K':
     case 'k':
-      if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_4STACK) {
+      if(info.GetConfig().HARDWARE_TYPE.Get() != HARDWARE_TYPE_CPU_ORIGINAL) {
         ++cur_stack%=4;
       }
-      else if(info.GetConfig().HARDWARE_TYPE.Get()==HARDWARE_TYPE_CPU_SMT) {
-        ++cur_stack%=4;
-      }
       Update();
       break;
     case '+':

Modified: development/source/targets/avida-viewer/cZoomScreen.h
===================================================================
--- development/source/targets/avida-viewer/cZoomScreen.h	2006-07-11 19:52:25 UTC (rev 827)
+++ development/source/targets/avida-viewer/cZoomScreen.h	2006-07-13 01:41:37 UTC (rev 828)
@@ -81,17 +81,14 @@
 
 private:
   void DrawCPU_Original();
-  void DrawCPU_4Stack();
   void DrawCPU_SMT();
   void DrawStats();
   void DrawGenotype();
   void UpdateCPU(cHardwareBase & hardware);
   void UpdateCPU_Original(cHardwareBase & hardware);
-  void UpdateCPU_4Stack(cHardwareBase & hardware);
   void UpdateCPU_SMT(cHardwareBase & hardware);
   void UpdateStats(cHardwareBase & hardware);
   void UpdateStats_CPU(cHardwareBase & hardware);
-  void UpdateStats_4Stack(cHardwareBase & hardware);
   void UpdateStats_SMT(cHardwareBase & hardware);
   void UpdateGenotype();
 




More information about the Avida-cvs mailing list