⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freerun.cpp

📁 通过VC源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// freerun: The routines associated with freerun management

#include "stdafx.h"
#include "Simulator.h"
#include <sys\timeb.h>
#include "TraceWnd.h"
#include "Regvars.h"
#include "NumericEdit.h"
  #include "InterruptMgt.h"
#include "SpinnerButton.h"
#include "register.h"
#include "RegData.h"
  #include "RegDisplay.h"
    #include "SimulatorDlg.h"
#include "buzzword.h"
#include "uwm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define TIMER_SET_DONE_IN  1
#define TIMER_SET_DONE_OUT 2


/****************************************************************************
*                          CSimulatorDlg::OnFreerun
* Result: void
*       
* Effect: 
*       Releases the automatic polling thread to do its thing
****************************************************************************/

void CSimulatorDlg::OnFreerun() 
{
 	if(!manual)
	   return; // already freerunning

 	TraceItem * item = new TraceItem(TRACE_TYPE_ANNOTATION, TRUE,
					_T("Free Run Mode"));
        c_Trace.AddString(item);


	manual = FALSE;
	singleStep = FALSE;

	OpenRegisterTransaction("OnFreeRun");
	updateControls(); 
	CloseRegisterTransaction("OnFreeRun");

 	::SetEvent(freerun);
}

/****************************************************************************
*                          CSimulatorDlg::OnIEInSet
* Inputs:
*       WPARAM: ignored
*	LPARAM: ignored
* Result: LRESULT
*       0, always
* Effect: 
*       Handles user setting IE bit
****************************************************************************/

LRESULT CSimulatorDlg::OnIEInSet(WPARAM, LPARAM)
    {
     return 0;
    }

/****************************************************************************
*                          CSimulatorDlg::OnIEOutSet
* Inputs:
*       WPARAM: ignored
*	LPARAM: ignored
* Result: LRESULT
*       0, always
* Effect: 
*       Handles user setting IE bit
****************************************************************************/

LRESULT CSimulatorDlg::OnIEOutSet(WPARAM, LPARAM)
    {
     return 0;
    }

/****************************************************************************
*                         CSimulatorDlg::OnRstOutSet
* Inputs:
*       WPARAM: ignored
*	LAPRAM: ignored
* Result: LRESULT
*       Logically void, 0, always
* Effect: 
*       Clears the RST out flag
****************************************************************************/

LRESULT CSimulatorDlg::OnRstOutSet(WPARAM, LPARAM)
    {
     ASSERT(!manual);
     BYTE status = registers.get(REGISTER_OUT_STATUS);
     BYTE newstatus = status;
     newstatus &= ~(REGISTER_OUT_STATUS_ERR | REGISTER_OUT_STATUS_UND); // clear ERR and OVR
     registers.set(REGISTER_OUT_STATUS, newstatus);
     OutStatusToControls(newstatus);
     TraceItem * item = new TraceItem(TRACE_TYPE_RST_OUT, TRUE, _T(""));
     c_Trace.AddString(item);

     // If we cleared the ERR bit, record this
     if(status & REGISTER_OUT_STATUS_ERR)
	{ /* cleared err */
	 item = new TraceItem(TRACE_TYPE_ERR_OUT, FALSE);
	 c_Trace.AddString(item);
	} /* cleared err */
     if(status & REGISTER_OUT_STATUS_UND)
	{ /* cleared UND */
	 item = new TraceItem(TRACE_TYPE_UND_OUT, FALSE);
	 c_Trace.AddString(item);
	} /* cleared UND */

     // Now clear the RST bit
     BYTE command = registers.get(REGISTER_IN_COMMAND);
     command &= ~REGISTER_IN_COMMAND_RST; // clear RST
     registers.set(REGISTER_IN_COMMAND, command);

     item = new TraceItem(TRACE_TYPE_RST_IN, FALSE, _T("Auto-reset"));
     c_Trace.AddString(item);

     InCommandToControls(command);
     return 0;
    } // CSimulatorDlg::OnRstOutSet

/****************************************************************************
*                           CSimulatorDlg::OnGoOutSet
* Inputs:
*       WPARAM: ignored
*	LPARAM: ignored
* Result: LRESULT
*       0, always
* Effect: 
*       Handles the recognition that the "Go" bit has been set.
*		- Clears the GO bit
*		- Sets up a delay
*		- At the end of the delay will cause the Done bit to be set
* Notes:
*	This only occurs within a register transaction
****************************************************************************/

