This commit is contained in:
starfrost013
2025-04-27 17:04:25 +01:00
51 changed files with 1449 additions and 1057 deletions

2
.ci/Jenkinsfile vendored
View File

@@ -20,7 +20,7 @@ def repository = ['https://github.com/86Box/86Box.git', scm.userRemoteConfigs[0]
def commitBrowser = ['https://github.com/86Box/86Box/commit/%s', null]
def branch = ['master', scm.branches[0].name]
def buildType = ['beta', 'alpha']
def tarballFlags = ['', '-s']
def tarballFlags = ['', '-t']
def buildBranch = env.JOB_BASE_NAME.contains('-') ? 1 : 0
def osArchs = [

View File

@@ -73,7 +73,7 @@ if(WIN32)
# Default value for the `WIN32` target property, which specifies whether
# to build the application for the Windows GUI or console subsystem
option(CMAKE_WIN32_EXECUTABLE "Build a Windows GUI executable" OFF)
option(CMAKE_WIN32_EXECUTABLE "Build a Windows GUI executable" ON)
else()
# Prefer dynamic builds everywhere else
set(PREFER_STATIC OFF)

View File

@@ -30,9 +30,9 @@ Performance may vary depending on both host and guest configuration. Most emulat
It is also recommended to use a manager application with 86Box for easier handling of multiple virtual machines.
* [Avalonia 86](https://github.com/notBald/Avalonia86) by [notBald](https://github.com/notBald) (Windows and Linux)
* [86Box Manager](https://github.com/86Box/86BoxManager) by [Overdoze](https://github.com/daviunic) (Windows only)
* [86Box Manager X](https://github.com/RetBox/86BoxManagerX) by [xafero](https://github.com/xafero) (Cross platform Port of 86Box Manager using Avalonia)
* [Avalonia 86](https://github.com/notBald/Avalonia86) by [notBald](https://github.com/notBald) (Windows and Linux)
* [sl86](https://github.com/DDXofficial/sl86) by [DDX](https://github.com/DDXofficial) (Command-line 86Box machine manager written in Python)
* [Linbox-qt5](https://github.com/Dungeonseeker/linbox-qt5) by [Dungeonseeker](https://github.com/Dungeonseeker/) (Linux focused, should work on Windows though untested)
* [MacBox for 86Box](https://github.com/Moonif/MacBox) by [Moonif](https://github.com/Moonif) (MacOS only)

View File

@@ -666,40 +666,44 @@ usage:
}
}
printf("\nUsage: 86box [options] [cfg-file]\n\n");
printf("Valid options are:\n\n");
printf("-? or --help - show this information\n");
printf("-C or --config path - set 'path' to be config file\n");
ui_msgbox(MBX_INFO, L"\nUsage: 86box [options] [cfg-file]\n\n"
"Valid options are:\n\n"
"-? or --help\t\t\t- show this information\n"
"-C or --config path\t\t- set 'path' to be config file\n"
#ifdef _WIN32
printf("-D or --debug - force debug output logging\n");
"-D or --debug\t\t\t- force debug output logging\n"
#endif
#if 0
printf("-E or --nographic - forces the old behavior\n");
"-E or --nographic\t\t- forces the old behavior\n"
#endif
printf("-F or --fullscreen - start in fullscreen mode\n");
printf("-G or --lang langid - start with specified language (e.g. en-US, or system)\n");
"-F or --fullscreen\t\t- start in fullscreen mode\n"
"-G or --lang langid\t\t- start with specified language\n"
"\t\t\t\t (e.g. en-US, or system)\n"
#ifdef _WIN32
printf("-H or --hwnd id,hwnd - sends back the main dialog's hwnd\n");
"-H or --hwnd id,hwnd\t\t- sends back the main dialog's hwnd\n"
#endif
printf("-I or --image d:path - load 'path' as floppy image on drive d\n");
"-I or --image d:path\t\t- load 'path' as floppy image on drive d\n"
#ifdef USE_INSTRUMENT
printf("-J or --instrument name - set 'name' to be the profiling instrument\n");
"-J or --instrument name\t- set 'name' to be the profiling instrument\n"
#endif
printf("-L or --logfile path - set 'path' to be the logfile\n");
printf("-M or --missing - dump missing machines and video cards\n");
printf("-N or --noconfirm - do not ask for confirmation on quit\n");
printf("-P or --vmpath path - set 'path' to be root for vm\n");
printf("-R or --rompath path - set 'path' to be ROM path\n");
"-L or --logfile pat\t\t- set 'path' to be the logfile\n"
"-M or --missing\t\t- dump missing machines and video cards\n"
"-N or --noconfirm\t\t- do not ask for confirmation on quit\n"
"-P or --vmpath path\t\t- set 'path' to be root for vm\n"
"-R or --rompath path\t\t- set 'path' to be ROM path\n"
#ifndef USE_SDL_UI
printf("-S or --settings - show only the settings dialog\n");
"-S or --settings\t\t\t- show only the settings dialog\n"
#endif
printf("-T or --testmode - test mode: execute the test mode entry point on init/hard reset\n");
printf("-V or --vmname name - overrides the name of the running VM\n");
printf("-W or --nohook - disables keyboard hook (compatibility-only outside Windows)\n");
printf("-X or --clear what - clears the 'what' (cmos/flash/both)\n");
printf("-Y or --donothing - do not show any UI or run the emulation\n");
printf("-Z or --lastvmpath - the last parameter is VM path rather than config\n");
printf("\nA config file can be specified. If none is, the default file will be used.\n");
"-T or --testmode\t\t- test mode: execute the test mode entry\n"
"\t\t\t\t point on init/hard reset\n"
"-V or --vmname name\t\t- overrides the name of the running VM\n"
"-W or --nohook\t\t- disables keyboard hook\n"
"\t\t\t\t (compatibility-only outside Windows)\n"
"-X or --clear what\t\t- clears the 'what' (cmos/flash/both)\n"
"-Y or --donothing\t\t- do not show any UI or run the emulation\n"
"-Z or --lastvmpath\t\t- the last parameter is VM path rather\n"
"\t\t\t\t than config\n"
"\nA config file can be specified. If none is, the default file will be used.\n");
return 0;
} else if (!strcasecmp(argv[c], "--lastvmpath") || !strcasecmp(argv[c], "-Z")) {
lvmp = 1;
@@ -996,6 +1000,13 @@ usage:
zip_global_init();
mo_global_init();
/* Initialize the keyboard accelerator list with default values */
for (int x = 0; x < NUM_ACCELS; x++) {
strcpy(acc_keys[x].name, def_acc_keys[x].name);
strcpy(acc_keys[x].desc, def_acc_keys[x].desc);
strcpy(acc_keys[x].seq, def_acc_keys[x].seq);
}
/* Load the configuration file. */
config_load();
@@ -1026,14 +1037,6 @@ usage:
gdbstub_init();
// Initialize the keyboard accelerator list with default values
for(int x=0;x<NUM_ACCELS;x++) {
strcpy(acc_keys[x].name, def_acc_keys[x].name);
strcpy(acc_keys[x].desc, def_acc_keys[x].desc);
strcpy(acc_keys[x].seq, def_acc_keys[x].seq);
}
/* All good! */
return 1;
}

View File

@@ -819,6 +819,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
int pc_off = 0;
int test_modrm = 1;
int c;
uint32_t op87 = 0x00000000;
op_ea_seg = &cpu_state.seg_ds;
op_ssegs = 0;
@@ -872,6 +873,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
break;
case 0xd8:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d8_a32 : x86_dynarec_opcodes_d8_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d8;
opcode_shift = 3;
@@ -882,6 +884,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xd9:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d9_a32 : x86_dynarec_opcodes_d9_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d9;
opcode_mask = 0xff;
@@ -891,6 +894,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xda:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_da_a32 : x86_dynarec_opcodes_da_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_da;
opcode_mask = 0xff;
@@ -900,6 +904,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xdb:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_db_a32 : x86_dynarec_opcodes_db_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_db;
opcode_mask = 0xff;
@@ -909,6 +914,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xdc:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dc_a32 : x86_dynarec_opcodes_dc_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dc;
opcode_shift = 3;
@@ -919,6 +925,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xdd:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dd_a32 : x86_dynarec_opcodes_dd_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dd;
opcode_mask = 0xff;
@@ -928,6 +935,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xde:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_de_a32 : x86_dynarec_opcodes_de_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_de;
opcode_mask = 0xff;
@@ -937,6 +945,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xdf:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_df_a32 : x86_dynarec_opcodes_df_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_df;
opcode_mask = 0xff;
@@ -1000,6 +1009,10 @@ generate_call:
recomp_op_table = recomp_opcodes;
}
if (op87 != 0x0000) {
STORE_IMM_ADDR_L((uintptr_t) &x87_op, op87);
}
if (recomp_op_table && recomp_op_table[(opcode | op_32) & 0x1ff]) {
uint32_t new_pc = recomp_op_table[(opcode | op_32) & 0x1ff](opcode, fetchdat, op_32, op_pc, block);
if (new_pc) {

View File

@@ -1858,6 +1858,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
int pc_off = 0;
int test_modrm = 1;
int c;
uint32_t op87 = 0x00000000;
op_ea_seg = &cpu_state.seg_ds;
op_ssegs = 0;
@@ -1912,6 +1913,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
break;
case 0xd8:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d8_a32 : x86_dynarec_opcodes_d8_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d8;
opcode_shift = 3;
@@ -1922,6 +1924,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xd9:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d9_a32 : x86_dynarec_opcodes_d9_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d9;
opcode_mask = 0xff;
@@ -1931,6 +1934,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xda:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_da_a32 : x86_dynarec_opcodes_da_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_da;
opcode_mask = 0xff;
@@ -1940,6 +1944,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xdb:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_db_a32 : x86_dynarec_opcodes_db_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_db;
opcode_mask = 0xff;
@@ -1949,6 +1954,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xdc:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dc_a32 : x86_dynarec_opcodes_dc_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dc;
opcode_shift = 3;
@@ -1959,6 +1965,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xdd:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dd_a32 : x86_dynarec_opcodes_dd_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dd;
opcode_mask = 0xff;
@@ -1968,6 +1975,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xde:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_de_a32 : x86_dynarec_opcodes_de_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_de;
opcode_mask = 0xff;
@@ -1977,6 +1985,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
block->flags |= CODEBLOCK_HAS_FPU;
break;
case 0xdf:
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_df_a32 : x86_dynarec_opcodes_df_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_df;
opcode_mask = 0xff;
@@ -2041,6 +2050,10 @@ generate_call:
recomp_op_table = recomp_opcodes;
}
if (op87 != 0x0000) {
STORE_IMM_ADDR_L((uintptr_t) &x87_op, op87);
}
if (recomp_op_table && recomp_op_table[(opcode | op_32) & 0x1ff]) {
uint32_t new_pc = recomp_op_table[(opcode | op_32) & 0x1ff](opcode, fetchdat, op_32, op_pc, block);
if (new_pc) {

View File

@@ -396,6 +396,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
int test_modrm = 1;
int pc_off = 0;
uint32_t next_pc = 0;
uint16_t op87 = 0x0000;
#ifdef DEBUG_EXTRA
uint8_t last_prefix = 0;
#endif
@@ -451,6 +452,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
#ifdef DEBUG_EXTRA
last_prefix = 0xd8;
#endif
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d8_a32 : x86_dynarec_opcodes_d8_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d8;
opcode_shift = 3;
@@ -464,6 +466,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
#ifdef DEBUG_EXTRA
last_prefix = 0xd9;
#endif
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d9_a32 : x86_dynarec_opcodes_d9_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d9;
opcode_mask = 0xff;
@@ -476,6 +479,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
#ifdef DEBUG_EXTRA
last_prefix = 0xda;
#endif
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_da_a32 : x86_dynarec_opcodes_da_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_da;
opcode_mask = 0xff;
@@ -488,6 +492,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
#ifdef DEBUG_EXTRA
last_prefix = 0xdb;
#endif
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_db_a32 : x86_dynarec_opcodes_db_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_db;
opcode_mask = 0xff;
@@ -500,6 +505,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
#ifdef DEBUG_EXTRA
last_prefix = 0xdc;
#endif
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dc_a32 : x86_dynarec_opcodes_dc_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dc;
opcode_shift = 3;
@@ -513,6 +519,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
#ifdef DEBUG_EXTRA
last_prefix = 0xdd;
#endif
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dd_a32 : x86_dynarec_opcodes_dd_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dd;
opcode_mask = 0xff;
@@ -525,6 +532,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
#ifdef DEBUG_EXTRA
last_prefix = 0xde;
#endif
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_de_a32 : x86_dynarec_opcodes_de_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_de;
opcode_mask = 0xff;
@@ -537,6 +545,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p
#ifdef DEBUG_EXTRA
last_prefix = 0xdf;
#endif
op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff);
op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_df_a32 : x86_dynarec_opcodes_df_a16;
recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_df;
opcode_mask = 0xff;
@@ -657,6 +666,9 @@ generate_call:
}
}
codegen_mark_code_present(block, cs + old_pc, (op_pc - old_pc) - pc_off);
if (op87 != 0x0000) {
uop_MOV_IMM(ir, IREG_x87_op, op87);
}
/* It is apparently a prefixed instruction. */
#if 0
if ((recomp_op_table == recomp_opcodes) && (opcode == 0x48))

View File

@@ -170,6 +170,7 @@ struct
[IREG_SS_limit_high] = { REG_DWORD, &cpu_state.seg_ss.limit_high, REG_INTEGER, REG_PERMANENT},
[IREG_eaa16] = { REG_WORD, &cpu_state.eaaddr, REG_INTEGER, REG_PERMANENT},
[IREG_x87_op] = { REG_WORD, &x87_op, REG_INTEGER, REG_PERMANENT},
/*Temporary registers are stored on the stack, and are not guaranteed to
be preserved across uOPs. They will not be written back if they will

View File

@@ -133,8 +133,9 @@ enum {
IREG_SS_limit_high = 87,
IREG_eaa16 = 88,
IREG_x87_op = 89,
IREG_COUNT = 89,
IREG_COUNT = 90,
IREG_INVALID = 255,

View File

@@ -1772,23 +1772,25 @@ load_keybinds(void)
char temp[512];
memset(temp, 0, sizeof(temp));
// Now load values from config
for(int x=0;x<NUM_ACCELS;x++)
{
p = ini_section_get_string(cat, acc_keys[x].name, "none");
// If there's no binding in the file, leave it alone.
if (strcmp(p, "none") != 0)
{
// It would be ideal to validate whether the user entered a
// valid combo at this point, but the Qt method for testing that is
// not available from C. Fortunately, if you feed Qt an invalid
// keysequence string it just assigns nothing, so this won't blow up.
// However, to improve the user experience, we should validate keys
// and erase any bad combos from config on mainwindow load.
strcpy(acc_keys[x].seq, p);
}
}
/* Now load values from config */
for (int x = 0; x < NUM_ACCELS; x++) {
p = ini_section_get_string(cat, acc_keys[x].name, "default");
/* Check if the binding was marked as cleared */
if (strcmp(p, "none") == 0)
acc_keys[x].seq[0] = '\0';
/* If there's no binding in the file, leave it alone. */
else if (strcmp(p, "default") != 0) {
/*
It would be ideal to validate whether the user entered a
valid combo at this point, but the Qt method for testing that is
not available from C. Fortunately, if you feed Qt an invalid
keysequence string it just assigns nothing, so this won't blow up.
However, to improve the user experience, we should validate keys
and erase any bad combos from config on mainwindow load.
*/
strcpy(acc_keys[x].seq, p);
}
}
}
/* Load the specified or a default configuration file. */
@@ -1892,7 +1894,7 @@ config_load(void)
#ifndef USE_SDL_UI
load_gl3_shaders(); /* GL3 Shaders */
#endif
load_keybinds(); /* Load shortcut keybinds */
load_keybinds(); /* Load shortcut keybinds */
/* Migrate renamed device configurations. */
c = ini_find_section(config, "MDA");
@@ -2524,16 +2526,16 @@ save_keybinds(void)
{
ini_section_t cat = ini_find_or_create_section(config, "Keybinds");
for(int x=0;x<NUM_ACCELS;x++)
{
// Has accelerator been changed from default?
if (strcmp(def_acc_keys[x].seq, acc_keys[x].seq) == 0)
{
ini_section_delete_var(cat, acc_keys[x].name);
} else {
ini_section_set_string(cat, acc_keys[x].name, acc_keys[x].seq);
}
}
for (int x = 0; x < NUM_ACCELS; x++) {
/* Has accelerator been changed from default? */
if (strcmp(def_acc_keys[x].seq, acc_keys[x].seq) == 0)
ini_section_delete_var(cat, acc_keys[x].name);
/* Check for a cleared binding to avoid saving it as an empty string */
else if (acc_keys[x].seq[0] == '\0')
ini_section_set_string(cat, acc_keys[x].name, "none");
else
ini_section_set_string(cat, acc_keys[x].name, acc_keys[x].seq);
}
ini_delete_section_if_empty(config, cat);
}
@@ -3148,7 +3150,7 @@ config_save(void)
#ifndef USE_SDL_UI
save_gl3_shaders(); /* GL3 Shaders */
#endif
save_keybinds(); /* Key bindings */
save_keybinds(); /* Key bindings */
ini_write(config, cfg_path);
}

View File

@@ -113,6 +113,8 @@ uint8_t is_smint = 0;
uint16_t io_port = 0x0000;
uint32_t io_val = 0x00000000;
uint32_t x87_op = 0x00000000;
int opcode_has_modrm[256] = {
1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*00*/
1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*10*/

View File

@@ -784,6 +784,8 @@ typedef struct {
uint32_t smhr;
} cyrix_t;
extern uint32_t x87_op;
extern uint32_t addr64;
extern uint32_t addr64_2;
extern uint32_t addr64a[8];

View File

@@ -4,88 +4,104 @@
static int
opESCAPE_d8_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_d8_a16[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int
opESCAPE_d8_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_d8_a32[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int
opESCAPE_d9_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_d9_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_d9_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_d9_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_da_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_da_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_da_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_da_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_db_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_db_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_db_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_db_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_dc_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_dc_a16[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int
opESCAPE_dc_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_dc_a32[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int
opESCAPE_dd_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_dd_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_dd_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_dd_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_de_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_de_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_de_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_de_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_df_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_df_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_df_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_opcodes_df_a32[fetchdat & 0xff](fetchdat);
}

View File

@@ -4,88 +4,104 @@
static int
opESCAPE_d8_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_d8_a16[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int
opESCAPE_d8_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_d8_a32[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int
opESCAPE_d9_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_d9_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_d9_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_d9_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_da_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_da_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_da_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_da_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_db_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_db_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_db_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_db_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_dc_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_dc_a16[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int
opESCAPE_dc_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_dc_a32[(fetchdat >> 3) & 0x1f](fetchdat);
}
static int
opESCAPE_dd_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_dd_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_dd_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_dd_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_de_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_de_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_de_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_de_a32[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_df_a16(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_df_a16[fetchdat & 0xff](fetchdat);
}
static int
opESCAPE_df_a32(uint32_t fetchdat)
{
x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff);
return x86_2386_opcodes_df_a32[fetchdat & 0xff](fetchdat);
}

View File

@@ -46,8 +46,6 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits)
if (CPUID < 0x650)
return ILLEGAL(fetchdat);
FP_ENTER();
if (bits == 32) {
fetch_ea_32(fetchdat);
} else {
@@ -82,12 +80,18 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits)
/* The lower 11 bits contain the FPU opcode, upper 5 bits are reserved */
fpu_state.foo = readmemw(easeg, cpu_state.eaaddr + 6) & 0x7FF;
fpu_state.fip = readmeml(easeg, cpu_state.eaaddr + 8);
if (bits == 32)
fpu_state.fip = readmeml(easeg, cpu_state.eaaddr + 8);
else
fpu_state.fip = readmemw(easeg, cpu_state.eaaddr + 8);
fpu_state.fcs = readmemw(easeg, cpu_state.eaaddr + 12);
tag_byte = readmemb(easeg, cpu_state.eaaddr + 4);
fpu_state.fdp = readmeml(easeg, cpu_state.eaaddr + 16);
if (bits == 32)
fpu_state.fdp = readmeml(easeg, cpu_state.eaaddr + 16);
else
fpu_state.fdp = readmemw(easeg, cpu_state.eaaddr + 16);
fpu_state.fds = readmemw(easeg, cpu_state.eaaddr + 20);
/* load i387 register file */
@@ -110,7 +114,6 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits)
fpu_state.swd &= ~(FPU_SW_Summary | FPU_SW_Backward);
}
// CLOCK_CYCLES((cr0 & 1) ? 34 : 44);
CLOCK_CYCLES(1);
} else {
/* FXSAVE */
@@ -132,7 +135,10 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits)
* x87 CS FPU IP Selector
* + 16 bit, in 16/32 bit mode only
*/
writememl(easeg, cpu_state.eaaddr + 8, fpu_state.fip);
if (bits == 32)
writememl(easeg, cpu_state.eaaddr + 8, fpu_state.fip);
else
writememl(easeg, cpu_state.eaaddr + 8, fpu_state.fip & 0xffff);
writememl(easeg, cpu_state.eaaddr + 12, fpu_state.fcs);
/*
@@ -145,7 +151,10 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits)
* x87 DS FPU Instruction Operand (Data) Pointer Selector
* + 16 bit, in 16/32 bit mode only
*/
writememl(easeg, cpu_state.eaaddr + 16, fpu_state.fdp);
if (bits == 32)
writememl(easeg, cpu_state.eaaddr + 16, fpu_state.fdp);
else
writememl(easeg, cpu_state.eaaddr + 16, fpu_state.fdp & 0xffff);
writememl(easeg, cpu_state.eaaddr + 20, fpu_state.fds);
/* store i387 register file */
@@ -256,8 +265,6 @@ fx_save_stor_common(uint32_t fetchdat, int bits)
return cpu_state.abrt;
}
FP_ENTER();
old_eaaddr = cpu_state.eaaddr;
if (fxinst == 1) {
@@ -269,13 +276,19 @@ fx_save_stor_common(uint32_t fetchdat, int bits)
cpu_state.TOP = (fpus >> 11) & 7;
cpu_state.npxs &= fpus & ~0x3800;
x87_pc_off = readmeml(easeg, cpu_state.eaaddr + 8);
if (bits == 32)
x87_pc_off = readmeml(easeg, cpu_state.eaaddr + 8);
else
x87_pc_off = readmemw(easeg, cpu_state.eaaddr + 8);
x87_pc_seg = readmemw(easeg, cpu_state.eaaddr + 12);
ftwb = readmemb(easeg, cpu_state.eaaddr + 4);
x87_op = readmemw(easeg, cpu_state.eaaddr + 6) & 0x07ff;
x87_op_off = readmeml(easeg, cpu_state.eaaddr + 16);
x87_op_off |= (readmemw(easeg, cpu_state.eaaddr + 6) >> 12) << 16;
if (bits == 32)
x87_op_off = readmeml(easeg, cpu_state.eaaddr + 16);
else
x87_op_off = readmemw(easeg, cpu_state.eaaddr +16);
x87_op_seg = readmemw(easeg, cpu_state.eaaddr + 20);
for (i = 0; i <= 7; i++) {
@@ -320,7 +333,6 @@ fx_save_stor_common(uint32_t fetchdat, int bits)
}
}
// CLOCK_CYCLES((cr0 & 1) ? 34 : 44);
CLOCK_CYCLES(1);
} else {
/* FXSAVE */
@@ -345,11 +357,17 @@ fx_save_stor_common(uint32_t fetchdat, int bits)
writememw(easeg, cpu_state.eaaddr + 2, cpu_state.npxs);
writememb(easeg, cpu_state.eaaddr + 4, ftwb);
writememw(easeg, cpu_state.eaaddr + 6, (x87_op_off >> 16) << 12);
writememl(easeg, cpu_state.eaaddr + 8, x87_pc_off);
writememw(easeg, cpu_state.eaaddr + 6, x87_op);
if (bits == 32)
writememl(easeg, cpu_state.eaaddr + 8, x87_pc_off);
else
writememl(easeg, cpu_state.eaaddr + 8, x87_pc_off & 0xffff);
writememw(easeg, cpu_state.eaaddr + 12, x87_pc_seg);
writememl(easeg, cpu_state.eaaddr + 16, x87_op_off);
if (bits == 32)
writememl(easeg, cpu_state.eaaddr + 16, x87_op_off);
else
writememl(easeg, cpu_state.eaaddr + 16, x87_op_off & 0xffff);
writememw(easeg, cpu_state.eaaddr + 20, x87_op_seg);
if (cpu_state.ismmx) {

View File

@@ -395,7 +395,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
fatal("Write with ECC\n");
esdi->status = STAT_READY | STAT_DRQ | STAT_DSC;
esdi->pos = 0;
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1);
break;
case CMD_VERIFY:
@@ -412,7 +412,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case CMD_FORMAT:
esdi->status = STAT_DRQ;
esdi->pos = 0;
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1);
break;
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
@@ -593,6 +593,7 @@ esdi_callback(void *priv)
esdi->reset = 0;
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
return;
}
@@ -650,7 +651,7 @@ read_error:
esdi->status = STAT_READY | STAT_ERR | STAT_DSC;
esdi->error = ERR_ABRT;
irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
} else {
if (get_sector(esdi, &addr)) {
@@ -658,7 +659,7 @@ read_error:
write_error:
esdi->status = STAT_READY | STAT_DSC | STAT_ERR;
irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
}
@@ -672,10 +673,10 @@ write_error:
esdi->status = STAT_DRQ | STAT_READY | STAT_DSC;
esdi->pos = 0;
next_sector(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1);
} else {
esdi->status = STAT_READY | STAT_DSC;
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
}
}
break;
@@ -718,7 +719,7 @@ verify_error:
break;
case CMD_FORMAT:
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
if (!drive->present) {
esdi->status = STAT_READY | STAT_ERR | STAT_DSC;
esdi->error = ERR_ABRT;
@@ -752,10 +753,12 @@ format_error:
esdi->status = STAT_READY | STAT_DSC;
irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
if (!drive->present) {
esdi->status = STAT_READY | STAT_ERR | STAT_DSC;
esdi->error = ERR_ABRT;
@@ -778,10 +781,12 @@ format_error:
esdi->error = ERR_ABRT;
irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
case 0xe0:
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
if (!drive->present) {
esdi->status = STAT_READY | STAT_ERR | STAT_DSC;
esdi->error = ERR_ABRT;
@@ -825,6 +830,7 @@ format_error:
}
irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
case CMD_READ_PARAMETERS:
@@ -869,6 +875,7 @@ format_error:
irq_raise(esdi);
}
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
default:
@@ -880,6 +887,7 @@ format_error:
esdi->error = ERR_ABRT;
irq_raise(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
}
}
@@ -954,6 +962,7 @@ wd1007vse1_init(UNUSED(const device_t *info))
timer_add(&esdi->callback_timer, esdi_callback, esdi, 0);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
return esdi;
}
@@ -973,6 +982,7 @@ wd1007vse1_close(void *priv)
free(esdi);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
}
static int

