mirror of
https://github.com/holub/mame
synced 2025-10-08 09:30:17 +03:00
sh4drc: UML implementations of FADD, FSUB, FMUL, and FDIV. [R. Belmont]
This commit is contained in:
parent
0c0a05f108
commit
afa6aa8b58
@ -139,6 +139,23 @@ public:
|
|||||||
uint32_t vbr;
|
uint32_t vbr;
|
||||||
|
|
||||||
uint32_t m_delay;
|
uint32_t m_delay;
|
||||||
|
|
||||||
|
// SH3/4 additional DRC "near" state
|
||||||
|
uint32_t m_ppc;
|
||||||
|
uint32_t m_spc;
|
||||||
|
uint32_t m_ssr;
|
||||||
|
uint32_t m_rbnk[2][8];
|
||||||
|
uint32_t m_sgr;
|
||||||
|
uint32_t m_fr[16];
|
||||||
|
uint32_t m_xf[16];
|
||||||
|
uint32_t m_cpu_off;
|
||||||
|
uint32_t m_pending_irq;
|
||||||
|
uint32_t m_test_irq;
|
||||||
|
uint32_t m_fpscr;
|
||||||
|
uint32_t m_fpul;
|
||||||
|
uint32_t m_dbr;
|
||||||
|
|
||||||
|
int m_frt_input;
|
||||||
};
|
};
|
||||||
|
|
||||||
internal_sh2_state *m_sh2_state;
|
internal_sh2_state *m_sh2_state;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -240,6 +240,8 @@ public:
|
|||||||
void func_LDCMRBANK();
|
void func_LDCMRBANK();
|
||||||
void func_PREFM();
|
void func_PREFM();
|
||||||
void func_FADD();
|
void func_FADD();
|
||||||
|
void func_FADD_spre();
|
||||||
|
void func_FADD_spost();
|
||||||
void func_FSUB();
|
void func_FSUB();
|
||||||
void func_FMUL();
|
void func_FMUL();
|
||||||
void func_FDIV();
|
void func_FDIV();
|
||||||
@ -322,6 +324,9 @@ protected:
|
|||||||
address_space_config m_program_config;
|
address_space_config m_program_config;
|
||||||
address_space_config m_io_config;
|
address_space_config m_io_config;
|
||||||
|
|
||||||
|
uml::parameter m_fs_regmap[16];
|
||||||
|
uml::parameter m_fd_regmap[16];
|
||||||
|
|
||||||
int c_md2;
|
int c_md2;
|
||||||
int c_md1;
|
int c_md1;
|
||||||
int c_md0;
|
int c_md0;
|
||||||
@ -336,20 +341,6 @@ protected:
|
|||||||
// hack 1 = Naomi hack, hack 2 = Work in Progress implementation
|
// hack 1 = Naomi hack, hack 2 = Work in Progress implementation
|
||||||
int m_mmuhack;
|
int m_mmuhack;
|
||||||
|
|
||||||
uint32_t m_ppc;
|
|
||||||
uint32_t m_spc;
|
|
||||||
uint32_t m_ssr;
|
|
||||||
uint32_t m_rbnk[2][8];
|
|
||||||
uint32_t m_sgr;
|
|
||||||
uint32_t m_fr[16];
|
|
||||||
uint32_t m_xf[16];
|
|
||||||
uint32_t m_cpu_off;
|
|
||||||
uint32_t m_pending_irq;
|
|
||||||
uint32_t m_test_irq;
|
|
||||||
uint32_t m_fpscr;
|
|
||||||
uint32_t m_fpul;
|
|
||||||
uint32_t m_dbr;
|
|
||||||
|
|
||||||
uint32_t m_exception_priority[128];
|
uint32_t m_exception_priority[128];
|
||||||
int m_exception_requesting[128];
|
int m_exception_requesting[128];
|
||||||
|
|
||||||
@ -405,7 +396,6 @@ protected:
|
|||||||
|
|
||||||
int8_t m_nmi_line_state;
|
int8_t m_nmi_line_state;
|
||||||
|
|
||||||
int m_frt_input;
|
|
||||||
int m_irln;
|
int m_irln;
|
||||||
int m_internal_irq_level;
|
int m_internal_irq_level;
|
||||||
int m_internal_irq_vector;
|
int m_internal_irq_vector;
|
||||||
|
@ -240,9 +240,9 @@ void sh34_base_device::sh4_swap_fp_registers()
|
|||||||
|
|
||||||
for (s = 0;s <= 15;s++)
|
for (s = 0;s <= 15;s++)
|
||||||
{
|
{
|
||||||
z = m_fr[s];
|
z = m_sh2_state->m_fr[s];
|
||||||
m_fr[s] = m_xf[s];
|
m_sh2_state->m_fr[s] = m_sh2_state->m_xf[s];
|
||||||
m_xf[s] = z;
|
m_sh2_state->m_xf[s] = z;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,12 +253,12 @@ void sh34_base_device::sh4_swap_fp_couples()
|
|||||||
|
|
||||||
for (s = 0;s <= 15;s = s+2)
|
for (s = 0;s <= 15;s = s+2)
|
||||||
{
|
{
|
||||||
z = m_fr[s];
|
z = m_sh2_state->m_fr[s];
|
||||||
m_fr[s] = m_fr[s + 1];
|
m_sh2_state->m_fr[s] = m_sh2_state->m_fr[s + 1];
|
||||||
m_fr[s + 1] = z;
|
m_sh2_state->m_fr[s + 1] = z;
|
||||||
z = m_xf[s];
|
z = m_sh2_state->m_xf[s];
|
||||||
m_xf[s] = m_xf[s + 1];
|
m_sh2_state->m_xf[s] = m_sh2_state->m_xf[s + 1];
|
||||||
m_xf[s + 1] = z;
|
m_sh2_state->m_xf[s + 1] = z;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,16 +271,16 @@ void sh34_base_device::sh4_change_register_bank(int to)
|
|||||||
{
|
{
|
||||||
for (s = 0;s < 8;s++)
|
for (s = 0;s < 8;s++)
|
||||||
{
|
{
|
||||||
m_rbnk[0][s] = m_sh2_state->r[s];
|
m_sh2_state->m_rbnk[0][s] = m_sh2_state->r[s];
|
||||||
m_sh2_state->r[s] = m_rbnk[1][s];
|
m_sh2_state->r[s] = m_sh2_state->m_rbnk[1][s];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // 1 -> 0
|
else // 1 -> 0
|
||||||
{
|
{
|
||||||
for (s = 0;s < 8;s++)
|
for (s = 0;s < 8;s++)
|
||||||
{
|
{
|
||||||
m_rbnk[1][s] = m_sh2_state->r[s];
|
m_sh2_state->m_rbnk[1][s] = m_sh2_state->r[s];
|
||||||
m_sh2_state->r[s] = m_rbnk[0][s];
|
m_sh2_state->r[s] = m_sh2_state->m_rbnk[0][s];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -291,7 +291,7 @@ void sh34_base_device::sh4_syncronize_register_bank(int to)
|
|||||||
|
|
||||||
for (s = 0;s < 8;s++)
|
for (s = 0;s < 8;s++)
|
||||||
{
|
{
|
||||||
m_rbnk[to][s] = m_sh2_state->r[s];
|
m_sh2_state->m_rbnk[to][s] = m_sh2_state->r[s];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,8 +315,8 @@ void sh34_base_device::sh4_exception_recompute() // checks if there is any inter
|
|||||||
{
|
{
|
||||||
int a,z;
|
int a,z;
|
||||||
|
|
||||||
m_test_irq = 0;
|
m_sh2_state->m_test_irq = 0;
|
||||||
if ((!m_pending_irq) || ((m_sh2_state->sr & BL) && (m_exception_requesting[SH4_INTC_NMI] == 0)))
|
if ((!m_sh2_state->m_pending_irq) || ((m_sh2_state->sr & BL) && (m_exception_requesting[SH4_INTC_NMI] == 0)))
|
||||||
return;
|
return;
|
||||||
z = (m_sh2_state->sr >> 4) & 15;
|
z = (m_sh2_state->sr >> 4) & 15;
|
||||||
for (a=0;a <= SH4_INTC_ROVI;a++)
|
for (a=0;a <= SH4_INTC_ROVI;a++)
|
||||||
@ -328,7 +328,7 @@ void sh34_base_device::sh4_exception_recompute() // checks if there is any inter
|
|||||||
if (pri > z)
|
if (pri > z)
|
||||||
{
|
{
|
||||||
//logerror("will test\n");
|
//logerror("will test\n");
|
||||||
m_test_irq = 1; // will check for exception at end of instructions
|
m_sh2_state->m_test_irq = 1; // will check for exception at end of instructions
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -342,7 +342,7 @@ void sh34_base_device::sh4_exception_request(int exception) // start requesting
|
|||||||
{
|
{
|
||||||
//logerror("sh4_exception_request b\n");
|
//logerror("sh4_exception_request b\n");
|
||||||
m_exception_requesting[exception] = 1;
|
m_exception_requesting[exception] = 1;
|
||||||
m_pending_irq++;
|
m_sh2_state->m_pending_irq++;
|
||||||
sh4_exception_recompute();
|
sh4_exception_recompute();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -352,7 +352,7 @@ void sh34_base_device::sh4_exception_unrequest(int exception) // stop requesting
|
|||||||
if (m_exception_requesting[exception])
|
if (m_exception_requesting[exception])
|
||||||
{
|
{
|
||||||
m_exception_requesting[exception] = 0;
|
m_exception_requesting[exception] = 0;
|
||||||
m_pending_irq--;
|
m_sh2_state->m_pending_irq--;
|
||||||
sh4_exception_recompute();
|
sh4_exception_recompute();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -371,9 +371,9 @@ void sh34_base_device::sh4_exception_process(int exception, uint32_t vector)
|
|||||||
{
|
{
|
||||||
sh4_exception_checkunrequest(exception);
|
sh4_exception_checkunrequest(exception);
|
||||||
|
|
||||||
m_spc = m_sh2_state->pc;
|
m_sh2_state->m_spc = m_sh2_state->pc;
|
||||||
m_ssr = m_sh2_state->sr;
|
m_sh2_state->m_ssr = m_sh2_state->sr;
|
||||||
m_sgr = m_sh2_state->r[15];
|
m_sh2_state->m_sgr = m_sh2_state->r[15];
|
||||||
|
|
||||||
//printf("stored m_spc %08x m_ssr %08x m_sgr %08x\n", m_spc, m_ssr, m_sgr);
|
//printf("stored m_spc %08x m_ssr %08x m_sgr %08x\n", m_spc, m_ssr, m_sgr);
|
||||||
|
|
||||||
@ -1078,11 +1078,11 @@ void sh34_base_device::sh4_set_frt_input(int state)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_frt_input == state) {
|
if(m_sh2_state->m_frt_input == state) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_frt_input = state;
|
m_sh2_state->m_frt_input = state;
|
||||||
|
|
||||||
if (m_cpu_type == CPU_TYPE_SH4)
|
if (m_cpu_type == CPU_TYPE_SH4)
|
||||||
{
|
{
|
||||||
@ -1218,7 +1218,7 @@ void sh34_base_device::execute_set_input(int irqline, int state) // set state of
|
|||||||
LOG(("SH-4 '%s' IRLn0-IRLn3 level #%d\n", tag(), m_irln));
|
LOG(("SH-4 '%s' IRLn0-IRLn3 level #%d\n", tag(), m_irln));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m_test_irq && (!m_sh2_state->m_delay))
|
if (m_sh2_state->m_test_irq && (!m_sh2_state->m_delay))
|
||||||
sh4_check_pending_irq("sh4_set_irq_line");
|
sh4_check_pending_irq("sh4_set_irq_line");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,19 +23,22 @@
|
|||||||
#define NMIPRI() EXPPRI(3,0,16,SH4_INTC_NMI)
|
#define NMIPRI() EXPPRI(3,0,16,SH4_INTC_NMI)
|
||||||
#define INTPRI(p,n) EXPPRI(4,2,p,n)
|
#define INTPRI(p,n) EXPPRI(4,2,p,n)
|
||||||
|
|
||||||
#define FP_RS(r) m_fr[(r)] // binary representation of single precision floating point register r
|
#define FP_RS(r) m_sh2_state->m_fr[(r)] // binary representation of single precision floating point register r
|
||||||
#define FP_RFS(r) *( (float *)(m_fr+(r)) ) // single precision floating point register r
|
#define FP_RFS(r) *( (float *)(m_sh2_state->m_fr+(r)) ) // single precision floating point register r
|
||||||
#define FP_RFD(r) *( (double *)(m_fr+(r)) ) // double precision floating point register r
|
#define FP_RFD(r) *( (double *)(m_sh2_state->m_fr+(r)) ) // double precision floating point register r
|
||||||
#define FP_XS(r) m_xf[(r)] // binary representation of extended single precision floating point register r
|
#define FP_XS(r) m_sh2_state->m_xf[(r)] // binary representation of extended single precision floating point register r
|
||||||
#define FP_XFS(r) *( (float *)(m_xf+(r)) ) // single precision extended floating point register r
|
#define FP_XFS(r) *( (float *)(m_sh2_state->m_xf+(r)) ) // single precision extended floating point register r
|
||||||
#define FP_XFD(r) *( (double *)(m_xf+(r)) ) // double precision extended floating point register r
|
#define FP_XFD(r) *( (double *)(m_sh2_state->m_xf+(r)) ) // double precision extended floating point register r
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
#define FP_RS2(r) m_fr[(r) ^ m_fpu_pr]
|
#define FP_RS2(r) m_sh2_state->m_fr[(r) ^ m_sh2_state->m_fpu_pr]
|
||||||
#define FP_RFS2(r) *( (float *)(m_fr+((r) ^ m_fpu_pr)) )
|
#define FP_RFS2(r) *( (float *)(m_sh2_state->m_fr+((r) ^ m_sh2_state->m_fpu_pr)) )
|
||||||
#define FP_XS2(r) m_xf[(r) ^ m_fpu_pr]
|
#define FP_XS2(r) m_sh2_state->m_xf[(r) ^ m_sh2_state->m_fpu_pr]
|
||||||
#define FP_XFS2(r) *( (float *)(m_xf+((r) ^ m_fpu_pr)) )
|
#define FP_XFS2(r) *( (float *)(m_sh2_state->m_xf+((r) ^ m_sh2_state->m_fpu_pr)) )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define FPSCR mem(&m_sh2_state->m_fpscr)
|
||||||
|
#define FPS32(reg) m_fs_regmap[reg]
|
||||||
|
#define FPD32(reg) m_fd_regmap[reg & 14]
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ICF = 0x00800000,
|
ICF = 0x00800000,
|
||||||
|
Loading…
Reference in New Issue
Block a user