From ff08f7d99c967dc4550d32f51101a1841f506631 Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 2 Dec 2019 07:02:40 -0500 Subject: r65c19: (IND), X rather than (IND, X); give L2800 more internal RAM (nw) --- src/devices/cpu/m6502/dr65c19.lst | 18 ++++---- src/devices/cpu/m6502/m6502d.cpp | 5 +++ src/devices/cpu/m6502/m6502d.h | 1 + src/devices/cpu/m6502/or65c19.lst | 90 +++++++++++++++++++++++++++++++++++++++ src/devices/cpu/m6502/r65c19.cpp | 15 +++---- src/devices/cpu/m6502/r65c19.h | 13 +++++- src/mame/drivers/vd56sp.cpp | 3 +- 7 files changed, 124 insertions(+), 21 deletions(-) diff --git a/src/devices/cpu/m6502/dr65c19.lst b/src/devices/cpu/m6502/dr65c19.lst index f202944f2a7..fcb893d58f9 100644 --- a/src/devices/cpu/m6502/dr65c19.lst +++ b/src/devices/cpu/m6502/dr65c19.lst @@ -1,20 +1,20 @@ # license:BSD-3-Clause # copyright-holders:AJR -# r65c19 - many new instructions, others shuffled around or subtly altered in behavior +# r65c19 - many new instructions, others replaced or subtly altered in behavior brk_r_imp ora_zpi mpy_imp tip_imp nop_zpg ora_zpg asl_c_zpg rmb_bzp php_imp ora_imm asl_acc jsb_vec jpi_ind ora_aba asl_c_aba bbr_zpb -bpl_rel ora_idx mpa_imp lab_acc nop_zpx ora_zpx asl_c_zpx rmb_bzp clc_imp ora_aby neg_acc jsb_vec nop_c_abx ora_abx asl_c_abx bbr_zpb +bpl_rel ora_ipx mpa_imp lab_acc nop_zpx ora_zpx asl_c_zpx rmb_bzp clc_imp ora_aby neg_acc jsb_vec nop_c_abx ora_abx asl_c_abx bbr_zpb jsr_r_adr and_zpi psh_imp phw_imp bit_zpg and_zpg rol_c_zpg rmb_bzp plp_imp and_imm rol_acc jsb_vec bit_aba and_aba rol_c_aba bbr_zpb -bmi_rel and_idx pul_imp plw_imp nop_zpx and_zpx rol_c_zpx rmb_bzp sec_imp and_aby asr_acc jsb_vec nop_c_abx and_abx rol_c_abx bbr_zpb +bmi_rel and_ipx pul_imp plw_imp nop_zpx and_zpx rol_c_zpx rmb_bzp sec_imp and_aby asr_acc jsb_vec nop_c_abx and_abx rol_c_abx bbr_zpb rti_imp eor_zpi rnd_imp nop_c_imp nop_zpg eor_zpg lsr_c_zpg rmb_bzp pha_imp eor_imm lsr_acc jsb_vec jmp_adr eor_aba lsr_c_aba bbr_zpb -bvc_rel eor_idx clw_imp nop_c_imp nop_zpx eor_zpx lsr_c_zpx rmb_bzp cli_imp eor_aby phy_imp jsb_vec nop_c_abx eor_abx lsr_c_abx bbr_zpb +bvc_rel eor_ipx clw_imp nop_c_imp nop_zpx eor_zpx lsr_c_zpx rmb_bzp cli_imp eor_aby phy_imp jsb_vec nop_c_abx eor_abx lsr_c_abx bbr_zpb rts_r_imp adc_c_zpi taw_imp nop_c_imp add_zpg adc_c_zpg ror_c_zpg rmb_bzp pla_imp adc_c_imm ror_acc jsb_vec jmp_r_ind adc_c_aba ror_c_aba bbr_zpb -bvs_rel adc_c_idx twa_imp nop_c_imp add_zpx adc_c_zpx ror_c_zpx rmb_bzp sei_imp adc_c_aby ply_imp jsb_vec jmp_iax adc_c_abx ror_c_abx bbr_zpb +bvs_rel adc_ipx twa_imp nop_c_imp add_zpx adc_c_zpx ror_c_zpx rmb_bzp sei_imp adc_c_aby ply_imp jsb_vec jmp_iax adc_c_abx ror_c_abx bbr_zpb bra_rel sta_zpi nop_imm nop_c_imp sty_zpg sta_zpg stx_zpg smb_bzp dey_imp add_imm txa_imp nxt_imp sty_aba sta_aba stx_aba bbs_zpb -bcc_rel sta_idx nop_imm nop_c_imp sty_zpx sta_zpx stx_zpy smb_bzp tya_imp sta_aby txs_imp lii_imp nop_c_abx sta_abx nop_c_abx bbs_zpb +bcc_rel sta_ipx nop_imm nop_c_imp sty_zpx sta_zpx stx_zpy smb_bzp tya_imp sta_aby txs_imp lii_imp nop_c_abx sta_abx nop_c_abx bbs_zpb ldy_imm lda_zpi ldx_imm nop_c_imp ldy_zpg lda_zpg ldx_zpg smb_bzp tay_imp lda_imm tax_imp lan_imp ldy_aba lda_aba ldx_aba bbs_zpb -bcs_rel lda_idx sti_imz nop_c_imp ldy_zpx lda_zpx ldx_zpy smb_bzp clv_imp lda_aby tsx_imp ini_imp ldy_abx lda_abx ldx_aby bbs_zpb +bcs_rel lda_ipx sti_imz nop_c_imp ldy_zpx lda_zpx ldx_zpy smb_bzp clv_imp lda_aby tsx_imp ini_imp ldy_abx lda_abx ldx_aby bbs_zpb cpy_imm cmp_zpi rba_ima nop_c_imp cpy_zpg cmp_zpg dec_c_zpg smb_bzp iny_imp cmp_imm dex_imp phi_imp cpy_aba cmp_aba dec_c_aba bbs_zpb -bne_rel cmp_idx sba_ima nop_c_imp exc_zpx cmp_zpx dec_c_zpx smb_bzp cld_imp cmp_aby phx_imp pli_imp nop_c_abx cmp_abx dec_c_abx bbs_zpb +bne_rel cmp_ipx sba_ima nop_c_imp exc_zpx cmp_zpx dec_c_zpx smb_bzp cld_imp cmp_aby phx_imp pli_imp nop_c_abx cmp_abx dec_c_abx bbs_zpb cpx_imm sbc_c_zpi bar_amr nop_c_imp cpx_zpg sbc_c_zpg inc_c_zpg smb_bzp inx_imp sbc_c_imm nop_imp lai_imp cpx_aba sbc_c_aba inc_c_aba bbs_zpb -beq_rel sbc_c_idx bas_amr nop_c_imp nop_zpx sbc_c_zpx inc_c_zpx smb_bzp sed_imp sbc_c_aby plx_imp pia_imp nop_c_abx sbc_c_abx inc_c_abx bbs_zpb +beq_rel sbc_ipx bas_amr nop_c_imp nop_zpx sbc_c_zpx inc_c_zpx smb_bzp sed_imp sbc_c_aby plx_imp pia_imp nop_c_abx sbc_c_abx inc_c_abx bbs_zpb reset_r diff --git a/src/devices/cpu/m6502/m6502d.cpp b/src/devices/cpu/m6502/m6502d.cpp index 59d1dfc05f5..5213c198a5f 100644 --- a/src/devices/cpu/m6502/m6502d.cpp +++ b/src/devices/cpu/m6502/m6502d.cpp @@ -111,6 +111,11 @@ offs_t m6502_base_disassembler::disassemble(std::ostream &stream, offs_t pc, con flags |= 3; break; + case DASM_ipx: + util::stream_format(stream, " ($%02x), x", params.r8(pc+1)); + flags |= 2; + break; + case DASM_isy: util::stream_format(stream, " ($%02x, s), y", params.r8(pc+1)); flags |= 2; diff --git a/src/devices/cpu/m6502/m6502d.h b/src/devices/cpu/m6502/m6502d.h index de15b41d253..d975afab7c7 100644 --- a/src/devices/cpu/m6502/m6502d.h +++ b/src/devices/cpu/m6502/m6502d.h @@ -46,6 +46,7 @@ protected: DASM_imm, /* immediate */ DASM_imp, /* implicit */ DASM_ind, /* indirect (jmp) */ + DASM_ipx, /* zero page post indexed (r65c19) */ DASM_isy, /* zero page pre indexed sp and post indexed Y (65ce02) */ DASM_iw2, /* immediate word (65ce02) */ DASM_iw3, /* augment (65ce02) */ diff --git a/src/devices/cpu/m6502/or65c19.lst b/src/devices/cpu/m6502/or65c19.lst index 392ccfa9ac6..e88400cb117 100644 --- a/src/devices/cpu/m6502/or65c19.lst +++ b/src/devices/cpu/m6502/or65c19.lst @@ -1,5 +1,19 @@ # license:BSD-3-Clause # copyright-holders:Olivier Galibert, AJR +adc_ipx + TMP2 = read_pc(); + TMP = read(TMP2); + TMP = set_h(TMP, read((TMP2+1) & 0xff)); + if(page_changing(TMP, X)) { + read(set_l(TMP, TMP+X)); + } + do_adc(read(TMP+X)); + if(P & F_D) { + read_pc_noinc(); + set_nz(A); + } + prefetch(); + add_imm TMP = read_pc(); do_add(TMP); @@ -30,6 +44,17 @@ add_zpx } prefetch(); +and_ipx + TMP2 = read_pc(); + TMP = read(TMP2); + TMP = set_h(TMP, read((TMP2+1) & 0xff)); + if(page_changing(TMP, X)) { + read(set_l(TMP, TMP+X)); + } + A &= read(TMP+X); + set_nz(A); + prefetch(); + asr_acc read_pc_noinc(); A = do_asr(A); @@ -104,6 +129,27 @@ clw_imp m_w = 0; prefetch(); +cmp_ipx + TMP2 = read_pc(); + TMP = read(TMP2); + TMP = set_h(TMP, read((TMP2+1) & 0xff)); + if(page_changing(TMP, X)) { + read(set_l(TMP, TMP+X)); + } + do_cmp(A, read(TMP+X)); + prefetch(); + +eor_ipx + TMP2 = read_pc(); + TMP = read(TMP2); + TMP = set_h(TMP, read((TMP2+1) & 0xff)); + if(page_changing(TMP, X)) { + read(set_l(TMP, TMP+X)); + } + A ^= read(TMP+X); + set_nz(A); + prefetch(); + exc_zpx TMP = read_pc(); read(TMP); @@ -175,6 +221,17 @@ lan_imp m_i++; prefetch(); +lda_ipx + TMP2 = read_pc(); + TMP = read(TMP2); + TMP = set_h(TMP, read((TMP2+1) & 0xff)); + if(page_changing(TMP, X)) { + read(set_l(TMP, TMP+X)); + } + A = read(TMP+X); + set_nz(A); + prefetch(); + lii_imp read_pc_noinc(); TMP = read(m_i); @@ -216,6 +273,17 @@ nxt_imp m_i += 2; prefetch(); +ora_ipx + TMP2 = read_pc(); + TMP = read(TMP2); + TMP = set_h(TMP, read((TMP2+1) & 0xff)); + if(page_changing(TMP, X)) { + read(set_l(TMP, TMP+X)); + } + A |= read(TMP+X); + set_nz(A); + prefetch(); + phi_imp read_pc_noinc(); write(SP, m_i>>8); @@ -318,6 +386,28 @@ sba_ima write(TMP, TMP2); prefetch(); +sbc_ipx + TMP2 = read_pc(); + TMP = read(TMP2); + TMP = set_h(TMP, read((TMP2+1) & 0xff)); + if(page_changing(TMP, X)) { + read(set_l(TMP, TMP+X)); + } + do_sbc(read(TMP+X)); + if(P & F_D) { + read_pc_noinc(); + set_nz(A); + } + prefetch(); + +sta_ipx + TMP2 = read_pc(); + TMP = read(TMP2); + TMP = set_h(TMP, read((TMP2+1) & 0xff)); + read(set_l(TMP, TMP+X)); + write(TMP+X, A); + prefetch(); + sti_imz TMP = read_pc(); TMP2 = read_pc(); diff --git a/src/devices/cpu/m6502/r65c19.cpp b/src/devices/cpu/m6502/r65c19.cpp index f99c64d2a7b..47936a62722 100644 --- a/src/devices/cpu/m6502/r65c19.cpp +++ b/src/devices/cpu/m6502/r65c19.cpp @@ -274,17 +274,14 @@ void c39_device::expansion_w(offs_t offset, u8 data) intf.es4_write(offset + 0x0600, data); } -void c39_device::internal_map(address_map &map) +void l2800_device::internal_map(address_map &map) { // TODO: most registers still unimplemented - map(0x0005, 0x0005).rw(FUNC(c39_device::pbs_r), FUNC(c39_device::pbs_w)); - map(0x000b, 0x000b).rw(FUNC(c39_device::cir_r), FUNC(c39_device::cir_w)); - map(0x0018, 0x001f).rw(FUNC(c39_device::bsr_r), FUNC(c39_device::bsr_w)); - map(0x0040, 0x007f).rw(FUNC(c39_device::page1_seg_r), FUNC(c39_device::page1_seg_w)); - map(0x0080, 0x00ff).ram(); - map(0x0100, 0x01ff).ram().share("page1"); - map(0x0200, 0x047f).ram(); - map(0x0600, 0xffff).rw(FUNC(c39_device::expansion_r), FUNC(c39_device::expansion_w)); + map(0x0005, 0x0005).rw(FUNC(l2800_device::pbs_r), FUNC(l2800_device::pbs_w)); + map(0x000b, 0x000b).rw(FUNC(l2800_device::cir_r), FUNC(l2800_device::cir_w)); + map(0x0018, 0x001f).rw(FUNC(l2800_device::bsr_r), FUNC(l2800_device::bsr_w)); + map(0x0040, 0x05fd).ram(); // Page 0 has 192 dedicated bytes here + map(0x0600, 0xffff).rw(FUNC(l2800_device::expansion_r), FUNC(l2800_device::expansion_w)); } #include "cpu/m6502/r65c19.hxx" diff --git a/src/devices/cpu/m6502/r65c19.h b/src/devices/cpu/m6502/r65c19.h index 5b43f49ae68..379915c9df7 100644 --- a/src/devices/cpu/m6502/r65c19.h +++ b/src/devices/cpu/m6502/r65c19.h @@ -45,14 +45,18 @@ private: #define O(o) void o ## _full(); void o ## _partial() + O(adc_ipx); O(add_imm); O(add_zpg); O(add_zpx); + O(and_ipx); O(asr_acc); O(bar_amr); O(bas_amr); O(brk_r_imp); O(clw_imp); + O(cmp_ipx); + O(eor_ipx); O(exc_zpx); O(ini_imp); O(jpi_ind); @@ -62,11 +66,13 @@ private: O(lab_acc); O(lai_imp); O(lan_imp); + O(lda_ipx); O(lii_imp); O(mpa_imp); O(mpy_imp); O(neg_acc); O(nxt_imp); + O(ora_ipx); O(phi_imp); O(phw_imp); O(pia_imp); @@ -78,6 +84,8 @@ private: O(rnd_imp); O(rts_r_imp); O(sba_ima); + O(sbc_ipx); + O(sta_ipx); O(sti_imz); O(taw_imp); O(tip_imp); @@ -110,8 +118,6 @@ protected: u8 expansion_r(offs_t offset); void expansion_w(offs_t offset, u8 data); - void internal_map(address_map &map); - private: class mi_banked : public memory_interface { public: @@ -142,6 +148,9 @@ class l2800_device : public c39_device { public: l2800_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +private: + void internal_map(address_map &map); }; DECLARE_DEVICE_TYPE(R65C19, r65c19_device) diff --git a/src/mame/drivers/vd56sp.cpp b/src/mame/drivers/vd56sp.cpp index 6f6efad6faa..7e8962e5a27 100644 --- a/src/mame/drivers/vd56sp.cpp +++ b/src/mame/drivers/vd56sp.cpp @@ -31,7 +31,8 @@ private: void vd56sp_state::exp_map(address_map &map) { map(0x0e0000, 0x0fffff).rom().region("firmware", 0x20000); - map(0x1f8000, 0x1fffff).ram(); + map(0x160000, 0x16ffff).mirror(0x10000).ram(); + map(0x1e0000, 0x1effff).mirror(0x10000).ram(); } -- cgit v1.2.3