View File

@@ -288,6 +288,7 @@ cmd_unsupported(esdi_t *dev)
dev->irq_in_progress = 1;
set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
}
static void
@@ -309,6 +310,7 @@ device_not_present(esdi_t *dev)
dev->irq_in_progress = 1;
set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
}
static void
@@ -330,6 +332,7 @@ rba_out_of_range(esdi_t *dev)
dev->irq_in_progress = 1;
set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
}
static void
@@ -351,6 +354,7 @@ defective_block(esdi_t *dev)
dev->irq_in_progress = 1;
set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
}
static void
@@ -368,6 +372,7 @@ complete_command_status(esdi_t *dev)
dev->status_data[5] = (dev->rba - 1) >> 8;
dev->status_data[6] = 0; /*Number of blocks requiring error recovery*/
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
}
#define ESDI_ADAPTER_ONLY() \
@@ -696,6 +701,7 @@ esdi_callback(void *priv)
dev->irq_in_progress = 1;
set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
case CMD_GET_DEV_CONFIG:
@@ -744,6 +750,7 @@ esdi_callback(void *priv)
dev->irq_in_progress = 1;
set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
case CMD_GET_POS_INFO:
@@ -764,6 +771,7 @@ esdi_callback(void *priv)
dev->irq_in_progress = 1;
set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
case 0x10:
@@ -817,6 +825,7 @@ esdi_callback(void *priv)
dev->irq_in_progress = 1;
set_irq(dev);
ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0);
break;
default:

