📄 mgt.cpp
字号:
* Inputs:
* BYTE status: Status byte
* Result: void
*
* Effect:
* Sets the state of the controls to the input status flags
* Notes:
* Uses optimized update to reduce flicker
****************************************************************************/
void CSimulatorDlg::OutStatusToControls(BYTE status)
{
optimizedSet(c_ErrOut, status, REGISTER_OUT_STATUS_ERR );
optimizedSet(c_UndOut, status, REGISTER_OUT_STATUS_UND );
optimizedSet(c_BusyOut, status, REGISTER_OUT_STATUS_BUSY);
optimizedSet(c_IntOut, status, REGISTER_OUT_STATUS_INT );
optimizedSet(c_DoneOut, status, REGISTER_OUT_STATUS_DONE);
updateControls(FALSE); // handle any induced dependencies
}
/****************************************************************************
* CSimulatorDlg::OutControlsToStatus
* Result: BYTE
* A status byte representing the current state in the controls
****************************************************************************/
BYTE CSimulatorDlg::OutControlsToStatus()
{
BYTE result = 0;
if(c_ErrOut.GetCheck() == BST_CHECKED)
result |= REGISTER_OUT_STATUS_ERR;
if(c_UndOut.GetCheck() == BST_CHECKED)
result |= REGISTER_OUT_STATUS_UND;
if(c_BusyOut.GetCheck() == BST_CHECKED)
result |= REGISTER_OUT_STATUS_BUSY;
if(c_IntOut.GetCheck() == BST_CHECKED)
result |= REGISTER_OUT_STATUS_INT;
if(c_DoneOut.GetCheck() == BST_CHECKED)
result |= REGISTER_OUT_STATUS_DONE;
return result;
}
/****************************************************************************
* CSimulatorDlg::OnUpdateControls
* Inputs:
* WPARAM: ignored
* LPARAM: ignored
* Result: LRESULT
* void, 0 always
* Effect:
* Updates the controls
****************************************************************************/
LRESULT CSimulatorDlg::OnUpdateControls(WPARAM, LPARAM)
{
updateControls();
return 0;
}
/****************************************************************************
* CSimulatorDlg::logErrorChange
* Inputs:
* CButton & ctl: Control that has changed
* Result: void
*
* Effect:
* Logs the error injection control state change
****************************************************************************/
void CSimulatorDlg::logErrorChange(CButton & ctl)
{
CString s;
ctl.GetWindowText(s);
TraceItem * item = new TraceItem(TRACE_TYPE_ANNOTATION, ctl.GetCheck(), s);
c_Trace.AddString(item);
}
/****************************************************************************
* CSimulatorDlg::OnAppAbout
* Result: void
*
* Effect:
* ABOUT box
****************************************************************************/
void CSimulatorDlg::OnAppAbout()
{
doAbout();
}
/****************************************************************************
* CSimulatorDlg::OnFileExit
* Result: void
*
* Effect:
* Exits the program
****************************************************************************/
void CSimulatorDlg::OnFileExit()
{
OnOK();
}
/****************************************************************************
* CSimulatorDlg::OnFileSave
* Result: void
*
* Effect:
* Saves the contents of the transcript
****************************************************************************/
void CSimulatorDlg::OnFileSave()
{
doSave(TRUE);
c_Trace.SetModified(FALSE);
}
/****************************************************************************
* CSimulatorDlg::OnFileSaveAs
* Result: void
*
* Effect:
* Saves the contents of the trace buffer
****************************************************************************/
void CSimulatorDlg::OnFileSaveAs()
{
doSave(FALSE);
c_Trace.SetModified(FALSE);
}
/****************************************************************************
* CSimulatorDlg::OnHelpIndex
* Result: void
*
* Effect:
* Calls Help system
****************************************************************************/
void CSimulatorDlg::OnHelpIndex()
{
WinHelp(0, HELP_CONTENTS);
}
/****************************************************************************
* CSimulatorDlg::OnDebug
* Result: void
*
* Effect:
* Toggles the debug flag
****************************************************************************/
void CSimulatorDlg::OnDebug()
{
debug = !debug;
}
void CSimulatorDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
CMenu * menu = GetMenu();
menu->EnableMenuItem(ID_EDIT_CLEAR, c_Trace.GetCount() > 0
? MF_ENABLED
: MF_GRAYED);
menu->EnableMenuItem(ID_FILE_SAVE, c_Trace.GetCount() > 0 &&
c_Trace.GetModified()
? MF_ENABLED
: MF_GRAYED);
menu->EnableMenuItem(ID_FILE_SAVE_AS, c_Trace.GetCount() > 0
? MF_ENABLED
: MF_GRAYED);
menu->CheckMenuItem(IDM_DEBUG, debug ? MF_CHECKED : MF_UNCHECKED);
menu->EnableMenuItem(IDM_SETUP_IRQ, manual ? MF_ENABLED : MF_GRAYED);
}
/****************************************************************************
* CSimulatorDlg::OnOpenFailed
* Inputs:
* WPARAM: ignored
* LPARAM lParam: GetLastError()
* Result: LRESULT
* 0, always
* Effect:
* Notifies user that the device open failed
****************************************************************************/
LRESULT CSimulatorDlg::OnOpenFailed(WPARAM, LPARAM lParam)
{
CString s;
s.LoadString(IDS_OPEN_FAILED);
s += _T("\r\n");
s += formatError(lParam);
AfxMessageBox(s, MB_ICONERROR | MB_OK);
return 0;
}
/****************************************************************************
* CSimulatorDlg::doSave
* Inputs:
* BOOL mode: TRUE to Save, FALSE to SaveAs
* Result: void
*
* Effect:
* Does a save
****************************************************************************/
void CSimulatorDlg::doSave(BOOL mode)
{
BOOL prompt = FALSE;
if(mode)
{ /* Save */
if(SaveFileName.GetLength() == 0)
{ /* no file name set */
prompt = TRUE;
} /* no file name set */
} /* Save */
else
{ /* SaveAs */
prompt = TRUE;
} /* SaveAs */
CString name;
if(prompt)
{ /* get file name */
CString filter;
filter.LoadString(IDS_FILTER);
CFileDialog dlg(FALSE, _T(".trc"), NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
filter);
CString s;
s.LoadString(mode ? IDS_FILE_SAVE : IDS_FILE_SAVE_AS);
dlg.m_ofn.lpstrTitle = s;
switch(dlg.DoModal())
{ /* domodal */
case 0: // should never happen
case IDCANCEL:
return;
} /* domodal */
// We get here, it must be IDOK
name = dlg.GetPathName();
} /* get file name */
else
{ /* already has name */
name = SaveFileName;
} /* already has name */
TRY
{
CStdioFile f(name, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive);
for(int i = 0; i < c_Trace.GetCount(); i++)
{ /* write each */
TraceItem * e = (TraceItem *)c_Trace.GetItemDataPtr(i);
f.WriteString(e->display(c_Trace.getTimeBase()));
} /* write each */
f.Close();
SaveFileName = name;
c_Trace.SetModified(FALSE);
}
CATCH(CFileException, e)
{ /* error */
AfxMessageBox(IDS_FILE_OPEN_FAILED, MB_ICONERROR | MB_OK);
// TODO: Make this report a meaningful error (it's 5am and I want
// to finish this before I leave for a trip later today!)
return; // return without doing anything further
} /* error */
END_CATCH
}
/****************************************************************************
* CSimulatorDlg::OpenRegisterTransaction
* Inputs:
* LPCTSTR where: Trace string
* Result: void
*
* Effect:
* Opens a register transaction
****************************************************************************/
void CSimulatorDlg::OpenRegisterTransaction(LPCTSTR where)
{
if(debug)
{ /* debug */
CString s;
s.Format(_T("(((Register (%s)"), where);
TraceItem * e = new TraceItem(TRACE_TYPE_COMMENT, s);
c_Trace.AddString(e);
} /* debug */
registers.read();
if(regdisp != NULL)
regdisp->SendMessage(UWM_UPDATE_REGS, 0, (LPARAM)®isters);
}
/****************************************************************************
* CSimulatorDlg::CloseRegisterTransaction
* Inputs:
* LPCTSTR where: Trace string
* Result: void
*
* Effect:
* Closes a register transaction
****************************************************************************/
void CSimulatorDlg::CloseRegisterTransaction(LPCTSTR where)
{
if(debug)
{ /* debug */
CString s;
s.Format(_T("))) Register (%s)"), where);
TraceItem * e = new TraceItem(TRACE_TYPE_COMMENT, s);
c_Trace.AddString(e);
} /* debug */
if(regdisp != NULL)
regdisp->SendMessage(UWM_UPDATE_REGS, 0, (LPARAM)®isters);
registers.write();
}
/****************************************************************************
* CSimulatorDlg::OnRegClose
* Inputs:
* WPARAM: ignored
* LPARAM: ignored
* Result: LRESULT
* 0, always
* Effect:
* The register display has closed
****************************************************************************/
LRESULT CSimulatorDlg::OnRegClose(WPARAM, LPARAM)
{
regdisp = NULL;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -