summaryrefslogtreecommitdiff
path: root/6502/include/lcq
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-07-09 23:51:55 -0400
committerLLLL Colonq <llll@colonq>2026-07-09 23:51:55 -0400
commit2bdcaf319b1d74ffbaccf08a58336f804761beab (patch)
treec21de6df74ec79b5574ad2b89fcc275d10847802 /6502/include/lcq
Refactor into monorepo
Diffstat (limited to '6502/include/lcq')
-rw-r--r--6502/include/lcq/6502.h37
-rw-r--r--6502/include/lcq/6502/ins.h99
-rw-r--r--6502/include/lcq/6502/types.h17
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