diff --git a/README.md b/README.md index 05a2a9ed2..a1e3985e1 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,16 @@ Licensing The emulator can also optionally make use of [munt](https://github.com/munt/munt), [FluidSynth](https://www.fluidsynth.org/), [Ghostscript](https://www.ghostscript.com/) and [Discord Game SDK](https://discord.com/developers/docs/game-sdk/sdk-starter-guide), which are distributed under their respective licenses. +Contribution requirements +------------------------- + Formal codification of the project's emulated hardware contribution requirements, which all have to be met to accept an addition: +* A ROM must be available; +* Documentation must be available or it must be feasible to reverse engineer with a reasonable amount of time and effort; +* It must be feasible to implement with a reasonable amount of time and effort; +* It has to fall inside the project's scope. + +Where unsure or for more details about the project's emulated hardware contribution requirements, contact a Contributor or higher. + Donations --------- We do not charge you for the emulator but donations are still welcome: diff --git a/src/86box.c b/src/86box.c index 0a857f80d..344d3c63d 100644 --- a/src/86box.c +++ b/src/86box.c @@ -853,7 +853,7 @@ pc_init_modules(void) /* Load the ROMs for the selected machine. */ if (!machine_available(machine)) { - swprintf(temp, sizeof(temp), plat_get_string(IDS_2063), machine_getname()); + swprintf(temp, sizeof_w(temp), plat_get_string(IDS_2063), machine_getname()); c = 0; machine = -1; while (machine_get_internal_name_ex(c) != NULL) { @@ -876,7 +876,7 @@ pc_init_modules(void) if (!video_card_available(gfxcard[0])) { memset(tempc, 0, sizeof(tempc)); device_get_name(video_card_getdevice(gfxcard[0]), 0, tempc); - swprintf(temp, sizeof(temp), plat_get_string(IDS_2064), tempc); + swprintf(temp, sizeof_w(temp), plat_get_string(IDS_2064), tempc); c = 0; while (video_get_internal_name(c) != NULL) { gfxcard[0] = -1; @@ -898,7 +898,7 @@ pc_init_modules(void) if (!video_card_available(gfxcard[1])) { char tempc[512] = { 0 }; device_get_name(video_card_getdevice(gfxcard[1]), 0, tempc); - swprintf(temp, sizeof(temp), (wchar_t *) "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.", tempc); + swprintf(temp, sizeof_w(temp), (wchar_t *) "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.", tempc); ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2129, temp); gfxcard[1] = 0; } diff --git a/src/codegen/codegen_ops_arith.h b/src/codegen/codegen_ops_arith.h index f1c426838..87f1640e6 100644 --- a/src/codegen/codegen_ops_arith.h +++ b/src/codegen/codegen_ops_arith.h @@ -744,7 +744,7 @@ rop81_l(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc, codeb host_reg = 0; } else { SAVE_EA(); - MEM_CHECK_WRITE(target_seg); + MEM_CHECK_WRITE_L(target_seg); host_reg = MEM_LOAD_ADDR_EA_L_NO_ABRT(target_seg); } } else { diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 08f1329be..e42516c3f 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -1733,6 +1733,12 @@ xebec_available(void) return (rom_present(XEBEC_BIOS_FILE)); } +static int +wdxt_available(void) +{ + return (rom_present(WDXT_GEN_BIOS_FILE)); +} + static int dtc5150x_available(void) { @@ -2141,13 +2147,13 @@ const device_t st506_xt_xebec_device = { const device_t st506_xt_wdxt_gen_device = { .name = "Western Digital WDXT-GEN (MFM)", - .internal_name = "st506_xt", + .internal_name = "st506_xt_gen", .flags = DEVICE_ISA, .local = (HDD_BUS_MFM << 8) | ST506_XT_TYPE_WDXT_GEN, .init = st506_init, .close = st506_close, .reset = NULL, - { .available = xebec_available }, + { .available = wdxt_available }, .speed_changed = NULL, .force_redraw = NULL, .config = NULL diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 165e37cb2..5a5b0bfda 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -611,6 +611,7 @@ extern int machine_at_acerv35n_init(const machine_t *); extern int machine_at_p55t2p4_init(const machine_t *); extern int machine_at_m7shi_init(const machine_t *); extern int machine_at_tc430hx_init(const machine_t *); +extern int machine_at_infinia7200_init(const machine_t *); extern int machine_at_equium5200_init(const machine_t *); extern int machine_at_pcv90_init(const machine_t *); extern int machine_at_p65up5_cp55t2d_init(const machine_t *); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 0e76ac1c9..3c0f0481a 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -199,6 +199,42 @@ machine_at_tc430hx_init(const machine_t *model) pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&s3_virge_375_pci_device); + device_add(&i430hx_device); + device_add(&piix3_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&pc87306_device); + device_add(&intel_flash_bxt_ami_device); + + return ret; +} + +int +machine_at_infinia7200_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear_combined2("roms/machines/infinia7200/1008DH08.BIO", + "roms/machines/infinia7200/1008DH08.BI1", + "roms/machines/infinia7200/1008DH08.BI2", + "roms/machines/infinia7200/1008DH08.BI3", + "roms/machines/infinia7200/1008DH08.RCV", + 0x3a000, 128); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x08, PCI_CARD_VIDEO, 4, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&s3_virge_375_pci_device); device_add(&i430hx_device); device_add(&piix3_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 0b1f8ec58..c4d4ed53a 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -37,6 +37,7 @@ #include <86box/pit.h> #include <86box/mem.h> #include <86box/device.h> +#include <86box/gameport.h> #include <86box/serial.h> #include <86box/keyboard.h> #include <86box/rom.h> @@ -815,5 +816,8 @@ machine_pcjr_init(const machine_t *model) device_add(&ns8250_pcjr_device); serial_set_next_inst(SERIAL_MAX); /* So that serial_standalone_init() won't do anything. */ + /* "All the inputs are 'read' with one 'IN' from address hex 201." - PCjr Technical Reference (Nov. 83), p.2-119 */ + standalone_gameport_type = &gameport_201_device; + return ret; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 032975672..0ec772669 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -8584,7 +8584,7 @@ const machine_t machines[] = { { .name = "[i430FX] DataExpert EXP8551", .internal_name = "exp8551", - .type = MACHINE_TYPE_SOCKET5, + .type = MACHINE_TYPE_SOCKET7_3V, .chipset = MACHINE_CHIPSET_INTEL_430FX, .init = machine_at_exp8551_init, .pad = 0, @@ -8906,7 +8906,7 @@ const machine_t machines[] = { { .name = "[i430FX] PC Partner MB500N", .internal_name = "mb500n", - .type = MACHINE_TYPE_SOCKET5, + .type = MACHINE_TYPE_SOCKET7_3V, .chipset = MACHINE_CHIPSET_INTEL_430FX, .init = machine_at_mb500n_init, .pad = 0, @@ -9447,7 +9447,47 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, + .flags = MACHINE_VIDEO | MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 255, + .kbc_device = NULL, + .kbc_p1 = 0, + .gpio = 0, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, + /* OEM version of Intel TC430HX, has AMI MegaKey KBC firmware on the PC87306 + Super I/O chip */ + { + .name = "[i430HX] Toshiba Infinia 7200", + .internal_name = "infinia7200", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430HX, + .init = machine_at_infinia7200_init, + .pad = 0, + .pad0 = 0, + .pad1 = MACHINE_AVAILABLE, + .pad2 = 0, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 2800, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_VIDEO | MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, diff --git a/src/qt/qt_settings.ui b/src/qt/qt_settings.ui index ec3198ebe..7b4d28bec 100644 --- a/src/qt/qt_settings.ui +++ b/src/qt/qt_settings.ui @@ -6,20 +6,20 @@ 0 0 - 831 - 595 + 800 + 570 - 831 - 595 + 800 + 570 - 831 - 595 + 800 + 570 @@ -29,6 +29,12 @@ + + 0 + + + 0 + diff --git a/src/qt/qt_settingsdisplay.ui b/src/qt/qt_settingsdisplay.ui index c9bbaf1c7..c34c7aa38 100644 --- a/src/qt/qt_settingsdisplay.ui +++ b/src/qt/qt_settingsdisplay.ui @@ -13,7 +13,7 @@ Form - + 0 @@ -26,14 +26,108 @@ 0 - + + + + + 0 + 0 + + + + Configure + + + + + + + XGA + + + + + + + + 0 + 0 + + + + Video: + + + + + + + + 0 + 0 + + + + + + + + Configure + + + + + + + + 0 + 0 + + + + Video #2: + + + + 8514/A - + + + + Voodoo Graphics + + + + + + + Configure + + + + + + + Configure + + + + + + + + 0 + 0 + + + + + Qt::Vertical @@ -46,74 +140,6 @@ - - - - - - - - 0 - 0 - - - - Configure - - - - - - - Voodoo Graphics - - - - - - - Configure - - - - - - - Video: - - - - - - - XGA - - - - - - - Configure - - - - - - - Video #2: - - - - - - - - - - Configure - - - diff --git a/src/qt/qt_settingsnetwork.ui b/src/qt/qt_settingsnetwork.ui index 763537c9e..d781a1beb 100644 --- a/src/qt/qt_settingsnetwork.ui +++ b/src/qt/qt_settingsnetwork.ui @@ -7,7 +7,7 @@ 0 0 548 - 458 + 488 @@ -27,302 +27,426 @@ 0 - - - Network Interface Contollers + + + 0 - - - - - - 0 - 0 - - - - Adapter - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Card 3: - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - - - - - - 0 - 0 - - - - Card 1: - - - - - - - - 0 - 0 - - - - Interface - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Card 4: - - - - - - - - 0 - 0 - - - - Mode - - - - - - - - 0 - 0 - - - - Card 2: - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - - + + + Network Card #1 + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + + 0 + 0 + + + + Adapter + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Configure + + + + + + + + 0 + 0 + + + + Interface + + + + + + + + 0 + 0 + + + + Mode + + + + + + + + 0 + 0 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Network Card #2 + + + + + + + 0 + 0 + + + + Interface + + + + + + + + 0 + 0 + + + + Mode + + + + + + + + 0 + 0 + + + + Adapter + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + + + + Configure + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Network Card #3 + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Adapter + + + + + + + + 0 + 0 + + + + Mode + + + + + + + + 0 + 0 + + + + Interface + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Configure + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Network Card #4 + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + + + + + + 0 + 0 + + + + Configure + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Interface + + + + + + + + 0 + 0 + + + + Adapter + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Mode + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - - - - Qt::Vertical - - - - 20 - 40 - - - - diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 376abb68c..e2ecf8ae5 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -4181,10 +4181,13 @@ s3_virge_init(const device_t *info) s3_virge_overlay_draw); virge->svga.hwcursor.cur_ysize = 64; - if (info->local == S3_VIRGE_GX2) - rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); - else - rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + if (bios_fn != NULL) + { + if (info->local == S3_VIRGE_GX2) + rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); + else + rom_init(&virge->bios_rom, (char *) bios_fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + } mem_mapping_disable(&virge->bios_rom.mapping); diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index f451c4b58..6b6af2a09 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -14,6 +14,7 @@ * * Copyright 2008-2020 Sarah Walker. */ +#include #include #include #include @@ -2267,9 +2268,10 @@ banshee_overlay_draw(svga_t *svga, int displine) case VIDPROCCFG_FILTER_MODE_DITHER_4X4: if (banshee->voodoo->scrfilter && banshee->voodoo->scrfilterEnabled) { - uint8_t *fil = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *fil3 = malloc((svga->overlay_latch.cur_xsize) * 3); + uint8_t fil[64 * 3]; + uint8_t fil3[64 * 3]; + assert(svga->overlay_latch.cur_xsize <= 64); if (banshee->vidProcCfg & VIDPROCCFG_H_SCALE_ENABLE) /* leilei HACK - don't know of real 4x1 hscaled behavior yet, double for now */ { for (x = 0; x < svga->overlay_latch.cur_xsize; x++) { @@ -2320,9 +2322,6 @@ banshee_overlay_draw(svga_t *svga, int displine) fil[(x) *3 + 2] = vb_filter_v1_rb[fil[x * 3 + 2]][fil3[(x + 1) * 3 + 2]]; p[x] = (fil[x * 3 + 2] << 16) | (fil[x * 3 + 1] << 8) | fil[x * 3]; } - - free(fil); - free(fil3); } else /* filter disabled by emulator option */ { if (banshee->vidProcCfg & VIDPROCCFG_H_SCALE_ENABLE) { @@ -2339,15 +2338,16 @@ banshee_overlay_draw(svga_t *svga, int displine) case VIDPROCCFG_FILTER_MODE_DITHER_2X2: if (banshee->voodoo->scrfilter && banshee->voodoo->scrfilterEnabled) { - uint8_t *fil = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *soak = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *soak2 = malloc((svga->overlay_latch.cur_xsize) * 3); + uint8_t fil[64 * 3]; + uint8_t soak[64 * 3]; + uint8_t soak2[64 * 3]; - uint8_t *samp1 = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *samp2 = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *samp3 = malloc((svga->overlay_latch.cur_xsize) * 3); - uint8_t *samp4 = malloc((svga->overlay_latch.cur_xsize) * 3); + uint8_t samp1[64 * 3]; + uint8_t samp2[64 * 3]; + uint8_t samp3[64 * 3]; + uint8_t samp4[64 * 3]; + assert(svga->overlay_latch.cur_xsize <= 64); src = &svga->vram[src_addr2 & svga->vram_mask]; OVERLAY_SAMPLE(banshee->overlay_buffer[1]); for (x = 0; x < svga->overlay_latch.cur_xsize; x++) { @@ -2395,14 +2395,6 @@ banshee_overlay_draw(svga_t *svga, int displine) p[x] = (fil[x * 3 + 2] << 16) | (fil[x * 3 + 1] << 8) | fil[x * 3]; } } - - free(fil); - free(soak); - free(soak2); - free(samp1); - free(samp2); - free(samp3); - free(samp4); } else /* filter disabled by emulator option */ { if (banshee->vidProcCfg & VIDPROCCFG_H_SCALE_ENABLE) { diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 822085127..34037605a 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -14,6 +14,7 @@ * * Copyright 2008-2020 Sarah Walker. */ +#include #include #include #include @@ -373,8 +374,9 @@ voodoo_filterline_v1(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, int x; // Scratchpad for avoiding feedback streaks - uint8_t *fil3 = malloc((voodoo->h_disp) * 3); + uint8_t fil3[4096 * 3]; + assert(voodoo->h_disp <= 4096); /* 16 to 32-bit */ for (x = 0; x < column; x++) { fil[x * 3] = ((src[x] & 31) << 3); @@ -422,8 +424,6 @@ voodoo_filterline_v1(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, fil[(x) *3 + 1] = voodoo->thefilterg[fil3[x * 3 + 1]][fil3[(x + 1) * 3 + 1]]; fil[(x) *3 + 2] = voodoo->thefilter[fil3[x * 3 + 2]][fil3[(x + 1) * 3 + 2]]; } - - free(fil3); } static void @@ -432,8 +432,9 @@ voodoo_filterline_v2(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, int x; // Scratchpad for blending filter - uint8_t *fil3 = malloc((voodoo->h_disp) * 3); + uint8_t fil3[4096 * 3]; + assert(voodoo->h_disp <= 4096); /* 16 to 32-bit */ for (x = 0; x < column; x++) { // Blank scratchpads @@ -487,8 +488,6 @@ voodoo_filterline_v2(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, fil3[(column - 1) * 3] = voodoo->thefilterb[fil[(column - 1) * 3]][((src[column] & 31) << 3)]; fil3[(column - 1) * 3 + 1] = voodoo->thefilterg[fil[(column - 1) * 3 + 1]][(((src[column] >> 5) & 63) << 2)]; fil3[(column - 1) * 3 + 2] = voodoo->thefilter[fil[(column - 1) * 3 + 2]][(((src[column] >> 11) & 31) << 3)]; - - free(fil3); } void @@ -537,8 +536,9 @@ voodoo_callback(void *p) monitor->target_buffer->line[voodoo->line + 8][x] = 0x00000000; if (voodoo->scrfilter && voodoo->scrfilterEnabled) { - uint8_t *fil = malloc((voodoo->h_disp) * 3); /* interleaved 24-bit RGB */ + uint8_t fil[4096 * 3]; /* interleaved 24-bit RGB */ + assert(voodoo->h_disp <= 4096); if (voodoo->type == VOODOO_2) voodoo_filterline_v2(voodoo, fil, voodoo->h_disp, src, voodoo->line); else @@ -547,8 +547,6 @@ voodoo_callback(void *p) for (x = 0; x < voodoo->h_disp; x++) { p[x] = (voodoo->clutData256[fil[x * 3]].b << 0 | voodoo->clutData256[fil[x * 3 + 1]].g << 8 | voodoo->clutData256[fil[x * 3 + 2]].r << 16); } - - free(fil); } else { for (x = 0; x < voodoo->h_disp; x++) { p[x] = draw_voodoo->video_16to32[src[x]]; diff --git a/src/win/win_about.c b/src/win/win_about.c index f0c692b75..82b327d2e 100644 --- a/src/win/win_about.c +++ b/src/win/win_about.c @@ -43,9 +43,9 @@ AboutDialogCreate(HWND hwnd) }; wchar_t emu_version[256]; - i = swprintf(emu_version, sizeof(emu_version), L"%ls v%ls", EMU_NAME_W, EMU_VERSION_FULL_W); + i = swprintf(emu_version, sizeof_w(emu_version), L"%ls v%ls", EMU_NAME_W, EMU_VERSION_FULL_W); #ifdef EMU_GIT_HASH - i += swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W); + i += swprintf(&emu_version[i], sizeof_w(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W); #endif #if defined(__arm__) || defined(__TARGET_ARCH_ARM) @@ -59,7 +59,7 @@ AboutDialogCreate(HWND hwnd) #else # define ARCH_STR L"unknown" #endif - swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls, %ls]", ARCH_STR, plat_get_string(IDS_DYNAREC)); + swprintf(&emu_version[i], sizeof_w(emu_version) - i, L" [%ls, %ls]", ARCH_STR, plat_get_string(IDS_DYNAREC)); tdconfig.cbSize = sizeof(tdconfig); tdconfig.hwndParent = hwnd;