mirror of
https://github.com/86Box/86Box.git
synced 2026-02-24 20:35:32 -07:00
Merge branch '86Box:master' into master
This commit is contained in:
7
.ci/Jenkinsfile
vendored
7
.ci/Jenkinsfile
vendored
@@ -20,11 +20,12 @@ def repository = ['https://github.com/86Box/86Box.git', scm.userRemoteConfigs[0]
|
||||
def commitBrowser = ['https://github.com/86Box/86Box/commit/%s', null]
|
||||
def branch = ['master', scm.branches[0].name]
|
||||
def buildType = ['beta', 'alpha']
|
||||
def tarballFlags = ['', '-s']
|
||||
def buildBranch = env.JOB_BASE_NAME.contains('-') ? 1 : 0
|
||||
|
||||
def osArchs = [
|
||||
'Windows': ['32', '64'],
|
||||
'Linux': ['x86', 'x86_64', 'arm32', 'arm64'],
|
||||
'Windows': ['64'],
|
||||
'Linux': ['x86_64', 'arm64'],
|
||||
'macOS': ['x86_64+x86_64h+arm64']
|
||||
]
|
||||
|
||||
@@ -238,7 +239,7 @@ pipeline {
|
||||
dir("${env.WORKSPACE_TMP}/output") {
|
||||
/* Run source tarball creation process. */
|
||||
def packageName = "${env.JOB_BASE_NAME}-Source$buildSuffix"
|
||||
if (runBuild("-s \"$packageName\"") == 0) {
|
||||
if (runBuild("-s \"$packageName\" ${tarballFlags[buildBranch]}") == 0) {
|
||||
/* Archive resulting artifacts. */
|
||||
archiveArtifacts artifacts: "$packageName*"
|
||||
} else {
|
||||
|
||||
15
.ci/build.sh
15
.ci/build.sh
@@ -208,7 +208,7 @@ cmake_flags_extra=
|
||||
if [ -z "$package_name" -a -z "$tarball_name" ] || [ -n "$package_name" -a -z "$arch" ]
|
||||
then
|
||||
echo '[!] Usage: build.sh -b {package_name} {architecture} [-t] [cmake_flags...]'
|
||||
echo ' build.sh -s {source_tarball_name}'
|
||||
echo ' build.sh -s {source_tarball_name} [-t]'
|
||||
echo 'Dep. tree: build.sh -p [archive_tmp/path/to/binary]'
|
||||
exit 100
|
||||
fi
|
||||
@@ -228,7 +228,10 @@ then
|
||||
[ ! -d "$cwd" ] && mkdir -p "$cwd"
|
||||
|
||||
# Save current HEAD commit to VERSION.
|
||||
git log --stat -1 > VERSION || rm -f VERSION
|
||||
if [ $strip -eq 0 ]
|
||||
then
|
||||
git log --stat -1 > VERSION || rm -f VERSION
|
||||
fi
|
||||
|
||||
# Archive source.
|
||||
make_tar "$cwd/$tarball_name.tar"
|
||||
@@ -535,6 +538,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.13 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.
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
#
|
||||
# 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||
# running old operating systems and software designed for IBM
|
||||
# PC systems and compatibles from 1981 through fairly recent
|
||||
# system designs based on the PCI bus.
|
||||
# 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||
# running old operating systems and software designed for IBM
|
||||
# PC systems and compatibles from 1981 through fairly recent
|
||||
# system designs based on the PCI bus.
|
||||
#
|
||||
# This file is part of the 86Box distribution.
|
||||
# This file is part of the 86Box distribution.
|
||||
#
|
||||
# CMake build script.
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2021-2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
@@ -35,7 +36,7 @@ if(MUNT_EXTERNAL)
|
||||
endif()
|
||||
|
||||
project(86Box
|
||||
VERSION 4.2.1
|
||||
VERSION 4.3
|
||||
DESCRIPTION "Emulator of x86-based systems"
|
||||
HOMEPAGE_URL "https://86box.net"
|
||||
LANGUAGES C CXX)
|
||||
@@ -122,48 +123,51 @@ set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
||||
|
||||
# Optional features
|
||||
#
|
||||
# Option Description Def.
|
||||
# ------ ----------- ----
|
||||
option(RELEASE "Release build" OFF)
|
||||
option(DYNAREC "Dynamic recompiler" ON)
|
||||
option(OPENAL "OpenAL" ON)
|
||||
option(RTMIDI "RtMidi" ON)
|
||||
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)
|
||||
option(DEV_BRANCH "Development branch" OFF)
|
||||
option(DISCORD "Discord Rich Presence support" ON)
|
||||
option(DEBUGREGS486 "Enable debug register opeartion on 486+ CPUs" OFF)
|
||||
# Option Description Def.
|
||||
# ------ ----------- ----
|
||||
option(RELEASE "Release build" OFF)
|
||||
option(DYNAREC "Dynamic recompiler" ON)
|
||||
option(OPENAL "OpenAL" ON)
|
||||
option(RTMIDI "RtMidi" ON)
|
||||
option(FLUIDSYNTH "FluidSynth" ON)
|
||||
option(MUNT "MUNT" ON)
|
||||
option(VNC "VNC renderer" OFF)
|
||||
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)
|
||||
option(DEV_BRANCH "Development branch" OFF)
|
||||
option(DISCORD "Discord Rich Presence support" ON)
|
||||
option(DEBUGREGS486 "Enable debug register opeartion on 486+ CPUs" OFF)
|
||||
|
||||
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
|
||||
#
|
||||
# Option Description Def. Condition Otherwise
|
||||
# ------ ----------- ---- --------- ---------
|
||||
cmake_dependent_option(AMD_K5 "AMD K5" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(AN430TX "Intel AN430TX" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(CYRIX_6X86 "Cyrix 6x86" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(G100 "Matrox Productiva G100" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(ISAMEM_IAB "Intel Above Board" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(ISAMEM_BRAT "BocaRAM/AT" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(LASERXT "VTech Laser XT" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(OLIVETTI "Olivetti M290" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(OPEN_AT "OpenAT" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(OPL4ML "OPL4-ML daughterboard" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(PCL "Generic PCL5e Printer" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF)
|
||||
# Option Description Def. Condition Otherwise
|
||||
# ------ ----------- ---- ------------ ---------
|
||||
cmake_dependent_option(AMD_K5 "AMD K5" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(AN430TX "Intel AN430TX" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(CDROM_MITSUMI "Mitsumi CDROM" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(CYRIX_6X86 "Cyrix 6x86" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(G100 "Matrox Productiva G100" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(ISAMEM_IAB "Intel Above Board" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(ISAMEM_BRAT "BocaRAM/AT" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(LASERXT "VTech Laser XT" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(OLIVETTI "Olivetti M290" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(OPEN_AT "OpenAT" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(OPL4ML "OPL4-ML daughterboard" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(PCL "Generic PCL5e Printer" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(WACOM "Wacom Input Devices" ON "DEV_BRANCH" OFF)
|
||||
cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF)
|
||||
|
||||
# Ditto but for Qt
|
||||
if(QT)
|
||||
|
||||
@@ -53,10 +53,14 @@ We operate an IRC channel and a Discord server for discussing 86Box, its develop
|
||||
[](https://discord.gg/QXK9XTv)
|
||||
|
||||
Contributions
|
||||
---------
|
||||
-------------
|
||||
|
||||
We welcome all contributions to the project, as long as the [contribution guidelines](CONTRIBUTING.md) are followed.
|
||||
|
||||
Building
|
||||
---------
|
||||
For instructions on how to build 86Box from source, see the [build guide](https://86box.readthedocs.io/en/latest/dev/buildguide.html).
|
||||
|
||||
Licensing
|
||||
---------
|
||||
|
||||
|
||||
4
debian/changelog
vendored
4
debian/changelog
vendored
@@ -1,5 +1,5 @@
|
||||
86box (4.2.1) UNRELEASED; urgency=medium
|
||||
86box (4.3) UNRELEASED; urgency=medium
|
||||
|
||||
* Bump release.
|
||||
|
||||
-- Jasmine Iwanek <jriwanek@gmail.com> Fri, 26 Jul 2024 21:09:16 +0200
|
||||
-- Jasmine Iwanek <jriwanek@gmail.com> Mon, 02 Sep 2024 00:16:28 +0200
|
||||
|
||||
@@ -12,25 +12,50 @@
|
||||
# dob205
|
||||
#
|
||||
# Copyright 2020-2022 David Hrdlička.
|
||||
# Copyright 2021 dob205.
|
||||
# Copyright 2021 dob205.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
if(APPLE)
|
||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||
endif()
|
||||
|
||||
add_executable(86Box 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c
|
||||
dma.c ddma.c nmi.c pic.c pit.c pit_fast.c port_6x.c port_92.c ppi.c pci.c
|
||||
mca.c usb.c fifo.c fifo8.c device.c nvr.c nvr_at.c nvr_ps2.c
|
||||
machine_status.c ini.c cJSON.c)
|
||||
add_executable(86Box
|
||||
86box.c
|
||||
config.c
|
||||
log.c
|
||||
random.c
|
||||
timer.c
|
||||
io.c
|
||||
acpi.c
|
||||
apm.c
|
||||
dma.c
|
||||
ddma.c
|
||||
nmi.c
|
||||
pic.c
|
||||
pit.c
|
||||
pit_fast.c
|
||||
port_6x.c
|
||||
port_92.c
|
||||
ppi.c
|
||||
pci.c
|
||||
mca.c
|
||||
usb.c
|
||||
fifo.c
|
||||
fifo8.c
|
||||
device.c
|
||||
nvr.c
|
||||
nvr_at.c
|
||||
nvr_ps2.c
|
||||
machine_status.c
|
||||
ini.c
|
||||
cJSON.c
|
||||
)
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
add_compile_definitions(_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 _LARGEFILE64_SOURCE=1)
|
||||
endif()
|
||||
|
||||
if(PCL)
|
||||
target_compile_definitions(86Box PRIVATE USE_PCL)
|
||||
endif()
|
||||
|
||||
if(CPPTHREADS)
|
||||
target_sources(86Box PRIVATE thread.cpp)
|
||||
endif()
|
||||
@@ -52,10 +77,6 @@ if(DYNAREC)
|
||||
add_compile_definitions(USE_DYNAREC)
|
||||
endif()
|
||||
|
||||
if(DEV_BRANCH)
|
||||
add_compile_definitions(DEV_BRANCH)
|
||||
endif()
|
||||
|
||||
if(DISCORD)
|
||||
add_compile_definitions(DISCORD)
|
||||
target_sources(86Box PRIVATE discord.c)
|
||||
@@ -69,7 +90,10 @@ if(VNC)
|
||||
find_package(LibVNCServer)
|
||||
if(LibVNCServer_FOUND)
|
||||
add_compile_definitions(USE_VNC)
|
||||
add_library(vnc OBJECT vnc.c vnc_keymap.c)
|
||||
add_library(vnc OBJECT
|
||||
vnc.c
|
||||
vnc_keymap.c
|
||||
)
|
||||
target_link_libraries(86Box vnc LibVNCServer::vncserver)
|
||||
if(WIN32)
|
||||
target_link_libraries(86Box ws2_32)
|
||||
@@ -147,8 +171,10 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
|
||||
include_directories(include)
|
||||
if(NEW_DYNAREC)
|
||||
include_directories(cpu codegen_new)
|
||||
else()
|
||||
elseif(DYNAREC)
|
||||
include_directories(cpu codegen)
|
||||
else()
|
||||
include_directories(cpu)
|
||||
endif()
|
||||
|
||||
add_subdirectory(cdrom)
|
||||
@@ -157,7 +183,7 @@ add_subdirectory(chipset)
|
||||
add_subdirectory(cpu)
|
||||
if(NEW_DYNAREC)
|
||||
add_subdirectory(codegen_new)
|
||||
else()
|
||||
elseif(DYNAREC)
|
||||
add_subdirectory(codegen)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -9,16 +9,30 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
find_package(PkgConfig REQUIRED)
|
||||
|
||||
pkg_check_modules(SNDFILE REQUIRED IMPORTED_TARGET sndfile)
|
||||
|
||||
add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c cdrom_ioctl.c cdrom_mitsumi.c)
|
||||
add_library(cdrom OBJECT
|
||||
cdrom.c
|
||||
cdrom_image_backend.c
|
||||
cdrom_image_viso.c
|
||||
cdrom_image.c
|
||||
cdrom_ioctl.c
|
||||
)
|
||||
target_link_libraries(86Box PkgConfig::SNDFILE)
|
||||
|
||||
if(CDROM_MITSUMI)
|
||||
target_compile_definitions(cdrom PRIVATE USE_CDROM_MITSUMI)
|
||||
target_sources(cdrom PRIVATE cdrom_mitsumi.c)
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
# MSYS2
|
||||
target_link_libraries(86Box -static ${SNDFILE_STATIC_LIBRARIES})
|
||||
|
||||
@@ -170,25 +170,23 @@ cleanup_error:
|
||||
static int
|
||||
bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count)
|
||||
{
|
||||
track_file_t *tf;
|
||||
|
||||
cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu)\n",
|
||||
tf->fp, seek, count);
|
||||
track_file_t *tf = NULL;
|
||||
|
||||
if ((tf = (track_file_t *) priv)->fp == NULL)
|
||||
return 0;
|
||||
|
||||
cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu)\n",
|
||||
tf->fp, seek, count);
|
||||
|
||||
if (fseeko64(tf->fp, seek, SEEK_SET) == -1) {
|
||||
#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG
|
||||
cdrom_image_backend_log("CDROM: binary_read failed during seek!\n");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fread(buffer, count, 1, tf->fp) != 1) {
|
||||
#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG
|
||||
cdrom_image_backend_log("CDROM: binary_read failed during read!\n");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -207,9 +205,7 @@ bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count)
|
||||
static uint64_t
|
||||
bin_get_length(void *priv)
|
||||
{
|
||||
track_file_t *tf;
|
||||
|
||||
cdrom_image_backend_log("CDROM: binary_length(%08lx)\n", tf->fp);
|
||||
track_file_t *tf = NULL;
|
||||
|
||||
if ((tf = (track_file_t *) priv)->fp == NULL)
|
||||
return 0;
|
||||
@@ -1159,10 +1155,9 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
trk.file = audio_init(filename, &error);
|
||||
}
|
||||
if (error) {
|
||||
#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG
|
||||
cdrom_image_backend_log("CUE: cannot open file '%s' in cue sheet!\n",
|
||||
filename);
|
||||
#endif
|
||||
|
||||
if (trk.file != NULL) {
|
||||
trk.file->close(trk.file);
|
||||
trk.file = NULL;
|
||||
@@ -1177,9 +1172,8 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
/* Ignored commands. */
|
||||
success = 1;
|
||||
} else {
|
||||
#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG
|
||||
cdrom_image_backend_log("CUE: unsupported command '%s' in cue sheet!\n", command);
|
||||
#endif
|
||||
|
||||
success = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,20 +9,80 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
add_library(chipset OBJECT 82c100.c acc2168.c cs8230.c ali1429.c ali1435.c ali1489.c
|
||||
ali1531.c ali1541.c ali1543.c ali1621.c ali6117.c ali1409.c headland.c ims8848.c intel_82335.c
|
||||
compaq_386.c contaq_82c59x.c cs4031.c intel_420ex.c intel_4x0.c intel_i450kx.c
|
||||
intel_sio.c intel_piix.c ../ioapic.c neat.c opti283.c opti291.c opti391.c opti495.c
|
||||
opti499.c opti602.c opti822.c opti895.c opti5x7.c scamp.c scat.c sis_85c310.c sis_85c4xx.c
|
||||
sis_85c496.c sis_85c50x.c sis_5511.c sis_5571.c sis_5581.c sis_5591.c sis_5600.c
|
||||
sis_5511_h2p.c sis_5571_h2p.c sis_5581_h2p.c sis_5591_h2p.c sis_5600_h2p.c
|
||||
sis_5513_p2i.c sis_5513_ide.c sis_5572_usb.c sis_5595_pmu.c sis_55xx.c via_vt82c49x.c
|
||||
via_vt82c505.c sis_85c310.c sis_85c4xx.c sis_85c496.c sis_85c50x.c gc100.c stpc.c
|
||||
umc_8886.c umc_hb4.c umc_8890.c via_apollo.c via_pipc.c vl82c480.c wd76c10.c)
|
||||
add_library(chipset OBJECT
|
||||
82c100.c
|
||||
acc2168.c
|
||||
cs8230.c
|
||||
ali1429.c
|
||||
ali1435.c
|
||||
ali1489.c
|
||||
ali1531.c
|
||||
ali1541.c
|
||||
ali1543.c
|
||||
ali1621.c
|
||||
ali6117.c
|
||||
ali1409.c
|
||||
headland.c
|
||||
ims8848.c
|
||||
intel_82335.c
|
||||
compaq_386.c
|
||||
contaq_82c59x.c
|
||||
cs4031.c
|
||||
intel_420ex.c
|
||||
intel_4x0.c
|
||||
intel_i450kx.c
|
||||
intel_sio.c
|
||||
intel_piix.c
|
||||
../ioapic.c
|
||||
neat.c
|
||||
opti283.c
|
||||
opti291.c
|
||||
opti391.c
|
||||
opti495.c
|
||||
opti499.c
|
||||
opti602.c
|
||||
opti822.c
|
||||
opti895.c
|
||||
opti5x7.c
|
||||
scamp.c
|
||||
scat.c
|
||||
sis_85c310.c
|
||||
sis_85c4xx.c
|
||||
sis_85c496.c
|
||||
sis_85c50x.c
|
||||
sis_5511.c
|
||||
sis_5571.c
|
||||
sis_5581.c
|
||||
sis_5591.c
|
||||
sis_5600.c
|
||||
sis_5511_h2p.c
|
||||
sis_5571_h2p.c
|
||||
sis_5581_h2p.c
|
||||
sis_5591_h2p.c
|
||||
sis_5600_h2p.c
|
||||
sis_5513_p2i.c
|
||||
sis_5513_ide.c
|
||||
sis_5572_usb.c
|
||||
sis_5595_pmu.c
|
||||
sis_55xx.c
|
||||
via_vt82c49x.c
|
||||
via_vt82c505.c
|
||||
gc100.c
|
||||
stpc.c
|
||||
umc_8886.c
|
||||
umc_hb4.c
|
||||
umc_8890.c
|
||||
via_apollo.c
|
||||
via_pipc.c
|
||||
vl82c480.c
|
||||
wd76c10.c
|
||||
)
|
||||
|
||||
if(OLIVETTI)
|
||||
target_sources(chipset PRIVATE olivetti_eva.c)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -107,8 +107,8 @@ sis_85c50x_shadow_recalc(sis_85c50x_t *dev)
|
||||
if (dev->states[8 + i] != state) {
|
||||
mem_set_mem_state_both(base, 0x00004000, state);
|
||||
sis_85c50x_log("%05X-%05X: R%c, W%c\n", base, base + 0x3fff,
|
||||
(dev->pci_conf[0x543 & (0x80 >> i)) ?
|
||||
((dev->pci_conf[0x54] & 0x40) ? 'I' : 'D') : 'E',
|
||||
(dev->pci_conf[0x54] & (0x80 >> i)) ?
|
||||
((dev->pci_conf[0x53] & 0x40) ? 'I' : 'D') : 'E',
|
||||
(dev->pci_conf[0x54] & (0x80 >> i)) ?
|
||||
((dev->pci_conf[0x53] & 0x20) ? 'P' : 'I') : 'E');
|
||||
dev->states[8 + i] = state;
|
||||
|
||||
@@ -9,19 +9,28 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
if(DYNAREC)
|
||||
add_library(dynarec OBJECT codegen.c codegen_ops.c)
|
||||
add_library(dynarec OBJECT
|
||||
codegen.c
|
||||
codegen_ops.c
|
||||
)
|
||||
|
||||
if(ARCH STREQUAL "i386")
|
||||
target_sources(dynarec PRIVATE codegen_x86.c
|
||||
codegen_accumulate_x86.c)
|
||||
target_sources(dynarec PRIVATE
|
||||
codegen_x86.c
|
||||
codegen_accumulate_x86.c
|
||||
)
|
||||
elseif(ARCH STREQUAL "x86_64")
|
||||
target_sources(dynarec PRIVATE codegen_x86-64.c
|
||||
codegen_accumulate_x86-64.c)
|
||||
target_sources(dynarec PRIVATE
|
||||
codegen_x86-64.c
|
||||
codegen_accumulate_x86-64.c
|
||||
)
|
||||
else()
|
||||
message(SEND_ERROR
|
||||
"Dynarec is incompatible with target platform ${ARCH}")
|
||||
|
||||
@@ -311,6 +311,7 @@ extern codegen_timing_t codegen_timing_686;
|
||||
extern codegen_timing_t codegen_timing_486;
|
||||
extern codegen_timing_t codegen_timing_winchip;
|
||||
extern codegen_timing_t codegen_timing_winchip2;
|
||||
extern codegen_timing_t codegen_timing_k5;
|
||||
extern codegen_timing_t codegen_timing_k6;
|
||||
extern codegen_timing_t codegen_timing_p6;
|
||||
|
||||
|
||||
@@ -9,39 +9,71 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
if(DYNAREC)
|
||||
add_library(dynarec OBJECT codegen.c codegen_accumulate.c
|
||||
codegen_allocator.c codegen_block.c codegen_ir.c codegen_ops.c
|
||||
codegen_ops_3dnow.c codegen_ops_branch.c codegen_ops_arith.c
|
||||
codegen_ops_fpu_arith.c codegen_ops_fpu_constant.c
|
||||
codegen_ops_fpu_loadstore.c codegen_ops_fpu_misc.c
|
||||
codegen_ops_helpers.c codegen_ops_jump.c codegen_ops_logic.c
|
||||
codegen_ops_misc.c codegen_ops_mmx_arith.c codegen_ops_mmx_cmp.c
|
||||
codegen_ops_mmx_loadstore.c codegen_ops_mmx_logic.c
|
||||
codegen_ops_mmx_pack.c codegen_ops_mmx_shift.c codegen_ops_mov.c
|
||||
codegen_ops_shift.c codegen_ops_stack.c codegen_reg.c)
|
||||
add_library(dynarec OBJECT
|
||||
codegen.c
|
||||
codegen_accumulate.c
|
||||
codegen_allocator.c
|
||||
codegen_block.c
|
||||
codegen_ir.c
|
||||
codegen_ops.c
|
||||
codegen_ops_3dnow.c
|
||||
codegen_ops_branch.c
|
||||
codegen_ops_arith.c
|
||||
codegen_ops_fpu_arith.c
|
||||
codegen_ops_fpu_constant.c
|
||||
codegen_ops_fpu_loadstore.c
|
||||
codegen_ops_fpu_misc.c
|
||||
codegen_ops_helpers.c
|
||||
codegen_ops_jump.c
|
||||
codegen_ops_logic.c
|
||||
codegen_ops_misc.c
|
||||
codegen_ops_mmx_arith.c
|
||||
codegen_ops_mmx_cmp.c
|
||||
codegen_ops_mmx_loadstore.c
|
||||
codegen_ops_mmx_logic.c
|
||||
codegen_ops_mmx_pack.c
|
||||
codegen_ops_mmx_shift.c
|
||||
codegen_ops_mov.c
|
||||
codegen_ops_shift.c
|
||||
codegen_ops_stack.c
|
||||
codegen_reg.c
|
||||
)
|
||||
|
||||
if(ARCH STREQUAL "i386")
|
||||
target_sources(dynarec PRIVATE codegen_backend_x86.c
|
||||
codegen_backend_x86_ops.c codegen_backend_x86_ops_fpu.c
|
||||
target_sources(dynarec PRIVATE
|
||||
codegen_backend_x86.c
|
||||
codegen_backend_x86_ops.c
|
||||
codegen_backend_x86_ops_fpu.c
|
||||
codegen_backend_x86_ops_sse.c
|
||||
codegen_backend_x86_uops.c)
|
||||
codegen_backend_x86_uops.c
|
||||
)
|
||||
elseif(ARCH STREQUAL "x86_64")
|
||||
target_sources(dynarec PRIVATE codegen_backend_x86-64.c
|
||||
target_sources(dynarec PRIVATE
|
||||
codegen_backend_x86-64.c
|
||||
codegen_backend_x86-64_ops.c
|
||||
codegen_backend_x86-64_ops_sse.c
|
||||
codegen_backend_x86-64_uops.c)
|
||||
codegen_backend_x86-64_uops.c
|
||||
)
|
||||
elseif(ARCH STREQUAL "arm64")
|
||||
target_sources(dynarec PRIVATE codegen_backend_arm64.c
|
||||
codegen_backend_arm64_ops.c codegen_backend_arm64_uops.c
|
||||
codegen_backend_arm64_imm.c)
|
||||
target_sources(dynarec PRIVATE
|
||||
codegen_backend_arm64.c
|
||||
codegen_backend_arm64_ops.c
|
||||
codegen_backend_arm64_uops.c
|
||||
codegen_backend_arm64_imm.c
|
||||
)
|
||||
elseif(ARCH STREQUAL "arm")
|
||||
target_sources(dynarec PRIVATE codegen_backend_arm.c
|
||||
codegen_backend_arm_ops.c codegen_backend_arm_uops.c)
|
||||
target_sources(dynarec PRIVATE
|
||||
codegen_backend_arm.c
|
||||
codegen_backend_arm_ops.c
|
||||
codegen_backend_arm_uops.c
|
||||
)
|
||||
else()
|
||||
message(SEND_ERROR
|
||||
"Dynarec is incompatible with target platform ${ARCH}")
|
||||
|
||||
@@ -341,6 +341,7 @@ extern codegen_timing_t codegen_timing_686;
|
||||
extern codegen_timing_t codegen_timing_486;
|
||||
extern codegen_timing_t codegen_timing_winchip;
|
||||
extern codegen_timing_t codegen_timing_winchip2;
|
||||
extern codegen_timing_t codegen_timing_k5;
|
||||
extern codegen_timing_t codegen_timing_k6;
|
||||
extern codegen_timing_t codegen_timing_p6;
|
||||
|
||||
|
||||
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)
|
||||
|
||||
@@ -279,7 +279,7 @@ exec386_2386(int32_t cycs)
|
||||
if (!cpu_state.abrt) {
|
||||
#ifdef ENABLE_386_LOG
|
||||
if (in_smm)
|
||||
x386_2386_log("[%04X:%08X] %08X\n", CS, cpu_state.pc, fetchdat);
|
||||
x386_log("[%04X:%08X] %08X\n", CS, cpu_state.pc, fetchdat);
|
||||
#endif
|
||||
opcode = fetchdat & 0xFF;
|
||||
fetchdat >>= 8;
|
||||
@@ -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;
|
||||
|
||||
@@ -1384,7 +1384,7 @@ const OpFn OP_TABLE(pentium_0f)[1024] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
# if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
# ifdef USE_CYRIX_6X86
|
||||
const OpFn OP_TABLE(c6x86_0f)[1024] = {
|
||||
// clang-format off
|
||||
/*16-bit data, 16-bit addr*/
|
||||
@@ -1476,7 +1476,7 @@ const OpFn OP_TABLE(c6x86_0f)[1024] = {
|
||||
/*f0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,
|
||||
// clang-format on
|
||||
};
|
||||
# endif
|
||||
# endif /* USE_CYRIX_6X86 */
|
||||
|
||||
const OpFn OP_TABLE(pentiummmx_0f)[1024] = {
|
||||
// clang-format off
|
||||
@@ -1754,7 +1754,7 @@ const OpFn OP_TABLE(k62_0f)[1024] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
# if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
# ifdef USE_CYRIX_6X86
|
||||
const OpFn OP_TABLE(c6x86mx_0f)[1024] = {
|
||||
// clang-format off
|
||||
/*16-bit data, 16-bit addr*/
|
||||
@@ -1846,7 +1846,7 @@ const OpFn OP_TABLE(c6x86mx_0f)[1024] = {
|
||||
/*f0*/ ILLEGAL, opPSLLW_a32, opPSLLD_a32, opPSLLQ_a32, ILLEGAL, opPMADDWD_a32, ILLEGAL, ILLEGAL, opPSUBB_a32, opPSUBW_a32, opPSUBD_a32, ILLEGAL, opPADDB_a32, opPADDW_a32, opPADDD_a32, ILLEGAL,
|
||||
// clang-format on
|
||||
};
|
||||
# endif
|
||||
# endif /* USE_CYRIX_6X86 */
|
||||
|
||||
const OpFn OP_TABLE(pentiumpro_0f)[1024] = {
|
||||
// clang-format off
|
||||
|
||||
@@ -130,10 +130,10 @@ typedef int (*OpFn)(uint32_t fetchdat);
|
||||
static int tempc_fpu = 0;
|
||||
|
||||
#ifdef ENABLE_808X_LOG
|
||||
#if 0
|
||||
void dumpregs(int);
|
||||
|
||||
#endif
|
||||
int x808x_do_log = ENABLE_808X_LOG;
|
||||
int indump = 0;
|
||||
|
||||
static void
|
||||
x808x_log(const char *fmt, ...)
|
||||
|
||||
@@ -9,32 +9,60 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
add_library(cpu OBJECT cpu.c cpu_table.c fpu.c x86.c 808x.c 386.c 386_common.c
|
||||
386_dynarec.c x86_ops_mmx.c x86seg_common.c x86seg.c x86seg_2386.c x87.c
|
||||
x87_timings.c 8080.c)
|
||||
add_library(cpu OBJECT
|
||||
cpu.c
|
||||
cpu_table.c
|
||||
fpu.c x86.c
|
||||
808x.c
|
||||
386.c
|
||||
386_common.c
|
||||
386_dynarec.c
|
||||
x86_ops_mmx.c
|
||||
x86seg_common.c
|
||||
x86seg.c
|
||||
x86seg_2386.c
|
||||
x87.c
|
||||
x87_timings.c
|
||||
8080.c
|
||||
)
|
||||
|
||||
if(AMD_K5)
|
||||
target_compile_definitions(cpu PRIVATE USE_AMD_K5)
|
||||
|
||||
if(DYNAREC)
|
||||
add_library(ctk5 OBJECT codegen_timing_k5.c)
|
||||
target_link_libraries(86Box ctk5)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
if(CYRIX_6X86)
|
||||
target_compile_definitions(cpu PRIVATE USE_CYRIX_6X86)
|
||||
|
||||
if(DYNAREC)
|
||||
add_library(ct686 OBJECT codegen_timing_686.c)
|
||||
target_link_libraries(86Box ct686)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(DYNAREC)
|
||||
target_sources(cpu PRIVATE 386_dynarec_ops.c)
|
||||
|
||||
add_library(cgt OBJECT codegen_timing_486.c
|
||||
codegen_timing_common.c codegen_timing_k6.c
|
||||
codegen_timing_pentium.c codegen_timing_p6.c
|
||||
codegen_timing_winchip.c codegen_timing_winchip2.c)
|
||||
add_library(cgt OBJECT
|
||||
codegen_timing_486.c
|
||||
codegen_timing_common.c
|
||||
codegen_timing_k6.c
|
||||
codegen_timing_pentium.c
|
||||
codegen_timing_p6.c
|
||||
codegen_timing_winchip.c
|
||||
codegen_timing_winchip2.c
|
||||
)
|
||||
endif()
|
||||
|
||||
add_subdirectory(softfloat3e)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#define CYCLES(c) (int *) c
|
||||
#define CYCLES2(c16, c32) (int *) ((-1 & ~0xffff) | c16 | (c32 << 8))
|
||||
|
||||
static int *opcode_timings[256] = {
|
||||
static int *opcode_timings_486[256] = {
|
||||
// clang-format off
|
||||
/*00*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), NULL,
|
||||
/*10*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3),
|
||||
@@ -42,7 +42,7 @@ static int *opcode_timings[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_mod3[256] = {
|
||||
static int *opcode_timings_486_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), NULL,
|
||||
/*10*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3),
|
||||
@@ -66,7 +66,7 @@ static int *opcode_timings_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_0f[256] = {
|
||||
static int *opcode_timings_486_0f[256] = {
|
||||
// clang-format off
|
||||
/*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
@@ -89,7 +89,7 @@ static int *opcode_timings_0f[256] = {
|
||||
/*f0*/ NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, NULL, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, &timing_rm, &timing_rm, NULL,
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_0f_mod3[256] = {
|
||||
static int *opcode_timings_486_0f_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
@@ -113,65 +113,65 @@ static int *opcode_timings_0f_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_shift[8] = {
|
||||
static int *opcode_timings_486_shift[8] = {
|
||||
// clang-format off
|
||||
CYCLES(7), CYCLES(7), CYCLES(10), CYCLES(10), CYCLES(7), CYCLES(7), CYCLES(7), CYCLES(7)
|
||||
};
|
||||
static int *opcode_timings_shift_mod3[8] = {
|
||||
static int *opcode_timings_486_shift_mod3[8] = {
|
||||
// clang-format off
|
||||
CYCLES(3), CYCLES(3), CYCLES(9), CYCLES(9), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_f6[8] = {
|
||||
static int *opcode_timings_486_f6[8] = {
|
||||
// clang-format off
|
||||
&timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_f6_mod3[8] = {
|
||||
static int *opcode_timings_486_f6_mod3[8] = {
|
||||
// clang-format off
|
||||
&timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_f7[8] = {
|
||||
static int *opcode_timings_486_f7[8] = {
|
||||
// clang-format off
|
||||
&timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_f7_mod3[8] = {
|
||||
static int *opcode_timings_486_f7_mod3[8] = {
|
||||
// clang-format off
|
||||
&timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43)
|
||||
};
|
||||
static int *opcode_timings_ff[8] = {
|
||||
static int *opcode_timings_486_ff[8] = {
|
||||
// clang-format off
|
||||
&timing_mm, &timing_mm, CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), NULL
|
||||
};
|
||||
static int *opcode_timings_ff_mod3[8] = {
|
||||
static int *opcode_timings_486_ff_mod3[8] = {
|
||||
// clang-format off
|
||||
&timing_rr, &timing_rr, CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), NULL
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_d8[8] = {
|
||||
static int *opcode_timings_486_d8[8] = {
|
||||
// clang-format off
|
||||
/* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/
|
||||
CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_d8_mod3[8] = {
|
||||
static int *opcode_timings_486_d8_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOM FCOMP FSUB FSUBR FDIV FDIVR*/
|
||||
CYCLES(8), CYCLES(16), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_d9[8] = {
|
||||
static int *opcode_timings_486_d9[8] = {
|
||||
// clang-format off
|
||||
/* FLDs FSTs FSTPs FLDENV FLDCW FSTENV FSTCW*/
|
||||
CYCLES(3), NULL, CYCLES(7), CYCLES(7), CYCLES(34), CYCLES(4), CYCLES(67), CYCLES(3)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_d9_mod3[64] = {
|
||||
static int *opcode_timings_486_d9_mod3[64] = {
|
||||
// clang-format off
|
||||
/*FLD*/
|
||||
CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4),
|
||||
@@ -192,25 +192,25 @@ static int *opcode_timings_d9_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_da[8] = {
|
||||
static int *opcode_timings_486_da[8] = {
|
||||
// clang-format off
|
||||
/* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/
|
||||
CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_da_mod3[8] = {
|
||||
static int *opcode_timings_486_da_mod3[8] = {
|
||||
// clang-format off
|
||||
NULL, NULL, NULL, NULL, NULL, CYCLES(5), NULL, NULL
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_db[8] = {
|
||||
static int *opcode_timings_486_db[8] = {
|
||||
// clang-format off
|
||||
/* FLDil FSTil FSTPil FLDe FSTPe*/
|
||||
CYCLES(9), NULL, CYCLES(28), CYCLES(28), NULL, CYCLES(5), NULL, CYCLES(6)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_db_mod3[64] = {
|
||||
static int *opcode_timings_486_db_mod3[64] = {
|
||||
// clang-format off
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
@@ -224,74 +224,74 @@ static int *opcode_timings_db_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_dc[8] = {
|
||||
static int *opcode_timings_486_dc[8] = {
|
||||
// clang-format off
|
||||
/* opFADDd_a16 opFMULd_a16 opFCOMd_a16 opFCOMPd_a16 opFSUBd_a16 opFSUBRd_a16 opFDIVd_a16 opFDIVRd_a16*/
|
||||
CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_dc_mod3[8] = {
|
||||
static int *opcode_timings_486_dc_mod3[8] = {
|
||||
// clang-format off
|
||||
/* opFADDr opFMULr opFSUBRr opFSUBr opFDIVRr opFDIVr*/
|
||||
CYCLES(8), CYCLES(16), NULL, NULL, CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_dd[8] = {
|
||||
static int *opcode_timings_486_dd[8] = {
|
||||
// clang-format off
|
||||
/* FLDd FSTd FSTPd FRSTOR FSAVE FSTSW*/
|
||||
CYCLES(3), NULL, CYCLES(8), CYCLES(8), CYCLES(131), NULL, CYCLES(154), CYCLES(3)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_dd_mod3[8] = {
|
||||
static int *opcode_timings_486_dd_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFFREE FST FSTP FUCOM FUCOMP*/
|
||||
CYCLES(3), NULL, CYCLES(3), CYCLES(3), CYCLES(4), CYCLES(4), NULL, NULL
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_de[8] = {
|
||||
static int *opcode_timings_486_de[8] = {
|
||||
// clang-format off
|
||||
/* FADDiw FMULiw FCOMiw FCOMPiw FSUBil FSUBRil FDIVil FDIVRil*/
|
||||
CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_de_mod3[8] = {
|
||||
static int *opcode_timings_486_de_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOMPP FSUB FSUBR FDIV FDIVR*/
|
||||
CYCLES(8), CYCLES(16), NULL, CYCLES(5), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_df[8] = {
|
||||
static int *opcode_timings_486_df[8] = {
|
||||
// clang-format off
|
||||
/* FILDiw FISTiw FISTPiw FILDiq FBSTP FISTPiq*/
|
||||
CYCLES(13), NULL, CYCLES(29), CYCLES(29), NULL, CYCLES(10), CYCLES(172), CYCLES(28)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_df_mod3[8] = {
|
||||
static int *opcode_timings_486_df_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFREE FST FSTP FUCOM FUCOMP*/
|
||||
CYCLES(3), NULL, CYCLES(3), CYCLES(3), CYCLES(4), CYCLES(4), NULL, NULL
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_8x[8] = {
|
||||
static int *opcode_timings_486_8x[8] = {
|
||||
// clang-format off
|
||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_8x_mod3[8] = {
|
||||
static int *opcode_timings_486_8x_mod3[8] = {
|
||||
// clang-format off
|
||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_81[8] = {
|
||||
static int *opcode_timings_486_81[8] = {
|
||||
// clang-format off
|
||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_81_mod3[8] = {
|
||||
static int *opcode_timings_486_81_mod3[8] = {
|
||||
// clang-format off
|
||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||
// clang-format on
|
||||
@@ -330,7 +330,7 @@ codegen_timing_486_start(void)
|
||||
void
|
||||
codegen_timing_486_prefix(uint8_t prefix, uint32_t fetchdat)
|
||||
{
|
||||
timing_count += COUNT(opcode_timings[prefix], 0);
|
||||
timing_count += COUNT(opcode_timings_486[prefix], 0);
|
||||
last_prefix = prefix;
|
||||
}
|
||||
|
||||
@@ -344,47 +344,47 @@ codegen_timing_486_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u
|
||||
|
||||
switch (last_prefix) {
|
||||
case 0x0f:
|
||||
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||
timings = mod3 ? opcode_timings_486_0f_mod3 : opcode_timings_486_0f;
|
||||
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||
break;
|
||||
|
||||
case 0xd8:
|
||||
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||
timings = mod3 ? opcode_timings_486_d8_mod3 : opcode_timings_486_d8;
|
||||
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xd9:
|
||||
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||
timings = mod3 ? opcode_timings_486_d9_mod3 : opcode_timings_486_d9;
|
||||
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xda:
|
||||
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||
timings = mod3 ? opcode_timings_486_da_mod3 : opcode_timings_486_da;
|
||||
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdb:
|
||||
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||
timings = mod3 ? opcode_timings_486_db_mod3 : opcode_timings_486_db;
|
||||
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdc:
|
||||
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||
timings = mod3 ? opcode_timings_486_dc_mod3 : opcode_timings_486_dc;
|
||||
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdd:
|
||||
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||
timings = mod3 ? opcode_timings_486_dd_mod3 : opcode_timings_486_dd;
|
||||
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xde:
|
||||
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||
timings = mod3 ? opcode_timings_486_de_mod3 : opcode_timings_486_de;
|
||||
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdf:
|
||||
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||
timings = mod3 ? opcode_timings_486_df_mod3 : opcode_timings_486_df;
|
||||
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
@@ -394,12 +394,12 @@ codegen_timing_486_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u
|
||||
case 0x80:
|
||||
case 0x82:
|
||||
case 0x83:
|
||||
timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||
timings = mod3 ? opcode_timings_486_8x_mod3 : opcode_timings_486_8x;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0x81:
|
||||
timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81;
|
||||
timings = mod3 ? opcode_timings_486_81_mod3 : opcode_timings_486_81;
|
||||
deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
@@ -410,29 +410,29 @@ codegen_timing_486_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u
|
||||
case 0xd1:
|
||||
case 0xd2:
|
||||
case 0xd3:
|
||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||
timings = mod3 ? opcode_timings_486_shift_mod3 : opcode_timings_486_shift;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xf6:
|
||||
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||
timings = mod3 ? opcode_timings_486_f6_mod3 : opcode_timings_486_f6;
|
||||
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xf7:
|
||||
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||
timings = mod3 ? opcode_timings_486_f7_mod3 : opcode_timings_486_f7;
|
||||
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xff:
|
||||
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||
timings = mod3 ? opcode_timings_486_ff_mod3 : opcode_timings_486_ff;
|
||||
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||
timings = mod3 ? opcode_timings_486_mod3 : opcode_timings_486;
|
||||
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ static uint32_t prev_fetchdat;
|
||||
static uint32_t last_regmask_modified;
|
||||
static uint32_t regmask_modified;
|
||||
|
||||
static uint32_t opcode_timings[256] = {
|
||||
static uint32_t opcode_timings_686[256] = {
|
||||
// clang-format off
|
||||
/* ADD ADD ADD ADD*/
|
||||
/*00*/ PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||
@@ -202,7 +202,7 @@ static uint32_t opcode_timings[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_mod3[256] = {
|
||||
static uint32_t opcode_timings_686_mod3[256] = {
|
||||
// clang-format off
|
||||
/* ADD ADD ADD ADD*/
|
||||
/*00*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||
@@ -340,7 +340,7 @@ static uint32_t opcode_timings_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_0f[256] = {
|
||||
static uint32_t opcode_timings_686_0f[256] = {
|
||||
// clang-format off
|
||||
/*00*/ PAIR_NP | CYCLES(20), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(10),
|
||||
INVALID, PAIR_NP | CYCLES(195), PAIR_NP | CYCLES(7), INVALID,
|
||||
@@ -423,7 +423,7 @@ static uint32_t opcode_timings_0f[256] = {
|
||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID,
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_0f_mod3[256] = {
|
||||
static uint32_t opcode_timings_686_0f_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ PAIR_NP | CYCLES(20), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(10),
|
||||
INVALID, PAIR_NP | CYCLES(195), PAIR_NP | CYCLES(7), INVALID,
|
||||
@@ -506,44 +506,44 @@ static uint32_t opcode_timings_0f_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_shift[8] = {
|
||||
static uint32_t opcode_timings_686_shift[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(4),
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW,
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_shift_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_shift_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(4),
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_shift_imm[8] = {
|
||||
static uint32_t opcode_timings_686_shift_imm[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES(8), PAIR_XY | CYCLES(9),
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW,
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_shift_imm_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_shift_imm_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(4),
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_shift_cl[8] = {
|
||||
static uint32_t opcode_timings_686_shift_cl[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(8), PAIR_XY | CYCLES(9),
|
||||
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_shift_cl_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_shift_cl_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(8), PAIR_XY | CYCLES(9),
|
||||
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_f6[8] = {
|
||||
static uint32_t opcode_timings_686_f6[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
PAIR_XY | CYCLES_RM, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
||||
@@ -551,7 +551,7 @@ static uint32_t opcode_timings_f6[8] = {
|
||||
PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(18), PAIR_NP | CYCLES(18)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_f6_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_f6_mod3[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
||||
@@ -559,7 +559,7 @@ static uint32_t opcode_timings_f6_mod3[8] = {
|
||||
PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(18), PAIR_NP | CYCLES(18)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_f7[8] = {
|
||||
static uint32_t opcode_timings_686_f7[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
||||
@@ -567,7 +567,7 @@ static uint32_t opcode_timings_f7[8] = {
|
||||
PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(19,27), PAIR_NP | CYCLES_MULTI(22,30)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_f7_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_f7_mod3[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
||||
@@ -575,7 +575,7 @@ static uint32_t opcode_timings_f7_mod3[8] = {
|
||||
PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(19,27), PAIR_NP | CYCLES_MULTI(22,30)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_ff[8] = {
|
||||
static uint32_t opcode_timings_686_ff[8] = {
|
||||
// clang-format off
|
||||
/* INC DEC CALL CALL far*/
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_X_BRANCH | CYCLES(3), PAIR_NP | CYCLES(5),
|
||||
@@ -583,7 +583,7 @@ static uint32_t opcode_timings_ff[8] = {
|
||||
PAIR_X_BRANCH | CYCLES(3), PAIR_NP | CYCLES(5), PAIR_XY | CYCLES(1), INVALID
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_ff_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_ff_mod3[8] = {
|
||||
// clang-format off
|
||||
/* INC DEC CALL CALL far*/
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_X_BRANCH | CYCLES(1), PAIR_XY | CYCLES(5),
|
||||
@@ -592,7 +592,7 @@ static uint32_t opcode_timings_ff_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_d8[8] = {
|
||||
static uint32_t opcode_timings_686_d8[8] = {
|
||||
// clang-format off
|
||||
/* FADDs FMULs FCOMs FCOMPs*/
|
||||
PAIR_X | CYCLES(7), PAIR_X | CYCLES(6), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4),
|
||||
@@ -600,7 +600,7 @@ static uint32_t opcode_timings_d8[8] = {
|
||||
PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), PAIR_X | CYCLES(34), PAIR_X | CYCLES(34)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_d8_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_d8_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOM FCOMP*/
|
||||
PAIR_X | CYCLES(7), PAIR_X | CYCLES(6), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4),
|
||||
@@ -609,7 +609,7 @@ static uint32_t opcode_timings_d8_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_d9[8] = {
|
||||
static uint32_t opcode_timings_686_d9[8] = {
|
||||
// clang-format off
|
||||
/* FLDs FSTs FSTPs*/
|
||||
PAIR_X | CYCLES(2), INVALID, PAIR_X | CYCLES(2), PAIR_X | CYCLES(2),
|
||||
@@ -617,7 +617,7 @@ static uint32_t opcode_timings_d9[8] = {
|
||||
PAIR_X | CYCLES(30), PAIR_X | CYCLES(4), PAIR_X | CYCLES(24), PAIR_X | CYCLES(5)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_d9_mod3[64] = {
|
||||
static uint32_t opcode_timings_686_d9_mod3[64] = {
|
||||
// clang-format off
|
||||
/*FLD*/
|
||||
PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), PAIR_X | CYCLES(2),
|
||||
@@ -650,7 +650,7 @@ static uint32_t opcode_timings_d9_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_da[8] = {
|
||||
static uint32_t opcode_timings_686_da[8] = {
|
||||
// clang-format off
|
||||
/* FIADDl FIMULl FICOMl FICOMPl*/
|
||||
PAIR_X | CYCLES(12), PAIR_X | CYCLES(11), PAIR_X | CYCLES(10), PAIR_X | CYCLES(10),
|
||||
@@ -658,14 +658,14 @@ static uint32_t opcode_timings_da[8] = {
|
||||
PAIR_X | CYCLES(29), PAIR_X | CYCLES(27), PAIR_X | CYCLES(38), PAIR_X | CYCLES(48)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_da_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_da_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4),
|
||||
INVALID, PAIR_X | CYCLES(5), INVALID, INVALID
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_db[8] = {
|
||||
static uint32_t opcode_timings_686_db[8] = {
|
||||
// clang-format off
|
||||
/* FLDil FSTil FSTPil*/
|
||||
PAIR_X | CYCLES(2), INVALID, PAIR_X | CYCLES(2), PAIR_X | CYCLES(2),
|
||||
@@ -673,7 +673,7 @@ static uint32_t opcode_timings_db[8] = {
|
||||
INVALID, PAIR_X | CYCLES(2), INVALID, PAIR_X | CYCLES(2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_db_mod3[64] = {
|
||||
static uint32_t opcode_timings_686_db_mod3[64] = {
|
||||
// clang-format off
|
||||
PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4),
|
||||
PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4),
|
||||
@@ -703,7 +703,7 @@ static uint32_t opcode_timings_db_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_dc[8] = {
|
||||
static uint32_t opcode_timings_686_dc[8] = {
|
||||
// clang-format off
|
||||
/* FADDd FMULd FCOMd FCOMPd*/
|
||||
PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), PAIR_X | CYCLES(7),
|
||||
@@ -711,7 +711,7 @@ static uint32_t opcode_timings_dc[8] = {
|
||||
PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), PAIR_X | CYCLES(34), PAIR_X | CYCLES(34)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_dc_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_dc_mod3[8] = {
|
||||
// clang-format off
|
||||
/* opFADDr opFMULr*/
|
||||
PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), INVALID, INVALID,
|
||||
@@ -720,7 +720,7 @@ static uint32_t opcode_timings_dc_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_dd[8] = {
|
||||
static uint32_t opcode_timings_686_dd[8] = {
|
||||
// clang-format off
|
||||
/* FLDd FSTd FSTPd*/
|
||||
PAIR_X | CYCLES(2), INVALID, PAIR_X | CYCLES(2), PAIR_X | CYCLES(2),
|
||||
@@ -728,7 +728,7 @@ static uint32_t opcode_timings_dd[8] = {
|
||||
PAIR_X | CYCLES(72), INVALID, PAIR_X | CYCLES(67), PAIR_X | CYCLES(2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_dd_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_dd_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFFREE FST FSTP*/
|
||||
PAIR_X | CYCLES(3), INVALID, PAIR_X | CYCLES(2), PAIR_X | CYCLES(2),
|
||||
@@ -737,14 +737,14 @@ static uint32_t opcode_timings_dd_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_de[8] = {
|
||||
static uint32_t opcode_timings_686_de[8] = {
|
||||
// clang-format off
|
||||
/* FIADDw FIMULw FICOMw FICOMPw*/
|
||||
PAIR_X | CYCLES(12), PAIR_X | CYCLES(11), PAIR_X | CYCLES(10), PAIR_X | CYCLES(10),
|
||||
/* FISUBw FISUBRw FIDIVw FIDIVRw*/
|
||||
PAIR_X | CYCLES(27), PAIR_X | CYCLES(27), PAIR_X | CYCLES(38), PAIR_X | CYCLES(38)
|
||||
};
|
||||
static uint32_t opcode_timings_de_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_de_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOMPP*/
|
||||
PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), INVALID, PAIR_X | CYCLES(7),
|
||||
@@ -753,7 +753,7 @@ static uint32_t opcode_timings_de_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_df[8] = {
|
||||
static uint32_t opcode_timings_686_df[8] = {
|
||||
// clang-format off
|
||||
/* FILDiw FISTiw FISTPiw*/
|
||||
PAIR_X | CYCLES(8), INVALID, PAIR_X | CYCLES(10), PAIR_X | CYCLES(13),
|
||||
@@ -761,7 +761,7 @@ static uint32_t opcode_timings_df[8] = {
|
||||
INVALID, PAIR_X | CYCLES(8), PAIR_X | CYCLES(63), PAIR_X | CYCLES(13)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_df_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_df_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FSTSW AX*/
|
||||
@@ -769,25 +769,25 @@ static uint32_t opcode_timings_df_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_8x[8] = {
|
||||
static uint32_t opcode_timings_686_8x[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW,
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_8x_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_8x_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_81[8] = {
|
||||
static uint32_t opcode_timings_686_81[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW,
|
||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_81_mod3[8] = {
|
||||
static uint32_t opcode_timings_686_81_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG
|
||||
@@ -874,47 +874,47 @@ codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u
|
||||
|
||||
switch (last_prefix) {
|
||||
case 0x0f:
|
||||
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||
timings = mod3 ? opcode_timings_686_0f_mod3 : opcode_timings_686_0f;
|
||||
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||
break;
|
||||
|
||||
case 0xd8:
|
||||
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||
timings = mod3 ? opcode_timings_686_d8_mod3 : opcode_timings_686_d8;
|
||||
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xd9:
|
||||
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||
timings = mod3 ? opcode_timings_686_d9_mod3 : opcode_timings_686_d9;
|
||||
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xda:
|
||||
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||
timings = mod3 ? opcode_timings_686_da_mod3 : opcode_timings_686_da;
|
||||
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdb:
|
||||
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||
timings = mod3 ? opcode_timings_686_db_mod3 : opcode_timings_686_db;
|
||||
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdc:
|
||||
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||
timings = mod3 ? opcode_timings_686_dc_mod3 : opcode_timings_686_dc;
|
||||
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdd:
|
||||
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||
timings = mod3 ? opcode_timings_686_dd_mod3 : opcode_timings_686_dd;
|
||||
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xde:
|
||||
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||
timings = mod3 ? opcode_timings_686_de_mod3 : opcode_timings_686_de;
|
||||
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdf:
|
||||
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||
timings = mod3 ? opcode_timings_686_df_mod3 : opcode_timings_686_df;
|
||||
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
@@ -924,55 +924,55 @@ codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u
|
||||
case 0x80:
|
||||
case 0x82:
|
||||
case 0x83:
|
||||
timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||
timings = mod3 ? opcode_timings_686_8x_mod3 : opcode_timings_686_8x;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0x81:
|
||||
timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81;
|
||||
timings = mod3 ? opcode_timings_686_81_mod3 : opcode_timings_686_81;
|
||||
deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xc0:
|
||||
case 0xc1:
|
||||
timings = mod3 ? opcode_timings_shift_imm_mod3 : opcode_timings_shift_imm;
|
||||
timings = mod3 ? opcode_timings_686_shift_imm_mod3 : opcode_timings_686_shift_imm;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xd0:
|
||||
case 0xd1:
|
||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||
timings = mod3 ? opcode_timings_686_shift_mod3 : opcode_timings_686_shift;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xd2:
|
||||
case 0xd3:
|
||||
timings = mod3 ? opcode_timings_shift_cl_mod3 : opcode_timings_shift_cl;
|
||||
timings = mod3 ? opcode_timings_686_shift_cl_mod3 : opcode_timings_686_shift_cl;
|
||||
deps = mod3 ? opcode_deps_shift_cl_mod3 : opcode_deps_shift_cl;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xf6:
|
||||
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||
timings = mod3 ? opcode_timings_686_f6_mod3 : opcode_timings_686_f6;
|
||||
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xf7:
|
||||
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||
timings = mod3 ? opcode_timings_686_f7_mod3 : opcode_timings_686_f7;
|
||||
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xff:
|
||||
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||
timings = mod3 ? opcode_timings_686_ff_mod3 : opcode_timings_686_ff;
|
||||
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||
timings = mod3 ? opcode_timings_686_mod3 : opcode_timings_686;
|
||||
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||
break;
|
||||
}
|
||||
|
||||
2232
src/cpu/codegen_timing_k5.c
Normal file
2232
src/cpu/codegen_timing_k5.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
/*Most of the vector instructions here are a total guess.
|
||||
Some of the timings are based on http://http://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000562_K6_InstLatX86.txt*/
|
||||
Some of the timings are based on https://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000562_K6_InstLatX86.txt*/
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
@@ -759,7 +759,7 @@ static const risc86_instruction_t vector_wbinvd_op = {
|
||||
|
||||
#define INVALID NULL
|
||||
|
||||
static const risc86_instruction_t *opcode_timings[256] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6[256] = {
|
||||
// clang-format off
|
||||
/* ADD ADD ADD ADD*/
|
||||
/*00*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op,
|
||||
@@ -896,7 +896,7 @@ static const risc86_instruction_t *opcode_timings[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_mod3[256] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_mod3[256] = {
|
||||
// clang-format off
|
||||
/* ADD ADD ADD ADD*/
|
||||
/*00*/ &alux_op, &alu_op, &alux_op, &alu_op,
|
||||
@@ -1033,7 +1033,7 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_0f[256] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_0f[256] = {
|
||||
// clang-format off
|
||||
/*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op,
|
||||
INVALID, &vector_alu6_op, &vector_alu6_op, INVALID,
|
||||
@@ -1116,7 +1116,7 @@ static const risc86_instruction_t *opcode_timings_0f[256] = {
|
||||
&load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_0f_mod3[256] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_0f_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op,
|
||||
INVALID, &vector_alu6_op, &vector_alu6_op, INVALID,
|
||||
@@ -1200,7 +1200,7 @@ static const risc86_instruction_t *opcode_timings_0f_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_0f0f[256] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_0f0f[256] = {
|
||||
// clang-format off
|
||||
/*00*/ INVALID, INVALID, INVALID, INVALID,
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
@@ -1283,7 +1283,7 @@ static const risc86_instruction_t *opcode_timings_0f0f[256] = {
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_0f0f_mod3[256] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_0f0f_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ INVALID, INVALID, INVALID, INVALID,
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
@@ -1367,57 +1367,57 @@ static const risc86_instruction_t *opcode_timings_0f0f_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_shift[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_shift[8] = {
|
||||
// clang-format off
|
||||
&vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op,
|
||||
&vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_shift_b[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_shift_b[8] = {
|
||||
// clang-format off
|
||||
&vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op,
|
||||
&vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_shift_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_shift_mod3[8] = {
|
||||
// clang-format off
|
||||
&vector_alu1_op, &vector_alu1_op, &vector_alu1_op, &vector_alu1_op,
|
||||
&alu_op, &alu_op, &alu_op, &alu_op
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_shift_b_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_shift_b_mod3[8] = {
|
||||
// clang-format off
|
||||
&vector_alux1_op, &vector_alux1_op, &vector_alux1_op, &vector_alux1_op,
|
||||
&alux_op, &alux_op, &alux_op, &alux_op
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_80[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_80[8] = {
|
||||
// clang-format off
|
||||
&alux_store_op, &alux_store_op, &vector_alux_store_op, &vector_alux_store_op,
|
||||
&alux_store_op, &alux_store_op, &alux_store_op, &alux_store_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_80_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_80_mod3[8] = {
|
||||
// clang-format off
|
||||
&alux_op, &alux_op, &alux_store_op, &alux_store_op,
|
||||
&alux_op, &alux_op, &alux_op, &alux_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_8x[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_8x[8] = {
|
||||
// clang-format off
|
||||
&alu_store_op, &alu_store_op, &vector_alu_store_op, &vector_alu_store_op,
|
||||
&alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_8x_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_8x_mod3[8] = {
|
||||
// clang-format off
|
||||
&alu_op, &alu_op, &alu_store_op, &alu_store_op,
|
||||
&alu_op, &alu_op, &alu_op, &alu_op,
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_f6[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_f6[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
&test_mem_imm_b_op, INVALID, &vector_alux_store_op, &vector_alux_store_op,
|
||||
@@ -1425,7 +1425,7 @@ static const risc86_instruction_t *opcode_timings_f6[8] = {
|
||||
&vector_mul_mem_op, &vector_mul_mem_op, &vector_div16_mem_op, &vector_div16_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_f6_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_f6_mod3[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
&test_reg_b_op, INVALID, &alux_op, &alux_op,
|
||||
@@ -1433,7 +1433,7 @@ static const risc86_instruction_t *opcode_timings_f6_mod3[8] = {
|
||||
&vector_mul_op, &vector_mul_op, &vector_div16_op, &vector_div16_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_f7[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_f7[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
&test_mem_imm_op, INVALID, &vector_alu_store_op, &vector_alu_store_op,
|
||||
@@ -1441,7 +1441,7 @@ static const risc86_instruction_t *opcode_timings_f7[8] = {
|
||||
&vector_mul64_mem_op, &vector_mul64_mem_op, &vector_div32_mem_op, &vector_div32_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_f7_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_f7_mod3[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
&test_reg_op, INVALID, &alu_op, &alu_op,
|
||||
@@ -1449,7 +1449,7 @@ static const risc86_instruction_t *opcode_timings_f7_mod3[8] = {
|
||||
&vector_mul64_op, &vector_mul64_op, &vector_div32_op, &vector_div32_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_ff[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_ff[8] = {
|
||||
// clang-format off
|
||||
/* INC DEC CALL CALL far*/
|
||||
&alu_store_op, &alu_store_op, &store_op, &vector_call_far_op,
|
||||
@@ -1457,7 +1457,7 @@ static const risc86_instruction_t *opcode_timings_ff[8] = {
|
||||
&branch_op, &vector_jmp_far_op, &push_mem_op, INVALID
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_ff_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_ff_mod3[8] = {
|
||||
// clang-format off
|
||||
/* INC DEC CALL CALL far*/
|
||||
&vector_alu1_op, &vector_alu1_op, &store_op, &vector_call_far_op,
|
||||
@@ -1466,7 +1466,7 @@ static const risc86_instruction_t *opcode_timings_ff_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_d8[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_d8[8] = {
|
||||
// clang-format off
|
||||
/* FADDs FMULs FCOMs FCOMPs*/
|
||||
&load_float_op, &load_float_op, &load_float_op, &load_float_op,
|
||||
@@ -1474,7 +1474,7 @@ static const risc86_instruction_t *opcode_timings_d8[8] = {
|
||||
&load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_d8_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_d8_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOM FCOMP*/
|
||||
&float_op, &float_op, &float_op, &float_op,
|
||||
@@ -1483,7 +1483,7 @@ static const risc86_instruction_t *opcode_timings_d8_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_d9[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_d9[8] = {
|
||||
// clang-format off
|
||||
/* FLDs FSTs FSTPs*/
|
||||
&load_float_op, INVALID, &fstore_op, &fstore_op,
|
||||
@@ -1491,7 +1491,7 @@ static const risc86_instruction_t *opcode_timings_d9[8] = {
|
||||
&vector_float_l_op, &vector_fldcw_op, &vector_float_l_op, &vector_float_op
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_d9_mod3[64] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_d9_mod3[64] = {
|
||||
// clang-format off
|
||||
/*FLD*/
|
||||
&float_op, &float_op, &float_op, &float_op,
|
||||
@@ -1524,7 +1524,7 @@ static const risc86_instruction_t *opcode_timings_d9_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_da[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_da[8] = {
|
||||
// clang-format off
|
||||
/* FIADDl FIMULl FICOMl FICOMPl*/
|
||||
&load_float_op, &load_float_op, &load_float_op, &load_float_op,
|
||||
@@ -1532,7 +1532,7 @@ static const risc86_instruction_t *opcode_timings_da[8] = {
|
||||
&load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_da_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_da_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FCOMPP*/
|
||||
@@ -1540,7 +1540,7 @@ static const risc86_instruction_t *opcode_timings_da_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_db[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_db[8] = {
|
||||
// clang-format off
|
||||
/* FLDil FSTil FSTPil*/
|
||||
&load_float_op, INVALID, &fstore_op, &fstore_op,
|
||||
@@ -1548,7 +1548,7 @@ static const risc86_instruction_t *opcode_timings_db[8] = {
|
||||
INVALID, &vector_flde_op, INVALID, &vector_fste_op
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_db_mod3[64] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_db_mod3[64] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
@@ -1578,7 +1578,7 @@ static const risc86_instruction_t *opcode_timings_db_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_dc[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_dc[8] = {
|
||||
// clang-format off
|
||||
/* FADDd FMULd FCOMd FCOMPd*/
|
||||
&load_float_op, &load_float_op, &load_float_op, &load_float_op,
|
||||
@@ -1586,7 +1586,7 @@ static const risc86_instruction_t *opcode_timings_dc[8] = {
|
||||
&load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_dc_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_dc_mod3[8] = {
|
||||
// clang-format off
|
||||
/* opFADDr opFMULr*/
|
||||
&float_op, &float_op, INVALID, INVALID,
|
||||
@@ -1595,7 +1595,7 @@ static const risc86_instruction_t *opcode_timings_dc_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_dd[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_dd[8] = {
|
||||
// clang-format off
|
||||
/* FLDd FSTd FSTPd*/
|
||||
&load_float_op, INVALID, &fstore_op, &fstore_op,
|
||||
@@ -1603,7 +1603,7 @@ static const risc86_instruction_t *opcode_timings_dd[8] = {
|
||||
&vector_float_l_op, INVALID, &vector_float_l_op, &vector_float_l_op
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_dd_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_dd_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFFREE FST FSTP*/
|
||||
&float_op, INVALID, &float_op, &float_op,
|
||||
@@ -1612,7 +1612,7 @@ static const risc86_instruction_t *opcode_timings_dd_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_de[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_de[8] = {
|
||||
// clang-format off
|
||||
/* FIADDw FIMULw FICOMw FICOMPw*/
|
||||
&load_float_op, &load_float_op, &load_float_op, &load_float_op,
|
||||
@@ -1620,7 +1620,7 @@ static const risc86_instruction_t *opcode_timings_de[8] = {
|
||||
&load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_de_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_de_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADDP FMULP FCOMPP*/
|
||||
&float_op, &float_op, INVALID, &float_op,
|
||||
@@ -1629,7 +1629,7 @@ static const risc86_instruction_t *opcode_timings_de_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const risc86_instruction_t *opcode_timings_df[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_df[8] = {
|
||||
// clang-format off
|
||||
/* FILDiw FISTiw FISTPiw*/
|
||||
&load_float_op, INVALID, &fstore_op, &fstore_op,
|
||||
@@ -1637,7 +1637,7 @@ static const risc86_instruction_t *opcode_timings_df[8] = {
|
||||
INVALID, &load_float_op, &vector_float_l_op, &fstore_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const risc86_instruction_t *opcode_timings_df_mod3[8] = {
|
||||
static const risc86_instruction_t *opcode_timings_k6_df_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FSTSW AX*/
|
||||
@@ -1769,7 +1769,7 @@ static int fpu_st_timestamp[8];
|
||||
static int last_uop_timestamp = 0;
|
||||
|
||||
void
|
||||
decode_flush(void)
|
||||
decode_flush_k6(void)
|
||||
{
|
||||
int uop_timestamp = 0;
|
||||
|
||||
@@ -1908,7 +1908,7 @@ decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetc
|
||||
}
|
||||
decode_buffer.nr_uops += ins->nr_uops;
|
||||
|
||||
decode_flush();
|
||||
decode_flush_k6();
|
||||
} else {
|
||||
decode_buffer.nr_uops = ins->nr_uops;
|
||||
decode_buffer.uops[0] = &ins->uop[0];
|
||||
@@ -1922,7 +1922,7 @@ decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetc
|
||||
|
||||
case DECODE_LONG:
|
||||
if (decode_buffer.nr_uops)
|
||||
decode_flush();
|
||||
decode_flush_k6();
|
||||
|
||||
decode_buffer.nr_uops = ins->nr_uops;
|
||||
for (c = 0; c < ins->nr_uops; c++) {
|
||||
@@ -1932,12 +1932,12 @@ decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetc
|
||||
else
|
||||
decode_buffer.earliest_start[c] = -1;
|
||||
}
|
||||
decode_flush();
|
||||
decode_flush_k6();
|
||||
break;
|
||||
|
||||
case DECODE_VECTOR:
|
||||
if (decode_buffer.nr_uops)
|
||||
decode_flush();
|
||||
decode_flush_k6();
|
||||
|
||||
decode_timestamp++;
|
||||
d = 0;
|
||||
@@ -1953,12 +1953,12 @@ decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetc
|
||||
if (d == 4) {
|
||||
d = 0;
|
||||
decode_buffer.nr_uops = 4;
|
||||
decode_flush();
|
||||
decode_flush_k6();
|
||||
}
|
||||
}
|
||||
if (d) {
|
||||
decode_buffer.nr_uops = d;
|
||||
decode_flush();
|
||||
decode_flush_k6();
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2094,51 +2094,51 @@ codegen_timing_k6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t
|
||||
|
||||
opcode = fastreadb(cs + opcode_pc);
|
||||
|
||||
ins_table = mod3 ? opcode_timings_0f0f_mod3 : opcode_timings_0f0f;
|
||||
ins_table = mod3 ? opcode_timings_k6_0f0f_mod3 : opcode_timings_k6_0f0f;
|
||||
deps = mod3 ? opcode_deps_0f0f_mod3 : opcode_deps_0f0f;
|
||||
} else {
|
||||
ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||
ins_table = mod3 ? opcode_timings_k6_0f_mod3 : opcode_timings_k6_0f;
|
||||
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xd8:
|
||||
ins_table = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||
ins_table = mod3 ? opcode_timings_k6_d8_mod3 : opcode_timings_k6_d8;
|
||||
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xd9:
|
||||
ins_table = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||
ins_table = mod3 ? opcode_timings_k6_d9_mod3 : opcode_timings_k6_d9;
|
||||
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xda:
|
||||
ins_table = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||
ins_table = mod3 ? opcode_timings_k6_da_mod3 : opcode_timings_k6_da;
|
||||
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdb:
|
||||
ins_table = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||
ins_table = mod3 ? opcode_timings_k6_db_mod3 : opcode_timings_k6_db;
|
||||
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdc:
|
||||
ins_table = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||
ins_table = mod3 ? opcode_timings_k6_dc_mod3 : opcode_timings_k6_dc;
|
||||
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdd:
|
||||
ins_table = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||
ins_table = mod3 ? opcode_timings_k6_dd_mod3 : opcode_timings_k6_dd;
|
||||
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xde:
|
||||
ins_table = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||
ins_table = mod3 ? opcode_timings_k6_de_mod3 : opcode_timings_k6_de;
|
||||
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdf:
|
||||
ins_table = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||
ins_table = mod3 ? opcode_timings_k6_df_mod3 : opcode_timings_k6_df;
|
||||
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
@@ -2147,13 +2147,13 @@ codegen_timing_k6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t
|
||||
switch (opcode) {
|
||||
case 0x80:
|
||||
case 0x82:
|
||||
ins_table = mod3 ? opcode_timings_80_mod3 : opcode_timings_80;
|
||||
ins_table = mod3 ? opcode_timings_k6_80_mod3 : opcode_timings_k6_80;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0x81:
|
||||
case 0x83:
|
||||
ins_table = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||
ins_table = mod3 ? opcode_timings_k6_8x_mod3 : opcode_timings_k6_8x;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
@@ -2161,7 +2161,7 @@ codegen_timing_k6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t
|
||||
case 0xc0:
|
||||
case 0xd0:
|
||||
case 0xd2:
|
||||
ins_table = mod3 ? opcode_timings_shift_b_mod3 : opcode_timings_shift_b;
|
||||
ins_table = mod3 ? opcode_timings_k6_shift_b_mod3 : opcode_timings_k6_shift_b;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
@@ -2169,29 +2169,29 @@ codegen_timing_k6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t
|
||||
case 0xc1:
|
||||
case 0xd1:
|
||||
case 0xd3:
|
||||
ins_table = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||
ins_table = mod3 ? opcode_timings_k6_shift_mod3 : opcode_timings_k6_shift;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xf6:
|
||||
ins_table = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||
ins_table = mod3 ? opcode_timings_k6_f6_mod3 : opcode_timings_k6_f6;
|
||||
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xf7:
|
||||
ins_table = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||
ins_table = mod3 ? opcode_timings_k6_f7_mod3 : opcode_timings_k6_f7;
|
||||
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xff:
|
||||
ins_table = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||
ins_table = mod3 ? opcode_timings_k6_ff_mod3 : opcode_timings_k6_ff;
|
||||
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
ins_table = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||
ins_table = mod3 ? opcode_timings_k6_mod3 : opcode_timings_k6;
|
||||
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||
break;
|
||||
}
|
||||
@@ -2209,7 +2209,7 @@ codegen_timing_k6_block_end(void)
|
||||
{
|
||||
if (decode_buffer.nr_uops) {
|
||||
int old_last_complete_timestamp = last_complete_timestamp;
|
||||
decode_flush();
|
||||
decode_flush_k6();
|
||||
codegen_block_cycles += (last_complete_timestamp - old_last_complete_timestamp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -787,7 +787,7 @@ static const macro_op_t wbinvd_op = {
|
||||
};
|
||||
#define INVALID NULL
|
||||
|
||||
static const macro_op_t *opcode_timings[256] = {
|
||||
static const macro_op_t *opcode_timings_p6[256] = {
|
||||
// clang-format off
|
||||
/* ADD ADD ADD ADD*/
|
||||
/*00*/ &alup0_store_op, &alu_store_op, &load_alup0_op, &load_alu_op,
|
||||
@@ -924,7 +924,7 @@ static const macro_op_t *opcode_timings[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_mod3[256] = {
|
||||
static const macro_op_t *opcode_timings_p6_mod3[256] = {
|
||||
// clang-format off
|
||||
/* ADD ADD ADD ADD*/
|
||||
/*00*/ &alup0_op, &alu_op, &alup0_op, &alu_op,
|
||||
@@ -1062,7 +1062,7 @@ static const macro_op_t *opcode_timings_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_0f[256] = {
|
||||
static const macro_op_t *opcode_timings_p6_0f[256] = {
|
||||
// clang-format off
|
||||
/*00*/ &alu6_op, &alu6_op, &alu6_op, &alu6_op,
|
||||
INVALID, &alu6_op, &alu6_op, INVALID,
|
||||
@@ -1145,7 +1145,7 @@ static const macro_op_t *opcode_timings_0f[256] = {
|
||||
&load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_0f_mod3[256] = {
|
||||
static const macro_op_t *opcode_timings_p6_0f_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ &alu6_op, &alu6_op, &alu6_op, &alu6_op,
|
||||
INVALID, &alu6_op, &alu6_op, INVALID,
|
||||
@@ -1228,58 +1228,58 @@ static const macro_op_t *opcode_timings_0f_mod3[256] = {
|
||||
&mmx_op, &mmx_op, &mmx_op, INVALID,
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_shift[8] =
|
||||
static const macro_op_t *opcode_timings_p6_shift[8] =
|
||||
{
|
||||
// clang-format off
|
||||
&alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op,
|
||||
&alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_shift_b[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_shift_b[8] = {
|
||||
// clang-format off
|
||||
&alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op,
|
||||
&alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_shift_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_shift_mod3[8] = {
|
||||
// clang-format off
|
||||
&complex_alu1_op, &complex_alu1_op, &complex_alu1_op, &complex_alu1_op,
|
||||
&alu_op, &alu_op, &alu_op, &alu_op
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_shift_b_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_shift_b_mod3[8] = {
|
||||
// clang-format off
|
||||
&complex_alup0_1_op, &complex_alup0_1_op, &complex_alup0_1_op, &complex_alup0_1_op,
|
||||
&alup0_op, &alup0_op, &alup0_op, &alup0_op
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_80[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_80[8] = {
|
||||
// clang-format off
|
||||
&alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op,
|
||||
&alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_80_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_80_mod3[8] = {
|
||||
// clang-format off
|
||||
&alup0_op, &alup0_op, &alup0_store_op, &alup0_store_op,
|
||||
&alup0_op, &alup0_op, &alup0_op, &alup0_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_8x[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_8x[8] = {
|
||||
// clang-format off
|
||||
&alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op,
|
||||
&alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_8x_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_8x_mod3[8] = {
|
||||
// clang-format off
|
||||
&alu_op, &alu_op, &alu_store_op, &alu_store_op,
|
||||
&alu_op, &alu_op, &alu_op, &alu_op,
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_f6[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_f6[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
&test_mem_imm_b_op, INVALID, &alup0_store_op, &alup0_store_op,
|
||||
@@ -1287,7 +1287,7 @@ static const macro_op_t *opcode_timings_f6[8] = {
|
||||
&mul_mem_op, &mul_mem_op, &div16_mem_op, &div16_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_f6_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_f6_mod3[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
&test_reg_b_op, INVALID, &alup0_op, &alup0_op,
|
||||
@@ -1295,7 +1295,7 @@ static const macro_op_t *opcode_timings_f6_mod3[8] = {
|
||||
&mul_op, &mul_op, &div16_op, &div16_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_f7[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_f7[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
&test_mem_imm_op, INVALID, &alu_store_op, &alu_store_op,
|
||||
@@ -1303,7 +1303,7 @@ static const macro_op_t *opcode_timings_f7[8] = {
|
||||
&mul64_mem_op, &mul64_mem_op, &div32_mem_op, &div32_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_f7_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_f7_mod3[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
&test_reg_op, INVALID, &alu_op, &alu_op,
|
||||
@@ -1311,7 +1311,7 @@ static const macro_op_t *opcode_timings_f7_mod3[8] = {
|
||||
&mul64_op, &mul64_op, &div32_op, &div32_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_ff[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_ff[8] = {
|
||||
// clang-format off
|
||||
/* INC DEC CALL CALL far*/
|
||||
&alu_store_op, &alu_store_op, &store_op, &call_far_op,
|
||||
@@ -1319,7 +1319,7 @@ static const macro_op_t *opcode_timings_ff[8] = {
|
||||
&branch_op, &jmp_far_op, &push_mem_op, INVALID
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_ff_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_ff_mod3[8] = {
|
||||
// clang-format off
|
||||
/* INC DEC CALL CALL far*/
|
||||
&complex_alu1_op, &complex_alu1_op, &store_op, &call_far_op,
|
||||
@@ -1328,7 +1328,7 @@ static const macro_op_t *opcode_timings_ff_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_d8[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_d8[8] = {
|
||||
// clang-format off
|
||||
/* FADDs FMULs FCOMs FCOMPs*/
|
||||
&load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op,
|
||||
@@ -1336,7 +1336,7 @@ static const macro_op_t *opcode_timings_d8[8] = {
|
||||
&load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_d8_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_d8_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOM FCOMP*/
|
||||
&fadd_op, &fmul_op, &float_op, &float_op,
|
||||
@@ -1345,7 +1345,7 @@ static const macro_op_t *opcode_timings_d8_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_d9[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_d9[8] = {
|
||||
// clang-format off
|
||||
/* FLDs FSTs FSTPs*/
|
||||
&load_float_op, INVALID, &fstore_op, &fstore_op,
|
||||
@@ -1353,7 +1353,7 @@ static const macro_op_t *opcode_timings_d9[8] = {
|
||||
&complex_float_l_op, &fldcw_op, &complex_float_l_op, &complex_float_op
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_d9_mod3[64] = {
|
||||
static const macro_op_t *opcode_timings_p6_d9_mod3[64] = {
|
||||
// clang-format off
|
||||
/*FLD*/
|
||||
&float_op, &float_op, &float_op, &float_op,
|
||||
@@ -1386,7 +1386,7 @@ static const macro_op_t *opcode_timings_d9_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_da[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_da[8] = {
|
||||
// clang-format off
|
||||
/* FIADDl FIMULl FICOMl FICOMPl*/
|
||||
&load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op,
|
||||
@@ -1394,7 +1394,7 @@ static const macro_op_t *opcode_timings_da[8] = {
|
||||
&load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_da_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_da_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FCOMPP*/
|
||||
@@ -1402,7 +1402,7 @@ static const macro_op_t *opcode_timings_da_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_db[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_db[8] = {
|
||||
// clang-format off
|
||||
/* FLDil FSTil FSTPil*/
|
||||
&load_float_op, INVALID, &fstore_op, &fstore_op,
|
||||
@@ -1410,7 +1410,7 @@ static const macro_op_t *opcode_timings_db[8] = {
|
||||
INVALID, &flde_op, INVALID, &fste_op
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_db_mod3[64] = {
|
||||
static const macro_op_t *opcode_timings_p6_db_mod3[64] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
@@ -1440,7 +1440,7 @@ static const macro_op_t *opcode_timings_db_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_dc[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_dc[8] = {
|
||||
// clang-format off
|
||||
/* FADDd FMULd FCOMd FCOMPd*/
|
||||
&load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op,
|
||||
@@ -1448,7 +1448,7 @@ static const macro_op_t *opcode_timings_dc[8] = {
|
||||
&load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_dc_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_dc_mod3[8] = {
|
||||
// clang-format off
|
||||
/* opFADDr opFMULr*/
|
||||
&fadd_op, &fmul_op, INVALID, INVALID,
|
||||
@@ -1457,7 +1457,7 @@ static const macro_op_t *opcode_timings_dc_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_dd[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_dd[8] = {
|
||||
// clang-format off
|
||||
/* FLDd FSTd FSTPd*/
|
||||
&load_float_op, INVALID, &fstore_op, &fstore_op,
|
||||
@@ -1465,7 +1465,7 @@ static const macro_op_t *opcode_timings_dd[8] = {
|
||||
&complex_float_l_op, INVALID, &complex_float_l_op, &complex_float_l_op
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_dd_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_dd_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFFREE FST FSTP*/
|
||||
&float_op, INVALID, &float_op, &float_op,
|
||||
@@ -1474,7 +1474,7 @@ static const macro_op_t *opcode_timings_dd_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_de[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_de[8] = {
|
||||
// clang-format off
|
||||
/* FIADDw FIMULw FICOMw FICOMPw*/
|
||||
&load_fiadd_op, &load_fiadd_op, &load_fiadd_op, &load_fiadd_op,
|
||||
@@ -1482,7 +1482,7 @@ static const macro_op_t *opcode_timings_de[8] = {
|
||||
&load_fiadd_op, &load_fiadd_op, &load_fiadd_op, &load_fiadd_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_de_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_de_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADDP FMULP FCOMPP*/
|
||||
&fadd_op, &fmul_op, INVALID, &float_op,
|
||||
@@ -1491,7 +1491,7 @@ static const macro_op_t *opcode_timings_de_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static const macro_op_t *opcode_timings_df[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_df[8] = {
|
||||
// clang-format off
|
||||
/* FILDiw FISTiw FISTPiw*/
|
||||
&load_float_op, INVALID, &fstore_op, &fstore_op,
|
||||
@@ -1499,7 +1499,7 @@ static const macro_op_t *opcode_timings_df[8] = {
|
||||
INVALID, &load_float_op, &complex_float_l_op, &fstore_op,
|
||||
// clang-format on
|
||||
};
|
||||
static const macro_op_t *opcode_timings_df_mod3[8] = {
|
||||
static const macro_op_t *opcode_timings_p6_df_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FSTSW AX*/
|
||||
@@ -1865,47 +1865,47 @@ codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(ui
|
||||
|
||||
switch (last_prefix) {
|
||||
case 0x0f:
|
||||
ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||
ins_table = mod3 ? opcode_timings_p6_0f_mod3 : opcode_timings_p6_0f;
|
||||
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||
break;
|
||||
|
||||
case 0xd8:
|
||||
ins_table = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||
ins_table = mod3 ? opcode_timings_p6_d8_mod3 : opcode_timings_p6_d8;
|
||||
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xd9:
|
||||
ins_table = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||
ins_table = mod3 ? opcode_timings_p6_d9_mod3 : opcode_timings_p6_d9;
|
||||
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xda:
|
||||
ins_table = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||
ins_table = mod3 ? opcode_timings_p6_da_mod3 : opcode_timings_p6_da;
|
||||
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdb:
|
||||
ins_table = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||
ins_table = mod3 ? opcode_timings_p6_db_mod3 : opcode_timings_p6_db;
|
||||
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdc:
|
||||
ins_table = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||
ins_table = mod3 ? opcode_timings_p6_dc_mod3 : opcode_timings_p6_dc;
|
||||
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdd:
|
||||
ins_table = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||
ins_table = mod3 ? opcode_timings_p6_dd_mod3 : opcode_timings_p6_dd;
|
||||
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xde:
|
||||
ins_table = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||
ins_table = mod3 ? opcode_timings_p6_de_mod3 : opcode_timings_p6_de;
|
||||
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdf:
|
||||
ins_table = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||
ins_table = mod3 ? opcode_timings_p6_df_mod3 : opcode_timings_p6_df;
|
||||
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
@@ -1914,13 +1914,13 @@ codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(ui
|
||||
switch (opcode) {
|
||||
case 0x80:
|
||||
case 0x82:
|
||||
ins_table = mod3 ? opcode_timings_80_mod3 : opcode_timings_80;
|
||||
ins_table = mod3 ? opcode_timings_p6_80_mod3 : opcode_timings_p6_80;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0x81:
|
||||
case 0x83:
|
||||
ins_table = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||
ins_table = mod3 ? opcode_timings_p6_8x_mod3 : opcode_timings_p6_8x;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
@@ -1928,7 +1928,7 @@ codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(ui
|
||||
case 0xc0:
|
||||
case 0xd0:
|
||||
case 0xd2:
|
||||
ins_table = mod3 ? opcode_timings_shift_b_mod3 : opcode_timings_shift_b;
|
||||
ins_table = mod3 ? opcode_timings_p6_shift_b_mod3 : opcode_timings_p6_shift_b;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
@@ -1936,29 +1936,29 @@ codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(ui
|
||||
case 0xc1:
|
||||
case 0xd1:
|
||||
case 0xd3:
|
||||
ins_table = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||
ins_table = mod3 ? opcode_timings_p6_shift_mod3 : opcode_timings_p6_shift;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xf6:
|
||||
ins_table = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||
ins_table = mod3 ? opcode_timings_p6_f6_mod3 : opcode_timings_p6_f6;
|
||||
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xf7:
|
||||
ins_table = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||
ins_table = mod3 ? opcode_timings_p6_f7_mod3 : opcode_timings_p6_f7;
|
||||
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xff:
|
||||
ins_table = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||
ins_table = mod3 ? opcode_timings_p6_ff_mod3 : opcode_timings_p6_ff;
|
||||
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
ins_table = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||
ins_table = mod3 ? opcode_timings_p6_mod3 : opcode_timings_p6;
|
||||
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ static uint32_t addr_regmask;
|
||||
static int fpu_latency;
|
||||
static int fpu_st_latency[8];
|
||||
|
||||
static uint64_t opcode_timings[256] = {
|
||||
static uint64_t opcode_timings_p6[256] = {
|
||||
// clang-format off
|
||||
/* ADD ADD ADD ADD*/
|
||||
/*00*/ PAIR_UV | CYCLES_RMW, PAIR_UV | CYCLES_RMW, PAIR_UV | CYCLES_RM, PAIR_UV | CYCLES_RM,
|
||||
@@ -247,7 +247,7 @@ static uint64_t opcode_timings[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_mod3[256] = {
|
||||
static uint64_t opcode_timings_p6_mod3[256] = {
|
||||
// clang-format off
|
||||
/* ADD ADD ADD ADD*/
|
||||
/*00*/ PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG,
|
||||
@@ -385,7 +385,7 @@ static uint64_t opcode_timings_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_0f[256] = {
|
||||
static uint64_t opcode_timings_p6_0f[256] = {
|
||||
// clang-format off
|
||||
/*00*/ PAIR_NP | CYCLES(20), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(10),
|
||||
INVALID, PAIR_NP | CYCLES(195), PAIR_NP | CYCLES(7), INVALID,
|
||||
@@ -468,7 +468,7 @@ static uint64_t opcode_timings_0f[256] = {
|
||||
PAIR_U | CYCLES_RM, PAIR_U | CYCLES_RM, PAIR_U | CYCLES_RM, INVALID,
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_0f_mod3[256] = {
|
||||
static uint64_t opcode_timings_p6_0f_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ PAIR_NP | CYCLES(20), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(10),
|
||||
INVALID, PAIR_NP | CYCLES(195), PAIR_NP | CYCLES(7), INVALID,
|
||||
@@ -552,20 +552,20 @@ static uint64_t opcode_timings_0f_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_shift[8] = {
|
||||
static uint64_t opcode_timings_p6_shift[8] = {
|
||||
// clang-format off
|
||||
PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW,
|
||||
PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW,
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_shift_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_shift_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG,
|
||||
PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG,
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_f6[8] = {
|
||||
static uint64_t opcode_timings_p6_f6[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
PAIR_UV | CYCLES_RM, INVALID, PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3),
|
||||
@@ -573,7 +573,7 @@ static uint64_t opcode_timings_f6[8] = {
|
||||
PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(17), PAIR_NP | CYCLES(22)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_f6_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_f6_mod3[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
PAIR_UV | CYCLES_REG, INVALID, PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3),
|
||||
@@ -581,7 +581,7 @@ static uint64_t opcode_timings_f6_mod3[8] = {
|
||||
PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(17), PAIR_NP | CYCLES(22)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_f7[8] = {
|
||||
static uint64_t opcode_timings_p6_f7[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
PAIR_UV | CYCLES_RM, INVALID, PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3),
|
||||
@@ -589,7 +589,7 @@ static uint64_t opcode_timings_f7[8] = {
|
||||
PAIR_NP | CYCLES_MULTI(11,10), PAIR_NP | CYCLES_MULTI(11,10), PAIR_NP | CYCLES_MULTI(25,41), PAIR_NP | CYCLES_MULTI(30,46)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_f7_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_f7_mod3[8] = {
|
||||
// clang-format off
|
||||
/* TST NOT NEG*/
|
||||
PAIR_UV | CYCLES_REG, INVALID, PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3),
|
||||
@@ -597,7 +597,7 @@ static uint64_t opcode_timings_f7_mod3[8] = {
|
||||
PAIR_NP | CYCLES_MULTI(11,10), PAIR_NP | CYCLES_MULTI(11,10), PAIR_NP | CYCLES_MULTI(25,41), PAIR_NP | CYCLES_MULTI(30,46)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_ff[8] = {
|
||||
static uint64_t opcode_timings_p6_ff[8] = {
|
||||
// clang-format off
|
||||
/* INC DEC CALL CALL far*/
|
||||
PAIR_UV | CYCLES_RMW, PAIR_UV | CYCLES_RMW, PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(0),
|
||||
@@ -605,7 +605,7 @@ static uint64_t opcode_timings_ff[8] = {
|
||||
PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(0), PAIR_NP | CYCLES(2), INVALID
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_ff_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_ff_mod3[8] = {
|
||||
// clang-format off
|
||||
/* INC DEC CALL CALL far*/
|
||||
PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(0),
|
||||
@@ -614,7 +614,7 @@ static uint64_t opcode_timings_ff_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_d8[8] = {
|
||||
static uint64_t opcode_timings_p6_d8[8] = {
|
||||
// clang-format off
|
||||
/* FADDs FMULs FCOMs FCOMPs*/
|
||||
PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0),
|
||||
@@ -622,7 +622,7 @@ static uint64_t opcode_timings_d8[8] = {
|
||||
PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(39,38,2), PAIR_FX | FPU_CYCLES(39,38,2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_d8_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_d8_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOM FCOMP*/
|
||||
PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0),
|
||||
@@ -631,7 +631,7 @@ static uint64_t opcode_timings_d8_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_d9[8] = {
|
||||
static uint64_t opcode_timings_p6_d9[8] = {
|
||||
// clang-format off
|
||||
/* FLDs FSTs FSTPs*/
|
||||
PAIR_FX | FPU_CYCLES(1,0,0), INVALID, PAIR_NP | FPU_CYCLES(2,0,0), PAIR_NP | FPU_CYCLES(2,0,0),
|
||||
@@ -639,7 +639,7 @@ static uint64_t opcode_timings_d9[8] = {
|
||||
PAIR_NP | FPU_CYCLES(32,0,0), PAIR_NP | FPU_CYCLES(8,0,0), PAIR_NP | FPU_CYCLES(48,0,0), PAIR_NP | FPU_CYCLES(2,0,0)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_d9_mod3[64] = {
|
||||
static uint64_t opcode_timings_p6_d9_mod3[64] = {
|
||||
// clang-format off
|
||||
/*FLD*/
|
||||
PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0),
|
||||
@@ -672,7 +672,7 @@ static uint64_t opcode_timings_d9_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_da[8] = {
|
||||
static uint64_t opcode_timings_p6_da[8] = {
|
||||
// clang-format off
|
||||
/* FIADDl FIMULl FICOMl FICOMPl*/
|
||||
PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(4,0,0), PAIR_NP | FPU_CYCLES(4,0,0),
|
||||
@@ -680,7 +680,7 @@ static uint64_t opcode_timings_da[8] = {
|
||||
PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(42,38,2), PAIR_NP | FPU_CYCLES(42,38,2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_da_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_da_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FCOMPP*/
|
||||
@@ -688,7 +688,7 @@ static uint64_t opcode_timings_da_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_db[8] = {
|
||||
static uint64_t opcode_timings_p6_db[8] = {
|
||||
// clang-format off
|
||||
/* FLDil FSTil FSTPil*/
|
||||
PAIR_NP | FPU_CYCLES(3,2,2), INVALID, PAIR_NP | FPU_CYCLES(6,0,0), PAIR_NP | FPU_CYCLES(6,0,0),
|
||||
@@ -696,7 +696,7 @@ static uint64_t opcode_timings_db[8] = {
|
||||
INVALID, PAIR_NP | FPU_CYCLES(3,0,0), INVALID, PAIR_NP | FPU_CYCLES(3,0,0)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_db_mod3[64] = {
|
||||
static uint64_t opcode_timings_p6_db_mod3[64] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
@@ -726,7 +726,7 @@ static uint64_t opcode_timings_db_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_dc[8] = {
|
||||
static uint64_t opcode_timings_p6_dc[8] = {
|
||||
// clang-format off
|
||||
/* FADDd FMULd FCOMd FCOMPd*/
|
||||
PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0),
|
||||
@@ -734,7 +734,7 @@ static uint64_t opcode_timings_dc[8] = {
|
||||
PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(39,38,2), PAIR_FX | FPU_CYCLES(39,38,2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_dc_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_dc_mod3[8] = {
|
||||
// clang-format off
|
||||
/* opFADDr opFMULr*/
|
||||
PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), INVALID, INVALID,
|
||||
@@ -743,7 +743,7 @@ static uint64_t opcode_timings_dc_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_dd[8] = {
|
||||
static uint64_t opcode_timings_p6_dd[8] = {
|
||||
// clang-format off
|
||||
/* FLDd FSTd FSTPd*/
|
||||
PAIR_FX | FPU_CYCLES(1,0,0), INVALID, PAIR_NP | FPU_CYCLES(2,0,0), PAIR_NP | FPU_CYCLES(2,0,0),
|
||||
@@ -751,7 +751,7 @@ static uint64_t opcode_timings_dd[8] = {
|
||||
PAIR_NP | FPU_CYCLES(70,0,0), INVALID, PAIR_NP | FPU_CYCLES(127,0,0), PAIR_NP | FPU_CYCLES(6,0,0)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_dd_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_dd_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFFREE FST FSTP*/
|
||||
PAIR_NP | FPU_CYCLES(2,0,0), INVALID, PAIR_NP | FPU_CYCLES(1,0,0), PAIR_NP | FPU_CYCLES(1,0,0),
|
||||
@@ -760,7 +760,7 @@ static uint64_t opcode_timings_dd_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_de[8] = {
|
||||
static uint64_t opcode_timings_p6_de[8] = {
|
||||
// clang-format off
|
||||
/* FIADDw FIMULw FICOMw FICOMPw*/
|
||||
PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(4,0,0), PAIR_NP | FPU_CYCLES(4,0,0),
|
||||
@@ -768,7 +768,7 @@ static uint64_t opcode_timings_de[8] = {
|
||||
PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(42,38,2), PAIR_NP | FPU_CYCLES(42,38,2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_de_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_de_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADDP FMULP FCOMPP*/
|
||||
PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), INVALID, PAIR_FX | FPU_CYCLES(1,0,0),
|
||||
@@ -777,7 +777,7 @@ static uint64_t opcode_timings_de_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_df[8] = {
|
||||
static uint64_t opcode_timings_p6_df[8] = {
|
||||
// clang-format off
|
||||
/* FILDiw FISTiw FISTPiw*/
|
||||
PAIR_NP | FPU_CYCLES(3,2,2), INVALID, PAIR_NP | FPU_CYCLES(6,0,0), PAIR_NP | FPU_CYCLES(6,0,0),
|
||||
@@ -785,7 +785,7 @@ static uint64_t opcode_timings_df[8] = {
|
||||
INVALID, PAIR_NP | FPU_CYCLES(3,2,2), PAIR_NP | FPU_CYCLES(148,0,0), PAIR_NP | FPU_CYCLES(6,0,0)
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_df_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_df_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FSTSW AX*/
|
||||
@@ -793,25 +793,25 @@ static uint64_t opcode_timings_df_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint64_t opcode_timings_81[8] = {
|
||||
static uint64_t opcode_timings_p6_81[8] = {
|
||||
// clang-format off
|
||||
PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632,
|
||||
PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RM | CYCLES_IMM1632
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_81_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_81_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG,
|
||||
PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_8x[8] = {
|
||||
static uint64_t opcode_timings_p6_8x[8] = {
|
||||
// clang-format off
|
||||
PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8,
|
||||
PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RM | CYCLES_IMM8
|
||||
// clang-format on
|
||||
};
|
||||
static uint64_t opcode_timings_8x_mod3[8] = {
|
||||
static uint64_t opcode_timings_p6_8x_mod3[8] = {
|
||||
// clang-format off
|
||||
PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG,
|
||||
PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG
|
||||
@@ -1097,47 +1097,47 @@ codegen_timing_pentium_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS
|
||||
|
||||
switch (last_prefix) {
|
||||
case 0x0f:
|
||||
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||
timings = mod3 ? opcode_timings_p6_0f_mod3 : opcode_timings_p6_0f;
|
||||
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||
break;
|
||||
|
||||
case 0xd8:
|
||||
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||
timings = mod3 ? opcode_timings_p6_d8_mod3 : opcode_timings_p6_d8;
|
||||
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xd9:
|
||||
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||
timings = mod3 ? opcode_timings_p6_d9_mod3 : opcode_timings_p6_d9;
|
||||
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xda:
|
||||
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||
timings = mod3 ? opcode_timings_p6_da_mod3 : opcode_timings_p6_da;
|
||||
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdb:
|
||||
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||
timings = mod3 ? opcode_timings_p6_db_mod3 : opcode_timings_p6_db;
|
||||
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdc:
|
||||
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||
timings = mod3 ? opcode_timings_p6_dc_mod3 : opcode_timings_p6_dc;
|
||||
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdd:
|
||||
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||
timings = mod3 ? opcode_timings_p6_dd_mod3 : opcode_timings_p6_dd;
|
||||
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xde:
|
||||
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||
timings = mod3 ? opcode_timings_p6_de_mod3 : opcode_timings_p6_de;
|
||||
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdf:
|
||||
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||
timings = mod3 ? opcode_timings_p6_df_mod3 : opcode_timings_p6_df;
|
||||
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
@@ -1147,12 +1147,12 @@ codegen_timing_pentium_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS
|
||||
case 0x80:
|
||||
case 0x82:
|
||||
case 0x83:
|
||||
timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||
timings = mod3 ? opcode_timings_p6_8x_mod3 : opcode_timings_p6_8x;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0x81:
|
||||
timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81;
|
||||
timings = mod3 ? opcode_timings_p6_81_mod3 : opcode_timings_p6_81;
|
||||
deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
@@ -1161,36 +1161,36 @@ codegen_timing_pentium_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS
|
||||
case 0xc1:
|
||||
case 0xd0:
|
||||
case 0xd1:
|
||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||
timings = mod3 ? opcode_timings_p6_shift_mod3 : opcode_timings_p6_shift;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xd2:
|
||||
case 0xd3:
|
||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||
timings = mod3 ? opcode_timings_p6_shift_mod3 : opcode_timings_p6_shift;
|
||||
deps = mod3 ? opcode_deps_shift_cl_mod3 : opcode_deps_shift_cl;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xf6:
|
||||
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||
timings = mod3 ? opcode_timings_p6_f6_mod3 : opcode_timings_p6_f6;
|
||||
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xf7:
|
||||
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||
timings = mod3 ? opcode_timings_p6_f7_mod3 : opcode_timings_p6_f7;
|
||||
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xff:
|
||||
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||
timings = mod3 ? opcode_timings_p6_ff_mod3 : opcode_timings_p6_ff;
|
||||
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||
timings = mod3 ? opcode_timings_p6_mod3 : opcode_timings_p6;
|
||||
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#define CYCLES(c) (int *) c
|
||||
#define CYCLES2(c16, c32) (int *) ((-1 & ~0xffff) | c16 | (c32 << 8))
|
||||
|
||||
static int *opcode_timings[256] = {
|
||||
static int *opcode_timings_winchip[256] = {
|
||||
// clang-format off
|
||||
/*00*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), NULL,
|
||||
/*10*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3),
|
||||
@@ -42,7 +42,7 @@ static int *opcode_timings[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_mod3[256] = {
|
||||
static int *opcode_timings_winchip_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), NULL,
|
||||
/*10*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3),
|
||||
@@ -66,7 +66,7 @@ static int *opcode_timings_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_0f[256] = {
|
||||
static int *opcode_timings_winchip_0f[256] = {
|
||||
// clang-format off
|
||||
/*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
@@ -89,7 +89,7 @@ static int *opcode_timings_0f[256] = {
|
||||
/*f0*/ NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, NULL, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, &timing_rm, &timing_rm, NULL,
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_0f_mod3[256] = {
|
||||
static int *opcode_timings_winchip_0f_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
@@ -113,68 +113,68 @@ static int *opcode_timings_0f_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_shift[8] = {
|
||||
static int *opcode_timings_winchip_shift[8] = {
|
||||
// clang-format off
|
||||
CYCLES(7), CYCLES(7), CYCLES(10), CYCLES(10), CYCLES(7), CYCLES(7), CYCLES(7), CYCLES(7)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_shift_mod3[8] = {
|
||||
static int *opcode_timings_winchip_shift_mod3[8] = {
|
||||
// clang-format off
|
||||
CYCLES(3), CYCLES(3), CYCLES(9), CYCLES(9), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_f6[8] = {
|
||||
static int *opcode_timings_winchip_f6[8] = {
|
||||
// clang-format off
|
||||
&timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_f6_mod3[8] = {
|
||||
static int *opcode_timings_winchip_f6_mod3[8] = {
|
||||
// clang-format off
|
||||
&timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_f7[8] = {
|
||||
static int *opcode_timings_winchip_f7[8] = {
|
||||
// clang-format off
|
||||
&timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_f7_mod3[8] = {
|
||||
static int *opcode_timings_winchip_f7_mod3[8] = {
|
||||
// clang-format off
|
||||
&timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_ff[8] = {
|
||||
static int *opcode_timings_winchip_ff[8] = {
|
||||
// clang-format off
|
||||
&timing_mm, &timing_mm, CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), NULL
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_ff_mod3[8] = {
|
||||
static int *opcode_timings_winchip_ff_mod3[8] = {
|
||||
// clang-format off
|
||||
&timing_rr, &timing_rr, CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), NULL
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_d8[8] = {
|
||||
static int *opcode_timings_winchip_d8[8] = {
|
||||
// clang-format off
|
||||
/* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/
|
||||
CYCLES(10), CYCLES(12), CYCLES(9), CYCLES(9), CYCLES(10), CYCLES(10), CYCLES(78), CYCLES(78)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_d8_mod3[8] = {
|
||||
static int *opcode_timings_winchip_d8_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOM FCOMP FSUB FSUBR FDIV FDIVR*/
|
||||
CYCLES(4), CYCLES(6), CYCLES(3), CYCLES(3), CYCLES(4), CYCLES(4), CYCLES(72), CYCLES(72)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_d9[8] = {
|
||||
static int *opcode_timings_winchip_d9[8] = {
|
||||
// clang-format off
|
||||
/* FLDs FSTs FSTPs FLDENV FLDCW FSTENV FSTCW*/
|
||||
CYCLES(2), NULL, CYCLES(7), CYCLES(7), CYCLES(34), CYCLES(4), CYCLES(67), CYCLES(3)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_d9_mod3[64] = {
|
||||
static int *opcode_timings_winchip_d9_mod3[64] = {
|
||||
// clang-format off
|
||||
/*FLD*/
|
||||
CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1),
|
||||
@@ -195,25 +195,25 @@ static int *opcode_timings_d9_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_da[8] = {
|
||||
static int *opcode_timings_winchip_da[8] = {
|
||||
// clang-format off
|
||||
/* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/
|
||||
CYCLES(10), CYCLES(12), CYCLES(9), CYCLES(9), CYCLES(10), CYCLES(10), CYCLES(78), CYCLES(78)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_da_mod3[8] = {
|
||||
static int *opcode_timings_winchip_da_mod3[8] = {
|
||||
// clang-format off
|
||||
NULL, NULL, NULL, NULL, NULL, CYCLES(5), NULL, NULL
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_db[8] = {
|
||||
static int *opcode_timings_winchip_db[8] = {
|
||||
// clang-format off
|
||||
/* FLDil FSTil FSTPil FLDe FSTPe*/
|
||||
CYCLES(6), NULL, CYCLES(7), CYCLES(7), NULL, CYCLES(8), NULL, CYCLES(8)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_db_mod3[64] = {
|
||||
static int *opcode_timings_winchip_db_mod3[64] = {
|
||||
// clang-format off
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
@@ -227,71 +227,71 @@ static int *opcode_timings_db_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_dc[8] = {
|
||||
static int *opcode_timings_winchip_dc[8] = {
|
||||
// clang-format off
|
||||
/* opFADDd_a16 opFMULd_a16 opFCOMd_a16 opFCOMPd_a16 opFSUBd_a16 opFSUBRd_a16 opFDIVd_a16 opFDIVRd_a16*/
|
||||
CYCLES(6), CYCLES(8), CYCLES(5), CYCLES(5), CYCLES(6), CYCLES(6), CYCLES(74), CYCLES(74)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_dc_mod3[8] = {
|
||||
static int *opcode_timings_winchip_dc_mod3[8] = {
|
||||
// clang-format off
|
||||
/* opFADDr opFMULr opFSUBRr opFSUBr opFDIVRr opFDIVr*/
|
||||
CYCLES(4), CYCLES(6), NULL, NULL, CYCLES(4), CYCLES(4), CYCLES(72), CYCLES(72)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_dd[8] = {
|
||||
static int *opcode_timings_winchip_dd[8] = {
|
||||
// clang-format off
|
||||
/* FLDd FSTd FSTPd FRSTOR FSAVE FSTSW*/
|
||||
CYCLES(2), NULL, CYCLES(8), CYCLES(8), CYCLES(131), NULL, CYCLES(154), CYCLES(5)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_dd_mod3[8] = {
|
||||
static int *opcode_timings_winchip_dd_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFFREE FST FSTP FUCOM FUCOMP*/
|
||||
CYCLES(3), NULL, CYCLES(1), CYCLES(1), CYCLES(3), CYCLES(3), NULL, NULL
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_de[8] = {
|
||||
static int *opcode_timings_winchip_de[8] = {
|
||||
// clang-format off
|
||||
/* FADDiw FMULiw FCOMiw FCOMPiw FSUBil FSUBRil FDIVil FDIVRil*/
|
||||
CYCLES(10), CYCLES(12), CYCLES(9), CYCLES(9), CYCLES(10), CYCLES(10), CYCLES(78), CYCLES(78)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_de_mod3[8] = {
|
||||
static int *opcode_timings_winchip_de_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOMPP FSUB FSUBR FDIV FDIVR*/
|
||||
CYCLES(4), CYCLES(6), NULL, CYCLES(3), CYCLES(4), CYCLES(4), CYCLES(72), CYCLES(72)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_df[8] = {
|
||||
static int *opcode_timings_winchip_df[8] = {
|
||||
// clang-format off
|
||||
/* FILDiw FISTiw FISTPiw FILDiq FBSTP FISTPiq*/
|
||||
CYCLES(6), NULL, CYCLES(7), CYCLES(7), NULL, CYCLES(8), CYCLES(172), CYCLES(8)
|
||||
// clang-format on
|
||||
};
|
||||
static int *opcode_timings_df_mod3[8] = {
|
||||
static int *opcode_timings_winchip_df_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFREE FST FSTP FUCOM FUCOMP*/
|
||||
CYCLES(3), NULL, CYCLES(1), CYCLES(1), CYCLES(3), CYCLES(3), NULL, NULL
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static int *opcode_timings_8x[8] = {
|
||||
static int *opcode_timings_winchip_8x[8] = {
|
||||
// clang-format off
|
||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||
};
|
||||
static int *opcode_timings_8x_mod3[8] =
|
||||
static int *opcode_timings_winchip_8x_mod3[8] =
|
||||
{
|
||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||
};
|
||||
static int *opcode_timings_81[8] =
|
||||
static int *opcode_timings_winchip_81[8] =
|
||||
{
|
||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||
};
|
||||
static int *opcode_timings_81_mod3[8] =
|
||||
static int *opcode_timings_winchip_81_mod3[8] =
|
||||
{
|
||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||
// clang-format on
|
||||
@@ -330,7 +330,7 @@ codegen_timing_winchip_start(void)
|
||||
void
|
||||
codegen_timing_winchip_prefix(uint8_t prefix, uint32_t fetchdat)
|
||||
{
|
||||
timing_count += COUNT(opcode_timings[prefix], 0);
|
||||
timing_count += COUNT(opcode_timings_winchip[prefix], 0);
|
||||
last_prefix = prefix;
|
||||
}
|
||||
|
||||
@@ -344,47 +344,47 @@ codegen_timing_winchip_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS
|
||||
|
||||
switch (last_prefix) {
|
||||
case 0x0f:
|
||||
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||
timings = mod3 ? opcode_timings_winchip_0f_mod3 : opcode_timings_winchip_0f;
|
||||
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||
break;
|
||||
|
||||
case 0xd8:
|
||||
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||
timings = mod3 ? opcode_timings_winchip_d8_mod3 : opcode_timings_winchip_d8;
|
||||
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xd9:
|
||||
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||
timings = mod3 ? opcode_timings_winchip_d9_mod3 : opcode_timings_winchip_d9;
|
||||
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xda:
|
||||
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||
timings = mod3 ? opcode_timings_winchip_da_mod3 : opcode_timings_winchip_da;
|
||||
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdb:
|
||||
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||
timings = mod3 ? opcode_timings_winchip_db_mod3 : opcode_timings_winchip_db;
|
||||
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdc:
|
||||
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||
timings = mod3 ? opcode_timings_winchip_dc_mod3 : opcode_timings_winchip_dc;
|
||||
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdd:
|
||||
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||
timings = mod3 ? opcode_timings_winchip_dd_mod3 : opcode_timings_winchip_dd;
|
||||
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xde:
|
||||
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||
timings = mod3 ? opcode_timings_winchip_de_mod3 : opcode_timings_winchip_de;
|
||||
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdf:
|
||||
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||
timings = mod3 ? opcode_timings_winchip_df_mod3 : opcode_timings_winchip_df;
|
||||
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
@@ -394,12 +394,12 @@ codegen_timing_winchip_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS
|
||||
case 0x80:
|
||||
case 0x82:
|
||||
case 0x83:
|
||||
timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||
timings = mod3 ? opcode_timings_winchip_8x_mod3 : opcode_timings_winchip_8x;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0x81:
|
||||
timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81;
|
||||
timings = mod3 ? opcode_timings_winchip_81_mod3 : opcode_timings_winchip_81;
|
||||
deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
@@ -410,29 +410,29 @@ codegen_timing_winchip_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS
|
||||
case 0xd1:
|
||||
case 0xd2:
|
||||
case 0xd3:
|
||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||
timings = mod3 ? opcode_timings_winchip_shift_mod3 : opcode_timings_winchip_shift;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xf6:
|
||||
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||
timings = mod3 ? opcode_timings_winchip_f6_mod3 : opcode_timings_winchip_f6;
|
||||
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xf7:
|
||||
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||
timings = mod3 ? opcode_timings_winchip_f7_mod3 : opcode_timings_winchip_f7;
|
||||
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xff:
|
||||
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||
timings = mod3 ? opcode_timings_winchip_ff_mod3 : opcode_timings_winchip_ff;
|
||||
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||
timings = mod3 ? opcode_timings_winchip_mod3 : opcode_timings_winchip;
|
||||
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
#define INVALID 0
|
||||
|
||||
static uint32_t opcode_timings[256] = {
|
||||
static uint32_t opcode_timings_winchip2[256] = {
|
||||
// clang-format off
|
||||
/*00*/ CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES(1), CYCLES(2), INVALID,
|
||||
/*10*/ CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3),
|
||||
@@ -87,7 +87,7 @@ static uint32_t opcode_timings[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_mod3[256] = {
|
||||
static uint32_t opcode_timings_winchip2_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), INVALID,
|
||||
/*10*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3),
|
||||
@@ -111,7 +111,7 @@ static uint32_t opcode_timings_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_0f[256] = {
|
||||
static uint32_t opcode_timings_winchip2_0f[256] = {
|
||||
// clang-format off
|
||||
/*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), INVALID, CYCLES(195), CYCLES(7), INVALID, CYCLES(1000), CYCLES(10000), INVALID, INVALID, INVALID, CYCLES_3DNOW(1), CYCLES(1), CYCLES_3DNOW(1),
|
||||
/*10*/ INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
|
||||
@@ -134,7 +134,7 @@ static uint32_t opcode_timings_0f[256] = {
|
||||
/*f0*/ INVALID, CYCLES_MMX_SHIFT(2), CYCLES_MMX_SHIFT(2), CYCLES_MMX_SHIFT(2), INVALID, CYCLES_MMX_MUL(2), INVALID, INVALID, CYCLES_MMX_ANY(2), CYCLES_MMX_ANY(2), CYCLES_MMX_ANY(2), INVALID, CYCLES_MMX_ANY(2), CYCLES_MMX_ANY(2), CYCLES_MMX_ANY(2), INVALID,
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_0f_mod3[256] = {
|
||||
static uint32_t opcode_timings_winchip2_0f_mod3[256] = {
|
||||
// clang-format off
|
||||
/*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), INVALID, CYCLES(195), CYCLES(7), INVALID, CYCLES(1000), CYCLES(10000), INVALID, INVALID, INVALID, CYCLES_3DNOW(1), CYCLES(1), CYCLES_3DNOW(1),
|
||||
/*10*/ INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
|
||||
@@ -158,49 +158,49 @@ static uint32_t opcode_timings_0f_mod3[256] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_shift[8] = {
|
||||
static uint32_t opcode_timings_winchip2_shift[8] = {
|
||||
// clang-format off
|
||||
CYCLES(7), CYCLES(7), CYCLES(10), CYCLES(10), CYCLES(7), CYCLES(7), CYCLES(7), CYCLES(7)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_shift_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_shift_mod3[8] = {
|
||||
// clang-format off
|
||||
CYCLES(3), CYCLES(3), CYCLES(9), CYCLES(9), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3)
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_f6[8] = {
|
||||
static uint32_t opcode_timings_winchip2_f6[8] = {
|
||||
// clang-format off
|
||||
CYCLES(2), INVALID, CYCLES(2), CYCLES(2), CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_f6_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_f6_mod3[8] = {
|
||||
// clang-format off
|
||||
CYCLES(1), INVALID, CYCLES(1), CYCLES(1), CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_f7[8] = {
|
||||
static uint32_t opcode_timings_winchip2_f7[8] = {
|
||||
// clang-format off
|
||||
CYCLES(2), INVALID, CYCLES(2), CYCLES(2), CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_f7_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_f7_mod3[8] = {
|
||||
// clang-format off
|
||||
CYCLES(1), INVALID, CYCLES(1), CYCLES(1), CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_ff[8] = {
|
||||
static uint32_t opcode_timings_winchip2_ff[8] = {
|
||||
// clang-format off
|
||||
CYCLES(2), CYCLES(2), CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), INVALID
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_ff_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_ff_mod3[8] = {
|
||||
// clang-format off
|
||||
CYCLES(1), CYCLES(1), CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), INVALID
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_d8[8] = {
|
||||
static uint32_t opcode_timings_winchip2_d8[8] = {
|
||||
// clang-format off
|
||||
/* FADDs FMULs FCOMs FCOMPs*/
|
||||
FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0),
|
||||
@@ -208,7 +208,7 @@ static uint32_t opcode_timings_d8[8] = {
|
||||
FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(39,38,2), FPU_CYCLES(39,38,2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_d8_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_d8_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADD FMUL FCOM FCOMP*/
|
||||
FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0),
|
||||
@@ -217,7 +217,7 @@ static uint32_t opcode_timings_d8_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_d9[8] = {
|
||||
static uint32_t opcode_timings_winchip2_d9[8] = {
|
||||
// clang-format off
|
||||
/* FLDs FSTs FSTPs*/
|
||||
FPU_CYCLES(1,0,0), INVALID, FPU_CYCLES(2,0,0), FPU_CYCLES(2,0,0),
|
||||
@@ -225,7 +225,7 @@ static uint32_t opcode_timings_d9[8] = {
|
||||
FPU_CYCLES(32,0,0), FPU_CYCLES(8,0,0), FPU_CYCLES(48,0,0), FPU_CYCLES(2,0,0)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_d9_mod3[64] = {
|
||||
static uint32_t opcode_timings_winchip2_d9_mod3[64] = {
|
||||
// clang-format off
|
||||
/*FLD*/
|
||||
FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0),
|
||||
@@ -258,7 +258,7 @@ static uint32_t opcode_timings_d9_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_da[8] = {
|
||||
static uint32_t opcode_timings_winchip2_da[8] = {
|
||||
// clang-format off
|
||||
/* FIADDl FIMULl FICOMl FICOMPl*/
|
||||
FPU_CYCLES(6,2,2), FPU_CYCLES(6,2,2), FPU_CYCLES(4,0,0), FPU_CYCLES(4,0,0),
|
||||
@@ -266,7 +266,7 @@ static uint32_t opcode_timings_da[8] = {
|
||||
FPU_CYCLES(6,2,2), FPU_CYCLES(6,2,2), FPU_CYCLES(42,38,2), FPU_CYCLES(42,38,2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_da_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_da_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FCOMPP*/
|
||||
@@ -274,7 +274,7 @@ static uint32_t opcode_timings_da_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_db[8] = {
|
||||
static uint32_t opcode_timings_winchip2_db[8] = {
|
||||
// clang-format off
|
||||
/* FLDil FSTil FSTPil*/
|
||||
FPU_CYCLES(3,2,2), INVALID, FPU_CYCLES(6,0,0), FPU_CYCLES(6,0,0),
|
||||
@@ -282,7 +282,7 @@ static uint32_t opcode_timings_db[8] = {
|
||||
INVALID, FPU_CYCLES(3,0,0), INVALID, FPU_CYCLES(3,0,0)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_db_mod3[64] = {
|
||||
static uint32_t opcode_timings_winchip2_db_mod3[64] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
@@ -312,7 +312,7 @@ static uint32_t opcode_timings_db_mod3[64] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_dc[8] = {
|
||||
static uint32_t opcode_timings_winchip2_dc[8] = {
|
||||
// clang-format off
|
||||
/* FADDd FMULd FCOMd FCOMPd*/
|
||||
FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0),
|
||||
@@ -320,7 +320,7 @@ static uint32_t opcode_timings_dc[8] = {
|
||||
FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(39,38,2), FPU_CYCLES(39,38,2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_dc_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_dc_mod3[8] = {
|
||||
// clang-format off
|
||||
/* opFADDr opFMULr*/
|
||||
FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2),INVALID, INVALID,
|
||||
@@ -329,7 +329,7 @@ static uint32_t opcode_timings_dc_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_dd[8] = {
|
||||
static uint32_t opcode_timings_winchip2_dd[8] = {
|
||||
// clang-format off
|
||||
/* FLDd FSTd FSTPd*/
|
||||
FPU_CYCLES(1,0,0), INVALID, FPU_CYCLES(2,0,0), FPU_CYCLES(2,0,0),
|
||||
@@ -337,7 +337,7 @@ static uint32_t opcode_timings_dd[8] = {
|
||||
FPU_CYCLES(70,0,0), INVALID, FPU_CYCLES(127,0,0), FPU_CYCLES(6,0,0)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_dd_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_dd_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FFFREE FST FSTP*/
|
||||
FPU_CYCLES(2,0,0), INVALID, FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0),
|
||||
@@ -346,7 +346,7 @@ static uint32_t opcode_timings_dd_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_de[8] = {
|
||||
static uint32_t opcode_timings_winchip2_de[8] = {
|
||||
// clang-format off
|
||||
/* FIADDw FIMULw FICOMw FICOMPw*/
|
||||
FPU_CYCLES(6,2,2), FPU_CYCLES(6,2,2), FPU_CYCLES(4,0,0), FPU_CYCLES(4,0,0),
|
||||
@@ -354,7 +354,7 @@ static uint32_t opcode_timings_de[8] = {
|
||||
FPU_CYCLES(6,2,2), FPU_CYCLES(6,2,2), FPU_CYCLES(42,38,2), FPU_CYCLES(42,38,2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_de_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_de_mod3[8] = {
|
||||
// clang-format off
|
||||
/* FADDP FMULP FCOMPP*/
|
||||
FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), INVALID, FPU_CYCLES(1,0,0),
|
||||
@@ -363,7 +363,7 @@ static uint32_t opcode_timings_de_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_df[8] = {
|
||||
static uint32_t opcode_timings_winchip2_df[8] = {
|
||||
// clang-format off
|
||||
/* FILDiw FISTiw FISTPiw*/
|
||||
FPU_CYCLES(3,2,2), INVALID, FPU_CYCLES(6,0,0), FPU_CYCLES(6,0,0),
|
||||
@@ -371,7 +371,7 @@ static uint32_t opcode_timings_df[8] = {
|
||||
INVALID, FPU_CYCLES(3,2,2), FPU_CYCLES(148,0,0), FPU_CYCLES(6,0,0)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_df_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_df_mod3[8] = {
|
||||
// clang-format off
|
||||
INVALID, INVALID, INVALID, INVALID,
|
||||
/* FSTSW AX*/
|
||||
@@ -379,22 +379,22 @@ static uint32_t opcode_timings_df_mod3[8] = {
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
static uint32_t opcode_timings_8x[8] = {
|
||||
static uint32_t opcode_timings_winchip2_8x[8] = {
|
||||
// clang-format off
|
||||
CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_8x_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_8x_mod3[8] = {
|
||||
// clang-format off
|
||||
CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_81[8] = {
|
||||
static uint32_t opcode_timings_winchip2_81[8] = {
|
||||
// clang-format off
|
||||
CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2)
|
||||
// clang-format on
|
||||
};
|
||||
static uint32_t opcode_timings_81_mod3[8] = {
|
||||
static uint32_t opcode_timings_winchip2_81_mod3[8] = {
|
||||
// clang-format off
|
||||
CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2)
|
||||
// clang-format on
|
||||
@@ -613,47 +613,47 @@ codegen_timing_winchip2_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNU
|
||||
|
||||
switch (last_prefix) {
|
||||
case 0x0f:
|
||||
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||
timings = mod3 ? opcode_timings_winchip2_0f_mod3 : opcode_timings_winchip2_0f;
|
||||
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||
break;
|
||||
|
||||
case 0xd8:
|
||||
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||
timings = mod3 ? opcode_timings_winchip2_d8_mod3 : opcode_timings_winchip2_d8;
|
||||
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xd9:
|
||||
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||
timings = mod3 ? opcode_timings_winchip2_d9_mod3 : opcode_timings_winchip2_d9;
|
||||
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xda:
|
||||
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||
timings = mod3 ? opcode_timings_winchip2_da_mod3 : opcode_timings_winchip2_da;
|
||||
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdb:
|
||||
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||
timings = mod3 ? opcode_timings_winchip2_db_mod3 : opcode_timings_winchip2_db;
|
||||
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdc:
|
||||
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||
timings = mod3 ? opcode_timings_winchip2_dc_mod3 : opcode_timings_winchip2_dc;
|
||||
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdd:
|
||||
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||
timings = mod3 ? opcode_timings_winchip2_dd_mod3 : opcode_timings_winchip2_dd;
|
||||
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xde:
|
||||
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||
timings = mod3 ? opcode_timings_winchip2_de_mod3 : opcode_timings_winchip2_de;
|
||||
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
case 0xdf:
|
||||
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||
timings = mod3 ? opcode_timings_winchip2_df_mod3 : opcode_timings_winchip2_df;
|
||||
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||
opcode = (opcode >> 3) & 7;
|
||||
break;
|
||||
@@ -663,12 +663,12 @@ codegen_timing_winchip2_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNU
|
||||
case 0x80:
|
||||
case 0x82:
|
||||
case 0x83:
|
||||
timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||
timings = mod3 ? opcode_timings_winchip2_8x_mod3 : opcode_timings_winchip2_8x;
|
||||
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0x81:
|
||||
timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81;
|
||||
timings = mod3 ? opcode_timings_winchip2_81_mod3 : opcode_timings_winchip2_81;
|
||||
deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
@@ -679,29 +679,29 @@ codegen_timing_winchip2_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNU
|
||||
case 0xd1:
|
||||
case 0xd2:
|
||||
case 0xd3:
|
||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||
timings = mod3 ? opcode_timings_winchip2_shift_mod3 : opcode_timings_winchip2_shift;
|
||||
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
case 0xf6:
|
||||
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||
timings = mod3 ? opcode_timings_winchip2_f6_mod3 : opcode_timings_winchip2_f6;
|
||||
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xf7:
|
||||
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||
timings = mod3 ? opcode_timings_winchip2_f7_mod3 : opcode_timings_winchip2_f7;
|
||||
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
case 0xff:
|
||||
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||
timings = mod3 ? opcode_timings_winchip2_ff_mod3 : opcode_timings_winchip2_ff;
|
||||
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||
opcode = (fetchdat >> 3) & 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||
timings = mod3 ? opcode_timings_winchip2_mod3 : opcode_timings_winchip2;
|
||||
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||
break;
|
||||
}
|
||||
|
||||
182
src/cpu/cpu.c
182
src/cpu/cpu.c
@@ -47,7 +47,7 @@
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
# include "codegen.h"
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
#include "x87_timings.h"
|
||||
|
||||
#define CCR1_USE_SMI (1 << 1)
|
||||
@@ -119,7 +119,7 @@ const OpFn *x86_dynarec_opcodes_df_a32;
|
||||
const OpFn *x86_dynarec_opcodes_REPE;
|
||||
const OpFn *x86_dynarec_opcodes_REPNE;
|
||||
const OpFn *x86_dynarec_opcodes_3DNOW;
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
const OpFn *x86_opcodes;
|
||||
const OpFn *x86_opcodes_0f;
|
||||
@@ -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;
|
||||
@@ -504,7 +506,7 @@ cpu_set(void)
|
||||
|
||||
#ifdef USE_ACYCS
|
||||
acycs = 0;
|
||||
#endif
|
||||
#endif /* USE_ACYCS */
|
||||
|
||||
soft_reset_pci = 0;
|
||||
cpu_init = 0;
|
||||
@@ -576,7 +578,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_386_0f, dynarec_ops_386, dynarec_ops_386_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_386, ops_386_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
x86_setopcodes_2386(ops_2386_386, ops_2386_386_0f);
|
||||
x86_opcodes_REPE = ops_REPE;
|
||||
x86_opcodes_REPNE = ops_REPNE;
|
||||
@@ -587,7 +589,7 @@ cpu_set(void)
|
||||
x86_dynarec_opcodes_REPE = dynarec_ops_REPE;
|
||||
x86_dynarec_opcodes_REPNE = dynarec_ops_REPNE;
|
||||
x86_dynarec_opcodes_3DNOW = dynarec_ops_3DNOW;
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
if (hasfpu) {
|
||||
#ifdef USE_DYNAREC
|
||||
@@ -626,7 +628,7 @@ cpu_set(void)
|
||||
x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_df_a16;
|
||||
x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_df_a32;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
if (fpu_softfloat) {
|
||||
x86_opcodes_d8_a16 = ops_sf_fpu_d8_a16;
|
||||
x86_opcodes_d8_a32 = ops_sf_fpu_d8_a32;
|
||||
@@ -714,7 +716,7 @@ cpu_set(void)
|
||||
x86_dynarec_opcodes_de_a32 = dynarec_ops_nofpu_a32;
|
||||
x86_dynarec_opcodes_df_a16 = dynarec_ops_nofpu_a16;
|
||||
x86_dynarec_opcodes_df_a32 = dynarec_ops_nofpu_a32;
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
x86_opcodes_d8_a16 = ops_nofpu_a16;
|
||||
x86_opcodes_d8_a32 = ops_nofpu_a32;
|
||||
x86_opcodes_d9_a16 = ops_nofpu_a16;
|
||||
@@ -752,7 +754,7 @@ cpu_set(void)
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_486);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
memset(&msr, 0, sizeof(msr));
|
||||
|
||||
@@ -774,7 +776,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_186, ops_186_0f, dynarec_ops_186, dynarec_ops_186_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_186, ops_186_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
x86_setopcodes_2386(ops_2386_186, ops_2386_186_0f);
|
||||
break;
|
||||
|
||||
@@ -783,7 +785,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_286, ops_286_0f, dynarec_ops_286, dynarec_ops_286_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_286, ops_286_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
x86_setopcodes_2386(ops_2386_286, ops_2386_286_0f);
|
||||
|
||||
if (fpu_type == FPU_287) {
|
||||
@@ -819,7 +821,7 @@ cpu_set(void)
|
||||
x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_287_df_a16;
|
||||
x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_287_df_a32;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
if (fpu_softfloat) {
|
||||
x86_opcodes_d9_a16 = ops_sf_fpu_287_d9_a16;
|
||||
x86_opcodes_d9_a32 = ops_sf_fpu_287_d9_a32;
|
||||
@@ -921,7 +923,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_ibm486_0f, dynarec_ops_386, dynarec_ops_ibm486_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_386, ops_ibm486_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
x86_setopcodes_2386(ops_2386_386, ops_2386_ibm486_0f);
|
||||
cpu_features = CPU_FEATURE_MSR;
|
||||
fallthrough;
|
||||
@@ -961,7 +963,7 @@ cpu_set(void)
|
||||
x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_287_df_a16;
|
||||
x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_287_df_a32;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
if (fpu_softfloat) {
|
||||
x86_opcodes_d9_a16 = ops_sf_fpu_287_d9_a16;
|
||||
x86_opcodes_d9_a32 = ops_sf_fpu_287_d9_a32;
|
||||
@@ -1067,7 +1069,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_486_0f, dynarec_ops_386, dynarec_ops_486_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_386, ops_486_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
x86_setopcodes_2386(ops_2386_386, ops_2386_486_0f);
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
@@ -1107,7 +1109,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_486_0f, dynarec_ops_386, dynarec_ops_486_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_386, ops_486_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
x86_setopcodes_2386(ops_2386_386, ops_2386_486_0f);
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
@@ -1160,7 +1162,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_486_0f, dynarec_ops_386, dynarec_ops_486_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_386, ops_486_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
x86_setopcodes_2386(ops_2386_386, ops_2386_486_0f);
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
@@ -1209,7 +1211,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_stpc_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_c486_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
timing_rm = 3; /* register dest - memory src */
|
||||
@@ -1252,7 +1254,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_c486_0f, dynarec_ops_386, dynarec_ops_c486_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_386, ops_c486_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
timing_rm = 1; /* register dest - memory src */
|
||||
@@ -1301,7 +1303,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_winchip2_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_winchip_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
timing_rm = 2; /* register dest - memory src */
|
||||
@@ -1350,7 +1352,7 @@ cpu_set(void)
|
||||
codegen_timing_set(&codegen_timing_winchip2);
|
||||
else
|
||||
codegen_timing_set(&codegen_timing_winchip);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
break;
|
||||
|
||||
case CPU_P24T:
|
||||
@@ -1366,7 +1368,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_pentiummmx_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_pentium_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
timing_rm = 2; /* register dest - memory src */
|
||||
@@ -1409,10 +1411,10 @@ cpu_set(void)
|
||||
cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE | CR4_PCE;
|
||||
#ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_pentium);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
break;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
#ifdef USE_CYRIX_6X86
|
||||
case CPU_Cx6x86:
|
||||
case CPU_Cx6x86L:
|
||||
case CPU_CxGX1:
|
||||
@@ -1434,7 +1436,7 @@ cpu_set(void)
|
||||
x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_686_df_a16;
|
||||
x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_686_df_a32;
|
||||
}
|
||||
# endif
|
||||
# endif /* USE_DYNAREC */
|
||||
if (fpu_softfloat) {
|
||||
x86_opcodes_da_a16 = ops_sf_fpu_686_da_a16;
|
||||
x86_opcodes_da_a32 = ops_sf_fpu_686_da_a32;
|
||||
@@ -1472,7 +1474,7 @@ cpu_set(void)
|
||||
# if 0
|
||||
x86_setopcodes(ops_386, ops_c6x86_0f);
|
||||
# endif
|
||||
# endif
|
||||
# endif /* USE_DYNAREC */
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
timing_rm = 1; /* register dest - memory src */
|
||||
@@ -1524,19 +1526,65 @@ cpu_set(void)
|
||||
|
||||
# ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_686);
|
||||
# endif
|
||||
# endif /* USE_DYNAREC */
|
||||
|
||||
if ((cpu_s->cpu_type == CPU_Cx6x86L) || (cpu_s->cpu_type == CPU_Cx6x86MX))
|
||||
ccr4 = 0x80;
|
||||
else if (CPU_Cx6x86)
|
||||
CPUID = 0; /* Disabled on powerup by default */
|
||||
break;
|
||||
#endif
|
||||
#endif /* USE_CYRIX_6X86 */
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
#ifdef USE_AMD_K5
|
||||
case CPU_K5:
|
||||
case CPU_5K86:
|
||||
#endif
|
||||
#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:
|
||||
case CPU_K6_2C:
|
||||
@@ -1546,34 +1594,20 @@ 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);
|
||||
# if defined(DEV_BRANCH) && defined(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
|
||||
#else
|
||||
if (cpu_s->cpu_type >= CPU_K6_2)
|
||||
x86_setopcodes(ops_386, ops_k62_0f);
|
||||
# if defined(DEV_BRANCH) && defined(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
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P)) {
|
||||
x86_opcodes_3DNOW = ops_3DNOWE;
|
||||
#ifdef USE_DYNAREC
|
||||
x86_dynarec_opcodes_3DNOW = dynarec_ops_3DNOWE;
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
}
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
@@ -1613,27 +1647,15 @@ 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;
|
||||
#if defined(DEV_BRANCH) && defined(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
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_k6);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
break;
|
||||
|
||||
case CPU_PENTIUMPRO:
|
||||
@@ -1668,7 +1690,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_pentium2d_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_pentium2_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
if (fpu_softfloat) {
|
||||
x86_opcodes_da_a16 = ops_sf_fpu_686_da_a16;
|
||||
x86_opcodes_da_a32 = ops_sf_fpu_686_da_a32;
|
||||
@@ -1726,7 +1748,7 @@ cpu_set(void)
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_p6);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
break;
|
||||
|
||||
case CPU_CYRIX3S:
|
||||
@@ -1734,7 +1756,7 @@ cpu_set(void)
|
||||
x86_setopcodes(ops_386, ops_winchip2_0f, dynarec_ops_386, dynarec_ops_winchip2_0f);
|
||||
#else
|
||||
x86_setopcodes(ops_386, ops_winchip2_0f);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
timing_rm = 2; /* register dest - memory src */
|
||||
timing_mr = 2; /* memory dest - register src */
|
||||
@@ -1774,7 +1796,7 @@ cpu_set(void)
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_winchip);
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1812,7 +1834,7 @@ cpu_set(void)
|
||||
cpu_exec = exec386_dynarec;
|
||||
cpu_use_exec = 1;
|
||||
} else
|
||||
#endif
|
||||
#endif /* defined(USE_DYNAREC) && !defined(USE_GDBSTUB) */
|
||||
/* Use exec386 for CPU_IBM486SLC because it can reach 100 MHz. */
|
||||
if ((cpu_s->cpu_type == CPU_IBM486SLC) || (cpu_s->cpu_type == CPU_IBM486BL) ||
|
||||
cpu_iscyrix || (cpu_s->cpu_type > CPU_486DLC) || cpu_override_interpreter) {
|
||||
@@ -2065,7 +2087,7 @@ cpu_CPUID(void)
|
||||
EAX = EBX = ECX = EDX = 0;
|
||||
break;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
#ifdef USE_AMD_K5
|
||||
case CPU_K5:
|
||||
if (!EAX) {
|
||||
EAX = 0x00000001;
|
||||
@@ -2123,7 +2145,7 @@ cpu_CPUID(void)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#endif /* USE_AMD_K5 */
|
||||
|
||||
case CPU_K6:
|
||||
switch (EAX) {
|
||||
@@ -2354,7 +2376,7 @@ cpu_CPUID(void)
|
||||
EAX = EBX = ECX = EDX = 0;
|
||||
break;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
#ifdef USE_CYRIX_6X86
|
||||
case CPU_Cx6x86:
|
||||
if (!EAX) {
|
||||
EAX = 0x00000001;
|
||||
@@ -2410,7 +2432,7 @@ cpu_CPUID(void)
|
||||
} else
|
||||
EAX = EBX = ECX = EDX = 0;
|
||||
break;
|
||||
#endif
|
||||
#endif /* USE_CYRIX_6X86 */
|
||||
|
||||
case CPU_PENTIUMPRO:
|
||||
if (!EAX) {
|
||||
@@ -2565,10 +2587,10 @@ cpu_ven_reset(void)
|
||||
msr.amd_psor = (cpu_s->cpu_type >= CPU_K6_3) ? 0x008cULL : 0x018cULL;
|
||||
fallthrough;
|
||||
case CPU_K6_2:
|
||||
#if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
#ifdef USE_AMD_K5
|
||||
case CPU_K5:
|
||||
case CPU_5K86:
|
||||
#endif
|
||||
#endif /* USE_AMD_K5 */
|
||||
case CPU_K6:
|
||||
msr.amd_efer = (cpu_s->cpu_type >= CPU_K6_2C) ? 2ULL : 0ULL;
|
||||
break;
|
||||
@@ -2789,10 +2811,10 @@ cpu_RDMSR(void)
|
||||
}
|
||||
break;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
#ifdef USE_AMD_K5
|
||||
case CPU_K5:
|
||||
case CPU_5K86:
|
||||
#endif
|
||||
#endif /* USE_AMD_K5 */
|
||||
case CPU_K6:
|
||||
case CPU_K6_2:
|
||||
case CPU_K6_2C:
|
||||
@@ -3075,7 +3097,7 @@ pentium_invalid_rdmsr:
|
||||
cpu_log("RDMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX);
|
||||
break;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
#ifdef USE_CYRIX_6X86
|
||||
case CPU_Cx6x86:
|
||||
case CPU_Cx6x86L:
|
||||
case CPU_CxGX1:
|
||||
@@ -3115,7 +3137,7 @@ pentium_invalid_rdmsr:
|
||||
}
|
||||
cpu_log("RDMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX);
|
||||
break;
|
||||
#endif
|
||||
#endif /* USE_CYRIX_6X86 */
|
||||
|
||||
case CPU_PENTIUMPRO:
|
||||
case CPU_PENTIUM2:
|
||||
@@ -3638,10 +3660,10 @@ cpu_WRMSR(void)
|
||||
}
|
||||
break;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
#ifdef USE_AMD_K5
|
||||
case CPU_K5:
|
||||
case CPU_5K86:
|
||||
#endif
|
||||
#endif /* USE_AMD_K5 */
|
||||
case CPU_K6:
|
||||
case CPU_K6_2:
|
||||
case CPU_K6_2C:
|
||||
@@ -3902,7 +3924,7 @@ pentium_invalid_wrmsr:
|
||||
}
|
||||
break;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
#ifdef USE_CYRIX_6X86
|
||||
case CPU_Cx6x86:
|
||||
case CPU_Cx6x86L:
|
||||
case CPU_CxGX1:
|
||||
@@ -3936,7 +3958,7 @@ pentium_invalid_wrmsr:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#endif /* USE_CYRIX_6X86 */
|
||||
|
||||
case CPU_PENTIUMPRO:
|
||||
case CPU_PENTIUM2:
|
||||
@@ -4249,14 +4271,14 @@ cpu_write(uint16_t addr, uint8_t val, UNUSED(void *priv))
|
||||
case 0xe8: /* CCR4 */
|
||||
if ((ccr3 & 0xf0) == 0x10) {
|
||||
ccr4 = val;
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
#ifdef USE_CYRIX_6X86
|
||||
if (cpu_s->cpu_type >= CPU_Cx6x86) {
|
||||
if (val & 0x80)
|
||||
CPUID = cpu_s->cpuid_model;
|
||||
else
|
||||
CPUID = 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_CYRIX_6X86 */
|
||||
}
|
||||
break;
|
||||
case 0xe9: /* CCR5 */
|
||||
@@ -4330,7 +4352,7 @@ x86_setopcodes(const OpFn *opcodes, const OpFn *opcodes_0f)
|
||||
x86_opcodes = opcodes;
|
||||
x86_opcodes_0f = opcodes_0f;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_DYNAREC */
|
||||
|
||||
void
|
||||
x86_setopcodes_2386(const OpFn *opcodes, const OpFn *opcodes_0f)
|
||||
|
||||
@@ -616,6 +616,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,
|
||||
@@ -4474,7 +4474,7 @@ const cpu_family_t cpu_families[] = {
|
||||
{ .name = "", 0 }
|
||||
}
|
||||
},
|
||||
#if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
#ifdef USE_AMD_K5
|
||||
{
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.manufacturer = "AMD",
|
||||
@@ -4629,7 +4629,7 @@ const cpu_family_t cpu_families[] = {
|
||||
{ .name = "", 0 }
|
||||
}
|
||||
},
|
||||
#endif
|
||||
#endif /* USE_AMD_K5 */
|
||||
{
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.manufacturer = "AMD",
|
||||
@@ -5982,7 +5982,7 @@ const cpu_family_t cpu_families[] = {
|
||||
{ .name = "", 0 }
|
||||
}
|
||||
},
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
#ifdef USE_CYRIX_6X86
|
||||
{
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.manufacturer = "Cyrix",
|
||||
@@ -6342,7 +6342,7 @@ const cpu_family_t cpu_families[] = {
|
||||
{ .name = "", 0 }
|
||||
}
|
||||
},
|
||||
#endif
|
||||
#endif /* USE_CYRIX_6X86 */
|
||||
{
|
||||
.package = CPU_PKG_SOCKET8,
|
||||
.manufacturer = "Intel",
|
||||
|
||||
@@ -83,7 +83,9 @@ int fpu_cycles = 0;
|
||||
int in_lock = 0;
|
||||
|
||||
#ifdef ENABLE_X86_LOG
|
||||
#if 0
|
||||
void dumpregs(int);
|
||||
#endif
|
||||
|
||||
int x86_do_log = ENABLE_X86_LOG;
|
||||
int indump = 0;
|
||||
@@ -93,13 +95,14 @@ x86_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (x808x_do_log) {
|
||||
if (x86_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
void
|
||||
dumpregs(int force)
|
||||
{
|
||||
@@ -144,6 +147,7 @@ dumpregs(int force)
|
||||
x87_dumpregs();
|
||||
indump = 0;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
# define x86_log(fmt, ...)
|
||||
#endif
|
||||
@@ -273,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;
|
||||
@@ -321,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;
|
||||
|
||||
@@ -90,10 +90,10 @@ extern const OpFn dynarec_ops_winchip2_0f[1024];
|
||||
extern const OpFn dynarec_ops_pentium_0f[1024];
|
||||
extern const OpFn dynarec_ops_pentiummmx_0f[1024];
|
||||
|
||||
# if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
# ifdef USE_CYRIX_6X86
|
||||
extern const OpFn dynarec_ops_c6x86_0f[1024];
|
||||
extern const OpFn dynarec_ops_c6x86mx_0f[1024];
|
||||
# endif
|
||||
# endif /* USE_CYRIX_6X86 */
|
||||
|
||||
extern const OpFn dynarec_ops_k6_0f[1024];
|
||||
extern const OpFn dynarec_ops_k62_0f[1024];
|
||||
@@ -232,10 +232,10 @@ extern const OpFn ops_winchip2_0f[1024];
|
||||
extern const OpFn ops_pentium_0f[1024];
|
||||
extern const OpFn ops_pentiummmx_0f[1024];
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
#ifdef USE_CYRIX_6X86
|
||||
extern const OpFn ops_c6x86_0f[1024];
|
||||
extern const OpFn ops_c6x86mx_0f[1024];
|
||||
#endif
|
||||
#endif /* USE_CYRIX_6X86 */
|
||||
|
||||
extern const OpFn ops_k6_0f[1024];
|
||||
extern const OpFn ops_k62_0f[1024];
|
||||
|
||||
@@ -110,7 +110,7 @@ opMOVD_mm_l_a32(uint32_t fetchdat)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
#ifdef USE_CYRIX_6X86
|
||||
/*Cyrix maps both MOVD and SMINT to the same opcode*/
|
||||
static int
|
||||
opMOVD_mm_l_a16_cx(uint32_t fetchdat)
|
||||
@@ -170,7 +170,7 @@ opMOVD_mm_l_a32_cx(uint32_t fetchdat)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_CYRIX_6X86 */
|
||||
|
||||
static int
|
||||
opMOVQ_q_mm_a16(uint32_t fetchdat)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -26,22 +26,22 @@ uint32_t x87_op_off;
|
||||
uint16_t x87_pc_seg;
|
||||
uint16_t x87_op_seg;
|
||||
|
||||
#ifdef ENABLE_FPU_LOG
|
||||
int fpu_do_log = ENABLE_FPU_LOG;
|
||||
#ifdef ENABLE_FPU_X87_LOG
|
||||
int fpu_x87_do_log = ENABLE_FPU_X87_LOG;
|
||||
|
||||
void
|
||||
fpu_log(const char *fmt, ...)
|
||||
fpu_x87_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (fpu_do_log) {
|
||||
if (fpu_x87_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
# define fpu_log(fmt, ...)
|
||||
# define fpu_x87_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
#ifdef USE_NEW_DYNAREC
|
||||
@@ -546,17 +546,17 @@ unpack_FPU_TW(uint16_t tag_byte)
|
||||
return (twd >> 2);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_808X_LOG
|
||||
#ifdef ENABLE_FPU_X87_LOG
|
||||
void
|
||||
x87_dumpregs(void)
|
||||
{
|
||||
if (cpu_state.ismmx) {
|
||||
fpu_log("MM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\n", cpu_state.MM[0].q, cpu_state.MM[1].q, cpu_state.MM[2].q, cpu_state.MM[3].q);
|
||||
fpu_log("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", cpu_state.MM[4].q, cpu_state.MM[5].q, cpu_state.MM[6].q, cpu_state.MM[7].q);
|
||||
fpu_x87_log("MM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\n", cpu_state.MM[0].q, cpu_state.MM[1].q, cpu_state.MM[2].q, cpu_state.MM[3].q);
|
||||
fpu_x87_log("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", cpu_state.MM[4].q, cpu_state.MM[5].q, cpu_state.MM[6].q, cpu_state.MM[7].q);
|
||||
} else {
|
||||
fpu_log("ST(0)=%f\tST(1)=%f\tST(2)=%f\tST(3)=%f\t\n", cpu_state.ST[cpu_state.TOP], cpu_state.ST[(cpu_state.TOP + 1) & 7], cpu_state.ST[(cpu_state.TOP + 2) & 7], cpu_state.ST[(cpu_state.TOP + 3) & 7]);
|
||||
fpu_log("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\t\n", cpu_state.ST[(cpu_state.TOP + 4) & 7], cpu_state.ST[(cpu_state.TOP + 5) & 7], cpu_state.ST[(cpu_state.TOP + 6) & 7], cpu_state.ST[(cpu_state.TOP + 7) & 7]);
|
||||
fpu_x87_log("ST(0)=%f\tST(1)=%f\tST(2)=%f\tST(3)=%f\t\n", cpu_state.ST[cpu_state.TOP], cpu_state.ST[(cpu_state.TOP + 1) & 7], cpu_state.ST[(cpu_state.TOP + 2) & 7], cpu_state.ST[(cpu_state.TOP + 3) & 7]);
|
||||
fpu_x87_log("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\t\n", cpu_state.ST[(cpu_state.TOP + 4) & 7], cpu_state.ST[(cpu_state.TOP + 5) & 7], cpu_state.ST[(cpu_state.TOP + 6) & 7], cpu_state.ST[(cpu_state.TOP + 7) & 7]);
|
||||
}
|
||||
fpu_log("Status = %04X Control = %04X Tag = %04X\n", cpu_state.npxs, cpu_state.npxc, x87_gettag());
|
||||
fpu_x87_log("Status = %04X Control = %04X Tag = %04X\n", cpu_state.npxs, cpu_state.npxc, x87_gettag());
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -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; \
|
||||
|
||||
@@ -9,22 +9,53 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2021 Andreas J. Reichel.
|
||||
# Copyright 2021-2022 Jasmine Iwanek.
|
||||
# Copyright 2021-2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
add_library(dev OBJECT bugger.c cassette.c cartridge.c hasp.c hwm.c hwm_lm75.c hwm_lm78.c hwm_gl518sm.c
|
||||
hwm_vt82c686.c ibm_5161.c isamem.c isartc.c ../lpt.c pci_bridge.c
|
||||
postcard.c serial.c unittester.c clock_ics9xxx.c isapnp.c i2c.c i2c_gpio.c
|
||||
smbus_piix4.c smbus_ali7101.c smbus_sis5595.c keyboard.c keyboard_xt.c
|
||||
kbc_at.c kbc_at_dev.c
|
||||
add_library(dev OBJECT
|
||||
bugger.c
|
||||
cassette.c
|
||||
cartridge.c
|
||||
hasp.c
|
||||
hwm.c
|
||||
hwm_lm75.c
|
||||
hwm_lm78.c
|
||||
hwm_gl518sm.c
|
||||
hwm_vt82c686.c
|
||||
ibm_5161.c
|
||||
isamem.c
|
||||
isartc.c
|
||||
../lpt.c
|
||||
pci_bridge.c
|
||||
postcard.c
|
||||
serial.c
|
||||
unittester.c
|
||||
clock_ics9xxx.c
|
||||
isapnp.c
|
||||
i2c.c
|
||||
i2c_gpio.c
|
||||
smbus_piix4.c
|
||||
smbus_ali7101.c
|
||||
smbus_sis5595.c
|
||||
keyboard.c
|
||||
keyboard_xt.c
|
||||
kbc_at.c
|
||||
kbc_at_dev.c
|
||||
keyboard_at.c
|
||||
mouse.c mouse_bus.c mouse_serial.c mouse_ps2.c nec_mate_unk.c phoenix_486_jumper.c
|
||||
mouse.c
|
||||
mouse_bus.c
|
||||
mouse_serial.c
|
||||
mouse_ps2.c
|
||||
nec_mate_unk.c
|
||||
phoenix_486_jumper.c
|
||||
serial_passthrough.c
|
||||
novell_cardkey.c
|
||||
mouse_microtouch_touchscreen.c)
|
||||
mouse_microtouch_touchscreen.c
|
||||
)
|
||||
|
||||
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
target_link_libraries(86Box atomic)
|
||||
@@ -45,3 +76,12 @@ endif()
|
||||
if(LASERXT)
|
||||
target_compile_definitions(dev PRIVATE USE_LASERXT)
|
||||
endif()
|
||||
|
||||
if(PCL)
|
||||
target_compile_definitions(dev PRIVATE USE_PCL)
|
||||
endif()
|
||||
|
||||
if(WACOM)
|
||||
target_compile_definitions(dev PRIVATE USE_WACOM)
|
||||
target_sources(dev PRIVATE mouse_wacom_tablet.c)
|
||||
endif()
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1699,7 +1699,7 @@ static const device_t brxt_device = {
|
||||
.config = brxt_config
|
||||
};
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_ISAMEM_BRAT)
|
||||
#ifdef USE_ISAMEM_BRAT
|
||||
static const device_config_t brat_config[] = {
|
||||
// clang-format off
|
||||
{
|
||||
@@ -1804,7 +1804,7 @@ static const device_t brat_device = {
|
||||
.force_redraw = NULL,
|
||||
.config = brat_config
|
||||
};
|
||||
#endif
|
||||
#endif /* USE_ISAMEM_BRAT */
|
||||
|
||||
static const device_config_t lotech_config[] = {
|
||||
// clang-format off
|
||||
@@ -1871,7 +1871,7 @@ static const device_t lotech_device = {
|
||||
.config = lotech_config
|
||||
};
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_ISAMEM_RAMPAGE)
|
||||
#ifdef USE_ISAMEM_RAMPAGE
|
||||
// TODO: Dual Paging support
|
||||
// TODO: Conventional memory suppport
|
||||
static const device_config_t rampage_config[] = {
|
||||
@@ -1939,9 +1939,9 @@ static const device_t rampage_device = {
|
||||
.force_redraw = NULL,
|
||||
.config = rampage_config
|
||||
};
|
||||
#endif
|
||||
#endif /* USE_ISAMEM_RAMPAGE */
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_ISAMEM_IAB)
|
||||
#ifdef USE_ISAMEM_IAB
|
||||
static const device_config_t iab_config[] = {
|
||||
// clang-format off
|
||||
{
|
||||
@@ -2038,7 +2038,7 @@ static const device_t iab_device = {
|
||||
.force_redraw = NULL,
|
||||
.config = iab_config
|
||||
};
|
||||
#endif
|
||||
#endif /* USE_ISAMEM_IAB */
|
||||
|
||||
static const struct {
|
||||
const device_t *dev;
|
||||
@@ -2063,15 +2063,15 @@ static const struct {
|
||||
{ &ev159_device },
|
||||
{ &ev165a_device },
|
||||
{ &brxt_device },
|
||||
#if defined(DEV_BRANCH) && defined(USE_ISAMEM_BRAT)
|
||||
#ifdef USE_ISAMEM_BRAT
|
||||
{ &brat_device },
|
||||
#endif
|
||||
#if defined(DEV_BRANCH) && defined(USE_ISAMEM_RAMPAGE)
|
||||
#endif /* USE_ISAMEM_BRAT */
|
||||
#ifdef USE_ISAMEM_RAMPAGE
|
||||
{ &rampage_device },
|
||||
#endif
|
||||
#if defined(DEV_BRANCH) && defined(USE_ISAMEM_IAB)
|
||||
#endif /* USE_ISAMEM_RAMPAGE */
|
||||
#ifdef USE_ISAMEM_IAB
|
||||
{ &iab_device },
|
||||
#endif
|
||||
#endif /* USE_ISAMEM_IAB */
|
||||
{ &lotech_device },
|
||||
{ NULL }
|
||||
// clang-format on
|
||||
|
||||
@@ -277,9 +277,26 @@ kbc_translate(atkbc_t *dev, uint8_t val)
|
||||
return ret;
|
||||
}
|
||||
|
||||
kbc_at_log("ATkbc: translate is %s, ", translate ? "on" : "off");
|
||||
#ifdef ENABLE_KEYBOARD_AT_LOG
|
||||
kbc_at_log("scan code: ");
|
||||
if (translate) {
|
||||
kbc_at_log("%02X (original: ", (nont_to_t[val] | dev->sc_or));
|
||||
if (dev->sc_or == 0x80)
|
||||
kbc_at_log("F0 ");
|
||||
kbc_at_log("%02X)\n", val);
|
||||
} else
|
||||
kbc_at_log("%02X\n", val);
|
||||
#endif
|
||||
|
||||
ret = translate ? (nont_to_t[val] | dev->sc_or) : val;
|
||||
|
||||
if (dev->sc_or == 0x80)
|
||||
dev->sc_or = 0;
|
||||
|
||||
/* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */
|
||||
if ((dev != NULL) && (kbc_ven == KBC_VEN_TOSHIBA) &&
|
||||
(keyboard_recv(0x138) || keyboard_recv(0x11d))) switch (val) {
|
||||
(keyboard_recv(0x138) || keyboard_recv(0x11d))) switch (ret) {
|
||||
case 0x4f:
|
||||
t3100e_notify_set(0x01);
|
||||
break; /* End */
|
||||
@@ -329,23 +346,6 @@ kbc_translate(atkbc_t *dev, uint8_t val)
|
||||
break;
|
||||
}
|
||||
|
||||
kbc_at_log("ATkbc: translate is %s, ", translate ? "on" : "off");
|
||||
#ifdef ENABLE_KEYBOARD_AT_LOG
|
||||
kbc_at_log("scan code: ");
|
||||
if (translate) {
|
||||
kbc_at_log("%02X (original: ", (nont_to_t[val] | dev->sc_or));
|
||||
if (dev->sc_or == 0x80)
|
||||
kbc_at_log("F0 ");
|
||||
kbc_at_log("%02X)\n", val);
|
||||
} else
|
||||
kbc_at_log("%02X\n", val);
|
||||
#endif
|
||||
|
||||
ret = translate ? (nont_to_t[val] | dev->sc_or) : val;
|
||||
|
||||
if (dev->sc_or == 0x80)
|
||||
dev->sc_or = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/machine.h>
|
||||
#include <86box/keyboard.h>
|
||||
#include <86box/plat.h>
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
@@ -50,7 +51,8 @@ uint16_t key_uncapture_2 = 0x14f; /* End */
|
||||
|
||||
void (*keyboard_send)(uint16_t val);
|
||||
|
||||
static int recv_key[512]; /* keyboard input buffer */
|
||||
static int recv_key[512] = { 0 }; /* keyboard input buffer */
|
||||
static int recv_key_ui[512] = { 0 }; /* keyboard input buffer */
|
||||
static int oldkey[512];
|
||||
#if 0
|
||||
static int keydelay[512];
|
||||
@@ -238,16 +240,13 @@ keyboard_input(int down, uint16_t scan)
|
||||
}
|
||||
}
|
||||
|
||||
/* NOTE: Shouldn't this be some sort of bit shift? An array of 8 unsigned 64-bit integers
|
||||
should be enough. */
|
||||
#if 0
|
||||
recv_key[scan >> 6] |= ((uint64_t) down << ((uint64_t) scan & 0x3fLL));
|
||||
#endif
|
||||
|
||||
/* pclog("Received scan code: %03X (%s)\n", scan & 0x1ff, down ? "down" : "up"); */
|
||||
recv_key[scan & 0x1ff] = down;
|
||||
recv_key_ui[scan & 0x1ff] = down;
|
||||
|
||||
key_process(scan & 0x1ff, down);
|
||||
if (mouse_capture || !kbd_req_capture || video_fullscreen) {
|
||||
recv_key[scan & 0x1ff] = down;
|
||||
key_process(scan & 0x1ff, down);
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
@@ -343,30 +342,36 @@ keyboard_recv(uint16_t key)
|
||||
return recv_key[key];
|
||||
}
|
||||
|
||||
int
|
||||
keyboard_recv_ui(uint16_t key)
|
||||
{
|
||||
return recv_key_ui[key];
|
||||
}
|
||||
|
||||
/* Do we have Control-Alt-PgDn in the keyboard buffer? */
|
||||
int
|
||||
keyboard_isfsenter(void)
|
||||
{
|
||||
return ((recv_key[0x01d] || recv_key[0x11d]) && (recv_key[0x038] || recv_key[0x138]) && (recv_key[0x049] || recv_key[0x149]));
|
||||
return ((recv_key_ui[0x01d] || recv_key_ui[0x11d]) && (recv_key_ui[0x038] || recv_key_ui[0x138]) && (recv_key_ui[0x049] || recv_key_ui[0x149]));
|
||||
}
|
||||
|
||||
int
|
||||
keyboard_isfsenter_up(void)
|
||||
{
|
||||
return (!recv_key[0x01d] && !recv_key[0x11d] && !recv_key[0x038] && !recv_key[0x138] && !recv_key[0x049] && !recv_key[0x149]);
|
||||
return (!recv_key_ui[0x01d] && !recv_key_ui[0x11d] && !recv_key_ui[0x038] && !recv_key_ui[0x138] && !recv_key_ui[0x049] && !recv_key_ui[0x149]);
|
||||
}
|
||||
|
||||
/* Do we have Control-Alt-PgDn in the keyboard buffer? */
|
||||
int
|
||||
keyboard_isfsexit(void)
|
||||
{
|
||||
return ((recv_key[0x01d] || recv_key[0x11d]) && (recv_key[0x038] || recv_key[0x138]) && (recv_key[0x051] || recv_key[0x151]));
|
||||
return ((recv_key_ui[0x01d] || recv_key_ui[0x11d]) && (recv_key_ui[0x038] || recv_key_ui[0x138]) && (recv_key_ui[0x051] || recv_key_ui[0x151]));
|
||||
}
|
||||
|
||||
int
|
||||
keyboard_isfsexit_up(void)
|
||||
{
|
||||
return (!recv_key[0x01d] && !recv_key[0x11d] && !recv_key[0x038] && !recv_key[0x138] && !recv_key[0x051] && !recv_key[0x151]);
|
||||
return (!recv_key_ui[0x01d] && !recv_key_ui[0x11d] && !recv_key_ui[0x038] && !recv_key_ui[0x138] && !recv_key_ui[0x051] && !recv_key_ui[0x151]);
|
||||
}
|
||||
|
||||
/* Do we have the mouse uncapture combination in the keyboard buffer? */
|
||||
@@ -374,10 +379,10 @@ int
|
||||
keyboard_ismsexit(void)
|
||||
{
|
||||
if ((key_prefix_2_1 != 0x000) || (key_prefix_2_2 != 0x000))
|
||||
return ((recv_key[key_prefix_1_1] || recv_key[key_prefix_1_2]) &&
|
||||
(recv_key[key_prefix_2_1] || recv_key[key_prefix_2_2]) &&
|
||||
(recv_key[key_uncapture_1] || recv_key[key_uncapture_2]));
|
||||
return ((recv_key_ui[key_prefix_1_1] || recv_key_ui[key_prefix_1_2]) &&
|
||||
(recv_key_ui[key_prefix_2_1] || recv_key_ui[key_prefix_2_2]) &&
|
||||
(recv_key_ui[key_uncapture_1] || recv_key_ui[key_uncapture_2]));
|
||||
else
|
||||
return ((recv_key[key_prefix_1_1] || recv_key[key_prefix_1_2]) &&
|
||||
(recv_key[key_uncapture_1] || recv_key[key_uncapture_2]));
|
||||
return ((recv_key_ui[key_prefix_1_1] || recv_key_ui[key_prefix_1_2]) &&
|
||||
(recv_key_ui[key_uncapture_1] || recv_key_ui[key_uncapture_2]));
|
||||
}
|
||||
|
||||
@@ -2102,6 +2102,7 @@ keyboard_at_write(void *priv)
|
||||
/* TODO: This is supposed to resend multiple bytes after some commands. */
|
||||
case 0xfe: /* resend last scan code */
|
||||
keyboard_at_log("%s: resend last scan code\n", dev->name);
|
||||
kbc_at_dev_queue_add(dev, 0xfa, 0);
|
||||
kbc_at_dev_queue_add(dev, dev->last_scan_code, 0);
|
||||
break;
|
||||
|
||||
|
||||
@@ -928,11 +928,11 @@ kbd_read(uint16_t port, void *priv)
|
||||
else {
|
||||
/* LaserXT = Always 512k RAM;
|
||||
LaserXT/3 = Bit 0: set = 512k, clear = 256k. */
|
||||
#if defined(DEV_BRANCH) && defined(USE_LASERXT)
|
||||
#ifdef USE_LASERXT
|
||||
if (kbd->type == KBD_TYPE_VTECH)
|
||||
ret = ((mem_size == 512) ? 0x0d : 0x0c) | (hasfpu ? 0x02 : 0x00);
|
||||
else
|
||||
#endif
|
||||
#endif /* USE_LASERXT */
|
||||
ret = (kbd->pd & 0x0d) | (hasfpu ? 0x02 : 0x00);
|
||||
}
|
||||
}
|
||||
@@ -1292,7 +1292,7 @@ const device_t keyboard_xt_t1x00_device = {
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_LASERXT)
|
||||
#ifdef USE_LASERXT
|
||||
const device_t keyboard_xt_lxt3_device = {
|
||||
.name = "VTech Laser XT3 Keyboard",
|
||||
.internal_name = "keyboard_xt_lxt3",
|
||||
@@ -1306,7 +1306,7 @@ const device_t keyboard_xt_lxt3_device = {
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
#endif
|
||||
#endif /* USE_LASERXT */
|
||||
|
||||
const device_t keyboard_xt_olivetti_device = {
|
||||
.name = "Olivetti XT Keyboard",
|
||||
|
||||
@@ -98,7 +98,7 @@ static mouse_t mouse_devices[] = {
|
||||
{ &mouse_wacom_device },
|
||||
{ &mouse_wacom_artpad_device },
|
||||
#endif
|
||||
{ &mouse_mtouch_device },
|
||||
{ &mouse_mtouch_device },
|
||||
{ NULL }
|
||||
// clang-format on
|
||||
};
|
||||
@@ -482,10 +482,10 @@ mouse_subtract_z(int *delta_z, int min, int max, int invert)
|
||||
int z = atomic_load(&mouse_z);
|
||||
int real_z = invert ? -z : z;
|
||||
|
||||
if (mouse_z > max) {
|
||||
if (real_z > max) {
|
||||
*delta_z = max;
|
||||
real_z -= max;
|
||||
} else if (mouse_z < min) {
|
||||
} else if (real_z < min) {
|
||||
*delta_z = min;
|
||||
real_z += ABS(min);
|
||||
} else {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@ smbus_sis5595_read_data(void *priv)
|
||||
break;
|
||||
}
|
||||
|
||||
smbus_sis5595_log("SMBus SIS5595: read(%02X) = %02x\n", addr, ret);
|
||||
smbus_sis5595_log("SMBus SIS5595: read(%02X) = %02x\n", dev->addr, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -171,7 +171,7 @@ smbus_sis5595_write_data(void *priv, uint8_t val)
|
||||
uint16_t prev_stat;
|
||||
uint16_t timer_bytes = 0;
|
||||
|
||||
smbus_sis5595_log("SMBus SIS5595: write(%02X, %02X)\n", addr, val);
|
||||
smbus_sis5595_log("SMBus SIS5595: write(%02X, %02X)\n", dev->addr, val);
|
||||
|
||||
prev_stat = dev->next_stat;
|
||||
dev->next_stat = 0x0000;
|
||||
|
||||
@@ -9,14 +9,33 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
add_library(hdd OBJECT hdd.c hdd_image.c hdd_table.c hdc.c hdc_st506_xt.c
|
||||
hdc_st506_at.c hdc_xta.c hdc_esdi_at.c hdc_esdi_mca.c hdc_xtide.c
|
||||
hdc_ide.c hdc_ide_ali5213.c hdc_ide_opti611.c hdc_ide_cmd640.c hdc_ide_cmd646.c
|
||||
hdc_ide_sff8038i.c hdc_ide_um8673f.c hdc_ide_w83769f.c lba_enhancer.c)
|
||||
add_library(hdd OBJECT
|
||||
hdd.c
|
||||
hdd_image.c
|
||||
hdd_table.c
|
||||
hdc.c
|
||||
hdc_st506_xt.c
|
||||
hdc_st506_at.c
|
||||
hdc_xta.c
|
||||
hdc_esdi_at.c
|
||||
hdc_esdi_mca.c
|
||||
hdc_xtide.c
|
||||
hdc_ide.c
|
||||
hdc_ide_ali5213.c
|
||||
hdc_ide_opti611.c
|
||||
hdc_ide_cmd640.c
|
||||
hdc_ide_cmd646.c
|
||||
hdc_ide_sff8038i.c
|
||||
hdc_ide_um8673f.c
|
||||
hdc_ide_w83769f.c
|
||||
lba_enhancer.c
|
||||
)
|
||||
|
||||
add_library(zip OBJECT zip.c)
|
||||
|
||||
|
||||
@@ -188,6 +188,7 @@ typedef struct esdi_t {
|
||||
#define CMD_READ_VERIFY 0x03
|
||||
#define CMD_WRITE_VERIFY 0x04
|
||||
#define CMD_SEEK 0x05
|
||||
#define CMD_PARK_HEADS 0x06
|
||||
#define CMD_GET_DEV_STATUS 0x08
|
||||
#define CMD_GET_DEV_CONFIG 0x09
|
||||
#define CMD_GET_POS_INFO 0x0a
|
||||
@@ -605,6 +606,35 @@ esdi_callback(void *priv)
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_PARK_HEADS:
|
||||
ESDI_DRIVE_ONLY();
|
||||
|
||||
if (!drive->present) {
|
||||
device_not_present(dev);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (dev->cmd_state) {
|
||||
case 0:
|
||||
dev->rba = 0x00000000;
|
||||
cmd_time = hdd_seek_get_time(&hdd[drive->hdd_num], dev->rba, HDD_OP_SEEK, 0, 0.0);
|
||||
esdi_mca_set_callback(dev, ESDI_TIME + cmd_time);
|
||||
dev->cmd_state = 1;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
complete_command_status(dev);
|
||||
dev->status = STATUS_IRQ | STATUS_STATUS_OUT_FULL;
|
||||
dev->irq_status = dev->cmd_dev | IRQ_CMD_COMPLETE_SUCCESS;
|
||||
dev->irq_in_progress = 1;
|
||||
set_irq(dev);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_GET_DEV_STATUS:
|
||||
ESDI_DRIVE_ONLY();
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ ali5213_write(uint16_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
ali5213_t *dev = (ali5213_t *) priv;
|
||||
|
||||
ali5213_log("[%04X:%08X] [W] %02X = %02X (%i)\n", CS, cpu_state.pc, port, val, dev->tries);
|
||||
ali5213_log("[%04X:%08X] [W] %02X = %02X\n", CS, cpu_state.pc, addr, val);
|
||||
|
||||
switch (addr) {
|
||||
case 0xf4: /* Usually it writes 30h here */
|
||||
@@ -179,7 +179,7 @@ ali5213_read(uint16_t addr, void *priv)
|
||||
break;
|
||||
}
|
||||
|
||||
ali5213_log("[%04X:%08X] [R] %02X = %02X\n", CS, cpu_state.pc, port, ret);
|
||||
ali5213_log("[%04X:%08X] [R] %02X = %02X\n", CS, cpu_state.pc, addr, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ um8673f_write(uint16_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
um8673f_t *dev = (um8673f_t *) priv;
|
||||
|
||||
um8673f_log("[%04X:%08X] [W] %02X = %02X (%i)\n", CS, cpu_state.pc, port, val, dev->tries);
|
||||
um8673f_log("[%04X:%08X] [W] %02X = %02X (%i)\n", CS, cpu_state.pc, addr, val, dev->tries);
|
||||
|
||||
switch (addr) {
|
||||
case 0x108:
|
||||
@@ -140,7 +140,7 @@ um8673f_read(uint16_t addr, void *priv)
|
||||
break;
|
||||
}
|
||||
|
||||
um8673f_log("[%04X:%08X] [R] %02X = %02X\n", CS, cpu_state.pc, port, ret);
|
||||
um8673f_log("[%04X:%08X] [R] %02X = %02X\n", CS, cpu_state.pc, addr, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ w83769f_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (cmd640_do_log) {
|
||||
if (w83769f_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -26,6 +26,9 @@
|
||||
#include <time.h>
|
||||
#include <wchar.h>
|
||||
#include <errno.h>
|
||||
#ifdef __unix__
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/path.h>
|
||||
@@ -183,6 +186,7 @@ prepare_new_hard_disk(uint8_t id, uint64_t full_size)
|
||||
{
|
||||
uint64_t target_size = (full_size + hdd_images[id].base) - ftello64(hdd_images[id].file);
|
||||
|
||||
#ifndef __unix__
|
||||
uint32_t size;
|
||||
uint32_t t;
|
||||
|
||||
@@ -217,7 +221,16 @@ prepare_new_hard_disk(uint8_t id, uint64_t full_size)
|
||||
pclog_toggle_suppr();
|
||||
|
||||
free(empty_sector_1mb);
|
||||
#else
|
||||
pclog("Creating hard disk image: ");
|
||||
int ret = ftruncate(fileno(hdd_images[id].file), (size_t) target_size);
|
||||
|
||||
if (ret) {
|
||||
pclog("failed\n");
|
||||
fatal("Could not create hard disk image\n");
|
||||
}
|
||||
pclog("OK!\n");
|
||||
#endif
|
||||
hdd_images[id].last_sector = (uint32_t) (full_size >> 9) - 1;
|
||||
|
||||
hdd_images[id].loaded = 1;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
* Copyright 2016-2020 Miran Grca.
|
||||
* Copyright 2017-2020 Fred N. van Kempen.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
88
src/fifo8.c
88
src/fifo8.c
@@ -21,14 +21,19 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/fifo8.h>
|
||||
|
||||
void
|
||||
fifo8_reset(Fifo8 *fifo)
|
||||
{
|
||||
fifo->num = 0;
|
||||
fifo->head = 0;
|
||||
}
|
||||
|
||||
void
|
||||
fifo8_create(Fifo8 *fifo, uint32_t capacity)
|
||||
{
|
||||
fifo->data = (uint8_t *) malloc(capacity);
|
||||
memset(fifo->data, 0, capacity);
|
||||
fifo->data = (uint8_t *) calloc(1, capacity);
|
||||
fifo->capacity = capacity;
|
||||
fifo->head = 0;
|
||||
fifo->num = 0;
|
||||
fifo8_reset(fifo);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -54,7 +59,7 @@ fifo8_push_all(Fifo8 *fifo, const uint8_t *data, uint32_t num)
|
||||
uint32_t start;
|
||||
uint32_t avail;
|
||||
|
||||
assert(fifo->num + num <= fifo->capacity);
|
||||
assert((fifo->num + num) <= fifo->capacity);
|
||||
|
||||
start = (fifo->head + fifo->num) % fifo->capacity;
|
||||
|
||||
@@ -81,25 +86,72 @@ fifo8_pop(Fifo8 *fifo)
|
||||
return ret;
|
||||
}
|
||||
|
||||
const uint8_t *
|
||||
fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *num)
|
||||
static const uint8_t
|
||||
*fifo8_peekpop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr, int do_pop)
|
||||
{
|
||||
const uint8_t *ret;
|
||||
uint8_t *ret;
|
||||
uint32_t num;
|
||||
|
||||
assert((max > 0) && (max <= fifo->num));
|
||||
num = MIN(fifo->capacity - fifo->head, max);
|
||||
ret = &fifo->data[fifo->head];
|
||||
|
||||
if (do_pop) {
|
||||
fifo->head += num;
|
||||
fifo->head %= fifo->capacity;
|
||||
fifo->num -= num;
|
||||
}
|
||||
if (numptr)
|
||||
*numptr = num;
|
||||
|
||||
assert(max > 0 && max <= fifo->num);
|
||||
*num = MIN(fifo->capacity - fifo->head, max);
|
||||
ret = &fifo->data[fifo->head];
|
||||
fifo->head += *num;
|
||||
fifo->head %= fifo->capacity;
|
||||
fifo->num -= *num;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
fifo8_reset(Fifo8 *fifo)
|
||||
const uint8_t
|
||||
*fifo8_peek_bufptr(Fifo8 *fifo, uint32_t max, uint32_t *numptr)
|
||||
{
|
||||
fifo->num = 0;
|
||||
fifo->head = 0;
|
||||
return fifo8_peekpop_buf(fifo, max, numptr, 0);
|
||||
}
|
||||
|
||||
const uint8_t
|
||||
*fifo8_pop_bufptr(Fifo8 *fifo, uint32_t max, uint32_t *numptr)
|
||||
{
|
||||
return fifo8_peekpop_buf(fifo, max, numptr, 1);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
fifo8_pop_buf(Fifo8 *fifo, uint8_t *dest, uint32_t destlen)
|
||||
{
|
||||
const uint8_t *buf;
|
||||
uint32_t n1, n2 = 0;
|
||||
uint32_t len;
|
||||
|
||||
if (destlen == 0)
|
||||
return 0;
|
||||
|
||||
len = destlen;
|
||||
buf = fifo8_pop_bufptr(fifo, len, &n1);
|
||||
if (dest)
|
||||
memcpy(dest, buf, n1);
|
||||
|
||||
/* Add FIFO wraparound if needed */
|
||||
len -= n1;
|
||||
len = MIN(len, fifo8_num_used(fifo));
|
||||
if (len) {
|
||||
buf = fifo8_pop_bufptr(fifo, len, &n2);
|
||||
if (dest) {
|
||||
memcpy(&dest[n1], buf, n2);
|
||||
}
|
||||
}
|
||||
|
||||
return n1 + n2;
|
||||
}
|
||||
|
||||
void
|
||||
fifo8_drop(Fifo8 *fifo, uint32_t len)
|
||||
{
|
||||
len -= fifo8_pop_buf(fifo, NULL, len);
|
||||
assert(len == 0);
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
@@ -9,13 +9,28 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
add_library(fdd OBJECT fdd.c fdc.c fdc_magitronic.c fdc_monster.c fdc_pii15xb.c
|
||||
fdi2raw.c fdd_common.c fdd_86f.c fdd_fdi.c fdd_imd.c fdd_img.c fdd_pcjs.c
|
||||
fdd_mfm.c fdd_td0.c)
|
||||
add_library(fdd OBJECT
|
||||
fdd.c
|
||||
fdc.c
|
||||
fdc_magitronic.c
|
||||
fdc_monster.c
|
||||
fdc_pii15xb.c
|
||||
fdi2raw.c
|
||||
fdd_common.c
|
||||
fdd_86f.c
|
||||
fdd_fdi.c
|
||||
fdd_imd.c
|
||||
fdd_img.c
|
||||
fdd_pcjs.c
|
||||
fdd_mfm.c
|
||||
fdd_td0.c
|
||||
)
|
||||
|
||||
add_subdirectory(lzw)
|
||||
target_link_libraries(86Box lzw)
|
||||
|
||||
@@ -612,9 +612,11 @@ fdc_io_command_phase1(fdc_t *fdc, int out)
|
||||
|
||||
ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1);
|
||||
fdc->stat = out ? 0x10 : 0x50;
|
||||
if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma)
|
||||
if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma) {
|
||||
fdc->stat |= 0x20;
|
||||
else
|
||||
if (out)
|
||||
fdc->stat |= 0x80;
|
||||
} else
|
||||
dma_set_drq(fdc->dma_ch, 1);
|
||||
}
|
||||
|
||||
@@ -1635,6 +1637,8 @@ fdc_callback(void *priv)
|
||||
return;
|
||||
}
|
||||
if (fdd_get_head(real_drive(fdc, fdc->drive)) == 0) {
|
||||
fdc->sector = 1;
|
||||
fdc->head |= 1;
|
||||
fdd_set_head(real_drive(fdc, fdc->drive), 1);
|
||||
if (!fdd_is_double_sided(real_drive(fdc, fdc->drive))) {
|
||||
fdc_noidam(fdc);
|
||||
|
||||
@@ -11,10 +11,11 @@
|
||||
*
|
||||
*
|
||||
* Authors: Jasmine Iwanek, <jasmine@iwanek.co.uk>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
* Copyright 2022 Jasmine Iwanek.
|
||||
* Copyright 2022-2024 Jasmine Iwanek.
|
||||
* Copyright 2024 Miran Grca.
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
@@ -103,10 +104,10 @@ monster_fdc_close(void *priv)
|
||||
monster_fdc_t *dev = (monster_fdc_t *) priv;
|
||||
|
||||
if (dev->nvr_path[0] != 0x00) {
|
||||
FILE *f = nvr_fopen(dev->nvr_path, "wb");
|
||||
if (f != NULL) {
|
||||
fwrite(dev->bios_rom.rom, 1, 0x2000, f);
|
||||
fclose(f);
|
||||
FILE *fp = nvr_fopen(dev->nvr_path, "wb");
|
||||
if (fp != NULL) {
|
||||
fwrite(dev->bios_rom.rom, 1, 0x2000, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,10 +145,10 @@ monster_fdc_init(UNUSED(const device_t *info))
|
||||
if (rom_writes_enabled) {
|
||||
mem_mapping_set_write_handler(&dev->bios_rom.mapping, rom_write, rom_writew, rom_writel);
|
||||
sprintf(dev->nvr_path, "monster_fdc_%i.nvr", device_get_instance());
|
||||
FILE *f = nvr_fopen(dev->nvr_path, "rb");
|
||||
if (f != NULL) {
|
||||
fread(dev->bios_rom.rom, 1, 0x2000, f);
|
||||
fclose(f);
|
||||
FILE *fp = nvr_fopen(dev->nvr_path, "rb");
|
||||
if (fp != NULL) {
|
||||
(void) !fread(dev->bios_rom.rom, 1, 0x2000, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,9 +9,16 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
add_library(game OBJECT gameport.c joystick_standard.c
|
||||
joystick_ch_flightstick_pro.c joystick_sw_pad.c joystick_tm_fcs.c)
|
||||
add_library(game OBJECT
|
||||
gameport.c
|
||||
joystick_standard.c
|
||||
joystick_ch_flightstick_pro.c
|
||||
joystick_sw_pad.c
|
||||
joystick_tm_fcs.c
|
||||
)
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <86box/86box.h>
|
||||
#include "cpu.h"
|
||||
#include "x86seg.h"
|
||||
#include "x87_sf.h"
|
||||
#include "x87.h"
|
||||
#include "x87_ops_conv.h"
|
||||
#include <86box/io.h>
|
||||
@@ -1512,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;
|
||||
@@ -1529,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");
|
||||
@@ -1538,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;
|
||||
|
||||
@@ -195,7 +195,7 @@ extern const device_t nec_mate_unk_device;
|
||||
extern const device_t phoenix_486_jumper_device;
|
||||
extern const device_t phoenix_486_jumper_pci_device;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_OLIVETTI)
|
||||
#ifdef USE_OLIVETTI
|
||||
extern const device_t olivetti_eva_device;
|
||||
#endif
|
||||
#endif /* USE_OLIVETTI */
|
||||
#endif /*EMU_CHIPSET_H*/
|
||||
|
||||
@@ -69,28 +69,80 @@ extern uint8_t fifo8_pop(Fifo8 *fifo);
|
||||
/**
|
||||
* fifo8_pop_buf:
|
||||
* @fifo: FIFO to pop from
|
||||
* @max: maximum number of bytes to pop
|
||||
* @num: actual number of returned bytes
|
||||
* @dest: the buffer to write the data into (can be NULL)
|
||||
* @destlen: size of @dest and maximum number of bytes to pop
|
||||
*
|
||||
* Pop a number of elements from the FIFO up to a maximum of max. The buffer
|
||||
* Pop a number of elements from the FIFO up to a maximum of @destlen.
|
||||
* The popped data is copied into the @dest buffer.
|
||||
* Care is taken when the data wraps around in the ring buffer.
|
||||
*
|
||||
* Returns: number of bytes popped.
|
||||
*/
|
||||
extern uint32_t fifo8_pop_buf(Fifo8 *fifo, uint8_t *dest, uint32_t destlen);
|
||||
|
||||
/**
|
||||
* fifo8_pop_bufptr:
|
||||
* @fifo: FIFO to pop from
|
||||
* @max: maximum number of bytes to pop
|
||||
* @numptr: pointer filled with number of bytes returned (can be NULL)
|
||||
*
|
||||
* New code should prefer to use fifo8_pop_buf() instead of fifo8_pop_bufptr().
|
||||
*
|
||||
* Pop a number of elements from the FIFO up to a maximum of @max. The buffer
|
||||
* containing the popped data is returned. This buffer points directly into
|
||||
* the FIFO backing store and data is invalidated once any of the fifo8_* APIs
|
||||
* are called on the FIFO.
|
||||
* the internal FIFO backing store and data (without checking for overflow!)
|
||||
* and is invalidated once any of the fifo8_* APIs are called on the FIFO.
|
||||
*
|
||||
* The function may return fewer bytes than requested when the data wraps
|
||||
* around in the ring buffer; in this case only a contiguous part of the data
|
||||
* is returned.
|
||||
*
|
||||
* The number of valid bytes returned is populated in *num; will always return
|
||||
* at least 1 byte. max must not be 0 or greater than the number of bytes in
|
||||
* the FIFO.
|
||||
* The number of valid bytes returned is populated in *@numptr; will always
|
||||
* return at least 1 byte. max must not be 0 or greater than the number of
|
||||
* bytes in the FIFO.
|
||||
*
|
||||
* Clients are responsible for checking the availability of requested data
|
||||
* using fifo8_num_used().
|
||||
*
|
||||
* Returns: A pointer to popped data.
|
||||
*/
|
||||
extern const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *num);
|
||||
extern const uint8_t *fifo8_pop_bufptr(Fifo8 *fifo, uint32_t max, uint32_t *numptr);
|
||||
|
||||
/**
|
||||
* fifo8_peek_bufptr: read upto max bytes from the fifo
|
||||
* @fifo: FIFO to read from
|
||||
* @max: maximum number of bytes to peek
|
||||
* @numptr: pointer filled with number of bytes returned (can be NULL)
|
||||
*
|
||||
* Peek into a number of elements from the FIFO up to a maximum of @max.
|
||||
* The buffer containing the data peeked into is returned. This buffer points
|
||||
* directly into the FIFO backing store. Since data is invalidated once any
|
||||
* of the fifo8_* APIs are called on the FIFO, it is the caller responsibility
|
||||
* to access it before doing further API calls.
|
||||
*
|
||||
* The function may return fewer bytes than requested when the data wraps
|
||||
* around in the ring buffer; in this case only a contiguous part of the data
|
||||
* is returned.
|
||||
*
|
||||
* The number of valid bytes returned is populated in *@numptr; will always
|
||||
* return at least 1 byte. max must not be 0 or greater than the number of
|
||||
* bytes in the FIFO.
|
||||
*
|
||||
* Clients are responsible for checking the availability of requested data
|
||||
* using fifo8_num_used().
|
||||
*
|
||||
* Returns: A pointer to peekable data.
|
||||
*/
|
||||
extern const uint8_t *fifo8_peek_bufptr(Fifo8 *fifo, uint32_t max, uint32_t *numptr);
|
||||
|
||||
/**
|
||||
* fifo8_drop:
|
||||
* @fifo: FIFO to drop bytes
|
||||
* @len: number of bytes to drop
|
||||
*
|
||||
* Drop (consume) bytes from a FIFO.
|
||||
*/
|
||||
extern void fifo8_drop(Fifo8 *fifo, uint32_t len);
|
||||
|
||||
/**
|
||||
* fifo8_reset:
|
||||
|
||||
@@ -222,9 +222,9 @@ extern const device_t keyboard_xt86_device;
|
||||
extern const device_t keyboard_xt_compaq_device;
|
||||
extern const device_t keyboard_xt_t1x00_device;
|
||||
extern const device_t keyboard_tandy_device;
|
||||
# if defined(DEV_BRANCH) && defined(USE_LASERXT)
|
||||
# ifdef USE_LASERXT
|
||||
extern const device_t keyboard_xt_lxt3_device;
|
||||
# endif /*defined(DEV_BRANCH) && defined(USE_LASERXT) */
|
||||
# endif /* USE_LASERXT */
|
||||
extern const device_t keyboard_xt_olivetti_device;
|
||||
extern const device_t keyboard_xt_zenith_device;
|
||||
extern const device_t keyboard_xt_hyundai_device;
|
||||
@@ -272,6 +272,7 @@ extern uint8_t keyboard_get_shift(void);
|
||||
extern void keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl);
|
||||
extern void keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl);
|
||||
extern int keyboard_recv(uint16_t key);
|
||||
extern int keyboard_recv_ui(uint16_t key);
|
||||
extern int keyboard_isfsenter(void);
|
||||
extern int keyboard_isfsenter_up(void);
|
||||
extern int keyboard_isfsexit(void);
|
||||
|
||||
@@ -437,9 +437,9 @@ extern int machine_at_ibmxt286_init(const machine_t *);
|
||||
extern int machine_at_siemens_init(const machine_t *); // Siemens PCD-2L. N82330 discrete machine. It segfaults in some places
|
||||
|
||||
extern int machine_at_wellamerastar_init(const machine_t *); // Wells American A*Star with custom award BIOS
|
||||
#if defined(DEV_BRANCH) && defined(USE_OPEN_AT)
|
||||
#ifdef USE_OPEN_AT
|
||||
extern int machine_at_openat_init(const machine_t *);
|
||||
#endif
|
||||
#endif /* USE_OPEN_AT */
|
||||
|
||||
/* m_at_286_386sx.c */
|
||||
extern int machine_at_tg286m_init(const machine_t *);
|
||||
@@ -468,9 +468,9 @@ extern int machine_at_deskmaster286_init(const machine_t *);
|
||||
extern int machine_at_pc8_init(const machine_t *);
|
||||
extern int machine_at_3302_init(const machine_t *);
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_OLIVETTI)
|
||||
#ifdef USE_OLIVETTI
|
||||
extern int machine_at_m290_init(const machine_t *);
|
||||
#endif
|
||||
#endif /* USE_OLIVETTI */
|
||||
|
||||
extern int machine_at_shuttle386sx_init(const machine_t *);
|
||||
extern int machine_at_adi386sx_init(const machine_t *);
|
||||
@@ -726,9 +726,9 @@ extern int machine_at_i430vx_init(const machine_t *);
|
||||
extern int machine_at_ma23c_init(const machine_t *);
|
||||
extern int machine_at_nupro592_init(const machine_t *);
|
||||
extern int machine_at_tx97_init(const machine_t *);
|
||||
#if defined(DEV_BRANCH) && defined(USE_AN430TX)
|
||||
#ifdef USE_AN430TX
|
||||
extern int machine_at_an430tx_init(const machine_t *);
|
||||
#endif
|
||||
#endif /* USE_AN430TX */
|
||||
extern int machine_at_ym430tx_init(const machine_t *);
|
||||
extern int machine_at_thunderbolt_init(const machine_t *);
|
||||
extern int machine_at_mb540n_init(const machine_t *);
|
||||
@@ -890,7 +890,7 @@ extern int machine_ps2_model_70_type4_init(const machine_t *);
|
||||
|
||||
/* m_tandy.c */
|
||||
extern int tandy1k_eeprom_read(void);
|
||||
extern int machine_tandy_init(const machine_t *);
|
||||
extern int machine_tandy1000sx_init(const machine_t *);
|
||||
extern int machine_tandy1000hx_init(const machine_t *);
|
||||
extern int machine_tandy1000sl2_init(const machine_t *);
|
||||
|
||||
@@ -941,10 +941,10 @@ extern int machine_xt_compaq_deskpro_init(const machine_t *);
|
||||
extern int machine_xt_compaq_portable_init(const machine_t *);
|
||||
|
||||
/* m_xt_laserxt.c */
|
||||
#if defined(DEV_BRANCH) && defined(USE_LASERXT)
|
||||
#ifdef USE_LASERXT
|
||||
extern int machine_xt_laserxt_init(const machine_t *);
|
||||
extern int machine_xt_lxt3_init(const machine_t *);
|
||||
#endif
|
||||
#endif /* USE_LASERXT */
|
||||
|
||||
/* m_xt_philips.c */
|
||||
extern int machine_xt_p3105_init(const machine_t *);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -32,6 +32,7 @@ typedef struct midi_device_t {
|
||||
void (*play_sysex)(uint8_t *sysex, unsigned int len);
|
||||
void (*play_msg)(uint8_t *msg);
|
||||
void (*poll)(void);
|
||||
void (*reset)(void);
|
||||
int (*write)(uint8_t val);
|
||||
} midi_device_t;
|
||||
|
||||
@@ -77,6 +78,7 @@ extern void midi_raw_out_thru_rt_byte(uint8_t val);
|
||||
extern void midi_raw_out_byte(uint8_t val);
|
||||
extern void midi_clear_buffer(void);
|
||||
extern void midi_poll(void);
|
||||
extern void midi_reset(void);
|
||||
|
||||
extern void midi_in_handler(int set, void (*msg)(void *priv, uint8_t *msg, uint32_t len), int (*sysex)(void *priv, uint8_t *buffer, uint32_t len, int abort), void *priv);
|
||||
extern void midi_in_handlers_clear(void);
|
||||
@@ -102,18 +104,18 @@ extern void midi_in_sysex(uint8_t *buffer, uint32_t len);
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t rtmidi_output_device;
|
||||
extern const device_t rtmidi_input_device;
|
||||
# if defined(DEV_BRANCH) && defined(USE_OPL4ML)
|
||||
# ifdef USE_OPL4ML
|
||||
extern const device_t opl4_midi_device;
|
||||
# endif
|
||||
# endif /* USE_OPL4ML */
|
||||
# ifdef USE_FLUIDSYNTH
|
||||
extern const device_t fluidsynth_device;
|
||||
# endif
|
||||
# endif /* USE_FLUIDSYNTH */
|
||||
# ifdef USE_MUNT
|
||||
extern const device_t mt32_old_device;
|
||||
extern const device_t mt32_new_device;
|
||||
extern const device_t cm32l_device;
|
||||
extern const device_t cm32ln_device;
|
||||
# endif
|
||||
# endif /* USE_MUNT */
|
||||
#endif
|
||||
|
||||
#endif /*EMU_SOUND_MIDI_H*/
|
||||
|
||||
@@ -71,8 +71,10 @@ extern const device_t mouse_mssystems_device;
|
||||
extern const device_t mouse_msserial_device;
|
||||
extern const device_t mouse_ltserial_device;
|
||||
extern const device_t mouse_ps2_device;
|
||||
# ifdef USE_WACOM
|
||||
extern const device_t mouse_wacom_device;
|
||||
extern const device_t mouse_wacom_artpad_device;
|
||||
# endif
|
||||
extern const device_t mouse_mtouch_device;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
#ifndef EMU_PIT_H
|
||||
#define EMU_PIT_H
|
||||
|
||||
#define NUM_COUNTERS 3
|
||||
|
||||
typedef struct ctr_t {
|
||||
uint8_t m;
|
||||
uint8_t ctrl;
|
||||
@@ -68,7 +70,7 @@ typedef struct PIT {
|
||||
int clock;
|
||||
pc_timer_t callback_timer;
|
||||
|
||||
ctr_t counters[3];
|
||||
ctr_t counters[NUM_COUNTERS];
|
||||
|
||||
uint8_t ctrl;
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ typedef struct ctrf_t {
|
||||
|
||||
typedef struct pitf_t {
|
||||
int flags;
|
||||
ctrf_t counters[3];
|
||||
ctrf_t counters[NUM_COUNTERS];
|
||||
|
||||
uint8_t ctrl;
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#ifndef SCSI_PCSCSI_H
|
||||
#define SCSI_PCSCSI_H
|
||||
|
||||
extern const device_t am53c974_pci_device;
|
||||
extern const device_t dc390_pci_device;
|
||||
extern const device_t ncr53c90a_mca_device;
|
||||
|
||||
|
||||
@@ -75,9 +75,9 @@ extern const device_t prime3b_ide_device;
|
||||
extern const device_t prime3c_device;
|
||||
extern const device_t prime3c_ide_device;
|
||||
extern const device_t ps1_m2133_sio;
|
||||
#if defined(DEV_BRANCH) && defined(USE_SIO_DETECT)
|
||||
#ifdef USE_SIO_DETECT
|
||||
extern const device_t sio_detect_device;
|
||||
#endif
|
||||
#endif /* USE_SIO_DETECT */
|
||||
extern const device_t um8663af_device;
|
||||
extern const device_t um8663af_ide_device;
|
||||
extern const device_t um8663af_sec_device;
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
|
||||
#define MPU401_VERSION 0x15
|
||||
#define MPU401_REVISION 0x01
|
||||
#define MPU401_QUEUE 1024
|
||||
#define MPU401_QUEUE 32
|
||||
#define MPU401_INPUT_QUEUE 1024
|
||||
#define MPU401_TIMECONSTANT (60000000 / 1000.0f)
|
||||
#define MPU401_TIMECONSTANT (60000000.0 / 1000.0)
|
||||
#define MPU401_RESETBUSY 27.0f
|
||||
|
||||
/*helpers*/
|
||||
@@ -89,7 +89,7 @@ typedef struct mpu_t {
|
||||
uint32_t ch_toref[16];
|
||||
struct track {
|
||||
int counter;
|
||||
uint8_t value[3];
|
||||
uint8_t value[8];
|
||||
uint8_t sys_val;
|
||||
uint8_t vlength;
|
||||
uint8_t length;
|
||||
@@ -106,7 +106,6 @@ typedef struct mpu_t {
|
||||
int wsm;
|
||||
int wsd_start;
|
||||
int run_irq;
|
||||
int irq_pending;
|
||||
int track_req;
|
||||
int send_now;
|
||||
int eoi_scheduled;
|
||||
@@ -116,9 +115,11 @@ typedef struct mpu_t {
|
||||
int sysex_in_finished;
|
||||
int rec_copy;
|
||||
RecState rec;
|
||||
uint8_t irq_pending;
|
||||
uint8_t tmask;
|
||||
uint8_t cmask;
|
||||
uint8_t amask;
|
||||
uint8_t queued_eois;
|
||||
uint8_t last_rtcmd;
|
||||
uint16_t midi_mask;
|
||||
uint16_t req_mask;
|
||||
|
||||
@@ -20,6 +20,9 @@ typedef struct sn76489_t {
|
||||
int freqhi[4];
|
||||
int vol[4];
|
||||
uint32_t shift;
|
||||
uint32_t white_noise_tap_1;
|
||||
uint32_t white_noise_tap_2;
|
||||
uint32_t feedback_mask;
|
||||
uint8_t noise;
|
||||
int lasttone;
|
||||
uint8_t firstdat;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -87,6 +87,7 @@ typedef struct svga_t {
|
||||
int dac_b;
|
||||
int vtotal;
|
||||
int dispend;
|
||||
int vdisp;
|
||||
int vsyncstart;
|
||||
int split;
|
||||
int vblankstart;
|
||||
|
||||
@@ -408,6 +408,7 @@ typedef struct voodoo_t {
|
||||
atomic_int cmd_read;
|
||||
atomic_int cmd_written;
|
||||
atomic_int cmd_written_fifo;
|
||||
atomic_int cmd_written_fifo_2;
|
||||
|
||||
voodoo_params_t params_buffer[PARAM_SIZE];
|
||||
atomic_int params_read_idx[4];
|
||||
@@ -426,7 +427,20 @@ typedef struct voodoo_t {
|
||||
uint32_t cmdfifo_amax;
|
||||
int cmdfifo_holecount;
|
||||
|
||||
atomic_uint cmd_status;
|
||||
uint32_t cmdfifo_base_2;
|
||||
uint32_t cmdfifo_end_2;
|
||||
uint32_t cmdfifo_size_2;
|
||||
int cmdfifo_rp_2;
|
||||
int cmdfifo_ret_addr_2;
|
||||
int cmdfifo_in_sub_2;
|
||||
atomic_int cmdfifo_depth_rd_2;
|
||||
atomic_int cmdfifo_depth_wr_2;
|
||||
atomic_int cmdfifo_enabled_2;
|
||||
uint32_t cmdfifo_amin_2;
|
||||
uint32_t cmdfifo_amax_2;
|
||||
int cmdfifo_holecount_2;
|
||||
|
||||
atomic_uint cmd_status, cmd_status_2;
|
||||
|
||||
uint32_t sSetupMode;
|
||||
vert_t verts[4];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -47,6 +47,8 @@ typedef struct xga_t {
|
||||
|
||||
uint8_t pos_regs[8];
|
||||
uint8_t disp_addr;
|
||||
uint8_t dac_mask;
|
||||
uint8_t dac_status;
|
||||
uint8_t cfg_reg;
|
||||
uint8_t instance;
|
||||
uint8_t op_mode;
|
||||
@@ -106,6 +108,10 @@ typedef struct xga_t {
|
||||
uint16_t old_pal_addr_idx;
|
||||
uint16_t sprite_pal_addr_idx_prefetch;
|
||||
|
||||
int dac_addr;
|
||||
int dac_pos;
|
||||
int dac_r;
|
||||
int dac_g;
|
||||
int v_total;
|
||||
int dispend;
|
||||
int v_syncstart;
|
||||
|
||||
@@ -330,9 +330,9 @@ extern const device_t ati28800k_device;
|
||||
extern const device_t ati28800k_spc4620p_device;
|
||||
extern const device_t ati28800k_spc6033p_device;
|
||||
extern const device_t compaq_ati28800_device;
|
||||
# if defined(DEV_BRANCH) && defined(USE_XL24)
|
||||
# ifdef USE_XL24
|
||||
extern const device_t ati28800_wonderxl24_device;
|
||||
# endif
|
||||
# endif /* USE_XL24 */
|
||||
|
||||
/* Bochs */
|
||||
extern const device_t bochs_svga_device;
|
||||
@@ -448,7 +448,7 @@ extern const device_t mystique_220_device;
|
||||
extern const device_t millennium_ii_device;
|
||||
#ifdef USE_G100
|
||||
extern const device_t productiva_g100_device;
|
||||
#endif
|
||||
#endif /* USE_G100 */
|
||||
|
||||
/* Oak OTI-0x7 */
|
||||
extern const device_t oti037c_device;
|
||||
@@ -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;
|
||||
|
||||
@@ -11,10 +11,12 @@
|
||||
# Authors: dob205,
|
||||
# Jerome Vernet
|
||||
# David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2021 dob205.
|
||||
# Copyright 2021 Jerome Vernet.
|
||||
# Copyright 2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
# Pick the bundle icon depending on the release channel
|
||||
|
||||
@@ -9,20 +9,51 @@
|
||||
# CMake build script.
|
||||
#
|
||||
# Authors: David Hrdlička, <hrdlickadavid@outlook.com>
|
||||
# Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
#
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
# Copyright 2024 Jasmine Iwanek.
|
||||
#
|
||||
|
||||
add_library(mch OBJECT machine.c machine_table.c m_xt.c m_xt_compaq.c
|
||||
add_library(mch OBJECT
|
||||
machine.c
|
||||
machine_table.c
|
||||
m_xt.c
|
||||
m_xt_compaq.c
|
||||
m_xt_philips.c
|
||||
m_xt_t1000.c m_xt_t1000_vid.c m_xt_xi8088.c m_xt_zenith.c m_pcjr.c
|
||||
m_amstrad.c m_europc.c m_elt.c m_xt_olivetti.c m_tandy.c m_v86p.c
|
||||
m_at.c m_at_commodore.c
|
||||
m_at_t3100e.c m_at_t3100e_vid.c m_ps1.c m_ps1_hdc.c m_ps2_isa.c
|
||||
m_ps2_mca.c m_at_compaq.c m_at_286_386sx.c m_at_386dx_486.c
|
||||
m_at_socket4.c m_at_socket5.c m_at_socket7_3v.c m_at_socket7.c
|
||||
m_at_sockets7.c m_at_socket8.c m_at_slot1.c m_at_slot2.c m_at_socket370.c
|
||||
m_at_misc.c)
|
||||
m_xt_t1000.c
|
||||
m_xt_t1000_vid.c
|
||||
m_xt_xi8088.c
|
||||
m_xt_zenith.c
|
||||
m_pcjr.c
|
||||
m_amstrad.c
|
||||
m_europc.c
|
||||
m_elt.c
|
||||
m_xt_olivetti.c
|
||||
m_tandy.c
|
||||
m_v86p.c
|
||||
m_at.c
|
||||
m_at_commodore.c
|
||||
m_at_t3100e.c
|
||||
m_at_t3100e_vid.c
|
||||
m_ps1.c
|
||||
m_ps1_hdc.c
|
||||
m_ps2_isa.c
|
||||
m_ps2_mca.c
|
||||
m_at_compaq.c
|
||||
m_at_286_386sx.c
|
||||
m_at_386dx_486.c
|
||||
m_at_socket4.c
|
||||
m_at_socket5.c
|
||||
m_at_socket7_3v.c
|
||||
m_at_socket7.c
|
||||
m_at_sockets7.c
|
||||
m_at_socket8.c
|
||||
m_at_slot1.c
|
||||
m_at_slot2.c
|
||||
m_at_socket370.c
|
||||
m_at_misc.c
|
||||
)
|
||||
|
||||
if(AN430TX)
|
||||
target_compile_definitions(mch PRIVATE USE_AN430TX)
|
||||
|
||||
@@ -275,7 +275,7 @@ machine_at_wellamerastar_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_OPEN_AT)
|
||||
#ifdef USE_OPEN_AT
|
||||
int
|
||||
machine_at_openat_init(const machine_t *model)
|
||||
{
|
||||
@@ -291,4 +291,4 @@ machine_at_openat_init(const machine_t *model)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_OPEN_AT */
|
||||
|
||||
@@ -965,7 +965,7 @@ machine_at_pc916sx_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_OLIVETTI)
|
||||
#ifdef USE_OLIVETTI
|
||||
int
|
||||
machine_at_m290_init(const machine_t *model)
|
||||
{
|
||||
@@ -988,4 +988,4 @@ machine_at_m290_init(const machine_t *model)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_OLIVETTI */
|
||||
|
||||
@@ -914,7 +914,7 @@ machine_at_pci400ca_init(const machine_t *model)
|
||||
pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1);
|
||||
pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2);
|
||||
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
|
||||
device_add(&keyboard_ps2_ami_device);
|
||||
device_add(&keyboard_at_ami_device);
|
||||
device_add(&sio_device);
|
||||
device_add(&intel_flash_bxt_ami_device);
|
||||
|
||||
@@ -1352,7 +1352,7 @@ machine_at_486sp3_init(const machine_t *model)
|
||||
pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 05 = Slot 3 */
|
||||
pci_register_slot(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); /* 06 = Slot 4 */
|
||||
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
|
||||
device_add(&keyboard_ps2_ami_pci_device); /* Uses the AMIKEY KBC */
|
||||
device_add(&keyboard_at_ami_device); /* Uses the AMIKEY KBC */
|
||||
device_add(&sio_device);
|
||||
device_add(&fdc37c663_ide_device);
|
||||
device_add(&sst_flash_29ee010_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);
|
||||
|
||||
@@ -296,7 +296,7 @@ machine_at_award_common_init(const machine_t *model)
|
||||
if (fdc_current[0] == FDC_INTERNAL)
|
||||
device_add(&fdc_at_device);
|
||||
|
||||
device_add(&keyboard_ps2_ami_pci_device);
|
||||
device_add(&keyboard_at_ami_device);
|
||||
device_add(&sio_zb_device);
|
||||
device_add(&intel_flash_bxt_device);
|
||||
}
|
||||
|
||||
@@ -935,7 +935,7 @@ machine_at_tx97_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_AN430TX)
|
||||
#ifdef USE_AN430TX
|
||||
int
|
||||
machine_at_an430tx_init(const machine_t *model)
|
||||
{
|
||||
@@ -979,7 +979,7 @@ machine_at_an430tx_init(const machine_t *model)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif /* USE_AN430TX */
|
||||
|
||||
int
|
||||
machine_at_ym430tx_init(const machine_t *model)
|
||||
|
||||
@@ -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>
|
||||
@@ -52,6 +53,7 @@ enum {
|
||||
|
||||
enum {
|
||||
TYPE_TANDY = 0,
|
||||
TYPE_TANDY1000SX,
|
||||
TYPE_TANDY1000HX,
|
||||
TYPE_TANDY1000SL2
|
||||
};
|
||||
@@ -129,6 +131,7 @@ typedef struct tandy_t {
|
||||
|
||||
uint32_t base;
|
||||
uint32_t mask;
|
||||
int is_hx;
|
||||
int is_sl2;
|
||||
|
||||
t1kvid_t *vid;
|
||||
@@ -797,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;
|
||||
@@ -984,10 +990,10 @@ vid_poll(void *priv)
|
||||
for (x = 0; x < vid->crtc[1]; x++) {
|
||||
dat = (vid->vram[((vid->ma << 1) & 0x1fff) + ((vid->sc & 3) * 0x2000)] << 8) | vid->vram[((vid->ma << 1) & 0x1fff) + ((vid->sc & 3) * 0x2000) + 1];
|
||||
vid->ma++;
|
||||
buffer32->line[vid->displine << 1][(x << 3) + 8] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 8] = buffer32->line[vid->displine << 1][(x << 3) + 9] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 9] = vid->array[((dat >> 12) & vid->array[1]) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 3) + 10] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 10] = buffer32->line[vid->displine << 1][(x << 3) + 11] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 11] = vid->array[((dat >> 8) & vid->array[1]) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 3) + 12] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 12] = buffer32->line[vid->displine << 1][(x << 3) + 13] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 13] = vid->array[((dat >> 4) & vid->array[1]) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 3) + 14] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 14] = buffer32->line[vid->displine << 1][(x << 3) + 15] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 15] = vid->array[(dat & vid->array[1]) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 3) + 8] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 8] = buffer32->line[vid->displine << 1][(x << 3) + 9] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 9] = vid->array[((dat >> 12) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 3) + 10] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 10] = buffer32->line[vid->displine << 1][(x << 3) + 11] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 11] = vid->array[((dat >> 8) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 3) + 12] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 12] = buffer32->line[vid->displine << 1][(x << 3) + 13] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 13] = vid->array[((dat >> 4) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 3) + 14] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 14] = buffer32->line[vid->displine << 1][(x << 3) + 15] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 15] = vid->array[(dat & vid->array[1] & 0x0f) + 16] + 16;
|
||||
}
|
||||
} else if (vid->array[3] & 0x10) { /*160x200x16*/
|
||||
for (x = 0; x < vid->crtc[1]; x++) {
|
||||
@@ -997,10 +1003,10 @@ vid_poll(void *priv)
|
||||
dat = (vid->vram[((vid->ma << 1) & 0x1fff) + ((vid->sc & 3) * 0x2000)] << 8) | vid->vram[((vid->ma << 1) & 0x1fff) + ((vid->sc & 3) * 0x2000) + 1];
|
||||
}
|
||||
vid->ma++;
|
||||
buffer32->line[vid->displine << 1][(x << 4) + 8] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 8] = buffer32->line[vid->displine << 1][(x << 4) + 9] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 9] = buffer32->line[vid->displine << 1][(x << 4) + 10] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 10] = buffer32->line[vid->displine << 1][(x << 4) + 11] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 11] = vid->array[((dat >> 12) & vid->array[1]) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 4) + 12] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 12] = buffer32->line[vid->displine << 1][(x << 4) + 13] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 13] = buffer32->line[vid->displine << 1][(x << 4) + 14] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 14] = buffer32->line[vid->displine << 1][(x << 4) + 15] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 15] = vid->array[((dat >> 8) & vid->array[1]) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 4) + 16] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 16] = buffer32->line[vid->displine << 1][(x << 4) + 17] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 17] = buffer32->line[vid->displine << 1][(x << 4) + 18] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 18] = buffer32->line[vid->displine << 1][(x << 4) + 19] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 19] = vid->array[((dat >> 4) & vid->array[1]) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 4) + 20] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 20] = buffer32->line[vid->displine << 1][(x << 4) + 21] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 21] = buffer32->line[vid->displine << 1][(x << 4) + 22] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 22] = buffer32->line[vid->displine << 1][(x << 4) + 23] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 23] = vid->array[(dat & vid->array[1]) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 4) + 8] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 8] = buffer32->line[vid->displine << 1][(x << 4) + 9] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 9] = buffer32->line[vid->displine << 1][(x << 4) + 10] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 10] = buffer32->line[vid->displine << 1][(x << 4) + 11] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 11] = vid->array[((dat >> 12) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 4) + 12] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 12] = buffer32->line[vid->displine << 1][(x << 4) + 13] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 13] = buffer32->line[vid->displine << 1][(x << 4) + 14] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 14] = buffer32->line[vid->displine << 1][(x << 4) + 15] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 15] = vid->array[((dat >> 8) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 4) + 16] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 16] = buffer32->line[vid->displine << 1][(x << 4) + 17] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 17] = buffer32->line[vid->displine << 1][(x << 4) + 18] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 18] = buffer32->line[vid->displine << 1][(x << 4) + 19] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 19] = vid->array[((dat >> 4) & vid->array[1] & 0x0f) + 16] + 16;
|
||||
buffer32->line[vid->displine << 1][(x << 4) + 20] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 20] = buffer32->line[vid->displine << 1][(x << 4) + 21] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 21] = buffer32->line[vid->displine << 1][(x << 4) + 22] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 22] = buffer32->line[vid->displine << 1][(x << 4) + 23] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 23] = vid->array[(dat & vid->array[1] & 0x0f) + 16] + 16;
|
||||
}
|
||||
} else if (vid->array[3] & 0x08) { /*640x200x4 - this implementation is a complete guess!*/
|
||||
for (x = 0; x < vid->crtc[1]; x++) {
|
||||
@@ -1218,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;
|
||||
@@ -1321,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);
|
||||
@@ -1338,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[] = {
|
||||
@@ -1576,12 +1585,12 @@ tandy_write(uint16_t addr, uint8_t val, void *priv)
|
||||
|
||||
switch (addr) {
|
||||
case 0x00a0:
|
||||
if (val & 0x10) {
|
||||
if (dev->is_hx && (val & 0x10)) {
|
||||
dev->base = (mem_size - 256) * 1024;
|
||||
dev->mask = 0x3ffff;
|
||||
mem_mapping_set_addr(&ram_low_mapping, 0, dev->base);
|
||||
mem_mapping_set_addr(&dev->ram_mapping,
|
||||
((val >> 1) & 7) * 128 * 1024, 0x40000);
|
||||
(((val >> 1) & 7) - 1) * 128 * 1024, 0x40000);
|
||||
} else {
|
||||
dev->base = (mem_size - 128) * 1024;
|
||||
dev->mask = 0x1ffff;
|
||||
@@ -1589,6 +1598,22 @@ tandy_write(uint16_t addr, uint8_t val, void *priv)
|
||||
mem_mapping_set_addr(&dev->ram_mapping,
|
||||
((val >> 1) & 7) * 128 * 1024, 0x20000);
|
||||
}
|
||||
if (dev->is_hx) {
|
||||
io_removehandler(0x03d0, 16,
|
||||
vid_in, NULL, NULL, vid_out, NULL, NULL, dev);
|
||||
if (val & 0x01)
|
||||
mem_mapping_disable(&dev->vid->mapping);
|
||||
else {
|
||||
io_sethandler(0x03d0, 16,
|
||||
vid_in, NULL, NULL, vid_out, NULL, NULL, dev);
|
||||
mem_mapping_set_addr(&dev->vid->mapping, 0xb8000, 0x8000);
|
||||
}
|
||||
} else {
|
||||
if (val & 0x01)
|
||||
mem_mapping_set_addr(&dev->vid->mapping, 0xc0000, 0x10000);
|
||||
else
|
||||
mem_mapping_set_addr(&dev->vid->mapping, 0xb8000, 0x8000);
|
||||
}
|
||||
dev->ram_bank = val;
|
||||
break;
|
||||
|
||||
@@ -1718,8 +1743,7 @@ machine_tandy1k_init(const machine_t *model, int type)
|
||||
{
|
||||
tandy_t *dev;
|
||||
|
||||
dev = malloc(sizeof(tandy_t));
|
||||
memset(dev, 0x00, sizeof(tandy_t));
|
||||
dev = calloc(1, sizeof(tandy_t));
|
||||
|
||||
machine_common_init(model);
|
||||
|
||||
@@ -1745,20 +1769,26 @@ machine_tandy1k_init(const machine_t *model, int type)
|
||||
|
||||
switch (type) {
|
||||
case TYPE_TANDY:
|
||||
case TYPE_TANDY1000SX:
|
||||
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(&sn76489_device);
|
||||
device_add((type == TYPE_TANDY1000SX) ? &ncr8496_device : &sn76489_device);
|
||||
break;
|
||||
|
||||
case TYPE_TANDY1000HX:
|
||||
dev->is_hx = 1;
|
||||
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;
|
||||
@@ -1768,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);
|
||||
@@ -1790,7 +1822,7 @@ tandy1k_eeprom_read(void)
|
||||
}
|
||||
|
||||
int
|
||||
machine_tandy_init(const machine_t *model)
|
||||
machine_tandy1000sx_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -1800,7 +1832,7 @@ machine_tandy_init(const machine_t *model)
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
|
||||
machine_tandy1k_init(model, TYPE_TANDY);
|
||||
machine_tandy1k_init(model, TYPE_TANDY1000SX);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user