initial emulation

This commit is contained in:
jborza 2019-04-13 23:59:48 +02:00
parent 35947378da
commit c3e475ae83
3 changed files with 69 additions and 8 deletions

68
cpu.c
View File

@ -1,17 +1,73 @@
#include "state.h"
#include "cpu.h"
#include "opcodes.h"
#include <stdio.h>
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;
}

4
cpu.h
View File

@ -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);

View File

@ -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;