⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.c

📁 NES game Emulator in Linux.c and asm codes.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*

SNEeSe, an Open Source Super NES emulator.


Copyright (c) 1998-2004 Charles Bilyue'.
Portions Copyright (c) 2003-2004 Daniel Horchner.

This is free software.  See 'LICENSE' for details.
You must read and accept the license prior to use.

*/

/*

 Debug Info Dumps
 Invalid Opcode handlers
 Invalid Bus Access handlers

*/

#include <stdio.h>
#include "wrapaleg.h"

#include "debug.h"
#include "cpu/cpu.h"
#include "apu/sound.h"
#include "apu/spc.h"
#include "helper.h"
#include "snes.h"

/* PPU.asm */
extern unsigned char BG1SC,BG2SC,BG3SC,BG4SC,BG12NBA,BG34NBA;
extern unsigned short BG1HOFS,BG2HOFS,BG3HOFS,BG4HOFS;
extern unsigned short BG1VOFS,BG2VOFS,BG3VOFS,BG4VOFS;
extern unsigned char BGMODE,OBSEL,VMAIN,TM,TS,M7SEL,SETINI,INIDISP;
extern unsigned char WH0,WH1,WH2,WH3,W12SEL,W34SEL,WOBJSEL;
extern unsigned char WBGLOG,WOBJLOG,CGWSEL,CGADSUB,TMW,TSW;
extern unsigned short HiSpriteAddr;

extern unsigned char OAM[512+32];      /* Buffer for OAM */

extern unsigned M7X,M7Y,M7A,M7B,M7C,M7D;
extern unsigned char APUI00a, APUI00b, APUI00c;

extern unsigned VTIMEL, HTIMEL;

unsigned OLD_PC;    /* Pre-NMI PB:PC */
unsigned char OLD_PB;
unsigned OLD_SPC_ADDRESS;
unsigned Map_Address;
unsigned Map_Byte;

void print_str(const char *s)
{
 printf("%s", s);
}

void print_decnum(unsigned u)
{
 printf("%u", u);
}

void print_hexnum(unsigned u, int width)
{
 printf("%0*X", width, u);
}

void InvalidDMAMode()
{
 set_gfx_mode(GFX_TEXT,0,0,0,0);

#ifdef DEBUG
 DisplayStatus();
#endif

 printf("\nUnsupported DMA mode! - 0x%02X", (unsigned) Map_Byte);
 exit(1);
}

void InvalidHWRead()
{
#ifdef DEBUG
/*
 set_gfx_mode(GFX_TEXT,0,0,0,0);
 DisplayStatus();
*/
#endif
 printf("\nRead from unsupported HW address! - %02X:%04X",
  (unsigned) ((Map_Address >> 24) & 0xFF),
  (unsigned) (Map_Address & 0xFFFFFF));
/* exit(1);*/
}

void InvalidHWWrite()
{
#ifdef DEBUG
/*
 set_gfx_mode(GFX_TEXT,0,0,0,0);
 DisplayStatus();
*/
#endif

 printf("\nWrite to unsupported HW address! - %02X:%04X with 0x%02X",
  (unsigned) ((Map_Address >> 24) & 0xFFFF),
  (unsigned) (Map_Address & 0xFFFFFF),
  (unsigned) Map_Byte);
/* exit(1);*/
}

void InvalidROMWrite()
{
 printf("\nWrite to ROM ignored - %02X:%04X with 0x%02X",
  (unsigned) ((Map_Address >> 24) & 0xFF),
  (unsigned) (Map_Address & 0xFFFFFF),
  (unsigned) Map_Byte);
}

