mirror of
https://github.com/holub/mame
synced 2025-06-05 20:33:45 +03:00
Specify a few of the unique aspects of the SCC68070 core (nw)
This commit is contained in:
parent
d0075e3c42
commit
ad0dbabc1f
@ -3153,7 +3153,7 @@ M68KMAKE_OP(bkpt, 0, ., .)
|
||||
{
|
||||
if(CPU_TYPE_IS_EC020_PLUS())
|
||||
{
|
||||
(void)m_cpu_space->read_dword((m_ir & 7) << 2, 0xffffffff);
|
||||
(void)m_cpu_space->read_word((m_ir & 7) << 2, 0xffff);
|
||||
}
|
||||
else if(CPU_TYPE_IS_010_PLUS())
|
||||
{
|
||||
@ -6513,7 +6513,7 @@ M68KMAKE_OP(move, 16, toc, .)
|
||||
|
||||
M68KMAKE_OP(move, 16, frs, d)
|
||||
{
|
||||
if(CPU_TYPE_IS_000() || m_s_flag) /* NS990408 */
|
||||
if(CPU_TYPE_IS_000() || CPU_TYPE_IS_070() || m_s_flag) /* NS990408 */
|
||||
{
|
||||
DY() = MASK_OUT_BELOW_16(DY()) | m68ki_get_sr();
|
||||
return;
|
||||
@ -6524,7 +6524,7 @@ M68KMAKE_OP(move, 16, frs, d)
|
||||
|
||||
M68KMAKE_OP(move, 16, frs, .)
|
||||
{
|
||||
if(CPU_TYPE_IS_000() || m_s_flag) /* NS990408 */
|
||||
if(CPU_TYPE_IS_000() || CPU_TYPE_IS_070() || m_s_flag) /* NS990408 */
|
||||
{
|
||||
uint32_t ea = M68KMAKE_GET_EA_AY_16;
|
||||
m68ki_write_16(ea, m68ki_get_sr());
|
||||
@ -9011,7 +9011,7 @@ M68KMAKE_OP(rte, 32, ., .)
|
||||
return;
|
||||
}
|
||||
|
||||
if(CPU_TYPE_IS_010())
|
||||
if(CPU_TYPE_IS_010() || CPU_TYPE_IS_070())
|
||||
{
|
||||
format_word = m68ki_read_16(REG_A()[7]+6) >> 12;
|
||||
if(format_word == 0)
|
||||
|
@ -614,7 +614,7 @@ const uint8_t m68000_base_device::m68ki_ea_idx_cycle_table[64] =
|
||||
CPU STATE DESCRIPTION
|
||||
***************************************************************************/
|
||||
|
||||
#define MASK_ALL (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_EC030 | CPU_TYPE_030 | CPU_TYPE_EC040 | CPU_TYPE_040 | CPU_TYPE_FSCPU32 )
|
||||
#define MASK_ALL (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_EC030 | CPU_TYPE_030 | CPU_TYPE_EC040 | CPU_TYPE_040 | CPU_TYPE_FSCPU32 | CPU_TYPE_SCC070 )
|
||||
#define MASK_24BIT_SPACE (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020)
|
||||
#define MASK_32BIT_SPACE (CPU_TYPE_020 | CPU_TYPE_EC030 | CPU_TYPE_030 | CPU_TYPE_EC040 | CPU_TYPE_040 | CPU_TYPE_FSCPU32 )
|
||||
#define MASK_010_OR_LATER (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_030 | CPU_TYPE_EC030 | CPU_TYPE_040 | CPU_TYPE_EC040 | CPU_TYPE_FSCPU32 )
|
||||
@ -687,7 +687,7 @@ void m68000_base_device::m68k_cause_bus_error()
|
||||
|
||||
m_run_mode = RUN_MODE_BERR_AERR_RESET_WSF;
|
||||
|
||||
if (!CPU_TYPE_IS_010_PLUS())
|
||||
if (CPU_TYPE_IS_000())
|
||||
{
|
||||
/* Note: This is implemented for 68000 only! */
|
||||
m68ki_stack_frame_buserr(sr);
|
||||
@ -697,6 +697,11 @@ void m68000_base_device::m68k_cause_bus_error()
|
||||
/* only the 68010 throws this unique type-1000 frame */
|
||||
m68ki_stack_frame_1000(m_ppc, sr, EXCEPTION_BUS_ERROR);
|
||||
}
|
||||
else if (CPU_TYPE_IS_070())
|
||||
{
|
||||
/* only the 68070 throws this unique type-1111 frame */
|
||||
m68ki_stack_frame_1111(m_ppc, sr, EXCEPTION_BUS_ERROR);
|
||||
}
|
||||
else if (m_mmu_tmp_buserror_address == m_ppc)
|
||||
{
|
||||
m68ki_stack_frame_1010(sr, EXCEPTION_BUS_ERROR, m_ppc, m_mmu_tmp_buserror_address);
|
||||
@ -1955,8 +1960,28 @@ void m68000_base_device::init_cpu_m68lc040(void)
|
||||
|
||||
void m68000_base_device::init_cpu_scc68070(void)
|
||||
{
|
||||
init_cpu_m68010();
|
||||
init_cpu_common();
|
||||
m_cpu_type = CPU_TYPE_SCC070;
|
||||
|
||||
// TODO: most of this is subtly different
|
||||
init16(*m_program, *m_oprogram);
|
||||
m_sr_mask = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */
|
||||
m_jump_table = m68ki_instruction_jump_table[1];
|
||||
m_cyc_instruction = m68ki_cycles[1];
|
||||
m_cyc_exception = m68ki_exception_cycle_table[1];
|
||||
m_cyc_bcc_notake_b = -4;
|
||||
m_cyc_bcc_notake_w = 0;
|
||||
m_cyc_dbcc_f_noexp = 0;
|
||||
m_cyc_dbcc_f_exp = 6;
|
||||
m_cyc_scc_r_true = 0;
|
||||
m_cyc_movem_w = 2;
|
||||
m_cyc_movem_l = 3;
|
||||
m_cyc_shift = 1;
|
||||
m_cyc_reset = 130;
|
||||
m_has_pmmu = 0;
|
||||
m_has_fpu = 0;
|
||||
|
||||
define_state();
|
||||
}
|
||||
|
||||
|
||||
|
@ -228,10 +228,12 @@ inline uint32_t CPU_TYPE_IS_EC020_LESS() const { return ((m_cpu_type) & (CPU_TY
|
||||
|
||||
inline uint32_t CPU_TYPE_IS_010() const { return ((m_cpu_type) == CPU_TYPE_010); }
|
||||
inline uint32_t CPU_TYPE_IS_010_PLUS() const { return ((m_cpu_type) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_EC030 | CPU_TYPE_030 | CPU_TYPE_040 | CPU_TYPE_EC040 | CPU_TYPE_FSCPU32 | CPU_TYPE_COLDFIRE)); }
|
||||
inline uint32_t CPU_TYPE_IS_010_LESS() const { return ((m_cpu_type) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010)); }
|
||||
inline uint32_t CPU_TYPE_IS_010_LESS() const { return ((m_cpu_type) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_SCC070)); }
|
||||
|
||||
inline uint32_t CPU_TYPE_IS_000() const { return ((m_cpu_type) == CPU_TYPE_000 || (m_cpu_type) == CPU_TYPE_008); }
|
||||
|
||||
inline uint32_t CPU_TYPE_IS_070() const { return ((m_cpu_type) == CPU_TYPE_SCC070); }
|
||||
|
||||
|
||||
/* Initiates trace checking before each instruction (t1) */
|
||||
inline void m68ki_trace_t1() { m_tracing = m_t1_flag; }
|
||||
@ -1133,7 +1135,7 @@ inline void m68ki_stack_frame_3word(uint32_t pc, uint32_t sr)
|
||||
inline void m68ki_stack_frame_0000(uint32_t pc, uint32_t sr, uint32_t vector)
|
||||
{
|
||||
/* Stack a 3-word frame if we are 68000 */
|
||||
if(m_cpu_type == CPU_TYPE_000 || m_cpu_type == CPU_TYPE_008)
|
||||
if(CPU_TYPE_IS_000())
|
||||
{
|
||||
m68ki_stack_frame_3word(pc, sr);
|
||||
return;
|
||||
@ -1233,6 +1235,48 @@ inline void m68ki_stack_frame_1000(uint32_t pc, uint32_t sr, uint32_t vector)
|
||||
m68ki_push_16(sr);
|
||||
}
|
||||
|
||||
/* Format 15 stack frame (68070).
|
||||
* 68070 only. This is the 17 word bus/address error frame.
|
||||
*/
|
||||
inline void m68ki_stack_frame_1111(uint32_t pc, uint32_t sr, uint32_t vector)
|
||||
{
|
||||
/* INTERNAL INFORMATION */
|
||||
m68ki_fake_push_16();
|
||||
|
||||
/* INSTRUCTION INPUT BUFFER */
|
||||
m68ki_push_16(0);
|
||||
|
||||
/* INSTRUCTION REGISTER */
|
||||
m68ki_push_16(m_ir);
|
||||
|
||||
/* DATA INPUT BUFFER */
|
||||
m68ki_push_32(0);
|
||||
|
||||
/* FAULT ADDRESS */
|
||||
m68ki_push_32(0);
|
||||
|
||||
/* DATA OUTPUT BUFFER */
|
||||
m68ki_push_32(0);
|
||||
|
||||
/* INTERNAL INFORMATION */
|
||||
m68ki_fake_push_32();
|
||||
|
||||
/* CURRENT MOVE MULTIPLE MASK */
|
||||
m68ki_push_16(0);
|
||||
|
||||
/* SPECIAL STATUS WORD */
|
||||
m68ki_push_16(0);
|
||||
|
||||
/* 1111, VECTOR OFFSET */
|
||||
m68ki_push_16(0xf000 | (vector<<2));
|
||||
|
||||
/* PROGRAM COUNTER */
|
||||
m68ki_push_32(pc);
|
||||
|
||||
/* STATUS REGISTER */
|
||||
m68ki_push_16(sr);
|
||||
}
|
||||
|
||||
/* Format A stack frame (short bus fault).
|
||||
* This is used only by 68020 for bus fault and address error
|
||||
* if the error happens at an instruction boundary.
|
||||
@ -1550,7 +1594,7 @@ inline void m68ki_exception_address_error()
|
||||
|
||||
m_run_mode = RUN_MODE_BERR_AERR_RESET_WSF;
|
||||
|
||||
if (!CPU_TYPE_IS_010_PLUS())
|
||||
if (CPU_TYPE_IS_000())
|
||||
{
|
||||
/* Note: This is implemented for 68000 only! */
|
||||
m68ki_stack_frame_buserr(sr);
|
||||
@ -1560,6 +1604,11 @@ inline void m68ki_exception_address_error()
|
||||
/* only the 68010 throws this unique type-1000 frame */
|
||||
m68ki_stack_frame_1000(m_ppc, sr, EXCEPTION_BUS_ERROR);
|
||||
}
|
||||
else if (CPU_TYPE_IS_070())
|
||||
{
|
||||
/* only the 68070 throws this unique type-1111 frame */
|
||||
m68ki_stack_frame_1111(m_ppc, sr, EXCEPTION_BUS_ERROR);
|
||||
}
|
||||
else if (m_mmu_tmp_buserror_address == m_ppc)
|
||||
{
|
||||
m68ki_stack_frame_1010(sr, EXCEPTION_BUS_ERROR, m_ppc, m_mmu_tmp_buserror_address);
|
||||
|
Loading…
Reference in New Issue
Block a user