rlm@1: // GBDisassemble.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "resource.h" rlm@1: #include "GBDisassemble.h" rlm@1: #include "VBA.h" rlm@1: rlm@1: #include "../gb/GB.h" rlm@1: #include "../gb/gbGlobals.h" rlm@1: rlm@1: extern gbRegister AF; rlm@1: extern gbRegister BC; rlm@1: extern gbRegister DE; rlm@1: extern gbRegister HL; rlm@1: extern gbRegister SP; rlm@1: extern gbRegister PC; rlm@1: extern u16 IFF; rlm@1: extern int gbDis(char *, u16); rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // GBDisassemble dialog rlm@1: rlm@1: GBDisassemble::GBDisassemble(CWnd*pParent /*=NULL*/) rlm@1: : ResizeDlg(GBDisassemble::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(GBDisassemble) rlm@1: m_c = FALSE; rlm@1: m_h = FALSE; rlm@1: m_n = FALSE; rlm@1: m_z = FALSE; rlm@1: //}}AFX_DATA_INIT rlm@1: address = 0; rlm@1: autoUpdate = false; rlm@1: count = 1; rlm@1: lastAddress = 0; rlm@1: } rlm@1: rlm@1: void GBDisassemble::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(GBDisassemble) rlm@1: DDX_Control(pDX, IDC_ADDRESS, m_address); rlm@1: DDX_Control(pDX, IDC_DISASSEMBLE, m_list); rlm@1: DDX_Check(pDX, IDC_C, m_c); rlm@1: DDX_Check(pDX, IDC_H, m_h); rlm@1: DDX_Check(pDX, IDC_N, m_n); rlm@1: DDX_Check(pDX, IDC_Z, m_z); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(GBDisassemble, CDialog) rlm@1: //{{AFX_MSG_MAP(GBDisassemble) rlm@1: ON_BN_CLICKED(IDC_CLOSE, OnClose) rlm@1: ON_BN_CLICKED(IDC_REFRESH, OnRefresh) rlm@1: ON_BN_CLICKED(IDC_NEXT, OnNext) rlm@1: ON_BN_CLICKED(IDC_GO, OnGo) rlm@1: ON_BN_CLICKED(IDC_GOPC, OnGopc) rlm@1: ON_BN_CLICKED(IDC_AUTO_UPDATE, OnAutoUpdate) rlm@1: ON_WM_VSCROLL() rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // GBDisassemble message handlers rlm@1: rlm@1: void GBDisassemble::OnClose() rlm@1: { rlm@1: theApp.winRemoveUpdateListener(this); rlm@1: rlm@1: DestroyWindow(); rlm@1: } rlm@1: rlm@1: void GBDisassemble::OnRefresh() rlm@1: { rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBDisassemble::OnNext() rlm@1: { rlm@1: gbEmulate(1); rlm@1: if (PC.W < address || PC.W >= lastAddress) rlm@1: OnGopc(); rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBDisassemble::OnGo() rlm@1: { rlm@1: CString buffer; rlm@1: m_address.GetWindowText(buffer); rlm@1: sscanf(buffer, "%x", &address); rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBDisassemble::OnGopc() rlm@1: { rlm@1: address = PC.W; rlm@1: rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBDisassemble::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: BOOL GBDisassemble::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: DIALOG_SIZER_START(sz) rlm@1: DIALOG_SIZER_ENTRY(IDC_DISASSEMBLE, DS_SizeY) rlm@1: DIALOG_SIZER_ENTRY(IDC_REFRESH, DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_CLOSE, DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_NEXT, DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_AUTO_UPDATE, DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_GOPC, DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_VSCROLL, DS_SizeY) rlm@1: DIALOG_SIZER_END() rlm@1: SetData(sz, rlm@1: TRUE, rlm@1: HKEY_CURRENT_USER, rlm@1: "Software\\Emulators\\VisualBoyAdvance\\Viewer\\GBDisassembleView", rlm@1: NULL); rlm@1: rlm@1: SCROLLINFO si; rlm@1: ZeroMemory(&si, sizeof(si)); rlm@1: si.cbSize = sizeof(si); rlm@1: si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; rlm@1: si.nMin = 0; rlm@1: si.nMax = 100; rlm@1: si.nPos = 50; rlm@1: si.nPage = 0; rlm@1: GetDlgItem(IDC_VSCROLL)->SetScrollInfo(SB_CTL, &si, TRUE); rlm@1: CFont *font = CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT)); rlm@1: m_list.SetFont(font); rlm@1: rlm@1: for (int i = 0; i < 7; i++) rlm@1: GetDlgItem(IDC_R0+i)->SetFont(font); rlm@1: rlm@1: m_address.LimitText(4); rlm@1: refresh(); 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 GBDisassemble::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar*pScrollBar) rlm@1: { rlm@1: char buffer[80]; rlm@1: rlm@1: switch (nSBCode) rlm@1: { rlm@1: case SB_LINEDOWN: rlm@1: address += gbDis(buffer, address); rlm@1: break; rlm@1: case SB_LINEUP: rlm@1: address--; rlm@1: break; rlm@1: case SB_PAGEDOWN: rlm@1: address = lastAddress; rlm@1: break; rlm@1: case SB_PAGEUP: rlm@1: address -= count; rlm@1: break; rlm@1: } rlm@1: refresh(); rlm@1: rlm@1: CDialog::OnVScroll(nSBCode, nPos, pScrollBar); rlm@1: } rlm@1: rlm@1: void GBDisassemble::refresh() rlm@1: { rlm@1: if (gbRom == NULL) rlm@1: return; rlm@1: rlm@1: int h = m_list.GetItemHeight(0); rlm@1: RECT r; rlm@1: m_list.GetClientRect(&r); rlm@1: count = (r.bottom - r.top+1)/h; rlm@1: rlm@1: m_list.ResetContent(); rlm@1: if (!systemIsEmulating() || systemCartridgeType != 1) rlm@1: return; rlm@1: rlm@1: char buffer[80]; rlm@1: u16 addr = address; rlm@1: int i; rlm@1: int sel = -1; rlm@1: for (i = 0; i < count; i++) rlm@1: { rlm@1: if (addr == PC.W) rlm@1: sel = i; rlm@1: addr += gbDis(buffer, addr); rlm@1: m_list.InsertString(-1, buffer); rlm@1: } rlm@1: lastAddress = addr-1; rlm@1: if (sel != -1) rlm@1: m_list.SetCurSel(sel); rlm@1: rlm@1: sprintf(buffer, "%04x", AF.W); rlm@1: GetDlgItem(IDC_R0)->SetWindowText(buffer); rlm@1: sprintf(buffer, "%04x", BC.W); rlm@1: GetDlgItem(IDC_R1)->SetWindowText(buffer); rlm@1: sprintf(buffer, "%04x", DE.W); rlm@1: GetDlgItem(IDC_R2)->SetWindowText(buffer); rlm@1: sprintf(buffer, "%04x", HL.W); rlm@1: GetDlgItem(IDC_R3)->SetWindowText(buffer); rlm@1: sprintf(buffer, "%04x", SP.W); rlm@1: GetDlgItem(IDC_R4)->SetWindowText(buffer); rlm@1: sprintf(buffer, "%04x", PC.W); rlm@1: GetDlgItem(IDC_R5)->SetWindowText(buffer); rlm@1: sprintf(buffer, "%04x", IFF); rlm@1: GetDlgItem(IDC_R6)->SetWindowText(buffer); rlm@1: rlm@1: m_z = (AF.B.B0 & 0x80) != 0; rlm@1: m_n = (AF.B.B0 & 0x40) != 0; rlm@1: m_h = (AF.B.B0 & 0x20) != 0; rlm@1: m_c = (AF.B.B0 & 0x10) != 0; rlm@1: UpdateData(FALSE); rlm@1: } rlm@1: rlm@1: void GBDisassemble::update() rlm@1: { rlm@1: OnGopc(); rlm@1: refresh(); rlm@1: } rlm@1: rlm@1: void GBDisassemble::PostNcDestroy() rlm@1: { rlm@1: delete this; rlm@1: } rlm@1: