summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Happy <Happy-yappH@users.noreply.github.com>2015-09-07 22:26:24 -0600
committer Happy <Happy-yappH@users.noreply.github.com>2015-09-07 22:26:24 -0600
commitcaf277a3ccc6812e2cb46f5342a21ec0d75434ed (patch)
treee4a140077b910f51efc334643895d2795a54887c
parent6b3ccca1cfe36bc5c6bec4e1ea83ee86f096c274 (diff)
parent3cb8f5d368628b98acd74d1672017d0f5ba9e8de (diff)
Merge branch 'local'
-rw-r--r--src/emu/cpu/mips/mips3.c32
-rw-r--r--src/mame/includes/n64.h3
-rw-r--r--src/mame/machine/n64.c58
-rw-r--r--src/mess/drivers/n64.c2
4 files changed, 72 insertions, 23 deletions
diff --git a/src/emu/cpu/mips/mips3.c b/src/emu/cpu/mips/mips3.c
index ce8466b2b21..00e3d7bc1c0 100644
--- a/src/emu/cpu/mips/mips3.c
+++ b/src/emu/cpu/mips/mips3.c
@@ -2845,11 +2845,23 @@ void mips3_device::execute_run()
case 0x2e: /* SWR */ (this->*m_swr)(op); break;
case 0x2f: /* CACHE */ /* effective no-op */ break;
case 0x30: /* LL */ if (RWORD(SIMMVAL+RSVAL32, &temp) && RTREG) RTVAL64 = (UINT32)temp; m_ll_value = RTVAL32; break;
- case 0x31: /* LWC1 */ if (RWORD(SIMMVAL+RSVAL32, &temp)) set_cop1_reg32(RTREG, temp); break;
+ case 0x31: /* LWC1 */
+ if (!(SR & SR_COP1))
+ {
+ m_badcop_value = 1;
+ generate_exception(EXCEPTION_BADCOP, 1);
+ }
+ if (RWORD(SIMMVAL+RSVAL32, &temp)) set_cop1_reg32(RTREG, temp); break;
case 0x32: /* LWC2 */ if (RWORD(SIMMVAL+RSVAL32, &temp)) set_cop2_reg(RTREG, temp); break;
case 0x33: /* PREF */ /* effective no-op */ break;
case 0x34: /* LLD */ if (RDOUBLE(SIMMVAL+RSVAL32, &temp64) && RTREG) RTVAL64 = temp64; m_lld_value = temp64; break;
- case 0x35: /* LDC1 */ if (RDOUBLE(SIMMVAL+RSVAL32, &temp64)) set_cop1_reg64(RTREG, temp64); break;
+ case 0x35: /* LDC1 */
+ if (!(SR & SR_COP1))
+ {
+ m_badcop_value = 1;
+ generate_exception(EXCEPTION_BADCOP, 1);
+ }
+ if (RDOUBLE(SIMMVAL+RSVAL32, &temp64)) set_cop1_reg64(RTREG, temp64); break;
case 0x36: /* LDC2 */ if (RDOUBLE(SIMMVAL+RSVAL32, &temp64)) set_cop2_reg(RTREG, temp64); break;
case 0x37: /* LD */ if (RDOUBLE(SIMMVAL+RSVAL32, &temp64) && RTREG) RTVAL64 = temp64; break;
case 0x38: /* SC */ if (RWORD(SIMMVAL+RSVAL32, &temp) && RTREG)
@@ -2865,7 +2877,13 @@ void mips3_device::execute_run()
}
}
break;
- case 0x39: /* SWC1 */ WWORD(SIMMVAL+RSVAL32, get_cop1_reg32(RTREG)); break;
+ case 0x39: /* SWC1 */
+ if (!(SR & SR_COP1))
+ {
+ m_badcop_value = 1;
+ generate_exception(EXCEPTION_BADCOP, 1);
+ }
+ WWORD(SIMMVAL+RSVAL32, get_cop1_reg32(RTREG)); break;
case 0x3a: /* SWC2 */ WWORD(SIMMVAL+RSVAL32, get_cop2_reg(RTREG)); break;
case 0x3b: /* SWC3 */ invalid_instruction(op); break;
case 0x3c: /* SCD */ if (RDOUBLE(SIMMVAL+RSVAL32, &temp64) && RTREG)
@@ -2881,7 +2899,13 @@ void mips3_device::execute_run()
}
}
break;
- case 0x3d: /* SDC1 */ WDOUBLE(SIMMVAL+RSVAL32, get_cop1_reg64(RTREG)); break;
+ case 0x3d: /* SDC1 */
+ if (!(SR & SR_COP1))
+ {
+ m_badcop_value = 1;
+ generate_exception(EXCEPTION_BADCOP, 1);
+ }
+ WDOUBLE(SIMMVAL+RSVAL32, get_cop1_reg64(RTREG)); break;
case 0x3e: /* SDC2 */ WDOUBLE(SIMMVAL+RSVAL32, get_cop2_reg(RTREG)); break;
case 0x3f: /* SD */ WDOUBLE(SIMMVAL+RSVAL32, RTVAL64); break;
default: /* ??? */ invalid_instruction(op); break;
diff --git a/src/mame/includes/n64.h b/src/mame/includes/n64.h
index 353070d5477..1a35812e87b 100644
--- a/src/mame/includes/n64.h
+++ b/src/mame/includes/n64.h
@@ -86,6 +86,7 @@ public:
TIMER_CALLBACK_MEMBER(vi_scanline_callback);
TIMER_CALLBACK_MEMBER(ai_timer_callback);
TIMER_CALLBACK_MEMBER(pi_dma_callback);
+ TIMER_CALLBACK_MEMBER(si_dma_callback);
DECLARE_READ32_MEMBER( dp_reg_r );
DECLARE_WRITE32_MEMBER( dp_reg_w );
DECLARE_READ32_MEMBER( sp_reg_r );
@@ -96,6 +97,7 @@ public:
void ai_timer_tick();
void pi_dma_tick();
+ void si_dma_tick();
void vi_scanline_tick();
void reset_tick();
@@ -242,6 +244,7 @@ private:
UINT32 pi_dma_dir;
// Serial Interface (SI) registers and functions
+ emu_timer *si_dma_timer;
void pif_dma(int direction);
void handle_pif();
int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, int rlength, UINT8 *rdata);
diff --git a/src/mame/machine/n64.c b/src/mame/machine/n64.c
index cd439188f78..85a6aedb90d 100644
--- a/src/mame/machine/n64.c
+++ b/src/mame/machine/n64.c
@@ -109,6 +109,7 @@ void n64_periphs::device_start()
{
ai_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::ai_timer_callback),this));
pi_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::pi_dma_callback),this));
+ si_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::si_dma_callback),this));
vi_scanline_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::vi_scanline_callback),this));
reset_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::reset_timer_callback),this));
}
@@ -202,8 +203,9 @@ void n64_periphs::device_reset()
si_dram_addr = 0;
si_pif_addr = 0;
si_status = 0;
+ si_dma_timer->adjust(attotime::never);
- memset(m_save_data.eeprom, 0, 2048);
+ //memset(m_save_data.eeprom, 0, 2048);
dp_clock = 0;
@@ -225,7 +227,7 @@ void n64_periphs::device_reset()
pif_ram[0x26] = 0x3f;
pif_ram[0x27] = 0x3f;
cic_type=2;
- mem_map->write_dword(0x00000318, 0x800000);
+ mem_map->write_dword(0x00000318, 0x800000); /* RDRAM Size */
if (boot_checksum == U64(0x00000000001ff230))
{
@@ -993,7 +995,7 @@ void n64_periphs::vi_scanline_tick()
// Video Interface
void n64_periphs::vi_recalculate_resolution()
{
- n64_state *state = machine().driver_data<n64_state>();
+ //n64_state *state = machine().driver_data<n64_state>();
int x_start = (vi_hstart & 0x03ff0000) >> 16;
int x_end = vi_hstart & 0x000003ff;
@@ -1025,7 +1027,12 @@ void n64_periphs::vi_recalculate_resolution()
if (height > 480)
height = 480;
- state->m_rdp->m_misc_state.m_fb_height = height;
+ if(vi_control & 0x40) /* Interlace */
+ {
+ height *= 2;
+ }
+
+ //state->m_rdp->m_misc_state.m_fb_height = height;
visarea.max_x = width - 1;
visarea.max_y = height - 1;
@@ -1054,7 +1061,7 @@ READ32_MEMBER( n64_periphs::vi_reg_r )
break;
case 0x10/4: // VI_CURRENT_REG
- ret = m_screen->vpos() << 1;
+ ret = (m_screen->vpos() << 1) + 1;
break;
case 0x14/4: // VI_BURST_REG
@@ -1103,7 +1110,7 @@ READ32_MEMBER( n64_periphs::vi_reg_r )
WRITE32_MEMBER( n64_periphs::vi_reg_w )
{
- n64_state *state = machine().driver_data<n64_state>();
+ //n64_state *state = machine().driver_data<n64_state>();
switch (offset)
{
@@ -1122,7 +1129,7 @@ WRITE32_MEMBER( n64_periphs::vi_reg_w )
vi_recalculate_resolution();
}
vi_width = data;
- state->m_rdp->m_misc_state.m_fb_width = data;
+ //state->m_rdp->m_misc_state.m_fb_width = data;
break;
case 0x0c/4: // VI_INTR_REG
@@ -1214,7 +1221,7 @@ void n64_periphs::ai_fifo_push(UINT32 address, UINT32 length)
if (! (ai_status & 0x40000000))
{
- signal_rcp_interrupt(AI_INTERRUPT);
+ //signal_rcp_interrupt(AI_INTERRUPT);
ai_dma();
}
}
@@ -1237,7 +1244,7 @@ void n64_periphs::ai_fifo_pop()
if (ai_fifo_num < AUDIO_DMA_DEPTH)
{
ai_status &= ~0x80000001; // FIFO not full
- signal_rcp_interrupt(AI_INTERRUPT);
+ //signal_rcp_interrupt(AI_INTERRUPT);
}
}
@@ -1277,7 +1284,7 @@ void n64_periphs::ai_dma()
ai_status |= 0x40000000;
// adjust the timer
- period = attotime::from_hz(DACRATE_NTSC) * ((ai_dacrate + 1) * (current->length / 4));
+ period = attotime::from_hz(DACRATE_NTSC) * (ai_dacrate + 1) * (current->length / 4);
ai_timer->adjust(period);
}
@@ -1289,12 +1296,12 @@ TIMER_CALLBACK_MEMBER(n64_periphs::ai_timer_callback)
void n64_periphs::ai_timer_tick()
{
ai_fifo_pop();
+ signal_rcp_interrupt(AI_INTERRUPT);
// keep playing if there's another DMA queued
if (ai_fifo_get_top() != NULL)
{
ai_dma();
- signal_rcp_interrupt(AI_INTERRUPT);
}
else
{
@@ -1325,7 +1332,9 @@ READ32_MEMBER( n64_periphs::ai_reg_r )
}
break;
}
-
+ case 0x08/4:
+ ret = ai_control;
+ break;
case 0x0c/4: // AI_STATUS_REG
ret = ai_status;
break;
@@ -1425,9 +1434,9 @@ void n64_periphs::pi_dma_tick()
{
UINT32 dma_length = pi_wr_len + 1;
//logerror("PI Write, %X, %X, %X\n", pi_cart_addr, pi_dram_addr, pi_wr_len);
- if (dma_length & 7)
+ if (dma_length & 1)
{
- dma_length = (dma_length + 7) & ~7;
+ dma_length = (dma_length + 1) & ~1;
}
if (pi_dram_addr != 0xffffffff)
@@ -1445,9 +1454,9 @@ void n64_periphs::pi_dma_tick()
{
UINT32 dma_length = pi_rd_len + 1;
//logerror("PI Read, %X, %X, %X\n", pi_cart_addr, pi_dram_addr, pi_rd_len);
- if (dma_length & 7)
+ if (dma_length & 1)
{
- dma_length = (dma_length + 7) & ~7;
+ dma_length = (dma_length + 1) & ~1;
}
if (pi_dram_addr != 0xffffffff)
@@ -2076,6 +2085,18 @@ void n64_periphs::handle_pif()
}*/
}
+TIMER_CALLBACK_MEMBER(n64_periphs::si_dma_callback)
+{
+ machine().device<n64_periphs>("rcp")->si_dma_tick();
+}
+
+void n64_periphs::si_dma_tick()
+{
+ si_dma_timer->adjust(attotime::never);
+ si_status |= 0x1000;
+ signal_rcp_interrupt(SI_INTERRUPT);
+}
+
void n64_periphs::pif_dma(int direction)
{
if (si_dram_addr & 0x3)
@@ -2116,8 +2137,9 @@ void n64_periphs::pif_dma(int direction)
}
}
- si_status |= 0x1000;
- signal_rcp_interrupt(SI_INTERRUPT);
+ si_dma_timer->adjust(attotime::from_hz(500));
+ //si_status |= 0x1000;
+ //signal_rcp_interrupt(SI_INTERRUPT);
}
READ32_MEMBER( n64_periphs::si_reg_r )
diff --git a/src/mess/drivers/n64.c b/src/mess/drivers/n64.c
index 3d535f2c09f..0557e200d4c 100644
--- a/src/mess/drivers/n64.c
+++ b/src/mess/drivers/n64.c
@@ -414,7 +414,7 @@ static MACHINE_CONFIG_START( n64, n64_mess_state )
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(640, 525)
- MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 239)
+ MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479)
MCFG_SCREEN_UPDATE_DRIVER(n64_state, screen_update_n64)
MCFG_SCREEN_VBLANK_DRIVER(n64_state, screen_eof_n64)