deco16: Vectors are non-standard, *duh* [O. Galibert]

This commit is contained in:
Olivier Galibert 2012-11-07 12:29:43 +00:00
parent c277ddfc53
commit b486a07a02
3 changed files with 41 additions and 2 deletions

View File

@ -1,5 +1,5 @@
# deco16 - deco variant
brk_imp ora_idx ill_non ill_non ill_non ora_zpg asl_zpg ill_non php_imp ora_imm asl_acc u0B_zpg ill_non ora_aba asl_aba ill_non
brk_16_imp ora_idx ill_non ill_non ill_non ora_zpg asl_zpg ill_non php_imp ora_imm asl_acc u0B_zpg ill_non ora_aba asl_aba ill_non
bpl_rel ora_idy ill_non u13_zpg ill_non ora_zpx asl_zpx ill_non clc_imp ora_aby ill_non ill_non ill_non ora_abx asl_abx ill_non
jsr_adr and_idx ill_non u23_zpg bit_zpg and_zpg rol_zpg ill_non plp_imp and_imm rol_acc ill_non bit_aba and_aba rol_aba ill_non
bmi_rel and_idy ill_non ill_non ill_non and_zpx rol_zpx ill_non sec_imp and_aby ill_non ill_non ill_non and_abx rol_abx u3F_zpg
@ -15,4 +15,4 @@ cpy_imm cmp_idx ill_non ill_non cpy_zpg cmp_zpg dec_zpg ill_non iny_imp
bne_rel cmp_idy ill_non ill_non ill_non cmp_zpx dec_zpx ill_non cld_imp cmp_aby ill_non ill_non ill_non cmp_abx dec_abx ill_non
cpx_imm sbc_idx ill_non ill_non cpx_zpg sbc_zpg inc_zpg ill_non inx_imp sbc_imm nop_imp ill_non cpx_aba sbc_aba inc_aba ill_non
beq_rel sbc_idy ill_non ill_non ill_non sbc_zpx inc_zpx ill_non sed_imp sbc_aby ill_non ill_non ill_non sbc_abx inc_abx ill_non
reset
reset_16

View File

@ -61,6 +61,7 @@ protected:
#define O(o) void o ## _full(); void o ## _partial()
O(brk_16_imp);
O(ill_non);
O(u0B_zpg);
O(u13_zpg);
@ -74,6 +75,8 @@ protected:
O(uBB_zpg);
O(vbl_zpg);
O(reset_16);
#undef O
};

View File

@ -1,4 +1,33 @@
# deco 16 opcodes
brk_16_imp
// The 6502 bug when a nmi occurs in a brk is reproduced (case !irq_taken && nmi_state)
if(irq_taken) {
read_pc_noinc();
} else {
read_pc();
}
write(SP, PC >> 8);
dec_SP();
write(SP, PC);
dec_SP();
write(SP, irq_taken ? P & ~F_B : P);
dec_SP();
if(nmi_state) {
PC = read_direct(0xfff7);
PC = set_h(PC, read_direct(0xfff6));
nmi_state = false;
standard_irq_callback(NMI_LINE);
} else {
PC = read_direct(0xfff3);
PC = set_h(PC, read_direct(0xfff2));
if(irq_taken)
standard_irq_callback(IRQ_LINE);
}
irq_taken = false;
P |= F_I; // Do *not* move after the prefetch
prefetch();
inst_state = -1;
ill_non
logerror("%s: Unimplemented instruction %02x\n", tag(), inst_state);
prefetch();
@ -63,3 +92,10 @@ vbl_zpg
if(DECO16_VERBOSE)
logerror("%s: VBL %02x (%04x)\n", tag(), NPC, TMP2);
prefetch();
# exceptions
reset_16
PC = read_direct(0xfff1);
PC = set_h(PC, read_direct(0xfff0));
prefetch();
inst_state = -1;