203 lines
5.2 KiB
C++
203 lines
5.2 KiB
C++
// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
|
|
// Copyright (C) 1999-2003 Forgotten
|
|
// Copyright (C) 2004 Forgotten and the VBA development team
|
|
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2, or(at your option)
|
|
// any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
// IOViewer.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "vba.h"
|
|
#include "IOViewer.h"
|
|
|
|
#include "../System.h"
|
|
#include "../GBA.h"
|
|
#include "../Globals.h"
|
|
#include "../Sound.h"
|
|
|
|
#include "IOViewerRegs.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// IOViewer dialog
|
|
|
|
|
|
IOViewer::IOViewer(CWnd* pParent /*=NULL*/)
|
|
: ResizeDlg(IOViewer::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(IOViewer)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
selected = 0;
|
|
autoUpdate = false;
|
|
}
|
|
|
|
|
|
void IOViewer::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(IOViewer)
|
|
DDX_Control(pDX, IDC_VALUE, m_value);
|
|
DDX_Control(pDX, IDC_ADDRESSES, m_address);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(IOViewer, CDialog)
|
|
//{{AFX_MSG_MAP(IOViewer)
|
|
ON_BN_CLICKED(IDC_CLOSE, OnClose)
|
|
ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
|
|
ON_BN_CLICKED(IDC_AUTO_UPDATE, OnAutoUpdate)
|
|
ON_CBN_SELCHANGE(IDC_ADDRESSES, OnSelchangeAddresses)
|
|
ON_BN_CLICKED(IDC_APPLY, OnApply)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// IOViewer message handlers
|
|
|
|
void IOViewer::OnClose()
|
|
{
|
|
theApp.winRemoveUpdateListener(this);
|
|
|
|
DestroyWindow();
|
|
}
|
|
|
|
void IOViewer::OnRefresh()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
}
|
|
|
|
void IOViewer::OnAutoUpdate()
|
|
{
|
|
autoUpdate = !autoUpdate;
|
|
if(autoUpdate) {
|
|
theApp.winAddUpdateListener(this);
|
|
} else {
|
|
theApp.winRemoveUpdateListener(this);
|
|
}
|
|
}
|
|
|
|
void IOViewer::OnSelchangeAddresses()
|
|
{
|
|
selected = m_address.GetCurSel();
|
|
|
|
update();
|
|
}
|
|
|
|
void IOViewer::PostNcDestroy()
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
BOOL IOViewer::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// winCenterWindow(getHandle());
|
|
DIALOG_SIZER_START( sz )
|
|
DIALOG_SIZER_END()
|
|
SetData(sz,
|
|
TRUE,
|
|
HKEY_CURRENT_USER,
|
|
"Software\\Emulators\\VisualBoyAdvance\\Viewer\\IOView",
|
|
NULL);
|
|
|
|
CFont *font = CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT));
|
|
int i;
|
|
for(i = 0; i < sizeof(ioViewRegisters)/sizeof(IOData); i++) {
|
|
m_address.AddString(ioViewRegisters[i].name);
|
|
}
|
|
m_address.SetFont(font);
|
|
for(i = 0; i < 16; i++) {
|
|
GetDlgItem(IDC_BIT_0+i)->SetFont(font);
|
|
}
|
|
|
|
RECT cbSize;
|
|
int Height;
|
|
|
|
m_address.GetClientRect(&cbSize);
|
|
Height = m_address.GetItemHeight(0);
|
|
Height += m_address.GetItemHeight(0) * (10);
|
|
|
|
// Note: The use of SM_CYEDGE assumes that we're using Windows '95
|
|
// Now add on the height of the border of the edit box
|
|
Height += GetSystemMetrics(SM_CYEDGE) * 2; // top & bottom edges
|
|
|
|
// The height of the border of the drop-down box
|
|
Height += GetSystemMetrics(SM_CYEDGE) * 2; // top & bottom edges
|
|
|
|
// now set the size of the window
|
|
m_address.SetWindowPos(NULL,
|
|
0, 0,
|
|
cbSize.right, Height,
|
|
SWP_NOMOVE | SWP_NOZORDER);
|
|
|
|
m_address.SetCurSel(0);
|
|
update();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void IOViewer::update()
|
|
{
|
|
CString buffer;
|
|
|
|
const IOData *sel = &ioViewRegisters[selected];
|
|
u16 data = sel->address ? *sel->address :
|
|
(ioMem ? soundRead16(sel->offset) : 0);
|
|
|
|
for(int i = 0; i < 16; i++) {
|
|
CButton *pWnd = (CButton *)GetDlgItem(IDC_BIT_0 + i);
|
|
|
|
if(pWnd) {
|
|
if(!(sel->write & (1 << i)))
|
|
pWnd->EnableWindow(FALSE);
|
|
else
|
|
pWnd->EnableWindow(TRUE);
|
|
pWnd->SetCheck(((data & (1 << i)) >> i));
|
|
buffer.Format("%2d %s", i, sel->bits[i]);
|
|
pWnd->SetWindowText(buffer);
|
|
}
|
|
}
|
|
|
|
buffer.Format("%04X", data);
|
|
m_value.SetWindowText(buffer);
|
|
}
|
|
|
|
void IOViewer::OnApply()
|
|
{
|
|
const IOData *sel = &ioViewRegisters[selected];
|
|
u16 res = 0;
|
|
for(int i = 0; i < 16; i++) {
|
|
CButton *pWnd = (CButton *)GetDlgItem(IDC_BIT_0 + i);
|
|
|
|
if(pWnd) {
|
|
if(pWnd->GetCheck())
|
|
res |= (1 << i);
|
|
}
|
|
}
|
|
CPUWriteHalfWord(0x4000000+sel->offset, res);
|
|
update();
|
|
}
|