Forums

Sega Master System / Mark III / Game Gear
SG-1000 / SC-3000 / SF-7000 / OMV
Home - Forums - Games - Scans - Maps - Cheats - Credits
Music - Videos - Development - Hacks - Translations - Homebrew

View topic - Dumping "Super Game 45 (슈퍼게임45)"

Reply to topic
Author Message
  • Joined: 22 Apr 2018
  • Posts: 530
Reply with quote
Dumping "Super Game 45 (슈퍼게임45)"
Post Posted: Sun Dec 25, 2022 10:11 pm
EDIT: I was wrong earlier about the initial value of the mapper register due to a side-effect of my dumping script. Actual initial value seems to be either 0x7f or 0xff, bit 8 seems to have no effect — however this way doesn't work in the emulator due to differences in initial CPU + RAM state. For reliable operation MPR is initialized to 0x01 in the emulator.

I have been calling it "Super Game 45 ~ Super Game (KR)" while working on it. The actual name is Korean, though:

슈퍼게임45 ("Super Game 45") [top label]
슈퍼게임 ("Super Game") [menu]

Front label has a picture with cartoon zoo animals and a zoomorphic character in a pith helmet. It has an MSX-style "Mega Rom" mark, and says 겜보이 ("Gam*Boy")

Menu side art has a space ship with animated rocket flame, stars, planets, and a couple people — taller one at the left edge with short green hair, black lips, and a light cyan clothing with red collar, shorter one to the right and partly obscured by that one with long orange hair, red lips, and green clothing with pink trim

The menu has 46 items, with several for some of the games. The final menu entry (46) restarts the menu, including on real hardware. I suspect the multicart uses a RAM-based hook for applying simple trainers, but I haven't yet gone hunting for it. Some games have multiple entries in the menu that start them at different levels/with different settings

Text at the top of the menu alternates between "SELECT MENU" in English and "선택하세요."/seontaeghaseyo in Korean (Google Translate says that means "Choose." or "Please select.")

The games seem to be a mix of MSX games (using an MSX BIOS replacement that is stored in the first two 8KB ROM pages) and My Card / Sega Card games. Text in the ROM image and in some of the games suggests this multicart may be the work of Screen Software and/or Clover. No manufacturer/publisher info appears on the cartridge label and the injection molded cartridge shell is devoid of markings. I have not yet attempted opening it to inspect the PCB

Fingerprint info:

512K 'Super Game 45 ~ Super Game (KR).sms'
Checking for export header with matching CRC... NO
sha256:26463c23acf6ebf6277cc1b1448bf284c8244943fb8f5f24608a64b1f20c7d55 Super Game 45 ~ Super Game (KR).sms
sha1:c3d330f60158969aacbd7c5586fa276fa95a0832 Super Game 45 ~ Super Game (KR).sms
md5:9151e794b1507d76d68797271a90b623 Super Game 45 ~ Super Game (KR).sms
mekacrc:3EEA007A568DAECD Super Game 45 ~ Super Game (KR).sms
crc32:edb13847 Super Game 45 ~ Super Game (KR).sms

mapper scheme:

mapper register MPR is written at $FFFE, initial value seems to be either 0x7f or 0xff, bit 8 seems to have no effect — however, Meka's initial CPU register and RAM state means this game only works when MPR is initialized to 0x01

the ROM contains 64 pages, each 8KB — though only 63 are distinct, since pages 0x21 and 0x32 have the same contents

8KB page at $0000: ((MPR & 0x40) == 0x40) ? (MPR & 0x1e) * 2 : 0
8KB page at $2000: ((MPR & 0x40) == 0x40) ? (MPR & 0x1e) * 2 + 1 : 1
8KB page at $4000: ((MPR & 0x40) == 0x40) ? ((MPR & 0x1e) + 1) * 2 : (MPR & 0x1f) * 2
8KB page at $6000: ((MPR & 0x40) == 0x40) ? ((MPR & 0x1e) + 1) * 2 + 1 : (MPR & 0x1f) * 2 + 1
8KB page at $8000: ((MPR & 0x60) == 0x20) ? (MPR & 0x1f) * 2 + 1 : 0x3F
8KB page at $A000: ((MPR & 0x60) == 0x20) ? (MPR & 0x1f) * 2 : 0x3F