View File

@@ -1827,7 +1827,7 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv)
ide->blockcount = 0;
/* Turn on the activity indicator *here* so that it gets turned on
less times. */
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
fallthrough;
case WIN_WRITE:
@@ -2472,6 +2472,7 @@ ide_callback(void *priv)
else if (!ide->tf->lba && (ide->cfg_spt == 0))
err = IDNF_ERR;
else {
ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
ret = hdd_image_write(ide->hdd_num, ide_get_sector(ide), 1, (uint8_t *) ide->buffer);
ide_irq_raise(ide);
ide->tf->secount--;
@@ -2479,10 +2480,8 @@ ide_callback(void *priv)
ide->tf->atastat = DRQ_STAT | DRDY_STAT | DSC_STAT;
ide->tf->pos = 0;
ide_next_sector(ide);
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
} else {
ide->tf->atastat = DRDY_STAT | DSC_STAT;
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0);
}
if (ret < 0)
err = UNC_ERR;
@@ -2514,6 +2513,7 @@ ide_callback(void *priv)
return;
} else if (ret & 1) {
/* DMA successful */
ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
ret = hdd_image_write(ide->hdd_num, ide_get_sector(ide),
ide->sector_pos, ide->sector_buffer);
@@ -2524,7 +2524,6 @@ ide_callback(void *priv)
err = UNC_ERR;
ide_irq_raise(ide);
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0);
} else {
/* Bus master DMA error, abort the command. */
ide_log("IDE %i: DMA read aborted (failed)\n", ide->channel);
@@ -2562,7 +2561,7 @@ ide_callback(void *priv)
ide_next_sector(ide);
} else {
ide->tf->atastat = DRDY_STAT | DSC_STAT;
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0);
ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0);
}
if (ret < 0)
err = UNC_ERR;
@@ -2596,7 +2595,7 @@ ide_callback(void *priv)
err = UNC_ERR;
ide_irq_raise(ide);
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
}
break;

View File

@@ -557,6 +557,7 @@ do_callback(void *priv)
mfm->reset = 0;
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
return;
}
@@ -627,9 +628,9 @@ write_error:
mfm->status |= STAT_DRQ;
mfm->pos = 0;
next_sector(mfm);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
} else
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
break;
case CMD_VERIFY:
@@ -657,7 +658,7 @@ write_error:
mfm->status = STAT_READY | STAT_DSC;
irq_raise(mfm);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
break;
case CMD_DIAGNOSE:
@@ -772,6 +773,7 @@ mfm_init(UNUSED(const device_t *info))
timer_add(&mfm->callback_timer, do_callback, mfm, 0);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
return mfm;
}
@@ -790,6 +792,7 @@ mfm_close(void *priv)
free(mfm);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
}
const device_t st506_at_wd1003_device = {

View File

@@ -580,14 +580,14 @@ st506_callback(void *priv)
(void) get_chs(dev, drive);
st506_xt_log("ST506: FORMAT_DRIVE(%i) interleave=%i\n",
dev->drive_sel, dev->command[4]);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
timer_advance_u64(&dev->timer, ST506_TIME);
dev->state = STATE_SEND_DATA;
break;
case STATE_SEND_DATA: /* wrong, but works */
if (!get_sector(dev, drive, &addr)) {
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_error(dev, dev->error);
st506_complete(dev);
return;
@@ -604,7 +604,7 @@ st506_callback(void *priv)
break;
case STATE_SENT_DATA:
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_complete(dev);
break;
@@ -663,14 +663,14 @@ st506_callback(void *priv)
st506_xt_log("ST506: FORMAT_%sTRACK(%i, %i/%i)\n",
(dev->command[0] == CMD_FORMAT_BAD_TRACK) ? "BAD_" : "",
dev->drive_sel, dev->cylinder, dev->head);
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
timer_advance_u64(&dev->timer, ST506_TIME);
dev->state = STATE_SEND_DATA;
break;
case STATE_SEND_DATA: /* wrong, but works */
if (!get_sector(dev, drive, &addr)) {
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_error(dev, dev->error);
st506_complete(dev);
return;
@@ -686,7 +686,7 @@ st506_callback(void *priv)
break;
case STATE_SENT_DATA:
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_complete(dev);
break;
@@ -828,7 +828,7 @@ read_error_sent:
return;
}
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1);
/* Set up the data transfer. */
dev->buff_pos = 0;
@@ -865,7 +865,7 @@ read_error_sent:
case STATE_RECEIVED_DATA:
if (!get_sector(dev, drive, &addr)) {
write_error:
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_error(dev, dev->error);
st506_complete(dev);
return;
@@ -879,7 +879,7 @@ write_error:
}
if (--dev->count == 0) {
ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0);
st506_complete(dev);
break;
}

View File

@@ -385,7 +385,7 @@ do_format(hdc_t *dev, drive_t *drive, dcb_t *dcb)
dev->sector = 0;
/* Activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1);
do_fmt:
/*
@@ -426,7 +426,7 @@ do_fmt:
}
/* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
}
/* Execute the DCB we just received. */
@@ -631,7 +631,7 @@ read_error:
case STATE_RECV:
/* Activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1);
do_recv:
/* Ready to transfer the data in. */
dev->state = STATE_RDATA;
@@ -680,7 +680,7 @@ do_recv:
if (get_sector(dev, drive, &addr)) {
write_error:
/* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
dev->comp |= COMP_ERR;
set_intr(dev);
@@ -697,7 +697,7 @@ write_error:
dev->buf_idx = 0;
if (--dev->count == 0) {
/* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
set_intr(dev);
return;

View File

@@ -628,6 +628,7 @@ mo_cmd_error(mo_t *dev)
dev->callback = 50.0 * MO_TIME;
mo_set_callback(dev);
ui_sb_update_icon(SB_MO | dev->id, 0);
ui_sb_update_icon_write(SB_MO | dev->id, 0);
mo_log(dev->log, "[%02X] ERROR: %02X/%02X/%02X\n", dev->current_cdb[0], mo_sense_key,
mo_asc, mo_ascq);
}
@@ -644,6 +645,7 @@ mo_unit_attention(mo_t *dev)
dev->callback = 50.0 * MO_TIME;
mo_set_callback(dev);
ui_sb_update_icon(SB_MO | dev->id, 0);
ui_sb_update_icon_write(SB_MO | dev->id, 0);
mo_log(dev->log, "UNIT ATTENTION\n");
}
@@ -1462,7 +1464,7 @@ mo_command(scsi_common_t *sc, const uint8_t *cdb)
mo_data_command_finish(dev, dev->packet_len, dev->drv->sector_size,
dev->packet_len, 1);
ui_sb_update_icon(SB_MO | dev->id,
ui_sb_update_icon_write(SB_MO | dev->id,
dev->packet_status != PHASE_COMPLETE);
} else {
mo_set_phase(dev, SCSI_PHASE_STATUS);
@@ -1501,7 +1503,7 @@ mo_command(scsi_common_t *sc, const uint8_t *cdb)
dev->drv->sector_size,
alloc_length, 1);
ui_sb_update_icon(SB_MO | dev->id,
ui_sb_update_icon_write(SB_MO | dev->id,
dev->packet_status != PHASE_COMPLETE);
} else {
mo_set_phase(dev, SCSI_PHASE_STATUS);

View File

@@ -709,6 +709,7 @@ zip_cmd_error(zip_t *dev)
dev->callback = 50.0 * ZIP_TIME;
zip_set_callback(dev);
ui_sb_update_icon(SB_ZIP | dev->id, 0);
ui_sb_update_icon_write(SB_ZIP | dev->id, 0);
zip_log(dev->log, "[%02X] ERROR: %02X/%02X/%02X\n", dev->current_cdb[0], zip_sense_key,
zip_asc, zip_ascq);
}
@@ -725,6 +726,7 @@ zip_unit_attention(zip_t *dev)
dev->callback = 50.0 * ZIP_TIME;
zip_set_callback(dev);
ui_sb_update_icon(SB_ZIP | dev->id, 0);
ui_sb_update_icon_write(SB_ZIP | dev->id, 0);
zip_log(dev->log, "UNIT ATTENTION\n", dev->id);
}
@@ -1485,7 +1487,7 @@ zip_command(scsi_common_t *sc, const uint8_t *cdb)
zip_data_command_finish(dev, dev->packet_len, 512,
dev->packet_len, 1);
ui_sb_update_icon(SB_ZIP | dev->id,
ui_sb_update_icon_write(SB_ZIP | dev->id,
dev->packet_status != PHASE_COMPLETE);
} else {
zip_set_phase(dev, SCSI_PHASE_STATUS);
@@ -1526,7 +1528,7 @@ zip_command(scsi_common_t *sc, const uint8_t *cdb)
zip_data_command_finish(dev, 512, 512,
alloc_length, 1);
ui_sb_update_icon(SB_ZIP | dev->id,
ui_sb_update_icon_write(SB_ZIP | dev->id,
dev->packet_status != PHASE_COMPLETE);
} else {
zip_set_phase(dev, SCSI_PHASE_STATUS);

View File

@@ -615,7 +615,10 @@ fdc_io_command_phase1(fdc_t *fdc, int out)
}
}
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1);
if (fdc->processed_cmd == 0x05 || fdc->processed_cmd == 0x09)
ui_sb_update_icon_write(SB_FLOPPY | real_drive(fdc, fdc->drive), 1);
else
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1);
fdc->stat = out ? 0x10 : 0x50;
if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma) {
fdc->stat |= 0x20;
@@ -671,8 +674,10 @@ fdc_soft_reset(fdc_t *fdc)
fdc->perp &= 0xfc;
for (int i = 0; i < FDD_NUM; i++)
ui_sb_update_icon(SB_FLOPPY | i, 0);
for (int i = 0; i < FDD_NUM; i++) {
ui_sb_update_icon(SB_FLOPPY | i, 0);
ui_sb_update_icon_write(SB_FLOPPY | i, 0);
}
fdc_ctrl_reset(fdc);
}
@@ -706,6 +711,7 @@ fdc_write(uint16_t addr, uint8_t val, void *priv)
timer_set_delay_u64(&fdc->timer, 8 * TIMER_USEC);
fdc->interrupt = -1;
ui_sb_update_icon(SB_FLOPPY | 0, 0);
ui_sb_update_icon_write(SB_FLOPPY | 0, 0);
fdc_ctrl_reset(fdc);
}
if (!fdd_get_flags(0))
@@ -1502,6 +1508,7 @@ fdc_poll_common_finish(fdc_t *fdc, int compare, int st5)
fdc->res[10] = fdc->params[4];
fdc_log("Read/write finish (%02X %02X %02X %02X %02X %02X %02X)\n", fdc->res[4], fdc->res[5], fdc->res[6], fdc->res[7], fdc->res[8], fdc->res[9], fdc->res[10]);
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 0);
ui_sb_update_icon_write(SB_FLOPPY | real_drive(fdc, fdc->drive), 0);
fdc->paramstogo = 7;
dma_set_drq(fdc->dma_ch, 0);
}
@@ -1545,8 +1552,10 @@ fdc_callback(void *priv)
case -5: /*Reset in power down mode */
fdc->perp &= 0xfc;
for (uint8_t i = 0; i < FDD_NUM; i++)
for (uint8_t i = 0; i < FDD_NUM; i++) {
ui_sb_update_icon(SB_FLOPPY | i, 0);
ui_sb_update_icon_write(SB_FLOPPY | i, 0);
}
fdc_ctrl_reset(fdc);
@@ -1694,7 +1703,10 @@ fdc_callback(void *priv)
fdc->sector++;
else if (fdc->params[5] == 0)
fdc->sector++;
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1);
if (fdc->interrupt == 0x05 || fdc->interrupt == 0x09)
ui_sb_update_icon_write(SB_FLOPPY | real_drive(fdc, fdc->drive), 1);
else
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1);
switch (fdc->interrupt) {
case 5:
case 9:
@@ -1885,6 +1897,7 @@ fdc_error(fdc_t *fdc, int st5, int st6)
break;
}
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 0);
ui_sb_update_icon_write(SB_FLOPPY | real_drive(fdc, fdc->drive), 0);
fdc->paramstogo = 7;
}
@@ -2333,8 +2346,10 @@ fdc_reset(void *priv)
current_drive = 0;
for (uint8_t i = 0; i < FDD_NUM; i++)
for (uint8_t i = 0; i < FDD_NUM; i++) {
ui_sb_update_icon(SB_FLOPPY | i, 0);
ui_sb_update_icon_write(SB_FLOPPY | i, 0);
}
fdc->power_down = 0;
}

