XaviX - get ttv_mx to show some screens (nw) (#4153)

* on review of code I'm fairly sure these work with the accumulator (nw)

* get ttv_mx to show some screens (nw)

* oops (nw)

* more ops (nw)

* (nw)

* help xavtenni along (nw)

* less logging (nw)
This commit is contained in:
David Haywood 2018-10-17 21:35:39 +01:00 committed by ajrhacker
parent 5a41d073fc
commit 441d067878
7 changed files with 162 additions and 87 deletions

View File

@ -8,13 +8,13 @@ bmi_rel and_idy plx_imp andpa_imp bit_zpx and_zpx rol_zpx
rti_xav_imp eor_idx nop_imp eorl0_acc nop_imp eor_zpg lsr_zpg eorl1_acc pha_imp eor_imm lsr_acc eorl2_acc jmp_adr eor_aba lsr_aba eorl3_acc
bvc_rel eor_idy phy_imp eorpa_imp nop_imp eor_zpx lsr_zpx eorpb_imp cli_imp eor_aby nop_imp spa1_acc callf_aba eor_abx lsr_abx spb1_acc
rts_imp adc_idx nop_imp adcl0_acc nop_imp adc_zpg ror_zpg adcl1_acc pla_imp adc_imm ror_acc adcl2_acc jmp_ind adc_aba ror_aba adcl3_acc
bvs_rel adc_idy ply_imp adcpa_imp nop_imp adc_zpx ror_zpx adcpb_imp sei_imp adc_aby nop_imp lpa1_acc callf_ind adc_abx ror_abx lpb1_acc
bvs_rel adc_idy ply_imp adcpa_imp nop_imp adc_zpx ror_zpx adcpb_imp sei_imp adc_aby nop_imp lpa1_acc jmpf_ind adc_abx ror_abx lpb1_acc
retf_imp sta_idx stz_zpg stal0_acc sty_zpg sta_zpg stx_zpg stal1_acc dey_imp sev_imp txa_imp stal2_acc sty_aba sta_aba stx_aba stal3_acc
bcc_rel sta_idy stz_aba stapa_imp sty_zpx sta_zpx stx_zpy stapb_imp tya_imp sta_aby txs_imp spa2_acc sty_abx sta_abx stx_aby spb2_acc
ldy_imm lda_idx ldx_imm ldal0_acc ldy_zpg lda_zpg ldx_zpg ldal1_acc tay_imp lda_imm tax_imp ldal2_acc ldy_aba lda_aba ldx_aba ldal3_acc
bcs_rel lda_idy clrl_imp ldapa_imp ldy_zpx lda_zpx ldx_zpy ldapb_imp clv_imp lda_aby tsx_imp lpa2_acc ldy_abx lda_abx ldx_aby lpb2_acc
cpy_imm cmp_idx decl_imp cmpl0_acc cpy_zpg cmp_zpg dec_zpg cmpl1_acc iny_imp cmp_imm dex_imp cmpl2_acc cpy_aba cmp_aba dec_aba cmpl3_acc
bne_rel cmp_idy notl_imp cmppa_imp nop_imp cmp_zpx dec_zpx cmppb_imp cld_imp cmp_aby nop_imp decpa_imp nop_imp cmp_abx dec_abx decpb_imp
cpx_imm sbc_idx incl_imp sbcl0_acc cpx_zpg sbc_zpg inc_zpg sbcl1_acc inx_imp sbc_imm nop_imp sbcl2_acc cpx_aba sbc_aba inc_aba sbcl3_acc
beq_rel sbc_idy negl_imp sbcpa_imp nop_imp sbc_zpx inc_zpx sbcpb_imp sed_imp sbc_aby nop_imp incpa_imp nop_imp sbc_abx inc_abx incpb_imp
bcs_rel lda_idy clr_acc ldapa_imp ldy_zpx lda_zpx ldx_zpy ldapb_imp clv_imp lda_aby tsx_imp lpa2_acc ldy_abx lda_abx ldx_aby lpb2_acc
cpy_imm cmp_idx dec_acc cmpl0_acc cpy_zpg cmp_zpg dec_zpg cmpl1_acc iny_imp cmp_imm dex_imp cmpl2_acc cpy_aba cmp_aba dec_aba cmpl3_acc
bne_rel cmp_idy not_acc cmppa_imp nop_imp cmp_zpx dec_zpx cmppb_imp cld_imp cmp_aby nop_imp decpa_imp nop_imp cmp_abx dec_abx decpb_imp
cpx_imm sbc_idx inc_acc sbcl0_acc cpx_zpg sbc_zpg inc_zpg sbcl1_acc inx_imp sbc_imm nop_imp sbcl2_acc cpx_aba sbc_aba inc_aba sbcl3_acc
beq_rel sbc_idy neg_acc sbcpa_imp nop_imp sbc_zpx inc_zpx sbcpb_imp sed_imp sbc_aby nop_imp incpa_imp nop_imp sbc_abx inc_abx incpb_imp
reset

View File

@ -30,30 +30,34 @@ ply_imp
set_nz(Y);
prefetch();
clrl_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
clr_acc
read_pc_noinc();
m_l = 0;
A = 0;
set_nz(A);
prefetch();
decl_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
dec_acc
read_pc_noinc();
A--;
set_nz(A);
prefetch();
notl_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
not_acc
read_pc_noinc();
A = A ^ 0xff;
set_nz(A);
prefetch();
incl_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
inc_acc
read_pc_noinc();
A++;
set_nz(A);
prefetch();
negl_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
neg_acc
read_pc_noinc();
A = (0x00 - A) & 0xff;
set_nz(A);
prefetch();
oral0_acc
@ -62,8 +66,8 @@ oral0_acc
prefetch();
oral1_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A |= (m_l & 0x0000ff00) >> 8;
set_nz(A);
prefetch();
oral2_acc
@ -97,8 +101,8 @@ andl3_acc
prefetch();
eorl0_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A ^= (m_l & 0x000000ff) >> 0;
set_nz(A);
prefetch();
eorl1_acc
@ -137,43 +141,43 @@ adcl3_acc
prefetch();
stal0_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_l = (m_l & 0xffffff00) | (A & 0xff); // TODO: flags
prefetch();
stal1_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_l = (m_l & 0xffff00ff) | ((A & 0xff) << 8); // TODO: flags
prefetch();
stal2_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_l = (m_l & 0xff00ffff) | ((A & 0xff) << 16); // TODO: flags
prefetch();
stal3_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_l = (m_l & 0x00ffffff) | ((A & 0xff) << 24); // TODO: flags
prefetch();
ldal0_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_l & 0x000000ff) >> 0; // TODO: flags
prefetch();
ldal1_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_l & 0x0000ff00) >> 8; // TODO: flags
prefetch();
ldal2_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_l & 0x00ff0000) >> 16; // TODO: flags
prefetch();
ldal3_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_l & 0xff000000) >> 24; // TODO: flags
prefetch();
cmpl0_acc
@ -217,68 +221,69 @@ sbcl3_acc
prefetch();
spa0_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_pa = (m_pa & 0xffff00) | A; // TODO: Flags?
prefetch();
lpa0_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_pa & 0x0000ff) >> 0; // TODO: Flags?
prefetch();
spa1_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_pa = (m_pa & 0xff00ff) | (A << 8); // TODO: Flags?
prefetch();
lpa1_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_pa & 0x00ff00) >> 8; // TODO: Flags?
prefetch();
spa2_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_pa = (m_pa & 0x00ffff) | (A << 16); // TODO: Flags?
prefetch();
lpa2_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_pa & 0xff0000) >> 16; // TODO: Flags?
prefetch();
spb0_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_pb = (m_pb & 0xffff00) | A; // TODO: Flags?
prefetch();
lpb0_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_pb & 0x0000ff) >> 0; // TODO: Flags?
prefetch();
spb1_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_pb = (m_pb & 0xff00ff) | (A << 8); // TODO: Flags?
prefetch();
lpb1_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_pb & 0x00ff00) >> 8; // TODO: Flags?
prefetch();
spb2_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_pb = (m_pb & 0x00ffff) | (A << 16); // TODO: Flags?
prefetch();
lpb2_acc
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
A = (m_pb & 0xff0000) >> 16; // TODO: Flags?
prefetch();
incpa_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
m_pa++;
set_nz(m_pa&0xff); // startup code seems to require flag to set if low byte is 0x00?
prefetch();
incpb_imp
@ -312,13 +317,17 @@ eorpa_imp
prefetch();
adcpa_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
TMP = m_databank; // TODO: Flags, how does bank boundary crossing get handled?
m_databank = (m_pa & 0xff0000)>>16;
do_adc(read((m_pa&0xffff)+Y));
m_databank = TMP;
prefetch();
stapa_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
TMP = m_databank; // TODO: Flags, how does bank boundary crossing get handled?
m_databank = (m_pa & 0xff0000)>>16;
write((m_pa&0xffff)+Y, A);
m_databank = TMP;
prefetch();
ldapa_imp
@ -332,8 +341,10 @@ cmppa_imp
prefetch();
sbcpa_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
TMP = m_databank; // TODO: Flags, how does bank boundary crossing get handled?
m_databank = (m_pa & 0xff0000)>>16;
do_sbc(read((m_pa&0xffff)+Y));
m_databank = TMP;
prefetch();
orapb_imp
@ -387,13 +398,14 @@ sty_abx
prefetch();
stz_zpg
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
TMP = read_pc();
write(TMP, 0x00);
prefetch();
stz_aba
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
TMP = read_pc();
TMP = set_h(TMP, read_pc());
write(TMP, 0x00);
prefetch();
bit_zpx
@ -407,8 +419,11 @@ bit_abx
prefetch();
bit_imm
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
TMP = read_pc();
if(A & TMP)
P &= ~F_Z;
else
P |= F_Z;
prefetch();
asr_zpg
@ -451,7 +466,11 @@ callf_aba
read_pc_noinc();
prefetch();
callf_ind
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc_noinc();
jmpf_ind
TMP = read_pc();
TMP = set_h(TMP, read_pc());
PC = read(TMP);
PC = set_h(PC, read(set_l(TMP, TMP+1)));
TMP2 = read(TMP+2);
set_codebank(TMP2);
prefetch();