Menu Entry 01 (MPR=0x64) is 테디보이 ("Teddyboy"); it's [SMS] Teddyboy Blues
Menu Entry 02 (MPR=0x66) is 요술의성 (yosul-ui seong, i.e. "Witch's Castle"); it's [SMS] Pit Pot
Menu Entry 03 (MPR=0x0c) is 써커스 ("Circus"); it's [MSX] Circus Charlie
Menu Entry 04 (MPR=0x0d) is 요술나무 (yosul namu, i.e. "Magic Tree"); it's [MSX] Magical Tree
Menu Entry 05 (MPR=0x0e) is 남극탐험 (namgeug tamheom, i.e. "Antarctic Expedition"); it's [MSX] Antarctic Adventure
Menu Entry 06 (MPR=0x0f) is 올림픽 ("Olympic"); it's [MSX] Hyper Olympic 1
Menu Entry 07 (MPR=0x18) is 킹스벨리 ("King's Valley"); it's [MSX] King's Valley
Menu Entry 08 (MPR=0x1b) is 핏폴스 ("Pippols"); it's [MSX] Pippols
Menu Entry 09 (MPR=0x62) is 코메디죠 ("Comedy Joe"); it's [SMS] Machinegun Joe
Menu Entry 10 (MPR=0x10) is 당구 (dang-gu, translates to "Billiards"); it's [MSX] Video Hustler
Menu Entry 11 (MPR=0x64) is 테디보이4 ("Teddyboy 4"); it's [SMS] Teddyboy Blues
Menu Entry 12 (MPR=0x62) is 코메디죠4 ("Comedy Joe 4"); it's [SMS] Machinegun Joe
Menu Entry 13 (MPR=0x68) is I.Q.; it's [SG-1000] Soukoban
Menu Entry 14 (MPR=0x68) is I.Q.6; it's [SG-1000] Soukoban
Menu Entry 15 (MPR=0x0a) is 로드화이터 ("Road Fighter"); it's [MSX] Road Fighter
Menu Entry 16 (MPR=0x2b) is 겔러그 ("Galaga"); it's [MSX] Galaga
Menu Entry 17 (MPR=0x11) is 퓨안 ("Pyooan"); it's [MSX] Pooyan
Menu Entry 18 (MPR=0x12) is 스포츠 ("Sports"); it's [MSX] Hyper Sports 1
Menu Entry 19 (MPR=0x13) is 쿵후 ("Kung Fu"); it's [MSX] Yie Ar Kung-Fu
Menu Entry 20 (MPR=0x14) is 킹벌륜 ("King Balloon"); it's [MSX] King & Balloon
Menu Entry 21 (MPR=0x64) is 테디보이6 ("Teddyboy 6"); it's [SMS] Teddyboy Blues
Menu Entry 22 (MPR=0x64) is 테디보이3 ("Teddyboy 3"); it's [SMS] Teddyboy Blues
Menu Entry 23 (MPR=0x62) is 코메디죠2 ("Comedy Joe 2"); it's [SMS] Machinegun Joe
Menu Entry 24 (MPR=0x62) is 코메디죠6 ("Comedy Joe 6"); it's [SMS] Machinegun Joe
Menu Entry 25 (MPR=0x66) is 요술의성2 (yosul-ui seong 2, i.e. "Witch's Castle 2"); it's [SMS] Pit Pot
Menu Entry 26 (MPR=0x66) is 요술의성4 (yosul-ui seong 4, i.e. "Witch's Castle 4"); it's [SMS] Pit Pot
Menu Entry 27 (MPR=0x37) is 보스코니아 ("Bosconia"); it's [MSX] Bosconian
Menu Entry 28 (MPR=0x1f) is 겔럭시안 ("Galaxian"); it's [MSX] Galaxian
Menu Entry 29 (MPR=0x68) is I.Q.4; it's [SG-1000] Soukoban
Menu Entry 30 (MPR=0x68) is I.Q.7; it's [SG-1000] Soukoban
Menu Entry 31 (MPR=0x15) is 양배추 (yangbaechu, i.e. "Cabbage"); it's [MSX] Cabbage Patch Kids
Menu Entry 32 (MPR=0x16) is 스카이자글 ("Sky Jaguar"); it's [MSX] Sky Jaguar
Menu Entry 33 (MPR=0x19) is 탱크 ("Tank"); it's [MSX] Tank Battalion
Menu Entry 34 (MPR=0x1a) is 스포츠2 ("Sports 2"); it's [MSX] Hyper Sports 2
Menu Entry 35 (MPR=0x66) is 요술의성3 (yosul-ui seong 3, i.e. "Witch's Castle 3"); it's [SMS] Pit Pot
Menu Entry 36 (MPR=0x68) is I.Q.2; it's [SG-1000] Soukoban
Menu Entry 37 (MPR=0x64) is 테디보이5 ("Teddyboy 5"); it's [SMS] Teddyboy Blues
Menu Entry 38 (MPR=0x64) is 테디보이2 ("Teddyboy 2"); it's [SMS] Teddyboy Blues
Menu Entry 39 (MPR=0x68) is I.Q.3; it's [SG-1000] Soukoban
Menu Entry 40 (MPR=0x68) is I.Q.6; it's [SG-1000] Soukoban
Menu Entry 41 (MPR=0x1d) is 하이퍼렐리 ("Hyper Rally"); it's [MSX] Hyper Rally
Menu Entry 42 (MPR=0x1e) is 개구리 (gaeguli, i.e. "Frog"); it's [MSX] Frogger
Menu Entry 43 (MPR=0x62) is 코메디죠5 ("Comedy Joe 5"); it's [SMS] Machinegun Joe
Menu Entry 44 (MPR=0x62) is 코메디죠3 ("Comedy Joe 3"); it's [SMS] Machinegun Joe
Menu Entry 45 (MPR=0x1c) is 테니스 ("Tennis"); it's [MSX] Konami's Tennis
Menu Entry 46 (MPR=0x01) is 다시 (dasi, i.e. "Again"); it restarts the menu

