This commit is contained in:
starfrost013
2025-04-17 21:40:42 +01:00
19 changed files with 264 additions and 97 deletions

View File

@@ -18,7 +18,6 @@ on:
- cmake/**
- "**/CMakeLists.txt"
- "CMakePresets.json"
- .github/workflows/**
- .github/workflows/cmake_windows_msys2.yml
- vcpkg.json
- "!**/Makefile*"
@@ -26,9 +25,9 @@ on:
jobs:
msys2:
name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}"
name: "${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}"
runs-on: windows-2022
runs-on: ${{ matrix.environment.runner }}
env:
BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed
@@ -41,47 +40,38 @@ jobs:
fail-fast: true
matrix:
build:
# - name: Regular
# preset: regular
- name: Debug
- name: Dev Debug
preset: dev_debug
slug: -Debug
slug: -Dev-Debug
- name: Dev
preset: development
slug: -Dev
dynarec:
- name: ODR
new: off
slug: -ODR
- name: NDR
new: on
slug: -NDR
ui:
- name: Qt GUI
qt: on
static: on
slug: -Qt
packages: >-
qt5-static:p
vulkan-headers:p
environment:
# - msystem: MSYS
# toolchain: ./cmake/flags-gcc-x86_64.cmake
- msystem: MINGW64
prefix: mingw-w64-x86_64
toolchain: ./cmake/flags-gcc-x86_64.cmake
# - msystem: CLANG64
# prefix: mingw-w64-clang-x86_64
# toolchain: ./cmake/llvm-win32-x86_64.cmake
# - msystem: UCRT64
# prefix: mingw-w64-ucrt-x86_64
# toolchain: ./cmake/flags-gcc-x86_64.cmake
slug: "-64"
runner: windows-2022
- msystem: CLANGARM64
toolchain: ./cmake/flags-gcc-aarch64.cmake
slug: -arm64
runner: windows-11-arm
exclude:
- dynarec:
new: off
environment:
msystem: CLANGARM64
steps:
- name: Prepare MSYS2 environment
uses: msys2/setup-msys2@v2
with:
release: false
release: true
update: true
msystem: ${{ matrix.environment.msystem }}
pacboy: >-
@@ -98,15 +88,17 @@ jobs:
libslirp:p
fluidsynth:p
libserialport:p
${{ matrix.ui.packages }}
qt5-static:p
vulkan-headers:p
openmp:p
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Install sonar-scanner and build-wrapper
uses: SonarSource/sonarcloud-github-c-cpp@v3
# - name: Install sonar-scanner and build-wrapper
# uses: SonarSource/sonarcloud-github-c-cpp@v3
- name: Configure CMake
run: >-
@@ -114,20 +106,20 @@ jobs:
--toolchain ${{ matrix.environment.toolchain }}
-D NEW_DYNAREC=${{ matrix.dynarec.new }}
-D CMAKE_INSTALL_PREFIX=./build/artifacts
-D QT=${{ matrix.ui.qt }}
-D STATIC_BUILD=${{ matrix.ui.static }}
# - name: Build
# run: |
# .sonar/build-wrapper-win-x86/build-wrapper-win-x86-64.exe --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build
- name: Build
run: |
.sonar/build-wrapper-win-x86/build-wrapper-win-x86-64.exe --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build
run: cmake --build build
- name: Run sonar-scanner
if: 0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: |
.sonar/sonar-scanner-5.0.1.3006-windows/bin/sonar-scanner.bat --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"
# - name: Run sonar-scanner
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
# run: |
# .sonar/sonar-scanner-5.0.1.3006-windows/bin/sonar-scanner.bat --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"
- name: Generate package
run: cmake --install build
@@ -135,5 +127,5 @@ jobs:
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows-${{ matrix.environment.msystem }}-gha${{ github.run_number }}'
name: '86Box${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-Windows${{ matrix.environment.slug }}-gha${{ github.run_number }}'
path: build/artifacts/**

View File

@@ -36,7 +36,7 @@ if(MUNT_EXTERNAL)
endif()
project(86Box
VERSION 4.3
VERSION 5.0
DESCRIPTION "Emulator of x86-based systems"
HOMEPAGE_URL "https://86box.net"
LANGUAGES C CXX)

4
debian/changelog vendored
View File

@@ -1,5 +1,5 @@
86box (4.3) UNRELEASED; urgency=medium
86box (5.0) UNRELEASED; urgency=medium
* Bump release.
-- Jasmine Iwanek <jriwanek@gmail.com> Wed, 13 Nov 2024 06:31:46 +0100
-- Jasmine Iwanek <jriwanek@gmail.com> Wed, 16 Apr 2025 22:08:04 +0200

View File

@@ -2274,13 +2274,73 @@ cdrom_read_disc_info_toc(cdrom_t *dev, uint8_t *b,
return ret;
}
static uint32_t
cdrom_msf_to_lba(const int sector, const int ismsf,
int cdrom_sector_type, const uint8_t vendor_type)
{
int pos = sector;
uint32_t lba;
if ((cdrom_sector_type & 0x0f) >= 0x08) {
mult = cdrom_sector_type >> 4;
pos /= mult;
}
if (ismsf) {
const int m = (pos >> 16) & 0xff;
const int s = (pos >> 8) & 0xff;
const int f = pos & 0xff;
lba = MSFtoLBA(m, s, f) - 150;
} else {
switch (vendor_type) {
case 0x00:
lba = pos;
break;
case 0x40: {
const int m = bcd2bin((pos >> 24) & 0xff);
const int s = bcd2bin((pos >> 16) & 0xff);
const int f = bcd2bin((pos >> 8) & 0xff);
lba = MSFtoLBA(m, s, f) - 150;
break;
} case 0x80:
lba = bcd2bin((pos >> 24) & 0xff);
break;
/* Never used values but the compiler complains. */
default:
lba = 0;
}
}
return lba;
}
int
cdrom_is_track_audio(cdrom_t *dev, const int sector,
const int ismsf, int cdrom_sector_type,
const uint8_t vendor_type)
{
int audio = 0;
uint32_t lba = cdrom_msf_to_lba(sector, ismsf,
cdrom_sector_type, vendor_type);
if (dev->ops->get_track_type)
audio = dev->ops->get_track_type(dev->local, lba);
audio &= CD_TRACK_AUDIO;
return audio;
}
int
cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, const int sector, const int ismsf,
int cdrom_sector_type, const int cdrom_sector_flags,
int *len, const uint8_t vendor_type)
{
int pos = sector;
int ret = 0;
int pos = sector;
int ret = 0;
const int old_type = cdrom_sector_type;
if ((cdrom_sector_type & 0x0f) >= 0x08) {
mult = cdrom_sector_type >> 4;
@@ -2298,38 +2358,12 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, const int sector, const int
uint8_t *temp_b;
uint8_t *b = temp_b = buffer;
int audio = 0;
uint32_t lba;
uint32_t lba = cdrom_msf_to_lba(sector, ismsf,
old_type, vendor_type);
int mode2 = 0;
*len = 0;
if (ismsf) {
const int m = (pos >> 16) & 0xff;
const int s = (pos >> 8) & 0xff;
const int f = pos & 0xff;
lba = MSFtoLBA(m, s, f) - 150;
} else {
switch (vendor_type) {
case 0x00:
lba = pos;
break;
case 0x40: {
const int m = bcd2bin((pos >> 24) & 0xff);
const int s = bcd2bin((pos >> 16) & 0xff);
const int f = bcd2bin((pos >> 8) & 0xff);
lba = MSFtoLBA(m, s, f) - 150;
break;
} case 0x80:
lba = bcd2bin((pos >> 24) & 0xff);
break;
/* Never used values but the compiler complains. */
default:
lba = 0;
}
}
if (dev->ops->get_track_type)
audio = dev->ops->get_track_type(dev->local, lba);

View File

@@ -146,7 +146,11 @@ sermouse_transmit_byte(mouse_t *dev, int do_next)
serial_write_fifo(dev->serial, dev->buf[dev->buf_pos]);
if (do_next) {
dev->buf_pos = (dev->buf_pos + 1) % dev->buf_len;
/* If we have a buffer length of 0, pretend the state is STATE_SKIP_PACKET. */
if (dev->buf_len == 0)
dev->buf_pos = 0;
else
dev->buf_pos = (dev->buf_pos + 1) % dev->buf_len;
if (dev->buf_pos != 0)
sermouse_set_period(dev, dev->transmit_period);
@@ -747,7 +751,7 @@ sermouse_timer(void *priv)
if (!dev->prompt && !dev->continuous)
sermouse_transmit_report(dev, (dev->state == STATE_TRANSMIT_REPORT));
else
dev->state = STATE_IDLE;
dev->state = STATE_IDLE;
break;
case STATE_TRANSMIT_REPORT:
case STATE_TRANSMIT:

View File

@@ -469,7 +469,7 @@ static hdd_preset_t hdd_speed_presets[] = {
{ .name = "[ATA-2] Western Digital Caviar 22000", .internal_name = "AC22000", .model = "WDC AC22000LA", .zones = 8, .avg_spt = 130, .heads = 3, .rpm = 5200, .full_stroke_ms = 33, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 },
{ .name = "[ATA-2] Western Digital Caviar 22100", .internal_name = "AC22100", .model = "WDC AC22100H", .zones = 8, .avg_spt = 140, .heads = 4, .rpm = 5200, .full_stroke_ms = 30, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 },
{ .name = "[ATA-2] Western Digital Caviar 31200", .internal_name = "AC31200", .model = "WDC AC31200F", .zones = 8, .avg_spt = 210, .heads = 4, .rpm = 4500, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 16 },
{ .name = "[ATA-3] Connor CFS1275A", .internal_name = "CFS1275A", .model = "Connor Peripherals 1275MB - CFS1275A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, // Either ATA-2 or ATA-3
{ .name = "[ATA-3] Conner CFS1275A", .internal_name = "CFS1275A", .model = "Conner Peripherals 1275MB - CFS1275A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, // Either ATA-2 or ATA-3
{ .name = "[ATA-3] Fujitsu MPA3017AT", .internal_name = "MPA3017AT", .model = "FUJITSU MPA3017AT", .zones = 5, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 },
{ .name = "[ATA-3] Fujitsu MPA3026AT", .internal_name = "MPA3026AT", .model = "FUJITSU MPA3026AT", .zones = 8, .avg_spt = 195, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 },
{ .name = "[ATA-3] Fujitsu MPA3035AT", .internal_name = "MPA3035AT", .model = "FUJITSU MPA3035AT", .zones = 11, .avg_spt = 195, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 },

View File

@@ -425,6 +425,8 @@ extern uint8_t cdrom_mitsumi_audio_play(cdrom_t *dev, uint32_t pos, uint
#endif
extern uint8_t cdrom_read_disc_info_toc(cdrom_t *dev, uint8_t *b,
const uint8_t track, const int type);
extern int cdrom_is_track_audio(cdrom_t *dev, const int sector, const int ismsf,
int cdrom_sector_type, const uint8_t vendor_type);
extern int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, const int sector, const int ismsf,
int cdrom_sector_type, const int cdrom_sector_flags,
int *len, const uint8_t vendor_type);

View File

@@ -441,6 +441,8 @@ extern int machine_at_ibmatquadtel_init(const machine_t *); // IBM AT with Quadt
extern int machine_at_ibmxt286_init(const machine_t *);
extern int machine_at_pb286_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

View File

@@ -583,6 +583,7 @@ extern const device_t ps1vga_mca_device;
extern const device_t voodoo_device;
extern const device_t voodoo_banshee_device;
extern const device_t creative_voodoo_banshee_device;
extern const device_t quantum3d_raven_device;
extern const device_t voodoo_3_1000_device;
extern const device_t voodoo_3_1000_agp_device;
extern const device_t voodoo_3_2000_device;

View File

@@ -332,6 +332,23 @@ machine_at_ibmxt286_init(const machine_t *model)
return ret;
}
int
machine_at_pb286_init(const machine_t *model)
{
int ret;
ret = bios_load_interleaved("roms/machines/pb286/LB_V332P.BIN",
"roms/machines/pb286/HB_V332P.BIN",
0x000f0000, 65536, 0);
if (bios_only || !ret)
return ret;
machine_at_ibm_common_init(model);
return ret;
}
int
machine_at_siemens_init(const machine_t *model)
{

View File

@@ -3261,6 +3261,47 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
/* Has IBM AT KBC firmware. */
/* To configure the BIOS, use PB_2330a_diag.IMA from MS-DOS 3.30 Packard Bell OEM, GSETUP might work too*/
{
.name = "[ISA] Packard Bell PB286",
.internal_name = "pb286",
.type = MACHINE_TYPE_286,
.chipset = MACHINE_CHIPSET_DISCRETE,
.init = machine_at_pb286_init,
.p1_handler = NULL,
.gpio_handler = NULL,
.available_flag = MACHINE_AVAILABLE,
.gpio_acpi_handler = NULL,
.cpu = {
.package = CPU_PKG_286,
.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_AT,
.flags = MACHINE_FLAGS_NONE,
.ram = {
.min = 256,
.max = 1024,
.step = 128
},
.nvrmask = 63,
.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 Siemens proprietary KBC which is completely undocumented. */
{
.name = "[ISA] Siemens PCD-2L",

View File

@@ -145,6 +145,24 @@ const char* fragment_shader_default_color_src =
" outColor.a = 1.0;\n"
"}\n";
#ifdef ENABLE_OGL3_LOG
int ogl3_do_log = ENABLE_OGL3_LOG;
static void
ogl3_log(const char *fmt, ...)
{
va_list ap;
if (ogl3_do_log) {
va_start(ap, fmt);
ogl3_log_ex(fmt, ap);
va_end(ap);
}
}
#else
# define ogl3_log(fmt, ...)
#endif
static inline int
next_pow2(unsigned int n)
{
@@ -232,8 +250,8 @@ OpenGLRenderer::compile_shader(GLenum shader_type, const char *prepend, const ch
main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not compile shader:\n\n%1").arg(log).replace("\n", "<br>"));
// wx_simple_messagebox("GLSL Error", "Could not compile shader:\n%s", log);
pclog("Could not compile shader: %s\n", log);
// pclog("Shader: %s\n", program);
ogl3_log("Could not compile shader: %s\n", log);
// ogl3_log("Shader: %s\n", program);
free(log);
return 0;
@@ -348,7 +366,7 @@ OpenGLRenderer::create_texture(struct shader_texture *tex)
tex->width = max_texture_size;
if (tex->height > max_texture_size)
tex->height = max_texture_size;
pclog("Create texture with size %dx%d\n", tex->width, tex->height);
ogl3_log("Create texture with size %dx%d\n", tex->width, tex->height);
glw.glGenTextures(1, (GLuint *) &tex->id);
glw.glBindTexture(GL_TEXTURE_2D, tex->id);
glw.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, tex->wrap_mode);
@@ -452,7 +470,7 @@ OpenGLRenderer::create_fbo(struct shader_fbo *fbo)
glw.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo->texture.id, 0);
if (glw.glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
pclog("Could not create framebuffer!\n");
ogl3_log("Could not create framebuffer!\n");
glw.glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
@@ -629,12 +647,12 @@ OpenGLRenderer::load_glslp(glsl_t *glsl, int num_shader, const char *f)
struct shader_lut_texture *tex = &gshader->lut_textures[i];
strcpy(tex->name, texture->name);
pclog("Load texture %s...\n", file);
ogl3_log("Load texture %s...\n", file);
if (!load_texture(file, &tex->texture)) {
//QMessageBox::critical(main_window, tr("GLSL Error"), tr("Could not load texture: %s").arg(file));
main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load texture: %1").arg(file));
pclog("Could not load texture %s!\n", file);
ogl3_log("Could not load texture %s!\n", file);
failed = 1;
break;
}
@@ -676,16 +694,16 @@ OpenGLRenderer::load_glslp(glsl_t *glsl, int num_shader, const char *f)
if (!strlen(pass->alias))
sprintf(pass->alias, "Pass %u", (i + 1));
pclog("Creating pass %u (%s)\n", (i + 1), pass->alias);
pclog("Loading shader %s...\n", shader->shader_fn);
ogl3_log("Creating pass %u (%s)\n", (i + 1), pass->alias);
ogl3_log("Loading shader %s...\n", shader->shader_fn);
if (!shader->shader_program) {
main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load shader: %1").arg(shader->shader_fn));
// wx_simple_messagebox("GLSL Error", "Could not load shader: %s", shader->shader_fn);
pclog("Could not load shader %s\n", shader->shader_fn);
ogl3_log("Could not load shader %s\n", shader->shader_fn);
failed = 1;
break;
} else
pclog("Shader %s loaded\n", shader->shader_fn);
ogl3_log("Shader %s loaded\n", shader->shader_fn);
failed = !compile_shader(GL_VERTEX_SHADER, "#define VERTEX\n#define PARAMETER_UNIFORM\n",
shader->shader_program, &pass->program.vertex_shader)
|| !compile_shader(GL_FRAGMENT_SHADER, "#define FRAGMENT\n#define PARAMETER_UNIFORM\n",
@@ -856,15 +874,15 @@ OpenGLRenderer::initialize()
glw.initializeOpenGLFunctions();
pclog("OpenGL information: [%s] %s (%s)\n", glw.glGetString(GL_VENDOR), glw.glGetString(GL_RENDERER), glw.glGetString(GL_VERSION));
ogl3_log("OpenGL information: [%s] %s (%s)\n", glw.glGetString(GL_VENDOR), glw.glGetString(GL_RENDERER), glw.glGetString(GL_VERSION));
glsl_version[0] = glsl_version[1] = -1;
glw.glGetIntegerv(GL_MAJOR_VERSION, &glsl_version[0]);
glw.glGetIntegerv(GL_MINOR_VERSION, &glsl_version[1]);
if (glsl_version[0] < 3) {
throw opengl_init_error(tr("OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2").arg(glsl_version[0]).arg(glsl_version[1]));
}
pclog("Using OpenGL %s\n", glw.glGetString(GL_VERSION));
pclog("Using Shading Language %s\n", glw.glGetString(GL_SHADING_LANGUAGE_VERSION));
ogl3_log("Using OpenGL %s\n", glw.glGetString(GL_VERSION));
ogl3_log("Using Shading Language %s\n", glw.glGetString(GL_SHADING_LANGUAGE_VERSION));
glslVersion = reinterpret_cast<const char *>(glw.glGetString(GL_SHADING_LANGUAGE_VERSION));
glslVersion.truncate(4);
@@ -876,7 +894,7 @@ OpenGLRenderer::initialize()
glslVersion.append(" core");
glw.glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
pclog("Max texture size: %dx%d\n", max_texture_size, max_texture_size);
ogl3_log("Max texture size: %dx%d\n", max_texture_size, max_texture_size);
glw.glEnable(GL_TEXTURE_2D);
@@ -1218,7 +1236,7 @@ OpenGLRenderer::render_pass(struct render_data *data)
int i;
GLuint texture_unit = 0;
// pclog("pass %d: %gx%g, %gx%g -> %gx%g, %gx%g, %gx%g\n", num_pass, pass->state.input_size[0],
// ogl3_log("pass %d: %gx%g, %gx%g -> %gx%g, %gx%g, %gx%g\n", num_pass, pass->state.input_size[0],
// pass->state.input_size[1], pass->state.input_texture_size[0], pass->state.input_texture_size[1],
// pass->state.output_size[0], pass->state.output_size[1], pass->state.output_texture_size[0],
// pass->state.output_texture_size[1], output_size[0], output_size[1]);

View File

@@ -2610,6 +2610,11 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb)
dev->sector_len = 256;
dev->sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) |
(((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]);
if (cdrom_is_track_audio(dev->drv, dev->sector_pos, msf,
dev->sector_type, 0x00)) {
scsi_cdrom_illegal_mode(dev);
ret = 0;
}
scsi_cdrom_log(dev->log, "READ (6): Length: %i, LBA: %i\n",
dev->sector_len, dev->sector_pos);
break;
@@ -2617,6 +2622,12 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb)
dev->sector_len = (cdb[7] << 8) | cdb[8];
dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) |
(cdb[4] << 8) | cdb[5];
if (cdrom_is_track_audio(dev->drv, dev->sector_pos, msf,
dev->sector_type, dev->use_cdb_9 ?
(cdb[9] & 0xc0) : 0x00)) {
scsi_cdrom_illegal_mode(dev);
ret = 0;
}
scsi_cdrom_log(dev->log, "READ (10): Length: %i, LBA: %i\n",
dev->sector_len, dev->sector_pos);
break;
@@ -2627,6 +2638,12 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb)
dev->sector_pos = (((uint32_t) cdb[2]) << 24) |
(((uint32_t) cdb[3]) << 16) |
(((uint32_t) cdb[4]) << 8) | ((uint32_t) cdb[5]);
if (cdrom_is_track_audio(dev->drv, dev->sector_pos, msf,
dev->sector_type, dev->use_cdb_9 ?
(cdb[9] & 0xc0) : 0x00)) {
scsi_cdrom_illegal_mode(dev);
ret = 0;
}
scsi_cdrom_log(dev->log, "READ (12): Length: %i, LBA: %i\n",
dev->sector_len, dev->sector_pos);
break;

View File

@@ -1756,7 +1756,7 @@ static uint16_t
pas16_readdmaw_stereo(pas16_t *pas16)
{
uint16_t ret;
uint16_t ticks = (pas16->sys_conf_1 & 0x02) ? (1 + (pas16->dma < 5)) : 2;
uint16_t ticks = (pas16->sys_conf_1 & 0x02) ? (1 + (pas16->dma < 5)) : 1;
ret = pas16_dma_readw(pas16, ticks);

View File

@@ -15,7 +15,7 @@
%global romver 4.1
Name: 86Box
Version: 4.3
Version: 5.0
Release: 1%{?dist}
Summary: Classic PC emulator
License: GPLv2+
@@ -121,5 +121,5 @@ popd
%{_datadir}/%{name}/roms
%changelog
* Sat Aug 31 Jasmine Iwanek <jriwanek[AT]gmail.com> 4.3-1
* Sat Aug 31 Jasmine Iwanek <jriwanek[AT]gmail.com> 5.0-1
- Bump release

View File

@@ -11,7 +11,7 @@
</categories>
<launchable type="desktop-id">net.86box.86Box.desktop</launchable>
<releases>
<release version="4.3" date="2024-11-13"/>
<release version="5.0" date="2025-04-16"/>
</releases>
<content_rating type="oars-1.1" />
<description>

View File

@@ -195,6 +195,7 @@ video_cards[] = {
{ .device = &tgui9680_pci_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &voodoo_banshee_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &creative_voodoo_banshee_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &quantum3d_raven_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &voodoo_3_1000_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &voodoo_3_2000_device, .flags = VIDEO_FLAG_TYPE_NONE },
{ .device = &voodoo_3_3000_device, .flags = VIDEO_FLAG_TYPE_NONE },

View File

@@ -52,6 +52,7 @@
#define ROM_BANSHEE "roms/video/voodoo/Pci_sg.rom"
#define ROM_CREATIVE_BANSHEE "roms/video/voodoo/BlasterPCI.rom"
#define ROM_QUANTUM3D_RAVEN "roms/video/voodoo/RVPD0224.rom"
#define ROM_VOODOO3_1000 "roms/video/voodoo/1k11sg.rom"
#define ROM_VOODOO3_2000 "roms/video/voodoo/2k11sd.rom"
#define ROM_VOODOO3_3000 "roms/video/voodoo/3k12sd.rom"
@@ -78,6 +79,7 @@ static uint8_t vb_filter_bx_g[256][256];
enum {
TYPE_BANSHEE = 0,
TYPE_QUANTUM3D_RAVEN,
TYPE_V3_1000,
TYPE_V3_2000,
TYPE_V3_3000,
@@ -3374,6 +3376,16 @@ banshee_init_common(const device_t *info, char *fn, int has_sgram, int type, int
}
break;
case TYPE_QUANTUM3D_RAVEN:
/* This case basically exists only to set the subsystem ID correctly for SF: Rush, a vendor-locked game. */
/* We set the type back to TYPE_BANSHEE so the card behaves as a regular Banshee (no 3D glasses emulation). */
banshee->pci_regs[0x2c] = 0x9c;
banshee->pci_regs[0x2d] = 0x13;
banshee->pci_regs[0x2e] = banshee->agp ? 0x16 : 0x17;
banshee->pci_regs[0x2f] = 0x00;
banshee->type = TYPE_BANSHEE;
break;
case TYPE_V3_1000:
banshee->pci_regs[0x2c] = 0x1a;
banshee->pci_regs[0x2d] = 0x12;
@@ -3451,6 +3463,12 @@ creative_banshee_init(const device_t *info)
return banshee_init_common(info, ROM_CREATIVE_BANSHEE, 0, TYPE_BANSHEE, VOODOO_BANSHEE, 0);
}
static void *
quantum3d_raven_init(const device_t *info)
{
return banshee_init_common(info, ROM_QUANTUM3D_RAVEN, 0, TYPE_QUANTUM3D_RAVEN, VOODOO_BANSHEE, 0);
}
static void *
v3_1000_init(const device_t *info)
{
@@ -3547,6 +3565,12 @@ creative_banshee_available(void)
return rom_present(ROM_CREATIVE_BANSHEE);
}
static int
quantum3d_raven_available(void)
{
return rom_present(ROM_QUANTUM3D_RAVEN);
}
static int
v3_1000_available(void)
{
@@ -3883,6 +3907,20 @@ const device_t creative_voodoo_banshee_device = {
.config = banshee_sdram_config
};
const device_t quantum3d_raven_device = {
.name = "Quantum3D Raven",
.internal_name = "q3d_raven_pci",
.flags = DEVICE_PCI,
.local = 0,
.init = quantum3d_raven_init,
.close = banshee_close,
.reset = NULL,
.available = quantum3d_raven_available,
.speed_changed = banshee_speed_changed,
.force_redraw = banshee_force_redraw,
.config = banshee_sdram_config
};
const device_t voodoo_3_1000_device = {
.name = "3dfx Voodoo3 1000",
.internal_name = "voodoo3_1k_pci",

View File

@@ -1,6 +1,6 @@
{
"name": "86box",
"version-string": "4.3",
"version-string": "5.0",
"homepage": "https://86box.net/",
"documentation": "https://86box.readthedocs.io/",
"license": "GPL-2.0-or-later",