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