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;