From 0278755ebc8a25c8a67c75399f56bb8682e9e97e Mon Sep 17 00:00:00 2001 From: notaz Date: Wed, 21 Jan 2026 02:04:20 +0200 Subject: [PATCH] menu: fix some memcard parsing issues --- frontend/menu.c | 6 ++++-- libpcsxcore/sio.c | 30 +++++++++++++++--------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/frontend/menu.c b/frontend/menu.c index 3607fd5c..1e44fae0 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -1895,6 +1895,8 @@ static void draw_mc_bg(void) for (i = 0; i < 15; i++) { GetMcdBlockInfo(1, i + 1, &blocks1[i]); GetMcdBlockInfo(2, i + 1, &blocks2[i]); + blocks1[i].Title[24] = 0; + blocks2[i].Title[24] = 0; } menu_draw_begin(1, 1); @@ -1911,10 +1913,10 @@ static void draw_mc_bg(void) row2 = g_menuscreen_w / 2; for (i = 0; i < maxicons; i++) { draw_mc_icon(8, y + i * 32, (u16 *)blocks1[i].Icon); - smalltext_out16(10+32, y + i * 32 + 8, blocks1[i].sTitle, 0xf71e); + smalltext_out16(10+32, y + i * 32 + 8, blocks1[i].Title, 0xf71e); draw_mc_icon(row2 + 8, y + i * 32, (u16 *)blocks2[i].Icon); - smalltext_out16(row2 + 10+32, y + i * 32 + 8, blocks2[i].sTitle, 0xf71e); + smalltext_out16(row2 + 10+32, y + i * 32 + 8, blocks2[i].Title, 0xf71e); } menu_darken_bg(g_menubg_ptr, g_menuscreen_ptr, g_menuscreen_w * g_menuscreen_h, 0); diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c index 5df9caf9..32345412 100644 --- a/libpcsxcore/sio.c +++ b/libpcsxcore/sio.c @@ -680,10 +680,11 @@ void ConvertMcd(char *mcd, char *data) { } void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) { - char *data = NULL, *ptr, *str, *sstr; + unsigned char *data = NULL, *ptr; + char *str, *sstr; unsigned short clut[16]; unsigned short c; - int i, x; + int i, s, x, skip; memset(Info, 0, sizeof(McdBlock)); @@ -693,8 +694,8 @@ void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) { if (McdDisable[mcd - 1]) return; - if (mcd == 1) data = Mcd1Data; - if (mcd == 2) data = Mcd2Data; + if (mcd == 1) data = (unsigned char *)Mcd1Data; + if (mcd == 2) data = (unsigned char *)Mcd2Data; ptr = data + block * 8192 + 2; @@ -707,6 +708,7 @@ void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) { str = Info->Title; sstr = Info->sTitle; + s = skip = 0; for (i = 0; i < 48; i++) { c = *(ptr) << 8; c |= *(ptr + 1); @@ -732,12 +734,14 @@ void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) { else if (c == 0x816E) c = ']'; else if (c == 0x817C) c = '-'; else { - str[i] = ' '; + if (!skip++) + str[s++] = ' '; sstr[x++] = *ptr++; sstr[x++] = *ptr++; continue; } - str[i] = sstr[x++] = c; + skip = 0; + str[s++] = sstr[x++] = c; ptr += 2; } @@ -745,20 +749,16 @@ void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) { trim(sstr); ptr = data + block * 8192 + 0x60; // icon palette data - - for (i = 0; i < 16; i++) { - clut[i] = *((unsigned short *)ptr); - ptr += 2; - } + memcpy(clut, ptr, 16*2); for (i = 0; i < Info->IconCount; i++) { short *icon = &Info->Icon[i * 16 * 16]; ptr = data + block * 8192 + 128 + 128 * i; // icon data - for (x = 0; x < 16 * 16; x++) { + for (x = 0; x < 16 * 16; ) { icon[x++] = clut[*ptr & 0xf]; - icon[x] = clut[*ptr >> 4]; + icon[x++] = clut[*ptr >> 4]; ptr++; } } @@ -768,9 +768,9 @@ void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) { Info->Flags = *ptr; ptr += 0xa; - strncpy(Info->ID, ptr, 12); + strncpy(Info->ID, (char *)ptr, 12); ptr += 12; - strncpy(Info->Name, ptr, 16); + strncpy(Info->Name, (char *)ptr, 16); } int sioFreeze(void *f, int Mode) { -- 2.47.3