From 0501eb70da5fe8e2f10476a23701a5301451dc84 Mon Sep 17 00:00:00 2001 From: luigiblood Date: Wed, 20 Jan 2016 17:43:23 +0100 Subject: [PATCH] 64DD Sector Read working --- Source/Project64-core/N64System/Mips/Disk.cpp | 102 +++++++++--------- Source/Project64-core/N64System/Mips/Disk.h | 1 + Source/Project64-core/N64System/Mips/Dma.cpp | 7 +- Source/Project64-core/N64System/N64Class.cpp | 19 ++-- .../Project64-core/N64System/N64DiskClass.cpp | 3 +- .../Project64-core/N64System/N64DiskClass.h | 5 + 6 files changed, 75 insertions(+), 62 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/Disk.cpp b/Source/Project64-core/N64System/Mips/Disk.cpp index 74f8fe870..9205c6433 100644 --- a/Source/Project64-core/N64System/Mips/Disk.cpp +++ b/Source/Project64-core/N64System/Mips/Disk.cpp @@ -18,6 +18,7 @@ bool dd_write; bool dd_reset_hold; uint32_t dd_track_offset, dd_zone; +uint32_t dd_start_block, dd_current; uint8_t dd_buffer[0x100]; @@ -61,11 +62,13 @@ void DiskCommand() case 0x00010000: //Seek Read g_Reg->ASIC_CUR_TK = g_Reg->ASIC_DATA | 0x60000000; + DiskSetOffset(); dd_write = false; break; case 0x00020000: //Seek Write g_Reg->ASIC_CUR_TK = g_Reg->ASIC_DATA | 0x60000000; + DiskSetOffset(); dd_write = true; break; case 0x00080000: @@ -98,16 +101,18 @@ void DiskReset(void) void DiskBMControl(void) { g_Reg->ASIC_CUR_SECTOR = g_Reg->ASIC_BM_CTL & 0x00FF0000; - /* + if ((g_Reg->ASIC_CUR_SECTOR >> 16) == 0x00) { - + dd_start_block = 0; + dd_current = 0; } else if ((g_Reg->ASIC_CUR_SECTOR >> 16) == 0x5A) { - + dd_start_block = 1; + dd_current = 0; } - */ + if (g_Reg->ASIC_BM_CTL & DD_BM_CTL_BLK_TRANS) g_Reg->ASIC_BM_STATUS |= DD_BM_STATUS_BLOCK; @@ -123,6 +128,8 @@ void DiskBMControl(void) g_Reg->ASIC_STATUS &= ~(DD_STATUS_BM_INT | DD_STATUS_BM_ERR | DD_STATUS_DATA_RQ | DD_STATUS_C2_XFER); g_Reg->ASIC_BM_STATUS = 0; g_Reg->ASIC_CUR_SECTOR = 0; + dd_start_block = 0; + dd_current = 0; } if (!(g_Reg->ASIC_STATUS & DD_STATUS_MECHA_INT) && !(g_Reg->ASIC_STATUS & DD_STATUS_BM_INT)) @@ -139,11 +146,7 @@ void DiskGapSectorCheck() { if (g_Reg->ASIC_STATUS & DD_STATUS_BM_INT) { - uint16_t testsector = (uint16_t)(g_Reg->ASIC_CUR_SECTOR >> 16); - if (testsector >= 0x5A) - testsector -= 0x5A; - - if (SECTORS_PER_BLOCK < testsector) + if (SECTORS_PER_BLOCK < dd_current) { g_Reg->ASIC_STATUS &= ~DD_STATUS_BM_INT; g_Reg->FAKE_CAUSE_REGISTER &= ~CAUSE_IP3; @@ -156,40 +159,44 @@ void DiskBMUpdate() { if (!(g_Reg->ASIC_BM_STATUS & DD_BM_STATUS_RUNNING)) return; - + /* uint16_t testsector = (uint16_t)(g_Reg->ASIC_CUR_SECTOR >> 16); if (testsector >= 0x5A) testsector -= 0x5A; - + */ if (dd_write) { //Write Data - if (testsector == 0) + if (dd_current == 0) { - g_Reg->ASIC_CUR_SECTOR += 0x00010000; + dd_current += 1; + //g_Reg->ASIC_CUR_SECTOR += 0x00010000; g_Reg->ASIC_STATUS |= DD_STATUS_DATA_RQ; } - else if (testsector < SECTORS_PER_BLOCK) + else if (dd_current < SECTORS_PER_BLOCK) { DiskBMWrite(); - g_Reg->ASIC_CUR_SECTOR += 0x00010000; + dd_current += 1; + //g_Reg->ASIC_CUR_SECTOR += 0x00010000; g_Reg->ASIC_STATUS |= DD_STATUS_DATA_RQ; } - else if (testsector < SECTORS_PER_BLOCK + 1) + else if (dd_current < SECTORS_PER_BLOCK + 1) { if (g_Reg->ASIC_BM_STATUS & DD_BM_STATUS_BLOCK) { DiskBMWrite(); - g_Reg->ASIC_CUR_SECTOR += 0x00010000; - if (g_Reg->ASIC_CUR_SECTOR >> 16 >= 0xB4) - g_Reg->ASIC_CUR_SECTOR = 0x00010000; + dd_current += 1; + //g_Reg->ASIC_CUR_SECTOR += 0x00010000; + dd_start_block = 1 - dd_start_block; + dd_current = 1; g_Reg->ASIC_BM_STATUS &= ~DD_BM_STATUS_BLOCK; g_Reg->ASIC_STATUS |= DD_STATUS_DATA_RQ; } else { DiskBMWrite(); - g_Reg->ASIC_CUR_SECTOR += 0x00010000; + dd_current += 1; + //g_Reg->ASIC_CUR_SECTOR += 0x00010000; g_Reg->ASIC_BM_STATUS &= ~DD_BM_STATUS_RUNNING; } } @@ -207,25 +214,27 @@ void DiskBMUpdate() g_Reg->ASIC_STATUS &= ~DD_STATUS_DATA_RQ; g_Reg->ASIC_BM_STATUS |= DD_BM_STATUS_MICRO; } - else if (testsector == 0) + else if (dd_current == 0) { DiskBMRead(); - g_Reg->ASIC_CUR_SECTOR += 0x00010000; + dd_current += 1; + //g_Reg->ASIC_CUR_SECTOR += 0x00010000; g_Reg->ASIC_STATUS |= DD_STATUS_DATA_RQ; } - else if (testsector < SECTORS_PER_BLOCK + 4) + else if (dd_current < SECTORS_PER_BLOCK + 4) { //READ C2 (00!) - g_Reg->ASIC_CUR_SECTOR += 0x00010000; - if ((g_Reg->ASIC_CUR_SECTOR >> 16) == SECTORS_PER_BLOCK + 4) + dd_current += 1; + //g_Reg->ASIC_CUR_SECTOR += 0x00010000; + if (dd_current == SECTORS_PER_BLOCK + 4) g_Reg->ASIC_STATUS |= DD_STATUS_C2_XFER; } - else if (testsector == SECTORS_PER_BLOCK + 4) + else if (dd_current == SECTORS_PER_BLOCK + 4) { if (g_Reg->ASIC_BM_STATUS & DD_BM_STATUS_BLOCK) { - if (g_Reg->ASIC_CUR_SECTOR >> 16 >= 0xB4) - g_Reg->ASIC_CUR_SECTOR = 0x00000000; + dd_start_block = 1 - dd_start_block; + dd_current = 0; g_Reg->ASIC_BM_STATUS &= ~DD_BM_STATUS_BLOCK; } else @@ -242,41 +251,34 @@ void DiskBMUpdate() void DiskBMRead() { - uint8_t * sector; - sector = (uint8_t*)g_Disk->GetDiskAddress(); + uint32_t sector = 0; + //sector = (uint8_t*)g_Disk->GetDiskAddress(); sector += dd_track_offset; - uint16_t block = 0; - if (g_Reg->ASIC_CUR_SECTOR >= 0x005A0000) - block = 1; - sector += block * SECTORS_PER_BLOCK * ddZoneSecSize[dd_zone]; - uint16_t block2 = (uint16_t)(g_Reg->ASIC_CUR_SECTOR >> 16); - if (block2 >= 0x5A) - block -= 0x5A; - sector += block * ((g_Reg->ASIC_SEC_BYTE >> 16) + 1); + sector += dd_start_block * SECTORS_PER_BLOCK * ddZoneSecSize[dd_zone]; + sector += (dd_current) * ((g_Reg->ASIC_SEC_BYTE >> 16) + 1); + g_Disk->SetDiskAddressBuffer(sector); + + /* for (int i = 0; i < ((g_Reg->ASIC_SEC_BYTE >> 16) + 1) / 4; i++) { dd_buffer[i] = sector[(i * 4 + 0)] << 24 | sector[(i * 4 + 1)] << 16 | sector[(i * 4 + 2)] << 8 | sector[(i * 4 + 3)]; } - + */ return; } void DiskBMWrite() { - uint8_t * sector; - sector = (uint8_t*)g_Disk->GetDiskAddress(); + uint32_t sector = 0; + //sector = (uint8_t*)g_Disk->GetDiskAddress(); sector += dd_track_offset; - uint16_t block = 0; - if (g_Reg->ASIC_CUR_SECTOR >= 0x005A0000) - block = 1; - sector += block * SECTORS_PER_BLOCK * ddZoneSecSize[dd_zone]; - uint16_t block2 = (uint16_t)(g_Reg->ASIC_CUR_SECTOR >> 16); - if (block2 >= 0x5A) - block -= 0x5A; - sector += block * ((g_Reg->ASIC_SEC_BYTE >> 16) + 1); + sector += dd_start_block * SECTORS_PER_BLOCK * ddZoneSecSize[dd_zone]; + sector += (dd_current - 1) * ((g_Reg->ASIC_SEC_BYTE >> 16) + 1); + g_Disk->SetDiskAddressBuffer(sector); + /* for (int i = 0; i < ddZoneSecSize[dd_zone] / 4; i++) { sector[i * 4 + 0] = (dd_buffer[i] >> 24) & 0xFF; @@ -284,7 +286,7 @@ void DiskBMWrite() sector[i * 4 + 2] = (dd_buffer[i] >> 8) & 0xFF; sector[i * 4 + 3] = (dd_buffer[i] >> 0) & 0xFF; } - + */ return; } diff --git a/Source/Project64-core/N64System/Mips/Disk.h b/Source/Project64-core/N64System/Mips/Disk.h index d583e0ead..b7742ab72 100644 --- a/Source/Project64-core/N64System/Mips/Disk.h +++ b/Source/Project64-core/N64System/Mips/Disk.h @@ -24,6 +24,7 @@ void DiskSetOffset(void); extern bool dd_write; extern bool dd_reset_hold; extern uint32_t dd_track_offset, dd_zone; +extern uint32_t dd_start_block, dd_current; extern uint8_t dd_buffer[0x100]; diff --git a/Source/Project64-core/N64System/Mips/Dma.cpp b/Source/Project64-core/N64System/Mips/Dma.cpp index d867b94fa..1ccc377d8 100644 --- a/Source/Project64-core/N64System/Mips/Dma.cpp +++ b/Source/Project64-core/N64System/Mips/Dma.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include CDMA::CDMA(CFlashram & FlashRam, CSram & Sram) : @@ -85,9 +86,10 @@ void CDMA::PI_DMA_READ() //64DD User Sector uint32_t i; uint8_t * RDRAM = g_MMU->Rdram(); + uint8_t * DISK = g_Disk->GetDiskAddressBuffer(); for (i = 0; i < PI_RD_LEN_REG; i++) { - dd_buffer[i ^ 3] = * (RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)); + *(DISK + (i ^ 3)) = *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)); } g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; @@ -238,9 +240,10 @@ void CDMA::PI_DMA_WRITE() //64DD User Sector uint32_t i; uint8_t * RDRAM = g_MMU->Rdram(); + uint8_t * DISK = g_Disk->GetDiskAddressBuffer(); for (i = 0; i < PI_WR_LEN_REG; i++) { - *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = dd_buffer[i ^ 3]; + *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(DISK + (i ^ 3)); } g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index dec10366e..c8b1e0598 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -217,17 +217,18 @@ bool CN64System::RunFileImage(const char * FileLoc) { //64DD IPL g_DDRom = g_Rom; + } - if (g_Disk == NULL) - { - g_Disk = new CN64Disk(); - } + if (g_Disk == NULL) + { + g_Disk = new CN64Disk(); + } - if (!g_Disk->LoadDiskImage(g_Settings->LoadStringVal(SupportFile_DiskTest).c_str())); - { - delete g_Disk; - g_Disk = NULL; - } + if (!g_Disk->LoadDiskImage(g_Settings->LoadStringVal(SupportFile_DiskTest).c_str())) + { + g_Notify->DisplayError(g_Disk->GetError()); + delete g_Disk; + g_Disk = NULL; } g_System->RefreshGameSettings(); diff --git a/Source/Project64-core/N64System/N64DiskClass.cpp b/Source/Project64-core/N64System/N64DiskClass.cpp index 4fa2e5933..2a25ceca8 100644 --- a/Source/Project64-core/N64System/N64DiskClass.cpp +++ b/Source/Project64-core/N64System/N64DiskClass.cpp @@ -18,7 +18,8 @@ CN64Disk::CN64Disk() : m_DiskImage(NULL), m_DiskImageBase(NULL), -m_ErrorMsg(EMPTY_STRING) +m_ErrorMsg(EMPTY_STRING), +m_DiskBufAddress(0) { } diff --git a/Source/Project64-core/N64System/N64DiskClass.h b/Source/Project64-core/N64System/N64DiskClass.h index 3a15ca8cf..36a440e74 100644 --- a/Source/Project64-core/N64System/N64DiskClass.h +++ b/Source/Project64-core/N64System/N64DiskClass.h @@ -20,8 +20,12 @@ public: bool LoadDiskImage(const char * FileLoc); static bool IsValidDiskImage(uint8_t Test[4]); uint8_t * GetDiskAddress() { return m_DiskImage; } + uint8_t * GetDiskAddressBuffer() { return m_DiskImage + m_DiskBufAddress; } + void SetDiskAddressBuffer(uint32_t address) { m_DiskBufAddress = address; } void UnallocateDiskImage(); + LanguageStringID GetError() const { return m_ErrorMsg; } + private: bool AllocateDiskImage(uint32_t DiskFileSize); bool AllocateAndLoadDiskImage(const char * FileLoc); @@ -36,6 +40,7 @@ private: uint8_t * m_DiskImage; uint8_t * m_DiskImageBase; uint32_t m_DiskFileSize; + uint32_t m_DiskBufAddress; LanguageStringID m_ErrorMsg; stdstr m_FileName, m_DiskIdent; }; \ No newline at end of file