Lite refactor debugger interface

This commit is contained in:
Aaron Culliney 2019-03-24 15:19:58 -07:00
parent 3ca0d9b618
commit 1c61071a11
6 changed files with 603 additions and 789 deletions

File diff suppressed because it is too large Load Diff

View File

@ -22,39 +22,7 @@
extern volatile bool is_debugging;
typedef enum {
STEPPING = 0,
NEXTING,
FINISHING,
UNTILING,
TYPING,
LOADING,
GOING
} stepping_type_t;
// FIXME TODO : make opaque type ...
typedef struct stepping_struct_t {
stepping_type_t step_type;
uint16_t step_count;
uint16_t step_frame;
uint16_t step_pc;
bool should_break;
time_t timeout;
const char *step_text;
const bool step_deterministically;
} stepping_struct_t;
#define DEBUGGER_BUF_X 39
#define DEBUGGER_BUF_Y 22
#define MAX_BRKPTS 16
/* debugger commands */
enum token_type { MEM, DIS, REGS, SETMEM, STEP, FINISH, UNTIL, GO, VM,
BREAK, WATCH, CLEAR, IGNORE, STATUS, OPCODES, LC, DRIVE,
SEARCH, HELP, LOG, BSAVE, BLOAD, SAVE, FBSHA1, TYPE,
LOAD, UNKNOWN };
typedef enum {
addr_implied,
addr_implied = 0,
addr_accumulator,
addr_immediate,
addr_zeropage,
@ -68,16 +36,17 @@ typedef enum {
addr_indirect_y,
addr_j_indirect, /* non-zeropage indirects, used in JMP only */
addr_j_indirect_x,
addr_relative
addr_relative,
NUM_ADDRESSING_MODES,
} addressing_mode_t;
struct opcode_struct
{
typedef struct opcode_struct_s {
const char *mnemonic;
addressing_mode_t mode;
};
} opcode_struct_s;
extern const struct opcode_struct *opcodes;
extern const struct opcode_struct_s *opcodes;
extern const char* const disasm_templates[NUM_ADDRESSING_MODES];
#ifdef INTERFACE_CLASSIC
void c_interface_debugging(void);
@ -91,10 +60,4 @@ void c_debugger_set_timeout(const unsigned int secs);
bool c_debugger_set_watchpoint(const uint16_t addr);
void c_debugger_clear_watchpoints(void);
extern const struct opcode_struct opcodes_6502[256];
extern const struct opcode_struct opcodes_65c02[256];
extern const struct opcode_struct opcodes_undoc[256];
extern const char* const disasm_templates[15];
extern const uint8_t opcodes_65c02_numargs[256];
#endif

View File

@ -22,6 +22,7 @@
/* process includes only the second time we parse this file. */
#include "common.h"
#include "meta/debug_private.h"
#define debugtext yytext
@ -57,7 +58,7 @@ extern void set_halt_65c02(void);
extern void clear_halt_65c02(void);
extern void clear_halt_opcode(uint8_t opcode);
extern void show_opcode_breakpts(void);
extern int debugger_go(stepping_struct_t s);
extern int debugger_go(stepping_struct_s s);
extern void fb_sha1(void);
/*
@ -473,7 +474,7 @@ ADDRS [0-9a-fA-F]+
{BOS}(st?e?p?|ne?x?t?){EOS} {
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = STEPPING,
.step_count = 1
};
@ -493,7 +494,7 @@ ADDRS [0-9a-fA-F]+
arg1 = (int)strtol(debugtext, (char**)NULL, 16);
if ((arg1 < 1) || (arg1 > 255)) arg1 = 255;
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = STEPPING,
.step_count = arg1
};
@ -508,7 +509,7 @@ ADDRS [0-9a-fA-F]+
{BOS}fi?n?i?s?h?{EOS} {
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = FINISHING,
.step_frame = 1
};
@ -546,9 +547,12 @@ ADDRS [0-9a-fA-F]+
case addr_j_indirect_x:
delta = 3;
break;
default:
assert(false);
break;
}
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = UNTILING,
.step_pc = run_args.cpu65_pc + delta
};
@ -564,7 +568,7 @@ ADDRS [0-9a-fA-F]+
/* DANGEROUS! */
run_args.cpu65_pc = (int)strtol(debugtext, (char**)NULL, 16);
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = GOING
};
@ -573,7 +577,7 @@ ADDRS [0-9a-fA-F]+
}
{BOS}go?{EOS} {
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = GOING
};
@ -797,7 +801,7 @@ ADDRS [0-9a-fA-F]+
buf[len] = '\r';
buf[len+1] = '\0';
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = TYPING,
.step_text = buf
};
@ -827,7 +831,7 @@ ADDRS [0-9a-fA-F]+
while (fgets(buf, DEBUG_BUFSZ, fp)) {
LOG("%s", buf);
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = LOADING,
.step_text = buf
};
@ -840,7 +844,7 @@ ADDRS [0-9a-fA-F]+
fclose(fp);
if (ch == -1) {
stepping_struct_t s = {
stepping_struct_s s = {
.step_type = GOING,
};
debugger_go(s);

72
src/meta/debug_private.h Normal file
View File

@ -0,0 +1,72 @@
/*
* Apple // emulator for *ix
*
* This software package is subject to the GNU General Public License
* version 3 or later (your choice) as published by the Free Software
* Foundation.
*
* Copyright 2019 Aaron Culliney
*
*/
#ifndef _DEBUG_PRIVATE_H_
#define _DEBUG_PRIVATE_H_ 1
#define DEBUGGER_BUF_X 39
#define DEBUGGER_BUF_Y 22
#define MAX_BRKPTS 16
typedef enum stepping_type_t {
STEPPING = 0,
NEXTING,
FINISHING,
UNTILING,
TYPING,
LOADING,
GOING
} stepping_type_t;
typedef struct stepping_struct_s {
stepping_type_t step_type;
uint16_t step_count;
uint16_t step_frame;
uint16_t step_pc;
bool should_break;
time_t timeout;
const char *step_text;
const bool step_deterministically;
} stepping_struct_s;
// debugger commands
enum {
BLOAD,
BREAK,
BSAVE,
CLEAR,
DIS,
DRIVE,
FBSHA1,
FINISH,
GO,
HELP,
IGNORE,
LC,
LOAD,
LOG,
MEM,
OPCODES,
REGS,
SAVE,
SEARCH,
SETMEM,
STATUS,
STEP,
TYPE,
UNTIL,
VM,
WATCH,
// ...
UNKNOWN,
};
#endif

View File

@ -12,6 +12,7 @@
*/
#include "common.h"
#include "meta/debug_private.h"
#include <test/sha1.h>
@ -30,12 +31,10 @@
#define SW_DHIRES 0xC05E
#define SW_IOUDIS 0xC07E
const struct opcode_struct *opcodes;
static char input_str[1024] = { 0 }; // ASCII values
static bool input_deterministically = false; // slows down testing ...
static stepping_struct_t stepping_struct = { 0 };
static stepping_struct_s stepping_struct = { 0 };
static unsigned int stepping_timeout = 0;
volatile bool is_debugging = false;
@ -1265,7 +1264,7 @@ bool c_debugger_should_break() {
/* -------------------------------------------------------------------------
debugger_go () - step into or step over commands
------------------------------------------------------------------------- */
int debugger_go(stepping_struct_t s) {
int debugger_go(stepping_struct_s s) {
memcpy(&stepping_struct, &s, sizeof(s));
int ch = begin_cpu_stepping();
@ -1418,8 +1417,6 @@ void c_interface_debugging(void) {
int ch;
int command_pos = PROMPT_X;
opcodes = opcodes_65c02;
/* initialize the buffers */
for (i=0; i<BUF_Y; i++)
{
@ -1512,7 +1509,7 @@ void c_debugger_go(void) {
bool deterministically = input_deterministically;
input_deterministically = false;
stepping_struct_t s = (stepping_struct_t){
stepping_struct_s s = (stepping_struct_s){
.step_deterministically = deterministically,
.step_text = buf,
.step_type = GOING,

View File

@ -15,8 +15,7 @@
#include "common.h"
const char * const disasm_templates[15] =
{
const char * const disasm_templates[NUM_ADDRESSING_MODES] = {
"", // addr_implied
"A", // addr_accumulator
"#$%02X", // addr_immediate
@ -34,268 +33,7 @@ const char * const disasm_templates[15] =
"$%04X (%c%02X)" // addr_relative
};
const struct opcode_struct opcodes_6502[256] =
{
{ "BRK", addr_implied }, // 0x00
{ "ORA", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ORA", addr_zeropage },
{ "ASL", addr_zeropage },
{ "???", addr_implied },
{ "PHP", addr_implied }, // 0x08
{ "ORA", addr_immediate },
{ "ASL", addr_accumulator },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ORA", addr_absolute },
{ "ASL", addr_absolute },
{ "???", addr_implied },
{ "BPL", addr_relative }, // 0x10
{ "ORA", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ORA", addr_zeropage_x },
{ "ASL", addr_zeropage_x },
{ "???", addr_implied },
{ "CLC", addr_implied }, // 0x18
{ "ORA", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ORA", addr_absolute_x },
{ "ASL", addr_absolute_x },
{ "???", addr_implied },
{ "JSR", addr_absolute }, // 0x20
{ "AND", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "BIT", addr_zeropage },
{ "AND", addr_zeropage },
{ "ROL", addr_zeropage },
{ "???", addr_implied },
{ "PLP", addr_implied }, // 0x28
{ "AND", addr_immediate },
{ "ROL", addr_accumulator },
{ "???", addr_implied },
{ "BIT", addr_absolute },
{ "AND", addr_absolute },
{ "ROL", addr_absolute },
{ "???", addr_implied },
{ "BMI", addr_relative }, // 0x30
{ "AND", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "AND", addr_zeropage_x },
{ "ROL", addr_zeropage_x },
{ "???", addr_implied },
{ "SEC", addr_implied }, // 0x38
{ "AND", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "AND", addr_absolute_x },
{ "ROL", addr_absolute_x },
{ "???", addr_implied },
{ "RTI", addr_implied }, // 0x40
{ "EOR", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "EOR", addr_zeropage },
{ "LSR", addr_zeropage },
{ "???", addr_implied },
{ "PHA", addr_implied }, // 0x48
{ "EOR", addr_immediate },
{ "LSR", addr_accumulator },
{ "???", addr_implied },
{ "JMP", addr_absolute },
{ "EOR", addr_absolute },
{ "LSR", addr_absolute },
{ "???", addr_implied },
{ "BVC", addr_relative }, // 0x50
{ "EOR", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "EOR", addr_zeropage_x },
{ "LSR", addr_zeropage_x },
{ "???", addr_implied },
{ "CLI", addr_implied }, // 0x58
{ "EOR", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "EOR", addr_absolute_x },
{ "LSR", addr_absolute_x },
{ "???", addr_implied },
{ "RTS", addr_implied }, // 0x60
{ "ADC", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ADC", addr_zeropage },
{ "ROR", addr_zeropage },
{ "???", addr_implied },
{ "PLA", addr_implied }, // 0x68
{ "ADC", addr_immediate },
{ "ROR", addr_accumulator },
{ "???", addr_implied },
{ "JMP", addr_j_indirect },
{ "ADC", addr_absolute },
{ "ROR", addr_absolute },
{ "???", addr_implied },
{ "BVS", addr_relative }, // 0x70
{ "ADC", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ADC", addr_zeropage_x },
{ "ROR", addr_zeropage_x },
{ "???", addr_implied },
{ "SEI", addr_implied }, // 0x78
{ "ADC", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ADC", addr_absolute_x },
{ "ROR", addr_absolute_x },
{ "???", addr_implied },
{ "???", addr_implied }, // 0x80
{ "STA", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "STY", addr_zeropage },
{ "STA", addr_zeropage },
{ "STX", addr_zeropage },
{ "???", addr_implied },
{ "DEY", addr_implied }, // 0x00
{ "???", addr_implied },
{ "TXA", addr_implied },
{ "???", addr_implied },
{ "STY", addr_absolute },
{ "STA", addr_absolute },
{ "STX", addr_absolute },
{ "???", addr_implied },
{ "BCC", addr_relative }, // 0x08
{ "STA", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "STY", addr_zeropage_x },
{ "STA", addr_zeropage_x },
{ "STX", addr_zeropage_y },
{ "???", addr_implied },
{ "TYA", addr_implied }, // 0x10
{ "STA", addr_absolute_y },
{ "TXS", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "STA", addr_absolute_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "LDY", addr_immediate }, // 0x18
{ "LDA", addr_indirect_x },
{ "LDX", addr_immediate },
{ "???", addr_implied },
{ "LDY", addr_zeropage },
{ "LDA", addr_zeropage },
{ "LDX", addr_zeropage },
{ "???", addr_implied },
{ "TAY", addr_implied }, // 0x20
{ "LDA", addr_immediate },
{ "TAX", addr_implied },
{ "???", addr_implied },
{ "LDY", addr_absolute },
{ "LDA", addr_absolute },
{ "LDX", addr_absolute },
{ "???", addr_implied },
{ "BCS", addr_relative }, // 0x28
{ "LDA", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "LDY", addr_zeropage_x },
{ "LDA", addr_zeropage_x },
{ "LDX", addr_zeropage_y },
{ "???", addr_implied },
{ "CLV", addr_implied }, // 0x30
{ "LDA", addr_absolute_y },
{ "TSX", addr_implied },
{ "???", addr_implied },
{ "LDY", addr_absolute_x },
{ "LDA", addr_absolute_x },
{ "LDX", addr_absolute_y },
{ "???", addr_implied },
{ "CPY", addr_immediate }, // 0x38
{ "CMP", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "CPY", addr_zeropage },
{ "CMP", addr_zeropage },
{ "DEC", addr_zeropage },
{ "???", addr_implied },
{ "INY", addr_implied }, // 0x40
{ "CMP", addr_immediate },
{ "DEX", addr_implied },
{ "???", addr_implied },
{ "CPY", addr_absolute },
{ "CMP", addr_absolute },
{ "DEC", addr_absolute },
{ "???", addr_implied },
{ "BNE", addr_relative }, // 0x48
{ "CMP", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "CMP", addr_zeropage_x },
{ "DEC", addr_zeropage_x },
{ "???", addr_implied },
{ "CLD", addr_implied }, // 0x50
{ "CMP", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "CMP", addr_absolute_x },
{ "DEC", addr_absolute_x },
{ "???", addr_implied },
{ "CPX", addr_immediate }, // 0x58
{ "SBC", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "CPX", addr_zeropage },
{ "SBC", addr_zeropage },
{ "INC", addr_zeropage },
{ "???", addr_implied },
{ "INX", addr_implied }, // 0x60
{ "SBC", addr_immediate },
{ "NOP", addr_implied },
{ "???", addr_implied },
{ "CPX", addr_absolute },
{ "SBC", addr_absolute },
{ "INC", addr_absolute },
{ "???", addr_implied },
{ "BEQ", addr_relative }, // 0x68
{ "SBC", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "SBC", addr_zeropage_x },
{ "INC", addr_zeropage_x },
{ "???", addr_implied },
{ "SED", addr_implied }, // 0x70
{ "SBC", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "SBC", addr_absolute_x },
{ "INC", addr_absolute_x },
{ "???", addr_implied },
};
const struct opcode_struct opcodes_65c02[256] =
{
const struct opcode_struct_s opcodes_65c02[256] = {
{ "BRK", addr_implied }, // 0x00
{ "ORA", addr_indirect_x },
{ "???", addr_implied },
@ -554,8 +292,288 @@ const struct opcode_struct opcodes_65c02[256] =
{ "???", addr_implied },
};
const struct opcode_struct opcodes_undoc[256] =
{
const struct opcode_struct_s *opcodes = opcodes_65c02;
const uint8_t opcodes_65c02_numargs[256] = {
0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, // 0x00-0x0F
1, 1, 1, 0, 1, 1, 1, 0, 0, 2, 0, 0, 2, 2, 2, 0, // 0x10-0x1F
2, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, // 0x20-0x2F
1, 1, 1, 0, 1, 1, 1, 0, 0, 2, 0, 0, 2, 2, 2, 0, // 0x30-0x3F
0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, // 0x40-0x4F
1, 1, 1, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 2, 2, 0, // 0x50-0x5F
0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, // 0x60-0x6F
1, 1, 1, 0, 1, 1, 1, 0, 0, 2, 0, 0, 2, 2, 2, 0, // 0x70-0x7F
1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, // 0x80-0x8F
1, 1, 1, 0, 1, 1, 1, 0, 0, 2, 0, 0, 2, 2, 2, 0, // 0x90-0x9F
1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, // 0xA0-0xAF
1, 1, 1, 0, 1, 1, 1, 0, 0, 2, 0, 0, 2, 2, 2, 0, // 0xB0-0xBF
1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, // 0xC0-0xCF
1, 1, 1, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 2, 2, 0, // 0xD0-0xDF
1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, // 0xE0-0xEF
1, 1, 1, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 2, 2, 0, // 0xF0-0xFF
};
#if 0
const struct opcode_struct_s opcodes_6502[256] = {
{ "BRK", addr_implied }, // 0x00
{ "ORA", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ORA", addr_zeropage },
{ "ASL", addr_zeropage },
{ "???", addr_implied },
{ "PHP", addr_implied }, // 0x08
{ "ORA", addr_immediate },
{ "ASL", addr_accumulator },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ORA", addr_absolute },
{ "ASL", addr_absolute },
{ "???", addr_implied },
{ "BPL", addr_relative }, // 0x10
{ "ORA", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ORA", addr_zeropage_x },
{ "ASL", addr_zeropage_x },
{ "???", addr_implied },
{ "CLC", addr_implied }, // 0x18
{ "ORA", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ORA", addr_absolute_x },
{ "ASL", addr_absolute_x },
{ "???", addr_implied },
{ "JSR", addr_absolute }, // 0x20
{ "AND", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "BIT", addr_zeropage },
{ "AND", addr_zeropage },
{ "ROL", addr_zeropage },
{ "???", addr_implied },
{ "PLP", addr_implied }, // 0x28
{ "AND", addr_immediate },
{ "ROL", addr_accumulator },
{ "???", addr_implied },
{ "BIT", addr_absolute },
{ "AND", addr_absolute },
{ "ROL", addr_absolute },
{ "???", addr_implied },
{ "BMI", addr_relative }, // 0x30
{ "AND", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "AND", addr_zeropage_x },
{ "ROL", addr_zeropage_x },
{ "???", addr_implied },
{ "SEC", addr_implied }, // 0x38
{ "AND", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "AND", addr_absolute_x },
{ "ROL", addr_absolute_x },
{ "???", addr_implied },
{ "RTI", addr_implied }, // 0x40
{ "EOR", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "EOR", addr_zeropage },
{ "LSR", addr_zeropage },
{ "???", addr_implied },
{ "PHA", addr_implied }, // 0x48
{ "EOR", addr_immediate },
{ "LSR", addr_accumulator },
{ "???", addr_implied },
{ "JMP", addr_absolute },
{ "EOR", addr_absolute },
{ "LSR", addr_absolute },
{ "???", addr_implied },
{ "BVC", addr_relative }, // 0x50
{ "EOR", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "EOR", addr_zeropage_x },
{ "LSR", addr_zeropage_x },
{ "???", addr_implied },
{ "CLI", addr_implied }, // 0x58
{ "EOR", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "EOR", addr_absolute_x },
{ "LSR", addr_absolute_x },
{ "???", addr_implied },
{ "RTS", addr_implied }, // 0x60
{ "ADC", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ADC", addr_zeropage },
{ "ROR", addr_zeropage },
{ "???", addr_implied },
{ "PLA", addr_implied }, // 0x68
{ "ADC", addr_immediate },
{ "ROR", addr_accumulator },
{ "???", addr_implied },
{ "JMP", addr_j_indirect },
{ "ADC", addr_absolute },
{ "ROR", addr_absolute },
{ "???", addr_implied },
{ "BVS", addr_relative }, // 0x70
{ "ADC", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ADC", addr_zeropage_x },
{ "ROR", addr_zeropage_x },
{ "???", addr_implied },
{ "SEI", addr_implied }, // 0x78
{ "ADC", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "ADC", addr_absolute_x },
{ "ROR", addr_absolute_x },
{ "???", addr_implied },
{ "???", addr_implied }, // 0x80
{ "STA", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "STY", addr_zeropage },
{ "STA", addr_zeropage },
{ "STX", addr_zeropage },
{ "???", addr_implied },
{ "DEY", addr_implied }, // 0x88
{ "???", addr_implied },
{ "TXA", addr_implied },
{ "???", addr_implied },
{ "STY", addr_absolute },
{ "STA", addr_absolute },
{ "STX", addr_absolute },
{ "???", addr_implied },
{ "BCC", addr_relative }, // 0x90
{ "STA", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "STY", addr_zeropage_x },
{ "STA", addr_zeropage_x },
{ "STX", addr_zeropage_y },
{ "???", addr_implied },
{ "TYA", addr_implied }, // 0x98
{ "STA", addr_absolute_y },
{ "TXS", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "STA", addr_absolute_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "LDY", addr_immediate }, // 0xA0
{ "LDA", addr_indirect_x },
{ "LDX", addr_immediate },
{ "???", addr_implied },
{ "LDY", addr_zeropage },
{ "LDA", addr_zeropage },
{ "LDX", addr_zeropage },
{ "???", addr_implied },
{ "TAY", addr_implied }, // 0xA8
{ "LDA", addr_immediate },
{ "TAX", addr_implied },
{ "???", addr_implied },
{ "LDY", addr_absolute },
{ "LDA", addr_absolute },
{ "LDX", addr_absolute },
{ "???", addr_implied },
{ "BCS", addr_relative }, // 0xB0
{ "LDA", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "LDY", addr_zeropage_x },
{ "LDA", addr_zeropage_x },
{ "LDX", addr_zeropage_y },
{ "???", addr_implied },
{ "CLV", addr_implied }, // 0xB8
{ "LDA", addr_absolute_y },
{ "TSX", addr_implied },
{ "???", addr_implied },
{ "LDY", addr_absolute_x },
{ "LDA", addr_absolute_x },
{ "LDX", addr_absolute_y },
{ "???", addr_implied },
{ "CPY", addr_immediate }, // 0xC0
{ "CMP", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "CPY", addr_zeropage },
{ "CMP", addr_zeropage },
{ "DEC", addr_zeropage },
{ "???", addr_implied },
{ "INY", addr_implied }, // 0xC8
{ "CMP", addr_immediate },
{ "DEX", addr_implied },
{ "???", addr_implied },
{ "CPY", addr_absolute },
{ "CMP", addr_absolute },
{ "DEC", addr_absolute },
{ "???", addr_implied },
{ "BNE", addr_relative }, // 0xD0
{ "CMP", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "CMP", addr_zeropage_x },
{ "DEC", addr_zeropage_x },
{ "???", addr_implied },
{ "CLD", addr_implied }, // 0xD8
{ "CMP", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "CMP", addr_absolute_x },
{ "DEC", addr_absolute_x },
{ "???", addr_implied },
{ "CPX", addr_immediate }, // 0xE0
{ "SBC", addr_indirect_x },
{ "???", addr_implied },
{ "???", addr_implied },
{ "CPX", addr_zeropage },
{ "SBC", addr_zeropage },
{ "INC", addr_zeropage },
{ "???", addr_implied },
{ "INX", addr_implied }, // 0xE8
{ "SBC", addr_immediate },
{ "NOP", addr_implied },
{ "???", addr_implied },
{ "CPX", addr_absolute },
{ "SBC", addr_absolute },
{ "INC", addr_absolute },
{ "???", addr_implied },
{ "BEQ", addr_relative }, // 0xF0
{ "SBC", addr_indirect_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "SBC", addr_zeropage_x },
{ "INC", addr_zeropage_x },
{ "???", addr_implied },
{ "SED", addr_implied }, // 0xF8
{ "SBC", addr_absolute_y },
{ "???", addr_implied },
{ "???", addr_implied },
{ "???", addr_implied },
{ "SBC", addr_absolute_x },
{ "INC", addr_absolute_x },
{ "???", addr_implied },
};
const struct opcode_struct_s opcodes_undoc[256] = {
{ "BRK", addr_implied }, // 0x00
{ "ORA", addr_indirect_x },
{ "hang", addr_implied },
@ -814,262 +832,4 @@ const struct opcode_struct opcodes_undoc[256] =
{ "isb", addr_absolute_x },
};
const uint8_t opcodes_65c02_numargs[256] =
{
0, // 0x00
1,
0,
0,
1,
1,
1,
0,
0, // 0x08
1,
0,
0,
2,
2,
2,
0,
1, // 0x10
1,
1,
0,
1,
1,
1,
0,
0, // 0x18
2,
0,
0,
2,
2,
2,
0,
2, // 0x20
1,
0,
0,
1,
1,
1,
0,
0, // 0x28
1,
0,
0,
2,
2,
2,
0,
1, // 0x30
1,
1,
0,
1,
1,
1,
0,
0, // 0x38
2,
0,
0,
2,
2,
2,
0,
0, // 0x40
1,
0,
0,
0,
1,
1,
0,
0, // 0x48
1,
0,
0,
2,
2,
2,
0,
1, // 0x50
1,
1,
0,
0,
1,
1,
0,
0, // 0x58
2,
0,
0,
0,
2,
2,
0,
0, // 0x60
1,
0,
0,
1,
1,
1,
0,
0, // 0x68
1,
0,
0,
2,
2,
2,
0,
1, // 0x70
1,
1,
0,
1,
1,
1,
0,
0, // 0x78
2,
0,
0,
2,
2,
2,
0,
1, // 0x80
1,
0,
0,
1,
1,
1,
0,
0, // 0x88
1,
0,
0,
2,
2,
2,
0,
1, // 0x90
1,
1,
0,
1,
1,
1,
0,
0, // 0x98
2,
0,
0,
2,
2,
2,
0,
1, // 0xA0
1,
1,
0,
1,
1,
1,
0,
0, // 0xA8
1,
0,
0,
2,
2,
2,
0,
1, // 0xB0
1,
1,
0,
1,
1,
1,
0,
0, // 0xB8
2,
0,
0,
2,
2,
2,
0,
1, // 0xC0
1,
0,
0,
1,
1,
1,
0,
0, // 0xC8
1,
0,
0,
2,
2,
2,
0,
1, // 0xD0
1,
1,
0,
0,
1,
1,
0,
0, // 0xD8
2,
0,
0,
0,
2,
2,
0,
1, // 0xE0
1,
0,
0,
1,
1,
1,
0,
0, // 0xE8
1,
0,
0,
2,
2,
2,
0,
1, // 0xF0
1,
1,
0,
0,
1,
1,
0,
0, // 0xF8
2,
0,
0,
0,
2,
2,
0,
};
#endif