View File

@@ -4,10 +4,12 @@
typedef struct dev_status_empty_active_t {
atomic_bool_t empty;
atomic_bool_t active;
atomic_bool_t write_active;
} dev_status_empty_active_t;
typedef struct dev_status_active_t {
atomic_bool_t active;
atomic_bool_t write_active;
} dev_status_active_t;
typedef struct dev_status_empty_t {

View File

@@ -65,6 +65,7 @@ extern void ui_sb_update_panes(void);
extern void ui_sb_update_text(void);
extern void ui_sb_update_tip(int meaning);
extern void ui_sb_update_icon(int tag, int active);
extern void ui_sb_update_icon_write(int tag, int write);
extern void ui_sb_update_icon_state(int tag, int state);
extern void ui_sb_set_text_w(wchar_t *wstr);
extern void ui_sb_set_text(char *str);

View File

@@ -90,6 +90,7 @@ typedef struct ibm8514_t {
uint16_t subsys_cntl;
uint16_t setup_md;
uint16_t advfunc_cntl;
uint16_t advfunc_cntl_old;
uint16_t cur_y;
uint16_t cur_x;
int16_t destx;
@@ -107,8 +108,10 @@ typedef struct ibm8514_t {
uint16_t wrt_mask;
uint16_t rd_mask;
uint16_t color_cmp;
uint16_t bkgd_mix;
uint16_t frgd_mix;
uint8_t bkgd_mix;
uint8_t frgd_mix;
uint8_t bkgd_sel;
uint8_t frgd_sel;
uint16_t multifunc_cntl;
uint16_t multifunc[16];
uint16_t clip_right;
@@ -159,6 +162,14 @@ typedef struct ibm8514_t {
int ydir;
int linedraw;
uint32_t ge_offset;
uint32_t src_ge_offset;
uint32_t dst_ge_offset;
uint16_t src_pitch;
uint16_t dst_pitch;
int64_t cur_x_24bpp;
int64_t cur_y_24bpp;
int64_t dest_x_24bpp;
int64_t dest_y_24bpp;
} accel;
uint16_t test;
@@ -240,6 +251,8 @@ typedef struct ibm8514_t {
uint32_t vram_amount;
int vram_512k_8514;
int vendor_mode;
int _8514on;
int _8514crt;
PALETTE _8514pal;
latch8514_t latch;

View File

@@ -77,8 +77,9 @@ typedef struct mach_t {
uint8_t overscan_g_col_24;
uint8_t overscan_r_col_24;
uint16_t fifo_test_data[17];
int port_len;
int crt_resolution;
uint8_t old_on1;
uint8_t old_on2;
int crt_resolution;
struct {
uint8_t line_idx;
@@ -99,12 +100,13 @@ typedef struct mach_t {
uint16_t src_x_end;
uint16_t src_x_start;
uint16_t src_x;
uint16_t r_src_x;
uint16_t src_y;
int16_t bres_count;
uint16_t clock_sel;
uint16_t crt_pitch;
uint16_t ge_pitch;
uint16_t src_pitch;
uint16_t dst_pitch;
uint16_t dest_cmp_fn;
uint16_t dp_config;
uint16_t ext_ge_config;
@@ -158,14 +160,18 @@ typedef struct mach_t {
int src_stepx;
uint8_t mono_pattern_normal[16];
uint8_t color_pattern[32];
uint16_t color_pattern_hicol[8];
int mono_pattern[8][8];
uint32_t ge_offset;
uint32_t src_ge_offset;
uint32_t dst_ge_offset;
uint32_t crt_offset;
uint32_t patt_len_reg;
int poly_fill;
uint16_t dst_clr_cmp_mask;
int clip_overrun;
int color_pattern_idx;
int64_t src_x_scan;
int64_t src_y_scan;
} accel;
atomic_int force_busy;

View File

@@ -171,11 +171,11 @@ typedef struct svga_t {
latch_t latch;
pc_timer_t timer;
pc_timer_t timer8514;
pc_timer_t timer_8514;
pc_timer_t timer_xga;
double clock;
double clock8514;
double clock_8514;
double clock_xga;
double multiplier;

View File

@@ -653,7 +653,7 @@ do_format(hdc_t *dev, drive_t *drive, ccb_t *ccb)
case STATE_FINIT:
do_fmt:
/* Activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1);
/* Seek to cylinder. */
if (do_seek(dev, drive, start_cyl)) {
@@ -691,7 +691,7 @@ do_fmt:
}
/* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
/* This saves us a LOT of code. */
dev->state = STATE_FINIT;
@@ -705,6 +705,7 @@ do_fmt:
if (intr) {
/* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
do_finish(dev);
}
@@ -970,7 +971,7 @@ do_send:
case STATE_RECV:
/* Activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1);
do_recv:
/* Ready to transfer the data in. */
dev->state = STATE_RDATA;
@@ -1000,7 +1001,7 @@ do_recv:
ps1_hdc_log("HDC: CMD_WRITE_SECTORS out of data (idx=%d, len=%d)!\n", dev->buf_idx, dev->buf_len);
/* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
dev->intstat |= ISR_EQUIP_CHECK;
dev->ssb.need_reset = 1;
@@ -1025,7 +1026,7 @@ do_recv:
/* Get address of sector to write. */
if (get_sector(dev, drive, &addr)) {
/* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
do_finish(dev);
return;
@@ -1038,7 +1039,7 @@ do_recv:
dev->buf_idx = 0;
if (--dev->count == 0) {
/* De-activate the status icon. */
ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0);
ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0);
if (!(dev->ctrl & ACR_DMA_EN))
dev->status &= ~ASR_DATA_REQ;

View File

@@ -432,7 +432,8 @@ network_rx_queue(void *priv)
bool activity = rx_bytes || tx_bytes;
bool led_on = card->led_timer & 0x80000000;
if ((activity && !led_on) || (card->led_timer & 0x7fffffff) >= 150000) {
ui_sb_update_icon(SB_NETWORK | card->card_num, activity);
ui_sb_update_icon(SB_NETWORK | card->card_num, !!(rx_bytes));
ui_sb_update_icon_write(SB_NETWORK | card->card_num, !!(tx_bytes));
card->led_timer = 0 | (activity << 31);
}
@@ -577,6 +578,7 @@ void
network_reset(void)
{
ui_sb_update_icon(SB_NETWORK, 0);
ui_sb_update_icon_write(SB_NETWORK, 0);
#ifdef ENABLE_NETWORK_LOG
network_dump_mutex = thread_create_mutex();

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -112,7 +112,7 @@ msgid "Hi&DPI scaling"
msgstr "Hi&DPI-schaling"
msgid "&Fullscreen"
msgstr "&Fullscreen"
msgstr "&Volledig scherm"
msgid "Fullscreen &stretch mode"
msgstr "Volledig scherm &uitrekmodus"
@@ -670,16 +670,16 @@ msgid "Surface images"
msgstr "Oppervlakte-images"
msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine."
msgstr "Machine \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/machines. Overschakelen naar een beschikbare machine."
msgstr "Machine \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/machines. Er wordt overgeschakeld naar een beschikbare machine."
msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card."
msgstr "Videokaart \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Overschakel over naar een beschikbare videokaart."
msgstr "Videokaart \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Er wordt overgeschakeld naar een beschikbare videokaart."
msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card."
msgstr "Videokaart #2 \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Uitschakel de tweede videokaart."
msgstr "Videokaart #2 \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. De tweede videokaart wordt uitgeschakeld."
msgid "Device \"%hs\" is not available due to missing ROMs. Ignoring the device."
msgstr "Het apparaat \"%hs\" is niet beschikbaar door ontbrekende ROMs. Negeer het apparaat."
msgstr "Het apparaat \"%hs\" is niet beschikbaar door ontbrekende ROMs. Het apparaat wordt genegeerd."
msgid "Machine"
msgstr "Machine"
@@ -1018,7 +1018,7 @@ msgid "Differencing VHD"
msgstr "Verschil-VHD"
msgid "(N/A)"
msgstr "(N/A)"
msgstr "(N/B)"
msgid "Raw image (.img)"
msgstr "Ruw image (.img)"
@@ -1054,7 +1054,7 @@ msgid "This could mean that the parent image was modified after the differencing
msgstr "Dit kan betekenen dat de bovenliggende image is gewijzigd nadat de verschil-image is gemaakt.\n\nDit kan ook gebeuren als de imagebestanden zijn verplaatst of gekopieerd, of door een fout in het programma waarmee deze schijf is gemaakt.\n\nWil je de tijdstempels herstellen?"
msgid "Parent and child disk timestamps do not match"
msgstr "Bovenliggende en onderliggende schijf tijdstempels komen niet overeen"
msgstr "Bovenliggende en onderliggende schijftijdstempels komen niet overeen"
msgid "Could not fix VHD timestamp."
msgstr "Kan VHD tijdstempel niet herstellen."
@@ -1234,7 +1234,7 @@ msgid "Open screenshots folder..."
msgstr "Map met schermafbeeldingen openen..."
msgid "Apply fullscreen stretch mode when maximized"
msgstr "Pas fullscreen stretchmodus toe wanneer gemaximaliseerd"
msgstr "Schakel de volledig scherm-uitrekmodus in bij maximaliseren"
msgid "Cursor/Puck"
msgstr "Cursor/Puck"
@@ -1291,7 +1291,7 @@ msgid "Browse..."
msgstr "Bladeren..."
msgid "Couldn't create OpenGL context."
msgstr "Kan OpenGL context niet maken."
msgstr "Kan OpenGL context niet aanmaken."
msgid "Couldn't switch to OpenGL context."
msgstr "Kan niet overschakelen naar OpenGL context."
@@ -1444,7 +1444,7 @@ msgid "Enable backlight"
msgstr "Backlight inschakelen"
msgid "Invert colors"
msgstr "Kleuren omkeren"
msgstr "Kleuren inverteren"
msgid "BIOS size"
msgstr "BIOS-grootte"
@@ -1810,7 +1810,7 @@ msgid "Five + Wheel"
msgstr "Vijf + Wiel"
msgid "Five + 2 Wheels"
msgstr ""
msgstr "Vijf + 2 Wielen"
msgid "A3 - SMT2 Serial / SMT3(R)V"
msgstr "A3 - SMT2 Serieel / SMT3(R)V"
@@ -1957,13 +1957,13 @@ msgid "Bochs latest"
msgstr "Bochs nieuwste"
msgid "Mono Non-Interlaced"
msgstr "Mono Non-Interlaced"
msgstr "Mono niet geïnterlaced"
msgid "Color Interlaced"
msgstr "Kleur interlaced"
msgid "Color Non-Interlaced"
msgstr "Kleur non-interlaced"
msgstr "Kleur niet geïnterlaced"
msgid "3Dfx Voodoo Graphics"
msgstr "3Dfx Voodoo Graphics"
@@ -2053,34 +2053,34 @@ msgid "High performance impact"
msgstr "Hoge prestatie-impact"
msgid "[Generic] RAM Disk (max. speed)"
msgstr "[Generic] RAM-schijf (max. snelheid)"
msgstr "[Generiek] RAM-schijf (max. snelheid)"
msgid "[Generic] 1989 (3500 RPM)"
msgstr ""
msgstr "[Generiek] 1989 (3500 RPM)"
msgid "[Generic] 1992 (3600 RPM)"
msgstr ""
msgstr "[Generiek] 1992 (3600 RPM)"
msgid "[Generic] 1994 (4500 RPM)"
msgstr ""
msgstr "[Generiek] 1994 (4500 RPM)"
msgid "[Generic] 1996 (5400 RPM)"
msgstr ""
msgstr "[Generiek] 1996 (5400 RPM)"
msgid "[Generic] 1997 (5400 RPM)"
msgstr ""
msgstr "[Generiek] 1997 (5400 RPM)"
msgid "[Generic] 1998 (5400 RPM)"
msgstr ""
msgstr "[Generiek] 1998 (5400 RPM)"
msgid "[Generic] 2000 (7200 RPM)"
msgstr ""
msgstr "[Generiek] 2000 (7200 RPM)"
msgid "IBM 8514/A clone (ISA)"
msgstr "IBM 8514/A-kloon (ISA)"
msgid "Vendor"
msgstr "Verkoper"
msgstr "Leverancier"
msgid "Generic PC/XT Memory Expansion"
msgstr "Generieke PC/XT geheugenuitbreiding"
@@ -2095,64 +2095,64 @@ msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for t
msgstr "TrueType lettertypen in de map \"roms/printer/fonts\" zijn nodig voor de emulatie van de generieke ESC/P dot-matrix-printer."
msgid "Inhibit multimedia keys"
msgstr ""
msgstr "Multimedia-toetsen blokkeren"
msgid "Ask for confirmation before saving settings"
msgstr ""
msgstr "Vraag om bevestiging voor het opslaan van instellingen"
msgid "Ask for confirmation before hard resetting"
msgstr ""
msgstr "Vraag om bevestiging voor een harde reset"
msgid "Ask for confirmation before quitting"
msgstr ""
msgstr "Vraag om bevestiging voor afsluiten"
msgid "Display hotkey message when entering full-screen mode"
msgstr ""
msgstr "Toon een sneltoetsmelding bij het openen van de volledigschermmodus"
msgid "Options"
msgstr ""
msgstr "Opties"
msgid "Model"
msgstr ""
msgstr "Model"
msgid "Model:"
msgstr ""
msgstr "Model:"
msgid "Failed to initialize Vulkan renderer."
msgstr ""
msgstr "Initialisatie van de Vulkan-renderer is mislukt."
msgid "GLSL Error"
msgstr ""
msgstr "GLSL-fout"
msgid "Could not load shader: %1"
msgstr ""
msgstr "Kon de shader niet laden: %1"
msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
msgstr ""
msgstr "OpenGL versie 3.0 of hoger is vereist. Huidige GLSL-versie is %1.%2"
msgid "Could not load texture: %1"
msgstr ""
msgstr "Kon de textuur niet laden: %1"
msgid "Could not compile shader:\n\n%1"
msgstr ""
msgstr "Kon de shader niet compileren:\n\n%1"
msgid "Program not linked:\n\n%1"
msgstr ""
msgstr "Programma niet gelinkt:\n\n%1"
msgid "Shader Manager"
msgstr ""
msgstr "Shaderbeheer"
msgid "Shader Configuration"
msgstr ""
msgstr "Shaderconfiguratie"
msgid "Add"
msgstr ""
msgstr "Toevoegen"
msgid "Move up"
msgstr ""
msgstr "Omhoog verplaatsen"
msgid "Move down"
msgstr ""
msgstr "Omlaag verplaatsen"
msgid "Could not load file %1"
msgstr ""
msgstr "Kon bestand %1 niet laden"

View File

@@ -1618,7 +1618,7 @@ msgid "CODEC"
msgstr "Кодек"
msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)"
msgstr "Поднимать прерывание кодека при настройке кодека (необходимо некоторым драйверам)."
msgstr "Поднимать прерывание кодека при настройке кодека (необходимо некоторым драйверам)"
msgid "SB Address"
msgstr "Адрес SB"
@@ -1885,7 +1885,7 @@ msgid "Color (generic)"
msgstr "Цветной (стандартный)"
msgid "Green Monochrome"
msgstr "Зеленый монохромный"
msgstr "Зелёный монохромный"
msgid "Amber Monochrome"
msgstr "Янтарный монохромный"
@@ -2059,22 +2059,22 @@ msgid "[Generic] 1989 (3500 RPM)"
msgstr "[Стандартный] 1989 (3500 RPM)"
msgid "[Generic] 1992 (3600 RPM)"
msgstr "[Стандартный] 1989 (3500 RPM)"
msgstr "[Стандартный] 1992 (3600 RPM)"
msgid "[Generic] 1994 (4500 RPM)"
msgstr "[Стандартный] 1989 (3500 RPM)"
msgstr "[Стандартный] 1994 (4500 RPM)"
msgid "[Generic] 1996 (5400 RPM)"
msgstr "[Стандартный] 1989 (3500 RPM)"
msgstr "[Стандартный] 1996 (5400 RPM)"
msgid "[Generic] 1997 (5400 RPM)"
msgstr "[Стандартный] 1989 (3500 RPM)"
msgstr "[Стандартный] 1997 (5400 RPM)"
msgid "[Generic] 1998 (5400 RPM)"
msgstr "[Стандартный] 1989 (3500 RPM)"
msgstr "[Стандартный] 1998 (5400 RPM)"
msgid "[Generic] 2000 (7200 RPM)"
msgstr "[Стандартный] 1989 (3500 RPM)"
msgstr "[Стандартный] 2000 (7200 RPM)"
msgid "IBM 8514/A clone (ISA)"
msgstr "Клон IBM 8514/A (ISA)"
@@ -2162,3 +2162,45 @@ msgstr "Вниз"
msgid "Could not load file %1"
msgstr "Не удалось загрузить файл %1"
msgid "Key Bindings:"
msgstr "Привязки клавиш:"
msgid "Action"
msgstr "Действие"
msgid "Keybind"
msgstr "Привязка клавиш"
msgid "Clear binding"
msgstr "Очистить привязку"
msgid "Bind"
msgstr "Привязка"
msgid "Bind Key"
msgstr "Привязать клавишу"
msgid "Enter key combo:"
msgstr "Введите комбинацию клавиш:"
msgid "Send Control+Alt+Del"
msgstr "Отправить Control+Alt+Del"
msgid "Send Control+Alt+Escape"
msgstr "Отправить Control+Alt+Escape"
msgid "Toggle fullscreen"
msgstr "Переключить на полноэкранный режим"
msgid "Screenshot"
msgstr "Скриншот"
msgid "Release mouse pointer"
msgstr "Отпустить указатель мыши"
msgid "Toggle pause"
msgstr "Переключить паузу"
msgid "Toggle mute"
msgstr "Переключить беззвучный режим"

View File

@@ -8,6 +8,8 @@ getIndicatorIcon(IconIndicator indicator)
switch (indicator) {
case Active:
return QIcon(":/settings/qt/icons/active.ico");
case WriteActive:
return QIcon(":/settings/qt/icons/write_active.ico");
case Disabled:
return QIcon(":/settings/qt/icons/disabled.ico");
default:
@@ -24,9 +26,13 @@ getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode,
return iconPixmap;
auto painter = QPainter(&iconPixmap);
auto indicatorPixmap = getIndicatorIcon(indicator).pixmap(size);
auto indicatorPixmap = getIndicatorIcon(indicator == ReadWriteActive ? Active : indicator).pixmap(size);
painter.drawPixmap(0, 0, indicatorPixmap);
if (indicator == ReadWriteActive) {
auto writeIndicatorPixmap = getIndicatorIcon(WriteActive).pixmap(size);
painter.drawPixmap(0, 0, writeIndicatorPixmap);
}
painter.end();
return iconPixmap;

View File

@@ -7,6 +7,8 @@
enum IconIndicator {
None,
Active,
WriteActive,
ReadWriteActive,
Disabled,
};

View File

@@ -88,7 +88,7 @@ QKeySequence
KeyBinder::BindKey(QWidget* widget, QString CurValue)
{
KeyBinder kb(widget);
kb.setWindowTitle("Bind Key");
kb.setWindowTitle(tr("Bind Key"));
kb.setFixedSize(kb.minimumSizeHint());
kb.findChild<QKeySequenceEdit*>()->setKeySequence(QKeySequence::fromString(CurValue));
kb.setEnabled(true);

View File

@@ -68,6 +68,8 @@ namespace {
struct PixmapSetActive {
QPixmap normal;
QPixmap active;
QPixmap write_active;
QPixmap read_write_active;
void load(const QIcon &icon);
};
struct PixmapSetDisabled {
@@ -85,6 +87,10 @@ struct PixmapSetEmptyActive {
QPixmap active;
QPixmap empty;
QPixmap empty_active;
QPixmap write_active;
QPixmap read_write_active;
QPixmap empty_write_active;
QPixmap empty_read_write_active;
void load(const QIcon &icon);
};
struct Pixmaps {
@@ -105,6 +111,7 @@ struct StateActive {
std::unique_ptr<QLabel> label;
PixmapSetActive *pixmaps = nullptr;
bool active = false;
bool write_active = false;
void setActive(bool b)
{
@@ -115,11 +122,23 @@ struct StateActive {
refresh();
}
void setWriteActive(bool b)
{
if (!label || b == write_active)
return;
write_active = b;
refresh();
}
void refresh()
{
if (!label)
return;
label->setPixmap(active ? pixmaps->active : pixmaps->normal);
if (active && write_active)
label->setPixmap(pixmaps->read_write_active);
else
label->setPixmap(write_active ? pixmaps->write_active : (active ? pixmaps->active : pixmaps->normal));
}
};
struct StateEmpty {
@@ -145,9 +164,10 @@ struct StateEmpty {
};
struct StateEmptyActive {
std::unique_ptr<QLabel> label;
PixmapSetEmptyActive *pixmaps = nullptr;
bool empty = false;
bool active = false;
PixmapSetEmptyActive *pixmaps = nullptr;
bool empty = false;
bool active = false;
bool write_active = false;
void setActive(bool b)
{
@@ -157,6 +177,14 @@ struct StateEmptyActive {
active = b;
refresh();
}
void setWriteActive(bool b)
{
if (!label || b == write_active)
return;
write_active = b;
refresh();
}
void setEmpty(bool b)
{
if (!label || b == empty)
@@ -170,9 +198,15 @@ struct StateEmptyActive {
if (!label)
return;
if (empty) {
label->setPixmap(active ? pixmaps->empty_active : pixmaps->empty);
if (active && write_active)
label->setPixmap(pixmaps->empty_read_write_active);
else
label->setPixmap(write_active ? pixmaps->empty_write_active : (active ? pixmaps->empty_active : pixmaps->empty));
} else {
label->setPixmap(active ? pixmaps->active : pixmaps->normal);
if (active && write_active)
label->setPixmap(pixmaps->read_write_active);
else
label->setPixmap(write_active ? pixmaps->write_active : (active ? pixmaps->active : pixmaps->normal));
}
}
};
@@ -191,6 +225,9 @@ PixmapSetActive::load(const QIcon &icon)
{
normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None);
active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active);
write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteActive);
read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, ReadWriteActive);
}
void
@@ -203,10 +240,14 @@ PixmapSetDisabled::load(const QIcon &icon)
void
PixmapSetEmptyActive::load(const QIcon &icon)
{
normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None);
active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active);
empty = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, None);
empty_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, Active);
normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None);
active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active);
write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteActive);
read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, ReadWriteActive);
empty = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, None);
empty_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, Active);
empty_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, WriteActive);
empty_read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, ReadWriteActive);
}
}
@@ -217,10 +258,13 @@ struct MachineStatus::States {
{
pixmaps.cartridge.load(QIcon(":/settings/qt/icons/cartridge.ico"));
pixmaps.cassette.load(QIcon(":/settings/qt/icons/cassette.ico"));
pixmaps.floppy_disabled.normal = QIcon(":/settings/qt/icons/floppy_disabled.ico").pixmap(pixmap_size);
pixmaps.floppy_disabled.active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.normal = QIcon(":/settings/qt/icons/floppy_disabled.ico").pixmap(pixmap_size);
pixmaps.floppy_disabled.active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.read_write_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty_write_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_disabled.empty_read_write_active = pixmaps.floppy_disabled.normal;
pixmaps.floppy_525.load(QIcon(":/settings/qt/icons/floppy_525.ico"));
pixmaps.floppy_35.load(QIcon(":/settings/qt/icons/floppy_35.ico"));
pixmaps.cdrom.load(QIcon(":/settings/qt/icons/cdrom.ico"));
@@ -435,49 +479,79 @@ MachineStatus::refreshIcons()
if (!update_icons)
return;
for (size_t i = 0; i < FDD_NUM; ++i)
for (size_t i = 0; i < FDD_NUM; ++i) {
d->fdd[i].setActive(machine_status.fdd[i].active);
d->fdd[i].setWriteActive(machine_status.fdd[i].write_active);
}
for (size_t i = 0; i < CDROM_NUM; ++i) {
d->cdrom[i].setActive(machine_status.cdrom[i].active);
if (machine_status.cdrom[i].active)
d->cdrom[i].setWriteActive(machine_status.cdrom[i].write_active);
if (machine_status.cdrom[i].active) {
ui_sb_update_icon(SB_CDROM | i, 0);
}
if (machine_status.cdrom[i].write_active) {
ui_sb_update_icon_write(SB_CDROM | i, 0);
}
}
for (size_t i = 0; i < ZIP_NUM; i++) {
d->zip[i].setActive(machine_status.zip[i].active);
d->zip[i].setWriteActive(machine_status.zip[i].write_active);
if (machine_status.zip[i].active)
ui_sb_update_icon(SB_ZIP | i, 0);
if (machine_status.zip[i].write_active)
ui_sb_update_icon_write(SB_ZIP | i, 0);
}
for (size_t i = 0; i < MO_NUM; i++) {
d->mo[i].setActive(machine_status.mo[i].active);
d->mo[i].setWriteActive(machine_status.mo[i].write_active);
if (machine_status.mo[i].active)
ui_sb_update_icon(SB_MO | i, 0);
if (machine_status.mo[i].write_active)
ui_sb_update_icon_write(SB_MO | i, 0);
}
for (size_t i = 0; i < HDD_BUS_USB; i++) {
d->hdds[i].setActive(machine_status.hdd[i].active);
d->hdds[i].setWriteActive(machine_status.hdd[i].write_active);
if (machine_status.hdd[i].active)
ui_sb_update_icon(SB_HDD | i, 0);
if (machine_status.hdd[i].write_active)
ui_sb_update_icon_write(SB_HDD | i, 0);
}
for (size_t i = 0; i < NET_CARD_MAX; i++)
for (size_t i = 0; i < NET_CARD_MAX; i++) {
d->net[i].setActive(machine_status.net[i].active);
d->net[i].setWriteActive(machine_status.net[i].write_active);
}
}
void
MachineStatus::clearActivity()
{
for (auto &fdd : d->fdd)
for (auto &fdd : d->fdd) {
fdd.setActive(false);
for (auto &cdrom : d->cdrom)
fdd.setWriteActive(false);
}
for (auto &cdrom : d->cdrom) {
cdrom.setActive(false);
for (auto &zip : d->zip)
cdrom.setWriteActive(false);
}
for (auto &zip : d->zip) {
zip.setActive(false);
for (auto &mo : d->mo)
zip.setWriteActive(false);
}
for (auto &mo : d->mo) {
mo.setActive(false);
for (auto &hdd : d->hdds)
mo.setWriteActive(false);
}
for (auto &hdd : d->hdds) {
hdd.setActive(false);
for (auto &net : d->net)
hdd.setWriteActive(false);
}
for (auto &net : d->net) {
net.setActive(false);
net.setWriteActive(false);
}
}
void
@@ -562,6 +636,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->fdd[i].label = std::make_unique<ClickableLabel>();
d->fdd[i].setEmpty(QString(floppyfns[i]).isEmpty());
d->fdd[i].setActive(false);
d->fdd[i].setWriteActive(false);
d->fdd[i].refresh();
connect((ClickableLabel *) d->fdd[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->floppyMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->floppyMenus[i]->sizeHint().height()));
@@ -578,6 +653,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->cdrom[i].label = std::make_unique<ClickableLabel>();
d->cdrom[i].setEmpty(QString(cdrom[i].image_path).isEmpty());
d->cdrom[i].setActive(false);
d->cdrom[i].setWriteActive(false);
d->cdrom[i].refresh();
connect((ClickableLabel *) d->cdrom[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->cdromMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->cdromMenus[i]->sizeHint().height()));
@@ -594,6 +670,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->zip[i].label = std::make_unique<ClickableLabel>();
d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty());
d->zip[i].setActive(false);
d->zip[i].setWriteActive(false);
d->zip[i].refresh();
connect((ClickableLabel *) d->zip[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->zipMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->zipMenus[i]->sizeHint().height()));
@@ -610,6 +687,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->mo[i].label = std::make_unique<ClickableLabel>();
d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty());
d->mo[i].setActive(false);
d->mo[i].setWriteActive(false);
d->mo[i].refresh();
connect((ClickableLabel *) d->mo[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->moMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->moMenus[i]->sizeHint().height()));
@@ -626,6 +704,7 @@ MachineStatus::refresh(QStatusBar *sbar)
d->net[i].label = std::make_unique<ClickableLabel>();
d->net[i].setEmpty(!network_is_connected(i));
d->net[i].setActive(false);
d->net[i].setWriteActive(false);
d->net[i].refresh();
d->net[i].label->setToolTip(MediaMenu::ptr->netMenus[i]->title());
connect((ClickableLabel *) d->net[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
@@ -638,13 +717,14 @@ MachineStatus::refresh(QStatusBar *sbar)
if ((has_mfm || (hdc_name.left(5) == QStringLiteral("st506"))) && (c_mfm > 0)) {
d->hdds[HDD_BUS_MFM].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_MFM].setActive(false);
d->hdds[HDD_BUS_MFM].setWriteActive(false);
d->hdds[HDD_BUS_MFM].refresh();
d->hdds[HDD_BUS_MFM].label->setToolTip(tr("Hard disk (%1)").arg("MFM/RLL"));
auto tooltip = d->hdds[HDD_BUS_MFM].label->toolTip();
tooltip.append("\n");
for (int i = 0; i < HDD_NUM; i++) {
if (hdd[i].bus_type == HDD_BUS_MFM && hdd[i].fn[0] != 0) {
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull)));
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB")));
}
}
d->hdds[HDD_BUS_MFM].label->setToolTip(tooltip);
@@ -653,13 +733,14 @@ MachineStatus::refresh(QStatusBar *sbar)
if ((has_esdi || (hdc_name.left(4) == QStringLiteral("esdi"))) && (c_esdi > 0)) {
d->hdds[HDD_BUS_ESDI].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_ESDI].setActive(false);
d->hdds[HDD_BUS_ESDI].setWriteActive(false);
d->hdds[HDD_BUS_ESDI].refresh();
d->hdds[HDD_BUS_ESDI].label->setToolTip(tr("Hard disk (%1)").arg("ESDI"));
auto tooltip = d->hdds[HDD_BUS_ESDI].label->toolTip();
tooltip.append("\n");
for (int i = 0; i < HDD_NUM; i++) {
if (hdd[i].bus_type == HDD_BUS_ESDI && hdd[i].fn[0] != 0) {
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull)));
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB")));
}
}
d->hdds[HDD_BUS_ESDI].label->setToolTip(tooltip);
@@ -668,13 +749,14 @@ MachineStatus::refresh(QStatusBar *sbar)
if ((has_xta || (hdc_name.left(3) == QStringLiteral("xta"))) && (c_xta > 0)) {
d->hdds[HDD_BUS_XTA].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_XTA].setActive(false);
d->hdds[HDD_BUS_XTA].setWriteActive(false);
d->hdds[HDD_BUS_XTA].refresh();
d->hdds[HDD_BUS_XTA].label->setToolTip(tr("Hard disk (%1)").arg("XTA"));
auto tooltip = d->hdds[HDD_BUS_XTA].label->toolTip();
tooltip.append("\n");
for (int i = 0; i < HDD_NUM; i++) {
if (hdd[i].bus_type == HDD_BUS_XTA && hdd[i].fn[0] != 0) {
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull)));
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB")));
}
}
d->hdds[HDD_BUS_XTA].label->setToolTip(tooltip);
@@ -686,13 +768,14 @@ MachineStatus::refresh(QStatusBar *sbar)
if (c_ide > 0) {
d->hdds[HDD_BUS_IDE].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_IDE].setActive(false);
d->hdds[HDD_BUS_IDE].setWriteActive(false);
d->hdds[HDD_BUS_IDE].refresh();
d->hdds[HDD_BUS_IDE].label->setToolTip(tr("Hard disk (%1)").arg("IDE"));
auto tooltip = d->hdds[HDD_BUS_IDE].label->toolTip();
tooltip.append("\n");
for (int i = 0; i < HDD_NUM; i++) {
if (hdd[i].bus_type == HDD_BUS_IDE && hdd[i].fn[0] != 0) {
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull)));
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB")));
}
}
d->hdds[HDD_BUS_IDE].label->setToolTip(tooltip);
@@ -701,13 +784,14 @@ MachineStatus::refresh(QStatusBar *sbar)
if (c_atapi > 0) {
d->hdds[HDD_BUS_ATAPI].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_ATAPI].setActive(false);
d->hdds[HDD_BUS_ATAPI].setWriteActive(false);
d->hdds[HDD_BUS_ATAPI].refresh();
d->hdds[HDD_BUS_ATAPI].label->setToolTip(tr("Hard disk (%1)").arg("ATAPI"));
auto tooltip = d->hdds[HDD_BUS_ATAPI].label->toolTip();
tooltip.append("\n");
for (int i = 0; i < HDD_NUM; i++) {
if (hdd[i].bus_type == HDD_BUS_ATAPI && hdd[i].fn[0] != 0) {
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull)));
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB")));
}
}
d->hdds[HDD_BUS_ATAPI].label->setToolTip(tooltip);
@@ -720,13 +804,14 @@ MachineStatus::refresh(QStatusBar *sbar)
(c_scsi > 0)) {
d->hdds[HDD_BUS_SCSI].label = std::make_unique<QLabel>();
d->hdds[HDD_BUS_SCSI].setActive(false);
d->hdds[HDD_BUS_SCSI].setWriteActive(false);
d->hdds[HDD_BUS_SCSI].refresh();
d->hdds[HDD_BUS_SCSI].label->setToolTip(tr("Hard disk (%1)").arg("SCSI"));
auto tooltip = d->hdds[HDD_BUS_SCSI].label->toolTip();
tooltip.append("\n");
for (int i = 0; i < HDD_NUM; i++) {
if (hdd[i].bus_type == HDD_BUS_SCSI && hdd[i].fn[0] != 0) {
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 4), QString::asprintf("%02d", hdd[i].channel & 15), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull)));
tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 4), QString::asprintf("%02d", hdd[i].channel & 15), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB")));
}
}
d->hdds[HDD_BUS_SCSI].label->setToolTip(tooltip);

