browser

devlog-run-switch.c

devlog-run-switch.c
calendarsave
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)++;
    }