rlm@1: // IOViewer.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "resource.h" rlm@1: #include "IOViewer.h" rlm@1: #include "VBA.h" rlm@1: rlm@1: #include "../gba/GBA.h" // CPUWriteHalfWord rlm@1: #include "../gba/GBAGlobals.h" rlm@1: rlm@1: #include "IOViewerRegs.h" rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // IOViewer dialog rlm@1: rlm@1: IOViewer::IOViewer(CWnd*pParent /*=NULL*/) rlm@1: : ResizeDlg(IOViewer::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(IOViewer) rlm@1: // NOTE: the ClassWizard will add member initialization here rlm@1: //}}AFX_DATA_INIT rlm@1: selected = 0; rlm@1: autoUpdate = false; rlm@1: } rlm@1: rlm@1: void IOViewer::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(IOViewer) rlm@1: DDX_Control(pDX, IDC_VALUE, m_value); rlm@1: DDX_Control(pDX, IDC_ADDRESSES, m_address); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(IOViewer, CDialog) rlm@1: //{{AFX_MSG_MAP(IOViewer) rlm@1: ON_BN_CLICKED(IDC_CLOSE, OnClose) rlm@1: ON_BN_CLICKED(IDC_REFRESH, OnRefresh) rlm@1: ON_BN_CLICKED(IDC_AUTO_UPDATE, OnAutoUpdate) rlm@1: ON_CBN_SELCHANGE(IDC_ADDRESSES, OnSelchangeAddresses) rlm@1: ON_BN_CLICKED(IDC_APPLY, OnApply) rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // IOViewer message handlers rlm@1: rlm@1: void IOViewer::OnClose() rlm@1: { rlm@1: theApp.winRemoveUpdateListener(this); rlm@1: rlm@1: DestroyWindow(); rlm@1: } rlm@1: rlm@1: void IOViewer::OnRefresh() rlm@1: { rlm@1: // TODO: Add your control notification handler code here rlm@1: } rlm@1: rlm@1: void IOViewer::OnAutoUpdate() rlm@1: { rlm@1: autoUpdate = !autoUpdate; rlm@1: if (autoUpdate) rlm@1: { rlm@1: theApp.winAddUpdateListener(this); rlm@1: } rlm@1: else rlm@1: { rlm@1: theApp.winRemoveUpdateListener(this); rlm@1: } rlm@1: } rlm@1: rlm@1: void IOViewer::OnSelchangeAddresses() rlm@1: { rlm@1: selected = m_address.GetCurSel(); rlm@1: rlm@1: update(); rlm@1: } rlm@1: rlm@1: void IOViewer::PostNcDestroy() rlm@1: { rlm@1: delete this; rlm@1: } rlm@1: rlm@1: BOOL IOViewer::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: // winCenterWindow(getHandle()); rlm@1: DIALOG_SIZER_START(sz) rlm@1: DIALOG_SIZER_END() rlm@1: SetData(sz, rlm@1: TRUE, rlm@1: HKEY_CURRENT_USER, rlm@1: "Software\\Emulators\\VisualBoyAdvance\\Viewer\\IOView", rlm@1: NULL); rlm@1: rlm@1: CFont *font = CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT)); rlm@1: int i; rlm@1: for (i = 0; i < sizeof(ioViewRegisters)/sizeof(IOData); i++) rlm@1: { rlm@1: m_address.AddString(ioViewRegisters[i].name); rlm@1: } rlm@1: m_address.SetFont(font); rlm@1: for (i = 0; i < 16; i++) rlm@1: { rlm@1: GetDlgItem(IDC_BIT_0+i)->SetFont(font); rlm@1: } rlm@1: rlm@1: RECT cbSize; rlm@1: int Height; rlm@1: rlm@1: m_address.GetClientRect(&cbSize); rlm@1: Height = m_address.GetItemHeight(0); rlm@1: Height += m_address.GetItemHeight(0) * (10); rlm@1: rlm@1: // Note: The use of SM_CYEDGE assumes that we're using Windows '95 rlm@1: // Now add on the height of the border of the edit box rlm@1: Height += GetSystemMetrics(SM_CYEDGE) * 2; // top & bottom edges rlm@1: rlm@1: // The height of the border of the drop-down box rlm@1: Height += GetSystemMetrics(SM_CYEDGE) * 2; // top & bottom edges rlm@1: rlm@1: // now set the size of the window rlm@1: m_address.SetWindowPos(NULL, rlm@1: 0, 0, rlm@1: cbSize.right, Height, rlm@1: SWP_NOMOVE | SWP_NOZORDER); rlm@1: rlm@1: m_address.SetCurSel(0); rlm@1: update(); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void IOViewer::update() rlm@1: { rlm@1: CString buffer; rlm@1: rlm@1: const IOData *sel = &ioViewRegisters[selected]; rlm@1: u16 data = sel->address ? *sel->address : rlm@1: (ioMem ? *((u16 *)&ioMem[sel->offset]) : 0); rlm@1: rlm@1: for (int i = 0; i < 16; i++) rlm@1: { rlm@1: CButton *pWnd = (CButton *)GetDlgItem(IDC_BIT_0 + i); rlm@1: rlm@1: if (pWnd) rlm@1: { rlm@1: if (!(sel->write & (1 << i))) rlm@1: pWnd->EnableWindow(FALSE); rlm@1: else rlm@1: pWnd->EnableWindow(TRUE); rlm@1: pWnd->SetCheck(((data & (1 << i)) >> i)); rlm@1: buffer.Format("%2d %s", i, sel->bits[i]); rlm@1: pWnd->SetWindowText(buffer); rlm@1: } rlm@1: } rlm@1: rlm@1: buffer.Format("%04X", data); rlm@1: m_value.SetWindowText(buffer); rlm@1: } rlm@1: rlm@1: void IOViewer::OnApply() rlm@1: { rlm@1: const IOData *sel = &ioViewRegisters[selected]; rlm@1: u16 res = 0; rlm@1: for (int i = 0; i < 16; i++) rlm@1: { rlm@1: CButton *pWnd = (CButton *)GetDlgItem(IDC_BIT_0 + i); rlm@1: rlm@1: if (pWnd) rlm@1: { rlm@1: if (pWnd->GetCheck()) rlm@1: res |= (1 << i); rlm@1: } rlm@1: } rlm@1: CPUWriteHalfWord(0x4000000+sel->offset, res); rlm@1: update(); rlm@1: } rlm@1: