This PR is the first of two PRs that replaces earlier PRs #2589 and #2590. Due to a git branching mishap it was decided to re-partition the new functionality in two sequential PRs that offer self-contained, new functionality to sim65. The functionality in this first PR extends the sim65 simulator in the following ways: (1) It provides tracing functionality, i.e., the possibility of printing one line of simulator state information per instruction executed. (2) It provides a memory mapped "sim65 control" peripheral that allows control of (a) the tracing functionality, and (b) the cpu mode. (3) It provides command-line options to sim65 to enable the tracing, and to override the CPU mode as specified in the program file header. More detailed information and some discussion can be found in the discussions with the (now retracted) PRs #2589 and #2590. This PR provides the technical infrastructure inside the sim65 simulator program itself. Once this PR is accepted, a follow-up PR will be posted that adds C and assembly-language support for the new tracing and peripheral features so they can be easily accessed from the CC65 compiler and the CA65 assembler; some examples; and the documentation for these features. The lack of the latter, in this pull request, will be addressed then.
108 lines
4.3 KiB
C
108 lines
4.3 KiB
C
/*****************************************************************************/
|
|
/* */
|
|
/* 6502.h */
|
|
/* */
|
|
/* CPU core for the 6502 */
|
|
/* */
|
|
/* */
|
|
/* */
|
|
/* (C) 2003-2012, Ullrich von Bassewitz */
|
|
/* Roemerstrasse 52 */
|
|
/* D-70794 Filderstadt */
|
|
/* EMail: uz@cc65.org */
|
|
/* */
|
|
/* */
|
|
/* This software is provided 'as-is', without any expressed or implied */
|
|
/* warranty. In no event will the authors be held liable for any damages */
|
|
/* arising from the use of this software. */
|
|
/* */
|
|
/* Permission is granted to anyone to use this software for any purpose, */
|
|
/* including commercial applications, and to alter it and redistribute it */
|
|
/* freely, subject to the following restrictions: */
|
|
/* */
|
|
/* 1. The origin of this software must not be misrepresented; you must not */
|
|
/* claim that you wrote the original software. If you use this software */
|
|
/* in a product, an acknowledgment in the product documentation would be */
|
|
/* appreciated but is not required. */
|
|
/* 2. Altered source versions must be plainly marked as such, and must not */
|
|
/* be misrepresented as being the original software. */
|
|
/* 3. This notice may not be removed or altered from any source */
|
|
/* distribution. */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef _6502_H
|
|
#define _6502_H
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Data */
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
/* Supported CPUs */
|
|
typedef enum CPUType {
|
|
CPU_6502 = 0,
|
|
CPU_65C02 = 1,
|
|
CPU_6502X = 2
|
|
} CPUType;
|
|
|
|
/* Current CPU */
|
|
extern CPUType CPU;
|
|
|
|
/* 6502 CPU registers */
|
|
typedef struct CPURegs CPURegs;
|
|
struct CPURegs {
|
|
uint8_t AC; /* Accumulator */
|
|
uint8_t XR; /* X register */
|
|
uint8_t YR; /* Y register */
|
|
uint8_t SR; /* Status register */
|
|
uint8_t SP; /* Stackpointer */
|
|
uint16_t PC; /* Program counter */
|
|
};
|
|
|
|
/* Current CPU registers */
|
|
extern CPURegs Regs;
|
|
|
|
/* Status register bits */
|
|
#define CF 0x01 /* Carry flag */
|
|
#define ZF 0x02 /* Zero flag */
|
|
#define IF 0x04 /* Interrupt flag */
|
|
#define DF 0x08 /* Decimal flag */
|
|
#define BF 0x10 /* Break flag */
|
|
#define OF 0x40 /* Overflow flag */
|
|
#define SF 0x80 /* Sign flag */
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Code */
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void Reset (void);
|
|
/* Generate a CPU RESET */
|
|
|
|
void IRQRequest (void);
|
|
/* Generate an IRQ */
|
|
|
|
void NMIRequest (void);
|
|
/* Generate an NMI */
|
|
|
|
unsigned ExecuteInsn (void);
|
|
/* Execute one CPU instruction. Return the number of clock cycles for the
|
|
** executed instruction.
|
|
*/
|
|
|
|
|
|
/* End of 6502.h */
|
|
|
|
#endif
|