2019-04-13 20:00:37 +00:00
|
|
|
// emu6502.cpp : This file contains the 'main' function. Program execution begins and ends there.
|
|
|
|
//
|
|
|
|
|
|
|
|
#include <stdio.h>
|
2019-04-14 08:57:25 +00:00
|
|
|
#include <stdlib.h>
|
2019-04-13 20:00:37 +00:00
|
|
|
#include "state.h"
|
|
|
|
#include "cpu.h"
|
2019-04-13 23:51:50 +00:00
|
|
|
#include "disassembler.h"
|
2019-04-14 08:57:25 +00:00
|
|
|
#include <memory.h>
|
|
|
|
#include "opcodes.h"
|
2019-04-13 23:51:50 +00:00
|
|
|
|
|
|
|
byte* read_game() {
|
|
|
|
FILE* file = fopen("..\\bins\\tetris.bin", "r");
|
|
|
|
byte* buffer = malloc(0x800);
|
|
|
|
fread(buffer, 1, 0x800, file);
|
|
|
|
fclose(file);
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
void print_all(State6502* state) {
|
|
|
|
print_state(state);
|
|
|
|
print_memory(state, 0);
|
2019-04-14 08:57:25 +00:00
|
|
|
//print_memory(state, 0x20);
|
|
|
|
//print_memory(state, 0x40);
|
|
|
|
//print_memory(state, 0x80);
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
State6502 create_blank_state() {
|
|
|
|
State6502 state;
|
|
|
|
clear_state(&state);
|
|
|
|
state.memory = malloc(4096);
|
|
|
|
memset(state.memory, 0, sizeof(byte) * 4096);
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
|
|
|
|
void assertA(State6502* state, byte expected) {
|
|
|
|
if (state->a != expected) {
|
|
|
|
printf("Unexpected value in A, was %02x, expected %02x", expected, state->a);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void test_LDA_IMM() {
|
|
|
|
//initialize
|
|
|
|
State6502 state = create_blank_state();
|
|
|
|
|
|
|
|
//arrange
|
|
|
|
char program[] = { LDA_IMM, 0xAA }; //LDA #$AA
|
|
|
|
memcpy(state.memory, program, sizeof(program));
|
|
|
|
|
|
|
|
//act
|
|
|
|
print_all(&state);
|
|
|
|
disassemble_6502(state.memory, state.pc);
|
|
|
|
emulate_6502_op(&state);
|
|
|
|
print_all(&state);
|
|
|
|
|
|
|
|
//assert
|
|
|
|
assertA(&state, 0xAA);
|
|
|
|
|
|
|
|
//cleanup
|
|
|
|
free(state.memory);
|
|
|
|
}
|
|
|
|
|
|
|
|
void test_LDA_ZP() {
|
|
|
|
//initialize
|
|
|
|
State6502 state = create_blank_state();
|
|
|
|
|
|
|
|
//arrange
|
|
|
|
char program[] = { LDA_ZP, 0x03, 0x00, 0xAA }; //LDA $3
|
|
|
|
memcpy(state.memory, program, sizeof(program));
|
|
|
|
|
|
|
|
//act
|
|
|
|
print_all(&state);
|
|
|
|
disassemble_6502(&state.memory, state.pc);
|
|
|
|
emulate_6502_op(&state);
|
|
|
|
print_all(&state);
|
|
|
|
|
|
|
|
//assert
|
|
|
|
assertA(&state, 0xAA);
|
|
|
|
|
|
|
|
//cleanup
|
|
|
|
free(state.memory);
|
|
|
|
}
|
|
|
|
|
|
|
|
void test_LDA_ZPX() {
|
|
|
|
//initialize
|
|
|
|
State6502 state = create_blank_state();
|
|
|
|
state.x = 0x01;
|
|
|
|
|
|
|
|
//arrange
|
|
|
|
char program[] = { LDA_ZPX, 0x02, 0x00, 0xAA }; //LDA $2,x
|
|
|
|
memcpy(state.memory, program, sizeof(program));
|
|
|
|
|
|
|
|
//act
|
|
|
|
print_all(&state);
|
|
|
|
disassemble_6502(&state.memory, state.pc);
|
|
|
|
emulate_6502_op(&state);
|
|
|
|
print_all(&state);
|
|
|
|
|
|
|
|
//assert
|
|
|
|
assertA(&state, 0xAA);
|
|
|
|
|
|
|
|
//cleanup
|
|
|
|
free(state.memory);
|
2019-04-13 23:51:50 +00:00
|
|
|
}
|
2019-04-13 20:00:37 +00:00
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
2019-04-14 08:57:25 +00:00
|
|
|
test_LDA_IMM();
|
|
|
|
//test_LDA_ZP();
|
|
|
|
//test_LDA_ZPX();
|
|
|
|
}
|
|
|
|
|
|
|
|
int emulate() {
|
2019-04-13 20:00:37 +00:00
|
|
|
State6502 state;
|
2019-04-14 08:57:25 +00:00
|
|
|
memset(&state.memory, 0, sizeof(State6502));
|
2019-04-13 23:51:50 +00:00
|
|
|
print_state(&state);
|
|
|
|
clear_state(&state);
|
|
|
|
byte* memory = read_game();
|
|
|
|
//state.memory = read_game();
|
|
|
|
state.memory = malloc(4096);
|
2019-04-14 08:57:25 +00:00
|
|
|
memset(state.memory, 0, sizeof(byte) * 4096);
|
2019-04-13 23:51:50 +00:00
|
|
|
state.memory[0] = 0xEA;
|
|
|
|
state.memory[1] = 0x05; //ORA $a0
|
|
|
|
state.memory[2] = 0xA0;
|
|
|
|
state.memory[3] = 0xEA; //NOP
|
|
|
|
state.memory[4] = 0x09; //ORA #$ff
|
2019-04-14 08:57:25 +00:00
|
|
|
state.memory[5] = 0xff;
|
2019-04-13 23:51:50 +00:00
|
|
|
state.memory[6] = 0xA9; //LDA
|
|
|
|
state.memory[7] = 0x00; //0
|
|
|
|
state.memory[8] = 0x0D; //ORA $1234
|
|
|
|
state.memory[9] = 0x34;
|
2019-04-14 08:57:25 +00:00
|
|
|
state.memory[10] = 0x02;
|
2019-04-13 23:51:50 +00:00
|
|
|
state.memory[0xA0] = 0x13;
|
2019-04-14 08:57:25 +00:00
|
|
|
state.memory[0x0234] = 0xAA;
|
2019-04-13 23:51:50 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
|
|
print_all(&state);
|
|
|
|
disassemble_6502(state.memory, state.pc);
|
|
|
|
emulate_6502_op(&state);
|
|
|
|
}
|
2019-04-13 20:00:37 +00:00
|
|
|
}
|