const char *CPU_OpID[256] = {
/* 00 */ "BRK"      ,"ORA (d,x)","COP"      ,"ORA d,s"      ,
/* 04 */ "TSB d"    ,"ORA d"    ,"ASL d"    ,"ORA [d]"      ,
/* 08 */ "PHP"      ,"ORA #"    ,"SLA"      ,"PHD"          ,
/* 0C */ "TSB a"    ,"ORA a"    ,"ASL a"    ,"ORA al"       ,

/* 10 */ "BPL r"    ,"ORA (d),y","ORA (d)"  ,"ORA (d,s),y"  ,
/* 14 */ "TRB d"    ,"ORA d,x"  ,"ASL d,x"  ,"ORA [d],y"    ,
/* 18 */ "CLC"      ,"ORA a,y"  ,"INA"      ,"TCS"          ,
/* 1C */ "TRB a"    ,"ORA a,x"  ,"ASL a,x"  ,"ORA al,x"     ,

/* 20 */ "JSR a"    ,"AND (d,x)","JSL al"   ,"AND d,s"      ,
/* 24 */ "BIT d"    ,"AND d"    ,"ROL d"    ,"AND [d]"      ,
/* 28 */ "PLP"      ,"AND #"    ,"RLA"      ,"PLD"          ,
/* 2C */ "BIT a"    ,"AND a"    ,"ROL a"    ,"AND al"       ,

/* 30 */ "BMI r"    ,"AND (d),y","AND (d)"  ,"AND (d,s),y"  ,
/* 34 */ "BIT d,x"  ,"AND d,x"  ,"ROL d,x"  ,"AND [d],y"    ,
/* 38 */ "SEC"      ,"AND a,y"  ,"DEA"      ,"TSC"          ,
/* 3C */ "BIT a,x"  ,"AND a,x"  ,"ROL a,x"  ,"AND al,x"     ,

/* 40 */ "RTI"      ,"EOR (d,x)","WDM *"    ,"EOR d,s"      ,
/* 44 */ "MVP"      ,"EOR d"    ,"LSR d"    ,"EOR [d]"      ,
/* 48 */ "PHA"      ,"EOR #"    ,"SRA"      ,"PHK"          ,
/* 4C */ "JMP a"    ,"EOR a"    ,"LSR a"    ,"EOR al"       ,

/* 50 */ "BVC r"    ,"EOR (d),y","EOR (d)"  ,"EOR (d,s),y"  ,
/* 54 */ "MVN"      ,"EOR d,x"  ,"LSR d,x"  ,"EOR [d],y"    ,
/* 58 */ "CLI"      ,"EOR a,y"  ,"PHY"      ,"TCD"          ,
/* 5C */ "JML al"   ,"EOR a,x"  ,"LSR a,x"  ,"EOR al,x"     ,

/* 60 */ "RTS"      ,"ADC (d,x)","PER"      ,"ADC d,s"      ,
/* 64 */ "STZ d"    ,"ADC d"    ,"ROR d"    ,"ADC [d]"      ,
/* 68 */ "PLA"      ,"ADC #"    ,"RRA"      ,"RTL"          ,
/* 6C */ "JMP (a)"  ,"ADC a"    ,"ROR a"    ,"ADC al"       ,

/* 70 */ "BVS r"    ,"ADC (d),y","ADC (d)"  ,"ADC (d,s),y"  ,
/* 74 */ "STZ d,x"  ,"ADC d,x"  ,"ROR d,x"  ,"ADC [d],y"    ,
/* 78 */ "SEI"      ,"ADC a,y"  ,"PLY"      ,"TDC"          ,
/* 7C */ "JMP (a,x)","ADC a,x"  ,"ROR a,x"  ,"ADC al,x"     ,

/* 80 */ "BRA r"    ,"STA (d,x)","BRL rl"   ,"STA d,s"      ,
/* 84 */ "STY d"    ,"STA d"    ,"STX d"    ,"STA [d]"      ,
/* 88 */ "DEY"      ,"BIT #"    ,"TXA"      ,"PHB"          ,
/* 8C */ "STY a"    ,"STA a"    ,"STX a"    ,"STA al"       ,

/* 90 */ "BCC r"    ,"STA (d),y","STA (d)"  ,"STA (d,s),y"  ,
/* 94 */ "STY d,x"  ,"STA d,x"  ,"STX d,y"  ,"STA [d],y"    ,
/* 98 */ "TYA"      ,"STA a,y"  ,"TXS"      ,"TXY"          ,
/* 9C */ "STZ a"    ,"STA a,x"  ,"STZ a,x"  ,"STA al,x"     ,

/* A0 */ "LDY #"    ,"LDA (d,x)","LDX #"    ,"LDA d,s"      ,
/* A4 */ "LDY d"    ,"LDA d"    ,"LDX d"    ,"LDA [d]"      ,
/* A8 */ "TAY"      ,"LDA #"    ,"TAX"      ,"PLB"          ,
/* AC */ "LDY a"    ,"LDA a"    ,"LDX a"    ,"LDA al"       ,

/* B0 */ "BCS r"    ,"LDA (d),y","LDA (d)"  ,"LDA (d,s),y"  ,
/* B4 */ "LDY d,x"  ,"LDA d,x"  ,"LDX d,y"  ,"LDA [d],y"    ,
/* B8 */ "CLV"      ,"LDA a,y"  ,"TSX"      ,"TYX"          ,
/* BC */ "LDY a,x"  ,"LDA a,x"  ,"LDX a,y"  ,"LDA al,x"     ,

/* C0 */ "CPY #"    ,"CMP (d,x)","REP #"    ,"CMP d,s"      ,
/* C4 */ "CPY d"    ,"CMP d"    ,"DEC d"    ,"CMP [d]"      ,
/* C8 */ "INY"      ,"CMP #"    ,"DEX"      ,"WAI"          ,
/* CC */ "CPY a"    ,"CMP a"    ,"DEC a"    ,"CMP al"       ,

/* D0 */ "BNE r"    ,"CMP (d),y","CMP (d)"  ,"CMP (d,s),y"  ,
/* D4 */ "PEI"      ,"CMP d,x"  ,"DEC d,x"  ,"CMP [d],y"    ,
/* D8 */ "CLD"      ,"CMP a,y"  ,"PHX"      ,"STP *"        ,
/* DC */ "JML (a)"  ,"CMP a,x"  ,"DEC a,x"  ,"CMP al,x"     ,

/* E0 */ "CPX #"    ,"SBC (d,x)","SEP #"    ,"SBC d,s"      ,
/* E4 */ "CPX d"    ,"SBC d"    ,"INC d"    ,"SBC [d]"      ,
/* E8 */ "INX"      ,"SBC #"    ,"NOP"      ,"XBA"          ,
/* EC */ "CPX a"    ,"SBC a"    ,"INC a"    ,"SBC al"       ,

/* F0 */ "BEQ r"    ,"SBC (d),y","SBC (d)"  ,"SBC (d,s),y"  ,
/* F4 */ "PEA"      ,"SBC d,x"  ,"INC d,x"  ,"SBC [d],y"    ,
/* F8 */ "SED"      ,"SBC a,y"  ,"PLX"      ,"XCE"          ,
/* FC */ "JSR (a,x)","SBC a,x"  ,"INC a,x"  ,"SBC al,x"
};

extern unsigned char NMITIMEN;
extern unsigned Current_Line_Timing, EventTrip;
void DisplayStatus()
{
 char Message[10];
 int c;

 printf("\n65c816 registers\n");
 printf("PB:PC %02X:%04X",
  (unsigned) OLD_PB, OLD_PC);
 printf("  DB:D  %02X:%04X",
  (unsigned) cpu_65c816_DB, cpu_65c816_D);
 printf("  S:%04X", cpu_65c816_S);
 if (cpu_65c816_P & 0x100) printf("    ENV1BDIZC\n");
 else printf("    ENVMXDIZC\n");
 printf("A:%04X  X:%04X  Y:%04X", cpu_65c816_A, cpu_65c816_X, cpu_65c816_Y);

 for (c = 0; c < 9; c++) Message[8 - c] = (cpu_65c816_P & (1 << c)) ? '1' : '0';
 Message[9] = 0;
 printf("  Opcode:%08X %s\n", (unsigned) Map_Byte, Message);
 printf("%s\n", CPU_OpID[Map_Byte & 0xFF]);

 printf("BGSC:%02X %02X %02X %02X  BGNBA: %02X %02X\n",
  (unsigned) BG1SC, (unsigned) BG2SC,
  (unsigned) BG3SC, (unsigned) BG4SC,
  (unsigned) BG12NBA, (unsigned) BG34NBA);

 printf("HOFS:%04X %04X %04X %04X\n",
  (unsigned) (BG1HOFS & 0xFFFF), (unsigned) (BG2HOFS & 0xFFFF),
  (unsigned) (BG3HOFS & 0xFFFF), (unsigned) (BG4HOFS & 0xFFFF));
 printf("VOFS:%04X %04X %04X %04X\n",
  (unsigned) (BG1VOFS & 0xFFFF), (unsigned) (BG2VOFS & 0xFFFF),
  (unsigned) (BG3VOFS & 0xFFFF), (unsigned) (BG4VOFS & 0xFFFF));
 printf("M7:%04X %04X %04X %04X - %04X,%04X\n",
  (unsigned) (M7A & 0xFFFF), (unsigned) (M7B & 0xFFFF),
  (unsigned) (M7C & 0xFFFF), (unsigned) (M7D & 0xFFFF),
  (unsigned) (M7X & 0xFFFF), (unsigned) (M7Y & 0xFFFF));

 printf("BGMODE:%02X      TM:%02X   TMW:%02X\n",
  (unsigned) BGMODE, (unsigned) TM, (unsigned) TMW);
 printf("VMAIN:%02X       TS:%02X   TSW:%02X\n",
  (unsigned) VMAIN, (unsigned) TS, (unsigned) TSW);
 printf("WH0:%02X   WH1:%02X   WH2:%02X   WH3:%02X\n",
  (unsigned) WH0, (unsigned) WH1, (unsigned) WH2, (unsigned) WH3);
 printf("WSEL 12:%02X   34:%02X   OBJ:%02X\n",
  (unsigned) W12SEL, (unsigned) W34SEL, (unsigned) WOBJSEL);
 printf("WLOG BG:%02X\tOBJ:%02X\n",
  (unsigned) WBGLOG, (unsigned) WOBJLOG);
 printf("CGWSEL:%02X\tCGADSUB:%02X\n",
  (unsigned) CGWSEL, (unsigned) CGADSUB);

/*
 printf("OBSEL:%02X\tHiSprite:%02X\n", (unsigned) OBSEL,
  (unsigned) (HiSpriteAddr-(unsigned) OAM) & 0x1FF);
 */
 printf("M7SEL:%02X\tSETINI:%02X\tINIDISP:%02X\n",
  (unsigned) M7SEL, (unsigned) SETINI,(unsigned) INIDISP);

 if (!SPC_ENABLED)
 {
  printf("APUI00a:%02X  APUI00b:%02X  APUI00c:%02X\n",
   (unsigned) APUI00a, (unsigned) APUI00b, (unsigned) APUI00c);
 } else {
  DisplaySPC();
 }
 printf("VTIME: %04X HTIME: %04X NMITIMEN: %02X\n",
  VTIMEL, HTIMEL, (unsigned) NMITIMEN);
 printf("Current line:%04X Next event:%04X\n",
  Current_Line_Timing, EventTrip);
}