Squirrel script fragment I used to dump this cartridge via the Tengu Game Gear cartridge bus adapter:

function cpu_dump_sg45(d, rom_size, banksize, offset)
{
    // Korean Super Game 45 ~ Super Game

    local max_dump_size = 0x100000;
    local block_step = 0x8000;
    local bias = (offset - 1) * (max_dump_size / block_step);

    local mapper_register = 0xFFFE;

    for(local a = 0x0000; a < rom_size; a += block_step)
    {
        local i = bias + (a / block_step);

        cpu_write(d, mapper_register, 0x40 + (i * 2));
        cpu_write(d, mapper_register, 0x40 + (i * 2));
        cpu_read(d, 0x0000, block_step);
    }
}


8KB data page mapping chart for all used values:


MPR 0… 2… 4… 6… 8… a…
═════════════════════
 01 00 01 02 03 3f 3f
 0a 00 01 14 15 3f 3f
 0c 00 01 18 19 3f 3f
 0d 00 01 1a 1b 3f 3f
 0e 00 01 1c 1d 3f 3f
 0f 00 01 1e 1f 3f 3f
 10 00 01 20 21 3f 3f
 11 00 01 22 23 3f 3f
 12 00 01 24 25 3f 3f
 13 00 01 26 27 3f 3f
 14 00 01 28 29 3f 3f
 15 00 01 2a 2b 3f 3f
 16 00 01 2c 2d 3f 3f
 18 00 01 30 31 3f 3f
 19 00 01 32 33 3f 3f
 1a 00 01 34 35 3f 3f
 1b 00 01 36 37 3f 3f
 1c 00 01 38 39 3f 3f
 1d 00 01 3a 3b 3f 3f
 1e 00 01 3c 3d 3f 3f
 1f 00 01 3e 3f 3f 3f
 2b 00 01 16 17 17 16
 37 00 01 2e 2f 2f 2e
 62 04 05 06 07 3f 3f
 64 08 09 0a 0b 3f 3f
 66 0c 0d 0e 0f 3f 3f
 68 10 11 12 13 3f 3f


meka patch for this mapper (I chose mapper #21)

diff --git a/.gitignore b/.gitignore
index 8fd564b..a3066fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@ meka/meka
 meka/meka.cfg
 meka/meka.dsk
 meka/meka.fdb
+meka/meka
 meka/mekaw.cfg
 meka/mekaw.exe
 meka/mekaw.ilk
diff --git a/meka/compat.txt b/meka/compat.txt
index 6ab6043..ba5906e 100644
--- a/meka/compat.txt
+++ b/meka/compat.txt
@@ -547,6 +547,7 @@
  Super Columns (KR)                             -       Ok
  Super Futebol II [Game Box Série Esportes] (BR)-       Ok
  Super Game 200 (KR)                            -      *Ok
+ Super Game 45 (KR)                             -      *Ok
  Super Game World 30 Hap (KR)                   -      *Ok
  Super Game World 75 Hap (KR)                   -      *Ok
  Superman - The Man of Steel                    -       Ok
@@ -1696,4 +1697,4 @@
 -----------------------------------------------------------------------------
  180 games tested, too many are not Ok
 -----------------------------------------------------------------------------
-
\ No newline at end of file
+
diff --git a/meka/meka.nam b/meka/meka.nam
index d3b49e8..cf38c9a 100644
--- a/meka/meka.nam
+++ b/meka/meka.nam
@@ -633,6 +633,7 @@ SMS 22c09cfd 50BB66C5832E8C8D   Super Bubble Bobble/COUNTRY=KR/COMMENT=Unlicense
 SMS 6ce7f694 8B297D82FFFB75DE   Super Columns/COUNTRY=KR/COMMENT=Unlicensed clone. Also referred to as "Super Columns & Tetris".
 SMS 551e6f51 FA1DF196B3DCEDE6   Super Futebol II [Game Box Série Esportes]/COUNTRY=BR/PRODUCT_NO=028560/COMMENT=Part of "Game Box Série Esportes" compilation.
 SMS ba5d2776 1EBAD8829E4FF6EB   Super Game 200/COUNTRY=KR/EMU_MAPPER=20
+SMS edb13847 3EEA007A568DAECD   Super Game 45/COUNTRY=KR/EMU_MAPPER=21
 SMS 0cde0938 2DFBC7EBB5C63576   Super Game World 30 Hap/COUNTRY=KR/EMU_MAPPER=18
 SMS c29bb8cd F5394893312A6339   Super Game World 75 Hap/COUNTRY=KR/EMU_MAPPER=18
 SMS 406aa0c2 50701F46EEB21328   Super Kick Off/COUNTRY=EU,BR/PRODUCT_NO=27017-50
diff --git a/meka/srcs/fdc765.cpp b/meka/srcs/fdc765.cpp
index 8538f3d..2f7918a 100644
--- a/meka/srcs/fdc765.cpp
+++ b/meka/srcs/fdc765.cpp
@@ -42,6 +42,10 @@
 #include "shared.h"
 #include "fdc765.h"
 
+#ifndef ARRAYSIZE
+#define ARRAYSIZE(a) (sizeof(a) / sizeof(*(a)))
+#endif
+
 //-----------------------------------------------------------------------------
 // Data
 //-----------------------------------------------------------------------------
diff --git a/meka/srcs/machine.cpp b/meka/srcs/machine.cpp
index d56916d..9040f15 100644
--- a/meka/srcs/machine.cpp
+++ b/meka/srcs/machine.cpp
@@ -175,6 +175,9 @@ void    Machine_Set_Handler_MemRW(void)
     case MAPPER_SMS_Korean_2000_xor_1F:
         WrZ80 = WrZ80_NoHook = Write_Mapper_SMS_Korean_2000_xor_1F;
         break;
+    case MAPPER_SMS_Korean_FFFE:
+        WrZ80 = WrZ80_NoHook = Write_Mapper_SMS_Korean_FFFE;
+        break;
     }
 }
 
