From 312abbed4eb23647557b40c2e20549ad7caf2e6b Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Thu, 7 Feb 2013 20:41:05 +0000 Subject: [PATCH] (MESS) gb.c: many updates to cart handling [Fabio Priuli] - updated carts to be slot devices - simplified loading and bankswitch mechanism - fixed MMM01 emulation - removed need for "mapper" feature from xml softlist, since the new "slot" feature is enough --- .gitattributes | 6 + hash/gameboy.xml | 1515 +++++++++++++++++++++++++++++++++++- hash/gbcolor.xml | 1501 +++++++++++++++++++++++++++++++++++ src/mess/drivers/gb.c | 212 +++-- src/mess/includes/gb.h | 141 ++-- src/mess/machine/gb.c | 1264 +----------------------------- src/mess/machine/gb_mbc.c | 692 ++++++++++++++++ src/mess/machine/gb_mbc.h | 187 +++++ src/mess/machine/gb_rom.c | 369 +++++++++ src/mess/machine/gb_rom.h | 143 ++++ src/mess/machine/gb_slot.c | 771 ++++++++++++++++++ src/mess/machine/gb_slot.h | 195 +++++ src/mess/mess.mak | 15 +- src/mess/video/gb.c | 2 +- 14 files changed, 5629 insertions(+), 1384 deletions(-) create mode 100644 src/mess/machine/gb_mbc.c create mode 100644 src/mess/machine/gb_mbc.h create mode 100644 src/mess/machine/gb_rom.c create mode 100644 src/mess/machine/gb_rom.h create mode 100644 src/mess/machine/gb_slot.c create mode 100644 src/mess/machine/gb_slot.h diff --git a/.gitattributes b/.gitattributes index 082928804c8..aafbfec8412 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7124,6 +7124,12 @@ src/mess/machine/galaxy.c svneol=native#text/plain src/mess/machine/gamecom.c svneol=native#text/plain src/mess/machine/gamepock.c svneol=native#text/plain src/mess/machine/gb.c svneol=native#text/plain +src/mess/machine/gb_mbc.c svneol=native#text/plain +src/mess/machine/gb_mbc.h svneol=native#text/plain +src/mess/machine/gb_rom.c svneol=native#text/plain +src/mess/machine/gb_rom.h svneol=native#text/plain +src/mess/machine/gb_slot.c svneol=native#text/plain +src/mess/machine/gb_slot.h svneol=native#text/plain src/mess/machine/genpc.c svneol=native#text/plain src/mess/machine/hd63450.c svneol=native#text/plain src/mess/machine/hd63450.h svneol=native#text/plain diff --git a/hash/gameboy.xml b/hash/gameboy.xml index 8488bf4aaec..b386d9656eb 100644 --- a/hash/gameboy.xml +++ b/hash/gameboy.xml @@ -24,6 +24,7 @@ + @@ -39,6 +40,7 @@ + @@ -55,6 +57,7 @@ + @@ -68,6 +71,7 @@ + @@ -81,6 +85,7 @@ + @@ -94,6 +99,7 @@ + @@ -109,6 +115,7 @@ + @@ -122,6 +129,7 @@ + @@ -135,6 +143,7 @@ + @@ -149,6 +158,7 @@ + @@ -163,6 +173,7 @@ + @@ -176,6 +187,7 @@ + @@ -188,6 +200,7 @@ Nintendo + @@ -202,6 +215,7 @@ + @@ -216,6 +230,7 @@ + @@ -228,6 +243,7 @@ Infogrames + @@ -243,6 +259,7 @@ + @@ -256,6 +273,7 @@ + @@ -271,6 +289,7 @@ + @@ -284,6 +303,7 @@ + @@ -299,6 +319,7 @@ + @@ -315,6 +336,7 @@ + @@ -331,6 +353,7 @@ + @@ -349,6 +372,7 @@ + @@ -363,6 +387,7 @@ + @@ -377,6 +402,7 @@ + @@ -390,6 +416,7 @@ + @@ -406,6 +433,7 @@ + @@ -419,6 +447,7 @@ + @@ -432,6 +461,7 @@ + @@ -447,6 +477,7 @@ + @@ -460,6 +491,7 @@ + @@ -473,6 +505,7 @@ + @@ -488,6 +521,7 @@ + @@ -502,6 +536,7 @@ + @@ -529,6 +564,7 @@ Hi Tech Expressions + @@ -544,6 +580,7 @@ + @@ -557,6 +594,7 @@ + @@ -570,6 +608,7 @@ + @@ -583,6 +622,7 @@ + @@ -596,6 +636,7 @@ + @@ -609,6 +650,7 @@ + @@ -622,6 +664,7 @@ + @@ -637,6 +680,7 @@ + @@ -652,6 +696,7 @@ + @@ -667,6 +712,7 @@ + @@ -682,6 +728,7 @@ + @@ -698,6 +745,7 @@ + @@ -716,6 +764,7 @@ + @@ -732,6 +781,7 @@ + @@ -746,6 +796,7 @@ + @@ -762,6 +813,7 @@ + @@ -780,6 +832,7 @@ + @@ -794,6 +847,7 @@ + @@ -808,6 +862,7 @@ + @@ -822,6 +877,7 @@ + @@ -836,6 +892,7 @@ + @@ -850,6 +907,7 @@ + @@ -864,6 +922,7 @@ + @@ -880,6 +939,7 @@ + @@ -897,6 +957,7 @@ + @@ -914,6 +975,7 @@ + @@ -931,6 +993,7 @@ + @@ -972,6 +1035,7 @@ + @@ -999,6 +1063,7 @@ + @@ -1012,6 +1077,7 @@ + @@ -1027,6 +1093,7 @@ + @@ -1040,6 +1107,7 @@ + @@ -1053,6 +1121,7 @@ + @@ -1068,6 +1137,7 @@ + @@ -1082,6 +1152,7 @@ + @@ -1095,6 +1166,7 @@ Hudson Soft + @@ -1108,6 +1180,7 @@ + @@ -1124,6 +1197,7 @@ + @@ -1141,6 +1215,7 @@ + @@ -1159,6 +1234,7 @@ + @@ -1177,6 +1253,7 @@ + @@ -1194,6 +1271,7 @@ + @@ -1207,6 +1285,7 @@ + @@ -1220,6 +1299,7 @@ + @@ -1235,6 +1315,7 @@ + @@ -1248,6 +1329,7 @@ + @@ -1275,6 +1357,7 @@ + @@ -1290,6 +1373,7 @@ + @@ -1305,6 +1389,7 @@ + @@ -1318,6 +1403,7 @@ + @@ -1333,6 +1419,7 @@ + @@ -1346,6 +1433,7 @@ + @@ -1361,6 +1449,7 @@ + @@ -1374,6 +1463,7 @@ + @@ -1389,6 +1479,7 @@ + @@ -1402,6 +1493,7 @@ + @@ -1415,6 +1507,7 @@ + @@ -1430,6 +1523,7 @@ + @@ -1444,6 +1538,7 @@ + @@ -1458,6 +1553,7 @@ + @@ -1485,6 +1581,7 @@ + @@ -1500,6 +1597,7 @@ + @@ -1515,6 +1613,7 @@ + @@ -1532,6 +1631,7 @@ + @@ -1545,6 +1645,7 @@ + @@ -1560,6 +1661,7 @@ + @@ -1576,6 +1678,7 @@ + @@ -1589,6 +1692,7 @@ + @@ -1604,6 +1708,7 @@ + @@ -1631,6 +1736,7 @@ + @@ -1644,6 +1750,7 @@ + @@ -1659,6 +1766,7 @@ + @@ -1671,6 +1779,7 @@ Sony Imagesoft + @@ -1684,6 +1793,7 @@ + @@ -1697,6 +1807,7 @@ + @@ -1710,6 +1821,7 @@ + @@ -1723,6 +1835,7 @@ + @@ -1748,6 +1861,7 @@ + @@ -1761,6 +1875,7 @@ + @@ -1774,6 +1889,7 @@ + @@ -1789,6 +1905,7 @@ + @@ -1802,6 +1919,7 @@ + @@ -1815,6 +1933,7 @@ + @@ -1828,6 +1947,7 @@ + @@ -1841,6 +1961,7 @@ + @@ -1857,6 +1978,7 @@ + @@ -1870,6 +1992,7 @@ + @@ -1885,6 +2008,7 @@ + @@ -1900,6 +2024,7 @@ + @@ -1913,6 +2038,7 @@ + @@ -1926,6 +2052,7 @@ + @@ -1939,6 +2066,7 @@ + @@ -1952,6 +2080,7 @@ + @@ -1965,6 +2094,7 @@ + @@ -1981,6 +2111,7 @@ + @@ -1996,6 +2127,7 @@ + @@ -2009,6 +2141,7 @@ + @@ -2022,6 +2155,7 @@ + @@ -2035,6 +2169,7 @@ + @@ -2048,6 +2183,7 @@ + @@ -2064,6 +2200,7 @@ + @@ -2082,6 +2219,7 @@ + @@ -2111,6 +2249,7 @@ + @@ -2126,6 +2265,7 @@ + @@ -2142,6 +2282,7 @@ + @@ -2156,6 +2297,7 @@ + @@ -2172,6 +2314,7 @@ + @@ -2188,6 +2331,7 @@ + @@ -2204,6 +2348,7 @@ + @@ -2217,6 +2362,7 @@ + @@ -2231,6 +2377,7 @@ + @@ -2246,6 +2393,7 @@ + @@ -2259,6 +2407,7 @@ + @@ -2286,6 +2435,7 @@ + @@ -2301,6 +2451,7 @@ + @@ -2316,6 +2467,7 @@ + @@ -2354,6 +2506,7 @@ + @@ -2368,6 +2521,7 @@ + @@ -2382,6 +2536,7 @@ + @@ -2397,6 +2552,7 @@ + @@ -2411,6 +2567,7 @@ + @@ -2448,6 +2605,7 @@ + @@ -2461,6 +2619,7 @@ + @@ -2474,6 +2633,7 @@ + @@ -2489,6 +2649,7 @@ + @@ -2505,6 +2666,7 @@ + @@ -2518,6 +2680,7 @@ + @@ -2558,6 +2721,7 @@ + @@ -2572,6 +2736,7 @@ + @@ -2588,6 +2753,7 @@ + @@ -2604,6 +2770,7 @@ + @@ -2617,6 +2784,7 @@ + @@ -2630,6 +2798,7 @@ + @@ -2643,6 +2812,7 @@ + @@ -2658,6 +2828,7 @@ + @@ -2673,6 +2844,7 @@ + @@ -2688,6 +2860,7 @@ + @@ -2701,6 +2874,7 @@ + @@ -2714,6 +2888,7 @@ + @@ -2727,6 +2902,7 @@ + @@ -2742,6 +2918,7 @@ + @@ -2757,6 +2934,7 @@ + @@ -2770,6 +2948,7 @@ + @@ -2785,6 +2964,7 @@ + @@ -2798,6 +2978,7 @@ + @@ -2811,6 +2992,7 @@ + @@ -2826,6 +3008,7 @@ + @@ -2839,6 +3022,7 @@ + @@ -2855,6 +3039,7 @@ + @@ -2870,6 +3055,7 @@ + @@ -2885,6 +3071,7 @@ + @@ -2898,6 +3085,7 @@ + @@ -2911,6 +3099,7 @@ + @@ -2924,6 +3113,7 @@ + @@ -2961,6 +3151,7 @@ + @@ -2974,6 +3165,7 @@ + @@ -2987,6 +3179,7 @@ + @@ -3000,6 +3193,7 @@ + @@ -3014,6 +3208,7 @@ + @@ -3041,6 +3236,7 @@ + @@ -3056,6 +3252,7 @@ + @@ -3083,6 +3280,7 @@ + @@ -3099,6 +3297,7 @@ + @@ -3114,6 +3313,7 @@ + @@ -3127,6 +3327,7 @@ + @@ -3140,6 +3341,7 @@ + @@ -3153,6 +3355,7 @@ + @@ -3168,6 +3371,7 @@ + @@ -3181,6 +3385,7 @@ + @@ -3194,6 +3399,7 @@ + @@ -3210,6 +3416,7 @@ + @@ -3225,6 +3432,7 @@ + @@ -3240,6 +3448,7 @@ + @@ -3255,6 +3464,7 @@ + @@ -3271,6 +3481,7 @@ + @@ -3286,6 +3497,7 @@ + @@ -3316,6 +3528,7 @@ + @@ -3329,6 +3542,7 @@ + @@ -3342,6 +3556,7 @@ + @@ -3355,6 +3570,7 @@ + @@ -3368,6 +3584,7 @@ + @@ -3386,6 +3603,7 @@ + @@ -3404,6 +3622,7 @@ + @@ -3422,6 +3641,7 @@ + @@ -3435,6 +3655,7 @@ + @@ -3448,6 +3669,7 @@ + @@ -3464,6 +3686,7 @@ + @@ -3477,6 +3700,7 @@ + @@ -3492,6 +3716,7 @@ + @@ -3506,6 +3731,7 @@ + @@ -3522,6 +3748,7 @@ + @@ -3547,6 +3774,7 @@ + @@ -3560,6 +3788,7 @@ + @@ -3573,6 +3802,7 @@ + @@ -3586,6 +3816,7 @@ + @@ -3599,6 +3830,7 @@ + @@ -3614,6 +3846,7 @@ + @@ -3627,6 +3860,7 @@ + @@ -3643,6 +3877,7 @@ + @@ -3658,6 +3893,7 @@ + @@ -3673,6 +3909,7 @@ + @@ -3688,6 +3925,7 @@ + @@ -3704,6 +3942,7 @@ + @@ -3731,6 +3970,7 @@ + @@ -3746,6 +3986,7 @@ + @@ -3759,6 +4000,7 @@ + @@ -3772,6 +4014,7 @@ + @@ -3798,6 +4041,7 @@ + @@ -3814,6 +4058,7 @@ + @@ -3828,6 +4073,7 @@ + @@ -3844,6 +4090,7 @@ + @@ -3862,6 +4109,7 @@ + @@ -3877,6 +4125,7 @@ + @@ -3892,6 +4141,7 @@ + @@ -3907,6 +4157,7 @@ + @@ -3921,6 +4172,7 @@ + @@ -3934,6 +4186,7 @@ + @@ -3947,6 +4200,7 @@ + @@ -3960,6 +4214,7 @@ + @@ -3973,6 +4228,7 @@ + @@ -3988,6 +4244,7 @@ + @@ -4001,6 +4258,7 @@ + @@ -4014,6 +4272,7 @@ + @@ -4027,6 +4286,7 @@ + @@ -4040,6 +4300,7 @@ + @@ -4054,6 +4315,7 @@ + @@ -4067,6 +4329,7 @@ + @@ -4079,6 +4342,7 @@ <unknown> + @@ -4092,6 +4356,7 @@ + @@ -4105,6 +4370,7 @@ + @@ -4118,6 +4384,7 @@ + @@ -4134,6 +4401,7 @@ + @@ -4151,6 +4419,7 @@ + @@ -4168,6 +4437,7 @@ + @@ -4185,6 +4455,7 @@ + @@ -4200,6 +4471,7 @@ + @@ -4216,6 +4488,7 @@ + @@ -4234,6 +4507,7 @@ + @@ -4252,6 +4526,7 @@ + @@ -4268,6 +4543,7 @@ + @@ -4284,6 +4560,7 @@ + @@ -4300,6 +4577,7 @@ + @@ -4316,6 +4594,7 @@ + @@ -4331,6 +4610,7 @@ Nintendo + @@ -4348,6 +4628,7 @@ + @@ -4363,6 +4644,7 @@ + @@ -4379,6 +4661,7 @@ + @@ -4396,6 +4679,7 @@ + @@ -4412,6 +4696,7 @@ + @@ -4427,6 +4712,7 @@ + @@ -4442,6 +4728,7 @@ + @@ -4456,6 +4743,7 @@ + @@ -4471,6 +4759,7 @@ + @@ -4486,6 +4775,7 @@ + @@ -4501,6 +4791,7 @@ + @@ -4514,6 +4805,7 @@ + @@ -4528,6 +4820,7 @@ + @@ -4541,6 +4834,7 @@ + @@ -4554,6 +4848,7 @@ + @@ -4569,6 +4864,7 @@ + @@ -4584,6 +4880,7 @@ + @@ -4599,6 +4896,7 @@ + @@ -4614,6 +4912,7 @@ + @@ -4627,6 +4926,7 @@ + @@ -4642,6 +4942,7 @@ + @@ -4655,6 +4956,7 @@ + @@ -4668,6 +4970,7 @@ + @@ -4713,6 +5016,7 @@ + @@ -4728,6 +5032,7 @@ + @@ -4744,6 +5049,7 @@ + @@ -4762,6 +5068,7 @@ + @@ -4779,6 +5086,7 @@ + @@ -4810,6 +5118,7 @@ + @@ -4825,6 +5134,7 @@ + @@ -4838,6 +5148,7 @@ + @@ -4851,6 +5162,7 @@ + @@ -4863,6 +5175,7 @@ Acclaim Entertainment + @@ -4876,6 +5189,7 @@ + @@ -4900,6 +5214,7 @@ Mindscape + @@ -4915,6 +5230,7 @@ + @@ -4928,6 +5244,7 @@ + @@ -4943,6 +5260,7 @@ + @@ -4956,6 +5274,7 @@ + @@ -4969,6 +5288,7 @@ + @@ -4984,6 +5304,7 @@ + @@ -4997,6 +5318,7 @@ + @@ -5012,6 +5334,7 @@ + @@ -5029,6 +5352,7 @@ + @@ -5046,6 +5370,7 @@ + @@ -5061,6 +5386,7 @@ + @@ -5074,6 +5400,7 @@ + @@ -5087,6 +5414,7 @@ + @@ -5101,6 +5429,7 @@ + @@ -5114,6 +5443,7 @@ + @@ -5127,6 +5457,7 @@ + @@ -5141,6 +5472,7 @@ + @@ -5154,6 +5486,7 @@ + @@ -5170,6 +5503,7 @@ + @@ -5187,6 +5521,7 @@ + @@ -5203,6 +5538,7 @@ + @@ -5216,6 +5552,7 @@ + @@ -5231,6 +5568,7 @@ + @@ -5244,6 +5582,7 @@ + @@ -5257,6 +5596,7 @@ + @@ -5272,6 +5612,7 @@ + @@ -5287,6 +5628,7 @@ + @@ -5304,6 +5646,7 @@ + @@ -5319,6 +5662,7 @@ + @@ -5334,6 +5678,7 @@ + @@ -5351,6 +5696,7 @@ + @@ -5365,6 +5711,7 @@ + @@ -5381,6 +5728,7 @@ + @@ -5394,6 +5742,7 @@ + @@ -5409,6 +5758,7 @@ + @@ -5422,6 +5772,7 @@ + @@ -5436,6 +5787,7 @@ + @@ -5450,6 +5802,7 @@ + @@ -5464,6 +5817,7 @@ + @@ -5478,6 +5832,7 @@ + @@ -5492,6 +5847,7 @@ + @@ -5505,6 +5861,7 @@ + @@ -5518,6 +5875,7 @@ + @@ -5532,6 +5890,7 @@ + @@ -5547,6 +5906,7 @@ + @@ -5562,6 +5922,7 @@ + @@ -5578,6 +5939,7 @@ + @@ -5591,6 +5953,7 @@ + @@ -5604,6 +5967,7 @@ + @@ -5617,6 +5981,7 @@ + @@ -5644,6 +6009,7 @@ + @@ -5659,6 +6025,7 @@ + @@ -5674,6 +6041,7 @@ + @@ -5687,6 +6055,7 @@ + @@ -5726,6 +6095,7 @@ + @@ -5741,6 +6111,7 @@ + @@ -5755,6 +6126,7 @@ + @@ -5768,6 +6140,7 @@ + @@ -5781,6 +6154,7 @@ + @@ -5794,6 +6168,7 @@ + @@ -5810,6 +6185,7 @@ + @@ -5824,6 +6200,7 @@ + @@ -5840,6 +6217,7 @@ + @@ -5856,6 +6234,7 @@ + @@ -5871,6 +6250,7 @@ + @@ -5886,6 +6266,7 @@ + @@ -5902,6 +6283,7 @@ + @@ -5920,6 +6302,7 @@ + @@ -5934,6 +6317,7 @@ + @@ -5950,6 +6334,7 @@ + @@ -5966,6 +6351,7 @@ + @@ -5993,6 +6379,7 @@ + @@ -6009,6 +6396,7 @@ + @@ -6025,6 +6413,7 @@ + @@ -6043,6 +6432,7 @@ + @@ -6061,6 +6451,7 @@ + @@ -6079,6 +6470,7 @@ + @@ -6093,6 +6485,7 @@ Hudson Soft + @@ -6111,6 +6504,7 @@ + @@ -6129,6 +6523,7 @@ + @@ -6145,6 +6540,7 @@ + @@ -6175,6 +6571,7 @@ + @@ -6191,6 +6588,7 @@ + @@ -6208,6 +6606,7 @@ + @@ -6223,6 +6622,7 @@ + @@ -6236,6 +6636,7 @@ + @@ -6249,6 +6650,7 @@ + @@ -6262,6 +6664,7 @@ + @@ -6277,6 +6680,7 @@ + @@ -6292,6 +6696,7 @@ + @@ -6308,6 +6713,7 @@ + @@ -6323,6 +6729,7 @@ + @@ -6338,6 +6745,7 @@ + @@ -6353,6 +6761,7 @@ + @@ -6366,6 +6775,7 @@ + @@ -6382,6 +6792,7 @@ + @@ -6399,6 +6810,7 @@ + @@ -6416,6 +6828,7 @@ + @@ -6434,6 +6847,7 @@ + @@ -6450,6 +6864,7 @@ + @@ -6465,6 +6880,7 @@ + @@ -6478,6 +6894,7 @@ + @@ -6492,6 +6909,7 @@ + @@ -6507,6 +6925,7 @@ + @@ -6520,6 +6939,7 @@ + @@ -6535,6 +6955,7 @@ + @@ -6552,6 +6973,7 @@ + @@ -6565,6 +6987,7 @@ + @@ -6581,6 +7004,7 @@ + @@ -6597,6 +7021,7 @@ + @@ -6614,6 +7039,7 @@ + @@ -6627,6 +7053,7 @@ + @@ -6640,6 +7067,7 @@ + @@ -6653,6 +7081,7 @@ + @@ -6669,6 +7098,7 @@ + @@ -6687,6 +7117,7 @@ + @@ -6702,6 +7133,7 @@ + @@ -6717,6 +7149,7 @@ + @@ -6733,6 +7166,7 @@ + @@ -6748,6 +7182,7 @@ + @@ -6763,6 +7198,7 @@ + @@ -6778,6 +7214,7 @@ + @@ -6793,6 +7230,7 @@ + @@ -6808,6 +7246,7 @@ + @@ -6823,6 +7262,7 @@ + @@ -6838,6 +7278,7 @@ + @@ -6853,6 +7294,7 @@ + @@ -6868,6 +7310,7 @@ + @@ -6883,6 +7326,7 @@ + @@ -6898,6 +7342,7 @@ + @@ -6913,6 +7358,7 @@ + @@ -6928,6 +7374,7 @@ + @@ -6943,6 +7390,7 @@ + @@ -6958,6 +7406,7 @@ + @@ -6973,6 +7422,7 @@ + @@ -6988,6 +7438,7 @@ + @@ -7005,6 +7456,7 @@ + @@ -7022,6 +7474,7 @@ + @@ -7039,6 +7492,7 @@ + @@ -7054,6 +7508,7 @@ + @@ -7071,6 +7526,7 @@ + @@ -7086,6 +7542,7 @@ + @@ -7101,6 +7558,7 @@ + @@ -7116,6 +7574,7 @@ + @@ -7131,6 +7590,7 @@ + @@ -7146,6 +7606,7 @@ + @@ -7163,6 +7624,7 @@ + @@ -7178,6 +7640,7 @@ + @@ -7193,6 +7656,7 @@ + @@ -7208,6 +7672,7 @@ + @@ -7223,6 +7688,7 @@ + @@ -7238,6 +7704,7 @@ + @@ -7253,6 +7720,7 @@ + @@ -7266,6 +7734,7 @@ + @@ -7279,6 +7748,7 @@ + @@ -7296,6 +7766,7 @@ + @@ -7312,6 +7783,7 @@ + @@ -7326,6 +7798,7 @@ HAL + @@ -7339,6 +7812,7 @@ + @@ -7351,6 +7825,7 @@ Irem + @@ -7365,6 +7840,7 @@ + @@ -7382,6 +7858,7 @@ + @@ -7398,6 +7875,7 @@ + @@ -7413,6 +7891,7 @@ + @@ -7426,6 +7905,7 @@ + @@ -7467,6 +7947,7 @@ + @@ -7481,6 +7962,7 @@ + @@ -7496,6 +7978,7 @@ + @@ -7512,6 +7995,7 @@ + @@ -7526,6 +8010,7 @@ + @@ -7541,6 +8026,7 @@ + @@ -7554,6 +8040,7 @@ + @@ -7569,6 +8056,7 @@ + @@ -7584,6 +8072,7 @@ + @@ -7599,6 +8088,7 @@ + @@ -7614,6 +8104,7 @@ + @@ -7627,6 +8118,7 @@ + @@ -7640,6 +8132,7 @@ + @@ -7656,6 +8149,7 @@ + @@ -7687,6 +8181,7 @@ + @@ -7704,6 +8199,7 @@ + @@ -7717,6 +8213,7 @@ + @@ -7732,6 +8229,7 @@ + @@ -7745,6 +8243,7 @@ + @@ -7761,6 +8260,7 @@ + @@ -7777,6 +8277,7 @@ + @@ -7793,6 +8294,7 @@ + @@ -7810,6 +8312,7 @@ + @@ -7823,6 +8326,7 @@ + @@ -7836,6 +8340,7 @@ + @@ -7849,6 +8354,7 @@ + @@ -7862,6 +8368,7 @@ + @@ -7875,6 +8382,7 @@ + @@ -7889,6 +8397,7 @@ + @@ -7902,6 +8411,7 @@ + @@ -7917,6 +8427,7 @@ + @@ -7932,6 +8443,7 @@ + @@ -7945,6 +8457,7 @@ + @@ -7974,6 +8487,7 @@ + @@ -7989,6 +8503,7 @@ + @@ -8002,6 +8517,7 @@ + @@ -8015,6 +8531,7 @@ + @@ -8030,6 +8547,7 @@ + @@ -8043,6 +8561,7 @@ + @@ -8057,6 +8576,7 @@ + @@ -8070,6 +8590,7 @@ + @@ -8083,6 +8604,7 @@ + @@ -8096,6 +8618,7 @@ + @@ -8110,6 +8633,7 @@ + @@ -8126,6 +8650,7 @@ + @@ -8141,6 +8666,7 @@ + @@ -8156,6 +8682,7 @@ + @@ -8172,6 +8699,7 @@ + @@ -8187,6 +8715,7 @@ + @@ -8202,6 +8731,7 @@ + @@ -8217,6 +8747,7 @@ + @@ -8244,6 +8775,7 @@ + @@ -8258,6 +8790,7 @@ + @@ -8274,6 +8807,7 @@ + @@ -8292,6 +8826,7 @@ + @@ -8308,6 +8843,7 @@ + @@ -8326,6 +8862,7 @@ + @@ -8343,6 +8880,7 @@ + @@ -8358,6 +8896,7 @@ + @@ -8371,6 +8910,7 @@ + @@ -8386,6 +8926,7 @@ + @@ -8400,6 +8941,7 @@ + @@ -8417,6 +8959,7 @@ + @@ -8432,6 +8975,7 @@ + @@ -8447,6 +8991,7 @@ + @@ -8462,6 +9007,7 @@ + @@ -8476,6 +9022,7 @@ + @@ -8489,6 +9036,7 @@ + @@ -8502,6 +9050,7 @@ + @@ -8516,6 +9065,7 @@ + @@ -8529,6 +9079,7 @@ + @@ -8543,6 +9094,7 @@ + @@ -8556,6 +9108,7 @@ + @@ -8571,6 +9124,7 @@ + @@ -8587,6 +9141,7 @@ + @@ -8600,6 +9155,7 @@ + @@ -8616,6 +9172,7 @@ + @@ -8632,6 +9189,7 @@ + @@ -8645,6 +9203,7 @@ + @@ -8658,6 +9217,7 @@ + @@ -8671,6 +9231,7 @@ + @@ -8686,6 +9247,7 @@ + @@ -8700,6 +9262,7 @@ + @@ -8715,6 +9278,7 @@ + @@ -8728,6 +9292,7 @@ + @@ -8741,6 +9306,7 @@ + @@ -8757,6 +9323,7 @@ + @@ -8771,6 +9338,7 @@ + @@ -8786,6 +9354,7 @@ + @@ -8801,6 +9370,7 @@ + @@ -8814,6 +9384,7 @@ + @@ -8827,6 +9398,7 @@ + @@ -8842,6 +9414,7 @@ + @@ -8859,6 +9432,7 @@ + @@ -8876,6 +9450,7 @@ + @@ -8894,6 +9469,7 @@ + @@ -8911,6 +9487,7 @@ + @@ -8926,6 +9503,7 @@ + @@ -8955,6 +9533,7 @@ + @@ -8971,6 +9550,7 @@ + @@ -8988,6 +9568,7 @@ + @@ -9004,6 +9585,7 @@ + @@ -9020,6 +9602,7 @@ + @@ -9037,6 +9620,7 @@ + @@ -9055,6 +9639,7 @@ + @@ -9072,6 +9657,7 @@ + @@ -9088,6 +9674,7 @@ + @@ -9105,6 +9692,7 @@ + @@ -9120,6 +9708,7 @@ + @@ -9133,6 +9722,7 @@ + @@ -9146,6 +9736,7 @@ + @@ -9162,6 +9753,7 @@ + @@ -9177,6 +9769,7 @@ + @@ -9191,6 +9784,7 @@ + @@ -9205,6 +9799,7 @@ + @@ -9219,6 +9814,7 @@ + @@ -9233,6 +9829,7 @@ + @@ -9247,6 +9844,7 @@ + @@ -9260,6 +9858,7 @@ + @@ -9273,6 +9872,7 @@ + @@ -9288,6 +9888,7 @@ + @@ -9303,6 +9904,7 @@ + @@ -9320,6 +9922,7 @@ + @@ -9336,6 +9939,7 @@ + @@ -9352,6 +9956,7 @@ + @@ -9370,6 +9975,7 @@ + @@ -9388,6 +9994,7 @@ + @@ -9403,6 +10010,7 @@ + @@ -9418,6 +10026,7 @@ + @@ -9432,6 +10041,7 @@ + @@ -9447,6 +10057,7 @@ + @@ -9462,6 +10073,7 @@ + @@ -9479,6 +10091,7 @@ + @@ -9494,6 +10107,7 @@ + @@ -9509,6 +10123,7 @@ + @@ -9536,6 +10151,7 @@ + @@ -9551,6 +10167,7 @@ + @@ -9564,6 +10181,7 @@ + @@ -9594,6 +10212,7 @@ + @@ -9610,6 +10229,7 @@ + @@ -9626,6 +10246,7 @@ + @@ -9642,6 +10263,7 @@ + @@ -9655,6 +10277,7 @@ + @@ -9671,6 +10294,7 @@ + @@ -9686,6 +10310,7 @@ + @@ -9702,6 +10327,7 @@ + @@ -9717,6 +10343,7 @@ + @@ -9733,6 +10360,7 @@ + @@ -9751,6 +10379,7 @@ + @@ -9783,6 +10412,7 @@ + @@ -9800,6 +10430,7 @@ + @@ -9813,6 +10444,7 @@ + @@ -9829,6 +10461,7 @@ + @@ -9842,6 +10475,7 @@ + @@ -9857,6 +10491,7 @@ + @@ -9875,6 +10510,7 @@ + @@ -9914,6 +10550,7 @@ + @@ -9927,6 +10564,7 @@ + @@ -9940,6 +10578,7 @@ + @@ -9953,6 +10592,7 @@ + @@ -9969,6 +10609,7 @@ + @@ -9983,6 +10624,7 @@ + @@ -9997,6 +10639,7 @@ + @@ -10013,6 +10656,7 @@ + @@ -10028,6 +10672,7 @@ + @@ -10043,6 +10688,7 @@ + @@ -10058,6 +10704,7 @@ + @@ -10073,6 +10720,7 @@ + @@ -10088,6 +10736,7 @@ + @@ -10103,6 +10752,7 @@ + @@ -10118,6 +10768,7 @@ + @@ -10131,6 +10782,7 @@ + @@ -10146,6 +10798,7 @@ + @@ -10159,6 +10812,7 @@ + @@ -10172,6 +10826,7 @@ + @@ -10185,6 +10840,7 @@ + @@ -10198,6 +10854,7 @@ + @@ -10211,6 +10868,7 @@ + @@ -10225,6 +10883,7 @@ + @@ -10238,6 +10897,7 @@ + @@ -10253,6 +10913,7 @@ + @@ -10269,6 +10930,7 @@ + @@ -10284,6 +10946,7 @@ + @@ -10297,6 +10960,7 @@ + @@ -10312,6 +10976,7 @@ + @@ -10327,6 +10992,7 @@ + @@ -10340,6 +11006,7 @@ + @@ -10355,6 +11022,7 @@ + @@ -10383,6 +11051,7 @@ + @@ -10397,6 +11066,7 @@ + @@ -10410,6 +11080,7 @@ + @@ -10425,6 +11096,7 @@ + @@ -10440,6 +11112,7 @@ + @@ -10457,6 +11130,7 @@ + @@ -10473,6 +11147,7 @@ + @@ -10488,6 +11163,7 @@ + @@ -10502,6 +11178,7 @@ + @@ -10516,6 +11193,7 @@ + @@ -10531,6 +11209,7 @@ + @@ -10547,6 +11226,7 @@ + @@ -10565,6 +11245,7 @@ + @@ -10581,6 +11262,7 @@ + @@ -10596,6 +11278,7 @@ + @@ -10609,6 +11292,7 @@ + @@ -10625,6 +11309,7 @@ + @@ -10640,6 +11325,7 @@ + @@ -10656,6 +11342,7 @@ + @@ -10673,6 +11360,7 @@ + @@ -10686,6 +11374,7 @@ + @@ -10699,6 +11388,7 @@ + @@ -10712,6 +11402,7 @@ + @@ -10726,6 +11417,7 @@ + @@ -10739,6 +11431,7 @@ + @@ -10752,6 +11445,7 @@ + @@ -10768,6 +11462,7 @@ + @@ -10784,6 +11479,7 @@ + @@ -10802,6 +11498,7 @@ + @@ -10815,6 +11512,7 @@ + @@ -10830,6 +11528,7 @@ + @@ -10846,6 +11545,7 @@ + @@ -10875,6 +11575,7 @@ + @@ -10890,6 +11591,7 @@ + @@ -10903,6 +11605,7 @@ + @@ -10916,6 +11619,7 @@ + @@ -10929,6 +11633,7 @@ + @@ -10945,6 +11650,7 @@ + @@ -10963,6 +11669,7 @@ + @@ -10981,6 +11688,7 @@ + @@ -10999,6 +11707,7 @@ + @@ -11017,6 +11726,7 @@ + @@ -11035,6 +11745,7 @@ + @@ -11052,6 +11763,7 @@ + @@ -11065,6 +11777,7 @@ + @@ -11078,6 +11791,7 @@ + @@ -11091,6 +11805,7 @@ + @@ -11104,6 +11819,7 @@ + @@ -11117,6 +11833,7 @@ + @@ -11130,6 +11847,7 @@ + @@ -11143,6 +11861,7 @@ + @@ -11156,6 +11875,7 @@ + @@ -11169,6 +11889,7 @@ + @@ -11182,6 +11903,7 @@ + @@ -11196,6 +11918,7 @@ + @@ -11211,6 +11934,7 @@ + @@ -11228,6 +11952,7 @@ + @@ -11246,6 +11971,7 @@ + @@ -11262,6 +11988,7 @@ + @@ -11275,6 +12002,7 @@ + @@ -11288,6 +12016,7 @@ + @@ -11304,6 +12033,7 @@ + @@ -11319,6 +12049,7 @@ + @@ -11334,6 +12065,7 @@ + @@ -11347,6 +12079,7 @@ + @@ -11362,6 +12095,7 @@ + @@ -11377,6 +12111,7 @@ + @@ -11392,6 +12127,7 @@ + @@ -11405,6 +12141,7 @@ + @@ -11420,6 +12157,7 @@ + @@ -11434,6 +12172,7 @@ + @@ -11447,6 +12186,7 @@ + @@ -11460,6 +12200,7 @@ + @@ -11473,6 +12214,7 @@ + @@ -11489,6 +12231,7 @@ + @@ -11503,6 +12246,7 @@ + @@ -11517,6 +12261,7 @@ + @@ -11546,6 +12291,7 @@ + @@ -11561,6 +12307,7 @@ + @@ -11574,6 +12321,7 @@ + @@ -11587,6 +12335,7 @@ + @@ -11617,6 +12366,7 @@ + @@ -11635,6 +12385,7 @@ + @@ -11652,6 +12403,7 @@ + @@ -11668,6 +12420,7 @@ + @@ -11686,6 +12439,7 @@ + @@ -11703,6 +12457,7 @@ + @@ -11731,6 +12486,7 @@ + @@ -11762,6 +12518,7 @@ + @@ -11778,6 +12535,7 @@ + @@ -11796,6 +12554,7 @@ + @@ -11814,6 +12573,7 @@ + @@ -11831,6 +12591,7 @@ + @@ -11847,6 +12608,7 @@ + @@ -11862,6 +12624,7 @@ + @@ -11879,6 +12642,7 @@ + @@ -11897,6 +12661,7 @@ + @@ -11910,6 +12675,7 @@ + @@ -11925,6 +12691,7 @@ + @@ -11938,6 +12705,7 @@ + @@ -11953,6 +12721,7 @@ + @@ -11969,6 +12738,7 @@ + @@ -11984,6 +12754,7 @@ + @@ -11999,6 +12770,7 @@ + @@ -12015,6 +12787,7 @@ + @@ -12033,6 +12806,7 @@ + @@ -12050,6 +12824,7 @@ + @@ -12063,6 +12838,7 @@ + @@ -12076,6 +12852,7 @@ + @@ -12091,6 +12868,7 @@ + @@ -12104,6 +12882,7 @@ + @@ -12117,6 +12896,7 @@ + @@ -12130,6 +12910,7 @@ + @@ -12145,6 +12926,7 @@ + @@ -12158,6 +12940,7 @@ + @@ -12171,6 +12954,7 @@ + @@ -12186,6 +12970,7 @@ + @@ -12251,6 +13036,7 @@ + @@ -12264,6 +13050,7 @@ + @@ -12277,6 +13064,7 @@ + @@ -12290,6 +13078,7 @@ + @@ -12303,6 +13092,7 @@ + @@ -12318,6 +13108,7 @@ + @@ -12332,6 +13123,7 @@ + @@ -12345,6 +13137,7 @@ + @@ -12358,6 +13151,7 @@ + @@ -12372,6 +13166,7 @@ + @@ -12387,6 +13182,7 @@ + @@ -12400,6 +13196,7 @@ + @@ -12413,6 +13210,7 @@ + @@ -12426,6 +13224,7 @@ Nintendo + @@ -12439,6 +13238,7 @@ Nintendo + @@ -12454,6 +13254,7 @@ + @@ -12468,6 +13269,7 @@ + @@ -12484,6 +13286,7 @@ + @@ -12500,6 +13303,7 @@ + @@ -12513,6 +13317,7 @@ + @@ -12528,6 +13333,7 @@ + @@ -12543,6 +13349,7 @@ + @@ -12558,6 +13365,7 @@ + @@ -12574,6 +13382,7 @@ + @@ -12590,6 +13399,7 @@ + @@ -12606,6 +13416,7 @@ + @@ -12621,6 +13432,7 @@ + @@ -12636,6 +13448,7 @@ + @@ -12653,6 +13466,7 @@ + @@ -12668,6 +13482,7 @@ + @@ -12681,6 +13496,7 @@ + @@ -12694,6 +13510,7 @@ + @@ -12709,6 +13526,7 @@ + @@ -12722,6 +13540,7 @@ + @@ -12735,6 +13554,7 @@ + @@ -12750,6 +13570,7 @@ + @@ -12763,6 +13584,7 @@ + @@ -12777,6 +13599,7 @@ + @@ -12793,6 +13616,7 @@ + @@ -12808,6 +13632,7 @@ + @@ -12823,6 +13648,7 @@ + @@ -12838,6 +13664,7 @@ + @@ -12854,6 +13681,7 @@ + @@ -12869,6 +13697,7 @@ + @@ -12883,6 +13712,7 @@ + @@ -12898,6 +13728,7 @@ + @@ -12911,6 +13742,7 @@ + @@ -12927,6 +13759,7 @@ + @@ -12940,6 +13773,7 @@ + @@ -12956,6 +13790,7 @@ + @@ -12972,6 +13807,7 @@ + @@ -12988,6 +13824,7 @@ + @@ -13004,6 +13841,7 @@ + @@ -13020,6 +13858,7 @@ + @@ -13036,6 +13875,7 @@ + @@ -13052,6 +13892,7 @@ + @@ -13068,6 +13909,7 @@ + @@ -13084,6 +13926,7 @@ + @@ -13100,6 +13943,7 @@ + @@ -13114,6 +13958,7 @@ + @@ -13139,6 +13984,7 @@ + @@ -13154,6 +14000,7 @@ + @@ -13167,6 +14014,7 @@ + @@ -13180,6 +14028,7 @@ + @@ -13194,6 +14043,7 @@ + @@ -13207,6 +14057,7 @@ + @@ -13222,6 +14073,7 @@ + @@ -13235,6 +14087,7 @@ + @@ -13248,6 +14101,7 @@ + @@ -13262,6 +14116,7 @@ + @@ -13278,6 +14133,7 @@ + @@ -13294,6 +14150,7 @@ + @@ -13311,6 +14168,7 @@ + @@ -13326,6 +14184,7 @@ + @@ -13339,6 +14198,7 @@ + @@ -13352,6 +14212,7 @@ + @@ -13367,6 +14228,7 @@ + @@ -13380,6 +14242,7 @@ + @@ -13393,6 +14256,7 @@ Sammy + @@ -13410,6 +14274,7 @@ + @@ -13426,6 +14291,7 @@ + @@ -13442,6 +14308,7 @@ + @@ -13458,6 +14325,7 @@ + @@ -13471,6 +14339,7 @@ + @@ -13485,6 +14354,7 @@ + @@ -13500,6 +14370,7 @@ + @@ -13515,6 +14386,7 @@ + @@ -13532,6 +14404,7 @@ + @@ -13547,6 +14420,7 @@ + @@ -13561,6 +14435,7 @@ + @@ -13576,6 +14451,7 @@ + @@ -13590,6 +14466,7 @@ + @@ -13605,6 +14482,7 @@ + @@ -13622,6 +14500,7 @@ + @@ -13639,6 +14518,7 @@ + @@ -13657,6 +14537,7 @@ + @@ -13674,6 +14555,7 @@ + @@ -13687,6 +14569,7 @@ + @@ -13702,6 +14585,7 @@ + @@ -13744,6 +14628,7 @@ + @@ -13760,6 +14645,7 @@ + @@ -13774,6 +14660,7 @@ + @@ -13787,6 +14674,7 @@ + @@ -13802,6 +14690,7 @@ + @@ -13818,6 +14707,7 @@ + @@ -13833,6 +14723,7 @@ + @@ -13847,6 +14738,7 @@ + @@ -13861,6 +14753,7 @@ + @@ -13877,6 +14770,7 @@ + @@ -13890,6 +14784,7 @@ + @@ -13903,6 +14798,7 @@ + @@ -13919,6 +14815,7 @@ + @@ -13932,6 +14829,7 @@ + @@ -13946,6 +14844,7 @@ + @@ -13962,6 +14861,7 @@ + @@ -13978,6 +14878,7 @@ + @@ -13994,6 +14895,7 @@ + @@ -14009,6 +14911,7 @@ + @@ -14024,6 +14927,7 @@ + @@ -14039,6 +14943,7 @@ + @@ -14055,6 +14960,7 @@ + @@ -14072,6 +14978,7 @@ + @@ -14089,6 +14996,7 @@ + @@ -14105,6 +15013,7 @@ + @@ -14120,6 +15029,7 @@ + @@ -14135,6 +15045,7 @@ + @@ -14150,6 +15061,7 @@ + @@ -14165,6 +15077,7 @@ + @@ -14180,6 +15093,7 @@ + @@ -14195,6 +15109,7 @@ + @@ -14210,6 +15125,7 @@ + @@ -14224,6 +15140,7 @@ + @@ -14238,6 +15155,7 @@ + @@ -14253,6 +15171,7 @@ + @@ -14292,6 +15211,7 @@ + @@ -14307,6 +15227,7 @@ + @@ -14320,6 +15241,7 @@ + @@ -14333,6 +15255,7 @@ + @@ -14346,6 +15269,7 @@ + @@ -14361,6 +15285,7 @@ + @@ -14374,6 +15299,7 @@ + @@ -14387,6 +15313,7 @@ + @@ -14402,6 +15329,7 @@ + @@ -14417,6 +15345,7 @@ + @@ -14432,6 +15361,7 @@ + @@ -14459,6 +15389,7 @@ + @@ -14474,6 +15405,7 @@ + @@ -14489,6 +15421,7 @@ + @@ -14505,6 +15438,7 @@ + @@ -14519,6 +15453,7 @@ + @@ -14534,6 +15469,7 @@ + @@ -14547,6 +15483,7 @@ + @@ -14563,6 +15500,7 @@ + @@ -14578,6 +15516,7 @@ + @@ -14593,6 +15532,7 @@ + @@ -14606,6 +15546,7 @@ + @@ -14620,6 +15561,7 @@ + @@ -14633,6 +15575,7 @@ + @@ -14646,6 +15589,7 @@ + @@ -14659,6 +15603,7 @@ + @@ -14674,6 +15619,7 @@ + @@ -14687,6 +15633,7 @@ + @@ -14700,6 +15647,7 @@ + @@ -14739,6 +15687,7 @@ + @@ -14766,6 +15715,7 @@ + @@ -14780,6 +15730,7 @@ + @@ -14796,6 +15747,7 @@ + @@ -14811,6 +15763,7 @@ + @@ -14825,6 +15778,7 @@ + @@ -14841,6 +15795,7 @@ + @@ -14857,6 +15812,7 @@ + @@ -14873,6 +15829,7 @@ + @@ -14888,6 +15845,7 @@ + @@ -14904,6 +15862,7 @@ + @@ -14922,6 +15881,7 @@ + @@ -14939,6 +15899,7 @@ + @@ -14957,6 +15918,7 @@ + @@ -14974,6 +15936,7 @@ + @@ -14990,6 +15953,7 @@ + @@ -15008,6 +15972,7 @@ + @@ -15026,6 +15991,7 @@ + @@ -15044,6 +16010,7 @@ + @@ -15062,6 +16029,7 @@ + @@ -15080,6 +16048,7 @@ + @@ -15098,6 +16067,7 @@ + @@ -15116,6 +16086,7 @@ + @@ -15134,6 +16105,7 @@ + @@ -15152,6 +16124,7 @@ + @@ -15168,6 +16141,7 @@ + @@ -15183,6 +16157,7 @@ + @@ -15197,6 +16172,7 @@ + @@ -15213,6 +16189,7 @@ + @@ -15229,6 +16206,7 @@ + @@ -15245,6 +16223,7 @@ + @@ -15261,6 +16240,7 @@ + @@ -15277,6 +16257,7 @@ + @@ -15293,6 +16274,7 @@ + @@ -15309,6 +16291,7 @@ + @@ -15325,6 +16308,7 @@ + @@ -15341,6 +16325,7 @@ + @@ -15357,6 +16342,7 @@ + @@ -15373,6 +16359,7 @@ + @@ -15389,6 +16376,7 @@ + @@ -15405,6 +16393,7 @@ + @@ -15421,6 +16410,7 @@ + @@ -15439,6 +16429,7 @@ + @@ -15454,6 +16445,7 @@ + @@ -15479,6 +16471,7 @@ + @@ -15494,6 +16487,7 @@ + @@ -15507,6 +16501,7 @@ + @@ -15522,6 +16517,7 @@ + @@ -15535,6 +16531,7 @@ + @@ -15548,6 +16545,7 @@ + @@ -15563,6 +16561,7 @@ + @@ -15578,6 +16577,7 @@ + @@ -15593,6 +16593,7 @@ + @@ -15606,6 +16607,7 @@ + @@ -15622,6 +16624,7 @@ + @@ -15640,6 +16643,7 @@ + @@ -15655,6 +16659,7 @@ + @@ -15668,6 +16673,7 @@ + @@ -15683,6 +16689,7 @@ + @@ -15697,6 +16704,7 @@ + @@ -15710,6 +16718,7 @@ + @@ -15725,6 +16734,7 @@ + @@ -15738,6 +16748,7 @@ + @@ -15754,6 +16765,7 @@ + @@ -15769,6 +16781,7 @@ + @@ -15784,6 +16797,7 @@ + @@ -15799,6 +16813,7 @@ + @@ -15815,6 +16830,7 @@ + @@ -15829,6 +16845,7 @@ + @@ -15843,6 +16860,7 @@ + @@ -15856,6 +16874,7 @@ + @@ -15869,6 +16888,7 @@ + @@ -15882,6 +16902,7 @@ + @@ -15898,6 +16919,7 @@ + @@ -15916,6 +16938,7 @@ + @@ -15934,6 +16957,7 @@ + @@ -15952,6 +16976,7 @@ + @@ -15968,6 +16993,7 @@ + @@ -15984,6 +17010,7 @@ + @@ -16013,6 +17040,7 @@ + @@ -16029,6 +17057,7 @@ + @@ -16044,6 +17073,7 @@ + @@ -16057,6 +17087,7 @@ + @@ -16096,6 +17127,7 @@ + @@ -16111,6 +17143,7 @@ + @@ -16126,6 +17159,7 @@ + @@ -16141,6 +17175,7 @@ + @@ -16154,6 +17189,7 @@ + @@ -16169,6 +17205,7 @@ + @@ -16184,6 +17221,7 @@ + @@ -16197,6 +17235,7 @@ + @@ -16212,6 +17251,7 @@ + @@ -16224,6 +17264,7 @@ Irem + @@ -16239,6 +17280,7 @@ + @@ -16252,6 +17294,7 @@ + @@ -16265,6 +17308,7 @@ + @@ -16278,6 +17322,7 @@ + @@ -16293,6 +17338,7 @@ + @@ -16309,6 +17355,7 @@ + @@ -16322,6 +17369,7 @@ + @@ -16335,6 +17383,7 @@ + @@ -16350,6 +17399,7 @@ + @@ -16363,6 +17413,7 @@ + @@ -16378,6 +17429,7 @@ + @@ -16393,6 +17445,7 @@ + @@ -16408,6 +17461,7 @@ + @@ -16423,6 +17477,7 @@ + @@ -16439,6 +17494,7 @@ + @@ -16452,6 +17508,7 @@ + @@ -16468,6 +17525,7 @@ + @@ -16483,6 +17541,7 @@ + @@ -16496,6 +17555,7 @@ + @@ -16509,6 +17569,7 @@ + @@ -16539,6 +17600,7 @@ + @@ -16554,6 +17616,7 @@ + @@ -16567,6 +17630,7 @@ + @@ -16580,6 +17644,7 @@ + @@ -16595,6 +17660,7 @@ + @@ -16608,6 +17674,7 @@ + @@ -16620,6 +17687,7 @@ Ocean + @@ -16633,6 +17701,7 @@ + @@ -16648,6 +17717,7 @@ + @@ -16661,6 +17731,7 @@ + @@ -16674,6 +17745,7 @@ + @@ -16687,6 +17759,7 @@ + @@ -16700,6 +17773,7 @@ + @@ -16713,6 +17787,7 @@ + @@ -16726,6 +17801,7 @@ + @@ -16739,6 +17815,7 @@ + @@ -16754,6 +17831,7 @@ + @@ -16769,6 +17847,7 @@ + @@ -16782,6 +17861,7 @@ + @@ -16795,6 +17875,7 @@ + @@ -16808,6 +17889,7 @@ + @@ -16824,6 +17906,7 @@ + @@ -16840,6 +17923,7 @@ + @@ -16856,6 +17940,7 @@ + @@ -16872,6 +17957,7 @@ + @@ -16888,6 +17974,7 @@ + @@ -16904,6 +17991,7 @@ + @@ -16917,6 +18005,7 @@ + @@ -16932,6 +18021,7 @@ + @@ -16947,6 +18037,7 @@ + @@ -16960,6 +18051,7 @@ + @@ -16973,6 +18065,7 @@ + @@ -16986,6 +18079,7 @@ + @@ -17002,6 +18096,7 @@ + @@ -17017,6 +18112,7 @@ + @@ -17031,6 +18127,7 @@ + @@ -17046,6 +18143,7 @@ + @@ -17063,6 +18161,7 @@ + @@ -17080,6 +18179,7 @@ + @@ -17098,6 +18198,7 @@ + @@ -17113,6 +18214,7 @@ + @@ -17128,6 +18230,7 @@ + @@ -17144,6 +18247,7 @@ + @@ -17160,6 +18264,7 @@ + @@ -17175,6 +18280,7 @@ + @@ -17187,6 +18293,7 @@ Takara + @@ -17202,6 +18309,7 @@ + @@ -17219,6 +18327,7 @@ + @@ -17234,6 +18343,7 @@ + @@ -17249,6 +18359,7 @@ + @@ -17264,6 +18375,7 @@ + @@ -17277,6 +18389,7 @@ + @@ -17292,6 +18405,7 @@ + @@ -17307,6 +18421,7 @@ + @@ -17322,6 +18437,7 @@ + @@ -17339,6 +18455,7 @@ + @@ -17355,6 +18472,7 @@ + @@ -17370,6 +18488,7 @@ + @@ -17385,6 +18504,7 @@ + @@ -17400,6 +18520,7 @@ + @@ -17416,6 +18537,7 @@ + @@ -17430,6 +18552,7 @@ + @@ -17444,6 +18567,7 @@ + @@ -17459,6 +18583,7 @@ + @@ -17474,6 +18599,7 @@ + @@ -17490,6 +18616,7 @@ + @@ -17506,6 +18633,7 @@ + @@ -17523,6 +18651,7 @@ + @@ -17540,6 +18669,7 @@ + @@ -17554,6 +18684,7 @@ + @@ -17579,6 +18710,7 @@ + @@ -17633,6 +18765,7 @@ + @@ -17647,6 +18780,7 @@ + @@ -17662,6 +18796,7 @@ + @@ -17678,6 +18813,7 @@ + @@ -17695,6 +18831,7 @@ + @@ -17711,6 +18848,7 @@ + @@ -17726,6 +18864,7 @@ + @@ -17741,6 +18880,7 @@ + @@ -17756,6 +18896,7 @@ + @@ -17771,6 +18912,7 @@ + @@ -17786,6 +18928,7 @@ + @@ -17815,6 +18958,7 @@ + @@ -17831,6 +18975,7 @@ + @@ -17847,6 +18992,7 @@ + @@ -17862,6 +19008,7 @@ + @@ -17877,6 +19024,7 @@ + @@ -17892,6 +19040,7 @@ + @@ -17905,6 +19054,7 @@ + @@ -17932,6 +19082,7 @@ + @@ -17945,6 +19096,7 @@ + @@ -17958,6 +19110,7 @@ + @@ -17971,6 +19124,7 @@ + @@ -17985,6 +19139,7 @@ + @@ -17997,6 +19152,7 @@ <unlicensed> + @@ -18011,6 +19167,7 @@ + @@ -18024,6 +19181,7 @@ + @@ -18037,6 +19195,7 @@ + @@ -18050,6 +19209,7 @@ + @@ -18063,6 +19223,7 @@ + @@ -18078,6 +19239,7 @@ + @@ -18091,6 +19253,7 @@ + @@ -18107,6 +19270,7 @@ + @@ -18120,6 +19284,7 @@ + @@ -18135,6 +19300,7 @@ + @@ -18148,6 +19314,7 @@ + @@ -18161,6 +19328,7 @@ + @@ -18176,6 +19344,7 @@ + @@ -18191,6 +19360,7 @@ + @@ -18204,6 +19374,7 @@ + @@ -18220,6 +19391,7 @@ + @@ -18235,6 +19407,7 @@ + @@ -18250,6 +19423,7 @@ + @@ -18264,6 +19438,7 @@ + @@ -18277,6 +19452,7 @@ + @@ -18292,6 +19468,7 @@ + @@ -18305,6 +19482,7 @@ + @@ -18334,6 +19512,7 @@ + @@ -18349,6 +19528,7 @@ + @@ -18391,6 +19571,7 @@ + @@ -18421,6 +19602,7 @@ + @@ -18434,6 +19616,7 @@ + @@ -18447,6 +19630,7 @@ + @@ -18462,6 +19646,7 @@ + @@ -18475,6 +19660,7 @@ + @@ -18488,6 +19674,7 @@ + @@ -18501,6 +19688,7 @@ + @@ -18514,6 +19702,7 @@ + @@ -18527,6 +19716,7 @@ + @@ -18539,6 +19729,7 @@ Infogrames + @@ -18552,6 +19743,7 @@ + @@ -18565,6 +19757,7 @@ + @@ -18580,6 +19773,7 @@ + @@ -18593,6 +19787,7 @@ <unknown> + @@ -18608,6 +19803,7 @@ + @@ -18621,6 +19817,7 @@ + @@ -18634,6 +19831,7 @@ + @@ -18647,6 +19845,7 @@ + @@ -18700,6 +19899,7 @@ + @@ -18713,6 +19913,7 @@ + @@ -18726,6 +19927,7 @@ + @@ -18738,6 +19940,7 @@ Kemco + @@ -18750,6 +19953,7 @@ Kemco + @@ -18763,6 +19967,7 @@ + @@ -18776,6 +19981,7 @@ + @@ -18792,6 +19998,7 @@ + @@ -18807,6 +20014,7 @@ + @@ -18820,6 +20028,7 @@ + @@ -18833,6 +20042,7 @@ + @@ -18846,6 +20056,7 @@ + @@ -18860,6 +20071,7 @@ + @@ -18874,6 +20086,7 @@ + @@ -18887,6 +20100,7 @@ + @@ -18899,6 +20113,7 @@ Nintendo + @@ -18912,6 +20127,7 @@ + @@ -18925,6 +20141,7 @@ + @@ -18938,6 +20155,7 @@ + @@ -18951,6 +20169,7 @@ + @@ -18964,6 +20183,7 @@ + @@ -18980,6 +20200,7 @@ + @@ -18994,6 +20215,7 @@ + @@ -19008,6 +20230,7 @@ + @@ -19024,6 +20247,7 @@ + @@ -19037,6 +20261,7 @@ + @@ -19050,6 +20275,7 @@ + @@ -19065,6 +20291,7 @@ + @@ -19078,6 +20305,7 @@ + @@ -19094,6 +20322,7 @@ + @@ -19107,6 +20336,7 @@ + @@ -19120,6 +20350,7 @@ + @@ -19135,6 +20366,7 @@ + @@ -19148,6 +20380,7 @@ + @@ -19164,6 +20397,7 @@ + @@ -19182,6 +20416,7 @@ + @@ -19200,6 +20435,7 @@ + @@ -19214,6 +20450,7 @@ + @@ -19227,6 +20464,7 @@ + @@ -19243,6 +20481,7 @@ + @@ -19258,6 +20497,7 @@ + @@ -19274,6 +20514,7 @@ + @@ -19289,6 +20530,7 @@ + @@ -19305,6 +20547,7 @@ + @@ -19321,6 +20564,7 @@ + @@ -19336,6 +20580,7 @@ + @@ -19351,6 +20596,7 @@ + @@ -19364,6 +20610,7 @@ + @@ -19377,6 +20624,7 @@ + @@ -19390,6 +20638,7 @@ + @@ -19406,6 +20655,7 @@ + @@ -19422,6 +20672,7 @@ + @@ -19435,6 +20686,7 @@ + @@ -19450,6 +20702,7 @@ + @@ -19465,6 +20718,7 @@ + @@ -19483,6 +20737,7 @@ + @@ -19501,6 +20756,7 @@ + @@ -19518,6 +20774,7 @@ + @@ -19535,6 +20792,7 @@ + @@ -19550,6 +20808,7 @@ + @@ -19566,6 +20825,7 @@ + @@ -19579,6 +20839,7 @@ + @@ -19594,6 +20855,7 @@ + @@ -19608,6 +20870,7 @@ + @@ -19624,6 +20887,7 @@ + @@ -19638,6 +20902,7 @@ + @@ -19653,6 +20918,7 @@ + @@ -19669,6 +20935,7 @@ + @@ -19683,6 +20950,7 @@ + @@ -19698,6 +20966,7 @@ + @@ -19711,6 +20980,7 @@ + @@ -19724,6 +20994,7 @@ + @@ -19737,6 +21008,7 @@ + @@ -19750,6 +21022,7 @@ + @@ -19763,6 +21036,7 @@ + @@ -19776,6 +21050,7 @@ + @@ -19793,6 +21068,7 @@ + @@ -19806,6 +21082,7 @@ + @@ -19821,6 +21098,7 @@ + @@ -19834,6 +21112,7 @@ + @@ -19849,6 +21128,7 @@ + @@ -19864,6 +21144,7 @@ + @@ -19879,6 +21160,7 @@ + @@ -19894,6 +21176,7 @@ + @@ -19909,6 +21192,7 @@ + @@ -19925,6 +21209,7 @@ + @@ -19941,6 +21226,7 @@ + @@ -19955,6 +21241,7 @@ + @@ -19969,6 +21256,7 @@ + @@ -19983,6 +21271,7 @@ + @@ -19999,6 +21288,7 @@ + @@ -20015,6 +21305,7 @@ + @@ -20054,6 +21345,7 @@ + @@ -20067,6 +21359,7 @@ + @@ -20080,6 +21373,7 @@ + @@ -20095,6 +21389,7 @@ + @@ -20108,6 +21403,7 @@ + @@ -20121,6 +21417,7 @@ + @@ -20134,6 +21431,7 @@ + @@ -20147,6 +21445,7 @@ + @@ -20162,6 +21461,7 @@ + @@ -20175,6 +21475,7 @@ + @@ -20190,6 +21491,7 @@ + @@ -20205,6 +21507,7 @@ + @@ -20218,6 +21521,7 @@ + @@ -20231,6 +21535,7 @@ + @@ -20260,6 +21565,7 @@ + @@ -20276,6 +21582,7 @@ + @@ -20291,6 +21598,7 @@ + @@ -20307,6 +21615,7 @@ + @@ -20335,6 +21644,7 @@ + @@ -20403,6 +21713,7 @@ + @@ -20416,6 +21727,7 @@ + @@ -20429,6 +21741,7 @@ + @@ -20442,6 +21755,7 @@ + @@ -20455,6 +21769,7 @@ + @@ -20471,6 +21786,7 @@ + @@ -20487,6 +21803,7 @@ + @@ -20503,6 +21820,7 @@ + @@ -20520,6 +21838,7 @@ + @@ -20532,6 +21851,7 @@ Infogrames + @@ -20547,6 +21867,7 @@ + @@ -20560,6 +21881,7 @@ + @@ -20575,6 +21897,7 @@ + @@ -20588,6 +21911,7 @@ + @@ -20601,6 +21925,7 @@ + @@ -20614,6 +21939,7 @@ + @@ -20629,6 +21955,7 @@ + @@ -20642,6 +21969,7 @@ + @@ -20655,6 +21983,7 @@ + @@ -20670,6 +21999,7 @@ + @@ -20688,6 +22018,7 @@ + @@ -20705,6 +22036,7 @@ + @@ -20720,6 +22052,7 @@ + @@ -20733,6 +22066,7 @@ + @@ -20746,6 +22080,7 @@ + @@ -20761,6 +22096,7 @@ + @@ -20776,6 +22112,7 @@ + @@ -20789,6 +22126,7 @@ + @@ -20802,6 +22140,7 @@ + @@ -20816,6 +22155,7 @@ + @@ -20832,6 +22172,7 @@ + @@ -20846,6 +22187,7 @@ + @@ -20860,6 +22202,7 @@ + @@ -20875,6 +22218,7 @@ + @@ -20890,6 +22234,7 @@ + @@ -20906,6 +22251,7 @@ + @@ -20919,6 +22265,7 @@ + @@ -20933,6 +22280,7 @@ + @@ -20947,6 +22295,7 @@ + @@ -20961,6 +22310,7 @@ + @@ -20974,6 +22324,7 @@ + @@ -20987,6 +22338,7 @@ + @@ -21002,6 +22354,7 @@ + @@ -21017,6 +22370,7 @@ + @@ -21030,6 +22384,7 @@ + @@ -21043,6 +22398,7 @@ + @@ -21058,6 +22414,7 @@ + @@ -21071,6 +22428,7 @@ + @@ -21100,6 +22458,7 @@ + @@ -21115,6 +22474,7 @@ + @@ -21131,6 +22491,7 @@ + @@ -21146,6 +22507,7 @@ + @@ -21158,6 +22520,7 @@ Mahou + @@ -21174,6 +22537,7 @@ + @@ -21189,6 +22553,7 @@ + @@ -21205,6 +22570,7 @@ + @@ -21222,6 +22588,7 @@ + @@ -21235,6 +22602,7 @@ + @@ -21248,6 +22616,7 @@ + @@ -21261,6 +22630,7 @@ + @@ -21276,6 +22646,7 @@ + @@ -21289,6 +22660,7 @@ + @@ -21305,6 +22677,7 @@ + @@ -21320,6 +22693,7 @@ + @@ -21335,6 +22709,7 @@ + @@ -21350,6 +22725,7 @@ + @@ -21365,6 +22741,7 @@ + @@ -21378,6 +22755,7 @@ + @@ -21392,6 +22770,7 @@ + @@ -21408,6 +22787,7 @@ + @@ -21424,6 +22804,7 @@ + @@ -21438,6 +22819,7 @@ + @@ -21454,6 +22836,7 @@ + @@ -21470,6 +22853,7 @@ + @@ -21485,6 +22869,7 @@ + @@ -21500,6 +22885,7 @@ + @@ -21516,6 +22902,7 @@ + @@ -21533,6 +22920,7 @@ + @@ -21546,6 +22934,7 @@ + @@ -21561,6 +22950,7 @@ + @@ -21577,6 +22967,7 @@ + @@ -21592,6 +22983,7 @@ + @@ -21606,6 +22998,7 @@ + @@ -21621,6 +23014,7 @@ + @@ -21635,6 +23029,7 @@ + @@ -21650,6 +23045,7 @@ + @@ -21664,6 +23060,7 @@ + @@ -21681,6 +23078,7 @@ + @@ -21696,6 +23094,7 @@ + @@ -21712,6 +23111,7 @@ + @@ -21727,6 +23127,7 @@ + @@ -21743,6 +23144,7 @@ + @@ -21774,6 +23176,7 @@ + @@ -21788,6 +23191,7 @@ + @@ -21804,6 +23208,7 @@ + @@ -21820,6 +23225,7 @@ + @@ -21835,6 +23241,7 @@ + @@ -21848,6 +23255,7 @@ + @@ -21862,6 +23270,7 @@ + @@ -21875,6 +23284,7 @@ + @@ -21888,6 +23298,7 @@ + @@ -21904,6 +23315,7 @@ + @@ -21919,6 +23331,7 @@ + @@ -21932,6 +23345,7 @@ + @@ -21945,6 +23359,7 @@ + @@ -21958,6 +23373,7 @@ + @@ -21972,6 +23388,7 @@ + @@ -21987,6 +23404,7 @@ + @@ -22001,6 +23419,7 @@ + @@ -22016,6 +23435,7 @@ + @@ -22033,6 +23453,7 @@ + @@ -22050,6 +23471,7 @@ + @@ -22066,6 +23488,7 @@ + @@ -22079,6 +23502,7 @@ + @@ -22092,6 +23516,7 @@ + @@ -22107,6 +23532,7 @@ + @@ -22120,6 +23546,7 @@ + @@ -22159,6 +23586,7 @@ + @@ -22173,6 +23601,7 @@ + @@ -22188,6 +23617,7 @@ + @@ -22201,6 +23631,7 @@ + @@ -22219,6 +23650,7 @@ + @@ -22235,6 +23667,7 @@ + @@ -22250,6 +23683,7 @@ + @@ -22266,6 +23700,7 @@ + @@ -22281,6 +23716,7 @@ + @@ -22296,6 +23732,7 @@ + @@ -22309,6 +23746,7 @@ + @@ -22322,6 +23760,7 @@ + @@ -22337,6 +23776,7 @@ + @@ -22350,6 +23790,7 @@ + @@ -22365,6 +23806,7 @@ + @@ -22378,6 +23820,7 @@ + @@ -22392,6 +23835,7 @@ + @@ -22407,6 +23851,7 @@ + @@ -22420,6 +23865,7 @@ Nintendo + @@ -22437,6 +23883,7 @@ + @@ -22450,6 +23897,7 @@ + @@ -22463,6 +23911,7 @@ + @@ -22506,6 +23955,7 @@ + @@ -22519,6 +23969,7 @@ + @@ -22532,6 +23983,7 @@ + @@ -22547,6 +23999,7 @@ + @@ -22560,6 +24013,7 @@ + @@ -22573,6 +24027,7 @@ + @@ -22589,6 +24044,7 @@ + @@ -22605,6 +24061,7 @@ + @@ -22620,6 +24077,7 @@ + @@ -22636,6 +24094,7 @@ + @@ -22653,6 +24112,7 @@ + @@ -22668,6 +24128,7 @@ + @@ -22683,6 +24144,7 @@ + @@ -22699,6 +24161,7 @@ + @@ -22714,6 +24177,7 @@ + @@ -22729,6 +24193,7 @@ + @@ -22746,6 +24211,7 @@ + @@ -22761,6 +24227,7 @@ + @@ -22774,6 +24241,7 @@ + @@ -22790,6 +24258,7 @@ + @@ -22805,6 +24274,7 @@ + @@ -22822,6 +24292,7 @@ + @@ -22839,6 +24310,7 @@ + @@ -22854,6 +24326,7 @@ + @@ -22867,6 +24340,7 @@ + @@ -22880,6 +24354,7 @@ + @@ -22896,6 +24371,7 @@ + @@ -22909,6 +24385,7 @@ + @@ -22925,6 +24402,7 @@ + @@ -22972,6 +24450,7 @@ Sachen + @@ -22995,6 +24474,7 @@ Sachen + @@ -23007,6 +24487,7 @@ Sachen + @@ -23019,6 +24500,7 @@ Sachen + @@ -23042,6 +24524,7 @@ Sachen + @@ -23054,6 +24537,7 @@ Sachen + @@ -23066,6 +24550,7 @@ Sachen + @@ -23078,6 +24563,7 @@ Sachen + @@ -23101,6 +24587,7 @@ Sachen + @@ -23159,6 +24646,7 @@ Sachen + @@ -23173,6 +24661,7 @@ Sachen + @@ -23185,6 +24674,7 @@ Sachen + @@ -23199,6 +24689,7 @@ <unknown> + @@ -23211,6 +24702,7 @@ Yong Yong + @@ -23223,6 +24715,7 @@ <unknown> + @@ -23235,6 +24728,7 @@ <unknown> + @@ -23249,6 +24743,7 @@ SKOB + @@ -23263,6 +24758,7 @@ SKOB + @@ -23294,6 +24790,7 @@ + @@ -23306,7 +24803,8 @@ GOWIN - + + @@ -23320,6 +24818,7 @@ + @@ -23333,6 +24832,7 @@ + @@ -23345,6 +24845,7 @@ GOWIN + @@ -23358,6 +24859,7 @@ + @@ -23371,6 +24873,7 @@ + @@ -23383,6 +24886,7 @@ GOWIN + @@ -23411,6 +24915,7 @@ <unknown> + @@ -23424,6 +24929,7 @@ <unknown> + @@ -23437,7 +24943,7 @@ Nintendo - + @@ -23452,7 +24958,7 @@ - + @@ -23464,7 +24970,7 @@ 19?? <unknown> - + @@ -23479,6 +24985,7 @@ + diff --git a/hash/gbcolor.xml b/hash/gbcolor.xml index c97acd4ec5d..9c0f93d4ff6 100644 --- a/hash/gbcolor.xml +++ b/hash/gbcolor.xml @@ -34,6 +34,7 @@ Undumped Pirates: + @@ -48,6 +49,7 @@ Undumped Pirates: + @@ -62,6 +64,7 @@ Undumped Pirates: + @@ -77,6 +80,7 @@ Undumped Pirates: + @@ -91,6 +95,7 @@ Undumped Pirates: + @@ -105,6 +110,7 @@ Undumped Pirates: + @@ -119,6 +125,7 @@ Undumped Pirates: + @@ -133,6 +140,7 @@ Undumped Pirates: + @@ -147,6 +155,7 @@ Undumped Pirates: + @@ -164,6 +173,7 @@ Undumped Pirates: + @@ -177,6 +187,7 @@ Undumped Pirates: + @@ -192,6 +203,7 @@ Undumped Pirates: + @@ -206,6 +218,7 @@ Undumped Pirates: + @@ -219,6 +232,7 @@ Undumped Pirates: + @@ -232,6 +246,7 @@ Undumped Pirates: + @@ -246,6 +261,7 @@ Undumped Pirates: + @@ -262,6 +278,7 @@ Undumped Pirates: + @@ -278,6 +295,7 @@ Undumped Pirates: + @@ -292,6 +310,7 @@ Undumped Pirates: + @@ -306,6 +325,7 @@ Undumped Pirates: + @@ -320,6 +340,7 @@ Undumped Pirates: + @@ -334,6 +355,7 @@ Undumped Pirates: + @@ -348,6 +370,7 @@ Undumped Pirates: + @@ -364,6 +387,7 @@ Undumped Pirates: + @@ -380,6 +404,7 @@ Undumped Pirates: + @@ -393,6 +418,7 @@ Undumped Pirates: + @@ -409,6 +435,7 @@ Undumped Pirates: + @@ -423,6 +450,7 @@ Undumped Pirates: + @@ -437,6 +465,7 @@ Undumped Pirates: + @@ -453,6 +482,7 @@ Undumped Pirates: + @@ -471,6 +501,7 @@ Undumped Pirates: + @@ -489,6 +520,7 @@ Undumped Pirates: + @@ -507,6 +539,7 @@ Undumped Pirates: + @@ -523,6 +556,7 @@ Undumped Pirates: + @@ -537,6 +571,7 @@ Undumped Pirates: + @@ -551,6 +586,7 @@ Undumped Pirates: + @@ -566,6 +602,7 @@ Undumped Pirates: + @@ -579,6 +616,7 @@ Undumped Pirates: + @@ -593,6 +631,7 @@ Undumped Pirates: + @@ -607,6 +646,7 @@ Undumped Pirates: + @@ -621,6 +661,7 @@ Undumped Pirates: + @@ -637,6 +678,7 @@ Undumped Pirates: + @@ -652,6 +694,7 @@ Undumped Pirates: + @@ -665,6 +708,7 @@ Undumped Pirates: + @@ -681,6 +725,7 @@ Undumped Pirates: + @@ -697,6 +742,7 @@ Undumped Pirates: + @@ -713,6 +759,7 @@ Undumped Pirates: + @@ -727,6 +774,7 @@ Undumped Pirates: + @@ -741,6 +789,7 @@ Undumped Pirates: + @@ -755,6 +804,7 @@ Undumped Pirates: + @@ -769,6 +819,7 @@ Undumped Pirates: + @@ -783,6 +834,7 @@ Undumped Pirates: + @@ -797,6 +849,7 @@ Undumped Pirates: + @@ -810,6 +863,7 @@ Undumped Pirates: + @@ -824,6 +878,7 @@ Undumped Pirates: + @@ -837,6 +892,7 @@ Undumped Pirates: + @@ -851,6 +907,7 @@ Undumped Pirates: + @@ -865,6 +922,7 @@ Undumped Pirates: + @@ -879,6 +937,7 @@ Undumped Pirates: + @@ -895,6 +954,7 @@ Undumped Pirates: + @@ -910,6 +970,7 @@ Undumped Pirates: Rocket Games + @@ -923,6 +984,7 @@ Undumped Pirates: Rocket Games + @@ -935,6 +997,7 @@ Undumped Pirates: Rocket Games + @@ -949,6 +1012,7 @@ Undumped Pirates: + @@ -965,6 +1029,7 @@ Undumped Pirates: + @@ -981,6 +1046,7 @@ Undumped Pirates: + @@ -997,6 +1063,7 @@ Undumped Pirates: + @@ -1015,6 +1082,7 @@ Undumped Pirates: + @@ -1030,6 +1098,7 @@ Undumped Pirates: + @@ -1045,6 +1114,7 @@ Undumped Pirates: + @@ -1063,6 +1133,7 @@ Undumped Pirates: + @@ -1081,6 +1152,7 @@ Undumped Pirates: + @@ -1096,6 +1168,7 @@ Undumped Pirates: + @@ -1109,6 +1182,7 @@ Undumped Pirates: + @@ -1123,6 +1197,7 @@ Undumped Pirates: + @@ -1136,6 +1211,7 @@ Undumped Pirates: + @@ -1151,6 +1227,7 @@ Undumped Pirates: + @@ -1169,6 +1246,7 @@ Undumped Pirates: + @@ -1186,6 +1264,7 @@ Undumped Pirates: + @@ -1204,6 +1283,7 @@ Undumped Pirates: + @@ -1221,6 +1301,7 @@ Undumped Pirates: + @@ -1239,6 +1320,7 @@ Undumped Pirates: + @@ -1254,6 +1336,7 @@ Undumped Pirates: + @@ -1270,6 +1353,7 @@ Undumped Pirates: + @@ -1285,6 +1369,7 @@ Undumped Pirates: + @@ -1299,6 +1384,7 @@ Undumped Pirates: + @@ -1312,6 +1398,7 @@ Undumped Pirates: + @@ -1325,6 +1412,7 @@ Undumped Pirates: + @@ -1338,6 +1426,7 @@ Undumped Pirates: + @@ -1351,6 +1440,7 @@ Undumped Pirates: + @@ -1364,6 +1454,7 @@ Undumped Pirates: + @@ -1377,6 +1468,7 @@ Undumped Pirates: + @@ -1390,6 +1482,7 @@ Undumped Pirates: + @@ -1404,6 +1497,7 @@ Undumped Pirates: + @@ -1418,6 +1512,7 @@ Undumped Pirates: + @@ -1432,6 +1527,7 @@ Undumped Pirates: + @@ -1446,6 +1542,7 @@ Undumped Pirates: + @@ -1464,6 +1561,7 @@ Undumped Pirates: + @@ -1479,6 +1577,7 @@ Undumped Pirates: + @@ -1495,6 +1594,7 @@ Undumped Pirates: + @@ -1509,6 +1609,7 @@ Undumped Pirates: + @@ -1523,6 +1624,7 @@ Undumped Pirates: + @@ -1539,6 +1641,7 @@ Undumped Pirates: + @@ -1554,6 +1657,7 @@ Undumped Pirates: + @@ -1568,6 +1672,7 @@ Undumped Pirates: + @@ -1582,6 +1687,7 @@ Undumped Pirates: + @@ -1596,6 +1702,7 @@ Undumped Pirates: + @@ -1610,6 +1717,7 @@ Undumped Pirates: + @@ -1624,6 +1732,7 @@ Undumped Pirates: + @@ -1640,6 +1749,7 @@ Undumped Pirates: + @@ -1656,6 +1766,7 @@ Undumped Pirates: + @@ -1672,6 +1783,7 @@ Undumped Pirates: + @@ -1685,6 +1797,7 @@ Undumped Pirates: + @@ -1700,6 +1813,7 @@ Undumped Pirates: + @@ -1716,6 +1830,7 @@ Undumped Pirates: + @@ -1732,6 +1847,7 @@ Undumped Pirates: + @@ -1748,6 +1864,7 @@ Undumped Pirates: + @@ -1762,6 +1879,7 @@ Undumped Pirates: + @@ -1778,6 +1896,7 @@ Undumped Pirates: + @@ -1794,6 +1913,7 @@ Undumped Pirates: + @@ -1810,6 +1930,7 @@ Undumped Pirates: + @@ -1826,6 +1947,7 @@ Undumped Pirates: + @@ -1841,6 +1963,7 @@ Undumped Pirates: + @@ -1857,6 +1980,7 @@ Undumped Pirates: + @@ -1873,6 +1997,7 @@ Undumped Pirates: + @@ -1886,6 +2011,7 @@ Undumped Pirates: + @@ -1900,6 +2026,7 @@ Undumped Pirates: + @@ -1914,6 +2041,7 @@ Undumped Pirates: + @@ -1928,6 +2056,7 @@ Undumped Pirates: + @@ -1942,6 +2071,7 @@ Undumped Pirates: + @@ -1956,6 +2086,7 @@ Undumped Pirates: + @@ -1970,6 +2101,7 @@ Undumped Pirates: + @@ -1984,6 +2116,7 @@ Undumped Pirates: + @@ -2000,6 +2133,7 @@ Undumped Pirates: + @@ -2017,6 +2151,7 @@ Undumped Pirates: + @@ -2035,6 +2170,7 @@ Undumped Pirates: + @@ -2050,6 +2186,7 @@ Undumped Pirates: Hudson Soft + @@ -2066,6 +2203,7 @@ Undumped Pirates: + @@ -2084,6 +2222,7 @@ Undumped Pirates: + @@ -2100,6 +2239,7 @@ Undumped Pirates: + @@ -2118,6 +2258,7 @@ Undumped Pirates: + @@ -2133,6 +2274,7 @@ Undumped Pirates: + @@ -2151,6 +2293,7 @@ Undumped Pirates: + @@ -2166,6 +2309,7 @@ Undumped Pirates: + @@ -2182,6 +2326,7 @@ Undumped Pirates: + @@ -2198,6 +2343,7 @@ Undumped Pirates: + @@ -2216,6 +2362,7 @@ Undumped Pirates: + @@ -2232,6 +2379,7 @@ Undumped Pirates: + @@ -2245,6 +2393,7 @@ Undumped Pirates: + @@ -2258,6 +2407,7 @@ Undumped Pirates: + @@ -2271,6 +2421,7 @@ Undumped Pirates: + @@ -2286,6 +2437,7 @@ Undumped Pirates: + @@ -2300,6 +2452,7 @@ Undumped Pirates: + @@ -2314,6 +2467,7 @@ Undumped Pirates: + @@ -2328,6 +2482,7 @@ Undumped Pirates: + @@ -2344,6 +2499,7 @@ Undumped Pirates: + @@ -2358,6 +2514,7 @@ Undumped Pirates: + @@ -2371,6 +2528,7 @@ Undumped Pirates: + @@ -2387,6 +2545,7 @@ Undumped Pirates: + @@ -2403,6 +2562,7 @@ Undumped Pirates: + @@ -2419,6 +2579,7 @@ Undumped Pirates: + @@ -2434,6 +2595,7 @@ Undumped Pirates: + @@ -2448,6 +2610,7 @@ Undumped Pirates: + @@ -2462,6 +2625,7 @@ Undumped Pirates: + @@ -2476,6 +2640,7 @@ Undumped Pirates: + @@ -2490,6 +2655,7 @@ Undumped Pirates: + @@ -2504,6 +2670,7 @@ Undumped Pirates: + @@ -2520,6 +2687,7 @@ Undumped Pirates: + @@ -2536,6 +2704,7 @@ Undumped Pirates: + @@ -2551,6 +2720,7 @@ Undumped Pirates: Bonsai Entertainment + @@ -2566,6 +2736,7 @@ Undumped Pirates: + @@ -2583,6 +2754,7 @@ Undumped Pirates: + @@ -2600,6 +2772,7 @@ Undumped Pirates: + @@ -2618,6 +2791,7 @@ Undumped Pirates: + @@ -2634,6 +2808,7 @@ Undumped Pirates: + @@ -2650,6 +2825,7 @@ Undumped Pirates: + @@ -2664,6 +2840,7 @@ Undumped Pirates: + @@ -2678,6 +2855,7 @@ Undumped Pirates: + @@ -2694,6 +2872,7 @@ Undumped Pirates: + @@ -2710,6 +2889,7 @@ Undumped Pirates: + @@ -2725,6 +2905,7 @@ Undumped Pirates: + @@ -2739,6 +2920,7 @@ Undumped Pirates: + @@ -2753,6 +2935,7 @@ Undumped Pirates: + @@ -2767,6 +2950,7 @@ Undumped Pirates: + @@ -2783,6 +2967,7 @@ Undumped Pirates: + @@ -2798,6 +2983,7 @@ Undumped Pirates: + @@ -2811,6 +2997,7 @@ Undumped Pirates: + @@ -2825,6 +3012,7 @@ Undumped Pirates: + @@ -2838,6 +3026,7 @@ Undumped Pirates: + @@ -2851,6 +3040,7 @@ Undumped Pirates: + @@ -2866,6 +3056,7 @@ Undumped Pirates: + @@ -2884,6 +3075,7 @@ Undumped Pirates: + @@ -2900,6 +3092,7 @@ Undumped Pirates: + @@ -2916,6 +3109,7 @@ Undumped Pirates: + @@ -2934,6 +3128,7 @@ Undumped Pirates: + @@ -2950,6 +3145,7 @@ Undumped Pirates: + @@ -2966,6 +3162,7 @@ Undumped Pirates: + @@ -2982,6 +3179,7 @@ Undumped Pirates: + @@ -2997,6 +3195,7 @@ Undumped Pirates: + @@ -3010,6 +3209,7 @@ Undumped Pirates: + @@ -3024,6 +3224,7 @@ Undumped Pirates: + @@ -3042,6 +3243,7 @@ Undumped Pirates: + @@ -3060,6 +3262,7 @@ Undumped Pirates: + @@ -3076,6 +3279,7 @@ Undumped Pirates: + @@ -3089,6 +3293,7 @@ Undumped Pirates: + @@ -3105,6 +3310,7 @@ Undumped Pirates: + @@ -3118,6 +3324,7 @@ Undumped Pirates: + @@ -3132,6 +3339,7 @@ Undumped Pirates: + @@ -3148,6 +3356,7 @@ Undumped Pirates: + @@ -3162,6 +3371,7 @@ Undumped Pirates: + @@ -3175,6 +3385,7 @@ Undumped Pirates: + @@ -3191,6 +3402,7 @@ Undumped Pirates: + @@ -3209,6 +3421,7 @@ Undumped Pirates: + @@ -3227,6 +3440,7 @@ Undumped Pirates: + @@ -3243,6 +3457,7 @@ Undumped Pirates: + @@ -3257,6 +3472,7 @@ Undumped Pirates: + @@ -3273,6 +3489,7 @@ Undumped Pirates: + @@ -3287,6 +3504,7 @@ Undumped Pirates: + @@ -3303,6 +3521,7 @@ Undumped Pirates: + @@ -3321,6 +3540,7 @@ Undumped Pirates: + @@ -3339,6 +3559,7 @@ Undumped Pirates: + @@ -3354,6 +3575,7 @@ Undumped Pirates: + @@ -3369,6 +3591,7 @@ Undumped Pirates: + @@ -3385,6 +3608,7 @@ Undumped Pirates: + @@ -3403,6 +3627,7 @@ Undumped Pirates: + @@ -3421,6 +3646,7 @@ Undumped Pirates: + @@ -3435,6 +3661,7 @@ Undumped Pirates: + @@ -3451,6 +3678,7 @@ Undumped Pirates: + @@ -3469,6 +3697,7 @@ Undumped Pirates: + @@ -3487,6 +3716,7 @@ Undumped Pirates: + @@ -3505,6 +3735,7 @@ Undumped Pirates: + @@ -3521,6 +3752,7 @@ Undumped Pirates: + @@ -3539,6 +3771,7 @@ Undumped Pirates: + @@ -3555,6 +3788,7 @@ Undumped Pirates: + @@ -3570,6 +3804,7 @@ Undumped Pirates: + @@ -3588,6 +3823,7 @@ Undumped Pirates: + @@ -3606,6 +3842,7 @@ Undumped Pirates: + @@ -3622,6 +3859,7 @@ Undumped Pirates: + @@ -3636,6 +3874,7 @@ Undumped Pirates: + @@ -3651,6 +3890,7 @@ Undumped Pirates: + @@ -3667,6 +3907,7 @@ Undumped Pirates: + @@ -3683,6 +3924,7 @@ Undumped Pirates: + @@ -3697,6 +3939,7 @@ Undumped Pirates: + @@ -3713,6 +3956,7 @@ Undumped Pirates: + @@ -3731,6 +3975,7 @@ Undumped Pirates: + @@ -3747,6 +3992,7 @@ Undumped Pirates: + @@ -3764,6 +4010,7 @@ Undumped Pirates: + @@ -3780,6 +4027,7 @@ Undumped Pirates: + @@ -3798,6 +4046,7 @@ Undumped Pirates: + @@ -3816,6 +4065,7 @@ Undumped Pirates: + @@ -3832,6 +4082,7 @@ Undumped Pirates: + @@ -3848,6 +4099,7 @@ Undumped Pirates: + @@ -3866,6 +4118,7 @@ Undumped Pirates: + @@ -3882,6 +4135,7 @@ Undumped Pirates: + @@ -3896,6 +4150,7 @@ Undumped Pirates: Ubi Soft + @@ -3912,6 +4167,7 @@ Undumped Pirates: + @@ -3928,6 +4184,7 @@ Undumped Pirates: + @@ -3944,6 +4201,7 @@ Undumped Pirates: + @@ -3958,6 +4216,7 @@ Undumped Pirates: + @@ -3972,6 +4231,7 @@ Undumped Pirates: + @@ -3986,6 +4246,7 @@ Undumped Pirates: + @@ -4000,6 +4261,7 @@ Undumped Pirates: + @@ -4016,6 +4278,7 @@ Undumped Pirates: + @@ -4033,6 +4296,7 @@ Undumped Pirates: + @@ -4051,6 +4315,7 @@ Undumped Pirates: + @@ -4069,6 +4334,7 @@ Undumped Pirates: + @@ -4087,6 +4353,7 @@ Undumped Pirates: + @@ -4101,6 +4368,7 @@ Undumped Pirates: + @@ -4115,6 +4383,7 @@ Undumped Pirates: + @@ -4131,6 +4400,7 @@ Undumped Pirates: + @@ -4145,6 +4415,7 @@ Undumped Pirates: Nintendo + @@ -4161,6 +4432,7 @@ Undumped Pirates: + @@ -4179,6 +4451,7 @@ Undumped Pirates: + @@ -4196,6 +4469,7 @@ Undumped Pirates: + @@ -4213,6 +4487,7 @@ Undumped Pirates: + @@ -4231,6 +4506,7 @@ Undumped Pirates: + @@ -4248,6 +4524,7 @@ Undumped Pirates: + @@ -4266,6 +4543,7 @@ Undumped Pirates: + @@ -4284,6 +4562,7 @@ Undumped Pirates: + @@ -4302,6 +4581,7 @@ Undumped Pirates: + @@ -4320,6 +4600,7 @@ Undumped Pirates: + @@ -4338,6 +4619,7 @@ Undumped Pirates: + @@ -4356,6 +4638,7 @@ Undumped Pirates: + @@ -4372,6 +4655,7 @@ Undumped Pirates: + @@ -4386,6 +4670,7 @@ Undumped Pirates: + @@ -4400,6 +4685,7 @@ Undumped Pirates: + @@ -4414,6 +4700,7 @@ Undumped Pirates: + @@ -4430,6 +4717,7 @@ Undumped Pirates: + @@ -4446,6 +4734,7 @@ Undumped Pirates: + @@ -4460,6 +4749,7 @@ Undumped Pirates: + @@ -4474,6 +4764,7 @@ Undumped Pirates: + @@ -4492,6 +4783,7 @@ Undumped Pirates: + @@ -4508,6 +4800,7 @@ Undumped Pirates: + @@ -4524,6 +4817,7 @@ Undumped Pirates: + @@ -4540,6 +4834,7 @@ Undumped Pirates: + @@ -4556,6 +4851,7 @@ Undumped Pirates: + @@ -4572,6 +4868,7 @@ Undumped Pirates: + @@ -4587,6 +4884,7 @@ Undumped Pirates: + @@ -4603,6 +4901,7 @@ Undumped Pirates: + @@ -4621,6 +4920,7 @@ Undumped Pirates: + @@ -4636,6 +4936,7 @@ Undumped Pirates: + @@ -4654,6 +4955,7 @@ Undumped Pirates: + @@ -4672,6 +4974,7 @@ Undumped Pirates: + @@ -4690,6 +4993,7 @@ Undumped Pirates: + @@ -4708,6 +5012,7 @@ Undumped Pirates: + @@ -4724,6 +5029,7 @@ Undumped Pirates: + @@ -4738,6 +5044,7 @@ Undumped Pirates: + @@ -4754,6 +5061,7 @@ Undumped Pirates: + @@ -4769,6 +5077,7 @@ Undumped Pirates: + @@ -4785,6 +5094,7 @@ Undumped Pirates: + @@ -4800,6 +5110,7 @@ Undumped Pirates: + @@ -4815,6 +5126,7 @@ Undumped Pirates: + @@ -4830,6 +5142,7 @@ Undumped Pirates: + @@ -4846,6 +5159,7 @@ Undumped Pirates: + @@ -4860,6 +5174,7 @@ Undumped Pirates: + @@ -4874,6 +5189,7 @@ Undumped Pirates: + @@ -4887,6 +5203,7 @@ Undumped Pirates: + @@ -4903,6 +5220,7 @@ Undumped Pirates: + @@ -4919,6 +5237,7 @@ Undumped Pirates: + @@ -4935,6 +5254,7 @@ Undumped Pirates: + @@ -4951,6 +5271,7 @@ Undumped Pirates: + @@ -4967,6 +5288,7 @@ Undumped Pirates: + @@ -4985,6 +5307,7 @@ Undumped Pirates: + @@ -5003,6 +5326,7 @@ Undumped Pirates: + @@ -5021,6 +5345,7 @@ Undumped Pirates: + @@ -5035,6 +5360,7 @@ Undumped Pirates: Engine Software + @@ -5051,6 +5377,7 @@ Undumped Pirates: + @@ -5067,6 +5394,7 @@ Undumped Pirates: + @@ -5083,6 +5411,7 @@ Undumped Pirates: + @@ -5099,6 +5428,7 @@ Undumped Pirates: + @@ -5115,6 +5445,7 @@ Undumped Pirates: + @@ -5131,6 +5462,7 @@ Undumped Pirates: + @@ -5145,6 +5477,7 @@ Undumped Pirates: + @@ -5159,6 +5492,7 @@ Undumped Pirates: + @@ -5175,6 +5509,7 @@ Undumped Pirates: + @@ -5191,6 +5526,7 @@ Undumped Pirates: + @@ -5206,6 +5542,7 @@ Undumped Pirates: + @@ -5219,6 +5556,7 @@ Undumped Pirates: + @@ -5232,6 +5570,7 @@ Undumped Pirates: + @@ -5246,6 +5585,7 @@ Undumped Pirates: + @@ -5262,6 +5602,7 @@ Undumped Pirates: + @@ -5278,6 +5619,7 @@ Undumped Pirates: + @@ -5294,6 +5636,7 @@ Undumped Pirates: + @@ -5312,6 +5655,7 @@ Undumped Pirates: + @@ -5328,6 +5672,7 @@ Undumped Pirates: + @@ -5343,6 +5688,7 @@ Undumped Pirates: + @@ -5356,6 +5702,7 @@ Undumped Pirates: + @@ -5370,6 +5717,7 @@ Undumped Pirates: + @@ -5384,6 +5732,7 @@ Undumped Pirates: + @@ -5398,6 +5747,7 @@ Undumped Pirates: + @@ -5414,6 +5764,7 @@ Undumped Pirates: + @@ -5428,6 +5779,7 @@ Undumped Pirates: + @@ -5442,6 +5794,7 @@ Undumped Pirates: + @@ -5454,6 +5807,7 @@ Undumped Pirates: Ubi Soft + @@ -5470,6 +5824,7 @@ Undumped Pirates: + @@ -5486,6 +5841,7 @@ Undumped Pirates: + @@ -5504,6 +5860,7 @@ Undumped Pirates: + @@ -5520,6 +5877,7 @@ Undumped Pirates: + @@ -5538,6 +5896,7 @@ Undumped Pirates: + @@ -5556,6 +5915,7 @@ Undumped Pirates: + @@ -5574,6 +5934,7 @@ Undumped Pirates: + @@ -5589,6 +5950,7 @@ Undumped Pirates: + @@ -5603,6 +5965,7 @@ Undumped Pirates: + @@ -5619,6 +5982,7 @@ Undumped Pirates: + @@ -5633,6 +5997,7 @@ Undumped Pirates: + @@ -5647,6 +6012,7 @@ Undumped Pirates: + @@ -5661,6 +6027,7 @@ Undumped Pirates: + @@ -5675,6 +6042,7 @@ Undumped Pirates: + @@ -5689,6 +6057,7 @@ Undumped Pirates: + @@ -5705,6 +6074,7 @@ Undumped Pirates: + @@ -5718,6 +6088,7 @@ Undumped Pirates: + @@ -5731,6 +6102,7 @@ Undumped Pirates: + @@ -5744,6 +6116,7 @@ Undumped Pirates: + @@ -5757,6 +6130,7 @@ Undumped Pirates: + @@ -5771,6 +6145,7 @@ Undumped Pirates: + @@ -5789,6 +6164,7 @@ Undumped Pirates: + @@ -5807,6 +6183,7 @@ Undumped Pirates: + @@ -5825,6 +6202,7 @@ Undumped Pirates: + @@ -5843,6 +6221,7 @@ Undumped Pirates: + @@ -5859,6 +6238,7 @@ Undumped Pirates: + @@ -5899,6 +6279,7 @@ Undumped Pirates: Rocket Games + @@ -5915,6 +6296,7 @@ Undumped Pirates: + @@ -5933,6 +6315,7 @@ Undumped Pirates: + @@ -5950,6 +6333,7 @@ Undumped Pirates: + @@ -5966,6 +6350,7 @@ Undumped Pirates: + @@ -5982,6 +6367,7 @@ Undumped Pirates: + @@ -5997,6 +6383,7 @@ Undumped Pirates: + @@ -6012,6 +6399,7 @@ Undumped Pirates: + @@ -6027,6 +6415,7 @@ Undumped Pirates: Nintendo + @@ -6040,6 +6429,7 @@ Undumped Pirates: + @@ -6058,6 +6448,7 @@ Undumped Pirates: + @@ -6073,6 +6464,7 @@ Undumped Pirates: + @@ -6091,6 +6483,7 @@ Undumped Pirates: + @@ -6109,6 +6502,7 @@ Undumped Pirates: + @@ -6126,6 +6520,7 @@ Undumped Pirates: + @@ -6140,6 +6535,7 @@ Undumped Pirates: + @@ -6156,6 +6552,7 @@ Undumped Pirates: + @@ -6174,6 +6571,7 @@ Undumped Pirates: + @@ -6192,6 +6590,7 @@ Undumped Pirates: + @@ -6210,6 +6609,7 @@ Undumped Pirates: + @@ -6228,6 +6628,7 @@ Undumped Pirates: + @@ -6243,6 +6644,7 @@ Undumped Pirates: Nintendo + @@ -6257,6 +6659,7 @@ Undumped Pirates: + @@ -6273,6 +6676,7 @@ Undumped Pirates: + @@ -6291,6 +6695,7 @@ Undumped Pirates: + @@ -6309,6 +6714,7 @@ Undumped Pirates: + @@ -6327,6 +6733,7 @@ Undumped Pirates: + @@ -6343,6 +6750,7 @@ Undumped Pirates: + @@ -6357,6 +6765,7 @@ Undumped Pirates: + @@ -6371,6 +6780,7 @@ Undumped Pirates: + @@ -6384,6 +6794,7 @@ Undumped Pirates: + @@ -6396,6 +6807,7 @@ Undumped Pirates: Cryo + @@ -6410,6 +6822,7 @@ Undumped Pirates: + @@ -6424,6 +6837,7 @@ Undumped Pirates: + @@ -6440,6 +6854,7 @@ Undumped Pirates: + @@ -6456,6 +6871,7 @@ Undumped Pirates: + @@ -6469,6 +6885,7 @@ Undumped Pirates: + @@ -6482,6 +6899,7 @@ Undumped Pirates: + @@ -6496,6 +6914,7 @@ Undumped Pirates: + @@ -6510,6 +6929,7 @@ Undumped Pirates: + @@ -6524,6 +6944,7 @@ Undumped Pirates: + @@ -6538,6 +6959,7 @@ Undumped Pirates: + @@ -6551,6 +6973,7 @@ Undumped Pirates: + @@ -6566,6 +6989,7 @@ Undumped Pirates: + @@ -6584,6 +7008,7 @@ Undumped Pirates: + @@ -6601,6 +7026,7 @@ Undumped Pirates: + @@ -6619,6 +7045,7 @@ Undumped Pirates: + @@ -6637,6 +7064,7 @@ Undumped Pirates: + @@ -6654,6 +7082,7 @@ Undumped Pirates: + @@ -6669,6 +7098,7 @@ Undumped Pirates: + @@ -6684,6 +7114,7 @@ Undumped Pirates: + @@ -6700,6 +7131,7 @@ Undumped Pirates: + @@ -6714,6 +7146,7 @@ Undumped Pirates: + @@ -6730,6 +7163,7 @@ Undumped Pirates: + @@ -6748,6 +7182,7 @@ Undumped Pirates: + @@ -6762,6 +7197,7 @@ Undumped Pirates: Bottom Up + @@ -6778,6 +7214,7 @@ Undumped Pirates: + @@ -6794,6 +7231,7 @@ Undumped Pirates: + @@ -6806,6 +7244,7 @@ Undumped Pirates: L.S.P. + @@ -6820,6 +7259,7 @@ Undumped Pirates: + @@ -6836,6 +7276,7 @@ Undumped Pirates: + @@ -6852,6 +7293,7 @@ Undumped Pirates: + @@ -6868,6 +7310,7 @@ Undumped Pirates: + @@ -6886,6 +7329,7 @@ Undumped Pirates: + @@ -6899,6 +7343,7 @@ Undumped Pirates: + @@ -6915,6 +7360,7 @@ Undumped Pirates: + @@ -6931,6 +7377,7 @@ Undumped Pirates: + @@ -6946,6 +7393,7 @@ Undumped Pirates: + @@ -6963,6 +7411,7 @@ Undumped Pirates: + @@ -6979,6 +7428,7 @@ Undumped Pirates: + @@ -6996,6 +7446,7 @@ Undumped Pirates: + @@ -7014,6 +7465,7 @@ Undumped Pirates: + @@ -7032,6 +7484,7 @@ Undumped Pirates: + @@ -7050,6 +7503,7 @@ Undumped Pirates: + @@ -7068,6 +7522,7 @@ Undumped Pirates: + @@ -7086,6 +7541,7 @@ Undumped Pirates: + @@ -7104,6 +7560,7 @@ Undumped Pirates: + @@ -7120,6 +7577,7 @@ Undumped Pirates: + @@ -7136,6 +7594,7 @@ Undumped Pirates: + @@ -7154,6 +7613,7 @@ Undumped Pirates: + @@ -7172,6 +7632,7 @@ Undumped Pirates: + @@ -7190,6 +7651,7 @@ Undumped Pirates: + @@ -7206,6 +7668,7 @@ Undumped Pirates: + @@ -7233,6 +7696,7 @@ Undumped Pirates: + @@ -7249,6 +7713,7 @@ Undumped Pirates: + @@ -7265,6 +7730,7 @@ Undumped Pirates: + @@ -7283,6 +7749,7 @@ Undumped Pirates: + @@ -7298,6 +7765,7 @@ Undumped Pirates: + @@ -7313,6 +7781,7 @@ Undumped Pirates: + @@ -7328,6 +7797,7 @@ Undumped Pirates: + @@ -7344,6 +7814,7 @@ Undumped Pirates: + @@ -7359,6 +7830,7 @@ Undumped Pirates: + @@ -7374,6 +7846,7 @@ Undumped Pirates: + @@ -7389,6 +7862,7 @@ Undumped Pirates: + @@ -7407,6 +7881,7 @@ Undumped Pirates: + @@ -7425,6 +7900,7 @@ Undumped Pirates: + @@ -7443,6 +7919,7 @@ Undumped Pirates: + @@ -7461,6 +7938,7 @@ Undumped Pirates: + @@ -7479,6 +7957,7 @@ Undumped Pirates: + @@ -7494,6 +7973,7 @@ Undumped Pirates: + @@ -7508,6 +7988,7 @@ Undumped Pirates: + @@ -7526,6 +8007,7 @@ Undumped Pirates: + @@ -7542,6 +8024,7 @@ Undumped Pirates: + @@ -7571,6 +8054,7 @@ Undumped Pirates: + @@ -7588,6 +8072,7 @@ Undumped Pirates: + @@ -7606,6 +8091,7 @@ Undumped Pirates: + @@ -7622,6 +8108,7 @@ Undumped Pirates: + @@ -7636,6 +8123,7 @@ Undumped Pirates: + @@ -7652,6 +8140,7 @@ Undumped Pirates: + @@ -7667,6 +8156,7 @@ Undumped Pirates: + @@ -7680,6 +8170,7 @@ Undumped Pirates: + @@ -7696,6 +8187,7 @@ Undumped Pirates: + @@ -7714,6 +8206,7 @@ Undumped Pirates: + @@ -7731,6 +8224,7 @@ Undumped Pirates: + @@ -7749,6 +8243,7 @@ Undumped Pirates: + @@ -7764,6 +8259,7 @@ Undumped Pirates: + @@ -7778,6 +8274,7 @@ Undumped Pirates: + @@ -7792,6 +8289,7 @@ Undumped Pirates: + @@ -7808,6 +8306,7 @@ Undumped Pirates: + @@ -7822,6 +8321,7 @@ Undumped Pirates: + @@ -7835,6 +8335,7 @@ Undumped Pirates: + @@ -7851,6 +8352,7 @@ Undumped Pirates: + @@ -7869,6 +8371,7 @@ Undumped Pirates: + @@ -7885,6 +8388,7 @@ Undumped Pirates: + @@ -7901,6 +8405,7 @@ Undumped Pirates: + @@ -7919,6 +8424,7 @@ Undumped Pirates: + @@ -7937,6 +8443,7 @@ Undumped Pirates: + @@ -7953,6 +8460,7 @@ Undumped Pirates: + @@ -7967,6 +8475,7 @@ Undumped Pirates: + @@ -7981,6 +8490,7 @@ Undumped Pirates: + @@ -7995,6 +8505,7 @@ Undumped Pirates: + @@ -8008,6 +8519,7 @@ Undumped Pirates: + @@ -8022,6 +8534,7 @@ Undumped Pirates: + @@ -8038,6 +8551,7 @@ Undumped Pirates: + @@ -8054,6 +8568,7 @@ Undumped Pirates: + @@ -8070,6 +8585,7 @@ Undumped Pirates: + @@ -8085,6 +8601,7 @@ Undumped Pirates: + @@ -8100,6 +8617,7 @@ Undumped Pirates: + @@ -8116,6 +8634,7 @@ Undumped Pirates: + @@ -8134,6 +8653,7 @@ Undumped Pirates: + @@ -8152,6 +8672,7 @@ Undumped Pirates: + @@ -8170,6 +8691,7 @@ Undumped Pirates: + @@ -8188,6 +8710,7 @@ Undumped Pirates: + @@ -8206,6 +8729,7 @@ Undumped Pirates: + @@ -8224,6 +8748,7 @@ Undumped Pirates: + @@ -8242,6 +8767,7 @@ Undumped Pirates: + @@ -8258,6 +8784,7 @@ Undumped Pirates: + @@ -8272,6 +8799,7 @@ Undumped Pirates: + @@ -8285,6 +8813,7 @@ Undumped Pirates: + @@ -8299,6 +8828,7 @@ Undumped Pirates: + @@ -8315,6 +8845,7 @@ Undumped Pirates: + @@ -8331,6 +8862,7 @@ Undumped Pirates: + @@ -8347,6 +8879,7 @@ Undumped Pirates: + @@ -8365,6 +8898,7 @@ Undumped Pirates: + @@ -8383,6 +8917,7 @@ Undumped Pirates: + @@ -8399,6 +8934,7 @@ Undumped Pirates: + @@ -8415,6 +8951,7 @@ Undumped Pirates: + @@ -8429,6 +8966,7 @@ Undumped Pirates: + @@ -8443,6 +8981,7 @@ Undumped Pirates: + @@ -8459,6 +8998,7 @@ Undumped Pirates: + @@ -8477,6 +9017,7 @@ Undumped Pirates: + @@ -8493,6 +9034,7 @@ Undumped Pirates: + @@ -8508,6 +9050,7 @@ Undumped Pirates: + @@ -8526,6 +9069,7 @@ Undumped Pirates: + @@ -8544,6 +9088,7 @@ Undumped Pirates: + @@ -8562,6 +9107,7 @@ Undumped Pirates: + @@ -8580,6 +9126,7 @@ Undumped Pirates: + @@ -8596,6 +9143,7 @@ Undumped Pirates: + @@ -8614,6 +9162,7 @@ Undumped Pirates: + @@ -8631,6 +9180,7 @@ Undumped Pirates: + @@ -8647,6 +9197,7 @@ Undumped Pirates: + @@ -8665,6 +9216,7 @@ Undumped Pirates: + @@ -8683,6 +9235,7 @@ Undumped Pirates: + @@ -8701,6 +9254,7 @@ Undumped Pirates: + @@ -8729,6 +9283,7 @@ Undumped Pirates: + @@ -8747,6 +9302,7 @@ Undumped Pirates: + @@ -8763,6 +9319,7 @@ Undumped Pirates: + @@ -8782,6 +9339,7 @@ Undumped Pirates: + @@ -8799,6 +9357,7 @@ Undumped Pirates: + @@ -8815,6 +9374,7 @@ Undumped Pirates: + @@ -8830,6 +9390,7 @@ Undumped Pirates: + @@ -8847,6 +9408,7 @@ Undumped Pirates: + @@ -8864,6 +9426,7 @@ Undumped Pirates: + @@ -8880,6 +9443,7 @@ Undumped Pirates: + @@ -8894,6 +9458,7 @@ Undumped Pirates: + @@ -8912,6 +9477,7 @@ Undumped Pirates: + @@ -8928,6 +9494,7 @@ Undumped Pirates: + @@ -8946,6 +9513,7 @@ Undumped Pirates: + @@ -8964,6 +9532,7 @@ Undumped Pirates: + @@ -8982,6 +9551,7 @@ Undumped Pirates: + @@ -9000,6 +9570,7 @@ Undumped Pirates: + @@ -9018,6 +9589,7 @@ Undumped Pirates: + @@ -9034,6 +9606,7 @@ Undumped Pirates: + @@ -9050,6 +9623,7 @@ Undumped Pirates: + @@ -9066,6 +9640,7 @@ Undumped Pirates: + @@ -9084,6 +9659,7 @@ Undumped Pirates: + @@ -9102,6 +9678,7 @@ Undumped Pirates: + @@ -9118,6 +9695,7 @@ Undumped Pirates: + @@ -9131,6 +9709,7 @@ Undumped Pirates: + @@ -9144,6 +9723,7 @@ Undumped Pirates: + @@ -9158,6 +9738,7 @@ Undumped Pirates: + @@ -9174,6 +9755,7 @@ Undumped Pirates: + @@ -9189,6 +9771,7 @@ Undumped Pirates: + @@ -9202,6 +9785,7 @@ Undumped Pirates: + @@ -9215,6 +9799,7 @@ Undumped Pirates: + @@ -9228,6 +9813,7 @@ Undumped Pirates: + @@ -9242,6 +9828,7 @@ Undumped Pirates: + @@ -9260,6 +9847,7 @@ Undumped Pirates: + @@ -9278,6 +9866,7 @@ Undumped Pirates: + @@ -9296,6 +9885,7 @@ Undumped Pirates: + @@ -9314,6 +9904,7 @@ Undumped Pirates: + @@ -9332,6 +9923,7 @@ Undumped Pirates: + @@ -9350,6 +9942,7 @@ Undumped Pirates: + @@ -9366,6 +9959,7 @@ Undumped Pirates: + @@ -9380,6 +9974,7 @@ Undumped Pirates: + @@ -9393,6 +9988,7 @@ Undumped Pirates: + @@ -9407,6 +10003,7 @@ Undumped Pirates: + @@ -9421,6 +10018,7 @@ Undumped Pirates: + @@ -9435,6 +10033,7 @@ Undumped Pirates: + @@ -9450,6 +10049,7 @@ Undumped Pirates: + @@ -9465,6 +10065,7 @@ Undumped Pirates: + @@ -9480,6 +10081,7 @@ Undumped Pirates: + @@ -9495,6 +10097,7 @@ Undumped Pirates: + @@ -9510,6 +10113,7 @@ Undumped Pirates: + @@ -9525,6 +10129,7 @@ Undumped Pirates: + @@ -9540,6 +10145,7 @@ Undumped Pirates: + @@ -9555,6 +10161,7 @@ Undumped Pirates: + @@ -9570,6 +10177,7 @@ Undumped Pirates: + @@ -9585,6 +10193,7 @@ Undumped Pirates: + @@ -9600,6 +10209,7 @@ Undumped Pirates: + @@ -9615,6 +10225,7 @@ Undumped Pirates: + @@ -9631,6 +10242,7 @@ Undumped Pirates: + @@ -9647,6 +10259,7 @@ Undumped Pirates: + @@ -9663,6 +10276,7 @@ Undumped Pirates: + @@ -9679,6 +10293,7 @@ Undumped Pirates: + @@ -9695,6 +10310,7 @@ Undumped Pirates: + @@ -9711,6 +10327,7 @@ Undumped Pirates: + @@ -9727,6 +10344,7 @@ Undumped Pirates: + @@ -9743,6 +10361,7 @@ Undumped Pirates: + @@ -9759,6 +10378,7 @@ Undumped Pirates: + @@ -9775,6 +10395,7 @@ Undumped Pirates: + @@ -9791,6 +10412,7 @@ Undumped Pirates: + @@ -9807,6 +10429,7 @@ Undumped Pirates: + @@ -9823,6 +10446,7 @@ Undumped Pirates: + @@ -9838,6 +10462,7 @@ Undumped Pirates: + @@ -9854,6 +10479,7 @@ Undumped Pirates: + @@ -9868,6 +10494,7 @@ Undumped Pirates: + @@ -9882,6 +10509,7 @@ Undumped Pirates: + @@ -9898,6 +10526,7 @@ Undumped Pirates: + @@ -9914,6 +10543,7 @@ Undumped Pirates: + @@ -9930,6 +10560,7 @@ Undumped Pirates: + @@ -9947,6 +10578,7 @@ Undumped Pirates: + @@ -9961,6 +10593,7 @@ Undumped Pirates: + @@ -9976,6 +10609,7 @@ Undumped Pirates: + @@ -9994,6 +10628,7 @@ Undumped Pirates: + @@ -10008,6 +10643,7 @@ Undumped Pirates: + @@ -10022,6 +10658,7 @@ Undumped Pirates: + @@ -10036,6 +10673,7 @@ Undumped Pirates: + @@ -10050,6 +10688,7 @@ Undumped Pirates: + @@ -10063,6 +10702,7 @@ Undumped Pirates: + @@ -10076,6 +10716,7 @@ Undumped Pirates: + @@ -10090,6 +10731,7 @@ Undumped Pirates: + @@ -10106,6 +10748,7 @@ Undumped Pirates: + @@ -10124,6 +10767,7 @@ Undumped Pirates: + @@ -10140,6 +10784,7 @@ Undumped Pirates: + @@ -10156,6 +10801,7 @@ Undumped Pirates: + @@ -10172,6 +10818,7 @@ Undumped Pirates: + @@ -10190,6 +10837,7 @@ Undumped Pirates: + @@ -10208,6 +10856,7 @@ Undumped Pirates: + @@ -10226,6 +10875,7 @@ Undumped Pirates: + @@ -10244,6 +10894,7 @@ Undumped Pirates: + @@ -10262,6 +10913,7 @@ Undumped Pirates: + @@ -10280,6 +10932,7 @@ Undumped Pirates: + @@ -10298,6 +10951,7 @@ Undumped Pirates: + @@ -10316,6 +10970,7 @@ Undumped Pirates: + @@ -10334,6 +10989,7 @@ Undumped Pirates: + @@ -10352,6 +11008,7 @@ Undumped Pirates: + @@ -10370,6 +11027,7 @@ Undumped Pirates: + @@ -10388,6 +11046,7 @@ Undumped Pirates: + @@ -10406,6 +11065,7 @@ Undumped Pirates: + @@ -10424,6 +11084,7 @@ Undumped Pirates: + @@ -10442,6 +11103,7 @@ Undumped Pirates: + @@ -10458,6 +11120,7 @@ Undumped Pirates: + @@ -10472,6 +11135,7 @@ Undumped Pirates: + @@ -10486,6 +11150,7 @@ Undumped Pirates: + @@ -10500,6 +11165,7 @@ Undumped Pirates: + @@ -10516,6 +11182,7 @@ Undumped Pirates: + @@ -10532,6 +11199,7 @@ Undumped Pirates: + @@ -10546,6 +11214,7 @@ Undumped Pirates: + @@ -10558,6 +11227,7 @@ Undumped Pirates: Majesco + @@ -10572,6 +11242,7 @@ Undumped Pirates: + @@ -10588,6 +11259,7 @@ Undumped Pirates: + @@ -10603,6 +11275,7 @@ Undumped Pirates: + @@ -10617,6 +11290,7 @@ Undumped Pirates: + @@ -10631,6 +11305,7 @@ Undumped Pirates: + @@ -10645,6 +11320,7 @@ Undumped Pirates: + @@ -10663,6 +11339,7 @@ Undumped Pirates: + @@ -10677,6 +11354,7 @@ Undumped Pirates: + @@ -10691,6 +11369,7 @@ Undumped Pirates: + @@ -10705,6 +11384,7 @@ Undumped Pirates: + @@ -10721,6 +11401,7 @@ Undumped Pirates: + @@ -10737,6 +11418,7 @@ Undumped Pirates: + @@ -10755,6 +11437,7 @@ Undumped Pirates: + @@ -10773,6 +11456,7 @@ Undumped Pirates: + @@ -10791,6 +11475,7 @@ Undumped Pirates: + @@ -10809,6 +11494,7 @@ Undumped Pirates: + @@ -10825,6 +11511,7 @@ Undumped Pirates: + @@ -10841,6 +11528,7 @@ Undumped Pirates: + @@ -10859,6 +11547,7 @@ Undumped Pirates: + @@ -10875,6 +11564,7 @@ Undumped Pirates: + @@ -10891,6 +11581,7 @@ Undumped Pirates: + @@ -10909,6 +11600,7 @@ Undumped Pirates: + @@ -10925,6 +11617,7 @@ Undumped Pirates: + @@ -10941,6 +11634,7 @@ Undumped Pirates: + @@ -10959,6 +11653,7 @@ Undumped Pirates: + @@ -10975,6 +11670,7 @@ Undumped Pirates: + @@ -10990,6 +11686,7 @@ Undumped Pirates: + @@ -11004,6 +11701,7 @@ Undumped Pirates: + @@ -11017,6 +11715,7 @@ Undumped Pirates: + @@ -11033,6 +11732,7 @@ Undumped Pirates: + @@ -11047,6 +11747,7 @@ Undumped Pirates: + @@ -11061,6 +11762,7 @@ Undumped Pirates: + @@ -11075,6 +11777,7 @@ Undumped Pirates: + @@ -11089,6 +11792,7 @@ Undumped Pirates: + @@ -11103,6 +11807,7 @@ Undumped Pirates: + @@ -11117,6 +11822,7 @@ Undumped Pirates: + @@ -11130,6 +11836,7 @@ Undumped Pirates: + @@ -11144,6 +11851,7 @@ Undumped Pirates: + @@ -11160,6 +11868,7 @@ Undumped Pirates: + @@ -11178,6 +11887,7 @@ Undumped Pirates: + @@ -11196,6 +11906,7 @@ Undumped Pirates: + @@ -11214,6 +11925,7 @@ Undumped Pirates: + @@ -11232,6 +11944,7 @@ Undumped Pirates: + @@ -11250,6 +11963,7 @@ Undumped Pirates: + @@ -11268,6 +11982,7 @@ Undumped Pirates: + @@ -11286,6 +12001,7 @@ Undumped Pirates: + @@ -11304,6 +12020,7 @@ Undumped Pirates: + @@ -11322,6 +12039,7 @@ Undumped Pirates: + @@ -11340,6 +12058,7 @@ Undumped Pirates: + @@ -11358,6 +12077,7 @@ Undumped Pirates: + @@ -11376,6 +12096,7 @@ Undumped Pirates: + @@ -11391,6 +12112,7 @@ Undumped Pirates: + @@ -11407,6 +12129,7 @@ Undumped Pirates: + @@ -11425,6 +12148,7 @@ Undumped Pirates: + @@ -11443,6 +12167,7 @@ Undumped Pirates: + @@ -11461,6 +12186,7 @@ Undumped Pirates: + @@ -11479,6 +12205,7 @@ Undumped Pirates: + @@ -11497,6 +12224,7 @@ Undumped Pirates: + @@ -11512,6 +12240,7 @@ Undumped Pirates: + @@ -11526,6 +12255,7 @@ Undumped Pirates: + @@ -11540,6 +12270,7 @@ Undumped Pirates: + @@ -11554,6 +12285,7 @@ Undumped Pirates: + @@ -11570,6 +12302,7 @@ Undumped Pirates: + @@ -11586,6 +12319,7 @@ Undumped Pirates: + @@ -11602,6 +12336,7 @@ Undumped Pirates: + @@ -11618,6 +12353,7 @@ Undumped Pirates: + @@ -11633,6 +12369,7 @@ Undumped Pirates: + @@ -11651,6 +12388,7 @@ Undumped Pirates: + @@ -11667,6 +12405,7 @@ Undumped Pirates: + @@ -11683,6 +12422,7 @@ Undumped Pirates: + @@ -11699,6 +12439,7 @@ Undumped Pirates: + @@ -11715,6 +12456,7 @@ Undumped Pirates: + @@ -11729,6 +12471,7 @@ Undumped Pirates: + @@ -11743,6 +12486,7 @@ Undumped Pirates: + @@ -11757,6 +12501,7 @@ Undumped Pirates: + @@ -11771,6 +12516,7 @@ Undumped Pirates: + @@ -11785,6 +12531,7 @@ Undumped Pirates: + @@ -11812,6 +12559,7 @@ Undumped Pirates: + @@ -11826,6 +12574,7 @@ Undumped Pirates: + @@ -11840,6 +12589,7 @@ Undumped Pirates: + @@ -11857,6 +12607,7 @@ Undumped Pirates: + @@ -11875,6 +12626,7 @@ Undumped Pirates: + @@ -11891,6 +12643,7 @@ Undumped Pirates: + @@ -11905,6 +12658,7 @@ Undumped Pirates: + @@ -11920,6 +12674,7 @@ Undumped Pirates: + @@ -11936,6 +12691,7 @@ Undumped Pirates: + @@ -11954,6 +12710,7 @@ Undumped Pirates: + @@ -11972,6 +12729,7 @@ Undumped Pirates: + @@ -11987,6 +12745,7 @@ Undumped Pirates: <unknown> + @@ -12005,6 +12764,7 @@ Undumped Pirates: + @@ -12021,6 +12781,7 @@ Undumped Pirates: + @@ -12039,6 +12800,7 @@ Undumped Pirates: + @@ -12052,6 +12814,7 @@ Undumped Pirates: + @@ -12068,6 +12831,7 @@ Undumped Pirates: + @@ -12086,6 +12850,7 @@ Undumped Pirates: + @@ -12102,6 +12867,7 @@ Undumped Pirates: + @@ -12118,6 +12884,7 @@ Undumped Pirates: + @@ -12136,6 +12903,7 @@ Undumped Pirates: + @@ -12152,6 +12920,7 @@ Undumped Pirates: + @@ -12166,6 +12935,7 @@ Undumped Pirates: + @@ -12180,6 +12950,7 @@ Undumped Pirates: + @@ -12194,6 +12965,7 @@ Undumped Pirates: + @@ -12208,6 +12980,7 @@ Undumped Pirates: + @@ -12221,6 +12994,7 @@ Undumped Pirates: + @@ -12234,6 +13008,7 @@ Undumped Pirates: + @@ -12250,6 +13025,7 @@ Undumped Pirates: + @@ -12266,6 +13042,7 @@ Undumped Pirates: + @@ -12280,6 +13057,7 @@ Undumped Pirates: + @@ -12296,6 +13074,7 @@ Undumped Pirates: + @@ -12311,6 +13090,7 @@ Undumped Pirates: + @@ -12324,6 +13104,7 @@ Undumped Pirates: + @@ -12338,6 +13119,7 @@ Undumped Pirates: + @@ -12354,6 +13136,7 @@ Undumped Pirates: + @@ -12368,6 +13151,7 @@ Undumped Pirates: + @@ -12382,6 +13166,7 @@ Undumped Pirates: + @@ -12398,6 +13183,7 @@ Undumped Pirates: + @@ -12414,6 +13200,7 @@ Undumped Pirates: + @@ -12428,6 +13215,7 @@ Undumped Pirates: + @@ -12442,6 +13230,7 @@ Undumped Pirates: + @@ -12456,6 +13245,7 @@ Undumped Pirates: + @@ -12470,6 +13260,7 @@ Undumped Pirates: + @@ -12484,6 +13275,7 @@ Undumped Pirates: + @@ -12498,6 +13290,7 @@ Undumped Pirates: + @@ -12512,6 +13305,7 @@ Undumped Pirates: + @@ -12526,6 +13320,7 @@ Undumped Pirates: + @@ -12540,6 +13335,7 @@ Undumped Pirates: + @@ -12554,6 +13350,7 @@ Undumped Pirates: + @@ -12570,6 +13367,7 @@ Undumped Pirates: + @@ -12586,6 +13384,7 @@ Undumped Pirates: + @@ -12604,6 +13403,7 @@ Undumped Pirates: + @@ -12620,6 +13420,7 @@ Undumped Pirates: + @@ -12636,6 +13437,7 @@ Undumped Pirates: + @@ -12654,6 +13456,7 @@ Undumped Pirates: + @@ -12672,6 +13475,7 @@ Undumped Pirates: + @@ -12690,6 +13494,7 @@ Undumped Pirates: + @@ -12708,6 +13513,7 @@ Undumped Pirates: + @@ -12725,6 +13531,7 @@ Undumped Pirates: + @@ -12742,6 +13549,7 @@ Undumped Pirates: + @@ -12760,6 +13568,7 @@ Undumped Pirates: + @@ -12778,6 +13587,7 @@ Undumped Pirates: + @@ -12796,6 +13606,7 @@ Undumped Pirates: + @@ -12814,6 +13625,7 @@ Undumped Pirates: + @@ -12830,6 +13642,7 @@ Undumped Pirates: + @@ -12846,6 +13659,7 @@ Undumped Pirates: + @@ -12861,6 +13675,7 @@ Undumped Pirates: + @@ -12877,6 +13692,7 @@ Undumped Pirates: + @@ -12891,6 +13707,7 @@ Undumped Pirates: + @@ -12904,6 +13721,7 @@ Undumped Pirates: + @@ -12920,6 +13738,7 @@ Undumped Pirates: + @@ -12933,6 +13752,7 @@ Undumped Pirates: + @@ -12949,6 +13769,7 @@ Undumped Pirates: + @@ -12965,6 +13786,7 @@ Undumped Pirates: + @@ -12980,6 +13802,7 @@ Undumped Pirates: + @@ -12994,6 +13817,7 @@ Undumped Pirates: + @@ -13007,6 +13831,7 @@ Undumped Pirates: + @@ -13023,6 +13848,7 @@ Undumped Pirates: + @@ -13039,6 +13865,7 @@ Undumped Pirates: + @@ -13056,6 +13883,7 @@ Undumped Pirates: + @@ -13074,6 +13902,7 @@ Undumped Pirates: + @@ -13090,6 +13919,7 @@ Undumped Pirates: + @@ -13105,6 +13935,7 @@ Undumped Pirates: + @@ -13119,6 +13950,7 @@ Undumped Pirates: + @@ -13133,6 +13965,7 @@ Undumped Pirates: + @@ -13146,6 +13979,7 @@ Undumped Pirates: + @@ -13159,6 +13993,7 @@ Undumped Pirates: + @@ -13173,6 +14008,7 @@ Undumped Pirates: + @@ -13187,6 +14023,7 @@ Undumped Pirates: + @@ -13200,6 +14037,7 @@ Undumped Pirates: + @@ -13214,6 +14052,7 @@ Undumped Pirates: + @@ -13230,6 +14069,7 @@ Undumped Pirates: + @@ -13246,6 +14086,7 @@ Undumped Pirates: + @@ -13262,6 +14103,7 @@ Undumped Pirates: + @@ -13280,6 +14122,7 @@ Undumped Pirates: + @@ -13296,6 +14139,7 @@ Undumped Pirates: + @@ -13311,6 +14155,7 @@ Undumped Pirates: + @@ -13327,6 +14172,7 @@ Undumped Pirates: + @@ -13341,6 +14187,7 @@ Undumped Pirates: + @@ -13359,6 +14206,7 @@ Undumped Pirates: + @@ -13376,6 +14224,7 @@ Undumped Pirates: + @@ -13391,6 +14240,7 @@ Undumped Pirates: + @@ -13404,6 +14254,7 @@ Undumped Pirates: + @@ -13420,6 +14271,7 @@ Undumped Pirates: + @@ -13438,6 +14290,7 @@ Undumped Pirates: + @@ -13454,6 +14307,7 @@ Undumped Pirates: + @@ -13471,6 +14325,7 @@ Undumped Pirates: + @@ -13488,6 +14343,7 @@ Undumped Pirates: + @@ -13504,6 +14360,7 @@ Undumped Pirates: + @@ -13519,6 +14376,7 @@ Undumped Pirates: + @@ -13537,6 +14395,7 @@ Undumped Pirates: + @@ -13553,6 +14412,7 @@ Undumped Pirates: + @@ -13569,6 +14429,7 @@ Undumped Pirates: + @@ -13587,6 +14448,7 @@ Undumped Pirates: + @@ -13605,6 +14467,7 @@ Undumped Pirates: + @@ -13620,6 +14483,7 @@ Undumped Pirates: + @@ -13633,6 +14497,7 @@ Undumped Pirates: + @@ -13648,6 +14513,7 @@ Undumped Pirates: + @@ -13663,6 +14529,7 @@ Undumped Pirates: + @@ -13681,6 +14548,7 @@ Undumped Pirates: + @@ -13710,6 +14578,7 @@ Undumped Pirates: + @@ -13724,6 +14593,7 @@ Undumped Pirates: + @@ -13740,6 +14610,7 @@ Undumped Pirates: + @@ -13756,6 +14627,7 @@ Undumped Pirates: + @@ -13775,6 +14647,7 @@ Undumped Pirates: + @@ -13793,6 +14666,7 @@ Undumped Pirates: + @@ -13808,6 +14682,7 @@ Undumped Pirates: + @@ -13823,6 +14698,7 @@ Undumped Pirates: + @@ -13837,6 +14713,7 @@ Undumped Pirates: + @@ -13851,6 +14728,7 @@ Undumped Pirates: + @@ -13865,6 +14743,7 @@ Undumped Pirates: + @@ -13882,6 +14761,7 @@ Undumped Pirates: + @@ -13897,6 +14777,7 @@ Undumped Pirates: + @@ -13912,6 +14793,7 @@ Undumped Pirates: + @@ -13925,6 +14807,7 @@ Undumped Pirates: + @@ -13940,6 +14823,7 @@ Undumped Pirates: + @@ -13956,6 +14840,7 @@ Undumped Pirates: + @@ -13971,6 +14856,7 @@ Undumped Pirates: + @@ -13986,6 +14872,7 @@ Undumped Pirates: + @@ -14002,6 +14889,7 @@ Undumped Pirates: + @@ -14020,6 +14908,7 @@ Undumped Pirates: + @@ -14036,6 +14925,7 @@ Undumped Pirates: + @@ -14052,6 +14942,7 @@ Undumped Pirates: + @@ -14070,6 +14961,7 @@ Undumped Pirates: + @@ -14088,6 +14980,7 @@ Undumped Pirates: + @@ -14103,6 +14996,7 @@ Undumped Pirates: + @@ -14121,6 +15015,7 @@ Undumped Pirates: + @@ -14139,6 +15034,7 @@ Undumped Pirates: + @@ -14155,6 +15051,7 @@ Undumped Pirates: + @@ -14171,6 +15068,7 @@ Undumped Pirates: + @@ -14189,6 +15087,7 @@ Undumped Pirates: + @@ -14207,6 +15106,7 @@ Undumped Pirates: + @@ -14225,6 +15125,7 @@ Undumped Pirates: + @@ -14243,6 +15144,7 @@ Undumped Pirates: + @@ -14259,6 +15161,7 @@ Undumped Pirates: + @@ -14274,6 +15177,7 @@ Undumped Pirates: Hector + @@ -14292,6 +15196,7 @@ Undumped Pirates: + @@ -14308,6 +15213,7 @@ Undumped Pirates: + @@ -14326,6 +15232,7 @@ Undumped Pirates: + @@ -14344,6 +15251,7 @@ Undumped Pirates: + @@ -14360,6 +15268,7 @@ Undumped Pirates: + @@ -14402,6 +15311,7 @@ Undumped Pirates: + @@ -14418,6 +15328,7 @@ Undumped Pirates: + @@ -14434,6 +15345,7 @@ Undumped Pirates: + @@ -14450,6 +15362,7 @@ Undumped Pirates: + @@ -14466,6 +15379,7 @@ Undumped Pirates: + @@ -14482,6 +15396,7 @@ Undumped Pirates: + @@ -14498,6 +15413,7 @@ Undumped Pirates: + @@ -14513,6 +15429,7 @@ Undumped Pirates: + @@ -14528,6 +15445,7 @@ Undumped Pirates: + @@ -14543,6 +15461,7 @@ Undumped Pirates: + @@ -14558,6 +15477,7 @@ Undumped Pirates: + @@ -14573,6 +15493,7 @@ Undumped Pirates: + @@ -14588,6 +15509,7 @@ Undumped Pirates: + @@ -14603,6 +15525,7 @@ Undumped Pirates: + @@ -14618,6 +15541,7 @@ Undumped Pirates: + @@ -14633,6 +15557,7 @@ Undumped Pirates: + @@ -14648,6 +15573,7 @@ Undumped Pirates: + @@ -14666,6 +15592,7 @@ Undumped Pirates: + @@ -14682,6 +15609,7 @@ Undumped Pirates: + @@ -14700,6 +15628,7 @@ Undumped Pirates: + @@ -14716,6 +15645,7 @@ Undumped Pirates: + @@ -14735,6 +15665,7 @@ Undumped Pirates: + @@ -14752,6 +15683,7 @@ Undumped Pirates: + @@ -14769,6 +15701,7 @@ Undumped Pirates: + @@ -14785,6 +15718,7 @@ Undumped Pirates: + @@ -14800,6 +15734,7 @@ Undumped Pirates: + @@ -14815,6 +15750,7 @@ Undumped Pirates: + @@ -14830,6 +15766,7 @@ Undumped Pirates: + @@ -14846,6 +15783,7 @@ Undumped Pirates: + @@ -14861,6 +15799,7 @@ Undumped Pirates: + @@ -14875,6 +15814,7 @@ Undumped Pirates: + @@ -14889,6 +15829,7 @@ Undumped Pirates: + @@ -14905,6 +15846,7 @@ Undumped Pirates: + @@ -14921,6 +15863,7 @@ Undumped Pirates: + @@ -14937,6 +15880,7 @@ Undumped Pirates: + @@ -14951,6 +15895,7 @@ Undumped Pirates: + @@ -14967,6 +15912,7 @@ Undumped Pirates: + @@ -14981,6 +15927,7 @@ Undumped Pirates: + @@ -14997,6 +15944,7 @@ Undumped Pirates: + @@ -15015,6 +15963,7 @@ Undumped Pirates: + @@ -15033,6 +15982,7 @@ Undumped Pirates: + @@ -15048,6 +15998,7 @@ Undumped Pirates: + @@ -15061,6 +16012,7 @@ Undumped Pirates: + @@ -15075,6 +16027,7 @@ Undumped Pirates: + @@ -15089,6 +16042,7 @@ Undumped Pirates: + @@ -15103,6 +16057,7 @@ Undumped Pirates: + @@ -15117,6 +16072,7 @@ Undumped Pirates: + @@ -15133,6 +16089,7 @@ Undumped Pirates: + @@ -15149,6 +16106,7 @@ Undumped Pirates: + @@ -15165,6 +16123,7 @@ Undumped Pirates: + @@ -15179,6 +16138,7 @@ Undumped Pirates: + @@ -15195,6 +16155,7 @@ Undumped Pirates: + @@ -15211,6 +16172,7 @@ Undumped Pirates: + @@ -15227,6 +16189,7 @@ Undumped Pirates: + @@ -15243,6 +16206,7 @@ Undumped Pirates: + @@ -15259,6 +16223,7 @@ Undumped Pirates: + @@ -15273,6 +16238,7 @@ Undumped Pirates: + @@ -15289,6 +16255,7 @@ Undumped Pirates: + @@ -15305,6 +16272,7 @@ Undumped Pirates: + @@ -15321,6 +16289,7 @@ Undumped Pirates: + @@ -15337,6 +16306,7 @@ Undumped Pirates: + @@ -15351,6 +16321,7 @@ Undumped Pirates: + @@ -15367,6 +16338,7 @@ Undumped Pirates: + @@ -15383,6 +16355,7 @@ Undumped Pirates: + @@ -15398,6 +16371,7 @@ Undumped Pirates: + @@ -15412,6 +16386,7 @@ Undumped Pirates: + @@ -15428,6 +16403,7 @@ Undumped Pirates: + @@ -15446,6 +16422,7 @@ Undumped Pirates: + @@ -15464,6 +16441,7 @@ Undumped Pirates: + @@ -15479,6 +16457,7 @@ Undumped Pirates: + @@ -15495,6 +16474,7 @@ Undumped Pirates: + @@ -15511,6 +16491,7 @@ Undumped Pirates: + @@ -15527,6 +16508,7 @@ Undumped Pirates: + @@ -15540,6 +16522,7 @@ Undumped Pirates: + @@ -15558,6 +16541,7 @@ Undumped Pirates: + @@ -15574,6 +16558,7 @@ Undumped Pirates: + @@ -15588,6 +16573,7 @@ Undumped Pirates: + @@ -15604,6 +16590,7 @@ Undumped Pirates: + @@ -15621,6 +16608,7 @@ Undumped Pirates: + @@ -15638,6 +16626,7 @@ Undumped Pirates: + @@ -15654,6 +16643,7 @@ Undumped Pirates: + @@ -15669,6 +16659,7 @@ Undumped Pirates: + @@ -15684,6 +16675,7 @@ Undumped Pirates: + @@ -15698,6 +16690,7 @@ Undumped Pirates: + @@ -15712,6 +16705,7 @@ Undumped Pirates: + @@ -15726,6 +16720,7 @@ Undumped Pirates: + @@ -15740,6 +16735,7 @@ Undumped Pirates: + @@ -15758,6 +16754,7 @@ Undumped Pirates: + @@ -15773,6 +16770,7 @@ Undumped Pirates: + @@ -15786,6 +16784,7 @@ Undumped Pirates: + @@ -15801,6 +16800,7 @@ Undumped Pirates: + @@ -15817,6 +16817,7 @@ Undumped Pirates: + @@ -15834,6 +16835,7 @@ Undumped Pirates: + @@ -15851,6 +16853,7 @@ Undumped Pirates: + @@ -15866,6 +16869,7 @@ Undumped Pirates: + @@ -15895,6 +16899,7 @@ Undumped Pirates: <pirate> + @@ -15908,6 +16913,7 @@ Undumped Pirates: <unknown> + @@ -15924,6 +16930,7 @@ Undumped Pirates: + @@ -15939,6 +16946,7 @@ Undumped Pirates: + @@ -15955,6 +16963,7 @@ Undumped Pirates: + @@ -15972,6 +16981,7 @@ Undumped Pirates: + @@ -15987,6 +16997,7 @@ Undumped Pirates: + @@ -16001,6 +17012,7 @@ Undumped Pirates: + @@ -16015,6 +17027,7 @@ Undumped Pirates: + @@ -16028,6 +17041,7 @@ Undumped Pirates: + @@ -16042,6 +17056,7 @@ Undumped Pirates: + @@ -16056,6 +17071,7 @@ Undumped Pirates: + @@ -16072,6 +17088,7 @@ Undumped Pirates: + @@ -16086,6 +17103,7 @@ Undumped Pirates: + @@ -16102,6 +17120,7 @@ Undumped Pirates: + @@ -16118,6 +17137,7 @@ Undumped Pirates: + @@ -16132,6 +17152,7 @@ Undumped Pirates: + @@ -16146,6 +17167,7 @@ Undumped Pirates: + @@ -16160,6 +17182,7 @@ Undumped Pirates: + @@ -16177,6 +17200,7 @@ Undumped Pirates: + @@ -16195,6 +17219,7 @@ Undumped Pirates: + @@ -16211,6 +17236,7 @@ Undumped Pirates: + @@ -16224,6 +17250,7 @@ Undumped Pirates: + @@ -16238,6 +17265,7 @@ Undumped Pirates: + @@ -16254,6 +17282,7 @@ Undumped Pirates: + @@ -16269,6 +17298,7 @@ Undumped Pirates: Capcom + @@ -16284,6 +17314,7 @@ Undumped Pirates: Capcom + @@ -16300,6 +17331,7 @@ Undumped Pirates: + @@ -16314,6 +17346,7 @@ Undumped Pirates: + @@ -16327,6 +17360,7 @@ Undumped Pirates: + @@ -16343,6 +17377,7 @@ Undumped Pirates: + @@ -16356,6 +17391,7 @@ Undumped Pirates: + @@ -16370,6 +17406,7 @@ Undumped Pirates: + @@ -16384,6 +17421,7 @@ Undumped Pirates: + @@ -16396,6 +17434,7 @@ Undumped Pirates: Titus + @@ -16411,6 +17450,7 @@ Undumped Pirates: + @@ -16424,6 +17464,7 @@ Undumped Pirates: + @@ -16438,6 +17479,7 @@ Undumped Pirates: + @@ -16452,6 +17494,7 @@ Undumped Pirates: + @@ -16465,6 +17508,7 @@ Undumped Pirates: + @@ -16479,6 +17523,7 @@ Undumped Pirates: + @@ -16495,6 +17540,7 @@ Undumped Pirates: + @@ -16511,6 +17557,7 @@ Undumped Pirates: + @@ -16527,6 +17574,7 @@ Undumped Pirates: + @@ -16541,6 +17589,7 @@ Undumped Pirates: + @@ -16557,6 +17606,7 @@ Undumped Pirates: + @@ -16571,6 +17621,7 @@ Undumped Pirates: + @@ -16586,6 +17637,7 @@ Undumped Pirates: + @@ -16604,6 +17656,7 @@ Undumped Pirates: + @@ -16620,6 +17673,7 @@ Undumped Pirates: + @@ -16636,6 +17690,7 @@ Undumped Pirates: + @@ -16652,6 +17707,7 @@ Undumped Pirates: + @@ -16665,6 +17721,7 @@ Undumped Pirates: + @@ -16680,6 +17737,7 @@ Undumped Pirates: + @@ -16696,6 +17754,7 @@ Undumped Pirates: + @@ -16710,6 +17769,7 @@ Undumped Pirates: + @@ -16726,6 +17786,7 @@ Undumped Pirates: + @@ -16741,6 +17802,7 @@ Undumped Pirates: + @@ -16757,6 +17819,7 @@ Undumped Pirates: + @@ -16772,6 +17835,7 @@ Undumped Pirates: + @@ -16785,6 +17849,7 @@ Undumped Pirates: + @@ -16799,6 +17864,7 @@ Undumped Pirates: + @@ -16813,6 +17879,7 @@ Undumped Pirates: + @@ -16827,6 +17894,7 @@ Undumped Pirates: + @@ -16841,6 +17909,7 @@ Undumped Pirates: + @@ -16855,6 +17924,7 @@ Undumped Pirates: + @@ -16869,6 +17939,7 @@ Undumped Pirates: + @@ -16882,6 +17953,7 @@ Undumped Pirates: + @@ -16896,6 +17968,7 @@ Undumped Pirates: + @@ -16910,6 +17983,7 @@ Undumped Pirates: + @@ -16924,6 +17998,7 @@ Undumped Pirates: + @@ -16940,6 +18015,7 @@ Undumped Pirates: + @@ -16956,6 +18032,7 @@ Undumped Pirates: + @@ -16974,6 +18051,7 @@ Undumped Pirates: + @@ -16992,6 +18070,7 @@ Undumped Pirates: + @@ -17008,6 +18087,7 @@ Undumped Pirates: + @@ -17024,6 +18104,7 @@ Undumped Pirates: + @@ -17042,6 +18123,7 @@ Undumped Pirates: + @@ -17060,6 +18142,7 @@ Undumped Pirates: + @@ -17075,6 +18158,7 @@ Undumped Pirates: + @@ -17091,6 +18175,7 @@ Undumped Pirates: + @@ -17107,6 +18192,7 @@ Undumped Pirates: + @@ -17121,6 +18207,7 @@ Undumped Pirates: + @@ -17139,6 +18226,7 @@ Undumped Pirates: + @@ -17155,6 +18243,7 @@ Undumped Pirates: + @@ -17172,6 +18261,7 @@ Undumped Pirates: + @@ -17190,6 +18280,7 @@ Undumped Pirates: + @@ -17206,6 +18297,7 @@ Undumped Pirates: + @@ -17220,6 +18312,7 @@ Undumped Pirates: + @@ -17234,6 +18327,7 @@ Undumped Pirates: + @@ -17247,6 +18341,7 @@ Undumped Pirates: + @@ -17262,6 +18357,7 @@ Undumped Pirates: + @@ -17279,6 +18375,7 @@ Undumped Pirates: + @@ -17297,6 +18394,7 @@ Undumped Pirates: + @@ -17315,6 +18413,7 @@ Undumped Pirates: + @@ -17330,6 +18429,7 @@ Undumped Pirates: + @@ -17343,6 +18443,7 @@ Undumped Pirates: + @@ -17359,6 +18460,7 @@ Undumped Pirates: + @@ -17372,6 +18474,7 @@ Undumped Pirates: + @@ -17386,6 +18489,7 @@ Undumped Pirates: + @@ -17402,6 +18506,7 @@ Undumped Pirates: + @@ -17418,6 +18523,7 @@ Undumped Pirates: + @@ -17436,6 +18542,7 @@ Undumped Pirates: + @@ -17454,6 +18561,7 @@ Undumped Pirates: + @@ -17472,6 +18580,7 @@ Undumped Pirates: + @@ -17490,6 +18599,7 @@ Undumped Pirates: + @@ -17508,6 +18618,7 @@ Undumped Pirates: + @@ -17523,6 +18634,7 @@ Undumped Pirates: + @@ -17537,6 +18649,7 @@ Undumped Pirates: + @@ -17553,6 +18666,7 @@ Undumped Pirates: + @@ -17568,6 +18682,7 @@ Undumped Pirates: + @@ -17582,6 +18697,7 @@ Undumped Pirates: + @@ -17598,6 +18714,7 @@ Undumped Pirates: + @@ -17612,6 +18729,7 @@ Undumped Pirates: + @@ -17628,6 +18746,7 @@ Undumped Pirates: + @@ -17642,6 +18761,7 @@ Undumped Pirates: + @@ -17658,6 +18778,7 @@ Undumped Pirates: + @@ -17672,6 +18793,7 @@ Undumped Pirates: + @@ -17686,6 +18808,7 @@ Undumped Pirates: + @@ -17700,6 +18823,7 @@ Undumped Pirates: + @@ -17714,6 +18838,7 @@ Undumped Pirates: + @@ -17728,6 +18853,7 @@ Undumped Pirates: + @@ -17746,6 +18872,7 @@ Undumped Pirates: + @@ -17764,6 +18891,7 @@ Undumped Pirates: + @@ -17782,6 +18910,7 @@ Undumped Pirates: + @@ -17799,6 +18928,7 @@ Undumped Pirates: + @@ -17816,6 +18946,7 @@ Undumped Pirates: + @@ -17831,6 +18962,7 @@ Undumped Pirates: + @@ -17846,6 +18978,7 @@ Undumped Pirates: + @@ -17899,6 +19032,7 @@ Undumped Pirates: + @@ -17915,6 +19049,7 @@ Undumped Pirates: + @@ -17933,6 +19068,7 @@ Undumped Pirates: + @@ -17948,6 +19084,7 @@ Undumped Pirates: + @@ -17964,6 +19101,7 @@ Undumped Pirates: + @@ -17977,6 +19115,7 @@ Undumped Pirates: + @@ -17991,6 +19130,7 @@ Undumped Pirates: + @@ -18005,6 +19145,7 @@ Undumped Pirates: + @@ -18021,6 +19162,7 @@ Undumped Pirates: + @@ -18035,6 +19177,7 @@ Undumped Pirates: + @@ -18049,6 +19192,7 @@ Undumped Pirates: + @@ -18063,6 +19207,7 @@ Undumped Pirates: + @@ -18077,6 +19222,7 @@ Undumped Pirates: + @@ -18093,6 +19239,7 @@ Undumped Pirates: + @@ -18107,6 +19254,7 @@ Undumped Pirates: + @@ -18122,6 +19270,7 @@ Undumped Pirates: + @@ -18138,6 +19287,7 @@ Undumped Pirates: + @@ -18152,6 +19302,7 @@ Undumped Pirates: + @@ -18166,6 +19317,7 @@ Undumped Pirates: + @@ -18182,6 +19334,7 @@ Undumped Pirates: + @@ -18198,6 +19351,7 @@ Undumped Pirates: + @@ -18214,6 +19368,7 @@ Undumped Pirates: + @@ -18228,6 +19383,7 @@ Undumped Pirates: + @@ -18242,6 +19398,7 @@ Undumped Pirates: + @@ -18256,6 +19413,7 @@ Undumped Pirates: + @@ -18272,6 +19430,7 @@ Undumped Pirates: + @@ -18291,6 +19450,7 @@ Undumped Pirates: + @@ -18309,6 +19469,7 @@ Undumped Pirates: + @@ -18322,6 +19483,7 @@ Undumped Pirates: + @@ -18335,6 +19497,7 @@ Undumped Pirates: + @@ -18351,6 +19514,7 @@ Undumped Pirates: + @@ -18369,6 +19533,7 @@ Undumped Pirates: + @@ -18387,6 +19552,7 @@ Undumped Pirates: + @@ -18405,6 +19571,7 @@ Undumped Pirates: + @@ -18423,6 +19590,7 @@ Undumped Pirates: + @@ -18439,6 +19607,7 @@ Undumped Pirates: + @@ -18455,6 +19624,7 @@ Undumped Pirates: + @@ -18471,6 +19641,7 @@ Undumped Pirates: + @@ -18489,6 +19660,7 @@ Undumped Pirates: + @@ -18507,6 +19679,7 @@ Undumped Pirates: + @@ -18524,6 +19697,7 @@ Undumped Pirates: + @@ -18542,6 +19716,7 @@ Undumped Pirates: + @@ -18558,6 +19733,7 @@ Undumped Pirates: + @@ -18574,6 +19750,7 @@ Undumped Pirates: + @@ -18587,6 +19764,7 @@ Undumped Pirates: + @@ -18605,6 +19783,7 @@ Undumped Pirates: + @@ -18623,6 +19802,7 @@ Undumped Pirates: + @@ -18639,6 +19819,7 @@ Undumped Pirates: + @@ -18655,6 +19836,7 @@ Undumped Pirates: + @@ -18671,6 +19853,7 @@ Undumped Pirates: + @@ -18687,6 +19870,7 @@ Undumped Pirates: + @@ -18703,6 +19887,7 @@ Undumped Pirates: + @@ -18721,6 +19906,7 @@ Undumped Pirates: + @@ -18739,6 +19925,7 @@ Undumped Pirates: + @@ -18757,6 +19944,7 @@ Undumped Pirates: + @@ -18772,6 +19960,7 @@ Undumped Pirates: + @@ -18786,6 +19975,7 @@ Undumped Pirates: + @@ -18802,6 +19992,7 @@ Undumped Pirates: + @@ -18818,6 +20009,7 @@ Undumped Pirates: + @@ -18834,6 +20026,7 @@ Undumped Pirates: + @@ -18850,6 +20043,7 @@ Undumped Pirates: + @@ -18868,6 +20062,7 @@ Undumped Pirates: + @@ -18884,6 +20079,7 @@ Undumped Pirates: + @@ -18898,6 +20094,7 @@ Undumped Pirates: + @@ -18912,6 +20109,7 @@ Undumped Pirates: + @@ -18928,6 +20126,7 @@ Undumped Pirates: + @@ -18941,6 +20140,7 @@ Undumped Pirates: + @@ -18954,6 +20154,7 @@ Undumped Pirates: + @@ -18967,6 +20168,7 @@ Undumped Pirates: + @@ -18980,6 +20182,7 @@ Undumped Pirates: + @@ -18994,6 +20197,7 @@ Undumped Pirates: + @@ -19008,6 +20212,7 @@ Undumped Pirates: + @@ -19022,6 +20227,7 @@ Undumped Pirates: Infogrames + @@ -19037,6 +20243,7 @@ Undumped Pirates: + @@ -19052,6 +20259,7 @@ Undumped Pirates: + @@ -19068,6 +20276,7 @@ Undumped Pirates: + @@ -19084,6 +20293,7 @@ Undumped Pirates: + @@ -19100,6 +20310,7 @@ Undumped Pirates: + @@ -19119,6 +20330,7 @@ Undumped Pirates: + @@ -19137,6 +20349,7 @@ Undumped Pirates: + @@ -19153,6 +20366,7 @@ Undumped Pirates: + @@ -19168,6 +20382,7 @@ Undumped Pirates: + @@ -19184,6 +20399,7 @@ Undumped Pirates: + @@ -19198,6 +20414,7 @@ Undumped Pirates: + @@ -19211,6 +20428,7 @@ Undumped Pirates: + @@ -19225,6 +20443,7 @@ Undumped Pirates: + @@ -19239,6 +20458,7 @@ Undumped Pirates: + @@ -19253,6 +20473,7 @@ Undumped Pirates: + @@ -19267,6 +20488,7 @@ Undumped Pirates: + @@ -19281,6 +20503,7 @@ Undumped Pirates: + @@ -19296,6 +20519,7 @@ Undumped Pirates: + @@ -19309,6 +20533,7 @@ Undumped Pirates: + @@ -19322,6 +20547,7 @@ Undumped Pirates: + @@ -19338,6 +20564,7 @@ Undumped Pirates: + @@ -19352,6 +20579,7 @@ Undumped Pirates: + @@ -19370,6 +20598,7 @@ Undumped Pirates: + @@ -19388,6 +20617,7 @@ Undumped Pirates: + @@ -19405,6 +20635,7 @@ Undumped Pirates: + @@ -19421,6 +20652,7 @@ Undumped Pirates: + @@ -19435,6 +20667,7 @@ Undumped Pirates: + @@ -19449,6 +20682,7 @@ Undumped Pirates: + @@ -19463,6 +20697,7 @@ Undumped Pirates: + @@ -19477,6 +20712,7 @@ Undumped Pirates: + @@ -19491,6 +20727,7 @@ Undumped Pirates: + @@ -19505,6 +20742,7 @@ Undumped Pirates: Eidos + @@ -19521,6 +20759,7 @@ Undumped Pirates: + @@ -19537,6 +20776,7 @@ Undumped Pirates: + @@ -19553,6 +20793,7 @@ Undumped Pirates: + @@ -19567,6 +20808,7 @@ Undumped Pirates: + @@ -19581,6 +20823,7 @@ Undumped Pirates: + @@ -19595,6 +20838,7 @@ Undumped Pirates: + @@ -19610,6 +20854,7 @@ Undumped Pirates: + @@ -19624,6 +20869,7 @@ Undumped Pirates: + @@ -19638,6 +20884,7 @@ Undumped Pirates: + @@ -19652,6 +20899,7 @@ Undumped Pirates: + @@ -19668,6 +20916,7 @@ Undumped Pirates: + @@ -19682,6 +20931,7 @@ Undumped Pirates: + @@ -19696,6 +20946,7 @@ Undumped Pirates: + @@ -19710,6 +20961,7 @@ Undumped Pirates: + @@ -19726,6 +20978,7 @@ Undumped Pirates: + @@ -19741,6 +20994,7 @@ Undumped Pirates: + @@ -19758,6 +21012,7 @@ Undumped Pirates: + @@ -19775,6 +21030,7 @@ Undumped Pirates: + @@ -19791,6 +21047,7 @@ Undumped Pirates: + @@ -19806,6 +21063,7 @@ Undumped Pirates: + @@ -19822,6 +21080,7 @@ Undumped Pirates: + @@ -19836,6 +21095,7 @@ Undumped Pirates: + @@ -19854,6 +21114,7 @@ Undumped Pirates: + @@ -19872,6 +21133,7 @@ Undumped Pirates: + @@ -19890,6 +21152,7 @@ Undumped Pirates: + @@ -19908,6 +21171,7 @@ Undumped Pirates: + @@ -19924,6 +21188,7 @@ Undumped Pirates: + @@ -19939,6 +21204,7 @@ Undumped Pirates: + @@ -19953,6 +21219,7 @@ Undumped Pirates: + @@ -19967,6 +21234,7 @@ Undumped Pirates: + @@ -19983,6 +21251,7 @@ Undumped Pirates: + @@ -19999,6 +21268,7 @@ Undumped Pirates: + @@ -20013,6 +21283,7 @@ Undumped Pirates: + @@ -20029,6 +21300,7 @@ Undumped Pirates: + @@ -20043,6 +21315,7 @@ Undumped Pirates: + @@ -20057,6 +21330,7 @@ Undumped Pirates: + @@ -20073,6 +21347,7 @@ Undumped Pirates: + @@ -20091,6 +21366,7 @@ Undumped Pirates: + @@ -20107,6 +21383,7 @@ Undumped Pirates: + @@ -20120,6 +21397,7 @@ Undumped Pirates: + @@ -20135,6 +21413,7 @@ Undumped Pirates: + @@ -20149,6 +21428,7 @@ Undumped Pirates: + @@ -20163,6 +21443,7 @@ Undumped Pirates: + @@ -20177,6 +21458,7 @@ Undumped Pirates: + @@ -20193,6 +21475,7 @@ Undumped Pirates: + @@ -20209,6 +21492,7 @@ Undumped Pirates: + @@ -20225,6 +21509,7 @@ Undumped Pirates: + @@ -20241,6 +21526,7 @@ Undumped Pirates: + @@ -20257,6 +21543,7 @@ Undumped Pirates: + @@ -20270,6 +21557,7 @@ Undumped Pirates: <unknown> + @@ -20288,6 +21576,7 @@ Undumped Pirates: + @@ -20304,6 +21593,7 @@ Undumped Pirates: + @@ -20320,6 +21610,7 @@ Undumped Pirates: + @@ -20334,6 +21625,7 @@ Undumped Pirates: + @@ -20348,6 +21640,7 @@ Undumped Pirates: + @@ -20362,6 +21655,7 @@ Undumped Pirates: + @@ -20376,6 +21670,7 @@ Undumped Pirates: + @@ -20389,6 +21684,7 @@ Undumped Pirates: + @@ -20402,6 +21698,7 @@ Undumped Pirates: + @@ -20416,6 +21713,7 @@ Undumped Pirates: + @@ -20432,6 +21730,7 @@ Undumped Pirates: + @@ -20446,6 +21745,7 @@ Undumped Pirates: + @@ -20460,6 +21760,7 @@ Undumped Pirates: + @@ -20474,6 +21775,7 @@ Undumped Pirates: + @@ -20488,6 +21790,7 @@ Undumped Pirates: + @@ -20505,6 +21808,7 @@ Undumped Pirates: + @@ -20519,6 +21823,7 @@ Undumped Pirates: + @@ -20532,6 +21837,7 @@ Undumped Pirates: + @@ -20548,6 +21854,7 @@ Undumped Pirates: + @@ -20564,6 +21871,7 @@ Undumped Pirates: + @@ -20578,6 +21886,7 @@ Undumped Pirates: + @@ -20592,6 +21901,7 @@ Undumped Pirates: + @@ -20606,6 +21916,7 @@ Undumped Pirates: + @@ -20622,6 +21933,7 @@ Undumped Pirates: + @@ -20640,6 +21952,7 @@ Undumped Pirates: + @@ -20658,6 +21971,7 @@ Undumped Pirates: + @@ -20674,6 +21988,7 @@ Undumped Pirates: + @@ -20690,6 +22005,7 @@ Undumped Pirates: + @@ -20706,6 +22022,7 @@ Undumped Pirates: + @@ -20724,6 +22041,7 @@ Undumped Pirates: + @@ -20742,6 +22060,7 @@ Undumped Pirates: + @@ -20760,6 +22079,7 @@ Undumped Pirates: + @@ -20776,6 +22096,7 @@ Undumped Pirates: + @@ -20790,6 +22111,7 @@ Undumped Pirates: + @@ -20804,6 +22126,7 @@ Undumped Pirates: + @@ -20818,6 +22141,7 @@ Undumped Pirates: + @@ -20834,6 +22158,7 @@ Undumped Pirates: + @@ -20848,6 +22173,7 @@ Undumped Pirates: + @@ -20862,6 +22188,7 @@ Undumped Pirates: + @@ -20875,6 +22202,7 @@ Undumped Pirates: + @@ -20888,6 +22216,7 @@ Undumped Pirates: + @@ -20902,6 +22231,7 @@ Undumped Pirates: + @@ -20918,6 +22248,7 @@ Undumped Pirates: + @@ -20936,6 +22267,7 @@ Undumped Pirates: + @@ -20954,6 +22286,7 @@ Undumped Pirates: + @@ -20972,6 +22305,7 @@ Undumped Pirates: + @@ -20990,6 +22324,7 @@ Undumped Pirates: + @@ -21008,6 +22343,7 @@ Undumped Pirates: + @@ -21026,6 +22362,7 @@ Undumped Pirates: + @@ -21042,6 +22379,7 @@ Undumped Pirates: + @@ -21056,6 +22394,7 @@ Undumped Pirates: + @@ -21072,6 +22411,7 @@ Undumped Pirates: + @@ -21088,6 +22428,7 @@ Undumped Pirates: + @@ -21104,6 +22445,7 @@ Undumped Pirates: + @@ -21120,6 +22462,7 @@ Undumped Pirates: + @@ -21136,6 +22479,7 @@ Undumped Pirates: + @@ -21154,6 +22498,7 @@ Undumped Pirates: + @@ -21170,6 +22515,7 @@ Undumped Pirates: + @@ -21184,6 +22530,7 @@ Undumped Pirates: + @@ -21198,6 +22545,7 @@ Undumped Pirates: + @@ -21212,6 +22560,7 @@ Undumped Pirates: + @@ -21225,6 +22574,7 @@ Undumped Pirates: + @@ -21241,6 +22591,7 @@ Undumped Pirates: + @@ -21255,6 +22606,7 @@ Undumped Pirates: + @@ -21269,6 +22621,7 @@ Undumped Pirates: + @@ -21283,6 +22636,7 @@ Undumped Pirates: + @@ -21297,6 +22651,7 @@ Undumped Pirates: + @@ -21311,6 +22666,7 @@ Undumped Pirates: + @@ -21327,6 +22683,7 @@ Undumped Pirates: + @@ -21343,6 +22700,7 @@ Undumped Pirates: + @@ -21359,6 +22717,7 @@ Undumped Pirates: + @@ -21377,6 +22736,7 @@ Undumped Pirates: + @@ -21392,6 +22752,7 @@ Undumped Pirates: + @@ -21405,6 +22766,7 @@ Undumped Pirates: + @@ -21419,6 +22781,7 @@ Undumped Pirates: + @@ -21433,6 +22796,7 @@ Undumped Pirates: + @@ -21449,6 +22813,7 @@ Undumped Pirates: + @@ -21465,6 +22830,7 @@ Undumped Pirates: + @@ -21481,6 +22847,7 @@ Undumped Pirates: + @@ -21497,6 +22864,7 @@ Undumped Pirates: + @@ -21513,6 +22881,7 @@ Undumped Pirates: + @@ -21531,6 +22900,7 @@ Undumped Pirates: + @@ -21549,6 +22919,7 @@ Undumped Pirates: + @@ -21567,6 +22938,7 @@ Undumped Pirates: + @@ -21585,6 +22957,7 @@ Undumped Pirates: + @@ -21603,6 +22976,7 @@ Undumped Pirates: + @@ -21621,6 +22995,7 @@ Undumped Pirates: + @@ -21637,6 +23012,7 @@ Undumped Pirates: + @@ -21654,6 +23030,7 @@ Undumped Pirates: + @@ -21672,6 +23049,7 @@ Undumped Pirates: + @@ -21690,6 +23068,7 @@ Undumped Pirates: + @@ -21708,6 +23087,7 @@ Undumped Pirates: + @@ -21726,6 +23106,7 @@ Undumped Pirates: + @@ -21744,6 +23125,7 @@ Undumped Pirates: + @@ -21760,6 +23142,7 @@ Undumped Pirates: + @@ -21776,6 +23159,7 @@ Undumped Pirates: + @@ -21792,6 +23176,7 @@ Undumped Pirates: + @@ -21810,6 +23195,7 @@ Undumped Pirates: + @@ -21828,6 +23214,7 @@ Undumped Pirates: + @@ -21846,6 +23233,7 @@ Undumped Pirates: + @@ -21876,6 +23264,7 @@ Undumped Pirates: + @@ -21889,6 +23278,7 @@ Undumped Pirates: + @@ -21938,6 +23328,7 @@ Undumped Pirates: + @@ -21953,6 +23344,7 @@ Undumped Pirates: + @@ -21966,6 +23358,7 @@ Undumped Pirates: + @@ -21979,6 +23372,7 @@ Undumped Pirates: + @@ -22020,6 +23414,7 @@ Undumped Pirates: Sintax + @@ -22034,6 +23429,7 @@ Undumped Pirates: Sintax + @@ -22048,6 +23444,7 @@ Undumped Pirates: Sintax + @@ -22063,6 +23460,7 @@ Undumped Pirates: + @@ -22078,6 +23476,7 @@ Undumped Pirates: + @@ -22096,6 +23495,7 @@ Undumped Pirates: + @@ -22111,6 +23511,7 @@ Undumped Pirates: + @@ -22126,6 +23527,7 @@ Undumped Pirates: + @@ -22141,6 +23543,7 @@ Undumped Pirates: + @@ -22156,6 +23559,7 @@ Undumped Pirates: + @@ -22172,6 +23576,7 @@ Undumped Pirates: + @@ -22187,6 +23592,7 @@ Undumped Pirates: + @@ -22202,6 +23608,7 @@ Undumped Pirates: + @@ -22217,6 +23624,7 @@ Undumped Pirates: + @@ -22232,6 +23640,7 @@ Undumped Pirates: + @@ -22247,6 +23656,7 @@ Undumped Pirates: + @@ -22262,6 +23672,7 @@ Undumped Pirates: + @@ -22277,6 +23688,7 @@ Undumped Pirates: + @@ -22292,6 +23704,7 @@ Undumped Pirates: + @@ -22307,6 +23720,7 @@ Undumped Pirates: + @@ -22322,6 +23736,7 @@ Undumped Pirates: + @@ -22337,6 +23752,7 @@ Undumped Pirates: + @@ -22352,6 +23768,7 @@ Undumped Pirates: + @@ -22367,6 +23784,7 @@ Undumped Pirates: + @@ -22382,6 +23800,7 @@ Undumped Pirates: + @@ -22397,6 +23816,7 @@ Undumped Pirates: + @@ -22412,6 +23832,7 @@ Undumped Pirates: + @@ -22427,6 +23848,7 @@ Undumped Pirates: + @@ -22442,6 +23864,7 @@ Undumped Pirates: + @@ -22457,6 +23880,7 @@ Undumped Pirates: + @@ -22472,6 +23896,7 @@ Undumped Pirates: + @@ -22487,6 +23912,7 @@ Undumped Pirates: + @@ -22502,6 +23928,7 @@ Undumped Pirates: + @@ -22517,6 +23944,7 @@ Undumped Pirates: + @@ -22532,6 +23960,7 @@ Undumped Pirates: + @@ -22547,6 +23976,7 @@ Undumped Pirates: + @@ -22562,6 +23992,7 @@ Undumped Pirates: + @@ -22577,6 +24008,7 @@ Undumped Pirates: + @@ -22592,6 +24024,7 @@ Undumped Pirates: + @@ -22607,6 +24040,7 @@ Undumped Pirates: + @@ -22622,6 +24056,7 @@ Undumped Pirates: + @@ -22637,6 +24072,7 @@ Undumped Pirates: + @@ -22652,6 +24088,7 @@ Undumped Pirates: + @@ -22667,6 +24104,7 @@ Undumped Pirates: + @@ -22682,6 +24120,7 @@ Undumped Pirates: + @@ -22747,6 +24186,7 @@ Undumped Pirates: + @@ -22762,6 +24202,7 @@ Undumped Pirates: + @@ -22777,6 +24218,7 @@ Undumped Pirates: + @@ -22792,6 +24234,7 @@ Undumped Pirates: + @@ -22806,6 +24249,7 @@ Undumped Pirates: V.Fame ~ Guangzhou Li Cheng + @@ -22821,6 +24265,7 @@ Undumped Pirates: + @@ -22835,6 +24280,7 @@ Undumped Pirates: V.Fame ~ Guangzhou Li Cheng + @@ -22847,6 +24293,7 @@ Undumped Pirates: V.Fame ~ Guangzhou Li Cheng + @@ -22859,6 +24306,7 @@ Undumped Pirates: SKOB ~ Guangzhou Li Cheng + @@ -22875,6 +24323,7 @@ Undumped Pirates: + @@ -22888,6 +24337,7 @@ Undumped Pirates: + @@ -22901,6 +24351,7 @@ Undumped Pirates: V.Fame + @@ -22913,6 +24364,7 @@ Undumped Pirates: Fiver Firm + @@ -22927,6 +24379,7 @@ Undumped Pirates: Fiver Firm + @@ -22941,6 +24394,7 @@ Undumped Pirates: Fiver Firm + @@ -22956,6 +24410,7 @@ Undumped Pirates: Fiver Firm + @@ -22971,6 +24426,7 @@ Undumped Pirates: V.Fame? + @@ -22986,6 +24442,7 @@ Undumped Pirates: + @@ -23001,6 +24458,7 @@ Undumped Pirates: + @@ -23016,6 +24474,7 @@ Undumped Pirates: + @@ -23031,6 +24490,7 @@ Undumped Pirates: <unknown> + @@ -23046,6 +24506,7 @@ Undumped Pirates: + @@ -23061,6 +24522,7 @@ Undumped Pirates: + @@ -23077,6 +24539,7 @@ Undumped Pirates: + @@ -23093,6 +24556,7 @@ Undumped Pirates: + @@ -23107,6 +24571,7 @@ Undumped Pirates: SKOB + @@ -23122,6 +24587,7 @@ Undumped Pirates: SKOB + @@ -23138,6 +24604,7 @@ Undumped Pirates: + @@ -23153,6 +24620,7 @@ Undumped Pirates: + @@ -23169,6 +24637,7 @@ Undumped Pirates: + @@ -23185,6 +24654,7 @@ Undumped Pirates: <unknown> + @@ -23200,6 +24670,7 @@ Undumped Pirates: <unknown> + @@ -23215,6 +24686,7 @@ Undumped Pirates: <unknown> + @@ -23229,6 +24701,7 @@ Undumped Pirates: <unknown> + @@ -23241,6 +24714,7 @@ Undumped Pirates: <unknown> + @@ -23255,6 +24729,7 @@ Undumped Pirates: <unknown> + @@ -23270,6 +24745,7 @@ Undumped Pirates: + @@ -23285,6 +24761,7 @@ Undumped Pirates: GOWIN + @@ -23300,6 +24777,7 @@ Undumped Pirates: GOWIN + @@ -23315,6 +24793,7 @@ Undumped Pirates: + @@ -23330,6 +24809,7 @@ Undumped Pirates: + @@ -23348,6 +24828,7 @@ Undumped Pirates: <unknown> + @@ -23363,6 +24844,7 @@ Undumped Pirates: <unknown> + @@ -23375,6 +24857,7 @@ Undumped Pirates: <unknown> + @@ -23389,6 +24872,7 @@ Undumped Pirates: Yong Yong + @@ -23401,6 +24885,7 @@ Undumped Pirates: Yong Yong + @@ -23413,6 +24898,7 @@ Undumped Pirates: Yong Yong + @@ -23425,6 +24911,7 @@ Undumped Pirates: Sintax + @@ -23439,6 +24926,7 @@ Undumped Pirates: Sintax + @@ -23453,6 +24941,7 @@ Undumped Pirates: Yong Yong + @@ -23466,6 +24955,7 @@ Undumped Pirates: Yong Yong + @@ -23480,6 +24970,7 @@ Undumped Pirates: Yong Yong + @@ -23492,6 +24983,7 @@ Undumped Pirates: Yong Yong + @@ -23505,6 +24997,7 @@ Undumped Pirates: Yong Yong + @@ -23519,6 +25012,7 @@ Undumped Pirates: Yong Yong + @@ -23531,6 +25025,7 @@ Undumped Pirates: Yong Yong + @@ -23543,6 +25038,7 @@ Undumped Pirates: Yong Yong + @@ -23555,6 +25051,7 @@ Undumped Pirates: Yong Yong + @@ -23571,6 +25068,7 @@ Undumped Pirates: Sintax + @@ -23586,6 +25084,7 @@ Undumped Pirates: Sintax + @@ -23601,6 +25100,7 @@ Undumped Pirates: Sintax + @@ -23616,6 +25116,7 @@ Undumped Pirates: Sintax + diff --git a/src/mess/drivers/gb.c b/src/mess/drivers/gb.c index 48536bcc0c0..38e3f74ac41 100644 --- a/src/mess/drivers/gb.c +++ b/src/mess/drivers/gb.c @@ -447,6 +447,9 @@ space. This mapper uses 32KB sized banks. #include "rendlay.h" #include "audio/gb.h" #include "includes/gb.h" +#include "machine/gb_slot.h" +#include "machine/gb_rom.h" +#include "machine/gb_mbc.h" /* Initial value of the cpu registers (hacks until we get bios dumps) */ @@ -474,16 +477,113 @@ static ADDRESS_MAP_START(gb_map, AS_PROGRAM, 8, gb_state ) AM_RANGE(0xffff, 0xffff) AM_READWRITE(gb_ie_r, gb_ie_w ) /* Interrupt enable register */ ADDRESS_MAP_END +READ8_MEMBER(gb_state::gb_cart_r) +{ + if (m_bios_disable && m_cartslot->m_cart) + return m_cartslot->m_cart->read_rom(space, offset); + else + { + if (offset < 0x100) + { + UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); + return ROM[offset]; + } + else if (m_cartslot->m_cart) + { + return m_cartslot->m_cart->read_rom(space, offset); + } + else + return 0xff; + } +} + +READ8_MEMBER(gb_state::gbc_cart_r) +{ + if (m_bios_disable && m_cartslot->m_cart) + return m_cartslot->m_cart->read_rom(space, offset); + else + { + if (offset < 0x100) + { + UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); + return ROM[offset]; + } + else if (offset >= 0x200 && offset < 0x900) + { + UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); + return ROM[offset - 0x100]; + } + else if (m_cartslot->m_cart) + { + return m_cartslot->m_cart->read_rom(space, offset); + } + else + return 0xff; + } +} + +WRITE8_MEMBER(gb_state::gb_bank_w) +{ + if (m_cartslot->m_cart) + m_cartslot->m_cart->write_bank(space, offset, data); +} + +READ8_MEMBER(gb_state::gb_ram_r) +{ + if (m_cartslot->m_cart) + return m_cartslot->m_cart->read_ram(space, offset); + else + return 0xff; +} + +WRITE8_MEMBER(gb_state::gb_ram_w) +{ + if (m_cartslot->m_cart) + m_cartslot->m_cart->write_ram(space, offset, data); +} + +READ8_MEMBER(megaduck_state::cart_r) +{ + if (m_cartslot && m_cartslot->m_cart) + return m_cartslot->m_cart->read_rom(space, offset); + else + return 0xff; +} + +WRITE8_MEMBER(megaduck_state::bank1_w) +{ + if (m_cartslot->m_cart) + m_cartslot->m_cart->write_bank(space, offset, data); +} + +WRITE8_MEMBER(megaduck_state::bank2_w) +{ + if (m_cartslot->m_cart) + m_cartslot->m_cart->write_ram(space, offset, data); /* used for bankswitch, but we re-use GB name */ +} + + +static ADDRESS_MAP_START(gameboy_map, AS_PROGRAM, 8, gb_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x0000, 0x7fff) AM_READWRITE(gb_cart_r, gb_bank_w) + AM_RANGE(0x8000, 0x9fff) AM_READWRITE(gb_vram_r, gb_vram_w ) /* 8k VRAM */ + AM_RANGE(0xa000, 0xbfff) AM_READWRITE(gb_ram_r, gb_ram_w ) /* 8k switched RAM bank (cartridge) */ + AM_RANGE(0xc000, 0xfdff) AM_RAM /* 8k low RAM, echo RAM */ + AM_RANGE(0xfe00, 0xfeff) AM_READWRITE(gb_oam_r, gb_oam_w ) /* OAM RAM */ + AM_RANGE(0xff00, 0xff0f) AM_READWRITE(gb_io_r, gb_io_w ) /* I/O */ + AM_RANGE(0xff10, 0xff26) AM_DEVREADWRITE_LEGACY("custom", gb_sound_r, gb_sound_w ) /* sound registers */ + AM_RANGE(0xff27, 0xff2f) AM_NOP /* unused */ + AM_RANGE(0xff30, 0xff3f) AM_DEVREADWRITE_LEGACY("custom", gb_wave_r, gb_wave_w ) /* Wave ram */ + AM_RANGE(0xff40, 0xff7f) AM_READWRITE(gb_video_r, gb_io2_w) /* Video controller & BIOS flip-flop */ + AM_RANGE(0xff80, 0xfffe) AM_RAM /* High RAM */ + AM_RANGE(0xffff, 0xffff) AM_READWRITE(gb_ie_r, gb_ie_w ) /* Interrupt enable register */ +ADDRESS_MAP_END + static ADDRESS_MAP_START(sgb_map, AS_PROGRAM, 8, gb_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x00ff) AM_ROMBANK("bank5") /* BIOS or ROM */ - AM_RANGE(0x0100, 0x01ff) AM_ROMBANK("bank10") /* ROM bank */ - AM_RANGE(0x0200, 0x08ff) AM_ROMBANK("bank6") - AM_RANGE(0x0900, 0x3fff) AM_ROMBANK("bank11") - AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank1") /* 8KB/16KB switched ROM bank */ - AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") /* 8KB/16KB switched ROM bank */ + AM_RANGE(0x0000, 0x7fff) AM_READWRITE(gb_cart_r, gb_bank_w) AM_RANGE(0x8000, 0x9fff) AM_READWRITE(gb_vram_r, gb_vram_w ) /* 8k VRAM */ - AM_RANGE(0xa000, 0xbfff) AM_RAMBANK("bank2") /* 8k switched RAM bank (cartridge) */ + AM_RANGE(0xa000, 0xbfff) AM_READWRITE(gb_ram_r, gb_ram_w ) /* 8k switched RAM bank (cartridge) */ AM_RANGE(0xc000, 0xfdff) AM_RAM /* 8k low RAM, echo RAM */ AM_RANGE(0xfe00, 0xfeff) AM_READWRITE(gb_oam_r, gb_oam_w ) /* OAM RAM */ AM_RANGE(0xff00, 0xff0f) AM_READWRITE(gb_io_r, sgb_io_w ) /* I/O */ @@ -497,16 +597,11 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(gbc_map, AS_PROGRAM, 8, gb_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x00ff) AM_ROMBANK("bank5") /* 16k fixed ROM bank */ - AM_RANGE(0x0100, 0x01ff) AM_ROMBANK("bank10") /* ROM bank */ - AM_RANGE(0x0200, 0x08ff) AM_ROMBANK("bank6") - AM_RANGE(0x0900, 0x3fff) AM_ROMBANK("bank11") - AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank1") /* 8KB/16KB switched ROM bank */ - AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") /* 8KB/16KB switched ROM bank */ - AM_RANGE(0x8000, 0x9fff) AM_READWRITE(gb_vram_r, gb_vram_w ) /* 8k switched VRAM bank */ - AM_RANGE(0xa000, 0xbfff) AM_RAMBANK("bank2") /* 8k switched RAM bank (on cartridge) */ + AM_RANGE(0x0000, 0x7fff) AM_READWRITE(gbc_cart_r, gb_bank_w) + AM_RANGE(0x8000, 0x9fff) AM_READWRITE(gb_vram_r, gb_vram_w ) /* 8k VRAM */ + AM_RANGE(0xa000, 0xbfff) AM_READWRITE(gb_ram_r, gb_ram_w ) /* 8k switched RAM bank (cartridge) */ AM_RANGE(0xc000, 0xcfff) AM_RAM /* 4k fixed RAM bank */ - AM_RANGE(0xd000, 0xdfff) AM_RAMBANK("bank3") /* 4k switched RAM bank */ + AM_RANGE(0xd000, 0xdfff) AM_RAMBANK("cgb_ram") /* 4k switched RAM bank */ AM_RANGE(0xe000, 0xfdff) AM_RAM /* echo RAM */ AM_RANGE(0xfe00, 0xfeff) AM_READWRITE(gb_oam_r, gb_oam_w ) /* OAM RAM */ AM_RANGE(0xff00, 0xff0f) AM_READWRITE(gb_io_r, gb_io_w ) /* I/O */ @@ -518,12 +613,13 @@ static ADDRESS_MAP_START(gbc_map, AS_PROGRAM, 8, gb_state ) AM_RANGE(0xffff, 0xffff) AM_READWRITE(gb_ie_r, gb_ie_w ) /* Interrupt enable register */ ADDRESS_MAP_END -static ADDRESS_MAP_START(megaduck_map, AS_PROGRAM, 8, gb_state ) +static ADDRESS_MAP_START(megaduck_map, AS_PROGRAM, 8, megaduck_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x3fff) AM_ROMBANK("bank10") /* 16k switched ROM bank */ - AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") /* 16k switched ROM bank */ + AM_RANGE(0x0000, 0x7fff) AM_READWRITE(cart_r, bank1_w) AM_RANGE(0x8000, 0x9fff) AM_READWRITE(gb_vram_r, gb_vram_w ) /* 8k VRAM */ - AM_RANGE(0xa000, 0xbfff) AM_NOP /* unused? */ + AM_RANGE(0xa000, 0xafff) AM_NOP /* unused? */ + AM_RANGE(0xb000, 0xb000) AM_WRITE(bank2_w) + AM_RANGE(0xb001, 0xbfff) AM_NOP /* unused? */ AM_RANGE(0xc000, 0xfe9f) AM_RAM /* 8k low RAM, echo RAM */ AM_RANGE(0xfe00, 0xfeff) AM_READWRITE(gb_oam_r, gb_oam_w ) /* OAM RAM */ AM_RANGE(0xff00, 0xff0f) AM_READWRITE(gb_io_r, gb_io_w ) /* I/O */ @@ -584,13 +680,36 @@ static MACHINE_CONFIG_START( gb_common, gb_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( gameboy, gb_common ) +static SLOT_INTERFACE_START(gb_cart) + SLOT_INTERFACE_INTERNAL("rom", GB_STD_ROM) + SLOT_INTERFACE_INTERNAL("rom_mbc1", GB_ROM_MBC1) + SLOT_INTERFACE_INTERNAL("rom_mbc1k", GB_ROM_MBC1K) + SLOT_INTERFACE_INTERNAL("rom_mbc2", GB_ROM_MBC2) + SLOT_INTERFACE_INTERNAL("rom_mbc3", GB_ROM_MBC3) + SLOT_INTERFACE_INTERNAL("rom_huc1", GB_ROM_MBC3) + SLOT_INTERFACE_INTERNAL("rom_huc3", GB_ROM_MBC3) + SLOT_INTERFACE_INTERNAL("rom_mbc5", GB_ROM_MBC5) + SLOT_INTERFACE_INTERNAL("rom_mbc6", GB_ROM_MBC6) + SLOT_INTERFACE_INTERNAL("rom_mbc7", GB_ROM_MBC7) + SLOT_INTERFACE_INTERNAL("rom_tama5", GB_ROM_TAMA5) + SLOT_INTERFACE_INTERNAL("rom_mmm01", GB_ROM_MMM01) + SLOT_INTERFACE_INTERNAL("rom_wisdom", GB_ROM_WISDOM) + SLOT_INTERFACE_INTERNAL("rom_yong", GB_ROM_YONG) + SLOT_INTERFACE_INTERNAL("rom_lasama", GB_ROM_LASAMA) + SLOT_INTERFACE_INTERNAL("rom_atvrac", GB_ROM_ATVRAC) + SLOT_INTERFACE_INTERNAL("rom_camera", GB_STD_ROM) +SLOT_INTERFACE_END + +static SLOT_INTERFACE_START(megaduck_cart) + SLOT_INTERFACE_INTERNAL("rom", MEGADUCK_ROM) +SLOT_INTERFACE_END + +static MACHINE_CONFIG_DERIVED( gameboy, gb_common ) + MCFG_CPU_REPLACE("maincpu", LR35902, 4194304) /* 4.194304 MHz */ + MCFG_CPU_PROGRAM_MAP(gameboy_map) + + MCFG_GB_CARTRIDGE_ADD("gbslot", gb_cart, NULL, NULL) - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("gb,gmb,cgb,gbc,sgb,bin") - MCFG_CARTSLOT_NOT_MANDATORY - MCFG_CARTSLOT_INTERFACE("gameboy_cart") - MCFG_CARTSLOT_LOAD(gb_state,gb_cart) MCFG_SOFTWARE_LIST_ADD("cart_list","gameboy") MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("gbc_list","gbcolor") MACHINE_CONFIG_END @@ -621,14 +740,11 @@ static MACHINE_CONFIG_DERIVED( gbpocket, gameboy ) MCFG_LR35902_HALT_BUG MCFG_LR35902_RESET_VALUES(mgb_cpu_regs) - MCFG_MACHINE_RESET_OVERRIDE(gb_state, gbpocket ) + MCFG_MACHINE_RESET_OVERRIDE(gb_state, gbpocket) MCFG_PALETTE_INIT_OVERRIDE(gb_state,gbp) - - MCFG_CARTSLOT_MODIFY("cart") - MCFG_CARTSLOT_MANDATORY MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( gbcolor, gb_common ) +static MACHINE_CONFIG_DERIVED( gbcolor, gameboy ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP( gbc_map) MCFG_LR35902_TIMER_CB( WRITE8( gb_state, gb_timer_callback ) ) @@ -643,16 +759,13 @@ static MACHINE_CONFIG_DERIVED( gbcolor, gb_common ) MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("48K") /* 2 pages of 8KB VRAM, 8 pages of 4KB RAM */ - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("gb,gmb,cgb,gbc,sgb,bin") - MCFG_CARTSLOT_NOT_MANDATORY - MCFG_CARTSLOT_INTERFACE("gameboy_cart") - MCFG_CARTSLOT_LOAD(gb_state,gb_cart) + MCFG_DEVICE_REMOVE("cart_list") + MCFG_DEVICE_REMOVE("gbc_list") MCFG_SOFTWARE_LIST_ADD("cart_list","gbcolor") MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("gb_list","gameboy") MACHINE_CONFIG_END -static MACHINE_CONFIG_START( megaduck, gb_state ) +static MACHINE_CONFIG_START( megaduck, megaduck_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", LR35902, 4194304) /* 4.194304 MHz */ MCFG_CPU_PROGRAM_MAP( megaduck_map) @@ -666,8 +779,8 @@ static MACHINE_CONFIG_START( megaduck, gb_state ) MCFG_SCREEN_VBLANK_TIME(0) MCFG_QUANTUM_TIME(attotime::from_hz(60)) - MCFG_MACHINE_START_OVERRIDE(gb_state, megaduck ) - MCFG_MACHINE_RESET_OVERRIDE(gb_state, megaduck ) + MCFG_MACHINE_START_OVERRIDE(megaduck_state, megaduck ) + MCFG_MACHINE_RESET_OVERRIDE(megaduck_state, megaduck ) MCFG_SCREEN_UPDATE_DRIVER(gb_state, screen_update) MCFG_SCREEN_SIZE(20*8, 18*8) @@ -676,19 +789,14 @@ static MACHINE_CONFIG_START( megaduck, gb_state ) MCFG_DEFAULT_LAYOUT(layout_lcd) MCFG_GFXDECODE(gb) MCFG_PALETTE_LENGTH(4) - MCFG_PALETTE_INIT_OVERRIDE(gb_state,megaduck) + MCFG_PALETTE_INIT_OVERRIDE(megaduck_state,megaduck) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SOUND_ADD("custom", GAMEBOY, 0) MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("bin") - MCFG_CARTSLOT_MANDATORY - MCFG_CARTSLOT_INTERFACE("megaduck_cart") - MCFG_CARTSLOT_LOAD(gb_state,megaduck_cart) - MCFG_SOFTWARE_LIST_ADD("cart_list","megaduck") + MCFG_MEGADUCK_CARTRIDGE_ADD("duckslot", megaduck_cart, NULL, NULL) MACHINE_CONFIG_END /*************************************************************************** @@ -729,13 +837,13 @@ ROM_START( megaduck ) ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ -CONS( 1990, gameboy, 0, 0, gameboy, gameboy, gb_state, gb, "Nintendo", "Game Boy", 0) -CONS( 1994, supergb, gameboy, 0, supergb, gameboy, gb_state, gb, "Nintendo", "Super Game Boy", 0) -CONS( 1996, gbpocket, gameboy, 0, gbpocket, gameboy, gb_state, gb, "Nintendo", "Game Boy Pocket", 0) -CONS( 1997, gblight, gameboy, 0, gbpocket, gameboy, gb_state, gb, "Nintendo", "Game Boy Light", 0) -CONS( 1998, gbcolor, gameboy, 0, gbcolor, gameboy, gb_state, gb, "Nintendo", "Game Boy Color", GAME_IMPERFECT_GRAPHICS) +CONS( 1990, gameboy, 0, 0, gameboy, gameboy, driver_device, 0, "Nintendo", "Game Boy", 0) +CONS( 1994, supergb, gameboy, 0, supergb, gameboy, driver_device, 0, "Nintendo", "Super Game Boy", 0) +CONS( 1996, gbpocket, gameboy, 0, gbpocket, gameboy, driver_device, 0, "Nintendo", "Game Boy Pocket", 0) +CONS( 1997, gblight, gameboy, 0, gbpocket, gameboy, driver_device, 0, "Nintendo", "Game Boy Light", 0) +CONS( 1998, gbcolor, gameboy, 0, gbcolor, gameboy, driver_device, 0, "Nintendo", "Game Boy Color", GAME_IMPERFECT_GRAPHICS) /* Sound is not 100% yet, it generates some sounds which could be ok. Since we're lacking a real system there's no way to verify. Same goes for the colors of the LCD. We are no using the default Game Boy green colors */ -CONS( 1993, megaduck, 0, 0, megaduck, gameboy, gb_state, gb, "Creatronic/Videojet/Timlex/Cougar", "MegaDuck/Cougar Boy" , 0) +CONS( 1993, megaduck, 0, 0, megaduck, gameboy, driver_device, 0, "Creatronic/Videojet/Timlex/Cougar", "MegaDuck/Cougar Boy" , 0) diff --git a/src/mess/includes/gb.h b/src/mess/includes/gb.h index f16f339927e..aa373b76ddf 100644 --- a/src/mess/includes/gb.h +++ b/src/mess/includes/gb.h @@ -7,6 +7,7 @@ #ifndef GB_H_ #define GB_H_ +#include "machine/gb_slot.h" /* Interrupts */ @@ -110,15 +111,9 @@ class gb_state : public driver_device public: gb_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) + , m_cartslot(*this, "gbslot") , m_maincpu(*this, "maincpu") - , m_bank1(*this, "bank1") - , m_bank2(*this, "bank2") - , m_bank3(*this, "bank3") - , m_bank4(*this, "bank4") - , m_bank5(*this, "bank5") - , m_bank6(*this, "bank6") - , m_bank10(*this, "bank10") - , m_bank11(*this, "bank11") + , m_rambank(*this, "cgb_ram") , m_inputs(*this, "INPUTS") { } @@ -157,70 +152,16 @@ public: UINT8 m_sgb_data[0x100]; UINT32 m_sgb_atf; - /* Cartridge/mapper */ - UINT16 m_MBCType; /* MBC type: 0 for none */ - UINT8 m_CartType; /* Cartridge type (battery, ram, rtc, etc) */ - UINT8 *m_ROMMap[MAX_ROMBANK]; /* Addresses of ROM banks */ - UINT16 m_ROMBank; /* Index of ROM bank currently used at 4000-7fff */ - UINT16 m_ROMBank00; /* Index of ROM bank currently used at 0000-3fff */ - UINT8 m_ROMMask; /* Mask for the ROM bank number */ - UINT16 m_ROMBanks; /* Total number of ROM banks */ - UINT8 *m_RAMMap[MAX_RAMBANK]; /* Addresses of RAM banks */ - UINT8 m_RAMBank; /* Number of RAM bank currently used */ - UINT8 m_RAMMask; /* Mask for the RAM bank number */ - UINT8 m_RAMBanks; /* Total number of RAM banks */ - UINT8 m_MBC1Mode; /* MBC1 ROM/RAM mode */ - UINT8 *m_MBC3RTCData; /* MBC3 RTC data */ - UINT8 m_MBC3RTCMap[5]; /* MBC3 RTC banks */ - UINT8 m_MBC3RTCBank; /* MBC3 RTC bank */ + /* CGB variables */ UINT8 *m_GBC_RAMMap[8]; /* (CGB) Addresses of internal RAM banks */ UINT8 m_GBC_RAMBank; /* (CGB) Current CGB RAM bank */ - UINT8 m_gbTama5Memory[32]; - UINT8 m_gbTama5Byte; - UINT8 m_gbTama5Address; - UINT8 m_gbLastTama5Command; - UINT8 *m_gb_cart; - UINT8 *m_gb_cart_ram; - UINT8 *m_gb_dummy_rom_bank; - UINT8 *m_gb_dummy_ram_bank; - UINT8 m_mmm01_bank_offset; - UINT8 m_mmm01_reg1; - UINT8 m_mmm01_bank; - UINT8 m_mmm01_bank_mask; + gb_lcd_t m_lcd; void (gb_state::*update_scanline) (); + bool m_bios_disable; bitmap_ind16 m_bitmap; - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_mbc1); - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_mbc2); - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_mbc3); - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_mbc5); - DECLARE_WRITE8_MEMBER(gb_ram_bank_select_mbc6); - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_mbc6_1); - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_mbc6_2); - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_mbc7); - DECLARE_WRITE8_MEMBER(gb_rom_bank_unknown_mbc7); - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_wisdom); - DECLARE_WRITE8_MEMBER(gb_ram_bank_select_mbc1); - DECLARE_WRITE8_MEMBER(gb_ram_bank_select_mbc3); - DECLARE_WRITE8_MEMBER(gb_ram_bank_select_mbc5); - DECLARE_WRITE8_MEMBER(gb_ram_enable); - DECLARE_WRITE8_MEMBER(gb_mem_mode_select_mbc1); - DECLARE_WRITE8_MEMBER(gb_mem_mode_select_mbc3); - DECLARE_WRITE8_MEMBER(gb_ram_tama5); - DECLARE_WRITE8_MEMBER(gb_rom_bank_mmm01_0000_w); - DECLARE_WRITE8_MEMBER(gb_rom_bank_mmm01_2000_w); - DECLARE_WRITE8_MEMBER(gb_rom_bank_mmm01_4000_w); - DECLARE_WRITE8_MEMBER(gb_rom_bank_mmm01_6000_w); - DECLARE_WRITE8_MEMBER(gb_rom_bank_select_mbc1_kor); - DECLARE_WRITE8_MEMBER(gb_ram_bank_select_mbc1_kor); - DECLARE_WRITE8_MEMBER(gb_mem_mode_select_mbc1_kor); - DECLARE_WRITE8_MEMBER(gb_rom_bank_yongyong_2000); - DECLARE_WRITE8_MEMBER(gb_rom_bank_lasama_6000); - DECLARE_WRITE8_MEMBER(gb_rom_bank_lasama_2080); - DECLARE_WRITE8_MEMBER(gb_rom_bank_atvracin_3f00); - DECLARE_WRITE8_MEMBER(gb_rom_bank_atvracin_3fc0); DECLARE_WRITE8_MEMBER(gb_io_w); DECLARE_WRITE8_MEMBER(gb_io2_w); DECLARE_WRITE8_MEMBER(sgb_io_w); @@ -229,14 +170,6 @@ public: DECLARE_READ8_MEMBER(gb_io_r); DECLARE_WRITE8_MEMBER(gbc_io2_w); DECLARE_READ8_MEMBER(gbc_io2_r); - DECLARE_READ8_MEMBER(megaduck_video_r); - DECLARE_WRITE8_MEMBER(megaduck_video_w); - DECLARE_WRITE8_MEMBER(megaduck_sound_w1); - DECLARE_READ8_MEMBER(megaduck_sound_r1); - DECLARE_WRITE8_MEMBER(megaduck_sound_w2); - DECLARE_READ8_MEMBER(megaduck_sound_r2); - DECLARE_WRITE8_MEMBER(megaduck_rom_bank_select_type1); - DECLARE_WRITE8_MEMBER(megaduck_rom_bank_select_type2); DECLARE_READ8_MEMBER(gb_video_r); DECLARE_READ8_MEMBER(gb_vram_r); DECLARE_WRITE8_MEMBER(gb_vram_w); @@ -248,9 +181,6 @@ public: DECLARE_MACHINE_START(gb); DECLARE_MACHINE_RESET(gb); DECLARE_PALETTE_INIT(gb); - DECLARE_MACHINE_START(megaduck); - DECLARE_MACHINE_RESET(megaduck); - DECLARE_PALETTE_INIT(megaduck); DECLARE_MACHINE_START(sgb); DECLARE_MACHINE_RESET(sgb); DECLARE_PALETTE_INIT(sgb); @@ -267,32 +197,23 @@ public: TIMER_CALLBACK_MEMBER(gb_lcd_timer_proc); TIMER_CALLBACK_MEMBER(gbc_lcd_timer_proc); DECLARE_WRITE8_MEMBER(gb_timer_callback); - DECLARE_DRIVER_INIT(gb); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(gb_cart); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(megaduck_cart); + + DECLARE_READ8_MEMBER(gb_cart_r); + DECLARE_READ8_MEMBER(gbc_cart_r); + DECLARE_WRITE8_MEMBER(gb_bank_w); + DECLARE_READ8_MEMBER(gb_ram_r); + DECLARE_WRITE8_MEMBER(gb_ram_w); + optional_device m_cartslot; protected: required_device m_maincpu; - required_memory_bank m_bank1; // all - optional_memory_bank m_bank2; // dmg, sgb, cgb - optional_memory_bank m_bank3; // cgb - optional_memory_bank m_bank4; // dmg, sgb, cgb - optional_memory_bank m_bank5; // dmg, sgb, cgb - optional_memory_bank m_bank6; // dmg, sgb, cgb - required_memory_bank m_bank10; // all - optional_memory_bank m_bank11; // dmg, sgb, cgb + optional_memory_bank m_rambank; // cgb required_ioport m_inputs; void gb_timer_increment(); void gb_timer_check_irq(); - void gb_init_regs(); - void gb_rom16_0000( UINT8 *addr ); - void gb_rom16_4000( UINT8 *addr ); - void gb_rom8_4000( UINT8 *addr ); - void gb_rom8_6000( UINT8 *addr ); void gb_init(); - void gb_set_mbc1_banks(); - void gb_set_mbc1_kor_banks(); + void gb_init_regs(); void gb_select_sprites(); void gb_update_sprites(); void gb_update_scanline(); @@ -305,7 +226,37 @@ protected: void gbc_hdma(UINT16 length); void gb_increment_scanline(); void gb_lcd_switch_on(); - void gb_machine_stop(); +}; + + +class megaduck_state : public gb_state +{ +public: + megaduck_state(const machine_config &mconfig, device_type type, const char *tag) + : gb_state(mconfig, type, tag) + , m_cartslot(*this, "duckslot") + , m_maincpu(*this, "maincpu") + , m_inputs(*this, "INPUTS") + { } + + DECLARE_READ8_MEMBER(megaduck_video_r); + DECLARE_WRITE8_MEMBER(megaduck_video_w); + DECLARE_WRITE8_MEMBER(megaduck_sound_w1); + DECLARE_READ8_MEMBER(megaduck_sound_r1); + DECLARE_WRITE8_MEMBER(megaduck_sound_w2); + DECLARE_READ8_MEMBER(megaduck_sound_r2); + DECLARE_MACHINE_START(megaduck); + DECLARE_MACHINE_RESET(megaduck); + DECLARE_PALETTE_INIT(megaduck); + + DECLARE_READ8_MEMBER(cart_r); + DECLARE_WRITE8_MEMBER(bank1_w); + DECLARE_WRITE8_MEMBER(bank2_w); + optional_device m_cartslot; + +protected: + required_device m_maincpu; + required_ioport m_inputs; }; diff --git a/src/mess/machine/gb.c b/src/mess/machine/gb.c index 1809a04964a..ff8c3d182c9 100644 --- a/src/mess/machine/gb.c +++ b/src/mess/machine/gb.c @@ -140,138 +140,16 @@ void gb_state::gb_init_regs() SIODATA = 0x00; SIOCONT = 0x7E; - gb_io_w( m_maincpu->space(AS_PROGRAM ), 0x05, 0x00 ); /* TIMECNT */ - gb_io_w( m_maincpu->space(AS_PROGRAM ), 0x06, 0x00 ); /* TIMEMOD */ -} - - -void gb_state::gb_rom16_0000( UINT8 *addr ) -{ - m_bank5->set_base( addr ); - m_bank10->set_base( addr + 0x0100 ); - m_bank6->set_base( addr + 0x0200 ); - m_bank11->set_base( addr + 0x0900 ); -} - - -void gb_state::gb_rom16_4000( UINT8 *addr ) -{ - m_bank1->set_base( addr ); - m_bank4->set_base( addr + 0x2000 ); -} - - -void gb_state::gb_rom8_4000( UINT8 *addr ) -{ - m_bank1->set_base( addr ); -} - - -void gb_state::gb_rom8_6000( UINT8 *addr ) -{ - m_bank4->set_base( addr ); + gb_io_w(m_maincpu->space(AS_PROGRAM), 0x05, 0x00); /* TIMECNT */ + gb_io_w(m_maincpu->space(AS_PROGRAM), 0x06, 0x00); /* TIMEMOD */ } void gb_state::gb_init() { - address_space &space = m_maincpu->space( AS_PROGRAM ); + address_space &space = m_maincpu->space(AS_PROGRAM); - /* Initialize the memory banks */ - m_MBC1Mode = 0; - m_MBC3RTCBank = 0; - m_ROMBank = m_ROMBank00 + 1; - m_RAMBank = 0; - - if (m_gb_cart) - { - if ( m_MBCType != MBC_MEGADUCK ) - { - gb_rom16_4000( m_ROMMap[m_ROMBank] ); - m_bank2->set_base( m_RAMMap[m_RAMBank] ? m_RAMMap[m_RAMBank] : m_gb_dummy_ram_bank); - } - else - { - m_bank1->set_base( m_ROMMap[m_ROMBank] ); - m_bank10->set_base( m_ROMMap[0] ); - } - } - - /* Set handlers based on the Memory Bank Controller in the cart */ - switch( m_MBCType ) - { - case MBC_NONE: - break; - case MBC_MMM01: - space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_0000_w),this) ); - space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_2000_w),this)); - space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_4000_w),this)); - space.install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_6000_w),this)); - break; - case MBC_MBC1: - space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),this) ); /* We don't emulate RAM enable yet */ - space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc1),this) ); - space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc1),this) ); - space.install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc1),this) ); - break; - case MBC_MBC2: - space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc2),this) ); - break; - case MBC_MBC3: - case MBC_HUC1: /* Possibly wrong */ - case MBC_HUC3: /* Possibly wrong */ - space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),this) ); /* We don't emulate RAM enable yet */ - space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc3),this) ); - space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc3),this) ); - space.install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc3),this) ); - break; - case MBC_MBC5: - space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),this) ); - space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc5),this) ); - space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc5),this) ); - break; - case MBC_MBC6: - space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc6),this) ); - space.install_write_handler( 0x2000, 0x2fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc6_1),this) ); - space.install_write_handler( 0x3000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc6_2),this) ); - break; - case MBC_MBC7: - space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),this) ); - space.install_write_handler( 0x2000, 0x2fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc7),this) ); - space.install_write_handler( 0x3000, 0x7fff, write8_delegate(FUNC(gb_state::gb_rom_bank_unknown_mbc7),this) ); - break; - case MBC_TAMA5: - space.install_write_handler( 0xA000, 0xBFFF, write8_delegate(FUNC(gb_state::gb_ram_tama5),this) ); - break; - case MBC_WISDOM: - space.install_write_handler( 0x0000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_wisdom),this) ); - break; - case MBC_MBC1_KOR: - space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),this) ); /* We don't emulate RAM enable yet */ - space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc1_kor),this) ); - space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc1_kor),this) ); - space.install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc1_kor),this) ); - break; - case MBC_YONGYONG: - space.install_write_handler( 0x2000, 0x2000, write8_delegate(FUNC(gb_state::gb_rom_bank_yongyong_2000),this) ); - //space.install_write_handler( 0x5000, 0x5003, write8_delegate(FUNC(gb_state::gb_rom_back_yongyong_5000),this) ); - break; - case MBC_LASAMA: - space.install_write_handler( 0x2080, 0x2080, write8_delegate(FUNC(gb_state::gb_rom_bank_lasama_2080),this) ); - space.install_write_handler( 0x6000, 0x6000, write8_delegate(FUNC(gb_state::gb_rom_bank_lasama_6000),this) ); - break; - case MBC_ATVRACIN: - space.install_write_handler( 0x3F00, 0x3F00, write8_delegate(FUNC(gb_state::gb_rom_bank_atvracin_3f00),this) ); - space.install_write_handler( 0x3FC0, 0x3FC0, write8_delegate(FUNC(gb_state::gb_rom_bank_atvracin_3fc0),this) ); - break; - - case MBC_MEGADUCK: - space.install_write_handler( 0x0001, 0x0001, write8_delegate(FUNC(gb_state::megaduck_rom_bank_select_type1),this) ); - space.install_write_handler( 0xB000, 0xB000, write8_delegate(FUNC(gb_state::megaduck_rom_bank_select_type2),this) ); - break; - } - - gb_sound_w(machine().device("custom"), space, 0x16, 0x00 ); /* Initialize sound hardware */ + gb_sound_w(machine().device("custom"), space, 0x16, 0x00); /* Initialize sound hardware */ m_divcount = 0; m_triggering_irq = 0; @@ -281,8 +159,6 @@ void gb_state::gb_init() MACHINE_START_MEMBER(gb_state,gb) { - machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(gb_state::gb_machine_stop),this)); - /* Allocate the serial timer, and disable it */ m_gb_serial_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gb_state::gb_serial_timer_proc),this)); m_gb_serial_timer->enable( 0 ); @@ -292,8 +168,6 @@ MACHINE_START_MEMBER(gb_state,gb) MACHINE_START_MEMBER(gb_state,gbc) { - machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(gb_state::gb_machine_stop),this)); - /* Allocate the serial timer, and disable it */ m_gb_serial_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gb_state::gb_serial_timer_proc),this)); m_gb_serial_timer->enable( 0 ); @@ -305,12 +179,10 @@ MACHINE_RESET_MEMBER(gb_state,gb) { gb_init(); - gb_video_reset( GB_VIDEO_DMG ); - - gb_rom16_0000( m_ROMMap[m_ROMBank00] ); + gb_video_reset(GB_VIDEO_DMG); /* Enable BIOS rom */ - m_bank5->set_base(memregion("maincpu")->base() ); + m_bios_disable = FALSE; m_divcount = 0x0004; } @@ -321,8 +193,6 @@ MACHINE_START_MEMBER(gb_state,sgb) m_sgb_packets = -1; m_sgb_tile_data = auto_alloc_array_clear(machine(), UINT8, 0x2000 ); - machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(gb_state::gb_machine_stop),this)); - /* Allocate the serial timer, and disable it */ m_gb_serial_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gb_state::gb_serial_timer_proc),this)); m_gb_serial_timer->enable( 0 ); @@ -334,30 +204,29 @@ MACHINE_RESET_MEMBER(gb_state,sgb) { gb_init(); - gb_video_reset( GB_VIDEO_SGB ); + gb_video_reset(GB_VIDEO_SGB); gb_init_regs(); - gb_rom16_0000( m_ROMMap[m_ROMBank00] ? m_ROMMap[m_ROMBank00] : m_gb_dummy_rom_bank ); /* Enable BIOS rom */ - m_bank5->set_base(memregion("maincpu")->base() ); + m_bios_disable = FALSE; - memset( m_sgb_tile_data, 0, 0x2000 ); + memset(m_sgb_tile_data, 0, 0x2000); m_sgb_window_mask = 0; - memset( m_sgb_pal_map, 0, sizeof(m_sgb_pal_map) ); - memset( m_sgb_atf_data, 0, sizeof(m_sgb_atf_data) ); + memset(m_sgb_pal_map, 0, sizeof(m_sgb_pal_map)); + memset(m_sgb_atf_data, 0, sizeof(m_sgb_atf_data)); /* HACKS for Donkey Kong Land 2 + 3. For some reason that I haven't figured out, they store the tile data differently. Hacks will go once I figure it out */ m_sgb_hack = 0; - if (m_gb_cart) // make sure cart is in + if (m_cartslot->m_cart) // make sure cart is in { - if( strncmp( (const char*)(m_gb_cart + 0x134), "DONKEYKONGLAND 2", 16 ) == 0 || - strncmp( (const char*)(m_gb_cart + 0x134), "DONKEYKONGLAND 3", 16 ) == 0 ) + if (strncmp((const char*)(m_cartslot->m_cart->get_rom_base() + 0x134), "DONKEYKONGLAND 2", 16) == 0 || + strncmp((const char*)(m_cartslot->m_cart->get_rom_base() + 0x134), "DONKEYKONGLAND 3", 16) == 0) m_sgb_hack = 1; } @@ -368,18 +237,17 @@ MACHINE_RESET_MEMBER(gb_state,gbpocket) { gb_init(); - gb_video_reset( GB_VIDEO_MGB ); + gb_video_reset(GB_VIDEO_MGB); gb_init_regs(); + m_bios_disable = TRUE; + /* Initialize the Sound registers */ gb_sound_w(machine().device("custom"), generic_space(), 0x16,0x80); gb_sound_w(machine().device("custom"), generic_space(), 0x15,0xF3); gb_sound_w(machine().device("custom"), generic_space(), 0x14,0x77); - /* Enable BIOS rom if we have one */ - gb_rom16_0000( m_ROMMap[m_ROMBank00] ? m_ROMMap[m_ROMBank00] : m_gb_dummy_rom_bank ); - m_divcount = 0xABC8; } @@ -393,461 +261,17 @@ MACHINE_RESET_MEMBER(gb_state,gbc) gb_init_regs(); - gb_rom16_0000( m_ROMMap[m_ROMBank00] ? m_ROMMap[m_ROMBank00] : m_gb_dummy_rom_bank ); - /* Enable BIOS rom */ - m_bank5->set_base(memregion("maincpu")->base() ); - m_bank6->set_base(memregion("maincpu")->base() + 0x100 ); + m_bios_disable = FALSE; /* Allocate memory for internal ram */ - for( ii = 0; ii < 8; ii++ ) + for (ii = 0; ii < 8; ii++) { m_GBC_RAMMap[ii] = machine().device(RAM_TAG)->pointer() + CGB_START_RAM_BANKS + ii * 0x1000; - memset (m_GBC_RAMMap[ii], 0, 0x1000); + memset(m_GBC_RAMMap[ii], 0, 0x1000); } } -void gb_state::gb_machine_stop() -{ - /* Don't save if there was no battery */ - if(!(m_CartType & BATTERY) || !m_RAMBanks) - return; - - /* NOTE: The reason we save the carts RAM this way instead of using MAME's - built in macros is because they force the filename to be the name of - the machine. We need to have a separate name for each game. */ - device_image_interface *image = dynamic_cast(machine().device("cart")); - image->battery_save(m_gb_cart_ram, m_RAMBanks * 0x2000); -} - -void gb_state::gb_set_mbc1_banks() -{ - gb_rom16_4000( m_ROMMap[ m_ROMBank ] ); - m_bank2->set_base( m_RAMMap[ m_MBC1Mode ? ( m_ROMBank >> 5 ) : 0 ] ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_mbc1) -{ - data &= 0x1F; /* Only uses lower 5 bits */ - /* Selecting bank 0 == selecting bank 1 */ - if( data == 0 ) - data = 1; - - m_ROMBank = ( m_ROMBank & 0x01E0 ) | data; - /* Switch banks */ - gb_set_mbc1_banks(); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_mbc2) -{ - data &= 0x0F; /* Only uses lower 4 bits */ - /* Selecting bank 0 == selecting bank 1 */ - if( data == 0 ) - data = 1; - - /* The least significant bit of the upper address byte must be 1 */ - if( offset & 0x0100 ) - m_ROMBank = ( m_ROMBank & 0x100 ) | data; - /* Switch banks */ - gb_rom16_4000( m_ROMMap[m_ROMBank] ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_mbc3) -{ - logerror( "0x%04X: write to mbc3 rom bank select register 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), offset, data ); - data &= 0x7F; /* Only uses lower 7 bits */ - /* Selecting bank 0 == selecting bank 1 */ - if( data == 0 ) - data = 1; - - m_ROMBank = ( m_ROMBank & 0x0100 ) | data; - /* Switch banks */ - gb_rom16_4000( m_ROMMap[m_ROMBank] ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_mbc5) -{ - /* MBC5 has a 9 bit bank select - Writing into 2000-2FFF sets the lower 8 bits - Writing into 3000-3FFF sets the 9th bit - */ - logerror( "0x%04X: MBC5 ROM Bank select write 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), offset, data ); - if( offset & 0x1000 ) - { - m_ROMBank = (m_ROMBank & 0xFF ) | ( ( data & 0x01 ) << 8 ); - } - else - { - m_ROMBank = (m_ROMBank & 0x100 ) | data; - } - /* Switch banks */ - gb_rom16_4000( m_ROMMap[m_ROMBank] ); -} - -WRITE8_MEMBER(gb_state::gb_ram_bank_select_mbc6) -{ - logerror( "0x%04X: write to mbc6 ram enable area: %04X <- 0x%02X\n", space.device() .safe_pc( ), offset, data ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_mbc6_1) -{ - logerror( "0x%04X: write to mbc6 rom area: 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), 0x2000 + offset, data ); - if ( offset & 0x0800 ) - { - if ( data == 0x00 ) - { - gb_rom8_4000( m_ROMMap[m_ROMBank>>1] + ( ( m_ROMBank & 0x01 ) ? 0x2000 : 0x0000 ) ); - } - } - else - { - m_ROMBank = data; - } -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_mbc6_2) -{ - logerror( "0x%04X: write to mbc6 rom area: 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), 0x3000 + offset, data ); - if ( offset & 0x0800 ) - { - if ( data == 0x00 ) - { - gb_rom8_6000( m_ROMMap[m_ROMBank00>>1] + ( ( m_ROMBank00 & 0x01 ) ? 0x2000 : 0x0000 ) ); - } - } - else - { - m_ROMBank00 = data; - } -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_mbc7) -{ - logerror( "0x%04X: write to mbc7 rom select register: 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), 0x2000 + offset, data ); - /* Bit 12 must be set for writing to the mbc register */ - if ( offset & 0x0100 ) - { - m_ROMBank = data; - gb_rom16_4000( m_ROMMap[m_ROMBank] ); - } -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_unknown_mbc7) -{ - logerror( "0x%04X: write to mbc7 rom area: 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), 0x3000 + offset, data ); - /* Bit 12 must be set for writing to the mbc register */ - if ( offset & 0x0100 ) - { - switch( offset & 0x7000 ) - { - case 0x0000: /* 0x3000-0x3fff */ - case 0x1000: /* 0x4000-0x4fff */ - case 0x2000: /* 0x5000-0x5fff */ - case 0x3000: /* 0x6000-0x6fff */ - case 0x4000: /* 0x7000-0x7fff */ - break; - } - } -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_wisdom) -{ - logerror( "0x%04X: wisdom tree mapper write to address 0x%04X\n", space.device() .safe_pc( ), offset ); - /* The address determines the bank to select */ - m_ROMBank = ( offset << 1 ) & 0x1FF; - m_bank5->set_base( m_ROMMap[ m_ROMBank ] ); - m_bank10->set_base( m_ROMMap[ m_ROMBank ] + 0x0100 ); - m_bank6->set_base( m_ROMMap[ m_ROMBank ] + 0x0200 ); - m_bank11->set_base( m_ROMMap[ m_ROMBank ] + 0x0900 ); - m_bank1->set_base( m_ROMMap[ m_ROMBank + 1 ] ); - m_bank4->set_base( m_ROMMap[ m_ROMBank + 1 ] + 0x2000 ); -} - -WRITE8_MEMBER(gb_state::gb_ram_bank_select_mbc1) -{ - data &= 0x3; /* Only uses the lower 2 bits */ - - /* Select the upper bits of the ROMMask */ - m_ROMBank = ( m_ROMBank & 0x1F ) | ( data << 5 ); - - /* Switch banks */ - gb_set_mbc1_banks(); -} - -WRITE8_MEMBER(gb_state::gb_ram_bank_select_mbc3) -{ - logerror( "0x%04X: write mbc3 ram bank select register 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), offset, data ); - if( data & 0x8 ) - { /* RTC banks */ - if ( m_CartType & TIMER ) - { - m_MBC3RTCBank = data & 0x07; - if ( data < 5 ) - { - memset( m_MBC3RTCData, m_MBC3RTCMap[m_MBC3RTCBank], 0x2000 ); - m_bank2->set_base( m_MBC3RTCData ); - } - } - } - else - { /* RAM banks */ - m_RAMBank = data & 0x3; - m_MBC3RTCBank = 0xFF; - /* Switch banks */ - m_bank2->set_base( m_RAMMap[m_RAMBank] ); - } -} - -WRITE8_MEMBER(gb_state::gb_ram_bank_select_mbc5) -{ - logerror( "0x%04X: MBC5 RAM Bank select write 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), offset, data ); - data &= 0x0F; - if( m_CartType & RUMBLE ) - { - data &= 0x7; - } - m_RAMBank = data; - /* Switch banks */ - m_bank2->set_base( m_RAMMap[m_RAMBank] ); -} - -WRITE8_MEMBER(gb_state::gb_ram_enable) -{ - /* FIXME: Currently we don't handle this, but a value of 0xA will enable - * writing to the cart's RAM banks */ - logerror( "0x%04X: Write to ram enable register 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), offset, data ); -} - -WRITE8_MEMBER(gb_state::gb_mem_mode_select_mbc1) -{ - m_MBC1Mode = data & 0x1; - gb_set_mbc1_banks(); -} - -WRITE8_MEMBER(gb_state::gb_mem_mode_select_mbc3) -{ - logerror( "0x%04X: Write to mbc3 mem mode select register 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), offset, data ); - if( m_CartType & TIMER ) - { - /* FIXME: RTC Latch goes here */ - m_MBC3RTCMap[0] = 50; /* Seconds */ - m_MBC3RTCMap[1] = 40; /* Minutes */ - m_MBC3RTCMap[2] = 15; /* Hours */ - m_MBC3RTCMap[3] = 25; /* Day counter lowest 8 bits */ - m_MBC3RTCMap[4] = 0x01; /* Day counter upper bit, timer off, no day overflow occurred (bit7) */ - } -} - -WRITE8_MEMBER(gb_state::gb_ram_tama5) -{ - logerror( "0x%04X: TAMA5 write 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), 0xA000 + offset, data ); - switch( offset & 0x0001 ) - { - case 0x0000: /* Write to data register */ - switch( m_gbLastTama5Command ) - { - case 0x00: /* Bits 0-3 for rom bank selection */ - m_ROMBank = ( m_ROMBank & 0xF0 ) | ( data & 0x0F ); - gb_rom16_4000( m_ROMMap[m_ROMBank] ); - break; - case 0x01: /* Bit 4(-7?) for rom bank selection */ - m_ROMBank = ( m_ROMBank & 0x0F ) | ( ( data & 0x0F ) << 4 ); - gb_rom16_4000( m_ROMMap[m_ROMBank] ); - break; - case 0x04: /* Data to write lo */ - m_gbTama5Byte = ( m_gbTama5Byte & 0xF0 ) | ( data & 0x0F ); - break; - case 0x05: /* Data to write hi */ - m_gbTama5Byte = ( m_gbTama5Byte & 0x0F ) | ( ( data & 0x0F ) << 4 ); - break; - case 0x06: /* Address selection hi */ - m_gbTama5Address = ( m_gbTama5Address & 0x0F ) | ( ( data & 0x0F ) << 4 ); - break; - case 0x07: /* Address selection lo */ - /* This address always seems to written last, so we'll just - execute the command here */ - m_gbTama5Address = ( m_gbTama5Address & 0xF0 ) | ( data & 0x0F ); - switch ( m_gbTama5Address & 0xE0 ) - { - case 0x00: /* Write memory */ - logerror( "Write tama5 memory 0x%02X <- 0x%02X\n", m_gbTama5Address & 0x1F, m_gbTama5Byte ); - m_gbTama5Memory[ m_gbTama5Address & 0x1F ] = m_gbTama5Byte; - break; - case 0x20: /* Read memory */ - logerror( "Read tama5 memory 0x%02X\n", m_gbTama5Address & 0x1F ); - m_gbTama5Byte = m_gbTama5Memory[ m_gbTama5Address & 0x1F ]; - break; - case 0x40: /* Unknown, some kind of read */ - if ( ( m_gbTama5Address & 0x1F ) == 0x12 ) - { - m_gbTama5Byte = 0xFF; - } - case 0x80: /* Unknown, some kind of read (when 07=01)/write (when 07=00/02) */ - default: - logerror( "0x%04X: Unknown addressing mode\n", space.device() .safe_pc( ) ); - break; - } - break; - } - break; - case 0x0001: /* Write to control register */ - switch( data ) - { - case 0x00: /* Bits 0-3 for rom bank selection */ - case 0x01: /* Bits 4-7 for rom bank selection */ - case 0x04: /* Data write register lo */ - case 0x05: /* Data write register hi */ - case 0x06: /* Address register hi */ - case 0x07: /* Address register lo */ - break; - case 0x0A: /* Are we ready for the next command? */ - m_MBC3RTCData[0] = 0x01; - m_bank2->set_base( m_MBC3RTCData ); - break; - case 0x0C: /* Data read register lo */ - m_MBC3RTCData[0] = m_gbTama5Byte & 0x0F; - break; - case 0x0D: /* Data read register hi */ - m_MBC3RTCData[0] = ( m_gbTama5Byte & 0xF0 ) >> 4; - break; - default: - logerror( "0x%04X: Unknown tama5 command 0x%02X\n", space.device() .safe_pc( ), data ); - break; - } - m_gbLastTama5Command = data; - break; - } -} - -/* This mmm01 implementation is mostly guess work, no clue how correct it all is */ - - -WRITE8_MEMBER(gb_state::gb_rom_bank_mmm01_0000_w) -{ - logerror( "0x%04X: write 0x%02X to 0x%04X\n", space.device() .safe_pc( ), data, offset+0x000 ); - if ( data & 0x40 ) - { - m_mmm01_bank_offset = m_mmm01_reg1; - m_bank5->set_base( m_ROMMap[ m_mmm01_bank_offset ] ); - m_bank10->set_base( m_ROMMap[ m_mmm01_bank_offset ] + 0x0100 ); - gb_rom16_4000( m_ROMMap[ m_mmm01_bank_offset + m_mmm01_bank ] ); - } -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_mmm01_2000_w) -{ - logerror( "0x%04X: write 0x%02X to 0x%04X\n", space.device() .safe_pc( ), data, offset+0x2000 ); - - m_mmm01_reg1 = data & m_ROMMask; - m_mmm01_bank = m_mmm01_reg1 & m_mmm01_bank_mask; - if ( m_mmm01_bank == 0 ) - { - m_mmm01_bank = 1; - } - gb_rom16_4000( m_ROMMap[ m_mmm01_bank_offset + m_mmm01_bank ] ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_mmm01_4000_w) -{ - logerror( "0x%04X: write 0x%02X to 0x%04X\n", space.device() .safe_pc( ), data, offset+0x4000 ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_mmm01_6000_w) -{ - logerror( "0x%04X: write 0x%02X to 0x%04X\n", space.device() .safe_pc( ), data, offset+0x6000 ); - /* Not sure if this is correct, Taito Variety Pack sets these values */ - /* Momotarou Collection 2 writes 01 and 21 here */ - switch( data ) - { - case 0x30: m_mmm01_bank_mask = 0x07; break; - case 0x38: m_mmm01_bank_mask = 0x03; break; - default: m_mmm01_bank_mask = 0xFF; break; - } -} - -/* Korean MBC1 variant mapping */ - -void gb_state::gb_set_mbc1_kor_banks() -{ - if ( m_ROMBank & 0x30 ) - { - gb_rom16_0000( m_ROMMap[ m_ROMBank & 0x30 ] ); - } - gb_rom16_4000( m_ROMMap[ m_ROMBank ] ); - m_bank2->set_base( m_RAMMap[ m_MBC1Mode ? ( m_ROMBank >> 5 ) : 0 ] ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_select_mbc1_kor) -{ - data &= 0x0F; /* Only uses lower 5 bits */ - /* Selecting bank 0 == selecting bank 1 */ - if( data == 0 ) - data = 1; - - m_ROMBank = ( m_ROMBank & 0x01F0 ) | data; - /* Switch banks */ - gb_set_mbc1_kor_banks(); -} - -WRITE8_MEMBER(gb_state::gb_ram_bank_select_mbc1_kor) -{ - data &= 0x3; /* Only uses the lower 2 bits */ - - /* Select the upper bits of the ROMMask */ - m_ROMBank = ( m_ROMBank & 0x0F ) | ( data << 4 ); - - /* Switch banks */ - gb_set_mbc1_kor_banks(); -} - -WRITE8_MEMBER(gb_state::gb_mem_mode_select_mbc1_kor) -{ - m_MBC1Mode = data & 0x1; - gb_set_mbc1_kor_banks(); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_yongyong_2000) -{ - m_ROMBank = data; - gb_rom16_4000( m_ROMMap[m_ROMBank] ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_lasama_2080) -{ - // Actual banking? - m_ROMBank = m_ROMBank00 | ( data & 0x03 ); - gb_rom16_4000( m_ROMMap[m_ROMBank] ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_lasama_6000) -{ - // On boot the following two get written right after each other: - // 02 - // BE - // Disable logo switching? - if ( ! ( data & 0x80 ) ) - { - m_ROMBank00 = ( data & 0x02 ) << 1; - gb_rom16_0000( m_ROMMap[m_ROMBank00] ); - } -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_atvracin_3f00) -{ - if ( data == 0 ) - { - data = 1; - } - m_ROMBank = m_ROMBank00 | data; - gb_rom16_4000( m_ROMMap[m_ROMBank] ); -} - -WRITE8_MEMBER(gb_state::gb_rom_bank_atvracin_3fc0) -{ - m_ROMBank00 = data * 16; - gb_rom16_0000( m_ROMMap[m_ROMBank00] ); -} - WRITE8_MEMBER(gb_state::gb_io_w) { static const UINT8 timer_shifts[4] = {10, 4, 6, 8}; @@ -924,15 +348,14 @@ WRITE8_MEMBER(gb_state::gb_io_w) WRITE8_MEMBER(gb_state::gb_io2_w) { - if ( offset == 0x10 ) + if (offset == 0x10) { /* disable BIOS ROM */ - gb_rom16_0000( m_ROMMap[m_ROMBank00] ); + m_bios_disable = TRUE; + printf("here again?\n"); } else - { - gb_video_w( space, offset, data ); - } + gb_video_w(space, offset, data); } #ifdef MAME_DEBUG @@ -1496,529 +919,6 @@ READ8_MEMBER(gb_state::gb_io_r) } } -DRIVER_INIT_MEMBER(gb_state, gb) -{ - int I; - - m_gb_dummy_rom_bank = auto_alloc_array(machine(), UINT8, 0x4000); - memset(m_gb_dummy_rom_bank, 0xff, 0x4000); - - m_gb_dummy_ram_bank = auto_alloc_array(machine(), UINT8, 0x2000); - memset(m_gb_dummy_ram_bank, 0xff, 0x2000 ); - - for(I = 0; I < MAX_ROMBANK; I++) - { - m_ROMMap[I] = m_gb_dummy_rom_bank; - } - for(I = 0; I < MAX_RAMBANK; I++) - { - m_RAMMap[I] = m_gb_dummy_ram_bank; - } - m_ROMBank00 = 0; - m_ROMBanks = 0; - m_RAMBanks = 0; - m_MBCType = MBC_NONE; - m_CartType = 0; - m_ROMMask = 0; - m_RAMMask = 0; -} - -DEVICE_IMAGE_LOAD_MEMBER(gb_state,gb_cart) -{ - gb_state *state = image.device().machine().driver_data(); - static const char *const CartTypes[] = - { - "ROM ONLY", - "ROM+MBC1", - "ROM+MBC1+RAM", - "ROM+MBC1+RAM+BATTERY", - "UNKNOWN", - "ROM+MBC2", - "ROM+MBC2+BATTERY", - "UNKNOWN", - "ROM+RAM", - "ROM+RAM+BATTERY", - "UNKNOWN", - "ROM+MMM01", - "ROM+MMM01+SRAM", - "ROM+MMM01+SRAM+BATTERY", - "UNKNOWN", - "ROM+MBC3+TIMER+BATTERY", - "ROM+MBC3+TIMER+RAM+BATTERY", - "ROM+MBC3", - "ROM+MBC3+RAM", - "ROM+MBC3+RAM+BATTERY", - "UNKNOWN", - "UNKNOWN", - "UNKNOWN", - "UNKNOWN", - "UNKNOWN", - "ROM+MBC5", - "ROM+MBC5+RAM", - "ROM+MBC5+RAM+BATTERY", - "ROM+MBC5+RUMBLE", - "ROM+MBC5+RUMBLE+SRAM", - "ROM+MBC5+RUMBLE+SRAM+BATTERY", - "Pocket Camera", - "Bandai TAMA5", - /* Need heaps of unknowns here */ - "Hudson HuC-3", - "Hudson HuC-1" - }; - -/*** Following are some known manufacturer codes *************************/ - static const struct - { - UINT16 Code; - const char *Name; - } - Companies[] = - { - {0x3301, "Nintendo"}, - {0x7901, "Accolade"}, - {0xA400, "Konami"}, - {0x6701, "Ocean"}, - {0x5601, "LJN"}, - {0x9900, "ARC?"}, - {0x0101, "Nintendo"}, - {0x0801, "Capcom"}, - {0x0100, "Nintendo"}, - {0xBB01, "SunSoft"}, - {0xA401, "Konami"}, - {0xAF01, "Namcot?"}, - {0x4901, "Irem"}, - {0x9C01, "Imagineer"}, - {0xA600, "Kawada?"}, - {0xB101, "Nexoft"}, - {0x5101, "Acclaim"}, - {0x6001, "Titus"}, - {0xB601, "HAL"}, - {0x3300, "Nintendo"}, - {0x0B00, "Coconuts?"}, - {0x5401, "Gametek"}, - {0x7F01, "Kemco?"}, - {0xC001, "Taito"}, - {0xEB01, "Atlus"}, - {0xE800, "Asmik?"}, - {0xDA00, "Tomy?"}, - {0xB100, "ASCII?"}, - {0xEB00, "Atlus"}, - {0xC000, "Taito"}, - {0x9C00, "Imagineer"}, - {0xC201, "Kemco?"}, - {0xD101, "Sofel?"}, - {0x6101, "Virgin"}, - {0xBB00, "SunSoft"}, - {0xCE01, "FCI?"}, - {0xB400, "Enix?"}, - {0xBD01, "Imagesoft"}, - {0x0A01, "Jaleco?"}, - {0xDF00, "Altron?"}, - {0xA700, "Takara?"}, - {0xEE00, "IGS?"}, - {0x8300, "Lozc?"}, - {0x5001, "Absolute?"}, - {0xDD00, "NCS?"}, - {0xE500, "Epoch?"}, - {0xCB00, "VAP?"}, - {0x8C00, "Vic Tokai"}, - {0xC200, "Kemco?"}, - {0xBF00, "Sammy?"}, - {0x1800, "Hudson Soft"}, - {0xCA01, "Palcom/Ultra"}, - {0xCA00, "Palcom/Ultra"}, - {0xC500, "Data East?"}, - {0xA900, "Technos Japan?"}, - {0xD900, "Banpresto?"}, - {0x7201, "Broderbund?"}, - {0x7A01, "Triffix Entertainment?"}, - {0xE100, "Towachiki?"}, - {0x9300, "Tsuburava?"}, - {0xC600, "Tonkin House?"}, - {0xCE00, "Pony Canyon"}, - {0x7001, "Infogrames?"}, - {0x8B01, "Bullet-Proof Software?"}, - {0x5501, "Park Place?"}, - {0xEA00, "King Records?"}, - {0x5D01, "Tradewest?"}, - {0x6F01, "ElectroBrain?"}, - {0xAA01, "Broderbund?"}, - {0xC301, "SquareSoft"}, - {0x5201, "Activision?"}, - {0x5A01, "Bitmap Brothers/Mindscape"}, - {0x5301, "American Sammy"}, - {0x4701, "Spectrum Holobyte"}, - {0x1801, "Hudson Soft"}, - {0x0000, NULL} - }; - - int Checksum, I, J, filesize, load_start = 0; - UINT16 reported_rom_banks; - UINT8 *gb_header; - static const int rambanks[8] = {0, 1, 1, 4, 16, 8, 0, 0}; - - if (image.software_entry() == NULL) - filesize = image.length(); - else - filesize = image.get_software_region_length("rom"); - - /* Check for presence of a header, and skip that header */ - J = filesize % 0x4000; - if (J == 512) - { - logerror("Rom-header found, skipping\n"); - load_start = 512; - filesize -= 512; - } - - /* Verify that the file contains 16kb blocks */ - if ((filesize == 0) || ((filesize % 0x4000) != 0)) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid rom file size"); - return IMAGE_INIT_FAIL; - } - - /* Claim memory */ - state->m_gb_cart = auto_alloc_array(image.device().machine(), UINT8, filesize); - state->m_MBCType = MBC_UNKNOWN; - state->m_CartType = 0; - - if (image.software_entry() == NULL) - { - /* Actually skip the header */ - image.fseek(load_start, SEEK_SET); - - /* Read cartridge */ - if (image.fread( state->m_gb_cart, filesize) != filesize) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file"); - return IMAGE_INIT_FAIL; - } - } - else - { - memcpy(state->m_gb_cart, image.get_software_region("rom") + load_start, filesize); - - const char *mapper = software_part_get_feature((software_part*)image.part_entry(), "mapper"); - const char *rumble = software_part_get_feature((software_part*)image.part_entry(), "rumble"); - const char *battery_backed = software_part_get_feature((software_part*)image.part_entry(), "battery_backed"); - - if ( mapper != NULL ) - { - static const struct { const char *mapper_name; int mapper_type; } mapper_types[] = - { - { "MBC1", MBC_MBC1 }, - { "MBC2", MBC_MBC2 }, - { "MMM01", MBC_MMM01 }, - { "MBC3", MBC_MBC3 }, - { "MBC4", MBC_MBC4 }, - { "MBC5", MBC_MBC5 }, - { "TAMA5", MBC_TAMA5 }, - { "HuC1", MBC_HUC1 }, - { "HuC3", MBC_HUC3 }, - { "MBC6", MBC_MBC6 }, - { "MBC7", MBC_MBC7 }, - { "WISDOM", MBC_WISDOM }, - { "MBC1_KOR", MBC_MBC1_KOR }, - { "YONGYONG", MBC_YONGYONG }, - { "LASAMA", MBC_LASAMA }, - { "ATVRACIN", MBC_ATVRACIN }, - { "unknown", MBC_UNKNOWN }, - }; - - for (int i = 0; i < ARRAY_LENGTH(mapper_types) && state->m_MBCType == MBC_UNKNOWN; i++) - { - if (!mame_stricmp(mapper, mapper_types[i].mapper_name)) - { - state->m_MBCType = mapper_types[i].mapper_type; - } - } - } - - if ( rumble != NULL ) - { - if ( !mame_stricmp(rumble, "yes")) - { - state->m_CartType |= RUMBLE; - } - } - - if ( battery_backed != NULL ) - { - if ( !mame_stricmp(battery_backed, "yes")) - { - state->m_CartType |= BATTERY; - } - } - } - - gb_header = state->m_gb_cart; - state->m_ROMBank00 = 0; - - /* Check for presence of MMM01 mapper */ - if (filesize >= 0x8000) - { - static const UINT8 nintendo_logo[0x18] = { - 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, - 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D, - 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E - }; - int bytes_matched = 0; - gb_header = state->m_gb_cart + filesize - 0x8000; - for (I = 0; I < 0x18; I++) - { - if (gb_header[0x0104 + I] == nintendo_logo[I]) - { - bytes_matched++; - } - } - - if (bytes_matched == 0x18 && gb_header[0x0147] >= 0x0B && gb_header[0x0147] <= 0x0D) - { - state->m_ROMBank00 = (filesize / 0x4000) - 2; - state->m_mmm01_bank_offset = state->m_ROMBank00; - } - else - { - gb_header = state->m_gb_cart; - } - } - - /* Fill in our cart details */ - switch(gb_header[0x0147]) - { - case 0x00: state->m_MBCType = MBC_NONE; state->m_CartType = 0; break; - case 0x01: state->m_MBCType = MBC_MBC1; state->m_CartType = 0; break; - case 0x02: state->m_MBCType = MBC_MBC1; state->m_CartType = CART_RAM; break; - case 0x03: state->m_MBCType = MBC_MBC1; state->m_CartType = CART_RAM | BATTERY; break; - case 0x05: state->m_MBCType = MBC_MBC2; state->m_CartType = 0; break; - case 0x06: state->m_MBCType = MBC_MBC2; state->m_CartType = BATTERY; break; - case 0x08: state->m_MBCType = MBC_NONE; state->m_CartType = CART_RAM; break; - case 0x09: state->m_MBCType = MBC_NONE; state->m_CartType = CART_RAM | BATTERY; break; - case 0x0B: state->m_MBCType = MBC_MMM01; state->m_CartType = 0; break; - case 0x0C: state->m_MBCType = MBC_MMM01; state->m_CartType = CART_RAM; break; - case 0x0D: state->m_MBCType = MBC_MMM01; state->m_CartType = CART_RAM | BATTERY; break; - case 0x0F: state->m_MBCType = MBC_MBC3; state->m_CartType = TIMER | BATTERY; break; - case 0x10: state->m_MBCType = MBC_MBC3; state->m_CartType = TIMER | CART_RAM | BATTERY; break; - case 0x11: state->m_MBCType = MBC_MBC3; state->m_CartType = 0; break; - case 0x12: state->m_MBCType = MBC_MBC3; state->m_CartType = CART_RAM; break; - case 0x13: state->m_MBCType = MBC_MBC3; state->m_CartType = CART_RAM | BATTERY; break; - case 0x15: state->m_MBCType = MBC_MBC4; state->m_CartType = 0; break; - case 0x16: state->m_MBCType = MBC_MBC4; state->m_CartType = CART_RAM; break; - case 0x17: state->m_MBCType = MBC_MBC4; state->m_CartType = CART_RAM | BATTERY; break; - case 0x19: state->m_MBCType = MBC_MBC5; state->m_CartType = 0; break; - case 0x1A: state->m_MBCType = MBC_MBC5; state->m_CartType = CART_RAM; break; - case 0x1B: state->m_MBCType = MBC_MBC5; state->m_CartType = CART_RAM | BATTERY; break; - case 0x1C: state->m_MBCType = MBC_MBC5; state->m_CartType = RUMBLE; break; - case 0x1D: state->m_MBCType = MBC_MBC5; state->m_CartType = RUMBLE | SRAM; break; - case 0x1E: state->m_MBCType = MBC_MBC5; state->m_CartType = RUMBLE | SRAM | BATTERY; break; - case 0x20: state->m_MBCType = MBC_MBC6; state->m_CartType = SRAM; break; - case 0x22: state->m_MBCType = MBC_MBC7; state->m_CartType = SRAM | BATTERY; break; - case 0xBE: state->m_MBCType = MBC_NONE; state->m_CartType = 0; break; /* used in Flash2Advance GB Bridge boot program */ - case 0xEA: state->m_MBCType = MBC_YONGYONG; state->m_CartType = 0; break; /* Found in Sonic 3D Blast 5 pirate */ - case 0xFD: state->m_MBCType = MBC_TAMA5; state->m_CartType = 0 /*RTC | BATTERY?*/; break; - case 0xFE: state->m_MBCType = MBC_HUC3; state->m_CartType = 0; break; - case 0xFF: state->m_MBCType = MBC_HUC1; state->m_CartType = 0; break; - } - - /* Check whether we're dealing with a (possible) Wisdom Tree game here */ - if (gb_header[0x0147] == 0x00) - { - int count = 0; - for (I = 0x0134; I <= 0x014C; I++) - { - count += gb_header[I]; - } - if (count == 0) - { - state->m_MBCType = MBC_WISDOM; - } - } - - /* Check if we're dealing with a Korean variant of the MBC1 mapper */ - if (state->m_MBCType == MBC_MBC1) - { - if (gb_header[0x13F] == 0x42 && gb_header[0x140] == 0x32 && gb_header[0x141] == 0x43 && gb_header[0x142] == 0x4B) - { - state->m_MBCType = MBC_MBC1_KOR; - } - } - if (state->m_MBCType == MBC_UNKNOWN) - { - image.seterror(IMAGE_ERROR_UNSUPPORTED, "Unknown mapper type"); - return IMAGE_INIT_FAIL; - } - if (state->m_MBCType == MBC_MMM01) - { -// image.seterror(IMAGE_ERROR_UNSUPPORTED, "Mapper MMM01 is not supported yet"); -// return IMAGE_INIT_FAIL; - } - if (state->m_MBCType == MBC_MBC4) - { - image.seterror(IMAGE_ERROR_UNSUPPORTED, "Mapper MBC4 is not supported yet"); - return IMAGE_INIT_FAIL; - } - /* MBC7 support is still work-in-progress, so only enable it for debug builds */ -#ifndef MAME_DEBUG - if (state->m_MBCType == MBC_MBC7) - { - image.seterror(IMAGE_ERROR_UNSUPPORTED, "Mapper MBC7 is not supported yet"); - return IMAGE_INIT_FAIL; - } -#endif - - state->m_ROMBanks = filesize / 0x4000; - switch (gb_header[0x0148]) - { - case 0x52: - reported_rom_banks = 72; - break; - case 0x53: - reported_rom_banks = 80; - break; - case 0x54: - reported_rom_banks = 96; - break; - case 0x00: case 0x01: case 0x02: case 0x03: - case 0x04: case 0x05: case 0x06: case 0x07: - reported_rom_banks = 2 << gb_header[0x0148]; - break; - default: - logerror("Warning loading cartridge: Unknown ROM size in header.\n"); - reported_rom_banks = 256; - break; - } - if (state->m_ROMBanks != reported_rom_banks && state->m_MBCType != MBC_WISDOM) - { - logerror("Warning loading cartridge: Filesize and reported ROM banks don't match.\n"); - } - - state->m_RAMBanks = rambanks[gb_header[0x0149] & 7]; - - /* Calculate and check checksum */ - Checksum = ((UINT16) gb_header[0x014E] << 8) + gb_header[0x014F]; - Checksum += gb_header[0x014E] + gb_header[0x014F]; - for (I = 0; I < filesize; I++) - { - Checksum -= state->m_gb_cart[I]; - } - if (Checksum & 0xFFFF) - { - logerror("Warning loading cartridge: Checksum is wrong."); - } - - /* Initialize ROMMap pointers */ - for (I = 0; I < state->m_ROMBanks; I++) - { - state->m_ROMMap[I] = state->m_gb_cart + (I * 0x4000); - } - - /* - Handle odd-sized cartridges (72,80,96 banks) - ROMBanks ROMMask - 72 (1001000) 1000111 (71) - 80 (1010000) 1001111 (79) - 96 (1100000) 1011111 (95) - */ - state->m_ROMMask = I - 1; - if ((state->m_ROMBanks & state->m_ROMMask) != 0) - { - for( ; I & state->m_ROMBanks; I++) - { - state->m_ROMMap[I] = state->m_ROMMap[I & state->m_ROMMask]; - } - state->m_ROMMask = I - 1; - } - - /* Fill out the remaining rom bank pointers, if any. */ - for ( ; I < MAX_ROMBANK; I++) - { - state->m_ROMMap[I] = state->m_ROMMap[I & state->m_ROMMask]; - } - - /* Log cart information */ - { - const char *P; - char S[50]; - static const int ramsize[8] = { 0, 2, 8, 32, 128, 64, 0, 0 }; - - - strncpy (S, (char *)&gb_header[0x0134], 16); - S[16] = '\0'; - logerror("Cart Information\n"); - logerror("\tName: %s\n", S); - logerror("\tType: %s [0x%2X]\n", (gb_header[0x0147] <= 32) ? CartTypes[gb_header[0x0147]] : "", gb_header[0x0147] ); - logerror("\tGame Boy: %s\n", (gb_header[0x0143] == 0xc0) ? "No" : "Yes" ); - logerror("\tSuper GB: %s [0x%2X]\n", (gb_header[0x0146] == 0x03) ? "Yes" : "No", gb_header[0x0146] ); - logerror("\tColor GB: %s [0x%2X]\n", (gb_header[0x0143] == 0x80 || gb_header[0x0143] == 0xc0) ? "Yes" : "No", state->m_gb_cart[0x0143] ); - logerror("\tROM Size: %d 16kB Banks [0x%2X]\n", state->m_ROMBanks, gb_header[0x0148]); - logerror("\tRAM Size: %d kB [0x%2X]\n", ramsize[ gb_header[0x0149] & 0x07 ], gb_header[0x0149]); - logerror("\tLicense code: 0x%2X%2X\n", gb_header[0x0145], gb_header[0x0144] ); - J = ((UINT16) gb_header[0x014B] << 8) + gb_header[0x014A]; - for (I = 0, P = NULL; !P && Companies[I].Name; I++) - if (J == Companies[I].Code) - P = Companies[I].Name; - logerror("\tManufacturer ID: 0x%2X", J); - logerror(" [%s]\n", P ? P : "?"); - logerror("\tVersion Number: 0x%2X\n", gb_header[0x014C]); - logerror("\tComplement Check: 0x%2X\n", gb_header[0x014D]); - logerror("\tChecksum: 0x%2X\n", ( ( gb_header[0x014E] << 8 ) + gb_header[0x014F] ) ); - J = ((UINT16) gb_header[0x0103] << 8) + gb_header[0x0102]; - logerror("\tStart Address: 0x%2X\n", J); - } - - /* MBC2 has 512 * 4bits (8kb) internal RAM */ - if(state->m_MBCType == MBC_MBC2) - state->m_RAMBanks = 1; - /* MBC7 has 512 bytes(?) of internal RAM */ - if (state->m_MBCType == MBC_MBC7) - { - state->m_RAMBanks = 1; - } - - if (state->m_RAMBanks && state->m_MBCType) - { - /* Claim memory */ - state->m_gb_cart_ram = auto_alloc_array(image.device().machine(), UINT8, state->m_RAMBanks * 0x2000); - memset(state->m_gb_cart_ram, 0xFF, state->m_RAMBank * 0x2000); - - for (I = 0; I < state->m_RAMBanks; I++) - { - state->m_RAMMap[I] = state->m_gb_cart_ram + (I * 0x2000); - } - - /* Set up rest of the (mirrored) RAM pages */ - state->m_RAMMask = I - 1; - for ( ; I < MAX_RAMBANK; I++) - { - state->m_RAMMap[I] = state->m_RAMMap[I & state->m_RAMMask]; - } - } - else - { - state->m_RAMMask = 0; - } - - /* If there's an RTC claim memory to store the RTC contents */ - if (state->m_CartType & TIMER) - { - state->m_MBC3RTCData = auto_alloc_array(image.device().machine(), UINT8, 0x2000); - } - - if (state->m_MBCType == MBC_TAMA5) - { - state->m_MBC3RTCData = auto_alloc_array(image.device().machine(), UINT8, 0x2000); - memset(state->m_gbTama5Memory, 0xff, sizeof(state->m_gbTama5Memory)); - } - - /* Load the saved RAM if this cart has a battery */ - if (state->m_CartType & BATTERY && state->m_RAMBanks) - { - image.battery_load(state->m_gb_cart_ram, state->m_RAMBanks * 0x2000, 0x00); - } - - return IMAGE_INIT_PASS; -} INTERRUPT_GEN_MEMBER(gb_state::gb_scanline_interrupt) { @@ -2097,18 +997,18 @@ WRITE8_MEMBER(gb_state::gbc_io2_w) switch( offset ) { case 0x0D: /* KEY1 - Prepare speed switch */ - machine().device(":maincpu")->set_speed( data ); + machine().device(":maincpu")->set_speed(data); return; case 0x10: /* BFF - Bios disable */ - gb_rom16_0000( m_ROMMap[m_ROMBank00] ); + m_bios_disable = TRUE; return; case 0x16: /* RP - Infrared port */ break; case 0x30: /* SVBK - RAM bank select */ m_GBC_RAMBank = data & 0x7; - if ( ! m_GBC_RAMBank ) + if (!m_GBC_RAMBank) m_GBC_RAMBank = 1; - m_bank3->set_base(m_GBC_RAMMap[m_GBC_RAMBank]); + m_rambank->set_base(m_GBC_RAMMap[m_GBC_RAMBank]); break; default: break; @@ -2138,7 +1038,7 @@ READ8_MEMBER(gb_state::gbc_io2_r) ****************************************************************************/ -MACHINE_START_MEMBER(gb_state,megaduck) +MACHINE_START_MEMBER(megaduck_state,megaduck) { /* Allocate the serial timer, and disable it */ m_gb_serial_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gb_state::gb_serial_timer_proc),this)); @@ -2147,10 +1047,12 @@ MACHINE_START_MEMBER(gb_state,megaduck) MACHINE_START_CALL_MEMBER( gb_video ); } -MACHINE_RESET_MEMBER(gb_state,megaduck) +MACHINE_RESET_MEMBER(megaduck_state,megaduck) { /* We may have to add some more stuff here, if not then it can be merged back into gb */ gb_init(); + + m_bios_disable = TRUE; gb_video_reset( GB_VIDEO_DMG ); } @@ -2191,7 +1093,7 @@ MACHINE_RESET_MEMBER(gb_state,megaduck) **************/ -READ8_MEMBER(gb_state::megaduck_video_r) +READ8_MEMBER(megaduck_state::megaduck_video_r) { UINT8 data; @@ -2205,7 +1107,7 @@ READ8_MEMBER(gb_state::megaduck_video_r) return BITSWAP8(data,7,0,5,4,6,3,2,1); } -WRITE8_MEMBER(gb_state::megaduck_video_w) +WRITE8_MEMBER(megaduck_state::megaduck_video_w) { if ( !offset ) { @@ -2222,17 +1124,17 @@ WRITE8_MEMBER(gb_state::megaduck_video_w) static const UINT8 megaduck_sound_offsets[16] = { 0, 2, 1, 3, 4, 6, 5, 7, 8, 9, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; -WRITE8_MEMBER(gb_state::megaduck_sound_w1) +WRITE8_MEMBER(megaduck_state::megaduck_sound_w1) { gb_sound_w(machine().device("custom"), space, megaduck_sound_offsets[offset], data ); } -READ8_MEMBER(gb_state::megaduck_sound_r1) +READ8_MEMBER(megaduck_state::megaduck_sound_r1) { return gb_sound_r( machine().device("custom"), space, megaduck_sound_offsets[offset] ); } -WRITE8_MEMBER(gb_state::megaduck_sound_w2) +WRITE8_MEMBER(megaduck_state::megaduck_sound_w2) { switch(offset) { @@ -2256,98 +1158,8 @@ WRITE8_MEMBER(gb_state::megaduck_sound_w2) } } -READ8_MEMBER(gb_state::megaduck_sound_r2) +READ8_MEMBER(megaduck_state::megaduck_sound_r2) { return gb_sound_r(machine().device("custom"), space, 0x10 + megaduck_sound_offsets[offset]); } -WRITE8_MEMBER(gb_state::megaduck_rom_bank_select_type1) -{ - if( m_ROMMask ) - { - m_ROMBank = data & m_ROMMask; - - /* Switch banks */ - m_bank1->set_base(m_ROMMap[m_ROMBank]); - } -} - -WRITE8_MEMBER(gb_state::megaduck_rom_bank_select_type2) -{ - if( m_ROMMask ) - { - m_ROMBank = (data << 1) & m_ROMMask; - - /* Switch banks */ - m_bank10->set_base( m_ROMMap[m_ROMBank]); - m_bank1->set_base( m_ROMMap[m_ROMBank + 1]); - } -} - -DEVICE_IMAGE_LOAD_MEMBER(gb_state,megaduck_cart) -{ - gb_state *state = image.device().machine().driver_data(); - int I; - UINT32 filesize; - - for (I = 0; I < MAX_ROMBANK; I++) - state->m_ROMMap[I] = NULL; - for (I = 0; I < MAX_RAMBANK; I++) - state->m_RAMMap[I] = NULL; - - if (image.software_entry() == NULL) - filesize = image.length(); - else - filesize = image.get_software_region_length("rom"); - - if ((filesize == 0) || ((filesize % 0x4000) != 0)) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid rom file size"); - return IMAGE_INIT_FAIL; - } - - state->m_ROMBanks = filesize / 0x4000; - - /* Claim memory */ - state->m_gb_cart = auto_alloc_array(image.device().machine(), UINT8, filesize); - - /* Read cartridge */ - if (image.software_entry() == NULL) - { - if (image.fread( state->m_gb_cart, filesize) != filesize) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unable to fully read from file"); - return IMAGE_INIT_FAIL; - } - } - else - { - memcpy(state->m_gb_cart, image.get_software_region("rom"), filesize); - } - - /* Log cart information */ - { - logerror("Cart Information\n"); - logerror("\tRom Banks: %d\n", state->m_ROMBanks); - } - - for (I = 0; I < state->m_ROMBanks; I++) - { - state->m_ROMMap[I] = state->m_gb_cart + (I * 0x4000); - } - - /* Build rom bank Mask */ - if (state->m_ROMBanks < 3) - state->m_ROMMask = 0; - else - { - for (I = 1; I < state->m_ROMBanks; I <<= 1) - { - } - state->m_ROMMask = I - 1; - } - - state->m_MBCType = MBC_MEGADUCK; - - return IMAGE_INIT_PASS; -} diff --git a/src/mess/machine/gb_mbc.c b/src/mess/machine/gb_mbc.c new file mode 100644 index 00000000000..1ffd2808774 --- /dev/null +++ b/src/mess/machine/gb_mbc.c @@ -0,0 +1,692 @@ +/*********************************************************************************************************** + + Game Boy carts with MBC (Memory Bank Controller) + + + TODO: add proper RTC and Rumble support + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "machine/gb_mbc.h" + + +//------------------------------------------------- +// gb_rom_mbc*_device - constructor +//------------------------------------------------- + +const device_type GB_ROM_MBC1 = &device_creator; +const device_type GB_ROM_MBC1K = &device_creator; +const device_type GB_ROM_MBC2 = &device_creator; +const device_type GB_ROM_MBC3 = &device_creator; +const device_type GB_ROM_MBC5 = &device_creator; +const device_type GB_ROM_MBC6 = &device_creator; +const device_type GB_ROM_MBC7 = &device_creator; +const device_type GB_ROM_MMM01 = &device_creator; + + +gb_rom_mbc_device::gb_rom_mbc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, type, name, tag, owner, clock), + device_gb_cart_interface( mconfig, *this ) +{ +} + +gb_rom_mbc1_device::gb_rom_mbc1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_mbc_device(mconfig, GB_ROM_MBC1, "GB MBC1 Carts", tag, owner, clock) +{ +} + +gb_rom_mbc1k_device::gb_rom_mbc1k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_mbc_device(mconfig, GB_ROM_MBC1K, "GB MBC1 Korean Carts", tag, owner, clock) +{ +} + +gb_rom_mbc2_device::gb_rom_mbc2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_mbc_device(mconfig, GB_ROM_MBC2, "GB MBC2 Carts", tag, owner, clock) +{ +} + +gb_rom_mbc3_device::gb_rom_mbc3_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_mbc_device(mconfig, GB_ROM_MBC3, "GB MBC3 Carts", tag, owner, clock) +{ +} + +gb_rom_mbc5_device::gb_rom_mbc5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_mbc_device(mconfig, GB_ROM_MBC5, "GB MBC5 Carts", tag, owner, clock) +{ +} + +gb_rom_mbc6_device::gb_rom_mbc6_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_mbc_device(mconfig, GB_ROM_MBC6, "GB MBC6 Carts", tag, owner, clock) +{ +} + +gb_rom_mbc7_device::gb_rom_mbc7_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_mbc_device(mconfig, GB_ROM_MBC7, "GB MBC7 Carts", tag, owner, clock) +{ +} + +gb_rom_mmm01_device::gb_rom_mmm01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_mbc_device(mconfig, GB_ROM_MMM01, "GB MMM01 Carts", tag, owner, clock) +{ +} + + +void gb_rom_mbc_device::device_start() +{ + has_timer = FALSE; + has_rumble = FALSE; + + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_enable = 0; + m_ram_bank = 0; + m_mode = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_ram_enable)); + save_item(NAME(m_mode)); +} + +void gb_rom_mbc1_device::device_start() +{ + has_timer = FALSE; + has_rumble = FALSE; + + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + m_ram_enable = 0; + m_mode = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_ram_enable)); + save_item(NAME(m_mode)); +} + +void gb_rom_mbc1k_device::device_start() +{ + has_timer = FALSE; + has_rumble = FALSE; + + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + m_ram_enable = 0; + m_mode = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_ram_enable)); + save_item(NAME(m_mode)); +} + +void gb_rom_mbc2_device::device_start() +{ + has_timer = FALSE; + has_rumble = FALSE; + + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + m_ram_enable = 0; + m_mode = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_ram_enable)); + save_item(NAME(m_mode)); +} + +void gb_rom_mbc3_device::device_start() +{ + has_timer = FALSE; + has_rumble = FALSE; + + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + m_ram_enable = 0; + m_mode = 0; + memset(m_rtc_map, 0, sizeof(m_rtc_map)); + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_ram_enable)); + save_item(NAME(m_mode)); + save_item(NAME(m_rtc_map)); +} + +void gb_rom_mbc5_device::device_start() +{ + has_timer = FALSE; + has_rumble = FALSE; + + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + m_ram_enable = 0; + m_mode = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_ram_enable)); + save_item(NAME(m_mode)); +} + +void gb_rom_mbc6_device::device_start() +{ + has_timer = FALSE; + has_rumble = FALSE; + + m_bank_4000 = 2; // correct default? + m_bank_6000 = 3; // correct default? + m_latch1 = 0; // correct default? + m_latch2 = 0; // correct default? + + m_latch_bank = 2; // correct default? + m_latch_bank2 = 3; // correct default? + m_ram_bank = 0; + m_ram_enable = 0; + m_mode = 0; + + save_item(NAME(m_bank_4000)); + save_item(NAME(m_bank_6000)); + save_item(NAME(m_latch1)); + save_item(NAME(m_latch2)); + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_ram_enable)); + save_item(NAME(m_mode)); +} + +void gb_rom_mbc7_device::device_start() +{ + has_timer = FALSE; + has_rumble = TRUE; + + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + m_ram_enable = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_ram_enable)); +} + +void gb_rom_mmm01_device::device_start() +{ + has_timer = FALSE; + has_rumble = TRUE; + + m_latch_bank = 0x200 - 2; + m_latch_bank2 = 0x200 - 1; + m_ram_bank = 0; + m_bank_mask = 0xff; + m_bank = 0; + m_reg = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); + save_item(NAME(m_bank_mask)); + save_item(NAME(m_bank)); + save_item(NAME(m_reg)); +} + + +/*------------------------------------------------- + mapper specific handlers + -------------------------------------------------*/ + +READ8_MEMBER(gb_rom_mbc_device::read_rom) +{ + return m_rom[rom_bank_map[m_latch_bank] + offset]; +} + +READ8_MEMBER(gb_rom_mbc_device::read_ram) +{ + if (m_ram) + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset]; + else + return 0xff; +} + +WRITE8_MEMBER(gb_rom_mbc_device::write_ram) +{ + if (m_ram) + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset] = data; +} + + +// MBC1 + + +READ8_MEMBER(gb_rom_mbc1_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_mbc1_device::write_bank) +{ + if (offset < 0x2000) + m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0; + else if (offset < 0x4000) + { + // 5bits only + data &= 0x1f; + // bank = 0 => bank = 1 + if (data == 0) + data = 1; + + m_latch_bank2 = (m_latch_bank2 & 0x01e0) | data; + } + else if (offset < 0x6000) + { + // 2bits only + data &= 0x3; + m_latch_bank2 = (m_latch_bank2 & 0x001f) | (data << 5); + } + else + m_mode = data & 0x1; +} + +READ8_MEMBER(gb_rom_mbc1_device::read_ram) +{ + if (m_ram && m_ram_enable) + { + m_ram_bank = m_mode ? (m_latch_bank2 >> 5) : 0; + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset]; + } + else + return 0xff; +} + +WRITE8_MEMBER(gb_rom_mbc1_device::write_ram) +{ + if (m_ram && m_ram_enable) + { + m_ram_bank = m_mode ? (m_latch_bank2 >> 5) : 0; + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset] = data; + } +} + + +// MBC1 Korean variant (used by Bomberman Selection) + +READ8_MEMBER(gb_rom_mbc1k_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_mbc1k_device::write_bank) +{ + if (offset < 0x2000) + m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0; + else if (offset < 0x4000) + { + // 4bits only? + data &= 0x0f; + // bank = 0 => bank = 1 + if (data == 0) + data = 1; + + m_latch_bank2 = (m_latch_bank2 & 0x01f0) | data; + } + else if (offset < 0x6000) + { + // 2bits only + data &= 0x3; + m_latch_bank2 = (m_latch_bank2 & 0x000f) | (data << 4); + m_latch_bank = m_latch_bank2 & 0x30; + } + else + m_mode = data & 0x1; +} + +// RAM access is the same as usual MBC1 +READ8_MEMBER(gb_rom_mbc1k_device::read_ram) +{ + if (m_ram && m_ram_enable) + { + m_ram_bank = m_mode ? (m_latch_bank2 >> 5) : 0; + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset]; + } + else + return 0xff; +} + +WRITE8_MEMBER(gb_rom_mbc1k_device::write_ram) +{ + if (m_ram && m_ram_enable) + { + m_ram_bank = m_mode ? (m_latch_bank2 >> 5) : 0; + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset] = data; + } +} + +// MBC2 + +READ8_MEMBER(gb_rom_mbc2_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_mbc2_device::write_bank) +{ + if (offset < 0x2000) + m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0; + else if (offset < 0x4000) + { + // 4bits only + data &= 0x0f; + // bank = 0 => bank = 1 + if (data == 0) + data = 1; + + // The least significant bit of the upper address byte must be 1 + if (offset & 0x0100) + m_latch_bank2 = (m_latch_bank2 & 0x100) | data; + } +} + +// 1 bank only?? +READ8_MEMBER(gb_rom_mbc2_device::read_ram) +{ + if (m_ram && m_ram_enable) + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)]; + else + return 0xff; +} + +WRITE8_MEMBER(gb_rom_mbc2_device::write_ram) +{ + if (m_ram && m_ram_enable) + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data; +} + + +// MBC3 + +READ8_MEMBER(gb_rom_mbc3_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_mbc3_device::write_bank) +{ + if (offset < 0x2000) + m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0; + else if (offset < 0x4000) + { + // 7bits + data &= 0x7f; + /* Selecting bank 0 == selecting bank 1 */ + if (data == 0) + data = 1; + + m_latch_bank2 = data; + } + else if (offset < 0x6000) + { + m_ram_bank = data; + } + else + { + if (has_timer) + { + /* FIXME: RTC Latch goes here */ + m_rtc_map[0] = 50; /* Seconds */ + m_rtc_map[1] = 40; /* Minutes */ + m_rtc_map[2] = 15; /* Hours */ + m_rtc_map[3] = 25; /* Day counter lowest 8 bits */ + m_rtc_map[4] = 0x01; /* Day counter upper bit, timer off, no day overflow occurred (bit7) */ + } + } +} + +READ8_MEMBER(gb_rom_mbc3_device::read_ram) +{ + if (m_ram_bank < 4 && m_ram_enable) + { // RAM + if (m_ram) + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)]; + } + if (m_ram_bank >= 0x8 && m_ram_bank <= 0xc) + { // RAM + if (has_timer) + return m_rtc_map[m_ram_bank - 8]; + } + return 0xff; +} + +WRITE8_MEMBER(gb_rom_mbc3_device::write_ram) +{ + if (m_ram_bank < 4 && m_ram_enable) + { // RAM + if (m_ram) + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data; + } + if (m_ram_bank >= 0x8 && m_ram_bank <= 0xc) + { // RAM + if (has_timer) + { + // what to do here? + } + } +} + +// MBC5 + +READ8_MEMBER(gb_rom_mbc5_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_mbc5_device::write_bank) +{ + if (offset < 0x2000) + m_ram_enable = ((data & 0x0f) == 0x0a) ? 1 : 0; + else if (offset < 0x4000) + { + // MBC5 has a 9 bit bank select + // Writing into 2000-2fff sets the lower 8 bits + // Writing into 3000-3fff sets the 9th bit + if (offset & 0x1000) + m_latch_bank2 = (m_latch_bank2 & 0xff) | ((data & 0x01) << 8); + else + m_latch_bank2 = (m_latch_bank2 & 0x100) | data; + } + else if (offset < 0x6000) + { + data &= 0x0f; + if (has_rumble) + data &= 0x7; + m_ram_bank = data; + } +} + +READ8_MEMBER(gb_rom_mbc5_device::read_ram) +{ + if (m_ram && m_ram_enable) + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)]; + else + return 0xff; +} + +WRITE8_MEMBER(gb_rom_mbc5_device::write_ram) +{ + if (m_ram && m_ram_enable) + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data; +} + +// MBC6 + +READ8_MEMBER(gb_rom_mbc6_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else if (offset < 0x6000) + return m_rom[rom_bank_map[m_bank_4000 >> 1] * 0x4000 + (m_bank_4000 & 0x01) * 0x2000 + (offset & 0x1fff)]; + else + return m_rom[rom_bank_map[m_bank_6000 >> 1] * 0x4000 + (m_bank_6000 & 0x01) * 0x2000 + (offset & 0x1fff)]; +} + +WRITE8_MEMBER(gb_rom_mbc6_device::write_bank) +{ + if (offset < 0x2000) + { + logerror( "0x%04X: write to mbc6 ram enable area: %04X <- 0x%02X\n", space.device().safe_pc(), offset, data ); + } + else if (offset < 0x3000) + { + if (!(offset & 0x0800)) + m_latch1 = data; + else if (data == 0x00) + m_bank_4000 = m_latch1; + } + else if (offset < 0x4000) + { + if (!(offset & 0x0800)) + m_latch2 = data; + else if (data == 0x00) + m_bank_6000 = m_latch2; + } +} + +READ8_MEMBER(gb_rom_mbc6_device::read_ram) +{ + if (m_ram) + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)]; + else + return 0xff; +} + +WRITE8_MEMBER(gb_rom_mbc6_device::write_ram) +{ + if (m_ram) + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data; +} + +// MBC7 + +READ8_MEMBER(gb_rom_mbc7_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_mbc7_device::write_bank) +{ + if (offset < 0x2000) + { + // FIXME: Add RAM enable support + logerror("0x%04X: Write to ram enable register 0x%04X <- 0x%02X\n", space.device().safe_pc( ), offset, data); + } + else if (offset < 0x3000) + { + logerror( "0x%04X: write to mbc7 rom select register: 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), 0x2000 + offset, data ); + /* Bit 12 must be set for writing to the mbc register */ + if (offset & 0x0100) + m_latch_bank2 = data; + } + else + { + logerror( "0x%04X: write to mbc7 rom area: 0x%04X <- 0x%02X\n", space.device() .safe_pc( ), 0x3000 + offset, data ); + /* Bit 12 must be set for writing to the mbc register */ + if (offset & 0x0100) + { + switch (offset & 0x7000) + { + case 0x3000: /* 0x3000-0x3fff */ + case 0x4000: /* 0x4000-0x4fff */ + case 0x5000: /* 0x5000-0x5fff */ + case 0x6000: /* 0x6000-0x6fff */ + case 0x7000: /* 0x7000-0x7fff */ + break; + } + } + } +} + +READ8_MEMBER(gb_rom_mbc7_device::read_ram) +{ + if (m_ram) + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)]; + else + return 0xff; +} + +WRITE8_MEMBER(gb_rom_mbc7_device::write_ram) +{ + if (m_ram) + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + (offset & 0x1fff)] = data; +} + + +// MMM01 +// This mmm01 implementation is mostly guess work, no clue how correct it all is + +READ8_MEMBER(gb_rom_mmm01_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + offset]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_mmm01_device::write_bank) +{ + if (offset < 0x2000) + { + if (data & 0x40) + { + m_latch_bank = m_reg; + m_latch_bank2 = m_latch_bank + m_bank; + } + } + else if (offset < 0x4000) + { + m_reg = data & ((m_rom_size / 0x4000) - 1); + m_bank = m_reg & m_bank_mask; + if (m_bank == 0) + m_bank = 1; + m_latch_bank2 = m_latch_bank + m_bank; + } + else if (offset < 0x6000) + logerror("0x%04X: write 0x%02X to 0x%04X\n", space.device().safe_pc(), data, offset); + else + { + logerror( "0x%04X: write 0x%02X to 0x%04X\n", space.device().safe_pc(), data, offset); + /* Not sure if this is correct, Taito Variety Pack sets these values */ + /* Momotarou Collection 2 writes 01 and 21 here */ + switch (data) + { + case 0x30: m_bank_mask = 0x07; break; + case 0x38: m_bank_mask = 0x03; break; + default: m_bank_mask = 0xff; break; + } + } +} + diff --git a/src/mess/machine/gb_mbc.h b/src/mess/machine/gb_mbc.h new file mode 100644 index 00000000000..faa5b5640d4 --- /dev/null +++ b/src/mess/machine/gb_mbc.h @@ -0,0 +1,187 @@ +#ifndef __GB_MBC_H +#define __GB_MBC_H + +#include "machine/gb_slot.h" + + +// ======================> gb_rom_mbc_device + +class gb_rom_mbc_device : public device_t, + public device_gb_cart_interface +{ +public: + // construction/destruction + gb_rom_mbc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mbc_base"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); + + UINT8 m_ram_enable; + UINT8 m_mode; +}; + +// ======================> gb_rom_mbc1_device + +class gb_rom_mbc1_device : public gb_rom_mbc_device +{ +public: + // construction/destruction + gb_rom_mbc1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mbc1"; } + + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); +}; + +// ======================> gb_rom_mbc1k_device + +class gb_rom_mbc1k_device : public gb_rom_mbc_device +{ +public: + // construction/destruction + gb_rom_mbc1k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mbc1k"; } + + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); +}; + +// ======================> gb_rom_mbc2_device + +class gb_rom_mbc2_device : public gb_rom_mbc_device +{ +public: + // construction/destruction + gb_rom_mbc2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mbc2"; } + + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); +}; + +// ======================> gb_rom_mbc3_device + +class gb_rom_mbc3_device : public gb_rom_mbc_device +{ +public: + // construction/destruction + gb_rom_mbc3_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mbc3"; } + + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); + UINT8 m_rtc_map[5]; +}; + +// ======================> gb_rom_mbc5_device + +class gb_rom_mbc5_device : public gb_rom_mbc_device +{ +public: + // construction/destruction + gb_rom_mbc5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mbc5"; } + + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); +}; + +// ======================> gb_rom_mbc6_device + +class gb_rom_mbc6_device : public gb_rom_mbc_device +{ +public: + // construction/destruction + gb_rom_mbc6_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mbc6"; } + + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); + UINT16 m_latch1, m_latch2; + UINT8 m_bank_4000, m_bank_6000; +}; + +// ======================> gb_rom_mbc7_device + +class gb_rom_mbc7_device : public gb_rom_mbc_device +{ +public: + // construction/destruction + gb_rom_mbc7_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mbc7"; } + + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); +}; + +// ======================> gb_rom_mmm01_device +class gb_rom_mmm01_device : public gb_rom_mbc_device +{ +public: + // construction/destruction + gb_rom_mmm01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_mmm01"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + UINT8 m_bank_mask, m_bank, m_reg; +}; + + +// device type definition +extern const device_type GB_ROM_MBC1; +extern const device_type GB_ROM_MBC1K; +extern const device_type GB_ROM_MBC2; +extern const device_type GB_ROM_MBC3; +extern const device_type GB_ROM_MBC4; +extern const device_type GB_ROM_MBC5; +extern const device_type GB_ROM_MBC6; +extern const device_type GB_ROM_MBC7; +extern const device_type GB_ROM_MMM01; + +#endif diff --git a/src/mess/machine/gb_rom.c b/src/mess/machine/gb_rom.c new file mode 100644 index 00000000000..1f6de921f7e --- /dev/null +++ b/src/mess/machine/gb_rom.c @@ -0,0 +1,369 @@ +/*********************************************************************************************************** + + Game Boy cart emulation + + + Here we emulate carts with no RAM and simple bankswitch + + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "machine/gb_rom.h" + + +//------------------------------------------------- +// gb_rom_device - constructor +//------------------------------------------------- + +const device_type GB_STD_ROM = &device_creator; +const device_type GB_ROM_TAMA5 = &device_creator; +const device_type GB_ROM_WISDOM = &device_creator; +const device_type GB_ROM_YONG = &device_creator; +const device_type GB_ROM_ATVRAC = &device_creator; +const device_type GB_ROM_LASAMA = &device_creator; + +const device_type MEGADUCK_ROM = &device_creator; + + +gb_rom_device::gb_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, type, name, tag, owner, clock), + device_gb_cart_interface( mconfig, *this ) +{ +} + +gb_rom_device::gb_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, GB_STD_ROM, "GB Carts", tag, owner, clock), + device_gb_cart_interface( mconfig, *this ) +{ +} + +gb_rom_tama5_device::gb_rom_tama5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_device(mconfig, GB_ROM_TAMA5, "GB Tamagotchi", tag, owner, clock) +{ +} + +gb_rom_wisdom_device::gb_rom_wisdom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_device(mconfig, GB_ROM_WISDOM, "GB Wisdom Tree Carts", tag, owner, clock) +{ +} + +gb_rom_yong_device::gb_rom_yong_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_device(mconfig, GB_ROM_YONG, "GB Yong Yong Carts", tag, owner, clock) +{ +} + +gb_rom_atvrac_device::gb_rom_atvrac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_device(mconfig, GB_ROM_ATVRAC, "GB ATV Racin'", tag, owner, clock) +{ +} + +gb_rom_lasama_device::gb_rom_lasama_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : gb_rom_device(mconfig, GB_ROM_LASAMA, "GB LaSaMa", tag, owner, clock) +{ +} + + +megaduck_rom_device::megaduck_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, type, name, tag, owner, clock), + device_gb_cart_interface( mconfig, *this ) +{ +} + +megaduck_rom_device::megaduck_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MEGADUCK_ROM, "MegaDuck Carts", tag, owner, clock), + device_gb_cart_interface( mconfig, *this ) +{ +} + + +void gb_rom_device::device_start() +{ + // these actually never change for base carts, so no need to save them + m_latch_bank = 0; + m_ram_bank = 0; +} + +void megaduck_rom_device::device_start() +{ + m_latch_bank = 0; + m_latch_bank2 = 1; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); +} + +void gb_rom_tama5_device::device_start() +{ + m_tama5_data = 0; + m_tama5_addr= 0; + m_tama5_cmd = 0; + memset(m_regs, 0xff, sizeof(m_regs)); + m_rtc_reg = 0xff; + m_ram_bank = 0; + save_item(NAME(m_tama5_data)); + save_item(NAME(m_tama5_addr)); + save_item(NAME(m_tama5_cmd)); + save_item(NAME(m_regs)); + save_item(NAME(m_rtc_reg)); + save_item(NAME(m_ram_bank)); +} + +void gb_rom_wisdom_device::device_start() +{ + m_latch_bank = 0; + m_ram_bank = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_ram_bank)); +} + +void gb_rom_yong_device::device_start() +{ + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); +} + +void gb_rom_atvrac_device::device_start() +{ + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); +} + +void gb_rom_lasama_device::device_start() +{ + m_latch_bank = 0; + m_latch_bank2 = 1; + m_ram_bank = 0; + save_item(NAME(m_latch_bank)); + save_item(NAME(m_latch_bank2)); + save_item(NAME(m_ram_bank)); +} + +/*------------------------------------------------- + mapper specific handlers + -------------------------------------------------*/ + +READ8_MEMBER(gb_rom_device::read_rom) +{ + m_latch_bank = offset / 0x4000; + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; +} + +READ8_MEMBER(gb_rom_device::read_ram) +{ + if (m_ram) + return m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset]; + else + return 0xff; +} + +WRITE8_MEMBER(gb_rom_device::write_ram) +{ + if (m_ram) + m_ram[ram_bank_map[m_ram_bank] * 0x2000 + offset] = data; +} + + +// Tamagotchi + +READ8_MEMBER(gb_rom_tama5_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +READ8_MEMBER(gb_rom_tama5_device::read_ram) +{ + return m_rtc_reg; +} + +WRITE8_MEMBER(gb_rom_tama5_device::write_ram) +{ + switch (offset & 0x0001) + { + case 0x0000: /* Write to data register */ + switch (m_tama5_cmd) + { + case 0x00: /* Bits 0-3 for rom bank selection */ + m_latch_bank2 = (m_latch_bank2 & 0xf0) | (data & 0x0f); + break; + case 0x01: /* Bit 4(-7?) for rom bank selection */ + m_latch_bank2 = (m_latch_bank2 & 0x0f) | ((data & 0x0f) << 4); + break; + case 0x04: /* Data to write lo */ + m_tama5_data = (m_tama5_data & 0xf0) | (data & 0x0f); + break; + case 0x05: /* Data to write hi */ + m_tama5_data = (m_tama5_data & 0x0f) | ((data & 0x0f) << 4); + break; + case 0x06: /* Address selection hi */ + m_tama5_addr = (m_tama5_addr & 0x0f) | ((data & 0x0f) << 4); + break; + case 0x07: /* Address selection lo */ + /* This address always seems to written last, so we'll just + execute the command here */ + m_tama5_addr = (m_tama5_addr & 0xf0) | (data & 0x0f); + switch (m_tama5_addr & 0xe0) + { + case 0x00: /* Write memory */ + //logerror( "Write tama5 memory 0x%02X <- 0x%02X\n", m_tama5_addr & 0x1f, m_tama5_data); + m_regs[m_tama5_addr & 0x1f] = m_tama5_data; + break; + case 0x20: /* Read memory */ + //logerror( "Read tama5 memory 0x%02X\n", m_tama5_addr & 0x1f); + m_tama5_data = m_regs[m_tama5_addr & 0x1f]; + break; + case 0x40: /* Unknown, some kind of read */ + if ((m_tama5_addr & 0x1f) == 0x12) + m_tama5_data = 0xff; + case 0x80: /* Unknown, some kind of read (when 07=01)/write (when 07=00/02) */ + default: + logerror( "0x%04X: Unknown addressing mode\n", space.device() .safe_pc( ) ); + break; + } + break; + } + break; + case 0x0001: /* Write to control register */ + switch (data) + { + case 0x00: /* Bits 0-3 for rom bank selection */ + case 0x01: /* Bits 4-7 for rom bank selection */ + case 0x04: /* Data write register lo */ + case 0x05: /* Data write register hi */ + case 0x06: /* Address register hi */ + case 0x07: /* Address register lo */ + break; + case 0x0a: /* Are we ready for the next command? */ + m_rtc_reg = 0x01; + break; + case 0x0c: /* Data read register lo */ + m_rtc_reg = m_tama5_data & 0x0f; + break; + case 0x0d: /* Data read register hi */ + m_rtc_reg = (m_tama5_data & 0xf0) >> 4; + break; + default: + logerror( "0x%04X: Unknown tama5 command 0x%02X\n", space.device() .safe_pc( ), data ); + break; + } + m_tama5_cmd = data; + break; + } +} + + +// Wisdom Tree + +READ8_MEMBER(gb_rom_wisdom_device::read_rom) +{ + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + offset]; +} + +WRITE8_MEMBER(gb_rom_wisdom_device::write_bank) +{ + if (offset < 0x4000) + m_latch_bank = (offset << 1) & 0x1ff; +} + + +// Yong Yong pirate + +READ8_MEMBER(gb_rom_yong_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_yong_device::write_bank) +{ + if (offset == 0x2000) + m_latch_bank2 = data; +} + + +// ATV Racin pirate (incomplete) + +READ8_MEMBER(gb_rom_atvrac_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_atvrac_device::write_bank) +{ + if (offset == 0x3f00) + { + if (data == 0) + data = 1; + m_latch_bank2 = m_latch_bank | data; + } + if (offset == 0x3fc0) + m_latch_bank = data * 16; +} + +// La Sa Ma pirate (incomplete) + +READ8_MEMBER(gb_rom_lasama_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(gb_rom_lasama_device::write_bank) +{ + if (offset == 0x2080) + { + // Actual banking? + m_latch_bank2 = m_latch_bank | (data & 0x03); + } + if (offset == 0x6000) + { + // On boot the following two get written right after each other: + // 02 + // BE + // Disable logo switching? + if (!(data & 0x80)) + m_latch_bank = (data & 0x02) << 1; + } +} + + +// MegaDuck carts + +READ8_MEMBER(megaduck_rom_device::read_rom) +{ + if (offset < 0x4000) + return m_rom[rom_bank_map[m_latch_bank] * 0x4000 + (offset & 0x3fff)]; + else + return m_rom[rom_bank_map[m_latch_bank2] * 0x4000 + (offset & 0x3fff)]; +} + +WRITE8_MEMBER(megaduck_rom_device::write_bank) +{ + if (offset == 0x0001) + m_latch_bank2 = data; +} + +WRITE8_MEMBER(megaduck_rom_device::write_ram) +{ + m_latch_bank = data * 2; + m_latch_bank2 = data * 2 + 1; +} + diff --git a/src/mess/machine/gb_rom.h b/src/mess/machine/gb_rom.h new file mode 100644 index 00000000000..0a538effd55 --- /dev/null +++ b/src/mess/machine/gb_rom.h @@ -0,0 +1,143 @@ +#ifndef __GB_ROM_H +#define __GB_ROM_H + +#include "machine/gb_slot.h" + + +// ======================> gb_rom_device + +class gb_rom_device : public device_t, + public device_gb_cart_interface +{ +public: + // construction/destruction + gb_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); + gb_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); +}; + +// ======================> gb_rom_tama5_device +class gb_rom_tama5_device : public gb_rom_device +{ +public: + // construction/destruction + gb_rom_tama5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_tama5"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); + UINT16 m_tama5_data, m_tama5_addr, m_tama5_cmd; + UINT8 m_regs[32]; + UINT8 m_rtc_reg; +}; + +// ======================> gb_rom_wisdom_device +class gb_rom_wisdom_device : public gb_rom_device +{ +public: + // construction/destruction + gb_rom_wisdom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_wisdom"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); +}; + +// ======================> gb_rom_yong_device +class gb_rom_yong_device : public gb_rom_device +{ +public: + // construction/destruction + gb_rom_yong_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_yong"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); +}; + +// ======================> gb_rom_atvrac_device +class gb_rom_atvrac_device : public gb_rom_device +{ +public: + // construction/destruction + gb_rom_atvrac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_atvrac"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); +}; + +// ======================> gb_rom_lasama_device +class gb_rom_lasama_device : public gb_rom_device +{ +public: + // construction/destruction + gb_rom_lasama_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "gb_rom_lasama"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); +}; + + + + +// ======================> megaduck_rom_device +class megaduck_rom_device :public device_t, + public device_gb_cart_interface +{ +public: + // construction/destruction + megaduck_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); + megaduck_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete() { m_shortname = "megaduck_rom"; } + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_WRITE8_MEMBER(write_ram); +}; + +// device type definition +extern const device_type GB_STD_ROM; +extern const device_type GB_ROM_TAMA5; +extern const device_type GB_ROM_WISDOM; +extern const device_type GB_ROM_YONG; +extern const device_type GB_ROM_ATVRAC; +extern const device_type GB_ROM_LASAMA; + +extern const device_type MEGADUCK_ROM; + +#endif diff --git a/src/mess/machine/gb_slot.c b/src/mess/machine/gb_slot.c new file mode 100644 index 00000000000..1a0a8f095bc --- /dev/null +++ b/src/mess/machine/gb_slot.c @@ -0,0 +1,771 @@ +/*********************************************************************************************************** + + + Game Boy cart emulation + (through slot devices) + + + The driver exposes address ranges + 0x0000-0x7fff to read_rom/write_bank + 0xa000-0xbfff to read_ram/write_ram (typically RAM/NVRAM accesses, but megaduck uses the write for bankswitch) + + currently available slot devices: + gb_rom: standard carts + TAMA5 mapper + pirate carts with protection & bankswitch + gb_mbc: MBC1-MBC7 carts (more complex bankswitch + RAM + possibly RTC/Rumble/etc.) + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "machine/gb_slot.h" + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type GB_CART_SLOT = &device_creator; +const device_type MEGADUCK_CART_SLOT = &device_creator; + +//************************************************************************** +// MD cartridges Interface +//************************************************************************** + +//------------------------------------------------- +// device_gb_cart_interface - constructor +//------------------------------------------------- + +device_gb_cart_interface::device_gb_cart_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device), + m_rom(NULL), + m_ram(NULL), + m_rom_size(0), + m_ram_size(0) +{ +} + + +//------------------------------------------------- +// ~device_gb_cart_interface - destructor +//------------------------------------------------- + +device_gb_cart_interface::~device_gb_cart_interface() +{ +} + +//------------------------------------------------- +// rom_alloc - alloc the space for the cart +//------------------------------------------------- + +void device_gb_cart_interface::rom_alloc(running_machine &machine, UINT32 size) +{ + if (m_rom == NULL) + { + m_rom = auto_alloc_array_clear(machine, UINT8, size); + m_rom_size = size; + } +} + + +//------------------------------------------------- +// ram_alloc - alloc the space for the ram +//------------------------------------------------- + +void device_gb_cart_interface::ram_alloc(running_machine &machine, UINT32 size) +{ + if (m_ram == NULL) + { + m_ram = auto_alloc_array_clear(machine, UINT8, size); + m_ram_size = size; + } +} + + +//------------------------------------------------- +// rom_map_setup - setup map of rom banks in 16K +// blocks, so to simplify ROM access +//------------------------------------------------- + +void device_gb_cart_interface::rom_map_setup(UINT32 size) +{ + int i; + // setup the rom_bank_map array to faster ROM read + for (i = 0; i < size / 0x4000; i++) + rom_bank_map[i] = i; + + // fill up remaining blocks with mirrors + while (i % 512) + { + int j = 0, repeat_banks; + while ((i % (512 >> j)) && j < 9) + j++; + repeat_banks = i % (512 >> (j - 1)); + for (int k = 0; k < repeat_banks; k++) + rom_bank_map[i + k] = rom_bank_map[i + k - repeat_banks]; + i += repeat_banks; + } + +// check bank map! +// for (i = 0; i < 256; i++) +// { +// printf("bank %3d = %3d\t", i, rom_bank_map[i]); +// if ((i%8) == 7) +// printf("\n"); +// } +} + +//------------------------------------------------- +// ram_map_setup - setup map of ram banks in 16K +// blocks, so to simplify ROM access +//------------------------------------------------- + +void device_gb_cart_interface::ram_map_setup(UINT8 banks) +{ + int mask = banks - 1; + + for (int i = 0; i < banks; i++) + ram_bank_map[i] = i; + + // Set up rest of the (mirrored) RAM pages + for (int i = banks; i < 256; i++) + ram_bank_map[i] = i & mask; +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// base_gb_cart_slot_device - constructor +//------------------------------------------------- +base_gb_cart_slot_device::base_gb_cart_slot_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, type, name, tag, owner, clock), + device_image_interface(mconfig, *this), + device_slot_interface(mconfig, *this), + m_type(GB_MBC_UNKNOWN) +{ +} + +gb_cart_slot_device::gb_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + base_gb_cart_slot_device(mconfig, GB_CART_SLOT, "Game Boy Cartridge Slot", tag, owner, clock) +{ +} + +megaduck_cart_slot_device::megaduck_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + base_gb_cart_slot_device(mconfig, MEGADUCK_CART_SLOT, "Megaduck Cartridge Slot", tag, owner, clock) +{ +} + +//------------------------------------------------- +// base_gb_cart_slot_device - destructor +//------------------------------------------------- + +base_gb_cart_slot_device::~base_gb_cart_slot_device() +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void base_gb_cart_slot_device::device_start() +{ + m_cart = dynamic_cast(get_card_device()); +} + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void base_gb_cart_slot_device::device_config_complete() +{ + // set brief and instance name + update_names(); +} + + +//------------------------------------------------- +// MD PCB +//------------------------------------------------- + + +struct gb_slot +{ + int pcb_id; + const char *slot_option; +}; + +// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it +static const gb_slot slot_list[] = +{ + { GB_MBC_MBC1, "rom_mbc1" }, + { GB_MBC_MBC1_KOR, "rom_mbc1k" }, + { GB_MBC_MBC2, "rom_mbc2" }, + { GB_MBC_MBC3, "rom_mbc3" }, + { GB_MBC_MBC5, "rom_mbc5" }, + { GB_MBC_MBC6, "rom_mbc6" }, + { GB_MBC_MBC7, "rom_mbc7" }, + { GB_MBC_TAMA5, "rom_tama5" }, + { GB_MBC_MMM01, "rom_mmm01" }, + { GB_MBC_MBC3, "rom_huc1" }, // for now treat this as alias for MBC3 + { GB_MBC_MBC3, "rom_huc3" }, // for now treat this as alias for MBC3 + { GB_MBC_WISDOM, "rom_wisdom" }, + { GB_MBC_YONGYONG, "rom_yong" }, + { GB_MBC_LASAMA, "rom_lasama" }, + { GB_MBC_ATVRACIN, "rom_atvrac" }, + { GB_MBC_CAMERA, "rom_camera" } +}; + +static int gb_get_pcb_id(const char *slot) +{ + for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) + { + if (!mame_stricmp(slot_list[i].slot_option, slot)) + return slot_list[i].pcb_id; + } + + return 0; +} + +static const char *gb_get_slot(int type) +{ + for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) + { + if (slot_list[i].pcb_id == type) + return slot_list[i].slot_option; + } + + return "rom"; +} + + +/*------------------------------------------------- + call load + -------------------------------------------------*/ + + +bool base_gb_cart_slot_device::call_load() +{ + if (m_cart) + { + UINT32 offset = 0; + UINT32 len = (software_entry() == NULL) ? length() : get_software_region_length("rom"); + UINT8 *ROM; + + // From fullpath, check for presence of a header and skip it + check filesize is valid + if (software_entry() == NULL) + { + if ((len % 0x4000) == 512) + { + logerror("Rom-header found, skipping\n"); + offset = 512; + len -= offset; + fseek(offset, SEEK_SET); + } + /* Verify that the file contains 16kb blocks */ + if ((len == 0) || ((len % 0x4000) != 0)) + { + seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid rom file size\n"); + return IMAGE_INIT_FAIL; + } + } + + m_cart->rom_alloc(machine(), len); + ROM = m_cart->get_rom_base(); + + if (software_entry() == NULL) + fread(ROM, len); + else + memcpy(ROM, get_software_region("rom"), len); + + // determine cart type + offset = 0; + if (get_mmm01_candidate(ROM, len)) + offset = len - 0x8000; + int type; + + if (software_entry() != NULL) + type = gb_get_pcb_id(get_feature("slot") ? get_feature("slot") : "rom"); + else + type = get_cart_type(ROM + offset, len - offset); + + if (software_entry() != NULL) + { + const char *rumble = get_feature("rumble"); + const char *battery_backed = get_feature("battery_backed"); + + if (rumble != NULL) + { + if (!mame_stricmp(rumble, "yes")) + m_cart->set_has_rumble(TRUE); + } + + if (battery_backed != NULL) + { + if (!mame_stricmp(battery_backed, "yes")) + m_cart->set_has_battery(TRUE); + } + } + + switch (ROM[0x0147 + offset]) + { + case 0x03: case 0x06: case 0x09: case 0x0d: case 0x13: case 0x17: case 0x1b: case 0x22: + m_cart->set_has_battery(TRUE); + break; + + case 0x0f: case 0x10: + m_cart->set_has_battery(TRUE); + m_cart->set_has_timer(TRUE); + break; + + case 0x1c: case 0x1d: + m_cart->set_has_rumble(TRUE); + break; + + case 0x1e: + m_cart->set_has_battery(TRUE); + m_cart->set_has_rumble(TRUE); + break; + } + + int rombanks, rambanks; + + switch (ROM[0x0148 + offset]) + { + case 0x52: + rombanks = 72; + break; + case 0x53: + rombanks = 80; + break; + case 0x54: + rombanks = 96; + break; + case 0x00: case 0x01: case 0x02: case 0x03: + case 0x04: case 0x05: case 0x06: case 0x07: + rombanks = 2 << ROM[0x0148]; + break; + default: + rombanks = 256; + break; + } + + // setup rom bank map based on real length, not header value + m_cart->rom_map_setup(len); + + switch (ROM[0x0149 + offset] & 0x07) + { + case 0x00: case 0x06: case 0x07: + rambanks = 0; + break; + case 0x01: case 0x02: + rambanks = 1; + break; + case 0x03: + rambanks = 4; + break; + case 0x04: + rambanks = 16; + break; + case 0x05: + default: + rambanks = 8; + break; + } + + if (type == GB_MBC_MBC2 || type == GB_MBC_MBC7) + rambanks = 1; + + if (rambanks) + setup_ram(rambanks); + + if (m_cart->get_ram_size() && m_cart->get_has_battery()) + battery_load(m_cart->get_ram_base(), m_cart->get_ram_size(), 0xff); + + //printf("Type: %s\n", gb_get_slot(type)); + + internal_header_logging(ROM, len, rombanks); + + return IMAGE_INIT_PASS; + } + + return IMAGE_INIT_PASS; +} + +bool megaduck_cart_slot_device::call_load() +{ + if (m_cart) + { + UINT32 len = (software_entry() == NULL) ? length() : get_software_region_length("rom"); + UINT8 *ROM; + + m_cart->rom_alloc(machine(), len); + ROM = m_cart->get_rom_base(); + + if (software_entry() == NULL) + fread(ROM, len); + else + memcpy(ROM, get_software_region("rom"), len); + + // setup rom bank map based on real length, not header value + m_cart->rom_map_setup(len); + + return IMAGE_INIT_PASS; + } + + return IMAGE_INIT_PASS; +} + + +/*------------------------------------------------- + call_unloadload + -------------------------------------------------*/ + +void base_gb_cart_slot_device::call_unload() +{ + if (m_cart->get_ram_size() && m_cart->get_has_battery()) + battery_save(m_cart->get_ram_base(), m_cart->get_ram_size()); +} + +void base_gb_cart_slot_device::setup_ram(UINT8 banks) +{ + m_cart->ram_alloc(machine(), banks * 0x2000); + memset(m_cart->get_ram_base(), 0xff, m_cart->get_ram_size()); + m_cart->ram_map_setup(banks); +} + + + +/*------------------------------------------------- + call softlist load + -------------------------------------------------*/ + +bool base_gb_cart_slot_device::call_softlist_load(char *swlist, char *swname, rom_entry *start_entry) +{ + load_software_part_region(this, swlist, swname, start_entry ); + return TRUE; +} + +// This fails to catch Mani 4-in-1 carts... even when they match this, then they have MBC1/3 in the internal header instead of MMM01... +bool base_gb_cart_slot_device::get_mmm01_candidate(UINT8 *ROM, UINT32 len) +{ + if (len < 0x8147) + return FALSE; + + static const UINT8 nintendo_logo[0x18] = { + 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, + 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D, + 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E + }; + int bytes_matched = 0; + for (int i = 0; i < 0x18; i++) + { + if (ROM[(len - 0x8000) + 0x104 + i] == nintendo_logo[i]) + bytes_matched++; + } + + if (bytes_matched == 0x18 && ROM[(len - 0x8000) + 0x147] >= 0x0b && ROM[(len - 0x8000) + 0x147] <= 0x0d) + return TRUE; + else + return FALSE; +} + +int base_gb_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len) +{ + int type = GB_MBC_NONE; + + if (len < 0x014c) + fatalerror("Checking header of a corrupted image!\n"); + + switch(ROM[0x0147]) + { + case 0x00: type = GB_MBC_NONE; break; + case 0x01: type = GB_MBC_MBC1; break; + case 0x02: type = GB_MBC_MBC1; break; + case 0x03: type = GB_MBC_MBC1; break; + case 0x05: type = GB_MBC_MBC2; break; + case 0x06: type = GB_MBC_MBC2; break; + case 0x08: type = GB_MBC_NONE; break; + case 0x09: type = GB_MBC_NONE; break; + case 0x0b: type = GB_MBC_MMM01; break; + case 0x0c: type = GB_MBC_MMM01; break; + case 0x0d: type = GB_MBC_MMM01; break; + case 0x0f: type = GB_MBC_MBC3; break; + case 0x10: type = GB_MBC_MBC3; break; + case 0x11: type = GB_MBC_MBC3; break; + case 0x12: type = GB_MBC_MBC3; break; + case 0x13: type = GB_MBC_MBC3; break; + case 0x15: type = GB_MBC_MBC4; break; + case 0x16: type = GB_MBC_MBC4; break; + case 0x17: type = GB_MBC_MBC4; break; + case 0x19: type = GB_MBC_MBC5; break; + case 0x1a: type = GB_MBC_MBC5; break; + case 0x1b: type = GB_MBC_MBC5; break; + case 0x1c: type = GB_MBC_MBC5; break; + case 0x1d: type = GB_MBC_MBC5; break; + case 0x1e: type = GB_MBC_MBC5; break; + case 0x20: type = GB_MBC_MBC6; break; + case 0x22: type = GB_MBC_MBC7; break; + case 0xbe: type = GB_MBC_NONE; break; /* used in Flash2Advance GB Bridge boot program */ + case 0xea: type = GB_MBC_YONGYONG; break; /* Found in Sonic 3D Blast 5 pirate */ + case 0xfc: type = GB_MBC_CAMERA; break; + case 0xfd: type = GB_MBC_TAMA5; break; + case 0xfe: type = GB_MBC_HUC3; break; + case 0xff: type = GB_MBC_HUC1; break; + } + + // Check for special mappers + if (type == GB_MBC_NONE) + { + int count = 0; + for (int i = 0x0134; i <= 0x014c; i++) + { + count += ROM[i]; + } + if (count == 0) + { + type = GB_MBC_WISDOM; + } + } + + /* Check if we're dealing with a Korean variant of the MBC1 mapper */ + if (type == GB_MBC_MBC1) + { + if (ROM[0x13f] == 0x42 && ROM[0x140] == 0x32 && ROM[0x141] == 0x43 && ROM[0x142] == 0x4B) + type = GB_MBC_MBC1_KOR; + } + + return type; +} +/*------------------------------------------------- + get default card software + -------------------------------------------------*/ + +const char * base_gb_cart_slot_device::get_default_card_software(const machine_config &config, emu_options &options) +{ + + if (open_image_file(options)) + { + const char *slot_string = "rom"; + UINT32 len = core_fsize(m_file), offset = 0; + UINT8 *ROM = global_alloc_array(UINT8, len); + int type; + + core_fread(m_file, ROM, len); + + if ((len % 0x4000) == 512) + offset = 512; + + if (get_mmm01_candidate(ROM + offset, len - offset)) + offset += (len - 0x8000); + + type = get_cart_type(ROM + offset, len - offset); + slot_string = gb_get_slot(type); + + //printf("type: %s\n", slot_string); + global_free(ROM); + clear(); + + return slot_string; + } + + return software_get_default_slot(config, options, this, "rom"); +} + + + +/*------------------------------------------------- + read + -------------------------------------------------*/ + +READ8_MEMBER(base_gb_cart_slot_device::read_rom) +{ + if (m_cart) + return m_cart->read_rom(space, offset); + else + return 0xff; +} + +READ8_MEMBER(base_gb_cart_slot_device::read_ram) +{ + if (m_cart) + return m_cart->read_ram(space, offset); + else + return 0xff; +} + + +/*------------------------------------------------- + write + -------------------------------------------------*/ + +WRITE8_MEMBER(base_gb_cart_slot_device::write_bank) +{ + if (m_cart) + m_cart->write_bank(space, offset, data); +} + +WRITE8_MEMBER(base_gb_cart_slot_device::write_ram) +{ + if (m_cart) + m_cart->write_ram(space, offset, data); +} + + +/*------------------------------------------------- + Internal header logging + -------------------------------------------------*/ + +void base_gb_cart_slot_device::internal_header_logging(UINT8 *ROM, UINT32 len, UINT16 rom_banks) +{ + static const char *const cart_types[] = + { + "ROM ONLY", "ROM+MBC1", "ROM+MBC1+RAM", + "ROM+MBC1+RAM+BATTERY", "UNKNOWN", "ROM+MBC2", + "ROM+MBC2+BATTERY", "UNKNOWN", "ROM+RAM", + "ROM+RAM+BATTERY", "UNKNOWN", "ROM+MMM01", + "ROM+MMM01+SRAM", "ROM+MMM01+SRAM+BATTERY", "UNKNOWN", + "ROM+MBC3+TIMER+BATTERY", "ROM+MBC3+TIMER+RAM+BATTERY", "ROM+MBC3", + "ROM+MBC3+RAM", "ROM+MBC3+RAM+BATTERY", "UNKNOWN", + "UNKNOWN", "UNKNOWN", "UNKNOWN", + "UNKNOWN", "ROM+MBC5", "ROM+MBC5+RAM", + "ROM+MBC5+RAM+BATTERY", "ROM+MBC5+RUMBLE", "ROM+MBC5+RUMBLE+SRAM", + "ROM+MBC5+RUMBLE+SRAM+BATTERY", "Pocket Camera", "Bandai TAMA5", + /* Need heaps of unknowns here */ + "Hudson HuC-3", "Hudson HuC-1" + }; + + // some company codes + static const struct + { + UINT16 code; + const char *name; + } + companies[] = + { + {0x3301, "Nintendo"}, + {0x7901, "Accolade"}, + {0xA400, "Konami"}, + {0x6701, "Ocean"}, + {0x5601, "LJN"}, + {0x9900, "ARC?"}, + {0x0101, "Nintendo"}, + {0x0801, "Capcom"}, + {0x0100, "Nintendo"}, + {0xBB01, "SunSoft"}, + {0xA401, "Konami"}, + {0xAF01, "Namcot?"}, + {0x4901, "Irem"}, + {0x9C01, "Imagineer"}, + {0xA600, "Kawada?"}, + {0xB101, "Nexoft"}, + {0x5101, "Acclaim"}, + {0x6001, "Titus"}, + {0xB601, "HAL"}, + {0x3300, "Nintendo"}, + {0x0B00, "Coconuts?"}, + {0x5401, "Gametek"}, + {0x7F01, "Kemco?"}, + {0xC001, "Taito"}, + {0xEB01, "Atlus"}, + {0xE800, "Asmik?"}, + {0xDA00, "Tomy?"}, + {0xB100, "ASCII?"}, + {0xEB00, "Atlus"}, + {0xC000, "Taito"}, + {0x9C00, "Imagineer"}, + {0xC201, "Kemco?"}, + {0xD101, "Sofel?"}, + {0x6101, "Virgin"}, + {0xBB00, "SunSoft"}, + {0xCE01, "FCI?"}, + {0xB400, "Enix?"}, + {0xBD01, "Imagesoft"}, + {0x0A01, "Jaleco?"}, + {0xDF00, "Altron?"}, + {0xA700, "Takara?"}, + {0xEE00, "IGS?"}, + {0x8300, "Lozc?"}, + {0x5001, "Absolute?"}, + {0xDD00, "NCS?"}, + {0xE500, "Epoch?"}, + {0xCB00, "VAP?"}, + {0x8C00, "Vic Tokai"}, + {0xC200, "Kemco?"}, + {0xBF00, "Sammy?"}, + {0x1800, "Hudson Soft"}, + {0xCA01, "Palcom/Ultra"}, + {0xCA00, "Palcom/Ultra"}, + {0xC500, "Data East?"}, + {0xA900, "Technos Japan?"}, + {0xD900, "Banpresto?"}, + {0x7201, "Broderbund?"}, + {0x7A01, "Triffix Entertainment?"}, + {0xE100, "Towachiki?"}, + {0x9300, "Tsuburava?"}, + {0xC600, "Tonkin House?"}, + {0xCE00, "Pony Canyon"}, + {0x7001, "Infogrames?"}, + {0x8B01, "Bullet-Proof Software?"}, + {0x5501, "Park Place?"}, + {0xEA00, "King Records?"}, + {0x5D01, "Tradewest?"}, + {0x6F01, "ElectroBrain?"}, + {0xAA01, "Broderbund?"}, + {0xC301, "SquareSoft"}, + {0x5201, "Activision?"}, + {0x5A01, "Bitmap Brothers/Mindscape"}, + {0x5301, "American Sammy"}, + {0x4701, "Spectrum Holobyte"}, + {0x1801, "Hudson Soft"}, + {0x0000, NULL} + }; + static const int ramsize[8] = { 0, 2, 8, 32, 128, 64, 0, 0 }; + +// const char *prod; + char soft[17]; + UINT32 tmp = 0; + int csum = 0, i = 0; + + strncpy(soft, (char *)&ROM[0x0134], 16); + soft[16] = '\0'; + logerror("Cart Information\n"); + logerror("\tName: %s\n", soft); + logerror("\tType: %s [0x%2X]\n", (ROM[0x0147] <= 32) ? cart_types[ROM[0x0147]] : "", ROM[0x0147] ); + logerror("\tGame Boy: %s\n", (ROM[0x0143] == 0xc0) ? "No" : "Yes" ); + logerror("\tSuper GB: %s [0x%2X]\n", (ROM[0x0146] == 0x03) ? "Yes" : "No", ROM[0x0146] ); + logerror("\tColor GB: %s [0x%2X]\n", (ROM[0x0143] == 0x80 || ROM[0x0143] == 0xc0) ? "Yes" : "No", ROM[0x0143] ); + logerror("\tROM Size: %d 16kB Banks [0x%2X]\n", rom_banks, ROM[0x0148]); + logerror("\tRAM Size: %d kB [0x%2X]\n", ramsize[ROM[0x0149] & 0x07], ROM[0x0149]); + logerror("\tLicense code: 0x%2X%2X\n", ROM[0x0145], ROM[0x0144] ); + tmp = (ROM[0x014b] << 8) + ROM[0x014a]; + for (i = 0; i < ARRAY_LENGTH(companies); i++) + if (tmp == companies[i].code) + break; + logerror("\tManufacturer ID: 0x%2X", tmp); + logerror(" [%s]\n", (companies[i].name) ? companies[i].name : "?"); + logerror("\tVersion Number: 0x%2X\n", ROM[0x014c]); + logerror("\tComplement Check: 0x%2X\n", ROM[0x014d]); + logerror("\tChecksum: 0x%2X\n", ((ROM[0x014e] << 8) + ROM[0x014f])); + tmp = (ROM[0x0103] << 8) + ROM[0x0102]; + logerror("\tStart Address: 0x%2X\n", tmp); + + // Additional checks + if (rom_banks == 256) + logerror("\nWarning loading cartridge: Unknown ROM size in header [0x%x].\n", ROM[0x0148]); + + if ((len / 0x4000) != rom_banks) + logerror("\nWarning loading cartridge: Filesize (0x%x) and reported ROM banks (0x%x) don't match.\n", + len, rom_banks * 0x4000); + /* Calculate and check checksum */ + tmp = (ROM[0x014e] << 8) + ROM[0x014f]; + for (int i = 0; i < len; i++) + csum += ROM[i]; + csum -= (ROM[0x014e] + ROM[0x014f]); + csum &= 0xffff; + + if (csum != tmp) + logerror("\nWarning loading cartridge: Checksum is wrong (Actual %x vs Internal %x)\n", csum, tmp); + +} \ No newline at end of file diff --git a/src/mess/machine/gb_slot.h b/src/mess/machine/gb_slot.h new file mode 100644 index 00000000000..87b73945c02 --- /dev/null +++ b/src/mess/machine/gb_slot.h @@ -0,0 +1,195 @@ +#ifndef __GB_SLOT_H +#define __GB_SLOT_H + +/*************************************************************************** + TYPE DEFINITIONS + ***************************************************************************/ + + +/* PCB */ +enum +{ + GB_MBC_NONE = 0, /* 32KB ROM - No memory bank controller */ + GB_MBC_MBC1, /* ~2MB ROM, 8KB RAM -or- 512KB ROM, 32KB RAM */ + GB_MBC_MBC2, /* 256KB ROM, 32KB RAM */ + GB_MBC_MMM01, /* ?? ROM, ?? RAM */ + GB_MBC_MBC3, /* 2MB ROM, 32KB RAM, RTC */ + GB_MBC_MBC4, /* ?? ROM, ?? RAM */ + GB_MBC_MBC5, /* 8MB ROM, 128KB RAM (32KB w/ Rumble) */ + GB_MBC_TAMA5, /* ?? ROM ?? RAM - What is this? */ + GB_MBC_HUC1, /* ?? ROM, ?? RAM - Hudson Soft Controller */ + GB_MBC_HUC3, /* ?? ROM, ?? RAM - Hudson Soft Controller */ + GB_MBC_MBC6, /* ?? ROM, 32KB SRAM */ + GB_MBC_MBC7, /* ?? ROM, ?? RAM */ + GB_MBC_WISDOM, /* ?? ROM, ?? RAM - Wisdom tree controller */ + GB_MBC_MBC1_KOR, /* 1MB ROM, ?? RAM - Korean MBC1 variant */ + GB_MBC_YONGYONG, /* ?? ROM, ?? RAM - Appears in Sonic 3D Blast 5 pirate */ + GB_MBC_LASAMA, /* ?? ROM, ?? RAM - Appears in La Sa Ma */ + GB_MBC_ATVRACIN, + GB_MBC_CAMERA, + GB_MBC_MEGADUCK, /* MEGADUCK style banking */ + GB_MBC_UNKNOWN /* Unknown mapper */ +}; + + +// ======================> gb_cart_interface + +struct gb_cart_interface +{ +}; + + +// ======================> device_gb_cart_interface + +class device_gb_cart_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_gb_cart_interface(const machine_config &mconfig, device_t &device); + virtual ~device_gb_cart_interface(); + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; } + virtual DECLARE_WRITE8_MEMBER(write_bank) {} + virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; } + virtual DECLARE_WRITE8_MEMBER(write_ram) {} + + virtual void rom_alloc(running_machine &machine, UINT32 size); + virtual void ram_alloc(running_machine &machine, UINT32 size); + virtual UINT8* get_rom_base() { return m_rom; } + virtual UINT8* get_ram_base() { return m_ram; } + virtual UINT32 get_rom_size() { return m_rom_size; } + virtual UINT32 get_ram_size() { return m_ram_size; } + + virtual void rom_map_setup(UINT32 size); + virtual void ram_map_setup(UINT8 banks); + + virtual void set_has_timer(bool val) { has_timer = val; } + virtual void set_has_rumble(bool val) { has_rumble = val; } + virtual void set_has_battery(bool val) { has_battery = val; } + virtual bool get_has_battery() { return has_battery; } + + // internal state + UINT8 *m_rom; + UINT8 *m_ram; + UINT32 m_rom_size; + UINT32 m_ram_size; + + // bankswitch variables + // we access ROM/RAM banks through these bank maps + // default accesses are: + // 0x0000-0x3fff = rom_bank_map[m_latch_bank] (generally defaults to m_latch_bank = 0) + // 0x4000-0x7fff = rom_bank_map[m_latch_bank2] (generally defaults to m_latch_bank2 = 1) + // 0xa000-0xbfff = ram_bank_map[m_ram_bank] (generally defaults to m_ram_bank = 0) + // suitable writes to 0x0000-0x7fff can then modify m_latch_bank/m_latch_bank2 + UINT8 rom_bank_map[512]; // 16K chunks of ROM + UINT8 ram_bank_map[256]; // 16K chunks of RAM + UINT8 m_ram_bank; + UINT16 m_latch_bank, m_latch_bank2; + + bool has_rumble, has_timer, has_battery; +}; + + +// ======================> base_gb_cart_slot_device + +class base_gb_cart_slot_device : public device_t, + public gb_cart_interface, + public device_image_interface, + public device_slot_interface +{ +public: + // construction/destruction + base_gb_cart_slot_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); + virtual ~base_gb_cart_slot_device(); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete(); + + // image-level overrides + virtual bool call_load(); + virtual void call_unload(); + virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry); + + virtual int get_type() { return m_type; } + virtual int get_cart_type(UINT8 *ROM, UINT32 len); + virtual bool get_mmm01_candidate(UINT8 *ROM, UINT32 len); + + virtual void setup_ram(UINT8 banks); + virtual void internal_header_logging(UINT8 *ROM, UINT32 len, UINT16 report_rom_banks); + + virtual iodevice_t image_type() const { return IO_CARTSLOT; } + virtual bool is_readable() const { return 1; } + virtual bool is_writeable() const { return 0; } + virtual bool is_creatable() const { return 0; } + virtual bool must_be_loaded() const { return 0; } + virtual bool is_reset_on_load() const { return 0; } + virtual const option_guide *create_option_guide() const { return NULL; } + virtual const char *image_interface() const { return "gameboy_cart"; } + virtual const char *file_extensions() const { return "bin,gb,gbc"; } + + // slot interface overrides + virtual const char * get_default_card_software(const machine_config &config, emu_options &options); + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_rom); + virtual DECLARE_WRITE8_MEMBER(write_bank); + virtual DECLARE_READ8_MEMBER(read_ram); + virtual DECLARE_WRITE8_MEMBER(write_ram); + +// FIXME: +// this should be private, but then there is some problem installing delegates in the driver... +//private: + + device_gb_cart_interface* m_cart; + + int m_type; +}; + +// ======================> gb_cart_slot_device + +class gb_cart_slot_device : public base_gb_cart_slot_device +{ +public: + // construction/destruction + gb_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + + +// ======================> megaduck_cart_slot_device + +class megaduck_cart_slot_device : public base_gb_cart_slot_device +{ +public: + // construction/destruction + megaduck_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // image-level overrides + virtual bool call_load(); + virtual const char *image_interface() const { return "megaduck_cart"; } + virtual const char *file_extensions() const { return "bin"; } +}; + + + + +// device type definition +extern const device_type GB_CART_SLOT; +extern const device_type MEGADUCK_CART_SLOT; + + +/*************************************************************************** + DEVICE CONFIGURATION MACROS + ***************************************************************************/ + +#define MCFG_GB_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot,_def_inp) \ + MCFG_DEVICE_ADD(_tag, GB_CART_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false) + +#define MCFG_MEGADUCK_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot,_def_inp) \ + MCFG_DEVICE_ADD(_tag, MEGADUCK_CART_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false) + + +#endif diff --git a/src/mess/mess.mak b/src/mess/mess.mak index d856135ab26..8fccd92e1ba 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1421,6 +1421,9 @@ $(MESSOBJ)/nintendo.a: \ $(MESS_AUDIO)/gb.o \ $(MESS_VIDEO)/gb.o \ $(MESS_MACHINE)/gb.o \ + $(MESS_MACHINE)/gb_slot.o \ + $(MESS_MACHINE)/gb_rom.o \ + $(MESS_MACHINE)/gb_mbc.o \ $(MESS_DRIVERS)/gb.o \ $(MESS_MACHINE)/pokemini.o \ $(MESS_DRIVERS)/pokemini.o \ @@ -1627,12 +1630,12 @@ $(MESSOBJ)/sanyo.a: \ $(MESSOBJ)/sega.a: \ $(MESS_DRIVERS)/sg1000.o \ $(MESS_MACHINE)/md_slot.o \ - $(MESS_MACHINE)/md_rom.o \ - $(MESS_MACHINE)/md_sk.o \ - $(MESS_MACHINE)/md_eeprom.o \ - $(MESS_MACHINE)/md_jcart.o \ - $(MESS_MACHINE)/md_stm95.o \ - $(MESS_MACHINE)/megasvp.o \ + $(MESS_MACHINE)/md_rom.o \ + $(MESS_MACHINE)/md_sk.o \ + $(MESS_MACHINE)/md_eeprom.o \ + $(MESS_MACHINE)/md_jcart.o \ + $(MESS_MACHINE)/md_stm95.o \ + $(MESS_MACHINE)/megasvp.o \ $(MESS_DRIVERS)/megadriv.o \ $(MESS_DRIVERS)/dccons.o \ $(MAME_MACHINE)/gdrom.o \ diff --git a/src/mess/video/gb.c b/src/mess/video/gb.c index bca627e0684..08feb0391fd 100644 --- a/src/mess/video/gb.c +++ b/src/mess/video/gb.c @@ -132,7 +132,7 @@ PALETTE_INIT_MEMBER(gb_state,gbc) m_lcd.cgb_spal[ii] = 0; } -PALETTE_INIT_MEMBER(gb_state,megaduck) +PALETTE_INIT_MEMBER(megaduck_state,megaduck) { int ii; for( ii = 0; ii < 4; ii++)