2 Commits

6 changed files with 630 additions and 120 deletions
+1 -1
View File
@@ -637,7 +637,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = /usr/bin/openemu_rb_automation.rb;
shellScript = "/usr/bin/openemu_rb_automation.rb\n";
};
/* End PBXShellScriptBuildPhase section */
+1 -1
View File
@@ -19,7 +19,7 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.7.5</string>
<string>1.7.5.1</string>
<key>NSPrincipalClass</key>
<string>OEGameCoreController</string>
<key>OEGameCoreClass</key>
+106 -69
View File
@@ -101,13 +101,13 @@ static void tekken_regs_w(uint32 address, uint32 data);
static const md_entry_t rom_database[] =
{
/* Funny World & Balloon Boy */
{0x0000,0x06ab,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}},
{0x0000,0x06ab,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,m68k_unused_8_w,NULL,mapper_realtec_w}},
/* Whac-a-Critter */
{0xffff,0xf863,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}},
{0xffff,0xf863,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,m68k_unused_8_w,NULL,mapper_realtec_w}},
/* Earth Defense */
{0xffff,0x44fb,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}},
{0xffff,0x44fb,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,m68k_unused_8_w,NULL,mapper_realtec_w}},
/* Tom Clown */
{0x0000,0xc0cd,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,NULL,NULL,mapper_realtec_w}},
{0x0000,0xc0cd,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},1,0,NULL,m68k_unused_8_w,NULL,mapper_realtec_w}},
/* 1800-in-1 */
{0x3296,0x2370,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,1,mapper_128k_multi_r,m68k_unused_8_w,NULL,NULL}},
@@ -132,122 +132,122 @@ static const md_entry_t rom_database[] =
/* Tenchi wo Kurau III: Sangokushi Gaiden - Chinese Fighter */
{0x9490,0x8180,0x40,0x6f,{{0x00,0x00,0x00,0x00},{0xf0000c,0xf0000c,0xf0000c,0xf0000c},{0x400000,0x400004,0x400008,0x40000c},0,1,NULL,NULL,default_regs_r,custom_alt_regs_w}},
{0x9490,0x8180,0x40,0x6f,{{0x00,0x00,0x00,0x00},{0xf0000c,0xf0000c,0xf0000c,0xf0000c},{0x400000,0x400004,0x400008,0x40000c},0,1,NULL,m68k_unused_8_w,default_regs_r,custom_alt_regs_w}},
/* Top Fighter */
{0x4eb9,0x5d8b,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x4eb9,0x5d8b,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,m68k_unused_8_w,default_regs_r,custom_regs_w}},
/* Soul Edge VS Samurai Spirits */
{0x00ff,0x5d34,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x00ff,0x5d34,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,m68k_unused_8_w,default_regs_r,custom_regs_w}},
/* Mulan */
{0x0404,0x1b40,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0404,0x1b40,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,m68k_unused_8_w,default_regs_r,custom_regs_w}},
/* Pocket Monsters II */
{0x47f9,0x17e5,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x47f9,0x17e5,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,m68k_unused_8_w,default_regs_r,custom_regs_w}},
/* Lion King 3 */
{0x0000,0x507c,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0000,0x507c,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,m68k_unused_8_w,default_regs_r,custom_regs_w}},
/* Super King Kong 99 */
{0x0000,0x7d6e,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0000,0x7d6e,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,m68k_unused_8_w,default_regs_r,custom_regs_w}},
/* Gunfight 3-in-1 */
{0x0000,0x6ff8,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,NULL,default_regs_r,custom_regs_w}},
{0x0000,0x6ff8,0x60,0x7f,{{0x00,0x00,0x00,0x00},{0xf00007,0xf00007,0xf00007,0xffffff},{0x600001,0x600003,0x600005,0x000000},0,1,NULL,m68k_unused_8_w,default_regs_r,custom_regs_w}},
/* Pokemon Stadium */
{0x0000,0x843c,0x70,0x7f,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,1,NULL,NULL,NULL,custom_regs_w}},
{0x0000,0x843c,0x70,0x7f,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,1,NULL,m68k_unused_8_w,NULL,custom_regs_w}},
/* Tekken 3 Special (original dump) (a bootleg version also exists, with patched protection & different boot routine which reads unused !TIME mapped area) */
{0x0000,0xc2f0,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,NULL,tekken_regs_r,tekken_regs_w}},
{0x0000,0xc2f0,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,tekken_regs_r,tekken_regs_w}},
/* Lion King 2 */
{0xffff,0x1d9b,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0xffff,0x1d9b,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,default_regs_w}},
/* Squirell King */
{0x0000,0x8ec8,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x0000,0x8ec8,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,default_regs_w}},
/* Tiny Toon Adventures 3 */
{0x2020,0xed9c,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x2020,0xed9c,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,default_regs_w}},
/* Lian Huan Pao - Barver Battle Saga (registers accessed by Z80, related to sound engine ?) */
{0x30b9,0x1c2a,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x30b9,0x1c2a,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,default_regs_w}},
/* Shui Hu Zhuan (registers accessed by Z80, related to sound engine ?) */
{0x6001,0x0211,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x6001,0x0211,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,default_regs_w}},
/* Feng Shen Ying Jie Chuan (registers accessed by Z80, related to sound engine ?) */
{0xffff,0x5d98,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0xffff,0x5d98,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,default_regs_w}},
/* (*) Shui Hu - Feng Yun Zhuan (patched ROM, unused registers) */
{0x3332,0x872b,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,default_regs_w}},
{0x3332,0x872b,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xfffffd,0xfffffd,0xffffff,0xffffff},{0x400000,0x400004,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,default_regs_w}},
/* (*) Chao Ji Da Fu Weng (patched ROM, various words witten to register, long word also read from $7E0000, unknown banking hardware ?) */
{0xa697,0xa697,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x000000,0x000000,0x000000},0,0,NULL,NULL,NULL,default_regs_w}},
{0xa697,0xa697,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x000000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,NULL,default_regs_w}},
/* (*) Aq Renkan Awa (patched ROM, ON/OFF bit sequence is written to register, unknown banking hardware ?) */
{0x8104,0x0517,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400001,0x000000,0x000000,0x000000},0,0,NULL,NULL,NULL,default_regs_w}},
{0x8104,0x0517,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400001,0x000000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,NULL,default_regs_w}},
/* (*) Tun Shi Tian Di III (patched ROM, unused register) */
{0x0000,0x9c5e,0x40,0x40,{{0xab,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400046,0x000000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x9c5e,0x40,0x40,{{0xab,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400046,0x000000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Ma Jiang Qing Ren - Ji Ma Jiang Zhi */
{0x0000,0x7037,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x7037,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Super Majon Club */
{0x0000,0x3b95,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x3b95,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Feng Kuang Tao Hua Yuan (original version from Creaton Softec Inc) (a bootleg version also exists with patched protection and minor title screen variations) */
{0x0000,0x9dc4,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x9dc4,0x40,0x40,{{0x90,0xd3,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x401000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* (*) Jiu Ji Ma Jiang II - Ye Yan Bian (patched ROM, using expected register value - $0f - crashes the game) (uses 16-bits reads) */
{0x0c44,0xba81,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}},
{0x0c44,0xba81,0x40,0x40,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r_16,NULL}},
/* 16 Zhang Ma Jiang (uses 16-bits reads) */
{0xfb40,0x4bed,0x40,0x40,{{0x00,0xaa,0x00,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x400002,0x000000,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}},
{0xfb40,0x4bed,0x40,0x40,{{0x00,0xaa,0x00,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x400002,0x000000,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r_16,NULL}},
/* 16 Tiles Mahjong II (uses 16-bits reads) */
{0xffff,0x0903,0x40,0x40,{{0x00,0x00,0xc9,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x400004,0x000000},0,0,NULL,NULL,default_regs_r_16,NULL}},
{0xffff,0x0903,0x40,0x40,{{0x00,0x00,0xc9,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x400004,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r_16,NULL}},
/* Thunderbolt II (uses 16-bits reads) */
{0x0000,0x1585,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r_16,NULL}},
{0x0000,0x1585,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r_16,NULL}},
/* Chaoji Puke - Super Poker (correct ROM dump, original release is an overdump) */
{0xffff,0xd7b0,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0xffff,0xd7b0,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Super Bubble Bobble */
{0x0000,0x16cd,0x40,0x40,{{0x55,0x0f,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x16cd,0x40,0x40,{{0x55,0x0f,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Tenchi wo Kurau II - The Battle of Red Cliffs (Unl) */
{0x0000,0xed61,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0xed61,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Huan Le Tao Qi Shu - Smart Mouse */
{0x0000,0x1a28,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x1a28,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* (*) Hei Tao 2 - Super Big 2 (patched ROM, unused registers) */
{0x0000,0x5843,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x5843,0x40,0x40,{{0x55,0x0f,0xaa,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Mighty Morphin Power Rangers - The Fighting Edition */
{0x0000,0x2288,0x40,0x40,{{0x55,0x0f,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x2288,0x40,0x40,{{0x55,0x0f,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Elf Wor */
{0x0080,0x3dba,0x40,0x40,{{0x55,0x0f,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0080,0x3dba,0x40,0x40,{{0x55,0x0f,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Ya-Se Chuanshuo */
{0xffff,0xd472,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0xffff,0xd472,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* 777 Casino (For first one, 0x55 works as well. Other values are never used so they are guessed from on other unlicensed games using similar mapper) */
{0x0000,0xf8d9,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0xf8d9,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Wu Kong Wai Zhuan (original) (a bootleg version also exists, with patched protection & modified SRAM test routine ?) */
{0x0000,0x19ff,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x19ff,0x40,0x40,{{0x63,0x98,0xc9,0x18},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Soul Blade */
{0x0000,0x0c5b,0x40,0x40,{{0x63,0x98,0xc9,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0x0c5b,0x40,0x40,{{0x63,0x98,0xc9,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0x400000,0x400002,0x400004,0x400006},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* King of Fighter 98 */
{0x0000,0xd0a0,0x48,0x4f,{{0x00,0x00,0xaa,0xf0},{0xffffff,0xffffff,0xfc0000,0xfc0000},{0x000000,0x000000,0x480000,0x4c0000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x0000,0xd0a0,0x48,0x4f,{{0x00,0x00,0xaa,0xf0},{0xffffff,0xffffff,0xfc0000,0xfc0000},{0x000000,0x000000,0x480000,0x4c0000},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Rock Heaven */
{0x6cca,0x2395,0x50,0x50,{{0x50,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x500008,0x000000,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x6cca,0x2395,0x50,0x50,{{0x50,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x500008,0x000000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Rock World */
{0x3547,0xa3da,0x50,0x50,{{0x50,0xa0,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x500008,0x500208,0x000000,0x000000},0,0,NULL,NULL,default_regs_r,NULL}},
{0x3547,0xa3da,0x50,0x50,{{0x50,0xa0,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x500008,0x500208,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,default_regs_r,NULL}},
/* Rockman X3 (bootleg version ? two last register returned values are ignored, note that 0xaa/0x18 would work as well) */
{0x0000,0x9d0e,0x40,0x40,{{0x0c,0x00,0xc9,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x400004,0x400006},0,0,default_regs_r,NULL,default_regs_r,NULL}},
{0x0000,0x9d0e,0x40,0x40,{{0x0c,0x00,0xc9,0xf0},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x400004,0x400006},0,0,default_regs_r,m68k_unused_8_w,default_regs_r,NULL}},
/* (*) Dragon Ball Final Bout (patched ROM, in original code, different switches occurs depending on returned value $00-$0f) */
{0xc65a,0xc65a,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}},
{0xc65a,0xc65a,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,m68k_unused_8_w,NULL,NULL}},
/* (*) Yang Jia Jiang - Yang Warrior Family (patched ROM, register value unused) */
{0x0000,0x96b0,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}},
{0x0000,0x96b0,0x00,0x00,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,m68k_unused_8_w,NULL,NULL}},
/* Super Mario 2 1998 */
{0xffff,0x0474,0x00,0x00,{{0x0a,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}},
{0xffff,0x0474,0x00,0x00,{{0x0a,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,m68k_unused_8_w,NULL,NULL}},
/* Super Mario World */
{0x2020,0xb4eb,0x00,0x00,{{0x1c,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,NULL,NULL,NULL}},
{0x2020,0xb4eb,0x00,0x00,{{0x1c,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0xa13000,0x000000,0x000000,0x000000},0,0,default_regs_r,m68k_unused_8_w,NULL,NULL}},
/* King of Fighter 99 */
@@ -265,7 +265,7 @@ static const md_entry_t rom_database[] =
/* Top Shooter (arcade hardware) */
{0xffff,0x3632,0x20,0x20,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,NULL,topshooter_r,topshooter_w}}
{0xffff,0x3632,0x20,0x20,{{0x00,0x00,0x00,0x00},{0xffffff,0xffffff,0xffffff,0xffffff},{0x000000,0x000000,0x000000,0x000000},0,0,NULL,m68k_unused_8_w,topshooter_r,topshooter_w}}
};
@@ -408,13 +408,17 @@ void md_cart_init(void)
/* SRAM is mapped by default unless it overlaps with ROM area (Phantasy Star 4, Beyond Oasis/Legend of Thor, World Series Baseball 9x, Duke Nukem 3D,...) */
if (sram.start >= cart.romsize)
{
m68k.memory_map[sram.start >> 16].base = sram.sram;
m68k.memory_map[sram.start >> 16].read8 = sram_read_byte;
m68k.memory_map[sram.start >> 16].read16 = sram_read_word;
m68k.memory_map[sram.start >> 16].write8 = sram_write_byte;
m68k.memory_map[sram.start >> 16].write16 = sram_write_word;
zbank_memory_map[sram.start >> 16].read = sram_read_byte;
zbank_memory_map[sram.start >> 16].write = sram_write_byte;
/* except for Sonic the Hedgehog 3 (cartridge ROM mirrored in upper 2MB area at power on) */
if (strstr(rominfo.international,"SONIC THE HEDGEHOG 3") == NULL)
{
m68k.memory_map[sram.start >> 16].base = sram.sram;
m68k.memory_map[sram.start >> 16].read8 = sram_read_byte;
m68k.memory_map[sram.start >> 16].read16 = sram_read_word;
m68k.memory_map[sram.start >> 16].write8 = sram_write_byte;
m68k.memory_map[sram.start >> 16].write16 = sram_write_word;
zbank_memory_map[sram.start >> 16].read = sram_read_byte;
zbank_memory_map[sram.start >> 16].write = sram_write_byte;
}
}
/* support for Triple Play 96 & Triple Play - Gold Edition mapping */
@@ -460,6 +464,9 @@ void md_cart_init(void)
***********************************************/
memset(&cart.hw, 0, sizeof(cart.hw));
/* initialize default $200000-$20ffff mapping (for games using SRAM & ROM bankswitching) */
cart.hw.regs[0] = (0x200000 & cart.mask) >> 16;
/* search for game into database */
for (i=0; i<(sizeof(rom_database)/sizeof(md_entry_t)); i++)
{
@@ -509,6 +516,12 @@ void md_cart_init(void)
}
/* detect specific mappers */
else if (strstr(rominfo.international,"DEMONS OF ASTEBORG") ||
strstr(rominfo.international,"ASTEBROS"))
{
/* default SSF2+SRAM mapper (fixes Steam versions which incorrectly use Everdrive extended SSF mapper indicator in ROM header) */
cart.hw.time_w = default_time_w;
}
else if (strstr(rominfo.consoletype,"SEGA SSF"))
{
/* Everdrive extended SSF mapper */
@@ -996,12 +1009,21 @@ static void mapper_sega_w(uint32 data)
if (data & 1)
{
/* check Backup RAM is enabled */
if (sram.on)
{
/* Backup RAM mapped to $200000-$20ffff (normally mirrored up to $3fffff but this breaks Sonic Megamix and no game need it) */
m68k.memory_map[0x20].read8 = sram_read_byte;
m68k.memory_map[0x20].read16 = sram_read_word;
zbank_memory_map[0x20].read = sram_read_byte;
/* check Backup RAM is currently not mapped */
if (m68k.memory_map[0x20].base != sram.sram)
{
/* save current cartridge ROM bank mapped to $200000-$20ffff (for games using SRAM & ROM bankswitching) */
cart.hw.regs[0] = ((m68k.memory_map[0x20].base - cart.rom) >> 16) & 0xff;
/* Backup RAM mapped to $200000-$20ffff (normally mirrored up to $3fffff but this breaks Sonic Megamix and no game need it) */
m68k.memory_map[0x20].base = sram.sram;
m68k.memory_map[0x20].read8 = sram_read_byte;
m68k.memory_map[0x20].read16 = sram_read_word;
zbank_memory_map[0x20].read = sram_read_byte;
}
/* Backup RAM write protection */
if (data & 2)
@@ -1030,13 +1052,28 @@ static void mapper_sega_w(uint32 data)
}
else
{
/* cartridge ROM mapped to $200000-$20ffff */
m68k.memory_map[0x20].read8 = NULL;
m68k.memory_map[0x20].read16 = NULL;
zbank_memory_map[0x20].read = NULL;
m68k.memory_map[0x20].write8 = m68k_unused_8_w;
m68k.memory_map[0x20].write16 = m68k_unused_16_w;
zbank_memory_map[0x20].write = zbank_unused_w;
/* check Backup RAM is currently mapped */
if (m68k.memory_map[0x20].base == sram.sram)
{
/* current cartridge ROM bank mapped to $200000-$20ffff */
m68k.memory_map[0x20].base = cart.rom + (cart.hw.regs[0] << 16);
m68k.memory_map[0x20].read8 = NULL;
m68k.memory_map[0x20].read16 = NULL;
zbank_memory_map[0x20].read = NULL;
m68k.memory_map[0x20].write8 = m68k_unused_8_w;
m68k.memory_map[0x20].write16 = m68k_unused_16_w;
zbank_memory_map[0x20].write = zbank_unused_w;
}
/* S&K lock-on chip */
if (cart.special & HW_LOCK_ON)
{
/* cartridge ROM mapped to $300000-$3fffff */
for (i=0x30; i<0x40; i++)
{
m68k.memory_map[i].base = cart.rom + ((i<<16) & cart.mask);
}
}
}
}
+484 -29
View File
@@ -57,13 +57,18 @@
#define MAPPER_KOREA_16K (0x16)
#define MAPPER_MULTI_2x16K_V1 (0x17)
#define MAPPER_MULTI_2x16K_V2 (0x18)
#define MAPPER_MULTI_32K_16K (0x19)
#define MAPPER_MULTI_16K_32K (0x19)
#define MAPPER_ZEMINA_16K_32K (0x1A)
#define MAPPER_HWASUNG (0x1B)
#define MAPPER_KOREA_8K (0x20)
#define MAPPER_MSX (0x21)
#define MAPPER_MSX_NEMESIS (0x22)
#define MAPPER_MULTI_8K (0x23)
#define MAPPER_MULTI_4x8K (0x24)
#define MAPPER_ZEMINA_4x8K (0x25)
#define MAPPER_MULTI_32K (0x40)
#define MAPPER_MULTI_32K_16K (0x41)
#define MAPPER_HICOM (0x42)
typedef struct
{
@@ -118,31 +123,42 @@ static const rominfo_t game_list[] =
{0x9FA727A0, 0, 0, 0, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 0] [SMS-GG] (US) */
{0xFB481971, 0, 0, 0, MAPPER_KOREA_16K, SYSTEM_GGMS, REGION_USA}, /* Street Hero [Proto 1] [SMS-GG] (US) */
{0xA67F2A5C, 0, 0, 0, MAPPER_MULTI_16K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* 4-Pak All Action (KR) */
{0x98AF0236, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 1) (KR) */
{0x6EBFE1C3, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 2) (KR) */
{0x81A36A4F, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 3) (KR) */
{0x8D2D695D, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 4) (KR) */
{0x82C09B57, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 5) (KR) */
{0x4088EEB4, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 6) (KR) */
{0xFBA94148, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 1) (KR) */
{0x8333C86E, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 2) (KR) */
{0x00E9809F, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 3) (KR) */
{0x98AF0236, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 1) (KR) */
{0x6EBFE1C3, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 2) (KR) */
{0x81A36A4F, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 3) (KR) */
{0x8D2D695D, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 4) (KR) */
{0x82C09B57, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 5) (KR) */
{0x4088EEB4, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 3-in-1 The Best Game Collection (Vol. 6) (KR) */
{0xFBA94148, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 1) (KR) */
{0x8333C86E, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 2) (KR) */
{0x00E9809F, 0, 0, 0, MAPPER_HICOM, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Hi-Com 8-in-1 The Best Game Collection (Vol. 3) (KR) */
{0xBA5EC0E3, 0, 0, 0, MAPPER_MULTI_4x8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* 128 Hap (KR) */
{0x380D7400, 0, 0, 0, MAPPER_MULTI_4x8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Game Mo-eumjip 188 Hap [v0] (KR) */
{0xC76601E0, 0, 0, 0, MAPPER_MULTI_4x8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Game Mo-eumjip 188 Hap [v1] (KR) */
{0x38B3A72F, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Game Chongjiphap 200 (KR).sms */
{0xD3056492, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game 270 Hap ~ Jaemissneun-270 (KR) */
{0xAB07ECD4, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game World 260 Hap (KR) */
{0x0CDE0938, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game World 30 Hap (KR) */
{0x0CDE0938, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game World 30 Hap [v0] (KR) */
{0xE6AD4D4B, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game World 30 Hap [v1] (KR) */
{0xC29BB8CD, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game World 75 Hap (KR) */
{0x660BF6EC, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Multi Game - Super 75 in 1 (KR) */
{0xEB7790DE, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Multi Game - Super 125 in 1 (KR) */
{0xE6AD4D4B, 0, 0, 0, MAPPER_MULTI_8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super World 30 Hap (KR) */
{0xEDB13847, 0, 0, 0, MAPPER_MULTI_2x16K_V1, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game 45 (KR) */
{0xA841C0B7, 0, 0, 0, MAPPER_MULTI_2x16K_V2, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game 52 Hap (KR) */
{0x4E202AA2, 0, 0, 0, MAPPER_MULTI_2x16K_V2, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game 180 (KR) */
{0xBA5D2776, 0, 0, 0, MAPPER_MULTI_2x16K_V2, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game 200 (KR) */
{0xC0AC6956, 0, 0, 0, MAPPER_MULTI_32K_16K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Pigu-Wang 7 Hap - Jaemiiss-neun Game Mo-eumjip (KR) */
{0xF60E71EC, 0, 0, 0, MAPPER_MULTI_16K_32K, SYSTEM_PBC, REGION_JAPAN_NTSC}, /* Jaemiissneun Game Mo-eumjip 42 Hap [SMS-MD] (KR) */
{0x53904167, 0, 0, 0, MAPPER_MULTI_16K_32K, SYSTEM_PBC, REGION_JAPAN_NTSC}, /* Jaemiissneun Game Mo-eumjip 65 Hap [SMS-MD] (KR)/ */
{0x7F667485, 0, 0, 0, MAPPER_MULTI_16K_32K, SYSTEM_PBC, REGION_JAPAN_NTSC}, /* Mega Mode Super Game 138 [SMS-MD] (KR) */
{0xC0AC6956, 0, 0, 0, MAPPER_MULTI_16K_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Pigu-Wang 7 Hap - Jaemiiss-neun Game Mo-eumjip (KR) */
{0x4342DB9D, 0, 0, 0, MAPPER_MULTI_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* 11 Hap Gam-Boy (KR) */
{0x1B8956D1, 0, 0, 0, MAPPER_MULTI_32K_16K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game 150 (KR) */
{0xD9EF7D69, 0, 0, 0, MAPPER_MULTI_32K_16K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Super Game 270 (KR) */
{0xE6C9C046, 0, 0, 0, MAPPER_ZEMINA_4x8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Zemina Best 25 (KR) */
{0xD8169FE2, 0, 0, 0, MAPPER_ZEMINA_4x8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Zemina Best 39 (KR) */
{0x3C339D9E, 0, 0, 0, MAPPER_ZEMINA_4x8K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Zemina Best 88 (KR) */
{0x7CD51467, 0, 0, 0, MAPPER_ZEMINA_16K_32K, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* Zemina 4-in-1 (Q-Bert, Sports 3, Gulkave, Pooyan) (KR) */
{0x1B3E032E, 0, 0, 0, MAPPER_HWASUNG, SYSTEM_SMS, REGION_JAPAN_NTSC}, /* 2 Hap in 1 (Moai-ui bomul, David-2) (KR) */
/* games using Codemaster mapper */
{0x29822980, 0, 0, 0, MAPPER_CODIES, SYSTEM_SMS2, REGION_EUROPE}, /* Cosmic Spacehead */
@@ -453,10 +469,15 @@ static void write_mapper_msx(unsigned int address, unsigned char data);
static void write_mapper_multi_16k(unsigned int address, unsigned char data);
static void write_mapper_multi_2x16k_v1(unsigned int address, unsigned char data);
static void write_mapper_multi_2x16k_v2(unsigned int address, unsigned char data);
static void write_mapper_multi_32k_16k(unsigned int address, unsigned char data);
static void write_mapper_multi_16k_32k(unsigned int address, unsigned char data);
static void write_mapper_multi_32k(unsigned int address, unsigned char data);
static void write_mapper_multi_32k_16k(unsigned int address, unsigned char data);
static void write_mapper_hicom(unsigned int address, unsigned char data);
static void write_mapper_multi_8k(unsigned int address, unsigned char data);
static void write_mapper_multi_4x8k(unsigned int address, unsigned char data);
static void write_mapper_zemina_4x8k(unsigned int address, unsigned char data);
static void write_mapper_zemina_16k_32k(unsigned int address, unsigned char data);
static void write_mapper_hwasung(unsigned int address, unsigned char data);
static void write_mapper_93c46(unsigned int address, unsigned char data);
static void write_mapper_terebi(unsigned int address, unsigned char data);
static unsigned char read_mapper_93c46(unsigned int address);
@@ -641,6 +662,20 @@ void sms_cart_reset(void)
cart_rom.fcr[3] = 2;
break;
case MAPPER_ZEMINA_16K_32K:
cart_rom.fcr[0] = 0;
cart_rom.fcr[1] = 0;
cart_rom.fcr[2] = 1;
cart_rom.fcr[3] = 1;
break;
case MAPPER_ZEMINA_4x8K:
cart_rom.fcr[0] = 3;
cart_rom.fcr[1] = 2;
cart_rom.fcr[2] = 1;
cart_rom.fcr[3] = 0;
break;
case MAPPER_KOREA_8K:
case MAPPER_MSX:
case MAPPER_MSX_NEMESIS:
@@ -881,6 +916,20 @@ int sms_cart_context_load(uint8 *state)
cart_rom.fcr[3] = 2;
break;
case MAPPER_ZEMINA_16K_32K:
cart_rom.fcr[0] = 0;
cart_rom.fcr[1] = 0;
cart_rom.fcr[2] = 1;
cart_rom.fcr[3] = 1;
break;
case MAPPER_ZEMINA_4x8K:
cart_rom.fcr[0] = 3;
cart_rom.fcr[1] = 2;
cart_rom.fcr[2] = 1;
cart_rom.fcr[3] = 0;
break;
case MAPPER_KOREA_8K:
case MAPPER_MSX:
case MAPPER_MSX_NEMESIS:
@@ -1059,7 +1108,7 @@ static void mapper_reset(void)
/* "Nemesis" mapper specific */
if (slot.mapper == MAPPER_MSX_NEMESIS)
{
/* first 8KB page ($0000-$1FFF) is mapped to last 8KB ROM bank */
/* first 8KB bank ($0000-$1FFF) is mapped to last 8KB cartridge ROM page */
for (i = 0x00; i < 0x08; i++)
{
z80_readmap[i] = &slot.rom[(0x0f << 13) | ((i & 0x07) << 10)];
@@ -1079,7 +1128,7 @@ static void mapper_reset(void)
mapper_16k_w(1,slot.fcr[1]);
mapper_16k_w(2,slot.fcr[2]);
}
else if (slot.mapper == MAPPER_MULTI_32K_16K)
else if (slot.mapper == MAPPER_MULTI_16K_32K)
{
mapper_16k_w(1,slot.fcr[1]);
mapper_16k_w(2,slot.fcr[2]);
@@ -1145,9 +1194,9 @@ static void mapper_reset(void)
z80_writemem = write_mapper_multi_2x16k_v2;
break;
case MAPPER_MULTI_32K_16K:
case MAPPER_MULTI_16K_32K:
z80_readmem = read_mapper_default;
z80_writemem = write_mapper_multi_32k_16k;
z80_writemem = write_mapper_multi_16k_32k;
break;
case MAPPER_MULTI_32K:
@@ -1155,6 +1204,16 @@ static void mapper_reset(void)
z80_writemem = write_mapper_multi_32k;
break;
case MAPPER_MULTI_32K_16K:
z80_readmem = read_mapper_default;
z80_writemem = write_mapper_multi_32k_16k;
break;
case MAPPER_HICOM:
z80_readmem = read_mapper_default;
z80_writemem = write_mapper_hicom;
break;
case MAPPER_MULTI_8K:
z80_readmem = read_mapper_default;
z80_writemem = write_mapper_multi_8k;
@@ -1165,6 +1224,21 @@ static void mapper_reset(void)
z80_writemem = write_mapper_multi_4x8k;
break;
case MAPPER_ZEMINA_4x8K:
z80_readmem = read_mapper_default;
z80_writemem = write_mapper_zemina_4x8k;
break;
case MAPPER_ZEMINA_16K_32K:
z80_readmem = read_mapper_default;
z80_writemem = write_mapper_zemina_16k_32k;
break;
case MAPPER_HWASUNG:
z80_readmem = read_mapper_default;
z80_writemem = write_mapper_hwasung;
break;
case MAPPER_93C46:
z80_readmem = read_mapper_93c46;
z80_writemem = write_mapper_93c46;
@@ -1201,6 +1275,27 @@ static void mapper_8k_w(int offset, unsigned char data)
{
z80_readmap[i] = &page[(i & 0x07) << 10];
}
/* Multi Korean mapper specific */
if (slot.mapper == MAPPER_ZEMINA_4x8K)
{
if (data & 0x80)
{
/* $0000-$1FFF is mirror of $8000-$9FFF */
for (i = 0x00; i < 0x08; i++)
{
z80_readmap[i] = z80_readmap[0x20 + i];
}
}
else
{
/* $2000-$3FFF is mapped to cartridge ROM page #60 */
for (i = 0x00; i < 0x08; i++)
{
z80_readmap[i] = &slot.rom[(0x3C % slot.pages) << 13] + ((i & 0x07) << 10);
}
}
}
break;
}
@@ -1220,6 +1315,25 @@ static void mapper_8k_w(int offset, unsigned char data)
z80_readmap[i] = z80_readmap[0x20 + i];
}
}
else if (slot.mapper == MAPPER_ZEMINA_4x8K)
{
if (data & 0x80)
{
/* $2000-$3FFF is mirror of $A000-$BFFF */
for (i = 0x08; i < 0x10; i++)
{
z80_readmap[i] = z80_readmap[0x20 + i];
}
}
else
{
/* $2000-$3FFF is mapped to cartridge ROM page #60 */
for (i = 0x08; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[(0x3C % slot.pages) << 13] + ((i & 0x07) << 10);
}
}
}
break;
}
@@ -1420,7 +1534,7 @@ static void mapper_16k_w(int offset, unsigned char data)
case 3: /* cartridge ROM bank (16KB) at $8000-$BFFF */
{
/* check that external RAM (16KB) is not mapped at $8000-$BFFF (SEGA mapper only) */
if ((slot.fcr[0] & 0x08) && (slot.mapper != MAPPER_MULTI_32K_16K)) break;
if ((slot.fcr[0] & 0x08) && (slot.mapper != MAPPER_MULTI_16K_32K)) break;
/* first 8KB */
for (i = 0x20; i < 0x28; i++)
@@ -1456,16 +1570,261 @@ static void mapper_32k_w(unsigned char data)
/* Save frame control register data */
slot.fcr[0] = data;
/* selected page (32KB) is mapped at $0000-$7FFF */
for (i = 0x00; i < 0x20; i++)
/* Multi 32K/16K mapper specific */
if (slot.mapper == MAPPER_MULTI_32K_16K)
{
z80_readmap[i] = &page[i << 10];
}
/* mapper mode */
switch (slot.fcr[1] & 0x0F)
{
case 0x0:
{
/* lower 16K of selected 32K page is mapped in $0000-$3FFF (mirrored in $4000-$7FFF) */
for (i = 0x00; i < 0x20; i++)
{
z80_readmap[i] = &page[(i & 0xF) << 10];
}
/* first 16KB is mirrored at $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
/* upper 8K of latest 32K page is mirrored in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &slot.rom[0x1FE000 + ((i & 0x7) << 10)];
}
break;
}
case 0x1:
{
/* upper 16K of selected 32K page is mapped in $0000-$3FFF (mirrored in $4000-$7FFF) */
for (i = 0x00; i < 0x20; i++)
{
z80_readmap[i] = &page[(0x10 + (i & 0xF)) << 10];
}
/* upper 8K of latest 32K page is mirrored in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &slot.rom[0x1FE000 + ((i & 0x7) << 10)];
}
break;
}
case 0x2:
case 0x3:
{
/* selected 32K page is mapped in $0000-$7FFF */
for (i = 0x00; i < 0x20; i++)
{
z80_readmap[i] = &page[i << 10];
}
/* upper 8K of latest 32K page is mirrored in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &slot.rom[0x1FE000 + ((i & 0x7) << 10)];
}
break;
}
case 0x4:
{
/* lower 16K of middle 32K page (MSX BIOS) is mapped in $0000-$3FFF */
for (i = 0x00; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[0x100000 + ((i & 0xF) << 10)];
}
/* lower 16K of selected 32K page is mapped in $4000-$7FFF */
for (i = 0x10; i < 0x20; i++)
{
z80_readmap[i] = &page[(i & 0xF) << 10];
}
/* upper 8K of latest 32K page is mirrored in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &slot.rom[0x1FE000 + ((i & 0x7) << 10)];
}
break;
}
case 0x5:
{
/* lower 16K of middle 32K page (MSX BIOS) is mapped in $0000-$3FFF */
for (i = 0x00; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[0x100000 + ((i & 0xF) << 10)];
}
/* upper 16K of selected 32K page is mapped in $4000-$7FFF */
for (i = 0x10; i < 0x20; i++)
{
z80_readmap[i] = &page[(0x10 + (i & 0xF)) << 10];
}
/* upper 8K of latest 32K page is mirrored in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &slot.rom[0x1FE000 + ((i & 0x7) << 10)];
}
break;
}
case 0x6:
{
/* lower 16K of middle 32K page (MSX BIOS) is mapped in $0000-$3FFF */
for (i = 0x00; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[0x100000 + ((i & 0xF) << 10)];
}
/* upper 16K of latest 32K page is mapped in $4000-$7FFF */
for (i = 0x10; i < 0x20; i++)
{
z80_readmap[i] = &slot.rom[0x1FC000 + ((i & 0xF) << 10)];
}
/* lower 16K of selected 32K page is mapped in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &page[(i & 0xF) << 10];
}
break;
}
case 0x7:
{
/* lower 16K of middle 32K page (MSX BIOS) is mapped in $0000-$3FFF */
for (i = 0x00; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[0x100000 + ((i & 0xF) << 10)];
}
/* upper 16K of latest 32K page is mapped in $4000-$7FFF */
for (i = 0x10; i < 0x20; i++)
{
z80_readmap[i] = &slot.rom[0x1FC000 + ((i & 0xF) << 10)];
}
/* upper 16K of selected 32K page is mapped in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &page[(0x10 + (i & 0xF)) << 10];
}
break;
}
case 0x8:
{
/* lower 16K of middle 32K page (MSX BIOS) is mapped in $0000-$3FFF */
for (i = 0x00; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[0x100000 + ((i & 0xF) << 10)];
}
/* lower 16K of selected 32K page is mapped in $4000-$7FFF */
for (i = 0x10; i < 0x20; i++)
{
z80_readmap[i] = &page[(i & 0xF) << 10];
}
/* lower 16K of selected 32K page (8K permuted) is mapped in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = z80_readmap[(i ^ 0x8) - 0x10];
}
break;
}
case 0x9:
{
/* lower 16K of middle 32K page (MSX BIOS) is mapped in $0000-$3FFF */
for (i = 0x00; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[0x100000 + ((i & 0xF) << 10)];
}
/* upper 16K of selected 32K page is mapped in $4000-$7FFF */
for (i = 0x10; i < 0x20; i++)
{
z80_readmap[i] = &page[(0x10 + (i & 0xF)) << 10];
}
/* upper 16K of selected 32K page (8K permuted) is mapped in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = z80_readmap[(i ^ 0x8) - 0x10];
}
break;
}
case 0xA:
{
/* lower 16K of middle 32K page (MSX BIOS) is mapped in $0000-$3FFF */
for (i = 0x00; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[0x100000 + ((i & 0xF) << 10)];
}
/* lower 16K of selected 32K page is mapped in $4000-$7FFF */
for (i = 0x10; i < 0x20; i++)
{
z80_readmap[i] = &page[(i & 0xF) << 10];
}
/* upper 16K of selected 32K page is mapped in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &page[(0x10 + (i & 0xF)) << 10];
}
break;
}
case 0xB:
{
/* lower 16K of middle 32K page (MSX BIOS) is mapped in $0000-$3FFF */
for (i = 0x00; i < 0x10; i++)
{
z80_readmap[i] = &slot.rom[0x100000 + ((i & 0xF) << 10)];
}
/* upper 16K of selected 32K page is mapped in $4000-$7FFF */
for (i = 0x10; i < 0x20; i++)
{
z80_readmap[i] = &page[(0x10 + (i & 0xF)) << 10];
}
/* lower 16K of selected 32K page is mapped in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = &page[(i & 0xF) << 10];
}
break;
}
default:
{
/* upper 8K of latest 32K page is mirrored in $0000-$BFFF */
for (i = 0x00; i < 0x30; i++)
{
z80_readmap[i] = &slot.rom[0x1FE000 + ((i & 0x7) << 10)];
}
break;
}
}
}
else
{
z80_readmap[i] = z80_readmap[i & 0x0F];
/* selected 32K page is mapped at $0000-$7FFF */
for (i = 0x00; i < 0x20; i++)
{
z80_readmap[i] = &page[i << 10];
}
/* lower 16K of selected 32K page is mirrored in $8000-$BFFF */
for (i = 0x20; i < 0x30; i++)
{
z80_readmap[i] = z80_readmap[i & 0x0F];
}
}
#ifdef CHEATS_UPDATE
@@ -1597,7 +1956,7 @@ static void write_mapper_multi_2x16k_v2(unsigned int address, unsigned char data
z80_writemap[address >> 10][address & 0x03FF] = data;
}
static void write_mapper_multi_32k_16k(unsigned int address, unsigned char data)
static void write_mapper_multi_16k_32k(unsigned int address, unsigned char data)
{
z80_writemap[address >> 10][address & 0x03FF] = data;
@@ -1624,6 +1983,41 @@ static void write_mapper_multi_32k_16k(unsigned int address, unsigned char data)
}
static void write_mapper_multi_32k(unsigned int address, unsigned char data)
{
if (address == 0x2000)
{
mapper_32k_w(data);
return;
}
z80_writemap[address >> 10][address & 0x03FF] = data;
}
static void write_mapper_multi_32k_16k(unsigned int address, unsigned char data)
{
if (address == 0xFFF3)
{
/* mapper mode (saved to unused register) */
slot.fcr[1] = (slot.fcr[1] & 0x0E) | (data & 0x01);
/* 32K bank index (0-63) */
data = (slot.fcr[0] & 0x20) | ((data & 0x3E) >> 1);
mapper_32k_w(data);
}
else if (address == 0xFFFC)
{
/* mapper mode (saved to unused register) */
slot.fcr[1] = ((data & 0xE0) >> 4) | (slot.fcr[1] & 0x01);
/* 32K bank index (0-63) */
data = ((data & 0x10) << 1) | (slot.fcr[0] & 0x1F);
mapper_32k_w(data);
}
z80_writemap[address >> 10][address & 0x03FF] = data;
}
static void write_mapper_hicom(unsigned int address, unsigned char data)
{
if (address == 0xFFFF)
{
@@ -1635,6 +2029,10 @@ static void write_mapper_multi_32k(unsigned int address, unsigned char data)
static void write_mapper_multi_8k(unsigned int address, unsigned char data)
{
z80_writemap[address >> 10][address & 0x03FF] = data;
address &= 0xFF00;
if (address == 0x0000)
{
mapper_8k_w(0,data);
@@ -1658,8 +2056,6 @@ static void write_mapper_multi_8k(unsigned int address, unsigned char data)
mapper_8k_w(3,data);
return;
}
z80_writemap[address >> 10][address & 0x03FF] = data;
}
static void write_mapper_multi_4x8k(unsigned int address, unsigned char data)
@@ -1676,6 +2072,65 @@ static void write_mapper_multi_4x8k(unsigned int address, unsigned char data)
z80_writemap[address >> 10][address & 0x03FF] = data;
}
static void write_mapper_zemina_4x8k(unsigned int address, unsigned char data)
{
if (address == 0x8000)
{
if (slot.fcr[3] == 0xff)
data ^= 0x22;
mapper_8k_w(2,data ^ 0x01);
mapper_8k_w(3,data);
mapper_8k_w(0,data ^ 0x03);
mapper_8k_w(1,data ^ 0x02);
return;
}
z80_writemap[address >> 10][address & 0x03FF] = data;
}
static void write_mapper_zemina_16k_32k(unsigned int address, unsigned char data)
{
if (address == 0x0000)
{
data = ((data ^ 0xF0) & 0xF0) >> 3;
if (data == 0x00)
{
mapper_16k_w(2,0x01);
mapper_16k_w(3,0x01);
}
else
{
mapper_16k_w(2,data);
mapper_16k_w(3,data+1);
}
return;
}
z80_writemap[address >> 10][address & 0x03FF] = data;
}
static void write_mapper_hwasung(unsigned int address, unsigned char data)
{
if (address == 0x2000)
{
if (data & 0x01)
{
mapper_16k_w(2,3);
mapper_16k_w(3,4);
}
else
{
mapper_16k_w(2,1);
mapper_16k_w(3,2);
}
return;
}
z80_writemap[address >> 10][address & 0x03FF] = data;
}
static void write_mapper_korea(unsigned int address, unsigned char data)
{
if (address == 0xA000)
+37 -19
View File
@@ -3,7 +3,7 @@
* Main 68k bus handlers
*
* Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2022 Eke-Eke (Genesis Plus GX)
* Copyright (C) 2007-2023 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@@ -696,29 +696,40 @@ void ctrl_io_write_byte(unsigned int address, unsigned int data)
/* RESET bit */
if (data & 0x01)
{
/* trigger reset on 0->1 transition */
/* SUB-CPU reset is triggered on /RESET input 0->1 transition */
if (!(scd.regs[0x00].byte.l & 0x01))
{
/* reset SUB-CPU */
s68k_pulse_reset();
}
/* BUSREQ bit */
if (data & 0x02)
{
/* SUB-CPU bus requested */
/* SUB-CPU is halted (/HALT input is asserted) */
s68k_pulse_halt();
}
else
{
/* SUB-CPU bus released */
/* SUB-CPU is running (/HALT input is released) */
s68k_clear_halt();
}
/* update BUSREQ and RESET bits */
scd.regs[0x00].byte.l = data & 0x03;
}
else
{
/* SUB-CPU is halted while !RESET is asserted */
/* SUB-CPU is halted (/HALT and /RESET inputs are asserted) */
s68k_pulse_halt();
/* RESET bit is cleared and BUSREQ bit is set to 1 (verified on real hardware) */
scd.regs[0x00].byte.l = 0x02;
}
/* BUSREQ bit remains set to 0 if SUB-CPU is halted while stopped (verified on real hardware) */
if (s68k.stopped & 0x01)
{
scd.regs[0x00].byte.l &= ~0x02;
}
/* check if SUB-CPU halt status has changed */
@@ -727,8 +738,8 @@ void ctrl_io_write_byte(unsigned int address, unsigned int data)
/* PRG-RAM (128KB bank) is normally mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */
unsigned int base = scd.cartridge.boot + 0x02;
/* PRG-RAM can only be accessed from MAIN 68K & Z80 when SUB-CPU is halted (Dungeon Explorer USA version) */
if ((data & 0x03) != 0x01)
/* PRG-RAM can only be accessed from MAIN-CPU & Z80 when BUSREQ bit is set (Dungeon Explorer USA version) */
if (scd.regs[0x00].byte.l & 0x02)
{
m68k.memory_map[base].read8 = m68k.memory_map[base+1].read8 = NULL;
m68k.memory_map[base].read16 = m68k.memory_map[base+1].read16 = NULL;
@@ -748,7 +759,6 @@ void ctrl_io_write_byte(unsigned int address, unsigned int data)
}
}
scd.regs[0x00].byte.l = data;
return;
}
@@ -934,29 +944,40 @@ void ctrl_io_write_word(unsigned int address, unsigned int data)
/* RESET bit */
if (data & 0x01)
{
/* trigger reset on 0->1 transition */
/* SUB-CPU reset is triggered on /RESET input 0->1 transition */
if (!(scd.regs[0x00].byte.l & 0x01))
{
/* reset SUB-CPU */
s68k_pulse_reset();
}
/* BUSREQ bit */
if (data & 0x02)
{
/* SUB-CPU bus requested */
/* SUB-CPU is halted (/HALT input is asserted) */
s68k_pulse_halt();
}
else
{
/* SUB-CPU bus released */
/* SUB-CPU is running (/HALT input is released) */
s68k_clear_halt();
}
/* update BUSREQ and RESET bits */
scd.regs[0x00].byte.l = data & 0x03;
}
else
{
/* SUB-CPU is halted while !RESET is asserted */
/* SUB-CPU is halted (/HALT and /RESET inputs are asserted) */
s68k_pulse_halt();
/* RESET bit is cleared and BUSREQ bit is set to 1 (verified on real hardware) */
scd.regs[0x00].byte.l = 0x02;
}
/* BUSREQ bit remains set to 0 if SUB-CPU is halted while stopped (verified on real hardware) */
if (s68k.stopped & 0x01)
{
scd.regs[0x00].byte.l &= ~0x02;
}
/* check if SUB-CPU halt status has changed */
@@ -965,8 +986,8 @@ void ctrl_io_write_word(unsigned int address, unsigned int data)
/* PRG-RAM (128KB bank) is normally mapped to $020000-$03FFFF (resp. $420000-$43FFFF) */
unsigned int base = scd.cartridge.boot + 0x02;
/* PRG-RAM can only be accessed from MAIN 68K & Z80 when SUB-CPU is halted (Dungeon Explorer USA version) */
if ((data & 0x03) != 0x01)
/* PRG-RAM can only be accessed from MAIN-CPU & Z80 when BUSREQ bit is set (Dungeon Explorer USA version) */
if (scd.regs[0x00].byte.l & 0x02)
{
m68k.memory_map[base].read8 = m68k.memory_map[base+1].read8 = NULL;
m68k.memory_map[base].read16 = m68k.memory_map[base+1].read16 = NULL;
@@ -1002,9 +1023,6 @@ void ctrl_io_write_word(unsigned int address, unsigned int data)
s68k_update_irq((scd.pending & scd.regs[0x32>>1].byte.l) >> 1);
}
}
/* update LSB only */
scd.regs[0x00].byte.l = data & 0xff;
return;
}
+1 -1
View File
@@ -3,7 +3,7 @@
* Main 68k bus handlers
*
* Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2022 Eke-Eke (Genesis Plus GX)
* Copyright (C) 2007-2023 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: