mirror of
https://github.com/holub/mame
synced 2025-10-05 00:38:58 +03:00
582 lines
8.6 KiB
Plaintext
582 lines
8.6 KiB
Plaintext
# m65c02 opcodes
|
|
|
|
adc_c_aba
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
TMP = read(TMP);
|
|
do_adc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
adc_c_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, X)) {
|
|
read(set_l(TMP, TMP+X));
|
|
}
|
|
TMP += X;
|
|
TMP = read(TMP);
|
|
do_adc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
adc_c_aby
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, Y)) {
|
|
read(set_l(TMP, TMP+Y));
|
|
}
|
|
TMP += Y;
|
|
TMP = read(TMP);
|
|
do_adc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
adc_c_idx
|
|
TMP2 = read_pc();
|
|
read(TMP2);
|
|
TMP2 += X;
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
do_adc(read(TMP));
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
adc_c_idy
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2);
|
|
TMP = set_h(TMP, read(TMP2+1));
|
|
if(page_changing(TMP, Y)) {
|
|
read(set_l(TMP, TMP+Y));
|
|
}
|
|
do_adc(read(TMP+Y));
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
adc_c_imm
|
|
TMP = read_pc();
|
|
do_adc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
adc_c_zpg
|
|
TMP = read_pc();
|
|
TMP = read(TMP);
|
|
do_adc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
adc_c_zpi
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
do_adc(read(TMP));
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
adc_c_zpx
|
|
TMP = read_pc();
|
|
read(TMP);
|
|
TMP = read(UINT8(TMP+X));
|
|
do_adc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
and_zpi
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
A &= read(TMP);
|
|
set_nz(A);
|
|
prefetch();
|
|
|
|
asl_c_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, X)) {
|
|
read(set_l(TMP, TMP+X));
|
|
}
|
|
TMP += X;
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
TMP2 = do_asl(TMP2);
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
bbr_zpb
|
|
// Access pattern uncertain
|
|
TMP = read_pc();
|
|
TMP2 = read(TMP);
|
|
TMP = read_pc();
|
|
read_pc_noinc();
|
|
if(!(TMP2 & (1 << (inst_state & 7)))) {
|
|
PC += INT8(TMP);
|
|
}
|
|
prefetch();
|
|
|
|
bbs_zpb
|
|
// Access pattern uncertain
|
|
TMP = read_pc();
|
|
TMP2 = read(TMP);
|
|
TMP = read_pc();
|
|
read_pc_noinc();
|
|
if(TMP2 & (1 << (inst_state & 7))) {
|
|
PC += INT8(TMP);
|
|
}
|
|
prefetch();
|
|
|
|
bit_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, X)) {
|
|
read(set_l(TMP, TMP+X));
|
|
}
|
|
TMP += X;
|
|
do_bit(read(TMP));
|
|
prefetch();
|
|
|
|
bit_imm
|
|
TMP = read_pc();
|
|
if(A & TMP)
|
|
P &= ~F_Z;
|
|
else
|
|
P |= F_Z;
|
|
prefetch();
|
|
|
|
bit_zpx
|
|
TMP = read_pc();
|
|
read(TMP);
|
|
TMP = read(UINT8(TMP+X));
|
|
do_bit(TMP);
|
|
prefetch();
|
|
|
|
bra_rel
|
|
TMP = read_pc();
|
|
read_pc_noinc();
|
|
if(page_changing(PC, INT8(TMP))) {
|
|
read_direct(set_l(PC, PC+INT8(TMP)));
|
|
}
|
|
PC += INT8(TMP);
|
|
prefetch();
|
|
|
|
brk_c_imp
|
|
if(irq_taken || nmi_state) {
|
|
read_pc_noinc();
|
|
} else {
|
|
read_pc();
|
|
}
|
|
write(SP, PC >> 8);
|
|
dec_SP();
|
|
write(SP, PC);
|
|
dec_SP();
|
|
write(SP, irq_taken || nmi_state ? P & ~F_B : P);
|
|
dec_SP();
|
|
if(irq_taken && nmi_state) {
|
|
PC = read_direct(0xfffa);
|
|
PC = set_h(PC, read_direct(0xfffb));
|
|
nmi_state = false;
|
|
} else {
|
|
PC = read_direct(0xfffe);
|
|
PC = set_h(PC, read_direct(0xffff));
|
|
}
|
|
irq_taken = false;
|
|
P = (P | F_I) & ~F_D; // Do *not* move after the prefetch
|
|
prefetch();
|
|
inst_state = -1;
|
|
|
|
cmp_zpi
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
do_cmp(A, read(TMP));
|
|
prefetch();
|
|
|
|
dec_acc
|
|
read_pc_noinc();
|
|
A--;
|
|
set_nz(A);
|
|
prefetch();
|
|
|
|
eor_zpi
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
A ^= read(TMP);
|
|
set_nz(A);
|
|
prefetch();
|
|
|
|
inc_acc
|
|
read_pc_noinc();
|
|
A++;
|
|
set_nz(A);
|
|
prefetch();
|
|
|
|
jmp_iax
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
read(set_l(TMP, TMP+X));
|
|
TMP += X;
|
|
PC = read(TMP);
|
|
PC = set_h(PC, read(TMP+1));
|
|
prefetch();
|
|
|
|
jmp_c_ind
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
PC = read(TMP);
|
|
read(set_l(TMP, TMP+1));
|
|
PC = set_h(PC, read(TMP+1));
|
|
prefetch();
|
|
|
|
lda_zpi
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
A = read(TMP);
|
|
set_nz(A);
|
|
prefetch();
|
|
|
|
|
|
lsr_c_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, X)) {
|
|
read(set_l(TMP, TMP+X));
|
|
}
|
|
TMP += X;
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
TMP2 = do_lsr(TMP2);
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
nop_c_imp
|
|
prefetch();
|
|
|
|
nop_c_aba
|
|
read_pc();
|
|
read_pc();
|
|
read_pc_noinc();
|
|
read_pc_noinc();
|
|
read_pc_noinc();
|
|
read_pc_noinc();
|
|
read_pc_noinc();
|
|
prefetch();
|
|
|
|
nop_c_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
read(set_l(TMP, TMP+X));
|
|
prefetch();
|
|
|
|
ora_zpi
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
A |= read(TMP);
|
|
set_nz(A);
|
|
prefetch();
|
|
|
|
phx_imp
|
|
read_pc_noinc();
|
|
write(SP, X);
|
|
dec_SP();
|
|
prefetch();
|
|
|
|
phy_imp
|
|
read_pc_noinc();
|
|
write(SP, Y);
|
|
dec_SP();
|
|
prefetch();
|
|
|
|
plx_imp
|
|
read_pc_noinc();
|
|
read(SP);
|
|
inc_SP();
|
|
X = read(SP);
|
|
set_nz(X);
|
|
prefetch();
|
|
|
|
ply_imp
|
|
read_pc_noinc();
|
|
read(SP);
|
|
inc_SP();
|
|
Y = read(SP);
|
|
set_nz(Y);
|
|
prefetch();
|
|
|
|
rmb_bzp
|
|
// Access pattern unknown but probable (built upon inc_zpg)
|
|
TMP = read_pc();
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
TMP2 &= ~(1 << (inst_state & 7));
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
rol_c_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, X)) {
|
|
read(set_l(TMP, TMP+X));
|
|
}
|
|
TMP += X;
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
TMP2 = do_rol(TMP2);
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
|
|
ror_c_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, X)) {
|
|
read(set_l(TMP, TMP+X));
|
|
}
|
|
TMP += X;
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
TMP2 = do_ror(TMP2);
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
sbc_c_aba
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
TMP = read(TMP);
|
|
do_sbc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
sbc_c_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, X)) {
|
|
read(set_l(TMP, TMP+X));
|
|
}
|
|
TMP += X;
|
|
TMP = read(TMP);
|
|
do_sbc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
sbc_c_aby
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
if(page_changing(TMP, Y)) {
|
|
read(set_l(TMP, TMP+Y));
|
|
}
|
|
TMP += Y;
|
|
TMP = read(TMP);
|
|
do_sbc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
sbc_c_idx
|
|
TMP2 = read_pc();
|
|
read(TMP2);
|
|
TMP2 += X;
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
do_sbc(read(TMP));
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
sbc_c_idy
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2);
|
|
TMP = set_h(TMP, read(TMP2+1));
|
|
if(page_changing(TMP, Y)) {
|
|
read(set_l(TMP, TMP+Y));
|
|
}
|
|
do_sbc(read(TMP+Y));
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
sbc_c_imm
|
|
TMP = read_pc();
|
|
do_sbc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
sbc_c_zpg
|
|
TMP = read_pc();
|
|
TMP = read(TMP);
|
|
do_sbc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
sbc_c_zpi
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
do_sbc(read(TMP));
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
sbc_c_zpx
|
|
TMP = read_pc();
|
|
read(TMP);
|
|
TMP = read(UINT8(TMP+X));
|
|
do_sbc(TMP);
|
|
if(P & F_D) {
|
|
read_pc_noinc();
|
|
set_nz(A);
|
|
}
|
|
prefetch();
|
|
|
|
smb_bzp
|
|
// Access pattern unknown but probable (built upon inc_zpg)
|
|
TMP = read_pc();
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
TMP2 |= 1 << (inst_state & 7);
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
sta_zpi
|
|
TMP2 = read_pc();
|
|
TMP = read(TMP2 & 0xff);
|
|
TMP = set_h(TMP, read((TMP2+1) & 0xff));
|
|
write(TMP, A);
|
|
prefetch();
|
|
|
|
stp_imp
|
|
for(;;) {
|
|
eat-all-cycles;
|
|
}
|
|
|
|
stz_aba
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
write(TMP, 0x00);
|
|
prefetch();
|
|
|
|
stz_abx
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
read(set_l(TMP, TMP+X));
|
|
write(TMP+X, 0x00);
|
|
prefetch();
|
|
|
|
stz_zpg
|
|
TMP = read_pc();
|
|
write(TMP, 0x00);
|
|
prefetch();
|
|
|
|
stz_zpx
|
|
TMP = read_pc();
|
|
read(TMP);
|
|
write(UINT8(TMP+X), 0x00);
|
|
prefetch();
|
|
|
|
trb_aba
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
if(A & TMP2)
|
|
P &= ~F_Z;
|
|
else
|
|
P |= F_Z;
|
|
TMP2 &= ~A;
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
trb_zpg
|
|
TMP = read_pc();
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
if(A & TMP2)
|
|
P &= ~F_Z;
|
|
else
|
|
P |= F_Z;
|
|
TMP2 &= ~A;
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
tsb_aba
|
|
TMP = read_pc();
|
|
TMP = set_h(TMP, read_pc());
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
if(A & TMP2)
|
|
P &= ~F_Z;
|
|
else
|
|
P |= F_Z;
|
|
TMP2 |= A;
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
tsb_zpg
|
|
TMP = read_pc();
|
|
TMP2 = read(TMP);
|
|
write(TMP, TMP2);
|
|
if(A & TMP2)
|
|
P &= ~F_Z;
|
|
else
|
|
P |= F_Z;
|
|
TMP2 |= A;
|
|
write(TMP, TMP2);
|
|
prefetch();
|
|
|
|
wai_imp
|
|
read_pc_noinc();
|
|
read_pc_noinc();
|
|
while(!nmi_state && !irq_state) {
|
|
eat-all-cycles;
|
|
}
|
|
prefetch();
|