|
28 | 28 | #include "ram.h"
|
29 | 29 | #include "rtype.h"
|
30 | 30 | #include "slotexpander.h"
|
| 31 | +#include "slotoptions.h" |
31 | 32 | #include "softcard.h"
|
32 | 33 | #include "superloderunner.h"
|
33 | 34 | #include "super_swangi.h"
|
34 |
| -#include "yamaha.h" |
35 | 35 | #include "yamaha_ucn01.h"
|
36 | 36 |
|
37 | 37 | #include "bus/msx/slot/cartridge.h"
|
38 | 38 |
|
39 | 39 |
|
| 40 | +DEFINE_DEVICE_TYPE(MSX_SLOT_CARTRIDGE, msx_slot_cartridge_device, "msx_slot_cartridge", "MSX Cartridge slot") |
| 41 | + |
| 42 | + |
40 | 43 | void msx_cart(device_slot_interface &device, bool is_in_subslot)
|
41 | 44 | {
|
| 45 | + using namespace bus::msx::cart; |
42 | 46 | msx_cart_disk_register_options(device);
|
43 | 47 | msx_cart_ram_register_options(device);
|
44 |
| - device.option_add_internal("arc", MSX_CART_ARC); |
45 |
| - device.option_add_internal("ascii8", MSX_CART_ASCII8); |
46 |
| - device.option_add_internal("ascii8_sram", MSX_CART_ASCII8_SRAM); |
47 |
| - device.option_add_internal("ascii16", MSX_CART_ASCII16); |
48 |
| - device.option_add_internal("ascii16_sram", MSX_CART_ASCII16_SRAM); |
49 |
| - device.option_add_internal("cross_blaim", MSX_CART_CROSSBLAIM); |
50 |
| - device.option_add_internal("dooly", MSX_CART_DOOLY); |
51 |
| - device.option_add_internal("easispeech", MSX_CART_EASISPEECH); |
52 |
| - device.option_add_internal("fmpac", MSX_CART_FMPAC); |
53 |
| - device.option_add_internal("fs_sr022", MSX_CART_FS_SR022); |
54 |
| - device.option_add_internal("gamemaster2", MSX_CART_GAMEMASTER2); |
55 |
| - device.option_add_internal("halnote", MSX_CART_HALNOTE); |
56 |
| - device.option_add_internal("hfox", MSX_CART_HFOX); |
57 |
| - device.option_add_internal("holy_quran", MSX_CART_HOLY_QURAN); |
58 |
| - device.option_add_internal("ink", MSX_CART_INK); |
59 |
| - device.option_add_internal("kanji", MSX_CART_KANJI); |
60 |
| - device.option_add_internal("keyboard_master", MSX_CART_KEYBOARD_MASTER); |
61 |
| - device.option_add_internal("konami", MSX_CART_KONAMI); |
62 |
| - device.option_add_internal("konami_scc", MSX_CART_KONAMI_SCC); |
63 |
| - device.option_add_internal("korean_80in1", MSX_CART_KOREAN_80IN1); |
64 |
| - device.option_add_internal("korean_90in1", MSX_CART_KOREAN_90IN1); |
65 |
| - device.option_add_internal("korean_126in1", MSX_CART_KOREAN_126IN1); |
66 |
| - device.option_add_internal("majutsushi", MSX_CART_MAJUTSUSHI); |
67 |
| - device.option_add_internal("msxaud_fsca1", MSX_CART_MSX_AUDIO_FSCA1); |
68 |
| - device.option_add_internal("msxaud_hxmu900", MSX_CART_MSX_AUDIO_HXMU900); |
69 |
| - device.option_add_internal("msxaud_nms1205", MSX_CART_MSX_AUDIO_NMS1205); |
70 |
| - device.option_add_internal("msxdos2j", MSX_CART_MSXDOS2J); |
71 |
| - device.option_add_internal("msxdos2e", MSX_CART_MSXDOS2E); |
72 |
| - device.option_add_internal("msxwrite", MSX_CART_MSXWRITE); |
73 |
| - device.option_add_internal("nomapper", MSX_CART_NOMAPPER); |
74 |
| - device.option_add_internal("rtype", MSX_CART_RTYPE); |
75 |
| - device.option_add_internal("sound_snatcher", MSX_CART_SOUND_SNATCHER); |
76 |
| - device.option_add_internal("sound_sdsnatch", MSX_CART_SOUND_SDSNATCHER); |
77 |
| - device.option_add_internal("super_swangi", MSX_CART_SUPER_SWANGI); |
78 |
| - device.option_add_internal("superloderunner", MSX_CART_SUPERLODERUNNER); |
79 |
| - device.option_add_internal("synthesizer", MSX_CART_SYNTHESIZER); |
80 |
| - device.option_add_internal("ec701", MSX_CART_EC701); |
81 |
| - device.option_add("beepack", MSX_CART_BEEPACK); |
82 |
| - device.option_add("bm_012", MSX_CART_BM_012); |
83 |
| - device.option_add("moonsound", MSX_CART_MOONSOUND); |
84 |
| - device.option_add("ucn01", MSX_CART_UCN01); |
| 48 | + device.option_add_internal(slotoptions::ARC, MSX_CART_ARC); |
| 49 | + device.option_add_internal(slotoptions::ASCII8, MSX_CART_ASCII8); |
| 50 | + device.option_add_internal(slotoptions::ASCII8_SRAM, MSX_CART_ASCII8_SRAM); |
| 51 | + device.option_add_internal(slotoptions::ASCII16, MSX_CART_ASCII16); |
| 52 | + device.option_add_internal(slotoptions::ASCII16_SRAM, MSX_CART_ASCII16_SRAM); |
| 53 | + device.option_add_internal(slotoptions::CROSS_BLAIM, MSX_CART_CROSSBLAIM); |
| 54 | + device.option_add_internal(slotoptions::DOOLY, MSX_CART_DOOLY); |
| 55 | + device.option_add_internal(slotoptions::EASISPEECH, MSX_CART_EASISPEECH); |
| 56 | + device.option_add_internal(slotoptions::FMPAC, MSX_CART_FMPAC); |
| 57 | + device.option_add_internal(slotoptions::FS_SR022, MSX_CART_FS_SR022); |
| 58 | + device.option_add_internal(slotoptions::GAMEMASTER2, MSX_CART_GAMEMASTER2); |
| 59 | + device.option_add_internal(slotoptions::HALNOTE, MSX_CART_HALNOTE); |
| 60 | + device.option_add_internal(slotoptions::HFOX, MSX_CART_HFOX); |
| 61 | + device.option_add_internal(slotoptions::HOLY_QURAN, MSX_CART_HOLY_QURAN); |
| 62 | + device.option_add_internal(slotoptions::INK, MSX_CART_INK); |
| 63 | + device.option_add_internal(slotoptions::KANJI, MSX_CART_KANJI); |
| 64 | + device.option_add_internal(slotoptions::KEYBOARD_MASTER, MSX_CART_KEYBOARD_MASTER); |
| 65 | + device.option_add_internal(slotoptions::KONAMI, MSX_CART_KONAMI); |
| 66 | + device.option_add_internal(slotoptions::KONAMI_SCC, MSX_CART_KONAMI_SCC); |
| 67 | + device.option_add_internal(slotoptions::KOREAN_80IN1, MSX_CART_KOREAN_80IN1); |
| 68 | + device.option_add_internal(slotoptions::KOREAN_90IN1, MSX_CART_KOREAN_90IN1); |
| 69 | + device.option_add_internal(slotoptions::KOREAN_126IN1, MSX_CART_KOREAN_126IN1); |
| 70 | + device.option_add_internal(slotoptions::MAJUSTUSHI, MSX_CART_MAJUTSUSHI); |
| 71 | + device.option_add_internal(slotoptions::MSXAUD_FSCA1, MSX_CART_MSX_AUDIO_FSCA1); |
| 72 | + device.option_add_internal(slotoptions::MSXAUD_HXMU900, MSX_CART_MSX_AUDIO_HXMU900); |
| 73 | + device.option_add_internal(slotoptions::MSXAUD_NMS1205, MSX_CART_MSX_AUDIO_NMS1205); |
| 74 | + device.option_add_internal(slotoptions::MSXDOS2J, MSX_CART_MSXDOS2J); |
| 75 | + device.option_add_internal(slotoptions::MSXDOS2E, MSX_CART_MSXDOS2E); |
| 76 | + device.option_add_internal(slotoptions::MSXWRITE, MSX_CART_MSXWRITE); |
| 77 | + device.option_add_internal(slotoptions::NOMAPPER, MSX_CART_NOMAPPER); |
| 78 | + device.option_add_internal(slotoptions::RTYPE, MSX_CART_RTYPE); |
| 79 | + device.option_add_internal(slotoptions::SOUND_SNATCHER, MSX_CART_SOUND_SNATCHER); |
| 80 | + device.option_add_internal(slotoptions::SOUND_SDSNATCH, MSX_CART_SOUND_SDSNATCHER); |
| 81 | + device.option_add_internal(slotoptions::SUPER_SWANGI, MSX_CART_SUPER_SWANGI); |
| 82 | + device.option_add_internal(slotoptions::SUPERLODERUNNER, MSX_CART_SUPERLODERUNNER); |
| 83 | + device.option_add_internal(slotoptions::SYNTHESIZER, MSX_CART_SYNTHESIZER); |
| 84 | + device.option_add_internal(slotoptions::EC701, MSX_CART_EC701); |
| 85 | + device.option_add(slotoptions::BEEPACK, MSX_CART_BEEPACK); |
| 86 | + device.option_add(slotoptions::BM_012, MSX_CART_BM_012); |
| 87 | + device.option_add(slotoptions::MOONSOUND, MSX_CART_MOONSOUND); |
| 88 | + device.option_add(slotoptions::UCN01, MSX_CART_UCN01); |
| 89 | + device.option_add(slotoptions::SOFTCARD, MSX_CART_SOFTCARD); |
85 | 90 | if (!is_in_subslot)
|
86 | 91 | {
|
87 |
| - device.option_add("slotexp", MSX_CART_SLOTEXPANDER); |
| 92 | + device.option_add(slotoptions::SLOTEXP, MSX_CART_SLOTEXPANDER); |
88 | 93 | }
|
89 |
| - device.option_add("softcard", MSX_CART_SOFTCARD); |
90 | 94 | }
|
91 | 95 |
|
92 | 96 |
|
93 |
| -// Several yamaha machines had 60 pin expansion slots. The pinouts of these slots was |
94 |
| -// exactly the same as the regular 50 pin cartridge slots. The lowest 10 pins are simply |
95 |
| -// not connected. |
96 |
| -void msx_yamaha_60pin(device_slot_interface &device, bool is_in_subslot) |
| 97 | +msx_slot_cartridge_device::msx_slot_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) |
| 98 | + : msx_slot_cartridge_base_device(mconfig, MSX_SLOT_CARTRIDGE, tag, owner, clock) |
97 | 99 | {
|
98 |
| - device.option_add("sfg01", MSX_CART_SFG01); |
99 |
| - device.option_add("sfg05", MSX_CART_SFG05); |
100 | 100 | }
|
101 | 101 |
|
102 |
| -void msx_yamaha_minicart(device_slot_interface &device, bool is_in_subslot) |
| 102 | +std::string msx_slot_cartridge_device::get_default_card_software(get_default_card_software_hook &hook) const |
| 103 | +{ |
| 104 | + using namespace bus::msx::cart; |
| 105 | + if (hook.image_file()) |
| 106 | + { |
| 107 | + // Check if there's some mapper related information in the hashfiles |
| 108 | + std::string extrainfo; |
| 109 | + if (hook.hashfile_extrainfo(extrainfo)) |
| 110 | + { |
| 111 | + int extrainfo_type = -1; |
| 112 | + if (1 == sscanf(extrainfo.c_str(), "%d", &extrainfo_type)) |
| 113 | + { |
| 114 | + static const struct {int extrainfo; char const *const mapper;} extrainfo_map[] = { |
| 115 | + { 0, slotoptions::NOMAPPER }, |
| 116 | + { 1, slotoptions::MSXDOS2E }, |
| 117 | + { 2, slotoptions::KONAMI_SCC }, |
| 118 | + { 3, slotoptions::KONAMI }, |
| 119 | + { 4, slotoptions::ASCII8 }, |
| 120 | + { 5, slotoptions::ASCII16 }, |
| 121 | + { 6, slotoptions::GAMEMASTER2 }, |
| 122 | + { 7, slotoptions::ASCII8_SRAM }, |
| 123 | + { 8, slotoptions::ASCII16_SRAM }, |
| 124 | + { 9, slotoptions::RTYPE }, |
| 125 | + { 10, slotoptions::MAJUSTUSHI }, |
| 126 | + { 11, slotoptions::FMPAC }, |
| 127 | + { 12, slotoptions::SUPERLODERUNNER }, |
| 128 | + { 13, slotoptions::SYNTHESIZER }, |
| 129 | + { 14, slotoptions::CROSS_BLAIM }, |
| 130 | + { 16, slotoptions::KOREAN_80IN1 }, |
| 131 | + { 17, slotoptions::KOREAN_126IN1 } |
| 132 | + }; |
| 133 | + |
| 134 | + for (auto & elem : extrainfo_map) |
| 135 | + { |
| 136 | + if (elem.extrainfo == extrainfo_type) |
| 137 | + { |
| 138 | + return std::string(elem.mapper); |
| 139 | + } |
| 140 | + } |
| 141 | + } |
| 142 | + } |
| 143 | + |
| 144 | + // Not identified through hashfile, try automatic detection |
| 145 | + u64 length; |
| 146 | + if (hook.image_file()->length(length)) |
| 147 | + { |
| 148 | + osd_printf_warning("[%s] Error getting cartridge ROM length\n", tag()); |
| 149 | + return std::string(slotoptions::NOMAPPER); |
| 150 | + } |
| 151 | + length = std::min<u64>(length, 4 * 1024 * 1024); |
| 152 | + std::vector<u8> rom(length); |
| 153 | + size_t actual; |
| 154 | + if (hook.image_file()->read(&rom[0], length, actual)) |
| 155 | + { |
| 156 | + osd_printf_warning("[%s] Error reading from file\n", tag()); |
| 157 | + return std::string(slotoptions::NOMAPPER); |
| 158 | + } |
| 159 | + return std::string(get_cart_type(&rom[0], length)); |
| 160 | + } |
| 161 | + return software_get_default_slot(bus::msx::cart::slotoptions::NOMAPPER); |
| 162 | +} |
| 163 | + |
| 164 | + |
| 165 | +char const *const msx_slot_cartridge_device::get_cart_type(const u8 *rom, u32 length) |
103 | 166 | {
|
104 |
| - device.option_add_internal("nomapper", MSX_CART_NOMAPPER); |
| 167 | + using namespace bus::msx::cart; |
| 168 | + if (length < 0x10000) |
| 169 | + { |
| 170 | + return slotoptions::NOMAPPER; |
| 171 | + } |
| 172 | + |
| 173 | + if ((rom[0x10] == 'Y') && (rom[0x11] == 'Z') && (length > 0x18000)) |
| 174 | + { |
| 175 | + return slotoptions::GAMEMASTER2; |
| 176 | + } |
| 177 | + |
| 178 | + int kon4 = 0, kon5 = 0, asc8 = 0, asc16 = 0; |
| 179 | + |
| 180 | + for (int i=0; i < length-3; i++) |
| 181 | + { |
| 182 | + if (rom[i] == 0x32 && rom[i+1] == 0) |
| 183 | + { |
| 184 | + switch (rom[i+2]) |
| 185 | + { |
| 186 | + case 0x60: |
| 187 | + case 0x70: |
| 188 | + asc16++; |
| 189 | + asc8++; |
| 190 | + break; |
| 191 | + |
| 192 | + case 0x68: |
| 193 | + case 0x78: |
| 194 | + asc8++; |
| 195 | + asc16--; |
| 196 | + break; |
| 197 | + } |
| 198 | + |
| 199 | + switch (rom[i+2]) |
| 200 | + { |
| 201 | + case 0x60: |
| 202 | + case 0x80: |
| 203 | + case 0xa0: |
| 204 | + kon4++; |
| 205 | + break; |
| 206 | + |
| 207 | + case 0x50: |
| 208 | + case 0x70: |
| 209 | + case 0x90: |
| 210 | + case 0xb0: |
| 211 | + kon5++; |
| 212 | + break; |
| 213 | + } |
| 214 | + } |
| 215 | + } |
| 216 | + |
| 217 | + if (std::max(kon4, kon5) > std::max(asc8, asc16)) |
| 218 | + { |
| 219 | + return (kon5 > kon4) ? slotoptions::KONAMI_SCC : slotoptions::KONAMI; |
| 220 | + } |
| 221 | + else |
| 222 | + { |
| 223 | + return (asc8 > asc16) ? slotoptions::ASCII8 : slotoptions::ASCII16; |
| 224 | + } |
105 | 225 | }
|
0 commit comments