View File

@ -159,7 +159,7 @@ uint8_t xavix_device::mi_xavix_nd::read_arg(uint16_t adr)
return program->read_byte(base->adr_with_codebank(adr));
}
inline void xavix_device::set_codebank(uint8_t bank)
void xavix_device::set_codebank(uint8_t bank)
{
// space().write_byte(0xfe, bank);
m_codebank = bank;

View File

@ -31,13 +31,13 @@
a is 80 when entering here?
01BC37: A0 3F ldy #$3f
01BC39: B2 clrl // clear 32-bit 'long' register (part of it might be the accumulator?) (or clear accumulator?)
01BC39: B2 clr a // clear acculuator
01BC3A: 1B spa0 a // store 'accumulator' into byte 0 of PA 'address' register
01BC3B: 9B spa2 a // store 'accumulator' into byte 2 of PA 'address' register
-- loop point 2
01BC3C: 98 tya // y -> a (3f on first run of loop)
01BC3D: 5B spa1 a // store 'accumulator' into byte 1 of PA 'address' register (803f80 on first loop? 003f00 if we clear accumulator with clrl instead) maybe should be 3f0000 ? (would make more sense for a ram test)
01BC3D: 5B spa1 a // store 'accumulator' into byte 1 of PA 'address' register (003f00 on first loop?)
-- loop point 1
01BC3E: A3 ldal0 a // read byte 0 of 32-bit 'long' register into accumulator
@ -107,6 +107,14 @@ xavix2000_device::xavix2000_device(const machine_config &mconfig, const char *ta
sprogram_config.m_logaddr_width = 24;
}
void xavix2000_device::device_start()
{
xavix_device::device_start();
state_add(SXAVIX_L, "L", m_l).callimport().formatstr("%8s");;
state_add(SXAVIX_PA, "PA", m_pa).callimport().formatstr("%8s");
state_add(SXAVIX_PB, "PB", m_pb).callimport().formatstr("%8s");
}
std::unique_ptr<util::disasm_interface> xavix2000_device::create_disassembler()
{
@ -114,4 +122,38 @@ std::unique_ptr<util::disasm_interface> xavix2000_device::create_disassembler()
}
void xavix2000_device::state_import(const device_state_entry &entry)
{
xavix_device::state_import(entry);
switch(entry.index())
{
case SXAVIX_L:
break;
case SXAVIX_PA:
break;
case SXAVIX_PB:
break;
}
}
void xavix2000_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
xavix_device::state_string_export(entry, str);
switch(entry.index())
{
case SXAVIX_L:
str = string_format("%08x", m_l);
break;
case SXAVIX_PA:
str = string_format("%08x", m_pa);
break;
case SXAVIX_PB:
str = string_format("%08x", m_pb);
break;
}
}
#include "cpu/m6502/xavix2000.hxx"

View File

@ -23,6 +23,10 @@ public:
virtual void do_exec_full() override;
virtual void do_exec_partial() override;
virtual void device_start() override;
virtual void state_import(const device_state_entry &entry) override;
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
#define O(o) void o ## _full(); void o ## _partial()
// Super XaviX opcodes
@ -32,11 +36,11 @@ public:
O(plx_imp); // 32
O(ply_imp); // 72
O(clrl_imp); // b2
O(decl_imp); // c2
O(notl_imp); // d2
O(incl_imp); // e2
O(negl_imp); // f2
O(clr_acc); // b2
O(dec_acc); // c2
O(not_acc); // d2
O(inc_acc); // e2
O(neg_acc); // f2
O(oral0_acc);
O(oral1_acc);
@ -136,7 +140,7 @@ public:
O(sev_imp);
O(callf_aba);
O(callf_ind);
O(jmpf_ind);
#undef O
@ -146,6 +150,12 @@ public:
};
enum {
SXAVIX_L = M6502_IR+1,
SXAVIX_PA,
SXAVIX_PB
};
DECLARE_DEVICE_TYPE(XAVIX2000, xavix2000_device)
#endif // MAME_CPU_M6502_XAVIX2000_H

View File

@ -4,57 +4,60 @@
#include "emu.h"
#include "includes/xavix.h"
// #define VERBOSE 1
#include "logmacro.h"
READ8_MEMBER(xavix_state::sound_75f0_r)
{
logerror("%s: sound_75f0_r\n", machine().describe_context());
LOG("%s: sound_75f0_r\n", machine().describe_context());
return m_soundregs[0];
}
READ8_MEMBER(xavix_state::sound_75f1_r)
{
logerror("%s: sound_75f1_r\n", machine().describe_context());
LOG("%s: sound_75f1_r\n", machine().describe_context());
return m_soundregs[1];
}
READ8_MEMBER(xavix_state::sound_75f6_r)
{
logerror("%s: sound_75f6_r\n", machine().describe_context());
LOG("%s: sound_75f6_r\n", machine().describe_context());
return m_soundregs[6];
}
READ8_MEMBER(xavix_state::sound_75f8_r)
{
logerror("%s: sound_75f8_r\n", machine().describe_context());
LOG("%s: sound_75f8_r\n", machine().describe_context());
return m_soundregs[8];
}
READ8_MEMBER(xavix_state::sound_75f9_r)
{
logerror("%s: sound_75f9_r\n", machine().describe_context());
LOG("%s: sound_75f9_r\n", machine().describe_context());
return 0x00;
}
READ8_MEMBER(xavix_state::sound_75fa_r)
{
logerror("%s: sound_75fa_r\n", machine().describe_context());
LOG("%s: sound_75fa_r\n", machine().describe_context());
return m_soundregs[10];
}
READ8_MEMBER(xavix_state::sound_75fb_r)
{
logerror("%s: sound_75fb_r\n", machine().describe_context());
LOG("%s: sound_75fb_r\n", machine().describe_context());
return m_soundregs[11];
}
READ8_MEMBER(xavix_state::sound_75fc_r)
{
logerror("%s: sound_75fc_r\n", machine().describe_context());
LOG("%s: sound_75fc_r\n", machine().describe_context());
return m_soundregs[12];
}
READ8_MEMBER(xavix_state::sound_75fd_r)
{
logerror("%s: sound_75fd_r\n", machine().describe_context());
LOG("%s: sound_75fd_r\n", machine().describe_context());
return m_soundregs[13];
}
@ -65,7 +68,7 @@ WRITE8_MEMBER(xavix_state::sound_75f0_w)
{
// expected to return data written
m_soundregs[0] = data;
logerror("%s: sound_75f0_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75f0_w %02x\n", machine().describe_context(), data);
}
@ -73,7 +76,7 @@ WRITE8_MEMBER(xavix_state::sound_75f1_w)
{
// expected to return data written
m_soundregs[1] = data;
logerror("%s: sound_75f1_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75f1_w %02x\n", machine().describe_context(), data);
}
@ -81,13 +84,13 @@ WRITE8_MEMBER(xavix_state::sound_75f6_w)
{
// expected to return data written
m_soundregs[6] = data;
logerror("%s: sound_75f6_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75f6_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::sound_75f7_w)
{
m_soundregs[7] = data;
logerror("%s: sound_75f7_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75f7_w %02x\n", machine().describe_context(), data);
}
@ -95,53 +98,53 @@ WRITE8_MEMBER(xavix_state::sound_75f8_w)
{
// expected to return data written
m_soundregs[8] = data;
logerror("%s: sound_75f8_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75f8_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::sound_75f9_w)
{
m_soundregs[9] = data;
logerror("%s: sound_75f9_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75f9_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::sound_75fa_w)
{
// expected to return data written
m_soundregs[10] = data;
logerror("%s: sound_75fa_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75fa_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::sound_75fb_w)
{
// expected to return data written
m_soundregs[11] = data;
logerror("%s: sound_75fb_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75fb_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::sound_75fc_w)
{
// expected to return data written
m_soundregs[12] = data;
logerror("%s: sound_75fc_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75fc_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::sound_75fd_w)
{
// expected to return data written
m_soundregs[13] = data;
logerror("%s: sound_75fd_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75fd_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::sound_75fe_w)
{
m_soundregs[14] = data;
logerror("%s: sound_75fe_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75fe_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(xavix_state::sound_75ff_w)
{
m_soundregs[15] = data;
logerror("%s: sound_75ff_w %02x\n", machine().describe_context(), data);
LOG("%s: sound_75ff_w %02x\n", machine().describe_context(), data);
}
READ8_MEMBER(xavix_state::sound_75f4_r)

View File

@ -281,6 +281,7 @@ WRITE8_MEMBER(xavix_state::arena_end_w)
READ8_MEMBER(xavix_state::arena_control_r)
{
m_arena_control ^= 0x40; // unknown, xavtenni expects this to become high, also seems to be running in some kind of interlace mode, so could be a field flag?
return m_arena_control;
}