From bc873cb228db45a51315f3b603f05dcaf9c5e05a Mon Sep 17 00:00:00 2001 From: "Christoph \"baka0815\" Schwerdtfeger" Date: Mon, 27 Aug 2018 13:50:59 +0200 Subject: [PATCH] Maple: Corrected creation of empty VMU The VMU which was written to disk was never initialized and therefore consisted only of zeroes. After saving for the first time the VMU was corrupted. Changes: * Not only initialize the VMU in memory but also write the correct contents to disk * If an existing VMU consists only of zeroes overwrite it with the initial empty VMU --- core/hw/maple/maple_devs.cpp | 118 ++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 43 deletions(-) diff --git a/core/hw/maple/maple_devs.cpp b/core/hw/maple/maple_devs.cpp index c07b5dac7..649e627eb 100755 --- a/core/hw/maple/maple_devs.cpp +++ b/core/hw/maple/maple_devs.cpp @@ -129,7 +129,7 @@ struct maple_base: maple_device while(len--) w8(0x20); } - + u8 r8() { u8 rv=*((u8*)dma_buffer_in);dma_buffer_in+=1;dma_count_in-=1; return rv; } u16 r16() { u16 rv=*((u16*)dma_buffer_in);dma_buffer_in+=2;dma_count_in-=2; return rv; } u32 r32() { u32 rv=*(u32*)dma_buffer_in;dma_buffer_in+=4;dma_count_in-=4; return rv; } @@ -181,7 +181,7 @@ struct maple_sega_controller: maple_base //1 direction w8(0); - + //30 wstr(maple_sega_controller_name,30); @@ -189,7 +189,7 @@ struct maple_sega_controller: maple_base wstr(maple_sega_brand,60); //2 - w16(0x01AE); + w16(0x01AE); //2 w16(0x01F4); @@ -235,7 +235,7 @@ struct maple_sega_controller: maple_base //printf("UNKOWN MAPLE COMMAND %d\n",cmd); return MDRE_UnknownFunction; } - } + } }; /* @@ -271,25 +271,44 @@ struct maple_sega_vmu: maple_base u8 flash_data[128*1024]; u8 lcd_data[192]; u8 lcd_data_decoded[48*32]; - + + // creates an empty VMU + bool init_emptyvmu() + { + printf("Initialising empty VMU...\n"); + + uLongf dec_sz = sizeof(flash_data); + int rv = uncompress(flash_data, &dec_sz, vmu_default, sizeof(vmu_default)); + + verify(rv == Z_OK); + verify(dec_sz == sizeof(flash_data)); + + return (rv == Z_OK && dec_sz == sizeof(flash_data)); + } + virtual void OnSetup() { - memset(flash_data,0,sizeof(flash_data)); - memset(lcd_data,0,sizeof(lcd_data)); + memset(flash_data, 0, sizeof(flash_data)); + memset(lcd_data, 0, sizeof(lcd_data)); wchar tempy[512]; - sprintf(tempy,"/vmu_save_%s.bin",logical_port); - string apath=get_writable_data_path(tempy); + sprintf(tempy, "/vmu_save_%s.bin", logical_port); + string apath = get_writable_data_path(tempy); - file=fopen(apath.c_str(),"rb+"); + file = fopen(apath.c_str(), "rb+"); if (!file) { printf("Unable to open VMU save file \"%s\", creating new file\n",apath.c_str()); - file=fopen(apath.c_str(),"wb"); + file = fopen(apath.c_str(), "wb"); if (file) { + if (!init_emptyvmu()) + printf("Failed to initialize an empty VMU, you should reformat it using the BIOS\n"); + fwrite(flash_data, sizeof(flash_data), 1, file); - fseek(file,0,SEEK_SET); - } else { - printf("Unable to create vmu\n"); + fseek(file, 0, SEEK_SET); + } + else + { + printf("Unable to create VMU!\n"); } } @@ -299,20 +318,33 @@ struct maple_sega_vmu: maple_base } else { - fread(flash_data,1,sizeof(flash_data),file); + fread(flash_data, 1, sizeof(flash_data), file); } u8 sum = 0; - for (int i=0;itm_year+1900)%256); @@ -508,7 +540,7 @@ struct maple_sega_vmu: maple_base { u32 bph=r32(); u32 Block = (SWAP32(bph))&0xffff; - u32 Phase = ((SWAP32(bph))>>16)&0xff; + u32 Phase = ((SWAP32(bph))>>16)&0xff; u32 write_adr=Block*512+Phase*(512/4); u32 write_len=r_count(); rptr(&flash_data[write_adr],write_len); @@ -526,13 +558,13 @@ struct maple_sega_vmu: maple_base return MDRS_DeviceReply;//just ko } break; - + case MFID_2_LCD: { u32 wat=r32(); rptr(lcd_data,192); - + u8 white=0xff,black=0x00; for(int y=0;y<32;++y) @@ -560,8 +592,8 @@ struct maple_sega_vmu: maple_base dev->lcd.visible=true; ShowWindow(dev->lcd.handle,SHOW_OPENNOACTIVATE); } - - + + InvalidateRect(dev->lcd.handle,NULL,FALSE); } @@ -661,7 +693,7 @@ struct maple_sega_vmu: maple_base //printf("Unknown MAPLE COMMAND %d\n",cmd); return MDRE_UnknownCmd; } - } + } }; @@ -700,7 +732,7 @@ struct maple_microphone: maple_base //1 direction w8(0); - + //30 wstr(maple_sega_mic_name,30); @@ -708,7 +740,7 @@ struct maple_microphone: maple_base wstr(maple_sega_brand,60); //2 - w16(0x01AE); + w16(0x01AE); //2 w16(0x01F4); @@ -842,7 +874,7 @@ struct maple_microphone: maple_base LOGW("maple_microphone::dma UNHANDLED MAPLE COMMAND %d\n",cmd); return MDRE_UnknownFunction; } - } + } }; @@ -888,7 +920,7 @@ struct maple_sega_purupuru : maple_base //get last vibration case MDCF_GetCondition: - + w32(MFID_8_Vibration); w32(VIBSET); @@ -900,7 +932,7 @@ struct maple_sega_purupuru : maple_base w32(MFID_8_Vibration); // PuruPuru vib specs - w32(0x3B07E010); + w32(0x3B07E010); return MDRS_DataTransfer; @@ -915,7 +947,7 @@ struct maple_sega_purupuru : maple_base return MDRS_DataTransfer; case MDCF_BlockWrite: - + //Auto-stop time AST = dma_buffer_in[10]; AST_ms = AST * 250 + 250; @@ -923,7 +955,7 @@ struct maple_sega_purupuru : maple_base return MDRS_DeviceReply; case MDCF_SetCondition: - + VIBSET = *(u32*)&dma_buffer_in[4]; //Do the rumble thing! config->SetVibration(VIBSET); @@ -999,7 +1031,7 @@ struct maple_naomi_jamma : maple_sega_controller { u32* buffer_in = (u32*)dma_buffer_in; u32* buffer_out = (u32*)dma_buffer_out; - + u8* buffer_in_b = dma_buffer_in; u8* buffer_out_b = dma_buffer_out; @@ -1074,7 +1106,7 @@ struct maple_naomi_jamma : maple_sega_controller break; //CMD Version - //REV in command|Format command to read the (revision)|One|Two + //REV in command|Format command to read the (revision)|One|Two //in : 1 byte, out : 2 bytes case 0x11: { @@ -1083,7 +1115,7 @@ struct maple_naomi_jamma : maple_sega_controller break; //JVS Version - //In JV REV|JAMMA VIDEO standard reading (revision)|One|Two + //In JV REV|JAMMA VIDEO standard reading (revision)|One|Two //in : 1 byte, out : 2 bytes case 0x12: { @@ -1362,7 +1394,7 @@ struct maple_naomi_jamma : maple_sega_controller buffer_out_len = 256; return (0x83); } - + case 1: case 9: return maple_sega_controller::dma(cmd);