From c1f0ae29e28db10c27ea7c48f7d0708b1ad48bbf Mon Sep 17 00:00:00 2001 From: Happy Date: Tue, 1 Mar 2016 11:34:33 -0700 Subject: [PATCH] Few miscellaneous N64 changes / improvements Change MemPak formatting code to better document actual format Do not adjust screen timings when VI blank video mode set PIF reportedly only clears top bit of status byte DD read fail needs to mask against *head* as well as track --- src/mame/drivers/n64.cpp | 31 ++++++++++++++++++++++++------- src/mame/machine/n64.cpp | 6 +++--- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/mame/drivers/n64.cpp b/src/mame/drivers/n64.cpp index 757f87e159a..770c42a6a09 100644 --- a/src/mame/drivers/n64.cpp +++ b/src/mame/drivers/n64.cpp @@ -266,16 +266,33 @@ void n64_mess_state::mempak_format(UINT8* pak) 0xff,0xff,0xff,0xff, 0x05,0x1a,0x5f,0x13, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0x01,0xff, 0x66,0x25,0x99,0xcd, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, - 0x00,0x71,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03 + 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 }; - for (int i = 0; i < 0x8000; i += 2) + unsigned char pak_inode_table[] = { - pak[i+0] = 0x00; - pak[i+1] = 0x03; - } - memcpy(pak, pak_header, 272); + 0x01,0x71,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, + 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03, 0x00,0x03,0x00,0x03 + }; + + memset(pak, 0, 0x8000); + memcpy(pak, pak_header, 256); + memcpy(pak+256, pak_inode_table, 256); // Main + memcpy(pak+512, pak_inode_table, 256); // Mirror } DEVICE_IMAGE_LOAD_MEMBER(n64_mess_state,n64_cart) diff --git a/src/mame/machine/n64.cpp b/src/mame/machine/n64.cpp index 5f0d8a6b4d2..d511124c26c 100644 --- a/src/mame/machine/n64.cpp +++ b/src/mame/machine/n64.cpp @@ -996,7 +996,7 @@ void n64_periphs::vi_recalculate_resolution() // 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) / 2; - if (width == 0 || height == 0) + if (width == 0 || height == 0 || (vi_control & 3) == 0) { vi_blank = 1; /* @@ -2060,7 +2060,7 @@ void n64_periphs::handle_pif() } } - ram[0x3f ^ BYTE4_XOR_BE(0)] = 0; + ram[0x3f ^ BYTE4_XOR_BE(0)] &= ~0x80; } /*printf("After:\n"); fflush(stdout); @@ -2278,7 +2278,7 @@ void n64_periphs::dd_update_bm() } else // dd read, BM Mode 1 { - if(((dd_track_reg & 0xFFF) == 6) && (dd_start_block == 0) && ((machine().root_device().ioport("input")->read() & 0x0100) == 0x0000)) + if(((dd_track_reg & 0x1FFF) == 6) && (dd_start_block == 0) && ((machine().root_device().ioport("input")->read() & 0x0100) == 0x0000)) { //only fail read LBA 12 if retail disk drive dd_status_reg &= ~DD_ASIC_STATUS_DREQ;