65oo2/lib/op.c

312 lines
8.3 KiB
C

#include <stddef.h>
#include "op.h"
const uint8_t opcode_addr[OP_MAX] = {
/* 0- */
/* BRK */ OP_ADDR_IMPL,
/* ORA */ OP_ADDR_IND | OP_ADDR_X,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* ORA */ 0xFF,
/* ASL */ 0xFF,
/* */ 0xFF,
/* PHP */ OP_ADDR_IMPL,
/* ORA */ OP_ADDR_IMM,
/* ASL */ OP_ADDR_IMPL | OP_ADDR_A,
/* */ 0xFF,
/* */ 0xFF,
/* ORA */ OP_ADDR_ABS,
/* ASL */ OP_ADDR_ABS,
/* */ 0xFF,
/* 1- */
/* BPL */ OP_ADDR_REL,
/* ORA */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* ORA */ 0xFF,
/* ASL */ 0xFF,
/* */ 0xFF,
/* CLC */ OP_ADDR_IMPL,
/* ORA */ OP_ADDR_ABS | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* ORA */ OP_ADDR_ABS | OP_ADDR_X,
/* ASL */ OP_ADDR_ABS | OP_ADDR_X,
/* */ 0xFF,
/* 2- */
/* JSR */ OP_ADDR_ABS,
/* AND */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* BIT */ 0xFF,
/* AND */ 0xFF,
/* ROL */ 0xFF,
/* */ 0xFF,
/* PLP */ OP_ADDR_IMPL,
/* AND */ OP_ADDR_IMM,
/* ROL */ OP_ADDR_IMPL | OP_ADDR_A,
/* */ 0xFF,
/* BIT */ OP_ADDR_ABS,
/* AND */ OP_ADDR_ABS,
/* ROL */ OP_ADDR_ABS,
/* */ 0xFF,
/* 3- */
/* BMI */ OP_ADDR_REL,
/* AND */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* AND */ 0xFF,
/* ROL */ 0xFF,
/* */ 0xFF,
/* SEC */ OP_ADDR_IMPL,
/* AND */ OP_ADDR_ABS | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* AND */ OP_ADDR_ABS | OP_ADDR_X,
/* ROL */ OP_ADDR_ABS | OP_ADDR_X,
/* */ 0xFF,
/* 4- */
/* RTI */ OP_ADDR_IMPL,
/* EOR */ OP_ADDR_IND | OP_ADDR_X,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* EOR */ 0xFF,
/* LSR */ 0xFF,
/* */ 0xFF,
/* PHA */ OP_ADDR_IMPL,
/* EOR */ OP_ADDR_IMM,
/* LSR */ OP_ADDR_IMPL | OP_ADDR_A,
/* */ 0xFF,
/* JMP */ OP_ADDR_ABS,
/* EOR */ OP_ADDR_ABS,
/* LSR */ OP_ADDR_ABS,
/* */ 0xFF,
/* 5- */
/* BVC */ OP_ADDR_REL,
/* EOR */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* EOR */ 0xFF,
/* LSR */ 0xFF,
/* */ 0xFF,
/* CLI */ OP_ADDR_IMPL,
/* EOR */ OP_ADDR_ABS | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* EOR */ OP_ADDR_ABS | OP_ADDR_X,
/* LSR */ OP_ADDR_ABS | OP_ADDR_X,
/* */ 0xFF,
/* 6- */
/* RTS */ OP_ADDR_IMPL,
/* ADC */ OP_ADDR_IND | OP_ADDR_X,
/* PER */ OP_ADDR_IMPL,
/* */ 0xFF,
/* */ 0xFF,
/* ADC */ 0xFF,
/* ROR */ 0xFF,
/* */ 0xFF,
/* PLA */ OP_ADDR_IMPL,
/* ADC */ OP_ADDR_IMM,
/* ROR */ OP_ADDR_IMPL | OP_ADDR_A,
/* */ 0xFF,
/* JMP */ OP_ADDR_IND,
/* ADC */ OP_ADDR_ABS,
/* ROR */ OP_ADDR_ABS,
/* */ 0xFF,
/* 7- */
/* BVS */ OP_ADDR_REL,
/* ADC */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* ADC */ 0xFF,
/* ROR */ 0xFF,
/* */ 0xFF,
/* SEI */ OP_ADDR_IMPL,
/* ADC */ OP_ADDR_ABS | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* ADC */ OP_ADDR_ABS | OP_ADDR_X,
/* ROR */ OP_ADDR_ABS | OP_ADDR_X,
/* */ 0xFF,
/* 8- */
/* */ 0xFF,
/* STA */ OP_ADDR_IND | OP_ADDR_X,
/* */ 0xFF,
/* */ 0xFF,
/* STY */ 0xFF,
/* STA */ 0xFF,
/* STX */ 0xFF,
/* */ 0xFF,
/* DEY */ OP_ADDR_IMPL,
/* */ 0xFF,
/* TXA */ OP_ADDR_IMPL,
/* */ 0xFF,
/* STY */ OP_ADDR_ABS,
/* STA */ OP_ADDR_ABS,
/* STX */ OP_ADDR_ABS,
/* */ 0xFF,
/* 9- */
/* BCC */ OP_ADDR_REL,
/* STA */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* STY */ 0xFF,
/* STA */ 0xFF,
/* STX */ 0xFF,
/* */ 0xFF,
/* TYA */ OP_ADDR_IMPL,
/* STA */ OP_ADDR_ABS | OP_ADDR_Y,
/* TXS */ OP_ADDR_IMPL,
/* */ 0xFF,
/* */ 0xFF,
/* STA */ OP_ADDR_ABS | OP_ADDR_X,
/* */ 0xFF,
/* */ 0xFF,
/* A- */
/* LDY */ OP_ADDR_IMM,
/* LDA */ OP_ADDR_IND | OP_ADDR_X,
/* LDX */ OP_ADDR_IMM,
/* */ 0xFF,
/* LDY */ 0xFF,
/* LDA */ 0xFF,
/* LDX */ 0xFF,
/* */ 0xFF,
/* TAY */ OP_ADDR_IMPL,
/* LDA */ OP_ADDR_IMM,
/* TAX */ OP_ADDR_IMPL,
/* */ 0xFF,
/* LDY */ OP_ADDR_ABS,
/* LDA */ OP_ADDR_ABS,
/* LDX */ OP_ADDR_ABS,
/* */ 0xFF,
/* B- */
/* BCS */ OP_ADDR_REL,
/* LDA */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* LDY */ 0xFF,
/* LDA */ 0xFF,
/* LDX */ 0xFF,
/* */ 0xFF,
/* CLV */ OP_ADDR_IMPL,
/* LDA */ OP_ADDR_ABS | OP_ADDR_Y,
/* TSX */ OP_ADDR_IMPL,
/* */ 0xFF,
/* LDY */ OP_ADDR_ABS | OP_ADDR_X,
/* LDA */ OP_ADDR_ABS | OP_ADDR_X,
/* LDX */ OP_ADDR_ABS | OP_ADDR_Y,
/* */ 0xFF,
/* C- */
/* CPY */ OP_ADDR_IMM,
/* CMP */ OP_ADDR_IND | OP_ADDR_X,
/* */ 0xFF,
/* */ 0xFF,
/* CPY */ 0xFF,
/* CMP */ 0xFF,
/* DEC */ 0xFF,
/* */ 0xFF,
/* INY */ OP_ADDR_IMPL,
/* CMP */ OP_ADDR_IMM,
/* DEX */ OP_ADDR_IMPL,
/* */ 0xFF,
/* CPY */ OP_ADDR_ABS,
/* CMP */ OP_ADDR_ABS,
/* DEC */ OP_ADDR_ABS,
/* */ 0xFF,
/* D- */
/* BNE */ OP_ADDR_REL,
/* CMP */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* CMP */ 0xFF,
/* DEC */ 0xFF,
/* */ 0xFF,
/* CLD */ OP_ADDR_IMPL,
/* CMP */ OP_ADDR_ABS | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* CMP */ OP_ADDR_ABS | OP_ADDR_X,
/* DEC */ OP_ADDR_ABS | OP_ADDR_X,
/* */ 0xFF,
/* E- */
/* CPX */ OP_ADDR_IMM,
/* SBC */ OP_ADDR_IND | OP_ADDR_X,
/* */ 0xFF,
/* */ 0xFF,
/* CPX */ 0xFF,
/* SBC */ 0xFF,
/* INC */ 0xFF,
/* */ 0xFF,
/* INX */ OP_ADDR_IMPL,
/* SBC */ OP_ADDR_IMM,
/* NOP */ OP_ADDR_IMPL,
/* */ 0xFF,
/* CPX */ OP_ADDR_ABS,
/* SBC */ OP_ADDR_ABS,
/* INC */ OP_ADDR_ABS,
/* */ 0xFF,
/* F- */
/* BEQ */ OP_ADDR_REL,
/* SBC */ OP_ADDR_IND | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* SBC */ 0xFF,
/* INC */ 0xFF,
/* */ 0xFF,
/* SED */ OP_ADDR_IMPL,
/* SBC */ OP_ADDR_ABS | OP_ADDR_Y,
/* */ 0xFF,
/* */ 0xFF,
/* */ 0xFF,
/* SBC */ OP_ADDR_ABS | OP_ADDR_X,
/* INC */ OP_ADDR_ABS | OP_ADDR_X,
/* */ 0xFF
};
const char *opcode_str[OP_MAX] = {
"BRK", "ORA", NULL, NULL, NULL, "ORA", "ASL", NULL, "PHP", "ORA", "ASL", NULL, NULL, "ORA", "ASL", NULL,
"BPL", "ORA", NULL, NULL, NULL, "ORA", "ASL", NULL, "CLC", "ORA", NULL, NULL, NULL, "ORA", "ASL", NULL,
"JSR", "AND", NULL, NULL, "BIT", "AND", "ROL", NULL, "PLP", "AND", "ROL", NULL, "BIT", "AND", "ROL", NULL,
"BMI", "AND", NULL, NULL, NULL, "AND", "ROL", NULL, "SEC", "AND", NULL, NULL, NULL, "AND", "ROL", NULL,
"RTI", "EOR", NULL, NULL, NULL, "EOR", "LSR", NULL, "PHA", "EOR", "LSR", NULL, "JMP", "EOR", "LSR", NULL,
"BVC", "EOR", NULL, NULL, NULL, "EOR", "LSR", NULL, "CLI", "EOR", NULL, NULL, NULL, "EOR", "LSR", NULL,
"RTS", "ADC", "PER", NULL, NULL, "ADC", "ROR", NULL, "PLA", "ADC", "ROR", NULL, "JMP", "ADC", "ROR", NULL,
"BVS", "ADC", NULL, NULL, NULL, "ADC", "ROR", NULL, "SEI", "ADC", NULL, NULL, NULL, "ADC", "ROR", NULL,
NULL, "STA", NULL, NULL, "STY", "STA", "STX", NULL, "DEY", NULL, "TXA", NULL, "STY", "STA", "STX", NULL,
"BCC", "STA", NULL, NULL, "STY", "STA", "STX", NULL, "TYA", "STA", "TXS", NULL, NULL, "STA", NULL, NULL,
"LDY", "LDA", "LDX", NULL, "LDY", "LDA", "LDX", NULL, "TAY", "LDA", "TAX", NULL, "LDY", "LDA", "LDX", NULL,
"BCS", "LDA", NULL, NULL, "LDY", "LDA", "LDX", NULL, "CLV", "LDA", "TSX", NULL, "LDY", "LDA", "LDX", NULL,
"CPY", "CMP", NULL, NULL, "CPY", "CMP", "DEC", NULL, "INY", "CMP", "DEX", NULL, "CPY", "CMP", "DEC", NULL,
"BNE", "CMP", NULL, NULL, NULL, "CMP", "DEC", NULL, "CLD", "CMP", NULL, NULL, NULL, "CMP", "DEC", NULL,
"CPX", "SBC", NULL, NULL, "CPX", "SBC", "INC", NULL, "INX", "SBC", "NOP", NULL, "CPX", "SBC", "INC", NULL,
"BEQ", "SBC", NULL, NULL, NULL, "SBC", "INC", NULL, "SED", "SBC", NULL, NULL, NULL, "SBC", "INC", NULL
};