mirror of
https://github.com/86Box/86Box.git
synced 2026-02-21 09:05:32 -07:00
Merge remote-tracking branch 'upstream/master' into feature/ich2
This commit is contained in:
@@ -535,6 +535,14 @@ then
|
||||
sudo sed -i -e 's/-no-feature-vulkan/-feature-vulkan/g' "$qt5_portfile"
|
||||
sudo sed -i -e 's/configure.env-append MAKE=/configure.env-append VULKAN_SDK=${prefix} MAKE=/g' "$qt5_portfile"
|
||||
fi
|
||||
|
||||
# Patch wget to remove libproxy support, as it depends on shared-mime-info which
|
||||
# fails to build for a 10.14 target, which we have to do despite wget only being
|
||||
# a host dependency. MacPorts issue 69406 strongly implies this will not be fixed.
|
||||
wget_portfile="$macports/var/macports/sources/rsync.macports.org/macports/release/tarballs/ports/net/wget/Portfile"
|
||||
sudo sed -i -e 's/--enable-libproxy/--disable-libproxy/g' "$wget_portfile"
|
||||
sudo sed -i -e 's/port:libproxy//g' "$wget_portfile"
|
||||
|
||||
while :
|
||||
do
|
||||
# Attempt to install dependencies.
|
||||
|
||||
@@ -131,7 +131,6 @@ option(RTMIDI "RtMidi"
|
||||
option(FLUIDSYNTH "FluidSynth" ON)
|
||||
option(MUNT "MUNT" ON)
|
||||
option(VNC "VNC renderer" OFF)
|
||||
option(CPPTHREADS "C++11 threads" ON)
|
||||
option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF)
|
||||
option(MINITRACE "Enable Chrome tracing using the modified minitrace library" OFF)
|
||||
option(GDBSTUB "Enable GDB stub server for debugging" OFF)
|
||||
@@ -141,8 +140,10 @@ option(DEBUGREGS486 "Enable debug register opeartion on 486+ CPUs"
|
||||
|
||||
if(WIN32)
|
||||
set(QT ON)
|
||||
option(CPPTHREADS "C++11 threads" OFF)
|
||||
else()
|
||||
option(QT "Qt GUI" ON)
|
||||
option(CPPTHREADS "C++11 threads" ON)
|
||||
endif()
|
||||
|
||||
# Development branch features
|
||||
|
||||
@@ -27,9 +27,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
add_compile_definitions(_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 _LARGEFILE64_SOURCE=1)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
target_sources(86Box PRIVATE qt/win_thread.c)
|
||||
else()
|
||||
if(CPPTHREADS)
|
||||
target_sources(86Box PRIVATE thread.cpp)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
typedef struct opti5x7_t {
|
||||
uint8_t idx;
|
||||
uint8_t is_pci;
|
||||
uint8_t regs[16];
|
||||
uint8_t regs[18];
|
||||
} opti5x7_t;
|
||||
|
||||
#ifdef ENABLE_OPTI5X7_LOG
|
||||
@@ -158,7 +158,7 @@ opti5x7_read(uint16_t addr, void *priv)
|
||||
{
|
||||
const opti5x7_t *dev = (opti5x7_t *) priv;
|
||||
|
||||
return (addr == 0x24) ? dev->regs[dev->idx] : 0xff;
|
||||
return ((addr == 0x24) && (dev->idx < sizeof(dev->regs))) ? dev->regs[dev->idx] : 0xff;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
101
src/config.c
101
src/config.c
@@ -861,16 +861,46 @@ load_storage_controllers(void)
|
||||
cassette_enable = !!ini_section_get_int(cat, "cassette_enabled", 0);
|
||||
else
|
||||
cassette_enable = 0;
|
||||
|
||||
p = ini_section_get_string(cat, "cassette_file", "");
|
||||
if (strlen(p) > 511)
|
||||
fatal("load_storage_controllers(): strlen(p) > 511\n");
|
||||
else
|
||||
strncpy(cassette_fname, p, 511);
|
||||
|
||||
if (!strcmp(p, usr_path))
|
||||
p[0] = 0x00;
|
||||
|
||||
if (p[0] != 0x00) {
|
||||
if (path_abs(p)) {
|
||||
if (strlen(p) > 511)
|
||||
fatal("load_storage_controllers(): strlen(p) > 511 (cassette_fname)\n");
|
||||
else
|
||||
strncpy(cassette_fname, p, 511);
|
||||
} else
|
||||
path_append_filename(cassette_fname, usr_path, p);
|
||||
path_normalize(cassette_fname);
|
||||
}
|
||||
|
||||
p = ini_section_get_string(cat, "cassette_mode", "");
|
||||
if (strlen(p) > 511)
|
||||
fatal("load_storage_controllers(): strlen(p) > 511\n");
|
||||
else
|
||||
strncpy(cassette_mode, p, 511);
|
||||
|
||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||
cassette_image_history[i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
|
||||
sprintf(temp, "cassette_image_history_%02i", i + 1);
|
||||
p = ini_section_get_string(cat, temp, NULL);
|
||||
if (p) {
|
||||
if (path_abs(p)) {
|
||||
if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1))
|
||||
fatal("load_storage_controllers(): strlen(p) > 2047 "
|
||||
"(cassette_image_history[%i])\n", i);
|
||||
else
|
||||
snprintf(cassette_image_history[i], (MAX_IMAGE_PATH_LEN - 1), "%s", p);
|
||||
} else
|
||||
snprintf(cassette_image_history[i], (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path,
|
||||
path_get_slash(usr_path), p);
|
||||
path_normalize(cassette_image_history[i]);
|
||||
}
|
||||
}
|
||||
cassette_pos = ini_section_get_int(cat, "cassette_position", 0);
|
||||
cassette_srate = ini_section_get_int(cat, "cassette_srate", 44100);
|
||||
cassette_append = !!ini_section_get_int(cat, "cassette_append", 0);
|
||||
@@ -894,6 +924,24 @@ load_storage_controllers(void)
|
||||
path_append_filename(cart_fns[c], usr_path, p);
|
||||
path_normalize(cart_fns[c]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||
cart_image_history[c][i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
|
||||
sprintf(temp, "cartridge_%02i_image_history_%02i", c + 1, i + 1);
|
||||
p = ini_section_get_string(cat, temp, NULL);
|
||||
if (p) {
|
||||
if (path_abs(p)) {
|
||||
if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1))
|
||||
fatal("load_storage_controllers(): strlen(p) > 2047 "
|
||||
"(cart_image_history[%i][%i])\n", c, i);
|
||||
else
|
||||
snprintf(cart_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s", p);
|
||||
} else
|
||||
snprintf(cart_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path,
|
||||
path_get_slash(usr_path), p);
|
||||
path_normalize(cart_image_history[c][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lba_enhancer_enabled = !!ini_section_get_int(cat, "lba_enhancer_enabled", 0);
|
||||
@@ -2330,14 +2378,32 @@ save_storage_controllers(void)
|
||||
|
||||
if (strlen(cassette_fname) == 0)
|
||||
ini_section_delete_var(cat, "cassette_file");
|
||||
else
|
||||
ini_section_set_string(cat, "cassette_file", cassette_fname);
|
||||
else {
|
||||
path_normalize(cassette_fname);
|
||||
if (!strnicmp(cassette_fname, usr_path, strlen(usr_path)))
|
||||
ini_section_set_string(cat, "cassette_file", &cassette_fname[strlen(usr_path)]);
|
||||
else
|
||||
ini_section_set_string(cat, "cassette_file", cassette_fname);
|
||||
}
|
||||
|
||||
if (strlen(cassette_mode) == 0)
|
||||
ini_section_delete_var(cat, "cassette_mode");
|
||||
else
|
||||
ini_section_set_string(cat, "cassette_mode", cassette_mode);
|
||||
|
||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||
sprintf(temp, "cassette_image_history_%02i", i + 1);
|
||||
if ((cassette_image_history[i] == 0) || strlen(cassette_image_history[i]) == 0)
|
||||
ini_section_delete_var(cat, temp);
|
||||
else {
|
||||
path_normalize(cassette_image_history[i]);
|
||||
if (!strnicmp(cassette_image_history[i], usr_path, strlen(usr_path)))
|
||||
ini_section_set_string(cat, temp, &cassette_image_history[i][strlen(usr_path)]);
|
||||
else
|
||||
ini_section_set_string(cat, temp, cassette_image_history[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (cassette_pos == 0)
|
||||
ini_section_delete_var(cat, "cassette_position");
|
||||
else
|
||||
@@ -2365,10 +2431,29 @@ save_storage_controllers(void)
|
||||
|
||||
for (c = 0; c < 2; c++) {
|
||||
sprintf(temp, "cartridge_%02i_fn", c + 1);
|
||||
|
||||
if (strlen(cart_fns[c]) == 0)
|
||||
ini_section_delete_var(cat, temp);
|
||||
else
|
||||
ini_section_set_string(cat, temp, cart_fns[c]);
|
||||
else {
|
||||
path_normalize(cart_fns[c]);
|
||||
if (!strnicmp(cart_fns[c], usr_path, strlen(usr_path)))
|
||||
ini_section_set_string(cat, temp, &cart_fns[c][strlen(usr_path)]);
|
||||
else
|
||||
ini_section_set_string(cat, temp, cart_fns[c]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||
sprintf(temp, "cartridge_%02i_image_history_%02i", c + 1, i + 1);
|
||||
if ((cart_image_history[c][i] == 0) || strlen(cart_image_history[c][i]) == 0)
|
||||
ini_section_delete_var(cat, temp);
|
||||
else {
|
||||
path_normalize(cart_image_history[c][i]);
|
||||
if (!strnicmp(cart_image_history[c][i], usr_path, strlen(usr_path)))
|
||||
ini_section_set_string(cat, temp, &cart_image_history[c][i][strlen(usr_path)]);
|
||||
else
|
||||
ini_section_set_string(cat, temp, cart_image_history[c][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lba_enhancer_enabled == 0)
|
||||
|
||||
@@ -304,6 +304,13 @@ exec386_2386(int32_t cycs)
|
||||
cpu_state.pc &= 0xffff;
|
||||
#endif
|
||||
|
||||
if (cpu_flush_pending == 1)
|
||||
cpu_flush_pending++;
|
||||
else if (cpu_flush_pending == 2) {
|
||||
cpu_flush_pending = 0;
|
||||
flushmmucache_pc();
|
||||
}
|
||||
|
||||
if (cpu_end_block_after_ins)
|
||||
cpu_end_block_after_ins--;
|
||||
|
||||
|
||||
@@ -1016,9 +1016,14 @@ smram_restore_state_p6(uint32_t *saved_state)
|
||||
cpu_state.seg_gs.ar_high = (saved_state[SMRAM_FIELD_P6_GS_SELECTOR_AR] >> 24) & 0xff;
|
||||
smm_seg_load(&cpu_state.seg_gs);
|
||||
|
||||
mem_a20_alt = 0x00;
|
||||
mem_a20_key = saved_state[SMRAM_FIELD_P6_A20M] ? 0x00 : 0x02;
|
||||
mem_a20_recalc();
|
||||
rammask = cpu_16bitbus ? 0xFFFFFF : 0xFFFFFFFF;
|
||||
if (is6117)
|
||||
rammask |= 0x3000000;
|
||||
|
||||
if (saved_state[SMRAM_FIELD_P6_A20M] & 0x01)
|
||||
rammask &= 0xffefffff;
|
||||
|
||||
flushmmucache();
|
||||
|
||||
if (SMM_REVISION_ID & SMM_SMBASE_RELOCATION)
|
||||
smbase = saved_state[SMRAM_FIELD_P6_SMBASE_OFFSET];
|
||||
|
||||
@@ -458,6 +458,7 @@ fastreadw_fetch(uint32_t a)
|
||||
{
|
||||
uint16_t ret;
|
||||
|
||||
cpu_old_paging = (cpu_flush_pending == 2);
|
||||
if ((a & 0xFFF) > 0xFFE) {
|
||||
ret = fastreadb(a);
|
||||
if (!cpu_state.abrt && (opcode_length[ret & 0xff] > 1))
|
||||
@@ -469,6 +470,7 @@ fastreadw_fetch(uint32_t a)
|
||||
ret = readmemwl_2386(a);
|
||||
read_type = 4;
|
||||
}
|
||||
cpu_old_paging = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -486,7 +488,9 @@ fastreadl_fetch(uint32_t a)
|
||||
ret = 0;
|
||||
else {
|
||||
read_type = 1;
|
||||
cpu_old_paging = (cpu_flush_pending == 2);
|
||||
ret = readmemll_2386(a);
|
||||
cpu_old_paging = 0;
|
||||
read_type = 4;
|
||||
}
|
||||
|
||||
@@ -563,35 +567,52 @@ fastreadl_fetch(uint32_t a)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef OPS_286_386
|
||||
static __inline uint8_t
|
||||
getbyte(void)
|
||||
{
|
||||
uint8_t ret;
|
||||
cpu_state.pc++;
|
||||
return fastreadb(cs + (cpu_state.pc - 1));
|
||||
cpu_old_paging = (cpu_flush_pending == 2);
|
||||
ret = fastreadb(cs + (cpu_state.pc - 1));
|
||||
cpu_old_paging = 0;
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static __inline uint16_t
|
||||
getword(void)
|
||||
{
|
||||
uint16_t ret;
|
||||
cpu_state.pc += 2;
|
||||
return fastreadw(cs + (cpu_state.pc - 2));
|
||||
cpu_old_paging = (cpu_flush_pending == 2);
|
||||
ret = fastreadw(cs + (cpu_state.pc - 2));
|
||||
cpu_old_paging = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
getlong(void)
|
||||
{
|
||||
uint32_t ret;
|
||||
cpu_state.pc += 4;
|
||||
return fastreadl(cs + (cpu_state.pc - 4));
|
||||
cpu_old_paging = (cpu_flush_pending == 2);
|
||||
ret = fastreadl(cs + (cpu_state.pc - 4));
|
||||
cpu_old_paging = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
getquad(void)
|
||||
{
|
||||
uint64_t ret;
|
||||
cpu_state.pc += 8;
|
||||
return fastreadl(cs + (cpu_state.pc - 8)) | ((uint64_t) fastreadl(cs + (cpu_state.pc - 4)) << 32);
|
||||
cpu_old_paging = (cpu_flush_pending == 2);
|
||||
ret = fastreadl(cs + (cpu_state.pc - 8)) | ((uint64_t) fastreadl(cs + (cpu_state.pc - 4)) << 32);
|
||||
cpu_old_paging = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef OPS_286_386
|
||||
static __inline uint8_t
|
||||
geteab(void)
|
||||
{
|
||||
@@ -678,6 +699,34 @@ seteaq(uint64_t v)
|
||||
# define seteaw_mem(v) writememwl_2386(easeg + cpu_state.eaaddr, v);
|
||||
# define seteal_mem(v) writememll_2386(easeg + cpu_state.eaaddr, v);
|
||||
#else
|
||||
static __inline uint8_t
|
||||
getbyte(void)
|
||||
{
|
||||
cpu_state.pc++;
|
||||
return fastreadb(cs + (cpu_state.pc - 1));
|
||||
}
|
||||
|
||||
static __inline uint16_t
|
||||
getword(void)
|
||||
{
|
||||
cpu_state.pc += 2;
|
||||
return fastreadw(cs + (cpu_state.pc - 2));
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
getlong(void)
|
||||
{
|
||||
cpu_state.pc += 4;
|
||||
return fastreadl(cs + (cpu_state.pc - 4));
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
getquad(void)
|
||||
{
|
||||
cpu_state.pc += 8;
|
||||
return fastreadl(cs + (cpu_state.pc - 8)) | ((uint64_t) fastreadl(cs + (cpu_state.pc - 4)) << 32);
|
||||
}
|
||||
|
||||
static __inline uint8_t
|
||||
geteab(void)
|
||||
{
|
||||
|
||||
@@ -933,6 +933,13 @@ exec386(int32_t cycs)
|
||||
x386_dynarec_log("[%04X:%08X] ABRT\n", CS, cpu_state.pc);
|
||||
#endif
|
||||
|
||||
if (cpu_flush_pending == 1)
|
||||
cpu_flush_pending++;
|
||||
else if (cpu_flush_pending == 2) {
|
||||
cpu_flush_pending = 0;
|
||||
flushmmucache_pc();
|
||||
}
|
||||
|
||||
#ifndef USE_NEW_DYNAREC
|
||||
if (!use32)
|
||||
cpu_state.pc &= 0xffff;
|
||||
|
||||
@@ -182,6 +182,8 @@ int cpu_rom_prefetch_cycles;
|
||||
int cpu_waitstates;
|
||||
int cpu_cache_int_enabled;
|
||||
int cpu_cache_ext_enabled;
|
||||
int cpu_flush_pending;
|
||||
int cpu_old_paging;
|
||||
int cpu_isa_speed;
|
||||
int cpu_pci_speed;
|
||||
int cpu_isa_pci_div;
|
||||
@@ -1536,6 +1538,52 @@ cpu_set(void)
|
||||
#ifdef USE_AMD_K5
|
||||
case CPU_K5:
|
||||
case CPU_5K86:
|
||||
#ifdef USE_DYNAREC
|
||||
x86_setopcodes(ops_386, ops_pentiummmx_0f, dynarec_ops_386, dynarec_ops_pentiummmx_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_386, ops_pentiummmx_0f);
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
timing_rm = 2; /* register dest - memory src */
|
||||
timing_mr = 3; /* memory dest - register src */
|
||||
timing_mm = 3;
|
||||
timing_rml = 2; /* register dest - memory src long */
|
||||
timing_mrl = 3; /* memory dest - register src long */
|
||||
timing_mml = 3;
|
||||
timing_bt = 0; /* branch taken */
|
||||
timing_bnt = 1; /* branch not taken */
|
||||
|
||||
timing_int = 6;
|
||||
timing_int_rm = 11;
|
||||
timing_int_v86 = 54;
|
||||
timing_int_pm = 25;
|
||||
timing_int_pm_outer = 42;
|
||||
timing_iret_rm = 7;
|
||||
timing_iret_v86 = 27; /* unknown */
|
||||
timing_iret_pm = 10;
|
||||
timing_iret_pm_outer = 27;
|
||||
timing_call_rm = 4;
|
||||
timing_call_pm = 4;
|
||||
timing_call_pm_gate = 22;
|
||||
timing_call_pm_gate_inner = 44;
|
||||
timing_retf_rm = 4;
|
||||
timing_retf_pm = 4;
|
||||
timing_retf_pm_outer = 23;
|
||||
timing_jmp_rm = 3;
|
||||
timing_jmp_pm = 3;
|
||||
timing_jmp_pm_gate = 18;
|
||||
|
||||
timing_misaligned = 3;
|
||||
|
||||
cpu_features = CPU_FEATURE_RDTSC | CPU_FEATURE_MSR | CPU_FEATURE_CR4 | CPU_FEATURE_VME | CPU_FEATURE_MMX;
|
||||
cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE | CR4_PGE;
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_k5);
|
||||
#endif /* USE_DYNAREC */
|
||||
break;
|
||||
|
||||
#endif /* USE_AMD_K5 */
|
||||
case CPU_K6:
|
||||
case CPU_K6_2:
|
||||
@@ -1546,27 +1594,13 @@ cpu_set(void)
|
||||
#ifdef USE_DYNAREC
|
||||
if (cpu_s->cpu_type >= CPU_K6_2)
|
||||
x86_setopcodes(ops_386, ops_k62_0f, dynarec_ops_386, dynarec_ops_k62_0f);
|
||||
# ifdef USE_AMD_K5
|
||||
else if (cpu_s->cpu_type == CPU_K6)
|
||||
x86_setopcodes(ops_386, ops_k6_0f, dynarec_ops_386, dynarec_ops_k6_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_pentiummmx_0f, dynarec_ops_386, dynarec_ops_pentiummmx_0f);
|
||||
# else
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_k6_0f, dynarec_ops_386, dynarec_ops_k6_0f);
|
||||
# endif /* USE_AMD_K5 */
|
||||
#else
|
||||
if (cpu_s->cpu_type >= CPU_K6_2)
|
||||
x86_setopcodes(ops_386, ops_k62_0f);
|
||||
# ifdef USE_AMD_K5
|
||||
else if (cpu_s->cpu_type == CPU_K6)
|
||||
x86_setopcodes(ops_386, ops_k6_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_pentiummmx_0f);
|
||||
# else
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_k6_0f);
|
||||
# endif /* USE_AMD_K5 */
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P)) {
|
||||
@@ -1613,23 +1647,11 @@ cpu_set(void)
|
||||
cpu_features |= CPU_FEATURE_3DNOW;
|
||||
if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P))
|
||||
cpu_features |= CPU_FEATURE_3DNOWE;
|
||||
#ifdef USE_AMD_K5
|
||||
cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE;
|
||||
if (cpu_s->cpu_type >= CPU_K6) {
|
||||
cpu_CR4_mask |= (CR4_VME | CR4_PVI | CR4_PSE);
|
||||
if (cpu_s->cpu_type <= CPU_K6)
|
||||
cpu_CR4_mask |= CR4_PCE;
|
||||
else if (cpu_s->cpu_type >= CPU_K6_2C)
|
||||
cpu_CR4_mask |= CR4_PGE;
|
||||
} else
|
||||
cpu_CR4_mask |= CR4_PGE;
|
||||
#else
|
||||
cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE;
|
||||
if (cpu_s->cpu_type == CPU_K6)
|
||||
cpu_CR4_mask |= CR4_PCE;
|
||||
else if (cpu_s->cpu_type >= CPU_K6_2C)
|
||||
cpu_CR4_mask |= CR4_PGE;
|
||||
#endif /* USE_AMD_K5 */
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_k6);
|
||||
|
||||
@@ -628,6 +628,8 @@ extern int cpu_prefetch_width;
|
||||
extern int cpu_mem_prefetch_cycles;
|
||||
extern int cpu_rom_prefetch_cycles;
|
||||
extern int cpu_waitstates;
|
||||
extern int cpu_flush_pending;
|
||||
extern int cpu_old_paging;
|
||||
extern int cpu_cache_int_enabled;
|
||||
extern int cpu_cache_ext_enabled;
|
||||
extern int cpu_isa_speed;
|
||||
|
||||
@@ -2508,7 +2508,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 75000000,
|
||||
.multi = 3.0,
|
||||
.voltage = 3300,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x480,
|
||||
.cpuid_model = 0x480,
|
||||
.cyrix_id = 0x0000,
|
||||
@@ -2525,7 +2525,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 100000000,
|
||||
.multi = 3.0,
|
||||
.voltage = 3300,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x483,
|
||||
.cpuid_model = 0x483,
|
||||
.cyrix_id = 0x0000,
|
||||
@@ -3066,7 +3066,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 133333333,
|
||||
.multi = 4.0,
|
||||
.voltage = 3450,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x4e0,
|
||||
.cpuid_model = 0x4e0,
|
||||
.cyrix_id = 0,
|
||||
@@ -3083,7 +3083,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 150000000,
|
||||
.multi = 3.0,
|
||||
.voltage = 3450,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x482,
|
||||
.cpuid_model = 0x482,
|
||||
.cyrix_id = 0,
|
||||
@@ -3100,7 +3100,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 160000000,
|
||||
.multi = 4.0,
|
||||
.voltage = 3450,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x4e0,
|
||||
.cpuid_model = 0x4e0,
|
||||
.cyrix_id = 0,
|
||||
@@ -3332,7 +3332,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 80000000,
|
||||
.multi = 2.0,
|
||||
.voltage = 3450,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x480,
|
||||
.cpuid_model = 0,
|
||||
.cyrix_id = 0x002f,
|
||||
@@ -3349,7 +3349,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 100000000,
|
||||
.multi = 3.0,
|
||||
.voltage = 3450,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x480,
|
||||
.cpuid_model = 0,
|
||||
.cyrix_id = 0x002f,
|
||||
@@ -3366,7 +3366,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 120000000,
|
||||
.multi = 3.0,
|
||||
.voltage = 3450,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x480,
|
||||
.cpuid_model = 0,
|
||||
.cyrix_id = 0x002f,
|
||||
@@ -3383,7 +3383,7 @@ const cpu_family_t cpu_families[] = {
|
||||
.fpus = fpus_internal,
|
||||
.rspeed = 133333333,
|
||||
.multi = 4.0,
|
||||
.voltage = 3450,
|
||||
.voltage = 5000,
|
||||
.edx_reset = 0x480,
|
||||
.cpuid_model = 0,
|
||||
.cyrix_id = 0x002f,
|
||||
|
||||
@@ -277,7 +277,7 @@ reset_common(int hard)
|
||||
cr0 = 0;
|
||||
if (is386 && !is486 && (fpu_type == FPU_387))
|
||||
cr0 |= 0x10;
|
||||
cpu_cache_int_enabled = 0;
|
||||
cpu_cache_int_enabled = 0;
|
||||
cpu_update_waitstates();
|
||||
cr4 = 0;
|
||||
cpu_state.eflags = 0;
|
||||
@@ -325,6 +325,8 @@ reset_common(int hard)
|
||||
if (hard)
|
||||
codegen_reset();
|
||||
#endif
|
||||
cpu_flush_pending = 0;
|
||||
cpu_old_paging = 0;
|
||||
if (!hard)
|
||||
flushmmucache();
|
||||
x86_was_reset = 1;
|
||||
|
||||
@@ -9,6 +9,8 @@ opMOV_r_CRx_a16(uint32_t fetchdat)
|
||||
switch (cpu_reg) {
|
||||
case 0:
|
||||
cpu_state.regs[cpu_rm].l = cr0;
|
||||
if (cpu_flush_pending)
|
||||
cpu_state.regs[cpu_rm].l ^= 0x80000000;
|
||||
if (is486 || isibm486)
|
||||
cpu_state.regs[cpu_rm].l |= 0x10; /*ET hardwired on 486*/
|
||||
else {
|
||||
@@ -49,6 +51,8 @@ opMOV_r_CRx_a32(uint32_t fetchdat)
|
||||
switch (cpu_reg) {
|
||||
case 0:
|
||||
cpu_state.regs[cpu_rm].l = cr0;
|
||||
if (cpu_flush_pending)
|
||||
cpu_state.regs[cpu_rm].l ^= 0x80000000;
|
||||
if (is486 || isibm486)
|
||||
cpu_state.regs[cpu_rm].l |= 0x10; /*ET hardwired on 486*/
|
||||
else {
|
||||
@@ -180,8 +184,16 @@ opMOV_CRx_r_a16(uint32_t fetchdat)
|
||||
fetch_ea_16(fetchdat);
|
||||
switch (cpu_reg) {
|
||||
case 0:
|
||||
if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000001)
|
||||
if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001)
|
||||
flushmmucache();
|
||||
else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) {
|
||||
if (is_p6 || cpu_use_dynarec)
|
||||
flushmmucache();
|
||||
else {
|
||||
flushmmucache_nopc();
|
||||
cpu_flush_pending = 1;
|
||||
}
|
||||
}
|
||||
/* Make sure CPL = 0 when switching from real mode to protected mode. */
|
||||
if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01))
|
||||
cpu_state.seg_cs.access &= 0x9f;
|
||||
@@ -237,8 +249,16 @@ opMOV_CRx_r_a32(uint32_t fetchdat)
|
||||
fetch_ea_32(fetchdat);
|
||||
switch (cpu_reg) {
|
||||
case 0:
|
||||
if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000001)
|
||||
if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001)
|
||||
flushmmucache();
|
||||
else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) {
|
||||
if (is_p6 || cpu_use_dynarec)
|
||||
flushmmucache();
|
||||
else {
|
||||
flushmmucache_nopc();
|
||||
cpu_flush_pending = 1;
|
||||
}
|
||||
}
|
||||
/* Make sure CPL = 0 when switching from real mode to protected mode. */
|
||||
if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01))
|
||||
cpu_state.seg_cs.access &= 0x9f;
|
||||
|
||||
@@ -9,6 +9,8 @@ opMOV_r_CRx_a16(uint32_t fetchdat)
|
||||
switch (cpu_reg) {
|
||||
case 0:
|
||||
cpu_state.regs[cpu_rm].l = cr0;
|
||||
if (cpu_flush_pending)
|
||||
cpu_state.regs[cpu_rm].l ^= 0x80000000;
|
||||
if (is486 || isibm486)
|
||||
cpu_state.regs[cpu_rm].l |= 0x10; /*ET hardwired on 486*/
|
||||
else {
|
||||
@@ -49,6 +51,8 @@ opMOV_r_CRx_a32(uint32_t fetchdat)
|
||||
switch (cpu_reg) {
|
||||
case 0:
|
||||
cpu_state.regs[cpu_rm].l = cr0;
|
||||
if (cpu_flush_pending)
|
||||
cpu_state.regs[cpu_rm].l ^= 0x80000000;
|
||||
if (is486 || isibm486)
|
||||
cpu_state.regs[cpu_rm].l |= 0x10; /*ET hardwired on 486*/
|
||||
else {
|
||||
@@ -176,8 +180,12 @@ opMOV_CRx_r_a16(uint32_t fetchdat)
|
||||
fetch_ea_16(fetchdat);
|
||||
switch (cpu_reg) {
|
||||
case 0:
|
||||
if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000001)
|
||||
if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001)
|
||||
flushmmucache();
|
||||
else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) {
|
||||
flushmmucache_nopc();
|
||||
cpu_flush_pending = 1;
|
||||
}
|
||||
/* Make sure CPL = 0 when switching from real mode to protected mode. */
|
||||
if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01))
|
||||
cpu_state.seg_cs.access &= 0x9f;
|
||||
@@ -233,8 +241,12 @@ opMOV_CRx_r_a32(uint32_t fetchdat)
|
||||
fetch_ea_32(fetchdat);
|
||||
switch (cpu_reg) {
|
||||
case 0:
|
||||
if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000001)
|
||||
if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001)
|
||||
flushmmucache();
|
||||
else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) {
|
||||
flushmmucache_nopc();
|
||||
cpu_flush_pending = 1;
|
||||
}
|
||||
/* Make sure CPL = 0 when switching from real mode to protected mode. */
|
||||
if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01))
|
||||
cpu_state.seg_cs.access &= 0x9f;
|
||||
|
||||
@@ -228,7 +228,6 @@ FPU_save_regi_tag(extFloat80_t reg, int tag, int stnr)
|
||||
#define FPU_check_pending_exceptions() \
|
||||
do { \
|
||||
if (fpu_state.swd & FPU_SW_Summary) { \
|
||||
pclog("SW Summary.\n"); \
|
||||
if (cr0 & 0x20) { \
|
||||
x86_int(16); \
|
||||
return 1; \
|
||||
|
||||
@@ -35,6 +35,7 @@ typedef struct cart_t {
|
||||
} cart_t;
|
||||
|
||||
char cart_fns[2][512];
|
||||
char *cart_image_history[2][CART_IMAGE_HISTORY];
|
||||
|
||||
static cart_t carts[2];
|
||||
|
||||
@@ -169,6 +170,7 @@ cart_close(int drive)
|
||||
cart_image_close(drive);
|
||||
cart_fns[drive][0] = 0;
|
||||
ui_sb_update_icon_state(SB_CARTRIDGE | drive, 1);
|
||||
resetx86();
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -45,6 +45,7 @@ pc_cassette_t *cassette;
|
||||
|
||||
char cassette_fname[512];
|
||||
char cassette_mode[512];
|
||||
char * cassette_image_history[CASSETTE_IMAGE_HISTORY];
|
||||
unsigned long cassette_pos;
|
||||
unsigned long cassette_srate;
|
||||
int cassette_enable;
|
||||
|
||||
@@ -828,7 +828,7 @@ write_p2(atkbc_t *dev, uint8_t val)
|
||||
and can find out what they actually did to make it boot from FFFFF0
|
||||
correctly despite A20 being gated when the CPU is reset, this will
|
||||
have to do. */
|
||||
if (kbc_ven == KBC_VEN_SIEMENS)
|
||||
if ((kbc_ven == KBC_VEN_SIEMENS) || !strcmp(machine_get_internal_name(), "acera1g"))
|
||||
is486 ? loadcs(0xf000) : loadcs_2386(0xf000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ serial_write_fifo(serial_t *dev, uint8_t dat)
|
||||
((dev->type >= SERIAL_16550) && dev->fifo_enabled) ?
|
||||
fifo_get_count(dev->rcvr_fifo) : 0);
|
||||
|
||||
if (!(dev->mctrl & 0x10))
|
||||
if ((dev != NULL) && !(dev->mctrl & 0x10))
|
||||
write_fifo(dev, dat);
|
||||
}
|
||||
|
||||
|
||||
@@ -1683,7 +1683,7 @@ st506_init(const device_t *info)
|
||||
dev->base = device_get_config_hex16("base");
|
||||
dev->irq = device_get_config_int("irq");
|
||||
if (dev->irq == 2)
|
||||
dev->switches |= 0x40;
|
||||
dev->switches |= 0x80;
|
||||
dev->bios_addr = device_get_config_hex20("bios_addr");
|
||||
break;
|
||||
|
||||
@@ -1702,7 +1702,7 @@ st506_init(const device_t *info)
|
||||
dev->base = device_get_config_hex16("base");
|
||||
dev->irq = device_get_config_int("irq");
|
||||
if (dev->irq == 2)
|
||||
dev->switches |= 0x40;
|
||||
dev->switches |= 0x80;
|
||||
dev->bios_addr = device_get_config_hex20("bios_addr");
|
||||
break;
|
||||
|
||||
@@ -1717,7 +1717,7 @@ st506_init(const device_t *info)
|
||||
dev->base = device_get_config_hex16("base");
|
||||
dev->irq = device_get_config_int("irq");
|
||||
if (dev->irq == 2)
|
||||
dev->switches |= 0x40;
|
||||
dev->switches |= 0x80;
|
||||
dev->bios_addr = device_get_config_hex20("bios_addr");
|
||||
break;
|
||||
|
||||
@@ -1732,7 +1732,7 @@ st506_init(const device_t *info)
|
||||
dev->base = device_get_config_hex16("base");
|
||||
dev->irq = device_get_config_int("irq");
|
||||
if (dev->irq == 2)
|
||||
dev->switches |= 0x40;
|
||||
dev->switches |= 0x80;
|
||||
dev->bios_addr = device_get_config_hex20("bios_addr");
|
||||
break;
|
||||
|
||||
@@ -1747,7 +1747,7 @@ st506_init(const device_t *info)
|
||||
dev->base = device_get_config_hex16("base");
|
||||
dev->irq = device_get_config_int("irq");
|
||||
if (dev->irq == 2)
|
||||
dev->switches |= 0x40;
|
||||
dev->switches |= 0x80;
|
||||
dev->bios_addr = device_get_config_hex20("bios_addr");
|
||||
break;
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#ifndef _FILE_OFFSET_BITS
|
||||
# define _FILE_OFFSET_BITS 64
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
@@ -45,6 +46,10 @@
|
||||
#include <time.h>
|
||||
#include "minivhd.h"
|
||||
#include "internal.h"
|
||||
#define HAVE_STDARG_H
|
||||
|
||||
#include "cpu.h"
|
||||
#include <86box/86box.h>
|
||||
|
||||
/*
|
||||
* The following bit array macros adapted from:
|
||||
@@ -334,36 +339,38 @@ mvhd_sparse_diff_write(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *i
|
||||
int sib = 0;
|
||||
ls = offset + transfer_sectors;
|
||||
|
||||
for (s = offset; s < ls; s++) {
|
||||
blk = s / vhdm->sect_per_block;
|
||||
sib = s % vhdm->sect_per_block;
|
||||
if (vhdm->bitmap.curr_block != blk && prev_blk >= 0) {
|
||||
/* Write the sector bitmap for the previous block, before we replace it. */
|
||||
write_curr_sect_bitmap(vhdm);
|
||||
}
|
||||
|
||||
if (vhdm->block_offset[blk] == MVHD_SPARSE_BLK) {
|
||||
/* "read" the sector bitmap first, before creating a new block, as the bitmap will be
|
||||
zero either way */
|
||||
read_sect_bitmap(vhdm, blk);
|
||||
create_block(vhdm, blk);
|
||||
}
|
||||
|
||||
if (blk != prev_blk) {
|
||||
if (vhdm->bitmap.curr_block != blk) {
|
||||
read_sect_bitmap(vhdm, blk);
|
||||
mvhd_fseeko64(vhdm->f, (uint64_t)sib * MVHD_SECTOR_SIZE, SEEK_CUR);
|
||||
} else {
|
||||
addr = (((int64_t) vhdm->block_offset[blk]) + vhdm->bitmap.sector_count + sib) *
|
||||
MVHD_SECTOR_SIZE;
|
||||
mvhd_fseeko64(vhdm->f, addr, SEEK_SET);
|
||||
if (offset < total_sectors) {
|
||||
for (s = offset; s < ls; s++) {
|
||||
blk = s / vhdm->sect_per_block;
|
||||
sib = s % vhdm->sect_per_block;
|
||||
if (vhdm->bitmap.curr_block != blk && prev_blk >= 0) {
|
||||
/* Write the sector bitmap for the previous block, before we replace it. */
|
||||
write_curr_sect_bitmap(vhdm);
|
||||
}
|
||||
prev_blk = blk;
|
||||
}
|
||||
|
||||
fwrite(buff, MVHD_SECTOR_SIZE, 1, vhdm->f);
|
||||
VHD_SETBIT(vhdm->bitmap.curr_bitmap, sib);
|
||||
buff += MVHD_SECTOR_SIZE;
|
||||
if (vhdm->block_offset[blk] == MVHD_SPARSE_BLK) {
|
||||
/* "read" the sector bitmap first, before creating a new block, as the bitmap will be
|
||||
zero either way */
|
||||
read_sect_bitmap(vhdm, blk);
|
||||
create_block(vhdm, blk);
|
||||
}
|
||||
|
||||
if (blk != prev_blk) {
|
||||
if (vhdm->bitmap.curr_block != blk) {
|
||||
read_sect_bitmap(vhdm, blk);
|
||||
mvhd_fseeko64(vhdm->f, (uint64_t)sib * MVHD_SECTOR_SIZE, SEEK_CUR);
|
||||
} else {
|
||||
addr = (((int64_t) vhdm->block_offset[blk]) + vhdm->bitmap.sector_count + sib) *
|
||||
MVHD_SECTOR_SIZE;
|
||||
mvhd_fseeko64(vhdm->f, addr, SEEK_SET);
|
||||
}
|
||||
prev_blk = blk;
|
||||
}
|
||||
|
||||
fwrite(buff, MVHD_SECTOR_SIZE, 1, vhdm->f);
|
||||
VHD_SETBIT(vhdm->bitmap.curr_bitmap, sib);
|
||||
buff += MVHD_SECTOR_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
/* And write the sector bitmap for the last block we visited to disk */
|
||||
|
||||
@@ -1513,6 +1513,7 @@ gdbstub_client_thread(void *priv)
|
||||
case '$': /* packet start */
|
||||
/* Wait for any existing packets to be processed. */
|
||||
thread_wait_event(client->processed_event, -1);
|
||||
thread_set_event(client->processed_event);
|
||||
|
||||
client->packet_pos = 0;
|
||||
break;
|
||||
@@ -1530,6 +1531,7 @@ gdbstub_client_thread(void *priv)
|
||||
case 0x03: /* break */
|
||||
/* Wait for any existing packets to be processed. */
|
||||
thread_wait_event(client->processed_event, -1);
|
||||
thread_set_event(client->processed_event);
|
||||
|
||||
/* Break immediately. */
|
||||
gdbstub_log("GDB Stub: Break requested\n");
|
||||
@@ -1539,6 +1541,7 @@ gdbstub_client_thread(void *priv)
|
||||
default:
|
||||
/* Wait for any existing packets to be processed, just in case. */
|
||||
thread_wait_event(client->processed_event, -1);
|
||||
thread_set_event(client->processed_event);
|
||||
|
||||
if (client->packet_pos < (sizeof(client->packet) - 1)) {
|
||||
/* Append byte to the packet. */
|
||||
|
||||
@@ -153,6 +153,7 @@ extern int enable_discord; /* (C) enable Discord integration */
|
||||
extern int other_ide_present; /* IDE controllers from non-IDE cards are present */
|
||||
extern int other_scsi_present; /* SCSI controllers from non-SCSI cards are present */
|
||||
|
||||
extern int hard_reset_pending;
|
||||
extern int fixed_size_x;
|
||||
extern int fixed_size_y;
|
||||
extern int do_auto_pause; /* (C) Auto-pause the emulator on focus loss */
|
||||
|
||||
@@ -21,7 +21,10 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CART_IMAGE_HISTORY 4
|
||||
|
||||
extern char cart_fns[2][512];
|
||||
extern char *cart_image_history[2][CART_IMAGE_HISTORY];
|
||||
|
||||
extern void cart_load(int drive, char *fn);
|
||||
extern void cart_close(int drive);
|
||||
|
||||
@@ -153,10 +153,13 @@ void pc_cas_print_state(const pc_cassette_t *cas);
|
||||
void pc_cas_clock(pc_cassette_t *cas, unsigned long cnt);
|
||||
void pc_cas_advance(pc_cassette_t *cas);
|
||||
|
||||
#define CASSETTE_IMAGE_HISTORY 4
|
||||
|
||||
extern pc_cassette_t *cassette;
|
||||
|
||||
extern char cassette_fname[512];
|
||||
extern char cassette_mode[512];
|
||||
extern char * cassette_image_history[CASSETTE_IMAGE_HISTORY];
|
||||
extern unsigned long cassette_pos;
|
||||
extern unsigned long cassette_srate;
|
||||
extern int cassette_enable;
|
||||
|
||||
@@ -446,6 +446,7 @@ extern void mem_flush_write_page(uint32_t addr, uint32_t virt);
|
||||
extern void mem_reset_page_blocks(void);
|
||||
|
||||
extern void flushmmucache(void);
|
||||
extern void flushmmucache_pc(void);
|
||||
extern void flushmmucache_nopc(void);
|
||||
|
||||
extern void mem_debug_check_addr(uint32_t addr, int write);
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
typedef struct ogc_t {
|
||||
cga_t cga;
|
||||
uint16_t ctrl_addr;
|
||||
/* unused in OGC, required for M19 video card structure idiom */
|
||||
uint8_t ctrl_3dd;
|
||||
uint8_t ctrl_3de;
|
||||
|
||||
@@ -341,6 +341,7 @@ enum {
|
||||
LFB_FORMAT_RGB565 = 0,
|
||||
LFB_FORMAT_RGB555 = 1,
|
||||
LFB_FORMAT_ARGB1555 = 2,
|
||||
LFB_FORMAT_XRGB8888 = 4,
|
||||
LFB_FORMAT_ARGB8888 = 5,
|
||||
LFB_FORMAT_DEPTH = 15,
|
||||
LFB_FORMAT_MASK = 15
|
||||
|
||||
@@ -527,7 +527,9 @@ extern const device_t s3_trio64v2_dx_onboard_pci_device;
|
||||
|
||||
/* S3 ViRGE */
|
||||
extern const device_t s3_virge_325_pci_device;
|
||||
extern const device_t s3_virge_325_onboard_pci_device;
|
||||
extern const device_t s3_diamond_stealth_2000_pci_device;
|
||||
extern const device_t s3_mirocrystal_3d_pci_device;
|
||||
extern const device_t s3_diamond_stealth_3000_pci_device;
|
||||
extern const device_t s3_stb_velocity_3d_pci_device;
|
||||
extern const device_t s3_virge_375_pci_device;
|
||||
|
||||
@@ -408,11 +408,10 @@ machine_at_atc6310bxii_init(const machine_t *model)
|
||||
pci_init(PCI_CONFIG_TYPE_1);
|
||||
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4);
|
||||
pci_register_slot(0x0A, PCI_CARD_NORMAL, 1, 2, 3, 4);
|
||||
pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1);
|
||||
pci_register_slot(0x0C, PCI_CARD_NORMAL, 3, 4, 1, 2);
|
||||
pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3);
|
||||
pci_register_slot(0x0E, PCI_CARD_NORMAL, 4, 1, 2, 3);
|
||||
pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4);
|
||||
pci_register_slot(0x09, PCI_CARD_NORMAL, 2, 3, 4, 1);
|
||||
pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2);
|
||||
pci_register_slot(0x0B, PCI_CARD_NORMAL, 4, 1, 2, 3);
|
||||
pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4);
|
||||
device_add(&i440bx_device);
|
||||
device_add(&slc90e66_device);
|
||||
|
||||
@@ -324,10 +324,10 @@ machine_at_ap440fx_init(const machine_t *model)
|
||||
device_add(&intel_flash_bxt_ami_device);
|
||||
|
||||
if (sound_card_current[0] == SOUND_INTERNAL)
|
||||
device_add(&cs4236b_device);
|
||||
device_add(machine_get_snd_device(machine));
|
||||
|
||||
if (gfxcard[0] == VID_INTERNAL)
|
||||
device_add(&s3_virge_375_onboard_pci_device);
|
||||
device_add(machine_get_vid_device(machine));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -96,6 +96,7 @@ typedef struct pcjr_t {
|
||||
int firstline;
|
||||
int lastline;
|
||||
int composite;
|
||||
int apply_hd;
|
||||
|
||||
/* Keyboard Controller stuff. */
|
||||
int latched;
|
||||
@@ -107,6 +108,525 @@ typedef struct pcjr_t {
|
||||
pc_timer_t send_delay_timer;
|
||||
} pcjr_t;
|
||||
|
||||
/*PCjr keyboard has no escape scancodes, and no scancodes beyond 54
|
||||
Map right alt to 54h (FN) */
|
||||
const scancode scancode_pcjr[512] = {
|
||||
// clang-format off
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 000 */
|
||||
{ .mk = { 0x01, 0 }, .brk = { 0x81, 0 } }, /* 001 */
|
||||
{ .mk = { 0x02, 0 }, .brk = { 0x82, 0 } }, /* 002 */
|
||||
{ .mk = { 0x03, 0 }, .brk = { 0x83, 0 } }, /* 003 */
|
||||
{ .mk = { 0x04, 0 }, .brk = { 0x84, 0 } }, /* 004 */
|
||||
{ .mk = { 0x05, 0 }, .brk = { 0x85, 0 } }, /* 005 */
|
||||
{ .mk = { 0x06, 0 }, .brk = { 0x86, 0 } }, /* 006 */
|
||||
{ .mk = { 0x07, 0 }, .brk = { 0x87, 0 } }, /* 007 */
|
||||
{ .mk = { 0x08, 0 }, .brk = { 0x88, 0 } }, /* 008 */
|
||||
{ .mk = { 0x09, 0 }, .brk = { 0x89, 0 } }, /* 009 */
|
||||
{ .mk = { 0x0a, 0 }, .brk = { 0x8a, 0 } }, /* 00a */
|
||||
{ .mk = { 0x0b, 0 }, .brk = { 0x8b, 0 } }, /* 00b */
|
||||
{ .mk = { 0x0c, 0 }, .brk = { 0x8c, 0 } }, /* 00c */
|
||||
{ .mk = { 0x0d, 0 }, .brk = { 0x8d, 0 } }, /* 00d */
|
||||
{ .mk = { 0x0e, 0 }, .brk = { 0x8e, 0 } }, /* 00e */
|
||||
{ .mk = { 0x0f, 0 }, .brk = { 0x8f, 0 } }, /* 00f */
|
||||
{ .mk = { 0x10, 0 }, .brk = { 0x90, 0 } }, /* 010 */
|
||||
{ .mk = { 0x11, 0 }, .brk = { 0x91, 0 } }, /* 011 */
|
||||
{ .mk = { 0x12, 0 }, .brk = { 0x92, 0 } }, /* 012 */
|
||||
{ .mk = { 0x13, 0 }, .brk = { 0x93, 0 } }, /* 013 */
|
||||
{ .mk = { 0x14, 0 }, .brk = { 0x94, 0 } }, /* 014 */
|
||||
{ .mk = { 0x15, 0 }, .brk = { 0x95, 0 } }, /* 015 */
|
||||
{ .mk = { 0x16, 0 }, .brk = { 0x96, 0 } }, /* 016 */
|
||||
{ .mk = { 0x17, 0 }, .brk = { 0x97, 0 } }, /* 017 */
|
||||
{ .mk = { 0x18, 0 }, .brk = { 0x98, 0 } }, /* 018 */
|
||||
{ .mk = { 0x19, 0 }, .brk = { 0x99, 0 } }, /* 019 */
|
||||
{ .mk = { 0x1a, 0 }, .brk = { 0x9a, 0 } }, /* 01a */
|
||||
{ .mk = { 0x1b, 0 }, .brk = { 0x9b, 0 } }, /* 01b */
|
||||
{ .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 01c */
|
||||
{ .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 01d */
|
||||
{ .mk = { 0x1e, 0 }, .brk = { 0x9e, 0 } }, /* 01e */
|
||||
{ .mk = { 0x1f, 0 }, .brk = { 0x9f, 0 } }, /* 01f */
|
||||
{ .mk = { 0x20, 0 }, .brk = { 0xa0, 0 } }, /* 020 */
|
||||
{ .mk = { 0x21, 0 }, .brk = { 0xa1, 0 } }, /* 021 */
|
||||
{ .mk = { 0x22, 0 }, .brk = { 0xa2, 0 } }, /* 022 */
|
||||
{ .mk = { 0x23, 0 }, .brk = { 0xa3, 0 } }, /* 023 */
|
||||
{ .mk = { 0x24, 0 }, .brk = { 0xa4, 0 } }, /* 024 */
|
||||
{ .mk = { 0x25, 0 }, .brk = { 0xa5, 0 } }, /* 025 */
|
||||
{ .mk = { 0x26, 0 }, .brk = { 0xa6, 0 } }, /* 026 */
|
||||
{ .mk = { 0x27, 0 }, .brk = { 0xa7, 0 } }, /* 027 */
|
||||
{ .mk = { 0x28, 0 }, .brk = { 0xa8, 0 } }, /* 028 */
|
||||
{ .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 029 */
|
||||
{ .mk = { 0x2a, 0 }, .brk = { 0xaa, 0 } }, /* 02a */
|
||||
{ .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 02b */
|
||||
{ .mk = { 0x2c, 0 }, .brk = { 0xac, 0 } }, /* 02c */
|
||||
{ .mk = { 0x2d, 0 }, .brk = { 0xad, 0 } }, /* 02d */
|
||||
{ .mk = { 0x2e, 0 }, .brk = { 0xae, 0 } }, /* 02e */
|
||||
{ .mk = { 0x2f, 0 }, .brk = { 0xaf, 0 } }, /* 02f */
|
||||
{ .mk = { 0x30, 0 }, .brk = { 0xb0, 0 } }, /* 030 */
|
||||
{ .mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 031 */
|
||||
{ .mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 032 */
|
||||
{ .mk = { 0x33, 0 }, .brk = { 0xb3, 0 } }, /* 033 */
|
||||
{ .mk = { 0x34, 0 }, .brk = { 0xb4, 0 } }, /* 034 */
|
||||
{ .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 035 */
|
||||
{ .mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 036 */
|
||||
{ .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 037 */
|
||||
{ .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 038 */
|
||||
{ .mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 039 */
|
||||
{ .mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 03a */
|
||||
{ .mk = { 0x3b, 0 }, .brk = { 0xbb, 0 } }, /* 03b */
|
||||
{ .mk = { 0x3c, 0 }, .brk = { 0xbc, 0 } }, /* 03c */
|
||||
{ .mk = { 0x3d, 0 }, .brk = { 0xbd, 0 } }, /* 03d */
|
||||
{ .mk = { 0x3e, 0 }, .brk = { 0xbe, 0 } }, /* 03e */
|
||||
{ .mk = { 0x3f, 0 }, .brk = { 0xbf, 0 } }, /* 03f */
|
||||
{ .mk = { 0x40, 0 }, .brk = { 0xc0, 0 } }, /* 040 */
|
||||
{ .mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 041 */
|
||||
{ .mk = { 0x42, 0 }, .brk = { 0xc2, 0 } }, /* 042 */
|
||||
{ .mk = { 0x43, 0 }, .brk = { 0xc3, 0 } }, /* 043 */
|
||||
{ .mk = { 0x44, 0 }, .brk = { 0xc4, 0 } }, /* 044 */
|
||||
{ .mk = { 0x45, 0 }, .brk = { 0xc5, 0 } }, /* 045 */
|
||||
{ .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 046 */
|
||||
{ .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 047 */
|
||||
{ .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 048 */
|
||||
{ .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 049 */
|
||||
{ .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 04a */
|
||||
{ .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 04b */
|
||||
{ .mk = { 0x4c, 0 }, .brk = { 0xcc, 0 } }, /* 04c */
|
||||
{ .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 04d */
|
||||
{ .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 04e */
|
||||
{ .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 04f */
|
||||
{ .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 050 */
|
||||
{ .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */
|
||||
{ .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */
|
||||
{ .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 053 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 054 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 055 */
|
||||
{ .mk = { 0x55, 0 }, .brk = { 0xd5, 0 } }, /* 056 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 057 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 058 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 059 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 05a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 05b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 05c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 05d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 05e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 05f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 060 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 061 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 062 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 063 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 064 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 065 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 066 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 067 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 068 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 069 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 06a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 06b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 06c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 06d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 06e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 06f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 070 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 071 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 072 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 073 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 074 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 075 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 076 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 077 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 078 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 079 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 07a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 07b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 07c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 07d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 07e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 07f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 080 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 081 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 082 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 083 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 084 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 085 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 086 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 087 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 088 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 089 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 08a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 08b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 08c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 08d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 08e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 08f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 090 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 091 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 092 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 093 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 094 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 095 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 096 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 097 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 098 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 099 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 09a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 09b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 09c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 09d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 09e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 09f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0a9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0aa */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ab */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ac */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ad */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ae */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0af */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0b9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ba */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0bb */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0bc */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0bd */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0be */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0bf */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0c9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ca */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0cb */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0cc */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0cd */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ce */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0cf */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0d9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0da */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0db */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0dc */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0dd */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0de */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0df */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0e9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ea */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0eb */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ec */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ed */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ee */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ef */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0f9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0fa */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0fb */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0fc */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0fd */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0fe */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 0ff */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 100 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 101 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 102 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 103 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 104 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 105 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 106 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 107 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 108 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 109 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 10a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 10b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 10c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 10d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 10e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 10f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 110 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 111 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 112 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 113 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 114 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 115 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 116 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 117 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 118 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 119 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 11a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 11b */
|
||||
{ .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 11c */
|
||||
{ .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 11d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 11e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 11f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 120 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 121 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 122 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 123 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 124 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 125 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 126 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 127 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 128 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 129 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 12a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 12b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 12c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 12d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 12e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 12f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 130 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 131 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 132 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 133 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 134 */
|
||||
{ .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 135 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 136 */
|
||||
{ .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 137 */
|
||||
{ .mk = { 0x54, 0 }, .brk = { 0xd4, 0 } }, /* 138 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 139 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 13a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 13b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 13c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 13d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 13e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 13f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 140 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 141 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 142 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 143 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 144 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 145 */
|
||||
{ .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 146 */
|
||||
{ .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 147 */
|
||||
{ .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 148 */
|
||||
{ .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 149 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 14a */
|
||||
{ .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 14b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 14c */
|
||||
{ .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 14d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 14e */
|
||||
{ .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 14f */
|
||||
{ .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 150 */
|
||||
{ .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 151 */
|
||||
{ .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 152 */
|
||||
{ .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 153 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 154 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 155 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 156 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 157 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 158 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 159 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 15a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 15b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 15c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 15d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 15e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 15f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 160 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 161 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 162 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 163 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 164 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 165 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 166 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 167 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 168 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 169 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 16a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 16b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 16c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 16d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 16e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 16f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 170 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 171 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 172 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 173 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 174 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 175 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 176 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 177 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 178 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 179 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 17a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 17b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 17c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 17d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 17e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 17f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 180 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 181 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 182 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 183 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 184 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 185 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 186 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 187 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 188 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 189 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 18a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 18b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 18c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 18d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 18e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 18f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 190 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 191 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 192 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 193 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 194 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 195 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 196 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 197 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 198 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 199 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 19a */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 19b */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 19c */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 19d */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 19e */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 19f */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1a9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1aa */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ab */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ac */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ad */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ae */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1af */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1b9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ba */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1bb */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1bc */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1bd */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1be */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1bf */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1c9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ca */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1cb */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1cc */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1cd */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ce */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1cf */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1d9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1da */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1db */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1dc */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1dd */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1de */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1df */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1e9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ea */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1eb */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ec */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ed */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ee */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1ef */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f0 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f1 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f2 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f3 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f4 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f5 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f6 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f7 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f8 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1f9 */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1fa */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1fb */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1fc */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1fd */
|
||||
{ .mk = { 0 }, .brk = { 0 } }, /* 1fe */
|
||||
{ .mk = { 0 }, .brk = { 0 } } /* 1ff */
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static video_timings_t timing_dram = { VIDEO_BUS, 0, 0, 0, 0, 0, 0 }; /*No additional waitstates*/
|
||||
|
||||
static uint8_t crtcmask[32] = {
|
||||
@@ -301,7 +821,7 @@ vid_get_h_overscan_delta(pcjr_t *pcjr)
|
||||
coef = 8;
|
||||
break;
|
||||
case 0x12: /*160x200x16*/
|
||||
def = 0x2b;
|
||||
def = 0x2c; /* I'm going to assume a datasheet erratum here. */
|
||||
coef = 16;
|
||||
break;
|
||||
case 0x03: /*640x200x4*/
|
||||
@@ -341,20 +861,12 @@ vid_get_h_overscan_delta(pcjr_t *pcjr)
|
||||
static void
|
||||
vid_blit_h_overscan(pcjr_t *pcjr)
|
||||
{
|
||||
int cols;
|
||||
int cols = (pcjr->array[2] & 0xf) + 16;;
|
||||
int y0 = pcjr->firstline << 1;
|
||||
int y = (pcjr->lastline << 1) + 16;
|
||||
int ho_s = vid_get_h_overscan_size(pcjr);
|
||||
int i;
|
||||
int x;
|
||||
int y = (pcjr->lastline << 1) + 16;
|
||||
int ho_s = vid_get_h_overscan_size(pcjr);
|
||||
|
||||
if (pcjr->dispon)
|
||||
cols = (pcjr->array[2] & 0xf) + 16;
|
||||
else {
|
||||
if (pcjr->array[3] & 4)
|
||||
cols = (pcjr->array[2] & 0xf) + 16;
|
||||
else
|
||||
cols = pcjr->array[0 + 16] + 16;
|
||||
}
|
||||
|
||||
if (pcjr->array[0] & 1)
|
||||
x = (pcjr->crtc[1] << 3) + ho_s;
|
||||
@@ -362,14 +874,14 @@ vid_blit_h_overscan(pcjr_t *pcjr)
|
||||
x = (pcjr->crtc[1] << 4) + ho_s;
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
hline(buffer32, 0, i, x, cols);
|
||||
hline(buffer32, 0, y0 + i, x, cols);
|
||||
hline(buffer32, 0, y + i, x, cols);
|
||||
|
||||
if (pcjr->composite) {
|
||||
Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[i]);
|
||||
Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[y0 + i]);
|
||||
Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[y + i]);
|
||||
} else {
|
||||
video_process_8(x, i);
|
||||
video_process_8(x, y0 + i);
|
||||
video_process_8(x, y + i);
|
||||
}
|
||||
}
|
||||
@@ -443,16 +955,16 @@ vid_poll(void *priv)
|
||||
pcjr->ma++;
|
||||
buffer32->line[l][ef_x] = buffer32->line[l][ef_x + 1] =
|
||||
buffer32->line[l + 1][ef_x] = buffer32->line[l + 1][ef_x + 1] =
|
||||
pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16;
|
||||
pcjr->array[((dat >> 12) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[l][ef_x + 2] = buffer32->line[l][ef_x + 3] =
|
||||
buffer32->line[l + 1][ef_x + 2] = buffer32->line[l + 1][ef_x + 3] =
|
||||
pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16;
|
||||
pcjr->array[((dat >> 8) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[l][ef_x + 4] = buffer32->line[l][ef_x + 5] =
|
||||
buffer32->line[l + 1][ef_x + 4] = buffer32->line[l + 1][ef_x + 5] =
|
||||
pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16;
|
||||
pcjr->array[((dat >> 4) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[l][ef_x + 6] = buffer32->line[l][ef_x + 7] =
|
||||
buffer32->line[l + 1][ef_x + 6] = buffer32->line[l + 1][ef_x + 7] =
|
||||
pcjr->array[(dat & pcjr->array[1]) + 16] + 16;
|
||||
pcjr->array[(dat & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
}
|
||||
break;
|
||||
case 0x12: /*160x200x16*/
|
||||
@@ -493,7 +1005,7 @@ vid_poll(void *priv)
|
||||
chr = (dat >> 7) & 1;
|
||||
chr |= ((dat >> 14) & 2);
|
||||
buffer32->line[l][ef_x + c] = buffer32->line[l + 1][ef_x + c] =
|
||||
pcjr->array[(chr & pcjr->array[1]) + 16] + 16;
|
||||
pcjr->array[(chr & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
dat <<= 1;
|
||||
}
|
||||
}
|
||||
@@ -505,13 +1017,13 @@ vid_poll(void *priv)
|
||||
attr = pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1];
|
||||
drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron);
|
||||
if (pcjr->array[3] & 4) {
|
||||
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16;
|
||||
cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1]) + 16] + 16;
|
||||
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
if ((pcjr->blink & 16) && (attr & 0x80) && !drawcursor)
|
||||
cols[1] = cols[0];
|
||||
} else {
|
||||
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16;
|
||||
cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16] + 16;
|
||||
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
}
|
||||
if (pcjr->sc & 8)
|
||||
for (uint8_t c = 0; c < 8; c++)
|
||||
@@ -537,13 +1049,13 @@ vid_poll(void *priv)
|
||||
attr = pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1];
|
||||
drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron);
|
||||
if (pcjr->array[3] & 4) {
|
||||
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16;
|
||||
cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1]) + 16] + 16;
|
||||
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
if ((pcjr->blink & 16) && (attr & 0x80) && !drawcursor)
|
||||
cols[1] = cols[0];
|
||||
} else {
|
||||
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16;
|
||||
cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16] + 16;
|
||||
cols[1] = pcjr->array[((attr & 15) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1] & 0x0f) + 16] + 16;
|
||||
}
|
||||
pcjr->ma++;
|
||||
if (pcjr->sc & 8)
|
||||
@@ -727,9 +1239,12 @@ vid_poll(void *priv)
|
||||
if (enable_overscan) {
|
||||
video_blit_memtoscreen(0, pcjr->firstline << 1,
|
||||
xsize, actual_ys + 32);
|
||||
} else {
|
||||
} else if (pcjr->apply_hd) {
|
||||
video_blit_memtoscreen(ho_s / 2, (pcjr->firstline << 1) + 16,
|
||||
xsize, actual_ys);
|
||||
} else {
|
||||
video_blit_memtoscreen(ho_d, (pcjr->firstline << 1) + 16,
|
||||
xsize, actual_ys);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -923,6 +1438,34 @@ speed_changed(void *priv)
|
||||
recalc_timings(pcjr);
|
||||
}
|
||||
|
||||
static void
|
||||
pcjr_vid_init(pcjr_t *pcjr)
|
||||
{
|
||||
int display_type;
|
||||
|
||||
video_inform(VIDEO_FLAG_TYPE_CGA, &timing_dram);
|
||||
|
||||
pcjr->memctrl = -1;
|
||||
if (mem_size < 128)
|
||||
pcjr->memctrl &= ~0x24;
|
||||
|
||||
display_type = device_get_config_int("display_type");
|
||||
pcjr->composite = (display_type != PCJR_RGB);
|
||||
pcjr->apply_hd = device_get_config_int("apply_hd");
|
||||
overscan_x = 256;
|
||||
overscan_y = 32;
|
||||
|
||||
mem_mapping_add(&pcjr->mapping, 0xb8000, 0x08000,
|
||||
vid_read, NULL, NULL,
|
||||
vid_write, NULL, NULL, NULL, 0, pcjr);
|
||||
io_sethandler(0x03d0, 16,
|
||||
vid_in, NULL, NULL, vid_out, NULL, NULL, pcjr);
|
||||
timer_add(&pcjr->timer, vid_poll, pcjr, 1);
|
||||
|
||||
cga_palette = 0;
|
||||
cgapal_rebuild();
|
||||
}
|
||||
|
||||
void
|
||||
pit_irq0_timer_pcjr(int new_out, int old_out, UNUSED(void *priv))
|
||||
{
|
||||
@@ -951,6 +1494,13 @@ static const device_config_t pcjr_config[] = {
|
||||
{ .description = "" }
|
||||
}
|
||||
},
|
||||
{
|
||||
.name = "apply_hd",
|
||||
.description = "Apply overscan deltas",
|
||||
.type = CONFIG_BINARY,
|
||||
.default_string = "",
|
||||
.default_int = 1
|
||||
},
|
||||
{ .name = "", .description = "", .type = CONFIG_END }
|
||||
// clang-format on
|
||||
};
|
||||
@@ -972,7 +1522,6 @@ const device_t pcjr_device = {
|
||||
int
|
||||
machine_pcjr_init(UNUSED(const machine_t *model))
|
||||
{
|
||||
int display_type;
|
||||
pcjr_t *pcjr;
|
||||
|
||||
int ret;
|
||||
@@ -985,13 +1534,6 @@ machine_pcjr_init(UNUSED(const machine_t *model))
|
||||
|
||||
pcjr = malloc(sizeof(pcjr_t));
|
||||
memset(pcjr, 0x00, sizeof(pcjr_t));
|
||||
pcjr->memctrl = -1;
|
||||
if (mem_size < 128)
|
||||
pcjr->memctrl &= ~0x24;
|
||||
display_type = machine_get_config_int("display_type");
|
||||
pcjr->composite = (display_type != PCJR_RGB);
|
||||
overscan_x = 256;
|
||||
overscan_y = 32;
|
||||
|
||||
pic_init_pcjr();
|
||||
pit_common_init(0, pit_irq0_timer_pcjr, NULL);
|
||||
@@ -1001,16 +1543,10 @@ machine_pcjr_init(UNUSED(const machine_t *model))
|
||||
/* Initialize the video controller. */
|
||||
video_reset(gfxcard[0]);
|
||||
loadfont("roms/video/mda/mda.rom", 0);
|
||||
mem_mapping_add(&pcjr->mapping, 0xb8000, 0x08000,
|
||||
vid_read, NULL, NULL,
|
||||
vid_write, NULL, NULL, NULL, 0, pcjr);
|
||||
io_sethandler(0x03d0, 16,
|
||||
vid_in, NULL, NULL, vid_out, NULL, NULL, pcjr);
|
||||
timer_add(&pcjr->timer, vid_poll, pcjr, 1);
|
||||
video_inform(VIDEO_FLAG_TYPE_CGA, &timing_dram);
|
||||
device_context(&pcjr_device);
|
||||
pcjr_vid_init(pcjr);
|
||||
device_context_restore();
|
||||
device_add_ex(&pcjr_device, pcjr);
|
||||
cga_palette = 0;
|
||||
cgapal_rebuild();
|
||||
|
||||
/* Initialize the keyboard. */
|
||||
keyboard_scan = 1;
|
||||
@@ -1020,7 +1556,7 @@ machine_pcjr_init(UNUSED(const machine_t *model))
|
||||
io_sethandler(0x00a0, 8,
|
||||
kbd_read, NULL, NULL, kbd_write, NULL, NULL, pcjr);
|
||||
timer_add(&pcjr->send_delay_timer, kbd_poll, pcjr, 1);
|
||||
keyboard_set_table(scancode_xt);
|
||||
keyboard_set_table(scancode_pcjr);
|
||||
keyboard_send = kbd_adddata_ex;
|
||||
|
||||
/* Technically it's the SN76496N, but the SN76489 is identical to the SN76496N. */
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/timer.h>
|
||||
#include <86box/io.h>
|
||||
#include <86box/pic.h>
|
||||
#include <86box/pit.h>
|
||||
#include <86box/nmi.h>
|
||||
#include <86box/mem.h>
|
||||
@@ -717,8 +718,13 @@ recalc_timings(tandy_t *dev)
|
||||
double _dispofftime;
|
||||
double disptime;
|
||||
|
||||
disptime = vid->crtc[0] + 1;
|
||||
_dispontime = vid->crtc[1];
|
||||
if (vid->mode & 1) {
|
||||
disptime = vid->crtc[0] + 1;
|
||||
_dispontime = vid->crtc[1];
|
||||
} else {
|
||||
disptime = (vid->crtc[0] + 1) << 1;
|
||||
_dispontime = vid->crtc[1] << 1;
|
||||
}
|
||||
|
||||
_dispofftime = disptime - _dispontime;
|
||||
_dispontime *= CGACONST;
|
||||
@@ -794,7 +800,10 @@ vid_out(uint16_t addr, uint8_t val, void *priv)
|
||||
break;
|
||||
|
||||
case 0x03d8:
|
||||
old = vid->mode;
|
||||
vid->mode = val;
|
||||
if ((old ^ val) & 0x01)
|
||||
recalc_timings(dev);
|
||||
if (!dev->is_sl2)
|
||||
update_cga16_color(vid->mode);
|
||||
break;
|
||||
@@ -1215,6 +1224,7 @@ vid_poll(void *priv)
|
||||
vid->dispon = 0;
|
||||
vid->displine = 0;
|
||||
vid->vsynctime = 16;
|
||||
picint(1 << 5);
|
||||
if (vid->crtc[7]) {
|
||||
if (vid->mode & 1)
|
||||
x = (vid->crtc[1] << 3) + 16;
|
||||
@@ -1318,11 +1328,10 @@ vid_init(tandy_t *dev)
|
||||
vid = malloc(sizeof(t1kvid_t));
|
||||
memset(vid, 0x00, sizeof(t1kvid_t));
|
||||
vid->memctrl = -1;
|
||||
dev->vid = vid;
|
||||
|
||||
video_inform(VIDEO_FLAG_TYPE_CGA, &timing_dram);
|
||||
|
||||
display_type = machine_get_config_int("display_type");
|
||||
display_type = device_get_config_int("display_type");
|
||||
vid->composite = (display_type != TANDY_RGB);
|
||||
|
||||
cga_comp_init(1);
|
||||
@@ -1335,11 +1344,14 @@ vid_init(tandy_t *dev)
|
||||
io_sethandler(0x0065, 1, vid_in, NULL, NULL, vid_out, NULL, NULL, dev);
|
||||
} else
|
||||
vid->b8000_mask = 0x3fff;
|
||||
|
||||
timer_add(&vid->timer, vid_poll, dev, 1);
|
||||
mem_mapping_add(&vid->mapping, 0xb8000, 0x08000,
|
||||
vid_read, NULL, NULL, vid_write, NULL, NULL, NULL, 0, dev);
|
||||
io_sethandler(0x03d0, 16,
|
||||
vid_in, NULL, NULL, vid_out, NULL, NULL, dev);
|
||||
|
||||
dev->vid = vid;
|
||||
}
|
||||
|
||||
const device_config_t vid_config[] = {
|
||||
@@ -1761,7 +1773,9 @@ machine_tandy1k_init(const machine_t *model, int type)
|
||||
keyboard_set_table(scancode_tandy);
|
||||
io_sethandler(0x00a0, 1,
|
||||
tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev);
|
||||
device_context(&vid_device);
|
||||
vid_init(dev);
|
||||
device_context_restore();
|
||||
device_add_ex(&vid_device, dev);
|
||||
device_add((type == TYPE_TANDY1000SX) ? &ncr8496_device : &sn76489_device);
|
||||
break;
|
||||
@@ -1771,8 +1785,10 @@ machine_tandy1k_init(const machine_t *model, int type)
|
||||
keyboard_set_table(scancode_tandy);
|
||||
io_sethandler(0x00a0, 1,
|
||||
tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev);
|
||||
device_context(&vid_device_hx);
|
||||
vid_init(dev);
|
||||
device_add_ex(&vid_device, dev);
|
||||
device_context_restore();
|
||||
device_add_ex(&vid_device_hx, dev);
|
||||
device_add(&ncr8496_device);
|
||||
device_add(&eep_1000hx_device);
|
||||
break;
|
||||
@@ -1782,7 +1798,9 @@ machine_tandy1k_init(const machine_t *model, int type)
|
||||
init_rom(dev);
|
||||
io_sethandler(0xffe8, 8,
|
||||
tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev);
|
||||
device_context(&vid_device_sl);
|
||||
vid_init(dev);
|
||||
device_context_restore();
|
||||
device_add_ex(&vid_device_sl, dev);
|
||||
device_add(&pssj_device);
|
||||
device_add(&eep_1000sl2_device);
|
||||
|
||||
@@ -2038,6 +2038,8 @@ m19_vid_init(m19_vid_t *vid)
|
||||
vid->ogc.mono_display = 0;
|
||||
else
|
||||
vid->ogc.mono_display = 1;
|
||||
|
||||
vid->ogc.ctrl_addr = 0x3db;
|
||||
/* OGC emulation part end */
|
||||
|
||||
/* Plantronics emulation part begin*/
|
||||
|
||||
@@ -5486,10 +5486,10 @@ const machine_t machines[] = {
|
||||
.cpu = {
|
||||
.package = CPU_PKG_386DX | CPU_PKG_SOCKET1,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 25000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 5000,
|
||||
.max_voltage = 5000,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
@@ -5526,10 +5526,10 @@ const machine_t machines[] = {
|
||||
.cpu = {
|
||||
.package = CPU_PKG_386DX | CPU_PKG_SOCKET1,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 25000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 5000,
|
||||
.max_voltage = 5000,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
@@ -13760,7 +13760,7 @@ const machine_t machines[] = {
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = &s3_virge_375_onboard_pci_device,
|
||||
.vid_device = &s3_virge_325_onboard_pci_device,
|
||||
.snd_device = &cs4236b_device,
|
||||
.net_device = NULL
|
||||
},
|
||||
@@ -14680,7 +14680,7 @@ const machine_t machines[] = {
|
||||
/* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC
|
||||
firmware. */
|
||||
{
|
||||
.name = "[SMSC VictoryBX-66] A-Trend ATC-6310BXII",
|
||||
.name = "[SMSC VictoryBX-66] A-Trend ATC6310BXII",
|
||||
.internal_name = "atc6310bxii",
|
||||
.type = MACHINE_TYPE_SLOT1,
|
||||
.chipset = MACHINE_CHIPSET_SMSC_VICTORYBX_66,
|
||||
@@ -15399,7 +15399,7 @@ const machine_t machines[] = {
|
||||
/* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC
|
||||
firmware. */
|
||||
{
|
||||
.name = "[SMSC VictoryBX-66] A-Trend ATC-7020BXII",
|
||||
.name = "[SMSC VictoryBX-66] A-Trend ATC7020BXII",
|
||||
.internal_name = "atc7020bxii",
|
||||
.type = MACHINE_TYPE_SOCKET370,
|
||||
.chipset = MACHINE_CHIPSET_SMSC_VICTORYBX_66,
|
||||
|
||||
@@ -225,6 +225,19 @@ flushmmucache(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
flushmmucache_pc(void)
|
||||
{
|
||||
mmuflush++;
|
||||
|
||||
pccache = (uint32_t) 0xffffffff;
|
||||
pccache2 = (uint8_t *) 0xffffffff;
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
codegen_flush();
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
flushmmucache_nopc(void)
|
||||
{
|
||||
|
||||
@@ -278,6 +278,7 @@ readmembl_2386(uint32_t addr)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint64_t a;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_READ, 1);
|
||||
|
||||
@@ -287,7 +288,7 @@ readmembl_2386(uint32_t addr)
|
||||
|
||||
high_page = 0;
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
a = mmutranslate_read_2386(addr);
|
||||
addr64 = (uint32_t) a;
|
||||
|
||||
@@ -308,6 +309,7 @@ writemembl_2386(uint32_t addr, uint8_t val)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint64_t a;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
mem_debug_check_addr(addr, 2);
|
||||
GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_WRITE, 1);
|
||||
@@ -317,7 +319,7 @@ writemembl_2386(uint32_t addr, uint8_t val)
|
||||
|
||||
high_page = 0;
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
a = mmutranslate_write_2386(addr);
|
||||
addr64 = (uint32_t) a;
|
||||
|
||||
@@ -336,12 +338,13 @@ uint8_t
|
||||
readmembl_no_mmut_2386(uint32_t addr, uint32_t a64)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_READ, 1);
|
||||
|
||||
mem_logical_addr = addr;
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return 0xff;
|
||||
|
||||
@@ -361,12 +364,13 @@ void
|
||||
writemembl_no_mmut_2386(uint32_t addr, uint32_t a64, uint8_t val)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_WRITE, 1);
|
||||
|
||||
mem_logical_addr = addr;
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return;
|
||||
|
||||
@@ -384,6 +388,7 @@ readmemwl_2386(uint32_t addr)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint64_t a;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
addr64a[0] = addr;
|
||||
addr64a[1] = addr + 1;
|
||||
@@ -399,7 +404,7 @@ readmemwl_2386(uint32_t addr)
|
||||
if (!cpu_cyrix_alignment || (addr & 7) == 7)
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xffe) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
a = mmutranslate_read_2386(addr + i);
|
||||
addr64a[i] = (uint32_t) a;
|
||||
@@ -414,7 +419,7 @@ readmemwl_2386(uint32_t addr)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
a = mmutranslate_read_2386(addr);
|
||||
addr64a[0] = (uint32_t) a;
|
||||
|
||||
@@ -442,6 +447,7 @@ writememwl_2386(uint32_t addr, uint16_t val)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint64_t a;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
addr64a[0] = addr;
|
||||
addr64a[1] = addr + 1;
|
||||
@@ -457,7 +463,7 @@ writememwl_2386(uint32_t addr, uint16_t val)
|
||||
if (!cpu_cyrix_alignment || (addr & 7) == 7)
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xffe) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
/* Do not translate a page that has a valid lookup, as that is by definition valid
|
||||
and the whole purpose of the lookup is to avoid repeat identical translations. */
|
||||
@@ -479,7 +485,7 @@ writememwl_2386(uint32_t addr, uint16_t val)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
a = mmutranslate_write_2386(addr);
|
||||
addr64a[0] = (uint32_t) a;
|
||||
|
||||
@@ -508,6 +514,7 @@ uint16_t
|
||||
readmemwl_no_mmut_2386(uint32_t addr, uint32_t *a64)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_READ, 2);
|
||||
|
||||
@@ -517,7 +524,7 @@ readmemwl_no_mmut_2386(uint32_t addr, uint32_t *a64)
|
||||
if (!cpu_cyrix_alignment || (addr & 7) == 7)
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xffe) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return 0xffff;
|
||||
}
|
||||
@@ -527,7 +534,7 @@ readmemwl_no_mmut_2386(uint32_t addr, uint32_t *a64)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return 0xffff;
|
||||
|
||||
@@ -552,6 +559,7 @@ void
|
||||
writememwl_no_mmut_2386(uint32_t addr, uint32_t *a64, uint16_t val)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_WRITE, 2);
|
||||
|
||||
@@ -561,7 +569,7 @@ writememwl_no_mmut_2386(uint32_t addr, uint32_t *a64, uint16_t val)
|
||||
if (!cpu_cyrix_alignment || (addr & 7) == 7)
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xffe) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return;
|
||||
}
|
||||
@@ -572,7 +580,7 @@ writememwl_no_mmut_2386(uint32_t addr, uint32_t *a64, uint16_t val)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return;
|
||||
|
||||
@@ -600,6 +608,7 @@ readmemll_2386(uint32_t addr)
|
||||
mem_mapping_t *map;
|
||||
int i;
|
||||
uint64_t a = 0x0000000000000000ULL;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
addr64a[i] = (uint64_t) (addr + i);
|
||||
@@ -615,7 +624,7 @@ readmemll_2386(uint32_t addr)
|
||||
if ((addr & 3) && (!cpu_cyrix_alignment || (addr & 7) > 4))
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xffc) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (i == 0) {
|
||||
a = mmutranslate_read_2386(addr + i);
|
||||
@@ -644,7 +653,7 @@ readmemll_2386(uint32_t addr)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
a = mmutranslate_read_2386(addr);
|
||||
addr64a[0] = (uint32_t) a;
|
||||
|
||||
@@ -674,6 +683,7 @@ writememll_2386(uint32_t addr, uint32_t val)
|
||||
mem_mapping_t *map;
|
||||
int i;
|
||||
uint64_t a = 0x0000000000000000ULL;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
addr64a[i] = (uint64_t) (addr + i);
|
||||
@@ -689,7 +699,7 @@ writememll_2386(uint32_t addr, uint32_t val)
|
||||
if ((addr & 3) && (!cpu_cyrix_alignment || (addr & 7) > 4))
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xffc) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
/* Do not translate a page that has a valid lookup, as that is by definition valid
|
||||
and the whole purpose of the lookup is to avoid repeat identical translations. */
|
||||
@@ -723,7 +733,7 @@ writememll_2386(uint32_t addr, uint32_t val)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
a = mmutranslate_write_2386(addr);
|
||||
addr64a[0] = (uint32_t) a;
|
||||
|
||||
@@ -758,6 +768,7 @@ uint32_t
|
||||
readmemll_no_mmut_2386(uint32_t addr, uint32_t *a64)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_READ, 4);
|
||||
|
||||
@@ -767,7 +778,7 @@ readmemll_no_mmut_2386(uint32_t addr, uint32_t *a64)
|
||||
if ((addr & 3) && (!cpu_cyrix_alignment || (addr & 7) > 4))
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xffc) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return 0xffffffff;
|
||||
}
|
||||
@@ -777,7 +788,7 @@ readmemll_no_mmut_2386(uint32_t addr, uint32_t *a64)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return 0xffffffff;
|
||||
|
||||
@@ -804,6 +815,7 @@ void
|
||||
writememll_no_mmut_2386(uint32_t addr, uint32_t *a64, uint32_t val)
|
||||
{
|
||||
mem_mapping_t *map;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_WRITE, 4);
|
||||
|
||||
@@ -813,7 +825,7 @@ writememll_no_mmut_2386(uint32_t addr, uint32_t *a64, uint32_t val)
|
||||
if ((addr & 3) && (!cpu_cyrix_alignment || (addr & 7) > 4))
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xffc) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return;
|
||||
}
|
||||
@@ -824,7 +836,7 @@ writememll_no_mmut_2386(uint32_t addr, uint32_t *a64, uint32_t val)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
if (cpu_state.abrt || high_page)
|
||||
return;
|
||||
|
||||
@@ -858,6 +870,7 @@ readmemql_2386(uint32_t addr)
|
||||
mem_mapping_t *map;
|
||||
int i;
|
||||
uint64_t a = 0x0000000000000000ULL;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
addr64a[i] = (uint64_t) (addr + i);
|
||||
@@ -872,7 +885,7 @@ readmemql_2386(uint32_t addr)
|
||||
if (addr & 7) {
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xff8) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (i == 0) {
|
||||
a = mmutranslate_read_2386(addr + i);
|
||||
@@ -901,7 +914,7 @@ readmemql_2386(uint32_t addr)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
a = mmutranslate_read_2386(addr);
|
||||
addr64a[0] = (uint32_t) a;
|
||||
|
||||
@@ -924,6 +937,7 @@ writememql_2386(uint32_t addr, uint64_t val)
|
||||
mem_mapping_t *map;
|
||||
int i;
|
||||
uint64_t a = 0x0000000000000000ULL;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
addr64a[i] = (uint64_t) (addr + i);
|
||||
@@ -938,7 +952,7 @@ writememql_2386(uint32_t addr, uint64_t val)
|
||||
if (addr & 7) {
|
||||
cycles -= timing_misaligned;
|
||||
if ((addr & 0xfff) > 0xff8) {
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
for (i = 0; i < 8; i++) {
|
||||
/* Do not translate a page that has a valid lookup, as that is by definition valid
|
||||
and the whole purpose of the lookup is to avoid repeat identical translations. */
|
||||
@@ -972,7 +986,7 @@ writememql_2386(uint32_t addr, uint64_t val)
|
||||
}
|
||||
}
|
||||
|
||||
if (cr0 >> 31) {
|
||||
if (temp_cr0 >> 31) {
|
||||
addr64a[0] = mmutranslate_write_2386(addr);
|
||||
if (addr64a[0] > 0xffffffffULL)
|
||||
return;
|
||||
@@ -1013,13 +1027,14 @@ do_mmutranslate_2386(uint32_t addr, uint32_t *a64, int num, int write)
|
||||
int i;
|
||||
uint32_t last_addr = addr + (num - 1);
|
||||
uint64_t a = 0x0000000000000000ULL;
|
||||
uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0;
|
||||
|
||||
mem_debug_check_addr(addr, write ? 2 : read_type);
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
a64[i] = (uint64_t) addr;
|
||||
|
||||
if (!(cr0 >> 31))
|
||||
if (!(temp_cr0 >> 31))
|
||||
return;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
|
||||
@@ -1638,7 +1638,7 @@ nic_init(const device_t *info)
|
||||
s->pci_conf[0x04] = 7;
|
||||
|
||||
/* Enable our BIOS space in PCI, if needed. */
|
||||
if (s->bios_addr > 0) {
|
||||
if (s->has_bios) {
|
||||
rom_init(&s->bios_rom, ROM_PATH_DEC21140, s->bios_addr, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL);
|
||||
tulip_pci_bar[2].addr = 0xffff0000;
|
||||
} else
|
||||
|
||||
@@ -227,6 +227,10 @@ if(WIN32 AND NOT MINGW)
|
||||
target_sources(plat PRIVATE win_opendir.c)
|
||||
endif()
|
||||
|
||||
if(WIN32 AND NOT CPPTHREADS)
|
||||
target_sources(plat PRIVATE win_thread.c)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
target_sources(plat PRIVATE win_serial_passthrough.c win_netsocket.c)
|
||||
else()
|
||||
@@ -408,7 +412,7 @@ if (UNIX AND NOT APPLE AND NOT HAIKU)
|
||||
target_compile_definitions(ui PRIVATE XKBCOMMON_X11)
|
||||
target_link_libraries(ui PRIVATE X11::xcb PUBLIC PkgConfig::XKBCOMMON_X11)
|
||||
target_sources(ui PRIVATE xkbcommon_x11_keyboard.cpp)
|
||||
set(QT5_PRIVATE_HEADERS ON)
|
||||
set(QT_PRIVATE_HEADERS ON)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
@@ -430,13 +434,13 @@ if (UNIX AND NOT APPLE AND NOT HAIKU)
|
||||
target_sources(ui PRIVATE xkbcommon_wl_keyboard.cpp)
|
||||
endif()
|
||||
target_compile_definitions(ui PRIVATE WAYLAND)
|
||||
set(QT5_PRIVATE_HEADERS ON)
|
||||
set(QT_PRIVATE_HEADERS ON)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Add private headers for Qt5 if required.
|
||||
if (NOT USE_QT6 AND DEFINED QT5_PRIVATE_HEADERS)
|
||||
if (DEFINED QT_PRIVATE_HEADERS)
|
||||
find_package(Qt${QT_MAJOR}Gui)
|
||||
if (Qt${QT_MAJOR}Gui_FOUND)
|
||||
include_directories(${Qt${QT_MAJOR}Gui_PRIVATE_INCLUDE_DIRS})
|
||||
|
||||
@@ -138,8 +138,17 @@ main_thread_fn()
|
||||
}
|
||||
} else {
|
||||
/* Just so we dont overload the host OS. */
|
||||
|
||||
/* Trigger a hard reset if one is pending. */
|
||||
if (hard_reset_pending) {
|
||||
hard_reset_pending = 0;
|
||||
pc_reset_hard_close();
|
||||
pc_reset_hard_init();
|
||||
}
|
||||
|
||||
if (dopause)
|
||||
ack_pause();
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -946,10 +946,9 @@ MainWindow::on_actionSettings_triggered()
|
||||
default:
|
||||
break;
|
||||
case QDialog::Accepted:
|
||||
pc_reset_hard_close();
|
||||
settings.save();
|
||||
config_changed = 2;
|
||||
pc_reset_hard_init();
|
||||
pc_reset_hard();
|
||||
break;
|
||||
case QDialog::Rejected:
|
||||
break;
|
||||
|
||||
@@ -24,8 +24,15 @@
|
||||
|
||||
extern "C" {
|
||||
#include <86box/timer.h>
|
||||
#include <86box/cdrom.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/cassette.h>
|
||||
#include <86box/cartridge.h>
|
||||
#include <86box/fdd.h>
|
||||
#include <86box/cdrom.h>
|
||||
#include <86box/scsi_device.h>
|
||||
#include <86box/zip.h>
|
||||
#include <86box/mo.h>
|
||||
#include <86box/path.h>
|
||||
}
|
||||
|
||||
namespace ui {
|
||||
@@ -100,7 +107,14 @@ MediaHistoryManager::getImageForSlot(int index, int slot, ui::MediaType type)
|
||||
int
|
||||
MediaHistoryManager::maxDevicesSupported(ui::MediaType type)
|
||||
{
|
||||
return type == ui::MediaType::Cassette ? 1 : 4;
|
||||
switch (type) {
|
||||
default:
|
||||
return 4;
|
||||
case ui::MediaType::Cassette:
|
||||
return 1;
|
||||
case ui::MediaType::Cartridge:
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -163,14 +177,26 @@ MediaHistoryManager::initialDeduplication()
|
||||
for (int device_index = 0; device_index < maxDevicesSupported(device_type); device_index++) {
|
||||
device_index_list_t device_history = getHistoryListForDeviceIndex(device_index, device_type);
|
||||
switch (device_type) {
|
||||
case ui::MediaType::Optical:
|
||||
current_image = cdrom[device_index].image_path;
|
||||
default:
|
||||
continue;
|
||||
break;
|
||||
case ui::MediaType::Cassette:
|
||||
current_image = cassette_fname;
|
||||
break;
|
||||
case ui::MediaType::Cartridge:
|
||||
current_image = cart_fns[device_index];
|
||||
break;
|
||||
case ui::MediaType::Floppy:
|
||||
current_image = floppyfns[device_index];
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
case ui::MediaType::Optical:
|
||||
current_image = cdrom[device_index].image_path;
|
||||
break;
|
||||
case ui::MediaType::Zip:
|
||||
current_image = zip_drives[device_index].image_path;
|
||||
break;
|
||||
case ui::MediaType::Mo:
|
||||
current_image = mo_drives[device_index].image_path;
|
||||
break;
|
||||
}
|
||||
deduplicateList(device_history, QVector<QString>(1, current_image));
|
||||
@@ -190,12 +216,20 @@ char **
|
||||
MediaHistoryManager::getEmuHistoryVarForType(ui::MediaType type, int index)
|
||||
{
|
||||
switch (type) {
|
||||
case ui::MediaType::Optical:
|
||||
return &cdrom[index].image_history[0];
|
||||
case ui::MediaType::Floppy:
|
||||
return &fdd_image_history[index][0];
|
||||
default:
|
||||
return nullptr;
|
||||
case ui::MediaType::Cassette:
|
||||
return &cassette_image_history[0];
|
||||
case ui::MediaType::Cartridge:
|
||||
return &cart_image_history[index][0];
|
||||
case ui::MediaType::Floppy:
|
||||
return &fdd_image_history[index][0];
|
||||
case ui::MediaType::Optical:
|
||||
return &cdrom[index].image_history[0];
|
||||
case ui::MediaType::Zip:
|
||||
return &zip_drives[index].image_history[0];
|
||||
case ui::MediaType::Mo:
|
||||
return &mo_drives[index].image_history[0];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -275,9 +309,6 @@ MediaHistoryManager::pathAdjustSingle(QString checked_path)
|
||||
if (file_info.filePath().isEmpty() || current_usr_path.isEmpty() || file_info.isRelative()) {
|
||||
return checked_path;
|
||||
}
|
||||
if (file_info.filePath().startsWith(current_usr_path)) {
|
||||
checked_path = file_info.filePath().remove(current_usr_path);
|
||||
}
|
||||
return checked_path;
|
||||
}
|
||||
|
||||
@@ -304,10 +335,25 @@ MediaHistoryManager::removeMissingImages(device_index_list_t &device_history)
|
||||
if (file_info.filePath().isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
// For this check, explicitly prepend `usr_path` to relative paths to account for $CWD platform variances
|
||||
QFileInfo absolute_path = file_info.isRelative() ? QFileInfo(getUsrPath().append(file_info.filePath())) : file_info;
|
||||
if ((file_info.filePath().left(8) != "ioctl://") && !absolute_path.exists()) {
|
||||
qWarning("Image file %s does not exist - removing from history", qPrintable(file_info.filePath()));
|
||||
|
||||
char *p = checked_path.toUtf8().data();
|
||||
char temp[1024] = { 0 };
|
||||
|
||||
if (path_abs(p)) {
|
||||
if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1))
|
||||
fatal("removeMissingImages(): strlen(p) > 2047\n");
|
||||
else
|
||||
snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s", p);
|
||||
} else
|
||||
snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path,
|
||||
path_get_slash(usr_path), p);
|
||||
path_normalize(temp);
|
||||
|
||||
QString qstr = QString::fromUtf8(temp);
|
||||
QFileInfo new_fi(qstr);
|
||||
|
||||
if ((new_fi.filePath().left(8) != "ioctl://") && !new_fi.exists()) {
|
||||
qWarning("Image file %s does not exist - removing from history", qPrintable(new_fi.filePath()));
|
||||
checked_path = "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,8 @@ enum class MediaType {
|
||||
Optical,
|
||||
Zip,
|
||||
Mo,
|
||||
Cassette
|
||||
Cassette,
|
||||
Cartridge
|
||||
};
|
||||
// This macro allows us to do a reverse lookup of the enum with `QMetaEnum`
|
||||
Q_ENUM_NS(MediaType)
|
||||
@@ -61,6 +62,10 @@ typedef QHash<ui::MediaType, device_media_history_t> master_list_t;
|
||||
static const MediaType AllSupportedMediaHistoryTypes[] = {
|
||||
MediaType::Optical,
|
||||
MediaType::Floppy,
|
||||
MediaType::Zip,
|
||||
MediaType::Mo,
|
||||
MediaType::Cassette,
|
||||
MediaType::Cartridge
|
||||
};
|
||||
|
||||
class MediaHistoryManager {
|
||||
|
||||
@@ -91,6 +91,11 @@ MediaMenu::refresh(QMenu *parentMenu)
|
||||
cassetteMenu->addAction(tr("&Existing image..."), [this]() { cassetteSelectImage(false); });
|
||||
cassetteMenu->addAction(tr("Existing image (&Write-protected)..."), [this]() { cassetteSelectImage(true); });
|
||||
cassetteMenu->addSeparator();
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
|
||||
cassetteImageHistoryPos[slot] = cassetteMenu->children().count();
|
||||
cassetteMenu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, slot]() { cassetteMenuSelect(slot); })->setCheckable(false);
|
||||
}
|
||||
cassetteMenu->addSeparator();
|
||||
cassetteRecordPos = cassetteMenu->children().count();
|
||||
cassetteMenu->addAction(tr("&Record"), [this] { pc_cas_set_mode(cassette, 1); cassetteUpdateMenu(); })->setCheckable(true);
|
||||
cassettePlayPos = cassetteMenu->children().count();
|
||||
@@ -111,6 +116,11 @@ MediaMenu::refresh(QMenu *parentMenu)
|
||||
auto *menu = parentMenu->addMenu("");
|
||||
menu->addAction(tr("&Image..."), [this, i]() { cartridgeSelectImage(i); });
|
||||
menu->addSeparator();
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
|
||||
cartridgeImageHistoryPos[slot] = menu->children().count();
|
||||
menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { cartridgeMenuSelect(i, slot); })->setCheckable(false);
|
||||
}
|
||||
menu->addSeparator();
|
||||
cartridgeEjectPos = menu->children().count();
|
||||
menu->addAction(tr("E&ject"), [this, i]() { cartridgeEject(i); });
|
||||
cartridgeMenus[i] = menu;
|
||||
@@ -179,10 +189,13 @@ MediaMenu::refresh(QMenu *parentMenu)
|
||||
menu->addAction(tr("&Existing image..."), [this, i]() { zipSelectImage(i, false); });
|
||||
menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { zipSelectImage(i, true); });
|
||||
menu->addSeparator();
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
|
||||
zipImageHistoryPos[slot] = menu->children().count();
|
||||
menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false);
|
||||
}
|
||||
menu->addSeparator();
|
||||
zipEjectPos = menu->children().count();
|
||||
menu->addAction(tr("E&ject"), [this, i]() { zipEject(i); });
|
||||
zipReloadPos = menu->children().count();
|
||||
menu->addAction(tr("&Reload previous image"), [this, i]() { zipReload(i); });
|
||||
zipMenus[i] = menu;
|
||||
zipUpdateMenu(i);
|
||||
});
|
||||
@@ -195,10 +208,13 @@ MediaMenu::refresh(QMenu *parentMenu)
|
||||
menu->addAction(tr("&Existing image..."), [this, i]() { moSelectImage(i, false); });
|
||||
menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { moSelectImage(i, true); });
|
||||
menu->addSeparator();
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
|
||||
moImageHistoryPos[slot] = menu->children().count();
|
||||
menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { moReload(i, slot); })->setCheckable(false);
|
||||
}
|
||||
menu->addSeparator();
|
||||
moEjectPos = menu->children().count();
|
||||
menu->addAction(tr("E&ject"), [this, i]() { moEject(i); });
|
||||
moReloadPos = menu->children().count();
|
||||
menu->addAction(tr("&Reload previous image"), [this, i]() { moReload(i); });
|
||||
moMenus[i] = menu;
|
||||
moUpdateMenu(i);
|
||||
});
|
||||
@@ -243,9 +259,19 @@ MediaMenu::cassetteSelectImage(bool wp)
|
||||
cassetteMount(filename, wp);
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::cassetteMenuSelect(int slot)
|
||||
{
|
||||
QString filename = mhm.getImageForSlot(0, slot, ui::MediaType::Cassette);
|
||||
cassetteMount(filename.toUtf8().constData(), 0);
|
||||
cassetteUpdateMenu();
|
||||
ui_sb_update_tip(SB_CASSETTE);
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::cassetteMount(const QString &filename, bool wp)
|
||||
{
|
||||
auto previous_image = QFileInfo(cassette_fname);
|
||||
pc_cas_set_fname(cassette, nullptr);
|
||||
memset(cassette_fname, 0, sizeof(cassette_fname));
|
||||
cassette_ui_writeprot = wp ? 1 : 0;
|
||||
@@ -257,6 +283,7 @@ MediaMenu::cassetteMount(const QString &filename, bool wp)
|
||||
}
|
||||
|
||||
ui_sb_update_icon_state(SB_CASSETTE, filename.isEmpty() ? 1 : 0);
|
||||
mhm.addImageToHistory(0, ui::MediaType::Cassette, previous_image.filePath(), filename);
|
||||
cassetteUpdateMenu();
|
||||
ui_sb_update_tip(SB_CASSETTE);
|
||||
config_save();
|
||||
@@ -265,6 +292,7 @@ MediaMenu::cassetteMount(const QString &filename, bool wp)
|
||||
void
|
||||
MediaMenu::cassetteEject()
|
||||
{
|
||||
mhm.addImageToHistory(0, ui::MediaType::Cassette, cassette_fname, QString());
|
||||
pc_cas_set_fname(cassette, nullptr);
|
||||
memset(cassette_fname, 0, sizeof(cassette_fname));
|
||||
ui_sb_update_icon_state(SB_CASSETTE, 1);
|
||||
@@ -297,16 +325,22 @@ MediaMenu::cassetteUpdateMenu()
|
||||
|
||||
cassetteMenu->setTitle(QString::asprintf(tr("Cassette: %s").toUtf8().constData(),
|
||||
(name.isEmpty() ? tr("(empty)") : name).toUtf8().constData()));
|
||||
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
|
||||
updateImageHistory(0, slot, ui::MediaType::Cassette);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::cartridgeMount(int i, const QString &filename)
|
||||
{
|
||||
auto previous_image = QFileInfo(cart_fns[i]);
|
||||
cart_close(i);
|
||||
QByteArray filenameBytes = filename.toUtf8();
|
||||
cart_load(i, filenameBytes.data());
|
||||
|
||||
ui_sb_update_icon_state(SB_CARTRIDGE | i, filename.isEmpty() ? 1 : 0);
|
||||
mhm.addImageToHistory(i, ui::MediaType::Cartridge, previous_image.filePath(), filename);
|
||||
cartridgeUpdateMenu(i);
|
||||
ui_sb_update_tip(SB_CARTRIDGE | i);
|
||||
config_save();
|
||||
@@ -327,9 +361,19 @@ MediaMenu::cartridgeSelectImage(int i)
|
||||
cartridgeMount(i, filename);
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::cartridgeMenuSelect(int index, int slot)
|
||||
{
|
||||
QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Cartridge);
|
||||
cartridgeMount(index, filename.toUtf8().constData());
|
||||
cartridgeUpdateMenu(index);
|
||||
ui_sb_update_tip(SB_CARTRIDGE | index);
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::cartridgeEject(int i)
|
||||
{
|
||||
mhm.addImageToHistory(i, ui::MediaType::Cartridge, cart_fns[i], QString());
|
||||
cart_close(i);
|
||||
ui_sb_update_icon_state(SB_CARTRIDGE | i, 1);
|
||||
cartridgeUpdateMenu(i);
|
||||
@@ -347,6 +391,10 @@ MediaMenu::cartridgeUpdateMenu(int i)
|
||||
ejectMenu->setEnabled(!name.isEmpty());
|
||||
// menu->setTitle(tr("Cartridge %1: %2").arg(QString::number(i+1), name.isEmpty() ? tr("(empty)") : name));
|
||||
menu->setTitle(QString::asprintf(tr("Cartridge %i: %ls").toUtf8().constData(), i + 1, name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
|
||||
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
|
||||
updateImageHistory(i, slot, ui::MediaType::Cartridge);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -580,6 +628,36 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
|
||||
QString menu_item_name;
|
||||
|
||||
switch (type) {
|
||||
default:
|
||||
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
|
||||
return;
|
||||
case ui::MediaType::Cassette:
|
||||
if (!MachineStatus::hasCassette())
|
||||
return;
|
||||
menu = cassetteMenu;
|
||||
children = menu->children();
|
||||
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[cassetteImageHistoryPos[slot]]);
|
||||
fi.setFile(fn);
|
||||
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
|
||||
break;
|
||||
case ui::MediaType::Cartridge:
|
||||
if (!machine_has_cartridge(machine))
|
||||
return;
|
||||
menu = cartridgeMenus[index];
|
||||
children = menu->children();
|
||||
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[cartridgeImageHistoryPos[slot]]);
|
||||
fi.setFile(fn);
|
||||
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
|
||||
break;
|
||||
case ui::MediaType::Floppy:
|
||||
if (!floppyMenus.contains(index))
|
||||
return;
|
||||
menu = floppyMenus[index];
|
||||
children = menu->children();
|
||||
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[floppyImageHistoryPos[slot]]);
|
||||
fi.setFile(fn);
|
||||
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
|
||||
break;
|
||||
case ui::MediaType::Optical:
|
||||
if (!cdromMenus.contains(index))
|
||||
return;
|
||||
@@ -600,18 +678,24 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
|
||||
}
|
||||
imageHistoryUpdatePos->setIcon(menu_icon);
|
||||
break;
|
||||
case ui::MediaType::Floppy:
|
||||
if (!floppyMenus.contains(index))
|
||||
case ui::MediaType::Zip:
|
||||
if (!zipMenus.contains(index))
|
||||
return;
|
||||
menu = floppyMenus[index];
|
||||
menu = zipMenus[index];
|
||||
children = menu->children();
|
||||
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[floppyImageHistoryPos[slot]]);
|
||||
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[zipImageHistoryPos[slot]]);
|
||||
fi.setFile(fn);
|
||||
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
|
||||
break;
|
||||
default:
|
||||
case ui::MediaType::Mo:
|
||||
if (!moMenus.contains(index))
|
||||
return;
|
||||
menu = moMenus[index];
|
||||
children = menu->children();
|
||||
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[moImageHistoryPos[slot]]);
|
||||
fi.setFile(fn);
|
||||
menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData();
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
imageHistoryUpdatePos->setText(QString::asprintf(tr("%s").toUtf8().constData(), menu_item_name.toUtf8().constData()));
|
||||
@@ -727,6 +811,7 @@ MediaMenu::zipMount(int i, const QString &filename, bool wp)
|
||||
zip_load(dev, filenameBytes.data());
|
||||
zip_insert(dev);
|
||||
}
|
||||
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].prev_image_path, zip_drives[i].image_path);
|
||||
|
||||
ui_sb_update_icon_state(SB_ZIP | i, filename.isEmpty() ? 1 : 0);
|
||||
zipUpdateMenu(i);
|
||||
@@ -740,6 +825,7 @@ MediaMenu::zipEject(int i)
|
||||
{
|
||||
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
|
||||
|
||||
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].image_path, QString());
|
||||
zip_disk_close(dev);
|
||||
zip_drives[i].image_path[0] = 0;
|
||||
if (zip_drives[i].bus_type) {
|
||||
@@ -754,7 +840,7 @@ MediaMenu::zipEject(int i)
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::zipReload(int i)
|
||||
MediaMenu::zipReloadPrev(int i)
|
||||
{
|
||||
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
|
||||
|
||||
@@ -771,6 +857,15 @@ MediaMenu::zipReload(int i)
|
||||
config_save();
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::zipReload(int index, int slot)
|
||||
{
|
||||
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Zip);
|
||||
zipMount(index, filename, false);
|
||||
zipUpdateMenu(index);
|
||||
ui_sb_update_tip(SB_ZIP | index);
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::zipUpdateMenu(int i)
|
||||
{
|
||||
@@ -800,6 +895,9 @@ MediaMenu::zipUpdateMenu(int i)
|
||||
|
||||
// menu->setTitle(tr("ZIP %1 %2 (%3): %4").arg((zip_drives[i].is_250 > 0) ? "250" : "100", QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name));
|
||||
menu->setTitle(QString::asprintf(tr("ZIP %03i %i (%s): %ls").toUtf8().constData(), (zip_drives[i].is_250 > 0) ? 250 : 100, i + 1, busName.toUtf8().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
|
||||
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
|
||||
updateImageHistory(i, slot, ui::MediaType::Zip);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -844,6 +942,7 @@ MediaMenu::moMount(int i, const QString &filename, bool wp)
|
||||
mo_load(dev, filenameBytes.data());
|
||||
mo_insert(dev);
|
||||
}
|
||||
mhm.addImageToHistory(i, ui::MediaType::Mo, mo_drives[i].prev_image_path, mo_drives[i].image_path);
|
||||
|
||||
ui_sb_update_icon_state(SB_MO | i, filename.isEmpty() ? 1 : 0);
|
||||
moUpdateMenu(i);
|
||||
@@ -857,6 +956,7 @@ MediaMenu::moEject(int i)
|
||||
{
|
||||
const auto dev = static_cast<mo_t *>(mo_drives[i].priv);
|
||||
|
||||
mhm.addImageToHistory(i, ui::MediaType::Mo, mo_drives[i].image_path, QString());
|
||||
mo_disk_close(dev);
|
||||
mo_drives[i].image_path[0] = 0;
|
||||
if (mo_drives[i].bus_type) {
|
||||
@@ -871,7 +971,7 @@ MediaMenu::moEject(int i)
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::moReload(int i)
|
||||
MediaMenu::moReloadPrev(int i)
|
||||
{
|
||||
mo_t *dev = (mo_t *) mo_drives[i].priv;
|
||||
|
||||
@@ -888,6 +988,15 @@ MediaMenu::moReload(int i)
|
||||
config_save();
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::moReload(int index, int slot)
|
||||
{
|
||||
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Mo);
|
||||
moMount(index, filename, false);
|
||||
moUpdateMenu(index);
|
||||
ui_sb_update_tip(SB_MO | index);
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::moUpdateMenu(int i)
|
||||
{
|
||||
@@ -916,6 +1025,9 @@ MediaMenu::moUpdateMenu(int i)
|
||||
}
|
||||
|
||||
menu->setTitle(QString::asprintf(tr("MO %i (%ls): %ls").toUtf8().constData(), i + 1, busName.toStdU16String().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
|
||||
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
|
||||
updateImageHistory(i, slot, ui::MediaType::Mo);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1043,7 +1155,7 @@ zip_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
void
|
||||
zip_reload(uint8_t id)
|
||||
{
|
||||
MediaMenu::ptr->zipReload(id);
|
||||
MediaMenu::ptr->zipReloadPrev(id);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1061,6 +1173,6 @@ mo_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
void
|
||||
mo_reload(uint8_t id)
|
||||
{
|
||||
MediaMenu::ptr->moReload(id);
|
||||
MediaMenu::ptr->moReloadPrev(id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,12 +24,14 @@ public:
|
||||
void cassetteNewImage();
|
||||
void cassetteSelectImage(bool wp);
|
||||
void cassetteMount(const QString &filename, bool wp);
|
||||
void cassetteMenuSelect(int slot);
|
||||
void cassetteEject();
|
||||
void cassetteUpdateMenu();
|
||||
|
||||
void cartridgeSelectImage(int i);
|
||||
void cartridgeMount(int i, const QString &filename);
|
||||
void cartridgeEject(int i);
|
||||
void cartridgeMenuSelect(int index, int slot);
|
||||
void cartridgeUpdateMenu(int i);
|
||||
|
||||
void floppyNewImage(int i);
|
||||
@@ -53,14 +55,16 @@ public:
|
||||
void zipSelectImage(int i, bool wp);
|
||||
void zipMount(int i, const QString &filename, bool wp);
|
||||
void zipEject(int i);
|
||||
void zipReload(int i);
|
||||
void zipReloadPrev(int i);
|
||||
void zipReload(int index, int slot);
|
||||
void zipUpdateMenu(int i);
|
||||
|
||||
void moNewImage(int i);
|
||||
void moSelectImage(int i, bool wp);
|
||||
void moMount(int i, const QString &filename, bool wp);
|
||||
void moEject(int i);
|
||||
void moReload(int i);
|
||||
void moReloadPrev(int i);
|
||||
void moReload(int index, int slot);
|
||||
void moUpdateMenu(int i);
|
||||
|
||||
void nicConnect(int i);
|
||||
@@ -94,24 +98,28 @@ private:
|
||||
int cassetteRewindPos;
|
||||
int cassetteFastFwdPos;
|
||||
int cassetteEjectPos;
|
||||
int cassetteImageHistoryPos[MAX_PREV_IMAGES];
|
||||
|
||||
int cartridgeEjectPos;
|
||||
int cartridgeImageHistoryPos[MAX_PREV_IMAGES];
|
||||
|
||||
int floppyExportPos;
|
||||
int floppyEjectPos;
|
||||
int floppyImageHistoryPos[MAX_PREV_IMAGES];
|
||||
|
||||
int cdromMutePos;
|
||||
int cdromReloadPos;
|
||||
int cdromImagePos;
|
||||
int cdromDirPos;
|
||||
int cdromImageHistoryPos[MAX_PREV_IMAGES];
|
||||
int floppyImageHistoryPos[MAX_PREV_IMAGES];
|
||||
|
||||
int zipEjectPos;
|
||||
int zipReloadPos;
|
||||
int zipImageHistoryPos[MAX_PREV_IMAGES];
|
||||
|
||||
int moEjectPos;
|
||||
int moReloadPos;
|
||||
int moImageHistoryPos[MAX_PREV_IMAGES];
|
||||
|
||||
int netDisconnPos;
|
||||
|
||||
|
||||
@@ -1182,7 +1182,7 @@ scsi_cdrom_cmd_error(scsi_cdrom_t *dev)
|
||||
{
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
dev->tf->error = ((scsi_cdrom_sense_key & 0xf) << 4) | ABRT_ERR;
|
||||
if (dev->unit_attention)
|
||||
if (dev->unit_attention > 2)
|
||||
dev->tf->error |= MCR_ERR;
|
||||
dev->tf->status = READY_STAT | ERR_STAT;
|
||||
dev->tf->phase = 3;
|
||||
@@ -1199,7 +1199,7 @@ scsi_cdrom_unit_attention(scsi_cdrom_t *dev)
|
||||
{
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
dev->tf->error = (SENSE_UNIT_ATTENTION << 4) | ABRT_ERR;
|
||||
if (dev->unit_attention)
|
||||
if (dev->unit_attention > 2)
|
||||
dev->tf->error |= MCR_ERR;
|
||||
dev->tf->status = READY_STAT | ERR_STAT;
|
||||
dev->tf->phase = 3;
|
||||
@@ -1552,6 +1552,34 @@ scsi_cdrom_insert(void *priv)
|
||||
scsi_cdrom_log("CD-ROM %i: Media insert\n", dev->id);
|
||||
}
|
||||
|
||||
static int
|
||||
scsi_command_check_ready(scsi_cdrom_t *dev, uint8_t *cdb)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (scsi_cdrom_command_flags[cdb[0]] & CHECK_READY) {
|
||||
/*Note by TC1995: Some vendor commands from X vendor don't really check for ready status
|
||||
but they do on Y vendor. Quite confusing I know.*/
|
||||
if (scsi_cdrom_command_flags[cdb[0]] & SCSI_ONLY) switch (dev->drv->type) {
|
||||
default:
|
||||
ret = 1;
|
||||
break;
|
||||
case CDROM_TYPE_DEC_RRD45_0436:
|
||||
case CDROM_TYPE_SONY_CDU541_10i:
|
||||
case CDROM_TYPE_SONY_CDU561_18k:
|
||||
case CDROM_TYPE_SONY_CDU76S_100:
|
||||
case CDROM_TYPE_TEXEL_DMXX24_100:
|
||||
if (cdb[0] == 0xC0)
|
||||
break;
|
||||
ret = 1;
|
||||
break;
|
||||
} else
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb)
|
||||
{
|
||||
@@ -1602,12 +1630,20 @@ skip_ready_check:
|
||||
/* If the drive is not ready, there is no reason to keep the
|
||||
UNIT ATTENTION condition present, as we only use it to mark
|
||||
disc changes. */
|
||||
if (!ready && dev->unit_attention)
|
||||
if (!ready && (dev->unit_attention > 2))
|
||||
dev->unit_attention = 0;
|
||||
|
||||
/* If the UNIT ATTENTION condition is set and the command does not allow
|
||||
execution under it, error out and report the condition. */
|
||||
if (dev->unit_attention == 1) {
|
||||
if ((dev->unit_attention > 0) && (dev->unit_attention < 3)) {
|
||||
dev->media_status = MEC_MEDIA_REMOVAL;
|
||||
if (scsi_command_check_ready(dev, cdb)) {
|
||||
dev->unit_attention++;
|
||||
scsi_cdrom_log("CD-ROM %i: Simulated not ready phase (%02X)\n", dev->id, cdb[0]);
|
||||
scsi_cdrom_not_ready(dev);
|
||||
return 0;
|
||||
}
|
||||
} else if (dev->unit_attention == 3) {
|
||||
/* Only increment the unit attention phase if the command can not pass through it. */
|
||||
if (!(scsi_cdrom_command_flags[cdb[0]] & ALLOW_UA)) {
|
||||
/* scsi_cdrom_log("CD-ROM %i: Unit attention now 2\n", dev->id); */
|
||||
@@ -1617,7 +1653,7 @@ skip_ready_check:
|
||||
scsi_cdrom_unit_attention(dev);
|
||||
return 0;
|
||||
}
|
||||
} else if (dev->unit_attention == 2) {
|
||||
} else if (dev->unit_attention == 4) {
|
||||
if (cdb[0] != GPCMD_REQUEST_SENSE) {
|
||||
/* scsi_cdrom_log("CD-ROM %i: Unit attention now 0\n", dev->id); */
|
||||
dev->unit_attention = 0;
|
||||
@@ -1630,39 +1666,18 @@ skip_ready_check:
|
||||
scsi_cdrom_sense_clear(dev, cdb[0]);
|
||||
|
||||
/* Next it's time for NOT READY. */
|
||||
if (!ready)
|
||||
if (!ready || ((dev->unit_attention > 0) && (dev->unit_attention < 3)))
|
||||
dev->media_status = MEC_MEDIA_REMOVAL;
|
||||
else
|
||||
dev->media_status = (dev->unit_attention) ? MEC_NEW_MEDIA : MEC_NO_CHANGE;
|
||||
dev->media_status = (dev->unit_attention > 2) ? MEC_NEW_MEDIA : MEC_NO_CHANGE;
|
||||
|
||||
if ((scsi_cdrom_command_flags[cdb[0]] & CHECK_READY) && !ready) {
|
||||
if (scsi_cdrom_command_flags[cdb[0]] & SCSI_ONLY) { /*Note by TC1995: Some vendor commands from X vendor don't really check for ready status
|
||||
but they do on Y vendor. Quite confusing I know.*/
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_DEC_RRD45_0436:
|
||||
case CDROM_TYPE_SONY_CDU541_10i:
|
||||
case CDROM_TYPE_SONY_CDU561_18k:
|
||||
case CDROM_TYPE_SONY_CDU76S_100:
|
||||
case CDROM_TYPE_TEXEL_DMXX24_100:
|
||||
if (cdb[0] == 0xC0)
|
||||
break;
|
||||
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]);
|
||||
scsi_cdrom_not_ready(dev);
|
||||
return 0;
|
||||
default:
|
||||
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]);
|
||||
scsi_cdrom_not_ready(dev);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]);
|
||||
scsi_cdrom_not_ready(dev);
|
||||
return 0;
|
||||
}
|
||||
if (!ready && scsi_command_check_ready(dev, cdb)) {
|
||||
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]);
|
||||
scsi_cdrom_not_ready(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
scsi_cdrom_log("CD-ROM %i: Continuing with command %02X\n", dev->id, cdb[0]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1711,7 +1726,8 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt
|
||||
buffer[2] = SENSE_ILLEGAL_REQUEST;
|
||||
buffer[12] = ASC_AUDIO_PLAY_OPERATION;
|
||||
buffer[13] = (dev->drv->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED;
|
||||
} else if (dev->unit_attention && (scsi_cdrom_sense_key == 0)) {
|
||||
} else if ((dev->unit_attention > 2) &&
|
||||
((scsi_cdrom_sense_key == 0) || (scsi_cdrom_sense_key == 2))) {
|
||||
buffer[2] = SENSE_UNIT_ATTENTION;
|
||||
buffer[12] = ASC_MEDIUM_MAY_HAVE_CHANGED;
|
||||
buffer[13] = 0;
|
||||
@@ -1734,7 +1750,7 @@ scsi_cdrom_request_sense_for_scsi(scsi_common_t *sc, uint8_t *buffer, uint8_t al
|
||||
if (dev->drv->cd_status & CD_STATUS_MEDIUM_CHANGED)
|
||||
scsi_cdrom_insert((void *) dev);
|
||||
|
||||
if ((dev->drv->cd_status == CD_STATUS_EMPTY) && dev->unit_attention) {
|
||||
if ((dev->drv->cd_status == CD_STATUS_EMPTY) && (dev->unit_attention > 2)) {
|
||||
/* If the drive is not ready, there is no reason to keep the
|
||||
UNIT ATTENTION condition present, as we only use it to mark
|
||||
disc changes. */
|
||||
@@ -2338,7 +2354,9 @@ begin:
|
||||
max_len = (cdb[7] << 8) | cdb[8];
|
||||
|
||||
/* only feature 0 is supported */
|
||||
if ((cdb[2] != 0) || (cdb[3] > 2)) {
|
||||
if ((feature > 3) && (feature != 0x010) &&
|
||||
(feature != 0x1d) && (feature != 0x01e) &&
|
||||
(feature != 0x01f) && (feature != 0x103)) {
|
||||
scsi_cdrom_invalid_field(dev);
|
||||
scsi_cdrom_buf_free(dev);
|
||||
return;
|
||||
@@ -2413,6 +2431,65 @@ begin:
|
||||
alloc_length += 8;
|
||||
b += 8;
|
||||
}
|
||||
if ((feature == 3) || ((cdb[1] & 3) < 2)) {
|
||||
b[1] = 2;
|
||||
b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */
|
||||
b[3] = 4;
|
||||
|
||||
b[4] = 0x1d;
|
||||
|
||||
alloc_length += 8;
|
||||
b += 8;
|
||||
}
|
||||
if ((feature == 0x10) || ((cdb[1] & 3) < 2)) {
|
||||
b[1] = 0x10;
|
||||
b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */
|
||||
b[3] = 8;
|
||||
|
||||
b[6] = 8;
|
||||
b[9] = 0x10;
|
||||
|
||||
alloc_length += 12;
|
||||
b += 12;
|
||||
}
|
||||
if ((feature == 0x1d) || ((cdb[1] & 3) < 2)) {
|
||||
b[1] = 0x1d;
|
||||
b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */
|
||||
b[3] = 0;
|
||||
|
||||
alloc_length += 4;
|
||||
b += 4;
|
||||
}
|
||||
if ((feature == 0x1e) || ((cdb[1] & 3) < 2)) {
|
||||
b[1] = 0x1e;
|
||||
b[2] = (2 << 2) | 0x02 | 0x01; /* persistent and current */
|
||||
b[3] = 4;
|
||||
|
||||
b[4] = 0;
|
||||
|
||||
alloc_length += 8;
|
||||
b += 8;
|
||||
}
|
||||
if ((feature == 0x1f) || ((cdb[1] & 3) < 2)) {
|
||||
b[1] = 0x1f;
|
||||
b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */
|
||||
b[3] = 0;
|
||||
|
||||
alloc_length += 4;
|
||||
b += 4;
|
||||
}
|
||||
if ((feature == 0x103) || ((cdb[1] & 3) < 2)) {
|
||||
b[0] = 1;
|
||||
b[1] = 3;
|
||||
b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */
|
||||
b[3] = 0;
|
||||
|
||||
b[4] = 7;
|
||||
b[6] = 1;
|
||||
|
||||
alloc_length += 8;
|
||||
b += 8;
|
||||
}
|
||||
|
||||
dev->buffer[0] = ((alloc_length - 4) >> 24) & 0xff;
|
||||
dev->buffer[1] = ((alloc_length - 4) >> 16) & 0xff;
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <86box/fdd.h>
|
||||
#include <86box/fdc.h>
|
||||
#include <86box/keyboard.h>
|
||||
#include <86box/machine.h>
|
||||
#include <86box/nvr.h>
|
||||
#include <86box/apm.h>
|
||||
#include <86box/acpi.h>
|
||||
@@ -131,7 +132,8 @@ fdc37c93x_gpio_read(uint16_t port, void *priv)
|
||||
const fdc37c93x_t *dev = (fdc37c93x_t *) priv;
|
||||
uint8_t ret = 0xff;
|
||||
|
||||
ret = dev->gpio_regs[port & 1];
|
||||
if (strcmp(machine_get_internal_name(), "vectra54"))
|
||||
ret = dev->gpio_regs[port & 1];
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1959,7 +1959,9 @@ sb_read(uint16_t a, void *priv)
|
||||
else
|
||||
ret = 0x7f;
|
||||
}
|
||||
} else
|
||||
} else if (IS_AZTECH(dsp))
|
||||
ret = 0x00;
|
||||
else
|
||||
ret = 0xff;
|
||||
break;
|
||||
case 0xE: /* Read data ready */
|
||||
|
||||
@@ -248,12 +248,12 @@ typedef struct mach64_t {
|
||||
fifo_entry_t fifo[FIFO_SIZE];
|
||||
atomic_int fifo_read_idx;
|
||||
atomic_int fifo_write_idx;
|
||||
atomic_int blitter_busy;
|
||||
|
||||
thread_t *fifo_thread;
|
||||
event_t *wake_fifo_thread;
|
||||
event_t *fifo_not_full_event;
|
||||
|
||||
int blitter_busy;
|
||||
uint64_t blitter_time;
|
||||
uint64_t status_time;
|
||||
|
||||
@@ -649,9 +649,8 @@ mach64_updatemapping(mach64_t *mach64)
|
||||
static void
|
||||
mach64_update_irqs(mach64_t *mach64)
|
||||
{
|
||||
if (!mach64->pci) {
|
||||
if (!mach64->pci)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((mach64->crtc_int_cntl & 0xaa0024) & ((mach64->crtc_int_cntl << 1) & 0xaa0024))
|
||||
pci_set_irq(mach64->pci_slot, PCI_INTA, &mach64->irq_state);
|
||||
@@ -659,7 +658,6 @@ mach64_update_irqs(mach64_t *mach64)
|
||||
pci_clear_irq(mach64->pci_slot, PCI_INTA, &mach64->irq_state);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static __inline void
|
||||
wake_fifo_thread(mach64_t *mach64)
|
||||
{
|
||||
@@ -674,7 +672,6 @@ mach64_wait_fifo_idle(mach64_t *mach64)
|
||||
thread_wait_event(mach64->fifo_not_full_event, 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#define READ8(addr, var) \
|
||||
switch ((addr) &3) { \
|
||||
@@ -1174,7 +1171,6 @@ mach64_accel_write_fifo_l(mach64_t *mach64, uint32_t addr, uint32_t val)
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
fifo_thread(void *param)
|
||||
{
|
||||
@@ -1222,11 +1218,53 @@ static void
|
||||
mach64_queue(mach64_t *mach64, uint32_t addr, uint32_t val, uint32_t type)
|
||||
{
|
||||
fifo_entry_t *fifo = &mach64->fifo[mach64->fifo_write_idx & FIFO_MASK];
|
||||
int limit = 0;
|
||||
|
||||
if (FIFO_FULL) {
|
||||
thread_reset_event(mach64->fifo_not_full_event);
|
||||
switch (type) {
|
||||
case FIFO_WRITE_BYTE:
|
||||
switch (addr & 0x3ff) {
|
||||
case 0x11b:
|
||||
limit = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case FIFO_WRITE_WORD:
|
||||
switch (addr & 0x3fe) {
|
||||
case 0x11a:
|
||||
limit = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case FIFO_WRITE_DWORD:
|
||||
switch (addr & 0x3fc) {
|
||||
case 0x118:
|
||||
limit = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (limit) {
|
||||
if (FIFO_ENTRIES >= 16) {
|
||||
thread_reset_event(mach64->fifo_not_full_event);
|
||||
if (FIFO_ENTRIES >= 16) {
|
||||
thread_wait_event(mach64->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (FIFO_FULL) {
|
||||
thread_wait_event(mach64->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/
|
||||
thread_reset_event(mach64->fifo_not_full_event);
|
||||
if (FIFO_FULL) {
|
||||
thread_wait_event(mach64->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1238,7 +1276,6 @@ mach64_queue(mach64_t *mach64, uint32_t addr, uint32_t val, uint32_t type)
|
||||
if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8)
|
||||
wake_fifo_thread(mach64);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
mach64_start_fill(mach64_t *mach64)
|
||||
@@ -2538,26 +2575,26 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x101:
|
||||
case 0x102:
|
||||
case 0x103:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_off_pitch);
|
||||
break;
|
||||
case 0x104:
|
||||
case 0x105:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_y_x);
|
||||
break;
|
||||
case 0x108:
|
||||
case 0x109:
|
||||
case 0x11c:
|
||||
case 0x11d:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr + 2, mach64->dst_y_x);
|
||||
break;
|
||||
case 0x10c:
|
||||
case 0x10d:
|
||||
case 0x10e:
|
||||
case 0x10f:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_y_x);
|
||||
break;
|
||||
case 0x110:
|
||||
@@ -2572,7 +2609,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x11b:
|
||||
case 0x11e:
|
||||
case 0x11f:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_height_width);
|
||||
break;
|
||||
|
||||
@@ -2580,28 +2617,28 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x121:
|
||||
case 0x122:
|
||||
case 0x123:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_bres_lnth);
|
||||
break;
|
||||
case 0x124:
|
||||
case 0x125:
|
||||
case 0x126:
|
||||
case 0x127:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_bres_err);
|
||||
break;
|
||||
case 0x128:
|
||||
case 0x129:
|
||||
case 0x12a:
|
||||
case 0x12b:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_bres_inc);
|
||||
break;
|
||||
case 0x12c:
|
||||
case 0x12d:
|
||||
case 0x12e:
|
||||
case 0x12f:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_bres_dec);
|
||||
break;
|
||||
|
||||
@@ -2609,7 +2646,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x131:
|
||||
case 0x132:
|
||||
case 0x133:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_cntl);
|
||||
break;
|
||||
|
||||
@@ -2617,75 +2654,75 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x181:
|
||||
case 0x182:
|
||||
case 0x183:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_off_pitch);
|
||||
break;
|
||||
case 0x184:
|
||||
case 0x185:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_y_x);
|
||||
break;
|
||||
case 0x188:
|
||||
case 0x189:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr + 2, mach64->src_y_x);
|
||||
break;
|
||||
case 0x18c:
|
||||
case 0x18d:
|
||||
case 0x18e:
|
||||
case 0x18f:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_y_x);
|
||||
break;
|
||||
case 0x190:
|
||||
case 0x191:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr + 2, mach64->src_height1_width1);
|
||||
break;
|
||||
case 0x194:
|
||||
case 0x195:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_height1_width1);
|
||||
break;
|
||||
case 0x198:
|
||||
case 0x199:
|
||||
case 0x19a:
|
||||
case 0x19b:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_height1_width1);
|
||||
break;
|
||||
case 0x19c:
|
||||
case 0x19d:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_y_x_start);
|
||||
break;
|
||||
case 0x1a0:
|
||||
case 0x1a1:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr + 2, mach64->src_y_x_start);
|
||||
break;
|
||||
case 0x1a4:
|
||||
case 0x1a5:
|
||||
case 0x1a6:
|
||||
case 0x1a7:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_y_x_start);
|
||||
break;
|
||||
case 0x1a8:
|
||||
case 0x1a9:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr + 2, mach64->src_height2_width2);
|
||||
break;
|
||||
case 0x1ac:
|
||||
case 0x1ad:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_height2_width2);
|
||||
break;
|
||||
case 0x1b0:
|
||||
case 0x1b1:
|
||||
case 0x1b2:
|
||||
case 0x1b3:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_height2_width2);
|
||||
break;
|
||||
|
||||
@@ -2693,7 +2730,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x1b5:
|
||||
case 0x1b6:
|
||||
case 0x1b7:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->src_cntl);
|
||||
break;
|
||||
|
||||
@@ -2701,7 +2738,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x241:
|
||||
case 0x242:
|
||||
case 0x243:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->host_cntl);
|
||||
break;
|
||||
|
||||
@@ -2709,14 +2746,14 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x281:
|
||||
case 0x282:
|
||||
case 0x283:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->pat_reg0);
|
||||
break;
|
||||
case 0x284:
|
||||
case 0x285:
|
||||
case 0x286:
|
||||
case 0x287:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->pat_reg1);
|
||||
break;
|
||||
|
||||
@@ -2724,7 +2761,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x289:
|
||||
case 0x28a:
|
||||
case 0x28b:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->pat_cntl);
|
||||
break;
|
||||
|
||||
@@ -2732,7 +2769,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x2a1:
|
||||
case 0x2a8:
|
||||
case 0x2a9:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->sc_left_right);
|
||||
break;
|
||||
case 0x2a4:
|
||||
@@ -2741,7 +2778,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
fallthrough;
|
||||
case 0x2aa:
|
||||
case 0x2ab:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->sc_left_right);
|
||||
break;
|
||||
|
||||
@@ -2749,7 +2786,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x2ad:
|
||||
case 0x2b4:
|
||||
case 0x2b5:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->sc_top_bottom);
|
||||
break;
|
||||
case 0x2b0:
|
||||
@@ -2758,7 +2795,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
fallthrough;
|
||||
case 0x2b6:
|
||||
case 0x2b7:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->sc_top_bottom);
|
||||
break;
|
||||
|
||||
@@ -2766,14 +2803,14 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x2c1:
|
||||
case 0x2c2:
|
||||
case 0x2c3:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dp_bkgd_clr);
|
||||
break;
|
||||
case 0x2c4:
|
||||
case 0x2c5:
|
||||
case 0x2c6:
|
||||
case 0x2c7:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dp_frgd_clr);
|
||||
break;
|
||||
|
||||
@@ -2781,7 +2818,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x2c9:
|
||||
case 0x2ca:
|
||||
case 0x2cb:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->write_mask);
|
||||
break;
|
||||
|
||||
@@ -2789,7 +2826,7 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x2cd:
|
||||
case 0x2ce:
|
||||
case 0x2cf:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->chain_mask);
|
||||
break;
|
||||
|
||||
@@ -2797,21 +2834,21 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x2d1:
|
||||
case 0x2d2:
|
||||
case 0x2d3:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dp_pix_width);
|
||||
break;
|
||||
case 0x2d4:
|
||||
case 0x2d5:
|
||||
case 0x2d6:
|
||||
case 0x2d7:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dp_mix);
|
||||
break;
|
||||
case 0x2d8:
|
||||
case 0x2d9:
|
||||
case 0x2da:
|
||||
case 0x2db:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dp_src);
|
||||
break;
|
||||
|
||||
@@ -2819,53 +2856,61 @@ mach64_ext_readb(uint32_t addr, void *priv)
|
||||
case 0x301:
|
||||
case 0x302:
|
||||
case 0x303:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->clr_cmp_clr);
|
||||
break;
|
||||
case 0x304:
|
||||
case 0x305:
|
||||
case 0x306:
|
||||
case 0x307:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->clr_cmp_mask);
|
||||
break;
|
||||
case 0x308:
|
||||
case 0x309:
|
||||
case 0x30a:
|
||||
case 0x30b:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->clr_cmp_cntl);
|
||||
break;
|
||||
|
||||
case 0x310:
|
||||
case 0x311:
|
||||
if (!mach64->blitter_busy)
|
||||
wake_fifo_thread(mach64);
|
||||
|
||||
ret = 0;
|
||||
if (FIFO_FULL)
|
||||
ret = 0xff;
|
||||
break;
|
||||
|
||||
case 0x320:
|
||||
case 0x321:
|
||||
case 0x322:
|
||||
case 0x323:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->context_mask);
|
||||
break;
|
||||
|
||||
case 0x330:
|
||||
case 0x331:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr, mach64->dst_cntl);
|
||||
break;
|
||||
case 0x332:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr - 2, mach64->src_cntl);
|
||||
break;
|
||||
case 0x333:
|
||||
//mach64_wait_fifo_idle(mach64);
|
||||
mach64_wait_fifo_idle(mach64);
|
||||
READ8(addr - 3, mach64->pat_cntl);
|
||||
break;
|
||||
|
||||
case 0x338:
|
||||
ret = 0;
|
||||
if (!mach64->blitter_busy)
|
||||
wake_fifo_thread(mach64);
|
||||
|
||||
ret = FIFO_EMPTY ? 0 : 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -2884,7 +2929,7 @@ mach64_ext_readw(uint32_t addr, void *priv)
|
||||
uint16_t ret;
|
||||
|
||||
if (!(addr & 0x400)) {
|
||||
mach64_log("nmach64_ext_readw: addr=%04x\n", addr);
|
||||
mach64_log("mach64_ext_readw: addr=%04x\n", addr);
|
||||
ret = 0xffff;
|
||||
} else
|
||||
switch (addr & 0x3ff) {
|
||||
@@ -3048,9 +3093,9 @@ mach64_ext_writeb(uint32_t addr, uint8_t val, void *priv)
|
||||
break;
|
||||
}
|
||||
|
||||
mach64_log("nmach64_ext_writeb: addr=%04x val=%02x\n", addr, val);
|
||||
mach64_log("mach64_ext_writeb: addr=%04x val=%02x\n", addr, val);
|
||||
} else if (addr & 0x300) {
|
||||
mach64_accel_write_fifo(mach64, addr & 0x3ff, val);
|
||||
mach64_queue(mach64, addr & 0x3ff, val, FIFO_WRITE_BYTE);
|
||||
} else {
|
||||
switch (addr & 0x3ff) {
|
||||
case 0x00:
|
||||
@@ -3293,14 +3338,11 @@ mach64_ext_writew(uint32_t addr, uint16_t val, void *priv)
|
||||
mach64_ext_writeb(addr, val, priv);
|
||||
mach64_ext_writeb(addr + 1, val >> 8, priv);
|
||||
} else if (addr & 0x300) {
|
||||
mach64_accel_write_fifo_w(mach64, addr & 0x3fe, val);
|
||||
} else
|
||||
switch (addr & 0x3fe) {
|
||||
default:
|
||||
mach64_ext_writeb(addr, val, priv);
|
||||
mach64_ext_writeb(addr + 1, val >> 8, priv);
|
||||
break;
|
||||
}
|
||||
mach64_queue(mach64, addr & 0x3fe, val, FIFO_WRITE_WORD);
|
||||
} else {
|
||||
mach64_ext_writeb(addr, val, priv);
|
||||
mach64_ext_writeb(addr + 1, val >> 8, priv);
|
||||
}
|
||||
}
|
||||
void
|
||||
mach64_ext_writel(uint32_t addr, uint32_t val, void *priv)
|
||||
@@ -3314,14 +3356,11 @@ mach64_ext_writel(uint32_t addr, uint32_t val, void *priv)
|
||||
mach64_ext_writew(addr, val, priv);
|
||||
mach64_ext_writew(addr + 2, val >> 16, priv);
|
||||
} else if (addr & 0x300) {
|
||||
mach64_accel_write_fifo_l(mach64, addr & 0x3fc, val);
|
||||
} else
|
||||
switch (addr & 0x3fc) {
|
||||
default:
|
||||
mach64_ext_writew(addr, val, priv);
|
||||
mach64_ext_writew(addr + 2, val >> 16, priv);
|
||||
break;
|
||||
}
|
||||
mach64_queue(mach64, addr & 0x3fc, val, FIFO_WRITE_DWORD);
|
||||
} else {
|
||||
mach64_ext_writew(addr, val, priv);
|
||||
mach64_ext_writew(addr + 2, val >> 16, priv);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t
|
||||
@@ -3527,12 +3566,10 @@ uint16_t
|
||||
mach64_ext_inw(uint16_t port, void *priv)
|
||||
{
|
||||
uint16_t ret;
|
||||
switch (port) {
|
||||
default:
|
||||
ret = mach64_ext_inb(port, priv);
|
||||
ret |= (mach64_ext_inb(port + 1, priv) << 8);
|
||||
break;
|
||||
}
|
||||
|
||||
ret = mach64_ext_inb(port, priv);
|
||||
ret |= (mach64_ext_inb(port + 1, priv) << 8);
|
||||
|
||||
mach64_log("mach64_ext_inw : port %04X ret %04X\n", port, ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -3540,6 +3577,7 @@ uint32_t
|
||||
mach64_ext_inl(uint16_t port, void *priv)
|
||||
{
|
||||
uint32_t ret;
|
||||
|
||||
switch (port) {
|
||||
case 0x56ec:
|
||||
ret = mach64_ext_readl(0x400 | 0xb4, priv);
|
||||
@@ -3737,23 +3775,15 @@ void
|
||||
mach64_ext_outw(uint16_t port, uint16_t val, void *priv)
|
||||
{
|
||||
mach64_log("mach64_ext_outw : port %04X val %04X\n", port, val);
|
||||
switch (port) {
|
||||
default:
|
||||
mach64_ext_outb(port, val, priv);
|
||||
mach64_ext_outb(port + 1, val >> 8, priv);
|
||||
break;
|
||||
}
|
||||
mach64_ext_outb(port, val, priv);
|
||||
mach64_ext_outb(port + 1, val >> 8, priv);
|
||||
}
|
||||
void
|
||||
mach64_ext_outl(uint16_t port, uint32_t val, void *priv)
|
||||
{
|
||||
mach64_log("mach64_ext_outl : port %04X val %08X\n", port, val);
|
||||
switch (port) {
|
||||
default:
|
||||
mach64_ext_outw(port, val, priv);
|
||||
mach64_ext_outw(port + 2, val >> 16, priv);
|
||||
break;
|
||||
}
|
||||
mach64_ext_outw(port, val, priv);
|
||||
mach64_ext_outw(port + 2, val >> 16, priv);
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
@@ -4546,6 +4576,11 @@ mach64_common_init(const device_t *info)
|
||||
|
||||
mach64->dst_cntl = 3;
|
||||
|
||||
mach64->thread_run = 1;
|
||||
mach64->wake_fifo_thread = thread_create_event();
|
||||
mach64->fifo_not_full_event = thread_create_event();
|
||||
mach64->fifo_thread = thread_create(fifo_thread, mach64);
|
||||
|
||||
mach64->i2c = i2c_gpio_init("ddc_ati_mach64");
|
||||
mach64->ddc = ddc_init(i2c_gpio_get_bus(mach64->i2c));
|
||||
|
||||
@@ -4640,6 +4675,12 @@ mach64_close(void *priv)
|
||||
{
|
||||
mach64_t *mach64 = (mach64_t *) priv;
|
||||
|
||||
mach64->thread_run = 0;
|
||||
thread_set_event(mach64->wake_fifo_thread);
|
||||
thread_wait(mach64->fifo_thread);
|
||||
thread_destroy_event(mach64->fifo_not_full_event);
|
||||
thread_destroy_event(mach64->wake_fifo_thread);
|
||||
|
||||
svga_close(&mach64->svga);
|
||||
|
||||
ddc_close(mach64->ddc);
|
||||
|
||||
@@ -97,11 +97,14 @@ ogc_out(uint16_t addr, uint8_t val, void *priv)
|
||||
cga_out(addr, val, &ogc->cga);
|
||||
break;
|
||||
|
||||
case 0x3db:
|
||||
case 0x3de:
|
||||
/* set control register */
|
||||
ogc->ctrl_3de = val;
|
||||
/* select 1st or 2nd 16k vram block to be used */
|
||||
ogc->base = (val & 0x08) ? 0x4000 : 0;
|
||||
if (addr == ogc->ctrl_addr) {
|
||||
/* set control register */
|
||||
ogc->ctrl_3de = val;
|
||||
/* select 1st or 2nd 16k vram block to be used */
|
||||
ogc->base = (val & 0x08) ? 0x4000 : 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -622,6 +625,8 @@ ogc_init(UNUSED(const device_t *info))
|
||||
else
|
||||
ogc->mono_display = 1;
|
||||
|
||||
ogc->ctrl_addr = 0x3de;
|
||||
|
||||
return ogc;
|
||||
}
|
||||
|
||||
|
||||
@@ -9219,18 +9219,19 @@ s3_pci_read(UNUSED(int func), int addr, void *priv)
|
||||
return s3->pci_regs[PCI_REG_COMMAND] | 0x80; /*Respond to IO and memory accesses*/
|
||||
else
|
||||
return s3->pci_regs[PCI_REG_COMMAND]; /*Respond to IO and memory accesses*/
|
||||
break;
|
||||
break;
|
||||
|
||||
case 0x07:
|
||||
return (s3->chip == S3_TRIO64V2) ? (s3->pci_regs[0x07] & 0x36) : (1 << 1); /*Medium DEVSEL timing*/
|
||||
|
||||
case 0x08: switch (s3->chip) { /*Revision ID*/
|
||||
case S3_TRIO64V:
|
||||
return 0x40;
|
||||
case S3_TRIO64V2:
|
||||
return 0x16; /*Confirmed on an onboard 64V2/DX*/
|
||||
default:
|
||||
return 0x00;
|
||||
case 0x08:
|
||||
switch (s3->chip) { /*Revision ID*/
|
||||
case S3_TRIO64V:
|
||||
return 0x40;
|
||||
case S3_TRIO64V2:
|
||||
return 0x16; /*Confirmed on an onboard 64V2/DX*/
|
||||
default:
|
||||
return 0x00;
|
||||
}
|
||||
break;
|
||||
case 0x09:
|
||||
@@ -9252,24 +9253,13 @@ s3_pci_read(UNUSED(int func), int addr, void *priv)
|
||||
case 0x0d:
|
||||
return (s3->chip == S3_TRIO64V2) ? (s3->pci_regs[0x0d] & 0xf8) : 0x00;
|
||||
|
||||
case 0x10:
|
||||
return 0x00; /*Linear frame buffer address*/
|
||||
case 0x11:
|
||||
return 0x00;
|
||||
case 0x12:
|
||||
if (svga->crtc[0x53] & 0x08)
|
||||
return 0x00;
|
||||
else
|
||||
return (svga->crtc[0x5a] & 0x80);
|
||||
break;
|
||||
return ((s3->chip == S3_VISION868) || (s3->chip == S3_VISION968) || (s3->chip >= S3_TRIO64V)) ? 0x00 :
|
||||
(svga->crtc[0x5a] & 0x80);
|
||||
|
||||
case 0x13:
|
||||
if (svga->crtc[0x53] & 0x08) {
|
||||
return (s3->chip >= S3_TRIO64V) ? (svga->crtc[0x59] & 0xfc) : (svga->crtc[0x59] & 0xfe);
|
||||
} else {
|
||||
return svga->crtc[0x59];
|
||||
}
|
||||
break;
|
||||
return ((s3->chip == S3_VISION868) || (s3->chip == S3_VISION968) || (s3->chip >= S3_TRIO64V)) ?
|
||||
(svga->crtc[0x59] & 0xfc) : svga->crtc[0x59];
|
||||
|
||||
case 0x30:
|
||||
return s3->has_bios ? (s3->pci_regs[0x30] & 0x01) : 0x00; /*BIOS ROM address*/
|
||||
@@ -9323,13 +9313,16 @@ s3_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv)
|
||||
s3_io_set(s3);
|
||||
else
|
||||
s3_io_remove(s3);
|
||||
s3->pci_regs[PCI_REG_COMMAND] = (val & 0x23);
|
||||
if (s3->chip >= S3_TRIO64V)
|
||||
s3->pci_regs[PCI_REG_COMMAND] = (val & 0x27);
|
||||
else
|
||||
s3->pci_regs[PCI_REG_COMMAND] = (val & 0x23);
|
||||
s3_updatemapping(s3);
|
||||
break;
|
||||
|
||||
case 0x07:
|
||||
if (s3->chip == S3_TRIO64V2) {
|
||||
s3->pci_regs[0x07] = val & 0x3e;
|
||||
s3->pci_regs[0x07] &= ~(val & 0x30);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@@ -9342,18 +9335,14 @@ s3_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv)
|
||||
break;
|
||||
|
||||
case 0x12:
|
||||
if (!(svga->crtc[0x53] & 0x08)) {
|
||||
svga->crtc[0x5a] = (svga->crtc[0x5a] & 0x7f) | (val & 0x80);
|
||||
if (s3->chip < S3_TRIO64V) {
|
||||
svga->crtc[0x5a] = val & 0x80;
|
||||
s3_updatemapping(s3);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x13:
|
||||
if (svga->crtc[0x53] & 0x08) {
|
||||
svga->crtc[0x59] = (s3->chip >= S3_TRIO64V) ? (val & 0xfc) : (val & 0xfe);
|
||||
} else {
|
||||
svga->crtc[0x59] = val;
|
||||
}
|
||||
svga->crtc[0x59] = (s3->chip >= S3_TRIO64V) ? (val & 0xfc) : val;
|
||||
s3_updatemapping(s3);
|
||||
break;
|
||||
|
||||
@@ -9468,6 +9457,9 @@ s3_disable_handlers(s3_t *s3)
|
||||
|
||||
reset_state->svga.timer = s3->svga.timer;
|
||||
reset_state->svga.timer8514 = s3->svga.timer8514;
|
||||
|
||||
memset(s3->svga.vram, 0x00, s3->svga.vram_max + 8);
|
||||
memset(s3->svga.changedvram, 0x00, (s3->svga.vram_max >> 12) + 1);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -174,6 +174,7 @@ video_cards[] = {
|
||||
{ &s3_trio64v2_dx_pci_device },
|
||||
{ &s3_virge_325_pci_device },
|
||||
{ &s3_diamond_stealth_2000_pci_device },
|
||||
{ &s3_mirocrystal_3d_pci_device },
|
||||
{ &s3_diamond_stealth_3000_pci_device },
|
||||
{ &s3_stb_velocity_3d_pci_device },
|
||||
{ &s3_virge_375_pci_device },
|
||||
|
||||
@@ -364,6 +364,15 @@ voodoo_fb_writel(uint32_t addr, uint32_t val, void *priv)
|
||||
addr >>= 1;
|
||||
break;
|
||||
|
||||
case LFB_FORMAT_XRGB8888:
|
||||
colour_data[0].b = val & 0xff;
|
||||
colour_data[0].g = (val >> 8) & 0xff;
|
||||
colour_data[0].r = (val >> 16) & 0xff;
|
||||
alpha_data[0] = 0xff;
|
||||
write_mask = LFB_WRITE_COLOUR;
|
||||
addr >>= 1;
|
||||
break;
|
||||
|
||||
case LFB_FORMAT_DEPTH:
|
||||
depth_data[0] = val;
|
||||
depth_data[1] = val >> 16;
|
||||
|
||||
Reference in New Issue
Block a user