View File

@@ -48,7 +48,6 @@ SettingsInput::SettingsInput(QWidget *parent)
{
ui->setupUi(this);
QStandardItemModel *model;
QStringList horizontalHeader;
QStringList verticalHeader;
@@ -80,15 +79,6 @@ SettingsInput::SettingsInput(QWidget *parent)
refreshInputList();
connect(ui->tableKeys, &QTableWidget::cellDoubleClicked,
this, &SettingsInput::on_tableKeys_doubleClicked);
connect(ui->pushButtonBind, &QPushButton::clicked,
this, &SettingsInput::on_pushButtonBind_Clicked);
connect(ui->pushButtonClearBind, &QPushButton::clicked,
this, &SettingsInput::on_pushButtonClearBind_Clicked);
onCurrentMachineChanged(machine);
}
@@ -195,7 +185,7 @@ SettingsInput::on_tableKeys_currentCellChanged(int currentRow, int currentColumn
}
void
SettingsInput::on_tableKeys_doubleClicked(int row, int col)
SettingsInput::on_tableKeys_cellDoubleClicked(int row, int col)
{
// Edit bind
QTableWidgetItem *cell = ui->tableKeys->item(row,1);
@@ -234,17 +224,17 @@ SettingsInput::on_tableKeys_doubleClicked(int row, int col)
}
void
SettingsInput::on_pushButtonBind_Clicked()
SettingsInput::on_pushButtonBind_clicked()
{
// Edit bind
QTableWidgetItem *cell = ui->tableKeys->currentItem();
if (!cell) return;
on_tableKeys_doubleClicked(cell->row(), cell->column());
on_tableKeys_cellDoubleClicked(cell->row(), cell->column());
}
void
SettingsInput::on_pushButtonClearBind_Clicked()
SettingsInput::on_pushButtonClearBind_clicked()
{
// Wipe bind
QTableWidgetItem *cell = ui->tableKeys->item(ui->tableKeys->currentRow(), 1);

View File

@@ -33,10 +33,10 @@ private slots:
void on_pushButtonJoystick2_clicked();
void on_pushButtonJoystick3_clicked();
void on_pushButtonJoystick4_clicked();
void on_tableKeys_doubleClicked(int row, int col);
void on_tableKeys_cellDoubleClicked(int row, int col);
void on_tableKeys_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);
void on_pushButtonBind_Clicked();
void on_pushButtonClearBind_Clicked();
void on_pushButtonBind_clicked();
void on_pushButtonClearBind_clicked();
private:
Ui::SettingsInput *ui;

