#include "constants.h" #include #include #include 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; }