LRESULT CSimulatorDlg::OnGoOutSet(WPARAM, LPARAM)
    {
     BYTE command = registers.get(REGISTER_OUT_COMMAND);
     BYTE newcommand = command & ~REGISTER_OUT_COMMAND_GO;

     c_GoOut.SetCheck(BST_UNCHECKED);
     TraceItem * item = new TraceItem(TRACE_TYPE_GO_OUT, FALSE);
     c_Trace.AddString(item);

     registers.set(REGISTER_OUT_COMMAND, newcommand);
     OutCommandToControls(newcommand);

     BYTE status = registers.get(REGISTER_OUT_STATUS);
     BYTE newstatus = status | REGISTER_OUT_STATUS_BUSY;

     // This handles the simulator restrictions and triggers an INT on
     // GO being cleared
     if(command & REGISTER_OUT_COMMAND_IE)
        { /* interrupt */
	 newstatus |= REGISTER_OUT_STATUS_INT;
	 generateAndLogInterrupt(_T("by GO OUT bit cleared"));
	} /* interrupt */

     registers.set(REGISTER_OUT_STATUS, newstatus);

     logStatusChangeOut(status, newstatus);
     OutStatusToControls(newstatus);
     
     // Set up a timer to clear the Busy bit and set the Done bit 

     if(debug)
        { /* debug */
	 TraceItem * e = new TraceItem(TRACE_TYPE_COMMENT, _T("Requesting Timer Out"));
	 c_Trace.AddString(e);
	} /* debug */

     PostMessage(UWM_SET_TIMER_OUT);

     updateControls();
     return 0;
    }

/****************************************************************************
*                          CSimulatorDlg::OnRstInSet
* Inputs:
*       WPARAM: ignored
*	LPARAM: ignored
* Result: LRESULT
*       Logically void, 0, always
* Effect: 
*       Handles the change in the RST bit
****************************************************************************/

LPARAM CSimulatorDlg::OnRstInSet(WPARAM, LPARAM)
    {
     ASSERT(!manual);
     BYTE status = registers.get(REGISTER_IN_STATUS);
     BYTE newstatus = status;
     newstatus &= ~(REGISTER_IN_STATUS_ERR | REGISTER_IN_STATUS_OVR); // clear ERR and UND
     registers.set(REGISTER_IN_STATUS, newstatus);
     InStatusToControls(newstatus);
     TraceItem * item = new TraceItem(TRACE_TYPE_RST_IN, TRUE, _T(""));
     c_Trace.AddString(item);
     
     // If we cleared the ERR bit, record this
     if(status & REGISTER_IN_STATUS_ERR)
	{ /* cleared err */
	 item = new TraceItem(TRACE_TYPE_ERR_IN, FALSE);
	 c_Trace.AddString(item);
	} /* cleared err */
     if(status & REGISTER_IN_STATUS_OVR)
	{ /* cleared UND */
	 item = new TraceItem(TRACE_TYPE_OVR_IN, FALSE);
	 c_Trace.AddString(item);
	} /* cleared UND */

     // Now clear the RST bit
     BYTE command = registers.get(REGISTER_IN_COMMAND);
     command &= ~REGISTER_IN_COMMAND_RST; // clear RST
     registers.set(REGISTER_IN_COMMAND, command);

     item = new TraceItem(TRACE_TYPE_RST_IN, FALSE, _T("Auto-reset"));
     c_Trace.AddString(item);

     InCommandToControls(command);
     return 0;
    } // CSimulatorDlg::OnRstInSet

/****************************************************************************
*                           CSimulatorDlg::OnGoInSet
* Inputs:
*       WPARAM: ignored
*	LPARAM: ignored
* Result: LRESULT
*       0, always
* Effect: 
*       Handles the recognition that the "Go" bit has been set by the remote
*	driver
*		- Clears the GO bit
*		- Sets up a delay
*		- At the end of the delay will cause the Done bit to be set
* Notes:
*	This is only called in freerunning mode, from within a register
*	transaction
****************************************************************************/