View File

@@ -141,7 +141,14 @@ ui_msgbox_header(int flags, void *header, void *message)
// any error in early init
if (main_window == nullptr) {
QMessageBox msgBox(QMessageBox::Icon::Critical, hdr, msg);
auto msgicon = QMessageBox::Icon::Critical;
if (flags & MBX_INFO)
msgicon = QMessageBox::Icon::Information;
else if (flags & MBX_QUESTION)
msgicon = QMessageBox::Icon::Question;
else if (flags & MBX_WARNING)
msgicon = QMessageBox::Icon::Warning;
QMessageBox msgBox(msgicon, hdr, msg);
msgBox.exec();
} else {
// else scope it to main_window
@@ -307,4 +314,41 @@ ui_sb_update_icon(int tag, int active)
break;
}
}
void
ui_sb_update_icon_write(int tag, int write)
{
const auto temp = static_cast<unsigned int>(tag);
const int category = static_cast<int>(temp & 0xfffffff0);
const int item = tag & 0xf;
switch (category) {
default:
case SB_CASSETTE:
case SB_CARTRIDGE:
break;
case SB_FLOPPY:
machine_status.fdd[item].write_active = write > 0 ? true : false;
break;
case SB_CDROM:
machine_status.cdrom[item].write_active = write > 0 ? true : false;
break;
case SB_ZIP:
machine_status.zip[item].write_active = write > 0 ? true : false;
break;
case SB_MO:
machine_status.mo[item].write_active = write > 0 ? true : false;
break;
case SB_HDD:
machine_status.hdd[item].write_active = write > 0 ? true : false;
break;
case SB_NETWORK:
machine_status.net[item].write_active = write > 0 ? true : false;
break;
case SB_SOUND:
case SB_TEXT:
break;
}
}
}

