static void saturn_instruction(saturn_state *cpustate) { int reg, adr; switch(READ_OP(cpustate)) { case 0: switch(READ_OP(cpustate)) { case 0: saturn_return_xm_set(cpustate);break; case 1: saturn_return(cpustate, 1);break; case 2: saturn_return_carry_set(cpustate);break; case 3: saturn_return_carry_clear(cpustate);break; case 4: saturn_sethex(cpustate);break; case 5: saturn_setdec(cpustate);break; case 6: saturn_push_c(cpustate);break; case 7: saturn_pop_c(cpustate);break; case 8: saturn_clear_st(cpustate);break; case 9: saturn_st_to_c(cpustate);break; case 0xa: saturn_c_to_st(cpustate);break; case 0xb: saturn_exchange_c_st(cpustate);break; case 0xc: saturn_inc_p(cpustate);break; case 0xd: saturn_dec_p(cpustate);break; case 0xe: saturn_instruction_0e(cpustate);break; case 0xf: saturn_return_interrupt(cpustate);break; } break; case 1: saturn_instruction_1(cpustate); break; case 2: saturn_load_p(cpustate); break; case 3: saturn_load_reg(cpustate, C); break; // lc case 4: adr=READ_OP_DIS8(cpustate); if (adr==0) { saturn_return(cpustate, cpustate->carry); } else { saturn_jump(cpustate, (cpustate->pc+adr-2)&0xfffff, cpustate->carry); } break; case 5: adr=READ_OP_DIS8(cpustate); if (adr==0) { saturn_return(cpustate, !cpustate->carry); } else { saturn_jump(cpustate, (cpustate->pc+adr-2)&0xfffff,!cpustate->carry); } break; case 6: adr=READ_OP_DIS12(cpustate); saturn_jump(cpustate, (cpustate->pc+adr-3)&0xfffff,1); break; case 7: adr=READ_OP_DIS12(cpustate); saturn_call(cpustate, (adr+cpustate->pc)&0xfffff); break; case 8: saturn_instruction_8(cpustate); break; case 9: saturn_instruction_9(cpustate); break; case 0xa: saturn_instruction_a(cpustate); break; case 0xb: saturn_instruction_b(cpustate); break; case 0xc: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_add(cpustate, add_left[reg], BEGIN_A, COUNT_A, add_right[reg]); break; case 4: case 5: case 6: case 7: saturn_add(cpustate, A+(reg&3), BEGIN_A, COUNT_A, A+(reg&3)); break; case 0xc: case 0xd: case 0xe: case 0xf: saturn_decrement(cpustate, A+(reg&3), BEGIN_A, COUNT_A); break; } break; case 0xd: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: saturn_clear(cpustate, A+reg, BEGIN_A, COUNT_A); break; // a=0 a case 4: case 5: case 6: case 7: case 8: case 9: case 0xa: case 0xb: saturn_copy(cpustate, reg_right[reg&7], BEGIN_A, COUNT_A, reg_left[reg&7]); break; // a=b a case 0xc: case 0xd: case 0xe: case 0xf: saturn_exchange(cpustate, reg_left[reg&3], BEGIN_A, COUNT_A, reg_right[reg&3]); break; // abex a } break; case 0xe: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_sub(cpustate, sub_left[reg], BEGIN_A, COUNT_A, sub_right[reg]); break; case 4: case 5: case 6: case 7: saturn_increment(cpustate, A+(reg&3), BEGIN_A, COUNT_A); break; // a=a+1 a case 0xc: case 0xd: case 0xe: case 0xf: saturn_sub2(cpustate, sub_left[reg], BEGIN_A, COUNT_A, sub_right[reg]); break; } break; case 0xf: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: saturn_shift_nibble_left(cpustate, A+reg,BEGIN_A, COUNT_A); break; // asl a case 4: case 5: case 6: case 7: saturn_shift_nibble_right(cpustate, A+(reg&3),BEGIN_A, COUNT_A); break; // asr a case 8: case 9: case 0xa: case 0xb: saturn_negate(cpustate, A+(reg&3),BEGIN_A, COUNT_A); break; // A=-A a case 0xc: case 0xd: case 0xe: case 0xf: saturn_invert(cpustate, A+(reg&3),BEGIN_A, COUNT_A); break; // A=-A-1 a } break; } }
static void saturn_instruction_81a(saturn_state *cpustate) { int reg, adr,op; switch(adr=READ_OP(cpustate)) { case 0: switch(op=READ_OP(cpustate)) { case 0: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_copy(cpustate, R0+reg,cpustate->p,1,A); break; //r0=a p case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(cpustate, R0+(reg&7),cpustate->p,1,C); break; //r0=c p default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; case 1: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_copy(cpustate, A,cpustate->p,1,R0+reg); break; //a=r0 p case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(cpustate, C,cpustate->p,1,R0+(reg&7)); break; //c=r0 p default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; case 2: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_exchange(cpustate, A, cpustate->p,1,R0+reg); break; // ar0ex p case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_exchange(cpustate, C, cpustate->p,1,R0+(reg&7)); break; // cr0ex p default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; default: saturn_invalid5( cpustate, 8, 1, 0xa, adr, op ); break; } break; case 1: switch(op=READ_OP(cpustate)) { case 0: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_copy(cpustate, R0+reg,0,cpustate->p+1,A); break; //r0=a wp case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(cpustate, R0+(reg&7),0,cpustate->p+1,C); break; //r0=c wp default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; case 1: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_copy(cpustate, A,0,cpustate->p+1,R0+reg); break; //a=r0 wp case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(cpustate, C,0,cpustate->p+1,R0+(reg&7)); break; //c=r0 wp default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; case 2: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_exchange(cpustate, A, 0, cpustate->p+1, R0+reg); break; // ar0ex wp case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_exchange(cpustate, C, 0, cpustate->p+1, R0+(reg&7)); break; // cr0ex wp default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; default: saturn_invalid5( cpustate, 8, 1, 0xa, adr, op ); break; } break; case 2: case 3: case 4: case 5: case 6: case 7: case 0xf: switch(op=READ_OP(cpustate)) { case 0: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_copy(cpustate, R0+reg,adr_af_begin[adr],adr_af_count[adr],A); break; //r0=a xs case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(cpustate, R0+(reg&7),adr_af_begin[adr], adr_af_count[adr],C); break; //r0=c xs default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; case 1: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_copy(cpustate, A,adr_af_begin[adr],adr_af_count[adr],R0+reg); break; //a=r0 xs case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(cpustate, C,adr_af_begin[adr],adr_af_count[adr],R0+(reg&7)); break; //c=r0 xs default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; case 2: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_exchange(cpustate, A, adr_af_begin[adr], adr_af_count[adr], R0+reg); break; // ar0ex xs case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_exchange(cpustate, C, adr_af_begin[adr], adr_af_count[adr], R0+(reg&7)); break; // cr0ex xs default: saturn_invalid6( cpustate, 8, 1, 0xa, adr, op, reg); break; } break; default: saturn_invalid5( cpustate, 8, 1, 0xa, adr, op ); break; } break; default: saturn_invalid4( cpustate, 8, 1, 0xa, adr ); break; } }
static void saturn_instruction_a(saturn_state *cpustate) { int reg, adr; switch(adr=READ_OP(cpustate)) { case 0: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_add(cpustate, add_left[reg], cpustate->p, 1, add_right[reg]); break; case 4: case 5: case 6: case 7: saturn_add(cpustate, A+(reg&3), cpustate->p, 1, A+(reg&3)); break; case 0xc: case 0xd: case 0xe: case 0xf: saturn_decrement(cpustate, A+(reg&3), cpustate->p, 1); break; } break; case 1: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_add(cpustate, add_left[reg], 0, cpustate->p+1, add_right[reg]); break; case 4: case 5: case 6: case 7: saturn_add(cpustate, A+(reg&3), 0, cpustate->p+1, A+(reg&3)); break; case 0xc: case 0xd: case 0xe: case 0xf: saturn_decrement(cpustate, A+(reg&3), 0, cpustate->p+1); break; } break; case 2: case 3: case 4: case 5: case 6: case 7: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_add(cpustate, add_left[reg], adr_a_begin[adr], adr_a_count[adr], add_right[reg]); break; case 4: case 5: case 6: case 7: saturn_add(cpustate, A+(reg&3), adr_a_begin[adr], adr_a_count[adr], A+(reg&3)); break; case 0xc: case 0xd: case 0xe: case 0xf: saturn_decrement(cpustate, A+(reg&3), adr_a_begin[adr], adr_a_count[adr]); break; } break; case 8: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: saturn_clear(cpustate, A+reg, cpustate->p,1); break; // a=0 p case 4: case 5: case 6: case 7: case 8: case 9: case 0xa: case 0xb: saturn_copy(cpustate, reg_right[reg&7], cpustate->p,1,reg_left[reg&7]); break; // a=b p case 0xc: case 0xd: case 0xe: case 0xf: saturn_exchange(cpustate, reg_left[reg&3], cpustate->p,1,reg_right[reg&3]); break; // abex p } break; case 9: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: saturn_clear(cpustate, A+reg,0,cpustate->p+1); break; // a=0 wp case 4: case 5: case 6: case 7: case 8: case 9: case 0xa: case 0xb: saturn_copy(cpustate, reg_right[reg&7], 0, cpustate->p+1, reg_left[reg&7]); break; // a=b wp case 0xc: case 0xd: case 0xe: case 0xf: saturn_exchange(cpustate, reg_left[reg&3], 0, cpustate->p+1, reg_right[reg&3]); break; // abex wp } break; case 0xa: case 0xb: case 0xc: case 0xd: case 0xe: case 0xf: switch(reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: saturn_clear(cpustate, A+reg, adr_b_begin[adr], adr_b_count[adr]); break; // a=0 xs case 4: case 5: case 6: case 7: case 8: case 9: case 0xa: case 0xb: saturn_copy(cpustate, reg_right[reg&7], adr_b_begin[adr], adr_b_count[adr], reg_left[reg&7]); break; // a=b xs case 0xc: case 0xd: case 0xe: case 0xf: saturn_exchange(cpustate, reg_left[reg&3], adr_b_begin[adr], adr_b_count[adr], reg_right[reg&3]); break; // abex xs } break; } }
static void saturn_instruction_1(saturn_state *cpustate) { int reg, adr, oper; switch (adr=READ_OP(cpustate)) { case 0: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_copy(cpustate, R0+reg, BEGIN_W, COUNT_W, A); break; // r0=a w case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(cpustate, R0+(reg&7), BEGIN_W, COUNT_W, C); break; // r0=c w default: saturn_invalid3( cpustate, 1, adr, reg ); break; } break; case 1: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_copy(cpustate, A, BEGIN_W, COUNT_W, R0+reg); break; // a=r0 w case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(cpustate, C, BEGIN_W, COUNT_W, R0+(reg&7)); break; // c=r0 w default: saturn_invalid3( cpustate, 1, adr, reg ); break; } break; case 2: switch (reg=READ_OP(cpustate)) { case 0: case 1: case 2: case 3: case 4: saturn_exchange(cpustate, A, BEGIN_W, COUNT_W, R0+reg); break; // ar0ex w case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_exchange(cpustate, C, BEGIN_W, COUNT_W, R0+(reg&7)); break; // cr0ex w default: saturn_invalid3( cpustate, 2, adr, reg ); break; } break; case 3: switch (READ_OP(cpustate)) { case 0: saturn_reg_to_adr(cpustate, A,0);break; case 1: saturn_reg_to_adr(cpustate, A,1);break; case 2: saturn_exchange_adr_reg(cpustate, 0,A);break; case 3: saturn_exchange_adr_reg(cpustate, 1,A);break; case 4: saturn_reg_to_adr(cpustate, C,0);break; case 5: saturn_reg_to_adr(cpustate, C,1);break; case 6: saturn_exchange_adr_reg(cpustate, 0,C);break; case 7: saturn_exchange_adr_reg(cpustate, 1,C);break; case 8: saturn_reg_to_adr_word(cpustate, A,0);break; case 9: saturn_reg_to_adr_word(cpustate, A,1);break; case 0xa: saturn_exchange_adr_reg_word(cpustate, 0,A);break; case 0xb: saturn_exchange_adr_reg_word(cpustate, 1,A);break; case 0xc: saturn_reg_to_adr_word(cpustate, C,0);break; case 0xd: saturn_reg_to_adr_word(cpustate, C,1);break; case 0xe: saturn_exchange_adr_reg_word(cpustate, 0,C);break; case 0xf: saturn_exchange_adr_reg_word(cpustate, 1,C);break; } break; case 4: switch (READ_OP(cpustate)) { case 0: saturn_store_nibbles(cpustate, A, BEGIN_A, COUNT_A, 0); break; case 1: saturn_store_nibbles(cpustate, A, BEGIN_A, COUNT_A, 1); break; case 2: saturn_load_nibbles(cpustate, A, BEGIN_A, COUNT_A, 0); break; case 3: saturn_load_nibbles(cpustate, A, BEGIN_A, COUNT_A, 1); break; case 4: saturn_store_nibbles(cpustate, C, BEGIN_A, COUNT_A, 0); break; case 5: saturn_store_nibbles(cpustate, C, BEGIN_A, COUNT_A, 1); break; case 6: saturn_load_nibbles(cpustate, C, BEGIN_A, COUNT_A, 0); break; case 7: saturn_load_nibbles(cpustate, C, BEGIN_A, COUNT_A, 1); break; case 8: saturn_store_nibbles(cpustate, A, BEGIN_B, COUNT_B, 0); break; case 9: saturn_store_nibbles(cpustate, A, BEGIN_B, COUNT_B, 1); break; case 0xa: saturn_load_nibbles(cpustate, A, BEGIN_B, COUNT_B, 0); break; case 0xb: saturn_load_nibbles(cpustate, A, BEGIN_B, COUNT_B, 1); break; case 0xc: saturn_store_nibbles(cpustate, C, BEGIN_B, COUNT_B, 0); break; case 0xd: saturn_store_nibbles(cpustate, C, BEGIN_B, COUNT_B, 1); break; case 0xe: saturn_load_nibbles(cpustate, C, BEGIN_B, COUNT_B, 0); break; case 0xf: saturn_load_nibbles(cpustate, C, BEGIN_B, COUNT_B, 1); break; } break; case 5: switch (oper=READ_OP(cpustate)) { case 0: case 1: case 4: case 5: switch (adr=READ_OP(cpustate)) { case 0: saturn_store_nibbles(cpustate, oper&4?C:A,cpustate->p,1,oper&1); break; case 1: saturn_store_nibbles(cpustate, oper&4?C:A,0,cpustate->p+1,oper&1); break; case 2: case 3: case 4: case 5: case 6: case 7: saturn_store_nibbles(cpustate, oper&4?C:A,adr_a_begin[adr],adr_a_count[adr],oper&1); break; default: saturn_invalid4( cpustate, 1, 5, oper, adr ); break; } break; case 2: case 3: case 6: case 7: switch (adr=READ_OP(cpustate)) { case 0: saturn_load_nibbles(cpustate, oper&4?C:A,cpustate->p,1,oper&1); break; case 1: saturn_load_nibbles(cpustate, oper&4?C:A,0,cpustate->p+1,oper&1); break; case 2: case 3: case 4: case 5: case 6: case 7: saturn_load_nibbles(cpustate, oper&4?C:A,adr_a_begin[adr],adr_a_count[adr],oper&1); break; default: saturn_invalid4( cpustate, 1, 5, oper, adr ); break; } break; case 8: saturn_store_nibbles(cpustate, A, 0, READ_OP(cpustate)+1, 0); break; case 9: saturn_store_nibbles(cpustate, A, 0, READ_OP(cpustate)+1, 1); break; case 0xa: saturn_load_nibbles(cpustate, A, 0, READ_OP(cpustate)+1, 0); break; case 0xb: saturn_load_nibbles(cpustate, A, 0, READ_OP(cpustate)+1, 1); break; case 0xc: saturn_store_nibbles(cpustate, C, 0, READ_OP(cpustate)+1, 0); break; case 0xd: saturn_store_nibbles(cpustate, C, 0, READ_OP(cpustate)+1, 1); break; case 0xe: saturn_load_nibbles(cpustate, C, 0, READ_OP(cpustate)+1, 0); break; case 0xf: saturn_load_nibbles(cpustate, C, 0, READ_OP(cpustate)+1, 1); break; } break; case 6: saturn_add_adr(cpustate, 0);break; case 7: saturn_add_adr(cpustate, 1);break; case 8: saturn_sub_adr(cpustate, 0);break; case 9: saturn_load_adr(cpustate, 0,2);break; case 0xa: saturn_load_adr(cpustate, 0,4);break; case 0xb: saturn_load_adr(cpustate, 0,5);break; case 0xc: saturn_sub_adr(cpustate, 1);break; case 0xd: saturn_load_adr(cpustate, 1,2);break; case 0xe: saturn_load_adr(cpustate, 1,4);break; case 0xf: saturn_load_adr(cpustate, 1,5);break; } }
static void saturn_instruction(void) { int reg, adr; switch(READ_OP()) { case 0: switch(READ_OP()) { case 0: saturn_return_xm_set();break; case 1: saturn_return(1);break; case 2: saturn_return_carry_set();break; case 3: saturn_return_carry_clear();break; case 4: saturn_sethex();break; case 5: saturn_setdec();break; case 6: saturn_push_c();break; case 7: saturn_pop_c();break; case 8: saturn_clear_st();break; case 9: saturn_st_to_c();break; case 0xa: saturn_c_to_st();break; case 0xb: saturn_exchange_c_st();break; case 0xc: saturn_inc_p(); break; case 0xd: saturn_dec_p(); break; case 0xf: saturn_return_interrupt();break; case 0xe: saturn_instruction_0e(); break; } break; case 1: saturn_instruction_1(); break; case 2: saturn_load_p(); break; case 3: saturn_load_reg(C);break; /* lc */ case 4: adr=READ_OP_DIS8(); if (adr==0) { saturn_return(saturn.carry); } else { saturn_jump((saturn.pc+adr-2)&0xfffff, saturn.carry); } break; case 5: adr=READ_OP_DIS8(); if (adr==0) { saturn_return(!saturn.carry); } else { saturn_jump((saturn.pc+adr-2)&0xfffff,!saturn.carry); } break; case 6: adr=READ_OP_DIS12(); saturn_jump((saturn.pc+adr-3)&0xfffff,1); break; case 7: adr=READ_OP_DIS12(); saturn_call((adr+saturn.pc)&0xfffff); break; case 8: saturn_instruction_8(); break; case 9: saturn_instruction_9(); break; case 0xa: saturn_instruction_a(); break; case 0xb: saturn_instruction_b(); break; case 0xc: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_add(add_left[reg], BEGIN_A, COUNT_A, add_right[reg]); break; case 4: case 5: case 6: case 7: saturn_shift_left(A+(reg&3), BEGIN_A, COUNT_A); break; case 0xc: case 0xd: case 0xe: case 0xf: saturn_decrement(A+(reg&3), BEGIN_A, COUNT_A); break; } break; case 0xd: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: saturn_clear(A+reg, BEGIN_A, COUNT_A); break; /* a=0 a */ case 4: case 5: case 6: case 7: case 8: case 9: case 0xa: case 0xb: saturn_copy(reg_right[reg&7], BEGIN_A, COUNT_A, reg_left[reg&7]); /*correct */ break; /* a=b a */ case 0xc: case 0xd: case 0xe: case 0xf: saturn_exchange(reg_left[reg&3], BEGIN_A, COUNT_A, reg_right[reg&3]); break; /* abex a */ } break; case 0xe: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_sub(sub_left[reg], BEGIN_A, COUNT_A, S64_READ_A(sub_right[reg])); break; case 4: case 5: case 6: case 7: saturn_increment(A+(reg&3), BEGIN_A, COUNT_A); break; /* a=a+1 a */ case 0xc: case 0xd: case 0xe: case 0xf: saturn_sub2(sub_left[reg], BEGIN_A, COUNT_A, S64_READ_A(sub_right[reg])); break; } break; case 0xf: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: saturn_shift_nibble_left(A+reg,BEGIN_A, COUNT_A); break; /* asl a */ case 4: case 5: case 6: case 7: saturn_shift_nibble_right(A+(reg&3),BEGIN_A, COUNT_A); break; /* asr a */ case 8: case 9: case 0xa: case 0xb: saturn_invert(A+(reg&3),BEGIN_A, COUNT_A); break; /* A=-A a */ case 0xc: case 0xd: case 0xe: case 0xf: saturn_negate(A+(reg&3),BEGIN_A, COUNT_A); break; /* A=-A-1 a */ } break; } }
static void saturn_instruction_1(void) { int reg, adr, oper; switch (adr=READ_OP()) { case 0: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_copy(R0+reg, BEGIN_W, COUNT_W, A); break; /* r0=a w */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(R0+(reg&7), BEGIN_W, COUNT_W, C); break; /* r0=c w */ } break; case 1: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_copy(A, BEGIN_W, COUNT_W, R0+reg); break; /* a=r0 w */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(C, BEGIN_W, COUNT_W, R0+(reg&7)); break; /* c=r0 w */ } break; case 2: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_exchange(A, BEGIN_W, COUNT_W, R0+reg); break; /* ar0ex w */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_exchange(C, BEGIN_W, COUNT_W, R0+(reg&7)); break; /* cr0ex w */ } break; case 3: switch (READ_OP()) { case 0: saturn_reg_to_adr(A,0);break; case 1: saturn_reg_to_adr(A,1);break; case 2: saturn_exchange_adr_reg(0,A);break; case 3: saturn_exchange_adr_reg(1,A);break; case 4: saturn_reg_to_adr(C,0);break; case 5: saturn_reg_to_adr(C,1);break; case 6: saturn_exchange_adr_reg(0,C);break; case 7: saturn_exchange_adr_reg(1,C);break; case 8: saturn_reg_to_adr_word(A,0);break; case 9: saturn_reg_to_adr_word(A,1);break; case 0xa: saturn_exchange_adr_reg_word(0,A);break; case 0xb: saturn_exchange_adr_reg_word(1,A);break; case 0xc: saturn_reg_to_adr_word(C,0);break; case 0xd: saturn_reg_to_adr_word(C,1);break; case 0xe: saturn_exchange_adr_reg_word(0,C);break; case 0xf: saturn_exchange_adr_reg_word(1,C);break; } break; case 4: switch (READ_OP()) { case 0: saturn_store_nibbles(A, BEGIN_A, COUNT_A, 0); break; case 1: saturn_store_nibbles(A, BEGIN_A, COUNT_A, 1); break; case 2: saturn_load_nibbles(A, BEGIN_A, COUNT_A, 0); break; case 3: saturn_load_nibbles(A, BEGIN_A, COUNT_A, 1); break; case 4: saturn_store_nibbles(C, BEGIN_A, COUNT_A, 0); break; case 5: saturn_store_nibbles(C, BEGIN_A, COUNT_A, 1); break; case 6: saturn_load_nibbles(C, BEGIN_A, COUNT_A, 0); break; case 7: saturn_load_nibbles(C, BEGIN_A, COUNT_A, 1); break; case 8: saturn_store_nibbles(A, BEGIN_B, COUNT_B, 0); break; case 9: saturn_store_nibbles(A, BEGIN_B, COUNT_B, 1); break; case 0xa: saturn_load_nibbles(A, BEGIN_B, COUNT_B, 0); break; case 0xb: saturn_load_nibbles(A, BEGIN_B, COUNT_B, 1); break; case 0xc: saturn_store_nibbles(C, BEGIN_B, COUNT_B, 0); break; case 0xd: saturn_store_nibbles(C, BEGIN_B, COUNT_B, 1); break; case 0xe: saturn_load_nibbles(C, BEGIN_B, COUNT_B, 0); break; case 0xf: saturn_load_nibbles(C, BEGIN_B, COUNT_B, 1); break; } break; case 5: switch (oper=READ_OP()) { case 0: case 1: case 4: case 5: switch (adr=READ_OP()) { case 0: saturn_store_nibbles(oper&4?C:A,saturn.p,1,oper&1); break; case 1: saturn_store_nibbles(oper&4?C:A,0,saturn.p+1,oper&1); break; case 2: case 3: case 4: case 5: case 6: case 7: saturn_store_nibbles(oper&4?C:A,adr_a_begin[adr],adr_a_count[adr],oper&1); break; } break; case 2: case 3: case 6: case 7: switch (adr=READ_OP()) { case 0: saturn_load_nibbles(oper&4?C:A,saturn.p,1,oper&1); break; case 1: saturn_load_nibbles(oper&4?C:A,0,saturn.p+1,oper&1); break; case 2: case 3: case 4: case 5: case 6: case 7: saturn_load_nibbles(oper&4?C:A,adr_a_begin[adr],adr_a_count[adr],oper&1); break; } break; case 8: saturn_store_nibbles(A, 0, READ_OP()+1, 0); break; case 9: saturn_store_nibbles(A, 0, READ_OP()+1, 1); break; case 0xa: saturn_load_nibbles(A, 0, READ_OP()+1, 0); break; case 0xb: saturn_load_nibbles(A, 0, READ_OP()+1, 1); break; case 0xc: saturn_store_nibbles(C, 0, READ_OP()+1, 0); break; case 0xd: saturn_store_nibbles(C, 0, READ_OP()+1, 1); break; case 0xe: saturn_load_nibbles(C, 0, READ_OP()+1, 0); break; case 0xf: saturn_load_nibbles(C, 0, READ_OP()+1, 1); break; } break; case 9: saturn_load_adr(0,2);break; case 0xa: saturn_load_adr(0,4);break; case 0xb: saturn_load_adr(0,5);break; case 0xd: saturn_load_adr(1,2);break; case 0xe: saturn_load_adr(1,4);break; case 0xf: saturn_load_adr(1,5);break; case 6: saturn_add_adr(0);break; case 7: saturn_add_adr(1);break; case 8: saturn_sub_adr(0);break; case 0xc: saturn_sub_adr(1);break; } }
static void saturn_instruction_a(void) { int reg, adr; switch(adr=READ_OP()) { case 0: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_add(add_left[reg], saturn.p, 1, add_right[reg]); break; break; case 4: case 5: case 6: case 7: saturn_shift_left(A+(reg&3), saturn.p, 1); break; case 0xc: case 0xd: case 0xe: case 0xf: saturn_decrement(A+(reg&3), saturn.p, 1); break; } break; case 1: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_add(add_left[reg], 1, saturn.p+1, add_right[reg]); break; case 4: case 5: case 6: case 7: saturn_shift_left(A+(reg&3), 1, saturn.p+1); break; case 0xc: case 0xd: case 0xe: case 0xf: saturn_decrement(A+(reg&3), 1, saturn.p+1); break; } break; case 2: case 3: case 4: case 5: case 6: case 7: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 8: case 9: case 0xa: case 0xb: saturn_add(add_left[reg], adr_a_begin[adr], adr_a_count[adr], add_right[reg]); break; case 4: case 5: case 6: case 7: saturn_shift_left(A+(reg&3), adr_a_begin[adr], adr_a_count[adr]); break; case 0xc: case 0xd: case 0xe: case 0xf: saturn_decrement(A+(reg&3), adr_a_begin[adr], adr_a_count[adr]); break; } break; case 8: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: saturn_clear(A+reg, saturn.p,1); break; /* a=0 p */ case 4: case 5: case 6: case 7: case 8: case 9: case 0xa: case 0xb: saturn_copy(reg_right[reg&7], saturn.p,1,reg_left[reg&7]); /*!correct */ break; /* a=b p */ case 0xc: case 0xd: case 0xe: case 0xf: saturn_exchange(reg_left[reg&3], saturn.p,1,reg_right[reg&3]); break; /* abex p */ } break; case 9: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: saturn_clear(A+reg,0,saturn.p+1); break; /* a=0 wp */ case 4: case 5: case 6: case 7: case 8: case 9: case 0xa: case 0xb: saturn_copy(reg_right[reg&7], 0, saturn.p+1, reg_left[reg&7]); /*!correct */ break; /* a=b wp */ case 0xc: case 0xd: case 0xe: case 0xf: saturn_exchange(reg_left[reg&3], 0, saturn.p+1, reg_right[reg&3]); break; /* abex wp */ } break; case 0xa: case 0xb: case 0xc: case 0xd: case 0xe: case 0xf: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: saturn_clear(A+reg, adr_b_begin[adr], adr_b_count[adr]); break; /* a=0 xs */ case 4: case 5: case 6: case 7: case 8: case 9: case 0xa: case 0xb: saturn_copy(reg_right[reg&7], adr_b_begin[adr], adr_b_count[adr], reg_left[reg&7]); /*correct */ break; /* a=b xs */ case 0xc: case 0xd: case 0xe: case 0xf: saturn_exchange(reg_left[reg&3], adr_b_begin[adr], adr_b_count[adr], reg_right[reg&3]); break; /* abex xs */ } break; } }
static void saturn_instruction_81a(void) { int reg, adr; switch(adr=READ_OP()) { case 0: switch(READ_OP()) { case 0: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_copy(R0+reg,saturn.p,1,A); break; /*r0=a p */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(R0+(reg&7),saturn.p,1,C); break; /*r0=c p */ } break; case 1: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_copy(A,saturn.p,1,R0+reg); break; /*a=r0 p */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(C,saturn.p,1,R0+(reg&7)); break; /*c=r0 p */ } break; case 2: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_exchange(A, saturn.p,1,R0+reg); break; /* ar0ex p */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_exchange(C, saturn.p,1,R0+(reg&7)); break; /* cr0ex p */ } break; } break; case 1: switch(READ_OP()) { case 0: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_copy(R0+reg,0,saturn.p+1,A); break; /*r0=a wp */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(R0+(reg&7),0,saturn.p+1,C); break; /*r0=c wp */ } break; case 1: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_copy(A,0,saturn.p+1,R0+reg); break; /*a=r0 wp */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(C,0,saturn.p+1,R0+(reg&7)); break; /*c=r0 wp */ } break; case 2: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_exchange(A, 0, saturn.p+1, R0+reg); break; /* ar0ex wp */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_exchange(C, 0, saturn.p+1, R0+(reg&7)); break; /* cr0ex wp */ } break; } break; case 2: case 3: case 4: case 5: case 6: case 7: case 0xf: switch(READ_OP()) { case 0: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_copy(R0+reg,adr_af_begin[adr],adr_af_count[adr],A); break; /*r0=a xs */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(R0+(reg&7),adr_af_begin[adr], adr_af_count[adr],C); break; /*r0=c xs */ } break; case 1: switch(reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_copy(A,adr_af_begin[adr],adr_af_count[adr],R0+reg); break; /*a=r0 xs */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_copy(C,adr_af_begin[adr],adr_af_count[adr],R0+(reg&7)); break; /*c=r0 xs */ } break; case 2: switch (reg=READ_OP()) { case 0: case 1: case 2: case 3: case 4: saturn_exchange(A, adr_af_begin[adr], adr_af_count[adr], R0+reg); break; /* ar0ex xs */ case 8: case 9: case 0xa: case 0xb: case 0xc: saturn_exchange(C, adr_af_begin[adr], adr_af_count[adr], R0+(reg&7)); break; /* cr0ex xs */ } break; } break; } }