extern unsigned char HDMAEN;
extern unsigned Current_Line_Timing;
extern unsigned char NTRL_0 asm("NTRL_0");
extern unsigned char NTRL_1 asm("NTRL_1");
extern unsigned char NTRL_2 asm("NTRL_2");
extern unsigned char NTRL_3 asm("NTRL_3");
extern unsigned char NTRL_4 asm("NTRL_4");
extern unsigned char NTRL_5 asm("NTRL_5");
extern unsigned char NTRL_6 asm("NTRL_6");
extern unsigned char NTRL_7 asm("NTRL_7");
extern unsigned char DMAP_0, DMAP_1, DMAP_2, DMAP_3;
extern unsigned char DMAP_4, DMAP_5, DMAP_6, DMAP_7;
extern unsigned char BBAD_0, BBAD_1, BBAD_2, BBAD_3;
extern unsigned char BBAD_4, BBAD_5, BBAD_6, BBAD_7;
extern unsigned char A1TL_0, A1TL_1, A1TL_2, A1TL_3;
extern unsigned char A1TL_4, A1TL_5, A1TL_6, A1TL_7;
extern unsigned char A1TH_0, A1TH_1, A1TH_2, A1TH_3;
extern unsigned char A1TH_4, A1TH_5, A1TH_6, A1TH_7;
extern unsigned char A1B_0, A1B_1, A1B_2, A1B_3;
extern unsigned char A1B_4, A1B_5, A1B_6, A1B_7;
extern unsigned char DASL_0, DASL_1, DASL_2, DASL_3;
extern unsigned char DASL_4, DASL_5, DASL_6, DASL_7;
extern unsigned char DASH_0, DASH_1, DASH_2, DASH_3;
extern unsigned char DASH_4, DASH_5, DASH_6, DASH_7;
extern unsigned char DASB_0, DASB_1, DASB_2, DASB_3;
extern unsigned char DASB_4, DASB_5, DASB_6, DASB_7;
extern unsigned char A2L_0, A2L_1, A2L_2, A2L_3;
extern unsigned char A2L_4, A2L_5, A2L_6, A2L_7;
extern unsigned char A2H_0, A2H_1, A2H_2, A2H_3;
extern unsigned char A2H_4, A2H_5, A2H_6, A2H_7;
extern unsigned char A2B_0, A2B_1, A2B_2, A2B_3;
extern unsigned char A2B_4, A2B_5, A2B_6, A2B_7;
extern unsigned Frames;

int dumping_dma = 0;

void Dump_Read(int a)
{
 printf("read: %04X\n", a & 0xFFFF);
}

void Dump_Write(int a, unsigned char b)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -