xyw_memory[SYSTEM_STATE] = 1;
while (xyw_memory[SYSTEM_STATE] && *pc < SYSTEM_MEMORY_START)
{
xyw_dbg("PC: %04X -> %02X (%s)\n", *pc, xyw_memory[*pc], xyw_instructions[xyw_memory[*pc] & 0x1F]);
switch (xyw_memory[*pc])
{
// clang-format off
/* BRK */ case 0x00: break;
/* PSH */ OPC_PSH(0x01);
/* POP */ OPC_POP(0x02);
/* LDR */ OPC_R1(0x03, PUSH(READ(a)));
/* LDA */ OPC_S(0x04, READ(us_popw()));
/* STA */ OPC_SR1(0x05, WRITE(us_popw(), a));
/* LDP */ OPC_S(0x06, READ(DIRECT_PAGE | us_pop()));
/* STP */ OPC_SR1(0x07, WRITE(DIRECT_PAGE | us_pop(), a));
/* INC */ OPC_IDC(0x08, +1);
/* DEC */ OPC_IDC(0x09, -1);
/* SHL */ OPC_SR2(0x0A, PUSH(b << a));
/* SHR */ OPC_SR2(0x0B, PUSH(b >> a));
/* ADD */ OPC_SR2(0x0C, PUSH(a + b));
/* SUB */ OPC_SR2(0x0D, PUSH(b - a));
/* MUL */ OPC_SR2(0x0E, PUSH(a * b));
/* DIV */ OPC_SR2(0x0F, PUSH(b / a));
/* EQU */ OPC_SR2(0x10, PUSH(b == a));
/* NEQ */ OPC_SR2(0x11, PUSH(b != a));
/* GTH */ OPC_SR2(0x12, PUSH(b > a));
/* LTH */ OPC_SR2(0x13, PUSH(b < a));
/* AND */ OPC_SR2(0x14, PUSH(b & a));
/* IOR */ OPC_SR2(0x15, PUSH(b | a));
/* XOR */ OPC_SR2(0x16, PUSH(b ^ a));
/* NOT */ OPC_SR1(0x17, PUSH(~a));
/* SWP */ OPC_SWP(0x18);
/* DUP */ OPC_SR1(0x19, PUSH(a));
/* OVR */ OPC_SR2(0x1A, PUSH(b); PUSH(a); PUSH(b));
/* ROT */ OPC_SR2(0x1B, PUSH(b); PUSH(POP()); PUSH(a));
/* JMP */ case 0x1C: *pc = us_popw(); break;
/* JCN */ OPC_SR1(0x1D, if (a) { *pc = POP(); } );
/* JSR */ case 0x1E: xyw_word addr = us_popw(); ss_pushw(*pc); *pc = addr; break;
/* RTS */ case 0x1F: *pc = ss_popw(); break;
// clang-format on
}
// TODO: error handling etc.
(*pc)++;
}