From 013e56ced374f96e6301c167e102f8020a7fea36 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 20 Jul 2006 02:21:13 +0000 Subject: [PATCH] nope, missed some code. but this should be the last of it [[Split portion of a mixed commit.]] --- drivers/win/main.c | 10 + drivers/win/ntview.c | 600 +++++++++++++++++++++++++++++++++++++++++ drivers/win/res.rc | Bin 130594 -> 114600 bytes drivers/win/resource.h | 6 +- drivers/win/window.c | 14 +- ntview.h | 9 + 6 files changed, 631 insertions(+), 8 deletions(-) create mode 100644 drivers/win/ntview.c create mode 100644 ntview.h diff --git a/drivers/win/main.c b/drivers/win/main.c index a4882c15..5868f9eb 100644 --- a/drivers/win/main.c +++ b/drivers/win/main.c @@ -43,6 +43,16 @@ #include "cheat.h" #include "debug.h" +//------ +//mbg merge 7/19/06 added +#include "..\..\ppuview.h" +#include "..\..\ntview.h" +#include "..\..\debugger.h" +#include "..\..\memview.h" +#include "..\..\cdlogger.h" +#include "..\..\tracer.h" +//----- + //#include "memwatch.h" //mbg merge 7/19/06 removed-memwatch is gone #include "basicbot.h" diff --git a/drivers/win/ntview.c b/drivers/win/ntview.c new file mode 100644 index 00000000..b6a7ef62 --- /dev/null +++ b/drivers/win/ntview.c @@ -0,0 +1,600 @@ +/* FCE Ultra - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Ben Parnell + * + * 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 of the License, 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 + */ + +#include "common.h" +#include "..\..\ntview.h" +#include "..\..\fceu.h" +#define INESPRIV +#include "..\..\cart.h" +#include "..\..\ines.h" +#include "..\..\debugger.h" +#include "..\..\palette.h" +#include "..\..\ppu.h" + +HWND hNTView; + +int NTViewPosX,NTViewPosY; +static uint8 palcache[32]; //palette cache //mbg merge 7/19/06 needed to be static +//uint8 ntcache0[0x400],ntcache1[0x400],ntcache2[0x400],ntcache3[0x400]; //cache CHR, fixes a refresh problem when right-clicking +uint8 *ntable0, *ntable1, *ntable2, *ntable3; //name table bitmap array +uint8 *ntablemirr[4]; +uint8 ntcache[4][0x400]; //todo: use an array for the above variables too +int NTViewScanline=0,NTViewer=0; +int NTViewSkip,NTViewRefresh; +static int mouse_x,mouse_y; //todo: is static needed here? --mbg 7/19/06 - i think so +int redrawtables = 0; +int chrchanged = 0; +int ntmirroring, oldntmirroring = -1; //0 is horizontal, 1 is vertical, 2 is four screen. +int lockmirroring; +//int ntmirroring[4]; //these 4 ints are either 0, 1, 2, or 3 and tell where each of the 4 nametables point to +//uint8 *ntmirroringpointers[] = {&NTARAM[0x000],&NTARAM[0x400],ExtraNTARAM,ExtraNTARAM+0x400}; + +int horzscroll, vertscroll; + +#define NTWIDTH 256 +#define NTHEIGHT 240 +//#define PATTERNBITWIDTH PATTERNWIDTH*3 +#define NTDESTX 10 +#define NTDESTY 15 +#define ZOOM 1 + +//#define PALETTEWIDTH 32*4*4 +//#define PALETTEHEIGHT 32*2 +//#define PALETTEBITWIDTH PALETTEWIDTH*3 +//#define PALETTEDESTX 10 +//#define PALETTEDESTY 327 + +void UpdateMirroringButtons(); +void ChangeMirroring(); + +static BITMAPINFO bmInfo; //todo is static needed here so it won't interefere with the pattern table viewer? +static HDC pDC,TmpDC0,TmpDC1; +static HBITMAP TmpBmp0,TmpBmp1; +static HGDIOBJ TmpObj0,TmpObj1; + +static HDC TmpDC2,TmpDC3; +static HBITMAP TmpBmp2,TmpBmp3; +static HGDIOBJ TmpObj2,TmpObj3; + +extern uint32 TempAddr, RefreshAddr; +extern uint8 XOffset; + +int xpos, ypos; +int scrolllines = 1; + +//if you pass this 1 then it will draw no matter what. If you pass it 0 +//then it will draw if redrawtables is 1 +void NTViewDoBlit(int autorefresh) { + if (!hNTView) return; + if (NTViewSkip < NTViewRefresh) { + NTViewSkip++; + return; + } + NTViewSkip=0; + + if((redrawtables && !autorefresh) || (autorefresh) || (scrolllines)){ + //todo: use switch and use bitblt for because its faster + switch(ntmirroring){ + case 0: //horizontal + BitBlt(pDC,NTDESTX,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + break; + case 1: //vertical + BitBlt(pDC,NTDESTX,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + break; + case 2: //four screen + BitBlt(pDC,NTDESTX,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC2,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC3,0,0,SRCCOPY); + break; + case 3: //single screen, table 0 + BitBlt(pDC,NTDESTX,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC0,0,0,SRCCOPY); + break; + case 4: //single screen, table 1 + BitBlt(pDC,NTDESTX,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC1,0,0,SRCCOPY); + break; + case 5: //single screen, table 2 + BitBlt(pDC,NTDESTX,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC2,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC2,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC2,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC2,0,0,SRCCOPY); + break; + case 6: //single screen, table 3 + BitBlt(pDC,NTDESTX,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC3,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY,NTWIDTH,NTHEIGHT,TmpDC3,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC3,0,0,SRCCOPY); + BitBlt(pDC,NTDESTX+NTWIDTH,NTDESTY+NTHEIGHT,NTWIDTH,NTHEIGHT,TmpDC3,0,0,SRCCOPY); + break; + } + /* + if(ntmirroring == 0){ //horizontal + StretchBlt(pDC,NTDESTX,NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX,NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + } + if(ntmirroring == 1){ //vertical + StretchBlt(pDC,NTDESTX,NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX,NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + } + if(ntmirroring == 2){ //four screen + StretchBlt(pDC,NTDESTX,NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX,NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC2,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC3,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + } + if(ntmirroring == 3){ //single screen, table 0 + StretchBlt(pDC,NTDESTX,NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX,NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + } + if(ntmirroring == 4){ //single screen, table 1 + StretchBlt(pDC,NTDESTX,NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX,NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + } + if(ntmirroring == 5){ //single screen, table 2 + StretchBlt(pDC,NTDESTX,NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC2,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC2,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX,NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC2,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC2,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + } + if(ntmirroring == 6){ //single screen, table 3 + StretchBlt(pDC,NTDESTX,NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC3,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC3,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX,NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC3,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC3,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + } + */ + redrawtables = 0; + } + + if(scrolllines){ + SetROP2(pDC,R2_NOT); + + //draw vertical line + MoveToEx(pDC,NTDESTX+xpos,NTDESTY,NULL); + LineTo(pDC,NTDESTX+xpos,NTDESTY+(NTHEIGHT*2)); + + //draw horizontal line + MoveToEx(pDC,NTDESTX,NTDESTY+ypos,NULL); + LineTo(pDC,NTDESTX+(NTWIDTH*2),NTDESTY+ypos); + + SetROP2(pDC,R2_COPYPEN); + } + //StretchBlt(pDC,NTDESTX,NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC0,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + //StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY,NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC1,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + //StretchBlt(pDC,NTDESTX,NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC2,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); + //StretchBlt(pDC,NTDESTX+(NTWIDTH*ZOOM),NTDESTY+(NTHEIGHT*ZOOM),NTWIDTH*ZOOM,NTHEIGHT*ZOOM,TmpDC3,0,NTHEIGHT-1,NTWIDTH,-NTHEIGHT,SRCCOPY); +} + +void UpdateMirroringButtons(){ + int i; + for(i = 0; i < 7;i++){ + if(i != ntmirroring)CheckDlgButton(hNTView, i+1001, BST_UNCHECKED); + else CheckDlgButton(hNTView, i+1001, BST_CHECKED); + } + return; +} + +void ChangeMirroring(){ + switch(ntmirroring){ + case 0: + vnapage[0] = vnapage[1] = &NTARAM[0x000]; + vnapage[2] = vnapage[3] = &NTARAM[0x400]; + break; + case 1: + vnapage[0] = vnapage[2] = &NTARAM[0x000]; + vnapage[1] = vnapage[3] = &NTARAM[0x400]; + break; + case 2: + vnapage[0] = &NTARAM[0x000]; + vnapage[1] = &NTARAM[0x400]; + vnapage[2] = ExtraNTARAM; + vnapage[3] = ExtraNTARAM+0x400; + break; + case 3: + vnapage[0] = vnapage[1] = vnapage[2] = vnapage[3] = &NTARAM[0x000]; + break; + case 4: + vnapage[0] = vnapage[1] = vnapage[2] = vnapage[3] = &NTARAM[0x400]; + break; + case 5: + vnapage[0] = vnapage[1] = vnapage[2] = vnapage[3] = ExtraNTARAM; + break; + case 6: + vnapage[0] = vnapage[1] = vnapage[2] = vnapage[3] = ExtraNTARAM+0x400; + break; + } + return; +} + +INLINE void DrawChr(uint8 *pbitmap,uint8 *chr,int pal){ + int y, x, tmp, index=0, p=0; + uint8 chr0, chr1; + //uint8 *table = &VPage[0][0]; //use the background table + //pbitmap += 3* + + for (y = 0; y < 8; y++) { //todo: use index for y? + chr0 = chr[index]; + chr1 = chr[index+8]; + tmp=7; + for (x = 0; x < 8; x++) { //todo: use tmp for x? + p = (chr0>>tmp)&1; + p |= ((chr1>>tmp)&1)<<1; + p = palcache[p+(pal*4)]; + tmp--; + + *(uint8*)(pbitmap++) = palo[p].b; + *(uint8*)(pbitmap++) = palo[p].g; + *(uint8*)(pbitmap++) = palo[p].r; + } + index++; + pbitmap += (NTWIDTH*3)-24; + } + //index+=8; + //pbitmap -= (((PALETTEBITWIDTH>>2)<<3)-24); +} + +void DrawNameTable(uint8 *bitmap, uint8 *table, uint8 *tablecache) { + int x,y,a, chr, ptable=0, cacheaddr0, cacheaddr1;//index=0; + uint8 *pbitmap = bitmap; + + if(PPU[0]&0x10){ //use the correct pattern table based on this bit + ptable=0x1000; + } + + pbitmap = bitmap; + for(y = 0;y < 30;y++){ + for(x = 0;x < 32;x++){ + cacheaddr0 = (y*32)+x; + cacheaddr1 = 0x3C0+((y>>2)<<3)+(x>>2); + if((tablecache == 0) || (table[cacheaddr0] != tablecache[cacheaddr0]) || + (table[cacheaddr1] != tablecache[cacheaddr1])){ + redrawtables = 1; + a = (table[0x3C0+((y>>2)<<3)+(x>>2)] & (3<<(((y&2)<<1)+(x&2)))) >> (((y&2)<<1)+(x&2)); + //the commented out code below is all equilivent to the single line above. + //tmpx = x>>2; + //tmpy = y>>2; + //a = 0x3C0+(tmpy*8)+tmpx; + //if((((x>>1)&1) == 0) && (((y>>1)&1) == 0)) a = table[a]&0x3; + //if((((x>>1)&1) == 1) && (((y>>1)&1) == 0)) a = (table[a]&0xC)>>2; + //if((((x>>1)&1) == 0) && (((y>>1)&1) == 1)) a = (table[a]&0x30)>>4; + //if((((x>>1)&1) == 1) && (((y>>1)&1) == 1)) a = (table[a]&0xC0)>>6; + + chr = table[y*32+x]*16; + DrawChr(pbitmap,&VPage[(ptable+chr)>>10][ptable+chr],a); + if(tablecache != 0){ + tablecache[cacheaddr0] = table[cacheaddr0]; + //tablecache[cacheaddr1] = table[cacheaddr1]; + } + } + pbitmap += (8*3); + } + pbitmap += 7*((NTWIDTH*3)); + } + + if((tablecache != 0) && (redrawtables)){ //this copies the attribute tables to the cache if needed + memcpy(tablecache+0x3c0,table+0x3c0,0x40); + } +} + +void UpdateNTView(int drawall) { + + //uint8 *pbitmap = ppuv_palette; + if (!hNTView) return; + + xpos = ((RefreshAddr & 0x400) >> 2) | ((RefreshAddr & 0x1F) << 3) | XOffset; + + ypos = ((RefreshAddr & 0x3E0) >> 2) | ((RefreshAddr & 0x7000) >> 12); + if(RefreshAddr & 0x800) ypos += 240; + + //char str[50]; + //sprintf(str,"%d,%d,%d",horzscroll,vertscroll,ntmirroring); + //sprintf(str,"%08X %08X",TempAddr, RefreshAddr); + //SetDlgItemText(hNTView, 103, str); + + if (NTViewSkip < NTViewRefresh) return; + + if(chrchanged) drawall = 1; + + //update palette only if required + if (memcmp(palcache,PALRAM,32) != 0) { + memcpy(palcache,PALRAM,32); + drawall = 1; //palette has changed, so redraw all + } + + + ntmirroring = -1; + if(vnapage[0] == vnapage[1])ntmirroring = 0; + if(vnapage[0] == vnapage[2])ntmirroring = 1; + if((vnapage[0] != vnapage[1]) && (vnapage[0] != vnapage[2]))ntmirroring = 2; + + if((vnapage[0] == vnapage[1]) && (vnapage[1] == vnapage[2]) && (vnapage[2] == vnapage[3])){ + if(vnapage[0] == &NTARAM[0x000])ntmirroring = 3; + if(vnapage[0] == &NTARAM[0x400])ntmirroring = 4; + if(vnapage[0] == ExtraNTARAM)ntmirroring = 5; + if(vnapage[0] == ExtraNTARAM+0x400)ntmirroring = 6; + } + + if(oldntmirroring != ntmirroring){ + UpdateMirroringButtons(); + oldntmirroring = ntmirroring; + } + + if(drawall){ + DrawNameTable(ntable0,&NTARAM[0x000],0); + DrawNameTable(ntable1,&NTARAM[0x400],0); + DrawNameTable(ntable2,ExtraNTARAM,0); + DrawNameTable(ntable3,ExtraNTARAM+0x400,0); + } else { + if((ntmirroring == 0) || (ntmirroring == 1) || (ntmirroring == 3)) + DrawNameTable(ntable0,&NTARAM[0x000],ntcache[0]); + if((ntmirroring == 0) || (ntmirroring == 1) || (ntmirroring == 4)) + DrawNameTable(ntable1,&NTARAM[0x400],ntcache[1]); + if(ntmirroring == 2){ + DrawNameTable(ntable2,ExtraNTARAM,ntcache[2]); + DrawNameTable(ntable3,ExtraNTARAM+0x400,ntcache[3]); + } + } + + chrchanged = 0; + + return; +} + +void KillNTView() { + //GDI cleanup + DeleteObject(TmpBmp0); + SelectObject(TmpDC0,TmpObj0); + DeleteDC(TmpDC0); + DeleteObject(TmpBmp1); + SelectObject(TmpDC1,TmpObj1); + DeleteDC(TmpDC1); + DeleteObject(TmpBmp2); + SelectObject(TmpDC2,TmpObj2); + DeleteDC(TmpDC2); + DeleteObject(TmpBmp3); + SelectObject(TmpDC3,TmpObj3); + DeleteDC(TmpDC3); + ReleaseDC(hNTView,pDC); + + DeleteObject (SelectObject (pDC, GetStockObject (BLACK_PEN))) ; + + DestroyWindow(hNTView); + hNTView=NULL; + NTViewer=0; + NTViewSkip=0; +} + +extern void StopSound(void); + +BOOL CALLBACK NTViewCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { + RECT wrect; + char str[50]; + int TileID, TileX, TileY, NameTable, PPUAddress; + + switch(uMsg) { + case WM_INITDIALOG: + //SetWindowPos(hwndDlg,0,PPUViewPosX,PPUViewPosY,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER); + + //prepare the bitmap attributes + //pattern tables + memset(&bmInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER)); + bmInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmInfo.bmiHeader.biWidth = NTWIDTH; + bmInfo.bmiHeader.biHeight = -NTHEIGHT; + bmInfo.bmiHeader.biPlanes = 1; + bmInfo.bmiHeader.biBitCount = 24; + + //create memory dcs + pDC = GetDC(hwndDlg); // GetDC(GetDlgItem(hwndDlg,101)); + TmpDC0 = CreateCompatibleDC(pDC); //name table 0 + TmpDC1 = CreateCompatibleDC(pDC); //name table 1 + TmpDC2 = CreateCompatibleDC(pDC); //name table 2 + TmpDC3 = CreateCompatibleDC(pDC); //name table 3 + //TmpDC2 = CreateCompatibleDC(pDC); //palettes + + //create bitmaps and select them into the memory dc's + TmpBmp0 = CreateDIBSection(pDC,&bmInfo,DIB_RGB_COLORS,(void**)&ntable0,0,0); + TmpObj0 = SelectObject(TmpDC0,TmpBmp0); + TmpBmp1 = CreateDIBSection(pDC,&bmInfo,DIB_RGB_COLORS,(void**)&ntable1,0,0); + TmpObj1 = SelectObject(TmpDC1,TmpBmp1); + TmpBmp2 = CreateDIBSection(pDC,&bmInfo,DIB_RGB_COLORS,(void**)&ntable2,0,0); + TmpObj2 = SelectObject(TmpDC2,TmpBmp2); + TmpBmp3 = CreateDIBSection(pDC,&bmInfo,DIB_RGB_COLORS,(void**)&ntable3,0,0); + TmpObj3 = SelectObject(TmpDC3,TmpBmp3); + + //Refresh Trackbar + SendDlgItemMessage(hwndDlg,201,TBM_SETRANGE,0,(LPARAM)MAKELONG(0,25)); + SendDlgItemMessage(hwndDlg,201,TBM_SETPOS,1,NTViewRefresh); + + //Set Text Limit + SendDlgItemMessage(hwndDlg,102,EM_SETLIMITTEXT,3,0); + + //force redraw the first time the PPU Viewer is opened + NTViewSkip=100; + + SelectObject (pDC, CreatePen (PS_SOLID, 2, RGB (255, 255, 255))) ; + + CheckDlgButton(hwndDlg, 1008, BST_CHECKED); + //clear cache + //memset(palcache,0,32); + //memset(ntcache0,0,0x400); + //memset(ntcache1,0,0x400); + //memset(ntcache2,0,0x400); + //memset(ntcache3,0,0x400); + + NTViewer=1; + break; + case WM_PAINT: + NTViewDoBlit(1); + break; + case WM_CLOSE: + case WM_QUIT: + KillNTView(); + break; + case WM_MOVING: + StopSound(); + break; + case WM_MOVE: + GetWindowRect(hwndDlg,&wrect); + //NTViewPosX = wrect.left; //todo: is this needed? + //NTViewPosY = wrect.top; + 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++; + } + UpdatePPUView(0); + PPUViewDoBlit();*/ + break; + case WM_MOUSEMOVE: + mouse_x = GET_X_LPARAM(lParam); + mouse_y = GET_Y_LPARAM(lParam); + if((mouse_x > NTDESTX) && (mouse_x < NTDESTX+(NTWIDTH*2)) + && (mouse_y > NTDESTY) && (mouse_y < NTDESTY+(NTHEIGHT*2))){ + TileX = (mouse_x-NTDESTX)/8; + TileY = (mouse_y-NTDESTY)/8; + sprintf(str,"X / Y: %0d / %0d",TileX,TileY); + SetDlgItemText(hwndDlg,104,str); + NameTable = (TileX/32)+((TileY/30)*2); + PPUAddress = 0x2000+(NameTable*0x400)+((TileY%30)*32)+(TileX%32); + sprintf(str,"PPU Address: %04X",PPUAddress); + SetDlgItemText(hwndDlg,105,str); + TileID = vnapage[(PPUAddress>>10)&0x3][PPUAddress&0x3FF]; + sprintf(str,"Tile ID: %02X",TileID); + SetDlgItemText(hwndDlg,103,str); + } + +/* 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); + sprintf(str,"Tile: $%X%X",mouse_y,mouse_x); + SetDlgItemText(hwndDlg,103,str); + SetDlgItemText(hwndDlg,104,"Tile:"); + SetDlgItemText(hwndDlg,105,"Palettes"); + } + 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_y = (mouse_y-PATTERNDESTY)/(8*ZOOM); + sprintf(str,"Tile: $%X%X",mouse_y,mouse_x); + SetDlgItemText(hwndDlg,104,str); + SetDlgItemText(hwndDlg,103,"Tile:"); + SetDlgItemText(hwndDlg,105,"Palettes"); + } + 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; + sprintf(str,"Palette: $%02X",palcache[(mouse_y<<4)|mouse_x]); + SetDlgItemText(hwndDlg,103,"Tile:"); + SetDlgItemText(hwndDlg,104,"Tile:"); + SetDlgItemText(hwndDlg,105,str); + } + else { + SetDlgItemText(hwndDlg,103,"Tile:"); + SetDlgItemText(hwndDlg,104,"Tile:"); + SetDlgItemText(hwndDlg,105,"Palettes"); + } +*/ + break; + case WM_NCACTIVATE: + sprintf(str,"%d",NTViewScanline); + SetDlgItemText(hwndDlg,102,str); + break; + case WM_COMMAND: + switch(HIWORD(wParam)) { + case EN_UPDATE: + GetDlgItemText(hwndDlg,102,str,4); + sscanf(str,"%d",&NTViewScanline); + if (NTViewScanline > 239) NTViewScanline = 239; + chrchanged = 1; + break; + case BN_CLICKED: + switch(LOWORD(wParam)) { + case 1001 : + case 1002 : + case 1003 : + case 1004 : + case 1005 : + case 1006 : + case 1007 : + oldntmirroring = ntmirroring = LOWORD(wParam)-1001; + ChangeMirroring(); + break; + case 1008 : + scrolllines ^= 1; + chrchanged = 1; + break; + } + break; + } + break; + case WM_HSCROLL: + if (lParam) { //refresh trackbar + NTViewRefresh = SendDlgItemMessage(hwndDlg,201,TBM_GETPOS,0,0); + } + break; + } + return FALSE; +} + +void DoNTView() { + if (!GI) { + FCEUD_PrintError("You must have a game loaded before you can use the Name Table Viewer."); + return; + } + if (GI->type==GIT_NSF) { + FCEUD_PrintError("Sorry, you can't use the Name Table Viewer with NSFs."); + return; + } + + if (!hNTView) hNTView = CreateDialog(fceu_hInstance,"NTVIEW",NULL,NTViewCallB); + if (hNTView) { + SetWindowPos(hNTView,HWND_TOP,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); + UpdateNTView(1); + NTViewDoBlit(1); + } +} + diff --git a/drivers/win/res.rc b/drivers/win/res.rc index a7c76c9c407e11fd4e1d4bf6f23d3803a985ed61..b34cc3348053b44ec8f0663afd5f1d5c1a188d47 100644 GIT binary patch delta 5092 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 delta 11221 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 aGZimKEl<5iWz!%>-PIq##n@SK#-9L~q*zn{ diff --git a/drivers/win/resource.h b/drivers/win/resource.h index 4956e264..49991393 100644 --- a/drivers/win/resource.h +++ b/drivers/win/resource.h @@ -9,15 +9,15 @@ #define ID_DEBUG_NAMETABLEVIEWER 40055 #define ID_DEBUG_HEXEDITOR 40056 #define ID_DEBUG_TRACELOGGER 40057 -#define ID_DEBUG_CODE 40058 -#define ID_TOOLS_GAMEGENIEDECODER 40059 +#define ID_DEBUG_GAMEGENIEDECODER 40059 +#define ID_DEBUG_CDLOGGER 40060 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 -#define _APS_NEXT_COMMAND_VALUE 40010 +#define _APS_NEXT_COMMAND_VALUE 40013 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/drivers/win/window.c b/drivers/win/window.c index c8ae68f4..742deac0 100644 --- a/drivers/win/window.c +++ b/drivers/win/window.c @@ -401,7 +401,7 @@ int KeyboardSetBackgroundAccess(int on); //mbg merge 7/17/06 YECH had to add void SetJoystickBackgroundAccess(int background); //mbg merge 7/17/06 YECH had to add void ShowNetplayConsole(void); //mbg merge 7/17/06 YECH had to add int FCEUMOV_IsPlaying(void); //mbg merge 7/17/06 YECH had to add - +void DoPPUView();//mbg merge 7/19/06 yech had to add void MapInput(void); @@ -509,10 +509,14 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { //------- //mbg merge 7/18/06 added XD tools - case ID_DEBUG_DEBUGGER: - DoDebug(0); - break; - + case ID_DEBUG_DEBUGGER: DoDebug(0); break; + case ID_DEBUG_PPUVIEWER: DoPPUView(); break; + case ID_DEBUG_NAMETABLEVIEWER: DoNTView(); break; + case ID_DEBUG_HEXEDITOR: DoMemView(); break; + case ID_DEBUG_TRACELOGGER: DoTracer(); break; + case ID_TOOLS_GAMEGENIEDECODER: DoGGConv(); break; + case ID_DEBUG_CDLOGGER: DoCDLogger(); break; + case 40004: SetAutoFirePattern(1,1); CheckedAutoFirePattern = wParam; diff --git a/ntview.h b/ntview.h new file mode 100644 index 00000000..e19e2b83 --- /dev/null +++ b/ntview.h @@ -0,0 +1,9 @@ +extern int NTViewScanline; +extern int NTViewer; +extern int chrchanged; +extern int horzscroll, vertscroll; + +void NTViewDoBlit(int autorefresh); +void UpdateNTView(int drawall); +void KillNTView(); +void DoNTView();