LRESULT CSimulatorDlg::OnGoInSet(WPARAM, LPARAM)
    {
     // Clear the GO bit
     BYTE command = registers.get(REGISTER_IN_COMMAND);
     command &= ~REGISTER_IN_COMMAND_GO;
     registers.set(REGISTER_IN_COMMAND, command); // clear GO bit

     c_GoIn.SetCheck(BST_UNCHECKED);
     TraceItem * item = new TraceItem(TRACE_TYPE_GO_IN, FALSE);

     c_Trace.AddString(item);

     // Clear all status bits

     BYTE status = registers.get(REGISTER_IN_STATUS);
     BYTE newstatus = 0;

     // This handles the simulator restrictions and triggers an INT on
     // GO being cleared
     if(command & REGISTER_IN_COMMAND_IE)
        { /* interrupt */
	 newstatus |= REGISTER_IN_STATUS_INT;
	 generateAndLogInterrupt(_T("by GO IN bit cleared"));
	} /* interrupt */

     registers.set(REGISTER_IN_STATUS, newstatus);

     InStatusToControls(newstatus);
     logStatusChangeIn(status, newstatus);

     // Set up a timer 
     if(debug)
        { /* debug */
	 TraceItem * e = new TraceItem(TRACE_TYPE_COMMENT, _T("Requesting Timer In"));
	 c_Trace.AddString(e);
	} /* debug */

     PostMessage(UWM_SET_TIMER_IN);

     updateControls();
     return 0;
    }

/****************************************************************************
*                           CSimulatorDlg::OnGoHackIn
* Result: void
*       
* Effect: 
*       This allows us to test the GO-bit logic even when there isn't another
*	driver loaded.  That's why the "hack" in the name!
****************************************************************************/

void CSimulatorDlg::OnGoHackIn() 
{
 ASSERT(!manual);
 if(!c_GoHackIn.getMode())
    return;

 c_GoHackIn.setMode(FALSE);  // no longer accepting input
 PostMessage(UWM_GO_HACK_IN);
}


LRESULT CSimulatorDlg::OnExecuteGoHackIn(WPARAM, LPARAM)
{	    
 if(manual)
    return 0; // handles race condition
 OpenRegisterTransaction(_T("Execute Go Hack In"));
 BYTE command = registers.get(REGISTER_IN_COMMAND);

 if( (command & REGISTER_IN_COMMAND_GO) == 0)
    { /* set go */
     command |= REGISTER_IN_COMMAND_GO;
     registers.set(REGISTER_IN_COMMAND, command);

     // Note that we don't actually send this to the controls...
     // (that seems a reasonable misfeature given the "hack" nature)
     TraceItem * item = new TraceItem(TRACE_TYPE_GO_IN, TRUE, _T("Hack"));
     c_Trace.AddString(item);
    } /* set go */
 
 CloseRegisterTransaction(_T("Register Go Hack In"));
 return 0;
}

/****************************************************************************
*                           CSimulatorDlg::OnGoHackOut
* Result: void
*       
* Effect: 
*       This allows us to test the GO-bit logic even when there isn't another
*	driver loaded.  That's why the "hack" in the name!
****************************************************************************/

void CSimulatorDlg::OnGoHackOut() 
{
 ASSERT(!manual);
 if(!c_GoHackOut.getMode())
    return;

 c_GoHackOut.setMode(FALSE);  // no longer accepting input
 PostMessage(UWM_GO_HACK_OUT);
}

LRESULT CSimulatorDlg::OnExecuteGoHackOut(WPARAM, LPARAM)
{	    
 if(manual)
    return 0; // handles race condition

 OpenRegisterTransaction(_T("Register Go Hack Out"));

 BYTE command = registers.get(REGISTER_OUT_COMMAND);
 if( (command & REGISTER_OUT_COMMAND_GO) == 0)
    { /* set go */
     command |= REGISTER_OUT_COMMAND_GO;

     if(output.GetLength() == 0)
	buzzphrase(output);
     BYTE ch = (BYTE) *(LPCTSTR)output;
     output = output.Mid(1);

     registers.set(REGISTER_OUT_DATA, ch);

     registers.set(REGISTER_OUT_COMMAND, command);
     // Note that we don't actually send this to the controls...
     // (that seems a reasonable misfeature given the "hack" nature)
     TraceItem * item = new TraceItem(TRACE_TYPE_GO_OUT, TRUE, _T("Hack"));
     c_Trace.AddString(item);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -