📄 debug.c
字号:
printf("write: %04X, %02X\n", a & 0xFFFF, (unsigned) b);
}
void Dump_DMA(int b)
{
if (!dumping_dma && !(b & ~0xFF)) return;
switch (b)
{
case 0:
printf("Frame %d\n", Frames);
break;
case 1:
printf("HDMA relatch\n");
break;
case 2:
printf("HDMA line %d\n", Current_Line_Timing);
break;
default:
printf("DMA %d executed at line %d\n", b & 0xFF, Current_Line_Timing);
}
if (!(b & ~0xFF))
{
printf("HDMAEN:%02X\n", (unsigned) HDMAEN);
}
if (!(b & ~0xFF) || b & (1 << 0))
{
printf("%02X %02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X\n",
(unsigned) DMAP_0,(unsigned) BBAD_0,(unsigned) NTRL_0,
(unsigned) A1B_0,(unsigned) A1TH_0,(unsigned) A1TL_0,
(unsigned) A2B_0,(unsigned) A2H_0,(unsigned) A2L_0,
(unsigned) DASB_0,(unsigned) DASH_0,(unsigned) DASL_0);
}
if (!(b & ~0xFF) || b & (1 << 1))
{
printf("%02X %02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X\n",
(unsigned) DMAP_1,(unsigned) BBAD_1,(unsigned) NTRL_1,
(unsigned) A1B_1,(unsigned) A1TH_1,(unsigned) A1TL_1,
(unsigned) A2B_1,(unsigned) A2H_1,(unsigned) A2L_1,
(unsigned) DASB_1,(unsigned) DASH_1,(unsigned) DASL_1);
}
if (!(b & ~0xFF) || b & (1 << 2))
{
printf("%02X %02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X\n",
(unsigned) DMAP_2,(unsigned) BBAD_2,(unsigned) NTRL_2,
(unsigned) A1B_2,(unsigned) A1TH_2,(unsigned) A1TL_2,
(unsigned) A2B_2,(unsigned) A2H_2,(unsigned) A2L_2,
(unsigned) DASB_2,(unsigned) DASH_2,(unsigned) DASL_2);
}
if (!(b & ~0xFF) || b & (1 << 3))
{
printf("%02X %02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X\n",
(unsigned) DMAP_3,(unsigned) BBAD_3,(unsigned) NTRL_3,
(unsigned) A1B_3,(unsigned) A1TH_3,(unsigned) A1TL_3,
(unsigned) A2B_3,(unsigned) A2H_3,(unsigned) A2L_3,
(unsigned) DASB_3,(unsigned) DASH_3,(unsigned) DASL_3);
}
if (!(b & ~0xFF) || b & (1 << 4))
{
printf("%02X %02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X\n",
(unsigned) DMAP_4,(unsigned) BBAD_4,(unsigned) NTRL_4,
(unsigned) A1B_4,(unsigned) A1TH_4,(unsigned) A1TL_4,
(unsigned) A2B_4,(unsigned) A2H_4,(unsigned) A2L_4,
(unsigned) DASB_4,(unsigned) DASH_4,(unsigned) DASL_4);
}
if (!(b & ~0xFF) || b & (1 << 5))
{
printf("%02X %02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X\n",
(unsigned) DMAP_5,(unsigned) BBAD_5,(unsigned) NTRL_5,
(unsigned) A1B_5,(unsigned) A1TH_5,(unsigned) A1TL_5,
(unsigned) A2B_5,(unsigned) A2H_5,(unsigned) A2L_5,
(unsigned) DASB_5,(unsigned) DASH_5,(unsigned) DASL_5);
}
if (!(b & ~0xFF) || b & (1 << 6))
{
printf("%02X %02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X\n",
(unsigned) DMAP_6,(unsigned) BBAD_6,(unsigned) NTRL_6,
(unsigned) A1B_6,(unsigned) A1TH_6,(unsigned) A1TL_6,
(unsigned) A2B_6,(unsigned) A2H_6,(unsigned) A2L_6,
(unsigned) DASB_6,(unsigned) DASH_6,(unsigned) DASL_6);
}
if (!(b & ~0xFF) || b & (1 << 7))
{
printf("%02X %02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X\n",
(unsigned) DMAP_7,(unsigned) BBAD_7,(unsigned) NTRL_7,
(unsigned) A1B_7,(unsigned) A1TH_7,(unsigned) A1TL_7,
(unsigned) A2B_7,(unsigned) A2H_7,(unsigned) A2L_7,
(unsigned) DASB_7,(unsigned) DASH_7,(unsigned) DASL_7);
}
}
void InvalidOpcode()
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
#ifdef DEBUG
DisplayStatus();
#endif
printf("Unemulated 65c816 opcode 0x%02X (%s)\n",
(unsigned) Map_Byte, CPU_OpID[Map_Byte]);
printf("At address %02X:%04X\n",(unsigned) ((Map_Address >> 24) & 0xFF),
(unsigned) (Map_Address & 0xFFFFFF));
save_debug_dumps();
exit(1);
}
void InvalidJump()
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
#ifdef DEBUG
DisplayStatus();
#endif
printf("65c816 jump to non-linear mapped address space (%02X:%04X)\n",
(unsigned) ((Map_Address >> 16) & 0xFF), (unsigned) (Map_Address & 0xFFFF));
printf("Opcode %02X at address %02X:%04X\n",
(unsigned) ((Map_Byte >> 24) & 0xFF),
(unsigned) ((Map_Byte >> 16) & 0xFF), (unsigned) (Map_Byte & 0xFFFF));
save_debug_dumps();
exit(1);
}
void InvalidSPCHWRead()
{
printf("\nRead from unsupported SPC HW address! - %04X",
(unsigned) (Map_Address & 0xFFFF));
}
void InvalidSPCHWWrite()
{
printf("\nWrite to unsupported SPC HW address! - %04X with 0x%02X",
(unsigned) (Map_Address & 0xFFFF),
(unsigned) Map_Byte);
}
void InvalidSPCROMWrite()
{
printf("\nWrite to SPC ROM ignored - %04X with 0x%02X",
(unsigned) (Map_Address & 0xFFFF),
(unsigned) Map_Byte);
}
const char *SPC_OpID[256] = {
"NOP" ,"TCALL 0" ,"SET1 dp.0" ,"BBS dp.0,rel" ,
"OR A,dp" ,"OR A,labs" ,"OR A,(X)" ,"OR A,(dp+X)" ,
"OR A,#imm" ,"OR dp(d),dp(s)" ,"OR1 C,mem.bit" ,"ASL dp" ,
"ASL labs" ,"PUSH PSW" ,"TSET1 labs" ,"BRK" ,
"BPL rel" ,"TCALL 1" ,"CLR1 dp.0" ,"BBC dp.0,rel" ,
"OR A,dp+X" ,"OR A,labs+X" ,"OR A,labs+Y" ,"OR A,(dp)+Y" ,
"OR dp,#imm" ,"OR (X),(Y)" ,"DECW dp" ,"ASL dp+X" ,
"ASL A" ,"DEC X" ,"CMP X,labs" ,"JMP (abs,x)" ,
"CLRP" ,"TCALL 2" ,"SET1 dp.1" ,"BBS dp.1,rel" ,
"AND A,dp" ,"AND A,labs" ,"AND A,(X)" ,"AND A,(dp+X)" ,
"AND A,#imm" ,"AND dp(d),dp(s)","OR1 C,/mem.bit" ,"ROL dp" ,
"ROL labs" ,"PUSH A" ,"CBNE dp" ,"BRA rel" ,
"BMI rel" ,"TCALL 3" ,"CLR1 dp.1" ,"BBC dp.1,rel" ,
"AND A,dp+X" ,"AND A,labs+X" ,"AND A,labs+Y" ,"AND A,(dp)+Y" ,
"AND dp,#imm" ,"AND (X),(Y)" ,"INCW dp" ,"ROL dp+X" ,
"ROL A" ,"INC X" ,"CMP X,dp" ,"CALL labs" ,
"SETP" ,"TCALL 4" ,"SET1 dp.2" ,"BBS dp.2,rel" ,
"EOR A,dp" ,"EOR A,labs" ,"EOR A,(X)" ,"EOR A,(dp+X)" ,
"EOR A,#imm" ,"EOR dp(d),dp(s)","AND1 C,mem.bit" ,"LSR dp" ,
"LSR labs" ,"PUSH X" ,"TCLR1 labs" ,"PCALL upage" ,
"BVC rel" ,"TCALL 5" ,"CLR1 dp.2" ,"BBC dp.2,rel" ,
"EOR A,dp+X" ,"EOR A,labs+X" ,"EOR A,labs+Y" ,"EOR A,(dp)+Y" ,
"EOR dp,#imm" ,"EOR (X),(Y)" ,"CMPW YA,dp" ,"LSR dp+X" ,
"LSR A" ,"MOV X,A" ,"CMP Y,labs" ,"JMP labs" ,
"CLRC" ,"TCALL 6" ,"SET1 dp.3" ,"BBS dp.3,rel" ,
"CMP A,dp" ,"CMP A,labs" ,"CMP A,(X)" ,"CMP A,(dp+X)" ,
"CMP A,#imm" ,"CMP dp(d),dp(s)","AND1 C,/mem.bit","ROR dp" ,
"ROR labs" ,"PUSH Y" ,"DBNZ dp,rel" ,"RET" ,
"BVS rel" ,"TCALL 7" ,"CLR1 dp.3" ,"BBC dp.3,rel" ,
"CMP A,dp+X" ,"CMP A,labs+X" ,"CMP A,labs+Y" ,"CMP A,(dp)+Y" ,
"CMP dp,#imm" ,"CMP (X),(Y)" ,"ADDW YA,dp" ,"ROR dp+X" ,
"ROR A" ,"MOV A,X" ,"CMP Y,dp" ,"RETI" ,
"SETC" ,"TCALL 8" ,"SET1 dp.4" ,"BBS dp.4,rel" ,
"ADC A,dp" ,"ADC A,labs" ,"ADC A,(X)" ,"ADC A,(dp+X)" ,
"ADC A,#imm" ,"ADC dp(d),dp(s)","EOR1 C,mem.bit" ,"DEC dp" ,
"DEC labs" ,"MOV Y,#imm" ,"POP PSW" ,"MOV dp,#imm" ,
"BCC rel" ,"TCALL 9" ,"CLR1 dp.4" ,"BBC dp.4,rel" ,
"ADC A,dp+X" ,"ADC A,labs+X" ,"ADC A,labs+Y" ,"ADC A,(dp)+Y" ,
"ADC dp,#imm" ,"ADC (X),(Y)" ,"SUBW YA,dp" ,"DEC dp+X" ,
"DEC A" ,"MOV X,SP" ,"DIV YA,X" ,"XCN A" ,
"EI" ,"TCALL 10" ,"SET1 dp.5" ,"BBS dp.5,rel" ,
"SBC A,dp" ,"SBC A,labs" ,"SBC A,(X)" ,"SBC A,(dp+X)" ,
"SBC A,#imm" ,"SBC dp(d),dp(s)","MOV1 C,mem.bit" ,"INC dp" ,
"INC labs" ,"CMP Y,#imm" ,"POP A" ,"MOV (X)+,A" ,
"BCS rel" ,"TCALL 11" ,"CLR1 dp.5" ,"BBC dp.5,rel" ,
"SBC A,dp+X" ,"SBC A,labs+X" ,"SBC A,labs+Y" ,"SBC A,(dp)+Y" ,
"SBC dp,#imm" ,"SBC (X),(Y)" ,"MOVW YA,dp" ,"INC dp+X" ,
"INC A" ,"MOV SP,X" ,"DAS A" ,"MOV A,(X)+" ,
"DI" ,"TCALL 12" ,"SET1 dp.6" ,"BBS dp.6,rel" ,
"MOV dp,A" ,"MOV labs,A" ,"MOV (X),A" ,"MOV (dp+X),A" ,
"CMP X,#imm" ,"MOV labs,X" ,"MOV1 mem.bit,C" ,"MOV dp,Y" ,
"MOV labs,Y" ,"MOV X,#imm" ,"POP X" ,"MUL YA" ,
"BNE rel" ,"TCALL 13" ,"CLR1 dp.6" ,"BBC dp.6,rel" ,
"MOV dp+X,A" ,"MOV labs+X,A" ,"MOV labs+Y,A" ,"MOV (dp)+Y,A" ,
"MOV dp,X" ,"MOV dp+Y,X" ,"MOVW dp,YA" ,"MOV dp+X,Y" ,
"DEC Y" ,"MOV A,Y" ,"CBNE dp+X,rel" ,"DAA A" ,
"CLRV" ,"TCALL 14" ,"SET1 dp.7" ,"BBS dp.7,rel" ,
"MOV A,dp" ,"MOV A,labs" ,"MOV A,(X)" ,"MOV A,(dp+X)" ,
"MOV A,#imm" ,"MOV X,labs" ,"NOT1 mem.bit" ,"MOV Y,dp" ,
"MOV Y,labs" ,"NOTC" ,"POP Y" ,"SLEEP" ,
"BEQ rel" ,"TCALL 15" ,"CLR1 dp.7" ,"BBC dp.7,rel" ,
"MOV A,dp+X" ,"MOV A,labs+X" ,"MOV A,labs+Y" ,"MOV A,(dp)+Y" ,
"MOV X,dp" ,"MOV X,dp+Y" ,"MOV dp(d),dp(s)","MOV Y,dp+X" ,
"INC Y" ,"MOV Y,A" ,"DBNZ Y,rel" ,"STOP"
};
void DisplaySPC()
{
char Message[9];
int c;
printf("SPC registers\n");
printf("PC:%04X SP:%04X NVPBHIZC\n", _SPC_PC, _SPC_SP);
_SPC_PSW = get_SPC_PSW();
for (c = 0; c < 8; c++) Message[7 - c] = (_SPC_PSW & (1 << c)) ? '1' : '0';
Message[8] = 0;
printf("A:%02X X:%02X Y:%02X %s\n",
(unsigned) _SPC_A, (unsigned) _SPC_X, (unsigned) _SPC_Y, Message);
printf("SPC R 0:%02X 1:%02X 2:%02X 3:%02X\n",
(unsigned) SPC_PORT0R, (unsigned) SPC_PORT1R,
(unsigned) SPC_PORT2R, (unsigned) SPC_PORT3R);
printf("SPC W 0:%02X 1:%02X 2:%02X 3:%02X\n",
(unsigned) SPC_PORT0W, (unsigned) SPC_PORT1W,
(unsigned) SPC_PORT2W, (unsigned) SPC_PORT3W);
printf("SPC counters:%1X %1X %1X targets:%02X %02X %02X CTRL:%02X\n",
SPC_T0_counter, SPC_T1_counter, SPC_T2_counter,
SPC_T0_target & 0xFF, SPC_T1_target & 0xFF, SPC_T2_target & 0xFF,
SPC_CTRL);
}
/* Simple at present... register dump will be done l8r */
void InvalidSPCOpcode()
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
DisplaySPC();
printf("Unemulated SPC opcode 0x%02X (%s)\n",
(unsigned) Map_Byte, SPC_OpID[Map_Byte]);
printf("At address 0x%04X\n", (unsigned) (Map_Address & 0xFFFF));
#ifdef DEBUG
printf("Old Address 0x%04X\n", OLD_SPC_ADDRESS);
save_debug_dumps();
#endif
exit(1);
}
RGB DebugPal[]={{63,63,63,0}};
unsigned char DEBUG_STRING[]="Voice : %d";
unsigned char DEBUG_VALUE1=0;
unsigned char DEBUG_VALUE2=0;
unsigned char DEBUG_VALUE3=0;
unsigned char DEBUG_VALUE4=0;
unsigned char DEBUG_VALUE5=0;
unsigned char DEBUG_VALUE6=0;
unsigned char DEBUG_VALUE7=0;
unsigned char DEBUG_VALUE8=0;
extern unsigned Timer_Counter_Throttle;
void Display_Debug()
{
/*
set_palette_range(&DebugPal[-255],255,255,TRUE); // Set the GUI palette up.
textprintf(screen,font,50,50,255,"Throttle: %u",Timer_Counter_Throttle);
textprintf(screen,font,50,50,255,DEBUG_STRING,(int)DEBUG_VALUE1);
textprintf(screen,font,50,60,255,DEBUG_STRING,(int)DEBUG_VALUE2);
textprintf(screen,font,50,70,255,DEBUG_STRING,(int)DEBUG_VALUE3);
textprintf(screen,font,50,80,255,DEBUG_STRING,(int)DEBUG_VALUE4);
textprintf(screen,font,50,90,255,DEBUG_STRING,(int)DEBUG_VALUE5);
textprintf(screen,font,50,100,255,DEBUG_STRING,(int)DEBUG_VALUE6);
textprintf(screen,font,50,110,255,DEBUG_STRING,(int)DEBUG_VALUE7);
textprintf(screen,font,50,120,255,DEBUG_STRING,(int)DEBUG_VALUE8);
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -