mirror of
https://github.com/holub/mame
synced 2025-06-07 05:13:46 +03:00
Checkpoint
This commit is contained in:
parent
c32493ce46
commit
edb88ffe18
@ -13,7 +13,6 @@
|
|||||||
|
|
||||||
const device_type SCUDSP = &device_creator<scudsp_cpu_device>;
|
const device_type SCUDSP = &device_creator<scudsp_cpu_device>;
|
||||||
|
|
||||||
|
|
||||||
/* FLAGS */
|
/* FLAGS */
|
||||||
#define PRF m_flags & 0x04000000
|
#define PRF m_flags & 0x04000000
|
||||||
#define EPF m_flags & 0x02000000
|
#define EPF m_flags & 0x02000000
|
||||||
@ -27,14 +26,117 @@ const device_type SCUDSP = &device_creator<scudsp_cpu_device>;
|
|||||||
#define EXF m_flags & 0x00010000 // execute flag (basically tied to RESET pin)
|
#define EXF m_flags & 0x00010000 // execute flag (basically tied to RESET pin)
|
||||||
#define LEF m_flags & 0x00008000 // change PC value
|
#define LEF m_flags & 0x00008000 // change PC value
|
||||||
|
|
||||||
|
#define FLAGS_MASK 0x06ff8000
|
||||||
|
|
||||||
|
#define scudsp_readop(A) m_program->read_dword(A << 2)
|
||||||
|
#define scudsp_writeop(A, B) m_program->write_dword(A << 2, B)
|
||||||
|
#define scudsp_readmem(A,MD) m_data->read_dword((A | MD << 6) << 2)
|
||||||
|
#define scudsp_writemem(A,MD,B) m_data->write_dword((A | MD << 6) << 2, B)
|
||||||
|
|
||||||
|
UINT32 scudsp_cpu_device::scudsp_get_source_mem_value(UINT8 mode)
|
||||||
|
{
|
||||||
|
UINT32 value = 0;
|
||||||
|
|
||||||
|
switch( mode )
|
||||||
|
{
|
||||||
|
case 0x0: /* M0 */
|
||||||
|
value = scudsp_readmem(m_ct0,0);
|
||||||
|
break;
|
||||||
|
case 0x1: /* M1 */
|
||||||
|
value = scudsp_readmem(m_ct1,1);
|
||||||
|
break;
|
||||||
|
case 0x2: /* M2 */
|
||||||
|
value = scudsp_readmem(m_ct2,2);
|
||||||
|
break;
|
||||||
|
case 0x3: /* M3 */
|
||||||
|
value = scudsp_readmem(m_ct3,3);
|
||||||
|
break;
|
||||||
|
case 0x4: /* MC0 */
|
||||||
|
value = scudsp_readmem(m_ct0++,0);
|
||||||
|
m_ct0 &= 0x3f;
|
||||||
|
break;
|
||||||
|
case 0x5: /* MC1 */
|
||||||
|
value = scudsp_readmem(m_ct1++,1);
|
||||||
|
m_ct1 &= 0x3f;
|
||||||
|
break;
|
||||||
|
case 0x6: /* MC2 */
|
||||||
|
value = scudsp_readmem(m_ct2++,2);
|
||||||
|
m_ct2 &= 0x3f;
|
||||||
|
break;
|
||||||
|
case 0x7: /* MC3 */
|
||||||
|
value = scudsp_readmem(m_ct3++,3);
|
||||||
|
m_ct3 &= 0x3f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void scudsp_cpu_device::scudsp_set_dest_mem_reg( UINT32 mode, UINT32 value )
|
||||||
|
{
|
||||||
|
switch( mode )
|
||||||
|
{
|
||||||
|
case 0x0: /* MC0 */
|
||||||
|
scudsp_writemem(m_ct0++,0,value);
|
||||||
|
m_ct0 &= 0x3f;
|
||||||
|
break;
|
||||||
|
case 0x1: /* MC1 */
|
||||||
|
scudsp_writemem(m_ct1++,1,value);
|
||||||
|
m_ct1 &= 0x3f;
|
||||||
|
break;
|
||||||
|
case 0x2: /* MC2 */
|
||||||
|
scudsp_writemem(m_ct2++,2,value);
|
||||||
|
m_ct2 &= 0x3f;
|
||||||
|
break;
|
||||||
|
case 0x3: /* MC3 */
|
||||||
|
scudsp_writemem(m_ct3++,3,value);
|
||||||
|
m_ct3 &= 0x3f;
|
||||||
|
break;
|
||||||
|
#if 0
|
||||||
|
case 0x4: /* RX */
|
||||||
|
dsp_reg.rx.ui = value;
|
||||||
|
update_mul = 1;
|
||||||
|
break;
|
||||||
|
case 0x5: /* PL */
|
||||||
|
dsp_reg.pl.ui = value;
|
||||||
|
dsp_reg.ph.si = (dsp_reg.pl.si < 0) ? -1 : 0;
|
||||||
|
break;
|
||||||
|
case 0x6: /* RA0 */
|
||||||
|
dsp_reg.ra0 = value;
|
||||||
|
break;
|
||||||
|
case 0x7: /* WA0 */
|
||||||
|
dsp_reg.wa0 = value;
|
||||||
|
break;
|
||||||
|
case 0x8:
|
||||||
|
case 0x9:
|
||||||
|
/* ??? */
|
||||||
|
break;
|
||||||
|
case 0xa: /* LOP */
|
||||||
|
dsp_reg.lop = value;
|
||||||
|
break;
|
||||||
|
case 0xb: /* TOP */
|
||||||
|
dsp_reg.top = value;
|
||||||
|
break;
|
||||||
|
case 0xc: /* CT0 */
|
||||||
|
dsp_reg.ct0 = value & 0x3f;
|
||||||
|
break;
|
||||||
|
case 0xd: /* CT1 */
|
||||||
|
dsp_reg.ct1 = value & 0x3f;
|
||||||
|
break;
|
||||||
|
case 0xe: /* CT2 */
|
||||||
|
dsp_reg.ct2 = value & 0x3f;
|
||||||
|
break;
|
||||||
|
case 0xf: /* CT3 */
|
||||||
|
dsp_reg.ct3 = value & 0x3f;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define scudsp_readop(A) m_program->read_dword(A)
|
|
||||||
#define scudsp_readmem16(A) m_data->read_dword(A)
|
|
||||||
#define scudsp_writemem16(A,B) m_data->write_dword((A),B)
|
|
||||||
|
|
||||||
READ32_MEMBER( scudsp_cpu_device::program_control_r )
|
READ32_MEMBER( scudsp_cpu_device::program_control_r )
|
||||||
{
|
{
|
||||||
return (m_pc & 0xff) | (m_flags & 0xffffff00);
|
return (m_pc & 0xff) | (m_flags & FLAGS_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE32_MEMBER( scudsp_cpu_device::program_control_w )
|
WRITE32_MEMBER( scudsp_cpu_device::program_control_w )
|
||||||
@ -45,14 +147,49 @@ WRITE32_MEMBER( scudsp_cpu_device::program_control_w )
|
|||||||
newval = oldval;
|
newval = oldval;
|
||||||
COMBINE_DATA(&newval);
|
COMBINE_DATA(&newval);
|
||||||
|
|
||||||
m_flags = newval & 0xffffff00;
|
m_flags = newval & FLAGS_MASK;
|
||||||
|
|
||||||
if(LEF)
|
if(LEF)
|
||||||
m_pc = newval & 0xff;
|
m_pc = newval & 0xff;
|
||||||
|
|
||||||
|
//printf("%08x PRG CTRL\n",data);
|
||||||
set_input_line(INPUT_LINE_RESET, (EXF) ? CLEAR_LINE : ASSERT_LINE);
|
set_input_line(INPUT_LINE_RESET, (EXF) ? CLEAR_LINE : ASSERT_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRITE32_MEMBER( scudsp_cpu_device::program_w )
|
||||||
|
{
|
||||||
|
//printf("%02x %08x PRG\n",m_pc,data);
|
||||||
|
scudsp_writeop(m_pc++, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE32_MEMBER( scudsp_cpu_device::ram_address_control_w )
|
||||||
|
{
|
||||||
|
//printf("%02x %08x PRG\n",m_pc,data);
|
||||||
|
m_ra = data & 0xff;
|
||||||
|
|
||||||
|
switch((m_ra & 0xc0) >> 6)
|
||||||
|
{
|
||||||
|
case 0: m_ct0 = (m_ra & 0x3f); break;
|
||||||
|
case 1: m_ct1 = (m_ra & 0x3f); break;
|
||||||
|
case 2: m_ct2 = (m_ra & 0x3f); break;
|
||||||
|
case 3: m_ct3 = (m_ra & 0x3f); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
READ32_MEMBER( scudsp_cpu_device::ram_address_r )
|
||||||
|
{
|
||||||
|
UINT32 data;
|
||||||
|
|
||||||
|
data = scudsp_get_source_mem_value( ((m_ra & 0xc0) >> 6) + 4 );
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE32_MEMBER( scudsp_cpu_device::ram_address_w )
|
||||||
|
{
|
||||||
|
scudsp_set_dest_mem_reg( (m_ra & 0xc0) >> 6, data );
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************
|
/***********************************
|
||||||
* illegal opcodes
|
* illegal opcodes
|
||||||
***********************************/
|
***********************************/
|
||||||
@ -91,22 +228,31 @@ void scudsp_cpu_device::device_start()
|
|||||||
m_data = &space(AS_DATA);
|
m_data = &space(AS_DATA);
|
||||||
|
|
||||||
save_item(NAME(m_pc));
|
save_item(NAME(m_pc));
|
||||||
|
save_item(NAME(m_ra));
|
||||||
|
save_item(NAME(m_ct0));
|
||||||
|
save_item(NAME(m_ct1));
|
||||||
|
save_item(NAME(m_ct2));
|
||||||
|
save_item(NAME(m_ct3));
|
||||||
save_item(NAME(m_flags));
|
save_item(NAME(m_flags));
|
||||||
save_item(NAME(m_reset_state));
|
save_item(NAME(m_reset_state));
|
||||||
|
|
||||||
// Register state for debugger
|
// Register state for debugger
|
||||||
state_add( SCUDSP_PC, "PC", m_pc ).formatstr("%02X");
|
state_add( SCUDSP_PC, "PC", m_pc ).formatstr("%02X");
|
||||||
state_add( SCUDSP_FLAGS, "SR", m_flags ).formatstr("%08X");
|
state_add( SCUDSP_FLAGS, "SR", m_flags ).formatstr("%08X");
|
||||||
|
state_add( SCUDSP_RA, "RA", m_ra ).formatstr("%02X");
|
||||||
|
state_add( SCUDSP_CT0, "CT0", m_ct0 ).formatstr("%02X");
|
||||||
|
state_add( SCUDSP_CT1, "CT1", m_ct1 ).formatstr("%02X");
|
||||||
|
state_add( SCUDSP_CT2, "CT2", m_ct2 ).formatstr("%02X");
|
||||||
|
state_add( SCUDSP_CT3, "CT3", m_ct3 ).formatstr("%02X");
|
||||||
state_add( STATE_GENPC, "curpc", m_pc ).noshow();
|
state_add( STATE_GENPC, "curpc", m_pc ).noshow();
|
||||||
state_add( STATE_GENFLAGS, "GENFLAGS", m_flags ).noshow();
|
state_add( STATE_GENFLAGS, "GENFLAGS", m_flags ).formatstr("%17s").noshow();
|
||||||
|
|
||||||
m_icountptr = &m_icount;
|
m_icountptr = &m_icount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void scudsp_cpu_device::device_reset()
|
void scudsp_cpu_device::device_reset()
|
||||||
{
|
{
|
||||||
/* This is how we set the reset vector */
|
|
||||||
//set_input_line(CP1610_RESET, PULSE_LINE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void scudsp_cpu_device::execute_set_input(int irqline, int state)
|
void scudsp_cpu_device::execute_set_input(int irqline, int state)
|
||||||
@ -122,7 +268,7 @@ void scudsp_cpu_device::execute_set_input(int irqline, int state)
|
|||||||
scudsp_cpu_device::scudsp_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
scudsp_cpu_device::scudsp_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
: cpu_device(mconfig, SCUDSP, "SCUDSP", tag, owner, clock, "scudsp", __FILE__)
|
: cpu_device(mconfig, SCUDSP, "SCUDSP", tag, owner, clock, "scudsp", __FILE__)
|
||||||
, m_program_config("program", ENDIANNESS_BIG, 32, 8, -2)
|
, m_program_config("program", ENDIANNESS_BIG, 32, 8, -2)
|
||||||
, m_data_config("data", ENDIANNESS_BIG, 32, 8, 0)
|
, m_data_config("data", ENDIANNESS_BIG, 32, 8, -2)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,11 +278,18 @@ void scudsp_cpu_device::state_string_export(const device_state_entry &entry, ast
|
|||||||
switch (entry.index())
|
switch (entry.index())
|
||||||
{
|
{
|
||||||
case STATE_GENFLAGS:
|
case STATE_GENFLAGS:
|
||||||
string.printf("%c%c%c%c",
|
string.printf("%s%s%s%c%c%c%c%c%s%s%s",
|
||||||
m_flags & 0x80 ? 'S':'.',
|
m_flags & 0x4000000 ? "PR":"..",
|
||||||
m_flags & 0x40 ? 'Z':'.',
|
m_flags & 0x2000000 ? "EP":"..",
|
||||||
m_flags & 0x20 ? 'V':'.',
|
m_flags & 0x800000 ? "T0":"..",
|
||||||
m_flags & 0x10 ? 'C':'.');
|
m_flags & 0x400000 ? 'S':'.',
|
||||||
|
m_flags & 0x200000 ? 'Z':'.',
|
||||||
|
m_flags & 0x100000 ? 'C':'.',
|
||||||
|
m_flags & 0x80000 ? 'V':'.',
|
||||||
|
m_flags & 0x40000 ? 'E':'.',
|
||||||
|
m_flags & 0x20000 ? "ES":"..",
|
||||||
|
m_flags & 0x10000 ? "EX":"..",
|
||||||
|
m_flags & 0x8000 ? "LE":"..");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,9 @@
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
SCUDSP_PC=1, SCUDSP_FLAGS
|
SCUDSP_RA=1,
|
||||||
|
SCUDSP_CT0, SCUDSP_CT1, SCUDSP_CT2, SCUDSP_CT3,
|
||||||
|
SCUDSP_PC, SCUDSP_FLAGS
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SCUDSP_RESET INPUT_LINE_RESET /* Non-Maskable */
|
#define SCUDSP_RESET INPUT_LINE_RESET /* Non-Maskable */
|
||||||
@ -25,9 +27,16 @@ public:
|
|||||||
// construction/destruction
|
// construction/destruction
|
||||||
scudsp_cpu_device(const machine_config &mconfig, const char *_tag, device_t *_owner, UINT32 _clock);
|
scudsp_cpu_device(const machine_config &mconfig, const char *_tag, device_t *_owner, UINT32 _clock);
|
||||||
|
|
||||||
|
/* port 0 */
|
||||||
DECLARE_READ32_MEMBER( program_control_r );
|
DECLARE_READ32_MEMBER( program_control_r );
|
||||||
DECLARE_WRITE32_MEMBER( program_control_w );
|
DECLARE_WRITE32_MEMBER( program_control_w );
|
||||||
|
/* port 1 */
|
||||||
|
DECLARE_WRITE32_MEMBER( program_w );
|
||||||
|
/* port 2 */
|
||||||
|
DECLARE_WRITE32_MEMBER( ram_address_control_w );
|
||||||
|
/* port 3 */
|
||||||
|
DECLARE_READ32_MEMBER( ram_address_r );
|
||||||
|
DECLARE_WRITE32_MEMBER( ram_address_w );
|
||||||
// virtual DECLARE_ADDRESS_MAP(map, 32) = 0;
|
// virtual DECLARE_ADDRESS_MAP(map, 32) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -59,13 +68,16 @@ private:
|
|||||||
|
|
||||||
UINT8 m_pc; /* registers */
|
UINT8 m_pc; /* registers */
|
||||||
UINT32 m_flags; /* flags */
|
UINT32 m_flags; /* flags */
|
||||||
|
UINT8 m_ra;
|
||||||
|
UINT8 m_ct0,m_ct1,m_ct2,m_ct3; /*Index for RAM*/ /*6-bits */
|
||||||
int m_reset_state;
|
int m_reset_state;
|
||||||
address_space *m_program;
|
address_space *m_program;
|
||||||
address_space *m_data;
|
address_space *m_data;
|
||||||
int m_icount;
|
int m_icount;
|
||||||
|
|
||||||
|
UINT32 scudsp_get_source_mem_value(UINT8 mode);
|
||||||
|
void scudsp_set_dest_mem_reg( UINT32 mode, UINT32 value );
|
||||||
void scudsp_illegal();
|
void scudsp_illegal();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,19 +2,324 @@
|
|||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "scudsp.h"
|
#include "scudsp.h"
|
||||||
|
|
||||||
|
static const char *const ALU_Commands[] =
|
||||||
|
{
|
||||||
|
"", /* 0000 */
|
||||||
|
"AND", /* 0001 */
|
||||||
|
"OR", /* 0010 */
|
||||||
|
"XOR", /* 0011 */
|
||||||
|
"ADD", /* 0100 */
|
||||||
|
"SUB", /* 0101 */
|
||||||
|
"AD2", /* 0110 */
|
||||||
|
"???", /* 0111 */
|
||||||
|
"SR", /* 1000 */
|
||||||
|
"RR", /* 1001 */
|
||||||
|
"SL", /* 1010 */
|
||||||
|
"RL", /* 1011 */
|
||||||
|
"???", /* 1100 */
|
||||||
|
"???", /* 1101 */
|
||||||
|
"???", /* 1110 */
|
||||||
|
"RL8", /* 1111 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const X_Commands[] =
|
||||||
|
{
|
||||||
|
"", /* 000 */
|
||||||
|
"", /* 001 */ /* NOP? check instruction @ 0x0B */
|
||||||
|
"MOV MUL,P", /* 010 */
|
||||||
|
"MOV %s,P", /* 011 */
|
||||||
|
"MOV %s,X", /* 100 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const Y_Commands[] =
|
||||||
|
{
|
||||||
|
"", /* 000 */
|
||||||
|
"CLR A", /* 001 */
|
||||||
|
"MOV ALU,A", /* 010 */
|
||||||
|
"MOV %s,A", /* 011 */
|
||||||
|
"MOV %s,Y", /* 100 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const D1_Commands[] =
|
||||||
|
{
|
||||||
|
"", /* 00 */
|
||||||
|
"MOV %I8,%d", /* 01 */
|
||||||
|
"???", /* 10 */
|
||||||
|
"MOV %S,%d", /* 11 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const SourceMemory[] =
|
||||||
|
{
|
||||||
|
"M0", /* 000 */
|
||||||
|
"M1", /* 001 */
|
||||||
|
"M2", /* 010 */
|
||||||
|
"M3", /* 011 */
|
||||||
|
"MC0", /* 100 */
|
||||||
|
"MC1", /* 101 */
|
||||||
|
"MC2", /* 110 */
|
||||||
|
"MC3", /* 111 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const SourceMemory2[] =
|
||||||
|
{
|
||||||
|
"M0", /* 0000 */
|
||||||
|
"M1", /* 0001 */
|
||||||
|
"M2", /* 0010 */
|
||||||
|
"M3", /* 0011 */
|
||||||
|
"MC0", /* 0100 */
|
||||||
|
"MC1", /* 0101 */
|
||||||
|
"MC2", /* 0110 */
|
||||||
|
"MC3", /* 0111 */
|
||||||
|
"???", /* 1000 */
|
||||||
|
"ALL", /* 1001 */
|
||||||
|
"ALH", /* 1010 */
|
||||||
|
"???", /* 1011 */
|
||||||
|
"???", /* 1100 */
|
||||||
|
"???", /* 1101 */
|
||||||
|
"???", /* 1110 */
|
||||||
|
"???", /* 1111 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const DestMemory[] =
|
||||||
|
{
|
||||||
|
"MC0", /* 0000 */
|
||||||
|
"MC1", /* 0001 */
|
||||||
|
"MC2", /* 0010 */
|
||||||
|
"MC3", /* 0011 */
|
||||||
|
"RX", /* 0100 */
|
||||||
|
"PL", /* 0101 */
|
||||||
|
"RA0", /* 0110 */
|
||||||
|
"WA0", /* 0111 */
|
||||||
|
"???", /* 1000 */
|
||||||
|
"???", /* 1001 */
|
||||||
|
"LOP", /* 1010 */
|
||||||
|
"TOP", /* 1011 */
|
||||||
|
"CT0", /* 1100 */
|
||||||
|
"CT1", /* 1101 */
|
||||||
|
"CT2", /* 1110 */
|
||||||
|
"CT3", /* 1111 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const DestDMAMemory[] =
|
||||||
|
{
|
||||||
|
"M0", /* 000 */
|
||||||
|
"M1", /* 001 */
|
||||||
|
"M2", /* 010 */
|
||||||
|
"M3", /* 011 */
|
||||||
|
"PRG", /* 100 */
|
||||||
|
"???", /* 101 */
|
||||||
|
"???", /* 110 */
|
||||||
|
"???", /* 111 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const MVI_Command[] =
|
||||||
|
{
|
||||||
|
"MVI %I,%d", /* 0 */
|
||||||
|
"MVI %I,%d,%f", /* 1 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const JMP_Command[] =
|
||||||
|
{
|
||||||
|
"JMP %IA",
|
||||||
|
"JMP %f,%IA",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *const DMA_Command[] =
|
||||||
|
{
|
||||||
|
"DMA%H%A D0,%M,%I",
|
||||||
|
"DMA%H%A %s,D0,%I",
|
||||||
|
"DMA%H%A D0,%M,%s",
|
||||||
|
"DMA%H%A %s,D0,%s",
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void scudsp_dasm_prefix( const char* format, char* buffer, UINT32 *data )
|
||||||
|
{
|
||||||
|
for ( ; *format; format++ )
|
||||||
|
{
|
||||||
|
if ( *format == '%' )
|
||||||
|
{
|
||||||
|
switch( *++format )
|
||||||
|
{
|
||||||
|
case 'H':
|
||||||
|
if ( *data )
|
||||||
|
{
|
||||||
|
strcpy( buffer, "H" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*buffer = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
if ( *data == 0 )
|
||||||
|
{
|
||||||
|
strcpy( buffer, "0" );
|
||||||
|
}
|
||||||
|
else if ( *data == 1 )
|
||||||
|
{
|
||||||
|
*buffer = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf( buffer, "%d", 1 << (*data - 1) );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
strcpy( buffer, SourceMemory[ *data & 0x7 ] );
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
strcpy( buffer, DestMemory[ *data & 0xf ] );
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
strcpy( buffer, SourceMemory2[ *data & 0xf ] );
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
++format;
|
||||||
|
if ( *format == '8' )
|
||||||
|
{
|
||||||
|
sprintf( buffer, "#$%x", *data );
|
||||||
|
}
|
||||||
|
else if ( *format == 'A' )
|
||||||
|
{
|
||||||
|
sprintf( buffer, "$%X", *data );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
--format;
|
||||||
|
sprintf( buffer, "#$%X", *data );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
if ( !(*data & 0x20) )
|
||||||
|
{
|
||||||
|
strcpy( buffer, "N" );
|
||||||
|
buffer++;
|
||||||
|
}
|
||||||
|
switch( *data & 0xf )
|
||||||
|
{
|
||||||
|
case 0x3:
|
||||||
|
strcpy( buffer, "ZS" );
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
strcpy( buffer, "S" );
|
||||||
|
break;
|
||||||
|
case 0x4:
|
||||||
|
strcpy( buffer, "C" );
|
||||||
|
break;
|
||||||
|
case 0x8:
|
||||||
|
strcpy( buffer, "T0" );
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
strcpy( buffer, "Z" );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
strcpy( buffer, "?" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
strcpy( buffer, DestDMAMemory[ *data ] );
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
data++;
|
||||||
|
buffer += strlen( buffer );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*buffer++ = *format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*buffer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CPU_DISASSEMBLE( scudsp )
|
CPU_DISASSEMBLE( scudsp )
|
||||||
{
|
{
|
||||||
UINT32 op = oprom[0]<<24|oprom[1]<<16|oprom[2]<<8|oprom[3]<<0;
|
UINT32 op = oprom[0]<<24|oprom[1]<<16|oprom[2]<<8|oprom[3]<<0;
|
||||||
unsigned size = 1;
|
unsigned size = 1;
|
||||||
// const char *sym, *sym2;
|
// const char *sym, *sym2;
|
||||||
|
char *my_buffer = buffer;
|
||||||
|
char temp_buffer[64];
|
||||||
|
UINT32 data[2];
|
||||||
|
|
||||||
switch( op >> 30 )
|
switch( op >> 30 )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
sprintf(buffer, "ALU OP");
|
if ( (op & 0x3F8E3000) == 0 )
|
||||||
|
{
|
||||||
|
sprintf( buffer, "%-10s", "NOP" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ALU */
|
||||||
|
sprintf(my_buffer, "%-10s", ALU_Commands[ (op & 0x3c000000) >> 26] );
|
||||||
|
my_buffer += strlen( my_buffer );
|
||||||
|
|
||||||
|
/* X-Bus */
|
||||||
|
data[0] = (op & 0x700000) >> 20;
|
||||||
|
if ( op & 0x2000000 )
|
||||||
|
{
|
||||||
|
scudsp_dasm_prefix( X_Commands[ 4 ], temp_buffer, data );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*temp_buffer = 0;
|
||||||
|
}
|
||||||
|
sprintf( my_buffer, "%-10s", temp_buffer );
|
||||||
|
my_buffer += strlen( my_buffer );
|
||||||
|
|
||||||
|
scudsp_dasm_prefix( X_Commands[ (op & 0x1800000) >> 23 ], temp_buffer, data );
|
||||||
|
sprintf( my_buffer, "%-10s", temp_buffer );
|
||||||
|
my_buffer += strlen( my_buffer );
|
||||||
|
|
||||||
|
data[0] = (op & 0x1C000 ) >> 14 ;
|
||||||
|
if ( op & 0x80000 )
|
||||||
|
{
|
||||||
|
scudsp_dasm_prefix( Y_Commands[4], temp_buffer, data );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*temp_buffer = 0;
|
||||||
|
}
|
||||||
|
sprintf( my_buffer, "%-8s", temp_buffer );
|
||||||
|
my_buffer += strlen( my_buffer );
|
||||||
|
|
||||||
|
scudsp_dasm_prefix( Y_Commands[ (op & 0x60000) >> 17 ], temp_buffer, data );
|
||||||
|
sprintf( my_buffer, "%-8s", temp_buffer );
|
||||||
|
my_buffer += strlen( my_buffer );
|
||||||
|
|
||||||
|
/* D1-Bus */
|
||||||
|
switch( (op & 0x3000) >> 12 )
|
||||||
|
{
|
||||||
|
case 0x1:
|
||||||
|
data[0] = (op & 0xFF);
|
||||||
|
data[1] = ((op & 0xF00) >> 8);
|
||||||
|
break;
|
||||||
|
case 0x3:
|
||||||
|
data[0] = (op & 0xF);
|
||||||
|
data[1] = ((op & 0xF00) >> 8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
scudsp_dasm_prefix( D1_Commands[ (op & 0x3000) >> 12 ], temp_buffer, data );
|
||||||
|
sprintf( my_buffer, "%-8s", temp_buffer );
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
sprintf(buffer, "MVI");
|
if ( (op & 0x2000000) )
|
||||||
|
{
|
||||||
|
data[0] = op & 0x7FFFF;
|
||||||
|
data[1] = (op & 0x3C000000) >> 26;
|
||||||
|
data[2] = (op & 0x3F80000 ) >> 19;
|
||||||
|
scudsp_dasm_prefix( MVI_Command[1], buffer, data ); /* TODO: bad mem*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data[0] = op & 0x1FFFFFF;
|
||||||
|
data[1] = (op & 0x3C000000) >> 26;
|
||||||
|
scudsp_dasm_prefix( MVI_Command[0], buffer, data ); /* TODO: bad mem*/
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
switch((op >> 28) & 3)
|
switch((op >> 28) & 3)
|
||||||
@ -23,7 +328,17 @@ CPU_DISASSEMBLE( scudsp )
|
|||||||
sprintf(buffer, "DMA");
|
sprintf(buffer, "DMA");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
sprintf(buffer, "JMP");
|
if ( op & 0x3F80000 )
|
||||||
|
{
|
||||||
|
data[0] = (op & 0x3F80000) >> 19;
|
||||||
|
data[1] = op & 0xff;
|
||||||
|
scudsp_dasm_prefix( JMP_Command[1], buffer, data );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data[0] = op & 0xff;
|
||||||
|
scudsp_dasm_prefix( JMP_Command[0], buffer, data );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
sprintf(buffer, op & 0x8000000 ? "LPS" : "BTM");
|
sprintf(buffer, op & 0x8000000 ? "LPS" : "BTM");
|
||||||
|
@ -221,6 +221,8 @@ void saturn_state::scu_test_pending_irq()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define USE_NEW_SCUDSP 1
|
||||||
|
|
||||||
READ32_MEMBER(saturn_state::saturn_scu_r)
|
READ32_MEMBER(saturn_state::saturn_scu_r)
|
||||||
{
|
{
|
||||||
UINT32 res;
|
UINT32 res;
|
||||||
@ -238,12 +240,19 @@ READ32_MEMBER(saturn_state::saturn_scu_r)
|
|||||||
res = m_scu.status;
|
res = m_scu.status;
|
||||||
break;
|
break;
|
||||||
case 0x80/4:
|
case 0x80/4:
|
||||||
|
#if USE_NEW_SCUDSP
|
||||||
res = m_scudsp->program_control_r(space, 0, mem_mask);
|
res = m_scudsp->program_control_r(space, 0, mem_mask);
|
||||||
|
#else
|
||||||
res = dsp_prg_ctrl_r(space);
|
res = dsp_prg_ctrl_r(space);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case 0x8c/4:
|
case 0x8c/4:
|
||||||
if(LOG_SCU && !space.debugger_access()) logerror( "DSP mem read at %08X\n", m_scu_regs[34]);
|
if(LOG_SCU && !space.debugger_access()) logerror( "DSP mem read at %08X\n", m_scu_regs[34]);
|
||||||
|
#if USE_NEW_SCUDSP
|
||||||
|
res = m_scudsp->ram_address_r(space, 0, mem_mask);
|
||||||
|
#else
|
||||||
res = dsp_ram_addr_r();
|
res = dsp_ram_addr_r();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case 0xa0/4:
|
case 0xa0/4:
|
||||||
if(LOG_SCU && !space.debugger_access()) logerror("(PC=%08x) IRQ mask reg read %08x MASK=%08x\n",space.device().safe_pc(),mem_mask,m_scu_regs[0xa0/4]);
|
if(LOG_SCU && !space.debugger_access()) logerror("(PC=%08x) IRQ mask reg read %08x MASK=%08x\n",space.device().safe_pc(),mem_mask,m_scu_regs[0xa0/4]);
|
||||||
@ -313,20 +322,35 @@ WRITE32_MEMBER(saturn_state::saturn_scu_w)
|
|||||||
/*DSP section*/
|
/*DSP section*/
|
||||||
case 0x80/4:
|
case 0x80/4:
|
||||||
/* TODO: you can't overwrite some flags with this */
|
/* TODO: you can't overwrite some flags with this */
|
||||||
|
#if USE_NEW_SCUDSP
|
||||||
|
m_scudsp->program_control_w(space, 0, m_scu_regs[offset], mem_mask);
|
||||||
|
#else
|
||||||
dsp_prg_ctrl_w(space, m_scu_regs[offset]);
|
dsp_prg_ctrl_w(space, m_scu_regs[offset]);
|
||||||
m_scudsp->program_control_w(space, 0, mem_mask,data);
|
#endif
|
||||||
if(LOG_SCU) logerror("SCU DSP: Program Control Port Access %08x\n",data);
|
if(LOG_SCU) logerror("SCU DSP: Program Control Port Access %08x\n",data);
|
||||||
break;
|
break;
|
||||||
case 0x84/4:
|
case 0x84/4:
|
||||||
|
#if USE_NEW_SCUDSP
|
||||||
|
m_scudsp->program_w(space, 0, m_scu_regs[offset], mem_mask);
|
||||||
|
#else
|
||||||
dsp_prg_data(m_scu_regs[offset]);
|
dsp_prg_data(m_scu_regs[offset]);
|
||||||
|
#endif
|
||||||
if(LOG_SCU) logerror("SCU DSP: Program RAM Data Port Access %08x\n",data);
|
if(LOG_SCU) logerror("SCU DSP: Program RAM Data Port Access %08x\n",data);
|
||||||
break;
|
break;
|
||||||
case 0x88/4:
|
case 0x88/4:
|
||||||
|
#if USE_NEW_SCUDSP
|
||||||
|
m_scudsp->ram_address_control_w(space, 0,m_scu_regs[offset], mem_mask);
|
||||||
|
#else
|
||||||
dsp_ram_addr_ctrl(m_scu_regs[offset]);
|
dsp_ram_addr_ctrl(m_scu_regs[offset]);
|
||||||
|
#endif
|
||||||
if(LOG_SCU) logerror("SCU DSP: Data RAM Address Port Access %08x\n",data);
|
if(LOG_SCU) logerror("SCU DSP: Data RAM Address Port Access %08x\n",data);
|
||||||
break;
|
break;
|
||||||
case 0x8c/4:
|
case 0x8c/4:
|
||||||
|
#if USE_NEW_SCUDSP
|
||||||
|
m_scudsp->ram_address_w(space, 0, m_scu_regs[offset], mem_mask);
|
||||||
|
#else
|
||||||
dsp_ram_addr_w(m_scu_regs[offset]);
|
dsp_ram_addr_w(m_scu_regs[offset]);
|
||||||
|
#endif
|
||||||
if(LOG_SCU) logerror("SCU DSP: Data RAM Data Port Access %08x\n",data);
|
if(LOG_SCU) logerror("SCU DSP: Data RAM Data Port Access %08x\n",data);
|
||||||
break;
|
break;
|
||||||
case 0x90/4: /*if(LOG_SCU) logerror("timer 0 compare data = %03x\n",m_scu_regs[36]);*/ break;
|
case 0x90/4: /*if(LOG_SCU) logerror("timer 0 compare data = %03x\n",m_scu_regs[36]);*/ break;
|
||||||
|
@ -961,6 +961,14 @@ static ADDRESS_MAP_START( sound_mem, AS_PROGRAM, 16, stv_state )
|
|||||||
AM_RANGE(0x100000, 0x100fff) AM_DEVREADWRITE_LEGACY("scsp", scsp_r, scsp_w)
|
AM_RANGE(0x100000, 0x100fff) AM_DEVREADWRITE_LEGACY("scsp", scsp_r, scsp_w)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static ADDRESS_MAP_START( scudsp_mem, AS_PROGRAM, 32, sat_console_state )
|
||||||
|
AM_RANGE(0x00, 0xff) AM_RAM
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static ADDRESS_MAP_START( scudsp_data, AS_DATA, 32, sat_console_state )
|
||||||
|
AM_RANGE(0x00, 0xff) AM_RAM
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static MACHINE_CONFIG_START( stv, stv_state )
|
static MACHINE_CONFIG_START( stv, stv_state )
|
||||||
|
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
|
@ -2316,7 +2316,7 @@ READ16_MEMBER(pc9801_state::pc9801rs_ide_io_1_r)
|
|||||||
|
|
||||||
WRITE16_MEMBER(pc9801_state::pc9801rs_ide_io_1_w)
|
WRITE16_MEMBER(pc9801_state::pc9801rs_ide_io_1_w)
|
||||||
{
|
{
|
||||||
m_ide->write_cs0(space, offset, mem_mask);
|
m_ide->write_cs0(space, offset, data, mem_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
READ16_MEMBER(pc9801_state::pc9801rs_ide_io_2_r)
|
READ16_MEMBER(pc9801_state::pc9801rs_ide_io_2_r)
|
||||||
@ -2326,7 +2326,7 @@ READ16_MEMBER(pc9801_state::pc9801rs_ide_io_2_r)
|
|||||||
|
|
||||||
WRITE16_MEMBER(pc9801_state::pc9801rs_ide_io_2_w)
|
WRITE16_MEMBER(pc9801_state::pc9801rs_ide_io_2_w)
|
||||||
{
|
{
|
||||||
m_ide->write_cs1(space, offset + 6, mem_mask);
|
m_ide->write_cs1(space, offset + 6, data, mem_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 32, pc9801_state )
|
static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 32, pc9801_state )
|
||||||
|
@ -184,7 +184,6 @@ static ADDRESS_MAP_START( sound_mem, AS_PROGRAM, 16, sat_console_state )
|
|||||||
AM_RANGE(0x100000, 0x100fff) AM_DEVREADWRITE_LEGACY("scsp", scsp_r, scsp_w)
|
AM_RANGE(0x100000, 0x100fff) AM_DEVREADWRITE_LEGACY("scsp", scsp_r, scsp_w)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
#if 1
|
|
||||||
static ADDRESS_MAP_START( scudsp_mem, AS_PROGRAM, 32, sat_console_state )
|
static ADDRESS_MAP_START( scudsp_mem, AS_PROGRAM, 32, sat_console_state )
|
||||||
AM_RANGE(0x00, 0xff) AM_RAM
|
AM_RANGE(0x00, 0xff) AM_RAM
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
@ -192,7 +191,6 @@ ADDRESS_MAP_END
|
|||||||
static ADDRESS_MAP_START( scudsp_data, AS_DATA, 32, sat_console_state )
|
static ADDRESS_MAP_START( scudsp_data, AS_DATA, 32, sat_console_state )
|
||||||
AM_RANGE(0x00, 0xff) AM_RAM
|
AM_RANGE(0x00, 0xff) AM_RAM
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* keyboard code */
|
/* keyboard code */
|
||||||
|
Loading…
Reference in New Issue
Block a user