- switch(op)
- {
- case 0x0: /* NOP */
- break;
- case 0x1000: /* LD */
- setfr(sys->cpu->gr[r_r1] = val);
- break;
- case 0x1100: /* ST */
- sys->memory[val] = sys->cpu->gr[r_r1];
- break;
- case 0x1200: /* LAD */
- sys->cpu->gr[r_r1] = val;
- break;
- case 0x2000: /* ADDA */
- sys->cpu->gr[r_r1] = adda(sys->cpu->gr[r_r1], val);
- break;
- case 0x2100: /* SUBA */
- sys->cpu->gr[r_r1] = suba(sys->cpu->gr[r_r1], val);
- break;
- case 0x2200: /* ADDL */
- sys->cpu->gr[r_r1] = addl(sys->cpu->gr[r_r1], val);
- break;
- case 0x2300: /* SUBL */
- sys->cpu->gr[r_r1] = subl(sys->cpu->gr[r_r1], val);
- break;
- case 0x3000: /* AND */
- setfr(sys->cpu->gr[r_r1] &= val);
- break;
- case 0x3100: /* OR */
- setfr(sys->cpu->gr[r_r1] |= val);
- break;
- case 0x3200: /* XOR */
- setfr(sys->cpu->gr[r_r1] ^= val);
- break;
- case 0x4000: /* CPA */
- cpa(sys->cpu->gr[r_r1], val);
- break;
- case 0x4100: /* CPL */
- cpl(sys->cpu->gr[r_r1], val);
- break;
- case 0x5000: /* SLA */
- sys->cpu->gr[r_r1] = sla(sys->cpu->gr[r_r1], val);
- break;
- case 0x5100: /* SRA */
- sys->cpu->gr[r_r1] = sra(sys->cpu->gr[r_r1], val);
- break;
- case 0x5200: /* SLL */
- sys->cpu->gr[r_r1] = sll(sys->cpu->gr[r_r1], val);
- break;
- case 0x5300: /* SRL */
- sys->cpu->gr[r_r1] = srl(sys->cpu->gr[r_r1], val);
- break;
- case 0x6100: /* JMI */
- if((sys->cpu->fr & SF) > 0) {
- sys->cpu->pr = val;
- }
- break;
- case 0x6200: /* JNZ */
- if((sys->cpu->fr & ZF) == 0) {
- sys->cpu->pr = val;
- }
- break;
- case 0x6300: /* JZE */
- if((sys->cpu->fr & ZF) > 0) {
- sys->cpu->pr = val;
- }
- break;
- case 0x6400: /* JUMP */
- sys->cpu->pr = val;
- break;
- case 0x6500: /* JPL */
- if((sys->cpu->fr & (SF | ZF)) == 0) {
- sys->cpu->pr = val;
- }
- break;
- case 0x6600: /* JOV */
- if((sys->cpu->fr & OF) > 0) {
- sys->cpu->pr = val;
- }
- break;
- case 0x7000: /* PUSH */
- assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize);
- sys->memory[--(sys->cpu->sp)] = val;
- break;
- case 0x7100: /* POP */
- assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize);
- sys->cpu->gr[r_r1] = sys->memory[(sys->cpu->sp)++];
- break;
- case 0x8000: /* CALL */
- assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize);
- sys->memory[--(sys->cpu->sp)] = sys->cpu->pr;
- sys->cpu->pr = val;
- break;
- case 0x8100: /* RET */
- assert(sys->cpu->sp > prog->end && sys->cpu->sp <= sys->memsize);
- if(sys->cpu->sp == sys->memsize) {
- return true;
- } else {
- sys->cpu->pr = sys->memory[(sys->cpu->sp)++];
- break;
- }
- case 0xF000: /* SVC */
- switch(val)
- {
- case 0x0: /* EXIT */
- return true;
- case 0x1: /* IN */
- svcin();
- break;
- case 0x2: /* OUT */
- svcout();
- break;
- }
- default: