mirror of
https://github.com/86Box/86Box.git
synced 2026-02-24 10:28:19 -07:00
Merge branch 'master' into pc98x1
This commit is contained in:
@@ -59,6 +59,7 @@ AppDir:
|
||||
- libqt5widgets5 # if QT:BOOL=ON
|
||||
- libsixel1 # if CLI:BOOL=ON
|
||||
- libslirp0
|
||||
- libsndfile1
|
||||
- libsndio7.0 # if OPENAL:BOOL=ON
|
||||
- libvdeplug-dev # -dev also pulls in libvdeplug2. -dev is required to get the proper .so symlink to the library
|
||||
- libx11-6 # if QT:BOOL=ON
|
||||
|
||||
@@ -605,7 +605,7 @@ else
|
||||
# ...and the ones we do want listed. Non-dev packages fill missing spots on the list.
|
||||
libpkgs=""
|
||||
longest_libpkg=0
|
||||
for pkg in libc6-dev libstdc++6 libopenal-dev libfreetype6-dev libx11-dev libsdl2-dev libpng-dev librtmidi-dev qtdeclarative5-dev libwayland-dev libevdev-dev libxkbcommon-x11-dev libglib2.0-dev libslirp-dev libfaudio-dev libaudio-dev libjack-jackd2-dev libpipewire-0.3-dev libsamplerate0-dev libsndio-dev libvdeplug-dev libfluidsynth-dev
|
||||
for pkg in libc6-dev libstdc++6 libopenal-dev libfreetype6-dev libx11-dev libsdl2-dev libpng-dev librtmidi-dev qtdeclarative5-dev libwayland-dev libevdev-dev libxkbcommon-x11-dev libglib2.0-dev libslirp-dev libfaudio-dev libaudio-dev libjack-jackd2-dev libpipewire-0.3-dev libsamplerate0-dev libsndio-dev libvdeplug-dev libfluidsynth-dev libsndfile1-dev
|
||||
do
|
||||
libpkgs="$libpkgs $pkg:$arch_deb"
|
||||
length=$(echo -n $pkg | sed 's/-dev$//' | sed "s/qtdeclarative/qt/" | wc -c)
|
||||
|
||||
@@ -15,3 +15,4 @@ fluidsynth
|
||||
ghostscript
|
||||
libslirp
|
||||
vde2
|
||||
libsndfile
|
||||
|
||||
@@ -13,3 +13,4 @@ fluidsynth
|
||||
qt5-static
|
||||
qt5-translations
|
||||
vulkan-headers
|
||||
libsndfile
|
||||
|
||||
4
.github/workflows/cmake_linux.yml
vendored
4
.github/workflows/cmake_linux.yml
vendored
@@ -40,10 +40,10 @@ jobs:
|
||||
# - name: Regular
|
||||
# preset: regular
|
||||
- name: Debug
|
||||
preset: debug
|
||||
preset: dev_debug
|
||||
slug: -Debug
|
||||
- name: Dev
|
||||
preset: experimental
|
||||
preset: development
|
||||
slug: -Dev
|
||||
dynarec:
|
||||
- name: ODR
|
||||
|
||||
8
.github/workflows/cmake_macos.yml
vendored
8
.github/workflows/cmake_macos.yml
vendored
@@ -40,10 +40,10 @@ jobs:
|
||||
# - name: Regular
|
||||
# preset: regular
|
||||
- name: Debug
|
||||
preset: debug
|
||||
preset: dev_debug
|
||||
slug: -Debug
|
||||
- name: Dev
|
||||
preset: experimental
|
||||
preset: development
|
||||
slug: -Dev
|
||||
dynarec:
|
||||
- name: ODR
|
||||
@@ -138,10 +138,10 @@ jobs:
|
||||
# - name: Regular
|
||||
# preset: regular
|
||||
- name: Debug
|
||||
preset: debug
|
||||
preset: dev_debug
|
||||
slug: -Debug
|
||||
- name: Dev
|
||||
preset: experimental
|
||||
preset: development
|
||||
slug: -Dev
|
||||
dynarec:
|
||||
# - name: ODR
|
||||
|
||||
4
.github/workflows/cmake_windows_msys2.yml
vendored
4
.github/workflows/cmake_windows_msys2.yml
vendored
@@ -44,10 +44,10 @@ jobs:
|
||||
# - name: Regular
|
||||
# preset: regular
|
||||
- name: Debug
|
||||
preset: debug
|
||||
preset: dev_debug
|
||||
slug: -Debug
|
||||
- name: Dev
|
||||
preset: experimental
|
||||
preset: development
|
||||
slug: -Dev
|
||||
dynarec:
|
||||
- name: ODR
|
||||
|
||||
2
.github/workflows/codeql_linux.yml
vendored
2
.github/workflows/codeql_linux.yml
vendored
@@ -47,7 +47,7 @@ jobs:
|
||||
# preset: debug
|
||||
# slug: -Debug
|
||||
- name: Dev
|
||||
preset: experimental
|
||||
preset: dev_debug
|
||||
slug: -Dev
|
||||
dynarec:
|
||||
- name: ODR
|
||||
|
||||
2
.github/workflows/codeql_macos.yml
vendored
2
.github/workflows/codeql_macos.yml
vendored
@@ -47,7 +47,7 @@ jobs:
|
||||
# preset: debug
|
||||
# slug: -Debug
|
||||
- name: Dev
|
||||
preset: experimental
|
||||
preset: dev_debug
|
||||
slug: -Dev
|
||||
dynarec:
|
||||
- name: ODR
|
||||
|
||||
2
.github/workflows/codeql_windows_msys2.yml
vendored
2
.github/workflows/codeql_windows_msys2.yml
vendored
@@ -51,7 +51,7 @@ jobs:
|
||||
# preset: debug
|
||||
# slug: -Debug
|
||||
- name: Dev
|
||||
preset: experimental
|
||||
preset: dev_debug
|
||||
slug: -Dev
|
||||
dynarec:
|
||||
- name: ODR
|
||||
|
||||
@@ -43,17 +43,15 @@
|
||||
"name": "development",
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "Release",
|
||||
"DEV_BRANCH": "ON",
|
||||
"NEW_DYNAREC": "OFF"
|
||||
"DEV_BRANCH": "ON"
|
||||
},
|
||||
"inherits": "base"
|
||||
},
|
||||
{
|
||||
"name": "experimental",
|
||||
"name": "dev_debug",
|
||||
"cacheVariables": {
|
||||
"CMAKE_BUILD_TYPE": "Debug",
|
||||
"DEV_BRANCH": "ON",
|
||||
"NEW_DYNAREC": "ON"
|
||||
"DEV_BRANCH": "ON"
|
||||
},
|
||||
"inherits": "base"
|
||||
},
|
||||
|
||||
3
debian/control
vendored
3
debian/control
vendored
@@ -13,6 +13,7 @@ Build-Depends: cmake (>= 3.21),
|
||||
libsdl2-dev,
|
||||
libslirp-dev,
|
||||
libxkbcommon-x11-dev,
|
||||
libsndfile-dev,
|
||||
ninja-build,
|
||||
qttools5-dev,
|
||||
qtbase5-private-dev
|
||||
@@ -31,4 +32,4 @@ Recommends: libpcap0.8-dev
|
||||
Description: An emulator for classic IBM PC clones
|
||||
86Box is a low level x86 emulator that runs older operating systems and software
|
||||
designed for IBM PC systems and compatibles from 1981 through
|
||||
fairly recent system designs based on the PCI bus.
|
||||
fairly recent system designs based on the PCI bus.
|
||||
|
||||
@@ -13,4 +13,13 @@
|
||||
# Copyright 2020-2021 David Hrdlička.
|
||||
#
|
||||
|
||||
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)
|
||||
target_link_libraries(86Box PkgConfig::SNDFILE)
|
||||
if (WIN32)
|
||||
# MSYS2
|
||||
target_link_libraries(86Box -static ${SNDFILE_STATIC_LIBRARIES})
|
||||
endif()
|
||||
|
||||
@@ -294,7 +294,6 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
|
||||
dev->cd_status = CD_STATUS_DATA_ONLY;
|
||||
else
|
||||
dev->cd_status = CD_STATUS_STOPPED;
|
||||
dev->is_dir = (i == 3);
|
||||
dev->seek_pos = 0;
|
||||
dev->cd_buflen = 0;
|
||||
dev->cdrom_capacity = image_get_capacity(dev);
|
||||
|
||||
@@ -14,10 +14,12 @@
|
||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* The DOSBox Team, <unknown>
|
||||
* Cacodemon345
|
||||
*
|
||||
* Copyright 2016-2020 Miran Grca.
|
||||
* Copyright 2017-2020 Fred N. van Kempen.
|
||||
* Copyright 2002-2020 The DOSBox Team.
|
||||
* Copyright 2024 Cacodemon345.
|
||||
*/
|
||||
#define __STDC_FORMAT_MACROS
|
||||
#include <ctype.h>
|
||||
@@ -40,6 +42,8 @@
|
||||
#include <86box/plat.h>
|
||||
#include <86box/cdrom_image_backend.h>
|
||||
|
||||
#include <sndfile.h>
|
||||
|
||||
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
|
||||
|
||||
#define MAX_LINE_LENGTH 512
|
||||
@@ -66,13 +70,109 @@ cdrom_image_backend_log(const char *fmt, ...)
|
||||
# define cdrom_image_backend_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
typedef struct audio_file_t {
|
||||
SNDFILE *file;
|
||||
SF_INFO info;
|
||||
} audio_file_t;
|
||||
|
||||
/* Audio file functions */
|
||||
static int
|
||||
audio_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count)
|
||||
{
|
||||
track_file_t *tf = (track_file_t *) priv;
|
||||
audio_file_t *audio = (audio_file_t *) tf->priv;
|
||||
uint64_t samples_seek = seek / 4;
|
||||
uint64_t samples_count = count / 4;
|
||||
|
||||
if ((seek & 3) || (count & 3)) {
|
||||
cdrom_image_backend_log("CD Audio file: Reading on non-4-aligned boundaries.\n");
|
||||
}
|
||||
|
||||
sf_count_t res = sf_seek(audio->file, samples_seek, SEEK_SET);
|
||||
|
||||
if (res == -1)
|
||||
return 0;
|
||||
|
||||
return !!sf_readf_short(audio->file, (short *) buffer, samples_count);
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
audio_get_length(void *priv)
|
||||
{
|
||||
track_file_t *tf = (track_file_t *) priv;
|
||||
audio_file_t *audio = (audio_file_t *) tf->priv;
|
||||
|
||||
/* Assume 16-bit audio, 2 channel. */
|
||||
return audio->info.frames * 4ull;
|
||||
}
|
||||
|
||||
static void
|
||||
audio_close(void *priv)
|
||||
{
|
||||
track_file_t *tf = (track_file_t *) priv;
|
||||
audio_file_t *audio = (audio_file_t *) tf->priv;
|
||||
|
||||
memset(tf->fn, 0x00, sizeof(tf->fn));
|
||||
if (audio && audio->file)
|
||||
sf_close(audio->file);
|
||||
free(audio);
|
||||
free(tf);
|
||||
}
|
||||
|
||||
static track_file_t *
|
||||
audio_init(const char *filename, int *error)
|
||||
{
|
||||
track_file_t *tf = (track_file_t *) calloc(sizeof(track_file_t), 1);
|
||||
audio_file_t *audio = (audio_file_t *) calloc(sizeof(audio_file_t), 1);
|
||||
#ifdef _WIN32
|
||||
wchar_t filename_w[4096];
|
||||
#endif
|
||||
|
||||
if (tf == NULL || audio == NULL) {
|
||||
goto cleanup_error;
|
||||
}
|
||||
|
||||
memset(tf->fn, 0x00, sizeof(tf->fn));
|
||||
strncpy(tf->fn, filename, sizeof(tf->fn) - 1);
|
||||
#ifdef _WIN32
|
||||
mbstowcs(filename_w, filename, 4096);
|
||||
audio->file = sf_wchar_open(filename_w, SFM_READ, &audio->info);
|
||||
#else
|
||||
audio->file = sf_open(filename, SFM_READ, &audio->info);
|
||||
#endif
|
||||
|
||||
if (!audio->file) {
|
||||
cdrom_image_backend_log("Audio file open error!");
|
||||
goto cleanup_error;
|
||||
}
|
||||
|
||||
if (audio->info.channels != 2 || audio->info.samplerate != 44100 || !audio->info.seekable) {
|
||||
cdrom_image_backend_log("Audio file not seekable or in non-CD format!");
|
||||
sf_close(audio->file);
|
||||
goto cleanup_error;
|
||||
}
|
||||
|
||||
*error = 0;
|
||||
tf->priv = audio;
|
||||
tf->fp = NULL;
|
||||
tf->close = audio_close;
|
||||
tf->get_length = audio_get_length;
|
||||
tf->read = audio_read;
|
||||
return tf;
|
||||
cleanup_error:
|
||||
free(tf);
|
||||
free(audio);
|
||||
*error = 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Binary file functions. */
|
||||
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",
|
||||
cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu)\n",
|
||||
tf->fp, seek, count);
|
||||
|
||||
if ((tf = (track_file_t *) priv)->fp == NULL)
|
||||
@@ -92,6 +192,15 @@ bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (UNLIKELY(tf->motorola)) {
|
||||
for (uint64_t i = 0; i < count; i += 2) {
|
||||
uint8_t buffer0 = buffer[i];
|
||||
uint8_t buffer1 = buffer[i + 1];
|
||||
buffer[i] = buffer1;
|
||||
buffer[i + 1] = buffer0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -133,7 +242,7 @@ bin_close(void *priv)
|
||||
static track_file_t *
|
||||
bin_init(const char *filename, int *error)
|
||||
{
|
||||
track_file_t *tf = (track_file_t *) malloc(sizeof(track_file_t));
|
||||
track_file_t *tf = (track_file_t *) calloc(1, sizeof(track_file_t));
|
||||
struct stat stats;
|
||||
|
||||
if (tf == NULL) {
|
||||
@@ -279,12 +388,11 @@ int
|
||||
cdi_get_audio_track_info(cd_img_t *cdi, UNUSED(int end), int track, int *track_num, TMSF *start, uint8_t *attr)
|
||||
{
|
||||
const track_t *trk = &cdi->tracks[track - 1];
|
||||
const int pos = trk->start + 150;
|
||||
|
||||
if ((track < 1) || (track > cdi->tracks_num))
|
||||
return 0;
|
||||
|
||||
const int pos = trk->start + 150;
|
||||
|
||||
FRAMES_TO_MSF(pos, &start->min, &start->sec, &start->fr);
|
||||
|
||||
*track_num = trk->track_number;
|
||||
@@ -360,20 +468,20 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
||||
{
|
||||
const int track = cdi_get_track(cdi, sector) - 1;
|
||||
const uint64_t sect = (uint64_t) sector;
|
||||
int raw_size;
|
||||
int cooked_size;
|
||||
uint64_t offset;
|
||||
int m = 0;
|
||||
int s = 0;
|
||||
int f = 0;
|
||||
int raw_size;
|
||||
int cooked_size;
|
||||
uint64_t offset;
|
||||
int m = 0;
|
||||
int s = 0;
|
||||
int f = 0;
|
||||
|
||||
if (track < 0)
|
||||
return 0;
|
||||
|
||||
const track_t *trk = &cdi->tracks[track];
|
||||
const int track_is_raw = ((trk->sector_size == RAW_SECTOR_SIZE) || (trk->sector_size == 2448));
|
||||
const track_t *trk = &cdi->tracks[track];
|
||||
const int track_is_raw = ((trk->sector_size == RAW_SECTOR_SIZE) || (trk->sector_size == 2448));
|
||||
|
||||
const uint64_t seek = trk->skip + ((sect - trk->start) * trk->sector_size);
|
||||
const uint64_t seek = trk->skip + ((sect - trk->start) * trk->sector_size);
|
||||
|
||||
if (track_is_raw)
|
||||
raw_size = trk->sector_size;
|
||||
@@ -420,13 +528,13 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
||||
int
|
||||
cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num)
|
||||
{
|
||||
int success = 1;
|
||||
int success = 1;
|
||||
|
||||
/* TODO: This fails to account for Mode 2. Shouldn't we have a function
|
||||
to get sector size? */
|
||||
const int sector_size = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE;
|
||||
const uint32_t buf_len = num * sector_size;
|
||||
uint8_t *buf = (uint8_t *) malloc(buf_len * sizeof(uint8_t));
|
||||
const int sector_size = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE;
|
||||
const uint32_t buf_len = num * sector_size;
|
||||
uint8_t *buf = (uint8_t *) calloc(1, buf_len * sizeof(uint8_t));
|
||||
|
||||
for (uint32_t i = 0; i < num; i++) {
|
||||
success = cdi_read_sector(cdi, &buf[i * sector_size], raw, sector + i);
|
||||
@@ -434,9 +542,7 @@ cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint3
|
||||
break;
|
||||
/* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an
|
||||
audio track. */
|
||||
if (raw && (sector < cdi->tracks[0].length) &&
|
||||
!cdi->tracks[0].mode2 && (cdi->tracks[0].attr != AUDIO_TRACK) &&
|
||||
*(uint64_t *) &(buf[(i * sector_size) + 2068]))
|
||||
if (raw && (sector < cdi->tracks[0].length) && !cdi->tracks[0].mode2 && (cdi->tracks[0].attr != AUDIO_TRACK) && *(uint64_t *) &(buf[(i * sector_size) + 2068]))
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -537,81 +643,94 @@ cdi_track_push_back(cd_img_t *cdi, track_t *trk)
|
||||
cdi->tracks_num++;
|
||||
}
|
||||
|
||||
int
|
||||
cdi_get_iso_track(cd_img_t *cdi, track_t *trk, const char *filename)
|
||||
{
|
||||
int error = 0;
|
||||
int ret = 2;
|
||||
memset(trk, 0, sizeof(track_t));
|
||||
|
||||
/* Data track (shouldn't there be a lead in track?). */
|
||||
trk->file = bin_init(filename, &error);
|
||||
if (error) {
|
||||
if ((trk->file != NULL) && (trk->file->close != NULL))
|
||||
trk->file->close(trk->file);
|
||||
ret = 3;
|
||||
trk->file = viso_init(filename, &error);
|
||||
if (error) {
|
||||
if ((trk->file != NULL) && (trk->file->close != NULL))
|
||||
trk->file->close(trk->file);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
trk->number = 1;
|
||||
trk->track_number = 1;
|
||||
trk->attr = DATA_TRACK;
|
||||
|
||||
/* Try to detect ISO type. */
|
||||
trk->form = 0;
|
||||
trk->mode2 = 0;
|
||||
|
||||
if (cdi_can_read_pvd(trk->file, RAW_SECTOR_SIZE, 0, 0))
|
||||
trk->sector_size = RAW_SECTOR_SIZE;
|
||||
else if (cdi_can_read_pvd(trk->file, 2336, 1, 0)) {
|
||||
trk->sector_size = 2336;
|
||||
trk->mode2 = 1;
|
||||
} else if (cdi_can_read_pvd(trk->file, 2324, 1, 2)) {
|
||||
trk->sector_size = 2324;
|
||||
trk->mode2 = 1;
|
||||
trk->form = 2;
|
||||
trk->noskip = 1;
|
||||
} else if (cdi_can_read_pvd(trk->file, 2328, 1, 2)) {
|
||||
trk->sector_size = 2328;
|
||||
trk->mode2 = 1;
|
||||
trk->form = 2;
|
||||
trk->noskip = 1;
|
||||
} else if (cdi_can_read_pvd(trk->file, 2336, 1, 1)) {
|
||||
trk->sector_size = 2336;
|
||||
trk->mode2 = 1;
|
||||
trk->form = 1;
|
||||
trk->skip = 8;
|
||||
} else if (cdi_can_read_pvd(trk->file, RAW_SECTOR_SIZE, 1, 0)) {
|
||||
trk->sector_size = RAW_SECTOR_SIZE;
|
||||
trk->mode2 = 1;
|
||||
} else if (cdi_can_read_pvd(trk->file, RAW_SECTOR_SIZE, 1, 1)) {
|
||||
trk->sector_size = RAW_SECTOR_SIZE;
|
||||
trk->mode2 = 1;
|
||||
trk->form = 1;
|
||||
} else {
|
||||
/* We use 2048 mode 1 as the default. */
|
||||
trk->sector_size = COOKED_SECTOR_SIZE;
|
||||
}
|
||||
|
||||
trk->length = trk->file->get_length(trk->file) / trk->sector_size;
|
||||
cdrom_image_backend_log("ISO: Data track: length = %" PRIu64 ", sector_size = %i\n", trk->length, trk->sector_size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
cdi_load_iso(cd_img_t *cdi, const char *filename)
|
||||
{
|
||||
int error;
|
||||
int ret = 2;
|
||||
track_t trk;
|
||||
track_t trk = { 0 };
|
||||
|
||||
cdi->tracks = NULL;
|
||||
cdi->tracks_num = 0;
|
||||
|
||||
memset(&trk, 0, sizeof(track_t));
|
||||
ret = cdi_get_iso_track(cdi, &trk, filename);
|
||||
|
||||
/* Data track (shouldn't there be a lead in track?). */
|
||||
trk.file = bin_init(filename, &error);
|
||||
if (error) {
|
||||
if ((trk.file != NULL) && (trk.file->close != NULL))
|
||||
trk.file->close(trk.file);
|
||||
ret = 3;
|
||||
trk.file = viso_init(filename, &error);
|
||||
if (error) {
|
||||
if ((trk.file != NULL) && (trk.file->close != NULL))
|
||||
trk.file->close(trk.file);
|
||||
return 0;
|
||||
}
|
||||
if (ret >= 1) {
|
||||
cdi_track_push_back(cdi, &trk);
|
||||
|
||||
/* Lead out track. */
|
||||
trk.number = 2;
|
||||
trk.track_number = 0xAA;
|
||||
trk.attr = 0x16; /* Was originally 0x00, but I believe 0x16 is appropriate. */
|
||||
trk.start = trk.length;
|
||||
trk.length = 0;
|
||||
trk.file = NULL;
|
||||
cdi_track_push_back(cdi, &trk);
|
||||
}
|
||||
trk.number = 1;
|
||||
trk.track_number = 1;
|
||||
trk.attr = DATA_TRACK;
|
||||
|
||||
/* Try to detect ISO type. */
|
||||
trk.form = 0;
|
||||
trk.mode2 = 0;
|
||||
|
||||
if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 0, 0))
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
else if (cdi_can_read_pvd(trk.file, 2336, 1, 0)) {
|
||||
trk.sector_size = 2336;
|
||||
trk.mode2 = 1;
|
||||
} else if (cdi_can_read_pvd(trk.file, 2324, 1, 2)) {
|
||||
trk.sector_size = 2324;
|
||||
trk.mode2 = 1;
|
||||
trk.form = 2;
|
||||
} else if (cdi_can_read_pvd(trk.file, 2328, 1, 2)) {
|
||||
trk.sector_size = 2328;
|
||||
trk.mode2 = 1;
|
||||
trk.form = 2;
|
||||
} else if (cdi_can_read_pvd(trk.file, 2336, 1, 1)) {
|
||||
trk.sector_size = 2336;
|
||||
trk.mode2 = 1;
|
||||
trk.form = 1;
|
||||
trk.skip = 8;
|
||||
} else if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 1, 0)) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.mode2 = 1;
|
||||
} else if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 1, 1)) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.mode2 = 1;
|
||||
trk.form = 1;
|
||||
} else {
|
||||
/* We use 2048 mode 1 as the default. */
|
||||
trk.sector_size = COOKED_SECTOR_SIZE;
|
||||
}
|
||||
|
||||
trk.length = trk.file->get_length(trk.file) / trk.sector_size;
|
||||
cdrom_image_backend_log("ISO: Data track: length = %" PRIu64 ", sector_size = %i\n", trk.length, trk.sector_size);
|
||||
cdi_track_push_back(cdi, &trk);
|
||||
|
||||
/* Lead out track. */
|
||||
trk.number = 2;
|
||||
trk.track_number = 0xAA;
|
||||
trk.attr = 0x16; /* Was originally 0x00, but I believe 0x16 is appropriate. */
|
||||
trk.start = trk.length;
|
||||
trk.length = 0;
|
||||
trk.file = NULL;
|
||||
cdi_track_push_back(cdi, &trk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -704,7 +823,7 @@ cdi_cue_get_frame(uint64_t *frames, char **line)
|
||||
char temp[128];
|
||||
int min = 0;
|
||||
int sec = 0;
|
||||
int fr = 0;
|
||||
int fr = 0;
|
||||
int success;
|
||||
|
||||
success = cdi_cue_get_buffer(temp, line, 0);
|
||||
@@ -765,7 +884,7 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u
|
||||
if (cur->number != 1)
|
||||
return 0;
|
||||
cur->skip = skip * cur->sector_size;
|
||||
if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0))
|
||||
if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0) && !cur->noskip)
|
||||
cur->skip += 8;
|
||||
cur->start += cur_pregap;
|
||||
*total_pregap = cur_pregap;
|
||||
@@ -782,14 +901,14 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u
|
||||
cur->start += *total_pregap;
|
||||
} else {
|
||||
const uint64_t temp = prev->file->get_length(prev->file) - (prev->skip);
|
||||
prev->length = temp / ((uint64_t) prev->sector_size);
|
||||
prev->length = temp / ((uint64_t) prev->sector_size);
|
||||
if ((temp % prev->sector_size) != 0)
|
||||
prev->length++;
|
||||
/* Padding. */
|
||||
|
||||
cur->start += prev->start + prev->length + cur_pregap;
|
||||
cur->skip = skip * cur->sector_size;
|
||||
if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0))
|
||||
if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0) && !cur->noskip)
|
||||
cur->skip += 8;
|
||||
*shift += prev->start + prev->length;
|
||||
*total_pregap = cur_pregap;
|
||||
@@ -813,12 +932,13 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
{
|
||||
track_t trk;
|
||||
char pathname[MAX_FILENAME_LENGTH];
|
||||
uint64_t shift = 0ULL;
|
||||
uint64_t prestart = 0ULL;
|
||||
uint64_t cur_pregap = 0ULL;
|
||||
uint64_t shift = 0ULL;
|
||||
uint64_t prestart = 0ULL;
|
||||
uint64_t cur_pregap = 0ULL;
|
||||
uint64_t total_pregap = 0ULL;
|
||||
uint64_t frame = 0ULL;
|
||||
uint64_t frame = 0ULL;
|
||||
uint64_t index;
|
||||
int iso_file_used = 0;
|
||||
int success;
|
||||
int error;
|
||||
int can_add_track = 0;
|
||||
@@ -874,82 +994,97 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
if (!success)
|
||||
break;
|
||||
|
||||
trk.start = 0;
|
||||
trk.skip = 0;
|
||||
cur_pregap = 0;
|
||||
prestart = 0;
|
||||
if (iso_file_used) {
|
||||
/* We don't alter anything of the detected track type with the one specified in the CUE file, except its numbers. */
|
||||
cur_pregap = 0;
|
||||
prestart = 0;
|
||||
|
||||
trk.number = cdi_cue_get_number(&line);
|
||||
trk.track_number = trk.number;
|
||||
success = cdi_cue_get_keyword(&type, &line);
|
||||
if (!success)
|
||||
break;
|
||||
trk.number = cdi_cue_get_number(&line);
|
||||
trk.track_number = trk.number;
|
||||
success = cdi_cue_get_keyword(&type, &line);
|
||||
if (!success)
|
||||
break;
|
||||
can_add_track = 1;
|
||||
|
||||
trk.form = 0;
|
||||
trk.mode2 = 0;
|
||||
iso_file_used = 0;
|
||||
} else {
|
||||
trk.start = 0;
|
||||
trk.skip = 0;
|
||||
cur_pregap = 0;
|
||||
prestart = 0;
|
||||
|
||||
trk.pre = 0;
|
||||
trk.number = cdi_cue_get_number(&line);
|
||||
trk.track_number = trk.number;
|
||||
success = cdi_cue_get_keyword(&type, &line);
|
||||
if (!success)
|
||||
break;
|
||||
|
||||
if (!strcmp(type, "AUDIO")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = AUDIO_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2048")) {
|
||||
trk.sector_size = COOKED_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2352")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2448")) {
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE2/2048")) {
|
||||
trk.form = 1;
|
||||
trk.sector_size = COOKED_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2324")) {
|
||||
trk.form = 2;
|
||||
trk.sector_size = 2324;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2328")) {
|
||||
trk.form = 2;
|
||||
trk.sector_size = 2328;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2336")) {
|
||||
trk.form = 1;
|
||||
trk.sector_size = 2336;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2352")) {
|
||||
/* Assume this is XA Mode 2 Form 1. */
|
||||
trk.form = 1;
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2448")) {
|
||||
/* Assume this is XA Mode 2 Form 1. */
|
||||
trk.form = 1;
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDG/2448")) {
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDI/2336")) {
|
||||
trk.sector_size = 2336;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDI/2352")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else
|
||||
success = 0;
|
||||
trk.form = 0;
|
||||
trk.mode2 = 0;
|
||||
|
||||
can_add_track = 1;
|
||||
trk.pre = 0;
|
||||
|
||||
if (!strcmp(type, "AUDIO")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = AUDIO_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2048")) {
|
||||
trk.sector_size = COOKED_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2352")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE1/2448")) {
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
} else if (!strcmp(type, "MODE2/2048")) {
|
||||
trk.form = 1;
|
||||
trk.sector_size = COOKED_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2324")) {
|
||||
trk.form = 2;
|
||||
trk.sector_size = 2324;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2328")) {
|
||||
trk.form = 2;
|
||||
trk.sector_size = 2328;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2336")) {
|
||||
trk.form = 1;
|
||||
trk.sector_size = 2336;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2352")) {
|
||||
/* Assume this is XA Mode 2 Form 1. */
|
||||
trk.form = 1;
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "MODE2/2448")) {
|
||||
/* Assume this is XA Mode 2 Form 1. */
|
||||
trk.form = 1;
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDG/2448")) {
|
||||
trk.sector_size = 2448;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDI/2336")) {
|
||||
trk.sector_size = 2336;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else if (!strcmp(type, "CDI/2352")) {
|
||||
trk.sector_size = RAW_SECTOR_SIZE;
|
||||
trk.attr = DATA_TRACK;
|
||||
trk.mode2 = 1;
|
||||
} else
|
||||
success = 0;
|
||||
|
||||
can_add_track = 1;
|
||||
}
|
||||
} else if (!strcmp(command, "INDEX")) {
|
||||
index = cdi_cue_get_number(&line);
|
||||
success = cdi_cue_get_frame(&frame, &line);
|
||||
@@ -968,8 +1103,8 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
break;
|
||||
}
|
||||
} else if (!strcmp(command, "FILE")) {
|
||||
char filename[MAX_FILENAME_LENGTH];
|
||||
char ansi[MAX_FILENAME_LENGTH];
|
||||
char filename[MAX_FILENAME_LENGTH];
|
||||
char ansi[MAX_FILENAME_LENGTH];
|
||||
|
||||
if (can_add_track)
|
||||
success = cdi_add_track(cdi, &trk, &shift, prestart, &total_pregap, cur_pregap);
|
||||
@@ -992,13 +1127,40 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile)
|
||||
trk.file = NULL;
|
||||
error = 1;
|
||||
|
||||
if (!strcmp(type, "BINARY")) {
|
||||
path_append_filename(filename, pathname, ansi);
|
||||
trk.file = track_file_init(filename, &error);
|
||||
if (!strcmp(type, "BINARY") || !strcmp(type, "MOTOROLA")) {
|
||||
int fn_len = 0;
|
||||
if (!path_abs(ansi)) {
|
||||
path_append_filename(filename, pathname, ansi);
|
||||
} else {
|
||||
strcpy(filename, ansi);
|
||||
}
|
||||
fn_len = strlen(filename);
|
||||
if ((tolower((int) filename[fn_len - 1]) == 'o'
|
||||
&& tolower((int) filename[fn_len - 2]) == 's'
|
||||
&& tolower((int) filename[fn_len - 3]) == 'i'
|
||||
&& filename[fn_len - 4] == '.')
|
||||
|| plat_dir_check(filename)) {
|
||||
error = !cdi_get_iso_track(cdi, &trk, filename);
|
||||
if (!error) {
|
||||
iso_file_used = 1;
|
||||
}
|
||||
} else
|
||||
trk.file = track_file_init(filename, &error);
|
||||
|
||||
if (trk.file) {
|
||||
trk.file->motorola = !strcmp(type, "MOTOROLA");
|
||||
}
|
||||
} else if (!strcmp(type, "WAVE") || !strcmp(type, "AIFF") || !strcmp(type, "MP3")) {
|
||||
if (!path_abs(ansi)) {
|
||||
path_append_filename(filename, pathname, ansi);
|
||||
} else {
|
||||
strcpy(filename, ansi);
|
||||
}
|
||||
trk.file = audio_init(filename, &error);
|
||||
}
|
||||
if (error) {
|
||||
#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG
|
||||
cdrom_image_backend_log("CUE: cannot open fille '%s' in cue sheet!\n",
|
||||
cdrom_image_backend_log("CUE: cannot open file '%s' in cue sheet!\n",
|
||||
filename);
|
||||
#endif
|
||||
if (trk.file != NULL) {
|
||||
@@ -1067,7 +1229,7 @@ cdi_has_audio_track(cd_img_t *cdi)
|
||||
if ((cdi == NULL) || (cdi->tracks == NULL))
|
||||
return 0;
|
||||
|
||||
/* Audio track has attribute 0x14. */
|
||||
/* Audio track has attribute 0x10. */
|
||||
for (int i = 0; i < cdi->tracks_num; i++) {
|
||||
if (cdi->tracks[i].attr == AUDIO_TRACK)
|
||||
return 1;
|
||||
|
||||
@@ -254,7 +254,6 @@ cdrom_ioctl_open(cdrom_t *dev, const char *drv)
|
||||
|
||||
/* All good, reset state. */
|
||||
dev->cd_status = CD_STATUS_STOPPED;
|
||||
dev->is_dir = 0;
|
||||
dev->seek_pos = 0;
|
||||
dev->cd_buflen = 0;
|
||||
dev->cdrom_capacity = ioctl_get_capacity(dev);
|
||||
|
||||
@@ -759,8 +759,6 @@ compaq_genoa_init(UNUSED(const device_t *info))
|
||||
{
|
||||
void *cpq = device_add(&compaq_386_device);
|
||||
|
||||
pclog_toggle_suppr();
|
||||
|
||||
io_sethandler(0x0c02, 2, NULL, NULL, NULL, NULL, compaq_genoa_outw, NULL, cpq);
|
||||
|
||||
return ram;
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <86box/mem.h>
|
||||
#include <86box/plat_fallthrough.h>
|
||||
#include <86box/plat_unused.h>
|
||||
#include <86box/port_92.h>
|
||||
#include <86box/chipset.h>
|
||||
|
||||
#ifdef ENABLE_OPTI283_LOG
|
||||
@@ -215,16 +216,27 @@ opti283_write(uint16_t addr, uint8_t val, void *priv)
|
||||
opti283_t *dev = (opti283_t *) priv;
|
||||
|
||||
switch (addr) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x22:
|
||||
dev->index = val;
|
||||
break;
|
||||
|
||||
case 0x23:
|
||||
if (dev->index == 0x01)
|
||||
dev->regs[dev->index] = val;
|
||||
break;
|
||||
|
||||
case 0x24:
|
||||
opti283_log("OPTi 283: dev->regs[%02x] = %02x\n", dev->index, val);
|
||||
|
||||
switch (dev->index) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x10:
|
||||
dev->regs[dev->index] = val;
|
||||
dev->regs[dev->index] = (dev->regs[dev->index] & 0x80) | (val & 0x7f);
|
||||
break;
|
||||
|
||||
case 0x14:
|
||||
@@ -236,13 +248,9 @@ opti283_write(uint16_t addr, uint8_t val, void *priv)
|
||||
dev->regs[dev->index] = val;
|
||||
opti283_shadow_recalc(dev);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
dev->index = 0xff;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -250,11 +258,17 @@ opti283_write(uint16_t addr, uint8_t val, void *priv)
|
||||
static uint8_t
|
||||
opti283_read(uint16_t addr, void *priv)
|
||||
{
|
||||
const opti283_t *dev = (opti283_t *) priv;
|
||||
uint8_t ret = 0xff;
|
||||
opti283_t *dev = (opti283_t *) priv;
|
||||
uint8_t ret = 0xff;
|
||||
|
||||
if (addr == 0x24)
|
||||
if ((addr == 0x23) && (dev->index == 0x01))
|
||||
ret = dev->regs[dev->index];
|
||||
else if (addr == 0x24) {
|
||||
if ((dev->index >= 0x10) && (dev->index <= 0x14))
|
||||
ret = dev->regs[dev->index];
|
||||
|
||||
dev->index = 0xff;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -274,6 +288,7 @@ opti283_init(UNUSED(const device_t *info))
|
||||
memset(dev, 0x00, sizeof(opti283_t));
|
||||
|
||||
io_sethandler(0x0022, 0x0001, opti283_read, NULL, NULL, opti283_write, NULL, NULL, dev);
|
||||
io_sethandler(0x0023, 0x0001, opti283_read, NULL, NULL, opti283_write, NULL, NULL, dev);
|
||||
io_sethandler(0x0024, 0x0001, opti283_read, NULL, NULL, opti283_write, NULL, NULL, dev);
|
||||
|
||||
dev->regs[0x10] = 0x3f;
|
||||
@@ -296,6 +311,8 @@ opti283_init(UNUSED(const device_t *info))
|
||||
|
||||
opti283_shadow_recalc(dev);
|
||||
|
||||
device_add(&port_92_device);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
||||
@@ -178,6 +178,9 @@ opti391_write(uint16_t addr, uint8_t val, void *priv)
|
||||
opti391_log("[W] %04X = %02X\n", addr, val);
|
||||
|
||||
switch (addr) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x22:
|
||||
dev->index = val;
|
||||
break;
|
||||
@@ -200,6 +203,9 @@ opti391_write(uint16_t addr, uint8_t val, void *priv)
|
||||
reset_on_hlt = !!(val & 0x02);
|
||||
break;
|
||||
} else switch (dev->index - dev->reg_base) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x00:
|
||||
if (dev->type == 2) {
|
||||
reset_on_hlt = !!(val & 0x02);
|
||||
@@ -222,8 +228,14 @@ opti391_write(uint16_t addr, uint8_t val, void *priv)
|
||||
opti391_recalcremap(dev);
|
||||
break;
|
||||
|
||||
case 0x04:
|
||||
case 0x05:
|
||||
if (dev->type == 2)
|
||||
dev->regs[dev->index - dev->reg_base] = val & 0xf8;
|
||||
else
|
||||
dev->regs[dev->index - dev->reg_base] = val;
|
||||
break;
|
||||
|
||||
case 0x04:
|
||||
case 0x09:
|
||||
case 0x0a:
|
||||
case 0x0b:
|
||||
@@ -238,8 +250,10 @@ opti391_write(uint16_t addr, uint8_t val, void *priv)
|
||||
}
|
||||
break;
|
||||
case 0x08:
|
||||
dev->regs[dev->index - dev->reg_base] = val;
|
||||
if (dev->type < 2) {
|
||||
if (dev->type == 2)
|
||||
dev->regs[dev->index - dev->reg_base] = val & 0xe3;
|
||||
else {
|
||||
dev->regs[dev->index - dev->reg_base] = val;
|
||||
cpu_cache_ext_enabled = !!(dev->regs[0x02] & 0x40);
|
||||
cpu_update_waitstates();
|
||||
}
|
||||
@@ -257,13 +271,9 @@ opti391_write(uint16_t addr, uint8_t val, void *priv)
|
||||
dev->regs[dev->index - dev->reg_base] = val;
|
||||
opti391_shadow_recalc(dev);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
dev->index = 0xff;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -271,14 +281,16 @@ opti391_write(uint16_t addr, uint8_t val, void *priv)
|
||||
static uint8_t
|
||||
opti391_read(uint16_t addr, void *priv)
|
||||
{
|
||||
const opti391_t *dev = (opti391_t *) priv;
|
||||
uint8_t ret = 0xff;
|
||||
opti391_t *dev = (opti391_t *) priv;
|
||||
uint8_t ret = 0xff;
|
||||
|
||||
if (addr == 0x24) {
|
||||
if ((dev->index <= 0x01) && (dev->type < 2))
|
||||
ret = dev->regs[dev->index + 0x10];
|
||||
else if ((dev->index >= dev->min_reg) && (dev->index <= dev->max_reg))
|
||||
ret = dev->regs[dev->index - dev->reg_base];
|
||||
|
||||
dev->index = 0xff;
|
||||
}
|
||||
|
||||
opti391_log("[R] %04X = %02X\n", addr, ret);
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
#include <86box/chipset.h>
|
||||
|
||||
typedef struct opti495_t {
|
||||
uint8_t type;
|
||||
uint8_t max;
|
||||
uint8_t idx;
|
||||
uint8_t regs[256];
|
||||
uint8_t scratch[2];
|
||||
@@ -55,6 +57,22 @@ opti495_log(const char *fmt, ...)
|
||||
# define opti495_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
enum {
|
||||
OPTI493 = 0,
|
||||
OPTI495,
|
||||
OPTI495SLC,
|
||||
OPTI495SX,
|
||||
OPTI495XLC,
|
||||
TMAX
|
||||
};
|
||||
|
||||
/* OPTi 82C493: According to The Last Byte, bit 1 of register 22h, while unused, must still be writable. */
|
||||
static uint8_t masks[TMAX][0x1c] = { { 0x3f, 0xff, 0xff, 0xff, 0xf7, 0xfb, 0x7f, 0x9f, 0xe3, 0xff, 0xe3, 0xff },
|
||||
{ 0x3a, 0x7f, 0xff, 0xff, 0xf0, 0xfb, 0x7f, 0xbf, 0xe3, 0xff, 0x00, 0x00 },
|
||||
{ 0x3a, 0x7f, 0xfc, 0xff, 0xf0, 0xfb, 0xff, 0xbf, 0xe3, 0xff, 0x00, 0x00 },
|
||||
{ 0x3a, 0xff, 0xfd, 0xff, 0xf0, 0xfb, 0x7f, 0xbf, 0xe3, 0xff, 0x00, 0x00 },
|
||||
{ 0x3a, 0xff, 0xfc, 0xff, 0xf0, 0xfb, 0xff, 0xbf, 0xe3, 0xff, 0x00, 0x00 } };
|
||||
|
||||
static void
|
||||
opti495_recalc(opti495_t *dev)
|
||||
{
|
||||
@@ -119,16 +137,25 @@ opti495_write(uint16_t addr, uint8_t val, void *priv)
|
||||
opti495_t *dev = (opti495_t *) priv;
|
||||
|
||||
switch (addr) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x22:
|
||||
opti495_log("[%04X:%08X] [W] dev->idx = %02X\n", CS, cpu_state.pc, val);
|
||||
dev->idx = val;
|
||||
break;
|
||||
case 0x24:
|
||||
if ((dev->idx >= 0x20) && (dev->idx <= 0x2d)) {
|
||||
dev->regs[dev->idx] = val;
|
||||
if ((dev->idx >= 0x20) && (dev->idx <= dev->max)) {
|
||||
opti495_log("[%04X:%08X] [W] dev->regs[%04X] = %02X\n", CS, cpu_state.pc, dev->idx, val);
|
||||
|
||||
dev->regs[dev->idx] = val & masks[dev->type][dev->idx - 0x20];
|
||||
if ((dev->type == OPTI493) && (dev->idx == 0x20))
|
||||
val |= 0x40;
|
||||
|
||||
switch (dev->idx) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x21:
|
||||
cpu_cache_ext_enabled = !!(dev->regs[0x21] & 0x10);
|
||||
cpu_update_waitstates();
|
||||
@@ -139,36 +166,36 @@ opti495_write(uint16_t addr, uint8_t val, void *priv)
|
||||
case 0x26:
|
||||
opti495_recalc(dev);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dev->idx = 0xff;
|
||||
break;
|
||||
|
||||
case 0xe1:
|
||||
case 0xe2:
|
||||
dev->scratch[~addr & 0x01] = val;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
opti495_read(uint16_t addr, void *priv)
|
||||
{
|
||||
uint8_t ret = 0xff;
|
||||
const opti495_t *dev = (opti495_t *) priv;
|
||||
uint8_t ret = 0xff;
|
||||
opti495_t *dev = (opti495_t *) priv;
|
||||
|
||||
switch (addr) {
|
||||
case 0x22:
|
||||
opti495_log("[%04X:%08X] [R] dev->idx = %02X\n", CS, cpu_state.pc, ret);
|
||||
break;
|
||||
case 0x24:
|
||||
if ((dev->idx >= 0x20) && (dev->idx <= 0x2d)) {
|
||||
if ((dev->idx >= 0x20) && (dev->idx <= dev->max)) {
|
||||
ret = dev->regs[dev->idx];
|
||||
opti495_log("[%04X:%08X] [R] dev->regs[%04X] = %02X\n", CS, cpu_state.pc, dev->idx, ret);
|
||||
}
|
||||
|
||||
dev->idx = 0xff;
|
||||
break;
|
||||
case 0xe1:
|
||||
case 0xe2:
|
||||
@@ -202,8 +229,11 @@ opti495_init(const device_t *info)
|
||||
|
||||
dev->scratch[0] = dev->scratch[1] = 0xff;
|
||||
|
||||
if (info->local == 1) {
|
||||
dev->type = info->local;
|
||||
|
||||
if (info->local >= OPTI495) {
|
||||
/* 85C495 */
|
||||
dev->max = 0x29;
|
||||
dev->regs[0x20] = 0x02;
|
||||
dev->regs[0x21] = 0x20;
|
||||
dev->regs[0x22] = 0xe4;
|
||||
@@ -214,6 +244,7 @@ opti495_init(const device_t *info)
|
||||
dev->regs[0x29] = 0x10;
|
||||
} else {
|
||||
/* 85C493 */
|
||||
dev->max = 0x2b;
|
||||
dev->regs[0x20] = 0x40;
|
||||
dev->regs[0x22] = 0x84;
|
||||
dev->regs[0x24] = 0x87;
|
||||
@@ -236,7 +267,7 @@ const device_t opti493_device = {
|
||||
.name = "OPTi 82C493",
|
||||
.internal_name = "opti493",
|
||||
.flags = 0,
|
||||
.local = 0,
|
||||
.local = OPTI493,
|
||||
.init = opti495_init,
|
||||
.close = opti495_close,
|
||||
.reset = NULL,
|
||||
@@ -250,7 +281,7 @@ const device_t opti495_device = {
|
||||
.name = "OPTi 82C495",
|
||||
.internal_name = "opti495",
|
||||
.flags = 0,
|
||||
.local = 1,
|
||||
.local = OPTI495XLC,
|
||||
.init = opti495_init,
|
||||
.close = opti495_close,
|
||||
.reset = NULL,
|
||||
|
||||
@@ -38,6 +38,9 @@ typedef struct opti499_t {
|
||||
uint8_t scratch[2];
|
||||
} opti499_t;
|
||||
|
||||
/* According to The Last Byte, register 2Dh bit 7 must still be writable, even if it is unused. */
|
||||
static uint8_t masks[0x0e] = { 0x3f, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xfb, 0xff, 0x00, 0xff };
|
||||
|
||||
#ifdef ENABLE_OPTI499_LOG
|
||||
int opti499_do_log = ENABLE_OPTI499_LOG;
|
||||
|
||||
@@ -126,19 +129,25 @@ opti499_write(uint16_t addr, uint8_t val, void *priv)
|
||||
opti499_t *dev = (opti499_t *) priv;
|
||||
|
||||
switch (addr) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x22:
|
||||
opti499_log("[%04X:%08X] [W] dev->idx = %02X\n", CS, cpu_state.pc, val);
|
||||
dev->idx = val;
|
||||
break;
|
||||
case 0x24:
|
||||
if ((dev->idx >= 0x20) && (dev->idx <= 0x2d)) {
|
||||
if (dev->idx == 0x20)
|
||||
dev->regs[dev->idx] = (dev->regs[dev->idx] & 0xc0) | (val & 0x3f);
|
||||
else
|
||||
dev->regs[dev->idx] = val;
|
||||
if ((dev->idx >= 0x20) && (dev->idx <= 0x2d) && (dev->idx != 0x2c)) {
|
||||
opti499_log("[%04X:%08X] [W] dev->regs[%04X] = %02X\n", CS, cpu_state.pc, dev->idx, val);
|
||||
|
||||
dev->regs[dev->idx] = val & masks[dev->idx - 0x20];
|
||||
if (dev->idx == 0x2a)
|
||||
dev->regs[dev->idx] |= 0x04;
|
||||
|
||||
switch (dev->idx) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x20:
|
||||
reset_on_hlt = !(val & 0x02);
|
||||
break;
|
||||
@@ -154,20 +163,16 @@ opti499_write(uint16_t addr, uint8_t val, void *priv)
|
||||
case 0x2d:
|
||||
opti499_recalc(dev);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dev->idx = 0xff;
|
||||
break;
|
||||
|
||||
case 0xe1:
|
||||
case 0xe2:
|
||||
dev->scratch[~addr & 0x01] = val;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,25 +183,23 @@ opti499_read(uint16_t addr, void *priv)
|
||||
opti499_t *dev = (opti499_t *) priv;
|
||||
|
||||
switch (addr) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0x22:
|
||||
opti499_log("[%04X:%08X] [R] dev->idx = %02X\n", CS, cpu_state.pc, ret);
|
||||
break;
|
||||
case 0x24:
|
||||
if ((dev->idx >= 0x20) && (dev->idx <= 0x2d)) {
|
||||
if (dev->idx == 0x2d)
|
||||
ret = dev->regs[dev->idx] & 0xbf;
|
||||
else
|
||||
ret = dev->regs[dev->idx];
|
||||
if ((dev->idx >= 0x20) && (dev->idx <= 0x2d) && (dev->idx != 0x2c)) {
|
||||
ret = dev->regs[dev->idx];
|
||||
opti499_log("[%04X:%08X] [R] dev->regs[%04X] = %02X\n", CS, cpu_state.pc, dev->idx, ret);
|
||||
}
|
||||
dev->idx = 0xff;
|
||||
break;
|
||||
case 0xe1:
|
||||
case 0xe2:
|
||||
ret = dev->scratch[~addr & 0x01];
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -42,6 +42,9 @@ typedef struct opti895_t {
|
||||
smram_t *smram;
|
||||
} opti895_t;
|
||||
|
||||
static uint8_t masks[0x10] = { 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
|
||||
0xe3, 0xff, 0xe3, 0xff, 0x00, 0xff, 0xff, 0xff };
|
||||
|
||||
#ifdef ENABLE_OPTI895_LOG
|
||||
int opti895_do_log = ENABLE_OPTI895_LOG;
|
||||
|
||||
@@ -153,8 +156,12 @@ opti895_write(uint16_t addr, uint8_t val, void *priv)
|
||||
}
|
||||
break;
|
||||
case 0x24:
|
||||
if (((dev->idx >= 0x20) && (dev->idx <= 0x2f)) || ((dev->idx >= 0xe0) && (dev->idx <= 0xef))) {
|
||||
dev->regs[dev->idx] = val;
|
||||
if (((dev->idx >= 0x20) && (dev->idx <= 0x2f) && (dev->idx != 0x2c)) ||
|
||||
((dev->idx >= 0xe0) && (dev->idx <= 0xef))) {
|
||||
if (dev->idx > 0x2f)
|
||||
dev->regs[dev->idx] = val;
|
||||
else
|
||||
dev->regs[dev->idx] = val & masks[dev->idx - 0x20];
|
||||
opti895_log("dev->regs[%04x] = %08x\n", dev->idx, val);
|
||||
|
||||
/* TODO: Registers 0x30-0x3F for OPTi 802GP and 898. */
|
||||
@@ -217,7 +224,8 @@ opti895_read(uint16_t addr, void *priv)
|
||||
break;
|
||||
case 0x24:
|
||||
/* TODO: Registers 0x30-0x3F for OPTi 802GP and 898. */
|
||||
if (((dev->idx >= 0x20) && (dev->idx <= 0x2f)) || ((dev->idx >= 0xe0) && (dev->idx <= 0xef))) {
|
||||
if (((dev->idx >= 0x20) && (dev->idx <= 0x2f) && (dev->idx != 0x2c)) ||
|
||||
((dev->idx >= 0xe0) && (dev->idx <= 0xef))) {
|
||||
ret = dev->regs[dev->idx];
|
||||
if (dev->idx == 0xe0)
|
||||
ret = (ret & 0xf6) | (in_smm ? 0x00 : 0x08) | !!dev->forced_green;
|
||||
|
||||
10024
src/cpu/cpu_table.c
10024
src/cpu/cpu_table.c
File diff suppressed because it is too large
Load Diff
@@ -430,12 +430,21 @@ op0F01_common(uint32_t fetchdat, int is32, int is286, int ea32)
|
||||
case 0x20: /*SMSW*/
|
||||
if (cpu_mod != 3)
|
||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||
if (is486 || isibm486)
|
||||
seteaw(msw);
|
||||
else if (is386)
|
||||
seteaw(msw | /* 0xFF00 */ 0xFFE0);
|
||||
else
|
||||
seteaw(msw | 0xFFF0);
|
||||
if (is386 && is32 && (cpu_mod == 3)) {
|
||||
if (is486 || isibm486)
|
||||
seteaw(cr0);
|
||||
else if (is386 && !cpu_16bitbus)
|
||||
seteaw(cr0 | /* 0x7FFFFF00 */ 0x7FFFFFE0);
|
||||
else
|
||||
seteaw(cr0 | 0x7FFFFFF0);
|
||||
} else {
|
||||
if (is486 || isibm486)
|
||||
seteaw(msw);
|
||||
else if (is386 && !cpu_16bitbus)
|
||||
seteaw(msw | /* 0xFF00 */ 0xFFE0);
|
||||
else
|
||||
seteaw(msw | 0xFFF0);
|
||||
}
|
||||
CLOCK_CYCLES(2);
|
||||
PREFETCH_RUN(2, 2, rmdat, 0, 0, (cpu_mod == 3) ? 0 : 1, 0, ea32);
|
||||
break;
|
||||
|
||||
@@ -606,7 +606,6 @@ static int
|
||||
sf_FNOP(uint32_t fetchdat)
|
||||
{
|
||||
FP_ENTER();
|
||||
pclog("FNOP.\n");
|
||||
FPU_check_pending_exceptions();
|
||||
cpu_state.pc++;
|
||||
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fnop) : (x87_timings.fnop * cpu_multi));
|
||||
|
||||
@@ -454,9 +454,12 @@ mfm_load(int drive, char *fn)
|
||||
dev->br_rounded = (int) dbr;
|
||||
mfm_log("Rounded bit rate: %i kbps\n", dev->br_rounded);
|
||||
|
||||
dbr = round(((double) dev->hdr.rpm) / 60.0) * 60.0;
|
||||
if (dev->hdr.rpm != 0)
|
||||
dbr = round(((double) dev->hdr.rpm) / 60.0) * 60.0;
|
||||
else
|
||||
dbr = (dev->br_rounded == 300) ? 360.0 : 300.0;
|
||||
dev->rpm_rounded = (int) dbr;
|
||||
mfm_log("Rounded RPM: %i kbps\n", dev->rpm_rounded);
|
||||
mfm_log("Rounded RPM: %i rpm\n", dev->rpm_rounded);
|
||||
}
|
||||
|
||||
/* Set up the drive unit. */
|
||||
|
||||
@@ -92,9 +92,7 @@ sw_timer_over(void *priv)
|
||||
if (sw->poll_left == 1 && !sw->poll_clock)
|
||||
timer_advance_u64(&sw->poll_timer, TIMER_USEC * 160);
|
||||
else if (sw->poll_left)
|
||||
timer_advance_u64(&sw->poll_timer, TIMER_USEC * 5);
|
||||
else
|
||||
timer_disable(&sw->poll_timer);
|
||||
timer_set_delay_u64(&sw->poll_timer, TIMER_USEC * 5);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -173,11 +171,9 @@ sw_write(void *priv)
|
||||
if (!JOYSTICK_PRESENT(0))
|
||||
return;
|
||||
|
||||
timer_process();
|
||||
|
||||
if (!sw->poll_left) {
|
||||
sw->poll_clock = 1;
|
||||
timer_set_delay_u64(&sw->poll_timer, TIMER_USEC * 50);
|
||||
timer_set_delay_u64(&sw->poll_timer, TIMER_USEC * 40);
|
||||
|
||||
if (time_since_last > 9900 && time_since_last < 9940) {
|
||||
sw->poll_mode = 0;
|
||||
|
||||
@@ -226,7 +226,6 @@ typedef struct cdrom {
|
||||
uint8_t speed;
|
||||
uint8_t cur_speed;
|
||||
|
||||
int is_dir;
|
||||
void *priv;
|
||||
|
||||
char image_path[1024];
|
||||
|
||||
@@ -53,6 +53,8 @@ typedef struct track_file_t {
|
||||
char fn[260];
|
||||
FILE *fp;
|
||||
void *priv;
|
||||
|
||||
int motorola;
|
||||
} track_file_t;
|
||||
|
||||
typedef struct track_t {
|
||||
@@ -63,7 +65,7 @@ typedef struct track_t {
|
||||
int mode2;
|
||||
int form;
|
||||
int pre;
|
||||
int pad;
|
||||
int noskip; /* Do not skip by 8 bytes.*/
|
||||
uint64_t start;
|
||||
uint64_t length;
|
||||
uint64_t skip;
|
||||
|
||||
@@ -138,9 +138,6 @@ extern const device_t scsi_t128_device;
|
||||
extern const device_t scsi_t228_device;
|
||||
extern const device_t scsi_t130b_device;
|
||||
extern const device_t scsi_ls2000_device;
|
||||
#if defined(DEV_BRANCH) && defined(USE_SUMO)
|
||||
extern const device_t scsi_scsiat_device;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /*SCSI_NCR5380_H*/
|
||||
|
||||
@@ -454,7 +454,7 @@ machine_at_epc2102_init(const machine_t *model)
|
||||
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
|
||||
device_add(&i430hx_device);
|
||||
device_add(&piix3_device);
|
||||
device_add(&keyboard_ps2_pci_device);
|
||||
device_add(&keyboard_ps2_intel_ami_pci_device);
|
||||
device_add(&i82091aa_device);
|
||||
device_add(&intel_flash_bxt_device);
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ extern const device_t compaq_plasma_device;
|
||||
extern const device_t ps1_2011_device;
|
||||
|
||||
const machine_filter_t machine_types[] = {
|
||||
{ "None", MACHINE_TYPE_NONE },
|
||||
{ "None", MACHINE_TYPE_NONE },
|
||||
{ "[1979] 8088", MACHINE_TYPE_8088 },
|
||||
{ "[1978] 8086", MACHINE_TYPE_8086 },
|
||||
{ "[1982] 80286", MACHINE_TYPE_286 },
|
||||
@@ -72,15 +72,15 @@ const machine_filter_t machine_types[] = {
|
||||
{ "[1993] Socket 4", MACHINE_TYPE_SOCKET4 },
|
||||
{ "[1994] Socket 5", MACHINE_TYPE_SOCKET5 },
|
||||
{ "[1995] Socket 7 (Single Voltage)", MACHINE_TYPE_SOCKET7_3V },
|
||||
{ "[1995] Socket 7 (Dual Voltage)", MACHINE_TYPE_SOCKET7 },
|
||||
{ "[1996] Socket 7 (Dual Voltage)", MACHINE_TYPE_SOCKET7 },
|
||||
{ "[1998] Super Socket 7", MACHINE_TYPE_SOCKETS7 },
|
||||
{ "[1995] Socket 8", MACHINE_TYPE_SOCKET8 },
|
||||
{ "[1996] Slot 1", MACHINE_TYPE_SLOT1 },
|
||||
{ "[1997] Slot 1", MACHINE_TYPE_SLOT1 },
|
||||
{ "[1998] Slot 1/2", MACHINE_TYPE_SLOT1_2 },
|
||||
{ "[1998] Slot 1/Socket 370", MACHINE_TYPE_SLOT1_370 },
|
||||
{ "[1998] Slot 2", MACHINE_TYPE_SLOT2 },
|
||||
{ "[1998] Socket 370", MACHINE_TYPE_SOCKET370 },
|
||||
{ "Miscellaneous", MACHINE_TYPE_MISC }
|
||||
{ "Miscellaneous", MACHINE_TYPE_MISC }
|
||||
};
|
||||
|
||||
const machine_filter_t machine_chipsets[] = {
|
||||
@@ -1509,7 +1509,7 @@ const machine_t machines[] = {
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_8088_EUROPC,
|
||||
.package = CPU_PKG_8088,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
@@ -1548,7 +1548,7 @@ const machine_t machines[] = {
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_8088_EUROPC,
|
||||
.package = CPU_PKG_8088,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
@@ -5484,10 +5484,10 @@ const machine_t machines[] = {
|
||||
.cpu = {
|
||||
.package = CPU_PKG_386DX | CPU_PKG_SOCKET1,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_bus = 25000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 5000,
|
||||
.max_voltage = 5000,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
@@ -5752,50 +5752,6 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has JetKey 5 KBC Firmware which looks like it is a clone of AMIKey type F.
|
||||
It also has those Ex commands also seen on the VIA VT82C42N (the BIOS
|
||||
supposedly sends command EF.
|
||||
The board was also seen in 2003 with a -H string - perhaps someone swapped
|
||||
the KBC? */
|
||||
{
|
||||
.name = "[ALi M1429] Olystar LIL1429",
|
||||
.internal_name = "ali1429",
|
||||
.type = MACHINE_TYPE_486,
|
||||
.chipset = MACHINE_CHIPSET_ALI_M1429,
|
||||
.init = machine_at_ali1429_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET1,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_VLB,
|
||||
.flags = MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 1024,
|
||||
.max = 32768,
|
||||
.step = 1024
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has JetKey 5 KBC Firmware - but the BIOS string ends in a hardcoded -F, and
|
||||
the BIOS also explicitly expects command A1 to return a 'F', so it looks like
|
||||
the JetKey 5 is a clone of AMIKey type F. */
|
||||
@@ -6000,86 +5956,6 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Uses an NEC 90M002A (UPD82C42C, 8042 clone) with unknown firmware. */
|
||||
{
|
||||
.name = "[SiS 461] Acer V10",
|
||||
.internal_name = "acerv10",
|
||||
.type = MACHINE_TYPE_486,
|
||||
.chipset = MACHINE_CHIPSET_SIS_461,
|
||||
.init = machine_at_acerv10_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET1,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_VLB,
|
||||
.flags = MACHINE_IDE | MACHINE_APM, /* Machine has internal SCSI: Adaptec AIC-6360 */
|
||||
.ram = {
|
||||
.min = 1024,
|
||||
.max = 32768,
|
||||
.step = 1024
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has MR (!) KBC firmware, which is a clone of the standard IBM PS/2 KBC firmware. */
|
||||
{
|
||||
.name = "[SiS 471] SiS VL-BUS 471 REV. A1",
|
||||
.internal_name = "px471",
|
||||
.type = MACHINE_TYPE_486,
|
||||
.chipset = MACHINE_CHIPSET_SIS_471,
|
||||
.init = machine_at_px471_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET1,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_VLB,
|
||||
.flags = MACHINE_IDE | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 1024,
|
||||
.max = 131072,
|
||||
.step = 1024
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* The chip is a Lance LT38C41, a clone of the Intel 8041, and the BIOS sends
|
||||
commands BC, BD, and C9 which exist on both AMIKey and Phoenix MultiKey/42,
|
||||
but it does not write a byte after C9, which is consistent with AMIKey, so
|
||||
@@ -6366,6 +6242,50 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has JetKey 5 KBC Firmware which looks like it is a clone of AMIKey type F.
|
||||
It also has those Ex commands also seen on the VIA VT82C42N (the BIOS
|
||||
supposedly sends command EF.
|
||||
The board was also seen in 2003 with a -H string - perhaps someone swapped
|
||||
the KBC? */
|
||||
{
|
||||
.name = "[ALi M1429] Olystar LIL1429",
|
||||
.internal_name = "ali1429",
|
||||
.type = MACHINE_TYPE_486_S2,
|
||||
.chipset = MACHINE_CHIPSET_ALI_M1429,
|
||||
.init = machine_at_ali1429_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET3,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_VLB,
|
||||
.flags = MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 1024,
|
||||
.max = 32768,
|
||||
.step = 1024
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* This has a standalone AMI Megakey 1993, which is type 'P'. */
|
||||
{
|
||||
.name = "[IMS 8848] Tekram G486IP",
|
||||
@@ -6418,7 +6338,7 @@ const machine_t machines[] = {
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET3,
|
||||
.package = CPU_PKG_SOCKET3 | CPU_PKG_486BL,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
@@ -6811,6 +6731,46 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Uses an NEC 90M002A (UPD82C42C, 8042 clone) with unknown firmware. */
|
||||
{
|
||||
.name = "[SiS 461] Acer V10",
|
||||
.internal_name = "acerv10",
|
||||
.type = MACHINE_TYPE_486_S3,
|
||||
.chipset = MACHINE_CHIPSET_SIS_461,
|
||||
.init = machine_at_acerv10_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET3,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_VLB,
|
||||
.flags = MACHINE_IDE | MACHINE_APM, /* Machine has internal SCSI: Adaptec AIC-6360 */
|
||||
.ram = {
|
||||
.min = 1024,
|
||||
.max = 32768,
|
||||
.step = 1024
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* The BIOS string ends in -U, unless command 0xA1 (AMIKey get version) returns an
|
||||
'F', in which case, it ends in -F, so it has an AMIKey F KBC firmware.
|
||||
The photo of the board shows an AMIKey KBC which is indeed F. */
|
||||
@@ -7013,6 +6973,46 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has MR (!) KBC firmware, which is a clone of the standard IBM PS/2 KBC firmware. */
|
||||
{
|
||||
.name = "[SiS 471] SiS VL-BUS 471 REV. A1",
|
||||
.internal_name = "px471",
|
||||
.type = MACHINE_TYPE_486_S3,
|
||||
.chipset = MACHINE_CHIPSET_SIS_471,
|
||||
.init = machine_at_px471_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET3,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 0,
|
||||
.max_bus = 0,
|
||||
.min_voltage = 0,
|
||||
.max_voltage = 0,
|
||||
.min_multi = 0,
|
||||
.max_multi = 0
|
||||
},
|
||||
.bus_flags = MACHINE_VLB,
|
||||
.flags = MACHINE_IDE | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 1024,
|
||||
.max = 131072,
|
||||
.step = 1024
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* TriGem AMIBIOS Pre-Color with TriGem AMI 'Z' keyboard controller */
|
||||
{
|
||||
.name = "[SiS 471] TriGem 486G",
|
||||
@@ -10767,6 +10767,48 @@ const machine_t machines[] = {
|
||||
},
|
||||
|
||||
/* 430HX */
|
||||
/* Has SST Flash. */
|
||||
/* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix
|
||||
MultiKey/42 (version 1.38) KBC firmware. */
|
||||
{
|
||||
.name = "[i430HX] Acer V35N",
|
||||
.internal_name = "acerv35n",
|
||||
.type = MACHINE_TYPE_SOCKET7_3V,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430HX,
|
||||
.init = machine_at_acerv35n_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 3450,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 196608,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 511,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has AMIKey-2 or VIA VT82C42N KBC (depending on the revision) with AMIKEY 'F' KBC firmware. */
|
||||
{
|
||||
.name = "[i430HX] AOpen AP53",
|
||||
@@ -10847,89 +10889,8 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* [TEST] The board doesn't seem to have a KBC at all, which probably means it's an on-chip one on the PC87306 SIO.
|
||||
A list on a Danish site shows the BIOS as having a -0 string, indicating non-AMI KBC firmware. */
|
||||
{
|
||||
.name = "[i430HX] Supermicro P55T2S",
|
||||
.internal_name = "p55t2s",
|
||||
.type = MACHINE_TYPE_SOCKET7_3V,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430HX,
|
||||
.init = machine_at_p55t2s_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 3300,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 786432,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 255,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
|
||||
/* 430VX */
|
||||
/* Has AMIKey H KBC firmware (AMIKey-2). */
|
||||
{
|
||||
.name = "[i430VX] ECS P5VX-B",
|
||||
.internal_name = "p5vxb",
|
||||
.type = MACHINE_TYPE_SOCKET7_3V,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430VX,
|
||||
.init = machine_at_p5vxb_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 3380,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 131072,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has a SM(S)C FDC37C932FR Super I/O chip with on-chip KBC with AMI
|
||||
MegaKey (revision '5') KBC firmware. */
|
||||
{
|
||||
@@ -11219,48 +11180,6 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has SST Flash. */
|
||||
/* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix
|
||||
MultiKey/42 (version 1.38) KBC firmware. */
|
||||
{
|
||||
.name = "[i430HX] Acer V35N",
|
||||
.internal_name = "acerv35n",
|
||||
.type = MACHINE_TYPE_SOCKET7,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430HX,
|
||||
.init = machine_at_acerv35n_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.block = CPU_BLOCK(CPU_Cx6x86MX),
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 2800,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 196608,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 511,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has AMIKey H KBC firmware (AMIKey-2). */
|
||||
{
|
||||
.name = "[i430HX] ASUS P/I-P55T2P4",
|
||||
@@ -11301,6 +11220,46 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* The base board has a Holtek HT6542B with the AMIKey-2 (updated 'H') KBC firmware. */
|
||||
{
|
||||
.name = "[i430HX] ASUS P/I-P65UP5 (C-P55T2D)",
|
||||
.internal_name = "p65up5_cp55t2d",
|
||||
.type = MACHINE_TYPE_SOCKET7,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430HX,
|
||||
.init = machine_at_p65up5_cp55t2d_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 2500,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Machine has AMB */
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 524288,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix
|
||||
MultiKey/42 (version 1.38) KBC firmware. */
|
||||
{
|
||||
@@ -11547,13 +11506,14 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* The base board has a Holtek HT6542B with the AMIKey-2 (updated 'H') KBC firmware. */
|
||||
/* [TEST] The board doesn't seem to have a KBC at all, which probably means it's an on-chip one on the PC87306 SIO.
|
||||
A list on a Danish site shows the BIOS as having a -0 string, indicating non-AMI KBC firmware. */
|
||||
{
|
||||
.name = "[i430HX] ASUS P/I-P65UP5 (C-P55T2D)",
|
||||
.internal_name = "p65up5_cp55t2d",
|
||||
.name = "[i430HX] Supermicro P55T2S",
|
||||
.internal_name = "p55t2s",
|
||||
.type = MACHINE_TYPE_SOCKET7,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430HX,
|
||||
.init = machine_at_p65up5_cp55t2d_init,
|
||||
.init = machine_at_p55t2s_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
@@ -11563,59 +11523,19 @@ const machine_t machines[] = {
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 2500,
|
||||
.min_voltage = 2800,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Machine has AMB */
|
||||
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 524288,
|
||||
.max = 786432,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Unknown PS/2 KBC. */
|
||||
{
|
||||
.name = "[i430HX] Radisys EPC-2102",
|
||||
.internal_name = "epc2102",
|
||||
.type = MACHINE_TYPE_SOCKET7,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430HX,
|
||||
.init = machine_at_epc2102_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 83333333,
|
||||
.min_voltage = 2500,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 262144,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.nvrmask = 255,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
@@ -11913,6 +11833,46 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has AMIKey H KBC firmware (AMIKey-2). */
|
||||
{
|
||||
.name = "[i430VX] ECS P5VX-B",
|
||||
.internal_name = "p5vxb",
|
||||
.type = MACHINE_TYPE_SOCKET7,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430VX,
|
||||
.init = machine_at_p5vxb_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 2500,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 131072,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Has a SM(S)C FDC37C932FR Super I/O chip with on-chip KBC with AMI
|
||||
MegaKey (revision '5') KBC firmware. */
|
||||
{
|
||||
@@ -12119,6 +12079,48 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* Unknown PS/2 KBC. */
|
||||
{
|
||||
.name = "[i430HX] Radisys EPC-2102",
|
||||
.internal_name = "epc2102",
|
||||
.type = MACHINE_TYPE_SOCKET7,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430HX,
|
||||
.init = machine_at_epc2102_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET5_7,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 50000000,
|
||||
.max_bus = 83333333,
|
||||
.min_voltage = 2500,
|
||||
.max_voltage = 3520,
|
||||
.min_multi = 1.5,
|
||||
.max_multi = 3.0
|
||||
},
|
||||
.bus_flags = MACHINE_PS2_PCI,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 8192,
|
||||
.max = 262144,
|
||||
.max = 786432,
|
||||
.step = 8192
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.nvrmask = 255,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* This has a Holtek KBC and the BIOS does not send a single non-standard KBC command, so it
|
||||
must be an ASIC that clones the standard IBM PS/2 KBC. */
|
||||
{
|
||||
|
||||
@@ -218,7 +218,6 @@ SettingsFloppyCDROM::save()
|
||||
/* Removable devices category */
|
||||
model = ui->tableViewCDROM->model();
|
||||
for (int i = 0; i < CDROM_NUM; i++) {
|
||||
cdrom[i].is_dir = 0;
|
||||
cdrom[i].priv = NULL;
|
||||
cdrom[i].ops = NULL;
|
||||
cdrom[i].image = NULL;
|
||||
|
||||
Reference in New Issue
Block a user