* PPU Viewer: added "Mask unused graphics" and "Invert the mask" checkboxes

* PPU Viewer: fixed window layout when using big fonts
This commit is contained in:
ansstuff 2013-09-16 16:04:11 +00:00
parent 1399397477
commit 1ab0323d64
8 changed files with 413 additions and 288 deletions

View File

@ -92,7 +92,9 @@ extern unsigned int MemView_HighlightActivity_FadingPeriod;
extern bool MemView_HighlightActivity_FadeWhenPaused; extern bool MemView_HighlightActivity_FadeWhenPaused;
extern int MemFind_wndx, MemFind_wndy; extern int MemFind_wndx, MemFind_wndy;
extern int NTViewPosX,NTViewPosY; extern int NTViewPosX,NTViewPosY;
extern int PPUViewPosX,PPUViewPosY; extern int PPUViewPosX, PPUViewPosY;
extern bool PPUView_maskUnusedGraphics;
extern bool PPUView_invertTheMask;
extern int MainWindow_wndx, MainWindow_wndy; extern int MainWindow_wndx, MainWindow_wndy;
extern int MemWatch_wndx, MemWatch_wndy; extern int MemWatch_wndx, MemWatch_wndy;
extern int Monitor_wndx, Monitor_wndy; extern int Monitor_wndx, Monitor_wndy;
@ -301,6 +303,8 @@ static CFGSTRUCT fceuconfig[] =
AC(NTViewPosY), AC(NTViewPosY),
AC(PPUViewPosX), AC(PPUViewPosX),
AC(PPUViewPosY), AC(PPUViewPosY),
AC(PPUView_maskUnusedGraphics),
AC(PPUView_invertTheMask),
AC(MainWindow_wndx), AC(MainWindow_wndx),
AC(MainWindow_wndy), AC(MainWindow_wndy),
AC(MemWatch_wndx), AC(MemWatch_wndx),

View File

@ -2090,7 +2090,8 @@ BOOL CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
case IDC_DEBUGGER_BOOKMARK_NAME: NameDebuggerBookmark(hwndDlg); break; case IDC_DEBUGGER_BOOKMARK_NAME: NameDebuggerBookmark(hwndDlg); break;
case IDC_DEBUGGER_ENABLE_SYMBOLIC: case IDC_DEBUGGER_ENABLE_SYMBOLIC:
{ {
symbDebugEnabled = IsDlgButtonChecked(hwndDlg, IDC_DEBUGGER_ENABLE_SYMBOLIC); symbDebugEnabled ^= 1;
CheckDlgButton(hwndDlg, IDC_DEBUGGER_ENABLE_SYMBOLIC, symbDebugEnabled ? BST_CHECKED : BST_UNCHECKED);
UpdateDebugger(false); UpdateDebugger(false);
break; break;
} }

View File

