You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
2.9 KiB

#include "constants.h"
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
void memview() {
for (int i = 0x00; i <= 0xFFFF; i++) {
if (memory[i] != 0x00) {
//printf("Mem Address 0x%04X: 0x%04X\n", i, memory[i]);
}
}
printf("irx - %d\n", irx);
printf("iry - %d\n", iry);
printf("acc - %d\n", acc);
}
int emulate(uint8_t exec[], int size, uint8_t addr) {
//uint8_t* program = (uint8_t*)exec;
for (int i = addr, i2=0; i < size+addr; i++) {
memory[i] = exec[i2];
i2++;
}
while (prc < size) {
uint8_t inst = memory[addr+prc];
switch (inst) {
//BRK
case 0x00:
cpuStatus.brk = 0x01;
prc++;
prc++;
break;
//NOP
case 0xEA:
prc++;
break;
case 0x80:
prc++;
break;
//variations on an INC
case 0xE6:
memory[memory[++prc+addr]]++;
prc++;
break;
case 0xE8:
irx++;
prc++;
break;
case 0xC8:
iry++;
prc++;
break;
//LDA
case 0xA9: {
uint8_t mem = memory[memory[++prc+addr]];
acc = mem;
prc++;
break;
}
case 0xA5: {
uint8_t mem = memory[memory[++prc+addr]];
acc = mem;
prc++;
break;
}
case 0xB1: {
uint8_t mem = memory[(++prc)+addr];
mem+=iry;
acc = memory[mem];
prc++;
break;
}
//STA
case 0x85: {
memory[memory[++prc+addr]] = acc;
prc++;
break;
}
//STY
case 0x84: {
memory[memory[++prc+addr]] = iry;
prc++;
break;
}
//variations on an LDY (it doesn't work as well the second time)
case 0xA0: {
uint8_t mem = memory[memory[++prc+addr]];
iry = mem;
prc++;
break;
}
//ORA
case 0x01: {
uint8_t mem = memory[(++prc)+addr];
mem+=irx;
uint8_t val = memory[mem];
acc = acc | val;
prc++;
break;
}
//TAX
case 0xAA: {
irx = acc;
if (irx == 0) {
cpuStatus.zero = 1;
} else {
cpuStatus.zero = 0;
}
prc++;
break;
}
//DEX
case 0xCA: {
irx--;
if (irx == 0) {
cpuStatus.zero = 1;
} else {
cpuStatus.zero = 0;
}
prc++;
break;
}
case 0xD1: {
uint8_t mem = memory[(++prc)+addr];
mem+=iry;
mem = memory[mem];
if (acc >= mem) {
cpuStatus.carry = 1;
} else {
cpuStatus.carry = 0;
}
if (acc == mem) {
cpuStatus.zero = 1;
} else {
cpuStatus.zero = 0;
}
prc++;
break;
}
case 0x90: {
uint8_t mem = memory[memory[++prc+addr]];
if (cpuStatus.carry == 0x00) {
prc += mem;
}
break;
}
case 0x10: {
uint8_t mem = memory[memory[++prc+addr]];
if (cpuStatus.neg == 0x00) {
prc += mem;
}
break;
}
case 0xF0: {
uint8_t mem = memory[memory[++prc+addr]];
if (cpuStatus.zero == 0x00) {
prc += mem;
}
break;
}
default:
printf("Opcode 0x%02X\n not implemented!\n", inst);
_exit(0);
}
printf("Ran inst 0x%02X\n", inst);
memview();
}
return 0;
}