diff --git a/cpu.c b/cpu.c index 80dd57d..c9b048e 100644 --- a/cpu.c +++ b/cpu.c @@ -1,17 +1,73 @@ #include "state.h" #include "cpu.h" +#include "opcodes.h" +#include void* unimplemented_instruction(State6502* state) { printf("Error: unimplemented instruction\n"); exit(1); } -int emulate_6502_op(State6502* state) { - byte* opcode = &state->memory[state->pc]; - switch (*opcode) { - //... - default:unimplemented_instruction(state); break; +void set_NV_flags(State6502* state, word value) { + //if(value) +} + +void clear_flags(State6502* state) { + memcpy(&state->flags, &state->a,1); +} + +void clear_state(State6502* state) { + state->a = 0; + state->x = 0; + state->y = 0; + state->pc = 0; + state->sp = 0; + //state -> flags = (Flags)0; + clear_flags(state); + state->running = 1; +} + +byte pop_byte(State6502* state) { + return state->memory[state->pc++]; +} + +void print_state(State6502* state) { + printf("\tC=%d,Z=%d,I=%d,D=%d,B=%d,V=%d,N=%d\n", state->flags.c, state->flags.z, state->flags.i, state->flags.d, state->flags.b, state->flags.v, state->flags.n); + printf("\tA $%02x X $%02x Y $%02x SP $%02x PC $%04x\n", state->a, state->x, state->y, state->sp, state->pc); +} + +void print_memory(State6502* state, word offset) { + printf("$%04x: ", offset); + for (byte i = 0; i < 32; i++) { + printf("%02x", state->memory[offset + i]); + if (i % 8 == 7) + printf("|"); + else + printf(" "); + } + printf("\n"); +} + +//bitwise or with accumulator +void ORA(State6502 * state, byte operand) { + word result = state->a | operand; + set_NV_flags(state, result); + state->a = result & 0xff; +} + +int emulate_6502_op(State6502 * state) { + byte* opcode = &state->memory[state->pc++]; + switch (*opcode) { + case 0x00: break; //NOP + case 0x01: //ORA, indirect, x + break; + case 0x05: //ORA, zero page + byte zp = pop_byte(state); + ORA(state, state->memory[zp]); + break; + case 0x09: //ORA + default: + unimplemented_instruction(state); break; } - state->pc += 1; return 0; } diff --git a/cpu.h b/cpu.h index 7bde448..3e9f2e9 100644 --- a/cpu.h +++ b/cpu.h @@ -3,3 +3,7 @@ void* unimplemented_instruction(State6502* state); int emulate_6502_op(State6502* state); +void print_memory(State6502* state, word offset); +void print_state(State6502* state); +void clear_flags(State6502* state); +void clear_state(State6502* state); \ No newline at end of file diff --git a/state.h b/state.h index bc076de..4ff8e9c 100644 --- a/state.h +++ b/state.h @@ -4,10 +4,11 @@ typedef struct State6502 { byte a; //accumulator - byte X; //x index - byte Y; //y index + byte x; //x index + byte y; //y index byte sp; //stack pointer, 256 byte stack between $0100 and $01FF word pc; //program counter, points to the next instruction to be executed byte* memory; Flags flags; //CPU flags + int running; } State6502; \ No newline at end of file