diff options
Diffstat (limited to 'gnu/usr.bin/binutils/gdb/mswin/regview.cpp')
-rw-r--r-- | gnu/usr.bin/binutils/gdb/mswin/regview.cpp | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/gnu/usr.bin/binutils/gdb/mswin/regview.cpp b/gnu/usr.bin/binutils/gdb/mswin/regview.cpp new file mode 100644 index 00000000000..11f8dbafa39 --- /dev/null +++ b/gnu/usr.bin/binutils/gdb/mswin/regview.cpp @@ -0,0 +1,347 @@ +// regview.cpp : implementation file +// + +#include "stdafx.h" +#include "regview.h" +#include "regdoc.h" +#ifdef _DEBUG +#undef THIS_FILE +static char BASED_CODE THIS_FILE[] = __FILE__; +#endif + + +///////////////////////////////////////////////////////////////////////////// +// CRegView + +IMPLEMENT_DYNCREATE(CRegView, CScrollView) +extern CGuiApp theApp; +void redraw_allregwins() +{ +redraw_allwins(theApp.m_regTemplate); +} + + CFontInfo reg_fontinfo ("RegFont", redraw_allregwins); + +CRegView::CRegView() +{ + m_base = 16; + reg_fontinfo.MakeFont(); + + +} + +CRegView::~CRegView() +{ +} + + +BEGIN_MESSAGE_MAP(CRegView, CScrollView) + //{{AFX_MSG_MAP(CRegView) + ON_WM_CHAR() + ON_COMMAND(ID_REAL_CMD_BUTTON_REG_BINARY, OnRegBinary) + ON_COMMAND(ID_REAL_CMD_BUTTON_REG_DECIMAL, OnRegDecimal) + ON_COMMAND(ID_REAL_CMD_BUTTON_REG_EVERYTHING, OnRegEverything) + ON_COMMAND(ID_REAL_CMD_BUTTON_REG_HEX, OnRegHex) + ON_COMMAND(ID_REAL_CMD_BUTTON_REG_OCTAL, OnRegOctal) + ON_WM_SIZE() + ON_COMMAND(ID_REAL_CMD_BUTTON_SET_FONT, OnSetFont) + ON_WM_DESTROY() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +///////////////////////////////////////////////////////////////////////////// +// CRegView drawing + +#define REG_SIZE (BFD_ARCH_SIZE/8) +#define VAL_SIZE (BFD_ARCH_SIZE/8) +#define NUM_COLS 4 +static const int gap = 20; +#define WIDTHINPIX ((m_regsize.cx + gap + m_valuesize.cx * NUM_COLS)) +#define DEPTHINPIX ((togdb_maxregs() / NUM_COLS + 2) * reg_fontinfo.dunits.cy) + +int CRegView::format(char *buf, CORE_ADDR value, int which) +{ + int i; + switch (which == 0 ? m_base:which) + { + case 2: + for (i = 0; i < BFD_ARCH_SIZE; i++) + { + buf[i] = (value >> ((BFD_ARCH_SIZE-1) - i ))&1 ? '1':'0'; + } + break; + case 8: + i = sprintf(buf,"%11o", value); + break; + case 10: + i = sprintf(buf,"%10d", value); + break; + case 16: + i = sprintf(buf,"%08X", value); + break; + + default: + i = format(buf, value,2); + i += format(buf+i, value,8); + i += format(buf+i, value,10); + i += format(buf+i, value,16); + break; + } + + buf[i++] = ' '; + buf[i] = 0; + return i; +} + + +void CRegView::BestShape() +{ + +#if 0 + char buf[100]; + CClientDC d(NULL); + RECT wnd; + GetClientRect(&wnd); + d.SelectObject(®_fontinfo.m_font); + + + /* Try our prefered shapes */ + + int i; + for (i = 0; px[i]; i++) + { + m_ronline = px[i]; + m_numlines = py[i]; + + mx = m_regsize.cx + (m_valuesize.cx + gap) * m_ronline ; + my = m_regsize.cy * m_numlines; + + if (mx < wnd.right && my < wnd.bottom) + { + /* Use this and resize the area */ + rethink(); +#if 1 + CFrameWnd* pFrame = GetParentFrame(); + pFrame->SetWindowPos(NULL, 0, 0, mx + 40, my+40 ,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); +#endif + return ; + } + } + /* mx and my are now the size needed to show all the regs, so set the + scroll up */ + GetParentFrame()->SetWindowPos(NULL, 0, 0, mx + 40, my+40 ,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); + // GetParentFrame()->MoveWindow(0,0,mx,my); + rethink(); +#endif + +} + + +void CRegView::PrintReg(CRegDoc *pDoc, class CDC *pDC, int rn, int base, int cx, int cy) +{ + char buf[50*BFD_ARCH_SIZE]; + if(pDoc->m_regsinit[rn]) { + format (buf, pDoc->m_regs[rn], base); + + if (pDoc->m_regchanged[rn]) + { + pDC->SetTextColor(0x000000ff); + pDC->TextOut(cx,cy, buf); + pDC->SetTextColor(0x00000000); + } + else { + pDC->TextOut(cx,cy, buf); + } + } + else + pDC->TextOut(cx,cy,"."); + +} + +extern "C" { + extern char *reg_names[]; + extern int reg_order[]; +} ; + +void CRegView::OnDraw(CDC* pDC) +{ + char buf[200]; + CRegDoc * pDoc = (CRegDoc *)GetDocument(); + int i; + + int rn = 0; + int ron = 0; + int cx; + int cy; + int ri = 0; + cx = 0; + cy = 0; + pDoc->prepare(); + pDC->SelectObject(®_fontinfo.m_font); + + m_ronline = 4; /* FIXME! what's this?? */ + while (reg_order[ri] >= 0) { + rn = reg_order[ri]; + pDC->TextOut(cx, cy, reg_names[rn]); + cx += m_regsize.cx + gap; + for(i = 0; i < m_ronline && reg_order[ri] >= 0; i++) + { + PrintReg(pDoc,pDC, reg_order[ri], 0, cx, cy); + cx += m_valuesize.cx + gap; + ri++; + } + cy += m_valuesize.cy; + cx = 0; + } + /* New line for ccr and pc */ + + pDC->TextOut(cx, cy,"PC "); + + PrintReg(pDoc,pDC, togdb_pcreg(),16, m_regsize.cx + gap, cy); + + /* And the current insn */ + if (pDoc->m_regsinit[togdb_pcreg()]) + { + togdb_disassemble (pDoc->m_regs[togdb_pcreg()], buf); + cx = (m_regsize.cx + gap)*3; + pDC->TabbedTextOut(cx, cy, buf, strlen(buf), 0, 0, cx); + } + + cy += m_valuesize.cy; + + pDC->TextOut(0, cy,reg_names[togdb_ccrreg()]); + PrintReg(pDoc, pDC, togdb_ccrreg(),16, m_regsize.cx + gap, cy); + +} + + +///////////////////////////////////////////////////////////////////////////// +// CRegView message handlers +static int v; +void CRegView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) +{ + // TODO: Add your message handler code here and/or call default + + if (nChar == 'a') + { + CRegDoc * pDoc = (CRegDoc *)GetDocument(); + pDoc->ChangeReg(0,999 *v++); + pDoc->UpdateAllViews(0); + } + +} + +void CRegView::OnRegBinary() +{ + m_base = 2; + Invalidate(); +} + +void CRegView::OnRegDecimal() +{ + m_base = 10; + Invalidate(); +} + +void CRegView::OnRegEverything() +{ + m_base = -1; + Invalidate(); +} + +void CRegView::OnRegHex() +{ + m_base = 16; + Invalidate(); +} + +void CRegView::OnRegOctal() +{ + m_base = 8; + Invalidate(); +} + + + +void CRegView::Initialize() +{ + reg_fontinfo.Initialize(); +} + +void CRegView::Terminate() +{ + reg_fontinfo.Terminate(); +} + + + +void CRegView::rethink() +{ + char buf[50*BFD_ARCH_SIZE]; + CORE_ADDR value0 = 0; + int which0 = 0; + int len = format(buf, value0, which0); + m_valuesize.cx = (len+2) * reg_fontinfo.dunits.cx ; + m_valuesize.cy = reg_fontinfo.dunits.cy ; + + m_regsize.cx = reg_fontinfo.dunits.cx * REG_SIZE; + m_regsize.cy = reg_fontinfo.dunits.cy; + + + CSize sizeTotal; + CSize sizePage; + CSize sizeLine; + sizeTotal.cx = WIDTHINPIX; + sizeTotal.cy = DEPTHINPIX; + + sizePage.cx = sizeTotal.cx/5; + sizePage.cy = sizeTotal.cy/5; + + sizeLine.cx = sizeTotal.cx/10; + sizeLine.cy = sizeTotal.cy/10; + + SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine); + +} + +void CRegView::OnSize(UINT nType, int cx, int cy) +{ + CScrollView::OnSize(nType, cx, cy); + SetWindowText("Registers"); + rethink(); + +} + + + +void CRegView::OnSetFont() +{ + reg_fontinfo.OnChooseFont(); + Invalidate(); +} + +BOOL CRegView::PreCreateWindow(CREATESTRUCT& cs) +{ + // TODO: Add your specialized code here and/or call the base class + return CScrollView::PreCreateWindow(cs); +} + +void CRegView::OnInitialUpdate() +{ + // TODO: Add your specialized code here and/or call the base class + CScrollView::OnInitialUpdate(); + rethink(); + GetParentFrame()->SetWindowPos(NULL, 0, 0, + WIDTHINPIX, DEPTHINPIX, + SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); + + load_where(GetParentFrame(),"REG"); +} + +void CRegView::OnDestroy() +{ + CScrollView::OnDestroy(); + save_where(GetParentFrame(),"REG"); + +} |