View File

@@ -28,6 +28,7 @@
<file>qt/icons/zip.ico</file>
<file>qt/icons/zip_disabled.ico</file>
<file>qt/icons/active.ico</file>
<file>qt/icons/write_active.ico</file>
<file>qt/icons/disabled.ico</file>
<file>qt/icons/86Box-gray.ico</file>
<file>qt/icons/86Box-green.ico</file>

View File

@@ -614,6 +614,7 @@ scsi_disk_cmd_error(scsi_disk_t *dev)
dev->callback = 50.0 * SCSI_TIME;
scsi_disk_set_callback(dev);
ui_sb_update_icon(SB_HDD | dev->drv->bus_type, 0);
ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type, 0);
scsi_disk_log(dev->log, "ERROR: %02X/%02X/%02X\n", scsi_disk_sense_key,
scsi_disk_asc, scsi_disk_ascq);
}
@@ -1208,7 +1209,7 @@ scsi_disk_command(scsi_common_t *sc, const uint8_t *cdb)
scsi_disk_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1);
ui_sb_update_icon(SB_HDD | dev->drv->bus_type, dev->packet_status != PHASE_COMPLETE);
ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type, dev->packet_status != PHASE_COMPLETE);
} else {
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
scsi_disk_log(dev->log, "All done - callback set\n");
@@ -1243,7 +1244,7 @@ scsi_disk_command(scsi_common_t *sc, const uint8_t *cdb)
scsi_disk_data_command_finish(dev, 512, 512, alloc_length, 1);
ui_sb_update_icon(SB_HDD | dev->drv->bus_type,
ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type,
dev->packet_status != PHASE_COMPLETE);
} else {
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);

View File

