diff options
Diffstat (limited to '6502/include/lcq')
| -rw-r--r-- | 6502/include/lcq/6502.h | 37 | ||||
| -rw-r--r-- | 6502/include/lcq/6502/ins.h | 99 | ||||
| -rw-r--r-- | 6502/include/lcq/6502/types.h | 17 |
3 files changed, 153 insertions, 0 deletions
diff --git a/6502/include/lcq/6502.h b/6502/include/lcq/6502.h new file mode 100644 index 0000000..cb3b1fa --- /dev/null +++ b/6502/include/lcq/6502.h @@ -0,0 +1,37 @@ +#ifndef LCOLONQ_6502_H +#define LCOLONQ_6502_H + +#include <lcq/6502/types.h> + +typedef enum { + L6502_FLAG_CARRY = 1 << 1, + L6502_FLAG_ZERO = 1 << 2, + L6502_FLAG_INTERRUPT_DISABLE = 1 << 3, + L6502_FLAG_DECIMAL = 1 << 4, + L6502_FLAG_BREAK_COMMAND = 1 << 5, + L6502_FLAG_OVERFLOW = 1 << 6, + L6502_FLAG_NEGATIVE = 1 << 7, +} l6502_flag; + +typedef struct { + u16 pc; + u8 sp, a, x, y, flags; +} l6502_regs; + +typedef u8 (*l6502_mem_read_handler)(void *data, u16 addr); +typedef void (*l6502_mem_write_handler)(void *data, u16 addr, u8 val); +typedef struct { + l6502_mem_read_handler rh; + l6502_mem_write_handler wh; + void *data; +} l6502_mem; +void l6502_mem_basic_new(l6502_mem *m); + +typedef struct { + l6502_regs regs; + l6502_mem mem; +} l6502_emu; + +void l6502_emulate(l6502_emu *e); + +#endif diff --git a/6502/include/lcq/6502/ins.h b/6502/include/lcq/6502/ins.h new file mode 100644 index 0000000..88eb3a8 --- /dev/null +++ b/6502/include/lcq/6502/ins.h @@ -0,0 +1,99 @@ +#ifndef LCOLONQ_6502_INS_H +#define LCOLONQ_6502_INS_H + +typedef enum { + BRK = 0x00, + PHP = 0x08, + CLC = 0x18, + JSR = 0x20, + PLP = 0x28, + SEC = 0x38, + RTI = 0x40, + PHA = 0x48, + JMP_ABSOLUTE = 0x4c, + CLI = 0x58, + RTS = 0x60, + PLA = 0x68, + JMP_INDIRECT = 0x6c, + SEI = 0x78, + DEY = 0x88, + TXA = 0x8a, + TYA = 0x98, + TXS = 0x9a, + TAY = 0xa8, + TAX = 0xaa, + CLV = 0xb8, + TSX = 0xba, + INY = 0xc8, + DEX = 0xca, + CLD = 0xd8, + INX = 0xe8, + NOP = 0xea, + SED = 0xf8, +} l6502_ins_misc; + +typedef enum { + G1 = 0b01, + G2 = 0b10, + G3 = 0b00, +} l6502_ins_group; + +typedef enum { + G1_OPCODE_ORA = 0b000, + G1_OPCODE_AND = 0b001, + G1_OPCODE_EOR = 0b010, + G1_OPCODE_ADC = 0b011, + G1_OPCODE_STA = 0b100, + G1_OPCODE_LDA = 0b101, + G1_OPCODE_CMP = 0b110, + G1_OPCODE_SBC = 0b111, +} l6502_ins_group_one_opcode; + +typedef enum { + G1_ADDRESSING_MODE_INDIRECT_ZEROPAGE_X = 0b000, + G1_ADDRESSING_MODE_ZEROPAGE = 0b001, + G1_ADDRESSING_MODE_IMMEDIATE = 0b010, + G1_ADDRESSING_MODE_ABSOLUTE = 0b011, + G1_ADDRESSING_MODE_INDIRECT_ZEROPAGE_Y = 0b100, + G1_ADDRESSING_MODE_ZEROPAGE_X = 0b101, + G1_ADDRESSING_MODE_ABSOLUTE_Y = 0b110, + G1_ADDRESSING_MODE_ABSOLUTE_X = 0b111, +} l6502_ins_group_one_addressing_mode; + +typedef enum { + G2_OPCODE_ASL = 0b000, + G2_OPCODE_ROL = 0b001, + G2_OPCODE_LSR = 0b010, + G2_OPCODE_ROR = 0b011, + G2_OPCODE_STX = 0b100, + G2_OPCODE_LDX = 0b101, + G2_OPCODE_DEC = 0b110, + G2_OPCODE_INC = 0b111, +} l6502_ins_group_two_opcode; + +typedef enum { + G2_ADDRESSING_MODE_IMMEDIATE = 0b000, + G2_ADDRESSING_MODE_ZEROPAGE = 0b001, + G2_ADDRESSING_MODE_ACCUMULATOR = 0b010, + G2_ADDRESSING_MODE_ABSOLUTE = 0b011, + G2_ADDRESSING_MODE_ZEROPAGE_X = 0b101, + G2_ADDRESSING_MODE_ABSOLUTE_X = 0b111, +} l6502_ins_group_two_addressing_mode; + +typedef enum { + G3_OPCODE_BIT = 0b001, + G3_OPCODE_STY = 0b100, + G3_OPCODE_LDY = 0b101, + G3_OPCODE_CPY = 0b110, + G3_OPCODE_CPX = 0b111, +} l6502_ins_group_three_opcode; + +typedef enum { + G3_ADDRESSING_MODE_IMMEDIATE = 0b000, + G3_ADDRESSING_MODE_ZEROPAGE = 0b001, + G3_ADDRESSING_MODE_ABSOLUTE = 0b011, + G3_ADDRESSING_MODE_ZEROPAGE_X = 0b101, + G3_ADDRESSING_MODE_ABSOLUTE_X = 0b111, +} l6502_ins_group_three_addressing_mode; + +#endif diff --git a/6502/include/lcq/6502/types.h b/6502/include/lcq/6502/types.h new file mode 100644 index 0000000..44ce546 --- /dev/null +++ b/6502/include/lcq/6502/types.h @@ -0,0 +1,17 @@ +#ifndef LCOLONQ_6502_TYPES_H +#define LCOLONQ_6502_TYPES_H + +#include <stdbool.h> +#include <stdint.h> +#include <stddef.h> + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +#endif |
