summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Happy <Happy-yappH@users.noreply.github.com>2015-09-28 11:09:41 -0600
committer Happy <Happy-yappH@users.noreply.github.com>2015-09-28 11:09:41 -0600
commit27917d3211c641d247d3c535c3b71ca83af0f2cb (patch)
treec1208d208ce1444410c47ca20487d70e516a0048
parent86e62cc36339d34013aff7f69fbde6482cd12af4 (diff)
Added overlooked factor of 2 to VI timing to account for vertical resolution being set in half-lines.
Changed rsp disassembly to use MIPS ABI names for registers. Implemented 'start valid' bit in RDP status register. Increased scheduler quantum time to allow for better r4300 <-> RSP signaling.
-rw-r--r--src/devices/cpu/rsp/rsp_dasm.c11
-rw-r--r--src/mame/includes/n64.h1
-rw-r--r--src/mame/machine/n64.c36
-rw-r--r--src/mess/drivers/n64.c6
4 files changed, 42 insertions, 12 deletions
diff --git a/src/devices/cpu/rsp/rsp_dasm.c b/src/devices/cpu/rsp/rsp_dasm.c
index 2f455567588..70e6d7e47e8 100644
--- a/src/devices/cpu/rsp/rsp_dasm.c
+++ b/src/devices/cpu/rsp/rsp_dasm.c
@@ -8,13 +8,22 @@
#include "emu.h"
-static const char *const reg[32] =
+/*static const char *const reg[32] =
{
"0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
"r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
};
+*/
+
+static const char *const reg[32] =
+{
+ "$0", "$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3",
+ "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7",
+ "$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7",
+ "$t8", "$t9", "$k0", "$k1", "$gp", "$sp", "$fp", "$ra"
+};
static const char *const vreg[32] =
{
diff --git a/src/mame/includes/n64.h b/src/mame/includes/n64.h
index bcbd8879188..84d6671c0c5 100644
--- a/src/mame/includes/n64.h
+++ b/src/mame/includes/n64.h
@@ -311,6 +311,7 @@ extern const device_type N64PERIPH;
#define DP_STATUS_XBUS_DMA 0x01
#define DP_STATUS_FREEZE 0x02
#define DP_STATUS_FLUSH 0x04
+#define DP_STATUS_START_VALID 0x400
#define DD_ASIC_STATUS_DISK_CHANGE 0x00010000
#define DD_ASIC_STATUS_MECHA_ERR 0x00020000
diff --git a/src/mame/machine/n64.c b/src/mame/machine/n64.c
index 23120c1dbe5..d24f263d882 100644
--- a/src/mame/machine/n64.c
+++ b/src/mame/machine/n64.c
@@ -918,6 +918,7 @@ READ32_MEMBER( n64_periphs::dp_reg_r )
{
n64_state *state = space.machine().driver_data<n64_state>();
UINT32 ret = 0;
+
switch (offset)
{
case 0x00/4: // DP_START_REG
@@ -957,20 +958,39 @@ READ32_MEMBER( n64_periphs::dp_reg_r )
WRITE32_MEMBER( n64_periphs::dp_reg_w )
{
n64_state *state = space.machine().driver_data<n64_state>();
+ UINT32 status = state->m_rdp->get_status();
switch (offset)
{
case 0x00/4: // DP_START_REG
- state->m_rdp->set_start(data);
- state->m_rdp->set_current(state->m_rdp->get_start());
+ if(status & DP_STATUS_START_VALID)
+ break;
+ else
+ {
+ state->m_rdp->set_status(status | DP_STATUS_START_VALID);
+ state->m_rdp->set_start(data & ~7);
+ }
break;
case 0x04/4: // DP_END_REG
- state->m_rdp->set_end(data);
- g_profiler.start(PROFILER_USER1);
- state->m_rdp->process_command_list();
- g_profiler.stop();
- break;
+ if(status & DP_STATUS_START_VALID)
+ {
+ state->m_rdp->set_status(status & ~DP_STATUS_START_VALID);
+ state->m_rdp->set_current(state->m_rdp->get_start());
+ state->m_rdp->set_end(data & ~ 7);
+ g_profiler.start(PROFILER_USER1);
+ state->m_rdp->process_command_list();
+ g_profiler.stop();
+ break;
+ }
+ else
+ {
+ state->m_rdp->set_end(data & ~ 7);
+ g_profiler.start(PROFILER_USER1);
+ state->m_rdp->process_command_list();
+ g_profiler.stop();
+ break;
+ }
case 0x0c/4: // DP_STATUS_REG
{
@@ -1015,7 +1035,7 @@ void n64_periphs::vi_recalculate_resolution()
rectangle visarea = m_screen->visible_area();
// DACRATE is the quarter pixel clock and period will be for a field, not a frame
- attoseconds_t period = (vi_hsync & 0xfff) * (vi_vsync & 0xfff) * HZ_TO_ATTOSECONDS(DACRATE_NTSC);
+ attoseconds_t period = (vi_hsync & 0xfff) * (vi_vsync & 0xfff) * HZ_TO_ATTOSECONDS(DACRATE_NTSC) / 2;
if (width == 0 || height == 0)
{
diff --git a/src/mess/drivers/n64.c b/src/mess/drivers/n64.c
index 48e7e403bca..e863c7eb003 100644
--- a/src/mess/drivers/n64.c
+++ b/src/mess/drivers/n64.c
@@ -406,13 +406,13 @@ static MACHINE_CONFIG_START( n64, n64_mess_state )
MCFG_RSP_SP_SET_STATUS_CB(DEVWRITE32("rcp",n64_periphs, sp_set_status))
MCFG_CPU_PROGRAM_MAP(rsp_map)
- //MCFG_QUANTUM_TIME(attotime::from_hz(1000000))
- MCFG_QUANTUM_TIME(attotime::from_hz(1200))
+ MCFG_QUANTUM_TIME(attotime::from_hz(1000000))
+ //MCFG_QUANTUM_TIME(attotime::from_hz(1200))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
/* Video DACRATE is for quarter pixels, so the horizontal is also given in quarter pixels. However, the horizontal and vertical timing and sizing is adjustable by register and will be reset when the registers are written. */
- MCFG_SCREEN_RAW_PARAMS(DACRATE_NTSC,3093,0,3093,525,0,525)
+ MCFG_SCREEN_RAW_PARAMS(DACRATE_NTSC*2,3093,0,3093,525,0,525)
//MCFG_SCREEN_REFRESH_RATE(60)
//MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
//MCFG_SCREEN_SIZE(640, 525)