diff options
Diffstat (limited to '6502/include/lcq')
| -rw-r--r-- | 6502/include/lcq/6502.h | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/6502/include/lcq/6502.h b/6502/include/lcq/6502.h index 3d10301..2a8a845 100644 --- a/6502/include/lcq/6502.h +++ b/6502/include/lcq/6502.h @@ -4,11 +4,12 @@ #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_CARRY = 1 << 0, + L6502_FLAG_ZERO = 1 << 1, + L6502_FLAG_INTERRUPT_DISABLE = 1 << 2, + L6502_FLAG_DECIMAL = 1 << 3, + L6502_FLAG_BREAK_COMMAND = 1 << 4, + L6502_FLAG_UNUSED = 1 << 5, L6502_FLAG_OVERFLOW = 1 << 6, L6502_FLAG_NEGATIVE = 1 << 7, } l6502_flag; @@ -49,18 +50,25 @@ static inline u16 l6502_read_addr(l6502_emu *e, u16 addr) { u8 ahi = l6502_read(e, addr + 1); return ahi << 8 | alo; } +static inline u16 l6502_read_addr_wrap_page(l6502_emu *e, u16 addr) { + u16 page = addr & 0xff00; + u8 off = (u8) addr; + u8 alo = l6502_read(e, page + off); + u8 ahi = l6502_read(e, page + (u8) (off + 1)); + return ahi << 8 | alo; +} static inline u8 l6502_pop(l6502_emu *e) { return l6502_read(e, 0x0100 + (u16) ++e->regs[L6502_REG_SP]); } static inline void l6502_push(l6502_emu *e, u8 val) { l6502_write(e, 0x0100 + (u16) e->regs[L6502_REG_SP]--, val); } static inline u16 l6502_pop_addr(l6502_emu *e) { - u8 ahi = l6502_pop(e); u8 alo = l6502_pop(e); + u8 ahi = l6502_pop(e); return ahi << 8 | alo; } static inline void l6502_push_addr(l6502_emu *e, u16 addr) { - l6502_push(e, (u8) (addr & 0xff)); l6502_push(e, (u8) (addr >> 8)); + l6502_push(e, (u8) (addr & 0xff)); } -void l6502_emulate(l6502_emu *e); +const char *l6502_emulate(l6502_emu *e); #endif |
