#include "vcpu.h" #include "mem.h" #include "screen.h" #include // Current VCPU state VCPU_State State; void VCPUInit(){ State.PC=ADDR_ROM; } void VCPUFetch(){ unsigned char byte[2]; MemRead(byte,2,State.PC); // Little indian to -1 no +1 State.opcode=byte[0]; State.opcode=State.opcode<<8; State.opcode=State.opcode | byte[1]; State.PC+=2; } void VCPUDecode(){ State.X=(State.opcode<<4) & 0xF0; State.Y=(State.opcode<<8) & 0xF0; State.N=(State.opcode<<12) & 0xF0; State.NN=(State.opcode<<8) & 0xFF; State.NNN=(State.opcode<<4) & 0xFFF0; } void VCPUExecute(){ switch(State.opcode >> 12){ case 0x0: ScreenClear(); break ;; case 0x1: State.PC=State.NNN; break ;; case 0x6: State.V[State.X]=State.NN; break ;; case 0x7: State.V[State.X]+=State.NN; break ;; case 0xA: State.I=State.NNN; break ;; case 0xD: int X=State.V[State.X]%63; int Y=State.V[State.Y]%31; State.V[0xF]=0; // Set flag to 0 for(char row=0;row