@@ -471,6 +471,12 @@ ui_sb_update_icon(UNUSED(int tag), UNUSED(int active))
/* No-op. */
}
void
ui_sb_update_icon_write(UNUSED(int tag), UNUSED(int active))
{
/* No-op. */
}
void
plat_delay_ms(uint32_t count)
{

View File

@@ -124,7 +124,7 @@ CLAMP(int16_t in, int16_t min, int16_t max)
#define MIX(mixmode, dest_dat, src_dat) \
{ \
switch ((mixmode) ? (dev->accel.frgd_mix & 0x1f) : (dev->accel.bkgd_mix & 0x1f)) { \
switch ((mixmode) ? dev->accel.frgd_mix : dev->accel.bkgd_mix) { \
case 0x00: \
dest_dat = ~dest_dat; \
break; \
@@ -268,8 +268,8 @@ ibm8514_accel_out_pixtrans(svga_t *svga, UNUSED(uint16_t port), uint32_t val, in
uint32_t monoxfer = 0xffffffff;
int pixcnt = 0;
int pixcntl = (dev->accel.multifunc[0x0a] >> 6) & 3;
int frgd_mix = (dev->accel.frgd_mix >> 5) & 3;
int bkgd_mix = (dev->accel.bkgd_mix >> 5) & 3;
int frgd_mix = dev->accel.frgd_sel;
int bkgd_mix = dev->accel.bkgd_sel;
int cmd = dev->accel.cmd >> 13;
if (!dev->accel.cmd_back) {
@@ -351,13 +351,12 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
case 0x6e8:
/*In preparation to switch from VGA to 8514/A mode*/
WRITE8(port, dev->hdisped, val);
dev->hdisp = (dev->hdisped + 1) << 3;
ibm8514_log("[%04X:%08X]: IBM 8514/A: (0x%04x): hdisp=0x%02x.\n", CS, cpu_state.pc, port, val);
svga_recalctimings(svga);
break;
case 0x6e9:
WRITE8(port, dev->htotal, val);
WRITE8(port - 1, dev->htotal, val);
ibm8514_log("IBM 8514/A compatible: (0x%04x): htotal=0x%02x.\n", port, val);
svga_recalctimings(svga);
break;
@@ -379,10 +378,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
if (len == 2) {
dev->v_total_reg = val;
dev->v_total_reg &= 0x1fff;
dev->v_total = dev->v_total_reg + 1;
if (dev->interlace)
dev->v_total >>= 1;
ibm8514_log("IBM 8514/A compatible: (0x%04x): vtotal=0x%02x.\n", port, val);
svga_recalctimings(svga);
} else {
@@ -392,12 +387,8 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
case 0x12e9:
/*In preparation to switch from VGA to 8514/A mode*/
if (len == 1) {
WRITE8(port, dev->v_total_reg, val);
WRITE8(port, dev->v_total_reg, val >> 8);
dev->v_total_reg &= 0x1fff;
dev->v_total = dev->v_total_reg + 1;
if (dev->interlace)
dev->v_total >>= 1;
ibm8514_log("IBM 8514/A compatible: (0x%04x): vtotal=0x%02x.\n", port, val);
svga_recalctimings(svga);
}
@@ -408,7 +399,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
if (len == 2) {
dev->v_disp = val;
dev->v_disp &= 0x1fff;
dev->vdisp = (dev->v_disp + 1) >> 1;
ibm8514_log("IBM 8514/A: V_DISP write 16E8 = %d\n", dev->v_disp);
ibm8514_log("IBM 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val);
svga_recalctimings(svga);
@@ -419,9 +409,8 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
case 0x16e9:
/*In preparation to switch from VGA to 8514/A mode*/
if (len == 1) {
WRITE8(port, dev->v_disp, val);
WRITE8(port, dev->v_disp, val >> 8);
dev->v_disp &= 0x1fff;
dev->vdisp = (dev->v_disp + 1) >> 1;
ibm8514_log("IBM 8514/A: V_DISP write 16E8 = %d\n", dev->v_disp);
ibm8514_log("IBM 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val);
svga_recalctimings(svga);
@@ -433,10 +422,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
if (len == 2) {
dev->v_sync_start = val;
dev->v_sync_start &= 0x1fff;
dev->v_syncstart = dev->v_sync_start + 1;
if (dev->interlace)
dev->v_syncstart >>= 1;
ibm8514_log("IBM 8514/A compatible: V_SYNCSTART write 1AE8 = %d\n", dev->v_syncstart);
ibm8514_log("IBM 8514/A compatible: (0x%04x): vsyncstart=0x%02x.\n", port, val);
svga_recalctimings(svga);
@@ -447,7 +432,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
case 0x1ae9:
/*In preparation to switch from VGA to 8514/A mode*/
if (len == 1) {
WRITE8(port, dev->v_sync_start, val);
WRITE8(port, dev->v_sync_start, val >> 8);
dev->v_sync_start &= 0x1fff;
dev->v_syncstart = dev->v_sync_start + 1;
if (dev->interlace)
@@ -639,11 +624,15 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
break;
case 0xb6e8:
dev->accel.bkgd_mix = val & 0xff;
dev->accel.bkgd_mix = val & 0x1f;
dev->accel.bkgd_sel = (val >> 5) & 3;
ibm8514_log("Background Mix reg=%02x.\n", val);
break;
case 0xbae8:
dev->accel.frgd_mix = val & 0xff;
dev->accel.frgd_mix = val & 0x1f;
dev->accel.frgd_sel = (val >> 5) & 3;
ibm8514_log("Foreground Mix reg=%02x.\n", val);
break;
case 0xbee8:
@@ -667,7 +656,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len)
if ((dev->accel.multifunc_cntl >> 12) == 4)
dev->accel.clip_right = dev->accel.multifunc[4] & 0x7ff;
}
break;
@@ -821,8 +809,22 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len)
if (dev->fifo_idx > 0)
dev->fifo_idx--;
if (dev->force_busy)
if (dev->force_busy) {
temp |= 0x0200; /*Hardware busy*/
switch (dev->accel.cmd >> 13) {
case 2:
case 3:
case 4:
case 6:
if (dev->accel.sy < 0)
dev->force_busy = 0;
break;
default:
if (!dev->accel.sy)
dev->force_busy = 0;
break;
}
}
if (dev->data_available) {
temp |= 0x0100; /*Read Data available*/
@@ -1066,8 +1068,8 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
rd_mask_polygon &= 0xff;
}
frgd_mix = (dev->accel.frgd_mix >> 5) & 3;
bkgd_mix = (dev->accel.bkgd_mix >> 5) & 3;
frgd_mix = dev->accel.frgd_sel;
bkgd_mix = dev->accel.bkgd_sel;
if (cpu_input) {
if ((dev->accel.cmd & 0x02) || (pixcntl == 2)) {
@@ -1821,12 +1823,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff;
dev->accel.sy = dev->accel.multifunc[0] & 0x7ff;
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else if (dev->bpp)
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
if (cmd == 4)
dev->accel.cmd |= 0x02;
@@ -2030,12 +2027,7 @@ skip_vector_rect_write:
break;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else if (dev->bpp)
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.sy--;
dev->accel.x_count = 0;
@@ -2194,12 +2186,7 @@ skip_nibble_rect_write:
else
dev->accel.cy--;
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else if (dev->bpp)
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.sy--;
dev->accel.x_count = 0;
@@ -2285,12 +2272,7 @@ skip_nibble_rect_write:
else
dev->accel.cy--;
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else if (dev->bpp)
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.sy--;
@@ -2367,12 +2349,7 @@ skip_nibble_rect_write:
else
dev->accel.cy--;
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else if (dev->bpp)
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.sy--;
@@ -2482,12 +2459,7 @@ skip_nibble_rect_write:
else
dev->accel.cy--;
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else if (dev->bpp)
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.sy--;
@@ -2512,8 +2484,6 @@ skip_nibble_rect_write:
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
case 0:
src_dat = bkgd_color;
if (!bkgd_mix && (dev->accel.cmd & 0x40) && ((dev->accel.frgd_mix & 0x1f) == 7) && ((dev->accel.bkgd_mix & 0x1f) == 3) && !dev->bpp && (bkgd_color == 0x00)) /*For some reason, the September 1992 Mach8/32 drivers for Win3.x don't set the background colors properly.*/
src_dat = frgd_color;
break;
case 1:
src_dat = frgd_color;
@@ -2570,12 +2540,7 @@ skip_nibble_rect_write:
else
dev->accel.cy--;
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else if (dev->bpp)
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.sy--;
if (dev->accel.sy < 0) {
@@ -2870,16 +2835,8 @@ skip_nibble_rect_write:
dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff;
dev->accel.sy = dev->accel.multifunc[0] & 0x7ff;
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch);
dev->accel.fill_state = 0;
if (ibm8514_cpu_src(svga)) {
@@ -3051,16 +3008,8 @@ skip_nibble_bitblt_write:
dev->accel.cy--;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch);
dev->accel.sy--;
dev->accel.x_count = 0;
@@ -3156,16 +3105,8 @@ skip_nibble_bitblt_write:
dev->accel.cy--;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch);
dev->accel.sy--;
@@ -3252,16 +3193,9 @@ skip_nibble_bitblt_write:
dev->accel.cy--;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch);
dev->accel.sy--;
if (dev->accel.sy < 0) {
@@ -3282,29 +3216,14 @@ skip_nibble_bitblt_write:
cx = (int64_t) dev->accel.cx;
dx = (int64_t) dev->accel.dx;
dev->accel.src = dev->accel.src_ge_offset + (dev->accel.cy * dev->accel.src_pitch);
dev->accel.dest = dev->accel.dst_ge_offset + (dev->accel.dy * dev->accel.dst_pitch);
while (1) {
if ((dx >= (((int64_t)clip_l) * 3)) &&
(dx <= (((uint64_t)clip_r) * 3)) &&
(dev->accel.dy >= (clip_t << 1)) &&
(dev->accel.dy <= (clip_b << 1))) {
switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) {
case 0:
src_dat = bkgd_color;
break;
case 1:
src_dat = frgd_color;
break;
case 2:
src_dat = 0;
break;
case 3:
READ(dev->accel.src + cx, src_dat);
break;
default:
break;
}
READ(dev->accel.src + cx, src_dat);
READ(dev->accel.dest + dx, dest_dat);
old_dest_dat = dest_dat;
@@ -3411,16 +3330,9 @@ skip_nibble_bitblt_write:
dev->accel.cy--;
}
if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
} else if (dev->bpp) {
dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch);
} else {
dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch);
}
dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch);
dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch);
dev->accel.sy--;
if (dev->accel.sy < 0) {
@@ -3804,7 +3716,7 @@ ibm8514_poll(void *priv)
if ((svga->cgastat & 8) && ((dev->displine & 0x0f) == (svga->crtc[0x11] & 0x0f)) && svga->vslines)
svga->cgastat &= ~8;
svga->vslines++;
if (dev->displine > 1500)
if (dev->displine > 2000)
dev->displine = 0;
} else {
timer_advance_u64(&svga->timer, dev->dispontime);
@@ -3871,9 +3783,9 @@ ibm8514_poll(void *priv)
svga->vslines = 0;
if (dev->interlace && dev->oddeven)
dev->ma = dev->maback = dev->ma_latch + (dev->rowoffset << 1);
dev->ma = dev->maback = (dev->rowoffset << 1);
else
dev->ma = dev->maback = dev->ma_latch;
dev->ma = dev->maback = 0;
dev->ma = (dev->ma << 2);
dev->maback = (dev->maback << 2);
@@ -3904,26 +3816,43 @@ ibm8514_recalctimings(svga_t *svga)
ati8514_recalctimings(svga);
} else {
if (dev->on) {
dev->hdisp = (dev->hdisped + 1) << 3;
dev->h_total = dev->htotal + 1;
if (dev->h_total == 1) /*Default to 1024x768 87hz 8514/A htotal timings if it goes to 0.*/
dev->h_total = 0x9e;
dev->vdisp = (dev->v_disp + 1) >> 1;
if ((dev->vdisp == 478) || (dev->vdisp == 766))
dev->vdisp += 2;
dev->v_total = dev->v_total_reg + 1;
if (dev->interlace)
dev->v_total >>= 1;
dev->v_syncstart = dev->v_sync_start + 1;
if (dev->interlace)
dev->v_syncstart >>= 1;
dev->rowcount = !!(dev->disp_cntl & 0x08);
if (dev->accel.advfunc_cntl & 0x01) {
if ((dev->hdisp != 640) && (dev->hdisp != 1024)) {
if (dev->accel.advfunc_cntl & 0x04) {
dev->h_disp = dev->hdisp;
dev->dispend = dev->vdisp;
dev->hdisp = 1024;
dev->vdisp = 768;
} else {
dev->h_disp = 640;
dev->dispend = 480;
dev->hdisp = 640;
dev->vdisp = 480;
}
} else {
dev->h_disp = dev->hdisp;
dev->dispend = dev->vdisp;
}
dev->h_disp = dev->hdisp;
dev->dispend = dev->vdisp;
if (dev->accel.advfunc_cntl & 0x04)
svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 44900000.0;
svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / 44900000.0;
else
svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0;
svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0;
if ((dev->dispend == 478) || (dev->dispend == 766))
dev->dispend += 2;
@@ -4026,6 +3955,7 @@ ibm8514_init(const device_t *info)
dev->map8 = dev->pallook;
dev->local = 0;
dev->accel_bpp = 8;
dev->on = 0;
dev->type = info->flags;
dev->bpp = 0;

File diff suppressed because it is too large Load Diff

View File

@@ -344,7 +344,7 @@ bochs_vbe_recalctimings(svga_t* svga)
svga->rowoffset = dev->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8));
svga->ma_latch = (dev->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] * svga->rowoffset) +
(dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8)));
svga->fullchange = 3;
svga->fullchange = 3;
}
if (svga->bpp == 4)
@@ -708,7 +708,7 @@ bochs_vbe_disable_handlers(bochs_vbe_t *dev)
reset_state->bios_rom.mapping = dev->bios_rom.mapping;
reset_state->svga.timer = dev->svga.timer;
reset_state->svga.timer8514 = dev->svga.timer8514;
reset_state->svga.timer_8514 = dev->svga.timer_8514;
}
static void

View File

@@ -2793,7 +2793,8 @@ chips_69000_disable_handlers(chips_69000_t *chips)
reset_state->decrement_timer = chips->decrement_timer;
reset_state->svga.timer = chips->svga.timer;
reset_state->svga.timer8514 = chips->svga.timer8514;
reset_state->svga.timer_8514 = chips->svga.timer_8514;
reset_state->svga.timer_xga = chips->svga.timer_xga;
}
static void

View File

@@ -260,6 +260,8 @@ typedef struct gd54xx_t {
uint8_t pos_regs[8];
uint32_t vlb_lfb_base;
uint32_t lfb_base;
uint32_t vgablt_base;
@@ -1750,7 +1752,8 @@ gd543x_recalc_mapping(gd54xx_t *gd54xx)
} else
mem_mapping_disable(&gd54xx->mmio_mapping);
} else {
if ((svga->crtc[0x27] <= CIRRUS_ID_CLGD5429) || (!gd54xx->pci && !gd54xx->vlb)) {
if ((svga->crtc[0x27] <= CIRRUS_ID_CLGD5429) ||
(!gd54xx->pci && !gd54xx->vlb)) {
if (svga->gdcreg[0x0b] & CIRRUS_BANKING_GRANULARITY_16K) {
base = (svga->seqregs[0x07] & 0xf0) << 16;
size = 1 * 1024 * 1024;
@@ -1770,7 +1773,10 @@ gd543x_recalc_mapping(gd54xx_t *gd54xx)
else
size = 4 * 1024 * 1024;
} else { /*VLB/ISA/MCA*/
base = 128 * 1024 * 1024;
if (gd54xx->vlb_lfb_base != 0x00000000)
base = gd54xx->vlb_lfb_base;
else
base = 128 * 1024 * 1024;
if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5436)
size = 16 * 1024 * 1024;
else
@@ -4224,6 +4230,12 @@ gd54xx_init(const device_t *info)
gd54xx->id = id;
if (gd54xx->vlb && ((gd54xx->id == CIRRUS_ID_CLGD5430) ||
(gd54xx->id == CIRRUS_ID_CLGD5434) ||
(gd54xx->id == CIRRUS_ID_CLGD5434_4) ||
(gd54xx->id == CIRRUS_ID_CLGD5440)))
gd54xx->vlb_lfb_base = device_get_config_int("lfb_base") << 20;
switch (id) {
case CIRRUS_ID_CLGD5401:
romfn = BIOS_GD5401_PATH;
@@ -4777,6 +4789,41 @@ static const device_config_t gd5429_config[] = {
{ .name = "", .description = "", .type = CONFIG_END }
};
static const device_config_t gd5430_vlb_config[] = {
{
.name = "memory",
.description = "Memory size",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 2,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "1 MB", .value = 1 },
{ .description = "2 MB", .value = 2 },
{ .description = "" }
},
.bios = { { 0 } }
},
{
.name = "lfb_base",
.description = "Linear framebuffer base",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 2,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "32 MB", .value = 32 },
{ .description = "64 MB", .value = 64 },
{ .description = "2048 MB", .value = 2048 },
{ .description = "" }
},
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
};
static const device_config_t gd5440_onboard_config[] = {
{
.name = "memory",
@@ -4816,6 +4863,42 @@ static const device_config_t gd5434_config[] = {
{ .name = "", .description = "", .type = CONFIG_END }
};
static const device_config_t gd5434_vlb_config[] = {
{
.name = "memory",
.description = "Memory size",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 4,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "1 MB", .value = 1 },
{ .description = "2 MB", .value = 2 },
{ .description = "4 MB", .value = 4 },
{ .description = "" }
},
.bios = { { 0 } }
},
{
.name = "lfb_base",
.description = "Linear framebuffer base",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 2,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "32 MB", .value = 32 },
{ .description = "64 MB", .value = 64 },
{ .description = "2048 MB", .value = 2048 },
{ .description = "" }
},
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
};
static const device_config_t gd5434_onboard_config[] = {
{
.name = "memory",
@@ -5150,7 +5233,7 @@ const device_t gd5430_diamond_speedstar_pro_se_a8_vlb_device = {
.available = gd5430_diamond_a8_available,
.speed_changed = gd54xx_speed_changed,
.force_redraw = gd54xx_force_redraw,
.config = gd5429_config
.config = gd5430_vlb_config
};
const device_t gd5430_vlb_device = {
@@ -5164,7 +5247,7 @@ const device_t gd5430_vlb_device = {
.available = gd5430_orchid_vlb_available,
.speed_changed = gd54xx_speed_changed,
.force_redraw = gd54xx_force_redraw,
.config = gd5429_config
.config = gd5430_vlb_config
};
const device_t gd5430_onboard_vlb_device = {
@@ -5178,7 +5261,7 @@ const device_t gd5430_onboard_vlb_device = {
.available = NULL,
.speed_changed = gd54xx_speed_changed,
.force_redraw = gd54xx_force_redraw,
.config = gd5429_config
.config = gd5430_vlb_config
};
const device_t gd5430_pci_device = {
@@ -5263,7 +5346,7 @@ const device_t gd5434_vlb_device = {
.available = gd5430_orchid_vlb_available,
.speed_changed = gd54xx_speed_changed,
.force_redraw = gd54xx_force_redraw,
.config = gd5434_config
.config = gd5434_vlb_config
};
const device_t gd5434_pci_device = {

View File

@@ -5109,7 +5109,8 @@ s3_virge_disable_handlers(virge_t *dev)
reset_state->bios_rom.mapping = dev->bios_rom.mapping;
reset_state->svga.timer = dev->svga.timer;
reset_state->svga.timer8514 = dev->svga.timer8514;
reset_state->svga.timer_8514 = dev->svga.timer_8514;
reset_state->svga.timer_xga = dev->svga.timer_xga;
reset_state->irq_timer = dev->irq_timer;
}

View File

@@ -776,9 +776,9 @@ svga_recalctimings(svga_t *svga)
}
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/
if (svga->seqregs[1] & 8) { /*40 column*/
if (svga->seqregs[1] & 8) /*40 column*/
svga->render = svga_render_text_40;
} else
else
svga->render = svga_render_text_80;
if (xga_active && (svga->xga != NULL)) {
@@ -981,7 +981,7 @@ svga_recalctimings(svga_t *svga)
crtcconst = svga->clock * svga->char_width;
if (ibm8514_active && (svga->dev8514 != NULL)) {
if (dev->on)
crtcconst8514 = svga->clock8514;
crtcconst8514 = svga->clock_8514;
}
if (xga_active && (svga->xga != NULL)) {
if (xga->on)