From a3e21f76cdffda7c6d8e842570b220525f9d9d55 Mon Sep 17 00:00:00 2001 From: CaH4e3 Date: Sun, 23 Sep 2012 14:07:43 +0000 Subject: [PATCH] CDLOGGER: CHR logging for the new PPU engine, TODO: doc update --- src/debug.cpp | 1 - src/drivers/win/cdlogger.cpp | 75 ++++++++++++++++++++++++++++-------- src/drivers/win/res.rc | 44 ++++++++++++--------- src/drivers/win/resource.h | 3 ++ src/ppu.cpp | 49 ++++++++++++++++++++++- vc/vc10_fceux.sln | 5 --- vc/vc10_fceux.vcxproj | 1 - 7 files changed, 133 insertions(+), 45 deletions(-) diff --git a/src/debug.cpp b/src/debug.cpp index ff386ef4..90cc7cbf 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -364,7 +364,6 @@ int condition(watchpointinfo* wp) volatile int codecount, datacount, undefinedcount; unsigned char *cdloggerdata; -char *cdlogfilename; static int indirectnext; int debug_loggingCD; diff --git a/src/drivers/win/cdlogger.cpp b/src/drivers/win/cdlogger.cpp index 63ef6c22..d6dcae7b 100644 --- a/src/drivers/win/cdlogger.cpp +++ b/src/drivers/win/cdlogger.cpp @@ -43,6 +43,11 @@ void SaveStrippedRom(int invert); extern iNES_HEADER head; //defined in ines.c extern uint8 *trainerpoo; +//---------CDLogger VROM +extern volatile int rendercount, vromreadcount, undefinedvromcount; +extern unsigned char *cdloggervdata; +extern int newppu; + int CDLogger_wndx=0, CDLogger_wndy=0; //extern uint8 *ROM; @@ -110,10 +115,13 @@ BOOL CALLBACK CDLoggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara if (CDLogger_wndy==-32000) CDLogger_wndy=0; SetWindowPos(hwndDlg,0,CDLogger_wndx,CDLogger_wndy,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER); hCDLogger = hwndDlg; - codecount = datacount = 0; + codecount = datacount = rendercount = vromreadcount = 0; undefinedcount = PRGsize[0]; + undefinedvromcount = CHRsize[0]; cdloggerdata = (unsigned char*)malloc(PRGsize[0]); //mbg merge 7/18/06 added cast + cdloggervdata = (unsigned char*)malloc(CHRsize[0]); ZeroMemory(cdloggerdata,PRGsize[0]); + ZeroMemory(cdloggervdata,CHRsize[0]); break; case WM_CLOSE: case WM_QUIT: @@ -126,7 +134,9 @@ MB_OK); } FCEUI_SetLoggingCD(0); free(cdloggerdata); + free(cdloggervdata); cdloggerdata=0; + cdloggervdata=0; hCDLogger = 0; EndDialog(hwndDlg,0); break; @@ -135,9 +145,11 @@ MB_OK); case BN_CLICKED: switch(LOWORD(wParam)) { case BTN_CDLOGGER_RESET: - codecount = datacount = 0; + codecount = datacount = rendercount = vromreadcount = 0; undefinedcount = PRGsize[0]; + undefinedvromcount = CHRsize[0]; ZeroMemory(cdloggerdata,PRGsize[0]); + ZeroMemory(cdloggervdata,CHRsize[0]); UpdateCDLogger(); break; case BTN_CDLOGGER_LOAD: @@ -157,6 +169,16 @@ MB_OK); SetDlgItemText(hCDLogger, BTN_CDLOGGER_START_PAUSE, "Start"); } else{ + if(!newppu) + { + if(MessageBox(hCDLogger, +"In order for CHR data logging to take effect, the New PPU engine logger must also be enabled.\ + Would you like to enable new PPU engine now?","Enable new PPU engine?", + MB_YESNO) == IDYES) + { + FCEU_TogglePPU(); + } + } FCEUI_SetLoggingCD(1); EnableTracerMenuItems(); SetDlgItemText(hCDLogger, BTN_CDLOGGER_START_PAUSE, "Pause"); @@ -190,14 +212,6 @@ void LoadCDLog (const char* nameo) int i,j; strcpy(loadedcdfile,nameo); - //FCEUD_PrintError(loadedcdfile); - - //fseek(FP,0,SEEK_SET); - //codecount = datacount = 0; - //undefinedcount = PRGsize[0]; - - //cdloggerdata = malloc(PRGsize[0]); - FP = fopen(loadedcdfile,"rb"); if(FP == NULL){ @@ -205,9 +219,6 @@ void LoadCDLog (const char* nameo) return; } - //codecount = datacount = 0; - //undefinedcount = PRGsize[0]; - for(i = 0;i < (int)PRGsize[0];i++){ j = fgetc(FP); if(j == EOF)break; @@ -216,6 +227,16 @@ void LoadCDLog (const char* nameo) if((j & 3) && !(cdloggerdata[i] & 3))undefinedcount--; //the appropriate counter. cdloggerdata[i] |= j; } + + for(i = 0;i < (int)CHRsize[0];i++){ + j = fgetc(FP); + if(j == EOF)break; + if((j & 1) && !(cdloggervdata[i] & 1))rendercount++; //if the new byte has something logged and + if((j & 2) && !(cdloggervdata[i] & 2))vromreadcount++; //if the new byte has something logged and + if((j & 3) && !(cdloggervdata[i] & 3))undefinedvromcount--; //the appropriate counter. + cdloggervdata[i] |= j; + } + fclose(FP); UpdateCDLogger(); return; @@ -285,6 +306,7 @@ void SaveCDLogFile(){ //todo make this button work before you've saved as return; } fwrite(cdloggerdata,PRGsize[0],1,FP); + fwrite(cdloggervdata,CHRsize[0],1,FP); fclose(FP); return; } @@ -315,8 +337,14 @@ void UpdateCDLogger(){ if(!hCDLogger)return; char str[50]; - float fcodecount = codecount, fdatacount = datacount, - fundefinedcount = undefinedcount, fromsize = PRGsize[0]; + float fcodecount = codecount; + float fdatacount = datacount; + float frendercount = rendercount; + float fvromreadcount = vromreadcount; + float fundefinedcount = undefinedcount; + float fundefinedvromcount = undefinedvromcount; + float fromsize = PRGsize[0]; + float fvromsize = CHRsize[0]; sprintf(str,"0x%06x %.2f%%",codecount,fcodecount/fromsize*100); SetDlgItemText(hCDLogger,LBL_CDLOGGER_CODECOUNT,str); @@ -324,6 +352,13 @@ void UpdateCDLogger(){ SetDlgItemText(hCDLogger,LBL_CDLOGGER_DATACOUNT,str); sprintf(str,"0x%06x %.2f%%",undefinedcount,fundefinedcount/fromsize*100); SetDlgItemText(hCDLogger,LBL_CDLOGGER_UNDEFCOUNT,str); + + sprintf(str,"0x%06x %.2f%%",rendercount,frendercount/fvromsize*100); + SetDlgItemText(hCDLogger,LBL_CDLOGGER_RENDERCOUNT,str); + sprintf(str,"0x%06x %.2f%%",vromreadcount,fvromreadcount/fvromsize*100); + SetDlgItemText(hCDLogger,LBL_CDLOGGER_VROMREADCOUNT,str); + sprintf(str,"0x%06x %.2f%%",undefinedvromcount,fundefinedvromcount/fvromsize*100); + SetDlgItemText(hCDLogger,LBL_CDLOGGER_UNDEFVROMCOUNT,str); return; } @@ -414,9 +449,15 @@ void SaveStrippedRom(int invert){ //this is based off of iNesSave() pchar = invert?ROM[i]:0; fputc(pchar, fp); } - //fwrite(ROM,0x4000,head.ROM_size,fp); - if(head.VROM_size)fwrite(VROM,0x2000,head.VROM_size,fp); + for(i = 0;i < head.VROM_size*0x2000;i++){ + unsigned char vchar; + if(cdloggervdata[i] & 1) + vchar = invert?0:VROM[i]; + else + vchar = invert?VROM[i]:0; + fputc(vchar, fp); + } } fclose(fp); } diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index 213e3ef1..1e915bf2 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -12,7 +12,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Нейтральный resources +// Neutral resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL @@ -1563,31 +1563,37 @@ BEGIN DEFPUSHBUTTON "&OK",IDOK,67,52,50,14 END -CDLOGGER DIALOGEX 0, 0, 315, 218 +CDLOGGER DIALOGEX 0, 0, 315, 264 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_ACCEPTFILES CAPTION "Code Data Logger" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - DEFPUSHBUTTON "Load...",BTN_CDLOGGER_LOAD,7,81,50,14 - PUSHBUTTON "Save",BTN_CDLOGGER_SAVE,257,81,50,14 - GROUPBOX "Code Data Log Status",-1,3,4,308,131,BS_CENTER - PUSHBUTTON "Start",BTN_CDLOGGER_START_PAUSE,129,81,50,14 - GROUPBOX "Address Label Logger",65534,3,136,308,79,BS_CENTER + DEFPUSHBUTTON "Load...",BTN_CDLOGGER_LOAD,7,105,50,14 + PUSHBUTTON "Save",BTN_CDLOGGER_SAVE,257,105,50,14 + GROUPBOX "Code/Data Log Status",-1,3,4,308,173,BS_CENTER + PUSHBUTTON "Start",BTN_CDLOGGER_START_PAUSE,129,105,50,14 + GROUPBOX "Address Label Logger",65534,2,180,308,79,BS_CENTER PUSHBUTTON "Load...",111,7,190,50,14,WS_DISABLED PUSHBUTTON "Start",112,127,189,50,14,WS_DISABLED PUSHBUTTON "Save...",113,256,189,50,14,WS_DISABLED LTEXT "4067 - 29.5%",LBL_CDLOGGER_CODECOUNT,38,31,68,11 - GROUPBOX "Bytes Logged As Code",65533,29,20,84,27 - GROUPBOX "Bytes Logged as data",65532,117,20,84,27 + GROUPBOX "PRG Logged as Code",65533,29,20,84,27 + GROUPBOX "PRG Logged as Data",65532,117,20,84,27 LTEXT "7092 - 37.2%",LBL_CDLOGGER_DATACOUNT,128,31,65,9 - GROUPBOX "Bytes Not Logged",65531,205,20,79,27 + GROUPBOX "PRG not Logged",65531,205,20,79,27 LTEXT "6072 - 32.7%",LBL_CDLOGGER_UNDEFCOUNT,210,31,60,8 - LTEXT "Itsa me the Code Data Logger! Press Start to play!",65530,69,56,172,12 - PUSHBUTTON "Reset Log",BTN_CDLOGGER_RESET,7,66,50,14 - PUSHBUTTON "Save as...",BTN_CDLOGGER_SAVE_AS,257,66,50,14 - PUSHBUTTON "Save Stripped iNes Rom...",BTN_CDLOGGER_SAVE_STRIPPED,208,102,99,14 - PUSHBUTTON "Save Unused Data...",BTN_CDLOGGER_SAVE_UNUSED,208,117,99,14 + LTEXT "Itsa me the Code/Data Logger! Press Start to play!",65530,69,80,172,12 + PUSHBUTTON "Reset Log",BTN_CDLOGGER_RESET,7,90,50,14 + PUSHBUTTON "Save as...",BTN_CDLOGGER_SAVE_AS,257,90,50,14 + PUSHBUTTON "Save Stripped iNes Rom...",BTN_CDLOGGER_SAVE_STRIPPED,208,126,99,14 + PUSHBUTTON "Save Unused Data...",BTN_CDLOGGER_SAVE_UNUSED,208,141,99,14 + LTEXT "4067 - 29.5%",LBL_CDLOGGER_RENDERCOUNT,37,60,68,11 + GROUPBOX "CHR Rendered",-1,29,50,84,27 + GROUPBOX "CHR Logged as Data",-1,117,50,84,27 + LTEXT "7092 - 37.2%",LBL_CDLOGGER_VROMREADCOUNT,127,60,65,9 + GROUPBOX "CHR not Logged",-1,205,50,79,27 + LTEXT "6072 - 32.7%",LBL_CDLOGGER_UNDEFVROMCOUNT,209,60,60,8 END PPUVIEW DIALOGEX 44, 38, 355, 246 @@ -2073,7 +2079,7 @@ BEGIN "CDLOGGER", DIALOG BEGIN - BOTTOMMARGIN, 213 + BOTTOMMARGIN, 259 END "PPUVIEW", DIALOG @@ -2118,12 +2124,12 @@ BEGIN END #endif // APSTUDIO_INVOKED -#endif // Нейтральный resources +#endif // Neutral resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// Английский (США) resources +// English (United States) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US @@ -2357,7 +2363,7 @@ IDB_BITMAP_SELECTED17 BITMAP "res\\te_17_selected.bmp" IDB_BITMAP_SELECTED18 BITMAP "res\\te_18_selected.bmp" IDB_BITMAP_SELECTED19 BITMAP "res\\te_19_selected.bmp" IDB_BRANCH_SPRITESHEET BITMAP "res\\branch_spritesheet.bmp" -#endif // Английский (США) resources +#endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index cfcfaae9..e360d695 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -119,6 +119,7 @@ #define IDC_CHECK_LOG_REGISTERS 110 #define IDC_DEBUGGER_BREAK_ON_BAD_OP 110 #define IDC_ROMPATCHER_BTN_APPLY 110 +#define LBL_CDLOGGER_RENDERCOUNT 110 #define MENU_LOAD_STATE 111 #define CB_DISABLE_SCREEN_SAVER 111 #define BTN_FAM 111 @@ -133,11 +134,13 @@ #define IDC_CHECK_LOG_NEW_INSTRUCTIONS 114 #define IDD_DIALOG1 114 #define IDC_DEBUGGER_RUN_LINE 114 +#define LBL_CDLOGGER_VROMREADCOUNT 114 #define LBL_AUTO_HOLD 115 #define IDC_CHECK_LOG_NEW_DATA 115 #define IDD_DIALOG2 115 #define IDC_DEBUGGER_STEP_OUT3 115 #define IDC_DEBUGGER_RUN_FRAME2 115 +#define LBL_CDLOGGER_UNDEFVROMCOUNT 115 #define LBL_CLEAR_AH 116 #define IDC_CHECK_LOG_UPDATE_WINDOW 116 #define IDC_DEBUGGER_RESET_CYCLES_COUNTER 116 diff --git a/src/ppu.cpp b/src/ppu.cpp index 10d95636..f7e8f44d 100644 --- a/src/ppu.cpp +++ b/src/ppu.cpp @@ -343,7 +343,7 @@ void (*PPU_hook)(uint32 A); uint8 vtoggle=0; uint8 XOffset=0; -uint32 TempAddr=0,RefreshAddr=0; +uint32 TempAddr=0,RefreshAddr=0,DummyRead=0; static int maxsprites=8; @@ -435,6 +435,17 @@ inline void FFCEUX_PPUWrite_Default(uint32 A, uint8 V) { } } +volatile int rendercount, vromreadcount, undefinedvromcount, LogAddress = -1; +unsigned char *cdloggervdata; + +int GetCHRAddress(int A){ + int result; + if((A > 0x1fff))return -1; + result = &VPage[A>>10][A]-CHRptr[0]; + if((result > (int)CHRsize[0]) || (result < 0))return -1; + else return result; +} + uint8 FASTCALL FFCEUX_PPURead_Default(uint32 A) { uint32 tmp = A; @@ -442,6 +453,19 @@ uint8 FASTCALL FFCEUX_PPURead_Default(uint32 A) { if(tmp<0x2000) { + if(debug_loggingCD) + { + int addr = GetCHRAddress(tmp); + if(addr != -1) + { + if(!(cdloggervdata[addr] & 1)) + { + cdloggervdata[addr] |= 1; + if(!(cdloggervdata[addr] & 2))undefinedvromcount--; + rendercount++; + } + } + } return VPage[tmp>>10][tmp]; } else if (tmp < 0x3F00) @@ -743,6 +767,21 @@ static DECLFR(A2007) uint8 ret; uint32 tmp=RefreshAddr&0x3FFF; + if(debug_loggingCD) + { + if(!DummyRead && (LogAddress != -1)) + { + if(!(cdloggervdata[LogAddress] & 2)) + { + cdloggervdata[LogAddress] |= 2; + if(!(cdloggervdata[LogAddress] & 1))undefinedvromcount--; + vromreadcount++; + } + } + else + DummyRead = 0; + } + if(newppu) { ret = VRAMBuffer; RefreshAddr = ppur.get_2007access() & 0x3FFF; @@ -766,8 +805,11 @@ static DECLFR(A2007) ret &= 0x30; VRAMBuffer = CALL_PPUREAD(RefreshAddr - 0x1000); } - else + else { + if(debug_loggingCD) + LogAddress = GetCHRAddress(RefreshAddr); VRAMBuffer = CALL_PPUREAD(RefreshAddr); + } ppur.increment2007(INC32!=0); RefreshAddr = ppur.get_2007access(); return ret; @@ -784,6 +826,8 @@ static DECLFR(A2007) PPUGenLatch=VRAMBuffer; if(tmp<0x2000) { + if(debug_loggingCD) + LogAddress = GetCHRAddress(tmp); VRAMBuffer=VPage[tmp>>10][tmp]; } else if (tmp < 0x3F00) @@ -949,6 +993,7 @@ static DECLFW(B2006) TempAddr|=V; RefreshAddr=TempAddr; + DummyRead=1; if(PPU_hook) PPU_hook(RefreshAddr); //printf("%d, %04x\n",scanline,RefreshAddr); diff --git a/vc/vc10_fceux.sln b/vc/vc10_fceux.sln index d037781c..4b61e3c2 100644 --- a/vc/vc10_fceux.sln +++ b/vc/vc10_fceux.sln @@ -3,11 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fceux", "vc10_fceux.vcxproj", "{6893EF44-FEA3-46DF-B236-C4C200F54294}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F8647A59-ED57-4975-B40C-054BA8588E4E}" - ProjectSection(SolutionItems) = preProject - Performance1.psess = Performance1.psess - EndProjectSection -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 diff --git a/vc/vc10_fceux.vcxproj b/vc/vc10_fceux.vcxproj index 790d6295..28eb6162 100644 --- a/vc/vc10_fceux.vcxproj +++ b/vc/vc10_fceux.vcxproj @@ -1001,7 +1001,6 @@ -