diff --git a/src/cdrom/cdrom_image.c b/src/cdrom/cdrom_image.c index 816a563d8..6452868ab 100644 --- a/src/cdrom/cdrom_image.c +++ b/src/cdrom/cdrom_image.c @@ -1803,6 +1803,16 @@ image_load_cue(cd_image_t *img, const char *cuefile) lo_cmd = 0; image_log(img->log, " [SESSION ] Initialization successful\n"); + } else if (!strcmp(command, "TAOGAP")) { + ci = &(ct->idx[2]); + + ci->type = INDEX_ZERO; + ci->file = tf; + success = image_cue_get_frame(&frame, &line); + ci->length = frame; + + image_log(img->log, " [INDEX ] 02 (%8s): Initialization %s\n", + cit[ci->type + 2], success ? "successful" : "failed"); } } } diff --git a/src/cdrom/cdrom_mke.c b/src/cdrom/cdrom_mke.c index 98ae6c057..9632c3140 100644 --- a/src/cdrom/cdrom_mke.c +++ b/src/cdrom/cdrom_mke.c @@ -1041,6 +1041,7 @@ static const device_config_t mke_config[] = { { .description = "320H", .value = 0x320 }, { .description = "330H", .value = 0x330 }, { .description = "340H", .value = 0x340 }, + { .description = "630H", .value = 0x630 }, { NULL } }, .bios = { { 0 } } diff --git a/src/config.c b/src/config.c index a06d9e8b4..590ba8119 100644 --- a/src/config.c +++ b/src/config.c @@ -569,6 +569,7 @@ load_input_devices(void) { ini_section_t cat = ini_find_section(config, "Input devices"); char temp[512]; + char tmp2[32]; char *p; p = ini_section_get_string(cat, "keyboard_type", NULL); @@ -646,18 +647,25 @@ load_input_devices(void) joystick_state[gp][js].plat_joystick_nr = ini_section_get_int(cat, temp, 0); if (joystick_state[gp][js].plat_joystick_nr) { + // --- Load Axis Mappings --- for (int axis_nr = 0; axis_nr < joystick_get_axis_count(joystick_type[joy_insn]); axis_nr++) { sprintf(temp, "joystick_%i_axis_%i", js, axis_nr); joystick_state[gp][js].axis_mapping[axis_nr] = ini_section_get_int(cat, temp, axis_nr); } + + // --- Load Button Mappings --- for (int button_nr = 0; button_nr < joystick_get_button_count(joystick_type[joy_insn]); button_nr++) { sprintf(temp, "joystick_%i_button_%i", js, button_nr); joystick_state[gp][js].button_mapping[button_nr] = ini_section_get_int(cat, temp, button_nr); } + + // --- Load POV (Hat Switch) Mappings --- for (int pov_nr = 0; pov_nr < joystick_get_pov_count(joystick_type[joy_insn]); pov_nr++) { sprintf(temp, "joystick_%i_pov_%i", js, pov_nr); - p = ini_section_get_string(cat, temp, "0, 0"); - joystick_state[gp][js].pov_mapping[pov_nr][0] = joystick_state[gp][js].pov_mapping[pov_nr][1] = 0; + sprintf(tmp2, "%i, %i", 0, 0); + p = ini_section_get_string(cat, temp, tmp2); + joystick_state[gp][js].pov_mapping[pov_nr][0] = 0; + joystick_state[gp][js].pov_mapping[pov_nr][1] = 0; sscanf(p, "%i, %i", &joystick_state[gp][js].pov_mapping[pov_nr][0], &joystick_state[gp][js].pov_mapping[pov_nr][1]); } @@ -2702,7 +2710,7 @@ save_input_devices(void) { ini_section_t cat = ini_find_or_create_section(config, "Input devices"); char temp[512]; - char tmp2[512]; + char tmp2[32]; ini_section_set_string(cat, "keyboard_type", keyboard_get_internal_name(keyboard_type)); @@ -2713,20 +2721,25 @@ save_input_devices(void) ini_section_delete_var(cat, "joystick_type"); for (int js = 0; js < MAX_PLAT_JOYSTICKS; js++) { - sprintf(tmp2, "joystick_%i_nr", js); - ini_section_delete_var(cat, tmp2); + sprintf(temp, "joystick_%i_nr", js); + ini_section_delete_var(cat, temp); + // --- Save Axis Mappings --- for (int axis_nr = 0; axis_nr < MAX_JOY_AXES; axis_nr++) { - sprintf(tmp2, "joystick_%i_axis_%i", js, axis_nr); - ini_section_delete_var(cat, tmp2); + sprintf(temp, "joystick_%i_axis_%i", js, axis_nr); + ini_section_delete_var(cat, temp); } + + // --- Save Button Mappings --- for (int button_nr = 0; button_nr < MAX_JOY_BUTTONS; button_nr++) { - sprintf(tmp2, "joystick_%i_button_%i", js, button_nr); - ini_section_delete_var(cat, tmp2); + sprintf(temp, "joystick_%i_button_%i", js, button_nr); + ini_section_delete_var(cat, temp); } + + // --- Save POV (Hat Switch) Mappings --- for (int pov_nr = 0; pov_nr < MAX_JOY_POVS; pov_nr++) { - sprintf(tmp2, "joystick_%i_pov_%i", js, pov_nr); - ini_section_delete_var(cat, tmp2); + sprintf(temp, "joystick_%i_pov_%i", js, pov_nr); + ini_section_delete_var(cat, temp); } } } else { @@ -2735,33 +2748,37 @@ save_input_devices(void) ini_section_set_string(cat, "joystick_type", joystick_get_internal_name(joystick_type[joy_insn])); for (int js = 0; js < joystick_get_max_joysticks(joystick_type[joy_insn]); js++) { - sprintf(tmp2, "joystick_%i_nr", js); - ini_section_set_int(cat, tmp2, joystick_state[gp][js].plat_joystick_nr); + sprintf(temp, "joystick_%i_nr", js); + ini_section_set_int(cat, temp, joystick_state[gp][js].plat_joystick_nr); if (joystick_state[gp][js].plat_joystick_nr) { + // --- Save Axis Mappings --- for (int axis_nr = 0; axis_nr < joystick_get_axis_count(joystick_type[joy_insn]); axis_nr++) { - sprintf(tmp2, "joystick_%i_axis_%i", js, axis_nr); - ini_section_set_int(cat, tmp2, joystick_state[gp][js].axis_mapping[axis_nr]); + sprintf(temp, "joystick_%i_axis_%i", js, axis_nr); + ini_section_set_int(cat, temp, joystick_state[gp][js].axis_mapping[axis_nr]); } + + // --- Save Button Mappings --- for (int button_nr = 0; button_nr < joystick_get_button_count(joystick_type[joy_insn]); button_nr++) { - sprintf(tmp2, "joystick_%i_button_%i", js, button_nr); - ini_section_set_int(cat, tmp2, joystick_state[gp][js].button_mapping[button_nr]); + sprintf(temp, "joystick_%i_button_%i", js, button_nr); + ini_section_set_int(cat, temp, joystick_state[gp][js].button_mapping[button_nr]); } + + // --- Save POV (Hat Switch) Mappings --- for (int pov_nr = 0; pov_nr < joystick_get_pov_count(joystick_type[joy_insn]); pov_nr++) { - sprintf(tmp2, "joystick_%i_pov_%i", js, pov_nr); - sprintf(temp, "%i, %i", joystick_state[gp][js].pov_mapping[pov_nr][0], - joystick_state[gp][js].pov_mapping[pov_nr][1]); - ini_section_set_string(cat, tmp2, temp); + sprintf(temp, "joystick_%i_pov_%i", js, pov_nr); + sprintf(tmp2, "%i, %i", joystick_state[gp][js].pov_mapping[pov_nr][0], + joystick_state[gp][js].pov_mapping[pov_nr][1]); + ini_section_set_string(cat, temp, tmp2); } } } } - if (tablet_tool_type != 1) { + if (tablet_tool_type != 1) ini_section_set_int(cat, "tablet_tool_type", tablet_tool_type); - } else { + else ini_section_delete_var(cat, "tablet_tool_type"); - } ini_delete_section_if_empty(config, cat); } diff --git a/src/device/serial.c b/src/device/serial.c index 63f20cbee..38220485f 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -141,7 +141,7 @@ serial_update_ints(serial_t *dev) } } - serial_do_irq(dev, !(dev->iir & 0x01) && ((dev->mctrl & 8) || (dev->type == SERIAL_8250_PCJR))); + serial_do_irq(dev, !(dev->iir & 0x01) && ((dev->mctrl & 8) || ((dev->type == SERIAL_8250_PCJR_3F8) || (dev->type == SERIAL_8250_PCJR_2F8)))); } static void @@ -971,15 +971,20 @@ serial_init(const device_t *info) serial_setup(dev, COM4_ADDR, COM4_IRQ); else if (next_inst == 2) serial_setup(dev, COM3_ADDR, COM3_IRQ); - else if ((next_inst == 1) || (info->local == SERIAL_8250_PCJR)) + else if ((next_inst == 1) || (info->local == SERIAL_8250_PCJR_2F8)) serial_setup(dev, COM2_ADDR, COM2_IRQ); + // TODO +#if 0 + else if ((next_inst == 1) || (info->local == SERIAL_8250_PCJR_3F8)) + serial_setup(dev, COM1_ADDR, COM1_IRQ); +#endif else if (next_inst == 0) serial_setup(dev, COM1_ADDR, COM1_IRQ); /* Default to 1200,N,7. */ dev->dlab = 96; dev->fcr = 0x06; - if (info->local == SERIAL_8250_PCJR) + if ((info->local == SERIAL_8250_PCJR_3F8) || (info->local == SERIAL_8250_PCJR_2F8)) dev->clock_src = 1789500.0; else dev->clock_src = 1843200.0; @@ -1039,11 +1044,25 @@ const device_t ns8250_device = { .config = NULL }; -const device_t ns8250_pcjr_device = { - .name = "National Semiconductor 8250(-compatible) UART for PCjr", - .internal_name = "ns8250_pcjr", +const device_t ns8250_pcjr_3f8_device = { + .name = "National Semiconductor 8250(-compatible) UART for PCjr (0x3f8)", + .internal_name = "ns8250_pcjr_3f8", .flags = 0, - .local = SERIAL_8250_PCJR, + .local = SERIAL_8250_PCJR_3F8, + .init = serial_init, + .close = serial_close, + .reset = serial_reset, + .available = NULL, + .speed_changed = serial_speed_changed, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ns8250_pcjr_2f8_device = { + .name = "National Semiconductor 8250(-compatible) UART for PCjr (0x2f8)", + .internal_name = "ns8250_pcjr_2f8", + .flags = 0, + .local = SERIAL_8250_PCJR_2F8, .init = serial_init, .close = serial_close, .reset = serial_reset, diff --git a/src/game/gameport.c b/src/game/gameport.c index 88ff5cc8a..d7ecadec4 100644 --- a/src/game/gameport.c +++ b/src/game/gameport.c @@ -88,27 +88,52 @@ static const joystick_t joystick_none = { static const struct { const joystick_t *joystick; } joysticks[] = { - { &joystick_none }, - { &joystick_2axis_2button }, - { &joystick_2button_gamepad }, - { &joystick_2button_flight_yoke }, - { &joystick_2axis_4button }, - { &joystick_4button_gamepad }, - { &joystick_4button_flight_yoke }, - { &joystick_2axis_6button }, - { &joystick_2axis_8button }, - { &joystick_3axis_2button }, - { &joystick_2button_yoke_throttle }, - { &joystick_3axis_4button }, - { &joystick_steering_wheel_4_button }, - { &joystick_4button_yoke_throttle }, - { &joystick_4axis_4button }, - { &joystick_ch_flightstick_pro }, - { &joystick_ch_flightstick_pro_ch_pedals }, - { &joystick_sw_pad }, - { &joystick_tm_fcs }, - { &joystick_tm_fcs_rcs }, - { NULL } + { &joystick_none }, + { &joystick_generic_paddle }, + { &joystick_2axis_1button }, + { &joystick_2axis_2button }, + { &joystick_2axis_3button }, + { &joystick_2axis_4button }, + { &joystick_2axis_6button }, + { &joystick_2axis_8button }, + { &joystick_3axis_2button }, + { &joystick_3axis_3button }, + { &joystick_3axis_4button }, + { &joystick_4axis_2button }, + { &joystick_4axis_3button }, + { &joystick_4axis_4button }, + { &joystick_2button_gamepad }, + { &joystick_3button_gamepad }, + { &joystick_4button_gamepad }, + { &joystick_6button_gamepad }, + { &joystick_gravis_gamepad }, + { &joystick_2button_flight_yoke }, + { &joystick_3button_flight_yoke }, + { &joystick_4button_flight_yoke }, + { &joystick_2button_yoke_throttle }, + { &joystick_3button_yoke_throttle }, + { &joystick_4button_yoke_throttle }, + { &joystick_steering_wheel_2_button }, + { &joystick_steering_wheel_3_button }, + { &joystick_steering_wheel_4_button }, + { &joystick_ch_flightstick }, + { &joystick_ch_flightstick_ch_pedals }, + { &joystick_ch_flightstick_ch_pedals_pro }, + { &joystick_ch_flightstick_pro }, + { &joystick_ch_flightstick_pro_ch_pedals }, + { &joystick_ch_flightstick_pro_ch_pedals_pro }, + { &joystick_ch_virtual_pilot }, + { &joystick_ch_virtual_pilot_ch_pedals }, + { &joystick_ch_virtual_pilot_ch_pedals_pro }, + { &joystick_ch_virtual_pilot_pro }, + { &joystick_ch_virtual_pilot_pro_ch_pedals }, + { &joystick_ch_virtual_pilot_pro_ch_pedals_pro }, + { &joystick_sw_pad }, + { &joystick_tm_fcs }, + { &joystick_tm_fcs_rcs }, + { &joystick_tm_formula_t1t2 }, + { &joystick_tm_formula_t1t2wa }, + { NULL } }; static joystick_instance_t *joystick_instance[GAMEPORT_MAX] = { NULL, NULL }; diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c index 84dc5a380..dc82feb8b 100644 --- a/src/game/joystick_ch_flightstick_pro.c +++ b/src/game/joystick_ch_flightstick_pro.c @@ -44,18 +44,7 @@ #include <86box/timer.h> #include <86box/gameport.h> #include <86box/plat_unused.h> - -static void * -ch_flightstick_pro_init(void) -{ - return NULL; -} - -static void -ch_flightstick_pro_close(UNUSED(void *priv)) -{ - // -} +#include <86box/joystick.h> static uint8_t ch_flightstick_pro_read(UNUSED(void *priv)) @@ -72,114 +61,299 @@ ch_flightstick_pro_read(UNUSED(void *priv)) ret &= ~0x40; if (joystick_state[gp][0].button[3]) ret &= ~0x80; + // POV Hat if (joystick_state[gp][0].pov[0] != -1) { // POV Up if ((joystick_state[gp][0].pov[0] > 315) || (joystick_state[gp][0].pov[0] < 45)) - ret &= ~0xf0; + ret &= ~0xf0; // 1, 2, 3, 4 // POV Right - else if ((joystick_state[gp][0].pov[0]) >= 45 && (joystick_state[gp][0].pov[0] < 135)) - ret &= ~0xb0; + else if ((joystick_state[gp][0].pov[0] >= 45) && (joystick_state[gp][0].pov[0] < 135)) + ret &= ~0xb0; // 1, 2, 4 // POV Down - else if ((joystick_state[gp][0].pov[0]) >= 135 && (joystick_state[gp][0].pov[0] < 225)) - ret &= ~0x70; + else if ((joystick_state[gp][0].pov[0] >= 135) && (joystick_state[gp][0].pov[0] < 225)) + ret &= ~0x70; // 1, 2, 3 // POV Left - else if ((joystick_state[gp][0].pov[0]) >= 225 && (joystick_state[gp][0].pov[0] < 315)) - ret &= ~0x30; + else if ((joystick_state[gp][0].pov[0] >= 225) && (joystick_state[gp][0].pov[0] < 315)) + ret &= ~0x30; // 1, 2 } } return ret; } -static void -ch_flightstick_pro_write(UNUSED(void *priv)) +static uint8_t +ch_virtual_pilot_pro_read(UNUSED(void *priv)) { - // -} + uint8_t gp = 0; + uint8_t ret = 0xf0; -static int -ch_flightstick_pro_read_axis(UNUSED(void *priv), int axis) -{ - uint8_t gp = 0; + if (JOYSTICK_PRESENT(gp, 0)) { + if (joystick_state[gp][0].button[0]) // 1 + ret &= ~0x10; + if (joystick_state[gp][0].button[1]) // 2 + ret &= ~0x20; + if (joystick_state[gp][0].button[2]) // 3 + ret &= ~0x40; + if (joystick_state[gp][0].button[3]) // 4 + ret &= ~0x80; + if (joystick_state[gp][0].button[4]) // 1, 3 + ret &= ~0x50; + if (joystick_state[gp][0].button[5]) // 1, 4 + ret &= ~0x90; - if (!JOYSTICK_PRESENT(gp, 0)) - return AXIS_NOT_PRESENT; + // Right POV Hat + uint8_t pov_id = 0; - switch (axis) { - case 0: - return joystick_state[gp][0].axis[0]; - case 1: - return joystick_state[gp][0].axis[1]; - case 2: - return 0; - case 3: - return joystick_state[gp][0].axis[2]; - default: - return 0; + if (joystick_state[gp][0].pov[pov_id] != -1) { + // POV Up + if ((joystick_state[gp][0].pov[pov_id] > 315) || (joystick_state[gp][0].pov[pov_id] < 45)) + ret &= ~0xf0; // 1, 2, 3, 4 + // POV Right + else if ((joystick_state[gp][0].pov[pov_id] >= 45) && (joystick_state[gp][0].pov[pov_id] < 135)) + ret &= ~0xb0; // 1, 2, 4 + // POV Down + else if ((joystick_state[gp][0].pov[pov_id] >= 135) && (joystick_state[gp][0].pov[pov_id] < 225)) + ret &= ~0x70; // 1, 2, 3 + // POV Left + else if ((joystick_state[gp][0].pov[pov_id] >= 225) && (joystick_state[gp][0].pov[pov_id] < 315)) + ret &= ~0x30; // 1, 2 + } + + // Left POV Hat + pov_id = 1; + + if (joystick_state[gp][0].pov[pov_id] != -1) { + // POV Up + if ((joystick_state[gp][0].pov[pov_id] > 315) || (joystick_state[gp][0].pov[pov_id] < 45)) + ret &= ~0xe0; // 2, 3, 4 + // POV Right + else if ((joystick_state[gp][0].pov[pov_id] >= 45) && (joystick_state[gp][0].pov[pov_id] < 135)) + ret &= ~0xa0; // 2, 4 + // POV Down + else if ((joystick_state[gp][0].pov[pov_id] >= 135) && (joystick_state[gp][0].pov[pov_id] < 225)) + ret &= ~0x60; // 2, 3 + // POV Left + else if ((joystick_state[gp][0].pov[pov_id] >= 225) && (joystick_state[gp][0].pov[pov_id] < 315)) + ret &= ~0xc0; // 3, 4 + } } + + return ret; } -static int -ch_flightstick_pro_ch_pedals_read_axis(UNUSED(void *priv), int axis) -{ - uint8_t gp = 0; +const joystick_t joystick_ch_flightstick = { + .name = "CH Flightstick", + .internal_name = "ch_flightstick", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, + .button_names = { "Trigger", "Button 2" }, + .pov_names = { NULL } +}; - if (!JOYSTICK_PRESENT(gp, 0)) - return AXIS_NOT_PRESENT; +const joystick_t joystick_ch_flightstick_ch_pedals = { + .name = "CH Flightstick + CH Pedals", + .internal_name = "ch_flightstick_ch_pedals", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .button_names = { "Trigger", "Button 2" }, + .pov_names = { NULL } +}; - switch (axis) { - case 0: - return joystick_state[gp][0].axis[0]; - case 1: - return joystick_state[gp][0].axis[1]; - case 2: - return joystick_state[gp][0].axis[3]; - case 3: - return joystick_state[gp][0].axis[2]; - default: - return 0; - } -} - -static void -ch_flightstick_pro_a0_over(UNUSED(void *priv)) -{ - // -} +const joystick_t joystick_ch_flightstick_ch_pedals_pro = { + .name = "CH Flightstick + CH Pedals Pro", + .internal_name = "ch_flightstick_ch_pedals_pro", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Left Pedal", "Right Pedal" }, + .button_names = { "Trigger", "Button 2" }, + .pov_names = { NULL } +}; const joystick_t joystick_ch_flightstick_pro = { .name = "CH Flightstick Pro", .internal_name = "ch_flightstick_pro", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, + .init = joystick_standard_init, + .close = joystick_standard_close, .read = ch_flightstick_pro_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 4, .pov_count = 1, .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Throttle" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; const joystick_t joystick_ch_flightstick_pro_ch_pedals = { .name = "CH Flightstick Pro + CH Pedals", .internal_name = "ch_flightstick_pro_ch_pedals", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, + .init = joystick_standard_init, + .close = joystick_standard_close, .read = ch_flightstick_pro_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 4, .pov_count = 1, .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Throttle", "Rudder" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; + +const joystick_t joystick_ch_flightstick_pro_ch_pedals_pro = { + .name = "CH Flightstick Pro + CH Pedals Pro", + .internal_name = "ch_flightstick_pro_ch_pedals_pro", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = ch_flightstick_pro_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 4, + .pov_count = 1, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Left Pedal", "Right Pedal" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, + .pov_names = { "POV" } +}; + +const joystick_t joystick_ch_virtual_pilot = { + .name = "CH Virtual Pilot", + .internal_name = "ch_virtual_pilot", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_ch_virtual_pilot_ch_pedals = { + .name = "CH Virtual Pilot + CH Pedals", + .internal_name = "ch_virtual_pilot_ch_pedals", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_ch_virtual_pilot_ch_pedals_pro = { + .name = "CH Virtual Pilot + CH Pedals Pro", + .internal_name = "ch_virtual_pilot_ch_pedals_pro", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Left Pedal", "Right Pedal" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_ch_virtual_pilot_pro = { + .name = "CH Virtual Pilot Pro", + .internal_name = "ch_virtual_pilot_pro", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = ch_virtual_pilot_pro_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 6, + .pov_count = 2, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, + .pov_names = { "Right POV", "Left POV" } +}; + +const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals = { + .name = "CH Virtual Pilot Pro + CH Pedals", + .internal_name = "ch_virtual_pilot_pro_ch_pedals", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = ch_virtual_pilot_pro_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 6, + .pov_count = 2, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, + .pov_names = { "Right POV", "Left POV" } +}; + +const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals_pro = { + .name = "CH Virtual Pilot Pro + CH Pedals Pro", + .internal_name = "ch_virtual_pilot_pro_ch_pedals_pro", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = ch_virtual_pilot_pro_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 6, + .pov_count = 2, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Left Pedal", "Right Pedal" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, + .pov_names = { "Right POV", "Left POV" } +}; diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index 60ea4b57d..a9e3da402 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -45,18 +45,39 @@ #include <86box/gameport.h> #include <86box/plat_unused.h> -static void * +void * joystick_standard_init(void) { return NULL; } -static void +void joystick_standard_close(UNUSED(void *priv)) { // } +static uint8_t +joystick_paddle_read(UNUSED(void *priv)) +{ + uint8_t gp = 0; + uint8_t ret = 0xf0; + + if ((JOYSTICK_PRESENT(gp, 0)) && (joystick_state[gp][0].button[0])) + ret &= ~0x10; + + if ((JOYSTICK_PRESENT(gp, 2)) && (joystick_state[gp][2].button[0])) + ret &= ~0x20; + + if ((JOYSTICK_PRESENT(gp, 1)) && (joystick_state[gp][1].button[0])) + ret &= ~0x40; + + if ((JOYSTICK_PRESENT(gp, 3)) && (joystick_state[gp][3].button[0])) + ret &= ~0x80; + + return ret; +} + static uint8_t joystick_standard_read(UNUSED(void *priv)) { @@ -80,7 +101,41 @@ joystick_standard_read(UNUSED(void *priv)) return ret; } +uint8_t +joystick_standard_read_2button(UNUSED(void *priv)) +{ + uint8_t gp = 0; + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(gp, 0)) { + if (joystick_state[gp][0].button[0]) + ret &= ~0x10; + if (joystick_state[gp][0].button[1]) + ret &= ~0x20; + } + + return ret; +} + static uint8_t +joystick_standard_read_3button(UNUSED(void *priv)) +{ + uint8_t gp = 0; + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(gp, 0)) { + if (joystick_state[gp][0].button[0]) + ret &= ~0x10; + if (joystick_state[gp][0].button[1]) + ret &= ~0x20; + if (joystick_state[gp][0].button[2]) + ret &= ~0x40; + } + + return ret; +} + +uint8_t joystick_standard_read_4button(UNUSED(void *priv)) { uint8_t gp = 0; @@ -100,12 +155,39 @@ joystick_standard_read_4button(UNUSED(void *priv)) return ret; } -static void +void joystick_standard_write(UNUSED(void *priv)) { // } +static int +joystick_paddle_read_axis(UNUSED(void *priv), int axis) +{ + uint8_t gp = 0; + + switch (axis) { + case 0: + if (!JOYSTICK_PRESENT(gp, 0)) + return AXIS_NOT_PRESENT; + return joystick_state[gp][0].axis[0]; + case 1: + if (!JOYSTICK_PRESENT(gp, 2)) + return AXIS_NOT_PRESENT; + return joystick_state[gp][2].axis[0]; + case 2: + if (!JOYSTICK_PRESENT(gp, 1)) + return AXIS_NOT_PRESENT; + return joystick_state[gp][1].axis[0]; + case 3: + if (!JOYSTICK_PRESENT(gp, 3)) + return AXIS_NOT_PRESENT; + return joystick_state[gp][3].axis[0]; + default: + return 0; + } +} + static int joystick_standard_read_axis(UNUSED(void *priv), int axis) { @@ -134,7 +216,7 @@ joystick_standard_read_axis(UNUSED(void *priv), int axis) } static int -joystick_standard_read_axis_4button(UNUSED(void *priv), int axis) +joystick_standard_read_axis_2axis(UNUSED(void *priv), int axis) { uint8_t gp = 0; @@ -168,7 +250,7 @@ joystick_standard_read_axis_with_pov(UNUSED(void *priv), int axis) return joystick_state[gp][0].axis[0]; case 1: // Y-axis return joystick_state[gp][0].axis[1]; - case 2: // POV Hat (mapped to the 3rd logical axis, index 2) + case 2: // POV Hat if (joystick_state[gp][0].pov[0] == -1) return 32767; // Centered/No input (as per tm_fcs_rcs_read_axis example) if (joystick_state[gp][0].pov[0] > 315 || joystick_state[gp][0].pov[0] < 45) @@ -179,9 +261,8 @@ joystick_standard_read_axis_with_pov(UNUSED(void *priv), int axis) return 0; // Right/Left (example, matches tm_fcs_rcs_read_axis) if (joystick_state[gp][0].pov[0] >= 225 && joystick_state[gp][0].pov[0] < 315) return 16384; // Down-Left (example value, matches tm_fcs_rcs_read_axis) - return 0; // Fallback - case 3: // This case might be used for a Z-axis if present, or can return 0 if not. - // For gamepads with only X/Y and POV, this will likely be unused or return 0. + return 0; + case 3: return 0; default: return 0; @@ -202,15 +283,36 @@ joystick_standard_read_axis_3axis(UNUSED(void *priv), int axis) return joystick_state[gp][0].axis[0]; case 1: return joystick_state[gp][0].axis[1]; - case 2: + case 2: // Rudder Axis return joystick_state[gp][0].axis[2]; - case 3: + case 3: // Throttle Axis default: return 0; } } -static int +int +joystick_standard_read_axis_3axis_throttle(UNUSED(void *priv), int axis) +{ + uint8_t gp = 0; + + if (!JOYSTICK_PRESENT(gp, 0)) + return AXIS_NOT_PRESENT; + + switch (axis) { + case 0: + return joystick_state[gp][0].axis[0]; + case 1: + return joystick_state[gp][0].axis[1]; + case 3: // Throttle Axis + return joystick_state[gp][0].axis[2]; + case 2: // Rudder Axis + default: + return 0; + } +} + +int joystick_standard_read_axis_4axis(UNUSED(void *priv), int axis) { uint8_t gp = 0; @@ -223,10 +325,10 @@ joystick_standard_read_axis_4axis(UNUSED(void *priv), int axis) return joystick_state[gp][0].axis[0]; case 1: return joystick_state[gp][0].axis[1]; - case 2: - return joystick_state[gp][0].axis[2]; - case 3: + case 2: // Rudder Axis return joystick_state[gp][0].axis[3]; + case 3: // Throttle Axis + return joystick_state[gp][0].axis[2]; default: return 0; } @@ -283,12 +385,48 @@ joystick_standard_read_axis_8button(UNUSED(void *priv), int axis) } } -static void +void joystick_standard_a0_over(UNUSED(void *priv)) { // } +const joystick_t joystick_generic_paddle = { + .name = "Generic Paddle Controller(s)", + .internal_name = "generic_paddle", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_paddle_read, + .write = joystick_standard_write, + .read_axis = joystick_paddle_read_axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 1, + .button_count = 1, + .pov_count = 0, + .max_joysticks = 4, + .axis_names = { "X axis" }, + .button_names = { "Button 1" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_2axis_1button = { + .name = "2-axis, 1-button joystick(s)", + .internal_name = "2axis_1button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 1, + .pov_count = 0, + .max_joysticks = 2, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1" }, + .pov_names = { NULL } +}; + const joystick_t joystick_2axis_2button = { .name = "2-axis, 2-button joystick(s)", .internal_name = "2axis_2button", @@ -307,39 +445,21 @@ const joystick_t joystick_2axis_2button = { .pov_names = { NULL } }; -const joystick_t joystick_2button_gamepad = { - .name = "2-button gamepad(s)", - .internal_name = "2button_gamepad", +const joystick_t joystick_2axis_3button = { + .name = "2-axis, 3-button joystick", + .internal_name = "2axis_3button", .init = joystick_standard_init, .close = joystick_standard_close, - .read = joystick_standard_read, + .read = joystick_standard_read_3button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis, + .read_axis = joystick_standard_read_axis_2axis, .a0_over = joystick_standard_a0_over, .axis_count = 2, - .button_count = 2, + .button_count = 3, .pov_count = 0, - .max_joysticks = 2, + .max_joysticks = 1, .axis_names = { "X axis", "Y axis" }, - .button_names = { "Button 1", "Button 2" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_2button_flight_yoke = { - .name = "2-button flight yoke", - .internal_name = "2button_flight_yoke", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 2, - .button_count = 2, - .pov_count = 0, - .max_joysticks = 2, - .axis_names = { "Roll axis", "Pitch axis" }, - .button_names = { "Trigger", "Button 2" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, .pov_names = { NULL } }; @@ -350,7 +470,7 @@ const joystick_t joystick_2axis_4button = { .close = joystick_standard_close, .read = joystick_standard_read_4button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_4button, + .read_axis = joystick_standard_read_axis_2axis, .a0_over = joystick_standard_a0_over, .axis_count = 2, .button_count = 4, @@ -361,150 +481,6 @@ const joystick_t joystick_2axis_4button = { .pov_names = { NULL } }; -const joystick_t joystick_4button_gamepad = { - .name = "4-button gamepad", - .internal_name = "4button_gamepad", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_4button, - .a0_over = joystick_standard_a0_over, - .axis_count = 2, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "X axis", "Y axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_4button_flight_yoke = { - .name = "4-button flight yoke", - .internal_name = "4button_flight_yoke", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_4button, - .a0_over = joystick_standard_a0_over, - .axis_count = 2, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "Roll axis", "Pitch axis" }, - .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_3axis_2button = { - .name = "3-axis, 2-button joystick", - .internal_name = "3axis_2button", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 2, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Z axis" }, - .button_names = { "Button 1", "Button 2" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_2button_yoke_throttle = { - .name = "2-button flight yoke with throttle", - .internal_name = "2button_yoke_throttle", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 2, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, - .button_names = { "Trigger", "Button 2" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_3axis_4button = { - .name = "3-axis, 4-button joystick", - .internal_name = "3axis_4button", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Z axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_4button_yoke_throttle = { - .name = "4-button flight yoke with throttle", - .internal_name = "4button_yoke_throttle", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_steering_wheel_4_button = { - .name = "Steering Wheel (3-axis, 4-button)", - .internal_name = "steering_wheel_4_button", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_4axis_4button = { - .name = "4-axis, 4-button joystick", - .internal_name = "4axis_4button", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_4axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 4, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - const joystick_t joystick_2axis_6button = { .name = "2-axis, 6-button joystick", .internal_name = "2axis_6button", @@ -540,3 +516,401 @@ const joystick_t joystick_2axis_8button = { .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6", "Button 7", "Button 8" }, .pov_names = { NULL } }; + +const joystick_t joystick_3axis_2button = { + .name = "3-axis, 2-button joystick", + .internal_name = "3axis_2button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3axis_3button = { + .name = "3-axis, 3-button joystick", + .internal_name = "3axis_3button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3axis_4button = { + .name = "3-axis, 4-button joystick", + .internal_name = "3axis_4button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4axis_2button = { + .name = "4-axis, 2-button joystick", + .internal_name = "4axis_2button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4axis_3button = { + .name = "4-axis, 3-button joystick", + .internal_name = "4axis_3button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4axis_4button = { + .name = "4-axis, 4-button joystick", + .internal_name = "4axis_4button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_2button_gamepad = { + .name = "2-button gamepad(s)", + .internal_name = "2button_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 2, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3button_gamepad = { + .name = "3-button gamepad", + .internal_name = "3button_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4button_gamepad = { + .name = "4-button gamepad", + .internal_name = "4button_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_6button_gamepad = { + .name = "6-button gamepad", + .internal_name = "6button_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_6button, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 6, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_gravis_gamepad = { + .name = "Gravis PC GamePad", + .internal_name = "gravis_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis" }, + // TODO: Check this + .button_names = { "Button 1 (Red)", "Button 2 (Blue)", "Button 3 (Yellow)", "Button 4 (Green)" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_2button_flight_yoke = { + .name = "2-button flight yoke", + .internal_name = "2button_flight_yoke", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 2, + .axis_names = { "Roll axis", "Pitch axis" }, + .button_names = { "Trigger", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3button_flight_yoke = { + .name = "3-button flight yoke", + .internal_name = "3button_flight_yoke", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis" }, + .button_names = { "Trigger", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4button_flight_yoke = { + .name = "4-button flight yoke", + .internal_name = "4button_flight_yoke", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_2button_yoke_throttle = { + .name = "2-button flight yoke with throttle", + .internal_name = "2button_yoke_throttle", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, + .button_names = { "Trigger", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3button_yoke_throttle = { + .name = "3-button flight yoke with throttle", + .internal_name = "3button_yoke_throttle", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, + .button_names = { "Trigger", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4button_yoke_throttle = { + .name = "4-button flight yoke with throttle", + .internal_name = "4button_yoke_throttle", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_steering_wheel_2_button = { + .name = "Steering Wheel (3-axis, 2-button)", + .internal_name = "steering_wheel_2_button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_steering_wheel_3_button = { + .name = "Steering Wheel (3-axis, 3-button)", + .internal_name = "steering_wheel_3_button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_steering_wheel_4_button = { + .name = "Steering Wheel (3-axis, 4-button)", + .internal_name = "steering_wheel_4_button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_tm_formula_t1t2 = { + .name = "Thrustmaster Formula T1/T2 with Adaptor", + .internal_name = "thrustmaster_formula_t1t2", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator/Brake axis" }, + .button_names = { "Shifter Up", "Shifter Down", "Top Console Switch", "Bottom Console Switch" }, + .pov_names = { NULL } +}; + +// TODO Validate this +const joystick_t joystick_tm_formula_t1t2wa = { + .name = "Thrustmaster Formula T1/T2 without Adaptor", + .internal_name = "thrustmaster_formula_t1t2wa", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .button_names = { "Shifter Up", "Shifter Down", "Top Console Switch", "Bottom Console Switch" }, + .pov_names = { NULL } +}; diff --git a/src/game/joystick_tm_fcs.c b/src/game/joystick_tm_fcs.c index c8368612d..1f420ef0c 100644 --- a/src/game/joystick_tm_fcs.c +++ b/src/game/joystick_tm_fcs.c @@ -44,44 +44,7 @@ #include <86box/timer.h> #include <86box/gameport.h> #include <86box/plat_unused.h> - -static void * -tm_fcs_init(void) -{ - return NULL; -} - -static void -tm_fcs_close(UNUSED(void *priv)) -{ - // -} - -static uint8_t -tm_fcs_read(UNUSED(void *priv)) -{ - uint8_t gp = 0; - uint8_t ret = 0xf0; - - if (JOYSTICK_PRESENT(gp, 0)) { - if (joystick_state[gp][0].button[0]) - ret &= ~0x10; - if (joystick_state[gp][0].button[1]) - ret &= ~0x20; - if (joystick_state[gp][0].button[2]) - ret &= ~0x40; - if (joystick_state[gp][0].button[3]) - ret &= ~0x80; - } - - return ret; -} - -static void -tm_fcs_write(UNUSED(void *priv)) -{ - // -} +#include <86box/joystick.h> static int tm_fcs_read_axis(UNUSED(void *priv), int axis) @@ -96,8 +59,6 @@ tm_fcs_read_axis(UNUSED(void *priv), int axis) return joystick_state[gp][0].axis[0]; case 1: return joystick_state[gp][0].axis[1]; - case 2: - return 0; case 3: if (joystick_state[gp][0].pov[0] == -1) return 32767; @@ -110,6 +71,7 @@ tm_fcs_read_axis(UNUSED(void *priv), int axis) if (joystick_state[gp][0].pov[0] >= 225 && joystick_state[gp][0].pov[0] < 315) return 16384; return 0; + case 2: default: return 0; } @@ -147,44 +109,38 @@ tm_fcs_rcs_read_axis(UNUSED(void *priv), int axis) } } -static void -tm_fcs_a0_over(UNUSED(void *priv)) -{ - // -} - const joystick_t joystick_tm_fcs = { .name = "Thrustmaster Flight Control System", .internal_name = "thrustmaster_fcs", - .init = tm_fcs_init, - .close = tm_fcs_close, - .read = tm_fcs_read, - .write = tm_fcs_write, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, .read_axis = tm_fcs_read_axis, - .a0_over = tm_fcs_a0_over, + .a0_over = joystick_standard_a0_over, .axis_count = 2, .button_count = 4, .pov_count = 1, .max_joysticks = 1, .axis_names = { "X axis", "Y axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; const joystick_t joystick_tm_fcs_rcs = { .name = "Thrustmaster FCS + Rudder Control System", .internal_name = "thrustmaster_fcs_rcs", - .init = tm_fcs_init, - .close = tm_fcs_close, - .read = tm_fcs_read, - .write = tm_fcs_write, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, .read_axis = tm_fcs_rcs_read_axis, - .a0_over = tm_fcs_a0_over, + .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 4, .pov_count = 1, .max_joysticks = 1, .axis_names = { "X axis", "Y axis", "Rudder" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; diff --git a/src/include/86box/gameport.h b/src/include/86box/gameport.h index 1b86c0567..a1bec69fb 100644 --- a/src/include/86box/gameport.h +++ b/src/include/86box/gameport.h @@ -172,29 +172,73 @@ extern void gameport_update_joystick_type(uint8_t gp); extern void gameport_remap(void *priv, uint16_t address); extern void *gameport_add(const device_t *gameport_type); +// Paddle Controllers +extern const joystick_t joystick_generic_paddle; + +// 2 axis Generic Joysticks +extern const joystick_t joystick_2axis_1button; extern const joystick_t joystick_2axis_2button; -extern const joystick_t joystick_2button_gamepad; -extern const joystick_t joystick_2button_flight_yoke; +extern const joystick_t joystick_2axis_3button; extern const joystick_t joystick_2axis_4button; -extern const joystick_t joystick_4button_gamepad; -extern const joystick_t joystick_4button_flight_yoke; -extern const joystick_t joystick_3axis_2button; -extern const joystick_t joystick_2button_yoke_throttle; -extern const joystick_t joystick_3axis_4button; -extern const joystick_t joystick_4button_yoke_throttle; -extern const joystick_t joystick_steering_wheel_4_button; -extern const joystick_t joystick_4axis_4button; extern const joystick_t joystick_2axis_6button; extern const joystick_t joystick_2axis_8button; +// 3 axis Generic Joysticks +extern const joystick_t joystick_3axis_2button; +extern const joystick_t joystick_3axis_3button; +extern const joystick_t joystick_3axis_4button; + +// 4 axis Generic Joysticks +extern const joystick_t joystick_4axis_2button; +extern const joystick_t joystick_4axis_3button; +extern const joystick_t joystick_4axis_4button; + +// Generic Gamepads +extern const joystick_t joystick_2button_gamepad; +extern const joystick_t joystick_3button_gamepad; +extern const joystick_t joystick_4button_gamepad; +extern const joystick_t joystick_6button_gamepad; + +extern const joystick_t joystick_gravis_gamepad; + +// Generic Steering Wheels +extern const joystick_t joystick_steering_wheel_2_button; +extern const joystick_t joystick_steering_wheel_3_button; +extern const joystick_t joystick_steering_wheel_4_button; + +// Generic Flight Yokes +extern const joystick_t joystick_2button_flight_yoke; +extern const joystick_t joystick_4button_flight_yoke; +extern const joystick_t joystick_3button_flight_yoke; + +extern const joystick_t joystick_2button_yoke_throttle; +extern const joystick_t joystick_3button_yoke_throttle; +extern const joystick_t joystick_4button_yoke_throttle; + +extern const joystick_t joystick_ch_flightstick; +extern const joystick_t joystick_ch_flightstick_ch_pedals; +extern const joystick_t joystick_ch_flightstick_ch_pedals_pro; + extern const joystick_t joystick_ch_flightstick_pro; extern const joystick_t joystick_ch_flightstick_pro_ch_pedals; +extern const joystick_t joystick_ch_flightstick_pro_ch_pedals_pro; + +extern const joystick_t joystick_ch_virtual_pilot; +extern const joystick_t joystick_ch_virtual_pilot_ch_pedals; +extern const joystick_t joystick_ch_virtual_pilot_ch_pedals_pro; + +extern const joystick_t joystick_ch_virtual_pilot_pro; +extern const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals; +extern const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals_pro; extern const joystick_t joystick_sw_pad; extern const joystick_t joystick_tm_fcs; extern const joystick_t joystick_tm_fcs_rcs; +extern const joystick_t joystick_tm_formula_t1t2; +extern const joystick_t joystick_tm_formula_t1t2wa; + #ifdef __cplusplus } #endif diff --git a/src/include/86box/joystick.h b/src/include/86box/joystick.h new file mode 100644 index 000000000..c8cbf32d1 --- /dev/null +++ b/src/include/86box/joystick.h @@ -0,0 +1,27 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Definitions for the analog joystick handlers. + * + * Authors: Jasmine Iwanek, + * + * Copyright 2025 Jasmine Iwanek. + */ +#ifndef EMU_JOYSTICK_H +#define EMU_JOYSTICK_H + +void *joystick_standard_init(void); +void joystick_standard_close(UNUSED(void *priv)); +uint8_t joystick_standard_read_2button(UNUSED(void *priv)); +uint8_t joystick_standard_read_4button(UNUSED(void *priv)); +void joystick_standard_write(UNUSED(void *priv)); +int joystick_standard_read_axis_3axis_throttle(UNUSED(void *priv), int axis); +int joystick_standard_read_axis_4axis(UNUSED(void *priv), int axis); +void joystick_standard_a0_over(UNUSED(void *priv)); + +#endif /*EMU_JOYSTICK_H*/ diff --git a/src/include/86box/m_pcjr.h b/src/include/86box/m_pcjr.h index 6fb0ee2ed..f1a31954d 100644 --- a/src/include/86box/m_pcjr.h +++ b/src/include/86box/m_pcjr.h @@ -66,6 +66,11 @@ typedef struct pcjr_s { int serial_pos; uint8_t pa; uint8_t pb; + + uint8_t option_modem; + uint8_t option_fdc; + uint8_t option_ir; + pc_timer_t send_delay_timer; } pcjr_t; diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index ee8b7eafc..8cc928f91 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -635,6 +635,9 @@ extern int machine_at_tandy4000_init(const machine_t *); extern int machine_at_ecs386v_init(const machine_t *); /* OPTi 391 */ +#ifdef EMU_DEVICE_H +extern const device_t dataexpert386wb_device; +#endif extern int machine_at_dataexpert386wb_init(const machine_t *); /* OPTi 495SLC */ @@ -866,6 +869,9 @@ extern const device_t v12p_device; #endif extern int machine_at_v12p_init(const machine_t *); extern int machine_at_excaliburpci_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t p5mp3_device; +#endif extern int machine_at_p5mp3_init(const machine_t *); extern int machine_at_opti560l_init(const machine_t *); extern void machine_at_award_common_init(const machine_t *); @@ -916,6 +922,9 @@ extern int machine_at_tek932_init(const machine_t *); extern int machine_at_acerv30_init(const machine_t *); extern int machine_at_apollo_init(const machine_t *); extern int machine_at_optiplexgxl_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t pt2000_device; +#endif extern int machine_at_pt2000_init(const machine_t *); extern int machine_at_pc330_65x6_init(const machine_t *); #ifdef EMU_DEVICE_H @@ -961,6 +970,11 @@ extern const device_t p54tp4xe_device; #endif extern int machine_at_p54tp4xe_init(const machine_t *); extern int machine_at_exp8551_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t hpvectravexxx_device; +#endif +extern int machine_at_hpvectravexxx_init(const machine_t *); +extern int machine_at_vectra500mt_init(const machine_t *); extern int machine_at_vectra54_init(const machine_t *); #ifdef EMU_DEVICE_H extern const device_t thor_device; @@ -975,9 +989,15 @@ extern int machine_at_atlantis_init(const machine_t *); extern const device_t monaco_device; #endif extern int machine_at_monaco_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t ms5119_device; +#endif extern int machine_at_ms5119_init(const machine_t *); extern int machine_at_pb640_init(const machine_t *); extern int machine_at_mb500n_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t fmb_device; +#endif extern int machine_at_fmb_init(const machine_t *); /* i430HX */ @@ -1042,6 +1062,9 @@ extern int machine_at_8500tvxa_init(const machine_t *); extern int machine_at_presario2240_init(const machine_t *); extern int machine_at_presario4500_init(const machine_t *); extern int machine_at_dellhannibalp_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t p5vxb_device; +#endif extern int machine_at_p5vxb_init(const machine_t *); extern int machine_at_p55va_init(const machine_t *); extern int machine_at_gw2kte_init(const machine_t *); @@ -1116,6 +1139,9 @@ extern int machine_at_g5x_init(const machine_t *); /* VIA MVP3 */ extern int machine_at_ax59pro_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t delhi3_device; +#endif extern int machine_at_delhi3_init(const machine_t *); extern int machine_at_mvp3_init(const machine_t *); extern int machine_at_ficva503a_init(const machine_t *); @@ -1139,6 +1165,7 @@ extern int machine_at_acerv60n_init(const machine_t *); extern int machine_at_p65up5_cp6nd_init(const machine_t *); extern int machine_at_8600ttc_init(const machine_t *); extern int machine_at_686nx_init(const machine_t *); +extern uint32_t machine_ap440fx_vs440fx_gpio_handler(uint8_t write, uint32_t val); extern int machine_at_ap440fx_init(const machine_t *); #ifdef EMU_DEVICE_H extern const device_t vs440fx_device; @@ -1175,6 +1202,9 @@ extern int machine_at_bf6_init(const machine_t *); extern const device_t bx6_device; #endif extern int machine_at_bx6_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t ax6bc_device; +#endif extern int machine_at_ax6bc_init(const machine_t *); extern int machine_at_p2bls_init(const machine_t *); extern int machine_at_p3bf_init(const machine_t *); @@ -1191,9 +1221,15 @@ extern const device_t ms6147_device; #endif extern int machine_at_ms6147_init(const machine_t *); extern int machine_at_p6sba_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t s1846_device; +#endif extern int machine_at_s1846_init(const machine_t *); /* i440ZX */ +#ifdef EMU_DEVICE_H +extern const device_t vei8_device; +#endif extern int machine_at_vei8_init(const machine_t *); extern int machine_at_ms6168_init(const machine_t *); extern int machine_at_borapro_init(const machine_t *); @@ -1221,6 +1257,9 @@ extern int machine_at_fw6400gx_init(const machine_t *); /* m_at_slot1_socket370.c */ /* i440BX */ +#ifdef EMU_DEVICE_H +extern const device_t prosignias31x_device; +#endif extern int machine_at_prosignias31x_bx_init(const machine_t *); extern int machine_at_s1857_init(const machine_t *); diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index 5231c491a..816672825 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -20,14 +20,15 @@ #ifndef EMU_SERIAL_H #define EMU_SERIAL_H -#define SERIAL_8250 0 -#define SERIAL_8250_PCJR 1 -#define SERIAL_16450 2 -#define SERIAL_16550 3 -#define SERIAL_16650 4 -#define SERIAL_16750 5 -#define SERIAL_16850 6 -#define SERIAL_16950 7 +#define SERIAL_8250 0 +#define SERIAL_8250_PCJR_3F8 1 +#define SERIAL_8250_PCJR_2F8 2 +#define SERIAL_16450 3 +#define SERIAL_16550 4 +#define SERIAL_16650 5 +#define SERIAL_16750 6 +#define SERIAL_16850 7 +#define SERIAL_16950 8 #define SERIAL_FIFO_SIZE 16 @@ -151,7 +152,8 @@ extern int serial_get_ri(serial_t *dev); extern uint8_t serial_get_shadow(serial_t *dev); extern const device_t ns8250_device; -extern const device_t ns8250_pcjr_device; +extern const device_t ns8250_pcjr_3f8_device; +extern const device_t ns8250_pcjr_2f8_device; extern const device_t ns16450_device; extern const device_t ns16550_device; extern const device_t ns16650_device; diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 61a5697d5..e0ae5ed6f 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -474,6 +474,7 @@ extern uint8_t sc1502x_rs2_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t extern void sdac_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *svga); extern uint8_t sdac_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga); extern float sdac_getclock(int clock, void *priv); +extern void sdac_set_ref_clock(void *priv, float ref_clock); extern void stg_ramdac_out(uint16_t addr, uint8_t val, void *priv, svga_t *svga); extern uint8_t stg_ramdac_in(uint16_t addr, void *priv, svga_t *svga); @@ -507,6 +508,7 @@ extern const device_t bt485a_ramdac_device; extern const device_t gendac_ramdac_device; extern const device_t ibm_rgb528_ramdac_device; extern const device_t ics2494an_305_device; +extern const device_t ics2494an_324_device; extern const device_t ati18810_28800_device; extern const device_t ati18811_0_28800_device; extern const device_t ati18811_1_28800_device; @@ -523,7 +525,8 @@ extern const device_t sc11484_nors2_ramdac_device; extern const device_t sc1502x_ramdac_device; extern const device_t sc1502x_rs2_ramdac_device; extern const device_t sdac_ramdac_device; -extern const device_t stg_ramdac_device; +extern const device_t stg1702_ramdac_device; +extern const device_t stg1703_ramdac_device; extern const device_t tkd8001_ramdac_device; extern const device_t tseng_ics5301_ramdac_device; extern const device_t tseng_ics5341_ramdac_device; diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 840b95249..acaf7cdc4 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -436,20 +436,20 @@ extern const device_t et4000_kasan_isa_device; extern const device_t et4000_mca_device; /* Tseng ET4000-W32x */ -extern const device_t et4000w32_device; +extern const device_t et4000w32_machspeed_vga_gui_2400s_isa_device; +extern const device_t et4000w32_machspeed_vga_gui_2400s_vlb_device; extern const device_t et4000w32_onboard_device; -extern const device_t et4000w32i_isa_device; -extern const device_t et4000w32i_vlb_device; +extern const device_t et4000w32i_axis_microdevice_isa_device; +extern const device_t et4000w32i_hercules_dynamite_pro_vlb_device; extern const device_t et4000w32p_videomagic_revb_vlb_device; -extern const device_t et4000w32p_videomagic_revb_pci_device; -extern const device_t et4000w32p_revc_vlb_device; -extern const device_t et4000w32p_revc_pci_device; -extern const device_t et4000w32p_vlb_device; -extern const device_t et4000w32p_pci_device; -extern const device_t et4000w32p_noncardex_vlb_device; -extern const device_t et4000w32p_noncardex_pci_device; -extern const device_t et4000w32p_cardex_vlb_device; -extern const device_t et4000w32p_cardex_pci_device; +extern const device_t et4000w32p_cardex_revc_vlb_device; +extern const device_t et4000w32p_cardex_revc_pci_device; +extern const device_t et4000w32p_cardex_revd_vlb_device; +extern const device_t et4000w32p_cardex_revd_pci_device; +extern const device_t et4000w32p_diamond_revd_vlb_device; +extern const device_t et4000w32p_diamond_revd_pci_device; +extern const device_t et4000w32p_generic_revd_vlb_device; +extern const device_t et4000w32p_generic_revd_pci_device; /* MDSI Genius VHR */ extern const device_t genius_device; diff --git a/src/machine/m_at_286.c b/src/machine/m_at_286.c index 20baec312..357a0f872 100644 --- a/src/machine/m_at_286.c +++ b/src/machine/m_at_286.c @@ -367,7 +367,26 @@ static const device_config_t pc900_config[] = { .local = 0, .size = 32768, .files = { "roms/machines/pc900/cbm_pc40_v207a_xc.bin", "" } - } + }, + { + .name = "BIOS V2.07B", + .internal_name = "pc900_v207b", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 32768, + .files = { "roms/machines/pc900/mpf_pc900_v207b.bin", "" } + }, + { + .name = "BIOS V3.01B", + .internal_name = "pc900_v301b", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 32768, + .files = { "roms/machines/pc900/cbm_pc40_v301b.bin", "" } + }, + { .files_no = 0 } }, }, { .name = "", .description = "", .type = CONFIG_END } diff --git a/src/machine/m_at_386dx.c b/src/machine/m_at_386dx.c index 5816204ed..3070c19c1 100644 --- a/src/machine/m_at_386dx.c +++ b/src/machine/m_at_386dx.c @@ -332,17 +332,71 @@ machine_at_ecs386v_init(const machine_t *model) } /* OPTi 391 */ +static const device_config_t dataexpert386wb_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "dataexpert386wb", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "AMIBIOS 050591", + .internal_name = "ami386wb", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 65536, + .files = { "roms/machines/dataexpert386wb/386-OPTI-386WB-10.BIN", "" } + }, + { + .name = "MR BIOS V1.26", + .internal_name = "dataexpert386wb", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 65536, + .files = { "roms/machines/dataexpert386wb/st0386-wb-ver2-0-618f078c738cb397184464.bin", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t dataexpert386wb_device = { + .name = "DataExpert 386WB", + .internal_name = "dataexpert386wb_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = dataexpert386wb_config +}; + int machine_at_dataexpert386wb_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/dataexpert386wb/st0386-wb-ver2-0-618f078c738cb397184464.bin", - 0x000f0000, 65536, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000f0000, 65536, 0); + machine_at_common_init(model); device_add(&opti391_device); diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 0ed20583f..0b57b135c 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -168,7 +168,8 @@ static const device_config_t lx6_config[] = { .bios = { { .name = "Award Modular BIOS v4.51PG - Revision LY", - .internal_name = "lx6", .bios_type = BIOS_NORMAL, + .internal_name = "lx6", + .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, @@ -571,17 +572,72 @@ machine_at_p3bf_init(const machine_t *model) return ret; } +static const device_config_t ax6bc_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "ax6bc", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v4.51PGM - Revision R1.10", + .internal_name = "ax6bc_451pg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/ax6bc/ax6bc110.bin", "" } + }, + { + .name = "Award Modular BIOS v4.60PGM - Revision R2.59", + .internal_name = "ax6bc", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/ax6bc/AX6BC_R2.59.bin", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t ax6bc_device = { + .name = "AOpen AX6BC", + .internal_name = "ax6bc_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = ax6bc_config +}; + int machine_at_ax6bc_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/ax6bc/AX6BC_R2.59.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000c0000, 262144, 0); + device_context_restore(); + machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); @@ -937,17 +993,72 @@ machine_at_p6sba_init(const machine_t *model) return ret; } +static const device_config_t s1846_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "s1846", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "AMIBIOS 6 (071595) - Revision 2.00.04", + .internal_name = "s1846", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/s1846/bx46200f.rom", "" } + }, + { + .name = "AMIBIOS 6 (071595) - Revision 2.00.0x (Tulip Vision Line TP90)", + .internal_name = "tp90", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/s1846/1846TP90.BIN", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t s1846_device = { + .name = "Tyan Tsunami ATX", + .internal_name = "s1846_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = s1846_config +}; + int machine_at_s1846_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/s1846/bx46200f.rom", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000c0000, 262144, 0); + device_context_restore(); + machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); @@ -975,18 +1086,73 @@ machine_at_s1846_init(const machine_t *model) return ret; } +static const device_config_t vei8_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "vei8", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v6.00PG - Revision QHW.10.01 (HP Sherwood-B)", + .internal_name = "vei8", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/vei8/QHW1001.BIN", "" } + }, + { + .name = "Award Modular BIOS v6.00PG - Revision R804", + .internal_name = "6110zu", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/vei8/r804.bin", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t vei8_device = { + .name = "MiTAC/Trigon 6110Zu", + .internal_name = "vei8_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = vei8_config +}; + /* i440ZX */ int machine_at_vei8_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/vei8/QHW1001.BIN", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000c0000, 262144, 0); + device_context_restore(); + machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); diff --git a/src/machine/m_at_slot1_socket370.c b/src/machine/m_at_slot1_socket370.c index cf689fd08..a9006c5e7 100644 --- a/src/machine/m_at_slot1_socket370.c +++ b/src/machine/m_at_slot1_socket370.c @@ -39,17 +39,81 @@ #include <86box/snd_ac97.h> /* i440BX */ +static const device_config_t prosignias31x_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "prosignias31x_bx", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v4.51PG - Revision 5.3", + .internal_name = "p6bxt", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/prosignias31x_bx/bxt53s.BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 5.5 (Compaq ProSignia/Deskpro 440BX)", + .internal_name = "prosignias31x_bx", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/prosignias31x_bx/p6bxt-ap-092600.bin", "" } + }, + { + .name = "Phoenix - AwardBIOS v6.00PG - Unofficial Version 6.0 (by rushieda)", + .internal_name = "p6bxt_600pg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/prosignias31x_bx/p6bxtap-600-67b8bfdce5de3470118202.bin", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t prosignias31x_device = { + .name = "ECS P6BXT-A+", + .internal_name = "prosignias31x_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = prosignias31x_config +}; + int machine_at_prosignias31x_bx_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/prosignias31x_bx/p6bxt-ap-092600.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000c0000, 262144, 0); + device_context_restore(); + machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index d518ac5dd..1d77d99a4 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -158,17 +158,72 @@ machine_at_excaliburpci_init(const machine_t *model) return ret; } +static const device_config_t p5mp3_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "p5mp3", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v4.50 - Revision 0205", + .internal_name = "p5mp3", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/p5mp3/0205.bin", "" } + }, + { + .name = "Award Modular BIOS v4.51G - Revision 0402 (Beta)", + .internal_name = "p5mp3_beta", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/p5mp3/0402.001", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t p5mp3_device = { + .name = "ASUS P/I-P5MP3", + .internal_name = "p5mp3_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = p5mp3_config +}; + int machine_at_p5mp3_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/p5mp3/0205.bin", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index aef755c3e..50a28a9c8 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -432,7 +432,6 @@ static void machine_at_morrison64_gpio_init(void) { uint32_t gpio = 0xffffe0cf; - uint16_t addr; /* Return to this after CS4232 PnP is working. */ /* Register 0x0078 (Undocumented): */ @@ -482,8 +481,8 @@ machine_at_morrison64_gpio_init(void) gpio |= 0xffff01af; else if (cpu_dmulti <= 2.0) gpio |= 0xffffe2af; - if ((cpu_dmulti > 2.0) && (cpu_dmulti <= 2.5)) - gpio |= 0xffffe5cf; + else if ((cpu_dmulti > 2.0) && (cpu_dmulti <= 2.5)) + gpio |= 0xffffe5cf; machine_set_gpio_default(gpio); } @@ -553,17 +552,72 @@ machine_at_zappa_gpio_init(void) machine_set_gpio_default(gpio); } +static const device_config_t pt2000_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "pt2000", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v4.50GP - Revision T1.01", + .internal_name = "pt2000", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ficpt2000/PT2000_v1.01.BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 3.072C806", + .internal_name = "pt2000_451pg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ficpt2000/3072c806.bin", "" } + }, + { .files_no = 0 } + }, + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t pt2000_device = { + .name = "FIC PT-2000", + .internal_name = "pt2000_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = pt2000_config +}; + int machine_at_pt2000_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/ficpt2000/PT2000_v1.01.BIN", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 3bd4f8a95..15e0316f2 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -813,17 +813,72 @@ machine_at_dellhannibalp_init(const machine_t *model) return ret; } +static const device_config_t p5vxb_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "p5vxb", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v4.50PG - Revision 1.0", + .internal_name = "p5vxb", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/p5vxb/P5VXB10.BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 1.5c", + .internal_name = "p5vxb_451pg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/p5vxb/P5VXB15C.BIN", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t p5vxb_device = { + .name = "ECS P5VX-B", + .internal_name = "p5vxb_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = p5vxb_config +}; + int machine_at_p5vxb_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/p5vxb/P5VXB10.BIN", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); @@ -1422,24 +1477,39 @@ machine_at_ma23c_init(const machine_t *model) static const device_config_t an430tx_config[] = { // clang-format off { - .name = "bios", - .description = "BIOS Version", - .type = CONFIG_BIOS, + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, .default_string = "pb79x", - .default_int = 0, - .file_filter = "", - .spinner = { 0 }, - .bios = { - { .name = "PhoenixBIOS 4.0 Release 6.0 - Revision P02-0011 (Sony Vaio PCV-130/150)", .internal_name = "vaio150", .bios_type = BIOS_NORMAL, - .files_no = 5, .local = 0, .size = 262144, .files = { "roms/machines/an430tx/P02-0011.BIO", "roms/machines/an430tx/P02-0011.BI1", - "roms/machines/an430tx/P02-0011.BI2", "roms/machines/an430tx/P02-0011.BI3", - "roms/machines/an430tx/P02-0011.RCV", "" } }, - { .name = "PhoenixBIOS 4.0 Release 6.0 - Revision P09-0006 (Packard Bell PB79x)", .internal_name = "pb79x", .bios_type = BIOS_NORMAL, - .files_no = 5, .local = 0, .size = 262144, .files = { "roms/machines/an430tx/ANP0911A.BIO", "roms/machines/an430tx/ANP0911A.BI1", - "roms/machines/an430tx/ANP0911A.BI2", "roms/machines/an430tx/ANP0911A.BI3", - "roms/machines/an430tx/ANP0911A.RCV", "" } }, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "PhoenixBIOS 4.0 Release 6.0 - Revision P02-0011 (Sony Vaio PCV-130/150)", + .internal_name = "vaio150", + .bios_type = BIOS_NORMAL, + .files_no = 5, + .local = 0, + .size = 262144, + .files = { "roms/machines/an430tx/P02-0011.BIO", "roms/machines/an430tx/P02-0011.BI1", + "roms/machines/an430tx/P02-0011.BI2", "roms/machines/an430tx/P02-0011.BI3", + "roms/machines/an430tx/P02-0011.RCV", "" } + }, + { + .name = "PhoenixBIOS 4.0 Release 6.0 - Revision P09-0006 (Packard Bell PB79x)", + .internal_name = "pb79x", + .bios_type = BIOS_NORMAL, + .files_no = 5, + .local = 0, + .size = 262144, + .files = { "roms/machines/an430tx/ANP0911A.BIO", "roms/machines/an430tx/ANP0911A.BI1", + "roms/machines/an430tx/ANP0911A.BI2", "roms/machines/an430tx/ANP0911A.BI3", + "roms/machines/an430tx/ANP0911A.RCV", "" } + }, { .files_no = 0 } - }, + } }, { .name = "", .description = "", .type = CONFIG_END } // clang-format on diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 8547701f4..264a220fc 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -157,6 +157,150 @@ machine_at_exp8551_init(const machine_t *model) return ret; } +static void +machine_at_hpvectravexxx_gpio_init(void) +{ + uint32_t gpio = 0x40; + + if (cpu_busspeed <= 40000000) + gpio |= 0x30; + else if ((cpu_busspeed > 40000000) && (cpu_busspeed <= 50000000)) + gpio |= 0x00; + else if ((cpu_busspeed > 50000000) && (cpu_busspeed <= 60000000)) + gpio |= 0x20; + else if (cpu_busspeed > 60000000) + gpio |= 0x10; + + if (cpu_dmulti <= 1.5) + gpio |= 0x82; + else if ((cpu_dmulti > 1.5) && (cpu_dmulti <= 2.0)) + gpio |= 0x02; + else if ((cpu_dmulti > 2.0) && (cpu_dmulti <= 2.5)) + gpio |= 0x00; + else if (cpu_dmulti > 2.5) + gpio |= 0x80; + + machine_set_gpio_default(gpio); +} + +static const device_config_t hpvectravexxx_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "gu_07_05", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "GU.07.02 (01/25/96)", + .internal_name = "gu_07_02", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/hpvectravexxx/d3653.bin", "" } + }, + { + .name = "GU.07.05 (08/06/96)", + .internal_name = "gu_07_05", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/hpvectravexxx/GU0705US.FUL", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t hpvectravexxx_device = { + .name = "HP Vectra VE 5/XXX Series 2", + .internal_name = "hpvectravexxx_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = hpvectravexxx_config +}; + +int +machine_at_hpvectravexxx_init(const machine_t *model) +{ + int ret = 0; + const char *fn; + + /* No ROMs available */ + if (!device_available(model->device)) + return ret; + + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + + machine_at_common_init_ex(model, 2); + machine_at_hpvectravexxx_gpio_init(); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + device_add(&i430fx_device); + device_add(&piix_device); + device_add_params(&pc87306_device, (void *) PCX730X_PHOENIX_42); + device_add(&intel_flash_bxt_device); + + if (gfxcard[0] == VID_INTERNAL) + device_add(machine_get_vid_device(machine)); + + return ret; +} +int +machine_at_vectra500mt_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/vectra500mt/GJ0718.FUL", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + + if (gfxcard[0] == VID_INTERNAL) + device_add(machine_get_vid_device(machine)); + + device_add(&i430fx_device); + device_add(&piix_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX2 | FDC37C93X_NORMAL)); + device_add(&sst_flash_29ee010_device); + + return ret; +} + int machine_at_vectra54_init(const machine_t *model) { @@ -431,7 +575,6 @@ static void machine_at_monaco_gpio_init(void) { uint32_t gpio = 0xffffe0cf; - uint16_t addr; /* Return to this after CS4232 PnP is working. */ /* Register 0x0078 (Undocumented): */ @@ -668,17 +811,72 @@ machine_at_monaco_init(const machine_t *model) return ret; } +static const device_config_t ms5119_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "ms5119", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "AMIBIOS 6 (071595) - Revision A37EB", + .internal_name = "ms5119", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ms5119/A37EB.ROM", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Release 2.3 (by Rainbow)", + .internal_name = "ms5119_451pg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ms5119/MS-5120.BIN", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t ms5119_device = { + .name = "MSI MS-5119", + .internal_name = "ms5119_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = ms5119_config +}; + int machine_at_ms5119_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/ms5119/A37EB.ROM", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); @@ -794,17 +992,72 @@ machine_at_mb500n_init(const machine_t *model) return ret; } +static const device_config_t fmb_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "fmb", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "AMIBIOS 6 (071595) - Revision 1.83", + .internal_name = "fmb", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/fmb/P5IV183.ROM", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - 2001 Release (by Rainbow)", + .internal_name = "fmb_451pg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/fmb/P5I437FM.BIN", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t fmb_device = { + .name = "QDI FMB", + .internal_name = "fmb_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = fmb_config +}; + int machine_at_fmb_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/fmb/P5IV183.ROM", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index ea53e5fd4..11fbcd694 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -303,6 +303,15 @@ machine_at_686nx_init(const machine_t *model) return ret; } +uint32_t +machine_ap440fx_vs440fx_gpio_handler(uint8_t write, uint32_t val) +{ + if (!write) + return 0xff7f; + + return val; /* Writes are ignored. */ +} + int machine_at_ap440fx_init(const machine_t *model) { diff --git a/src/machine/m_at_sockets7.c b/src/machine/m_at_sockets7.c index 832cd3fdd..550da59b9 100644 --- a/src/machine/m_at_sockets7.c +++ b/src/machine/m_at_sockets7.c @@ -200,7 +200,7 @@ static const device_config_t g5x_config[] = { }, { .name = "Phoenix - AwardBIOS v6.00PG - Release 4.1 (by eSupport)", - .internal_name = "5ax_esupport", + .internal_name = "5ax_600pg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -298,17 +298,72 @@ machine_at_ax59pro_init(const machine_t *model) return ret; } +static const device_config_t delhi3_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "delhi3", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "AMIBIOS 6 (071595) - Revision 1.01", + .internal_name = "delhi3_nonoem", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/delhi3/DELHI3_nonoem.ROM", "" } + }, + { + .name = "AMIBIOS 6 (071595) - Revision 1.20 (eMachines eTower 3__k)", + .internal_name = "delhi3", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/delhi3/DELHI3.ROM", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t delhi3_device = { + .name = "TriGem Delhi-III", + .internal_name = "delhi3_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = delhi3_config +}; + int machine_at_delhi3_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/delhi3/DELHI3.ROM", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000c0000, 262144, 0); + device_context_restore(); + machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 519933b23..77a0ee392 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -41,6 +41,7 @@ #include <86box/rom.h> #include <86box/fdd.h> #include <86box/fdc.h> +#include <86box/fdc_ext.h> #include <86box/sound.h> #include <86box/snd_speaker.h> #include <86box/snd_sn76489.h> @@ -652,7 +653,10 @@ kbd_read(uint16_t port, void *priv) case 0x62: ret = (pcjr->latched ? 1 : 0); - ret |= 0x02; /* Modem card not installed */ + if (!pcjr->option_modem) + ret |= 0x02; /* Modem card not installed */ + if (!pcjr->option_fdc) + ret |= 0x04; /* Diskette card not installed */ if (mem_size < 128) ret |= 0x08; /* 64k expansion card not installed */ if ((pcjr->pb & 0x08) || (cassette == NULL)) @@ -664,6 +668,8 @@ kbd_read(uint16_t port, void *priv) ret |= (pcjr->data ? 0x40 : 0); if (pcjr->data) ret |= 0x40; + if (pcjr->option_ir) + ret |= 0x80; /* Keyboard cable not connected */ break; case 0xa0: @@ -813,6 +819,30 @@ static const device_config_t pcjr_config[] = { .selection = { { 0 } }, .bios = { { 0 } } }, +#if 0 + { + .name = "modem_slot", + .description = "Enable Serial Port in Modem Slot", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { + .name = "ir_reciever", + .description = "Enable IR Reciever", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, +#endif { .name = "", .description = "", .type = CONFIG_END } // clang-format on }; @@ -846,6 +876,18 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr = calloc(1, sizeof(pcjr_t)); +#if 0 + pcjr->option_modem = device_get_config_int("modem_slot"); +#else + pcjr->option_modem = 0; +#endif + pcjr->option_fdc = 0; +#if 0 + pcjr->option_ir = device_get_config_int("ir_reciever"); +#else + pcjr->option_ir = 0; +#endif + is_pcjr = 1; pic_init_pcjr(); @@ -865,9 +907,13 @@ machine_pcjr_init(UNUSED(const machine_t *model)) keyboard_scan = 1; key_queue_start = key_queue_end = 0; io_sethandler(0x0060, 4, - kbd_read, NULL, NULL, kbd_write, NULL, NULL, pcjr); + kbd_read, NULL, NULL, + kbd_write, NULL, NULL, + pcjr); io_sethandler(0x00a0, 8, - kbd_read, NULL, NULL, kbd_write, NULL, NULL, pcjr); + kbd_read, NULL, NULL, + kbd_write, NULL, NULL, + pcjr); timer_add(&pcjr->send_delay_timer, kbd_poll, pcjr, 1); keyboard_set_table(scancode_pcjr); keyboard_send = kbd_adddata_ex; @@ -877,9 +923,18 @@ machine_pcjr_init(UNUSED(const machine_t *model)) nmi_mask = 0x80; - device_add(&fdc_pcjr_device); + if (fdc_current[0] == FDC_INTERNAL) { + device_add(&fdc_pcjr_device); + pcjr->option_fdc = 1; + } + + if (!pcjr->option_modem) + device_add(&ns8250_pcjr_2f8_device); + else { + device_add(&ns8250_pcjr_3f8_device); + device_add(&ns8250_pcjr_2f8_device); + } - device_add(&ns8250_pcjr_device); /* So that serial_standalone_init() won't do anything. */ serial_set_next_inst(SERIAL_MAX - 1); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index f6837a9df..8816ce42c 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -300,7 +300,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCJR, - .flags = MACHINE_VIDEO_FIXED | MACHINE_KEYBOARD | MACHINE_CARTRIDGE, + .flags = MACHINE_VIDEO_FIXED | MACHINE_KEYBOARD | MACHINE_CARTRIDGE | MACHINE_FDC, .ram = { .min = 64, .max = 640, @@ -316,7 +316,7 @@ const machine_t machines[] = { .gpio_acpi = 0xffffffff, .device = NULL, .kbd_device = NULL, - .fdc_device = NULL, + .fdc_device = &fdc_pcjr_device, .sio_device = NULL, .vid_device = &pcjr_device, .snd_device = NULL, @@ -6627,7 +6627,7 @@ const machine_t machines[] = { }, /* Has AMIKey 'F' KBC firmware. */ { - .name = "[OPTi 391] DataExpert 386WB", + .name = "[OPTi 391] DataExpert 386C", .internal_name = "dataexpert386wb", .type = MACHINE_TYPE_386DX, .chipset = MACHINE_CHIPSET_OPTI_391, @@ -6661,7 +6661,7 @@ const machine_t machines[] = { .kbc_p1 = 0x000004f0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &dataexpert386wb_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -8831,7 +8831,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_APM | MACHINE_ACPI, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -11350,7 +11350,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &p5mp3_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -11448,7 +11448,7 @@ const machine_t machines[] = { }, /* Has IBM PS/2 Type 1 KBC firmware. */ { - .name = "[i430LX] IBM PS/ValuePoint P60", + .name = "[i430LX] IBM PS/ValuePoint P60 (Robin ACE)", .internal_name = "valuepointp60", .type = MACHINE_TYPE_SOCKET4, .chipset = MACHINE_CHIPSET_INTEL_430LX, @@ -12423,7 +12423,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &pt2000_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -12432,47 +12432,47 @@ const machine_t machines[] = { .net_device = NULL }, { - .name = "[i430FX] IBM PC 3x0 (type 65x6) (Morrison64)", - .internal_name = "pc330_65x6", - .type = MACHINE_TYPE_SOCKET5, - .chipset = MACHINE_CHIPSET_INTEL_430FX, - .init = machine_at_pc330_65x6_init, - .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, + .name = "[i430FX] IBM PC 3x0 (type 65x6) (Morrison64)", + .internal_name = "pc330_65x6", + .type = MACHINE_TYPE_SOCKET5, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_pc330_65x6_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_Cx6x86), - .min_bus = 50000000, - .max_bus = 66666667, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_Cx6x86), + .min_bus = 50000000, + .max_bus = 66666667, .min_voltage = 3380, .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 2.0 + .min_multi = 1.5, + .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, - .ram = { - .min = 8192, - .max = 131072, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, .step = 8192 }, - .nvrmask = 255, - .jumpered_ecp_dma = MACHINE_DMA_DISABLED | MACHINE_DMA_1 | MACHINE_DMA_3, + .nvrmask = 255, + .jumpered_ecp_dma = MACHINE_DMA_DISABLED | MACHINE_DMA_1 | MACHINE_DMA_3, .default_jumpered_ecp_dma = 3, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x000044f0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &s3_phoenix_trio64_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x000044f0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &s3_phoenix_trio64_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the PC87306 Super I/O chip, command 0xA1 returns '5'. @@ -12525,7 +12525,7 @@ const machine_t machines[] = { The board turns out to be a BCM FM540 which has an AMI 'H' KBC. */ { - .name = "[i430FX] NEC PowerMate Vxxx", + .name = "[i430FX] NEC PowerMate Vxxx (BCM FM540)", .internal_name = "powermatev", .type = MACHINE_TYPE_SOCKET5, .chipset = MACHINE_CHIPSET_INTEL_430FX, @@ -13040,27 +13040,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, + .ram = { .min = 4096, .max = 131072, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_USE_CONFIG, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_USE_CONFIG, .default_jumpered_ecp_dma = -1, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_PHOENIX | 0x00021400, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &gd5434_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_PHOENIX | 0x00021400, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5434_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* Has a VIA KBC chip */ { @@ -13084,27 +13084,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM, + .ram = { .min = 4096, .max = 262144, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_1 | MACHINE_DMA_3, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_1 | MACHINE_DMA_3, .default_jumpered_ecp_dma = 1, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_VIA | 0x00424600, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = NULL, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_VIA | 0x00424600, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL }, /* KBC firmware is unknown. No commands outside of the base PS/2 */ /* KBC command set are used. */ @@ -13129,27 +13129,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM, + .ram = { .min = 4096, .max = 131072, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_DISABLED | MACHINE_DMA_1 | MACHINE_DMA_3, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_DISABLED | MACHINE_DMA_1 | MACHINE_DMA_3, .default_jumpered_ecp_dma = 4, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_PHOENIX | 0x00021400, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = NULL, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_PHOENIX | 0x00021400, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL }, /* This has Phoenix KBC firmware. */ { @@ -13173,27 +13173,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, + .ram = { .min = 8192, .max = 139264, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_1 | MACHINE_DMA_3, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_1 | MACHINE_DMA_3, .default_jumpered_ecp_dma = 3, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_PHOENIX | 0x00012900, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &gd5430_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_PHOENIX | 0x00012900, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5430_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* VLSI Wildcat */ @@ -13219,27 +13219,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, + .ram = { .min = 4096, .max = 196608, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_3, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_3, .default_jumpered_ecp_dma = 3, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_PHOENIX | 0x00012900, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &s3_phoenix_trio64_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_PHOENIX | 0x00012900, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &s3_phoenix_trio64_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* Socket 7 (Single Voltage) machines */ @@ -13333,6 +13333,92 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + { + .name = "[i430FX] HP Vectra VE 5/XXX Series 2", + .internal_name = "hpvectravexxx", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_hpvectravexxx_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 3380, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 255, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = &hpvectravexxx_device, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5436_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL + }, + { + .name = "[i430FX] HP Vectra 500 Series xxx/MT", + .internal_name = "vectra500mt", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_vectra500mt_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 3380, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 511, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x000044f0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &s3_phoenix_trio64_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL + }, /* Has a SM(S)C FDC37C932 Super I/O chip with on-chip KBC with AMI MegaKey (revision '5') KBC firmware. */ { @@ -13598,7 +13684,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &ms5119_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -13731,7 +13817,7 @@ const machine_t machines[] = { .kbc_p1 = 0x000004f0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &fmb_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -15132,7 +15218,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &p5vxb_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -15608,7 +15694,7 @@ const machine_t machines[] = { .chipset = MACHINE_CHIPSET_INTEL_430TX, .init = machine_at_optiplexgn_init, .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, + .gpio_handler = machine_ap440fx_vs440fx_gpio_handler, .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { @@ -15648,7 +15734,7 @@ const machine_t machines[] = { }, /* [TEST] Has AMI Megakey '5' KBC firmware on the SM(S)C FDC37C67x Super I/O chip. */ { - .name = "[i430TX] Gateway E-1000", + .name = "[i430TX] Gateway E-1000 (Tomahawk)", .internal_name = "tomahawk", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_INTEL_430TX, @@ -15692,48 +15778,48 @@ const machine_t machines[] = { }, /* This has the Phoenix MultiKey KBC firmware on the NSC Super I/O chip. */ { - .name = "[i430TX] Intel AN430TX (Anchorage)", - .internal_name = "an430tx", - .type = MACHINE_TYPE_SOCKET7, - .chipset = MACHINE_CHIPSET_INTEL_430TX, - .init = machine_at_an430tx_init, - .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, + .name = "[i430TX] Intel AN430TX (Anchorage)", + .internal_name = "an430tx", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430TX, + .init = machine_at_an430tx_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = machine_ap440fx_vs440fx_gpio_handler, + .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_K6, CPU_K6_2, CPU_K6_2C, CPU_K6_3, CPU_K6_2P, - CPU_K6_3P, CPU_Cx6x86, CPU_Cx6x86MX, CPU_Cx6x86L), - .min_bus = 60000000, - .max_bus = 66666667, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_K6, CPU_K6_2, CPU_K6_2C, CPU_K6_3, CPU_K6_2P, + CPU_K6_3P, CPU_Cx6x86, CPU_Cx6x86MX, CPU_Cx6x86L), + .min_bus = 60000000, + .max_bus = 66666667, .min_voltage = 2800, .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.5 + .min_multi = 1.5, + .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_GAMEPORT, /* Machine has internal video: ATI Mach64GT-B 3D Rage II */ - .ram = { - .min = 8192, - .max = 262144, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_GAMEPORT, /* Machine has internal video: ATI Mach64GT-B 3D Rage II */ + .ram = { + .min = 8192, + .max = 262144, .step = 8192 }, - .nvrmask = 255, - .jumpered_ecp_dma = 0, + .nvrmask = 255, + .jumpered_ecp_dma = 0, .default_jumpered_ecp_dma = -1, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x000044f0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = &an430tx_device, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = NULL, - .snd_device = &ymf715_onboard_device, - .net_device = NULL + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x000044f0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = &an430tx_device, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = &ymf715_onboard_device, + .net_device = NULL }, /* This has the Winbond W83977 Super I/O Chip with AMIKey-2 KBC firmware, which is type 'H'. */ { @@ -16824,51 +16910,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* Has the VIA VT82C596A southbridge with on-chip KBC identical to the VIA - VT82C42N. Sadly likely abuses cache on Cyrix 6x86MX and MII CPUs (Cyrix MII being what most socket 7 eMachines PCs used) , so they are blocked and it's thus named after the only known eMachines with an AMD K6-2 CPU here */ - { - .name = "[VIA MVP3] eMachines eTower 300k", - .internal_name = "delhi3", - .type = MACHINE_TYPE_SOCKETS7, - .chipset = MACHINE_CHIPSET_VIA_APOLLO_MVP3, - .init = machine_at_delhi3_init, - .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK(CPU_Cx6x86MX), - .min_bus = 66666667, - .max_bus = 124242424, - .min_voltage = 2000, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 5.5 - }, - .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Has internal video: ATI 3D Rage IIc AGP (Rage 2) */ - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_USB, - .ram = { - .min = 8192, - .max = 524288, - .step = 8192 - }, - .nvrmask = 255, - .jumpered_ecp_dma = 0, - .default_jumpered_ecp_dma = -1, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = NULL, - .snd_device = &cs4235_onboard_device, - .net_device = NULL - }, /* Has the VIA VT82C586B southbridge with on-chip KBC identical to the VIA VT82C42N. */ { @@ -17004,6 +17045,50 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has the VIA VT82C596A southbridge with on-chip KBC identical to the VIA VT82C42N. */ + { + .name = "[VIA MVP3] TriGem Delhi-III", + .internal_name = "delhi3", + .type = MACHINE_TYPE_SOCKETS7, + .chipset = MACHINE_CHIPSET_VIA_APOLLO_MVP3, + .init = machine_at_delhi3_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK(CPU_Cx6x86MX), /* Sadly it likely abuses cache if using Cyrix 6x86MX and MII CPUs (the latter being what most Socket 7 eMachines PCs used), so they are blocked. */ + .min_bus = 66666667, + .max_bus = 124242424, + .min_voltage = 2000, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 5.5 + }, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Has internal video: ATI 3D Rage IIc AGP (Rage 2) */ + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_USB, + .ram = { + .min = 8192, + .max = 524288, + .step = 8192 + }, + .nvrmask = 255, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = &delhi3_device, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = &cs4235_onboard_device, + .net_device = NULL + }, /* Socket 8 machines */ /* 450KX */ @@ -17328,7 +17413,7 @@ const machine_t machines[] = { .chipset = MACHINE_CHIPSET_INTEL_440FX, .init = machine_at_ap440fx_init, .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, + .gpio_handler = machine_ap440fx_vs440fx_gpio_handler, .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { @@ -17374,7 +17459,7 @@ const machine_t machines[] = { .chipset = MACHINE_CHIPSET_INTEL_440FX, .init = machine_at_vs440fx_init, .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, + .gpio_handler = machine_ap440fx_vs440fx_gpio_handler, .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { @@ -17434,7 +17519,7 @@ const machine_t machines[] = { .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, /* Machine has internal SCSI: Adaptec AIC-7880U */ .ram = { - .min = 40960, + .min = 40960, /* does not POST with lower than 40MB; Award and AMI retail BIOSes not affected(?) */ .max = 524288, .step = 8192 }, @@ -17781,7 +17866,7 @@ const machine_t machines[] = { .chipset = MACHINE_CHIPSET_INTEL_440LX, .init = machine_at_optiplexgxa_init, .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, + .gpio_handler = machine_ap440fx_vs440fx_gpio_handler, .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { @@ -18083,7 +18168,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &ax6bc_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -18396,7 +18481,7 @@ const machine_t machines[] = { .kbc_p1 = 0x000044f0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &s1846_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -18409,7 +18494,7 @@ const machine_t machines[] = { /* Has a SM(S)C FDC37M60x Super I/O chip with on-chip KBC with most likely AMIKey-2 KBC firmware. */ { - .name = "[i440ZX] HP Vectra VEi 8", + .name = "[i440ZX] MiTAC/Trigon 6110Zu", .internal_name = "vei8", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_INTEL_440ZX, @@ -18443,7 +18528,7 @@ const machine_t machines[] = { .kbc_p1 = 0x000044f0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &vei8_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -18911,13 +18996,12 @@ const machine_t machines[] = { /* Slot 1/Socket 370 machines */ /* 440BX */ - /* OEM version of ECS P6BXT-A+ REV 1.3x/2.2x. Has a Winbond W83977EF Super - I/O chip with on-chip KBC with AMIKey-2 KBC firmware.*/ + /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware.*/ { - .name = "[i440BX] Compaq ProSignia S316/318 (Intel)", + .name = "[i440BX] ECS P6BXT-A+", .internal_name = "prosignias31x_bx", .type = MACHINE_TYPE_SLOT1_370, - .chipset = MACHINE_CHIPSET_VIA_APOLLO_PRO_133, + .chipset = MACHINE_CHIPSET_INTEL_440BX, .init = machine_at_prosignias31x_bx_init, .p1_handler = machine_generic_p1_handler, .gpio_handler = NULL, @@ -18925,9 +19009,9 @@ const machine_t machines[] = { .gpio_acpi_handler = NULL, .cpu = { .package = CPU_PKG_SLOT1 | CPU_PKG_SOCKET370, - .block = CPU_BLOCK(CPU_PENTIUMPRO, CPU_CYRIX3S), /* Instability issues with PPro, and garbled text in POST with Cyrix */ + .block = CPU_BLOCK(CPU_PENTIUMPRO), /* Instability issues with PPro, and garbled text in POST with Cyrix (latter supported on unofficial v6.00PG BIOS) */ .min_bus = 66666667, - .max_bus = 100000000, + .max_bus = 124242424, .min_voltage = 1300, .max_voltage = 3500, .min_multi = 1.5, @@ -18948,7 +19032,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &prosignias31x_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 9b6ce9399..28652d3e5 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -603,9 +603,6 @@ msgstr "" msgid "ID:" msgstr "" -msgid "&Specify..." -msgstr "" - msgid "Sectors:" msgstr "" @@ -852,9 +849,18 @@ msgstr "" msgid "Invalid PCap device" msgstr "" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "" + msgid "2-axis, 2-button joystick(s)" msgstr "" +msgid "2-axis, 3-button joystick" +msgstr "" + msgid "2-axis, 4-button joystick" msgstr "" @@ -867,18 +873,99 @@ msgstr "" msgid "3-axis, 2-button joystick" msgstr "" +msgid "3-axis, 3-button joystick" +msgstr "" + msgid "3-axis, 4-button joystick" msgstr "" +msgid "4-axis, 2-button joystick" +msgstr "" + +msgid "4-axis, 3-button joystick" +msgstr "" + msgid "4-axis, 4-button joystick" msgstr "" +msgid "2-button gamepad(s)" +msgstr "" + +msgid "3-button gamepad" +msgstr "" + +msgid "4-button gamepad" +msgstr "" + +msgid "6-button gamepad" +msgstr "" + +msgid "Gravis PC GamePad" +msgstr "" + +msgid "2-button flight yoke" +msgstr "" + +msgid "3-button flight yoke" +msgstr "" + +msgid "4-button flight yoke" +msgstr "" + +msgid "2-button flight yoke with throttle" +msgstr "" + +msgid "3-button flight yoke with throttle" +msgstr "" + +msgid "4-button flight yoke with throttle" +msgstr "" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "" + +msgid "CH Flightstick" +msgstr "" + +msgid "CH Flightstick + CH Pedals" +msgstr "" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "" + msgid "CH Flightstick Pro" msgstr "" msgid "CH Flightstick Pro + CH Pedals" msgstr "" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "" + +msgid "CH Virtual Pilot" +msgstr "" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "" + +msgid "CH Virtual Pilot Pro" +msgstr "" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "" + msgid "Microsoft SideWinder Pad" msgstr "" @@ -888,25 +975,10 @@ msgstr "" msgid "Thrustmaster FCS + Rudder Control System" msgstr "" -msgid "2-button gamepad(s)" +msgid "Thrustmaster Formula T1/T2 with Adaptor" msgstr "" -msgid "2-button flight yoke" -msgstr "" - -msgid "4-button gamepad" -msgstr "" - -msgid "4-button flight yoke" -msgstr "" - -msgid "2-button flight yoke with throttle" -msgstr "" - -msgid "4-button flight yoke with throttle" -msgstr "" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" msgstr "" msgid "None" @@ -2988,9 +3060,6 @@ msgstr "" msgid "Color scheme" msgstr "" -msgid "System" -msgstr "" - msgid "Light" msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 03103a3e3..d4b9fc6ca 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -603,9 +603,6 @@ msgstr "Kanál:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Zadat..." - msgid "Sectors:" msgstr "Sektory:" @@ -852,9 +849,18 @@ msgstr "Nebyla nalezena žádná PCap zařízení" msgid "Invalid PCap device" msgstr "Neplatné PCap zařízení" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick s 2 osami a 1 tlačítky" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick s 2 osami a 2 tlačítky" +msgid "2-axis, 3-button joystick" +msgstr "Joystick s 2 osami a 3 tlačítky" + msgid "2-axis, 4-button joystick" msgstr "Joystick s 2 osami a 4 tlačítky" @@ -867,18 +873,99 @@ msgstr "Joystick s 2 osami a 8 tlačítky" msgid "3-axis, 2-button joystick" msgstr "Joystick s 3 osami a 2 tlačítky" +msgid "3-axis, 3-button joystick" +msgstr "Joystick s 3 osami a 3 tlačítky" + msgid "3-axis, 4-button joystick" msgstr "Joystick s 3 osami a 4 tlačítky" +msgid "4-axis, 2-button joystick" +msgstr "Joystick s 4 osami a 2 tlačítky" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick s 4 osami a 3 tlačítky" + msgid "4-axis, 4-button joystick" msgstr "Joystick s 4 osami a 4 tlačítky" +msgid "2-button gamepad(s)" +msgstr "Ovladač se 2 tlačítky" + +msgid "3-button gamepad" +msgstr "Ovladač se 3 tlačítky" + +msgid "4-button gamepad" +msgstr "Ovladač se 4 tlačítky" + +msgid "6-button gamepad" +msgstr "Ovladač se 6 tlačítky" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Letecký knipl se 2 tlačítky" + +msgid "3-button flight yoke" +msgstr "Letecký knipl se32 tlačítky" + +msgid "4-button flight yoke" +msgstr "Letecký knipl se 4 tlačítky" + +msgid "2-button flight yoke with throttle" +msgstr "Letecký knipl s 2 tlačítky a pákou" + +msgid "3-button flight yoke with throttle" +msgstr "Letecký knipl s 3 tlačítky a pákou" + +msgid "4-button flight yoke with throttle" +msgstr "Letecký knipl s 4 tlačítky a pákou" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volant (3 osy, 2 tlačítka)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volant (3 osy, 3 tlačítka)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volant (3 osy, 4 tlačítka)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Ovladač se 2 tlačítky" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Letecký knipl se 2 tlačítky" - -msgid "4-button gamepad" -msgstr "Ovladač se 4 tlačítky" - -msgid "4-button flight yoke" -msgstr "Letecký knipl se 4 tlačítky" - -msgid "2-button flight yoke with throttle" -msgstr "Letecký knipl s 2 tlačítky a pákou" - -msgid "4-button flight yoke with throttle" -msgstr "Letecký knipl s 4 tlačítky a pákou" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volant pro Windows 95 (3 osy, 4 tlačítka)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Žadné" @@ -1714,7 +1786,7 @@ msgid "Remove" msgstr "Odstranit" msgid "Browse..." -msgstr "Browse..." +msgstr "Procházet..." msgid "Couldn't create OpenGL context." msgstr "Nepodařilo se vytvořit kontext OpenGL." diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index bdcddfe8d..c5d908733 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Festlegen..." - msgid "Sectors:" msgstr "Sektoren:" @@ -852,9 +849,18 @@ msgstr "Keine PCap-Geräte gefunden" msgid "Invalid PCap device" msgstr "Ungültiges PCap-Gerät" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-Achsen-, 1-Tasten-Joystick(s)" + msgid "2-axis, 2-button joystick(s)" msgstr "2-Achsen-, 2-Tasten-Joystick(s)" +msgid "2-axis, 3-button joystick" +msgstr "2-Achsen-, 3-Tasten-Joystick" + msgid "2-axis, 4-button joystick" msgstr "2-Achsen-, 4-Tasten-Joystick" @@ -867,18 +873,99 @@ msgstr "2-Achsen-, 8-Tasten-Joystick" msgid "3-axis, 2-button joystick" msgstr "3-Achsen-, 2-Tasten-Joystick" +msgid "3-axis, 3-button joystick" +msgstr "3-Achsen-, 3-Tasten-Joystick" + msgid "3-axis, 4-button joystick" msgstr "3-Achsen-, 4-Tasten-Joystick" +msgid "4-axis, 2-button joystick" +msgstr "4-Achsen-, 2-Tasten-Joystick" + +msgid "4-axis, 3-button joystick" +msgstr "4-Achsen-, 3-Tasten-Joystick" + msgid "4-axis, 4-button joystick" msgstr "4-Achsen-, 4-Tasten-Joystick" +msgid "2-button gamepad(s)" +msgstr "2-Tasten-Gamepad(s)" + +msgid "3-button gamepad" +msgstr "3-Tasten-Gamepad" + +msgid "4-button gamepad" +msgstr "4-Tasten-Gamepad" + +msgid "6-button gamepad" +msgstr "6-Tasten-Gamepad" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-Tasten-Steuerhorn" + +msgid "3-button flight yoke" +msgstr "3-Tasten-Steuerhorn" + +msgid "4-button flight yoke" +msgstr "4-Tasten-Steuerhorn" + +msgid "2-button flight yoke with throttle" +msgstr "2-Tasten-Steuerhorn mit Schubregler" + +msgid "3-button flight yoke with throttle" +msgstr "3-Tasten-Steuerhorn mit Schubregler" + +msgid "4-button flight yoke with throttle" +msgstr "4-Tasten-Steuerhorn mit Schubregler" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Lenkrad (3-Achsen, 2-Tasten)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Lenkrad (3-Achsen, 3-Tasten)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Lenkrad (3-Achsen, 4-Tasten)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedale" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedale Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedale" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedale Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedale" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedale Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2-Tasten-Gamepad(s)" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-Tasten-Steuerhorn" - -msgid "4-button gamepad" -msgstr "4-Tasten-Gamepad" - -msgid "4-button flight yoke" -msgstr "4-Tasten-Steuerhorn" - -msgid "2-button flight yoke with throttle" -msgstr "2-Tasten-Steuerhorn mit Schubregler" - -msgid "4-button flight yoke with throttle" -msgstr "4-Tasten-Steuerhorn mit Schubregler" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 Lenkrad (3-Achsen, 4-Tasten)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ohne" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 2bf3f5181..64bb8b526 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -603,9 +603,6 @@ msgstr "Canal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "E&specificar..." - msgid "Sectors:" msgstr "Sectores:" @@ -852,9 +849,18 @@ msgstr "No se encontraron dispositivos PCap" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Mando(s) de 2 ejes, 1 botones" + msgid "2-axis, 2-button joystick(s)" msgstr "Mando(s) de 2 ejes, 2 botones" +msgid "2-axis, 3-button joystick" +msgstr "Mando de 2 ejes, 3 botones" + msgid "2-axis, 4-button joystick" msgstr "Mando de 2 ejes, 4 botones" @@ -867,18 +873,99 @@ msgstr "Mando de 2 ejes, 8 botones" msgid "3-axis, 2-button joystick" msgstr "Mando de 3 ejes, 2 botones" +msgid "3-axis, 3-button joystick" +msgstr "Mando de 3 ejes, 3 botones" + msgid "3-axis, 4-button joystick" msgstr "Mando de 3 ejes, 4 botones" +msgid "4-axis, 2-button joystick" +msgstr "Mando de 4 ejes, 2 botones" + +msgid "4-axis, 3-button joystick" +msgstr "Mando de 4 ejes, 3 botones" + msgid "4-axis, 4-button joystick" msgstr "Mando de 4 ejes, 4 botones" +msgid "2-button gamepad(s)" +msgstr "Mando(s) de juegos de 2 botones" + +msgid "3-button gamepad" +msgstr "Mando de juegos de 3 botones" + +msgid "4-button gamepad" +msgstr "Mando de juegos de 4 botones" + +msgid "6-button gamepad" +msgstr "Mando de juegos de 6 botones" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Yugo de vuelo de 2 botones" + +msgid "3-button flight yoke" +msgstr "Yugo de vuelo de 3 botones" + +msgid "4-button flight yoke" +msgstr "Yugo de vuelo de 4 botones" + +msgid "2-button flight yoke with throttle" +msgstr "Yugo de vuelo de 2 botones con acelerador" + +msgid "3-button flight yoke with throttle" +msgstr "Yugo de vuelo de 3 botones con acelerador" + +msgid "4-button flight yoke with throttle" +msgstr "Yugo de vuelo de 4 botones con acelerador" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volante (de 3 ejes, 2 botones)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volante (de 3 ejes, 3 botones)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volante (de 3 ejes, 4 botones)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Mando(s) de juegos de 2 botones" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Yugo de vuelo de 2 botones" - -msgid "4-button gamepad" -msgstr "Mando de juegos de 4 botones" - -msgid "4-button flight yoke" -msgstr "Yugo de vuelo de 4 botones" - -msgid "2-button flight yoke with throttle" -msgstr "Yugo de vuelo de 2 botones con acelerador" - -msgid "4-button flight yoke with throttle" -msgstr "Yugo de vuelo de 4 botones con acelerador" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volante Win95 (de 3 ejes, 4 botones)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ninguno" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 24102f071..388659dba 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -603,9 +603,6 @@ msgstr "Kanava:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Määritä..." - msgid "Sectors:" msgstr "Sektorit:" @@ -852,9 +849,18 @@ msgstr "PCap-laitteita ei löytynyt" msgid "Invalid PCap device" msgstr "Virheellinen PCap-laite" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-akseliset 1-painikkeiset peliohjaimet" + msgid "2-axis, 2-button joystick(s)" msgstr "2-akseliset 2-painikkeiset peliohjaimet" +msgid "2-axis, 3-button joystick" +msgstr "2-akselinen 3-painikkeinen peliohjain" + msgid "2-axis, 4-button joystick" msgstr "2-akselinen 4-painikkeinen peliohjain" @@ -867,17 +873,98 @@ msgstr "2-akselinen 8-painikkeinen peliohjain" msgid "3-axis, 2-button joystick" msgstr "3-akselinen 2-painikkeinen peliohjain" +msgid "3-axis, 3-button joystick" +msgstr "3-akselinen 3-painikkeinen peliohjain" + msgid "3-axis, 4-button joystick" msgstr "3-akselinen 4-painikkeinen peliohjain" +msgid "4-axis, 2-button joystick" +msgstr "4-akselinen 2-painikkeinen peliohjain" + +msgid "4-axis, 3-button joystick" +msgstr "4-akselinen 3-painikkeinen peliohjain" + msgid "4-axis, 4-button joystick" msgstr "4-akselinen 4-painikkeinen peliohjain" +msgid "2-button gamepad(s)" +msgstr "2-painikkeiset peliohjaimet" + +msgid "3-button gamepad" +msgstr "3-painikkeinen peliohjain" + +msgid "4-button gamepad" +msgstr "4-painikkeinen peliohjain" + +msgid "6-button gamepad" +msgstr "6-painikkeinen peliohjain" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-painikkeinen lento-ohjain" + +msgid "3-button flight yoke" +msgstr "3-painikkeinen lento-ohjain" + +msgid "4-button flight yoke" +msgstr "4-painikkeinen lento-ohjain" + +msgid "2-button flight yoke with throttle" +msgstr "2-painikkeinen lento-ohjain kaasuvivulla" + +msgid "3-button flight yoke with throttle" +msgstr "3-painikkeinen lento-ohjain kaasuvivulla" + +msgid "4-button flight yoke with throttle" +msgstr "4-painikkeinen lento-ohjain kaasuvivulla" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "ratti (3-akselinen, 2-painikkeinen)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "ratti (3-akselinen, 3-painikkeinen)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "ratti (3-akselinen, 4-painikkeinen)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" -msgstr "" +msgstr "CH Flightstick Pro + CH Pedals" + +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -886,28 +973,13 @@ msgid "Thrustmaster Flight Control System" msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" -msgstr "" +msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2-painikkeiset peliohjaimet" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-painikkeinen lento-ohjain" - -msgid "4-button gamepad" -msgstr "4-painikkeinen peliohjain" - -msgid "4-button flight yoke" -msgstr "4-painikkeinen lento-ohjain" - -msgid "2-button flight yoke with throttle" -msgstr "2-painikkeinen lento-ohjain kaasuvivulla" - -msgid "4-button flight yoke with throttle" -msgstr "4-painikkeinen lento-ohjain kaasuvivulla" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95-ratti (3-akselinen, 4-painikkeinen)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ei mikään" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index c98280f3b..97ed25e57 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -603,9 +603,6 @@ msgstr "Canal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Spécifier..." - msgid "Sectors:" msgstr "Secteurs:" @@ -852,9 +849,18 @@ msgstr "Aucun dispositif PCap trouvé" msgid "Invalid PCap device" msgstr "Dispositif PCap invalide" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Manette(s) avec 2 axes, 1 boutons" + msgid "2-axis, 2-button joystick(s)" msgstr "Manette(s) avec 2 axes, 2 boutons" +msgid "2-axis, 3-button joystick" +msgstr "Manette avec 2 axes, 4 boutons" + msgid "2-axis, 4-button joystick" msgstr "Manette avec 2 axes, 4 boutons" @@ -867,18 +873,99 @@ msgstr "Manette avec 2 axes, 8 boutons" msgid "3-axis, 2-button joystick" msgstr "Manette avec 3 axes, 2 boutons" +msgid "3-axis, 3-button joystick" +msgstr "Manette avec 3 axes, 3 boutons" + msgid "3-axis, 4-button joystick" msgstr "Manette avec 3 axes, 4 boutons" +msgid "4-axis, 2-button joystick" +msgstr "Manette avec 4 axes, 2 boutons" + +msgid "4-axis, 3-button joystick" +msgstr "Manette avec 4 axes, 3 boutons" + msgid "4-axis, 4-button joystick" msgstr "Manette avec 4 axes, 4 boutons" +msgid "2-button gamepad(s)" +msgstr "Manette(s) de jeu à 2 boutons" + +msgid "3-button gamepad" +msgstr "Manette de jeu à 2 boutons" + +msgid "4-button gamepad" +msgstr "Manette de jeu à 4 boutons" + +msgid "6-button gamepad" +msgstr "Manette de jeu à 6 boutons" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Manette de vol à 2 boutons" + +msgid "3-button flight yoke" +msgstr "Manette de vol à 3 boutons" + +msgid "4-button flight yoke" +msgstr "Manette de vol à 4 boutons" + +msgid "2-button flight yoke with throttle" +msgstr "Manette de vol à 2 boutons avec manette des gaz" + +msgid "3-button flight yoke with throttle" +msgstr "Manette de vol à 3 boutons avec manette des gaz" + +msgid "4-button flight yoke with throttle" +msgstr "Manette de vol à 4 boutons avec manette des gaz" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volant (3 axes, 2 boutons)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volant (3 axes, 3 boutons)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volant (3 axes, 4 boutons)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Système de contrôle de vol Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "SCV Thrustmaster + Système de commande de gouvernail" -msgid "2-button gamepad(s)" -msgstr "Manette(s) de jeu à 2 boutons" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Manette de vol à 2 boutons" - -msgid "4-button gamepad" -msgstr "Manette de jeu à 2 boutons" - -msgid "4-button flight yoke" -msgstr "Manette de vol à 4 boutons" - -msgid "2-button flight yoke with throttle" -msgstr "Manette de vol à 2 boutons avec manette des gaz" - -msgid "4-button flight yoke with throttle" -msgstr "Manette de vol à 4 boutons avec manette des gaz" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volant Win95 (3 axes, 4 boutons)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Aucun" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 0ea717dce..27b304d9b 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Odredi..." - msgid "Sectors:" msgstr "Sektori:" @@ -852,9 +849,18 @@ msgstr "Nema PCap uređaja" msgid "Invalid PCap device" msgstr "Nevažeći PCap uređaj" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Palica za igru s 2 osi, 1 tipke" + msgid "2-axis, 2-button joystick(s)" msgstr "Palica za igru s 2 osi, 2 tipke" +msgid "2-axis, 3-button joystick" +msgstr "Palica za igru s 2 osi, 3 tipke" + msgid "2-axis, 4-button joystick" msgstr "Palica za igru s 2 osi, 4 tipke" @@ -867,18 +873,99 @@ msgstr "Palica za igru s 2 osi, 8 tipke" msgid "3-axis, 2-button joystick" msgstr "Palica za igru s 3 osi, 2 tipke" +msgid "3-axis, 3-button joystick" +msgstr "Palica za igru s 3 osi, 3 tipke" + msgid "3-axis, 4-button joystick" msgstr "Palica za igru s 3 osi, 4 tipke" +msgid "4-axis, 2-button joystick" +msgstr "Palica za igru s 4 osi, 2 tipke" + +msgid "4-axis, 3-button joystick" +msgstr "Palica za igru s 4 osi, 3 tipke" + msgid "4-axis, 4-button joystick" msgstr "Palica za igru s 4 osi, 4 tipke" +msgid "2-button gamepad(s)" +msgstr "Gamepad(ovi) s 2 tipke" + +msgid "3-button gamepad" +msgstr "Gamepad s 3 tipke" + +msgid "4-button gamepad" +msgstr "Gamepad s 4 tipke" + +msgid "6-button gamepad" +msgstr "Gamepad s 6 tipke" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Jaram za letenje s 2 tipke" + +msgid "3-button flight yoke" +msgstr "Jaram za letenje s 3 tipke" + +msgid "4-button flight yoke" +msgstr "Jaram za letenje s 4 tipke" + +msgid "2-button flight yoke with throttle" +msgstr "Jaram za letenje s 2 tipke i gasom" + +msgid "3-button flight yoke with throttle" +msgstr "Jaram za letenje s 3 tipke i gasom" + +msgid "4-button flight yoke with throttle" +msgstr "Jaram za letenje s 4 tipke i gasom" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volan (3 osi, 2 tipke)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volan (3 osi, 3 tipke)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volan (3 osi, 4 tipke)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Gamepad(ovi) s 2 tipke" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Jaram za letenje s 2 tipke" - -msgid "4-button gamepad" -msgstr "Gamepad s 4 tipke" - -msgid "4-button flight yoke" -msgstr "Jaram za letenje s 4 tipke" - -msgid "2-button flight yoke with throttle" -msgstr "Jaram za letenje s 2 tipke i gasom" - -msgid "4-button flight yoke with throttle" -msgstr "Jaram za letenje s 4 tipke i gasom" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volan Win95 (3 osi, 4 tipke)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Bez" @@ -1714,7 +1786,7 @@ msgid "Remove" msgstr "Ukloni" msgid "Browse..." -msgstr "Pregledajte..." +msgstr "Pretraži..." msgid "Couldn't create OpenGL context." msgstr "Nije moguće stvoriti kontekst OpenGL." diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index a399c59e6..860083676 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -603,9 +603,6 @@ msgstr "Canale:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Specifica..." - msgid "Sectors:" msgstr "Settori:" @@ -852,9 +849,18 @@ msgstr "Nessun dispositivo PCap trovato" msgid "Invalid PCap device" msgstr "Dispositivo PCap non valido" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick a 2 assi, 1 pulsanti" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick a 2 assi, 2 pulsanti" +msgid "2-axis, 3-button joystick" +msgstr "Joystick a 2 assi, 3 pulsanti" + msgid "2-axis, 4-button joystick" msgstr "Joystick a 2 assi, 4 pulsanti" @@ -867,18 +873,99 @@ msgstr "Joystick a 2 assi, 8 pulsanti" msgid "3-axis, 2-button joystick" msgstr "Joystick a 3 assi, 2 pulsanti" +msgid "3-axis, 3-button joystick" +msgstr "Joystick a 3 assi, 4 pulsanti" + msgid "3-axis, 4-button joystick" msgstr "Joystick a 3 assi, 4 pulsanti" +msgid "4-axis, 2-button joystick" +msgstr "Joystick a 4 assi, 2 pulsanti" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick a 4 assi, 3 pulsanti" + msgid "4-axis, 4-button joystick" msgstr "Joystick a 4 assi, 4 pulsanti" +msgid "2-button gamepad(s)" +msgstr "Gamepad a 2 pulsanti" + +msgid "3-button gamepad" +msgstr "Gamepad a 3 pulsanti" + +msgid "4-button gamepad" +msgstr "Gamepad a 4 pulsanti" + +msgid "6-button gamepad" +msgstr "Gamepad a 6 pulsanti" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Barra di comando a 2 pulsanti" + +msgid "3-button flight yoke" +msgstr "Barra di comando a 3 pulsanti" + +msgid "4-button flight yoke" +msgstr "Barra di comando a 4 pulsanti" + +msgid "2-button flight yoke with throttle" +msgstr "Barra di comando a 2 pulsanti con acceleratore" + +msgid "3-button flight yoke with throttle" +msgstr "Barra di comando a 4 pulsanti con acceleratore" + +msgid "4-button flight yoke with throttle" +msgstr "Barra di comando a 4 pulsanti con acceleratore" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volante (3 assi, 2 pulsanti)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volante (3 assi, 3 pulsanti)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volante (3 assi, 4 pulsanti)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + Pedali CH" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedali Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedali" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedali Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedali" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedali Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder" @@ -888,26 +975,11 @@ msgstr "Sistema di controllo Thrustmaster Flight" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Sistema di controllo timone" -msgid "2-button gamepad(s)" -msgstr "Gamepad a 2 pulsanti" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Barra di comando a 2 pulsanti" - -msgid "4-button gamepad" -msgstr "Gamepad a 4 pulsanti" - -msgid "4-button flight yoke" -msgstr "Barra di comando a 4 pulsanti" - -msgid "2-button flight yoke with throttle" -msgstr "Barra di comando a 2 pulsanti con acceleratore" - -msgid "4-button flight yoke with throttle" -msgstr "Barra di comando a 4 pulsanti con acceleratore" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volante Win95 (3 assi, 4 pulsanti)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Nessuno" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 5c6aa485c..0e854d189 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -603,9 +603,6 @@ msgstr "チャンネル:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "参照(&S)..." - msgid "Sectors:" msgstr "セクター:" @@ -852,9 +849,18 @@ msgstr "PCapデバイスがありません" msgid "Invalid PCap device" msgstr "不正なPCapデバイス" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "ジョイスティック(2軸、1ボタン)" + msgid "2-axis, 2-button joystick(s)" msgstr "ジョイスティック(2軸、2ボタン)" +msgid "2-axis, 3-button joystick" +msgstr "ジョイスティック(2軸、3ボタン)" + msgid "2-axis, 4-button joystick" msgstr "ジョイスティック(2軸、4ボタン)" @@ -867,18 +873,99 @@ msgstr "ジョイスティック(2軸、8ボタン)" msgid "3-axis, 2-button joystick" msgstr "ジョイスティック(3軸、2ボタン)" +msgid "3-axis, 3-button joystick" +msgstr "ジョイスティック(3軸、3ボタン)" + msgid "3-axis, 4-button joystick" msgstr "ジョイスティック(3軸、4ボタン)" +msgid "4-axis, 2-button joystick" +msgstr "ジョイスティック(4軸、2ボタン)" + +msgid "4-axis, 3-button joystick" +msgstr "ジョイスティック(4軸、3ボタン)" + msgid "4-axis, 4-button joystick" msgstr "ジョイスティック(4軸、4ボタン)" +msgid "2-button gamepad(s)" +msgstr "2ボタン式ゲームパッド" + +msgid "3-button gamepad" +msgstr "3ボタン式ゲームパッド" + +msgid "4-button gamepad" +msgstr "4ボタン式ゲームパッド" + +msgid "6-button gamepad" +msgstr "6ボタン式ゲームパッド" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2ボタン式操縦桿" + +msgid "3-button flight yoke" +msgstr "3ボタン式操縦桿" + +msgid "4-button flight yoke" +msgstr "4ボタン式操縦桿" + +msgid "2-button flight yoke with throttle" +msgstr "2ボタン式フライトヨーク(スロットル付き)" + +msgid "3-button flight yoke with throttle" +msgstr "3ボタン式フライトヨーク(スロットル付き)" + +msgid "4-button flight yoke with throttle" +msgstr "4ボタン式フライトヨーク(スロットル付き)" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "ステアリングホイール(3軸、2ボタン)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "ステアリングホイール(3軸、3ボタン)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "ステアリングホイール(3軸、4ボタン)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinderパッド" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2ボタン式ゲームパッド" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2ボタン式操縦桿" - -msgid "4-button gamepad" -msgstr "4ボタン式ゲームパッド" - -msgid "4-button flight yoke" -msgstr "4ボタン式操縦桿" - -msgid "2-button flight yoke with throttle" -msgstr "2ボタン式フライトヨーク(スロットル付き)" - -msgid "4-button flight yoke with throttle" -msgstr "4ボタン式フライトヨーク(スロットル付き)" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 ステアリングホイール(3軸、4ボタン)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "なし" @@ -1714,7 +1786,7 @@ msgid "Remove" msgstr "削除" msgid "Browse..." -msgstr "ブラウズ..." +msgstr "参照..." msgid "Couldn't create OpenGL context." msgstr "OpenGLコンテキストを作成できませんでした。" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 4474138b2..c95d073fa 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -603,9 +603,6 @@ msgstr "채널:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "열기(&S)..." - msgid "Sectors:" msgstr "섹터:" @@ -852,9 +849,18 @@ msgstr "PCap 장치가 없습니다" msgid "Invalid PCap device" msgstr "PCap 장치가 올바르지 않습니다" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2축, 1버튼 조이스틱" + msgid "2-axis, 2-button joystick(s)" msgstr "2축, 2버튼 조이스틱" +msgid "2-axis, 3-button joystick" +msgstr "2축, 3버튼 조이스틱" + msgid "2-axis, 4-button joystick" msgstr "2축, 4버튼 조이스틱" @@ -867,18 +873,99 @@ msgstr "2축, 8버튼 조이스틱" msgid "3-axis, 2-button joystick" msgstr "3축, 2버튼 조이스틱" +msgid "3-axis, 3-button joystick" +msgstr "3축, 3버튼 조이스틱" + msgid "3-axis, 4-button joystick" msgstr "3축, 4버튼 조이스틱" +msgid "4-axis, 2-button joystick" +msgstr "4축, 2버튼 조이스틱" + +msgid "4-axis, 3-button joystick" +msgstr "4축, 3버튼 조이스틱" + msgid "4-axis, 4-button joystick" msgstr "4축, 4버튼 조이스틱" +msgid "2-button gamepad(s)" +msgstr "2버튼 게임패드" + +msgid "3-button gamepad" +msgstr "3버튼 게임패드" + +msgid "4-button gamepad" +msgstr "4버튼 게임패드" + +msgid "6-button gamepad" +msgstr "6버튼 게임패드" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2버튼 비행 조종간" + +msgid "3-button flight yoke" +msgstr "3버튼 비행 조종간" + +msgid "4-button flight yoke" +msgstr "4버튼 비행 조종간" + +msgid "2-button flight yoke with throttle" +msgstr "2버튼 비행 조종간과 스로틀" + +msgid "3-button flight yoke with throttle" +msgstr "3버튼 비행 조종간과 스로틀" + +msgid "4-button flight yoke with throttle" +msgstr "4버튼 비행 조종간과 스로틀" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "조타륜 (3축, 2버튼)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "조타륜 (3축, 3버튼)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "조타륜 (3축, 4버튼)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2버튼 게임패드" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2버튼 비행 조종간" - -msgid "4-button gamepad" -msgstr "4버튼 게임패드" - -msgid "4-button flight yoke" -msgstr "4버튼 비행 조종간" - -msgid "2-button flight yoke with throttle" -msgstr "2버튼 비행 조종간과 스로틀" - -msgid "4-button flight yoke with throttle" -msgstr "4버튼 비행 조종간과 스로틀" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 조타륜 (3축, 4버튼)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "없음" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index 06b7a4f25..e088c27cf 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Angi..." - msgid "Sectors:" msgstr "Sektorer:" @@ -852,9 +849,18 @@ msgstr "Ingen PCap-enheter funnet" msgid "Invalid PCap device" msgstr "Ugyldig PCap-enhet" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-akset, 1-knapps styrespak(er)" + msgid "2-axis, 2-button joystick(s)" msgstr "2-akset, 2-knapps styrespak(er)" +msgid "2-axis, 3-button joystick" +msgstr "2-akset, 3-knapps styrespak" + msgid "2-axis, 4-button joystick" msgstr "2-akset, 4-knapps styrespak" @@ -867,18 +873,99 @@ msgstr "2-akset, 8-knapps styrespak" msgid "3-axis, 2-button joystick" msgstr "3-akset, 2-knapps styrespak" +msgid "3-axis, 3-button joystick" +msgstr "3-akset, 4-knapps styrespak" + msgid "3-axis, 4-button joystick" msgstr "3-akset, 4-knapps styrespak" +msgid "4-axis, 2-button joystick" +msgstr "4-akset, 2-knapps styrespak" + +msgid "4-axis, 3-button joystick" +msgstr "4-akset, 3-knapps styrespak" + msgid "4-axis, 4-button joystick" msgstr "4-akset, 4-knapps styrespak" +msgid "2-button gamepad(s)" +msgstr "2-knapps gamepad(er)" + +msgid "3-button gamepad" +msgstr "3-knapps gamepad" + +msgid "4-button gamepad" +msgstr "4-knapps gamepad" + +msgid "6-button gamepad" +msgstr "6-knapps gamepad" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-knapps flystyre" + +msgid "3-button flight yoke" +msgstr "3-knapps flystyre" + +msgid "4-button flight yoke" +msgstr "4-knapps flystyre" + +msgid "2-button flight yoke with throttle" +msgstr "2-knapps flystyre med gass" + +msgid "3-button flight yoke with throttle" +msgstr "3-knapps flystyre med gass" + +msgid "4-button flight yoke with throttle" +msgstr "4-knapps flystyre med gass" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Ratt (3-akset, 3-knapps)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Ratt (3-akset, 3-knapps)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Ratt (3-akset, 4-knapps)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedaler" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedaler Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedaler" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedaler Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedaler" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedaler Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedaler" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedaler Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Ror-kontrollsystem" -msgid "2-button gamepad(s)" -msgstr "2-knapps gamepad(er)" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-knapps flystyre" - -msgid "4-button gamepad" -msgstr "4-knapps gamepad" - -msgid "4-button flight yoke" -msgstr "4-knapps flystyre" - -msgid "2-button flight yoke with throttle" -msgstr "2-knapps flystyre med gass" - -msgid "4-button flight yoke with throttle" -msgstr "4-knapps flystyre med gass" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 Ratt (3-akset, 4-knapps)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ingen" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 68bcbc2bf..df48e62d8 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -43,7 +43,7 @@ msgid "&Hide status bar" msgstr "&Statusbalk verbergen" msgid "Hide &toolbar" -msgstr "Verberg &toolbar" +msgstr "&Toolbar verbergen" msgid "&Resizeable window" msgstr "&Venster met aanpasbare grootte" @@ -109,7 +109,7 @@ msgid "Fi<er method" msgstr "Filtermethode" msgid "&Nearest" -msgstr "&Dichtsbijzijnde" +msgstr "&Dichtstbijzijnde" msgid "&Linear" msgstr "&Lineair" @@ -220,7 +220,7 @@ msgid "Begin trace" msgstr "Begin traceren" msgid "End trace" -msgstr "Traceren beëindigen" +msgstr "Beëindig traceren" msgid "&Help" msgstr "&Help" @@ -232,19 +232,19 @@ msgid "&About 86Box..." msgstr "&Over 86Box..." msgid "&New image..." -msgstr "&Nieuw image..." +msgstr "&Nieuw imagebestand..." msgid "&Existing image..." -msgstr "&Bestaande image..." +msgstr "&Bestaande imagebestand..." msgid "Existing image (&Write-protected)..." -msgstr "Bestaande image (&Schrijfbeveiligd)..." +msgstr "Bestaand imagebestand (&Schrijfbeveiligd)..." msgid "&Record" msgstr "&Opnemen" msgid "&Play" -msgstr "&Play" +msgstr "&Afspelen" msgid "&Rewind to the beginning" msgstr "&Terugspoelen naar het begin" @@ -256,19 +256,19 @@ msgid "E&ject" msgstr "&Uitwerpen" msgid "&Image..." -msgstr "&Image..." +msgstr "&Imagebestand..." msgid "E&xport to 86F..." msgstr "E&xporteer naar 86F..." msgid "&Mute" -msgstr "&Mute" +msgstr "&Dempen" msgid "E&mpty" -msgstr "E&mpty" +msgstr "&Leeg" msgid "Reload previous image" -msgstr "Herlaad vorige image" +msgstr "Herlaad vorig imagebestand" msgid "&Folder..." msgstr "&Map..." @@ -301,7 +301,7 @@ msgid "&Select shader..." msgstr "&Selecteer shader..." msgid "&Remove shader" -msgstr "&Remove shader" +msgstr "&Verwijder shader" msgid "Preferences" msgstr "Voorkeuren" @@ -310,7 +310,7 @@ msgid "Sound Gain" msgstr "Geluidsversterking" msgid "New Image" -msgstr "Nieuw image" +msgstr "Nieuw imagebestand" msgid "Settings" msgstr "Instellingen" @@ -343,7 +343,7 @@ msgid "RPM mode:" msgstr "RPM-modus:" msgid "Progress:" -msgstr "Vooruitgang:" +msgstr "Voortgang:" msgid "Width:" msgstr "Breedte:" @@ -352,7 +352,7 @@ msgid "Height:" msgstr "Hoogte:" msgid "Lock to this size" -msgstr "Leg vast op deze grootte" +msgstr "Vergrendel deze grootte" msgid "Machine type:" msgstr "Machinetype:" @@ -403,10 +403,10 @@ msgid "Dynamic Recompiler" msgstr "Dynamische Recompiler" msgid "CPU frame size" -msgstr "CPU frame grootte" +msgstr "CPU framegrootte" msgid "Larger frames (less smooth)" -msgstr "Groter frames (minder vloeiend)" +msgstr "Grotere frames (minder vloeiend)" msgid "Smaller frames (smoother)" msgstr "Kleinere frames (vloeiender)" @@ -430,7 +430,7 @@ msgid "IBM PS/55 Display Adapter Graphics" msgstr "IBM PS/55 Display Adapter Graphics" msgid "Keyboard:" -msgstr "Toetsenbord" +msgstr "Toetsenbord:" msgid "Keyboard" msgstr "Toetsenbord" @@ -472,13 +472,13 @@ msgid "Sound card #4:" msgstr "Geluidskaart #4:" msgid "MIDI Out Device:" -msgstr "MIDI Out-apparaat:" +msgstr "MIDI Uitvoerapparaat:" msgid "MIDI In Device:" -msgstr "MIDI In-apparaat:" +msgstr "MIDI Invoerapparaat:" msgid "MIDI Out:" -msgstr "Midi Out:" +msgstr "Midi Uit:" msgid "Standalone MPU-401" msgstr "Standalone MPU-401" @@ -603,9 +603,6 @@ msgstr "Kanaal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Specificeer..." - msgid "Sectors:" msgstr "Sectoren:" @@ -649,7 +646,7 @@ msgid "Removable disks:" msgstr "Verwisselbare schijven:" msgid "Removable disk drives:" -msgstr "Verwisselbare schijfstations" +msgstr "Verwisselbare schijfstations:" msgid "ZIP 250" msgstr "ZIP 250" @@ -712,13 +709,13 @@ msgid "&Removable disk %1 (%2): %3" msgstr "&Verwijderbare schijf %1 (%2): %3" msgid "Removable disk images" -msgstr "Verwijderbare schijf image" +msgstr "Verwijderbaar schijfimagebestand" msgid "Image %1" msgstr "Image %1" msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." -msgstr "86Box kon geen bruikbare ROM images vinden.\n\nDownload een ROM set en pak deze uit in de map \"roms\"." +msgstr "86Box kon geen bruikbare ROM imagebestanden vinden.\n\nDownload een ROM set en pak deze uit in de map \"roms\"." msgid "(empty)" msgstr "(leeg)" @@ -814,7 +811,7 @@ msgid "Click to capture mouse" msgstr "Klik om muis vast te leggen" msgid "Press %1 to release mouse" -msgstr "Druk op %1 om de muis los te laten" +msgstr "Druk op %1 om de muis vrij te geven" msgid "Press %1 or middle button to release mouse" msgstr "Druk op %1 of middelste knop om de muis los te laten" @@ -852,9 +849,18 @@ msgstr "Geen PCap-apparaten gevonden" msgid "Invalid PCap device" msgstr "Ongeldig PCap-apparaat" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick(s) met 2 assen en 1 knoppen" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick(s) met 2 assen en 2 knoppen" +msgid "2-axis, 3-button joystick" +msgstr "Joystick met 2 assen en 3 knoppen" + msgid "2-axis, 4-button joystick" msgstr "Joystick met 2 assen en 4 knoppen" @@ -867,18 +873,99 @@ msgstr "Joystick met 2 assen en 8 knoppen" msgid "3-axis, 2-button joystick" msgstr "Joystick met 3 assen en 2 knoppen" +msgid "3-axis, 3-button joystick" +msgstr "Joystick met 3 assen en 3 knoppen" + msgid "3-axis, 4-button joystick" msgstr "Joystick met 3 assen en 4 knoppen" +msgid "4-axis, 2-button joystick" +msgstr "Joystick met 4 assen en 2 knoppen" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick met 4 assen en 3 knoppen" + msgid "4-axis, 4-button joystick" msgstr "Joystick met 4 assen en 4 knoppen" +msgid "2-button gamepad(s)" +msgstr "2-knops gamepad(s)" + +msgid "3-button gamepad" +msgstr "3-knops gamepad" + +msgid "4-button gamepad" +msgstr "4-knops gamepad" + +msgid "6-button gamepad" +msgstr "6-knops gamepad" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-knops stuurknuppel" + +msgid "3-button flight yoke" +msgstr "3-knops stuurknuppel" + +msgid "4-button flight yoke" +msgstr "4-knops stuurknuppel" + +msgid "2-button flight yoke with throttle" +msgstr "2-kops stuurknuppel met gashendel " + +msgid "3-button flight yoke with throttle" +msgstr "3-kops stuurknuppel met gashendel" + +msgid "4-button flight yoke with throttle" +msgstr "4-kops stuurknuppel met gashendel" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Stuurwiel (3 assen, 2 knoppen)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Stuurwiel (3 assen, 3 knoppen)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Stuurwiel (3 assen, 4 knoppen)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedalen" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedalen Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedalen" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedalen Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedalen" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedalen Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedalen" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedalen Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control systeem" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Roer Control Systeem" -msgid "2-button gamepad(s)" -msgstr "2-knops gamepad(s)" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-knops stuurknuppel" - -msgid "4-button gamepad" -msgstr "4-knops gamepad" - -msgid "4-button flight yoke" -msgstr "4-knops stuurknuppel" - -msgid "2-button flight yoke with throttle" -msgstr "2-kops stuurknuppel met gashendel " - -msgid "4-button flight yoke with throttle" -msgstr "2-kops stuurknuppel met gashendel" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 Stuurwiel (3 assen, 4 knoppen)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Geen" @@ -973,7 +1045,7 @@ msgid "Do you want to save the settings?" msgstr "Wil je de instellingen opslaan?" msgid "This will hard reset the emulated machine." -msgstr "Dit zal de geëmuleerde machine een hard reset geven." +msgstr "Dit zal de geëmuleerde machine een harde reset geven." msgid "Save" msgstr "Opslaan" @@ -1054,10 +1126,10 @@ msgid "Cartridge images" msgstr "Cartridge-images" msgid "Resume execution" -msgstr "Hervat executie" +msgstr "Hervat uitvoering" msgid "Pause execution" -msgstr "Pauze executie" +msgstr "Pauzeer uitvoering" msgid "Ctrl+Alt+Del" msgstr "Ctrl+Alt+Del" @@ -1084,7 +1156,7 @@ msgid "&Start" msgstr "&Start" msgid "Not running" -msgstr "Niet actied" +msgstr "Niet actief" msgid "Running" msgstr "Actief" @@ -1093,10 +1165,10 @@ msgid "Paused" msgstr "Gepauzeerd" msgid "Waiting" -msgstr "aan het wachtend" +msgstr "Aan het wachten" msgid "Powered Off" -msgstr "Sluit af" +msgstr "Uitgeschakeld" msgid "%n running" msgstr "%n actief" @@ -1126,7 +1198,7 @@ msgid "86Box configuration files (86box.cfg)" msgstr "86Box configuratiebestanden (86box.cfg)" msgid "Configuration read failed" -msgstr "Lezen configuratie mislukt" +msgstr "Lezen van configuratie mislukt" msgid "Unable to open the selected configuration file for reading: %1" msgstr "Openen van geselecteerd configuratiebestand voor lezen niet mogelijk: %1" @@ -1138,7 +1210,7 @@ msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM msgstr "%1 machine(s) zijn nu actief. Weet je zeker dat je de VM manager wil afsluiten?" msgid "Add new system wizard" -msgstr "Assistent voor toevoegen van nieuw systeem" +msgstr "Wizard toevoegen van nieuw systeem" msgid "Introduction" msgstr "Introductie" @@ -1186,13 +1258,13 @@ msgid "Directory does not exist" msgstr "Map bestaat niet" msgid "A new directory for the system will be created in the selected directory above" -msgstr "Een nieuwe map voor het systeem wordt aangemaakt in de boven geselecteerde map" +msgstr "Een nieuwe map voor het systeem wordt aangemaakt in de hierboven geselecteerde map" msgid "System location:" msgstr "Systeemlocatie:" msgid "System name and location" -msgstr "Systeemnaam en -locatie" +msgstr "Systeemnaam en locatie" msgid "Enter the name of the system and choose the location" msgstr "Voer de naam in van het systeem en kies een locatie" @@ -1252,7 +1324,7 @@ msgid "Failed to create directory for cloned VM" msgstr "Map aanmaken voor gekloonde VM mislukt" msgid "Failed to clone VM." -msgstr "Kolen van VM mislukt." +msgstr "Klonen van VM mislukt." msgid "Directory in use" msgstr "Map in gebruik" @@ -1303,7 +1375,7 @@ msgid "&Kill" msgstr "&Gedwongen beëindigen" msgid "Killing a virtual machine can cause data loss. Only do this if the 86Box process gets stuck.\n\nDo you really wish to kill the virtual machine \"%1\"?" -msgstr "Gedwongen beëindiging van een virtuele machine kan dataverlies veroorzaken. Doe dit alleen wanneer het 86Box process is vast gelopen.\n\nWeet je zeker dat je de virtuele machine \"%1\" wil beëindigen?" +msgstr "Gedwongen beëindiging van een virtuele machine kan dataverlies veroorzaken. Doe dit alleen wanneer het 86Box-proces is vast gelopen.\n\nWeet je zeker dat je de virtuele machine \"%1\" wil beëindigen?" msgid "&Delete" msgstr "&Verwijderen" @@ -1345,10 +1417,10 @@ msgid "Audio:" msgstr "Audio:" msgid "ACPI shutdown" -msgstr "ACPI uitschakeling" +msgstr "ACPI-uitschakeling" msgid "ACP&I shutdown" -msgstr "ACP&I uitschakeling" +msgstr "ACP&I-uitschakeling" msgid "Hard disk (%1)" msgstr "Harde schijf (%1)" @@ -1375,7 +1447,7 @@ msgid "Disk images cannot be larger than 127 GB." msgstr "Schijfimages kunnen niet groter zijn dan 127 GB." msgid "Hard disk images" -msgstr "Harde schijf-image" +msgstr "Harde schijf-images" msgid "Unable to read file" msgstr "Kan bestand niet lezen" @@ -1384,7 +1456,7 @@ msgid "Unable to write file" msgstr "Kan bestand niet schrijven" msgid "HDI or HDX images with a sector size other than 512 are not supported." -msgstr "HDI- of HDX-image met een andere sectorgrootte dan 512 worden niet ondersteund." +msgstr "HDI- of HDX-images met een andere sectorgrootte dan 512 worden niet ondersteund." msgid "Disk image file already exists" msgstr "Schijfimagebestand bestaat al" @@ -1432,7 +1504,7 @@ msgid "Fixed-size VHD" msgstr "VHD met vaste grootte" msgid "Dynamic-size VHD" -msgstr "VHD met dynamisch grootte" +msgstr "VHD met dynamische grootte" msgid "Differencing VHD" msgstr "Verschil-VHD" @@ -1453,7 +1525,7 @@ msgid "Fixed-size VHD (.vhd)" msgstr "VHD met vaste grootte (.vhd)" msgid "Dynamic-size VHD (.vhd)" -msgstr "VHD met dynamisch grootte (.vhd)" +msgstr "VHD met dynamische grootte (.vhd)" msgid "Differencing VHD (.vhd)" msgstr "Verschil-VHD (.vhd)" @@ -1639,7 +1711,7 @@ msgid "List of MCA devices:" msgstr "Lijst van MCA-apparaten:" msgid "&Tablet tool" -msgstr "Tablet-hulpmiddel" +msgstr "&Tablet-hulpmiddel" msgid "About &Qt" msgstr "Over &Qt" @@ -1648,10 +1720,10 @@ msgid "&MCA devices..." msgstr "MCA-apparaten..." msgid "Show non-&primary monitors" -msgstr "Toon niet-primaire monitors" +msgstr "Toon niet-primaire beeldschermen" msgid "Open screenshots &folder..." -msgstr "Map met schermafbeeldingen openen..." +msgstr "&Map met schermafbeeldingen openen..." msgid "Appl&y fullscreen stretch mode when maximized" msgstr "Schakel de volledig scherm-uitrekmodus in bij maximaliseren" @@ -1663,7 +1735,7 @@ msgid "&Pen" msgstr "&Pen" msgid "&Host CD/DVD Drive (%1:)" -msgstr "&Host cd/dvd-station (%1:)" +msgstr "&Host CD/DVD-station (%1:)" msgid "&Connected" msgstr "&Verbonden" @@ -1672,7 +1744,7 @@ msgid "Clear image &history" msgstr "Imagegeschiedenis verwijderen(&H)" msgid "Create..." -msgstr "Creëer..." +msgstr "Aanmaken..." msgid "Host CD/DVD Drive (%1)" msgstr "Host CD/DVD-station (%1)" @@ -1717,10 +1789,10 @@ msgid "Browse..." msgstr "Bladeren..." msgid "Couldn't create OpenGL context." -msgstr "Kan OpenGL context niet aanmaken." +msgstr "Kan OpenGL-context niet aanmaken." msgid "Couldn't switch to OpenGL context." -msgstr "Kan niet overschakelen naar OpenGL context." +msgstr "Kan niet overschakelen naar OpenGL-context." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGL versie 3.0 of hoger is vereist. De huidige versie is %1.%2" @@ -1783,7 +1855,7 @@ msgid "VDE Socket:" msgstr "VDE-socket:" msgid "86Box Unit Tester" -msgstr "86Box apparaattester" +msgstr "86Box Apparaattester" msgid "Novell NetWare 2.x Key Card" msgstr "Novell NetWare 2.x Key Card" @@ -1855,7 +1927,7 @@ msgid "Default Baud rate" msgstr "Standaard baudrate" msgid "[COM] Standard Hayes-compliant Modem" -msgstr "COM] Standaard Hayes-compatibele modem " +msgstr "[COM] Standaard Hayes-compatibele modem " msgid "Roland MT-32 Emulation" msgstr "Roland MT-32-emulatie" @@ -1939,7 +2011,7 @@ msgid "Parallel port IRQ" msgstr "Parallelle poort IRQ" msgid "BIOS Revision" -msgstr "BIOS Revisie" +msgstr "BIOS-Revisie" msgid "BIOS Version" msgstr "BIOS-versie" @@ -2557,16 +2629,16 @@ msgid "Apply overscan deltas" msgstr "Overscan-delta’s toepassen" msgid "Mono Interlaced" -msgstr "Mono geïnterlaced " +msgstr "Mono Interlaced " msgid "Mono Non-Interlaced" -msgstr "Mono niet geïnterlaced" +msgstr "Mono Niet-Interlaced" msgid "Color Interlaced" -msgstr "Kleur interlaced" +msgstr "Kleur Interlaced" msgid "Color Non-Interlaced" -msgstr "Kleur niet geïnterlaced" +msgstr "Kleur Niet-Interlaced" msgid "3Dfx Voodoo Graphics" msgstr "3Dfx Voodoo Graphics" @@ -2653,7 +2725,7 @@ msgid "E&ject %1" msgstr "&Uitwerpen %1" msgid "&Unmute" -msgstr "&Geluid aanzetten" +msgstr "&Dempen opheffen" msgid "Softfloat FPU" msgstr "Softfloat FPU" @@ -2779,7 +2851,7 @@ msgid "Keybind" msgstr "Toetskoppeling" msgid "Clear binding" -msgstr "Wis koppelinh" +msgstr "Wis koppeling" msgid "Bind" msgstr "Koppel" @@ -2794,7 +2866,7 @@ msgid "Bind conflict" msgstr "Koppelconflict" msgid "This key combo is already in use." -msgstr "Deze toetsencombinatie is al in gebruik" +msgstr "Deze toetsencombinatie is al in gebruik." msgid "Send Control+Alt+Del" msgstr "Stuur Control+Alt+Del" @@ -2812,7 +2884,7 @@ msgid "Release mouse pointer" msgstr "Geef muis vrij" msgid "Toggle pause" -msgstr "Pause omschakelen" +msgstr "Pauzeren omschakelen" msgid "Toggle mute" msgstr "Geluiddemping omschakelen" @@ -2833,13 +2905,13 @@ msgid "Remote Switch" msgstr "Externe Switch" msgid "Switch:" -msgstr "Switch" +msgstr "Switch:" msgid "Hub Mode" msgstr "Hub-modus" msgid "Hostname:" -msgstr "Hostname" +msgstr "Hostnaam" msgid "ISA RAM:" msgstr "ISA RAM:" @@ -2863,10 +2935,10 @@ msgid "An error occurred trying to wipe the NVRAM contents of the virtual machin msgstr "Fout bij Wissen van NVRAM-inhoud van de virtuele machine \"%1\"" msgid "%1 VM Manager" -msgstr "%1 VM Manager" +msgstr "%1 VM Beheerder" msgid "%n disk(s)" -msgstr "%n schijf(en)" +msgstr "%n schijf/schijven" msgid "Unknown Status" msgstr "Onbekende Status" @@ -2875,7 +2947,7 @@ msgid "No Machines Found!" msgstr "Geen Machines Gevonden!" msgid "Check for updates on startup" -msgstr "Controleer op updates bij start" +msgstr "Controleer op updates bij starten" msgid "Unable to determine release information" msgstr "Kan release-informatie niet bepalen" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 4398dcafb..73b6952bd 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -603,9 +603,6 @@ msgstr "Kanał:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Określ..." - msgid "Sectors:" msgstr "Sektory:" @@ -852,9 +849,18 @@ msgstr "Nie znaleziono urządzeń PCap" msgid "Invalid PCap device" msgstr "Nieprawidłowe urządzenie PCap" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joysticki 2-osiowe, 1-przyciskowe" + msgid "2-axis, 2-button joystick(s)" msgstr "Joysticki 2-osiowe, 2-przyciskowe" +msgid "2-axis, 3-button joystick" +msgstr "Joystick 2-osiowy, 3-przyciskowy" + msgid "2-axis, 4-button joystick" msgstr "Joystick 2-osiowy, 4-przyciskowy" @@ -867,18 +873,99 @@ msgstr "Joystick 2-osiowy, 8-przyciskowy" msgid "3-axis, 2-button joystick" msgstr "Joystick 3-osiowy, 2-przyciskowy" +msgid "3-axis, 3-button joystick" +msgstr "Joystick 3-osiowy, 2-przyciskowy" + msgid "3-axis, 4-button joystick" msgstr "Joystick 3-osiowy, 4-przyciskowy" +msgid "4-axis, 2-button joystick" +msgstr "Joystick 4-osiowy, 2-przyciskowy" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick 4-osiowy, 3-przyciskowy" + msgid "4-axis, 4-button joystick" msgstr "Joystick 4-osiowy, 4-przyciskowy" +msgid "2-button gamepad(s)" +msgstr "Pad(y) z dwoma przyciskami" + +msgid "3-button gamepad" +msgstr "Pad z trzy przyciskami" + +msgid "4-button gamepad" +msgstr "Pad z czterema przyciskami" + +msgid "6-button gamepad" +msgstr "Pad z sześć przyciskami" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Wolant z dwoma przyciskami" + +msgid "3-button flight yoke" +msgstr "Wolant z trzema guzikami" + +msgid "4-button flight yoke" +msgstr "Wolant z czterema przyciskami" + +msgid "2-button flight yoke with throttle" +msgstr "Wolant z dwoma przyciskami i przepustnicą" + +msgid "3-button flight yoke with throttle" +msgstr "Wolant z trzema przyciskami i przepustnicą" + +msgid "4-button flight yoke with throttle" +msgstr "Wolant z czterema przyciskami i przepustnicą" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Kierownica (3 osie, 2 przyciski)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Kierownica (3 osie, 3 przyciski)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Kierownica (3 osie, 4 przyciski)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Pad(y) z dwoma przyciskami" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Wolant z dwoma przyciskami" - -msgid "4-button gamepad" -msgstr "Pad z czterema przyciskami" - -msgid "4-button flight yoke" -msgstr "Wolant z czterema przyciskami" - -msgid "2-button flight yoke with throttle" -msgstr "Wolant z dwoma przyciskami i przepustnicą" - -msgid "4-button flight yoke with throttle" -msgstr "Wolant z czterema przyciskami i przepustnicą" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Kierownica Win95 (3 osie, 4 przyciski)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Żaden" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 010005780..f1ff0bc09 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -603,9 +603,6 @@ msgstr "Canal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Especificar..." - msgid "Sectors:" msgstr "Setores:" @@ -852,9 +849,18 @@ msgstr "Nenhum dispositivo PCap encontrado" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick(s) de 2 eixos, 1 botões" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick(s) de 2 eixos, 2 botões" +msgid "2-axis, 3-button joystick" +msgstr "Joystick de 2 eixos, 3 botões" + msgid "2-axis, 4-button joystick" msgstr "Joystick de 2 eixos, 4 botões" @@ -867,18 +873,99 @@ msgstr "Joystick de 2 eixos, 8 botões" msgid "3-axis, 2-button joystick" msgstr "Joystick de 3 eixos, 2 botões" +msgid "3-axis, 3-button joystick" +msgstr "Joystick de 3 eixos, 3 botões" + msgid "3-axis, 4-button joystick" msgstr "Joystick de 3 eixos, 4 botões" +msgid "4-axis, 2-button joystick" +msgstr "Joystick de 4 eixos, 2 botões" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick de 4 eixos, 3 botões" + msgid "4-axis, 4-button joystick" msgstr "Joystick de 4 eixos, 4 botões" +msgid "2-button gamepad(s)" +msgstr "Gamepad(s) de 2 botões" + +msgid "3-button gamepad" +msgstr "Gamepad de 3 botões" + +msgid "4-button gamepad" +msgstr "Gamepad de 4 botões" + +msgid "6-button gamepad" +msgstr "Gamepad de 6 botões" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Manche de voo de 2 botões" + +msgid "3-button flight yoke" +msgstr "Manche de voo de 3 botões" + +msgid "4-button flight yoke" +msgstr "Manche de voo de 4 botões" + +msgid "2-button flight yoke with throttle" +msgstr "Manche de voo de 2 botões com acelerador" + +msgid "3-button flight yoke with throttle" +msgstr "Manche de voo de 3 botões com acelerador" + +msgid "4-button flight yoke with throttle" +msgstr "Manche de voo de 4 botões com acelerador" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volante (3 eixos, 2 botões)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volante (3 eixos, 3 botões)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volante (3 eixos, 4 botões)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + Pedais CH" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + Pedais CH Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + Pedais CH" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + Pedais CH Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + Pedais CH" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + Pedais CH Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Sistema de Controle de Voo Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "SCV Thrustmaster + Sistema de Controle de Leme" -msgid "2-button gamepad(s)" -msgstr "Gamepad(s) de 2 botões" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Manche de voo de 2 botões" - -msgid "4-button gamepad" -msgstr "Gamepad de 4 botões" - -msgid "4-button flight yoke" -msgstr "Manche de voo de 4 botões" - -msgid "2-button flight yoke with throttle" -msgstr "Manche de voo de 2 botões com acelerador" - -msgid "4-button flight yoke with throttle" -msgstr "Manche de voo de 4 botões com acelerador" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volante Win95 (3 eixos, 4 botões)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Nenhum" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index a33ba0119..dd4c61d1c 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -603,9 +603,6 @@ msgstr "Canal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Especificar..." - msgid "Sectors:" msgstr "Sectores:" @@ -852,9 +849,18 @@ msgstr "Não foi encontrado um dispositivo PCap" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick(s) de 2 eixos, 1 botões" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick(s) de 2 eixos, 2 botões" +msgid "2-axis, 3-button joystick" +msgstr "Joystick de 2 eixos, 3 botões" + msgid "2-axis, 4-button joystick" msgstr "Joystick de 2 eixos, 4 botões" @@ -867,18 +873,99 @@ msgstr "Joystick de 2 eixos, 8 botões" msgid "3-axis, 2-button joystick" msgstr "Joystick de 3 eixos, 2 botões" +msgid "3-axis, 3-button joystick" +msgstr "Joystick de 3 eixos, 3 botões" + msgid "3-axis, 4-button joystick" msgstr "Joystick de 3 eixos, 4 botões" +msgid "4-axis, 2-button joystick" +msgstr "Joystick de 4 eixos, 2 botões" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick de 4 eixos, 3 botões" + msgid "4-axis, 4-button joystick" msgstr "Joystick de 4 eixos, 4 botões" +msgid "2-button gamepad(s)" +msgstr "Manípulo(s) de jogos de 2 botões" + +msgid "3-button gamepad" +msgstr "Manípulo(s) de jogos de 3 botões" + +msgid "4-button gamepad" +msgstr "Manípulo(s) de jogos de 4 botões" + +msgid "6-button gamepad" +msgstr "Manípulo(s) de jogos de 6 botões" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Manípulo de voo de 2 botões" + +msgid "3-button flight yoke" +msgstr "Manípulo de voo de 2 botões" + +msgid "4-button flight yoke" +msgstr "Manípulo de voo de 4 botões" + +msgid "2-button flight yoke with throttle" +msgstr "Manípulo de voo de 2 botões com acelerador" + +msgid "3-button flight yoke with throttle" +msgstr "Manípulo de voo de 3 botões com acelerador" + +msgid "4-button flight yoke with throttle" +msgstr "Manípulo de voo de 4 botões com acelerador" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volante (de 3 eixos, 2 botões)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volante (de 3 eixos, 3 botões)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volante (de 3 eixos, 4 botões)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Manípulo(s) de jogos de 2 botões" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Manípulo de voo de 2 botões" - -msgid "4-button gamepad" -msgstr "Manípulo(s) de jogos de 4 botões" - -msgid "4-button flight yoke" -msgstr "Manípulo de voo de 4 botões" - -msgid "2-button flight yoke with throttle" -msgstr "Manípulo de voo de 2 botões com acelerador" - -msgid "4-button flight yoke with throttle" -msgstr "Manípulo de voo de 4 botões com acelerador" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volante Win95 (de 3 eixos, 4 botões)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Nenhum" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 2d71499dc..3e15daf98 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -603,9 +603,6 @@ msgstr "Канал:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Указать..." - msgid "Sectors:" msgstr "Секторы:" @@ -852,9 +849,18 @@ msgstr "Устройства PCap не найдены" msgid "Invalid PCap device" msgstr "Неверное устройство PCap" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-осевой, 1-кнопочный джойстик" + msgid "2-axis, 2-button joystick(s)" msgstr "2-осевой, 2-кнопочный джойстик" +msgid "2-axis, 3-button joystick" +msgstr "2-осевой, 3-кнопочный джойстик" + msgid "2-axis, 4-button joystick" msgstr "2-осевой, 4-кнопочный джойстик" @@ -867,18 +873,99 @@ msgstr "2-осевой, 8-кнопочный джойстик" msgid "3-axis, 2-button joystick" msgstr "3-осевой, 2-кнопочный джойстик" +msgid "3-axis, 3-button joystick" +msgstr "3-осевой, 3-кнопочный джойстик" + msgid "3-axis, 4-button joystick" msgstr "3-осевой, 4-кнопочный джойстик" +msgid "4-axis, 2-button joystick" +msgstr "4-осевой, 2-кнопочный джойстик" + +msgid "4-axis, 3-button joystick" +msgstr "4-осевой, 3-кнопочный джойстик" + msgid "4-axis, 4-button joystick" msgstr "4-осевой, 4-кнопочный джойстик" +msgid "2-button gamepad(s)" +msgstr "2-кнопочный геймпад" + +msgid "3-button gamepad" +msgstr "3-кнопочный геймпад" + +msgid "4-button gamepad" +msgstr "4-кнопочный геймпад" + +msgid "6-button gamepad" +msgstr "6-кнопочный геймпад" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-кнопочный flight yoke" + +msgid "3-button flight yoke" +msgstr "3-кнопочный flight yoke" + +msgid "4-button flight yoke" +msgstr "4-кнопочный flight yoke" + +msgid "2-button flight yoke with throttle" +msgstr "2-кнопочный flight yoke с дросселем" + +msgid "3-button flight yoke with throttle" +msgstr "3-кнопочный flight yoke с дросселем" + +msgid "4-button flight yoke with throttle" +msgstr "4-кнопочный flight yoke с дросселем" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Руль (3-осевой, 2-кнопочный)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Руль (3-осевой, 3-кнопочный)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Руль (3-осевой, 4-кнопочный)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Педали" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Педали Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Педали" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Педали Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Педали" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Педали Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Педали" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Педали Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Система управления полётом Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Система управления рулем" -msgid "2-button gamepad(s)" -msgstr "2-кнопочный геймпад" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-кнопочный flight yoke" - -msgid "4-button gamepad" -msgstr "4-кнопочный геймпад" - -msgid "4-button flight yoke" -msgstr "4-кнопочный flight yoke" - -msgid "2-button flight yoke with throttle" -msgstr "2-кнопочный flight yoke с дросселем" - -msgid "4-button flight yoke with throttle" -msgstr "4-кнопочный flight yoke с дросселем" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Руль Win95 (3-осевой, 4-кнопочный)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Нет" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 436c8c674..7ea0446fb 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -603,9 +603,6 @@ msgstr "Kanál:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Zadať..." - msgid "Sectors:" msgstr "Sektory:" @@ -852,9 +849,18 @@ msgstr "Neboli nájdené žiadne PCap zariadenia" msgid "Invalid PCap device" msgstr "Neplatné PCap zariadenie" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-osový, 1-tlačidlový joystick" + msgid "2-axis, 2-button joystick(s)" msgstr "2-osový, 2-tlačidlový joystick" +msgid "2-axis, 3-button joystick" +msgstr "2-osový, 4-tlačidlový joystick" + msgid "2-axis, 4-button joystick" msgstr "2-osový, 4-tlačidlový joystick" @@ -867,18 +873,99 @@ msgstr "2-osový, 8-tlačidlový joystick" msgid "3-axis, 2-button joystick" msgstr "3-osový, 2-tlačidlový joystick" +msgid "3-axis, 3-button joystick" +msgstr "3-osový, 3-tlačidlový joystick" + msgid "3-axis, 4-button joystick" msgstr "3-osový, 4-tlačidlový joystick" +msgid "4-axis, 2-button joystick" +msgstr "4-osový, 2-tlačidlový joystick" + +msgid "4-axis, 3-button joystick" +msgstr "4-osový, 3-tlačidlový joystick" + msgid "4-axis, 4-button joystick" msgstr "4-osový, 4-tlačidlový joystick" +msgid "2-button gamepad(s)" +msgstr "Ovládač s 2 tlačidlami" + +msgid "3-button gamepad" +msgstr "Ovládač so 3 tlačidlami" + +msgid "4-button gamepad" +msgstr "Ovládač so 4 tlačidlami" + +msgid "6-button gamepad" +msgstr "Ovládač so 6 tlačidlami" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Letecký knipl s 2 tlačidlami" + +msgid "3-button flight yoke" +msgstr "Letecký knipl s 3 tlačidlami" + +msgid "4-button flight yoke" +msgstr "Letecký knipl so 4 tlačidlami" + +msgid "2-button flight yoke with throttle" +msgstr "Letecký knipl s 2 tlačidlami a pákou" + +msgid "3-button flight yoke with throttle" +msgstr "Letecký knipl s 3 tlačidlami a pákou" + +msgid "4-button flight yoke with throttle" +msgstr "Letecký knipl s 4 tlačidlami a pákou" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volant (3 osy, 2 tlačítka)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volant (3 osy, 3 tlačítka)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volant (3 osy, 4 tlačítka)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Ovládač s 2 tlačidlami" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Letecký knipl s 2 tlačidlami" - -msgid "4-button gamepad" -msgstr "Ovládač so 4 tlačidlami" - -msgid "4-button flight yoke" -msgstr "Letecký knipl so 4 tlačidlami" - -msgid "2-button flight yoke with throttle" -msgstr "Letecký knipl s 2 tlačidlami a pákou" - -msgid "4-button flight yoke with throttle" -msgstr "Letecký knipl s 4 tlačidlami a pákou" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volant pre Windows 95 (3 osy, 4 tlačítka)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Žiadne" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 8ef710a15..dd1b643c2 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Določi..." - msgid "Sectors:" msgstr "Sektorji:" @@ -852,9 +849,18 @@ msgstr "Najdena ni bila nobena naprava PCap" msgid "Invalid PCap device" msgstr "Neveljavna naprava PCap" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Igralna palica z 2 osema, 1 gumboma" + msgid "2-axis, 2-button joystick(s)" msgstr "Igralna palica z 2 osema, 2 gumboma" +msgid "2-axis, 3-button joystick" +msgstr "Igralna palica z 2 osema, 3 gumbi" + msgid "2-axis, 4-button joystick" msgstr "Igralna palica z 2 osema, 4 gumbi" @@ -865,20 +871,101 @@ msgid "2-axis, 8-button joystick" msgstr "Igralna palica z 2 osema, 8 gumbi" msgid "3-axis, 2-button joystick" -msgstr "Igralna palica s 3 osmi, 2 gumboma" +msgstr "Igralna palica s 3 osmi, 2 gumbi" + +msgid "3-axis, 3-button joystick" +msgstr "Igralna palica s 3 osmi, 3 gumbi" msgid "3-axis, 4-button joystick" msgstr "Igralna palica s 3 osmi, 4 gumbi" +msgid "4-axis, 2-button joystick" +msgstr "Igralna palica s 4 osmi, 2 gumbi" + +msgid "4-axis, 3-button joystick" +msgstr "Igralna palica s 4 osmi, 3 gumbi" + msgid "4-axis, 4-button joystick" msgstr "Igralna palica s 4 osmi, 4 gumbi" +msgid "2-button gamepad(s)" +msgstr "Igralna ploščica z 2 gumboma" + +msgid "3-button gamepad" +msgstr "Igralna ploščica s 3 gumbi" + +msgid "4-button gamepad" +msgstr "Igralna ploščica s 4 gumbi" + +msgid "6-button gamepad" +msgstr "Igralna ploščica s 6 gumbi" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Letalski krmilni drog z 2 gumbi" + +msgid "3-button flight yoke" +msgstr "Letalski krmilni drog z 3 gumbi" + +msgid "4-button flight yoke" +msgstr "Letalski krmilni drog s 4 gumbi" + +msgid "2-button flight yoke with throttle" +msgstr "Letalski krmilni drog z 2 gumbi gumboma ročico za plin" + +msgid "3-button flight yoke with throttle" +msgstr "Letalski krmilni drog s 3 gumbi z ročico za plin" + +msgid "4-button flight yoke with throttle" +msgstr "Letalski krmilni drog s 4 gumbi z ročico za plin" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volan s 3 osmi, 2 gumbi" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volan s 3 osmi, 3 gumbi" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volan s 3 osmi, 4 gumbi" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Igralna ploščica z 2 gumboma" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Letalski krmilni drog z 2 gumbi" - -msgid "4-button gamepad" -msgstr "Igralna ploščica s 4 gumbi" - -msgid "4-button flight yoke" -msgstr "Letalski krmilni drog s 4 gumbi" - -msgid "2-button flight yoke with throttle" -msgstr "Letalski krmilni drog z 2 gumbi gumboma ročico za plin" - -msgid "4-button flight yoke with throttle" -msgstr "Letalski krmilni drog s 4 gumbi z ročico za plin" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volan Win95 s 3 osmi, 4 gumbi" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Brez" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 6f014e2dd..5a5c48bb9 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Specificera..." - msgid "Sectors:" msgstr "Sektorer:" @@ -852,9 +849,18 @@ msgstr "Inga PCap-enheter hittade" msgid "Invalid PCap device" msgstr "Ogiltig PCap-enhet" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Styrspak med 2 axlar och 1 knappar" + msgid "2-axis, 2-button joystick(s)" msgstr "Styrspak med 2 axlar och 2 knappar" +msgid "2-axis, 3-button joystick" +msgstr "Styrspak med 2 axlar och 3 knappar" + msgid "2-axis, 4-button joystick" msgstr "Styrspak med 2 axlar och 4 knappar" @@ -867,18 +873,99 @@ msgstr "Styrspak med 2 axlar och 8 knappar" msgid "3-axis, 2-button joystick" msgstr "Styrspak med 3 axlar och 2 knappar" +msgid "3-axis, 3-button joystick" +msgstr "Styrspak med 3 axlar och 2 knappar" + msgid "3-axis, 4-button joystick" msgstr "Styrspak med 3 axlar och 4 knappar" +msgid "4-axis, 2-button joystick" +msgstr "Styrspak med 4 axlar och 2 knappar" + +msgid "4-axis, 3-button joystick" +msgstr "Styrspak med 4 axlar och 3 knappar" + msgid "4-axis, 4-button joystick" msgstr "Styrspak med 4 axlar och 4 knappar" +msgid "2-button gamepad(s)" +msgstr "Handkontroll(er) med två knappar" + +msgid "3-button gamepad" +msgstr "Handkontroll med tre knappar" + +msgid "4-button gamepad" +msgstr "Handkontroll med fyra knappar" + +msgid "6-button gamepad" +msgstr "Handkontroll med sex knappar" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Styrspak med två knappar" + +msgid "3-button flight yoke" +msgstr "Styrspak med tre knappar" + +msgid "4-button flight yoke" +msgstr "Styrspak med fyra knappar" + +msgid "2-button flight yoke with throttle" +msgstr "Styrspak med två knappar och gas" + +msgid "3-button flight yoke with throttle" +msgstr "Styrspak med tre knappar och gas" + +msgid "4-button flight yoke with throttle" +msgstr "Styrspak med fyra knappar och gas" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "ratt (tre axlar, två knappar)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "ratt (tre axlar, tre knappar)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "ratt (tre axlar, fyra knappar)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH-pedaler" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH-pedaler Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH-pedaler" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH-pedaler Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH-pedaler" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH-pedaler Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH-pedaler" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH-pedaler Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Handkontroll(er) med två knappar" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Styrspak med två knappar" - -msgid "4-button gamepad" -msgstr "Handkontroll med fyra knappar" - -msgid "4-button flight yoke" -msgstr "Styrspak med fyra knappar" - -msgid "2-button flight yoke with throttle" -msgstr "Styrspak med två knappar och gas" - -msgid "4-button flight yoke with throttle" -msgstr "Styrspak med fyra knappar och gas" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95-ratt (tre axlar, fyra knappar)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ingen" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 073572e1b..2a6eedeab 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Belirle..." - msgid "Sectors:" msgstr "Sektörler:" @@ -852,9 +849,18 @@ msgstr "Herhangi bir PCap cihazı bulunamadı" msgid "Invalid PCap device" msgstr "Geçersiz PCap cihazı" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2 eksenli, 1 düğmeli oyun kolları" + msgid "2-axis, 2-button joystick(s)" msgstr "2 eksenli, 2 düğmeli oyun kolları" +msgid "2-axis, 3-button joystick" +msgstr "2 eksenli, 3 düğmeli oyun kolu" + msgid "2-axis, 4-button joystick" msgstr "2 eksenli, 4 düğmeli oyun kolu" @@ -867,18 +873,99 @@ msgstr "2 eksenli, 8 düğmeli oyun kolu" msgid "3-axis, 2-button joystick" msgstr "3 eksenli, 2 düğmeli oyun kollu" +msgid "3-axis, 3-button joystick" +msgstr "3 eksenli, 3 düğmeli oyun kolu" + msgid "3-axis, 4-button joystick" msgstr "3 eksenli, 4 düğmeli oyun kolu" +msgid "4-axis, 2-button joystick" +msgstr "4 eksenli, 2 düğmeli oyun kolu" + +msgid "4-axis, 3-button joystick" +msgstr "4 eksenli, 3 düğmeli oyun kolu" + msgid "4-axis, 4-button joystick" msgstr "4 eksenli, 4 düğmeli oyun kolu" +msgid "2-button gamepad(s)" +msgstr "2 düğmeli oyun tablası" + +msgid "3-button gamepad" +msgstr "3 düğmeli oyun tablası" + +msgid "4-button gamepad" +msgstr "4 düğmeli oyun tablası" + +msgid "6-button gamepad" +msgstr "6 düğmeli oyun tablası" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2 düğmeli uçuş dümeni" + +msgid "3-button flight yoke" +msgstr "3 düğmeli uçuş dümeni" + +msgid "4-button flight yoke" +msgstr "4 düğmeli uçuş dümeni" + +msgid "2-button flight yoke with throttle" +msgstr "2 düğmeli, gaz kollu uçuş dümeni" + +msgid "3-button flight yoke with throttle" +msgstr "3 düğmeli, gaz kollu uçuş dümeni" + +msgid "4-button flight yoke with throttle" +msgstr "4 düğmeli, gaz kollu uçuş dümeni" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "direksiyonu (3 eksenli, 2 düğmeli)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "direksiyonu (3 eksenli, 3 düğmeli)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "direksiyonu (3 eksenli, 4 düğmeli)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2 düğmeli oyun tablası" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2 düğmeli uçuş dümeni" - -msgid "4-button gamepad" -msgstr "4 düğmeli oyun tablası" - -msgid "4-button flight yoke" -msgstr "4 düğmeli uçuş dümeni" - -msgid "2-button flight yoke with throttle" -msgstr "2 düğmeli, gaz kollu uçuş dümeni" - -msgid "4-button flight yoke with throttle" -msgstr "4 düğmeli, gaz kollu uçuş dümeni" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 direksiyonu (3 eksenli, 4 düğmeli)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Hiçbiri" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 8228b7ae4..a5a4f5853 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -603,9 +603,6 @@ msgstr "Канал:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Вказати..." - msgid "Sectors:" msgstr "Сектора:" @@ -852,9 +849,18 @@ msgstr "Пристрої PCap не знайдені" msgid "Invalid PCap device" msgstr "Невірний пристрій PCap" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-осьовий, 1-кнопковий джойстик" + msgid "2-axis, 2-button joystick(s)" msgstr "2-осьовий, 2-кнопковий джойстик" +msgid "2-axis, 3-button joystick" +msgstr "2-осьовий, 3-кнопковий джойстик" + msgid "2-axis, 4-button joystick" msgstr "2-осьовий, 4-кнопковий джойстик" @@ -867,18 +873,99 @@ msgstr "2-осьовий, 8-кнопковий джойстик" msgid "3-axis, 2-button joystick" msgstr "3-осьовий, 2-кнопковий джойстик" +msgid "3-axis, 3-button joystick" +msgstr "3-осьовий, 3-кнопковий джойстик" + msgid "3-axis, 4-button joystick" msgstr "3-осьовий, 4-кнопковий джойстик" +msgid "4-axis, 2-button joystick" +msgstr "4-осьовий, 2-кнопковий джойстик" + +msgid "4-axis, 3-button joystick" +msgstr "4-осьовий, 3-кнопковий джойстик" + msgid "4-axis, 4-button joystick" msgstr "4-осьовий, 4-кнопковий джойстик" +msgid "2-button gamepad(s)" +msgstr "2-кнопковий геймпад" + +msgid "3-button gamepad" +msgstr "3-кнопковий геймпад" + +msgid "4-button gamepad" +msgstr "4-кнопковий геймпад" + +msgid "6-button gamepad" +msgstr "6-кнопковий геймпад" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-кнопковий flight yoke" + +msgid "3-button flight yoke" +msgstr "3-кнопковий геймпад" + +msgid "4-button flight yoke" +msgstr "4-кнопковий flight yoke" + +msgid "2-button flight yoke with throttle" +msgstr "2-кнопковий flight yoke з дроселем" + +msgid "3-button flight yoke with throttle" +msgstr "3-кнопковий flight yoke з дроселем" + +msgid "4-button flight yoke with throttle" +msgstr "4-кнопковий flight yoke з дроселем" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Кермо (3-осьове, 2-кнопкове)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Кермо (3-осьове, 3-кнопкове)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Кермо (3-осьове, 4-кнопкове)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Педалі" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Педалі Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Педалі" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Педалі Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Педалі" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Педалі Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Педалі" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Педалі Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Система управління польотом Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Система управління кермом" -msgid "2-button gamepad(s)" -msgstr "4-кнопковий геймпад" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-кнопковий flight yoke" - -msgid "4-button gamepad" -msgstr "4-кнопковий геймпад" - -msgid "4-button flight yoke" -msgstr "4-кнопковий flight yoke" - -msgid "2-button flight yoke with throttle" -msgstr "2-кнопковий flight yoke з дроселем" - -msgid "4-button flight yoke with throttle" -msgstr "4-кнопковий flight yoke з дроселем" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Кермо Win95 (3-осьове, 4-кнопкове)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ні" @@ -1714,7 +1786,7 @@ msgid "Remove" msgstr "Видалити" msgid "Browse..." -msgstr "Переглянути..." +msgstr "Огляд..." msgid "Couldn't create OpenGL context." msgstr "Не вдалося створити контекст OpenGL." diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 24decb522..1d6d80c35 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -603,9 +603,6 @@ msgstr "Kênh:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "Chỉ &rõ..." - msgid "Sectors:" msgstr "Sector:" @@ -852,9 +849,18 @@ msgstr "Không tìm thấy thiết bị PCap" msgid "Invalid PCap device" msgstr "Thiết bị PCap không hợp quy" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Cần điều khiển hai trục, một nút" + msgid "2-axis, 2-button joystick(s)" msgstr "Cần điều khiển hai trục, hai nút" +msgid "2-axis, 3-button joystick" +msgstr "Cần điều khiển hai trục, ba nút" + msgid "2-axis, 4-button joystick" msgstr "Cần điều khiển hai trục, bốn nút" @@ -867,18 +873,99 @@ msgstr "Cần điều khiển hai trục, tám nút" msgid "3-axis, 2-button joystick" msgstr "Cần điều khiển ba trục, hai nút" +msgid "3-axis, 3-button joystick" +msgstr "Cần điều khiển ba trục, ba nút" + msgid "3-axis, 4-button joystick" msgstr "Cần điều khiển ba trục, bốn nút" +msgid "4-axis, 2-button joystick" +msgstr "Cần điều khiển bốn trục, hai nút" + +msgid "4-axis, 3-button joystick" +msgstr "Cần điều khiển bốn trục, ba nút" + msgid "4-axis, 4-button joystick" msgstr "Cần điều khiển bốn trục, bốn nút" +msgid "2-button gamepad(s)" +msgstr "Tay cầm game hai nút" + +msgid "3-button gamepad" +msgstr "Tay cầm game ba nút" + +msgid "4-button gamepad" +msgstr "Tay cầm game bốn nút" + +msgid "6-button gamepad" +msgstr "Tay cầm game sáu nút" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Vô lăng máy bay hai nút" + +msgid "3-button flight yoke" +msgstr "Vô lăng máy bay ba nút" + +msgid "4-button flight yoke" +msgstr "Vô lăng máy bay bốn nút" + +msgid "2-button flight yoke with throttle" +msgstr "Vô lăng máy bay hai nút có cần ga" + +msgid "3-button flight yoke with throttle" +msgstr "Vô lăng máy bay ba nút có cần ga" + +msgid "4-button flight yoke with throttle" +msgstr "Vô lăng máy bay bốn nút có cần ga" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Vô lăng (ba trục, hai nút)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Vô lăng (ba trục, ba nút)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Vô lăng (ba trục, bốn nút)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + bàn giậm CH" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + bàn giậm CH Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + bàn giậm CH" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + bàn giậm CH Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + bàn giậm CH" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + bàn giậm CH Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + bàn giậm CH" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + bàn giậm CH Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Hệ thống bánh lái" -msgid "2-button gamepad(s)" -msgstr "Tay cầm game hai nút" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Vô lăng máy bay hai nút" - -msgid "4-button gamepad" -msgstr "Tay cầm game bốn nút" - -msgid "4-button flight yoke" -msgstr "Vô lăng máy bay bốn nút" - -msgid "2-button flight yoke with throttle" -msgstr "Vô lăng máy bay hai nút có cần ga" - -msgid "4-button flight yoke with throttle" -msgstr "Vô lăng máy bay bốn nút có cần ga" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Vô lăng Win95 (ba trục, bốn nút)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Không có" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 48ffc0dc9..288b7deaf 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -603,9 +603,6 @@ msgstr "通道:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "指定(&S)..." - msgid "Sectors:" msgstr "扇区(S):" @@ -852,9 +849,18 @@ msgstr "未找到 PCap 设备" msgid "Invalid PCap device" msgstr "无效 PCap 设备" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2 轴, 1 键操纵杆" + msgid "2-axis, 2-button joystick(s)" msgstr "2 轴, 2 键操纵杆" +msgid "2-axis, 3-button joystick" +msgstr "2 轴, 3 键操纵杆" + msgid "2-axis, 4-button joystick" msgstr "2 轴, 4 键操纵杆" @@ -867,18 +873,99 @@ msgstr "2 轴, 8 键操纵杆" msgid "3-axis, 2-button joystick" msgstr "3 轴, 2 键操纵杆" +msgid "3-axis, 3-button joystick" +msgstr "3 轴, 3 键操纵杆" + msgid "3-axis, 4-button joystick" msgstr "3 轴, 4 键操纵杆" +msgid "4-axis, 2-button joystick" +msgstr "4 轴, 2 键操纵杆" + +msgid "4-axis, 3-button joystick" +msgstr "4 轴, 3 键操纵杆" + msgid "4-axis, 4-button joystick" msgstr "4 轴, 4 键操纵杆" +msgid "2-button gamepad(s)" +msgstr "2 按钮游戏手柄" + +msgid "3-button gamepad" +msgstr "3 按钮游戏手柄" + +msgid "4-button gamepad" +msgstr "4 按钮游戏手柄" + +msgid "6-button gamepad" +msgstr "6 按钮游戏手柄" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2 按钮飞行摇杆" + +msgid "3-button flight yoke" +msgstr "3 按钮飞行摇杆" + +msgid "4-button flight yoke" +msgstr "4 按钮飞行摇杆" + +msgid "2-button flight yoke with throttle" +msgstr "2 按钮带油门飞行摇杆" + +msgid "3-button flight yoke with throttle" +msgstr "3 按钮带油门飞行摇杆" + +msgid "4-button flight yoke with throttle" +msgstr "4 按钮带油门飞行摇杆" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "方向盘 (3 轴, 2 键)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "方向盘 (3 轴, 3 键)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "方向盘 (3 轴, 4 键)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2 按钮游戏手柄" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2 按钮飞行摇杆" - -msgid "4-button gamepad" -msgstr "4 按钮游戏手柄" - -msgid "4-button flight yoke" -msgstr "4 按钮飞行摇杆" - -msgid "2-button flight yoke with throttle" -msgstr "2 按钮带油门飞行摇杆" - -msgid "4-button flight yoke with throttle" -msgstr "4 按钮带油门飞行摇杆" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 方向盘 (3 轴, 4 键)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "无" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 1732cb914..a11bd7f6d 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -603,9 +603,6 @@ msgstr "通道:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "指定(&S)..." - msgid "Sectors:" msgstr "磁區(S):" @@ -852,9 +849,18 @@ msgstr "未找到 PCap 裝置" msgid "Invalid PCap device" msgstr "無效 PCap 裝置" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2 軸, 1 鍵搖桿" + msgid "2-axis, 2-button joystick(s)" msgstr "2 軸, 2 鍵搖桿" +msgid "2-axis, 3-button joystick" +msgstr "2 軸, 3 鍵搖桿" + msgid "2-axis, 4-button joystick" msgstr "2 軸, 4 鍵搖桿" @@ -867,18 +873,99 @@ msgstr "2 軸, 8 鍵搖桿" msgid "3-axis, 2-button joystick" msgstr "3 軸, 2 鍵搖桿" +msgid "3-axis, 3-button joystick" +msgstr "3 軸, 3 鍵搖桿" + msgid "3-axis, 4-button joystick" msgstr "3 軸, 4 鍵搖桿" +msgid "4-axis, 2-button joystick" +msgstr "4 軸, 2 鍵搖桿" + +msgid "4-axis, 3-button joystick" +msgstr "4 軸, 3 鍵搖桿" + msgid "4-axis, 4-button joystick" msgstr "4 軸, 4 鍵搖桿" +msgid "2-button gamepad(s)" +msgstr "2 鍵遊戲手柄" + +msgid "3-button gamepad" +msgstr "3 鍵遊戲手柄" + +msgid "4-button gamepad" +msgstr "4 鍵遊戲手柄" + +msgid "6-button gamepad" +msgstr "6 鍵遊戲手柄" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2 按鈕飛行搖桿" + +msgid "3-button flight yoke" +msgstr "3 按鈕飛行搖桿" + +msgid "4-button flight yoke" +msgstr "4 按鈕飛行搖桿" + +msgid "2-button flight yoke with throttle" +msgstr "2 按鈕帶油門飛行搖桿" + +msgid "3-button flight yoke with throttle" +msgstr "3 按鈕帶油門飛行搖桿" + +msgid "4-button flight yoke with throttle" +msgstr "4 按鈕帶油門飛行搖桿" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "方向盤 (3 軸, 2 鍵搖桿)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "方向盤 (3 軸, 3 鍵搖桿)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "方向盤 (3 軸, 4 鍵搖桿)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2 鍵遊戲手柄" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2 按鈕飛行搖桿" - -msgid "4-button gamepad" -msgstr "4 鍵遊戲手柄" - -msgid "4-button flight yoke" -msgstr "4 按鈕飛行搖桿" - -msgid "2-button flight yoke with throttle" -msgstr "2 按鈕帶油門飛行搖桿" - -msgid "4-button flight yoke with throttle" -msgstr "4 按鈕帶油門飛行搖桿" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 方向盤 (3 軸, 4 鍵搖桿)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "無" diff --git a/src/qt/qt_cgasettingsdialog.ui b/src/qt/qt_cgasettingsdialog.ui index 7367b2099..dc5acb0fc 100644 --- a/src/qt/qt_cgasettingsdialog.ui +++ b/src/qt/qt_cgasettingsdialog.ui @@ -15,84 +15,15 @@ - QLayout::SizeConstraint::SetFixedSize + QLayout::SetFixedSize - - - - -100 - - - 100 - - - Qt::Orientation::Horizontal - - - - - - - 360 - - - 100 - - - Qt::Orientation::Horizontal - - - - + Hue - - - - -50 - - - 50 - - - Qt::Orientation::Horizontal - - - - - - - Qt::Orientation::Horizontal - - - QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok|QDialogButtonBox::StandardButton::Reset - - - - - - - 360 - - - 100 - - - Qt::Orientation::Horizontal - - - - - - - Contrast - - - @@ -102,31 +33,100 @@ 360 - Qt::Orientation::Horizontal - - - - - - - Sharpness + Qt::Horizontal - + Saturation + + + + 360 + + + 100 + + + Qt::Horizontal + + + - + Brightness + + + + -100 + + + 100 + + + Qt::Horizontal + + + + + + + Contrast + + + + + + + 360 + + + 100 + + + Qt::Horizontal + + + + + + + Sharpness + + + + + + + -50 + + + 50 + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset + + + diff --git a/src/qt/qt_filefield.ui b/src/qt/qt_filefield.ui index 3a1e3e753..91000af50 100644 --- a/src/qt/qt_filefield.ui +++ b/src/qt/qt_filefield.ui @@ -51,7 +51,7 @@ - &Specify... + Browse... diff --git a/src/qt/qt_harddiskdialog.ui b/src/qt/qt_harddiskdialog.ui index e2dea0220..6de39375f 100644 --- a/src/qt/qt_harddiskdialog.ui +++ b/src/qt/qt_harddiskdialog.ui @@ -33,7 +33,7 @@ - + File name: @@ -43,7 +43,7 @@ - + Cylinders: @@ -66,7 +66,7 @@ - + Heads: @@ -92,7 +92,7 @@ - + Sectors: @@ -118,7 +118,7 @@ - + Size (MB): @@ -141,7 +141,7 @@ - + Type: @@ -155,7 +155,7 @@ - + Bus: @@ -169,7 +169,7 @@ - + Channel: @@ -183,7 +183,7 @@ - + Model: diff --git a/src/qt/qt_joystickconfiguration.ui b/src/qt/qt_joystickconfiguration.ui index 139b99ca5..f5f2773b3 100644 --- a/src/qt/qt_joystickconfiguration.ui +++ b/src/qt/qt_joystickconfiguration.ui @@ -32,7 +32,7 @@ - + Device diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 45ec2e95b..e41f36c57 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1021,6 +1021,7 @@ void MainWindow::updateShortcuts() void MainWindow::resizeEvent(QResizeEvent *event) { +#ifdef MOVE_WINDOW //qDebug() << pos().x() + event->size().width(); //qDebug() << pos().y() + event->size().height(); if (vid_resize == 1 || video_fullscreen) @@ -1040,6 +1041,7 @@ MainWindow::resizeEvent(QResizeEvent *event) if (newY < 1) newY = 1; } move(newX, newY); +#endif } void diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index 38aba061f..45c4f70ae 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -260,7 +260,7 @@ - Qt::ContextMenuPolicy::PreventContextMenu + Qt::PreventContextMenu toolBar @@ -272,7 +272,7 @@ false - Qt::ToolBarArea::TopToolBarArea + Qt::TopToolBarArea @@ -281,7 +281,7 @@ - Qt::ToolButtonStyle::ToolButtonIconOnly + Qt::ToolButtonIconOnly false @@ -396,7 +396,7 @@ E&xit - QAction::MenuRole::QuitRole + QAction::QuitRole @@ -408,7 +408,7 @@ &Settings... - QAction::MenuRole::NoRole + QAction::NoRole false @@ -710,7 +710,7 @@ false - QAction::MenuRole::AboutQtRole + QAction::AboutQtRole @@ -718,7 +718,7 @@ &About 86Box... - QAction::MenuRole::AboutRole + QAction::AboutRole @@ -771,7 +771,7 @@ &Preferences... - QAction::MenuRole::PreferencesRole + QAction::PreferencesRole @@ -844,7 +844,7 @@ Renderer &options... - QAction::MenuRole::NoRole + QAction::NoRole diff --git a/src/qt/qt_newfloppydialog.ui b/src/qt/qt_newfloppydialog.ui index c0437d810..98bfd8be4 100644 --- a/src/qt/qt_newfloppydialog.ui +++ b/src/qt/qt_newfloppydialog.ui @@ -27,7 +27,7 @@ - + File name: @@ -44,7 +44,7 @@ - + Disk size: diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index 4dd3e8bc6..9b1233f7d 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -42,6 +42,8 @@ extern MainWindow* main_window; #include #include +#include +#define HAVE_STDARG_H #include "qt_openglrenderer.hpp" #include "qt_openglshadermanagerdialog.hpp" @@ -152,7 +154,7 @@ ogl3_log(const char *fmt, ...) if (ogl3_do_log) { va_start(ap, fmt); - ogl3_log_ex(fmt, ap); + pclog_ex(fmt, ap); va_end(ap); } } @@ -218,17 +220,8 @@ OpenGLRenderer::compile_shader(GLenum shader_type, const char *prepend, const ch if (version_loc) { snprintf(version, 49, "%s\n", versionRegex.match(progSource).captured(1).toLatin1().data()); progSource.remove(versionRegex); - - version_loc = ((char *) this->glslVersion.toLatin1().data()) + 9; - char glsl_ver[4] = { 0 }; - memcpy(glsl_ver, version_loc, 3); - int ver = atoi((char *) glsl_ver); - pclog("Fucce þiċ: %d\n", ver); } else { - version_loc = ((char *) this->glslVersion.toLatin1().data()) + 9; - char glsl_ver[4] = { 0 }; - memcpy(glsl_ver, version_loc, 3); - int ver = atoi((char *) glsl_ver); + int ver = gl_version[0] * 100 + gl_version[1] * 10; if (ver == 300) ver = 130; else if (ver == 310) @@ -881,11 +874,11 @@ OpenGLRenderer::initialize() glw.initializeOpenGLFunctions(); ogl3_log("OpenGL information: [%s] %s (%s)\n", glw.glGetString(GL_VENDOR), glw.glGetString(GL_RENDERER), glw.glGetString(GL_VERSION)); - glsl_version[0] = glsl_version[1] = -1; - glw.glGetIntegerv(GL_MAJOR_VERSION, &glsl_version[0]); - glw.glGetIntegerv(GL_MINOR_VERSION, &glsl_version[1]); - if (glsl_version[0] < 3) { - throw opengl_init_error(tr("OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2").arg(glsl_version[0]).arg(glsl_version[1])); + gl_version[0] = gl_version[1] = -1; + glw.glGetIntegerv(GL_MAJOR_VERSION, &gl_version[0]); + glw.glGetIntegerv(GL_MINOR_VERSION, &gl_version[1]); + if (gl_version[0] < 3) { + throw opengl_init_error(tr("OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2").arg(gl_version[0]).arg(gl_version[1])); } ogl3_log("Using OpenGL %s\n", glw.glGetString(GL_VERSION)); ogl3_log("Using Shading Language %s\n", glw.glGetString(GL_SHADING_LANGUAGE_VERSION)); @@ -1738,3 +1731,4 @@ OpenGLRenderer::render() frameCounter++; context->swapBuffers(this); } + diff --git a/src/qt/qt_openglrenderer.hpp b/src/qt/qt_openglrenderer.hpp index c2dc32917..22a8a17d3 100644 --- a/src/qt/qt_openglrenderer.hpp +++ b/src/qt/qt_openglrenderer.hpp @@ -102,7 +102,7 @@ private: void *unpackBuffer = nullptr; - int glsl_version[2] = { 0, 0 }; + int gl_version[2] = { 0, 0 }; void initialize(); void initializeExtensions(); diff --git a/src/qt/qt_progsettings.ui b/src/qt/qt_progsettings.ui index ca33726b1..6d5f80830 100644 --- a/src/qt/qt_progsettings.ui +++ b/src/qt/qt_progsettings.ui @@ -27,49 +27,15 @@ - QLayout::SizeConstraint::SetFixedSize + QLayout::SetFixedSize - + Language: - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - Inhibit multimedia keys - - - - - - - Mouse sensitivity: - - - - - - - Default - - - @@ -82,10 +48,30 @@ - - + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + - Ask for confirmation before saving settings + Default + + + + + + + Mouse sensitivity: @@ -107,31 +93,14 @@ 100 - Qt::Orientation::Horizontal - - - - - - - <html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html> - - - Select media images from program working directory - - - - - - - Default + Qt::Horizontal - Qt::Orientation::Horizontal + Qt::Horizontal @@ -141,58 +110,106 @@ - + + + + Default + + + + + + + <html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html> + + + Select media images from program working directory + + + + + + + Inhibit multimedia keys + + + + + + + Ask for confirmation before saving settings + + + + Ask for confirmation before quitting - - - - Qt::Orientation::Horizontal - - - QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok - - - - + Ask for confirmation before hard resetting - - - - Color scheme + + + + + + Color scheme + + + + + + System + + + + + + + Light + + + + + + + Dark + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - System - - - - - - - Light - - - - - - - Dark - - - - diff --git a/src/qt/qt_renderercommon.cpp b/src/qt/qt_renderercommon.cpp index d34cad15b..25d3a5c28 100644 --- a/src/qt/qt_renderercommon.cpp +++ b/src/qt/qt_renderercommon.cpp @@ -220,10 +220,12 @@ RendererCommon::eventDelegate(QEvent *event, bool &result) case QEvent::MouseButtonPress: case QEvent::MouseMove: case QEvent::MouseButtonRelease: +#ifdef TOUCH_PR case QEvent::TouchBegin: case QEvent::TouchEnd: case QEvent::TouchCancel: case QEvent::TouchUpdate: +#endif case QEvent::Wheel: case QEvent::Enter: case QEvent::Leave: diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index ad8172d11..b95fe3b73 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -35,7 +35,9 @@ #include #include +#ifdef TOUCH_PR #include +#endif #include #include @@ -91,7 +93,9 @@ RendererStack::RendererStack(QWidget *parent, int monitor_index) , ui(new Ui::RendererStack) { boxLayout->setContentsMargins(0, 0, 0, 0); +#ifdef TOUCH_PR setAttribute(Qt::WA_AcceptTouchEvents, true); +#endif #ifdef Q_OS_WINDOWS setAttribute(Qt::WA_NativeWindow, true); (void)winId(); @@ -520,12 +524,22 @@ RendererStack::event(QEvent* event) if (m_monitor_index >= 1) { if (mouse_input_mode >= 1) { +#ifdef TOUCH_PR #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) mouse_x_abs = (mouse_event->position().x()) / (double)width(); mouse_y_abs = (mouse_event->position().y()) / (double)height(); #else mouse_x_abs = (mouse_event->localPos().x()) / (double)width(); mouse_y_abs = (mouse_event->localPos().y()) / (double)height(); +#endif +#else +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + mouse_x_abs = (mouse_event->position().x()) / (long double)width(); + mouse_y_abs = (mouse_event->position().y()) / (long double)height(); +#else + mouse_x_abs = (mouse_event->localPos().x()) / (long double)width(); + mouse_y_abs = (mouse_event->localPos().y()) / (long double)height(); +#endif #endif if (!mouse_tablet_in_proximity) mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; @@ -544,6 +558,7 @@ RendererStack::event(QEvent* event) return QWidget::event(event); } +#ifdef TOUCH_PR #ifdef Q_OS_WINDOWS if (mouse_input_mode == 0) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -574,6 +589,39 @@ RendererStack::event(QEvent* event) #else mouse_x_abs = (mouse_event->localPos().x()) / (double)width(); mouse_y_abs = (mouse_event->localPos().y()) / (double)height(); +#endif +#else +#ifdef Q_OS_WINDOWS + if (mouse_input_mode == 0) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + mouse_x_abs = (mouse_event->position().x()) / (long double)width(); + mouse_y_abs = (mouse_event->position().y()) / (long double)height(); +#else + mouse_x_abs = (mouse_event->localPos().x()) / (long double)width(); + mouse_y_abs = (mouse_event->localPos().y()) / (long double)height(); +#endif + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; + return QWidget::event(event); + } +#endif + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + mouse_x_abs = (mouse_event->position().x()) / (long double)width(); + mouse_y_abs = (mouse_event->position().y()) / (long double)height(); +#else + mouse_x_abs = (mouse_event->localPos().x()) / (long double)width(); + mouse_y_abs = (mouse_event->localPos().y()) / (long double)height(); +#endif #endif mouse_x_abs -= rendererWindow->destinationF.left(); mouse_y_abs -= rendererWindow->destinationF.top(); @@ -587,6 +635,7 @@ RendererStack::event(QEvent* event) if (mouse_x_abs > 1) mouse_x_abs = 1; if (mouse_y_abs > 1) mouse_y_abs = 1; mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; +#ifdef TOUCH_PR } else switch (event->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: @@ -685,6 +734,7 @@ RendererStack::event(QEvent* event) default: return QWidget::event(event); +#endif } return QWidget::event(event); diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index 8e3a72589..89a2530be 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -46,7 +46,7 @@ SettingsDisplay::SettingsDisplay(QWidget *parent) for (uint8_t i = 0; i < GFXCARD_MAX; i ++) videoCard[i] = gfxcard[i]; - ui->lineEdit->setFilter(tr("EDID") % util::DlgFilter({ "bin", "dat", "edid", "txt" }) % tr("All files") % util::DlgFilter({ "*" }, true)); + ui->lineEditCustomEDID->setFilter(tr("EDID") % util::DlgFilter({ "bin", "dat", "edid", "txt" }) % tr("All files") % util::DlgFilter({ "*" }, true)); onCurrentMachineChanged(machine); } @@ -77,7 +77,7 @@ SettingsDisplay::save() da2_standalone_enabled = ui->checkBoxDa2->isChecked() ? 1 : 0; monitor_edid = ui->radioButtonCustom->isChecked() ? 1 : 0; - strncpy(monitor_edid_path, ui->lineEdit->fileName().toUtf8().data(), sizeof(monitor_edid_path) - 1); + strncpy(monitor_edid_path, ui->lineEditCustomEDID->fileName().toUtf8().data(), sizeof(monitor_edid_path) - 1); } void @@ -135,8 +135,8 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) ui->radioButtonDefault->setChecked(monitor_edid == 0); ui->radioButtonCustom->setChecked(monitor_edid == 1); - ui->lineEdit->setFileName(monitor_edid_path); - ui->lineEdit->setEnabled(monitor_edid == 1); + ui->lineEditCustomEDID->setFileName(monitor_edid_path); + ui->lineEditCustomEDID->setEnabled(monitor_edid == 1); } void @@ -326,7 +326,7 @@ void SettingsDisplay::on_radioButtonDefault_clicked() { ui->radioButtonDefault->setChecked(true); ui->radioButtonCustom->setChecked(false); - ui->lineEdit->setEnabled(false); + ui->lineEditCustomEDID->setEnabled(false); } @@ -334,7 +334,7 @@ void SettingsDisplay::on_radioButtonCustom_clicked() { ui->radioButtonDefault->setChecked(false); ui->radioButtonCustom->setChecked(true); - ui->lineEdit->setEnabled(true); + ui->lineEditCustomEDID->setEnabled(true); } void SettingsDisplay::on_pushButtonExportDefault_clicked() diff --git a/src/qt/qt_settingsdisplay.ui b/src/qt/qt_settingsdisplay.ui index 6e4c14152..5ab71f4c0 100644 --- a/src/qt/qt_settingsdisplay.ui +++ b/src/qt/qt_settingsdisplay.ui @@ -26,27 +26,45 @@ 0 - - + + + + + 0 + 0 + + - Voodoo 1 or 2 Graphics + Video: - - + + + + + 0 + 0 + + + + 30 + + + + + + + + 0 + 0 + + Configure - - - - IBM 8514/A Graphics - - - @@ -60,6 +78,47 @@ + + + + + 0 + 0 + + + + 30 + + + + + + + Configure + + + + + + + Voodoo 1 or 2 Graphics + + + + + + + Configure + + + + + + + IBM 8514/A Graphics + + + @@ -67,6 +126,13 @@ + + + + XGA Graphics + + + @@ -74,8 +140,22 @@ + + + + IBM PS/55 Display Adapter Graphics + + + + + + + Configure + + + - + 0 @@ -85,9 +165,9 @@ Monitor EDID - + - + @@ -111,9 +191,9 @@ - + - QLayout::SizeConstraint::SetNoConstraint + QLayout::SetNoConstraint @@ -123,7 +203,7 @@ - + 0 @@ -137,99 +217,6 @@ - - - - - 0 - 0 - - - - 30 - - - - - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - - - - - - Configure - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - Video: - - - - - - - Configure - - - - - - - - 0 - 0 - - - - 30 - - - - - - - XGA Graphics - - - - - - - IBM PS/55 Display Adapter Graphics - - - @@ -240,6 +227,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -250,6 +250,23 @@ 1 + + comboBoxVideo + pushButtonConfigureVideo + comboBoxVideoSecondary + pushButtonConfigureVideoSecondary + checkBoxVoodoo + pushButtonConfigureVoodoo + checkBox8514 + pushButtonConfigure8514 + checkBoxXga + pushButtonConfigureXga + checkBoxDa2 + pushButtonConfigureDa2 + radioButtonDefault + pushButtonExportDefault + radioButtonCustom + diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index c540aa2ed..1bee01df6 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -335,7 +335,7 @@ SettingsInput::on_pushButtonConfigureMouse_clicked() } static int -get_axis(JoystickConfiguration &jc, int axis, uint8_t gameport_nr, int joystick_nr) +get_axis(JoystickConfiguration &jc, uint8_t gameport_nr, int joystick_nr, int axis) { int axis_sel = jc.selectedAxis(axis); int nr_axes = plat_joystick_state[joystick_state[gameport_nr][joystick_nr].plat_joystick_nr - 1].nr_axes; @@ -351,7 +351,7 @@ get_axis(JoystickConfiguration &jc, int axis, uint8_t gameport_nr, int joystick_ } static int -get_pov(JoystickConfiguration &jc, int pov, uint8_t gameport_nr, int joystick_nr) +get_pov(JoystickConfiguration &jc, uint8_t gameport_nr, int joystick_nr, int pov) { int pov_sel = jc.selectedPov(pov); int nr_povs = plat_joystick_state[joystick_state[gameport_nr][joystick_nr].plat_joystick_nr - 1].nr_povs * 2; @@ -379,17 +379,15 @@ updateJoystickConfig(int type, uint8_t gameport_nr, int joystick_nr, QWidget *pa joystick_state[gameport_nr][joystick_nr].plat_joystick_nr = jc.selectedDevice(); if (joystick_state[gameport_nr][joystick_nr].plat_joystick_nr) { - for (int axis_nr = 0; axis_nr < joystick_get_axis_count(type); axis_nr++) { - joystick_state[gameport_nr][joystick_nr].axis_mapping[axis_nr] = get_axis(jc, axis_nr, gameport_nr, joystick_nr); - } + for (int axis_nr = 0; axis_nr < joystick_get_axis_count(type); axis_nr++) + joystick_state[gameport_nr][joystick_nr].axis_mapping[axis_nr] = get_axis(jc, gameport_nr, joystick_nr, axis_nr); - for (int button_nr = 0; button_nr < joystick_get_button_count(type); button_nr++) { + for (int button_nr = 0; button_nr < joystick_get_button_count(type); button_nr++) joystick_state[gameport_nr][joystick_nr].button_mapping[button_nr] = jc.selectedButton(button_nr); - } - for (int pov_nr = 0; pov_nr < joystick_get_pov_count(type) * 2; pov_nr += 2) { - joystick_state[gameport_nr][joystick_nr].pov_mapping[pov_nr][0] = get_pov(jc, pov_nr, gameport_nr, joystick_nr); - joystick_state[gameport_nr][joystick_nr].pov_mapping[pov_nr][1] = get_pov(jc, pov_nr + 1, gameport_nr, joystick_nr); + for (int pov_nr = 0; pov_nr < joystick_get_pov_count(type); pov_nr++) { + joystick_state[gameport_nr][joystick_nr].pov_mapping[pov_nr][0] = get_pov(jc, gameport_nr, joystick_nr, pov_nr * 2); // X Axis + joystick_state[gameport_nr][joystick_nr].pov_mapping[pov_nr][1] = get_pov(jc, gameport_nr, joystick_nr, pov_nr * 2 + 1); // Y Axis } } } diff --git a/src/qt/qt_settingsmachine.ui b/src/qt/qt_settingsmachine.ui index 34f0b6160..fdfda37b6 100644 --- a/src/qt/qt_settingsmachine.ui +++ b/src/qt/qt_settingsmachine.ui @@ -41,144 +41,18 @@ 0 - - + + - Machine: + Search: - - - - CPU type: - - - - - - - - 0 - 0 - - - - - - - - Memory: - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - 30 - - - - - - - Frequency: - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - 30 - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - 30 - - - - - - - PIT mode: - - - - - - - - 0 - 0 - - - - 30 - - - - - + + - + Machine type: @@ -191,17 +65,10 @@ - - - - 30 - - - - - + + - Wait states: + Machine: @@ -243,22 +110,155 @@ + + + + CPU type: + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + 30 + + + + + + + Frequency: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + 30 + + + + + + - + FPU: - - - - Search: + + + + 30 - - + + + + Wait states: + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + 30 + + + + + + + PIT mode: + + + + + + + + 0 + 0 + + + + 30 + + + + + + + + + + Memory: + + + + + + + + 0 + 0 + + + @@ -312,7 +312,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -325,92 +325,116 @@ - - - - - - 0 - 0 - - - - CPU frame size - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop - - - - - - Larger frames (less smooth) - - - - - - - Smaller frames (smoother) - - - - - + + + + + + + + 0 + 0 + + + + Time synchronization + + + + + + Disabled + + + + + + + Enabled (local time) + + + + + + + Enabled (UTC) + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + - - + + + + + + + 0 + 0 + + + + CPU frame size + + + + + + Larger frames (less smooth) + + + + + + + Smaller frames (smoother) + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - Time synchronization - - - - - - Disabled - - - - - - - Enabled (local time) - - - - - - - Enabled (UTC) - - - - - - - - - - Qt::Orientation::Horizontal + Qt::Horizontal @@ -422,19 +446,6 @@ - - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - - diff --git a/src/qt/qt_vmmanager_preferences.ui b/src/qt/qt_vmmanager_preferences.ui index 7f7b94fa4..7206b79bf 100644 --- a/src/qt/qt_vmmanager_preferences.ui +++ b/src/qt/qt_vmmanager_preferences.ui @@ -15,10 +15,10 @@ - QLayout::SizeConstraint::SetFixedSize + QLayout::SetFixedSize - + System Directory: @@ -146,7 +146,7 @@ - Qt::Orientation::Vertical + Qt::Vertical @@ -159,10 +159,10 @@ - Qt::Orientation::Horizontal + Qt::Horizontal - QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index 399469424..42ab2c7a7 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -1812,7 +1812,7 @@ fdc37c93x_reset(void *priv) memset(dev->gpio_pulldn, 0xff, 8); /* Acer V62X requires bit 0 to be clear to not be stuck in "clear password" mode. */ - if (machines[machine].init == machine_at_vectra54_init) { + if ((machines[machine].init == machine_at_vectra54_init) || (machines[machine].init == machine_at_vectra500mt_init)) { dev->gpio_pulldn[1] = 0x40; /* diff --git a/src/sio/sio_fdc37m60x.c b/src/sio/sio_fdc37m60x.c index e6470a6ea..f3c2a0a7d 100644 --- a/src/sio/sio_fdc37m60x.c +++ b/src/sio/sio_fdc37m60x.c @@ -685,7 +685,7 @@ fdc37m60x_init(const device_t *info) } const device_t fdc37m60x_device = { - .name = "SMC FDC37C93x Super I/O", + .name = "SMC FDC37M60x Super I/O", .internal_name = "fdc37m60x", .flags = 0, .local = 0, diff --git a/src/sio/sio_pc87307.c b/src/sio/sio_pc87307.c index 44db6ee9d..ab290ef3d 100644 --- a/src/sio/sio_pc87307.c +++ b/src/sio/sio_pc87307.c @@ -34,6 +34,7 @@ #include <86box/fdc.h> #include <86box/keyboard.h> #include <86box/sio.h> +#include <86box/random.h> #include <86box/plat_fallthrough.h> #include "cpu.h" @@ -108,6 +109,10 @@ pc87307_gpio_write(uint16_t port, uint8_t val, void *priv) CS, cpu_state.pc, port, bank, val); dev->gpio[bank][port & 0x0007] = val; + + if (bank == 0) { + machine_handle_gpio(1, ((dev->gpio[0][5] & dev->gpio[0][4]) << 8) | (dev->gpio[0][0] & dev->gpio[0][1])); + } } uint8_t @@ -118,18 +123,18 @@ pc87307_gpio_read(uint16_t port, void *priv) uint8_t bank = !!(dev->regs[0x22] & 0x80); uint8_t ret = dev->gpio[bank][port & 0x0007]; - switch (port & 0x0003) { + switch (port & 0x0007) { case 0x0000: if (bank == 0) { uint8_t mask = dev->gpio[0][1]; - pins = 0x7f; + pins = machine_handle_gpio(0, 0xFFFF) & 0xFF; ret = (ret & mask) | (pins & ~mask); } break; case 0x0004: if (bank == 0) { uint8_t mask = dev->gpio[0][5]; - pins = 0xfb; + pins = (machine_handle_gpio(0, 0xFFFF) >> 8) & 0xFF; ret = (ret & mask) | (pins & ~mask); } else ret = 0xff; @@ -152,13 +157,13 @@ static void pc87307_gpio_remove(pc87307_t *dev) { if (dev->gpio_base != 0xffff) { - io_removehandler(dev->gpio_base, 0x0002, + io_removehandler(dev->gpio_base, 0x0008, pc87307_gpio_read, NULL, NULL, pc87307_gpio_write, NULL, NULL, dev); dev->gpio_base = 0xffff; } if (dev->gpio_base2 != 0xffff) { - io_removehandler(dev->gpio_base2, 0x0002, + io_removehandler(dev->gpio_base2, 0x0008, pc87307_gpio_read, NULL, NULL, pc87307_gpio_write, NULL, NULL, dev); dev->gpio_base2 = 0xffff; } @@ -171,7 +176,7 @@ pc87307_gpio_init(pc87307_t *dev, int bank, uint16_t addr) *bank_base = addr; - io_sethandler(*bank_base, 0x0002, + io_sethandler(*bank_base, 0x0008, pc87307_gpio_read, NULL, NULL, pc87307_gpio_write, NULL, NULL, dev); } diff --git a/src/sio/sio_w83977.c b/src/sio/sio_w83977.c index a14e50942..07fda5d4e 100644 --- a/src/sio/sio_w83977.c +++ b/src/sio/sio_w83977.c @@ -1330,7 +1330,7 @@ w83977_init(const device_t *info) } const device_t w83977_device = { - .name = "SMC FDC37C93x Super I/O", + .name = "Winbond W83977F/TF/EF Super I/O", .internal_name = "w83977", .flags = 0, .local = 0, diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index 6c32b1892..c25890c50 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -344,7 +344,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) case 12: if (ad1848->type >= AD1848_TYPE_CS4248) { - ad1848->regs[12] = 0x80 | (val & 0x70) | (ad1848->regs[12] & 0x0f); + ad1848->regs[12] = 0x80 | (val & 0x60) | (ad1848->regs[12] & 0x0f); if ((ad1848->type >= AD1848_TYPE_CS4231) && (ad1848->type < AD1848_TYPE_CS4235)) { if (val & 0x40) ad1848->fmt_mask |= 0x80; @@ -425,6 +425,19 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) ad1848->fm_vol_r = (int) ad1848_vols_5bits_aux_gain[val & 0x1f]; } } + if ((ad1848->type >= AD1848_TYPE_CS4232) && (ad1848->type <= AD1848_TYPE_CS4236)) { + if (ad1848->index == 18) { + if (val & 0x80) + ad1848->fm_vol_l = 0; + else + ad1848->fm_vol_l = (int) ad1848_vols_5bits_aux_gain[val & 0x1f]; + } else { + if (val & 0x80) + ad1848->fm_vol_r = 0; + else + ad1848->fm_vol_r = (int) ad1848_vols_5bits_aux_gain[val & 0x1f]; + } + } break; case 20 ... 21: @@ -508,6 +521,8 @@ readonly_x: } if (ad1848->type == AD1848_TYPE_CS4231) /* I23 is reserved and read-only on CS4231 non-A */ goto readonly_i; + if ((ad1848->type >= AD1848_TYPE_CS4232) || (ad1848->type <= AD1848_TYPE_CS4236)) /* I23 bits 7-1 are read-only on CS4231A/4232/4236 non-B, Win2k relies on this for detection */ + val = (val & 0x01); break; case 24: diff --git a/src/sound/snd_azt2316a.c b/src/sound/snd_azt2316a.c index 1f88db719..226adad15 100644 --- a/src/sound/snd_azt2316a.c +++ b/src/sound/snd_azt2316a.c @@ -1040,10 +1040,20 @@ azt2316a_enable_wss(uint8_t enable, void *priv) { azt2316a_t *azt2316a = (azt2316a_t *) priv; - if (enable) + sound_set_cd_audio_filter(NULL, NULL); + + if (enable) { azt2316a->cur_mode = 1; - else + sound_set_cd_audio_filter(ad1848_filter_cd_audio, &azt2316a->ad1848); + azt2316a->sb->opl_mixer = azt2316a; + azt2316a->sb->opl_mix = azt1605_filter_opl; + } + else { azt2316a->cur_mode = 0; + sound_set_cd_audio_filter(sbpro_filter_cd_audio, azt2316a->sb); + azt2316a->sb->opl_mixer = NULL; + azt2316a->sb->opl_mix = NULL; + } } static void diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 15ad71782..78b628b3b 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -568,7 +568,11 @@ cs423x_ctxswitch_write(uint16_t addr, UNUSED(uint8_t val), void *priv) { cs423x_t *dev = (cs423x_t *) priv; uint8_t ctx = (dev->regs[7] & 0x80); - uint8_t enable_opl = (dev->ad1848.xregs[4] & 0x10) && !(dev->indirect_regs[2] & 0x85); + uint8_t enable_opl = (dev->ad1848.xregs[4] & 0x10) && !(dev->indirect_regs[2] & 0x85); /* CS4236B+ */ + + /* CS4232/4236 (non-B) doesn't have an IFM bit, always enable the OPL on these chips */ + if (dev->type <= CRYSTAL_CS4236) + enable_opl = 1; /* Check if a context switch (WSS=1 <-> SBPro=0) occurred through the address being written. */ if ((dev->regs[7] & 0x80) ? ((addr & 0xfff0) == dev->sb_base) : ((addr & 0xfffc) == dev->wss_base)) { @@ -1005,6 +1009,7 @@ cs423x_init(const device_t *info) /* Initialize SBPro codec. The WSS codec is initialized later by cs423x_reset */ dev->sb = device_add_inst(&sb_pro_compat_device, 1); sound_set_cd_audio_filter(sbpro_filter_cd_audio, dev->sb); /* CD audio filter for the default context */ + music_add_handler(sb_get_music_buffer_sbpro, dev->sb); /* Init the SBPro OPL3 since sb_pro_compat_init does not */ /* Initialize RAM, registers and WSS codec. */ cs423x_reset(dev); diff --git a/src/utils/crc32.c b/src/utils/crc32.c index 6993654ae..a8d5dde26 100644 --- a/src/utils/crc32.c +++ b/src/utils/crc32.c @@ -22,7 +22,9 @@ #include #include -#define __USE_LARGEFILE64 +#ifndef __USE_LARGEFILE64 +#define __USE_LARGEFILE64 1 +#endif #include #if (defined(__HAIKU__) || defined(__unix__) || defined(__APPLE__)) && !defined(__linux__) diff --git a/src/video/clockgen/vid_clockgen_ics2494.c b/src/video/clockgen/vid_clockgen_ics2494.c index f9f4fbcb1..0776d97ca 100644 --- a/src/video/clockgen/vid_clockgen_ics2494.c +++ b/src/video/clockgen/vid_clockgen_ics2494.c @@ -290,7 +290,7 @@ ics2494_init(const device_t *info) ics2494->freq[15] = 65000000.0; break; case 305: - /* ICS2494A(N)-205 for S3 86C924 */ + /* ICS2494A(N)-305 for S3 86C924 */ ics2494->freq[0x0] = 25175000.0; ics2494->freq[0x1] = 28322000.0; ics2494->freq[0x2] = 40000000.0; @@ -308,6 +308,25 @@ ics2494_init(const device_t *info) ics2494->freq[0xe] = 75000000.0; ics2494->freq[0xf] = 94500000.0; break; + case 324: + /* ICS2494A(N)-324 for Tseng ET4000/W32 series */ + ics2494->freq[0x0] = 50000000.0; + ics2494->freq[0x1] = 56644000.0; + ics2494->freq[0x2] = 65000000.0; + ics2494->freq[0x3] = 72000000.0; + ics2494->freq[0x4] = 80000000.0; + ics2494->freq[0x5] = 89800000.0; + ics2494->freq[0x6] = 63000000.0; + ics2494->freq[0x7] = 75000000.0; + ics2494->freq[0x8] = 83078000.0; + ics2494->freq[0x9] = 93463000.0; + ics2494->freq[0xa] = 100000000.0; + ics2494->freq[0xb] = 104000000.0; + ics2494->freq[0xc] = 108000000.0; + ics2494->freq[0xd] = 120000000.0; + ics2494->freq[0xe] = 130000000.0; + ics2494->freq[0xf] = 134700000.0; + break; default: break; @@ -339,6 +358,20 @@ const device_t ics2494an_305_device = { .config = NULL }; +const device_t ics2494an_324_device = { + .name = "ICS2494AN-324 Clock Generator", + .internal_name = "ics2494an_324", + .flags = 0, + .local = 324, + .init = ics2494_init, + .close = ics2494_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t ati18810_28800_device = { .name = "ATI 18810 (ATI 28800) Clock Generator", .internal_name = "ati18810_28800", diff --git a/src/video/ramdac/vid_ramdac_att20c49x.c b/src/video/ramdac/vid_ramdac_att20c49x.c index 2d8d6a304..3776e6616 100644 --- a/src/video/ramdac/vid_ramdac_att20c49x.c +++ b/src/video/ramdac/vid_ramdac_att20c49x.c @@ -42,12 +42,6 @@ att49x_ramdac_control(uint8_t val, void *priv, svga_t *svga) att49x_ramdac_t *ramdac = (att49x_ramdac_t *) priv; ramdac->ctrl = val; switch ((ramdac->ctrl >> 5) & 7) { - case 0: - case 1: - case 2: - case 3: - svga->bpp = 8; - break; case 4: case 5: svga->bpp = 15; @@ -60,10 +54,12 @@ att49x_ramdac_control(uint8_t val, void *priv, svga_t *svga) break; default: + svga->bpp = 8; break; } if (ramdac->type == ATT_490 || ramdac->type == ATT_491) svga_set_ramdac_type(svga, (val & 2) ? RAMDAC_8BIT : RAMDAC_6BIT); + svga_recalctimings(svga); } diff --git a/src/video/ramdac/vid_ramdac_att2xc498.c b/src/video/ramdac/vid_ramdac_att2xc498.c index 141ffa4b4..21c6770a3 100644 --- a/src/video/ramdac/vid_ramdac_att2xc498.c +++ b/src/video/ramdac/vid_ramdac_att2xc498.c @@ -45,7 +45,7 @@ att498_ramdac_control(uint8_t val, void *priv, svga_t *svga) svga->bpp = 8; break; case 1: - if (ramdac->ctrl & 4) + if (ramdac->ctrl & 0x04) svga->bpp = 15; else svga->bpp = 8; @@ -63,7 +63,7 @@ att498_ramdac_control(uint8_t val, void *priv, svga_t *svga) break; } - svga_set_ramdac_type(svga, (ramdac->ctrl & 2) ? RAMDAC_8BIT : RAMDAC_6BIT); + svga_set_ramdac_type(svga, (ramdac->ctrl & 0x02) ? RAMDAC_8BIT : RAMDAC_6BIT); svga_recalctimings(svga); } @@ -132,7 +132,7 @@ att498_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga) ramdac->state++; break; case 6: - temp = ramdac->ctrl; + temp = 0x98; ramdac->state = 0; break; default: diff --git a/src/video/ramdac/vid_ramdac_bt48x.c b/src/video/ramdac/vid_ramdac_bt48x.c index be6499990..64bc2b5b7 100644 --- a/src/video/ramdac/vid_ramdac_bt48x.c +++ b/src/video/ramdac/vid_ramdac_bt48x.c @@ -366,15 +366,14 @@ bt48x_recalctimings(void *priv, svga_t *svga) svga->clock_multiplier = 0; svga->multiplexing_rate = 0; svga->true_color_bypass = 0; - if (ramdac->cmd_r3 & 0x08) { /* x2 clock multiplier */ - //pclog("2x multiplier.\n"); + if (ramdac->cmd_r3 & 0x08) /* x2 clock multiplier */ svga->clock_multiplier = 1; - } + svga->multiplexing_rate = (ramdac->cmd_r1 & 0x60) >> 5; if (svga->bpp >= 15) svga->true_color_bypass = !!(ramdac->cmd_r1 & 0x10); - //pclog("CR0=%02x, CR1=%02x, CR2=%02x.\n", ramdac->cmd_r0, ramdac->cmd_r1, ramdac->cmd_r2); + pclog("CR0=%02x, CR1=%02x, CR2=%02x.\n", ramdac->cmd_r0, ramdac->cmd_r1, ramdac->cmd_r2); } void diff --git a/src/video/ramdac/vid_ramdac_ibm_rgb528.c b/src/video/ramdac/vid_ramdac_ibm_rgb528.c index bded466d1..09cabeb0a 100644 --- a/src/video/ramdac/vid_ramdac_ibm_rgb528.c +++ b/src/video/ramdac/vid_ramdac_ibm_rgb528.c @@ -60,6 +60,7 @@ typedef union ibm_rgb528_pixel32_t { } ibm_rgb528_pixel32_t; typedef struct ibm_rgb528_ramdac_t { + int type; PALETTE extpal; uint32_t extpallook[256]; uint8_t indexed_data[2048]; @@ -627,19 +628,21 @@ ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *s case 0x02a: case 0x02c: case 0x02e: - if (ramdac->indexed_data[0x0002] & 0x01) { - switch (ramdac->indexed_data[0x0010] & 0x07) { - case 0x00: - case 0x02: - ramdac->pix_f[ramdac->index - 0x0020] = val; - break; - case 0x01: - case 0x03: - ramdac->pix_m[(ramdac->index - 0x0020) >> 1] = val; - break; - default: - break; - } + switch (ramdac->indexed_data[0x0010] & 0x03) { + case 0x00: + ramdac->pix_f[(ramdac->index - 0x0020)] = val; + break; + case 0x01: + ramdac->pix_m[(ramdac->index - 0x0020) >> 1] = val; + break; + case 0x02: + ramdac->pix_f[(ramdac->index - 0x0020)] = val; + break; + case 0x03: + ramdac->pix_m[(ramdac->index - 0x0020) >> 1] = val; + break; + default: + break; } break; case 0x021: @@ -650,19 +653,21 @@ ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *s case 0x02b: case 0x02d: case 0x02f: - if (ramdac->indexed_data[0x0002] & 0x01) { - switch (ramdac->indexed_data[0x010] & 0x07) { - case 0x00: - case 0x02: - ramdac->pix_f[ramdac->index - 0x0020] = val; - break; - case 0x01: - case 0x03: - ramdac->pix_n[(ramdac->index - 0x0020) >> 1] = val; - break; - default: - break; - } + switch (ramdac->indexed_data[0x0010] & 0x03) { + case 0x00: + ramdac->pix_f[(ramdac->index - 0x0020)] = val; + break; + case 0x01: + ramdac->pix_n[(ramdac->index - 0x0020) >> 1] = val; + break; + case 0x02: + ramdac->pix_f[(ramdac->index - 0x0020)] = val; + break; + case 0x03: + ramdac->pix_n[(ramdac->index - 0x0020) >> 1] = val; + break; + default: + break; } break; @@ -868,7 +873,52 @@ ibm_rgb528_recalctimings(void *priv, svga_t *svga) { const ibm_rgb528_ramdac_t *ramdac = (ibm_rgb528_ramdac_t *) priv; - svga->interlace = ramdac->indexed_data[0x071] & 0x20; + svga->interlace = !!(ramdac->indexed_data[0x071] & 0x20); + //pclog("MiscClockControl idx002=%02x, SystemClockControl idx008=%02x, Misc2 idx071=%02x, Misc1 idx070=%02x, Misc4 idx073=%02x.\n", + // ramdac->indexed_data[0x002], ramdac->indexed_data[0x008], ramdac->indexed_data[0x071], ramdac->indexed_data[0x070], ramdac->indexed_data[0x073]); + + if (ramdac->indexed_data[0x071] & 0x01) { + if ((ramdac->indexed_data[0x070] & 0x03) == 0x03) { + switch ((ramdac->indexed_data[0x002] & 0x0e) >> 1) { + case 0x00: + default: + svga->clock_multiplier = 0; + break; + case 0x01: + svga->clock_multiplier = 1; + break; + case 0x02: + svga->clock_multiplier = 2; + break; + case 0x03: + svga->clock_multiplier = 3; + break; + case 0x04: + svga->clock_multiplier = 4; + break; + } + } else if ((ramdac->indexed_data[0x070] & 0x03) == 0x01) { + switch ((ramdac->indexed_data[0x002] & 0x0e) >> 1) { + case 0x00: + default: + svga->clock_multiplier = 1; + svga->clock *= 2.0; + break; + case 0x01: + svga->clock_multiplier = 1; + break; + case 0x02: + svga->clock_multiplier = 2; + break; + case 0x03: + svga->clock_multiplier = 3; + break; + case 0x04: + svga->clock_multiplier = 4; + break; + } + } + } if (svga->scrblank || !svga->attr_palette_enable) { if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { @@ -904,49 +954,47 @@ ibm_rgb528_recalctimings(void *priv, svga_t *svga) float ibm_rgb528_getclock(int clock, void *priv) { - const ibm_rgb528_ramdac_t *ramdac = (ibm_rgb528_ramdac_t *) priv; - int pll_vco_div_cnt; - int pll_df; - int pll_ref_div_cnt; - int ddot_divs[8] = { 1, 2, 4, 8, 16, 1, 1, 1 }; - int ddot_div = ddot_divs[(ramdac->indexed_data[0x0002] >> 1) & 0x07]; - float f_pll; + const ibm_rgb528_ramdac_t *ramdac = (ibm_rgb528_ramdac_t *) priv; + int pll_vco_div_cnt; + int pll_df; + int pll_ref_div_cnt; + int ddot_divs[8] = { 1, 2, 4, 8, 16, 1, 1, 1 }; + int ddot_div = ddot_divs[(ramdac->indexed_data[0x0002] >> 1) & 0x07]; + float f_pll; - clock &= 0x03; + if (clock == 0) + return 25175000.0f; + if (clock == 1) + return 28322000.0f; - if (ramdac->indexed_data[0x0002] & 0x01) { - switch (ramdac->indexed_data[0x0010] & 0x07) { - case 0x00: - default: - pll_vco_div_cnt = ramdac->pix_f[clock] & 0x3f; - pll_df = 8 >> (ramdac->pix_f[clock] >> 6); - pll_ref_div_cnt = ramdac->pix_f_ref_div & 0x1f; - break; - case 0x01: - pll_vco_div_cnt = ramdac->pix_m[clock] & 0x3f; - pll_df = 8 >> (ramdac->pix_m[clock] >> 6); - pll_ref_div_cnt = ramdac->pix_n[clock] & 0x1f; - break; - case 0x02: - pll_vco_div_cnt = ramdac->pix_f[ramdac->indexed_data[0x0011] & 0x0f] & 0x3f; - pll_df = 8 >> (ramdac->pix_f[ramdac->indexed_data[0x0011] & 0x0f] >> 6); - pll_ref_div_cnt = ramdac->pix_f_ref_div & 0x1f; - break; - case 0x03: - pll_vco_div_cnt = ramdac->pix_m[ramdac->indexed_data[0x0011] & 0x07] & 0x3f; - pll_df = 8 >> (ramdac->pix_m[ramdac->indexed_data[0x0011] & 0x07] >> 6); - pll_ref_div_cnt = ramdac->pix_n[ramdac->indexed_data[0x0011] & 0x07] & 0x1f; - break; - } - } else { - pll_vco_div_cnt = ramdac->indexed_data[0x0016] & 0x3f; - pll_df = 8 >> (ramdac->indexed_data[0x0016] >> 6); - pll_ref_div_cnt = ramdac->indexed_data[0x0015] & 0x1f; + switch (ramdac->indexed_data[0x0010] & 0x03) { + case 0x00: + default: + pll_vco_div_cnt = ramdac->pix_f[clock & 0x03] & 0x3f; + pll_df = 8 >> (ramdac->pix_f[clock & 0x03] >> 6); + pll_ref_div_cnt = ramdac->pix_f_ref_div & 0x1f; + break; + case 0x01: + pll_vco_div_cnt = ramdac->pix_m[clock & 0x03] & 0x3f; + pll_df = 8 >> (ramdac->pix_m[clock & 0x03] >> 6); + pll_ref_div_cnt = ramdac->pix_n[clock & 0x03] & 0x1f; + break; + case 0x02: + pll_vco_div_cnt = ramdac->pix_f[ramdac->indexed_data[0x0011] & 0x0f] & 0x3f; + pll_df = 8 >> (ramdac->pix_f[ramdac->indexed_data[0x0011] & 0x0f] >> 6); + pll_ref_div_cnt = ramdac->pix_f_ref_div & 0x1f; + break; + case 0x03: + pll_vco_div_cnt = ramdac->pix_m[ramdac->indexed_data[0x0011] & 0x0f] & 0x3f; + pll_df = 8 >> (ramdac->pix_m[ramdac->indexed_data[0x0011] & 0x0f] >> 6); + pll_ref_div_cnt = ramdac->pix_n[ramdac->indexed_data[0x0011] & 0x0f] & 0x1f; + break; } - f_pll = ramdac->ref_clock * (float) (pll_vco_div_cnt + 65) / (float) (pll_ref_div_cnt * pll_df); f_pll /= (float) ddot_div; + //pclog("PIXCTRL1=%02x, clock=%d, m=%d, df=%d, n=%d, ctrl2=%02x, miscclock=%02x, sysclock=%02x, f_pll=%f.\n", + // ramdac->indexed_data[0x010], clock, pll_vco_div_cnt, pll_df, pll_ref_div_cnt, ramdac->indexed_data[0x011], ramdac->indexed_data[0x002], ramdac->indexed_data[0x008], f_pll); return f_pll; } @@ -1073,19 +1121,11 @@ ibm_rgb528_ramdac_init(UNUSED(const device_t *info)) ramdac->smlc_part = 0x0100; ramdac->ref_clock = 14318184.0f; + ramdac->pix_f_ref_div = 0x07; /*Per datasheet regarding the reference clock value.*/ ramdac->indexed_data[0x0008] = 0x0001; - ramdac->indexed_data[0x0014] = 0x0005; ramdac->indexed_data[0x0015] = 0x0008; ramdac->indexed_data[0x0016] = 0x0041; - ramdac->indexed_data[0x0020] = 0x0005; - ramdac->indexed_data[0x0021] = 0x000e; - - ramdac->pix_f_ref_div = 0x0005; - ramdac->pix_f[0] = 0x0005; - ramdac->pix_f[1] = 0x000e; - ramdac->pix_m[0] = 0x0005; - ramdac->pix_n[0] = 0x000e; return ramdac; } diff --git a/src/video/ramdac/vid_ramdac_sdac.c b/src/video/ramdac/vid_ramdac_sdac.c index 2b2890307..a88cdcaef 100644 --- a/src/video/ramdac/vid_ramdac_sdac.c +++ b/src/video/ramdac/vid_ramdac_sdac.c @@ -49,6 +49,7 @@ typedef struct sdac_ramdac_t { int rs2; uint8_t type; uint8_t command; + float ref_clock; } sdac_ramdac_t; static void @@ -275,11 +276,21 @@ sdac_getclock(int clock, void *priv) n1 = ((ramdac->regs[clock] >> 8) & 0x1f) + 2; n2 = ((ramdac->regs[clock] >> 13) & 0x07); n2 = (1 << n2); - t = (14318184.0f * (float) m) / (float) (n1 * n2); + t = (ramdac->ref_clock * (float) m) / (float) (n1 * n2); + //pclog("SDACClock=%d, regs val=%04x.\n", clock, ramdac->regs[clock]); return t; } +void +sdac_set_ref_clock(void *priv, float ref_clock) +{ + sdac_ramdac_t *ramdac = (sdac_ramdac_t *) priv; + + if (ramdac != NULL) + ramdac->ref_clock = ref_clock; +} + void * sdac_ramdac_init(const device_t *info) { @@ -288,6 +299,7 @@ sdac_ramdac_init(const device_t *info) ramdac->type = info->local; + ramdac->ref_clock = 14318184.0f; ramdac->regs[0] = 0x6128; ramdac->regs[1] = 0x623d; diff --git a/src/video/ramdac/vid_ramdac_stg1702.c b/src/video/ramdac/vid_ramdac_stg1702.c index 8a2d008dd..6c0945704 100644 --- a/src/video/ramdac/vid_ramdac_stg1702.c +++ b/src/video/ramdac/vid_ramdac_stg1702.c @@ -31,6 +31,7 @@ typedef struct stg_ramdac_t { int magic_count, index; uint8_t regs[256]; uint8_t command; + int type; } stg_ramdac_t; static int stg_state_read[2][8] = { @@ -46,6 +47,8 @@ stg_ramdac_set_bpp(svga_t *svga, stg_ramdac_t *ramdac) switch (ramdac->regs[3]) { default: case 0: + svga->bpp = 8; + break; case 5: case 7: svga->bpp = 8; @@ -176,7 +179,7 @@ stg_ramdac_in(uint16_t addr, void *priv, svga_t *svga) temp = 0x44; break; case 1: - temp = 0x03; + temp = ramdac->type; break; case 7: temp = 0x88; @@ -216,22 +219,24 @@ stg_getclock(int clock, void *priv) float t; int m; int n; - int n2; - const uint16_t *c; + int d; + int d2; + uint16_t c; if (clock == 0) return 25175000.0; if (clock == 1) return 28322000.0; - clock ^= 1; /*Clocks 2 and 3 seem to be reversed*/ - c = (uint16_t *) &ramdac->regs[0x20 + (clock << 1)]; - m = (*c & 0xff) + 2; /* B+2 */ - n = ((*c >> 8) & 0x1f) + 2; /* N1+2 */ - n2 = ((*c >> 13) & 0x07); /* D */ - n2 = (1 << n2); - t = (14318184.0f * (float) m) / (float) (n * n2); + c = ramdac->regs[0x20 + (clock << 1)]; + c |= (ramdac->regs[0x21 + (clock << 1)] << 8); + m = (c & 0xff) + 2; /* B+2 */ + n = ((c >> 8) & 0x1f) + 2; /* N1+2 */ + d = ((c >> 13) & 0x07); /* D */ + d2 = (1 << d); + t = (14318184.0f * (float) m) / (float) (n * d2); + //pclog("RAMDAC vclk val=0x%02x, vclk v=%d low, D=%d, t=%f.\n", ramdac->regs[0x20 + (clock << 1)], clock, d2, t); return t; } @@ -241,6 +246,8 @@ stg_ramdac_init(UNUSED(const device_t *info)) stg_ramdac_t *ramdac = (stg_ramdac_t *) malloc(sizeof(stg_ramdac_t)); memset(ramdac, 0, sizeof(stg_ramdac_t)); + ramdac->type = info->local & 0xff; + return ramdac; } @@ -253,11 +260,25 @@ stg_ramdac_close(void *priv) free(ramdac); } -const device_t stg_ramdac_device = { - .name = "SGS-Thompson STG170x RAMDAC", +const device_t stg1702_ramdac_device = { + .name = "SGS-Thompson STG1702 RAMDAC", .internal_name = "stg_ramdac", .flags = 0, - .local = 0, + .local = 2, + .init = stg_ramdac_init, + .close = stg_ramdac_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t stg1703_ramdac_device = { + .name = "SGS-Thompson STG1703 RAMDAC", + .internal_name = "stg_ramdac", + .flags = 0, + .local = 3, .init = stg_ramdac_init, .close = stg_ramdac_close, .reset = NULL, diff --git a/src/video/ramdac/vid_ramdac_tvp3026.c b/src/video/ramdac/vid_ramdac_tvp3026.c index 1958fa588..73af99075 100644 --- a/src/video/ramdac/vid_ramdac_tvp3026.c +++ b/src/video/ramdac/vid_ramdac_tvp3026.c @@ -9,7 +9,6 @@ * Emulation of the Texas Instruments TVP3026 true colour RAMDAC * family. * - * TODO: Clock and other parts. * * Authors: TheCollector1995, * @@ -49,6 +48,7 @@ typedef struct tvp3026_ramdac_t { uint8_t mode; uint8_t pll_addr; uint8_t clock_sel; + uint8_t color_key_ctrl; struct { uint8_t m; uint8_t n; @@ -171,25 +171,24 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *priv, svg svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(val & 0x03); ramdac->mode = val & 0x03; + //pclog("0x09: DACEna=%02x, MainEna=%02x.\n", svga->dac_hwcursor.ena, svga->hwcursor.ena); } break; case 0x0a: /* Indexed Data (RS value = 1010) */ switch (ramdac->ind_idx) { case 0x06: /* Indirect Cursor Control */ ramdac->ccr = val; + svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; if (!(ramdac->ccr & 0x80)) { - svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; - svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; - svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(val & 0x03); ramdac->mode = val & 0x03; } else { - svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; - svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; - svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(ramdac->dcc & 0x03); ramdac->mode = ramdac->dcc & 0x03; } + //pclog("0x0a, indirect 0x06: DACEna=%02x, MainEna=%02x.\n", svga->dac_hwcursor.ena, svga->hwcursor.ena); break; case 0x0f: /* Latch Control */ ramdac->latch_cntl = val; @@ -279,6 +278,9 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *priv, svg } ramdac->pll_addr = ((ramdac->pll_addr + 0x10) & 0x30) | (ramdac->pll_addr & 0xcf); break; + case 0x38: /* Color-Key Control */ + ramdac->color_key_ctrl = val; + break; case 0x39: /* MCLK/Loop Clock Control */ ramdac->mclk = val; break; @@ -470,6 +472,9 @@ tvp3026_ramdac_in(uint16_t addr, int rs2, int rs3, void *priv, svga_t *svga) break; } break; + case 0x38: /* Color-Key Control */ + temp = ramdac->color_key_ctrl; + break; case 0x39: /* MCLK/Loop Clock Control */ temp = ramdac->mclk; break; @@ -516,11 +521,39 @@ tvp3026_recalctimings(void *priv, svga_t *svga) svga->interlace = !!(ramdac->ccr & 0x40); /* TODO: Figure out gamma correction for 15/16 bpp color. */ svga->lut_map = !!((svga->bpp >= 15 && (svga->bpp != 24)) && (ramdac->true_color & 0xf0) != 0x00); + svga->clock_multiplier = 0; + + //pclog("RAMDAC CLOCKSEL=%02x, MCR=%02x, LoopMCLK=%02x, Latch=%02x.\n", ramdac->clock_sel, ramdac->mcr, ramdac->mclk, ramdac->latch_cntl); if (!(ramdac->clock_sel & 0x70)) { if (ramdac->mcr != 0x98) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; + switch ((ramdac->clock_sel >> 4) & 7) { + case 0: + svga->clock_multiplier = 1; + break; + case 1: + svga->clock_multiplier = 2; + break; + case 2: + svga->clock_multiplier = 4; + break; + case 3: + svga->clock_multiplier = 8; + break; + case 4: + svga->clock_multiplier = 16; + break; + case 5: + svga->clock_multiplier = 32; + break; + case 6: + svga->clock_multiplier = 64; + break; + case 7: + default: + svga->clock_multiplier = 0; + break; + } } } } diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index f809a6c0e..95a32dabe 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -547,6 +547,7 @@ mach64_recalctimings(svga_t *svga) svga->rowcount = mach64->crtc_gen_cntl & 1; svga->lut_map = (mach64->type >= MACH64_VT); svga->rowoffset <<= 1; + svga->attrregs[0x13] &= ~0x0f; if (mach64->type == MACH64_GX) ati68860_ramdac_set_render(svga->ramdac, svga); @@ -4897,7 +4898,7 @@ mach64_common_init(const device_t *info) mach64_io_set(mach64); if (info->flags & DEVICE_PCI) - pci_add_card(PCI_ADD_NORMAL, mach64_pci_read, mach64_pci_write, mach64, &mach64->pci_slot); + pci_add_card((info->local & (1 << 19)) ? PCI_ADD_VIDEO : PCI_ADD_NORMAL, mach64_pci_read, mach64_pci_write, mach64, &mach64->pci_slot); mach64->pci_regs[PCI_REG_COMMAND] = 3; mach64->pci_regs[0x30] = 0x00; @@ -4989,7 +4990,8 @@ mach64ct_init(const device_t *info) ati_eeprom_load(&mach64->eeprom, "mach64ct.nvr", 1); - rom_init(&mach64->bios_rom, BIOS_ROMCT_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + if (!(info->local & (1 << 19))) + rom_init(&mach64->bios_rom, BIOS_ROMCT_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); mem_mapping_disable(&mach64->bios_rom.mapping); diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index abdde1622..95f9e7bf6 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -1824,6 +1824,9 @@ gd54xx_recalctimings(svga_t *svga) uint8_t clocksel; uint8_t rdmask; uint8_t linedbl = svga->dispend * 9 / 10 >= svga->hdisp; + uint8_t m = 0; + int d = 0; + int n = 0; svga->hblankstart = svga->crtc[2]; @@ -1865,6 +1868,34 @@ gd54xx_recalctimings(svga_t *svga) svga->interlace = 0; } + clocksel = (svga->miscout >> 2) & 3; + + if (!gd54xx->vclk_n[clocksel] || !gd54xx->vclk_d[clocksel]) + svga->clock = (cpuclock * (float) (1ULL << 32)) / + ((svga->miscout & 0xc) ? 28322000.0 : 25175000.0); + else { + n = gd54xx->vclk_n[clocksel] & 0x7f; + d = (gd54xx->vclk_d[clocksel] & 0x3e) >> 1; + m = gd54xx->vclk_d[clocksel] & 0x01 ? 2 : 1; + float freq = (14318184.0F * ((float) n / ((float) d * m))); + if (gd54xx_is_5422(svga)) { + switch (svga->seqregs[0x07] & (gd54xx_is_5434(svga) ? 0xe : 6)) { + case 2: + freq /= 2.0F; + break; + case 4: + if (!gd54xx_is_5434(svga)) + freq /= 3.0F; + break; + + default: + break; + } + } + svga->clock = (cpuclock * (double) (1ULL << 32)) / freq; + } + + svga->bpp = 8; svga->map8 = svga->pallook; if (svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) { if (linedbl) @@ -1874,6 +1905,7 @@ gd54xx_recalctimings(svga_t *svga) if ((svga->dispend == 512) && !svga->interlace && gd54xx_is_5434(svga)) { svga->hdisp <<= 1; svga->dots_per_clock <<= 1; + svga->clock *= 2.0; } } } else if (svga->gdcreg[5] & 0x40) @@ -1881,8 +1913,6 @@ gd54xx_recalctimings(svga_t *svga) svga->memaddr_latch |= ((svga->crtc[0x1b] & 0x01) << 16) | ((svga->crtc[0x1b] & 0xc) << 15); - svga->bpp = 8; - if (gd54xx->ramdac.ctrl & 0x80) { if (gd54xx->ramdac.ctrl & 0x40) { if ((svga->crtc[0x27] >= CIRRUS_ID_CLGD5428) || (svga->crtc[0x27] == CIRRUS_ID_CLGD5426)) @@ -2023,33 +2053,6 @@ gd54xx_recalctimings(svga_t *svga) } } - clocksel = (svga->miscout >> 2) & 3; - - if (!gd54xx->vclk_n[clocksel] || !gd54xx->vclk_d[clocksel]) - svga->clock = (cpuclock * (float) (1ULL << 32)) / - ((svga->miscout & 0xc) ? 28322000.0 : 25175000.0); - else { - int n = gd54xx->vclk_n[clocksel] & 0x7f; - int d = (gd54xx->vclk_d[clocksel] & 0x3e) >> 1; - uint8_t m = gd54xx->vclk_d[clocksel] & 0x01 ? 2 : 1; - float freq = (14318184.0F * ((float) n / ((float) d * m))); - if (gd54xx_is_5422(svga)) { - switch (svga->seqregs[0x07] & (gd54xx_is_5434(svga) ? 0xe : 6)) { - case 2: - freq /= 2.0F; - break; - case 4: - if (!gd54xx_is_5434(svga)) - freq /= 3.0F; - break; - - default: - break; - } - } - svga->clock = (cpuclock * (double) (1ULL << 32)) / freq; - } - svga->vram_display_mask = (svga->crtc[0x1b] & 2) ? gd54xx->vram_mask : 0x3ffff; if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5430) diff --git a/src/video/vid_ddc_edid_custom.c b/src/video/vid_ddc_edid_custom.c index 4442fac10..ae427d7de 100644 --- a/src/video/vid_ddc_edid_custom.c +++ b/src/video/vid_ddc_edid_custom.c @@ -64,7 +64,7 @@ ddc_load_edid(char *path, uint8_t *buf, size_t size) // Check the beginning of the file for the EDID header. uint64_t header; - fread(&header, sizeof(header), 1, fp); + (void) !fread(&header, sizeof(header), 1, fp); if (header == EDID_HEADER) { // Binary format. Read as is diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index 1a8a767e2..80f27833a 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -639,6 +639,7 @@ static void et4000_recalctimings(svga_t *svga) { const et4000_t *dev = (et4000_t *) svga->priv; + int clk_sel = ((svga->miscout >> 2) & 0x03) | ((svga->crtc[0x34] << 1) & 0x04)| ((svga->crtc[0x31] >> 3) & 0x08); svga->memaddr_latch |= (svga->crtc[0x33] & 3) << 16; @@ -665,26 +666,15 @@ et4000_recalctimings(svga_t *svga) svga->dots_per_clock <<= 1; } - switch (((svga->miscout >> 2) & 3) | ((svga->crtc[0x34] << 1) & 4)) { - case 0: - case 1: - break; - case 3: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 40000000.0; - break; - case 5: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 65000000.0; - break; - default: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 36000000.0; - break; - } + svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clk_sel, svga->clock_gen); + if (clk_sel < 2) + svga->clock *= 2.0; switch (svga->bpp) { case 15: case 16: - svga->hdisp /= 2; - svga->dots_per_clock /= 2; + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; break; case 24: @@ -901,6 +891,9 @@ et4000_init(const device_t *info) if (dev->type >= ET4000_TYPE_ISA) dev->svga.ramdac = device_add(&sc1502x_ramdac_device); + dev->svga.clock_gen = device_add(&ics2494an_324_device); + dev->svga.getclock = ics2494_getclock; + if (dev->type == ET4000_TYPE_TC6058AF) dev->svga.adv_flags |= FLAG_PRECISETIME; diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index 05de0dbea..4b95ba04e 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -10,6 +10,8 @@ * * Known bugs: Accelerator doesn't work in planar modes * + * + * * Authors: Sarah Walker, * Miran Grca, * @@ -35,30 +37,46 @@ #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> -#define BIOS_ROM_PATH_DIAMOND "roms/video/et4000w32/et4000w32.bin" -#define BIOS_ROM_PATH_CARDEX "roms/video/et4000w32/cardex.vbi" -#define BIOS_ROM_PATH_W32 "roms/video/et4000w32/ET4000W32VLB_bios_MX27C512.BIN" -#define BIOS_ROM_PATH_W32I_ISA "roms/video/et4000w32/ET4KW32I.VBI" -#define BIOS_ROM_PATH_W32I_VLB "roms/video/et4000w32/tseng.u41.bin" -#define BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB "roms/video/et4000w32/VideoMagic-BioS-HXIRTW32PWSRL.bin" -#define BIOS_ROM_PATH_W32P "roms/video/et4000w32/ET4K_W32.BIN" -#define BIOS_ROM_PATH_W32P_REVC "roms/video/et4000w32/et4000w32pcardex.BIN" +#define BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S "roms/video/et4000w32/ET4000W32VLB_bios_MX27C512.BIN" +#define BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE "roms/video/et4000w32/ET4KW32I.VBI" +#define BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO "roms/video/et4000w32/Hercules Dynamite VL Pro v8.00 c 1993 Hercules.bin" +#define BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC "roms/video/et4000w32/VideoMagic-BioS-HXIRTW32PWSRL.bin" +#define BIOS_ROM_PATH_W32P_REVC_CARDEX "roms/video/et4000w32/et4000w32pcardex.BIN" +#define BIOS_ROM_PATH_W32P_REVD "roms/video/et4000w32/ET4K_W32.BIN" +#define BIOS_ROM_PATH_W32P_REVD_CARDEX "roms/video/et4000w32/cardex.vbi" +#define BIOS_ROM_PATH_W32P_REVD_DIAMOND "roms/video/et4000w32/et4000w32.bin" #define ACL_WRST 1 #define ACL_RDST 2 #define ACL_XYST 4 #define ACL_SSO 8 +typedef enum { + ET4000W32 = 0, + ET4000W32I_REVB = 3, + ET4000W32P_REVB = 5, + ET4000W32P_REVC = 7, + ET4000W32P_REVD = 6 +} et4000w32_chip_type; + enum { - ET4000W32, - ET4000W32I, - ET4000W32P_REVC, - ET4000W32P_VIDEOMAGIC_REVB, - ET4000W32P, - ET4000W32P_CARDEX, - ET4000W32P_DIAMOND + MACHSPEED_VGA_GUI_2400S = 0, + AXIS_MICRODEVICE_ET4W32_5, + HERCULES_DYNAMITE_PRO_VLB, + VIDEOMAGIC_ETW32PVS, + CARDEX_REVC, + GENERIC_REVD, + CARDEX_REVD, + DIAMOND_STEALTH_32 }; +typedef enum { + BUILT_IN = 0, + ATT49X, + STG170X, + ET4K_SDAC +} et4000w32_ramdac_type; + typedef struct et4000w32p_t { mem_mapping_t linear_mapping; mem_mapping_t mmu_mapping; @@ -68,15 +86,21 @@ typedef struct et4000w32p_t { svga_t svga; uint8_t banking, banking2, adjust_cursor, rev, pci_slot; + uint8_t adjust_cursor_x; uint8_t regs[256], pci_regs[256]; int index, vlb, pci, interleaved, - bank, type; + bank; + int vram_size; uint32_t linearbase; uint32_t vram_mask; + int card_type; + et4000w32_chip_type chip_type; + et4000w32_ramdac_type ramdac_type; + /* Accelerator */ struct { struct { @@ -135,6 +159,7 @@ static void et4000w32_blit_start(et4000w32p_t *et4000); static void et4000w32p_blit_start(et4000w32p_t *et4000); static void et4000w32_blit(int count, int cpu_input, uint32_t src_dat, uint32_t mix_dat, et4000w32p_t *et4000); static void et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32p_t *et4000); +void et4000w32p_out(uint16_t addr, uint8_t val, void *priv); uint8_t et4000w32p_in(uint16_t addr, void *priv); #ifdef ENABLE_ET4000W32_LOG @@ -168,18 +193,28 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) switch (addr) { case 0x3c2: - if (et4000->type == ET4000W32P_DIAMOND) - icd2061_write(svga->clock_gen, (val >> 2) & 3); + if (svga->getclock == icd2061_getclock) + icd2061_write(svga->clock_gen, ((val >> 2) & 0x03) | ((svga->crtc[0x34] << 1) & 0x04)| ((svga->crtc[0x31] >> 3) & 0x08)); break; case 0x3c6: case 0x3c7: case 0x3c8: case 0x3c9: - if (et4000->type <= ET4000W32P_REVC) - sdac_ramdac_out(addr, 0, val, svga->ramdac, svga); - else - stg_ramdac_out(addr, val, svga->ramdac, svga); + switch (et4000->ramdac_type) { + case ATT49X: + att49x_ramdac_out(addr, !!(svga->crtc[0x31] & 0x40), val, svga->ramdac, svga); + break; + case STG170X: + stg_ramdac_out(addr, val, svga->ramdac, svga); + break; + case ET4K_SDAC: + sdac_ramdac_out(addr, !!(svga->crtc[0x31] & 0x40), val, svga->ramdac, svga); + break; + default: + svga_out(addr, val, svga); + break; + } return; case 0x3cb: /* Banking extension */ @@ -244,13 +279,13 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) } } if (svga->crtcreg == 0x30) { - if (et4000->pci && (et4000->rev != 5)) + if (et4000->pci && (et4000->rev != ET4000W32P_REVB)) et4000->linearbase = (et4000->linearbase & 0xc0000000) | ((val & 0xfc) << 22); else et4000->linearbase = val << 22; et4000w32p_recalcmapping(et4000); } - if (svga->crtcreg == 0x32 || svga->crtcreg == 0x36) + if ((svga->crtcreg == 0x32) || (svga->crtcreg == 0x36)) et4000w32p_recalcmapping(et4000); break; @@ -264,6 +299,7 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) case 0x217a: et4000->index = val; return; + case 0x210b: case 0x211b: case 0x212b: @@ -278,18 +314,29 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) svga->hwcursor.ena = !!(et4000->regs[0xF7] & 0x80); svga->hwcursor.xoff = et4000->regs[0xE2]; svga->hwcursor.yoff = et4000->regs[0xE6]; - svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = ((et4000->regs[0xEF] & 4) || ((et4000->type == ET4000W32) && (et4000->regs[0xe2] >= 0x1f) && (et4000->regs[0xe6] >= 0x1f))) ? 128 : 64; + svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = ((et4000->regs[0xEF] & 4) || ((et4000->rev == ET4000W32) && (et4000->regs[0xe2] >= 0x1f) && (et4000->regs[0xe6] >= 0x1f))) ? 128 : 64; - if (et4000->type == ET4000W32) { + if (et4000->rev == ET4000W32) { if ((svga->bpp == 15) || (svga->bpp == 16)) { svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = 128; + if (et4000->adjust_cursor_x == 1) + svga->hwcursor.x += 0x100; + else if (et4000->adjust_cursor_x == 2) + svga->hwcursor.x += 8; + } + } else if (et4000->rev == ET4000W32I_REVB) { + if (((svga->bpp == 15) || (svga->bpp == 16))) { + if (et4000->adjust_cursor_x == 1) + svga->hwcursor.x += 0x100; + else if (et4000->adjust_cursor_x == 2) + svga->hwcursor.x += 8; } } - if ((et4000->type == ET4000W32) && (svga->hwcursor.cur_xsize == 128)) { + if ((et4000->rev == ET4000W32) && (svga->hwcursor.cur_xsize == 128)) { switch (svga->bpp) { case 8: - svga->hwcursor.xoff += 32; + svga->hwcursor.xoff += 0x20; break; default: @@ -300,16 +347,14 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) if (svga->hwcursor.cur_xsize == 128) { svga->hwcursor.xoff &= 0x7f; svga->hwcursor.yoff &= 0x7f; - if (et4000->type > ET4000W32P_REVC) { - if (svga->bpp == 24) { + if ((et4000->rev > ET4000W32P_REVC) || (et4000->rev == ET4000W32P_REVB)) { + if (svga->bpp == 24) et4000->adjust_cursor = 2; - } } } else { - if (et4000->type > ET4000W32P_REVC) { - if ((svga->bpp == 24) && et4000->adjust_cursor) { + if ((et4000->rev > ET4000W32P_REVC) || (et4000->rev == ET4000W32P_REVB)) { + if ((svga->bpp == 24) && et4000->adjust_cursor) et4000->adjust_cursor = 0; - } } svga->hwcursor.xoff &= 0x3f; svga->hwcursor.yoff &= 0x3f; @@ -332,6 +377,7 @@ et4000w32p_in(uint16_t addr, void *priv) { et4000w32p_t *et4000 = (et4000w32p_t *) priv; svga_t *svga = &et4000->svga; + uint8_t temp = 0x00; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60; @@ -346,10 +392,17 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x3c7: case 0x3c8: case 0x3c9: - if (et4000->type <= ET4000W32P_REVC) - return sdac_ramdac_in(addr, 0, svga->ramdac, svga); - else - return stg_ramdac_in(addr, svga->ramdac, svga); + switch (et4000->ramdac_type) { + case ATT49X: + return att49x_ramdac_in(addr, !!(svga->crtc[0x31] & 0x40), svga->ramdac, svga); + case STG170X: + return stg_ramdac_in(addr, svga->ramdac, svga); + case ET4K_SDAC: + return sdac_ramdac_in(addr, !!(svga->crtc[0x31] & 0x40), svga->ramdac, svga); + default: + return svga_in(addr, svga); + } + break; case 0x3cb: return et4000->banking2; @@ -358,9 +411,22 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x3d4: return svga->crtcreg; case 0x3d5: - if (et4000->type == ET4000W32) { - if (svga->crtcreg == 0x37) - return 0x09; + if ((et4000->card_type == MACHSPEED_VGA_GUI_2400S) || + (et4000->card_type == AXIS_MICRODEVICE_ET4W32_5)) { + if (svga->crtcreg == 0x37) { + temp = svga->crtc[0x37]; + temp &= ~0x09; + switch (et4000->vram_size) { + case 1: + temp |= 0x09; + break; + case 2: + break; + default: + break; + } + return temp; + } } return svga->crtc[svga->crtcreg]; @@ -368,15 +434,18 @@ et4000w32p_in(uint16_t addr, void *priv) uint8_t ret = 0xff; svga->attrff = 0; - /*Bit 1 of the Input Status Register is required by the OS/2 and NT ET4000W32/I drivers to be set otherwise - the guest will loop infinitely upon reaching the GUI*/ if (svga->cgastat & 0x01) - svga->cgastat &= ~0x32; + svga->cgastat &= ~0x30; else - svga->cgastat ^= 0x32; + svga->cgastat ^= 0x30; ret = svga->cgastat; + /*Bit 1 of the Input Status Register is required by the OS/2 and NT ET4000W32/I drivers to be set otherwise + the guest will loop infinitely upon reaching the GUI*/ + if (svga->hdisp_on) + ret |= 0x02; + if ((svga->fcr & 0x08) && svga->dispon) ret |= 0x08; @@ -396,17 +465,18 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x216a: case 0x217a: return et4000->index; - case 0x210B: - case 0x211B: - case 0x212B: - case 0x213B: - case 0x214B: - case 0x215B: - case 0x216B: - case 0x217B: - if (et4000->index == 0xec) { + + case 0x210b: + case 0x211b: + case 0x212b: + case 0x213b: + case 0x214b: + case 0x215b: + case 0x216b: + case 0x217b: + if (et4000->index == 0xec) return (et4000->regs[0xec] & 0xf) | (et4000->rev << 4); - } + if (et4000->index == 0xee) { if (svga->bpp == 8) { if ((svga->gdcreg[5] & 0x60) >= 0x40) @@ -415,7 +485,7 @@ et4000w32p_in(uint16_t addr, void *priv) return 1; else return 2; - } else if (svga->bpp == 15 || svga->bpp == 16) + } else if ((svga->bpp == 15) || (svga->bpp == 16)) return 4; else break; @@ -439,6 +509,7 @@ void et4000w32p_recalctimings(svga_t *svga) { et4000w32p_t *et4000 = (et4000w32p_t *) svga->priv; + int clk_sel = ((svga->miscout >> 2) & 0x03) | ((svga->crtc[0x34] << 1) & 0x04)| ((svga->crtc[0x31] >> 3) & 0x08); svga->memaddr_latch |= (svga->crtc[0x33] & 0x7) << 16; @@ -463,36 +534,33 @@ et4000w32p_recalctimings(svga_t *svga) svga->dots_per_clock <<= 1; } - svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((svga->miscout >> 2) & 3, svga->clock_gen); + et4000->adjust_cursor = 0; + et4000->adjust_cursor_x = 0; - if (et4000->type != ET4000W32P_DIAMOND && et4000->type != ET4000W32P_VIDEOMAGIC_REVB && et4000->type != ET4000W32P_CARDEX && et4000->type != ET4000W32P) { - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if (svga->gdcreg[5] & 0x40) { - switch (svga->bpp) { - case 8: - svga->clock *= 2; - break; - case 15: - case 16: - svga->clock *= 3; - break; - case 24: - svga->clock *= 4; - break; - - default: - break; - } - } + svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clk_sel, svga->clock_gen); + if (svga->getclock == ics2494_getclock) { + if (et4000->card_type == HERCULES_DYNAMITE_PRO_VLB) { + if (clk_sel < 2) + svga->clock *= 2.0; } } - if (et4000->type == ET4000W32) { - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if (svga->gdcreg[5] & 0x40) { + if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { + if (et4000->card_type != HERCULES_DYNAMITE_PRO_VLB) { + if (!(svga->crtc[0x35] & 0x80)) { + if (clk_sel >= 2) { + if (svga->seqregs[7] & 0x01) + svga->clock *= 4.0; + else if (svga->seqregs[7] & 0x40) + svga->clock *= 2.0; + } + } + } + if (svga->gdcreg[5] & 0x40) { + if (et4000->rev == ET4000W32) { switch (svga->bpp) { case 8: - if (svga->hdisp == 640 || svga->hdisp == 800 || svga->hdisp == 1024) + if ((svga->hdisp == 640) || (svga->hdisp == 800) || (svga->hdisp == 1024)) break; svga->hdisp -= 24; break; @@ -501,39 +569,45 @@ et4000w32p_recalctimings(svga_t *svga) break; } } + switch (svga->bpp) { + case 15: + case 16: + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + if (et4000->rev <= ET4000W32P_REVC) { + if (et4000->rev != ET4000W32P_REVB) { + if (et4000->rev == ET4000W32P_REVC) { + if (svga->hdisp != 1024) + et4000->adjust_cursor = 1; + } else { + et4000->adjust_cursor = 1; + if (et4000->rev <= ET4000W32I_REVB) { + if (svga->hdisp == 800) + et4000->adjust_cursor_x = 1; + else if (svga->hdisp == 640) + et4000->adjust_cursor_x = 2; + } + } + } + } + break; + case 24: + svga->hdisp /= 3; + svga->dots_per_clock /= 3; + if (et4000->rev <= ET4000W32P_REVC) { + if (et4000->rev != ET4000W32P_REVB) + et4000->adjust_cursor = 2; + } + if ((et4000->card_type == DIAMOND_STEALTH_32) && ((svga->hdisp == (640 / 2)) || (svga->hdisp == 1232))) + svga->hdisp = 640; + break; + default: + break; + } + //pclog("ClkSel=%d, crtc34 bits 0-1=%02x, crtc31 bits 6-7=%02x, seq7=%02x, interlace=%02x.\n", clk_sel, svga->crtc[0x34] & 0x03, svga->crtc[0x31] & 0xc0, svga->seqregs[7], svga->crtc[0x35] & 0x80); } - } - - et4000->adjust_cursor = 0; - - switch (svga->bpp) { - case 15: - case 16: - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - } - if (et4000->type <= ET4000W32P_REVC) { - if (et4000->type == ET4000W32P_REVC) { - if (svga->hdisp != 1024) - et4000->adjust_cursor = 1; - } else - et4000->adjust_cursor = 1; - } - break; - case 24: - svga->hdisp /= 3; - svga->dots_per_clock /= 3; - if (et4000->type <= ET4000W32P_REVC) - et4000->adjust_cursor = 2; - if ((et4000->type == ET4000W32P_DIAMOND) && ((svga->hdisp == (640 / 2)) || (svga->hdisp == 1232))) { - svga->hdisp = 640; - } - break; - - default: - break; - } + }//else + // pclog("CLOCK translate=%02x, EGA VGA=%02x, clk=%d.\n", svga->crtc[0x34], svga->seqregs[7] & 0x80, clk_sel); svga->render = svga_render_blank; if (!svga->scrblank && svga->attr_palette_enable) { @@ -558,9 +632,7 @@ et4000w32p_recalctimings(svga_t *svga) break; case 0x40: case 0x60: /* 256+ colours */ - if (et4000->type <= ET4000W32P_REVC) - svga->clock /= 2; - + //pclog("BPP=%d.\n", svga->bpp); switch (svga->bpp) { case 8: svga->map8 = svga->pallook; @@ -638,6 +710,7 @@ et4000w32p_recalcmapping(et4000w32p_t *et4000) map |= 4; if (svga->crtc[0x36] & 0x08) map |= 8; + mem_mapping_disable(&et4000->linear_mapping); switch (map) { case 0x0: @@ -742,13 +815,13 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) et4000->acl.queued.dest_off = (et4000->acl.queued.dest_off & 0x00ff) | (val << 8); break; case 0x8e: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.pixel_depth = val & 0x30; else et4000->acl.queued.vbus = val & 0x03; break; case 0x8f: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.xy_dir = val & 0xb7; else et4000->acl.queued.xy_dir = val & 0x03; @@ -772,7 +845,7 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) et4000->acl.queued.count_y = (et4000->acl.queued.count_y & 0x00ff) | (val << 8); break; case 0x9c: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.ctrl_routing = val & 0xdb; else et4000->acl.queued.ctrl_routing = val & 0xb7; @@ -798,14 +871,14 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) case 0xa3: et4000->acl.queued.dest_addr = (et4000->acl.queued.dest_addr & 0x00ffffff) | (val << 24); et4000->acl.internal = et4000->acl.queued; - if (et4000->type >= ET4000W32P_REVC) { + if (et4000->rev >= ET4000W32P_REVB) { et4000w32p_blit_start(et4000); et4000w32_log("Destination Address write and start XY Block, xcnt = %i, ycnt = %i\n", et4000->acl.x_count + 1, et4000->acl.y_count + 1); if (!(et4000->acl.queued.ctrl_routing & 0x43)) { - et4000w32p_blit(0xffffff, ~0, 0, 0, et4000); + et4000w32p_blit(-1, 0xffffffff, 0, 0, et4000); } if ((et4000->acl.queued.ctrl_routing & 0x40) && !(et4000->acl.internal.ctrl_routing & 3)) { - et4000w32p_blit(4, ~0, 0, 0, et4000); + et4000w32p_blit(4, 0xffffffff, 0, 0, et4000); } } else { et4000w32_blit_start(et4000); @@ -862,7 +935,7 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) static void et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uint8_t bank) { - if (et4000->type >= ET4000W32P_REVC) { + if (et4000->rev >= ET4000W32P_REVB) { if (!(et4000->acl.status & ACL_XYST)) { et4000w32_log("XY MMU block not started\n"); return; @@ -872,7 +945,7 @@ et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uin if ((et4000->acl.internal.ctrl_routing & 3) == 2) /*CPU data is Mix data*/ et4000w32p_blit(8 - (et4000->acl.mix_addr & 7), val >> (et4000->acl.mix_addr & 7), 0, 1, et4000); else if ((et4000->acl.internal.ctrl_routing & 3) == 1) /*CPU data is Source data*/ - et4000w32p_blit(1, ~0, val, 2, et4000); + et4000w32p_blit(1, 0xffffffff, val, 2, et4000); } } else { if (!(et4000->acl.status & ACL_XYST)) { @@ -885,9 +958,8 @@ et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uin if (!(et4000->acl.queued.ctrl_routing & 0x37)) { et4000->acl.mmu_start = 1; et4000w32_blit(-1, 0, 0, 0xffffffff, et4000); - } else { + } else et4000->acl.mmu_start = 0; - } } if (et4000->acl.internal.ctrl_routing & 7) { @@ -932,9 +1004,9 @@ et4000w32p_mmu_write(uint32_t addr, uint8_t val, void *priv) case 0x2000: /* MMU 1 */ case 0x4000: /* MMU 2 */ et4000->bank = (addr >> 13) & 3; - if (et4000->mmu.ctrl & (1 << et4000->bank)) { + if (et4000->mmu.ctrl & (1 << et4000->bank)) et4000w32p_accel_write_mmu(et4000, addr & 0x7fff, val, et4000->bank); - } else { + else { if (((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) < svga->vram_max) { svga->vram[((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) & et4000->vram_mask] = val; svga->changedvram[(((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) & et4000->vram_mask) >> 12] = changeframecount; @@ -942,9 +1014,9 @@ et4000w32p_mmu_write(uint32_t addr, uint8_t val, void *priv) } break; case 0x6000: - if ((addr & 0xff) >= 0x80) { + if ((addr & 0xff) >= 0x80) et4000w32p_accel_write_fifo(et4000, addr & 0x7fff, val); - } else { + else { switch (addr & 0xff) { case 0x00: et4000->mmu.base[0] = (et4000->mmu.base[0] & 0xffffff00) | val; @@ -1069,6 +1141,7 @@ et4000w32p_mmu_read(uint32_t addr, void *priv) et4000->acl.fifo_queue = 0; } else et4000->acl.status &= ~ACL_RDST; + return et4000->acl.status; case 0x80: @@ -1100,8 +1173,9 @@ et4000w32p_mmu_read(uint32_t addr, void *priv) case 0x8d: return et4000->acl.internal.dest_off >> 8; case 0x8e: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) return et4000->acl.internal.pixel_depth; + return et4000->acl.internal.vbus; case 0x8f: return et4000->acl.internal.xy_dir; @@ -1172,9 +1246,9 @@ et4000w32_blit_start(et4000w32p_t *et4000) et4000->acl.pattern_back = et4000->acl.pattern_addr; if (!(et4000->acl.internal.pattern_wrap & 0x40)) { - if ((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) == 0x00) { /*This is to avoid a division by zero crash*/ + if ((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) == 0x00) /*This is to avoid a division by zero crash*/ et4000->acl.pattern_y = (et4000->acl.pattern_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); - } else + else et4000->acl.pattern_y = (et4000->acl.pattern_addr / (et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); et4000->acl.pattern_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7]) - 1); } @@ -1187,9 +1261,9 @@ et4000w32_blit_start(et4000w32p_t *et4000) et4000->acl.source_back = et4000->acl.source_addr; if (!(et4000->acl.internal.source_wrap & 0x40)) { - if ((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) == 0x00) { /*This is to avoid a division by zero crash*/ + if ((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) == 0x00) /*This is to avoid a division by zero crash*/ et4000->acl.source_y = (et4000->acl.source_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); - } else + else et4000->acl.source_y = (et4000->acl.source_addr / (et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); et4000->acl.source_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7]) - 1); } @@ -1265,6 +1339,7 @@ et4000w32p_blit_start(et4000w32p_t *et4000) et4000w32_max_x[2] = (et4000->acl.internal.pixel_depth == 0x20) ? 3 : 4; et4000->acl.internal.count_x += (et4000->acl.internal.pixel_depth >> 4) & 3; + et4000->acl.x_count = et4000->acl.internal.count_x; et4000->acl.cpu_dat_pos = 0; et4000->acl.cpu_dat = 0; @@ -2278,9 +2353,8 @@ et4000w32_blit(int count, int cpu_input, uint32_t src_dat, uint32_t mix_dat, et4 return; } - if (cpu_input) { + if (cpu_input) return; - } } } } @@ -2293,7 +2367,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 uint8_t pattern; uint8_t source; uint8_t dest; - uint8_t out; + uint8_t out = 0; uint8_t rop; int mixdat; @@ -2307,14 +2381,15 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 while (count--) { et4000w32_log("%i,%i : ", et4000->acl.internal.pos_x, et4000->acl.internal.pos_y); pattern = svga->vram[(et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask]; - source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; + et4000w32_log("%06X %06X ", (et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask, (et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask); if (cpu_input == 2) { source = sdat & 0xff; sdat >>= 8; - } + } else + source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; + dest = svga->vram[et4000->acl.dest_addr & et4000->vram_mask]; - out = 0; et4000w32_log("%06X ", et4000->acl.dest_addr); if ((et4000->acl.internal.ctrl_routing & 0xa) == 8) { mixdat = svga->vram[(et4000->acl.mix_addr >> 3) & et4000->vram_mask] & (1 << (et4000->acl.mix_addr & 7)); @@ -2416,7 +2491,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 } } else { et4000w32_log("BitBLT: count = %i\n", count); - while (count-- && et4000->acl.y_count >= 0) { + while (count-- && (et4000->acl.y_count >= 0)) { pattern = svga->vram[(et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask]; if (cpu_input == 2) { @@ -2426,8 +2501,6 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; dest = svga->vram[et4000->acl.dest_addr & et4000->vram_mask]; - out = 0; - if ((et4000->acl.internal.ctrl_routing & 0xa) == 8) { mixdat = svga->vram[(et4000->acl.mix_addr >> 3) & et4000->vram_mask] & (1 << (et4000->acl.mix_addr & 7)); } else { @@ -2455,6 +2528,8 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 et4000->acl.x_count--; if (et4000->acl.x_count == 0xffff) { + et4000->acl.x_count = et4000->acl.internal.count_x; + if (et4000->acl.internal.xy_dir & 2) { et4000w32_decy(et4000); et4000->acl.mix_back = et4000->acl.mix_addr = et4000->acl.mix_back - (et4000->acl.internal.mix_off + 1); @@ -2469,7 +2544,6 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 et4000->acl.source_x = et4000->acl.source_x_back; et4000->acl.y_count--; - et4000->acl.x_count = et4000->acl.internal.count_x; if (et4000->acl.y_count == 0xffff) { et4000w32_log("BitBLT end\n"); et4000->acl.status &= ~(ACL_XYST | ACL_SSO); @@ -2481,7 +2555,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 if (et4000->acl.internal.ctrl_routing & 0x40) { if (et4000->acl.cpu_dat_pos & 3) - et4000->acl.cpu_dat_pos += 4 - (et4000->acl.cpu_dat_pos & 3); + et4000->acl.cpu_dat_pos += (4 - (et4000->acl.cpu_dat_pos & 3)); return; } } @@ -2505,7 +2579,7 @@ et4000w32p_hwcursor_draw(svga_t *svga, int displine) offset = svga->hwcursor_latch.xoff; - if ((et4000->type == ET4000W32) && (pitch == 32)) { + if ((et4000->rev == ET4000W32) && (pitch == 32)) { switch (svga->bpp) { case 8: minus_width = 0; @@ -2681,6 +2755,7 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) et4000w32p_io_set(et4000); else et4000w32p_io_remove(et4000); + et4000w32p_recalcmapping(et4000); break; @@ -2697,9 +2772,9 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) case 0x33: et4000->pci_regs[addr] = val; if (et4000->pci_regs[0x30] & 0x01) { - uint32_t addr = (et4000->pci_regs[0x32] << 16) | (et4000->pci_regs[0x33] << 24); - et4000w32_log("ET4000 bios_rom enabled at %08x\n", addr); - mem_mapping_set_addr(&et4000->bios_rom.mapping, addr, 0x8000); + uint32_t biosaddr = (et4000->pci_regs[0x32] << 16) | (et4000->pci_regs[0x33] << 24); + et4000w32_log("ET4000 bios_rom enabled at %08x\n", biosaddr); + mem_mapping_set_addr(&et4000->bios_rom.mapping, biosaddr, 0x8000); } else { et4000w32_log("ET4000 bios_rom disabled\n"); mem_mapping_disable(&et4000->bios_rom.mapping); @@ -2714,21 +2789,13 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) void * et4000w32p_init(const device_t *info) { - int vram_size; et4000w32p_t *et4000 = malloc(sizeof(et4000w32p_t)); memset(et4000, 0, sizeof(et4000w32p_t)); et4000->pci = (info->flags & DEVICE_PCI) ? 0x80 : 0x00; et4000->vlb = (info->flags & DEVICE_VLB) ? 0x40 : 0x00; - /*The ET4000/W32i ISA BIOS seems to not support 2MB of VRAM*/ - if ((info->local == ET4000W32) || ((info->local == ET4000W32I) && !(et4000->vlb))) - vram_size = 1; - else - vram_size = device_get_config_int("memory"); - - /*The interleaved VRAM was introduced by the ET4000/W32i*/ - et4000->interleaved = ((vram_size == 2) && (info->local != ET4000W32)) ? 1 : 0; + et4000->vram_size = device_get_config_int("memory"); if (info->flags & DEVICE_PCI) video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000w32_pci); @@ -2737,112 +2804,141 @@ et4000w32p_init(const device_t *info) else video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000w32_isa); - svga_init(info, &et4000->svga, et4000, vram_size << 20, + svga_init(info, &et4000->svga, et4000, et4000->vram_size << 20, et4000w32p_recalctimings, et4000w32p_in, et4000w32p_out, et4000w32p_hwcursor_draw, NULL); - et4000->vram_mask = (vram_size << 20) - 1; - et4000->svga.decode_mask = (vram_size << 20) - 1; + et4000->vram_mask = (et4000->vram_size << 20) - 1; + et4000->svga.decode_mask = (et4000->vram_size << 20) - 1; - et4000->type = info->local; + et4000->card_type = info->local & 0xff; + et4000->ramdac_type = BUILT_IN; + et4000->svga.crtc[0x31] = 0x40; + et4000->svga.miscout = 0x01; + et4000->svga.bpp = 8; - switch (et4000->type) { - case ET4000W32: + switch (et4000->card_type) { + case MACHSPEED_VGA_GUI_2400S: /* ET4000/W32 */ - et4000->rev = 0; + et4000->rev = ET4000W32; + et4000->ramdac_type = ET4K_SDAC; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5301_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32I: + case AXIS_MICRODEVICE_ET4W32_5: /* ET4000/W32i rev B */ - et4000->rev = 3; + et4000->rev = ET4000W32I_REVB; + et4000->ramdac_type = ET4K_SDAC; - if (et4000->vlb) { - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_VLB, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - } else { - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_ISA, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - } + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5301_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32P_VIDEOMAGIC_REVB: - /* ET4000/W32p rev B */ - et4000->rev = 5; + case HERCULES_DYNAMITE_PRO_VLB: + /* ET4000/W32i rev B */ + et4000->rev = ET4000W32I_REVB; + et4000->ramdac_type = ATT49X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&att490_ramdac_device); + et4000->svga.clock_gen = device_add(&ics2494an_324_device); + et4000->svga.getclock = ics2494_getclock; + break; + + case VIDEOMAGIC_ETW32PVS: + /* ET4000/W32p rev B */ + et4000->rev = ET4000W32P_REVB; + et4000->ramdac_type = STG170X; + + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); + + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = stg_getclock; break; - case ET4000W32P_REVC: + case CARDEX_REVC: /* ET4000/W32p rev C */ - et4000->rev = 7; + et4000->rev = ET4000W32P_REVC; + et4000->ramdac_type = ET4K_SDAC; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVC, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVC_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5341_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32P: + case CARDEX_REVD: /* ET4000/W32p rev D */ - et4000->rev = 6; + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = stg_getclock; break; - case ET4000W32P_CARDEX: + case DIAMOND_STEALTH_32: /* ET4000/W32p rev D */ - et4000->rev = 6; + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD_DIAMOND, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); - et4000->svga.clock_gen = et4000->svga.ramdac; - et4000->svga.getclock = stg_getclock; - break; - - case ET4000W32P_DIAMOND: - /* ET4000/W32p rev D */ - et4000->rev = 6; - - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_DIAMOND, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&stg1702_ramdac_device); et4000->svga.clock_gen = device_add(&icd2061_device); et4000->svga.getclock = icd2061_getclock; icd2061_set_ref_clock(et4000->svga.ramdac, 14318184.0f); svga_recalctimings(&et4000->svga); break; + case GENERIC_REVD: + /* ET4000/W32p rev D */ + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; + + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); + + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); + et4000->svga.clock_gen = et4000->svga.ramdac; + et4000->svga.getclock = stg_getclock; + break; + default: break; } + + /*The interleaved VRAM was introduced by the ET4000/W32i*/ + et4000->interleaved = ((et4000->vram_size == 2) && (et4000->rev != ET4000W32)) ? 1 : 0; + if (info->flags & DEVICE_PCI) mem_mapping_disable(&et4000->bios_rom.mapping); @@ -2875,51 +2971,51 @@ et4000w32p_init(const device_t *info) } int -et4000w32_available(void) +et4000w32_machspeed_vga_gui_2400s_available(void) { - return rom_present(BIOS_ROM_PATH_W32); + return rom_present(BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S); } int -et4000w32i_isa_available(void) +et4000w32i_axis_microdevice_available(void) { - return rom_present(BIOS_ROM_PATH_W32I_ISA); + return rom_present(BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE); } int -et4000w32i_vlb_available(void) +et4000w32i_hercules_dynamite_pro_vlb_available(void) { - return rom_present(BIOS_ROM_PATH_W32I_VLB); + return rom_present(BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO); } int -et4000w32p_videomagic_revb_vlb_available(void) +et4000w32p_videomagic_revb_available(void) { - return rom_present(BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB); + return rom_present(BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC); } int -et4000w32p_revc_available(void) +et4000w32p_cardex_revc_available(void) { - return rom_present(BIOS_ROM_PATH_W32P_REVC); + return rom_present(BIOS_ROM_PATH_W32P_REVC_CARDEX); } int -et4000w32p_noncardex_available(void) +et4000w32p_diamond_revd_available(void) { - return rom_present(BIOS_ROM_PATH_W32P); + return rom_present(BIOS_ROM_PATH_W32P_REVD_DIAMOND); } int -et4000w32p_available(void) +et4000w32p_cardex_revd_available(void) { - return rom_present(BIOS_ROM_PATH_DIAMOND); + return rom_present(BIOS_ROM_PATH_W32P_REVD_CARDEX); } int -et4000w32p_cardex_available(void) +et4000w32p_generic_revd_available(void) { - return rom_present(BIOS_ROM_PATH_CARDEX); + return rom_present(BIOS_ROM_PATH_W32P_REVD); } void @@ -2969,197 +3065,197 @@ static const device_config_t et4000w32p_config[] = { // clang-format on }; -const device_t et4000w32_device = { - .name = "Tseng Labs ET4000/w32 ISA", +const device_t et4000w32_machspeed_vga_gui_2400s_isa_device = { + .name = "Tseng Labs ET4000/w32 ISA (MachSpeed VGA GUI 2400S)", .internal_name = "et4000w32", .flags = DEVICE_ISA16, - .local = ET4000W32, + .local = MACHSPEED_VGA_GUI_2400S, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32_available, + .available = et4000w32_machspeed_vga_gui_2400s_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config +}; + +const device_t et4000w32_machspeed_vga_gui_2400s_vlb_device = { + .name = "Tseng Labs ET4000/w32 VLB (MachSpeed VGA GUI 2400S)", + .internal_name = "et4000w32_vlb", + .flags = DEVICE_VLB, + .local = MACHSPEED_VGA_GUI_2400S, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32_machspeed_vga_gui_2400s_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config }; const device_t et4000w32_onboard_device = { - .name = "Tseng Labs ET4000/w32 (ISA) (On-Board)", + .name = "Tseng Labs ET4000/w32 ISA (On-Board)", .internal_name = "et4000w32_onboard", .flags = DEVICE_ISA16, - .local = ET4000W32, + .local = MACHSPEED_VGA_GUI_2400S | 0x100, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32_available, + .available = et4000w32_machspeed_vga_gui_2400s_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config }; -const device_t et4000w32i_isa_device = { - .name = "Tseng Labs ET4000/w32i Rev. B ISA", +const device_t et4000w32i_axis_microdevice_isa_device = { + .name = "Tseng Labs ET4000/w32i Rev. B ISA (Axis MicroDevice)", .internal_name = "et4000w32i", .flags = DEVICE_ISA16, - .local = ET4000W32I, + .local = AXIS_MICRODEVICE_ET4W32_5, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32i_isa_available, + .available = et4000w32i_axis_microdevice_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config }; -const device_t et4000w32i_vlb_device = { - .name = "Tseng Labs ET4000/w32i Rev. B VLB", +const device_t et4000w32i_hercules_dynamite_pro_vlb_device = { + .name = "Tseng Labs ET4000/w32i Rev. B VLB (Hercules Dynamite Pro)", .internal_name = "et4000w32i_vlb", .flags = DEVICE_VLB, - .local = ET4000W32I, + .local = HERCULES_DYNAMITE_PRO_VLB, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32i_vlb_available, + .available = et4000w32i_hercules_dynamite_pro_vlb_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; const device_t et4000w32p_videomagic_revb_vlb_device = { - .name = "Tseng Labs ET4000/w32p Rev. B VLB (VideoMagic)", + .name = "Tseng Labs ET4000/w32p Rev. B VLB (VideoMagic ETW32PVS)", .internal_name = "et4000w32p_videomagic_revb_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_VIDEOMAGIC_REVB, + .local = VIDEOMAGIC_ETW32PVS, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_videomagic_revb_vlb_available, + .available = et4000w32p_videomagic_revb_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_videomagic_revb_pci_device = { - .name = "Tseng Labs ET4000/w32p Rev. B PCI (VideoMagic)", - .internal_name = "et4000w32p_videomagic_revb_pci", - .flags = DEVICE_PCI, - .local = ET4000W32P_VIDEOMAGIC_REVB, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_videomagic_revb_vlb_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_revc_vlb_device = { +const device_t et4000w32p_cardex_revc_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. C VLB (Cardex)", .internal_name = "et4000w32p_revc_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_REVC, + .local = CARDEX_REVC, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_revc_available, + .available = et4000w32p_cardex_revc_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_revc_pci_device = { +const device_t et4000w32p_cardex_revc_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. C PCI (Cardex)", - .internal_name = "et4000w32p_revc_pci", + .internal_name = "et4000w32p_revc_vlb", .flags = DEVICE_PCI, - .local = ET4000W32P_REVC, + .local = CARDEX_REVC, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_revc_available, + .available = et4000w32p_cardex_revc_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_noncardex_vlb_device = { - .name = "Tseng Labs ET4000/w32p Rev. D VLB", - .internal_name = "et4000w32p_nc_vlb", - .flags = DEVICE_VLB, - .local = ET4000W32P, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_noncardex_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_noncardex_pci_device = { - .name = "Tseng Labs ET4000/w32p Rev. D PCI", - .internal_name = "et4000w32p_nc_pci", - .flags = DEVICE_PCI, - .local = ET4000W32P, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_noncardex_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_cardex_vlb_device = { +const device_t et4000w32p_cardex_revd_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. D VLB (Cardex)", .internal_name = "et4000w32p_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_CARDEX, + .local = CARDEX_REVD, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_cardex_available, + .available = et4000w32p_cardex_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_cardex_pci_device = { +const device_t et4000w32p_cardex_revd_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. D PCI (Cardex)", .internal_name = "et4000w32p_pci", .flags = DEVICE_PCI, - .local = ET4000W32P_CARDEX, + .local = CARDEX_REVD, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_cardex_available, + .available = et4000w32p_cardex_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_vlb_device = { +const device_t et4000w32p_diamond_revd_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. D VLB (Diamond Stealth32)", .internal_name = "stealth32_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_DIAMOND, + .local = DIAMOND_STEALTH_32, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_available, + .available = et4000w32p_diamond_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_pci_device = { +const device_t et4000w32p_diamond_revd_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. D PCI (Diamond Stealth32)", .internal_name = "stealth32_pci", .flags = DEVICE_PCI, - .local = ET4000W32P_DIAMOND, + .local = DIAMOND_STEALTH_32, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_available, + .available = et4000w32p_diamond_revd_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config +}; + +const device_t et4000w32p_generic_revd_vlb_device = { + .name = "Tseng Labs ET4000/w32p Rev. D VLB", + .internal_name = "et4000w32p_nc_vlb", + .flags = DEVICE_VLB, + .local = GENERIC_REVD, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32p_generic_revd_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config +}; + +const device_t et4000w32p_generic_revd_pci_device = { + .name = "Tseng Labs ET4000/w32p Rev. D PCI", + .internal_name = "et4000w32p_nc_pci", + .flags = DEVICE_PCI, + .local = GENERIC_REVD, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32p_generic_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 2333d68b7..74b57370e 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -60,7 +60,7 @@ #define ROM_MIROCRYSTAL20SV_964_PCI "roms/video/s3/mirocrystal.VBI" #define ROM_MIROCRYSTAL20SD_864_VLB "roms/video/s3/Miro20SD.BIN" #define ROM_PHOENIX_86C80X "roms/video/s3/805.VBI" -#define ROM_WINNER1000_805 "roms/video/s3/v01_05_00-C.BIN" +#define ROM_WINNER1000_805 "roms/video/s3/W1000ISA 01.03.00-B.BIN" #define ROM_PARADISE_BAHAMAS64 "roms/video/s3/bahamas64.bin" #define ROM_PHOENIX_VISION864 "roms/video/s3/86c864p.bin" #define ROM_DIAMOND_STEALTH64_964 "roms/video/s3/964_107h.rom" @@ -138,6 +138,7 @@ enum { S3_86C928PCI = 0x06, S3_86C801 = 0x07, S3_86C805 = 0x08, + S3_86C805I = 0x09, S3_VISION964 = 0x18, S3_VISION968 = 0x20, S3_VISION864 = 0x28, @@ -291,6 +292,7 @@ typedef struct s3_t { int16_t px, py; int16_t sx, sy; int16_t dx, dy; + int16_t sx_inc; uint32_t src, dest, pattern; int poly_cx, poly_cx2; @@ -314,7 +316,7 @@ typedef struct s3_t { int color_16bit_check; int color_16bit_check_pixtrans; int16_t minus; - int16_t minus_src_24bpp; + int16_t blit_24bpp; int rd_mask_16bit_check; int start; int mix_dat_upper; @@ -528,8 +530,9 @@ s3_queue(s3_t *s3, uint32_t addr, uint32_t val, uint32_t type) if (FIFO_FULL) { thread_reset_event(s3->fifo_not_full_event); - if (FIFO_FULL) + if (FIFO_FULL) { thread_wait_event(s3->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } } fifo->val = val; @@ -656,7 +659,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) s3->accel_start(8, 1, val | (val << 16), 0, s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) val = (val >> 8) | (val << 8); @@ -671,7 +674,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) s3->accel_start(1, 1, 0xffffffff, val | (val << 16), s3); } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) val = (val >> 8) | (val << 8); @@ -723,6 +726,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) case 0x400: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + s3_log("WORD WritePIXTRANS 32=%04x, SX=%d, SY=%d.\n", val, s3->accel.sx, s3->accel.sy); if (s3->accel.cmd & 0x1000) val = (val >> 8) | (val << 8); @@ -794,8 +798,10 @@ s3_accel_out_pixtrans_l(s3_t *s3, uint32_t val) case 0x400: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + s3_log("LONG WritePIXTRANS 32=%08x.\n", val); if (s3->accel.cmd & 0x1000) val = ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24); + s3->accel_start(32, 1, val, 0, s3); } else s3->accel_start(4, 1, 0xffffffff, val, s3); @@ -832,14 +838,15 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) switch (port) { case 0x8148: case 0x82e8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_y = (s3->accel.cur_y & 0xf00) | val; s3->accel.poly_cy = s3->accel.cur_y; break; case 0x8149: case 0x82e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_y = (s3->accel.cur_y & 0xff) | ((val & 0x0f) << 8); s3->accel.poly_cy = s3->accel.cur_y; - s3_log("[%04X:%08X] OUT PORTB=%04x, valy=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_y); break; case 0x814a: case 0x82ea: @@ -854,18 +861,19 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0x8548: case 0x86e8: - s3->accel.cur_x = (s3->accel.cur_x & 0xf00) | val; + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); + s3->accel.cur_x = (s3->accel.cur_x & 0xf00) | val; s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff00) | val; - s3->accel.poly_cx = s3->accel.cur_x << 20; - s3->accel.poly_x = s3->accel.poly_cx >> 20; + s3->accel.poly_cx = s3->accel.cur_x << 20; + s3->accel.poly_x = s3->accel.poly_cx >> 20; break; case 0x8549: case 0x86e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_x = (s3->accel.cur_x & 0xff) | ((val & 0x0f) << 8); s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff) | (val << 8); s3->accel.poly_cx = s3->accel.poly_x = s3->accel.cur_x << 20; - s3->accel.poly_x = s3->accel.poly_cx >> 20; - s3_log("[%04X:%08X] OUT PORTB=%04x, valx=%d, valxover=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_x, s3->accel.cur_x_overflow); + s3->accel.poly_x = s3->accel.poly_cx >> 20; break; case 0x854a: case 0x86ea: @@ -881,15 +889,18 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xcae8: case 0x8948: case 0x8ae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.desty_axstp = (s3->accel.desty_axstp & 0x3f00) | val; s3->accel.point_1_updated = 1; break; case 0xcae9: case 0x8949: case 0x8ae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.desty_axstp = (s3->accel.desty_axstp & 0xff) | ((val & 0x3f) << 8); if (val & 0x20) s3->accel.desty_axstp |= ~0x3fff; + s3->accel.point_1_updated = 1; break; case 0x894a: @@ -902,21 +913,25 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.desty_axstp2 = (s3->accel.desty_axstp2 & 0xff) | ((val & 0x3f) << 8); if (val & 0x20) s3->accel.desty_axstp2 |= ~0x3fff; + s3->accel.point_2_updated = 1; break; case 0x8d48: case 0x8ee8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.destx_distp = (s3->accel.destx_distp & 0x3f00) | val; s3->accel.destx_overflow = (s3->accel.destx_overflow & 0xff00) | val; s3->accel.point_1_updated = 1; break; case 0x8d49: case 0x8ee9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.destx_distp = (s3->accel.destx_distp & 0xff) | ((val & 0x3f) << 8); s3->accel.destx_overflow = (s3->accel.destx_overflow & 0xff) | (val << 8); if (val & 0x20) s3->accel.destx_distp |= ~0x3fff; + s3->accel.point_1_updated = 1; break; case 0x8d4a: @@ -980,6 +995,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.cmd = (s3->accel.cmd & 0xff) | (val << 8); s3->accel.ssv_state = 0; if (s3->bpp == 3) { + s3_log("Command Misc1=%04x.\n", s3->accel.multifunc[0xe]); if (!(s3->accel.multifunc[0xe] & 0x200)) s3->accel.multifunc[0xe] &= ~0x10; } @@ -1235,6 +1251,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa94a: case 0xaaea: + s3_log("[%04X:%08X] OUT PORTB=%04x (Write Mask), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->chip >= S3_VISION964) { if (s3->accel.multifunc[0xe] & 0x200) s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); @@ -1515,14 +1532,26 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xb548: case 0xb6e8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); s3->accel.bkgd_mix = val; break; + case 0xb549: + case 0xb6e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); + break; + case 0xb948: case 0xbae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); s3->accel.frgd_mix = val; break; + case 0xb949: + case 0xbae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); + break; + case 0xbd48: case 0xbee8: s3->accel.multifunc_cntl = (s3->accel.multifunc_cntl & 0xff00) | val; @@ -1598,18 +1627,22 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xe948: case 0xeae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_y = (s3->accel.pat_y & 0xf00) | val; break; case 0xe949: case 0xeae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_y = (s3->accel.pat_y & 0xff) | ((val & 0x0f) << 8); break; case 0xe94a: case 0xeaea: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_x = (s3->accel.pat_x & 0xf00) | val; break; case 0xe94b: case 0xeaeb: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_x = (s3->accel.pat_x & 0xff) | ((val & 0x0f) << 8); break; case 0xed48: @@ -1681,7 +1714,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) else s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { s3->accel.pix_trans[1] = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus)) & s3->vram_mask]; if (s3->accel.cmd & 0x1000) { @@ -2177,7 +2210,9 @@ s3_accel_write_fifo_w(s3_t *s3, uint32_t addr, uint16_t val) s3_accel_out_fifo_w(s3, 0x9ee8, val); } else if (((addr & 0x1fffe) >= 0x8000) && (addr & 0x1fffe) < 0x10000) { if (((addr & 0x1fffe) == 0xe2e8) || ((addr & 0x1fffe) == 0xe2ea)) { - if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || (s3->chip == S3_86C928) || (s3->chip == S3_86C928PCI)) + if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || + (s3->chip == S3_86C928) || + (s3->chip == S3_86C928PCI)) s3_accel_out_pixtrans_w(s3, val); else { s3_accel_write_fifo(s3, addr, val); @@ -2306,9 +2341,10 @@ s3_hwcursor_draw(svga_t *svga, int displine) case 15: fg = video_15to32[s3->hwc_fg_col & 0xffff]; bg = video_15to32[s3->hwc_bg_col & 0xffff]; - if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805)) { + if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805I)) { if (!s3->color_16bit) { - if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { + if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805) && + (s3->card_type != S3_WINNER1000_805)) { if (!(svga->crtc[0x45] & 0x04)) { shift = 2; width = 8; @@ -2331,9 +2367,10 @@ s3_hwcursor_draw(svga_t *svga, int displine) case 16: fg = video_16to32[s3->hwc_fg_col & 0xffff]; bg = video_16to32[s3->hwc_bg_col & 0xffff]; - if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805)) { + if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805I)) { if (!s3->color_16bit) { - if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { + if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805) && + (s3->card_type != S3_WINNER1000_805)) { if (!(svga->crtc[0x45] & 0x04)) { shift = 2; width = 8; @@ -2357,7 +2394,7 @@ s3_hwcursor_draw(svga_t *svga, int displine) break; case 24: - if (s3->chip <= S3_86C805) { + if (s3->chip <= S3_86C805I) { fg = svga->pallook[svga->crtc[0xe]]; bg = svga->pallook[svga->crtc[0xf]]; } else { @@ -3131,7 +3168,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x50: s3->bpp = (svga->crtc[0x50] >> 4) & 3; - s3_log("S3 BPP=%d.\n", s3->bpp); + s3_log("S3 BPP=%d, VGA=%d, Misc1=%04x.\n", s3->bpp, svga->bpp, s3->accel.multifunc[0xe]); if (s3->bpp == 3) { if (!(s3->accel.multifunc[0xe] & 0x200)) /*On True Color mode change, reset bit 4 of Misc Index register*/ s3->accel.multifunc[0xe] &= ~0x10; @@ -3166,7 +3203,8 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x51: - if (s3->chip == S3_86C801 || s3->chip == S3_86C805) { + if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || + (s3->chip == S3_86C805I)) { s3->bank = (s3->bank & 0x6f) | ((val & 0x4) << 2); s3->ma_ext = (s3->ma_ext & ~0x4) | ((val & 1) << 2); } else { @@ -3190,10 +3228,10 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x45: + s3_log("Write CRTC45=%02x.\n", val); if ((s3->chip == S3_VISION964) || (s3->chip == S3_VISION968)) break; svga->hwcursor.ena = val & 1; - s3_log("Write CRTC45=%02x.\n", val); break; case 0x46: case 0x47: @@ -3295,7 +3333,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x43: if (s3->chip < S3_VISION964) { - if (s3->chip <= S3_86C805) + if (s3->chip <= S3_86C805I) svga_recalctimings(svga); s3_io_remove_alt(s3); @@ -3423,8 +3461,8 @@ s3_in(uint16_t addr, void *priv) temp = att498_ramdac_in(addr, rs2, svga->ramdac, svga); break; case BT48X: - if (s3->chip == S3_86C928) - rs3 = !!(svga->crtc[0x55] & 0x28) || !!(svga->crtc[0x45] & 0x20) || !!(svga->crtc[0x55] & 0x02); /*Quite insane but Win95's S3 driver wants it set at all costs for 8bpp+ mode*/ + if (s3->card_type == S3_METHEUS_86C928) + rs3 = !!(svga->crtc[0x55] & 0x28) || !!(svga->crtc[0x45] & 0x20) || !!(svga->crtc[0x55] & 0x02); /*Quite insane but Win95's S3 driver wants it set at all costs for 8bpp+ mode in the Metheus card*/ else rs3 = !!(svga->crtc[0x55] & 0x02); @@ -3658,9 +3696,10 @@ s3_readl(uint32_t addr, void *priv) static void s3_recalctimings(svga_t *svga) { - s3_t *s3 = (s3_t *) svga->priv; - int clk_sel = (svga->miscout >> 2) & 3; + s3_t *s3 = (s3_t *) svga->priv; + int clk_sel = (svga->miscout >> 2) & 3; uint8_t mask = 0xc0; + int enhanced_8bpp_modes = 0x00; if (svga->crtc[0x33] & 0x20) { /* In this mode, the dots per clock are always 8 or 16, never 9 or 18. */ @@ -3719,6 +3758,7 @@ s3_recalctimings(svga_t *svga) if ((((svga->miscout >> 2) & 3) == 3) && (s3->chip < S3_TRIO32)) clk_sel = svga->crtc[0x42] & 0x0f; + s3_log("MiscOut=%02x, cr42=%02x.\n", (svga->miscout >> 2) & 3, svga->crtc[0x42] & 0x0f); svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clk_sel, svga->clock_gen); switch (s3->ramdac_type) { @@ -3737,12 +3777,12 @@ s3_recalctimings(svga_t *svga) break; } - if (s3->chip >= S3_TRIO32) { + if ((s3->chip >= S3_TRIO32) || (s3->chip == S3_86C805I)) { switch (svga->crtc[0x67] >> 4) { case 3: case 5: case 7: - svga->clock /= 2; + svga->clock /= 2.0; break; default: @@ -3750,7 +3790,38 @@ s3_recalctimings(svga_t *svga) } } - if (s3->chip <= S3_86C805) { + enhanced_8bpp_modes = !!((svga->crtc[0x3a] & 0x10) && !svga->lowres); + + if (s3->chip >= S3_86C928) { + if (s3->chip != S3_86C801) + mask |= 0x01; + + switch (svga->crtc[0x50] & mask) { + case 0x00: + s3->width = (svga->crtc[0x31] & 0x02) ? 2048 : 1024; + break; + case 0x01: + s3->width = 1152; + break; + case 0x40: + s3->width = 640; + break; + case 0x80: + /*For later chips, bit 2 of port 0x4ae8 means 1600x1200x4bpp if the original width is 800 (per Vision864 manual).*/ + s3->width = ((s3->chip > S3_86C805I) && (s3->accel.advfunc_cntl & 0x04) && !enhanced_8bpp_modes) ? 1600 : 800; + break; + case 0x81: + s3->width = 1600; + break; + case 0xc0: + s3->width = 1280; + break; + default: + break; + } + } + + if (s3->chip <= S3_86C805I) { s3->color_16bit = !!(svga->crtc[0x43] & 0x08); s3_log("Color 16bit=%x, bpp=%d, 256color=%x.\n", s3->color_16bit, svga->bpp, (svga->attrregs[0x10] & 0x40)); if ((svga->bpp == 24) || (svga->bpp == 8)) @@ -3764,36 +3835,6 @@ s3_recalctimings(svga_t *svga) } } - if (s3->chip >= S3_86C928) { - if (s3->chip != S3_86C801) - mask |= 0x01; - - switch (svga->crtc[0x50] & mask) { - case 0x00: - s3->width = (svga->crtc[0x31] & 0x02) ? 2048 : 1024; - if (s3->color_16bit) - s3->width = 1024; - break; - case 0x01: - s3->width = 1152; - break; - case 0x40: - s3->width = 640; - break; - case 0x80: - s3->width = ((s3->chip > S3_86C805) && (s3->accel.advfunc_cntl & 0x04)) ? 1600 : 800; - break; - case 0x81: - s3->width = 1600; - break; - case 0xc0: - s3->width = 1280; - break; - default: - break; - } - } - if (svga->crtc[0x33] & 0x20) { /* The S3 version of the Cirrus' special blanking mode, with identical behavior. */ svga->hblankstart = (((svga->crtc[0x5d] & 0x02) >> 1) << 8) + svga->crtc[1]/* + @@ -3822,11 +3863,11 @@ s3_recalctimings(svga_t *svga) } } - if ((svga->crtc[0x3a] & 0x10) && !svga->lowres) { + if (enhanced_8bpp_modes) { s3_log("BPP=%d, pitch=%d, width=%02x, double?=%x, 16bit?=%d, highres?=%d, " - "attr=%02x, hdisp=%d, dotsperclock=%x, clksel=%x, clockmultiplier=%d, multiplexingrate=%d.\n", svga->bpp, s3->width, svga->crtc[0x50], + "attr=%02x, hdisp=%d, dotsperclock=%x, clksel=%x, clockmultiplier=%d, multiplexingrate=%d, xadd=%d, overscanx=%d.\n", svga->bpp, s3->width, svga->crtc[0x50], svga->crtc[0x31] & 0x02, s3->color_16bit, s3->accel.advfunc_cntl & 0x04, - svga->attrregs[0x10] & 0x40, svga->hdisp, svga->dots_per_clock, clk_sel, svga->clock_multiplier, svga->multiplexing_rate); + svga->attrregs[0x10] & 0x40, svga->hdisp, svga->dots_per_clock, clk_sel, svga->clock_multiplier, svga->multiplexing_rate, svga->x_add, svga->monitor->mon_overscan_x); switch (svga->bpp) { case 8: svga->render = svga_render_8bpp_highres; @@ -3839,8 +3880,10 @@ s3_recalctimings(svga_t *svga) if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ if ((svga->clock_multiplier == 1) || (s3->width >= 1024)) { if (svga->multiplexing_rate == 2) { - svga->hdisp <<= 2; - svga->dots_per_clock <<= 2; + if (svga->clock_multiplier == 1) { + svga->hdisp <<= 2; + svga->dots_per_clock <<= 2; + } } else { if (!svga->clock_multiplier) { svga->hdisp <<= 1; @@ -3875,70 +3918,65 @@ s3_recalctimings(svga_t *svga) break; } break; + case S3_86C801: + case S3_86C805: + case S3_86C805I: case S3_86C928PCI: if (!svga->chain4) svga->chain4 |= 0x08; break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + } + break; + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; + default: + break; + } + break; + case S3_VISION868: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + if (s3->width >= 1024) + svga->clock /= 2.0; } break; - default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_ELSAWIN2KPROX: - s3_log("S3 width 8bpp=%d, hdisp=%d.\n", s3->width, svga->hdisp); - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; - + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 8bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } else if ((clk_sel == 3) && (s3->width >= 1024)) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -3958,45 +3996,35 @@ s3_recalctimings(svga_t *svga) break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: + case S3_86C805: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - + case ATT49X: /*AT&T 490/1/2 RAMDAC*/ + if (svga->dots_per_clock != 16) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } else { + svga->clock *= 2.0; + svga->dots_per_clock >>= 2; + } + break; default: break; } break; - case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - - case S3_SPEA_MIRAGE_86C805: - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - switch (s3->width) { - case 800: - case 1024: - if (svga->hdisp == 400) { - /*SPEA specific drivers + its VBE RAM BIOS...*/ - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock /= 2.0; - } - break; - default: - break; - } - break; - default: break; } @@ -4085,93 +4113,66 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); } break; - + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; default: break; } break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + svga->clock /= 2.0; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; svga->clock /= 2.0; break; - default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 15bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } else if ((clk_sel == 3) && (s3->width >= 1024)) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4197,43 +4198,35 @@ s3_recalctimings(svga_t *svga) break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: + case S3_86C805: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - + case ATT49X: /*AT&T 490/1/2 RAMDAC*/ + if (svga->dots_per_clock != 16) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } else { + svga->clock *= 2.0; + svga->dots_per_clock >>= 2; + } + break; default: break; } break; - case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - - case S3_SPEA_MIRAGE_86C805: - svga->hdisp >>= 1; - switch (s3->width) { - case 800: - case 1024: - if (svga->hdisp == 400) { - /*SPEA specific drivers + its VBE RAM BIOS...*/ - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - break; - default: - break; - } - break; - default: break; } @@ -4322,92 +4315,66 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + svga->clock /= 2.0; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; - default: break; } break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); } break; - + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } else if ((clk_sel == 3) && (s3->width >= 1024)) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + s3_log("TVP3026 968 16bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4440,26 +4407,15 @@ s3_recalctimings(svga_t *svga) } break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: - case S3_SPEA_MIRAGE_86C801: - svga->hdisp = (svga->hdisp << 1) / 3; - svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - break; - default: - break; - } - break; case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_SPEA_MIRAGE_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + svga->clock = (svga->clock * 4.0) / 3.0; break; default: break; @@ -4470,21 +4426,24 @@ s3_recalctimings(svga_t *svga) svga->chain4 |= 0x08; break; case S3_86C928PCI: /*Technically the 928 cards don't support 24bpp.*/ - switch (s3->card_type) { - case S3_ELSAWIN1KPCI_86C928: - if (svga->dots_per_clock == 16) { - svga->dots_per_clock >>= 1; + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case SC1502X: /*SC15025 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + if (svga->dots_per_clock == 16) { + svga->dots_per_clock >>= 1; + svga->hdisp = (svga->hdisp << 1) / 3; + svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + svga->clock = (svga->clock * 4.0) / 3.0; + if (svga->hdisp == 640) + s3->width = 640; + } + } else if (svga->getclock == av9194_getclock) { /*AV9194 clock chip*/ svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - svga->clock /= (2.0 / 3.0); - if (svga->hdisp == 640) - s3->width = 640; } break; - case S3_SPEA_MERCURY_LITE_PCI: - svga->hdisp = (svga->hdisp << 1) / 3; - svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - break; default: break; } @@ -4492,14 +4451,34 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - svga->clock /= (2.0 / 3.0); + svga->clock = (svga->clock * 4.0) / 3.0; break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - svga->hdisp = (svga->hdisp / 3) << 2; - svga->dots_per_clock = (svga->hdisp / 3) << 2; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp = (svga->hdisp << 2) / 3; + svga->dots_per_clock = (svga->dots_per_clock << 2) / 3; + svga->clock = (svga->clock * 4.0) / 3.0; + svga->clock /= 2.0; + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; + } + break; + + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + svga->hdisp = (svga->hdisp << 1) / 3; + if (clk_sel >= 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock = (svga->clock * 4.0) / 3.0; + } + svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + + s3_log("TVP3026 968 24bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (svga->hdisp == 832) + svga->hdisp -= 32; break; default: break; @@ -4519,6 +4498,25 @@ s3_recalctimings(svga_t *svga) case 32: svga->render = svga_render_32bpp_highres; switch (s3->chip) { + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ + svga->hdisp >>= 2; + svga->dots_per_clock >>= 2; + if (s3->width == 800) { + if ((svga->crtc[0x67] >> 4) == 7) { + svga->clock *= 2.0; + s3_log("800x600: MEMLatch=%08x, htotal=%x.\n", svga->memaddr_latch, svga->htotal); + } + } + break; + default: + break; + } + break; + case S3_86C928: if (!svga->chain4) svga->chain4 |= 0x08; @@ -4576,103 +4574,58 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 2; svga->dots_per_clock >>= 2; + svga->clock /= 2.0; break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; - svga->clock /= 2.0; break; default: break; } break; case S3_VISION964: - switch (s3->card_type) { - case S3_MIROCRYSTAL20SV_964: - switch (s3->width) { - case 800: - case 1024: - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - svga->clock /= 2.0; - break; - default: - break; - } - break; - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; - } + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); break; default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 32bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } else if ((clk_sel == 3) && (s3->width >= 1024)) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4703,10 +4656,13 @@ s3_recalctimings(svga_t *svga) svga->write_bank = 0; svga->read_bank = 0; } + /*In non-enhanced/IBM VGA modes, reset the misc index registers.*/ + s3->accel.multifunc[0xd] = 0xd000; + s3->accel.multifunc[0xe] = 0xe000; } } - if ((((s3->card_type == S3_ELSAWIN1K_86C928) || (s3->card_type == S3_ELSAWIN1KPCI_86C928)) && (svga->bpp == 32)) || + if ((s3->elsa_eeprom && (svga->bpp == 32)) || (s3->chip == S3_TRIO32) || (s3->chip == S3_TRIO64) || (s3->chip == S3_VISION864) || (s3->chip == S3_VISION868) || (s3->chip == S3_VISION968)) svga->hoverride = 1; else @@ -4976,7 +4932,7 @@ s3_updatemapping(s3_t *s3) if (s3->chip >= S3_86C928) { s3->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24); - if (s3->chip <= S3_86C805) { + if (s3->chip <= S3_86C805I) { if (s3->vlb) s3->linear_base &= 0x03ffffff; else if (!s3->pci) @@ -5036,8 +4992,8 @@ s3_updatemapping(s3_t *s3) } svga->fb_only = 1; } else { - svga->fb_only = 0; mem_mapping_disable(&s3->linear_mapping); + svga->fb_only = 0; } /* Memory mapped I/O. */ @@ -5122,11 +5078,10 @@ s3_accel_out(uint16_t port, uint8_t val, void *priv) case 0x4948: case 0x4ae8: s3->accel.advfunc_cntl = val; - if ((s3->chip > S3_86C805) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { - s3->width = (val & 4) ? 1600 : 800; + if ((s3->chip > S3_86C805I) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); - } else if (s3->chip <= S3_86C805) { + } else if (s3->chip <= S3_86C805I) { svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } @@ -6256,7 +6211,7 @@ s3_accel_in_w(uint16_t port, void *priv) s3->accel_start(8, 1, temp | (temp << 16), 0, s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) temp = (temp >> 8) | (temp << 8); @@ -6266,7 +6221,7 @@ s3_accel_in_w(uint16_t port, void *priv) s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) temp = (temp >> 8) | (temp << 8); @@ -6443,6 +6398,7 @@ s3_accel_write_w(uint32_t addr, uint16_t val, void *priv) s3_accel_write_fifo(s3, addr, val); break; default: + s3_log("FIFOWORD Write=%04x, val=%04x.\n", addr & (addr_mask - 1), val); s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_WORD); break; } @@ -6607,6 +6563,7 @@ s3_accel_write_l(uint32_t addr, uint32_t val, void *priv) break; default: + s3_log("FIFOLONG Write=%04x, val=%08x.\n", addr & (addr_mask - 3), val); s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_DWORD); break; } @@ -6962,7 +6919,7 @@ polygon_setup(s3_t *s3) } #define READ(addr, dat) \ - if (((s3->bpp == 0) && !s3->color_16bit) || (s3->bpp == 2)) \ + if (((s3->bpp == 0) && !s3->color_16bit)) \ dat = svga->vram[dword_remap(svga, addr) & s3->vram_mask]; \ else if ((s3->bpp == 1) || s3->color_16bit) \ dat = vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)]; \ @@ -7807,12 +7764,10 @@ polygon_setup(s3_t *s3) { \ old_dest_dat = dest_dat; \ ROPMIX_READ(dest_dat, pat_dat, src_dat); \ - out = (out & s3->accel.wrt_mask) | (old_dest_dat & ~s3->accel.wrt_mask); \ - out &= 0xFFFFFF; \ } #define WRITE(addr, dat) \ - if (((s3->bpp == 0) && !s3->color_16bit) || (s3->bpp == 2)) { \ + if (((s3->bpp == 0) && !s3->color_16bit)) { \ svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ } else if ((s3->bpp == 1) || s3->color_16bit) { \ @@ -8041,7 +7996,7 @@ s3_visionx68_video_engine_op(uint32_t cpu_dat, s3_t *s3) s3->videoengine.busy = 1; if (host) { - if (idf == 0 && odf == 0) { + if ((idf == 0) && (odf == 0)) { if (s3->bpp == 0) count = 4; else if (s3->bpp == 1) @@ -8093,6 +8048,7 @@ s3_visionx68_video_engine_op(uint32_t cpu_dat, s3_t *s3) s3->videoengine.dx = 0.0; } + s3_log("VideoEngine count=%d.\n", count); while (count) { if (host) { /*Source data is CPU*/ src = cpu_dat; @@ -8235,6 +8191,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi int clip_r = s3->accel.multifunc[4] & 0xfff; int vram_mask = (s3->accel.multifunc[0xa] & 0xc0) == 0xc0; uint32_t mix_mask = 0; + uint8_t *vram_b = svga->vram; uint16_t *vram_w = (uint16_t *) svga->vram; uint32_t *vram_l = (uint32_t *) svga->vram; uint32_t compare = s3->accel.color_cmp; @@ -8268,7 +8225,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->bpp == 1) || s3->color_16bit) { srcbase >>= 1; dstbase >>= 1; - } else if (s3->bpp == 3) { + } else if (s3->bpp >= 2) { srcbase >>= 2; dstbase >>= 2; } @@ -8279,21 +8236,23 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (!cpu_input) s3->accel.dat_count = 0; - if (cpu_input && (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 0x02)))) { - if ((s3->bpp == 3) && (count == 2)) { - if (s3->accel.dat_count) { - cpu_dat = ((cpu_dat & 0xffff) << 16) | s3->accel.dat_buf; - count = 4; - s3->accel.dat_count = 0; - } else { - s3->accel.dat_buf = cpu_dat & 0xffff; - s3->accel.dat_count = 1; + if (cpu_input) { + if (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 0x02))) { + if ((s3->bpp == 3) && (count == 2)) { + if (s3->accel.dat_count) { + cpu_dat = ((cpu_dat & 0xffff) << 16) | s3->accel.dat_buf; + count = 4; + s3->accel.dat_count = 0; + } else { + s3->accel.dat_buf = cpu_dat & 0xffff; + s3->accel.dat_count = 1; + } } + if ((s3->bpp == 1) || s3->color_16bit) + count >>= 1; + else if (s3->bpp >= 2) + count >>= 2; } - if ((s3->bpp == 1) || s3->color_16bit) - count >>= 1; - else if (s3->bpp == 3) - count >>= 2; } if ((s3->bpp == 0) && !s3->color_16bit) @@ -8327,7 +8286,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi /*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled. When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on the NOP command)*/ - s3_log("CMD=%d, full=%04x, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%02x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%04x, mix=%04x, count=%d, rd_mask=%04x, wrt_mask=%04x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%04x, bkgdcolor=%04x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, s3->bpp, clip_r, clip_b, s3->accel.multifunc[0x0a] & 0xc4, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffff, mix_dat & 0xffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); + s3_log("CMD=%d, full=%04x, cnt=%d, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%02x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%08x, mix=%08x, count=%d, rd_mask=%08x, wrt_mask=%08x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%08x, bkgdcolor=%08x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, count, s3->bpp, clip_r, clip_b, s3->accel.multifunc[0x0a] & 0xc4, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffffffff, mix_dat & 0xffffffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.destx_distp, s3->accel.desty_axstp, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); switch (cmd) { case 0: /*NOP (Short Stroke Vectors)*/ @@ -8444,6 +8403,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } + s3->accel.sy = s3->accel.maj_axis_pcnt; if ((s3->bpp == 0) && s3->color_16bit) { s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; @@ -8468,7 +8432,120 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if (s3->accel.cmd & 0x08) { /*Radial*/ - if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.cx & 0xfff) >= (clip_l * 3) && (s3->accel.cx & 0xfff) <= (clip_r * 3) && (s3->accel.cy & 0xfff) >= (clip_t * 3) && (s3->accel.cy & 0xfff) <= (clip_b * 3)) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 1 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 2 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[(((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + + mix_dat <<= 1; + mix_dat |= 1; + cpu_dat >>= 16; + + if (!s3->accel.sy) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) + s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; + } + break; + } + + switch (s3->accel.cmd & 0xe0) { + case 0x00: + s3->accel.cx += 3; + break; + case 0x20: + s3->accel.cx += 3; + s3->accel.cy -= 3; + break; + case 0x40: + s3->accel.cy -= 3; + break; + case 0x60: + s3->accel.cx -= 3; + s3->accel.cy -= 3; + break; + case 0x80: + s3->accel.cx -= 3; + break; + case 0xa0: + s3->accel.cx -= 3; + s3->accel.cy += 3; + break; + case 0xc0: + s3->accel.cy += 3; + break; + case 0xe0: + s3->accel.cx += 3; + s3->accel.cy += 3; + break; + + default: + break; + } + s3->accel.sy--; + s3->accel.cx &= 0xfff; + s3->accel.cy &= 0xfff; + } + s3->accel.cur_x = (s3->accel.cx / 3) & 0xfff; + s3->accel.cur_y = (s3->accel.cy / 3) & 0xfff; + break; + } + + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8589,7 +8666,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8605,7 +8682,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8625,6 +8702,132 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (!s3->accel.b2e8_pix) s3_log("CMDFULL=%04x, FRGDMIX=%x, FRGDCOLR=%04x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, CLIPT=%d, CLIPB=%d.\n", s3->accel.cmd, frgd_mix, s3->accel.frgd_color, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, clip_t, clip_b); + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { + mix_dat >>= 16; + s3->accel.temp_cnt = 16; + } + + if (s3->accel.minus) + s3_log("Total pixel cx=%d, cy=%d.\n", s3->accel.cx - s3->accel.minus, s3->accel.cy); + + if ((s3->accel.cx & 0xfff) >= (clip_l * 3) && (s3->accel.cx & 0xfff) <= (clip_r * 3) && (s3->accel.cy & 0xfff) >= (clip_t * 3) && (s3->accel.cy & 0xfff) <= (clip_b * 3)) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 1 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 2 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[(((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + + if (s3->accel.b2e8_pix && s3_cpu_src(s3)) { + if (s3->accel.temp_cnt > 0) { + s3->accel.temp_cnt--; + mix_dat <<= 1; + mix_dat |= 1; + } + } else { + mix_dat <<= 1; + mix_dat |= 1; + } + + cpu_dat >>= 16; + + if (!s3->accel.sy) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) + s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; + } + break; + } + + if (s3->accel.cmd & 0x40) { + if (s3->accel.cmd & 0x80) + s3->accel.cy += 3; + else + s3->accel.cy -= 3; + + if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x20) + s3->accel.cx += 3; + else + s3->accel.cx -= 3; + } else + s3->accel.err_term += s3->accel.desty_axstp; + } else { + if (s3->accel.cmd & 0x20) + s3->accel.cx += 3; + else + s3->accel.cx -= 3; + + if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x80) + s3->accel.cy += 3; + else + s3->accel.cy -= 3; + } else + s3->accel.err_term += s3->accel.desty_axstp; + } + + s3->accel.sy--; + s3->accel.cx &= 0xfff; + s3->accel.cy &= 0xfff; + } + s3->accel.cur_x = (s3->accel.cx / 3) & 0xfff; + s3->accel.cur_y = (s3->accel.cy / 3) & 0xfff; + break; + } while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; @@ -8754,11 +8957,21 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3_log("24bpp x68 rectfill: cmd=%04x CX=%d, CY=%d.\n", s3->accel.cmd, s3->accel.cx, s3->accel.cy); + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } else if ((s3->bpp == 0) && (svga->bpp == 24)) + s3_log("24bpp 80x rectfill: BKGDCOLOR=%04x, FRGDCOLOR=%04x.\n", bkgd_color, frgd_color); + s3->accel.dest = dstbase + s3->accel.cy * s3->width; if ((s3->bpp == 0) && s3->color_16bit) { + if (!rd_mask && (clip_r == 0x7ff)) + rd_mask = 0xff; + s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; - s3_log("CMD2: RDMASK16CHECK=%d, rdmask=%04x.\n", s3->accel.rd_mask_16bit_check, rd_mask); + s3_log("CMD2: %04X: RDMASK16CHECK=%d, rdmask=%04x, clip_r=%04x.\n", s3->accel.cmd, s3->accel.rd_mask_16bit_check, rd_mask, clip_r); if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cmd == 0x41b3) { if (frgd_mix == 0) { @@ -8822,19 +9035,21 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; - if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.minus) { - wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); - frgd_color = (s3->accel.frgd_color_actual[1] << 8); - bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); - } else { - wrt_mask = s3->accel.wrt_mask_actual[0]; - frgd_color = s3->accel.frgd_color_actual[0]; - bkgd_color = s3->accel.bkgd_color_actual[0]; - } - rd_mask &= 0x00ff; - } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) - break; + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) + break; + } } else { if ((s3->bpp == 0) && s3->color_16bit) { if (s3->accel.cmd == 0x41b3) { @@ -8884,7 +9099,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("FIXME: S3 911/924 15/16bpp documentation needed.\n"); } else { if (!cpu_input && (s3->accel.cur_x & 0x400)) { - s3_log("No Input.\n"); + s3_log("No Input on %04x.\n", s3->accel.cmd); break; } else if (cpu_input && (s3->accel.cmd == 0x53b3) && (s3->accel.cur_x & 0x400)) break; @@ -8896,6 +9111,118 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); + if ((s3->bpp == 2) || (svga->bpp == 24)) { + int multiplier = 1; + if (s3->bpp == 2) { + multiplier = 3; + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x00ffffff) || (rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + } + + while (count-- && (s3->accel.sy >= 0)) { + if ((((s3->accel.cx >= (clip_l * multiplier)) && (s3->accel.cx <= (clip_r * multiplier)) && (s3->accel.cy >= (clip_t * multiplier)) && (s3->accel.cy <= (clip_b * multiplier))) && !(s3->accel.multifunc[0xe] & 0x20)) || + (((s3->accel.cx < (clip_l * multiplier)) && (s3->accel.cx > (clip_r * multiplier)) && (s3->accel.cy < (clip_t * multiplier)) && (s3->accel.cy > (clip_b * multiplier))) && (s3->accel.multifunc[0xe] & 0x20)) ) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + if (s3->bpp == 2) + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.dest + s3->accel.cx, dest_dat); + } + + old_dest_dat = dest_dat; + MIX + + if (s3->accel.cmd & 0x10) { + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.cx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + WRITE(s3->accel.dest + s3->accel.cx, dest_dat); + } + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) + s3->accel.cx += multiplier; + else + s3->accel.cx -= multiplier; + + s3->accel.cx &= 0xfff; + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.cx *= multiplier; + + if (s3->accel.cmd & 0x80) + s3->accel.cy += multiplier; + else + s3->accel.cy -= multiplier; + + s3->accel.cy &= 0xfff; + s3->accel.dest = dstbase + s3->accel.cy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.cur_x = s3->accel.cx / multiplier; + s3->accel.cur_y = s3->accel.cy / multiplier; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; @@ -9151,7 +9478,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 6: /*BitBlt*/ if (!cpu_input) { /*!cpu_input is trigger to start operation*/ s3->accel.minus = 0; - s3->accel.minus_src_24bpp = 0; s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; @@ -9161,6 +9487,18 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + s3->accel.blit_24bpp = 0; + } else if ((s3->bpp == 0) && (svga->bpp == 24)) { + s3_log("BitBLT bpp%d: 24bpp params=%04x, dwidth=%d, dheight=%d, swidth=%d, sheight=%d, lwidth=%d, lheight=%d, srcbase=%08x, dstbase=%08x, blit24 times=%d, moddx=%d, modcx=%d.\n", s3->bpp, s3->accel.cmd, s3->accel.dx / 3, s3->accel.dy, s3->accel.cx / 3, s3->accel.cy, s3->accel.sx / 3, s3->accel.sy, srcbase, dstbase, s3->accel.blit_24bpp, s3->accel.dx % 3, s3->accel.cx % 3); + s3->accel.blit_24bpp = (s3->accel.blit_24bpp + 1) & 3; + } else + s3->accel.blit_24bpp = 0; + if ((s3->bpp == 0) && s3->color_16bit) { s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; s3_log("CMD6: RDMASK16CHECK=%d.\n", s3->accel.rd_mask_16bit_check); @@ -9193,7 +9531,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit)) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -9211,6 +9549,203 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); + if ((s3->bpp == 2) || (svga->bpp == 24)) { + int multiplier = 1; + if (s3->bpp == 2) { + multiplier = 3; + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if (rd_mask == 0x0000ffff) + rd_mask = 0xffffffff; + } + + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { + s3_log("Special BitBLT24, wrtmask=%04x.\n", wrt_mask); + while (1) { + if ((s3->accel.dx >= (clip_l * multiplier)) && (s3->accel.dx <= (clip_r * multiplier)) && (s3->accel.dy >= (clip_t * multiplier)) && (s3->accel.dy <= (clip_b * multiplier))) { + if (s3->bpp == 2) { + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + } else { + READ(s3->accel.src + s3->accel.cx, src_dat); + READ(s3->accel.dest + s3->accel.dx, dest_dat); + } + dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); + + if (s3->accel.cmd & 0x10) { + s3_log("CMD6 special bitblt24 bpp%d: dest=%02x, src=%06x, dx=%d, dy=%d, cx=%d, cy=%d, sx=%d, sy=%d.\n", s3->bpp, dest_dat, src_dat, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy); + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + } + } + } + + s3->accel.cx += multiplier; + s3->accel.dx += multiplier; + s3->accel.sx--; + + s3->accel.dx &= 0xfff; + + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= multiplier; + s3->accel.dx *= multiplier; + + s3->accel.cy += multiplier; + s3->accel.dy += multiplier; + + s3->accel.src = srcbase + (s3->accel.cy * s3->width); + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); + + s3->accel.sy--; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / multiplier; + s3->accel.desty_axstp = s3->accel.dy / multiplier; + return; + } + } + } + } else { + s3_log("Normal24 blit, srcbase=%08x, dstbase=%08x, full=%04x, wrt_mask=%08x, extmultifunc0e=%03x, frgdmixval=%02x.\n", srcbase, dstbase, s3->accel.cmd, wrt_mask, s3->accel.multifunc[0x0e] & 0x180, s3->accel.frgd_mix); + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * multiplier)) && (s3->accel.dx <= (clip_r * multiplier)) && ((s3->accel.dy >= clip_t * multiplier)) && (s3->accel.dy <= (clip_b * multiplier))) { + if (vram_mask && (s3->accel.cmd & 0x10)) { + if (s3->bpp == 2) + mix_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.src + s3->accel.cx, mix_dat); + } + mix_dat = ((mix_dat & rd_mask) == rd_mask); + mix_dat = mix_dat ? mix_mask : 0; + } + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + if (s3->bpp == 2) + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.src + s3->accel.cx, src_dat); + } + if (vram_mask && (s3->accel.cmd & 0x10)) + src_dat = ((src_dat & rd_mask) == rd_mask); + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + if (s3->bpp == 2) + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.dest + s3->accel.dx, dest_dat); + } + + old_dest_dat = dest_dat; + MIX + + if ((!(s3->accel.cmd & 0x10) && vram_mask) || (s3->accel.cmd & 0x10)) { + s3_log("CMD6 %04x: normal bitblt24 bpp%d: dest=%02x, src=%02x, old=%02x, dx=%d, dy=%d, cx=%d, cy=%d, sx=%d, sy=%d, moddx=%d, modcx=%d, frgdmix=%02x, bkgdmix=%02x.\n", s3->accel.cmd, s3->bpp, dest_dat, src_dat, old_dest_dat, s3->accel.dx / 3, s3->accel.dy, s3->accel.cx / 3, s3->accel.cy, s3->accel.sx / 3, s3->accel.sy, s3->accel.dx % 3, s3->accel.cx % 3, s3->accel.frgd_mix, s3->accel.bkgd_mix); + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + if (s3->accel.blit_24bpp == 5) { + WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + } + } + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx += multiplier; + s3->accel.dx += multiplier; + } else { + s3->accel.cx -= multiplier; + s3->accel.dx -= multiplier; + } + + s3->accel.dx &= 0xfff; + + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= multiplier; + s3->accel.dx *= multiplier; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy += multiplier; + s3->accel.dy += multiplier; + } else { + s3->accel.cy -= multiplier; + s3->accel.dy -= multiplier; + } + + s3->accel.src = srcbase + s3->accel.cy * s3->width; + s3->accel.dest = dstbase + s3->accel.dy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / multiplier; + s3->accel.desty_axstp = s3->accel.dy / multiplier; + return; + } + } + } + } + break; + } + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { s3_log("Special BitBLT.\n"); while (1) { @@ -9398,6 +9933,13 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } + /*Align source with destination*/ s3->accel.pattern = (s3->accel.cy * s3->width) + s3->accel.cx; s3->accel.dest = dstbase + s3->accel.dy * s3->width; @@ -9411,6 +9953,119 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if (rd_mask == 0x0000ffff) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * 3)) && (s3->accel.dx <= (clip_r * 3)) && (s3->accel.dy >= (clip_t * 3)) && (s3->accel.dy <= (clip_b * 3))) { + if (vram_mask) { + mix_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + mix_dat = ((mix_dat & rd_mask) == rd_mask); + mix_dat = mix_dat ? mix_mask : 0; + } + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + if (vram_mask) + src_dat = ((src_dat & rd_mask) == rd_mask); + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + if (s3->accel.cmd & 0x10) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx = ((s3->accel.cx + 3) & 7) | (s3->accel.cx & ~7); + s3->accel.dx += 3; + } else { + s3->accel.cx = ((s3->accel.cx - 3) & 7) | (s3->accel.cx & ~7); + s3->accel.dx -= 3; + } + s3->accel.dx &= 0xfff; + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= 3; + s3->accel.dx *= 3; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy = ((s3->accel.cy + 3) & 7) | (s3->accel.cy & ~7); + s3->accel.dy += 3; + } else { + s3->accel.cy = ((s3->accel.cy - 3) & 7) | (s3->accel.cy & ~7); + s3->accel.dy -= 3; + } + + s3->accel.src = srcbase + s3->accel.pattern + (s3->accel.cy * s3->width); + s3->accel.dest = dstbase + s3->accel.dy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / 3; + s3->accel.desty_axstp = s3->accel.dy / 3; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { if (vram_mask) { @@ -9756,8 +10411,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 14: /*ROPBlt (Vision868/968 only)*/ ; - uint32_t mono_pattern[64] = { 0 }; - if (s3->chip != S3_VISION968 && s3->chip != S3_VISION868) + uint32_t mono_pattern[8][8] = { 0 }; + int use_rop_mix = 0; + uint32_t vram_dat = 0; + + if ((s3->chip != S3_VISION968) && (s3->chip != S3_VISION868)) break; if (!cpu_input) /*!cpu_input is trigger to start operation*/ @@ -9774,18 +10432,26 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.px = s3->accel.pat_x & 0xfff; s3->accel.py = s3->accel.pat_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + s3->accel.px *= 3; + s3->accel.py *= 3; + } + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); s3->accel.src = srcbase + (s3->accel.cy * s3->width); s3->accel.pattern = (s3->accel.py * s3->width); - s3_log("ROPBLT=%04x, PIXCntl=%04x, Misc1=%04x, PATBKGDCOL=%08x, PATFRGDCOL=%08x, COLBKGDCOL=%08x, COLFRGDCOL=%08x, PX=%d, PY=%d, DX=%d, DY=%d, CX=%d, CY=%d, FRGDSEL=%x, BKGDSEL=%x, RDMASK=%08x, WRTMASK=%08x, ROPMIX=%03x, pitch=%d.\n", s3->accel.cmd, s3->accel.multifunc[0xa], s3->accel.multifunc[0xe], s3->accel.pat_bg_color, s3->accel.pat_fg_color, s3->accel.bkgd_color, s3->accel.frgd_color, s3->accel.px, s3->accel.py, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, frgd_mix, bkgd_mix, s3->accel.rd_mask, s3->accel.wrt_mask, s3->accel.ropmix, s3->width); + + s3_log("ROPBLT=%04x, BPP=%d, PIXCntl=%04x, Misc1=%04x, PATBKGDCOL=%08x, PATFRGDCOL=%08x, COLBKGDCOL=%08x, COLFRGDCOL=%08x, SX=%d, SY=%d, PX=%d, PY=%d, DX=%d, DY=%d, CX=%d, CY=%d, FRGDSEL=%02x, BKGDSEL=%02x, RDMASK=%08x, WRTMASK=%08x, ROPMIX=%03x, pitch=%d.\n", s3->accel.cmd, s3->bpp, s3->accel.multifunc[0xa], s3->accel.multifunc[0xe], s3->accel.pat_bg_color, s3->accel.pat_fg_color, s3->accel.bkgd_color, s3->accel.frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.pat_x, s3->accel.pat_y, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, s3->accel.frgd_mix, s3->accel.bkgd_mix, s3->accel.rd_mask, s3->accel.wrt_mask, s3->accel.ropmix, s3->width); } if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ if (s3->accel.ropmix & 0x100) { - int x; - int y; switch (s3->accel.cmd & 0x600) { case 0x000: case 0x600: @@ -9798,13 +10464,246 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - for (y = 0; y < 8; y++) { - for (x = 0; x < 8; x++) { - mono_pattern[y * 8 + (7 - x)] = (mix_dat & (1 << (x + y * 8))) & 0x80000000; + if (cpu_input) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { + if ((frgd_mix < 2) || (bkgd_mix < 2)) + use_rop_mix = 3; + } else { + if ((frgd_mix == 2) || (bkgd_mix == 2)) + use_rop_mix = 2; + } + } else { + if ((s3->accel.multifunc[0xa] & 0xc0) != 0x80) { + if ((frgd_mix == 3) || (bkgd_mix == 3)) + use_rop_mix = 1; + } + } + + if (use_rop_mix == 3) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + mono_pattern[y][7 - x] = (mix_dat & (1 << (x + y * 8))) & 0x80000000; + } + } + } else if (use_rop_mix == 2) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + mono_pattern[y][7 - x] = (cpu_dat & (1 << (x + y * 8))) & 0x80000000; + } + } + } else if (use_rop_mix <= 1) { + if (use_rop_mix == 0) + frgd_mix = 3; + + if (s3->bpp == 2) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = (*(uint32_t *) &vram_b[(((s3->accel.py + (y * 3)) * s3->width) + s3->accel.px + (x * 3)) & s3->vram_mask]) & 0xffffff; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x800000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x800000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800000; + + if (s3->accel.pat_bg_color != s3->accel.pat_fg_color) + s3_log("MonoPattern Screen=%08x, y=%d, x=%d, sel=%08x, vram=%08x.\n", mono_pattern[y][7 - x], y, 7 - x, vram_dat & 0x800000, vram_dat); + } + } + } else if (s3->bpp == 1) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = vram_w[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & (s3->vram_mask >> 1)]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x8000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x8000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x8000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000; + } + } + } else if (s3->bpp == 3) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = vram_l[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & (s3->vram_mask >> 2)]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80000000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80000000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000000; + } + } + } else { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = svga->vram[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & s3->vram_mask]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80; + } + } } } } - while (count-- && s3->accel.sy >= 0) { + + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * 3)) && (s3->accel.dx <= (clip_r * 3)) && (s3->accel.dy >= (clip_t * 3)) && (s3->accel.dy <= (clip_b * 3))) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = s3->accel.bkgd_color; + break; + case 1: + src_dat = s3->accel.frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + break; + + default: + break; + } + + if (s3->accel.ropmix & 0x100) { /*Mono pattern used*/ + if (use_rop_mix <= 1) { + pat_dat = mono_pattern[(s3->accel.py / 3) & 7][(s3->accel.px / 3) & 7] ? s3->accel.pat_fg_color : s3->accel.pat_bg_color; + if (s3->accel.pat_bg_color != s3->accel.pat_fg_color) + s3_log("PatternData=%06x, PX=%d, PY=%d, MonoSel=%06x.\n", pat_dat, (s3->accel.px / 3) & 7, (s3->accel.py / 3) & 7, vram_dat); + } else { + switch (mono_pattern[(s3->accel.py / 3) & 7][(s3->accel.px / 3) & 7] ? (frgd_mix & 1) : (bkgd_mix & 1)) { + case 0: + pat_dat = s3->accel.pat_bg_color; + break; + case 1: + pat_dat = s3->accel.pat_fg_color; + break; + default: + break; + } + } + } else { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + pat_dat = s3->accel.bkgd_color; + break; + case 1: + pat_dat = s3->accel.frgd_color; + break; + case 2: + pat_dat = cpu_dat; + break; + case 3: + pat_dat = (*(uint32_t *) &vram_b[(s3->accel.pattern + s3->accel.px) & s3->vram_mask]) & 0xffffff; + break; + + default: + break; + } + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + + ROPMIX + out = (out & wrt_mask) | (old_dest_dat & ~wrt_mask); + + if (s3->accel.cmd & 0x10) { + s3_log("ROPBLT24 ROPSET=%03x, DX=%d, DY=%d, OUT=%02x, SRCC=%08x, DSTC=%08x.\n", s3->accel.ropmix, s3->accel.dx, s3->accel.dy, out, (s3->accel.src + s3->accel.cx) & (s3->vram_mask >> 2), (s3->accel.dest + s3->accel.dx) & (s3->vram_mask >> 2)); + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = out & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (out >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (out >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx += 3; + s3->accel.dx += 3; + s3->accel.px += 3; + } else { + s3->accel.cx -= 3; + s3->accel.dx -= 3; + s3->accel.px -= 3; + } + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.px = s3->accel.pat_x & 0xfff; + + s3->accel.dx *= 3; + s3->accel.cx *= 3; + s3->accel.px *= 3; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy += 3; + s3->accel.dy += 3; + s3->accel.py += 3; + } else { + s3->accel.cy -= 3; + s3->accel.dy -= 3; + s3->accel.py -= 3; + } + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); + s3->accel.src = srcbase + (s3->accel.cy * s3->width); + s3->accel.pattern = (s3->accel.py * s3->width); + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / 3; + s3->accel.desty_axstp = s3->accel.dy / 3; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: @@ -9825,17 +10724,20 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if (s3->accel.ropmix & 0x100) { /*Mono pattern used*/ - switch (mono_pattern[(s3->accel.py & 7) * 8 + (s3->accel.px & 7)] ? (frgd_mix & 1) : (bkgd_mix & 1)) { - case 0: - pat_dat = s3->accel.pat_bg_color; - break; - case 1: - pat_dat = s3->accel.pat_fg_color; - break; - default: - break; + if (use_rop_mix <= 1) + pat_dat = mono_pattern[s3->accel.py & 7][s3->accel.px & 7] ? s3->accel.pat_fg_color : s3->accel.pat_bg_color; + else { + switch (mono_pattern[s3->accel.py & 7][s3->accel.px & 7] ? (frgd_mix & 1) : (bkgd_mix & 1)) { + case 0: + pat_dat = s3->accel.pat_bg_color; + break; + case 1: + pat_dat = s3->accel.pat_fg_color; + break; + default: + break; + } } - s3_log("MonoMIX=%08x, PX=%d, PY=%d.\n", mix_dat, s3->accel.px & 7, s3->accel.py & 7); } else { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: @@ -9875,8 +10777,8 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi READ(s3->accel.dest + s3->accel.dx, dest_dat); ROPMIX + out = (out & s3->accel.wrt_mask) | (old_dest_dat & ~s3->accel.wrt_mask); - s3_log("Destination=%08x, Source=%08x, Pattern=%08x, OUT=%08x, mix=%08x, count=%d.\n", dest_dat, src_dat, pat_dat, out, mix_dat, count); if (s3->accel.cmd & 0x10) { WRITE(s3->accel.dest + s3->accel.dx, out); } @@ -9928,8 +10830,9 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.sy--; - if (cpu_input /* && (s3->accel.multifunc[0xa] & 0xc0) == 0x80*/) + if (cpu_input) return; + if (s3->accel.sy < 0) { s3->accel.destx_distp = s3->accel.dx; s3->accel.desty_axstp = s3->accel.dy; @@ -10293,7 +11196,7 @@ s3_init(const device_t *info) break; case S3_WINNER1000_805: bios_fn = ROM_WINNER1000_805; - chip = S3_86C801; + chip = S3_86C805I; video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_86c801); break; case S3_86C805_ONBOARD: @@ -10636,8 +11539,8 @@ s3_init(const device_t *info) case S3_VISION968: switch (info->local) { - case S3_ELSAWIN2KPROX: case S3_DIAMOND_STEALTH64_968: + case S3_ELSAWIN2KPROX: case S3_PHOENIX_VISION968: case S3_NUMBER9_9FX_771: svga->dac_hwcursor_draw = ibm_rgb528_hwcursor_draw; @@ -10731,7 +11634,6 @@ s3_init(const device_t *info) s3->id_ext = stepping; s3->id_ext_pci = 0; s3->packed_mmio = 0; - s3->accel.rd_mask = 0xff; svga->ramdac = device_add(&sc11483_ramdac_device); s3->ramdac_type = SC1148X; @@ -10754,7 +11656,6 @@ s3_init(const device_t *info) s3->id_ext = stepping; s3->id_ext_pci = 0; s3->packed_mmio = 0; - s3->accel.rd_mask = 0xff; svga->ramdac = device_add(&sc11483_ramdac_device); s3->ramdac_type = SC1148X; @@ -10776,11 +11677,12 @@ s3_init(const device_t *info) s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_SPEA_MIRAGE_86C801: case S3_SPEA_MIRAGE_86C805: - case S3_WINNER1000_805: svga->decode_mask = (2 << 20) - 1; stepping = 0xa2; /*86C801/86C805*/ s3->id = stepping; @@ -10793,8 +11695,24 @@ s3_init(const device_t *info) s3->ramdac_type = ATT49X; svga->clock_gen = device_add(&av9194_device); svga->getclock = av9194_getclock; - if (info->local == S3_WINNER1000_805) - s3->elsa_eeprom = 1; + break; + + case S3_WINNER1000_805: + svga->decode_mask = (2 << 20) - 1; + stepping = 0xa8; /*86C801I/86C805I*/ + s3->id = stepping; + s3->id_ext = stepping; + s3->id_ext_pci = 0; + s3->packed_mmio = 0; + svga->crtc[0x5a] = 0x0a; + + svga->ramdac = device_add(&sdac_ramdac_device); + s3->ramdac_type = S3_SDAC; + svga->clock_gen = svga->ramdac; + svga->getclock = sdac_getclock; + s3->elsa_eeprom = 1; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_86C805_ONBOARD: @@ -10924,6 +11842,8 @@ s3_init(const device_t *info) s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_DIAMOND_STEALTH64_964: @@ -10991,10 +11911,10 @@ s3_init(const device_t *info) if (info->local == S3_ELSAWIN2KPROX) { s3->elsa_eeprom = 1; ibm_rgb528_ramdac_set_ref_clock(svga->ramdac, svga, 28322000.0f); - } else if (info->local != S3_DIAMOND_STEALTH64_968) - ibm_rgb528_ramdac_set_ref_clock(svga->ramdac, svga, 16000000.0f); - else + } else if (info->local == S3_DIAMOND_STEALTH64_968) ibm_rgb528_ramdac_set_ref_clock(svga->ramdac, svga, 14318184.0f); + else + ibm_rgb528_ramdac_set_ref_clock(svga->ramdac, svga, 16000000.0f); break; default: svga->ramdac = device_add(&tvp3026_ramdac_device); @@ -11031,13 +11951,14 @@ s3_init(const device_t *info) svga->clock_gen = device_add(&icd2061_device); svga->getclock = icd2061_getclock; icd2061_set_ref_clock(svga->ramdac, 14318184.0f); - svga_recalctimings(svga); } else { svga->ramdac = device_add(&sdac_ramdac_device); s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); } + svga_recalctimings(svga); break; case S3_PHOENIX_TRIO32: diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index daf59aea6..dcf380ff8 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1063,32 +1063,49 @@ s3_virge_updatemapping(virge_t *virge) return; } - switch (svga->gdcreg[6] & 0xc) { /*Banked framebuffer*/ - case 0x0: /*128k at A0000*/ - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); - svga->banked_mask = 0xffff; - break; - case 0x4: /*64k at A0000*/ - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); - svga->banked_mask = 0xffff; - if (xga_active && (svga->xga != NULL)) { - xga->on = 0; - mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); - } - break; - case 0x8: /*32k at B0000*/ - mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000); - svga->banked_mask = 0x7fff; - break; - case 0xC: /*32k at B8000*/ - mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); - svga->banked_mask = 0x7fff; - break; - } + /*Banked framebuffer*/ + if (svga->crtc[0x31] & 0x08) /*Enhanced mode mappings*/ + { + /* Enhanced mode forces 64kb at 0xa0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + if (xga_active && (svga->xga != NULL)) { + xga->on = 0; + mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); + } + } else + switch (svga->gdcreg[6] & 0xc) { /*VGA mapping*/ + case 0x0: /*128k at A0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); + svga->banked_mask = 0xffff; + break; + case 0x4: /*64k at A0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + if (xga_active && (svga->xga != NULL)) { + xga->on = 0; + mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); + } + break; + case 0x8: /*32k at B0000*/ + mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000); + svga->banked_mask = 0x7fff; + break; + case 0xC: /*32k at B8000*/ + mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); + svga->banked_mask = 0x7fff; + break; + + default: + break; + } virge->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24); if ((svga->crtc[0x58] & 0x10) || (virge->advfunc_cntl & 0x10)) { /*Linear framebuffer*/ + /*Linear framebuffer*/ + mem_mapping_disable(&svga->mapping); + switch (svga->crtc[0x58] & 7) { case 0: /*64k*/ virge->linear_size = 0x10000; @@ -1110,11 +1127,19 @@ s3_virge_updatemapping(virge_t *virge) break; } virge->linear_base &= ~(virge->linear_size - 1); - if (virge->linear_base == 0xa0000) { - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + //pclog("CR58 & 7=%x, base=%08x.\n", svga->crtc[0x58] & 7, virge->linear_base); + if ((virge->linear_base == 0xa0000) || (virge->linear_size == 0x10000)) { mem_mapping_disable(&virge->linear_mapping); - } else - mem_mapping_set_addr(&virge->linear_mapping, virge->linear_base, virge->linear_size); + if (!(svga->crtc[0x53] & 0x10)) { + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + } + } else { + if (virge->linear_base) + mem_mapping_set_addr(&virge->linear_mapping, virge->linear_base, virge->linear_size); + else + mem_mapping_disable(&virge->linear_mapping); + } svga->fb_only = 1; } else { mem_mapping_disable(&virge->linear_mapping); @@ -1122,6 +1147,7 @@ s3_virge_updatemapping(virge_t *virge) } if ((svga->crtc[0x53] & 0x10) || (virge->advfunc_cntl & 0x20)) { /*Old MMIO*/ + mem_mapping_disable(&svga->mapping); if (svga->crtc[0x53] & 0x20) mem_mapping_set_addr(&virge->mmio_mapping, 0xb8000, 0x8000); else @@ -1129,9 +1155,12 @@ s3_virge_updatemapping(virge_t *virge) } else mem_mapping_disable(&virge->mmio_mapping); - if (svga->crtc[0x53] & 0x08) /*New MMIO*/ - mem_mapping_set_addr(&virge->new_mmio_mapping, virge->linear_base + 0x1000000, 0x10000); - else + if (svga->crtc[0x53] & 0x08) { /*New MMIO*/ + if (virge->linear_base) + mem_mapping_set_addr(&virge->new_mmio_mapping, virge->linear_base + 0x1000000, 0x10000); + else + mem_mapping_disable(&virge->new_mmio_mapping); + } else mem_mapping_disable(&virge->new_mmio_mapping); } @@ -1946,9 +1975,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) break; case 0x8190: virge->streams.sec_ctrl = val; - virge->streams.dda_horiz_accumulator = val & 0x7ff; - if (val & 0x800) - virge->streams.dda_horiz_accumulator |= ~0x7ff; + virge->streams.dda_horiz_accumulator = val & 0xfff; + if (val & 0x1000) + virge->streams.dda_horiz_accumulator |= ~0xfff; virge->streams.sdif = (val >> 24) & 7; break; @@ -1961,9 +1990,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) if (val & 0x800) virge->streams.k1_horiz_scale |= ~0x7ff; - virge->streams.k2_horiz_scale = (val >> 16) & 0x3ff; - if ((val >> 16) & 0x400) - virge->streams.k2_horiz_scale |= ~0x3ff; + virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; + if ((val >> 16) & 0x800) + virge->streams.k2_horiz_scale |= ~0x7ff; svga_recalctimings(svga); svga->fullchange = changeframecount; @@ -2019,14 +2048,14 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) virge->streams.k1_vert_scale |= ~0x7ff; break; case 0x81e4: - virge->streams.k2_vert_scale = val & 0x3ff; - if (val & 0x400) - virge->streams.k2_vert_scale |= ~0x3ff; + virge->streams.k2_vert_scale = val & 0x7ff; + if (val & 0x800) + virge->streams.k2_vert_scale |= ~0x7ff; break; case 0x81e8: - virge->streams.dda_vert_accumulator = val & 0x7ff; - if (val & 0x800) - virge->streams.dda_vert_accumulator |= ~0x7ff; + virge->streams.dda_vert_accumulator = val & 0xfff; + if (val & 0x1000) + virge->streams.dda_vert_accumulator |= ~0xfff; svga_recalctimings(svga); svga->fullchange = changeframecount; @@ -3124,7 +3153,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) case 0: case CMD_SET_MS: READ(src_addr, source); - if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) + if ((virge->s3d.cmd_set & CMD_SET_TP) && (source == src_fg_clr)) update = 0; break; case CMD_SET_IDS: @@ -3150,7 +3179,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) count = 0; } } - if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) + if ((virge->s3d.cmd_set & CMD_SET_TP) && (source == src_fg_clr)) update = 0; break; case CMD_SET_IDS | CMD_SET_MS: @@ -4829,7 +4858,7 @@ s3_virge_colorkey(virge_t* virge, uint32_t x, uint32_t y) return true; else if (!(virge->streams.chroma_ctrl & (1 << 28))) return true; - + comp_r = (virge->streams.chroma_ctrl >> 16) & 0xFF; comp_g = (virge->streams.chroma_ctrl >> 8) & 0xFF; comp_b = (virge->streams.chroma_ctrl) & 0xFF; @@ -4853,7 +4882,7 @@ s3_virge_colorkey(virge_t* virge, uint32_t x, uint32_t y) */ uint8_t index = virge->streams.chroma_ctrl & 0xFF; alpha_key = (virge->chip < S3_VIRGEGX2) ? (virge->streams.chroma_ctrl & (1 << 29)) : ((virge->streams.chroma_ctrl >> 29) & 3) == 1; - + if (alpha_key) { comp_r = comp_g = comp_b = index; comp_r_h = comp_g_h = comp_b_h = index; @@ -5188,6 +5217,7 @@ s3_virge_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) svga->crtc[0x59] = (svga->crtc[0x59] & 0x01) | (val & 0xfe); else svga->crtc[0x59] = (svga->crtc[0x59] & 0x03) | (val & 0xfc); + s3_virge_updatemapping(virge); return; diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 35f42c2ee..db8b33e18 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -134,8 +134,8 @@ video_cards[] = { { .device = &s3_phoenix_86c801_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_spea_mirage_86c801_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_winner1000_805_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32i_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32_machspeed_vga_gui_2400s_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32i_axis_microdevice_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, /* MCA */ { .device = &mach32_mca_device, .flags = VIDEO_FLAG_TYPE_8514 }, { .device = &gd5426_mca_device, .flags = VIDEO_FLAG_TYPE_NONE }, @@ -145,12 +145,13 @@ video_cards[] = { /* VLB */ { .device = &mach32_vlb_device, .flags = VIDEO_FLAG_TYPE_8514 }, { .device = &mach64gx_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32i_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32_machspeed_vga_gui_2400s_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32i_hercules_dynamite_pro_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &et4000w32p_videomagic_revb_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_revc_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_cardex_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_noncardex_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revc_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_generic_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_diamond_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5424_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5426_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5428_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, @@ -196,11 +197,10 @@ video_cards[] = { { .device = &gd5446_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY }, { .device = &gd5446_stb_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY }, { .device = &gd5480_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_videomagic_revb_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_revc_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_cardex_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_noncardex_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revc_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_generic_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_diamond_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_elsa_winner1000_86c928_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_spea_mercury_lite_86c928_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_diamond_stealth64_964_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 2fd4ba482..30f76abfa 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -692,6 +692,7 @@ tgui_recalctimings(svga_t *svga) const tgui_t *tgui = (tgui_t *) svga->priv; uint8_t ger22lower = (tgui->accel.ger22 & 0xff); uint8_t ger22upper = (tgui->accel.ger22 >> 8); + int std_vga_clock = 1; if (tgui->type >= TGUI_9440) { if ((svga->crtc[0x38] & 0x19) == 0x09) @@ -767,10 +768,11 @@ tgui_recalctimings(svga_t *svga) svga->clock = (cpuclock * (double) (1ULL << 32)) / (((tgui->clock_n + 8) * 14318180.0) / ((tgui->clock_m + 2) * (1 << tgui->clock_k))); if (svga->gdcreg[0xf] & 0x08) - svga->clock *= 2; + svga->clock *= 2.0; else if (svga->gdcreg[0xf] & 0x40) - svga->clock *= 3; + svga->clock *= 3.0; } else { + //pclog("TGUI9400CXi: Clock double=%d.\n", (((svga->miscout >> 2) & 3) | ((tgui->newctrl2 << 2) & 4) | ((tgui->newctrl2 >> 3) & 8))); switch (((svga->miscout >> 2) & 3) | ((tgui->newctrl2 << 2) & 4) | ((tgui->newctrl2 >> 3) & 8)) { case 0x02: svga->clock = (cpuclock * (double) (1ULL << 32)) / 44900000.0; @@ -816,6 +818,7 @@ tgui_recalctimings(svga_t *svga) break; default: + std_vga_clock = 0; break; } @@ -823,6 +826,9 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; + if (std_vga_clock) + svga->clock /= 2.0; } } @@ -843,6 +849,7 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; break; default: break; @@ -866,6 +873,7 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; } switch (svga->hdisp) { case 640: @@ -880,18 +888,24 @@ tgui_recalctimings(svga_t *svga) break; case 15: svga->render = svga_render_15bpp_highres; - if (tgui->type < TGUI_9440) + if (tgui->type < TGUI_9440) { svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } break; case 16: svga->render = svga_render_16bpp_highres; - if (tgui->type < TGUI_9440) + if (tgui->type < TGUI_9440) { svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } break; case 24: svga->render = svga_render_24bpp_highres; - if (tgui->type < TGUI_9440) - svga->hdisp = (svga->hdisp << 1) / 3; + if (tgui->type < TGUI_9440) { + svga->hdisp /= 3; + svga->dots_per_clock /= 3; + } break; case 32: if (svga->rowoffset == 0x100)