📄 debug.c
字号:
/*
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 + -