@@ -360,6 +363,20 @@ void    Machine_Set_Mapping (void)
             g_machine.mapper_regs[i] = 0;
         break;
 
+    case MAPPER_SMS_Korean_FFFE:
+        Map_8k_ROM(0, 0x00 & tsms.Pages_Mask_8k);
+        Map_8k_ROM(1, 0x01 & tsms.Pages_Mask_8k);
+        Map_8k_ROM(2, 0x02 & tsms.Pages_Mask_8k);
+        Map_8k_ROM(3, 0x03 & tsms.Pages_Mask_8k);
+        Map_8k_ROM(4, 0x3f & tsms.Pages_Mask_8k);
+        Map_8k_ROM(5, 0x3f & tsms.Pages_Mask_8k);
+        Map_8k_RAM(6, 0);
+        Map_8k_RAM(7, 0);
+        g_machine.mapper_regs_count = 1;
+        for (int i = 0; i != MAPPER_REGS_MAX; i++)
+            g_machine.mapper_regs[i] = (i == 0) ? 0x01 : 0;
+        break;
+
     case MAPPER_SC3000_Survivors_Multicart:
         g_machine.mapper_regs_count = 1;
         for (int i = 0; i != MAPPER_REGS_MAX; i++)
diff --git a/meka/srcs/mappers.cpp b/meka/srcs/mappers.cpp
index cd37394..8456fb6 100644
--- a/meka/srcs/mappers.cpp
+++ b/meka/srcs/mappers.cpp
@@ -610,6 +610,31 @@ WRITE_FUNC (Write_Mapper_SMS_Korean_2000_xor_1F)
     Write_Error (Addr, Value);
 }
 
+// Mapper #21
+WRITE_FUNC (Write_Mapper_SMS_Korean_FFFE)
+{
+    if (Addr == 0xFFFE) // Configurable segment -----------------------------------------------
+    {
+        g_machine.mapper_regs[0] = Value;
+        Map_8k_ROM(0, (((Value & 0x40) == 0x40) ? ((Value & 0x1e) * 2) : 0) & tsms.Pages_Mask_8k);
+        Map_8k_ROM(1, (((Value & 0x40) == 0x40) ? ((Value & 0x1e) * 2 + 1) : 1) & tsms.Pages_Mask_8k);
+        Map_8k_ROM(2, (((Value & 0x40) == 0x40) ? (((Value & 0x1e) + 1) * 2) : ((Value & 0x1f) * 2)) & tsms.Pages_Mask_8k);
+        Map_8k_ROM(3, (((Value & 0x40) == 0x40) ? (((Value & 0x1e) + 1) * 2 + 1) : ((Value & 0x1f) * 2 + 1)) & tsms.Pages_Mask_8k);
+        Map_8k_ROM(4, (((Value & 0x60) == 0x20) ? ((Value & 0x1f) * 2 + 1) : 0x3f) & tsms.Pages_Mask_8k);
+        Map_8k_ROM(5, (((Value & 0x60) == 0x20) ? ((Value & 0x1f) * 2) : 0x3f) & tsms.Pages_Mask_8k);
+        return;
+    }
+
+    switch (Addr >> 13)
+    {
+        // RAM [0xC000] = [0xE000] ------------------------------------------------
+    case 6: Mem_Pages[6][Addr] = Value; return;
+    case 7: Mem_Pages[7][Addr] = Value; return;
+    }
+
+    Write_Error (Addr, Value);
+}
+
 // Based on MSX ASCII 8KB mapper? http://bifi.msxnet.org/msxnet/tech/megaroms.html#ascii8
 // - This mapper requires 4 registers to save bank switching state.
 //   However, all other mappers so far used only 3 registers, stored as 3 bytes.
