From b0bff5007ce268f696792b00321495b65cd30c9c Mon Sep 17 00:00:00 2001 From: nerd73 Date: Fri, 9 Apr 2021 23:46:47 -0600 Subject: [PATCH 01/10] TMC PAT54PV supports 50 mhz FSB speed --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 3b0667b6f..6cdc5af37 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -285,7 +285,7 @@ const machine_t machines[] = { { "[i430FX] PC Partner MB500N", "mb500n", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 50000000, 66666667, 3380, 3520, 1.5, 3.0, MACHINE_PCI | MACHINE_IDE_DUAL, 8192, 131072, 8192, 127, machine_at_mb500n_init, NULL }, /* OPTi 596/597 */ - { "[OPTi 597] TMC PAT54PV", "pat54pv", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 60000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_VLB, 2048, 65536, 2048, 127, machine_at_pat54pv_init, NULL }, + { "[OPTi 597] TMC PAT54PV", "pat54pv", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, CPU_BLOCK(CPU_K5, CPU_5K86), 50000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_VLB, 2048, 65536, 2048, 127, machine_at_pat54pv_init, NULL }, /* OPTi 596/597/822 */ { "[OPTi 597] Shuttle HOT-543", "hot543", MACHINE_TYPE_SOCKET5, CPU_PKG_SOCKET5_7, 0, 60000000, 66666667, 3520, 3520, 1.5, 1.5, MACHINE_PCI | MACHINE_VLB, 8192, 131072, 8192, 127, machine_at_hot543_init, NULL }, From 8b6f9707d58e4dac258484aa66c4b6fd92beae55 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 11 Apr 2021 07:25:08 +0200 Subject: [PATCH 02/10] More CPU fixes, and SMM now implemented on Cyrix Cx486 and Cx5x86 CPU's as well as on Intel/AMI SX, DX, and SX2 CPU's. --- src/chipset/sis_85c496.c | 13 +++++- src/cpu/386_common.c | 40 ++++++++--------- src/cpu/386_ops.h | 92 ++++++++++++++++++++++++++++++++++++++++ src/cpu/cpu.c | 24 +++++++---- src/cpu/cpu.h | 5 +-- src/cpu/x86.c | 2 +- src/cpu/x86_ops.h | 2 + src/cpu/x86_ops_cyrix.h | 34 +++++++-------- src/cpu/x86_ops_pmode.h | 2 - src/cpu/x86seg.c | 12 ++++-- src/device/keyboard_at.c | 2 +- src/machine/machine.c | 2 +- 12 files changed, 168 insertions(+), 62 deletions(-) diff --git a/src/chipset/sis_85c496.c b/src/chipset/sis_85c496.c index f309e3a36..e06dc54c5 100644 --- a/src/chipset/sis_85c496.c +++ b/src/chipset/sis_85c496.c @@ -299,7 +299,7 @@ sis_85c49x_pci_write(int func, int addr, uint8_t val, void *priv) smram_disable_all(); - if (val & 0x06) { + if (val & 0x02) { host_base = 0x00060000; ram_base = 0x000a0000; size = 0x00010000; @@ -453,6 +453,12 @@ sis_85c49x_pci_read(int func, int addr, void *priv) uint8_t ret = dev->pci_conf[addr]; switch (addr) { + case 0xa0: + ret &= 0x10; + break; + case 0xa1: + ret = 0x00; + break; case 0x82: /*Port 22h Mirror*/ ret = dev->cur_reg; break; @@ -517,6 +523,7 @@ sis_85c496_reset(void *priv) sis_85c49x_pci_write(0, 0x58, 0x00, dev); sis_85c49x_pci_write(0, 0x59, 0x00, dev); sis_85c49x_pci_write(0, 0x5a, 0x00, dev); + // sis_85c49x_pci_write(0, 0x5a, 0x06, dev); for (i = 0; i < 8; i++) sis_85c49x_pci_write(0, 0x48 + i, 0x00, dev); @@ -589,7 +596,7 @@ static void pci_add_card(PCI_ADD_NORTHBRIDGE, sis_85c49x_pci_read, sis_85c49x_pci_write, dev); - sis_85c497_isa_reset(dev); + // sis_85c497_isa_reset(dev); dev->port_92 = device_add(&port_92_device); port_92_set_period(dev->port_92, 2ULL * TIMER_USEC); @@ -609,6 +616,8 @@ static void timer_add(&dev->rmsmiblk_timer, sis_85c496_rmsmiblk_count, dev, 0); + sis_85c496_reset(dev); + return dev; } diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index 9324976af..5aa1d4b3c 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -1027,7 +1027,7 @@ enter_smm(int in_hlt) uint32_t smram_state = smbase + 0x10000; /* If it's a CPU on which SMM is not supported, do nothing. */ - if (!is_am486 && !is_pentium && !is_k5 && !is_k6 && !is_p6 && !is_cx6x86) + if (!is_am486 && !is_pentium && !is_k5 && !is_k6 && !is_p6 && !is_cxsmm) return; x386_common_log("enter_smm(): smbase = %08X\n", smbase); @@ -1066,7 +1066,7 @@ enter_smm(int in_hlt) smram_backup_all(); smram_recalc_all(0); - if (cpu_iscyrix) { + if (is_cxsmm) { if (!(cyrix.smhr & SMHR_VALID)) cyrix.smhr = (cyrix.arr[3].base + cyrix.arr[3].size) | SMHR_VALID; smram_state = cyrix.smhr & SMHR_ADDR_MASK; @@ -1074,11 +1074,11 @@ enter_smm(int in_hlt) memset(saved_state, 0x00, SMM_SAVE_STATE_MAP_SIZE * sizeof(uint32_t)); - if (cpu_iscyrix) /* Cx6x86 */ + if (is_cxsmm) /* Cx6x86 */ smram_save_state_cyrix(saved_state, in_hlt); - if (is_pentium || is_am486) /* Am486 / 5x86 / Intel P5 (Pentium) */ + else if (is_pentium || is_am486) /* Am486 / 5x86 / Intel P5 (Pentium) */ smram_save_state_p5(saved_state, in_hlt); - else if (is_k5 || is_k6) /* AMD K5 and K6 */ + else if (is_k5 || is_k6) /* AMD K5 and K6 */ smram_save_state_amd_k(saved_state, in_hlt); else if (is_p6) /* Intel P6 (Pentium Pro, Pentium II, Celeron) */ smram_save_state_p6(saved_state, in_hlt); @@ -1091,8 +1091,11 @@ enter_smm(int in_hlt) dr[7] = 0x400; - if (cpu_iscyrix) { + if (is_cxsmm) { cpu_state.pc = 0x0000; + cpl_override = 1; + cyrix_write_seg_descriptor(smram_state - 0x20, &cpu_state.seg_cs); + cpl_override = 0; cpu_state.seg_cs.seg = (cyrix.arr[3].base >> 4); cpu_state.seg_cs.base = cyrix.arr[3].base; cpu_state.seg_cs.limit = 0xffffffff; @@ -1137,15 +1140,14 @@ enter_smm(int in_hlt) cpu_state.op32 = use32; cpl_override = 1; - if (cpu_iscyrix) { + if (is_cxsmm) { writememl(0, smram_state - 0x04, saved_state[0]); writememl(0, smram_state - 0x08, saved_state[1]); writememl(0, smram_state - 0x0c, saved_state[2]); writememl(0, smram_state - 0x10, saved_state[3]); writememl(0, smram_state - 0x14, saved_state[4]); writememl(0, smram_state - 0x18, saved_state[5]); - cyrix_write_seg_descriptor(smram_state - 0x20, &cpu_state.seg_cs); - writememl(0, smram_state - 0x18, saved_state[6]); + writememl(0, smram_state - 0x24, saved_state[6]); } else { for (n = 0; n < SMM_SAVE_STATE_MAP_SIZE; n++) { smram_state -= 4; @@ -1214,13 +1216,13 @@ leave_smm(void) uint32_t smram_state = smbase + 0x10000; /* If it's a CPU on which SMM is not supported (or not implemented in 86Box), do nothing. */ - if (!is_am486 && !is_pentium && !is_k5 && !is_k6 && !is_p6 && !is_cx6x86) + if (!is_am486 && !is_pentium && !is_k5 && !is_k6 && !is_p6 && !is_cxsmm) return; memset(saved_state, 0x00, SMM_SAVE_STATE_MAP_SIZE * sizeof(uint32_t)); cpl_override = 1; - if (cpu_iscyrix) { + if (is_cxsmm) { smram_state = cyrix.smhr & SMHR_ADDR_MASK; saved_state[0] = readmeml(0, smram_state - 0x04); saved_state[1] = readmeml(0, smram_state - 0x08); @@ -1246,13 +1248,13 @@ leave_smm(void) } x386_common_log("New SMBASE: %08X (%08X)\n", saved_state[SMRAM_FIELD_P5_SMBASE_OFFSET], saved_state[66]); - if (cpu_iscyrix) /* Cx6x86 */ + if (is_cxsmm) /* Cx6x86 */ smram_restore_state_cyrix(saved_state); - else if (is_pentium) /* Intel P5 (Pentium) */ + else if (is_pentium || is_am486) /* Am486 / 5x86 / Intel P5 (Pentium) */ smram_restore_state_p5(saved_state); - else if (is_k5 || is_k6) /* AMD K5 and K6 */ + else if (is_k5 || is_k6) /* AMD K5 and K6 */ smram_restore_state_amd_k(saved_state); - else if (is_p6) /* Intel P6 (Pentium Pro, Pentium II, Celeron) */ + else if (is_p6) /* Intel P6 (Pentium Pro, Pentium II, Celeron) */ smram_restore_state_p6(saved_state); in_smm = 0; @@ -1637,7 +1639,6 @@ sysenter(uint32_t fetchdat) cpu_state.seg_cs.base = 0; cpu_state.seg_cs.limit_low = 0; cpu_state.seg_cs.limit = 0xffffffff; - cpu_state.seg_cs.limit_raw = 0x000fffff; cpu_state.seg_cs.limit_high = 0xffffffff; cpu_state.seg_cs.access = 0x9b; cpu_state.seg_cs.ar_high = 0xcf; @@ -1648,7 +1649,6 @@ sysenter(uint32_t fetchdat) cpu_state.seg_ss.base = 0; cpu_state.seg_ss.limit_low = 0; cpu_state.seg_ss.limit = 0xffffffff; - cpu_state.seg_ss.limit_raw = 0x000fffff; cpu_state.seg_ss.limit_high = 0xffffffff; cpu_state.seg_ss.access = 0x93; cpu_state.seg_ss.ar_high = 0xcf; @@ -1726,7 +1726,6 @@ sysexit(uint32_t fetchdat) cpu_state.seg_cs.base = 0; cpu_state.seg_cs.limit_low = 0; cpu_state.seg_cs.limit = 0xffffffff; - cpu_state.seg_cs.limit_raw = 0x000fffff; cpu_state.seg_cs.limit_high = 0xffffffff; cpu_state.seg_cs.access = 0xfb; cpu_state.seg_cs.ar_high = 0xcf; @@ -1737,7 +1736,6 @@ sysexit(uint32_t fetchdat) cpu_state.seg_ss.base = 0; cpu_state.seg_ss.limit_low = 0; cpu_state.seg_ss.limit = 0xffffffff; - cpu_state.seg_ss.limit_raw = 0x000fffff; cpu_state.seg_ss.limit_high = 0xffffffff; cpu_state.seg_ss.access = 0xf3; cpu_state.seg_ss.ar_high = 0xcf; @@ -1789,7 +1787,6 @@ syscall_op(uint32_t fetchdat) cpu_state.seg_cs.base = 0; cpu_state.seg_cs.limit_low = 0; cpu_state.seg_cs.limit = 0xffffffff; - cpu_state.seg_cs.limit_raw = 0x000fffff; cpu_state.seg_cs.limit_high = 0xffffffff; cpu_state.seg_cs.access = 0x9b; cpu_state.seg_cs.ar_high = 0xcf; @@ -1801,7 +1798,6 @@ syscall_op(uint32_t fetchdat) cpu_state.seg_ss.base = 0; cpu_state.seg_ss.limit_low = 0; cpu_state.seg_ss.limit = 0xffffffff; - cpu_state.seg_ss.limit_raw = 0x000fffff; cpu_state.seg_ss.limit_high = 0xffffffff; cpu_state.seg_ss.access = 0x93; cpu_state.seg_ss.ar_high = 0xcf; @@ -1852,7 +1848,6 @@ sysret(uint32_t fetchdat) cpu_state.seg_cs.base = 0; cpu_state.seg_cs.limit_low = 0; cpu_state.seg_cs.limit = 0xffffffff; - cpu_state.seg_cs.limit_raw = 0x000fffff; cpu_state.seg_cs.limit_high = 0xffffffff; cpu_state.seg_cs.access = 0xfb; cpu_state.seg_cs.ar_high = 0xcf; @@ -1864,7 +1859,6 @@ sysret(uint32_t fetchdat) cpu_state.seg_ss.base = 0; cpu_state.seg_ss.limit_low = 0; cpu_state.seg_ss.limit = 0xffffffff; - cpu_state.seg_ss.limit_raw = 0x000fffff; cpu_state.seg_ss.limit_high = 0xffffffff; cpu_state.seg_ss.access = 0xf3; cpu_state.seg_cs.ar_high = 0xcf; diff --git a/src/cpu/386_ops.h b/src/cpu/386_ops.h index acfbb8532..b12c5476f 100644 --- a/src/cpu/386_ops.h +++ b/src/cpu/386_ops.h @@ -635,6 +635,98 @@ const OpFn OP_TABLE(486_0f)[1024] = /*e0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*f0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, }; + +const OpFn OP_TABLE(c486_0f)[1024] = +{ + /*16-bit data, 16-bit addr*/ +/* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ +/*00*/ op0F00_a16, op0F01_w_a16, opLAR_w_a16, opLSL_w_a16, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*30*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opRDSHR_a16, opWRSHR_a16, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + +/*40*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*50*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*60*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*70*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opSVDC_a16, opRSDC_a16, opSVLDT_a16, opRSLDT_a16, opSVTS_a16, opRSTS_a16, ILLEGAL, ILLEGAL, + +/*80*/ opJO_w, opJNO_w, opJB_w, opJNB_w, opJE_w, opJNE_w, opJBE_w, opJNBE_w, opJS_w, opJNS_w, opJP_w, opJNP_w, opJL_w, opJNL_w, opJLE_w, opJNLE_w, +/*90*/ opSETO_a16, opSETNO_a16, opSETB_a16, opSETNB_a16, opSETE_a16, opSETNE_a16, opSETBE_a16, opSETNBE_a16, opSETS_a16, opSETNS_a16, opSETP_a16, opSETNP_a16, opSETL_a16, opSETNL_a16, opSETLE_a16, opSETNLE_a16, +/*a0*/ opPUSH_FS_w, opPOP_FS_w, opCPUID, opBT_w_r_a16, opSHLD_w_i_a16, opSHLD_w_CL_a16,ILLEGAL, ILLEGAL, opPUSH_GS_w, opPOP_GS_w, opRSM, opBTS_w_r_a16, opSHRD_w_i_a16, opSHRD_w_CL_a16,ILLEGAL, opIMUL_w_w_a16, +/*b0*/ opCMPXCHG_b_a16,opCMPXCHG_w_a16,opLSS_w_a16, opBTR_w_r_a16, opLFS_w_a16, opLGS_w_a16, opMOVZX_w_b_a16,opMOVZX_w_w_a16,ILLEGAL, ILLEGAL, opBA_w_a16, opBTC_w_r_a16, opBSF_w_a16, opBSR_w_a16, opMOVSX_w_b_a16,ILLEGAL, + +/*c0*/ opXADD_b_a16, opXADD_w_a16, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opBSWAP_EAX, opBSWAP_ECX, opBSWAP_EDX, opBSWAP_EBX, opBSWAP_ESP, opBSWAP_EBP, opBSWAP_ESI, opBSWAP_EDI, +/*d0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*e0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*f0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + + /*32-bit data, 16-bit addr*/ +/* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ +/*00*/ op0F00_a16, op0F01_l_a16, opLAR_l_a16, opLSL_l_a16, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*30*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opRDSHR_a16, opWRSHR_a16, opSVDC_a16, opRSDC_a16, opSVLDT_a16, opRSLDT_a16, opSVTS_a16, opRSTS_a16, ILLEGAL, ILLEGAL, + +/*40*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*50*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*60*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*70*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + +/*80*/ opJO_l, opJNO_l, opJB_l, opJNB_l, opJE_l, opJNE_l, opJBE_l, opJNBE_l, opJS_l, opJNS_l, opJP_l, opJNP_l, opJL_l, opJNL_l, opJLE_l, opJNLE_l, +/*90*/ opSETO_a16, opSETNO_a16, opSETB_a16, opSETNB_a16, opSETE_a16, opSETNE_a16, opSETBE_a16, opSETNBE_a16, opSETS_a16, opSETNS_a16, opSETP_a16, opSETNP_a16, opSETL_a16, opSETNL_a16, opSETLE_a16, opSETNLE_a16, +/*a0*/ opPUSH_FS_l, opPOP_FS_l, opCPUID, opBT_l_r_a16, opSHLD_l_i_a16, opSHLD_l_CL_a16,ILLEGAL, ILLEGAL, opPUSH_GS_l, opPOP_GS_l, opRSM, opBTS_l_r_a16, opSHRD_l_i_a16, opSHRD_l_CL_a16,ILLEGAL, opIMUL_l_l_a16, +/*b0*/ opCMPXCHG_b_a16,opCMPXCHG_l_a16,opLSS_l_a16, opBTR_l_r_a16, opLFS_l_a16, opLGS_l_a16, opMOVZX_l_b_a16,opMOVZX_l_w_a16,ILLEGAL, ILLEGAL, opBA_l_a16, opBTC_l_r_a16, opBSF_l_a16, opBSR_l_a16, opMOVSX_l_b_a16,opMOVSX_l_w_a16, + +/*c0*/ opXADD_b_a16, opXADD_l_a16, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opBSWAP_EAX, opBSWAP_ECX, opBSWAP_EDX, opBSWAP_EBX, opBSWAP_ESP, opBSWAP_EBP, opBSWAP_ESI, opBSWAP_EDI, +/*d0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*e0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*f0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + + /*16-bit data, 32-bit addr*/ +/* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ +/*00*/ op0F00_a32, op0F01_w_a32, opLAR_w_a32, opLSL_w_a32, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*30*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opRDSHR_a32, opWRSHR_a32, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + +/*40*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*50*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*60*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*70*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opSVDC_a32, opRSDC_a32, opSVLDT_a32, opRSLDT_a32, opSVTS_a32, opRSTS_a32, ILLEGAL, ILLEGAL, + +/*80*/ opJO_w, opJNO_w, opJB_w, opJNB_w, opJE_w, opJNE_w, opJBE_w, opJNBE_w, opJS_w, opJNS_w, opJP_w, opJNP_w, opJL_w, opJNL_w, opJLE_w, opJNLE_w, +/*90*/ opSETO_a32, opSETNO_a32, opSETB_a32, opSETNB_a32, opSETE_a32, opSETNE_a32, opSETBE_a32, opSETNBE_a32, opSETS_a32, opSETNS_a32, opSETP_a32, opSETNP_a32, opSETL_a32, opSETNL_a32, opSETLE_a32, opSETNLE_a32, +/*a0*/ opPUSH_FS_w, opPOP_FS_w, opCPUID, opBT_w_r_a32, opSHLD_w_i_a32, opSHLD_w_CL_a32,ILLEGAL, ILLEGAL, opPUSH_GS_w, opPOP_GS_w, opRSM, opBTS_w_r_a32, opSHRD_w_i_a32, opSHRD_w_CL_a32,ILLEGAL, opIMUL_w_w_a32, +/*b0*/ opCMPXCHG_b_a32,opCMPXCHG_w_a32,opLSS_w_a32, opBTR_w_r_a32, opLFS_w_a32, opLGS_w_a32, opMOVZX_w_b_a32,opMOVZX_w_w_a32,ILLEGAL, ILLEGAL, opBA_w_a32, opBTC_w_r_a32, opBSF_w_a32, opBSR_w_a32, opMOVSX_w_b_a32,ILLEGAL, + +/*c0*/ opXADD_b_a32, opXADD_w_a32, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opBSWAP_EAX, opBSWAP_ECX, opBSWAP_EDX, opBSWAP_EBX, opBSWAP_ESP, opBSWAP_EBP, opBSWAP_ESI, opBSWAP_EDI, +/*d0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*e0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*f0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + + /*32-bit data, 32-bit addr*/ +/* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ +/*00*/ op0F00_a32, op0F01_l_a32, opLAR_l_a32, opLSL_l_a32, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*10*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*30*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opRDSHR_a32, opWRSHR_a32, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + +/*40*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*50*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*60*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*70*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opSVDC_a16, opRSDC_a16, opSVLDT_a16, opRSLDT_a16, opSVTS_a16, opRSTS_a16, ILLEGAL, ILLEGAL, + +/*80*/ opJO_l, opJNO_l, opJB_l, opJNB_l, opJE_l, opJNE_l, opJBE_l, opJNBE_l, opJS_l, opJNS_l, opJP_l, opJNP_l, opJL_l, opJNL_l, opJLE_l, opJNLE_l, +/*90*/ opSETO_a32, opSETNO_a32, opSETB_a32, opSETNB_a32, opSETE_a32, opSETNE_a32, opSETBE_a32, opSETNBE_a32, opSETS_a32, opSETNS_a32, opSETP_a32, opSETNP_a32, opSETL_a32, opSETNL_a32, opSETLE_a32, opSETNLE_a32, +/*a0*/ opPUSH_FS_l, opPOP_FS_l, opCPUID, opBT_l_r_a32, opSHLD_l_i_a32, opSHLD_l_CL_a32,ILLEGAL, ILLEGAL, opPUSH_GS_l, opPOP_GS_l, opRSM, opBTS_l_r_a32, opSHRD_l_i_a32, opSHRD_l_CL_a32,ILLEGAL, opIMUL_l_l_a32, +/*b0*/ opCMPXCHG_b_a32,opCMPXCHG_l_a32,opLSS_l_a32, opBTR_l_r_a32, opLFS_l_a32, opLGS_l_a32, opMOVZX_l_b_a32,opMOVZX_l_w_a32,ILLEGAL, ILLEGAL, opBA_l_a32, opBTC_l_r_a32, opBSF_l_a32, opBSR_l_a32, opMOVSX_l_b_a32,opMOVSX_l_w_a32, + +/*c0*/ opXADD_b_a32, opXADD_l_a32, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, opBSWAP_EAX, opBSWAP_ECX, opBSWAP_EDX, opBSWAP_EBX, opBSWAP_ESP, opBSWAP_EBP, opBSWAP_ESI, opBSWAP_EDI, +/*d0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*e0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*f0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +}; + const OpFn OP_TABLE(ibm486_0f)[1024] = { /*16-bit data, 16-bit addr*/ diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 4f31ab5ad..7d71744e9 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -110,7 +110,7 @@ int isa_cycles, is286, is386, is486 = 1, is486sx, is486dx, is486sx2, is486dx2, isdx4, cpu_isintel, cpu_iscyrix, hascache, isibm486, israpidcad, is_vpc, - is_am486, is_pentium, is_k5, is_k6, is_p6, is_cx6x86, hasfpu, + is_am486, is_486_org, is_pentium, is_k5, is_k6, is_p6, is_cxsmm, hasfpu, timing_rr, timing_mr, timing_mrl, timing_rm, timing_rml, timing_mm, timing_mml, timing_bt, timing_bnt, @@ -373,6 +373,8 @@ cpu_set(void) is486dx = (cpu_s->cpu_type >= CPU_i486DX) && (cpu_s->cpu_type < CPU_i486DX2); is486dx2 = (cpu_s->cpu_type >= CPU_i486DX2) && (cpu_s->cpu_type < CPU_iDX4); isdx4 = (cpu_s->cpu_type >= CPU_iDX4) && (cpu_s->cpu_type < CPU_WINCHIP); + is_486_org = (cpu_s->cpu_type == CPU_i486SX) || (cpu_s->cpu_type == CPU_i486DX) || + (cpu_s->cpu_type == CPU_Am486SX) || (cpu_s->cpu_type == CPU_Am486DX); is_am486 = !strcmp(cpu_f->manufacturer, "AMD") && (cpu_s->cpu_type >= CPU_Am486SX) && (cpu_s->cpu_type <= CPU_Am5x86); cpu_isintel = !strcmp(cpu_f->manufacturer, "Intel"); @@ -380,13 +382,13 @@ cpu_set(void) /* The 486DX2 and iDX4 have the same SMM save state table layout as Pentiums, and the WinChip datasheet claims those are Pentium-compatible as well. */ - is_pentium = (cpu_isintel && (cpu_s->cpu_type >= CPU_i486DX2) && (cpu_s->cpu_type < CPU_PENTIUMPRO)) || + is_pentium = (cpu_isintel && (cpu_s->cpu_type >= CPU_i486SX) && (cpu_s->cpu_type < CPU_PENTIUMPRO)) || !strcmp(cpu_f->manufacturer, "IDT"); is_k5 = !strcmp(cpu_f->manufacturer, "AMD") && (cpu_s->cpu_type > CPU_Am5x86); is_k6 = (cpu_s->cpu_type >= CPU_K6) && !strcmp(cpu_f->manufacturer, "AMD"); /* The Samuel 2 datasheet claims it's Celeron-compatible. */ is_p6 = (cpu_isintel && (cpu_s->cpu_type >= CPU_PENTIUMPRO)) || !strcmp(cpu_f->manufacturer, "VIA"); - is_cx6x86 = !strcmp(cpu_f->manufacturer, "Cyrix") && (cpu_s->cpu_type > CPU_Cx5x86); + is_cxsmm = !strcmp(cpu_f->manufacturer, "Cyrix") && (cpu_s->cpu_type >= CPU_Cx486S); hasfpu = (fpu_type != FPU_NONE); hascache = (cpu_s->cpu_type >= CPU_486SLC) || (cpu_s->cpu_type == CPU_IBM386SLC) || @@ -816,9 +818,9 @@ cpu_set(void) case CPU_Cx486DX2: case CPU_Cx486DX4: #ifdef USE_DYNAREC - x86_setopcodes(ops_386, ops_486_0f, dynarec_ops_386, dynarec_ops_486_0f); + x86_setopcodes(ops_386, ops_c486_0f, dynarec_ops_386, dynarec_ops_c486_0f); #else - x86_setopcodes(ops_386, ops_486_0f); + x86_setopcodes(ops_386, ops_c486_0f); #endif timing_rr = 1; /* register dest - register src */ @@ -856,9 +858,9 @@ cpu_set(void) case CPU_Cx5x86: #ifdef USE_DYNAREC - x86_setopcodes(ops_386, ops_486_0f, dynarec_ops_386, dynarec_ops_486_0f); + x86_setopcodes(ops_386, ops_c486_0f, dynarec_ops_386, dynarec_ops_c486_0f); #else - x86_setopcodes(ops_386, ops_486_0f); + x86_setopcodes(ops_386, ops_c486_0f); #endif timing_rr = 1; /* register dest - register src */ @@ -1027,7 +1029,6 @@ cpu_set(void) case CPU_Cx6x86MX: if (cpu_s->cpu_type == CPU_Cx6x86MX) { #ifdef USE_DYNAREC - x86_setopcodes(ops_386, ops_c6x86mx_0f, dynarec_ops_386, dynarec_ops_c6x86mx_0f); x86_dynarec_opcodes_da_a16 = dynarec_ops_fpu_686_da_a16; x86_dynarec_opcodes_da_a32 = dynarec_ops_fpu_686_da_a32; x86_dynarec_opcodes_db_a16 = dynarec_ops_fpu_686_db_a16; @@ -1049,7 +1050,8 @@ cpu_set(void) else if (cpu_s->cpu_type == CPU_Cx6x86L) x86_setopcodes(ops_386, ops_pentium_0f, dynarec_ops_386, dynarec_ops_pentium_0f); else - x86_setopcodes(ops_386, ops_c6x86_0f, dynarec_ops_386, dynarec_ops_c6x86_0f); + x86_setopcodes(ops_386, ops_c6x86mx_0f, dynarec_ops_386, dynarec_ops_c6x86mx_0f); + // x86_setopcodes(ops_386, ops_c6x86_0f, dynarec_ops_386, dynarec_ops_c6x86_0f); #else if (cpu_s->cpu_type == CPU_Cx6x86MX) x86_setopcodes(ops_386, ops_c6x86mx_0f); @@ -2935,23 +2937,27 @@ cpu_write(uint16_t addr, uint8_t val, void *priv) ccr2 = val; break; case 0xc3: /* CCR3 */ + pclog("CC3 WRITE: %02X\n", val); if ((ccr3 & CCR3_SMI_LOCK) && !in_smm) val = (val & ~(CCR3_NMI_EN)) | (ccr3 & CCR3_NMI_EN) | CCR3_SMI_LOCK; ccr3 = val; break; case 0xcd: + pclog("ARR3_24 WRITE: %02X\n", val); if (!(ccr3 & CCR3_SMI_LOCK) || in_smm) { cyrix.arr[3].base = (cyrix.arr[3].base & ~0xff000000) | (val << 24); cyrix.smhr &= ~SMHR_VALID; } break; case 0xce: + pclog("ARR3_16 WRITE: %02X\n", val); if (!(ccr3 & CCR3_SMI_LOCK) || in_smm) { cyrix.arr[3].base = (cyrix.arr[3].base & ~0x00ff0000) | (val << 16); cyrix.smhr &= ~SMHR_VALID; } break; case 0xcf: + pclog("ARR3_08 WRITE: %02X\n", val); if (!(ccr3 & CCR3_SMI_LOCK) || in_smm) { cyrix.arr[3].base = (cyrix.arr[3].base & ~0x0000f000) | ((val & 0xf0) << 8); if ((val & 0xf) == 0xf) diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 2ebd1362e..2a9996a06 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -218,8 +218,7 @@ typedef struct { uint8_t access, ar_high; int8_t checked; /*Non-zero if selector is known to be valid*/ uint16_t seg; - uint32_t base, - limit, limit_raw, + uint32_t base, limit, limit_low, limit_high; } x86seg; @@ -484,7 +483,7 @@ extern int cpu_cyrix_alignment; /*Cyrix 5x86/6x86 only has data misalignment penalties when crossing 8-byte boundaries*/ extern int is8086, is286, is386, is486, is486sx, is486dx, is486sx2, is486dx2, isdx4; -extern int is_am486, is_pentium, is_k5, is_k6, is_p6, is_cx6x86; +extern int is_am486, is_486_org, is_pentium, is_k5, is_k6, is_p6, is_cxsmm; extern int hascache; extern int isibm486; extern int is_rapidcad; diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 70ef37701..f8e13764e 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -281,7 +281,7 @@ reset_common(int hard) smi_block = 0; if (hard) { - smbase = 0x00030000; + smbase = is_486_org ? 0x00060000 : 0x00030000; ppi_reset(); } in_sys = 0; diff --git a/src/cpu/x86_ops.h b/src/cpu/x86_ops.h index 1e81b386a..dc0d62782 100644 --- a/src/cpu/x86_ops.h +++ b/src/cpu/x86_ops.h @@ -79,6 +79,7 @@ extern const OpFn dynarec_ops_386[1024]; extern const OpFn dynarec_ops_386_0f[1024]; extern const OpFn dynarec_ops_486_0f[1024]; +extern const OpFn dynarec_ops_c486_0f[1024]; extern const OpFn dynarec_ops_ibm486_0f[1024]; extern const OpFn dynarec_ops_winchip_0f[1024]; @@ -176,6 +177,7 @@ extern const OpFn ops_386[1024]; extern const OpFn ops_386_0f[1024]; extern const OpFn ops_486_0f[1024]; +extern const OpFn ops_c486_0f[1024]; extern const OpFn ops_ibm486_0f[1024]; extern const OpFn ops_winchip_0f[1024]; diff --git a/src/cpu/x86_ops_cyrix.h b/src/cpu/x86_ops_cyrix.h index e6464ce84..9ca01a9b3 100644 --- a/src/cpu/x86_ops_cyrix.h +++ b/src/cpu/x86_ops_cyrix.h @@ -35,7 +35,7 @@ static void opSVDC_common(uint32_t fetchdat) } static int opSVDC_a16(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_16(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); @@ -48,7 +48,7 @@ static int opSVDC_a16(uint32_t fetchdat) } static int opSVDC_a32(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_32(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); @@ -86,7 +86,7 @@ static void opRSDC_common(uint32_t fetchdat) } static int opRSDC_a16(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_16(fetchdat); SEG_CHECK_READ(cpu_state.ea_seg); @@ -99,7 +99,7 @@ static int opRSDC_a16(uint32_t fetchdat) } static int opRSDC_a32(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_32(fetchdat); SEG_CHECK_READ(cpu_state.ea_seg); @@ -113,7 +113,7 @@ static int opRSDC_a32(uint32_t fetchdat) static int opSVLDT_a16(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_16(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); @@ -127,7 +127,7 @@ static int opSVLDT_a16(uint32_t fetchdat) } static int opSVLDT_a32(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_32(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); @@ -142,7 +142,7 @@ static int opSVLDT_a32(uint32_t fetchdat) static int opRSLDT_a16(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_16(fetchdat); SEG_CHECK_READ(cpu_state.ea_seg); @@ -155,7 +155,7 @@ static int opRSLDT_a16(uint32_t fetchdat) } static int opRSLDT_a32(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_32(fetchdat); SEG_CHECK_READ(cpu_state.ea_seg); @@ -169,7 +169,7 @@ static int opRSLDT_a32(uint32_t fetchdat) static int opSVTS_a16(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_16(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); @@ -183,7 +183,7 @@ static int opSVTS_a16(uint32_t fetchdat) } static int opSVTS_a32(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_32(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); @@ -198,7 +198,7 @@ static int opSVTS_a32(uint32_t fetchdat) static int opRSTS_a16(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_16(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); @@ -212,7 +212,7 @@ static int opRSTS_a16(uint32_t fetchdat) } static int opRSTS_a32(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) { fetch_ea_32(fetchdat); SEG_CHECK_WRITE(cpu_state.ea_seg); @@ -227,7 +227,7 @@ static int opRSTS_a32(uint32_t fetchdat) static int opSMINT(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) fatal("opSMINT\n"); else x86illegal(); @@ -237,7 +237,7 @@ static int opSMINT(uint32_t fetchdat) static int opRDSHR_a16(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) fatal("opRDSHR_a16\n"); else x86illegal(); @@ -246,7 +246,7 @@ static int opRDSHR_a16(uint32_t fetchdat) } static int opRDSHR_a32(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) fatal("opRDSHR_a32\n"); else x86illegal(); @@ -256,7 +256,7 @@ static int opRDSHR_a32(uint32_t fetchdat) static int opWRSHR_a16(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) fatal("opWRSHR_a16\n"); else x86illegal(); @@ -265,7 +265,7 @@ static int opWRSHR_a16(uint32_t fetchdat) } static int opWRSHR_a32(uint32_t fetchdat) { - if (cpu_cur_status & CPU_STATUS_SMM) + if (in_smm) fatal("opWRSHR_a32\n"); else x86illegal(); diff --git a/src/cpu/x86_ops_pmode.h b/src/cpu/x86_ops_pmode.h index b372da126..b031fac22 100644 --- a/src/cpu/x86_ops_pmode.h +++ b/src/cpu/x86_ops_pmode.h @@ -198,7 +198,6 @@ static int op0F00_common(uint32_t fetchdat, int ea32) granularity = readmemb(0, addr + 6) & 0x80; if (cpu_state.abrt) return 1; ldt.limit = limit; - ldt.limit_raw = limit; ldt.access = access; ldt.ar_high = ar_high; if (granularity) @@ -232,7 +231,6 @@ static int op0F00_common(uint32_t fetchdat, int ea32) if (cpu_state.abrt) return 1; tr.seg = sel; tr.limit = limit; - tr.limit_raw = limit; tr.access = access; tr.ar_high = ar_high; if (granularity) diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index a9c3923c8..1304f041c 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -227,7 +227,6 @@ void do_seg_load(x86seg *s, uint16_t *segdat) { s->limit = segdat[0] | ((segdat[3] & 0x000f) << 16); - s->limit_raw = s->limit; if (segdat[3] & 0x0080) s->limit = (s->limit << 12) | 0xfff; s->base = segdat[1] | ((segdat[2] & 0x00ff) << 16); @@ -2382,9 +2381,14 @@ taskswitch286(uint16_t seg, uint16_t *segdat, int is32) void cyrix_write_seg_descriptor(uint32_t addr, x86seg *seg) { - writememl(0, addr, (seg->limit_raw & 0xffff) | (seg->base << 16)); + uint32_t limit_raw = seg->limit; + + if (seg->ar_high & 0x80) + limit_raw >>= 12; + + writememl(0, addr, (limit_raw & 0xffff) | (seg->base << 16)); writememl(0, addr + 4, ((seg->base >> 16) & 0xff) | (seg->access << 8) | - (seg->limit_raw & 0xf0000) | (seg->ar_high << 16) | + (limit_raw & 0xf0000) | (seg->ar_high << 16) | (seg->base & 0xff000000)); } @@ -2420,4 +2424,6 @@ cyrix_load_seg_descriptor(uint32_t addr, x86seg *seg) codegen_flat_ss = 0; } } + + pclog("clsd(): NEW CS:IP = %04X:%08X (%08X)\n", CS, cpu_state.pc, cs + cpu_state.pc); } diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index f6b9f7be0..600c61bb4 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -1061,7 +1061,7 @@ write_output(atkbd_t *dev, uint8_t val) /* Pin 0 selected. */ softresetx86(); /*Pulse reset!*/ cpu_set_edx(); - smbase = 0x00030000; + smbase = is_486_org ? 0x00060000 : 0x00030000; } } /* Mask off the A20 stuff because we use mem_a20_key directly for that. */ diff --git a/src/machine/machine.c b/src/machine/machine.c index e3869c970..045e81c30 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -81,7 +81,7 @@ machine_init_ex(int m) /* Reset the memory state. */ mem_reset(); - smbase = 0x00030000; + smbase = is_486_org ? 0x00060000 : 0x00030000; lpt_init(); } From 9587a254bcb8f978e8431250b90473fb6b9b5329 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 11 Apr 2021 07:30:01 +0200 Subject: [PATCH 03/10] Removed excess logging from cpu/cpu.c. --- src/cpu/cpu.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 7d71744e9..191754d7f 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -2937,27 +2937,23 @@ cpu_write(uint16_t addr, uint8_t val, void *priv) ccr2 = val; break; case 0xc3: /* CCR3 */ - pclog("CC3 WRITE: %02X\n", val); if ((ccr3 & CCR3_SMI_LOCK) && !in_smm) val = (val & ~(CCR3_NMI_EN)) | (ccr3 & CCR3_NMI_EN) | CCR3_SMI_LOCK; ccr3 = val; break; case 0xcd: - pclog("ARR3_24 WRITE: %02X\n", val); if (!(ccr3 & CCR3_SMI_LOCK) || in_smm) { cyrix.arr[3].base = (cyrix.arr[3].base & ~0xff000000) | (val << 24); cyrix.smhr &= ~SMHR_VALID; } break; case 0xce: - pclog("ARR3_16 WRITE: %02X\n", val); if (!(ccr3 & CCR3_SMI_LOCK) || in_smm) { cyrix.arr[3].base = (cyrix.arr[3].base & ~0x00ff0000) | (val << 16); cyrix.smhr &= ~SMHR_VALID; } break; case 0xcf: - pclog("ARR3_08 WRITE: %02X\n", val); if (!(ccr3 & CCR3_SMI_LOCK) || in_smm) { cyrix.arr[3].base = (cyrix.arr[3].base & ~0x0000f000) | ((val & 0xf0) << 8); if ((val & 0xf) == 0xf) From 5223f8af3d5520dff63bc36ed6f353f0202b854f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 11 Apr 2021 07:36:12 +0200 Subject: [PATCH 04/10] Removed x86_ops_cyrix.h from the Dev branch. --- src/cpu/386_ops.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/cpu/386_ops.h b/src/cpu/386_ops.h index b12c5476f..a66913a4f 100644 --- a/src/cpu/386_ops.h +++ b/src/cpu/386_ops.h @@ -170,9 +170,7 @@ extern void x386_dynarec_log(const char *fmt, ...); #include "x86_ops_bcd.h" #include "x86_ops_bit.h" #include "x86_ops_bitscan.h" -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) #include "x86_ops_cyrix.h" -#endif #include "x86_ops_flag.h" #include "x86_ops_fpu.h" #include "x86_ops_inc_dec.h" From 7aac3a3d21a721f9217144914f4c47b763b27049 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 11 Apr 2021 08:30:46 +0200 Subject: [PATCH 05/10] Removed more excess logging. --- src/cpu/x86_ops_cyrix.h | 2 -- src/cpu/x86seg.c | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/cpu/x86_ops_cyrix.h b/src/cpu/x86_ops_cyrix.h index 9ca01a9b3..500b119fb 100644 --- a/src/cpu/x86_ops_cyrix.h +++ b/src/cpu/x86_ops_cyrix.h @@ -29,7 +29,6 @@ static void opSVDC_common(uint32_t fetchdat) writememw(0, easeg+cpu_state.eaaddr+8, GS); break; default: - pclog("opSVDC: unknown rmdat %02x\n", rmdat); x86illegal(); } } @@ -80,7 +79,6 @@ static void opRSDC_common(uint32_t fetchdat) cyrix_load_seg_descriptor(easeg+cpu_state.eaaddr, &cpu_state.seg_gs); break; default: - pclog("opRSDC: unknown rmdat %02x\n", rmdat); x86illegal(); } } diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index 1304f041c..763ca1358 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -2424,6 +2424,4 @@ cyrix_load_seg_descriptor(uint32_t addr, x86seg *seg) codegen_flat_ss = 0; } } - - pclog("clsd(): NEW CS:IP = %04X:%08X (%08X)\n", CS, cpu_state.pc, cs + cpu_state.pc); } From da82b11b29e7ef2dfbd11dc1550a8c8859e914cf Mon Sep 17 00:00:00 2001 From: Panagiotis <58827426+tiseno100@users.noreply.github.com> Date: Sun, 11 Apr 2021 15:33:11 +0300 Subject: [PATCH 06/10] Few minor changes on the Intel i450KX --- src/chipset/intel_i450kx.c | 27 ++++++++------------------- src/win/86Box.rc | 2 +- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/chipset/intel_i450kx.c b/src/chipset/intel_i450kx.c index f4779546c..3435dc8ae 100644 --- a/src/chipset/intel_i450kx.c +++ b/src/chipset/intel_i450kx.c @@ -66,9 +66,9 @@ i450kx_log(const char *fmt, ...) /* SMRAM */ #define SMRAM_ADDR (((dev->pb_pci_conf[0xb9] << 8) | dev->pb_pci_conf[0xb8]) << 17) -#define SMRAM_SIZE (1 << (((dev->pb_pci_conf[0xbb] >> 4) + 1) * 16)) #define SMRAM_ADDR_MC (((dev->mc_pci_conf[0xb9] << 8) | dev->mc_pci_conf[0xb8]) << 16) -#define SMRAM_SIZE_MC (1 << (((dev->mc_pci_conf[0xbb] >> 4) + 1) * 16)) +#define SMRAM_SIZE (((dev->pb_pci_conf[0xbb] >> 4) + 1) * 64) +#define SMRAM_SIZE_MC (((dev->mc_pci_conf[0xbb] >> 4) + 1) * 64) /* Miscellaneous */ #define ENABLE_SEGMENT (MEM_READ_EXTANY | MEM_WRITE_EXTANY) @@ -101,10 +101,7 @@ void i450kx_smm(uint32_t smram_addr, uint32_t smram_size, i450kx_t *dev) smram_disable_all(); if ((smram_addr != 0) && !!(dev->mc_pci_conf[0x57] & 8)) - { smram_enable(dev->smram, smram_addr, smram_addr, smram_size, !!(dev->pb_pci_conf[0x57] & 8), 1); - mem_set_mem_state_smram_ex(1, smram_addr, smram_size, 0x03); - } flushmmucache(); } @@ -263,11 +260,7 @@ pb_write(int func, int addr, uint8_t val, void *priv) case 0xb8: case 0xb9: case 0xbb: - if (addr == 0xbb) - dev->pb_pci_conf[addr] = val & 0xf0; - else - dev->pb_pci_conf[addr] = val; - + dev->pb_pci_conf[addr] = !(addr == 0xbb) ? val : (val & 0xf0); i450kx_smm(SMRAM_ADDR, SMRAM_SIZE, dev); break; @@ -324,7 +317,6 @@ mc_write(int func, int addr, uint8_t val, void *priv) case 0x58: dev->mc_pci_conf[addr] = val & 2; - mem_set_mem_state_both(0xa0000, 0x20000, (val & 2) ? ENABLE_SEGMENT : DISABLE_SEGMENT); break; case 0x59: @@ -354,8 +346,8 @@ mc_write(int func, int addr, uint8_t val, void *priv) case 0x6d: case 0x6e: case 0x6f: - dev->mc_pci_conf[addr] = ((addr & 0x0f) % 2) ? val : (val & 7); - spd_write_drbs(dev->mc_pci_conf, 0x60, 0x6f, 1); + dev->mc_pci_conf[addr] = ((addr & 0x0f) % 2) ? 0 : (val & 0x7f); + spd_write_drbs(dev->mc_pci_conf, 0x60, 0x6f, 4); break; case 0x74: @@ -447,10 +439,7 @@ mc_write(int func, int addr, uint8_t val, void *priv) case 0xb8: case 0xb9: case 0xbb: - if (addr == 0xbb) - dev->mc_pci_conf[addr] = val & 0xf0; - else - dev->mc_pci_conf[addr] = val; + dev->mc_pci_conf[addr] = !(addr == 0xbb) ? val : (val & 0xf0); i450kx_smm(SMRAM_ADDR_MC, SMRAM_SIZE_MC, dev); break; @@ -500,7 +489,7 @@ i450kx_reset(void *priv) dev->pb_pci_conf[0x05] = 4; dev->pb_pci_conf[0x06] = 0x40; dev->pb_pci_conf[0x07] = 2; - dev->pb_pci_conf[0x08] = 1; + dev->pb_pci_conf[0x08] = 2; dev->pb_pci_conf[0x0b] = 6; dev->pb_pci_conf[0x0c] = 8; dev->pb_pci_conf[0x0d] = 0x20; @@ -526,7 +515,7 @@ i450kx_reset(void *priv) dev->mc_pci_conf[0x02] = 0xc5; dev->mc_pci_conf[0x03] = 0x84; dev->mc_pci_conf[0x06] = 0x80; - dev->mc_pci_conf[0x08] = 1; + dev->mc_pci_conf[0x08] = 4; dev->mc_pci_conf[0x0b] = 5; dev->mc_pci_conf[0x49] = 0x14; dev->mc_pci_conf[0x4c] = 0x0b; diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 2fc62098e..6bdf861ae 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -1018,7 +1018,7 @@ BEGIN IDS_2123 "Save" IDS_2124 "About 86Box" IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information." + IDS_2126 "An emulator of old computers\n\nAuthors: Miran Grca (OBattler), Sarah Walker, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information." IDS_2127 "OK" IDS_2128 "Hardware not available" #ifdef _WIN32 From b6b5558aa36471f80c6472065393910d1543ea32 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 12 Apr 2021 03:42:03 +0200 Subject: [PATCH 07/10] Added the ability to size the window to a specific resolution, closes #1362; Fixed unsolicited mouse captures after a double-click in an open file dialog, fixes #1367. --- src/include/86box/resource.h | 9 +- src/include/86box/win.h | 4 + src/win/86Box.rc | 20 +++++ src/win/Makefile.mingw | 2 +- src/win/win_specify_dim.c | 157 +++++++++++++++++++++++++++++++++++ src/win/win_ui.c | 35 +++++--- 6 files changed, 213 insertions(+), 14 deletions(-) create mode 100644 src/win/win_specify_dim.c diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 28abd983b..27f8f8d0e 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -28,6 +28,7 @@ #define DLG_STATUS 102 /* top-level dialog */ #define DLG_SND_GAIN 103 /* top-level dialog */ #define DLG_NEW_FLOPPY 104 /* top-level dialog */ +#define DLG_SPECIFY_DIM 105 /* top-level dialog */ #define DLG_CONFIG 110 /* top-level dialog */ #define DLG_CFG_MACHINE 111 /* sub-dialog of config */ #define DLG_CFG_VIDEO 112 /* sub-dialog of config */ @@ -256,7 +257,6 @@ #define IDC_COMBO_DISK_SIZE 1201 #define IDC_COMBO_RPM_MODE 1202 - /* For the DeviceConfig code, re-do later. */ #define IDC_CONFIG_BASE 1300 #define IDC_CONFIGURE_VID 1300 @@ -277,6 +277,10 @@ #define IDC_RENDER 1381 #define IDC_STATUS 1382 +#define IDC_EDIT_WIDTH 1400 /* specify main window dimensions dialog */ +#define IDC_WIDTHSPIN 1401 +#define IDC_EDIT_HEIGHT 1402 +#define IDC_HEIGHTSPIN 1403 #define IDM_ABOUT 40001 #define IDC_ABOUT_ICON 65535 @@ -308,12 +312,13 @@ #define IDM_VID_SCALE_2X 40056 #define IDM_VID_SCALE_3X 40057 #define IDM_VID_SCALE_4X 40058 -#define IDM_VID_HIDPI 40059 +#define IDM_VID_HIDPI 40059 #define IDM_VID_FULLSCREEN 40060 #define IDM_VID_FS_FULL 40061 #define IDM_VID_FS_43 40062 #define IDM_VID_FS_KEEPRATIO 40063 #define IDM_VID_FS_INT 40064 +#define IDM_VID_SPECIFY_DIM 40065 #define IDM_VID_FORCE43 40066 #define IDM_VID_OVERSCAN 40067 #define IDM_VID_INVERT 40069 diff --git a/src/include/86box/win.h b/src/include/86box/win.h index 7c642cbc2..0f0162c11 100644 --- a/src/include/86box/win.h +++ b/src/include/86box/win.h @@ -174,6 +174,10 @@ extern void SoundGainDialogCreate(HWND hwnd); extern void NewFloppyDialogCreate(HWND hwnd, int id, int part); +/* Functions in win_specify_dim.c: */ +extern void SpecifyDimensionsDialogCreate(HWND hwnd); + + /* Functions in win_settings.c: */ #define SETTINGS_PAGE_MACHINE 0 #define SETTINGS_PAGE_VIDEO 1 diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 2fc62098e..cfa2275ab 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -71,6 +71,7 @@ BEGIN #endif END MENUITEM SEPARATOR + MENUITEM "Specify dimensions", IDM_VID_SPECIFY_DIM MENUITEM "F&orce 4:3 display ratio", IDM_VID_FORCE43 POPUP "&Window scale factor" BEGIN @@ -342,6 +343,25 @@ BEGIN #endif END +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 47 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Specify Main Window Dimensions" +FONT 9, "Segoe UI" +BEGIN + LTEXT "Width:",IDT_1709,7,9,24,12 + EDITTEXT IDC_EDIT_WIDTH,33,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_WIDTHSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,76,6, + 12,12 + LTEXT "Height:",IDT_1710,97,9,24,12 + EDITTEXT IDC_EDIT_HEIGHT,123,7,45,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | + UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, + 12,12 + DEFPUSHBUTTON "OK",IDOK,30,26,50,14 + PUSHBUTTON "Cancel",IDCANCEL,99,26,50,14 +END + DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 STYLE DS_CONTROL | WS_CHILD FONT 9, "Segoe UI" diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 1c9245198..7f493d925 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -447,7 +447,7 @@ else UIOBJ := win_ui.o win_stbar.o \ win_sdl.o \ win_dialog.o win_about.o \ - win_settings.o win_devconf.o win_snd_gain.o \ + win_settings.o win_devconf.o win_snd_gain.o win_specify_dim.o \ win_new_floppy.o win_jsconf.o win_media_menu.o endif diff --git a/src/win/win_specify_dim.c b/src/win/win_specify_dim.c new file mode 100644 index 000000000..42bc4edd3 --- /dev/null +++ b/src/win/win_specify_dim.c @@ -0,0 +1,157 @@ +/* + * 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. + * + * Handle the dialog for specifying the dimensions of the main window. + * + * + * + * Authors: Miran Grca, + * + * Copyright 2016-2018 Miran Grca. + */ +#define UNICODE +#define BITMAP WINDOWS_BITMAP +#include +#include +#undef BITMAP +#include +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/config.h> +#include <86box/plat.h> +#include <86box/sound.h> +#include <86box/win.h> + + +#if defined(__amd64__) || defined(__aarch64__) +static LRESULT CALLBACK +#else +static BOOL CALLBACK +#endif +SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + HWND h, h2; + HMENU hmenu; + UDACCEL accel, accel2; + RECT r; + uint32_t temp_x = 0, temp_y = 0; + int dpi = 96; + LPTSTR lptsTemp; + char *stransi; + + switch (message) { + case WM_INITDIALOG: + GetWindowRect(hwndRender, &r); + + h = GetDlgItem(hdlg, IDC_WIDTHSPIN); + h2 = GetDlgItem(hdlg, IDC_EDIT_WIDTH); + SendMessage(h, UDM_SETBUDDY, (WPARAM)h2, 0); + SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048); + accel.nSec = 0; + accel.nInc = 8; + SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel); + SendMessage(h, UDM_SETPOS, 0, r.right - r.left); + + h = GetDlgItem(hdlg, IDC_HEIGHTSPIN); + h2 = GetDlgItem(hdlg, IDC_EDIT_HEIGHT); + SendMessage(h, UDM_SETBUDDY, (WPARAM)h2, 0); + SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048); + accel2.nSec = 0; + accel2.nInc = 8; + SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel2); + SendMessage(h, UDM_SETPOS, 0, r.bottom - r.top); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR)); + stransi = (char *)malloc(512); + + h = GetDlgItem(hdlg, IDC_EDIT_WIDTH); + SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp); + wcstombs(stransi, lptsTemp, 512); + sscanf(stransi, "%u", &temp_x); + + h = GetDlgItem(hdlg, IDC_EDIT_HEIGHT); + SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp); + wcstombs(stransi, lptsTemp, 512); + sscanf(stransi, "%u", &temp_y); + + window_remember = 1; + vid_resize = 1; + hmenu = GetMenu(hwndMain); + CheckMenuItem(hmenu, IDM_VID_RESIZE, MF_CHECKED); + + SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE); + + /* scale the screen base on DPI */ + if (dpi_scale) { + dpi = win_get_dpi(hwndMain); + temp_x = MulDiv(temp_x, dpi, 96); + temp_y = MulDiv(temp_y, dpi, 96); + } else { + temp_x = temp_x; + temp_y = temp_y; + } + + ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height); + + if (mouse_capture) + ClipCursor(&r); + + CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED); + scale = 1; + EnableMenuItem(hmenu, IDM_VID_SCALE_1X, MF_GRAYED); + EnableMenuItem(hmenu, IDM_VID_SCALE_2X, MF_GRAYED); + EnableMenuItem(hmenu, IDM_VID_SCALE_3X, MF_GRAYED); + EnableMenuItem(hmenu, IDM_VID_SCALE_4X, MF_GRAYED); + + scrnsz_x = temp_x; + scrnsz_y = temp_y; + doresize = 1; + + CheckMenuItem(hmenu, IDM_VID_REMEMBER, MF_CHECKED); + GetWindowRect(hwndMain, &r); + window_x = r.left; + window_y = r.top; + window_w = r.right - r.left; + window_h = r.bottom - r.top; + + config_save(); + + free(stransi); + free(lptsTemp); + + EndDialog(hdlg, 0); + return TRUE; + + case IDCANCEL: + EndDialog(hdlg, 0); + return TRUE; + + default: + break; + } + break; + } + + return(FALSE); +} + + +void +SpecifyDimensionsDialogCreate(HWND hwnd) +{ + DialogBox(hinstance, (LPCTSTR)DLG_SPECIFY_DIM, hwnd, SpecifyDimensionsDialogProcedure); +} diff --git a/src/win/win_ui.c b/src/win/win_ui.c index de0dba0d8..e690a0706 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -61,9 +61,9 @@ HWND hwndMain, /* application main window */ HMENU menuMain; /* application main menu */ HICON hIcon[256]; /* icon data loaded from resources */ RECT oldclip; /* mouse rect */ -int sbar_height = 23; /* statusbar height */ +int sbar_height = 23; /* statusbar height */ int minimized = 0; -int infocus = 1; +int infocus = 1, button_down = 0; int rctrl_is_lalt = 0; int user_resize = 0; @@ -456,10 +456,14 @@ input_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) #endif break; + case WM_LBUTTONDOWN: + button_down |= 1; + break; + case WM_LBUTTONUP: - pclog("video_fullscreen = %i\n", video_fullscreen); - if (! video_fullscreen) + if ((button_down & 1) && !video_fullscreen) plat_mouse_capture(1); + button_down &= ~1; break; case WM_MBUTTONUP: @@ -511,12 +515,12 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; #ifdef MTR_ENABLED - case IDM_ACTION_BEGIN_TRACE: - case IDM_ACTION_END_TRACE: - case IDM_ACTION_TRACE: - tracing_on = !tracing_on; - handle_trace(hmenu, tracing_on); - break; + case IDM_ACTION_BEGIN_TRACE: + case IDM_ACTION_END_TRACE: + case IDM_ACTION_TRACE: + tracing_on = !tracing_on; + handle_trace(hmenu, tracing_on); + break; #endif case IDM_ACTION_HRESET: @@ -696,6 +700,10 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) config_save(); break; + case IDM_VID_SPECIFY_DIM: + SpecifyDimensionsDialogCreate(hwnd); + break; + case IDM_VID_FORCE43: video_toggle_option(hmenu, &force_43, IDM_VID_FORCE43); video_force_resize_set(1); @@ -1063,9 +1071,14 @@ static LRESULT CALLBACK SubWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { + case WM_LBUTTONDOWN: + button_down |= 2; + break; + case WM_LBUTTONUP: - if (! video_fullscreen) + if ((button_down & 2) && !video_fullscreen) plat_mouse_capture(1); + button_down &= ~2; break; case WM_MBUTTONUP: From 2c12f47bd72fb46e7ce3782ef1115eff9cc017cf Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 12 Apr 2021 04:57:16 +0200 Subject: [PATCH 08/10] Updated win/CMakeLists.txt. --- src/win/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt index dd5e7b28c..f2f995d6d 100644 --- a/src/win/CMakeLists.txt +++ b/src/win/CMakeLists.txt @@ -19,7 +19,7 @@ add_library(plat OBJECT win.c win_dynld.c win_thread.c win_cdrom.c win_keyboard.c win_crashdump.c win_midi.c win_mouse.c) add_library(ui OBJECT win_ui.c win_stbar.c win_sdl.c win_dialog.c win_about.c - win_settings.c win_devconf.c win_snd_gain.c win_new_floppy.c + win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.o win_new_floppy.c win_jsconf.c win_media_menu.c 86Box.rc) if(MSVC) From 58a1939dbf35339c45797a41c4a3e89e9379f16a Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 12 Apr 2021 05:58:59 +0200 Subject: [PATCH 09/10] Improved the main window size specifying, now has an option to lock the window to the specified size, making it unresizable. --- src/config.c | 30 +++++++++++++++- src/include/86box/86box.h | 1 + src/include/86box/resource.h | 1 + src/win/86Box.rc | 10 +++--- src/win/win.c | 14 ++++---- src/win/win_specify_dim.c | 68 ++++++++++++++++++++++++------------ src/win/win_ui.c | 57 ++++++++++++++++++++++-------- 7 files changed, 132 insertions(+), 49 deletions(-) diff --git a/src/config.c b/src/config.c index ab42cca31..2b01cf8a5 100644 --- a/src/config.c +++ b/src/config.c @@ -450,7 +450,9 @@ load_general(void) char temp[512]; char *p; - vid_resize = !!config_get_int(cat, "vid_resize", 0); + vid_resize = config_get_int(cat, "vid_resize", 0); + if (vid_resize & ~3) + vid_resize &= 3; memset(temp, '\0', sizeof(temp)); p = config_get_string(cat, "vid_renderer", "default"); @@ -488,6 +490,25 @@ load_general(void) window_w = window_h = window_x = window_y = 0; } + if (vid_resize & 2) { + p = config_get_string(cat, "window_fixed_res", NULL); + if (p == NULL) + p = "120x120"; + sscanf(p, "%ix%i", &fixed_size_x, &fixed_size_y); + if (fixed_size_x < 120) + fixed_size_x = 120; + if (fixed_size_x > 2048) + fixed_size_x = 2048; + if (fixed_size_y < 120) + fixed_size_y = 120; + if (fixed_size_y > 2048) + fixed_size_y = 2048; + } else { + config_delete_var(cat, "window_fixed_res"); + + fixed_size_x = fixed_size_y = 120; + } + sound_gain = config_get_int(cat, "sound_gain", 0); confirm_reset = config_get_int(cat, "confirm_reset", 1); @@ -1720,6 +1741,7 @@ config_load(void) fpu_type = fpu_get_type(cpu_f, cpu, "none"); gfxcard = video_get_video_from_internal_name("cga"); vid_api = plat_vidapi("default"); + vid_resize = 0; time_sync = TIME_SYNC_ENABLED; hdc_current = hdc_get_from_internal_name("none"); serial_enabled[0] = 1; @@ -1857,6 +1879,12 @@ save_general(void) config_delete_var(cat, "window_coordinates"); } + if (vid_resize & 2) { + sprintf(temp, "%ix%i", fixed_size_x, fixed_size_y); + config_set_string(cat, "window_fixed_res", temp); + } else + config_delete_var(cat, "window_fixed_res"); + if (sound_gain != 0) config_set_int(cat, "sound_gain", sound_gain); else diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 83ca91ba8..1429c698c 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -120,6 +120,7 @@ extern int enable_crashdump; /* (C) enable crash dump */ extern int is_pentium; /* TODO: Move back to cpu/cpu.h when it's figured out, how to remove that hack from the ET4000/W32p. */ +extern int fixed_size_x, fixed_size_y; #ifdef ENABLE_LOG_TOGGLES diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 27f8f8d0e..3a029a25f 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -281,6 +281,7 @@ #define IDC_WIDTHSPIN 1401 #define IDC_EDIT_HEIGHT 1402 #define IDC_HEIGHTSPIN 1403 +#define IDC_CHECK_LOCK_SIZE 1404 #define IDM_ABOUT 40001 #define IDC_ABOUT_ICON 65535 diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 215ebe0e3..da174a4fa 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -343,7 +343,7 @@ BEGIN #endif END -DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 47 +DLG_SPECIFY_DIM DIALOG DISCARDABLE 0, 0, 175, 66 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Specify Main Window Dimensions" FONT 9, "Segoe UI" @@ -358,8 +358,10 @@ BEGIN CONTROL "",IDC_HEIGHTSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,166,6, 12,12 - DEFPUSHBUTTON "OK",IDOK,30,26,50,14 - PUSHBUTTON "Cancel",IDCANCEL,99,26,50,14 + CONTROL "Lock to this size",IDC_CHECK_LOCK_SIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,26,94,10 + DEFPUSHBUTTON "OK",IDOK,30,45,50,14 + PUSHBUTTON "Cancel",IDCANCEL,99,45,50,14 END DLG_CFG_MACHINE DIALOG DISCARDABLE 107, 0, 305, 200 @@ -1038,7 +1040,7 @@ BEGIN IDS_2123 "Save" IDS_2124 "About 86Box" IDS_2125 "86Box v" EMU_VERSION - IDS_2126 "An emulator of old computers\n\nAuthors: Miran Grca (OBattler), Sarah Walker, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information." + IDS_2126 "An emulator of old computers\n\nAuthors: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, MoochMcGee, reenigne, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2. See LICENSE for more information." IDS_2127 "OK" IDS_2128 "Hardware not available" #ifdef _WIN32 diff --git a/src/win/win.c b/src/win/win.c index 901ae267c..f82bc7a3e 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -1032,7 +1032,7 @@ plat_setfullscreen(int on) plat_resize(scrnsz_x, scrnsz_y); if (vid_resize) { /* scale the screen base on DPI */ - if (window_remember) { + if (!(vid_resize & 2) && window_remember) { MoveWindow(hwndMain, window_x, window_y, window_w, window_h, TRUE); GetClientRect(hwndMain, &rect); @@ -1040,11 +1040,11 @@ plat_setfullscreen(int on) temp_y = rect.bottom - rect.top + 1 - sbar_height; } else { if (dpi_scale) { - temp_x = MulDiv(unscaled_size_x, dpi, 96); - temp_y = MulDiv(unscaled_size_y, dpi, 96); + temp_x = MulDiv((vid_resize & 2) ? fixed_size_x : unscaled_size_x, dpi, 96); + temp_y = MulDiv((vid_resize & 2) ? fixed_size_y : unscaled_size_y, dpi, 96); } else { - temp_x = unscaled_size_x; - temp_y = unscaled_size_y; + temp_x = (vid_resize & 2) ? fixed_size_x : unscaled_size_x; + temp_y = (vid_resize & 2) ? fixed_size_y : unscaled_size_y; } /* Main Window. */ @@ -1061,8 +1061,8 @@ plat_setfullscreen(int on) if (mouse_capture) ClipCursor(&rect); - scrnsz_x = unscaled_size_x; - scrnsz_y = unscaled_size_y; + scrnsz_x = (vid_resize & 2) ? fixed_size_x : unscaled_size_x; + scrnsz_y = (vid_resize & 2) ? fixed_size_y : unscaled_size_y; } } video_fullscreen &= 1; diff --git a/src/win/win_specify_dim.c b/src/win/win_specify_dim.c index 42bc4edd3..547ee93b1 100644 --- a/src/win/win_specify_dim.c +++ b/src/win/win_specify_dim.c @@ -44,7 +44,7 @@ SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM UDACCEL accel, accel2; RECT r; uint32_t temp_x = 0, temp_y = 0; - int dpi = 96; + int dpi = 96, lock; LPTSTR lptsTemp; char *stransi; @@ -69,6 +69,9 @@ SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM accel2.nInc = 8; SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel2); SendMessage(h, UDM_SETPOS, 0, r.bottom - r.top); + + h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE); + SendMessage(h, BM_SETCHECK, !!(vid_resize & 2), 0); break; case WM_COMMAND: @@ -81,18 +84,33 @@ SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp); wcstombs(stransi, lptsTemp, 512); sscanf(stransi, "%u", &temp_x); + fixed_size_x = temp_x; h = GetDlgItem(hdlg, IDC_EDIT_HEIGHT); SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp); wcstombs(stransi, lptsTemp, 512); sscanf(stransi, "%u", &temp_y); + fixed_size_y = temp_y; - window_remember = 1; - vid_resize = 1; + h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE); + lock = SendMessage(h, BM_GETCHECK, 0, 0); + + if (lock) { + vid_resize = 2; + window_remember = 0; + } else { + vid_resize = 1; + window_remember = 1; + } hmenu = GetMenu(hwndMain); - CheckMenuItem(hmenu, IDM_VID_RESIZE, MF_CHECKED); + CheckMenuItem(hmenu, IDM_VID_REMEMBER, (window_remember == 1) ? MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize == 1) ? MF_CHECKED : MF_UNCHECKED); + EnableMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize & 2) ? MF_GRAYED : MF_ENABLED); - SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE); + if (vid_resize == 1) + SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE); + else + SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX) | WS_VISIBLE); /* scale the screen base on DPI */ if (dpi_scale) { @@ -106,27 +124,31 @@ SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height); + if (vid_resize) { + CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED); + scale = 1; + } + EnableMenuItem(hmenu, IDM_VID_SCALE_1X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_2X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_3X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_4X, vid_resize ? MF_GRAYED : MF_ENABLED); + + scrnsz_x = fixed_size_x; + scrnsz_y = fixed_size_y; + doresize = 1; + + GetWindowRect(hwndMain, &r); + if (mouse_capture) ClipCursor(&r); - CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED); - scale = 1; - EnableMenuItem(hmenu, IDM_VID_SCALE_1X, MF_GRAYED); - EnableMenuItem(hmenu, IDM_VID_SCALE_2X, MF_GRAYED); - EnableMenuItem(hmenu, IDM_VID_SCALE_3X, MF_GRAYED); - EnableMenuItem(hmenu, IDM_VID_SCALE_4X, MF_GRAYED); - - scrnsz_x = temp_x; - scrnsz_y = temp_y; - doresize = 1; - - CheckMenuItem(hmenu, IDM_VID_REMEMBER, MF_CHECKED); - GetWindowRect(hwndMain, &r); - window_x = r.left; - window_y = r.top; - window_w = r.right - r.left; - window_h = r.bottom - r.top; + if (!(vid_resize & 2) && window_remember) { + window_x = r.left; + window_y = r.top; + window_w = r.right - r.left; + window_h = r.bottom - r.top; + } config_save(); diff --git a/src/win/win_ui.c b/src/win/win_ui.c index e690a0706..de76d142b 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -66,6 +66,7 @@ int minimized = 0; int infocus = 1, button_down = 0; int rctrl_is_lalt = 0; int user_resize = 0; +int fixed_size_x = 0, fixed_size_y = 0; extern char openfilestring[512]; extern WCHAR wopenfilestring[512]; @@ -125,7 +126,7 @@ int win_get_system_metrics(int index, int dpi) { void ResizeWindowByClientArea(HWND hwnd, int width, int height) { - if (vid_resize || padded_frame) { + if ((vid_resize == 1) || padded_frame) { int padding = win_get_system_metrics(SM_CXPADDEDBORDER, dpi); width += (win_get_system_metrics(SM_CXFRAME, dpi) + padding) * 2; height += (win_get_system_metrics(SM_CYFRAME, dpi) + padding) * 2; @@ -279,13 +280,13 @@ ResetAllMenus(void) CheckMenuItem(menuMain, IDM_VID_OVERSCAN, enable_overscan?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_INVERT, invert_display ? MF_CHECKED : MF_UNCHECKED); - if (vid_resize) + if (vid_resize == 1) CheckMenuItem(menuMain, IDM_VID_RESIZE, MF_CHECKED); CheckMenuItem(menuMain, IDM_VID_SDL_SW+vid_api, MF_CHECKED); CheckMenuItem(menuMain, IDM_VID_FS_FULL+video_fullscreen_scale, MF_CHECKED); CheckMenuItem(menuMain, IDM_VID_REMEMBER, window_remember?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_SCALE_1X+scale, MF_CHECKED); - CheckMenuItem(menuMain, IDM_VID_HIDPI, dpi_scale?MF_CHECKED:MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_HIDPI, dpi_scale?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_CGACON, vid_cga_contrast?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_GRAYCT_601+video_graytype, MF_CHECKED); @@ -300,6 +301,20 @@ ResetAllMenus(void) #ifdef MTR_ENABLED EnableMenuItem(menuMain, IDM_ACTION_END_TRACE, MF_DISABLED); #endif + + if (vid_resize) { + if (vid_resize >= 2) { + CheckMenuItem(menuMain, IDM_VID_RESIZE, MF_UNCHECKED); + EnableMenuItem(menuMain, IDM_VID_RESIZE, MF_GRAYED); + } + + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + scale, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_2X, MF_CHECKED); + EnableMenuItem(menuMain, IDM_VID_SCALE_1X, MF_GRAYED); + EnableMenuItem(menuMain, IDM_VID_SCALE_2X, MF_GRAYED); + EnableMenuItem(menuMain, IDM_VID_SCALE_3X, MF_GRAYED); + EnableMenuItem(menuMain, IDM_VID_SCALE_4X, MF_GRAYED); + } } @@ -599,10 +614,10 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; case IDM_VID_RESIZE: - vid_resize = !vid_resize; - CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize)? MF_CHECKED : MF_UNCHECKED); + vid_resize ^= 1; + CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize & 1) ? MF_CHECKED : MF_UNCHECKED); - if (vid_resize) + if (vid_resize == 1) SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE); else SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX) | WS_VISIBLE); @@ -642,7 +657,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) window_remember = !window_remember; CheckMenuItem(hmenu, IDM_VID_REMEMBER, window_remember ? MF_CHECKED : MF_UNCHECKED); GetWindowRect(hwnd, &rect); - if (window_remember) { + if (!(vid_resize & 2) && window_remember) { window_x = rect.left; window_y = rect.top; window_w = rect.right - rect.left; @@ -837,9 +852,19 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) GetWindowRect(hwndSBAR, &rect); sbar_height = rect.bottom - rect.top; rect_p = (RECT*)lParam; - if (vid_resize) + if (vid_resize == 1) MoveWindow(hwnd, rect_p->left, rect_p->top, rect_p->right - rect_p->left, rect_p->bottom - rect_p->top, TRUE); - else if (!user_resize) + else if (vid_resize >= 2) { + temp_x = fixed_size_x; + temp_y = fixed_size_y; + if (dpi_scale) { + temp_x = MulDiv(temp_x, dpi, 96); + temp_y = MulDiv(temp_y, dpi, 96); + } + + /* Main Window. */ + ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height); + } else if (!user_resize) doresize = 1; break; @@ -1243,10 +1268,10 @@ ui_init(int nCmdShow) sbar_height = sbar_rect.bottom - sbar_rect.top; /* Set up main window for resizing if configured. */ - if (vid_resize) + if (vid_resize == 1) SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW)); - else + else SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW&~WS_SIZEBOX&~WS_THICKFRAME&~WS_MAXIMIZEBOX)); @@ -1256,10 +1281,15 @@ ui_init(int nCmdShow) /* Initiate a resize in order to properly arrange all controls. Move to the last-saved position if needed. */ - if (window_remember) + if ((vid_resize < 2) && window_remember) MoveWindow(hwnd, window_x, window_y, window_w, window_h, TRUE); - else + else { + if (vid_resize >= 2) { + scrnsz_x = fixed_size_x; + scrnsz_y = fixed_size_y; + } ResizeWindowByClientArea(hwndMain, scrnsz_x, scrnsz_y + sbar_height); + } /* Reset all menus to their defaults. */ ResetAllMenus(); @@ -1479,7 +1509,6 @@ plat_resize(int x, int y) { /* First, see if we should resize the UI window. */ if (!vid_resize) { - /* scale the screen base on DPI */ if (dpi_scale) { x = MulDiv(x, dpi, 96); From e91a938f079af1c8bf68a43122fff2bdfecf61f2 Mon Sep 17 00:00:00 2001 From: Daniel Gurney Date: Mon, 12 Apr 2021 23:32:25 +0300 Subject: [PATCH 10/10] Fix cmake --- src/win/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt index f2f995d6d..1588a4d7e 100644 --- a/src/win/CMakeLists.txt +++ b/src/win/CMakeLists.txt @@ -19,7 +19,7 @@ add_library(plat OBJECT win.c win_dynld.c win_thread.c win_cdrom.c win_keyboard.c win_crashdump.c win_midi.c win_mouse.c) add_library(ui OBJECT win_ui.c win_stbar.c win_sdl.c win_dialog.c win_about.c - win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.o win_new_floppy.c + win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.c win_new_floppy.c win_jsconf.c win_media_menu.c 86Box.rc) if(MSVC)