diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 44a55d94f..ad8b47638 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -450,6 +450,7 @@ extern int machine_at_mr286_init(const machine_t *); extern int machine_at_neat_init(const machine_t *); extern int machine_at_neat_ami_init(const machine_t *); +extern int machine_at_ataripc4_init(const machine_t *); extern int machine_at_quadt386sx_init(const machine_t *); @@ -916,6 +917,7 @@ extern int machine_xt86_init(const machine_t *); extern int machine_xt_americxt_init(const machine_t *); extern int machine_xt_amixt_init(const machine_t *); +extern int machine_xt_ataripc3_init(const machine_t *); extern int machine_xt_dtk_init(const machine_t *); extern int machine_xt_jukopc_init(const machine_t *); extern int machine_xt_openxt_init(const machine_t *); diff --git a/src/include/86box/vid_voodoo_codegen_x86-64.h b/src/include/86box/vid_voodoo_codegen_x86-64.h index dc0ebce72..e8b7299f2 100644 --- a/src/include/86box/vid_voodoo_codegen_x86-64.h +++ b/src/include/86box/vid_voodoo_codegen_x86-64.h @@ -2157,6 +2157,12 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, addbyte(0xc2); } + addbyte(0xf3); /*MOVQ XMM15(colbfog), XMM0 */ + addbyte(0x44); + addbyte(0x0f); + addbyte(0x7e); + addbyte(0xf8); + if (params->fogMode & FOG_ENABLE) { if (params->fogMode & FOG_CONSTANT) { addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ @@ -2580,17 +2586,17 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, addbyte(0xef); addbyte(0xe4); break; - case AFUNC_ASATURATE: - addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/ + case AFUNC_ACOLORBEFOREFOG: + addbyte(0x66); /*PMULLW XMM4, XMM15(colbfog)*/ addbyte(0x41); addbyte(0x0f); addbyte(0xd5); - addbyte(0xe3); + addbyte(0xe7); addbyte(0xf3); /*MOVQ XMM5, XMM4*/ addbyte(0x0f); addbyte(0x7e); addbyte(0xec); - addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ + addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ addbyte(0x41); addbyte(0x0f); addbyte(0xfd); @@ -2610,6 +2616,7 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, addbyte(0x71); addbyte(0xd4); addbyte(8); + break; } switch (src_afunc) { @@ -2762,7 +2769,36 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, addbyte(0xef); addbyte(0xc0); break; - case AFUNC_ACOLORBEFOREFOG: + case AFUNC_ASATURATE: + addbyte(0x66); /*PMULLW XMM0, XMM11(minus_254)*/ + addbyte(0x41); + addbyte(0x0f); + addbyte(0xd5); + addbyte(0xc3); + addbyte(0xf3); /*MOVQ XMM5, XMM0*/ + addbyte(0x0f); + addbyte(0x7e); + addbyte(0xe8); + addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ + addbyte(0x41); + addbyte(0x0f); + addbyte(0xfd); + addbyte(0x42); + addbyte(8 * 2); + addbyte(0x66); /*PSRLW XMM5, 8*/ + addbyte(0x0f); + addbyte(0x71); + addbyte(0xd5); + addbyte(8); + addbyte(0x66); /*PADDW XMM0, XMM5*/ + addbyte(0x0f); + addbyte(0xfd); + addbyte(0xc5); + addbyte(0x66); /*PSRLW XMM0, 8*/ + addbyte(0x0f); + addbyte(0x71); + addbyte(0xd0); + addbyte(8); break; } diff --git a/src/include/86box/vid_voodoo_render.h b/src/include/86box/vid_voodoo_render.h index cd1962430..e88d21dd5 100644 --- a/src/include/86box/vid_voodoo_render.h +++ b/src/include/86box/vid_voodoo_render.h @@ -210,11 +210,10 @@ void voodoo_codegen_close(voodoo_t *voodoo); newdest_g = (dest_g * (255 - dest_a)) / 255; \ newdest_b = (dest_b * (255 - dest_a)) / 255; \ break; \ - case AFUNC_ASATURATE: \ - _a = MIN(src_a, 1 - dest_a); \ - newdest_r = (dest_r * _a) / 255; \ - newdest_g = (dest_g * _a) / 255; \ - newdest_b = (dest_b * _a) / 255; \ + case AFUNC_ACOLORBEFOREFOG: \ + newdest_r = (dest_r * colbfog_r) / 255; \ + newdest_g = (dest_g * colbfog_g) / 255; \ + newdest_b = (dest_b * colbfog_b) / 255; \ break; \ } \ \ @@ -254,8 +253,11 @@ void voodoo_codegen_close(voodoo_t *voodoo); src_g = (src_g * (255 - dest_a)) / 255; \ src_b = (src_b * (255 - dest_a)) / 255; \ break; \ - case AFUNC_ACOLORBEFOREFOG: \ - fatal("AFUNC_ACOLORBEFOREFOG\n"); \ + case AFUNC_ASATURATE: \ + _a = MIN(src_a, 255 - dest_a); \ + src_r = (dest_r * _a) / 255; \ + src_g = (dest_g * _a) / 255; \ + src_b = (dest_b * _a) / 255; \ break; \ } \ \ diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index 36629658f..9c1eb817b 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -212,6 +212,37 @@ machine_at_neat_ami_init(const machine_t *model) return ret; } +// TODO +// Onboard Paradise PVGA1A-JK VGA Graphics +// Data Technology Corporation DTC7187 RLL Controller +int +machine_at_ataripc4_init(const machine_t *model) +{ + int ret; + + ret = bios_load_interleaved("roms/machines/ataripc4/AMI_PC4X_1.7_EVEN.BIN", + "roms/machines/ataripc4/AMI_PC4X_1.7_ODD.BIN", +#if 0 + ret = bios_load_interleaved("roms/machines/ataripc4/ami_pc4x_1.7_even.bin", + "roms/machines/ataripc4/ami_pc4x_1.7_odd.bin", +#endif + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + device_add(&neat_device); + + if (fdc_current[0] == FDC_INTERNAL) + device_add(&fdc_at_device); + + device_add(&keyboard_at_ami_device); + + return ret; +} + int machine_at_px286_init(const machine_t *model) { diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index 008acbff2..62466bf91 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -212,6 +212,30 @@ machine_xt_amixt_init(const machine_t *model) return ret; } +// TODO +// Onboard EGA Graphics (NSI Logic EVC315-S on early boards STMicroelectronics EGA on later revisions) +// Adaptec ACB-2072 RLL Controller Card (Optional) +// Atari PCM1 Mouse Support +int +machine_xt_ataripc3_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/ataripc3/AWARD_ATARI_PC_BIOS_3.08.BIN", + 0x000f8000, 32768, 0); +#if 0 + ret = bios_load_linear("roms/machines/ataripc3/c101701-004 308.u61", + 0x000f8000, 0x8000, 0); +#endif + + if (bios_only || !ret) + return ret; + + machine_xt_clone_init(model, 0); + + return ret; +} + int machine_xt_znic_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index f5a0a9d1c..b60d35fd7 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -484,6 +484,45 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + { + .name = "[8088] Atari PC 3", + .internal_name = "ataripc3", + .type = MACHINE_TYPE_8088, + .chipset = MACHINE_CHIPSET_DISCRETE, + .init = machine_xt_ataripc3_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_8088, + .block = CPU_BLOCK_NONE, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_PC, + .flags = MACHINE_FDC, + .ram = { + .min = 64, + .max = 640, + .step = 64 + }, + .nvrmask = 0, + .kbc_device = &keyboard_xtclone_device, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, //&fdc_xt_device, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, { .name = "[8088] Bondwell BW230", .internal_name = "bw230", @@ -3405,6 +3444,45 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + { + .name = "[NEAT] Atari PC 4", + .internal_name = "ataripc4", + .type = MACHINE_TYPE_286, + .chipset = MACHINE_CHIPSET_NEAT, + .init = machine_at_ataripc4_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_286, + .block = CPU_BLOCK_NONE, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_AT, + .flags = MACHINE_FDC, + .ram = { + .min = 512, + .max = 8192, + .step = 128 + }, + .nvrmask = 127, + .kbc_device = &keyboard_at_ami_device, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, //&fdc_at_device, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* This has "AMI KEYBOARD BIOS", most likely 'F'. */ { .name = "[NEAT] DataExpert 286", diff --git a/src/video/vid_voodoo_fb.c b/src/video/vid_voodoo_fb.c index 5ae26b4c5..ddf68360f 100644 --- a/src/video/vid_voodoo_fb.c +++ b/src/video/vid_voodoo_fb.c @@ -252,6 +252,9 @@ voodoo_fb_writew(uint32_t addr, uint16_t val, void *priv) { rgba8_t write_data = colour_data; uint16_t new_depth = depth_data; + int colbfog_r = 0; + int colbfog_g = 0; + int colbfog_b = 0; if (params->fbzMode & FBZ_DEPTH_ENABLE) { uint16_t old_depth = *(uint16_t *) (&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]); @@ -262,6 +265,10 @@ voodoo_fb_writew(uint32_t addr, uint16_t val, void *priv) if ((params->fbzMode & FBZ_CHROMAKEY) && write_data.r == params->chromaKey_r && write_data.g == params->chromaKey_g && write_data.b == params->chromaKey_b) goto skip_pixel; + colbfog_r = write_data.r; + colbfog_g = write_data.g; + colbfog_b = write_data.b; + if (params->fogMode & FOG_ENABLE) { int32_t z = new_depth << 12; int64_t w_depth = (int64_t) (int32_t) new_depth; @@ -438,6 +445,9 @@ voodoo_fb_writel(uint32_t addr, uint32_t val, void *priv) for (int c = 0; c < count; c++) { rgba8_t write_data = colour_data[c]; uint16_t new_depth = depth_data[c]; + int colbfog_r = 0; + int colbfog_g = 0; + int colbfog_b = 0; if (params->fbzMode & FBZ_DEPTH_ENABLE) { uint16_t old_depth = *(uint16_t *) (&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]); @@ -448,6 +458,10 @@ voodoo_fb_writel(uint32_t addr, uint32_t val, void *priv) if ((params->fbzMode & FBZ_CHROMAKEY) && write_data.r == params->chromaKey_r && write_data.g == params->chromaKey_g && write_data.b == params->chromaKey_b) goto skip_pixel; + colbfog_r = write_data.r; + colbfog_g = write_data.g; + colbfog_b = write_data.b; + if (params->fogMode & FOG_ENABLE) { int32_t z = new_depth << 12; int64_t w_depth = new_depth; diff --git a/src/video/vid_voodoo_render.c b/src/video/vid_voodoo_render.c index 0f31fbc9f..d8f812f7f 100644 --- a/src/video/vid_voodoo_render.c +++ b/src/video/vid_voodoo_render.c @@ -967,6 +967,9 @@ voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t * int src_g = 0; int src_b = 0; int src_a = 0; + int colbfog_r = 0; + int colbfog_g = 0; + int colbfog_b = 0; int msel_r; int msel_g; int msel_b; @@ -1263,6 +1266,10 @@ voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t * if (cca_invert_output) src_a ^= 0xff; + colbfog_r = src_r; + colbfog_g = src_g; + colbfog_b = src_b; + if (params->fogMode & FOG_ENABLE) APPLY_FOG(src_r, src_g, src_b, state->z, state->ia, state->w);