@ -19,6 +19,7 @@
*/ */
#include "common.h" #include "common.h"
#include "ppuview.h"
#include "../../palette.h" #include "../../palette.h"
#include "../../fceu.h" #include "../../fceu.h"
#include "../../cart.h" #include "../../cart.h"
@ -28,34 +29,42 @@ HWND hPPUView;
extern uint8 *VPage[8]; extern uint8 *VPage[8];
extern uint8 PALRAM[0x20]; extern uint8 PALRAM[0x20];
int PPUViewPosX,PPUViewPosY; int PPUViewPosX, PPUViewPosY;
bool PPUView_maskUnusedGraphics = true;
bool PPUView_invertTheMask = false;
uint8 palcache[32] = { 0xFF }; //palette cache uint8 palcache[32] = { 0xFF }; //palette cache
uint8 chrcache0[0x1000],chrcache1[0x1000],logcache0[0x1000],logcache1[0x1000]; //cache CHR, fixes a refresh problem when right-clicking uint8 chrcache0[0x1000], chrcache1[0x1000], logcache0[0x1000], logcache1[0x1000]; //cache CHR, fixes a refresh problem when right-clicking
uint8 *pattern0,*pattern1; //pattern table bitmap arrays uint8 *pattern0, *pattern1; //pattern table bitmap arrays
uint8 *ppuv_palette; uint8 *ppuv_palette;
static int pindex0=0,pindex1=0; static int pindex0 = 0, pindex1 = 0;
int PPUViewScanline=0,PPUViewer=0; int PPUViewScanline = 0, PPUViewer = 0;
int PPUViewSkip; int PPUViewSkip;
int PPUViewRefresh = 15; int PPUViewRefresh = 15;
int mouse_x,mouse_y; int mouse_x, mouse_y;
#define PATTERNWIDTH 128 #define PATTERNWIDTH 128
#define PATTERNHEIGHT 128 #define PATTERNHEIGHT 128
#define PATTERNBITWIDTH PATTERNWIDTH*3 #define PATTERNBITWIDTH PATTERNWIDTH*3
#define PATTERNDESTX 10 #define PATTERNDESTX_BASE 7
#define PATTERNDESTY 15 #define PATTERNDESTY_BASE 16
#define ZOOM 2 #define ZOOM 2
#define PALETTEWIDTH 32*4*4 #define PALETTEWIDTH 32*4*4
#define PALETTEHEIGHT 32*2 #define PALETTEHEIGHT 32*2
#define PALETTEBITWIDTH PALETTEWIDTH*3 #define PALETTEBITWIDTH PALETTEWIDTH*3
#define PALETTEDESTX 10 #define PALETTEDESTX_BASE 7
#define PALETTEDESTY 327 #define PALETTEDESTY_BASE 16
#define TBM_SETPOS (WM_USER+5) #define TBM_SETPOS (WM_USER+5)
#define TBM_SETRANGE (WM_USER+6) #define TBM_SETRANGE (WM_USER+6)
#define TBM_GETPOS (WM_USER) #define TBM_GETPOS (WM_USER)
int patternDestX = PATTERNDESTX_BASE;
int patternDestY = PATTERNDESTY_BASE;
int paletteDestX = PALETTEDESTX_BASE;
int paletteDestY = PALETTEDESTY_BASE;
BITMAPINFO bmInfo; BITMAPINFO bmInfo;
HDC pDC,TmpDC0,TmpDC1; HDC pDC,TmpDC0,TmpDC1;
HBITMAP TmpBmp0,TmpBmp1; HBITMAP TmpBmp0,TmpBmp1;
@ -67,25 +76,28 @@ HBITMAP TmpBmp2,TmpBmp3;
HGDIOBJ TmpObj2,TmpObj3; HGDIOBJ TmpObj2,TmpObj3;
void PPUViewDoBlit() { void PPUViewDoBlit()
if(!hPPUView) return; {
if(PPUViewSkip < PPUViewRefresh) { if (!hPPUView)
return;
if (PPUViewSkip < PPUViewRefresh)
{
PPUViewSkip++; PPUViewSkip++;
return; return;
} }
PPUViewSkip=0; PPUViewSkip = 0;
StretchBlt(pDC,PATTERNDESTX,PATTERNDESTY,PATTERNWIDTH*ZOOM,PATTERNHEIGHT*ZOOM,TmpDC0,0,PATTERNHEIGHT-1,PATTERNWIDTH,-PATTERNHEIGHT,SRCCOPY); StretchBlt(pDC, patternDestX, patternDestY, PATTERNWIDTH * ZOOM, PATTERNHEIGHT * ZOOM, TmpDC0, 0, PATTERNHEIGHT - 1, PATTERNWIDTH, -PATTERNHEIGHT, SRCCOPY);
StretchBlt(pDC,PATTERNDESTX+(PATTERNWIDTH*ZOOM)+1,PATTERNDESTY,PATTERNWIDTH*ZOOM,PATTERNHEIGHT*ZOOM,TmpDC1,0,PATTERNHEIGHT-1,PATTERNWIDTH,-PATTERNHEIGHT,SRCCOPY); StretchBlt(pDC, patternDestX + (PATTERNWIDTH * ZOOM) + 1, patternDestY, PATTERNWIDTH * ZOOM, PATTERNHEIGHT * ZOOM, TmpDC1, 0, PATTERNHEIGHT - 1, PATTERNWIDTH, -PATTERNHEIGHT, SRCCOPY);
StretchBlt(pDC,PALETTEDESTX,PALETTEDESTY,PALETTEWIDTH,PALETTEHEIGHT,TmpDC2,0,PALETTEHEIGHT-1,PALETTEWIDTH,-PALETTEHEIGHT,SRCCOPY); StretchBlt(pDC, paletteDestX, paletteDestY, PALETTEWIDTH, PALETTEHEIGHT, TmpDC2, 0, PALETTEHEIGHT - 1, PALETTEWIDTH, -PALETTEHEIGHT, SRCCOPY);
} }
//---------CDLogger VROM //---------CDLogger VROM
extern unsigned char *cdloggervdata; extern unsigned char *cdloggervdata;
extern unsigned int cdloggerVideoDataSize; extern unsigned int cdloggerVideoDataSize;
extern int debug_loggingCD;
void DrawPatternTable(uint8 *bitmap, uint8 *table, uint8 *log, uint8 pal) { void DrawPatternTable(uint8 *bitmap, uint8 *table, uint8 *log, uint8 pal)
{
int i,j,x,y,index=0; int i,j,x,y,index=0;
int p=0,tmp; int p=0,tmp;
uint8 chr0,chr1,logs; uint8 chr0,chr1,logs;
@ -97,25 +109,28 @@ void DrawPatternTable(uint8 *bitmap, uint8 *table, uint8 *log, uint8 pal) {
for (j = 0; j < 16; j++) //Rows for (j = 0; j < 16; j++) //Rows
{ {
//----------------------------------------------- //-----------------------------------------------
///8x8 sprite // 8x8 sprite
for (y = 0; y < 8; y++) for (y = 0; y < 8; y++)
{ {
chr0 = table[index]; chr0 = table[index];
chr1 = table[index + 8]; chr1 = table[index + 8];
logs = log[index] & log[index + 8]; logs = log[index] & log[index + 8];
tmp = 7; tmp = 7;
if(debug_loggingCD && cdloggerVideoDataSize && ((logs & 3) == 0)) { if (PPUView_maskUnusedGraphics && cdloggerVideoDataSize && ((bool)(logs & 3) == PPUView_invertTheMask))
{
// draw pixel ~8x darker
for (x = 0; x < 8; x++) for (x = 0; x < 8; x++)
{ {
p = (chr0 >> tmp) & 1; p = (chr0 >> tmp) & 1;
p |= ((chr1 >> tmp) & 1) << 1; p |= ((chr1 >> tmp) & 1) << 1;
p = palcache[p | pal]; p = palcache[p | pal];
tmp--; tmp--;
*(uint8*)(pbitmap++) = palo[p].b >> 2; *(uint8*)(pbitmap++) = palo[p].b >> 3;
*(uint8*)(pbitmap++) = palo[p].g >> 2; *(uint8*)(pbitmap++) = palo[p].g >> 3;
*(uint8*)(pbitmap++) = palo[p].r >> 2; *(uint8*)(pbitmap++) = palo[p].r >> 3;
} }
} else { } else
{
for (x = 0; x < 8; x++) for (x = 0; x < 8; x++)
{ {
p = (chr0 >> tmp) & 1; p = (chr0 >> tmp) & 1;
@ -136,10 +151,10 @@ void DrawPatternTable(uint8 *bitmap, uint8 *table, uint8 *log, uint8 pal) {
} }
pbitmap += ((PALETTEBITWIDTH>>2)*7); pbitmap += ((PALETTEBITWIDTH>>2)*7);
} }
} }
void FCEUD_UpdatePPUView(int scanline, int refreshchr) { void FCEUD_UpdatePPUView(int scanline, int refreshchr)
{
if(!PPUViewer) return; if(!PPUViewer) return;
if(scanline != -1 && scanline != PPUViewScanline) return; if(scanline != -1 && scanline != PPUViewScanline) return;
@ -149,11 +164,14 @@ void FCEUD_UpdatePPUView(int scanline, int refreshchr) {
if(!hPPUView) return; if(!hPPUView) return;
if(PPUViewSkip < PPUViewRefresh) return; if(PPUViewSkip < PPUViewRefresh) return;
if(refreshchr) { if(refreshchr)
for (i = 0, x=0x1000; i < 0x1000; i++, x++) { {
for (i = 0, x=0x1000; i < 0x1000; i++, x++)
{
chrcache0[i] = VPage[i>>10][i]; chrcache0[i] = VPage[i>>10][i];
chrcache1[i] = VPage[x>>10][x]; chrcache1[i] = VPage[x>>10][x];
if(debug_loggingCD && cdloggerVideoDataSize) { if (cdloggerVideoDataSize)
{
int addr; int addr;
addr = &VPage[i >> 10][i] - CHRptr[0]; addr = &VPage[i >> 10][i] - CHRptr[0];
if ((addr >= 0) && (addr < (int)cdloggerVideoDataSize)) if ((addr >= 0) && (addr < (int)cdloggerVideoDataSize))
@ -161,25 +179,33 @@ void FCEUD_UpdatePPUView(int scanline, int refreshchr) {
addr = &VPage[x >> 10][x] - CHRptr[0]; addr = &VPage[x >> 10][x] - CHRptr[0];
if ((addr >= 0) && (addr < (int)cdloggerVideoDataSize)) if ((addr >= 0) && (addr < (int)cdloggerVideoDataSize))
logcache1[i] = cdloggervdata[addr]; logcache1[i] = cdloggervdata[addr];
} else { } else
{
logcache0[i] = 0; logcache0[i] = 0;
logcache1[i] = 0; logcache1[i] = 0;
} }
} }
} }
//update palette only if required // update palette only if required
if(memcmp(palcache,PALRAM,32) != 0) { //bbit note: let para know that this if is useless and if (memcmp(palcache, PALRAM, 32) != 0)
//cache palette content will not work because of the lines below that change {
memcpy(palcache,PALRAM,32); //palcache which will make it not equal next time // bbit note: let para know that this if is useless and
// will not work because of the lines below that change
// palcache which will make it not equal next time
// cache palette content
memcpy(palcache,PALRAM,32);
palcache[0x10] = palcache[0x00]; palcache[0x10] = palcache[0x00];
palcache[0x14] = palcache[0x00]; palcache[0x14] = palcache[0x00];
palcache[0x18] = palcache[0x00]; palcache[0x18] = palcache[0x00];
palcache[0x1C] = palcache[0x00]; palcache[0x1C] = palcache[0x00];
//draw palettes //draw palettes
for (y = 0; y < PALETTEHEIGHT; y++) { for (y = 0; y < PALETTEHEIGHT; y++)
for (x = 0; x < PALETTEWIDTH; x++) { {
for (x = 0; x < PALETTEWIDTH; x++)
{
i = (((y>>5)<<4)+(x>>5)); i = (((y>>5)<<4)+(x>>5));
*(uint8*)(pbitmap++) = palo[palcache[i]].b; *(uint8*)(pbitmap++) = palo[palcache[i]].b;
*(uint8*)(pbitmap++) = palo[palcache[i]].g; *(uint8*)(pbitmap++) = palo[palcache[i]].g;
@ -189,15 +215,18 @@ void FCEUD_UpdatePPUView(int scanline, int refreshchr) {
//draw line seperators on palette //draw line seperators on palette
pbitmap = (ppuv_palette+PALETTEBITWIDTH*31); pbitmap = (ppuv_palette+PALETTEBITWIDTH*31);
for (x = 0; x < PALETTEWIDTH*2; x++) { for (x = 0; x < PALETTEWIDTH*2; x++)
{
*(uint8*)(pbitmap++) = 0; *(uint8*)(pbitmap++) = 0;
*(uint8*)(pbitmap++) = 0; *(uint8*)(pbitmap++) = 0;
*(uint8*)(pbitmap++) = 0; *(uint8*)(pbitmap++) = 0;
} }
pbitmap = (ppuv_palette-3); pbitmap = (ppuv_palette-3);
for (y = 0; y < 64*3; y++) { for (y = 0; y < 64*3; y++)
if(!(y%3)) pbitmap += (32*4*3); {
for (x = 0; x < 6; x++) { if (!(y%3)) pbitmap += (32*4*3);
for (x = 0; x < 6; x++)
{
*(uint8*)(pbitmap++) = 0; *(uint8*)(pbitmap++) = 0;
} }
pbitmap += ((32*4*3)-6); pbitmap += ((32*4*3)-6);
@ -211,7 +240,8 @@ void FCEUD_UpdatePPUView(int scanline, int refreshchr) {
//PPUViewDoBlit(); //PPUViewDoBlit();
} }
void KillPPUView() { void KillPPUView()
{
//GDI cleanup //GDI cleanup
DeleteObject(TmpBmp0); DeleteObject(TmpBmp0);
SelectObject(TmpDC0,TmpObj0); SelectObject(TmpDC0,TmpObj0);
@ -230,16 +260,35 @@ void KillPPUView() {
PPUViewSkip=0; PPUViewSkip=0;
} }
BOOL CALLBACK PPUViewCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL CALLBACK PPUViewCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RECT wrect; RECT wrect;
char str[20]; char str[20];
switch(uMsg) { switch(uMsg)
{
case WM_INITDIALOG: case WM_INITDIALOG:
{
if (PPUViewPosX==-32000) PPUViewPosX=0; //Just in case if (PPUViewPosX==-32000) PPUViewPosX=0; //Just in case
if (PPUViewPosY==-32000) PPUViewPosY=0; if (PPUViewPosY==-32000) PPUViewPosY=0;
SetWindowPos(hwndDlg,0,PPUViewPosX,PPUViewPosY,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER); SetWindowPos(hwndDlg,0,PPUViewPosX,PPUViewPosY,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER);
// calculate bitmaps positions relative to their groupboxes
RECT rect;
POINT pt;
GetWindowRect(GetDlgItem(hwndDlg, GRP_PPUVIEW_TABLES), &rect);
pt.x = rect.left;
pt.y = rect.top;
ScreenToClient(hwndDlg, &pt);
patternDestX = pt.x + PATTERNDESTX_BASE;
patternDestY = pt.y + PATTERNDESTY_BASE;
GetWindowRect(GetDlgItem(hwndDlg, LBL_PPUVIEW_PALETTES), &rect);
pt.x = rect.left;
pt.y = rect.top;
ScreenToClient(hwndDlg, &pt);
paletteDestX = pt.x + PALETTEDESTX_BASE;
paletteDestY = pt.y + PALETTEDESTY_BASE;
//prepare the bitmap attributes //prepare the bitmap attributes
//pattern tables //pattern tables
memset(&bmInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER)); memset(&bmInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
@ -275,6 +324,10 @@ BOOL CALLBACK PPUViewCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
SendDlgItemMessage(hwndDlg,CTL_PPUVIEW_TRACKBAR,TBM_SETRANGE,0,(LPARAM)MAKELONG(0,25)); SendDlgItemMessage(hwndDlg,CTL_PPUVIEW_TRACKBAR,TBM_SETRANGE,0,(LPARAM)MAKELONG(0,25));
SendDlgItemMessage(hwndDlg,CTL_PPUVIEW_TRACKBAR,TBM_SETPOS,1,PPUViewRefresh); SendDlgItemMessage(hwndDlg,CTL_PPUVIEW_TRACKBAR,TBM_SETPOS,1,PPUViewRefresh);
CheckDlgButton(hwndDlg, IDC_MASK_UNUSED_GRAPHICS, PPUView_maskUnusedGraphics ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hwndDlg, IDC_INVERT_THE_MASK, PPUView_invertTheMask ? BST_CHECKED : BST_UNCHECKED);
EnableWindow(GetDlgItem(hwndDlg, IDC_INVERT_THE_MASK), PPUView_maskUnusedGraphics ? true : false);
//Set Text Limit //Set Text Limit
SendDlgItemMessage(hwndDlg,IDC_PPUVIEW_SCANLINE,EM_SETLIMITTEXT,3,0); SendDlgItemMessage(hwndDlg,IDC_PPUVIEW_SCANLINE,EM_SETLIMITTEXT,3,0);
@ -290,6 +343,7 @@ BOOL CALLBACK PPUViewCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
PPUViewer=1; PPUViewer=1;
break; break;
}
case WM_PAINT: case WM_PAINT:
PPUViewDoBlit(); PPUViewDoBlit();
break; break;
@ -310,70 +364,123 @@ BOOL CALLBACK PPUViewCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
#endif #endif
} }
break; break;
case WM_RBUTTONDBLCLK: case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN: case WM_LBUTTONDOWN:
mouse_x = GET_X_LPARAM(lParam); {
mouse_y = GET_Y_LPARAM(lParam); // redraw now
if(((mouse_x >= PATTERNDESTX) && (mouse_x < (PATTERNDESTX+(PATTERNWIDTH*ZOOM)))) && (mouse_y >= PATTERNDESTY) && (mouse_y < (PATTERNDESTY+(PATTERNHEIGHT*ZOOM)))) { PPUViewSkip = PPUViewRefresh;
if(pindex0 == 7) pindex0 = 0;
else pindex0++;
}
else if(((mouse_x >= PATTERNDESTX+(PATTERNWIDTH*ZOOM)+1) && (mouse_x < (PATTERNDESTX+(PATTERNWIDTH*ZOOM)*2+1))) && (mouse_y >= PATTERNDESTY) && (mouse_y < (PATTERNDESTY+(PATTERNHEIGHT*ZOOM)))) {
if(pindex1 == 7) pindex1 = 0;
else pindex1++;
}
FCEUD_UpdatePPUView(-1, 0); FCEUD_UpdatePPUView(-1, 0);
PPUViewDoBlit(); PPUViewDoBlit();
break; break;
}
case WM_RBUTTONDBLCLK:
case WM_RBUTTONDOWN:
{
mouse_x = GET_X_LPARAM(lParam);
mouse_y = GET_Y_LPARAM(lParam);
if(((mouse_x >= patternDestX) && (mouse_x < (patternDestX + (PATTERNWIDTH * ZOOM)))) && (mouse_y >= patternDestY) && (mouse_y < (patternDestY + (PATTERNHEIGHT * ZOOM))))
{
if (pindex0 == 7)
pindex0 = 0;
else
pindex0++;
} else if(((mouse_x >= patternDestX + (PATTERNWIDTH * ZOOM) + 1) && (mouse_x < (patternDestX + (PATTERNWIDTH * ZOOM) * 2 + 1))) && (mouse_y >= patternDestY) && (mouse_y < (patternDestY + (PATTERNHEIGHT * ZOOM))))
{
if (pindex1 == 7)
pindex1 = 0;
else
pindex1++;
}
// redraw now
PPUViewSkip = PPUViewRefresh;
FCEUD_UpdatePPUView(-1, 0);
PPUViewDoBlit();
break;
}
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
mouse_x = GET_X_LPARAM(lParam); mouse_x = GET_X_LPARAM(lParam);
mouse_y = GET_Y_LPARAM(lParam); mouse_y = GET_Y_LPARAM(lParam);
if(((mouse_x >= PATTERNDESTX) && (mouse_x < (PATTERNDESTX+(PATTERNWIDTH*ZOOM)))) && (mouse_y >= PATTERNDESTY) && (mouse_y < (PATTERNDESTY+(PATTERNHEIGHT*ZOOM)))) { if (((mouse_x >= patternDestX) && (mouse_x < (patternDestX + (PATTERNWIDTH * ZOOM)))) && (mouse_y >= patternDestY) && (mouse_y < (patternDestY + (PATTERNHEIGHT * ZOOM))))
mouse_x = (mouse_x-PATTERNDESTX)/(8*ZOOM); {
mouse_y = (mouse_y-PATTERNDESTY)/(8*ZOOM); mouse_x = (mouse_x - patternDestX) / (8 * ZOOM);
mouse_y = (mouse_y - patternDestY) / (8 * ZOOM);
sprintf(str,"Tile: $%X%X",mouse_y,mouse_x); sprintf(str,"Tile: $%X%X",mouse_y,mouse_x);
SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE1,str); SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE1,str);
SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE2,"Tile:"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE2,"Tile:");
SetDlgItemText(hwndDlg,LBL_PPUVIEW_PALETTES,"Palettes"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_PALETTES,"Palettes");
} } else if (((mouse_x >= patternDestX + (PATTERNWIDTH * ZOOM) + 1) && (mouse_x < (patternDestX + (PATTERNWIDTH * ZOOM) * 2 + 1))) && (mouse_y >= patternDestY) && (mouse_y < (patternDestY + (PATTERNHEIGHT * ZOOM))))
else if(((mouse_x >= PATTERNDESTX+(PATTERNWIDTH*ZOOM)+1) && (mouse_x < (PATTERNDESTX+(PATTERNWIDTH*ZOOM)*2+1))) && (mouse_y >= PATTERNDESTY) && (mouse_y < (PATTERNDESTY+(PATTERNHEIGHT*ZOOM)))) { {
mouse_x = (mouse_x-(PATTERNDESTX+(PATTERNWIDTH*ZOOM)+1))/(8*ZOOM); mouse_x = (mouse_x - (patternDestX + (PATTERNWIDTH * ZOOM) + 1)) / (8 * ZOOM);
mouse_y = (mouse_y-PATTERNDESTY)/(8*ZOOM); mouse_y = (mouse_y - patternDestY) / (8 * ZOOM);
sprintf(str,"Tile: $%X%X",mouse_y,mouse_x); sprintf(str,"Tile: $%X%X",mouse_y,mouse_x);
SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE2,str); SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE2,str);
SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE1,"Tile:"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE1,"Tile:");
SetDlgItemText(hwndDlg,LBL_PPUVIEW_PALETTES,"Palettes"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_PALETTES,"Palettes");
} }
else if(((mouse_x >= PALETTEDESTX) && (mouse_x < (PALETTEDESTX+PALETTEWIDTH))) && (mouse_y >= PALETTEDESTY) && (mouse_y < (PALETTEDESTY+PALETTEHEIGHT))) { else if(((mouse_x >= paletteDestX) && (mouse_x < (paletteDestX + PALETTEWIDTH))) && (mouse_y >= paletteDestY) && (mouse_y < (paletteDestY + PALETTEHEIGHT)))
mouse_x = (mouse_x-PALETTEDESTX)/32; {
mouse_y = (mouse_y-PALETTEDESTY)/32; mouse_x = (mouse_x - paletteDestX) / 32;
mouse_y = (mouse_y - paletteDestY) / 32;
sprintf(str,"Palette: $%02X",palcache[(mouse_y<<4)|mouse_x]); sprintf(str,"Palette: $%02X",palcache[(mouse_y<<4)|mouse_x]);
SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE1,"Tile:"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE1,"Tile:");
SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE2,"Tile:"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE2,"Tile:");
SetDlgItemText(hwndDlg,LBL_PPUVIEW_PALETTES,str); SetDlgItemText(hwndDlg,LBL_PPUVIEW_PALETTES,str);
} } else
else { {
SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE1,"Tile:"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE1,"Tile:");
SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE2,"Tile:"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_TILE2,"Tile:");
SetDlgItemText(hwndDlg,LBL_PPUVIEW_PALETTES,"Palettes"); SetDlgItemText(hwndDlg,LBL_PPUVIEW_PALETTES,"Palettes");
} }
break; break;
case WM_NCACTIVATE: case WM_NCACTIVATE:
sprintf(str,"%d",PPUViewScanline); sprintf(str,"%d",PPUViewScanline);
SetDlgItemText(hwndDlg,IDC_PPUVIEW_SCANLINE,str); SetDlgItemText(hwndDlg,IDC_PPUVIEW_SCANLINE,str);
break; break;
case WM_COMMAND: case WM_COMMAND:
switch(HIWORD(wParam)) { {
switch(HIWORD(wParam))
{
case EN_UPDATE: case EN_UPDATE:
{
GetDlgItemText(hwndDlg,IDC_PPUVIEW_SCANLINE,str,4); GetDlgItemText(hwndDlg,IDC_PPUVIEW_SCANLINE,str,4);
sscanf(str,"%d",&PPUViewScanline); sscanf(str,"%d",&PPUViewScanline);
if(PPUViewScanline > 239) PPUViewScanline = 239; if(PPUViewScanline > 239) PPUViewScanline = 239;
break; break;
} }
case BN_CLICKED:
{
switch(LOWORD(wParam))
{
case IDC_MASK_UNUSED_GRAPHICS:
{
PPUView_maskUnusedGraphics ^= 1;
CheckDlgButton(hwndDlg, IDC_MASK_UNUSED_GRAPHICS, PPUView_maskUnusedGraphics ? BST_CHECKED : BST_UNCHECKED);
EnableWindow(GetDlgItem(hwndDlg, IDC_INVERT_THE_MASK), PPUView_maskUnusedGraphics ? true : false);
// redraw now
PPUViewSkip = PPUViewRefresh;
FCEUD_UpdatePPUView(-1, 0);
PPUViewDoBlit();
break; break;
}
case IDC_INVERT_THE_MASK:
{
PPUView_invertTheMask ^= 1;
CheckDlgButton(hwndDlg, IDC_INVERT_THE_MASK, PPUView_invertTheMask ? BST_CHECKED : BST_UNCHECKED);
// redraw now
PPUViewSkip = PPUViewRefresh;
FCEUD_UpdatePPUView(-1, 0);
PPUViewDoBlit();
break;
}
}
}
}
break;
}
case WM_HSCROLL: case WM_HSCROLL:
if(lParam) { //refresh trackbar if(lParam)
{
//refresh trackbar
PPUViewRefresh = SendDlgItemMessage(hwndDlg,CTL_PPUVIEW_TRACKBAR,TBM_GETPOS,0,0); PPUViewRefresh = SendDlgItemMessage(hwndDlg,CTL_PPUVIEW_TRACKBAR,TBM_GETPOS,0,0);
} }
break; break;
@ -398,6 +505,8 @@ void DoPPUView()
//SetWindowPos(hPPUView,HWND_TOP,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); //SetWindowPos(hPPUView,HWND_TOP,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
ShowWindow(hPPUView, SW_SHOWNORMAL); ShowWindow(hPPUView, SW_SHOWNORMAL);
SetForegroundWindow(hPPUView); SetForegroundWindow(hPPUView);
// redraw now
PPUViewSkip = PPUViewRefresh;
FCEUD_UpdatePPUView(-1,1); FCEUD_UpdatePPUView(-1,1);
PPUViewDoBlit(); PPUViewDoBlit();
} }

View File

@ -1624,20 +1624,23 @@ BEGIN
GROUPBOX "Logging workflow options",65528,8,142,171,52 GROUPBOX "Logging workflow options",65528,8,142,171,52
END END
PPUVIEW DIALOGEX 44, 38, 355, 246 PPUVIEW DIALOGEX 44, 38, 355, 260
STYLE DS_SETFONT | DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "PPU Viewer" CAPTION "PPU Viewer"
FONT 8, "MS Sans Serif", 0, 0, 0x0 FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN BEGIN
GROUPBOX "Pattern Tables",GRP_PPUVIEW_TABLES,2,-1,351,192,WS_TABSTOP GROUPBOX "Pattern Tables",GRP_PPUVIEW_TABLES,2,-1,351,204,WS_TABSTOP
LTEXT "Tile:",LBL_PPUVIEW_TILE1,6,168,50,10 LTEXT "Tile:",LBL_PPUVIEW_TILE1,6,169,50,9
LTEXT "Tile:",LBL_PPUVIEW_TILE2,177,168,50,10 LTEXT "Tile:",LBL_PPUVIEW_TILE2,177,169,50,9
CONTROL "",CTL_PPUVIEW_TRACKBAR,"msctls_trackbar32",WS_TABSTOP,227,178,106,11 CONTROL "",CTL_PPUVIEW_TRACKBAR,"msctls_trackbar32",WS_TABSTOP,227,178,106,11
LTEXT "Refresh: More",-1,177,178,50,10 LTEXT "Refresh: More",-1,177,178,50,9
LTEXT "Less",-1,334,178,18,10 LTEXT "Less",-1,334,178,18,10
GROUPBOX "Palettes",LBL_PPUVIEW_PALETTES,2,192,351,53,WS_TABSTOP GROUPBOX "Palettes",LBL_PPUVIEW_PALETTES,2,204,351,53,WS_TABSTOP
LTEXT "Display on scanline:",-1,6,178,65,10 LTEXT "Display on scanline:",-1,6,178,65,9
EDITTEXT IDC_PPUVIEW_SCANLINE,72,176,27,12 EDITTEXT IDC_PPUVIEW_SCANLINE,72,176,27,12
CONTROL "Mask unused graphics (needs Code/Data Logger)",IDC_MASK_UNUSED_GRAPHICS,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,189,169,10
CONTROL "Invert the mask",IDC_INVERT_THE_MASK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,177,189,61,10
END END
ARCHIVECHOOSERDIALOG DIALOGEX 0, 0, 265, 159 ARCHIVECHOOSERDIALOG DIALOGEX 0, 0, 265, 159
@ -2108,6 +2111,7 @@ BEGIN
"PPUVIEW", DIALOG "PPUVIEW", DIALOG
BEGIN BEGIN
BOTTOMMARGIN, 258
END END
"ARCHIVECHOOSERDIALOG", DIALOG "ARCHIVECHOOSERDIALOG", DIALOG

View File

@ -578,7 +578,6 @@
#define IDC_HISTORYLIST 1149 #define IDC_HISTORYLIST 1149
#define IDC_SYMBOLIC_NAME 1149 #define IDC_SYMBOLIC_NAME 1149
#define IDC_BOOKMARKSLIST 1150 #define IDC_BOOKMARKSLIST 1150
#define IDC_SYMBOLIC_ADDRESS2 1150
#define IDC_SYMBOLIC_FILENAME 1150 #define IDC_SYMBOLIC_FILENAME 1150
#define TASEDITOR_NEXT_MARKER 1151 #define TASEDITOR_NEXT_MARKER 1151
#define IDC_SYMBOLIC_COMMENT 1151 #define IDC_SYMBOLIC_COMMENT 1151
@ -629,6 +628,7 @@
#define IDC_MATCH_CASE 1203 #define IDC_MATCH_CASE 1203
#define IDC_COPY_INPUT 1203 #define IDC_COPY_INPUT 1203
#define IDC_AUTORESUMECDLOGGING 1203 #define IDC_AUTORESUMECDLOGGING 1203
#define IDC_MASK_UNUSED_GRAPHICS 1203
#define IDC_VOLUMEGROUP 1204 #define IDC_VOLUMEGROUP 1204
#define IDC_OMITBLANK 1204 #define IDC_OMITBLANK 1204
#define IDC_CHECK3 1204 #define IDC_CHECK3 1204
@ -637,6 +637,8 @@
#define IDC_COPY_MARKERS 1204 #define IDC_COPY_MARKERS 1204
#define IDC_AUTORESUMECDLOGGING2 1204 #define IDC_AUTORESUMECDLOGGING2 1204
#define IDC_AUTOSAVECDL 1204 #define IDC_AUTOSAVECDL 1204
#define IDC_USE_CDLOGGER_DATA2 1204
#define IDC_INVERT_THE_MASK 1204
#define IDC_RAMLIST 1205 #define IDC_RAMLIST 1205
#define IDC_CHECK4 1205 #define IDC_CHECK4 1205
#define IDC_CHECK_BOOKMARKS 1205 #define IDC_CHECK_BOOKMARKS 1205

View File

@ -813,7 +813,8 @@ void UpdateLogText(void)
return; return;
} }
void EnableTracerMenuItems(void){ void EnableTracerMenuItems(void)
{
if(logging) if(logging)
{ {
EnableWindow(GetDlgItem(hTracer,IDC_RADIO_LOG_LAST),FALSE); EnableWindow(GetDlgItem(hTracer,IDC_RADIO_LOG_LAST),FALSE);

View File

@ -1270,15 +1270,18 @@ static int memory_readbytesigned(lua_State *L) {
return 1; return 1;
} }
static int GetWord(lua_State *L, bool isSigned) { static int GetWord(lua_State *L, bool isSigned)
uint16 address1 = luaL_checkinteger(L,1); {
uint16 address2 = luaL_checkinteger(L,1)+1; uint16 addressLow = luaL_checkinteger(L,1);
if (lua_type(L,2) == LUA_TNUMBER) address2 = luaL_checkinteger(L,2); uint16 addressHigh = addressLow + 1; // little endian
uint32 result = FCEU_CheatGetByte(address1) + FCEU_CheatGetByte(address2)*256; // little endian if (lua_type(L,2) == LUA_TNUMBER)
return isSigned ? (int16) result : result; addressHigh = luaL_checkinteger(L,2);
uint32 result = FCEU_CheatGetByte(addressLow) + (FCEU_CheatGetByte(addressHigh) << 8);
return isSigned ? (int16)result : result;
} }
static int memory_readword(lua_State *L) { static int memory_readword(lua_State *L)
{
lua_pushinteger(L, GetWord(L, false)); lua_pushinteger(L, GetWord(L, false));
return 1; return 1;
} }
@ -5374,6 +5377,7 @@ static const struct luaL_reg memorylib [] = {
{"readbyteunsigned", memory_readbyte}, // alternate naming scheme for unsigned {"readbyteunsigned", memory_readbyte}, // alternate naming scheme for unsigned
{"readword", memory_readword}, {"readword", memory_readword},
{"readwordsigned", memory_readwordsigned}, {"readwordsigned", memory_readwordsigned},
{"readwordunsigned", memory_readword}, // alternate naming scheme for unsigned
{"writebyte", memory_writebyte}, {"writebyte", memory_writebyte},
{"getregister", memory_getregister}, {"getregister", memory_getregister},
{"setregister", memory_setregister}, {"setregister", memory_setregister},

Binary file not shown.