mirror of https://github.com/jborza/emu6502.git
initial emulation
This commit is contained in:
parent
35947378da
commit
c3e475ae83
68
cpu.c
68
cpu.c
|
@ -1,17 +1,73 @@
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
|
#include "opcodes.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
void* unimplemented_instruction(State6502* state) {
|
void* unimplemented_instruction(State6502* state) {
|
||||||
printf("Error: unimplemented instruction\n");
|
printf("Error: unimplemented instruction\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int emulate_6502_op(State6502* state) {
|
void set_NV_flags(State6502* state, word value) {
|
||||||
byte* opcode = &state->memory[state->pc];
|
//if(value)
|
||||||
switch (*opcode) {
|
}
|
||||||
//...
|
|
||||||
default:unimplemented_instruction(state); break;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
4
cpu.h
4
cpu.h
|
@ -3,3 +3,7 @@
|
||||||
|
|
||||||
void* unimplemented_instruction(State6502* state);
|
void* unimplemented_instruction(State6502* state);
|
||||||
int emulate_6502_op(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);
|
5
state.h
5
state.h
|
@ -4,10 +4,11 @@
|
||||||
|
|
||||||
typedef struct State6502 {
|
typedef struct State6502 {
|
||||||
byte a; //accumulator
|
byte a; //accumulator
|
||||||
byte X; //x index
|
byte x; //x index
|
||||||
byte Y; //y index
|
byte y; //y index
|
||||||
byte sp; //stack pointer, 256 byte stack between $0100 and $01FF
|
byte sp; //stack pointer, 256 byte stack between $0100 and $01FF
|
||||||
word pc; //program counter, points to the next instruction to be executed
|
word pc; //program counter, points to the next instruction to be executed
|
||||||
byte* memory;
|
byte* memory;
|
||||||
Flags flags; //CPU flags
|
Flags flags; //CPU flags
|
||||||
|
int running;
|
||||||
} State6502;
|
} State6502;
|
Loading…
Reference in New Issue