menu: fix some memcard parsing issues
authornotaz <notasas@gmail.com>
Wed, 21 Jan 2026 00:04:20 +0000 (02:04 +0200)
committernotaz <notasas@gmail.com>
Wed, 21 Jan 2026 00:04:20 +0000 (02:04 +0200)
frontend/menu.c
libpcsxcore/sio.c

index 3607fd5..1e44fae 100644 (file)
@@ -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);
index 5df9caf..3234541 100644 (file)
@@ -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) {