summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-12-02 07:02:40 -0500
committer AJR <ajrhacker@users.noreply.github.com>2019-12-02 07:02:40 -0500
commitff08f7d99c967dc4550d32f51101a1841f506631 (patch)
tree1bfca1ef157b7fa38b5483e898d0fd4225c0f099 /src/devices/cpu
parentc1a3350e99a629b7e484376ca46054f1b8824aa6 (diff)
r65c19: (IND), X rather than (IND, X); give L2800 more internal RAM (nw)
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/m6502/dr65c19.lst18
-rw-r--r--src/devices/cpu/m6502/m6502d.cpp5
-rw-r--r--src/devices/cpu/m6502/m6502d.h1
-rw-r--r--src/devices/cpu/m6502/or65c19.lst90
-rw-r--r--src/devices/cpu/m6502/r65c19.cpp15
-rw-r--r--src/devices/cpu/m6502/r65c19.h13
6 files changed, 122 insertions, 20 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)