void DebugStep(void) { int cnt = 4; do { if (cpuClk < MAX_FRAME_TACTS) { CpuStep(); if (cpuClk < INT_LENGTH) CpuInt(); } else { lastDevClk = devClk; cpuClk -= MAX_FRAME_TACTS; devClk = cpuClk; InitActClk(); } cnt--; } while (z80ex_last_op_type(cpu) && cnt>0); }
// main debugger loop int bf_debugger( Emulator_t *em ) { Emulator_t *dem = em; char buf[256]; int lret = 0; int broke; int i; bfid_brkp_t *temp; bfid_cmd_hook_t *hook; if ( !bfid_initialized ) bfid_init( ); dem->Debugging = 1; interrupted = 1; signal( SIGINT, (__sighandler_t)debug_signal ); printf( "[>] Unnamed NES debugger v0.01\n" ); while ( dem->Debugging ) { if ( interrupted ) { if ( lret ) printf( "[%x] ", lret & 0xff ); else printf( "[ ] " ); printf( "> " ); fgets( buf, 256, stdin ); if ( strlen( buf ) < 2 ) continue; if (( lret = bfid_execcmd( dem, buf )) < 0 ) { printf( "Unknown command.\n" ); continue; } sprintf( buf, "%u\0", dem->Cpus[0].pCounter ); set_variable( "ip", buf ); sprintf( buf, "%u\0", dem->Cpus[0].sPointer ); set_variable( "ptr", buf ); } else { for ( i = 0; i < dem->cpuNo; i++ ) { CpuStep( &dem->Cpus[i] ); // Check for breakpoints on the cpu for ( temp = brkp_list; temp; temp = temp->next ) { broke = 0; if ( temp->type == BRK_IP && temp->val == dem->Cpus[i].pCounter ) { interrupted = broke = 1; } else if ( temp->type == BRK_MEM && temp->val == dem->Cpus[i].sPointer ) { interrupted = broke = 1; } else if ( temp->type == BRK_INSTR && //temp->val == dem->Cpus[i].memory[ dem->Cpus[i].pCounter ]){ temp->val == ReadByte( dem->Cpus[i].memory, dem->Cpus[i].pCounter )) { interrupted = broke = 1; } if ( broke ) { sprintf( buf, "%u\0", dem->Cpus[i].pCounter ); set_variable( "ip", buf ); sprintf( buf, "%u\0", dem->Cpus[i].sPointer ); set_variable( "ptr", buf ); if ( get_variable( "quiet" ) && strcmp( get_variable( "quiet" ), "true" )) { printf( "[ ] cpu%d: breakpoint %d\n", i, temp->i ); } for ( hook = temp->hooks; hook; hook = hook->next ) { if ( bfid_execcmd( dem, hook->cmd ) < 0 ) printf( "[ ] Unknown hook command: \"%s\"\n", hook->cmd ); } } } } } } return 0; }
void Render(void) { static int sn = 0; if (params.antiFlicker) { renderSurf = scrSurf[sn]; sn = 1 - sn; } else renderSurf = screen; if ((drawFrame || isAvgImageWrited /* isLongImageWrited */) && SDL_MUSTLOCK(renderSurf)) { if (SDL_LockSurface(renderSurf) < 0) { printf("Can't lock surface\n"); return; } } renderPitch = renderSurf->pitch / 4; if (dev_extport.Is16Colors()) renderPtr = Render16c; else if (dev_extport.IsMulticolor()) renderPtr = RenderMulticolor; // else if (dev_extport.Is512x192()) renderPtr = Render512x192; // else if (dev_extport.Is384x304()) renderPtr = Render384x304; else renderPtr = RenderSpeccy; InitActClk(); prevRenderClk = 0; while (cpuClk < INT_LENGTH) { CpuStep(); CpuInt(); } if (drawFrame || isAvgImageWrited /* isLongImageWrited */) { while (cpuClk < MAX_FRAME_TACTS) { CpuStep(); renderPtr(cpuClk); } } else { while (cpuClk < MAX_FRAME_TACTS) { CpuStep(); } } renderPtr = NULL; lastDevClk = devClk; cpuClk -= MAX_FRAME_TACTS; devClk = cpuClk; if ((drawFrame || isAvgImageWrited /* isLongImageWrited */) && SDL_MUSTLOCK(renderSurf)) SDL_UnlockSurface(renderSurf); if (params.antiFlicker && (drawFrame || isAvgImageWrited /* isLongImageWrited */)) AntiFlicker(renderSurf, scrSurf[sn]); // if (isLongImageWrited) // { // int * src = (int *)screen->pixels + (PITCH * (32 + longImagePos)) + 32; // // for (int i = 256; i--;) // { // unsigned int c = *src; // int r = GETR(c); // int g = GETG(c); // int b = GETB(c); // // longImageFile.PutBYTE(r); // longImageFile.PutBYTE(g); // longImageFile.PutBYTE(b); // // *(src++) = DRGB(255 - r, 255 - g, 255 - b); // } // // longImageHeight++; // longImagePos = (longImagePos + 1) % 192; // } if (isAvgImageWrited) { int * src = (int *)screen->pixels; long * dst = avgImageBuffer; for (int i = HEIGHT; i--;) { int * line = src; for (int j = WIDTH; j--;) { unsigned int c = *(line++); *(dst++) += (long)GETR(c); *(dst++) += (long)GETG(c); *(dst++) += (long)GETB(c); } src += PITCH; } // avgImageFrames++; } }