trunk/src/emu/ui/devopt.c
| r0 | r242935 | |
| 1 | /********************************************************************* |
| 2 | |
| 3 | ui/devopt.c |
| 4 | |
| 5 | Internal menu for the device configuration. |
| 6 | |
| 7 | Copyright Nicola Salmoria and the MAME Team. |
| 8 | Visit http://mamedev.org for licensing and usage restrictions. |
| 9 | |
| 10 | *********************************************************************/ |
| 11 | |
| 12 | #include "emu.h" |
| 13 | #include "ui/ui.h" |
| 14 | #include "ui/devopt.h" |
| 15 | |
| 16 | /*------------------------------------------------- |
| 17 | ui_device_config - handle the game information |
| 18 | menu |
| 19 | -------------------------------------------------*/ |
| 20 | |
| 21 | ui_menu_device_config::ui_menu_device_config(running_machine &machine, render_container *container, device_slot_interface *slot, device_slot_option *option) : ui_menu(machine, container) |
| 22 | { |
| 23 | astring tmp_tag; |
| 24 | tmp_tag.cpy(slot->device().tag()).cat(":").cat(option->name()); |
| 25 | m_option = option; |
| 26 | m_owner = slot; |
| 27 | m_mounted = false; |
| 28 | |
| 29 | device_iterator deviter(machine.config().root_device()); |
| 30 | for (device_t *device = deviter.first(); device != NULL; device = deviter.next()) |
| 31 | { |
| 32 | if (strcmp(device->tag(), tmp_tag.cstr()) == 0) |
| 33 | { |
| 34 | m_mounted = true; |
| 35 | break; |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | void ui_menu_device_config::populate() |
| 41 | { |
| 42 | astring string; |
| 43 | device_t *dev; |
| 44 | |
| 45 | string.printf("[This option is%s currently mounted in the running system]\n\n", m_mounted ? "" : " NOT"); |
| 46 | string.catprintf("Option: %s\n", m_option->name()); |
| 47 | |
| 48 | dev = const_cast<machine_config &>(machine().config()).device_add(&machine().config().root_device(), m_option->name(), m_option->devtype(), 0); |
| 49 | |
| 50 | string.catprintf("Device: %s\n", dev->name()); |
| 51 | if (!m_mounted) |
| 52 | string.cat("\nIf you select this option, the following items will be enabled:\n"); |
| 53 | else |
| 54 | string.cat("\nThe selected option enables the following items:\n"); |
| 55 | |
| 56 | // loop over all CPUs |
| 57 | execute_interface_iterator execiter(*dev); |
| 58 | if (execiter.count() > 0) |
| 59 | { |
| 60 | string.cat("* CPU:\n"); |
| 61 | tagmap_t<UINT8> exectags; |
| 62 | for (device_execute_interface *exec = execiter.first(); exec != NULL; exec = execiter.next()) |
| 63 | { |
| 64 | if (exectags.add(exec->device().tag(), 1, FALSE) == TMERR_DUPLICATE) |
| 65 | continue; |
| 66 | |
| 67 | // get cpu specific clock that takes internal multiplier/dividers into account |
| 68 | int clock = exec->device().clock(); |
| 69 | |
| 70 | // count how many identical CPUs we have |
| 71 | int count = 1; |
| 72 | const char *name = exec->device().name(); |
| 73 | execute_interface_iterator execinneriter(*dev); |
| 74 | for (device_execute_interface *scan = execinneriter.first(); scan != NULL; scan = execinneriter.next()) |
| 75 | { |
| 76 | if (exec->device().type() == scan->device().type() && strcmp(name, scan->device().name()) == 0 && exec->device().clock() == scan->device().clock()) |
| 77 | if (exectags.add(scan->device().tag(), 1, FALSE) != TMERR_DUPLICATE) |
| 78 | count++; |
| 79 | } |
| 80 | |
| 81 | // if more than one, prepend a #x in front of the CPU name |
| 82 | if (count > 1) |
| 83 | string.catprintf(" %d" UTF8_MULTIPLY, count); |
| 84 | else |
| 85 | string.cat(" "); |
| 86 | string.cat(name); |
| 87 | |
| 88 | // display clock in kHz or MHz |
| 89 | if (clock >= 1000000) |
| 90 | string.catprintf(" %d.%06d" UTF8_NBSP "MHz\n", clock / 1000000, clock % 1000000); |
| 91 | else |
| 92 | string.catprintf(" %d.%03d" UTF8_NBSP "kHz\n", clock / 1000, clock % 1000); |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | // display screen information |
| 97 | screen_device_iterator scriter(*dev); |
| 98 | if (scriter.count() > 0) |
| 99 | { |
| 100 | string.cat("* Video:\n"); |
| 101 | for (screen_device *screen = scriter.first(); screen != NULL; screen = scriter.next()) |
| 102 | { |
| 103 | string.catprintf(" Screen '%s': ", screen->tag()); |
| 104 | |
| 105 | if (screen->screen_type() == SCREEN_TYPE_VECTOR) |
| 106 | string.cat("Vector\n"); |
| 107 | else |
| 108 | { |
| 109 | const rectangle &visarea = screen->visible_area(); |
| 110 | |
| 111 | string.catprintf("%d " UTF8_MULTIPLY " %d (%s) %f" UTF8_NBSP "Hz\n", |
| 112 | visarea.width(), visarea.height(), |
| 113 | (machine().system().flags & ORIENTATION_SWAP_XY) ? "V" : "H", |
| 114 | ATTOSECONDS_TO_HZ(screen->frame_period().attoseconds)); |
| 115 | } |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | // loop over all sound chips |
| 120 | sound_interface_iterator snditer(*dev); |
| 121 | if (snditer.count() > 0) |
| 122 | { |
| 123 | string.cat("* Sound:\n"); |
| 124 | tagmap_t<UINT8> soundtags; |
| 125 | for (device_sound_interface *sound = snditer.first(); sound != NULL; sound = snditer.next()) |
| 126 | { |
| 127 | if (soundtags.add(sound->device().tag(), 1, FALSE) == TMERR_DUPLICATE) |
| 128 | continue; |
| 129 | |
| 130 | // count how many identical sound chips we have |
| 131 | int count = 1; |
| 132 | sound_interface_iterator sndinneriter(*dev); |
| 133 | for (device_sound_interface *scan = sndinneriter.first(); scan != NULL; scan = sndinneriter.next()) |
| 134 | { |
| 135 | if (sound->device().type() == scan->device().type() && sound->device().clock() == scan->device().clock()) |
| 136 | if (soundtags.add(scan->device().tag(), 1, FALSE) != TMERR_DUPLICATE) |
| 137 | count++; |
| 138 | } |
| 139 | // if more than one, prepend a #x in front of the CPU name |
| 140 | if (count > 1) |
| 141 | string.catprintf(" %d" UTF8_MULTIPLY, count); |
| 142 | else |
| 143 | string.cat(" "); |
| 144 | string.cat(sound->device().name()); |
| 145 | |
| 146 | // display clock in kHz or MHz |
| 147 | int clock = sound->device().clock(); |
| 148 | if (clock >= 1000000) |
| 149 | string.catprintf(" %d.%06d" UTF8_NBSP "MHz\n", clock / 1000000, clock % 1000000); |
| 150 | else if (clock != 0) |
| 151 | string.catprintf(" %d.%03d" UTF8_NBSP "kHz\n", clock / 1000, clock % 1000); |
| 152 | else |
| 153 | string.cat("\n"); |
| 154 | } |
| 155 | } |
| 156 | |
| 157 | int input = 0, input_mj = 0, input_hana = 0, input_gamble = 0, input_analog = 0, input_adjust = 0; |
| 158 | int dips = 0, confs = 0; |
| 159 | astring errors, dips_opt, confs_opt; |
| 160 | ioport_list portlist; |
| 161 | device_iterator iptiter(*dev); |
| 162 | for (device_t *iptdev = iptiter.first(); iptdev != NULL; iptdev = iptiter.next()) |
| 163 | portlist.append(*iptdev, errors); |
| 164 | |
| 165 | // check if the device adds inputs to the system |
| 166 | for (ioport_port *port = portlist.first(); port != NULL; port = port->next()) |
| 167 | for (ioport_field *field = port->first_field(); field != NULL; field = field->next()) |
| 168 | { |
| 169 | if (field->type() >= IPT_MAHJONG_FIRST && field->type() < IPT_MAHJONG_LAST) |
| 170 | input_mj++; |
| 171 | else if (field->type() >= IPT_HANAFUDA_FIRST && field->type() < IPT_HANAFUDA_LAST) |
| 172 | input_hana++; |
| 173 | else if (field->type() >= IPT_GAMBLING_FIRST && field->type() < IPT_GAMBLING_LAST) |
| 174 | input_gamble++; |
| 175 | else if (field->type() >= IPT_ANALOG_FIRST && field->type() < IPT_ANALOG_LAST) |
| 176 | input_analog++; |
| 177 | else if (field->type() == IPT_ADJUSTER) |
| 178 | input_adjust++; |
| 179 | else if (field->type() >= IPT_START1 && field->type() < IPT_UI_FIRST) |
| 180 | input++; |
| 181 | else if (field->type() == IPT_DIPSWITCH) |
| 182 | { |
| 183 | dips++; |
| 184 | dips_opt.cat(" ").cat(field->name()); |
| 185 | for (ioport_setting *setting = field->first_setting(); setting != NULL; setting = setting->next()) |
| 186 | { |
| 187 | if (setting->value() == field->defvalue()) |
| 188 | { |
| 189 | dips_opt.catprintf(" [default: %s]\n", setting->name()); |
| 190 | break; |
| 191 | } |
| 192 | } |
| 193 | } |
| 194 | else if (field->type() == IPT_CONFIG) |
| 195 | { |
| 196 | confs++; |
| 197 | confs_opt.cat(" ").cat(field->name()); |
| 198 | for (ioport_setting *setting = field->first_setting(); setting != NULL; setting = setting->next()) |
| 199 | { |
| 200 | if (setting->value() == field->defvalue()) |
| 201 | { |
| 202 | confs_opt.catprintf(" [default: %s]\n", setting->name()); |
| 203 | break; |
| 204 | } |
| 205 | } |
| 206 | } |
| 207 | } |
| 208 | |
| 209 | if (dips) |
| 210 | string.cat("* Dispwitch settings:\n").cat(dips_opt); |
| 211 | if (confs) |
| 212 | string.cat("* Configuration settings:\n").cat(confs_opt); |
| 213 | if (input + input_mj + input_hana + input_gamble + input_analog + input_adjust) |
| 214 | string.cat("* Input device(s):\n"); |
| 215 | if (input) |
| 216 | string.catprintf(" Player inputs [%d inputs]\n", input); |
| 217 | if (input_mj) |
| 218 | string.catprintf(" Mahjong inputs [%d inputs]\n", input_mj); |
| 219 | if (input_hana) |
| 220 | string.catprintf(" Hanafuda inputs [%d inputs]\n", input_hana); |
| 221 | if (input_gamble) |
| 222 | string.catprintf(" Gambling inputs [%d inputs]\n", input_gamble); |
| 223 | if (input_analog) |
| 224 | string.catprintf(" Analog inputs [%d inputs]\n", input_analog); |
| 225 | if (input_adjust) |
| 226 | string.catprintf(" Adjuster inputs [%d inputs]\n", input_adjust); |
| 227 | |
| 228 | image_interface_iterator imgiter(*dev); |
| 229 | if (imgiter.count() > 0) |
| 230 | { |
| 231 | string.cat("* Media Options:\n"); |
| 232 | for (const device_image_interface *imagedev = imgiter.first(); imagedev != NULL; imagedev = imgiter.next()) |
| 233 | string.catprintf(" %s [tag: %s]\n", imagedev->image_type_name(), imagedev->device().tag()); |
| 234 | } |
| 235 | |
| 236 | slot_interface_iterator slotiter(*dev); |
| 237 | if (slotiter.count() > 0) |
| 238 | { |
| 239 | string.cat("* Slot Options:\n"); |
| 240 | for (const device_slot_interface *slot = slotiter.first(); slot != NULL; slot = slotiter.next()) |
| 241 | string.catprintf(" %s [default: %s]\n", slot->device().tag(), slot->default_option() ? slot->default_option() : "----"); |
| 242 | } |
| 243 | |
| 244 | if ((execiter.count() + scriter.count() + snditer.count() + imgiter.count() + slotiter.count() + input + input_mj + input_hana + input_gamble + input_analog + input_adjust) == 0) |
| 245 | string.cat("[None]\n"); |
| 246 | |
| 247 | const_cast<machine_config &>(machine().config()).device_remove(&machine().config().root_device(), m_option->name()); |
| 248 | item_append(string, NULL, MENU_FLAG_MULTILINE, NULL); |
| 249 | } |
| 250 | |
| 251 | void ui_menu_device_config::handle() |
| 252 | { |
| 253 | /* process the menu */ |
| 254 | process(0); |
| 255 | } |
| 256 | |
| 257 | ui_menu_device_config::~ui_menu_device_config() |
| 258 | { |
| 259 | } |