mirror of
https://github.com/jborza/emu6502.git
synced 2024-06-07 16:16:37 +00:00
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 "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
4
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);
|
5
state.h
5
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;
|
Loading…
Reference in New Issue
Block a user