diff --git a/meka/srcs/mappers.h b/meka/srcs/mappers.h
index 1d2fc67..3a90257 100644
--- a/meka/srcs/mappers.h
+++ b/meka/srcs/mappers.h
@@ -43,6 +43,7 @@
 #define MAPPER_SMS_Korean_MSX_8KB_0300          (18)        // Registers at 0x0000,0x0100,0x0200,0x0300 (Super Multi Game Super 75 in 1, Super Game World 75 etc.)
 #define MAPPER_SMS_Korean_2000_xor_1F           (19)        // Register at 0x2000 (128 Hap, Game Mo-eumjip 188 Hap etc.)
 #define MAPPER_SMS_Korean_BFFC                  (20)        // Register at 0xBFFC
+#define MAPPER_SMS_Korean_FFFE                  (21)        // Register at 0xFFFE (Super Game 45)
 
 #define READ_FUNC(_NAME)   u8 _NAME(register u16 Addr)
 #define WRITE_FUNC(_NAME)  void _NAME(register u16 Addr, register u8 Value)
@@ -82,6 +83,7 @@ WRITE_FUNC (Write_Mapper_SMS_4PakAllAction);
 WRITE_FUNC (Write_Mapper_SG1000_Taiwan_MSX_Adapter_TypeA);
 WRITE_FUNC (Write_Mapper_SMS_Korean_FFFF_HiCom);
 WRITE_FUNC (Write_Mapper_SMS_Korean_2000_xor_1F);
+WRITE_FUNC (Write_Mapper_SMS_Korean_FFFE);
 //-----------------------------------------------------------------------------
 void Out_SC3000_SurvivorsMulticarts_DataWrite(u8 v);
 
diff --git a/meka/srcs/saves.cpp b/meka/srcs/saves.cpp
index 6a73d1d..59dbe3a 100644
--- a/meka/srcs/saves.cpp
+++ b/meka/srcs/saves.cpp
@@ -116,6 +116,9 @@ void        Load_Game_Fixup(void)
         case MAPPER_SMS_Korean_2000_xor_1F:
             WrZ80_NoHook(0x2000, g_machine.mapper_regs[0]);
             break;
+        case MAPPER_SMS_Korean_FFFE:
+            WrZ80_NoHook(0xFFFE, g_machine.mapper_regs[0]);
+            break;
         }
     }
 
@@ -304,6 +307,7 @@ int     Save_Game_MSV(FILE *f)
     case MAPPER_SMS_Korean_Janggun:
     case MAPPER_SMS_Korean_FFFF_HiCom:
     case MAPPER_SMS_Korean_2000_xor_1F:
+    case MAPPER_SMS_Korean_FFFE:
     default:                 
         fwrite (RAM, 0x2000, 1, f); // Do not use g_driver->ram because of g_driver video mode change
         break;
@@ -476,6 +480,7 @@ int         Load_Game_MSV(FILE *f)
     case MAPPER_SMS_Korean_Janggun:
     case MAPPER_SMS_Korean_FFFF_HiCom:
     case MAPPER_SMS_Korean_2000_xor_1F:
+    case MAPPER_SMS_Korean_FFFE:
     default:
         fread (RAM, 0x2000, 1, f); // Do not use g_driver->ram because of g_driver video mode change
         break;

Menu Screen 1 - Super Game 45 ~ Super Game (KR).png (27.25 KB)
First screen of menu
Menu Screen 1 - Super Game 45 ~ Super Game (KR).png
Menu Screen 2 - Super Game 45 ~ Super Game (KR).png (28.97 KB)
Second screen of menu
Menu Screen 2 - Super Game 45 ~ Super Game (KR).png
Menu Screen 3 - Super Game 45 ~ Super Game (KR).png (28.24 KB)
Third screen of menu
Menu Screen 3 - Super Game 45 ~ Super Game (KR).png
Label Front - Super Game 45 ~ Super Game (KR).png (166.39 KB)
Front of cartridge label
Label Front - Super Game 45 ~ Super Game (KR).png
Label Top - Super Game 45 ~ Super Game (KR).png (28.46 KB)
Top of cartridge label
Label Top - Super Game 45 ~ Super Game (KR).png

  View user's profile Send private message
Reply to topic



Back to the top of this page

Back to SMS Power!