diff options
Diffstat (limited to 'source/debug.cpp')
-rw-r--r-- | source/debug.cpp | 2220 |
1 files changed, 0 insertions, 2220 deletions
diff --git a/source/debug.cpp b/source/debug.cpp deleted file mode 100644 index 6ea02e9..0000000 --- a/source/debug.cpp +++ /dev/null @@ -1,2220 +0,0 @@ -/******************************************************************************* - Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. - - (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and - Jerremy Koot (jkoot@snes9x.com) - - (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) - - (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), - funkyass (funkyass@spam.shaw.ca), - Joel Yliluoma (http://iki.fi/bisqwit/) - Kris Bleakley (codeviolation@hotmail.com), - Matthew Kendora, - Nach (n-a-c-h@users.sourceforge.net), - Peter Bortas (peter@bortas.org) and - zones (kasumitokoduck@yahoo.com) - - C4 x86 assembler and some C emulation code - (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), - _Demo_ (_demo_@zsnes.com), and Nach - - C4 C++ code - (c) Copyright 2003 Brad Jorsch - - DSP-1 emulator code - (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, - John Weidman, neviksti (neviksti@hotmail.com), - Kris Bleakley, Andreas Naive - - DSP-2 emulator code - (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and - Lord Nightmare (lord_nightmare@users.sourceforge.net - - OBC1 emulator code - (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and - Kris Bleakley - Ported from x86 assembler to C by sanmaiwashi - - SPC7110 and RTC C++ emulator code - (c) Copyright 2002 Matthew Kendora with research by - zsKnight, John Weidman, and Dark Force - - S-DD1 C emulator code - (c) Copyright 2003 Brad Jorsch with research by - Andreas Naive and John Weidman - - S-RTC C emulator code - (c) Copyright 2001 John Weidman - - ST010 C++ emulator code - (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora - - Super FX x86 assembler emulator code - (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault - - Super FX C emulator code - (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman - - - SH assembler code partly based on x86 assembler code - (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) - - - Specific ports contains the works of other authors. See headers in - individual files. - - Snes9x homepage: http://www.snes9x.com - - Permission to use, copy, modify and distribute Snes9x in both binary and - source form, for non-commercial purposes, is hereby granted without fee, - providing that this license information and copyright notice appear with - all copies and any derived work. - - This software is provided 'as-is', without any express or implied - warranty. In no event shall the authors be held liable for any damages - arising from the use of this software. - - Snes9x is freeware for PERSONAL USE only. Commercial users should - seek permission of the copyright holders first. Commercial use includes - charging money for Snes9x or software derived from Snes9x. - - The copyright holders request that bug fixes and improvements to the code - should be forwarded to them so everyone can benefit from the modifications - in future versions. - - Super NES and Super Nintendo Entertainment System are trademarks of - Nintendo Co., Limited and its subsidiary companies. -*******************************************************************************/ - -#include <string.h> -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif - -#include "snes9x.h" -#include "memmap.h" -#include "cpuops.h" -#include "cheats.h" -#include "ppu.h" -#include "cpuexec.h" -#include "debug.h" -#include "missing.h" -#include "display.h" -#include "apu.h" -#include "sa1.h" -#include "spc7110.h" - -#ifdef DEBUGGER -static void WhatsMissing (); -static void WhatsUsed (); -EXTERN_C SDMA DMA[8]; -extern struct SCheatData Cheat; - -#ifdef SPCTOOL -#include "spctool/spc700.h" -extern "C" void TraceSPC (unsigned char *PC, unsigned short YA, unsigned char X, - SPCFlags PS, unsigned char *SP); -#endif - -FILE *trace = NULL; -FILE *trace2 = NULL; -struct SBreakPoint S9xBreakpoint[6]; -struct SDebug -{ - struct - { - uint8 Bank; - uint16 Address; - } Dump; - struct - { - uint8 Bank; - uint16 Address; - } Unassemble; -} Debug = -{ - { - 0, 0 - }, - { - 0, 0 - } -}; -char *HelpMessage[] = { - "Command Help:", - "? - Shows this Command Help", - "r - Shows the Registers", - "i - Shows the interrupt vectors", - "t - Trace current instruction [Step-into]", - "T - Toggle CPU instruction tracing to trace.log", - "D - Toggle DMA tracing to stdout", - "H - Toggle H-DMA tracing to stdout", - "P - Toggle DSP tracing to stdout", - "U - Toggle unknown register read/write tracing", - "V - Toggle non-DMA V-RAM read/write tracing", - "R - Reset ROM.", - "p - Proceed to next instruction [Step-over]", - "s - Skip to next instruction [Skip]", - "S - dump sprite (OBJ) status", - "g [Address] - Go or Go to [Address]", - "u [Address] - Disassemble from PC or [Address]", - "d [Address] - Dump from PC or [Address]", - "bv [Number] - View Breakpoints or View Breakpoint [Number]", - "bs [Number] [Address] - Enable/Disable Breakpoint", - " [Enable example: BS #2 $02:8002]", - " [Disable example: BS #2]", - "c - Dump SNES colour palette", - "W - Show what SNES hardware features a ROM is using", - " which might not be implemented yet.", - "w - Show some SNES hardware features used so far in this frame", - "q - Quit emulator", - "", - "[Address] - $Bank:Address or $Address", - " [For example: $01:8123]", - "[Number] - #Number", - " [For example: #1]", - "a - Show Sound CPU status", - "A - Toggle sound CPU instruction tracing to aputrace.log", - "B - Toggle sound DSP register tracing", - "C - Dump sound sample addresses", - "ad [Address] - Dump sound CPU RAM from PC or [Address]", - "", NULL}; - -char *S9xMnemonics[256] = { - "BRK", "ORA", "COP", "ORA", "TSB", "ORA", "ASL", "ORA", - "PHP", "ORA", "ASL", "PHD", "TSB", "ORA", "ASL", "ORA", - "BPL", "ORA", "ORA", "ORA", "TRB", "ORA", "ASL", "ORA", - "CLC", "ORA", "INC", "TCS", "TRB", "ORA", "ASL", "ORA", - "JSR", "AND", "JSL", "AND", "BIT", "AND", "ROL", "AND", - "PLP", "AND", "ROL", "PLD", "BIT", "AND", "ROL", "AND", - "BMI", "AND", "AND", "AND", "BIT", "AND", "ROL", "AND", - "SEC", "AND", "DEC", "TSC", "BIT", "AND", "ROL", "AND", - "RTI", "EOR", "DB ", "EOR", "MVP", "EOR", "LSR", "EOR", - "PHA", "EOR", "LSR", "PHK", "JMP", "EOR", "LSR", "EOR", - "BVC", "EOR", "EOR", "EOR", "MVN", "EOR", "LSR", "EOR", - "CLI", "EOR", "PHY", "TCD", "JMP", "EOR", "LSR", "EOR", - "RTS", "ADC", "PER", "ADC", "STZ", "ADC", "ROR", "ADC", - "PLA", "ADC", "ROR", "RTL", "JMP", "ADC", "ROR", "ADC", - "BVS", "ADC", "ADC", "ADC", "STZ", "ADC", "ROR", "ADC", - "SEI", "ADC", "PLY", "TDC", "JMP", "ADC", "ROR", "ADC", - "BRA", "STA", "BRL", "STA", "STY", "STA", "STX", "STA", - "DEY", "BIT", "TXA", "PHB", "STY", "STA", "STX", "STA", - "BCC", "STA", "STA", "STA", "STY", "STA", "STX", "STA", - "TYA", "STA", "TXS", "TXY", "STZ", "STA", "STZ", "STA", - "LDY", "LDA", "LDX", "LDA", "LDY", "LDA", "LDX", "LDA", - "TAY", "LDA", "TAX", "PLB", "LDY", "LDA", "LDX", "LDA", - "BCS", "LDA", "LDA", "LDA", "LDY", "LDA", "LDX", "LDA", - "CLV", "LDA", "TSX", "TYX", "LDY", "LDA", "LDX", "LDA", - "CPY", "CMP", "REP", "CMP", "CPY", "CMP", "DEC", "CMP", - "INY", "CMP", "DEX", "WAI", "CPY", "CMP", "DEC", "CMP", - "BNE", "CMP", "CMP", "CMP", "PEI", "CMP", "DEC", "CMP", - "CLD", "CMP", "PHX", "STP", "JML", "CMP", "DEC", "CMP", - "CPX", "SBC", "SEP", "SBC", "CPX", "SBC", "INC", "SBC", - "INX", "SBC", "NOP", "XBA", "CPX", "SBC", "INC", "SBC", - "BEQ", "SBC", "SBC", "SBC", "PEA", "SBC", "INC", "SBC", - "SED", "SBC", "PLX", "XCE", "JSR", "SBC", "INC", "SBC" -}; -int AddrModes[256] = { - //0 1 2 3 4 5 6 7 8 9 A B C D E F - 3, 10, 3, 19, 6, 6, 6, 12, 0, 1,24, 0, 14, 14, 14, 17, //0 - 4, 11, 9, 20, 6, 7, 7, 13, 0, 16,24, 0, 14, 15, 15, 18, //1 - 14, 10,17, 19, 6, 6, 6, 12, 0, 1,24, 0, 14, 14, 14, 17, //2 - 4, 11, 9, 20, 7, 7, 7, 13, 0, 16,24, 0, 15, 15, 15, 18, //3 - 0, 10, 3, 19, 25,6, 6, 12, 0, 1,24, 0, 14, 14, 14, 17, //4 - 4, 11, 9, 20, 25,7, 7, 13, 0, 16, 0, 0, 17, 15, 15, 18, //5 - 0, 10, 5, 19, 6, 6, 6, 12, 0, 1,24, 0, 21, 14, 14, 17, //6 - 4, 11, 9, 20, 7, 7, 7, 13, 0, 16, 0, 0, 23, 15, 15, 18, //7 - 4, 10, 5, 19, 6, 6, 6, 12, 0, 1, 0, 0, 14, 14, 14, 17, //8 - 4, 11, 9, 20, 7, 7, 8, 13, 0, 16, 0, 0, 14, 15, 15, 18, //9 - 2, 10, 2, 19, 6, 6, 6, 12, 0, 1, 0, 0, 14, 14, 14, 17, //A - 4, 11, 9, 20, 7, 7, 8, 13, 0, 16, 0, 0, 15, 15, 16, 18, //B - 2, 10, 3, 19, 6, 6, 6, 12, 0, 1, 0, 0, 14, 14, 14, 17, //C - 4, 11, 9, 9, 0, 7, 7, 13, 0, 16, 0, 0, 22, 15, 15, 18, //D - 2, 10, 3, 19, 6, 6, 6, 12, 0, 1, 0, 0, 14, 14, 14, 17, //E - 4, 11, 9, 20,14, 7, 7, 13, 0, 16, 0, 0, 23, 15, 15, 18 //F -}; - -uint8 S9xOPrint (char *Line, uint8 Bank, uint16 Address) -{ - uint8 S9xOpcode; - uint8 Operant[3]; - uint16 Word; - uint8 Byte; - uint8 Size = 0; - char SByte; - short SWord; - -#if 0 - sprintf (Line, "%04X%04X%04X%04X%02X%04X%c%c%c%c%c%c%c%c%c%03d%03d", - Registers.A.W, Registers.X.W, Registers.Y.W, - Registers.D.W, Registers.DB, Registers.S.W, - CheckEmulation () ? 'E' : 'e', - CheckNegative () ? 'N' : 'n', - CheckOverflow () ? 'V' : 'v', - CheckMemory () ? 'M' : 'm', - CheckIndex () ? 'X' : 'x', - CheckDecimal () ? 'D' : 'd', - CheckIRQ () ? 'I' : 'i', - CheckZero () ? 'Z' : 'z', - CheckCarry () ? 'C' : 'c', - CPU.Cycles, - CPU.V_Counter); - return (0); - -#else - uint32 Cycles = CPU.Cycles; - uint8 *WaitAddress = CPU.WaitAddress; - - S9xOpcode = S9xGetByte ((Bank << 16) + Address); - sprintf (Line, "$%02X:%04X %02X ", Bank, Address, S9xOpcode); - Operant[0] = S9xGetByte ((Bank << 16) + Address + 1); - Operant[1] = S9xGetByte ((Bank << 16) + Address + 2); - Operant[2] = S9xGetByte ((Bank << 16) + Address + 3); - - switch (AddrModes[S9xOpcode]) - { - case 0: - //Implied - sprintf (Line, "%s %s", Line, S9xMnemonics[S9xOpcode]); - Size = 1; - break; - case 1: - //Immediate[MemoryFlag] - if (!CheckFlag (MemoryFlag)) - { - //Accumulator 16 - Bit - sprintf (Line, "%s%02X %02X %s #$%02X%02X", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Size = 3; - } - else - { - //Accumulator 8 - Bit - sprintf (Line, "%s%02X %s #$%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Size = 2; - } - break; - case 2: - //Immediate[IndexFlag] - if (!CheckFlag (IndexFlag)) - { - //X / Y 16 - Bit - sprintf (Line, "%s%02X %02X %s #$%02X%02X", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Size = 3; - } - else - { - //X / Y 8 - Bit - sprintf (Line, "%s%02X %s #$%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Size = 2; - } - break; - case 3: - //Immediate[Always 8 - Bit] - if (1) - { - //Always 8 - Bit - sprintf (Line, "%s%02X %s #$%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Size = 2; - } - break; - case 4: - //Relative - sprintf (Line, "%s%02X %s $%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - SByte = Operant[0]; - Word = Address; - Word += SByte; - Word += 2; - sprintf (Line, "%-32s[$%04X]", Line, Word); - Size = 2; - break; - case 5: - //Relative Long - sprintf (Line, "%s%02X %02X %s $%02X%02X", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - SWord = (Operant[1] << 8) | Operant[0]; - Word = Address; - Word += SWord; - Word += 3; - sprintf (Line, "%-32s[$%04X]", Line, Word); - Size = 3; - break; - case 6: - //Direct - sprintf (Line, "%s%02X %s $%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += Registers.D.W; - sprintf (Line, "%-32s[$00:%04X]", Line, Word); - Size = 2; - break; - case 7: - //Direct indexed (with x) - sprintf (Line, "%s%02X %s $%02X,x", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += Registers.D.W; - Word += Registers.X.W; - sprintf (Line, "%-32s[$00:%04X]", Line, Word); - Size = 2; - break; - case 8: - //Direct indexed (with y) - sprintf (Line, "%s%02X %s $%02X,y", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += Registers.D.W; - Word += Registers.Y.W; - sprintf (Line, "%-32s[$00:%04X]", Line, Word); - Size = 2; - break; - case 9: - //Direct Indirect - sprintf (Line, "%s%02X %s ($%02X)", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += Registers.D.W; - Word = S9xGetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.DB, Word); - Size = 2; - break; - case 10: - //Direct Indexed Indirect - sprintf (Line, "%s%02X %s ($%02X,x)", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += Registers.D.W; - Word += Registers.X.W; - Word = S9xGetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.DB, Word); - Size = 2; - break; - case 11: - //Direct Indirect Indexed - sprintf (Line, "%s%02X %s ($%02X),y", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += Registers.D.W; - Word = S9xGetWord (Word); - Word += Registers.Y.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.DB, Word); - Size = 2; - break; - case 12: - //Direct Indirect Long - sprintf (Line, "%s%02X %s [$%02X]", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += Registers.D.W; - Byte = S9xGetByte (Word + 2); - Word = S9xGetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word); - Size = 2; - break; - case 13: - //Direct Indirect Indexed Long - sprintf (Line, "%s%02X %s [$%02X],y", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += Registers.D.W; - Byte = S9xGetByte (Word + 2); - Word = S9xGetWord (Word); - Word += Registers.Y.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word); - Size = 2; - break; - case 14: - //Absolute - sprintf (Line, "%s%02X %02X %s $%02X%02X", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.DB, Word); - Size = 3; - break; - case 15: - //Absolute Indexed (With X) - sprintf (Line, "%s%02X %02X %s $%02X%02X,x", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word += Registers.X.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.DB, Word); - Size = 3; - break; - case 16: - //Absolute Indexed (With Y) - sprintf (Line, "%s%02X %02X %s $%02X%02X,y", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word += Registers.Y.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.DB, Word); - Size = 3; - break; - case 17: - //Absolute long - sprintf (Line, "%s%02X %02X %02X %s $%02X%02X%02X", - Line, - Operant[0], - Operant[1], - Operant[2], - S9xMnemonics[S9xOpcode], - Operant[2], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Operant[2], Word); - Size = 4; - break; - case 18: - //Absolute Indexed long - sprintf (Line, "%s%02X %02X %02X %s $%02X%02X%02X,x", - Line, - Operant[0], - Operant[1], - Operant[2], - S9xMnemonics[S9xOpcode], - Operant[2], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word += Registers.X.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Operant[2], Word); - Size = 4; - break; - case 19: - //StackRelative - sprintf (Line, "%s%02X %s $%02X,s", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Registers.S.W; - Word += Operant[0]; - sprintf (Line, "%-32s[$00:%04X]", Line, Word); - Size = 2; - break; - case 20: - //Stack Relative Indirect Indexed - sprintf (Line, "%s%02X %s ($%02X,s),y", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Registers.S.W; - Word += Operant[0]; - Word = S9xGetWord (Word); - Word += Registers.Y.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.DB, Word); - Size = 2; - break; - case 21: - //Absolute Indirect - sprintf (Line, "%s%02X %02X %s ($%02X%02X)", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word = S9xGetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.PB, Word); - Size = 3; - break; - case 22: - //Absolute Indirect Long - sprintf (Line, "%s%02X %02X %s [$%02X%02X]", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Byte = S9xGetByte (Word + 2); - Word = S9xGetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word); - Size = 3; - break; - case 23: - //Absolute Indexed Indirect - sprintf (Line, "%s%02X %02X %s ($%02X%02X,x)", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word += Registers.X.W; - Word = S9xGetWord (ICPU.ShiftedPB + Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.PB, Word); - Size = 3; - break; - case 24: - //Implied accumulator - sprintf (Line, "%s %s A", Line, S9xMnemonics[S9xOpcode]); - Size = 1; - break; - case 25: - // MVN/MVP SRC DST - sprintf (Line, "%s %s %02X %02X", Line, S9xMnemonics[S9xOpcode], - Operant[0], Operant[1]); - Size = 3; - break; - } -// XXX: - sprintf (Line, "%-44s A:%04X X:%04X Y:%04X D:%04X DB:%02X S:%04X P:%c%c%c%c%c%c%c%c%c HC:%03d VC:%03ld %02x", - Line, Registers.A.W, Registers.X.W, Registers.Y.W, - Registers.D.W, Registers.DB, Registers.S.W, - CheckEmulation () ? 'E' : 'e', - CheckNegative () ? 'N' : 'n', - CheckOverflow () ? 'V' : 'v', - CheckMemory () ? 'M' : 'm', - CheckIndex () ? 'X' : 'x', - CheckDecimal () ? 'D' : 'd', - CheckIRQ () ? 'I' : 'i', - CheckZero () ? 'Z' : 'z', - CheckCarry () ? 'C' : 'c', - Cycles, - CPU.V_Counter, - CPU.IRQActive); - - CPU.Cycles = Cycles; - CPU.WaitAddress = WaitAddress; - return Size; -#endif -} - -uint8 S9xSA1OPrint (char *Line, uint8 Bank, uint16 Address) -{ - uint8 S9xOpcode; - uint8 Operant[3]; - uint16 Word; - uint8 Byte; - uint8 Size = 0; - char SByte; - short SWord; - -#if 0 - sprintf (Line, "%04X%04X%04X%04X%02X%04X%c%c%c%c%c%c%c%c%c%03d%03d", - SA1Registers.A.W, SA1Registers.X.W, SA1Registers.Y.W, - SA1Registers.D.W, SA1Registers.DB, SA1Registers.S.W, - SA1CheckEmulation () ? 'E' : 'e', - SA1CheckNegative () ? 'N' : 'n', - SA1CheckOverflow () ? 'V' : 'v', - SA1CheckMemory () ? 'M' : 'm', - SA1CheckIndex () ? 'X' : 'x', - SA1CheckDecimal () ? 'D' : 'd', - SA1CheckIRQ () ? 'I' : 'i', - SA1CheckZero () ? 'Z' : 'z', - SA1CheckCarry () ? 'C' : 'c', - CPU.Cycles, - CPU.V_Counter); - return (0); - -#else - S9xOpcode = S9xSA1GetByte ((Bank << 16) + Address); - sprintf (Line, "$%02X:%04X %02X ", Bank, Address, S9xOpcode); - Operant[0] = S9xSA1GetByte ((Bank << 16) + Address + 1); - Operant[1] = S9xSA1GetByte ((Bank << 16) + Address + 2); - Operant[2] = S9xSA1GetByte ((Bank << 16) + Address + 3); - - switch (AddrModes[S9xOpcode]) - { - case 0: - //Implied - sprintf (Line, "%s %s", Line, S9xMnemonics[S9xOpcode]); - Size = 1; - break; - case 1: - //Immediate[MemoryFlag] - if (!SA1CheckFlag (MemoryFlag)) - { - //Accumulator 16 - Bit - sprintf (Line, "%s%02X %02X %s #$%02X%02X", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Size = 3; - } - else - { - //Accumulator 8 - Bit - sprintf (Line, "%s%02X %s #$%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Size = 2; - } - break; - case 2: - //Immediate[IndexFlag] - if (!SA1CheckFlag (IndexFlag)) - { - //X / Y 16 - Bit - sprintf (Line, "%s%02X %02X %s #$%02X%02X", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Size = 3; - } - else - { - //X / Y 8 - Bit - sprintf (Line, "%s%02X %s #$%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Size = 2; - } - break; - case 3: - //Immediate[Always 8 - Bit] - if (1) - { - //Always 8 - Bit - sprintf (Line, "%s%02X %s #$%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Size = 2; - } - break; - case 4: - //Relative - sprintf (Line, "%s%02X %s $%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - SByte = Operant[0]; - Word = Address; - Word += SByte; - Word += 2; - sprintf (Line, "%-32s[$%04X]", Line, Word); - Size = 2; - break; - case 5: - //Relative Long - sprintf (Line, "%s%02X %02X %s $%02X%02X", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - SWord = (Operant[1] << 8) | Operant[0]; - Word = Address; - Word += SWord; - Word += 3; - sprintf (Line, "%-32s[$%04X]", Line, Word); - Size = 3; - break; - case 6: - //Direct - sprintf (Line, "%s%02X %s $%02X", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += SA1Registers.D.W; - sprintf (Line, "%-32s[$00:%04X]", Line, Word); - Size = 2; - break; - case 7: - //Direct indexed (with x) - sprintf (Line, "%s%02X %s $%02X,x", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += SA1Registers.D.W; - Word += SA1Registers.X.W; - sprintf (Line, "%-32s[$00:%04X]", Line, Word); - Size = 2; - break; - case 8: - //Direct indexed (with y) - sprintf (Line, "%s%02X %s $%02X,y", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += SA1Registers.D.W; - Word += SA1Registers.Y.W; - sprintf (Line, "%-32s[$00:%04X]", Line, Word); - Size = 2; - break; - case 9: - //Direct Indirect - sprintf (Line, "%s%02X %s ($%02X)", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += SA1Registers.D.W; - Word = S9xSA1GetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word); - Size = 2; - break; - case 10: - //Direct Indexed Indirect - sprintf (Line, "%s%02X %s ($%02X,x)", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += SA1Registers.D.W; - Word += SA1Registers.X.W; - Word = S9xSA1GetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word); - Size = 2; - break; - case 11: - //Direct Indirect Indexed - sprintf (Line, "%s%02X %s ($%02X),y", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += SA1Registers.D.W; - Word = S9xSA1GetWord (Word); - Word += SA1Registers.Y.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word); - Size = 2; - break; - case 12: - //Direct Indirect Long - sprintf (Line, "%s%02X %s [$%02X]", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += SA1Registers.D.W; - Byte = S9xSA1GetByte (Word + 2); - Word = S9xSA1GetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word); - Size = 2; - break; - case 13: - //Direct Indirect Indexed Long - sprintf (Line, "%s%02X %s [$%02X],y", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = Operant[0]; - Word += SA1Registers.D.W; - Byte = S9xSA1GetByte (Word + 2); - Word = S9xSA1GetWord (Word); - Word += SA1Registers.Y.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word); - Size = 2; - break; - case 14: - //Absolute - sprintf (Line, "%s%02X %02X %s $%02X%02X", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word); - Size = 3; - break; - case 15: - //Absolute Indexed (With X) - sprintf (Line, "%s%02X %02X %s $%02X%02X,x", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word += SA1Registers.X.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word); - Size = 3; - break; - case 16: - //Absolute Indexed (With Y) - sprintf (Line, "%s%02X %02X %s $%02X%02X,y", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word += SA1Registers.Y.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word); - Size = 3; - break; - case 17: - //Absolute long - sprintf (Line, "%s%02X %02X %02X %s $%02X%02X%02X", - Line, - Operant[0], - Operant[1], - Operant[2], - S9xMnemonics[S9xOpcode], - Operant[2], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Operant[2], Word); - Size = 4; - break; - case 18: - //Absolute Indexed long - sprintf (Line, "%s%02X %02X %02X %s $%02X%02X%02X,x", - Line, - Operant[0], - Operant[1], - Operant[2], - S9xMnemonics[S9xOpcode], - Operant[2], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word += SA1Registers.X.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, Operant[2], Word); - Size = 4; - break; - case 19: - //StackRelative - sprintf (Line, "%s%02X %s $%02X,s", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = SA1Registers.S.W; - Word += Operant[0]; - sprintf (Line, "%-32s[$00:%04X]", Line, Word); - Size = 2; - break; - case 20: - //Stack Relative Indirect Indexed - sprintf (Line, "%s%02X %s ($%02X,s),y", - Line, - Operant[0], - S9xMnemonics[S9xOpcode], - Operant[0]); - Word = SA1Registers.S.W; - Word += Operant[0]; - Word = S9xSA1GetWord (Word); - Word += SA1Registers.Y.W; - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word); - Size = 2; - break; - case 21: - //Absolute Indirect - sprintf (Line, "%s%02X %02X %s ($%02X%02X)", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word = S9xSA1GetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.PB, Word); - Size = 3; - break; - case 22: - //Absolute Indirect Long - sprintf (Line, "%s%02X %02X %s [$%02X%02X]", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Byte = S9xSA1GetByte (Word + 2); - Word = S9xSA1GetWord (Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word); - Size = 3; - break; - case 23: - //Absolute Indexed Indirect - sprintf (Line, "%s%02X %02X %s ($%02X%02X,x)", - Line, - Operant[0], - Operant[1], - S9xMnemonics[S9xOpcode], - Operant[1], - Operant[0]); - Word = (Operant[1] << 8) | Operant[0]; - Word += SA1Registers.X.W; - Word = S9xSA1GetWord (SA1.ShiftedPB + Word); - sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.PB, Word); - Size = 3; - break; - case 24: - //Implied accumulator - sprintf (Line, "%s %s A", Line, S9xMnemonics[S9xOpcode]); - Size = 1; - break; - case 25: - // MVN/MVP SRC DST - sprintf (Line, "%s %s %02X %02X", Line, S9xMnemonics[S9xOpcode], - Operant[0], Operant[1]); - Size = 3; - break; - } - sprintf (Line, "%-44s A:%04X X:%04X Y:%04X D:%04X DB:%02X S:%04X P:%c%c%c%c%c%c%c%c%c HC:%03ld VC:%03ld", - Line, SA1Registers.A.W, SA1Registers.X.W, SA1Registers.Y.W, - SA1Registers.D.W, SA1Registers.DB, SA1Registers.S.W, - SA1CheckEmulation () ? 'E' : 'e', - SA1CheckNegative () ? 'N' : 'n', - SA1CheckOverflow () ? 'V' : 'v', - SA1CheckMemory () ? 'M' : 'm', - SA1CheckIndex () ? 'X' : 'x', - SA1CheckDecimal () ? 'D' : 'd', - SA1CheckIRQ () ? 'I' : 'i', - SA1CheckZero () ? 'Z' : 'z', - SA1CheckCarry () ? 'C' : 'c', - CPU.Cycles, - CPU.V_Counter); - - return Size; -#endif -} - -/**********************************************************************************************/ -/* DPrint() */ -/* This function prints a line in the debug listbox and deletes upperlines if needed */ -/**********************************************************************************************/ -void DPrint (char *Line) -{ - printf ("%s\n", Line); -} -/**********************************************************************************************/ -/* GetNumber() */ -/* This function gets a number from a debug command */ -/**********************************************************************************************/ -int GetNumber (char *Line, uint16 * Number) -{ - int i; - if (sscanf (Line, " #%d", &i) == 1) - { - *Number = i; - return (1); - } - return (-1); -} -/**********************************************************************************************/ -/* GetStartAddress() */ -/* This function gets a starting address from a debug command */ -/**********************************************************************************************/ -short GetStartAddress (char *Line, uint8 *Bank, uint32 *Address) -{ - int a, b; - if (sscanf (Line + 1, " $%x:%x", &b, &a) != 2) - return (-1); - *Bank = b; - *Address = a; - return (1); -} -/**********************************************************************************************/ -/* ProcessDebugCommand() */ -/* This function processes a debug command */ -/**********************************************************************************************/ -void ProcessDebugCommand (char *Line) -{ - uint8 Bank = Registers.PB; - uint32 Address = CPU.PC - CPU.PCBase; - uint16 Hold; - uint16 Number; - char String [512]; - short ErrorCode; - - if (strcasecmp (Line, "cheat") == 0) - { - S9xStartCheatSearch (&Cheat); - printf ("Cheat Search Started\n"); - return; - } - if (strcasecmp (Line, "less") == 0) - { - S9xSearchForChange (&Cheat, S9X_LESS_THAN, S9X_8_BITS, FALSE, TRUE); - printf ("Recorded all values that have decreased\n"); - return; - } - if (strcasecmp (Line, "print") == 0) - { - printf ("Cheat search results:\n"); - S9xOutputCheatSearchResults (&Cheat); - return; - } - - if (strncasecmp (Line, "constant", 8) == 0) - { - uint32 Byte; - if (sscanf (&Line [8], "%x %x", &Address, &Byte) == 2) - S9xAddCheat (TRUE, TRUE, Address, Byte); - return; - } - - if (strncasecmp (Line, "dump", 4) == 0) - { - int Count; - if (sscanf (&Line [4], "%x %d", &Address, &Count) == 2) - { - sprintf (String, "%06x%05d.sd2", Address, Count); - FILE *fs = fopen (String, "wb"); - if (fs) - { - int i; - for (i = 0; i < Count; i++) - putc (S9xGetByte (Address + i), fs); - - fclose (fs); - } - else - printf ("Can't open %s for writing\n", String); - } - else - printf ("Usage: dump start_address_in_hex count_in_decimal\n"); - return; - } - if (Line[0] == 'i') - { - printf ("Vectors:\n"); - sprintf (String, " 8 Bit 16 Bit "); - DPrint (String); - sprintf (String, "ABT $00:%04X|$00:%04X", S9xGetWord (0xFFF8), S9xGetWord (0xFFE8)); - DPrint (String); - sprintf (String, "BRK $00:%04X|$00:%04X", S9xGetWord (0xFFFE), S9xGetWord (0xFFE6)); - DPrint (String); - sprintf (String, "COP $00:%04X|$00:%04X", S9xGetWord (0xFFF4), S9xGetWord (0xFFE4)); - DPrint (String); - sprintf (String, "IRQ $00:%04X|$00:%04X", S9xGetWord (0xFFFE), S9xGetWord (0xFFEE)); - DPrint (String); - sprintf (String, "NMI $00:%04X|$00:%04X", S9xGetWord (0xFFFA), S9xGetWord (0xFFEA)); - DPrint (String); - sprintf (String, "RES $00:%04X", S9xGetWord (0xFFFC)); - DPrint (String); - } - if (strncmp (Line, "ai", 2) == 0) - { - printf ("APU vectors:"); - for (int i = 0; i < 0x40; i += 2) - { - if (i % 16 == 0) - printf ("\n%04x ", 0xffc0 + i); - printf ("%04x ", APU.ExtraRAM [i]); - } - printf ("\n"); - } - if (Line[0] == 's') - { - CPU.PC += S9xOPrint (String, Bank, Address); - Bank = Registers.PB; - Address = CPU.PC - CPU.PCBase; - Line[0] = 'r'; - } - if (Line[0] == 'z') - { - uint16 *p = (uint16 *) &Memory.VRAM [PPU.BG[2].SCBase << 1]; - for (int l = 0; l < 32; l++) - { - for (int c = 0; c < 32; c++, p++) - { - printf ("%04x,", *p++); - } - printf ("\n"); - } - } - if (*Line == 'c') - { - printf ("Colours:\n"); - for (int i = 0; i < 256; i++) - { - printf ("%02x%02x%02x ", PPU.CGDATA[i] & 0x1f, - (PPU.CGDATA[i] >> 5) & 0x1f, - (PPU.CGDATA[i] >> 10) & 0x1f); - } - printf ("\n"); - } - if (*Line == 'S') - { - int SmallWidth, LargeWidth; - int SmallHeight, LargeHeight; - switch ((Memory.FillRAM[0x2101] >> 5) & 7) - { - case 0: - SmallWidth = SmallHeight = 8; - LargeWidth = LargeHeight = 16; - break; - case 1: - SmallWidth = SmallHeight = 8; - LargeWidth = LargeHeight = 32; - break; - case 2: - SmallWidth = SmallHeight = 8; - LargeWidth = LargeHeight = 64; - break; - case 3: - SmallWidth = SmallHeight = 16; - LargeWidth = LargeHeight = 32; - break; - case 4: - SmallWidth = SmallHeight = 16; - LargeWidth = LargeHeight = 64; - break; - default: - case 5: - SmallWidth = SmallHeight = 32; - LargeWidth = LargeHeight = 64; - break; - case 6: - SmallWidth = 16; SmallHeight = 32; - LargeWidth = 32; LargeHeight = 64; - break; - case 7: - SmallWidth = 16; SmallHeight = 32; - LargeWidth = LargeHeight = 32; - break; - } - printf ("Sprites: Small: %dx%d, Large: %dx%d, OAMAddr: 0x%04x, OBJNameBase: 0x%04x, OBJNameSelect: 0x%04x, First: %d\n", - SmallWidth,SmallHeight, LargeWidth,LargeHeight, PPU.OAMAddr, - PPU.OBJNameBase, PPU.OBJNameSelect, PPU.FirstSprite); -// for (int p = 0; p < 4; p++) -// { -// int c = 0; -// int i; -// for (i = 0; GFX.OBJList [i] >= 0; i++) -// { -// if (PPU.OBJ[GFX.OBJList [i]].Priority == p) -// c++; -// } -// printf ("Priority %d: %03d, ", p, c); -// } -// printf ("\n"); - for (int i = 0; i < 128; i++) - { - printf ("X:%3d Y:%3d %c%c%d%c ", - PPU.OBJ[i].HPos, - PPU.OBJ[i].VPos, - PPU.OBJ[i].VFlip ? 'V' : 'v', - PPU.OBJ[i].HFlip ? 'H' : 'h', - PPU.OBJ[i].Priority, - PPU.OBJ[i].Size ? 'S' : 's'); - if (i % 4 == 3) - printf ("\n"); - } - } - if (*Line == 'T') - { - if (Line [1] == 'S') - { - SA1.Flags ^= TRACE_FLAG; - if (SA1.Flags & TRACE_FLAG) - { - printf ("SA1 CPU instruction tracing enabled.\n"); - if (trace2 == NULL) - trace2 = fopen ("trace_sa1.log", "wb"); - } - else - { - printf ("SA1 CPU instruction tracing disabled.\n"); - fclose (trace2); - trace2 = NULL; - } - } - else - { - CPU.Flags ^= TRACE_FLAG; - if (CPU.Flags & TRACE_FLAG) - { - printf ("CPU instruction tracing enabled.\n"); - if (trace == NULL) - trace = fopen ("trace.log", "wb"); - } - else - { - printf ("CPU instruction tracing disabled.\n"); - fclose (trace); - trace = NULL; - } - } - } - if (*Line == 'A') - { - APU.Flags ^= TRACE_FLAG; - - extern FILE *apu_trace; - if (APU.Flags & TRACE_FLAG) - { -#ifdef SPCTOOL - printf ("ENABLED\n"); - _SetSPCDbg (TraceSPC); //Install debug handler -#endif - if (apu_trace == NULL) - apu_trace = fopen ("aputrace.log", "wb"); - } - else - { -#ifdef SPCTOOL - _SetSPCDbg (NULL); -#endif - if (apu_trace) - { - fclose (apu_trace); - apu_trace = NULL; - } - } - - printf ("APU tracing %s\n", APU.Flags & TRACE_FLAG ? "enabled" : - "disabled"); - } - if (*Line == 'B') - { - Settings.TraceSoundDSP ^= 1; - printf ("Sound DSP register tracing %s\n", Settings.TraceSoundDSP ? - "enabled" : "disabled"); - - S9xOpenCloseSoundTracingFile (Settings.TraceSoundDSP); - } - - if (*Line == 'b') - S9xPrintAPUState (); - - if (*Line == 'C') - { - printf ("SPC700 sample addresses at 0x%04x:\n", APU.DSP [APU_DIR] << 8); - for (int i = 0; i < 256; i++) - { - uint8 *dir = IAPU.RAM + - (((APU.DSP [APU_DIR] << 8) + - i * 4) & 0xffff); - int addr = *dir + (*(dir + 1) << 8); - int addr2 = *(dir + 2) + (*(dir + 3) << 8); - printf ("%04X %04X;", addr, addr2); - if (i % 8 == 7) - printf ("\n"); - } - } - if (*Line == 'R') - { - S9xReset (); - printf ("SNES reset.\n"); - CPU.Flags |= DEBUG_MODE_FLAG; - } - if (strncmp (Line, "ad", 2) == 0) - { - int Count = 16; - Address = 0; - if (sscanf (Line+2, "%x,%x", &Address, &Count) != 2) - { - if (sscanf (Line + 2, "%x", &Address) == 1) - Count = 16; - } - printf ("APU RAM dump:\n"); - for (int l = 0; l < Count; l += 16) - { - printf ("%04X ", Address); - for (int i = 0; i < 16; i++) - printf ("%02X ", IAPU.RAM [Address++]); - printf ("\n"); - } - *Line = 0; - } - if (*Line == 'a') - { - printf ("APU in-ports: %02X %02X %02X %02X\n", - IAPU.RAM [0xF4], IAPU.RAM [0xF5], IAPU.RAM [0xF6], IAPU.RAM [0xF7]); -#ifdef SPCTOOL - printf ("APU out-ports: %02X %02X %02X %02X\n", - _SPCOutP [0], _SPCOutP [1], _SPCOutP [2], _SPCOutP [3]); -#else - printf ("APU out-ports: %02X %02X %02X %02X\n", - APU.OutPorts [0], APU.OutPorts [1], APU.OutPorts [2], APU.OutPorts [3]); -#endif - printf ("ROM/RAM switch: %s\n", (IAPU.RAM [0xf1] & 0x80) ? "ROM" : "RAM"); - for (int i = 0; i < 3; i++) - if (APU.TimerEnabled [i]) - printf ("Timer%d enabled, Value: 0x%03X, 4-bit: 0x%02X, Target: 0x%03X\n", - i, APU.Timer [i], IAPU.RAM [0xfd + i], APU.TimerTarget [i]); - } - if (*Line == 'P') - { - Settings.TraceDSP = !Settings.TraceDSP; - printf ("DSP tracing %s\n", Settings.TraceDSP ? "enabled" : "disabled"); - } - if (Line[0] == 'p') - { - S9xBreakpoint[5].Enabled = FALSE; - Address += S9xOPrint (String, Bank, Address); - if (strncmp (&String[18], "JMP", 3) != 0 && - strncmp (&String[18], "JML", 3) != 0 && - strncmp (&String[18], "RT", 2) != 0 && - strncmp (&String[18], "BRA", 3)) - { - S9xBreakpoint[5].Enabled = TRUE; - S9xBreakpoint[5].Bank = Bank; - S9xBreakpoint[5].Address = Address; - } - else - { - CPU.Flags |= SINGLE_STEP_FLAG; - CPU.Flags &= ~DEBUG_MODE_FLAG; - } - } - if (Line[0] == 'b') - { - if (Line[1] == 's') - { - GetNumber (Line + 2, &Hold); - if (Hold > 4) - Hold = 0; - if (Hold < 5) - if (GetStartAddress (Line + 5, &Bank, &Address) == -1) - { - //Clear S9xBreakpoint - S9xBreakpoint[Hold].Enabled = FALSE; - } - else - { - //Set S9xBreakpoint - S9xBreakpoint[Hold].Enabled = TRUE; - S9xBreakpoint[Hold].Bank = Bank; - S9xBreakpoint[Hold].Address = Address; - CPU.Flags |= BREAK_FLAG; - } - Line = "bv"; - } - if (Line[1] == 'v') - { - Number = 0; - if (GetNumber (Line + 2, &Number) == -1 && - Number < 5) - { - //Show All Breakpoints - DPrint ("Breakpoints:"); - for (Number = 0; Number != 5; Number++) - { - if (S9xBreakpoint[Number].Enabled) - sprintf (String, "%i @ $%02X:%04X", Number, S9xBreakpoint[Number].Bank, S9xBreakpoint[Number].Address); - else - sprintf (String, "%i @ Disabled", Number); - DPrint (String); - } - } - else - { - //Show selected S9xBreakpoint - DPrint ("Breakpoint:"); - if (S9xBreakpoint[Number].Enabled) - sprintf (String, "%i @ $%02X:%04X", Number, S9xBreakpoint[Number].Bank, S9xBreakpoint[Number].Address); - else - sprintf (String, "%i @ Disabled", Number); - DPrint (String); - } - } - } - if (Line[0] == '?' || strcasecmp (Line, "help") == 0) - { - for (short Counter = 0; HelpMessage[Counter] != NULL; Counter++) - DPrint (HelpMessage[Counter]); - } - if (Line[0] == 't') - { - CPU.Flags |= SINGLE_STEP_FLAG; - CPU.Flags &= ~DEBUG_MODE_FLAG; - } - if (Line[0] == 'f') - { - CPU.Flags |= FRAME_ADVANCE_FLAG; - CPU.Flags &= ~DEBUG_MODE_FLAG; - // Render this frame - IPPU.RenderThisFrame = TRUE; - IPPU.FrameSkip = 0; - if (sscanf (&Line [1], "%d", &ICPU.FrameAdvanceCount) != 1) - ICPU.Frame = 0; - } - - if (Line[0] == 'g') - { - S9xBreakpoint[5].Enabled = FALSE; - int i; - bool8 found = FALSE; - for (i = 0; i < 5; i++) - { - if (S9xBreakpoint[i].Enabled) - { - found = TRUE; - if (S9xBreakpoint[i].Bank == Registers.PB && - S9xBreakpoint[i].Address == CPU.PC - CPU.PCBase) - { - S9xBreakpoint[i].Enabled = 2; - break; - } - } - } - if (!found) - CPU.Flags &= ~BREAK_FLAG; - ErrorCode = GetStartAddress (Line, &Bank, &Address); - if (ErrorCode == 1) - { - S9xBreakpoint[5].Enabled = TRUE; - S9xBreakpoint[5].Bank = Bank; - S9xBreakpoint[5].Address = Address; - CPU.Flags |= BREAK_FLAG; - } - CPU.Flags &= ~DEBUG_MODE_FLAG; - } - if (*Line == 'D') - { - Settings.TraceDMA = !Settings.TraceDMA; - printf ("DMA tracing %s\n", Settings.TraceDMA ? "enabled" : "disabled"); - } - if (*Line == 'V') - { - Settings.TraceVRAM = !Settings.TraceVRAM; - printf ("Non-DMA VRAM write tracing %s\n", Settings.TraceVRAM ? "enabled" : "disabled"); - } - if (*Line == 'H') - { - Settings.TraceHDMA = !Settings.TraceHDMA; - printf ("H-DMA tracing %s\n", Settings.TraceHDMA ? "enabled" : "disabled"); - } - if (*Line == 'U') - { - Settings.TraceUnknownRegisters = !Settings.TraceUnknownRegisters; - printf ("Unknown registers read/write tracing %s\n", - Settings.TraceUnknownRegisters ? "enabled" : "disabled"); - } - if (Line[0] == 'd') - { - int CLine; - int CByte; - uint32 Cycles = CPU.Cycles; - uint8 MemoryByte; - - if (Debug.Dump.Bank != 0 || Debug.Dump.Address != 0) - { - Bank = Debug.Dump.Bank; - Address = Debug.Dump.Address; - } - ErrorCode = GetStartAddress (Line, &Bank, &Address); - for (CLine = 0; CLine != 10; CLine++) - { - sprintf (String, "$%02X:%04X", Bank, Address); - for (CByte = 0; CByte != 16; CByte++) - { - if (Address + CByte == 0x2140 || - Address + CByte == 0x2141 || - Address + CByte == 0x2142 || - Address + CByte == 0x2143 || - Address + CByte == 0x4210) - { - MemoryByte = 0; - } - else - { - MemoryByte = S9xGetByte ((Bank << 16) + Address + CByte); - } - sprintf (String, "%s %02X", String, MemoryByte); - } - sprintf (String, "%s-", String); - for (CByte = 0; CByte != 16; CByte++) - { - if (Address + CByte == 0x2140 || - Address + CByte == 0x2141 || - Address + CByte == 0x2142 || - Address + CByte == 0x2143 || - Address + CByte == 0x4210) - { - MemoryByte = 0; - } - else - { - MemoryByte = S9xGetByte ((Bank << 16) + Address + CByte); - } - if (MemoryByte < 32 || MemoryByte >= 127) - MemoryByte = '?'; - sprintf (String, "%s%c", String, MemoryByte); - } - Address += 16; - DPrint (String); - } - Debug.Dump.Bank = Bank; - Debug.Dump.Address = Address; - CPU.Cycles = Cycles; - } - - if (*Line == 'q') - S9xExit (); - if (*Line == 'W') - WhatsMissing (); - if (*Line == 'w') - WhatsUsed (); - if (Line[0] == 'r') - { -#if 0 - sprintf (String, - "A[%04X] X[%04X] Y[%04X] S[%04X] D[%04X] DB[%02X] P[%02X] F[%s %s %s %s %s %s %s %s / %s]", - Registers.A.W, - Registers.X.W, - Registers.Y.W, - Registers.S.W, - Registers.D.W, - Registers.DB, - Registers.PL, - (Registers.P.W & 128) != 0 ? "N" : "n", - (Registers.P.W & 64) != 0 ? "V" : "v", - (Registers.P.W & 32) != 0 ? "M" : "m", - (Registers.P.W & 16) != 0 ? "X" : "x", - (Registers.P.W & 8) != 0 ? "D" : "d", - (Registers.P.W & 4) != 0 ? "I" : "i", - (Registers.P.W & 2) != 0 ? "Z" : "z", - (Registers.P.W & 1) != 0 ? "C" : "c", - (Registers.P.W & 256) != 0 ? "E" : "e"); - DPrint (String); -#endif - S9xOPrint (String, Bank, Address); - DPrint (String); - } - if (Line[0] == 'u') - { - if (Debug.Unassemble.Bank != 0 || Debug.Unassemble.Address != 0) - { - Bank = Debug.Unassemble.Bank; - Address = Debug.Unassemble.Address; - } - ErrorCode = GetStartAddress (Line, &Bank, &Address); - for (short Counter = 0; Counter != 10; Counter++) - { - Address += S9xOPrint (String, Bank, Address); - DPrint (String); - } - Debug.Unassemble.Bank = Bank; - Debug.Unassemble.Address = Address; - } - DPrint (""); - return; -} -static void PrintWindow (uint8 * a) -{ - for (int i = 0; i < 6; i++) - if (a[i]) - switch (i) - { - case 0: - printf ("Background 0, "); - break; - case 1: - printf ("Background 1, "); - break; - case 2: - printf ("Background 2, "); - break; - case 3: - printf ("Background 3, "); - break; - case 4: - printf ("Objects, "); - break; - case 5: - printf ("Colour window, "); - break; - } -} -static char *ClipFn (int logic) -{ - switch (logic) - { - case CLIP_OR: - return ("OR"); - case CLIP_AND: - return ("AND"); - case CLIP_XOR: - return ("XOR"); - case CLIP_XNOR: - return ("XNOR"); - default: - return ("???"); - } -} - -static void WhatsUsed () -{ - printf ("V-line: %ld, H-Pos: %ld\n", CPU.V_Counter, CPU.Cycles); - printf ("Screen mode: %d, ", PPU.BGMode); - if (PPU.BGMode <= 1 && (Memory.FillRAM [0x2105] & 8)) - printf ("(BG#2 Priority)"); - - printf ("Brightness: %d", PPU.Brightness); - if (Memory.FillRAM[0x2100] & 0x80) - printf (" (screen blanked)"); - printf ("\n"); - if (Memory.FillRAM[0x2133] & 1) - printf ("Interlace, "); - if (Memory.FillRAM[0x2133] & 4) - printf ("240 line visible, "); - if (Memory.FillRAM[0x2133] & 8) - printf ("Pseudo 512 pixels horizontal resolution, "); - if (Memory.FillRAM[0x2133] & 0x40) - printf ("Mode 7 priority per pixel, "); - printf ("\n"); - if (PPU.BGMode == 7 && (Memory.FillRAM[0x211a] & 3)) - printf ("Mode 7 flipping, "); - if (PPU.BGMode == 7) - printf ("Mode 7 screen repeat: %d,", (Memory.FillRAM[0x211a] & 0xc0) >> 6); - if (Memory.FillRAM[0x2130] & 1) - printf ("32K colour mode, "); - if (PPU.BGMode == 7) - { - // Sign extend 13 bit values to 16 bit values... - if (PPU.CentreX & (1 << 12)) - PPU.CentreX |= 0xe000; - if (PPU.CentreY & (1 << 12)) - PPU.CentreY |= 0xe000; - - printf ("\nMatrix A: %.3f, B: %.3f, C: %.3f, D: %.3f, Centre X: %d Y:%d\n", - (double) PPU.MatrixA / 256, (double) PPU.MatrixB / 256, - (double) PPU.MatrixC / 256, (double) PPU.MatrixD / 256, - PPU.CentreX, PPU.CentreY); - } - if ((Memory.FillRAM[0x2106] & 0xf0) && (Memory.FillRAM[0x2106] & 0x0f)) - { - printf ("\nMosaic effect(%d) on ", PPU.Mosaic); - for (int i = 0; i < 4; i++) - if (Memory.FillRAM[0x2106] & (1 << i)) - printf ("BG%d,", i); - printf (","); - } - if (PPU.HVBeamCounterLatched) - printf ("V and H beam pos latched, "); - if (Memory.FillRAM[0x4200] & 0x20) - printf ("V-IRQ enabled at %d\n", PPU.IRQVBeamPos); - if (Memory.FillRAM[0x4200] & 0x10) - printf ("H-IRQ enabled at %d\n", PPU.IRQHBeamPos); - if (Memory.FillRAM[0x4200] & 0x80) - printf ("V-blank NMI enabled\n"); - int i; - for (i = 0; i < 8; i++) - { - if (missing.hdma_this_frame & (1 << i)) - { - printf ("H-DMA %d [%d] 0x%02X%04X->0x21%02X %s %s 0x%02X%04X %s addressing\n", - i, DMA[i].TransferMode, - DMA[i].ABank, DMA[i].AAddress, DMA[i].BAddress, - DMA[i].AAddressDecrement ? "dec" : "inc", - DMA[i].Repeat ? "repeat" : "continue", - DMA[i].IndirectBank, DMA[i].IndirectAddress, - DMA[i].HDMAIndirectAddressing ? "indirect" : "absolute"); - } - } - for (i = 0; i < 8; i++) - { - if (missing.dma_this_frame & (1 << i)) - { - printf ("DMA %d %d 0x%02X%04X->0x21%02X Num: %d %s\n", - i, DMA[i].TransferMode, DMA[i].ABank, DMA[i].AAddress, - DMA[i].BAddress, DMA[i].TransferBytes, - DMA[i].AAddressFixed ? "fixed" : - (DMA[i].AAddressDecrement ? "dec" : "inc")); - } - } - printf ("VRAM write address: 0x%04x(%s), Full Graphic: %d, Address inc: %d\n", - PPU.VMA.Address, - PPU.VMA.High ? "Byte" : "Word", - PPU.VMA.FullGraphicCount, PPU.VMA.Increment); - - for (i = 0; i < 4; i++) - { - printf ("BG%d: VOffset:%d, HOffset:%d, W:%d, H:%d, TS:%d, BA:0x%04x, TA:0x%04X\n", - i, PPU.BG[i].VOffset, PPU.BG[i].HOffset, - (PPU.BG[i].SCSize & 1) * 32 + 32, - (PPU.BG[i].SCSize & 2) * 16 + 32, - PPU.BG[i].BGSize * 8 + 8, - PPU.BG[i].SCBase, - PPU.BG[i].NameBase); - } - char *s = ""; - switch ((Memory.FillRAM [0x2130] & 0xc0) >> 6) - { - case 0: s = "always on"; break; - case 1: s = "inside"; break; - case 2: s = "outside"; break; - case 3: s = "always off"; break; - } - printf ("Main screen (%s): ", s); - for (i = 0; i < 5; i++) - if (Memory.FillRAM[0x212c] & (1 << i)) - switch (i) - { - case 0: - printf ("BG0,"); - break; - case 1: - printf ("BG1,"); - break; - case 2: - printf ("BG2,"); - break; - case 3: - printf ("BG3,"); - break; - case 4: - printf ("OBJ,"); - break; - } - - switch ((Memory.FillRAM [0x2130] & 0x30) >> 4) - { - case 0: s = "always on"; break; - case 1: s = "inside"; break; - case 2: s = "outside"; break; - case 3: s = "always off"; break; - } - - printf ("\nSub-screen (%s): ", s); - for (i = 0; i < 5; i++) - if (Memory.FillRAM[0x212d] & (1 << i)) - switch (i) - { - case 0: - printf ("BG0,"); - break; - case 1: - printf ("BG1,"); - break; - case 2: - printf ("BG2,"); - break; - case 3: - printf ("BG3,"); - break; - case 4: - printf ("OBJ,"); - break; - } - printf ("\n"); - if ((Memory.FillRAM[0x2131] & 0x3f)) - { - if (Memory.FillRAM[0x2131] & 0x80) - { - if (Memory.FillRAM[0x2130] & 0x02) - printf ("Subscreen subtract"); - else - printf ("Fixed colour subtract"); - } - else - { - if (Memory.FillRAM[0x2130] & 0x02) - printf ("Subscreen addition"); - else - printf ("Fixed colour addition"); - } - if (Memory.FillRAM [0x2131] & 0x40) - printf ("(half):"); - else - printf (":"); - - for (i = 0; i < 6; i++) - if (Memory.FillRAM[0x2131] & (1 << i)) - { - switch (i) - { - case 0: - printf ("BG0,"); - break; - case 1: - printf ("BG1,"); - break; - case 2: - printf ("BG2,"); - break; - case 3: - printf ("BG3,"); - break; - case 4: - printf ("OBJ,"); - break; - case 5: - printf ("BACK,"); - break; - } - } - printf ("\n"); - } - printf ("\nWindow 1 (%d, %d, %02x, %02x): ", PPU.Window1Left, - PPU.Window1Right, Memory.FillRAM [0x212e], Memory.FillRAM [0x212f]); - for (i = 0; i < 6; i++) - if (PPU.ClipWindow1Enable [i]) - switch (i) - { - case 0: - printf ("BG0(%s-%s),", PPU.ClipWindow1Inside [i] ? "I" : "O", - ClipFn (PPU.ClipWindowOverlapLogic[0])); - break; - case 1: - printf ("BG1(%s-%s),", PPU.ClipWindow1Inside [i] ? "I" : "O", - ClipFn (PPU.ClipWindowOverlapLogic[1])); - break; - case 2: - printf ("BG2(%s-%s),", PPU.ClipWindow1Inside [i] ? "I" : "O", - ClipFn (PPU.ClipWindowOverlapLogic[2])); - break; - case 3: - printf ("BG3(%s-%s),", PPU.ClipWindow1Inside [i] ? "I" : "O", - ClipFn (PPU.ClipWindowOverlapLogic[3])); - break; - case 4: - printf ("OBJ(%s-%s),", PPU.ClipWindow1Inside [i] ? "I" : "O", - ClipFn (PPU.ClipWindowOverlapLogic[4])); - break; - case 5: - printf ("COL(%s-%s)", PPU.ClipWindow1Inside [i] ? "I" : "O", - ClipFn (PPU.ClipWindowOverlapLogic[5])); - break; - } - - printf ("\nWindow 2 (%d, %d): ", PPU.Window2Left, - PPU.Window2Right); - for (i = 0; i < 6; i++) - if (PPU.ClipWindow2Enable [i]) - switch (i) - { - case 0: - printf ("BG0(%s),", PPU.ClipWindow2Inside [i] ? "I" : "O"); - break; - case 1: - printf ("BG1(%s),", PPU.ClipWindow2Inside [i] ? "I" : "O"); - break; - case 2: - printf ("BG2(%s),", PPU.ClipWindow2Inside [i] ? "I" : "O"); - break; - case 3: - printf ("BG3(%s),", PPU.ClipWindow2Inside [i] ? "I" : "O"); - break; - case 4: - printf ("OBJ(%s),", PPU.ClipWindow2Inside [i] ? "I" : "O"); - break; - case 5: - printf ("COL(%s)", PPU.ClipWindow2Inside [i] ? "I" : "O"); - break; - } - - printf ("\nFixed colour: %02x%02x%02x\n", PPU.FixedColourRed, - PPU.FixedColourGreen, PPU.FixedColourBlue); -} - -static void WhatsMissing () -{ - printf ("Processor: "); - if (missing.emulate6502) - printf ("emulation mode, "); - if (missing.decimal_mode) - printf ("decimal mode,"); - if (missing.mv_8bit_index) - printf ("MVP/MVN with 8bit index registers and XH or YH > 0,"); - if (missing.mv_8bit_acc) - printf ("MVP/MVN with 8bit accumulator > 255"); - printf ("\nScreen modes used:"); - int i; - for (i = 0; i < 8; i++) - if (missing.modes[i]) - printf (" %d,", i); - printf ("\n"); - if (missing.interlace) - printf ("Interlace, "); - if (missing.pseudo_512) - printf ("Pseudo 512 pixels horizontal resolution, "); - if (missing.lines_239) - printf ("240 lines visible,"); - if (missing.sprite_double_height) - printf ("double-hight sprites,"); - printf ("\n"); - if (missing.mode7_fx) - printf ("Mode 7 rotation/scaling, "); - if (missing.matrix_read) - printf ("Mode 7 read matrix registers, "); - if (missing.mode7_flip) - printf ("Mode 7 flipping, "); - if (missing.mode7_bgmode) - printf ("Mode 7 priority per pixel, "); - if (missing.direct) - printf ("Direct 32000 colour mode"); - printf ("\n"); - if (missing.mosaic) - printf ("Mosaic effect, "); - if (missing.subscreen) - printf ("Subscreen enabled, "); - if (missing.subscreen_add) - printf ("Subscreen colour add, "); - if (missing.subscreen_sub) - printf ("Subscreen colour subtract, "); - if (missing.fixed_colour_add) - printf ("Fixed colour add, "); - if (missing.fixed_colour_sub) - printf ("Fixed colour subtract"); - printf ("\n"); - printf ("Window 1 enabled on:"); - PrintWindow (missing.window1); - printf ("\nWindow 2 enabled on:"); - PrintWindow (missing.window2); - printf ("\n"); - if (missing.bg_offset_read) - printf ("BG offset read, "); - if (missing.oam_address_read) - printf ("OAM address read,"); - if (missing.sprite_priority_rotation) - printf ("Sprite priority rotation, "); - if (missing.fast_rom) - printf ("Fast 3.58MHz ROM access enabled, "); - if (missing.matrix_multiply) - printf ("Matrix multiply 16bit by 8bit used"); - printf ("\n"); - if (missing.virq) - printf ("V-position IRQ used at line %d, ", missing.virq_pos); - if (missing.hirq) - printf ("H-position IRQ used at position %d, ", missing.hirq_pos); - printf ("\n"); - if (missing.h_v_latch) - printf ("H and V-Pos latched, "); - if (missing.h_counter_read) - printf ("H-Pos read, "); - if (missing.v_counter_read) - printf ("V-Pos read"); - printf ("\n"); - if (missing.oam_read) - printf ("OAM read, "); - if (missing.vram_read) - printf ("VRAM read, "); - if (missing.cgram_read) - printf ("CG-RAM read, "); - if (missing.wram_read) - printf ("WRAM read, "); - if (missing.dma_read) - printf ("DMA read,"); - if (missing.vram_inc) - printf ("VRAM inc: %d,", missing.vram_inc); - if (missing.vram_full_graphic_inc) - printf ("VRAM full graphic inc: %d,", missing.vram_full_graphic_inc); - printf ("\n"); - for (i = 0; i < 8; i++) - { - if (missing.hdma[i].used) - { - printf ("HDMA %d, 0x%02X%04X->0x21%02X %s ", i, - missing.hdma[i].abus_bank, missing.hdma[i].abus_address, - missing.hdma[i].bbus_address, - missing.hdma[i].indirect_address ? "indirect" : "absolute"); - if (missing.hdma[i].force_table_address_write) - printf ("Forced address write, "); - if (missing.hdma[i].force_table_address_read) - printf ("Current address read, "); - if (missing.hdma[i].line_count_write) - printf ("Line count write, "); - if (missing.hdma[i].line_count_read) - printf ("Line count read"); - printf ("\n"); - } - } - for (i = 0; i < 8; i++) - { - if (missing.dma_channels & (1 << i)) - { - printf ("DMA %d %d 0x%02X%04X->0x21%02X Num: %d %s\n", - i, DMA[i].TransferMode, DMA[i].ABank, DMA[i].AAddress, - DMA[i].BAddress, DMA[i].TransferBytes, - DMA[i].AAddressFixed ? "fixed" : - (DMA[i].AAddressDecrement ? "dec" : "inc")); - } - } - if (missing.unknownppu_read) - printf ("Read from unknown PPU register: $%04X\n", missing.unknownppu_read); - if (missing.unknownppu_write) - printf ("Write to unknown PPU register: $%04X\n", missing.unknownppu_write); - if (missing.unknowncpu_read) - printf ("Read from unknown CPU register: $%04X\n", missing.unknowncpu_read); - if (missing.unknowncpu_write) - printf ("Write to unknown CPU register: $%04X\n", missing.unknowncpu_write); - if (missing.unknowndsp_read) - printf ("Read from unknown DSP register: $%04X\n", missing.unknowndsp_read); - if (missing.unknowndsp_write) - printf ("Write to unknown DSP register: $%04X\n", missing.unknowndsp_write); -} - -void S9xDoDebug () -{ - char Line[513]; - Debug.Dump.Bank = 0; - Debug.Dump.Address = 0; - Debug.Unassemble.Bank = 0; - Debug.Unassemble.Address = 0; - S9xTextMode (); - ProcessDebugCommand ("r"); - while (CPU.Flags & DEBUG_MODE_FLAG) - { - printf ("> "); - fflush (stdout); - fgets (Line, sizeof (Line) - 1, stdin); - Line [strlen (Line) - 1] = 0; - ProcessDebugCommand (Line); - } - if (!(CPU.Flags & SINGLE_STEP_FLAG)) - S9xGraphicsMode (); -} - -void S9xTrace () -{ - if(!trace) - trace=fopen("trace.log", "a"); - char String [512]; - S9xOPrint (String, Registers.PB, CPU.PC - CPU.PCBase); - fprintf (trace, "%s\n", String); -} - -void S9xSA1Trace () -{ - char String [512]; - S9xSA1OPrint (String, SA1Registers.PB, SA1.PC - SA1.PCBase); - fprintf (trace2, "%s\n", String); - fflush (trace2); -} - -void S9xTraceMessage (const char *s) -{ - if(s) - { - if (trace) - fprintf (trace, "%s\n", s); - else - if (trace2) - fprintf (trace2, "%s\n", s); - } -} - -extern "C" void TraceSA1 () -{ - SA1.Flags ^= TRACE_FLAG; - if (SA1.Flags & TRACE_FLAG) - { - printf ("SA1 CPU instruction tracing enabled.\n"); - if (trace2 == NULL) - trace2 = fopen ("trace_sa1.log", "wb"); - } - else - { - printf ("SA1 CPU instruction tracing disabled.\n"); - fclose (trace2); - trace2 = NULL; - } -} - -extern "C" void Trace () -{ - CPU.Flags ^= TRACE_FLAG; - if (CPU.Flags & TRACE_FLAG) - { - if (trace == NULL) - trace = fopen ("trace.log", "wb"); - printf ("CPU instruction tracing enabled.\n"); - } - else - { - printf ("CPU instruction tracing disabled.\n"); - fclose (trace); - trace = NULL; - } -} - -#endif - |