Merge branch '86Box:master' into broken-sensation1

This commit is contained in:
win2kgamer
2026-01-30 21:18:03 -06:00
committed by GitHub
73 changed files with 9211 additions and 3302 deletions

2
.ci/Jenkinsfile vendored
View File

@@ -147,7 +147,7 @@ def runBuild(args) {
if (isUnix())
return sh(returnStatus: true, script: "chmod u+x '$WORKSPACE/.ci/build.sh' && exec '$WORKSPACE/.ci/build.sh' $args")
else
return bat(returnStatus: true, script: "C:\\msys64\\msys2_shell.cmd -msys2 -defterm -here -no-start -c 'exec \"\$(cygpath -u \\'%WORKSPACE%\\')/.ci/build.sh\" $args'")
return bat(returnStatus: true, script: "C:\\msys64\\msys2_shell.cmd -ucrt64 -defterm -here -no-start -c 'exec \"\$(cygpath -u \\'%WORKSPACE%\\')/.ci/build.sh\" $args'")
}
def failStage() {

View File

@@ -36,7 +36,7 @@ if(MUNT_EXTERNAL)
endif()
project(86Box
VERSION 5.4
VERSION 6.0
DESCRIPTION "Emulator of x86-based systems"
HOMEPAGE_URL "https://86box.net"
LANGUAGES C CXX)
@@ -180,7 +180,6 @@ cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage"
cmake_dependent_option(ISAMEM_IAB "Intel Above Board" ON "DEV_BRANCH" OFF)
cmake_dependent_option(ISAMEM_BRAT "BocaRAM/AT" ON "DEV_BRANCH" OFF)
cmake_dependent_option(OPL4ML "OPL4-ML daughterboard" ON "DEV_BRANCH" OFF)
cmake_dependent_option(PCL "Generic PCL5e Printer" ON "DEV_BRANCH" OFF)
cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF)
cmake_dependent_option(WACOM "Wacom Input Devices" ON "DEV_BRANCH" OFF)
cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF)

View File

@@ -2,7 +2,7 @@
The 86Box project welcomes contributions from anyone, as long as some basic guidelines are followed.
## Emulated hardware
In order to accept new emulated hardware, the following criteria must be met:
In order to accept new emulated hardware or a request thereof, the following criteria must be met:
* A ROM must be available and be added to [our ROM repository](https://github.com/86Box/roms)
* Documentation must be available or it must be feasible to reverse engineer with a reasonable amount of time and effort

4
debian/changelog vendored
View File

@@ -1,5 +1,5 @@
86box (5.4) UNRELEASED; urgency=medium
86box (6.0) UNRELEASED; urgency=medium
* Bump release.
-- Jasmine Iwanek <jriwanek@gmail.com> Tue, 23 Dec 2025 00:27:45 +0100
-- Jasmine Iwanek <jriwanek@gmail.com> Wed, 28 Jan 2026 08:45:23 +0100

View File

@@ -1704,6 +1704,8 @@ pc_reset_hard_init(void)
ide_hard_reset();
lpt_ports_reset();
/* Initialize the actual machine and its basic modules. */
machine_init();

View File

@@ -296,6 +296,37 @@ lxt_init(const device_t *info)
}
static const device_config_t laserxt_config[] = {
{
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.default_string = "laserxt_126",
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = {
{
.name = "1.08",
.internal_name = "laserxt_108",
.bios_type = BIOS_NORMAL,
.files_no = 1,
.local = 0,
.size = 8192,
.files = { "roms/machines/ltxt/ltxt-v1.08.bin", "" }
},
{
.name = "1.26",
.internal_name = "laserxt_126",
.bios_type = BIOS_NORMAL,
.files_no = 1,
.local = 0,
.size = 8192,
.files = { "roms/machines/ltxt/27c64.bin", "" }
},
{ .files_no = 0 }
}
},
{
.name = "ems_1_base",
.description = "EMS 1 Address",

File diff suppressed because it is too large Load Diff

View File

@@ -20,6 +20,8 @@ add_library(cpu OBJECT
cpu_table.c
fpu.c x86.c
808x.c
vx0.c
vx0_biu.c
386.c
386_common.c
386_dynarec.c

View File

@@ -1865,6 +1865,8 @@ cpu_set(void)
cpu_exec = exec386_2386;
} else if (cpu_s->cpu_type >= CPU_286)
cpu_exec = exec386_2386;
else if (is_nec)
cpu_exec = execvx0;
else
cpu_exec = execx86;
mmx_init();

View File

@@ -718,6 +718,7 @@ extern void codegen_reset(void);
extern void cpu_set_edx(void);
extern int divl(uint32_t val);
extern void execx86(int32_t cycs);
extern void execvx0(int32_t cycs);
extern void enter_smm(int in_hlt);
extern void enter_smm_check(int in_hlt);
extern void leave_smm(void);
@@ -728,6 +729,7 @@ extern int idivl(int32_t val);
extern void resetmcr(void);
extern void resetx86(void);
extern void refreshread(void);
extern void refreshread_vx0(void);
extern void resetreadlookup(void);
extern void softresetx86(void);
extern void hardresetx86(void);
@@ -809,6 +811,8 @@ extern void SF_FPU_reset(void);
extern void reset_808x(int hard);
extern void interrupt_808x(uint16_t addr);
extern void reset_vx0(int hard);
extern void cpu_register_fast_off_handler(void *timer);
extern void cpu_fast_off_advance(void);
extern void cpu_fast_off_period_set(uint16_t vla, double period);

View File

@@ -3616,7 +3616,7 @@ const cpu_family_t cpu_families[] = {
{
.package = CPU_PKG_SOCKET4,
.manufacturer = "Intel",
.name = "Pentium",
.name = "Pentium (P5)",
.internal_name = "pentium_p5",
.cpus = (const CPU[]) {
{
@@ -3736,7 +3736,7 @@ const cpu_family_t cpu_families[] = {
{
.package = CPU_PKG_SOCKET5_7,
.manufacturer = "Intel",
.name = "Pentium",
.name = "Pentium (P54C)",
.internal_name = "pentium_p54c",
.cpus = (const CPU[]) {
{

4784
src/cpu/vx0.c Normal file

File diff suppressed because it is too large Load Diff

1152
src/cpu/vx0_biu.c Normal file

File diff suppressed because it is too large Load Diff

138
src/cpu/vx0_biu.h Normal file
View File

@@ -0,0 +1,138 @@
/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* 808x BIU emulation header.
*
* Authors: Andrew Jenner, <https://www.reenigne.org>
* Miran Grca, <mgrca8@gmail.com>
*
* Copyright 2015-2020 Andrew Jenner.
* Copyright 2016-2020 Miran Grca.
*/
#ifndef EMU_808X_BIU_H
#define EMU_808X_BIU_H
#define DEBUG_SEG 0xf000
// #define DEBUG_SEG 0x0f3c
// #define DEBUG_SEG 0x1e1f
// #define DEBUG_SEG 0xf000
// #define DEBUG_SEG 0xc800
// #define DEBUG_SEG 0x0070
// #define DEBUG_SEG 0x0291
// #define DEBUG_SEG 0xefff
// #define DEBUG_SEG 0x15a2
// #define DEBUG_OFF_L 0x2c3b
// #define DEBUG_OFF_L 0xe182
// #define DEBUG_OFF_L 0xf000
// #define DEBUG_OFF_H 0xefff
// #define DEBUG_OFF_L 0x0000
// #define DEBUG_OFF_H 0xffff
#define DEBUG_OFF_L 0xf300
#define DEBUG_OFF_H 0xf3ff
#define BUS_OUT 1
#define BUS_HIGH 2
#define BUS_WIDE 4
#define BUS_CODE 8
#define BUS_IO 16
#define BUS_MEM 32
#define BUS_PIC 64
#define BUS_ACCESS_TYPE (BUS_CODE | BUS_IO | BUS_MEM | BUS_PIC)
#undef readmemb
#undef readmemw
#undef readmeml
#undef readmemq
enum {
BUS_T1 = 0,
BUS_T2,
BUS_T3,
BUS_T4
};
enum {
BIU_STATE_IDLE,
BIU_STATE_SUSP,
BIU_STATE_DELAY,
BIU_STATE_RESUME,
BIU_STATE_WAIT,
BIU_STATE_PF,
BIU_STATE_EU
};
enum {
DMA_STATE_IDLE,
DMA_STATE_TIMER,
DMA_STATE_DREQ,
DMA_STATE_HRQ,
DMA_STATE_HLDA,
DMA_STATE_OPERATING
};
extern void execx86_instruction(void);
extern void biu_resume_on_queue_read(void);
extern void wait_vx0(int c);
extern void biu_reset(void);
extern void cpu_io_vx0(int bits, int out, uint16_t port);
extern void biu_state_set_eu(void);
extern uint8_t readmemb_vx0(uint32_t s, uint16_t a);
extern uint16_t readmemw_vx0(uint32_t s, uint16_t a);
extern uint16_t readmem_vx0(uint32_t s);
extern uint32_t readmeml_vx0(uint32_t s, uint16_t a);
extern uint64_t readmemq_vx0(uint32_t s, uint16_t a);
extern void writememb_vx0(uint32_t s, uint32_t a, uint8_t v);
extern void writememw_vx0(uint32_t s, uint32_t a, uint16_t v);
extern void writemem_vx0(uint32_t s, uint16_t v);
extern void writememl_vx0(uint32_t s, uint32_t a, uint32_t v);
extern void writememq_vx0(uint32_t s, uint32_t a, uint64_t v);
extern uint8_t biu_pfq_read(void);
extern uint8_t biu_pfq_fetchb_common(void);
extern uint8_t biu_pfq_fetchb(void);
extern uint16_t biu_pfq_fetchw(void);
extern uint16_t biu_pfq_fetch(void);
extern void biu_update_pc(void);
extern void biu_queue_flush(void);
extern void biu_suspend_fetch(void);
extern void biu_begin_eu(void);
extern void biu_wait_for_read_finish(void);
extern uint8_t biu_preload_byte;
extern int nx;
extern int oldc;
extern int cpu_alu_op;
extern int completed;
extern int in_rep;
extern int repeating;
extern int rep_c_flag;
extern int noint;
extern int tempc_fpu;
extern int clear_lock;
extern int is_new_biu;
extern int schedule_fetch;
extern int in_lock;
extern int bus_request_type;
extern int pic_data;
extern int biu_queue_preload;
extern uint32_t cpu_src;
extern uint32_t cpu_dest;
extern uint32_t cpu_data;
extern uint32_t *ovr_seg;
/* Pointer tables needed for segment overrides. */
extern uint32_t * opseg[4];
extern x86seg * _opseg[4];
#endif /*EMU_808X_BIU_H*/

View File

@@ -367,8 +367,12 @@ reset_common(int hard)
} else
device_reset_all(DEVICE_SOFTRESET);
if (!is286)
reset_808x(hard);
if (!is286) {
if (is_nec)
reset_vx0(hard);
else
reset_808x(hard);
}
in_lock = 0;

View File

@@ -37,6 +37,7 @@ extern uint8_t opcode;
extern uint8_t flags_p;
extern uint8_t znptable8[256];
extern uint16_t last_addr;
extern uint16_t zero;
extern uint16_t oldcs;
extern uint16_t lastcs;
@@ -44,6 +45,7 @@ extern uint16_t lastpc;
extern uint16_t *mod1add[2][8];
extern uint16_t znptable16[65536];
extern int pfq_pos;
extern int x86_was_reset;
extern int trap;
extern int codegen_flat_ss;

View File

@@ -551,7 +551,11 @@ static int
FPU_ILLEGAL_a16(UNUSED(uint32_t fetchdat))
{
geteaw();
#ifdef FPU_NEC
do_cycles(timing_rr);
#else
wait_cycs(timing_rr, 0);
#endif
return 0;
}
#else
@@ -577,7 +581,7 @@ FPU_ILLEGAL_a32(uint32_t fetchdat)
#define ILLEGAL_a16 FPU_ILLEGAL_a16
#ifdef FPU_8087
const OpFn OP_TABLE(sf_fpu_8087_d8)[32] = {
static const OpFn OP_TABLE(sf_fpu_8087_d8)[32] = {
// clang-format off
sf_FADDs_a16, sf_FMULs_a16, sf_FCOMs_a16, sf_FCOMPs_a16, sf_FSUBs_a16, sf_FSUBRs_a16, sf_FDIVs_a16, sf_FDIVRs_a16,
sf_FADDs_a16, sf_FMULs_a16, sf_FCOMs_a16, sf_FCOMPs_a16, sf_FSUBs_a16, sf_FSUBRs_a16, sf_FDIVs_a16, sf_FDIVRs_a16,
@@ -586,7 +590,7 @@ const OpFn OP_TABLE(sf_fpu_8087_d8)[32] = {
// clang-format on
};
const OpFn OP_TABLE(sf_fpu_8087_d9)[256] = {
static const OpFn OP_TABLE(sf_fpu_8087_d9)[256] = {
// clang-format off
sf_FLDs_a16, sf_FLDs_a16, sf_FLDs_a16, sf_FLDs_a16, sf_FLDs_a16, sf_FLDs_a16, sf_FLDs_a16, sf_FLDs_a16,
ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16,
@@ -626,7 +630,7 @@ const OpFn OP_TABLE(sf_fpu_8087_d9)[256] = {
// clang-format on
};
const OpFn OP_TABLE(sf_fpu_8087_da)[256] = {
static const OpFn OP_TABLE(sf_fpu_8087_da)[256] = {
// clang-format off
sf_FADDil_a16, sf_FADDil_a16, sf_FADDil_a16, sf_FADDil_a16, sf_FADDil_a16, sf_FADDil_a16, sf_FADDil_a16, sf_FADDil_a16,
sf_FMULil_a16, sf_FMULil_a16, sf_FMULil_a16, sf_FMULil_a16, sf_FMULil_a16, sf_FMULil_a16, sf_FMULil_a16, sf_FMULil_a16,
@@ -666,7 +670,7 @@ const OpFn OP_TABLE(sf_fpu_8087_da)[256] = {
// clang-format on
};
const OpFn OP_TABLE(sf_fpu_8087_db)[256] = {
static const OpFn OP_TABLE(sf_fpu_8087_db)[256] = {
// clang-format off
sf_FILDil_a16, sf_FILDil_a16, sf_FILDil_a16, sf_FILDil_a16, sf_FILDil_a16, sf_FILDil_a16, sf_FILDil_a16, sf_FILDil_a16,
ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16,
@@ -706,7 +710,7 @@ const OpFn OP_TABLE(sf_fpu_8087_db)[256] = {
// clang-format on
};
const OpFn OP_TABLE(sf_fpu_8087_dc)[32] = {
static const OpFn OP_TABLE(sf_fpu_8087_dc)[32] = {
// clang-format off
sf_FADDd_a16, sf_FMULd_a16, sf_FCOMd_a16, sf_FCOMPd_a16, sf_FSUBd_a16, sf_FSUBRd_a16, sf_FDIVd_a16, sf_FDIVRd_a16,
sf_FADDd_a16, sf_FMULd_a16, sf_FCOMd_a16, sf_FCOMPd_a16, sf_FSUBd_a16, sf_FSUBRd_a16, sf_FDIVd_a16, sf_FDIVRd_a16,
@@ -715,7 +719,7 @@ const OpFn OP_TABLE(sf_fpu_8087_dc)[32] = {
// clang-format on
};
const OpFn OP_TABLE(sf_fpu_8087_dd)[256] = {
static const OpFn OP_TABLE(sf_fpu_8087_dd)[256] = {
// clang-format off
sf_FLDd_a16, sf_FLDd_a16, sf_FLDd_a16, sf_FLDd_a16, sf_FLDd_a16, sf_FLDd_a16, sf_FLDd_a16, sf_FLDd_a16,
ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16,
@@ -755,7 +759,7 @@ const OpFn OP_TABLE(sf_fpu_8087_dd)[256] = {
// clang-format on
};
const OpFn OP_TABLE(sf_fpu_8087_de)[256] = {
static const OpFn OP_TABLE(sf_fpu_8087_de)[256] = {
// clang-format off
sf_FADDiw_a16, sf_FADDiw_a16, sf_FADDiw_a16, sf_FADDiw_a16, sf_FADDiw_a16, sf_FADDiw_a16, sf_FADDiw_a16, sf_FADDiw_a16,
sf_FMULiw_a16, sf_FMULiw_a16, sf_FMULiw_a16, sf_FMULiw_a16, sf_FMULiw_a16, sf_FMULiw_a16, sf_FMULiw_a16, sf_FMULiw_a16,
@@ -795,7 +799,7 @@ const OpFn OP_TABLE(sf_fpu_8087_de)[256] = {
// clang-format on
};
const OpFn OP_TABLE(sf_fpu_8087_df)[256] = {
static const OpFn OP_TABLE(sf_fpu_8087_df)[256] = {
// clang-format off
sf_FILDiw_a16, sf_FILDiw_a16, sf_FILDiw_a16, sf_FILDiw_a16, sf_FILDiw_a16, sf_FILDiw_a16, sf_FILDiw_a16, sf_FILDiw_a16,
ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16,
@@ -835,7 +839,7 @@ const OpFn OP_TABLE(sf_fpu_8087_df)[256] = {
// clang-format on
};
const OpFn OP_TABLE(fpu_8087_d8)[32] = {
static const OpFn OP_TABLE(fpu_8087_d8)[32] = {
// clang-format off
opFADDs_a16, opFMULs_a16, opFCOMs_a16, opFCOMPs_a16, opFSUBs_a16, opFSUBRs_a16, opFDIVs_a16, opFDIVRs_a16,
opFADDs_a16, opFMULs_a16, opFCOMs_a16, opFCOMPs_a16, opFSUBs_a16, opFSUBRs_a16, opFDIVs_a16, opFDIVRs_a16,
@@ -844,7 +848,7 @@ const OpFn OP_TABLE(fpu_8087_d8)[32] = {
// clang-format on
};
const OpFn OP_TABLE(fpu_8087_d9)[256] = {
static const OpFn OP_TABLE(fpu_8087_d9)[256] = {
// clang-format off
opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16, opFLDs_a16,
ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16,
@@ -884,7 +888,7 @@ const OpFn OP_TABLE(fpu_8087_d9)[256] = {
// clang-format on
};
const OpFn OP_TABLE(fpu_8087_da)[256] = {
static const OpFn OP_TABLE(fpu_8087_da)[256] = {
// clang-format off
opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16, opFADDil_a16,
opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16, opFMULil_a16,
@@ -924,7 +928,7 @@ const OpFn OP_TABLE(fpu_8087_da)[256] = {
// clang-format on
};
const OpFn OP_TABLE(fpu_8087_db)[256] = {
static const OpFn OP_TABLE(fpu_8087_db)[256] = {
// clang-format off
opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16, opFILDil_a16,
ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16,
@@ -964,7 +968,7 @@ const OpFn OP_TABLE(fpu_8087_db)[256] = {
// clang-format on
};
const OpFn OP_TABLE(fpu_8087_dc)[32] = {
static const OpFn OP_TABLE(fpu_8087_dc)[32] = {
// clang-format off
opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16,
opFADDd_a16, opFMULd_a16, opFCOMd_a16, opFCOMPd_a16, opFSUBd_a16, opFSUBRd_a16, opFDIVd_a16, opFDIVRd_a16,
@@ -973,7 +977,7 @@ const OpFn OP_TABLE(fpu_8087_dc)[32] = {
// clang-format on
};
const OpFn OP_TABLE(fpu_8087_dd)[256] = {
static const OpFn OP_TABLE(fpu_8087_dd)[256] = {
// clang-format off
opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16, opFLDd_a16,
ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16,
@@ -1013,7 +1017,7 @@ const OpFn OP_TABLE(fpu_8087_dd)[256] = {
// clang-format on
};
const OpFn OP_TABLE(fpu_8087_de)[256] = {
static const OpFn OP_TABLE(fpu_8087_de)[256] = {
// clang-format off
opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16, opFADDiw_a16,
opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16, opFMULiw_a16,
@@ -1053,7 +1057,7 @@ const OpFn OP_TABLE(fpu_8087_de)[256] = {
// clang-format on
};
const OpFn OP_TABLE(fpu_8087_df)[256] = {
static const OpFn OP_TABLE(fpu_8087_df)[256] = {
// clang-format off
opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16, opFILDiw_a16,
ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16, ILLEGAL_a16,

View File

@@ -7,7 +7,11 @@ opFI(uint32_t fetchdat)
cpu_state.npxc &= ~0x80;
if (rmdat == 0xe1)
cpu_state.npxc |= 0x80;
#ifdef FPU_NEC
do_cycles(3);
#else
wait_cycs(3, 0);
#endif
return 0;
}
#else

View File

@@ -354,7 +354,11 @@ sf_FI(uint32_t fetchdat)
fpu_state.cwd &= ~FPU_SW_Summary;
if (rmdat == 0xe1)
fpu_state.cwd |= FPU_SW_Summary;
#ifdef FPU_NEC
do_cycles(3);
#else
wait_cycs(3, 0);
#endif
return 0;
}
#else

View File

@@ -302,13 +302,13 @@ hasp_read_status(void *priv)
}
static void *
hasp_init(void *lpt, int type)
hasp_init(const device_t *info, int type)
{
hasp_t *dev = calloc(1, sizeof(hasp_t));
hasp_log("HASP: init(%d)\n", type);
dev->lpt = lpt;
dev->lpt = lpt_attach(hasp_write_data, NULL, NULL, hasp_read_status, NULL, NULL, NULL, dev);
dev->type = &hasp_types[type];
dev->status = 0x80;
@@ -317,9 +317,9 @@ hasp_init(void *lpt, int type)
}
static void *
hasp_init_savquest(void *lpt)
hasp_init_savquest(const device_t *info)
{
return hasp_init(lpt, HASP_TYPE_SAVQUEST);
return hasp_init(info, HASP_TYPE_SAVQUEST);
}
static void
@@ -332,16 +332,16 @@ hasp_close(void *priv)
free(dev);
}
const lpt_device_t lpt_hasp_savquest_device = {
.name = "Protection Dongle for Savage Quest",
.internal_name = "dongle_savquest",
.init = hasp_init_savquest,
.close = hasp_close,
.write_data = hasp_write_data,
.write_ctrl = NULL,
.strobe = NULL,
.read_status = hasp_read_status,
.read_ctrl = NULL,
.epp_write_data = NULL,
.epp_request_read = NULL
const device_t lpt_hasp_savquest_device = {
.name = "Protection Dongle for Savage Quest",
.internal_name = "dongle_savquest",
.flags = DEVICE_LPT,
.local = 0,
.init = hasp_init_savquest,
.close = hasp_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};

View File

@@ -34,19 +34,22 @@ lpt_port_t lpt_ports[PARALLEL_MAX];
lpt_device_t lpt_devs[PARALLEL_MAX];
const lpt_device_t lpt_none_device = {
const device_t lpt_none_device = {
.name = "None",
.internal_name = "none",
.flags = DEVICE_LPT,
.local = 0,
.init = NULL,
.close = NULL,
.write_data = NULL,
.write_ctrl = NULL,
.read_status = NULL,
.read_ctrl = NULL
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
static const struct {
const lpt_device_t *device;
const device_t *device;
} lpt_devices[] = {
// clang-format off
{ &lpt_none_device },
@@ -56,9 +59,7 @@ static const struct {
{ &lpt_prt_text_device },
{ &lpt_prt_escp_device },
{ &lpt_prt_ps_device },
#ifdef USE_PCL
{ &lpt_prt_pcl_device },
#endif
{ &lpt_plip_device },
{ &lpt_hasp_savquest_device },
{ NULL }
@@ -83,50 +84,41 @@ lpt_log(const char *fmt, ...)
# define lpt_log(fmt, ...)
#endif
int
lpt_device_available(int id)
{
if (lpt_devices[id].device)
return device_available(lpt_devices[id].device);
return 1;
}
const device_t *
lpt_device_getdevice(const int id)
{
return (device_t *) lpt_devices[id].device->cfgdevice;
return lpt_devices[id].device;
}
int
lpt_device_has_config(const int id)
{
int c = 0;
const device_t *dev = (device_t *) lpt_devices[id].device->cfgdevice;
const device_config_t *config;
if (dev == NULL)
if (lpt_devices[id].device == NULL)
return 0;
if (dev->config == NULL)
return 0;
config = dev->config;
while (config->type != CONFIG_END) {
c++;
config++;
}
return (c > 0) ? 1 : 0;
return device_has_config(lpt_devices[id].device);
}
const char *
lpt_device_get_name(const int id)
{
if (lpt_devices[id].device == NULL)
return NULL;
return 0;
return lpt_devices[id].device->name;
}
const char *
lpt_device_get_internal_name(const int id)
{
if (lpt_devices[id].device == NULL)
return NULL;
return lpt_devices[id].device->internal_name;
return device_get_internal_name(lpt_devices[id].device);
}
int
@@ -147,29 +139,43 @@ void
lpt_devices_init(void)
{
for (uint8_t i = 0; i < PARALLEL_MAX; i++) {
lpt_t *dev = lpt_devs[i].lpt;
memset(&(lpt_devs[i]), 0x00, sizeof(lpt_device_t));
if (lpt_devices[lpt_ports[i].device].device != NULL) {
memcpy(&(lpt_devs[i]), (lpt_device_t *) lpt_devices[lpt_ports[i].device].device, sizeof(lpt_device_t));
if (lpt_devs[i].init)
lpt_devs[i].priv = lpt_devs[i].init(dev);
} else
memset(&(lpt_devs[i]), 0x00, sizeof(lpt_device_t));
lpt_devs[i].lpt = dev;
if ((lpt_devices[lpt_ports[i].device].device != NULL) &&
(lpt_devices[lpt_ports[i].device].device != &lpt_none_device))
device_add_inst((device_t *) lpt_devices[lpt_ports[i].device].device, i + 1);
}
}
void *
lpt_attach(void (*write_data)(uint8_t val, void *priv),
void (*write_ctrl)(uint8_t val, void *priv),
void (*strobe)(uint8_t old, uint8_t val,void *priv),
uint8_t (*read_status)(void *priv),
uint8_t (*read_ctrl)(void *priv),
void (*epp_write_data)(uint8_t is_addr, uint8_t val, void *priv),
void (*epp_request_read)(uint8_t is_addr, void *priv),
void *priv)
{
int port = device_get_instance() - 1;
lpt_devs[port].write_data = write_data;
lpt_devs[port].write_ctrl = write_ctrl;
lpt_devs[port].strobe = strobe;
lpt_devs[port].read_status = read_status;
lpt_devs[port].read_ctrl = read_ctrl;
lpt_devs[port].epp_write_data = epp_write_data;
lpt_devs[port].epp_request_read = epp_request_read;
lpt_devs[port].priv = priv;
return lpt_ports[port].lpt;
}
void
lpt_devices_close(void)
{
for (uint8_t i = 0; i < PARALLEL_MAX; i++) {
if (lpt_devs[i].close)
lpt_devs[i].close(lpt_devs[i].priv);
for (uint8_t i = 0; i < PARALLEL_MAX; i++)
memset(&(lpt_devs[i]), 0x00, sizeof(lpt_device_t));
}
}
static uint8_t
@@ -954,10 +960,10 @@ lpt_init(const device_t *info)
if (lpt_ports[next_inst].enabled || (info->local & 0xFFF00000)) {
lpt_log("Adding parallel port %i...\n", next_inst);
dev->dt = &(lpt_devs[next_inst]);
dev->dt->lpt = dev;
dev->dt = &(lpt_devs[next_inst]);
lpt_ports[next_inst].lpt = dev;
dev->fifo = NULL;
dev->fifo = NULL;
memset(&dev->fifo_out_timer, 0x00, sizeof(pc_timer_t));
lpt_port_zero(dev);
@@ -1033,7 +1039,14 @@ lpt_standalone_init(void)
{
while (next_inst < (PARALLEL_MAX - 1))
device_add_inst(&lpt_port_device, next_inst + 1);
};
}
void
lpt_ports_reset(void)
{
for (int i = 0; i < PARALLEL_MAX; i++)
lpt_ports[i].lpt = NULL;
}
const device_t lpt_port_device = {
.name = "Parallel Port",

View File

@@ -1503,7 +1503,7 @@ dma_channel_read_only(int channel)
dma_channel_advance(channel);
if (!dma_at && !channel)
refreshread();
is_nec ? refreshread_vx0() : refreshread();
if (!dma_c->size) {
temp = _dma_read(dma_c->ac, dma_c);
@@ -1611,7 +1611,7 @@ dma_channel_read(int channel)
dma_channel_advance(channel);
if (!dma_at && !channel)
refreshread();
is_nec ? refreshread_vx0() : refreshread();
if (!dma_c->size) {
temp = _dma_read(dma_c->ac, dma_c);

View File

@@ -315,6 +315,9 @@ extern uint16_t get_last_addr(void);
extern void sub_cycles(int c);
extern void resub_cycles(int old_cycles);
extern void sub_cycles_vx0(int c);
extern void resub_cycles_vx0(int old_cycles);
extern void ack_pause(void);
extern void do_pause(int p);

View File

@@ -18,11 +18,6 @@
#endif
typedef struct lpt_device_s {
const char *name;
const char *internal_name;
void *(*init)(void *lpt);
void (*close)(void *priv);
void (*write_data)(uint8_t val, void *priv);
void (*write_ctrl)(uint8_t val, void *priv);
void (*strobe)(uint8_t old, uint8_t val,void *priv);
@@ -31,13 +26,7 @@ typedef struct lpt_device_s {
void (*epp_write_data)(uint8_t is_addr, uint8_t val, void *priv);
void (*epp_request_read)(uint8_t is_addr, void *priv);
void *priv;
struct lpt_t *lpt;
//#ifdef EMU_DEVICE_H
// struct device_t *cfgdevice;
//#else
void *cfgdevice;
//#endif
void * priv;
} lpt_device_t;
#ifdef _TIMER_H_
@@ -86,6 +75,8 @@ typedef struct lpt_port_s {
uint8_t enabled;
int device;
lpt_t *lpt;
} lpt_port_t;
extern lpt_port_t lpt_ports[PARALLEL_MAX];
@@ -96,6 +87,22 @@ typedef enum {
LPT_STATE_WRITE_FIFO
} lpt_state_t;
extern const device_t lpt_dac_device;
extern const device_t lpt_dac_stereo_device;
extern const device_t dss_device;
extern const device_t lpt_hasp_savquest_device;
extern int lpt_device_available(int id);
#ifdef EMU_DEVICE_H
extern const device_t *lpt_device_getdevice(const int id);
#endif
extern int lpt_device_has_config(const int id);
extern const char *lpt_device_get_name(int id);
extern const char *lpt_device_get_internal_name(int id);
extern int lpt_device_get_from_internal_name(const char *str);
extern void lpt_write(uint16_t port, uint8_t val, void *priv);
extern void lpt_write_to_fifo(void *priv, uint8_t val);
@@ -109,24 +116,6 @@ extern uint8_t lpt_read_ecp_mode(lpt_t *dev);
extern void lpt_irq(void *priv, int raise);
extern int lpt_device_get_from_internal_name(const char *str);
extern const char *lpt_device_get_name(int id);
extern const char *lpt_device_get_internal_name(int id);
#ifdef EMU_DEVICE_H
extern const device_t *lpt_device_getdevice(const int id);
#endif
extern int lpt_device_has_config(const int id);
extern const lpt_device_t lpt_dac_device;
extern const lpt_device_t lpt_dac_stereo_device;
extern const lpt_device_t dss_device;
extern const lpt_device_t lpt_hasp_savquest_device;
extern void lpt_set_ext(lpt_t *dev, uint8_t ext);
extern void lpt_set_ecp(lpt_t *dev, uint8_t ecp);
extern void lpt_set_epp(lpt_t *dev, uint8_t epp);
@@ -143,12 +132,21 @@ extern void lpt_port_remove(lpt_t *dev);
extern void lpt1_remove_ams(lpt_t *dev);
extern void lpt_devices_init(void);
extern void * lpt_attach(void (*write_data)(uint8_t val, void *priv),
void (*write_ctrl)(uint8_t val, void *priv),
void (*strobe)(uint8_t old, uint8_t val,void *priv),
uint8_t (*read_status)(void *priv),
uint8_t (*read_ctrl)(void *priv),
void (*epp_write_data)(uint8_t is_addr, uint8_t val, void *priv),
void (*epp_request_read)(uint8_t is_addr, void *priv),
void *priv);
extern void lpt_devices_close(void);
extern void lpt_set_next_inst(int ni);
extern void lpt_set_3bc_used(int is_3bc_used);
extern void lpt_standalone_init(void);
extern void lpt_ports_reset(void);
extern const device_t lpt_port_device;

View File

@@ -1409,6 +1409,9 @@ extern const device_t tandy_1000sl_video_device;
extern int machine_tandy1000sl2_init(const machine_t *);
/* m_v86p.c */
#ifdef EMU_DEVICE_H
extern const device_t v86p_device;
#endif
extern int machine_v86p_init(const machine_t *);
/* m_xt.c */
@@ -1480,6 +1483,9 @@ extern int machine_xt_to16_init(const machine_t *);
extern const device_t vendex_device;
#endif
extern int machine_xt_vendex_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t laserxt_device;
#endif
extern int machine_xt_laserxt_init(const machine_t *);
extern int machine_xt_znic_init(const machine_t *);
extern int machine_xt_z151_init(const machine_t *);

View File

@@ -244,10 +244,8 @@ extern const device_t pcnet_am79c973_onboard_device;
extern const device_t modem_device;
/* PLIP */
#ifdef EMU_LPT_H
extern const lpt_device_t lpt_plip_device;
#endif
extern const device_t plip_device;
extern const device_t lpt_plip_device;
extern const device_t plip_device;
/* Realtek RTL8139C+ */
extern const device_t rtl8139c_plus_device;

View File

@@ -1,15 +1,9 @@
#ifndef EMU_PRT_DEVS_H
#define EMU_PRT_DEVS_H
extern const lpt_device_t lpt_prt_text_device;
extern const device_t prt_text_device;
extern const lpt_device_t lpt_prt_escp_device;
extern const device_t prt_escp_device;
extern const lpt_device_t lpt_prt_ps_device;
extern const device_t prt_ps_device;
#ifdef USE_PCL
extern const lpt_device_t lpt_prt_pcl_device;
extern const device_t prt_pcl_device;
#endif
extern const device_t lpt_prt_text_device;
extern const device_t lpt_prt_escp_device;
extern const device_t lpt_prt_ps_device;
extern const device_t lpt_prt_pcl_device;
#endif /*EMU_PRT_DEVS_H*/

View File

@@ -48,35 +48,101 @@
#include <86box/sio.h>
#include <86box/video.h>
static const device_config_t v86p_config[] = {
// clang-format off
{
.name = "bios",
.description = "BIOS Version",
.type = CONFIG_BIOS,
.default_string = "v86p_122089",
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = {
{
.name = "12/20/89",
.internal_name = "v86p_122089",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/v86p/INTEL8086AWD_BIOS_S3.1_V86P_122089_Even.rom",
"roms/machines/v86p/INTEL8086AWD_BIOS_S3.1_V86P_122089_Odd.rom",
"" }
},
{
.name = "09/04/89",
.internal_name = "v86p_090489",
.bios_type = BIOS_NORMAL,
.files_no = 2,
.local = 0,
.size = 65536,
.files = { "roms/machines/v86p/INTEL8086AWD_BIOS_S3.1_V86P_090489_Even.rom",
"roms/machines/v86p/INTEL8086AWD_BIOS_S3.1_V86P_090489_Odd.rom",
"" }
},
{
.name = "09/04/89 (Alt)",
.internal_name = "v86p_jvernet",
.bios_type = BIOS_NORMAL,
.files_no = 1,
.local = 1,
.size = 65536,
.files = { "roms/machines/v86p/V86P.ROM",
"" }
},
{ .files_no = 0 }
}
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format on
};
const device_t v86p_device = {
.name = "Victor V86P",
.internal_name = "v86p_device",
.flags = 0,
.local = 0,
.init = NULL,
.close = NULL,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = v86p_config
};
int
machine_v86p_init(const machine_t *model)
{
int ret;
int rom_id = 0;
int ret = 0;
int files_no = 0;
int local = 0;
const char *fn1, *fn2;
ret = bios_load_interleavedr("roms/machines/v86p/INTEL8086AWD_BIOS_S3.1_V86P_122089_Even.rom",
"roms/machines/v86p/INTEL8086AWD_BIOS_S3.1_V86P_122089_Odd.rom",
0x000f8000, 65536, 0);
/* No ROMs available. */
if (!device_available(model->device))
return ret;
if (!ret) {
/* Try an older version of the BIOS. */
rom_id = 1;
ret = bios_load_interleavedr("roms/machines/v86p/INTEL8086AWD_BIOS_S3.1_V86P_090489_Even.rom",
"roms/machines/v86p/INTEL8086AWD_BIOS_S3.1_V86P_090489_Odd.rom",
0x000f8000, 65536, 0);
}
if (!ret) {
/* Try JVERNET's BIOS. */
rom_id = 2;
ret = bios_load_linear("roms/machines/v86p/V86P.ROM",
0x000f0000, 65536, 0);
device_context(model->device);
files_no = device_get_bios_num_files(model->device, device_get_config_bios("bios"));
local = device_get_bios_local(model->device, device_get_config_bios("bios"));
fn1 = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
if (files_no > 1)
{
fn2 = device_get_bios_file(model->device, device_get_config_bios("bios"), 1);
ret = bios_load_interleavedr(fn1, fn2, 0x000f8000, 65536, 0);
}
else
ret = bios_load_linear(fn1, 0x000f0000, 65536, 0);
device_context_restore();
if (bios_only || !ret)
return ret;
if (rom_id == 2)
if (local > 0)
video_load_font("roms/machines/v86p/V86P.FON", FONT_FORMAT_PC1512_T1000, LOAD_FONT_NO_OFFSET);
else
video_load_font("roms/machines/v86p/v86pfont.rom", FONT_FORMAT_PC1512_T1000, LOAD_FONT_NO_OFFSET);

View File

@@ -1884,10 +1884,17 @@ machine_xt_laserxt_common_init(const machine_t *model, int is_lxt3)
int
machine_xt_laserxt_init(const machine_t *model)
{
int ret;
int ret = 0;
const char *fn;
ret = bios_load_linear("roms/machines/ltxt/27c64.bin",
0x000fe000, 8192, 0);
/* No ROMs available. */
if (!device_available(model->device))
return ret;
device_context(model->device);
fn = device_get_bios_file(model->device, device_get_config_bios("bios"), 0);
ret = bios_load_linear(fn, 0x000fe000, 8192, 0);
device_context_restore();
if (bios_only || !ret)
return ret;

View File

@@ -2982,7 +2982,7 @@ const machine_t machines[] = {
.kbc_p1 = 0xff,
.gpio = 0xffffffff,
.gpio_acpi = 0xffffffff,
.device = NULL,
.device = &v86p_device,
.kbd_device = NULL,
.fdc_device = NULL,
.sio_device = NULL,
@@ -18561,7 +18561,7 @@ const machine_t machines[] = {
.max_multi = 5.0
},
.bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB,
.flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB,
.flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI | MACHINE_USB,
.ram = {
.min = 8192,
.max = 262144,

View File

@@ -441,13 +441,14 @@ plip_rx(void *priv, uint8_t *buf, int io_len)
}
static void *
plip_lpt_init(void *lpt)
plip_lpt_init(const device_t *info)
{
plip_t *dev = (plip_t *) calloc(1, sizeof(plip_t));
plip_log(1, "PLIP: lpt_init()\n");
dev->lpt = lpt;
dev->lpt = lpt_attach(plip_write_data, plip_write_ctrl, NULL, plip_read_status, NULL, NULL, NULL, dev);
memset(dev->mac, 0xfc, 6); /* static MAC used by Linux; just a placeholder */
dev->status = 0x80;
@@ -485,24 +486,22 @@ plip_close(void *priv)
free(priv);
}
const lpt_device_t lpt_plip_device = {
.name = "Parallel Line Internet Protocol",
.internal_name = "plip",
.init = plip_lpt_init,
.close = plip_close,
.write_data = plip_write_data,
.write_ctrl = plip_write_ctrl,
.strobe = NULL,
.read_status = plip_read_status,
.read_ctrl = NULL,
.epp_write_data = NULL,
.epp_request_read = NULL,
.priv = NULL,
.lpt = NULL
const device_t lpt_plip_device = {
.name = "Parallel Line Internet Protocol (LPT)",
.internal_name = "plip",
.flags = DEVICE_LPT,
.local = 0,
.init = plip_lpt_init,
.close = plip_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const device_t plip_device = {
.name = "Parallel Line Internet Protocol",
.name = "Parallel Line Internet Protocol (Network)",
.internal_name = "plip",
.flags = DEVICE_LPT,
.local = 0,

View File

@@ -886,7 +886,6 @@ static void
tulip_reset(void *priv)
{
TULIPState *s = (TULIPState *) priv;
const uint16_t *eeprom_data = nmc93cxx_eeprom_data(s->eeprom);
s->csr[0] = 0xfe000000;
s->csr[1] = 0xffffffff;
s->csr[2] = 0xffffffff;
@@ -901,6 +900,8 @@ tulip_reset(void *priv)
s->csr[14] = 0xffffffff;
s->csr[15] = 0x8ff00000;
if (s->device_info->local != 3) {
const uint16_t *eeprom_data = nmc93cxx_eeprom_data(s->eeprom);
s->subsys_id = eeprom_data[1];
s->subsys_ven_id = eeprom_data[0];
}

View File

@@ -23,10 +23,6 @@ add_library(print OBJECT
prt_ps.c
)
if(PCL)
target_compile_definitions(print PRIVATE USE_PCL)
endif()
if(APPLE)
find_library(GHOSTSCRIPT_LIB gs)
if (NOT GHOSTSCRIPT_LIB)

View File

@@ -1979,7 +1979,7 @@ read_status(void *priv)
}
static void *
escp_init(void *lpt)
escp_init(const device_t *info)
{
escp_t *dev = NULL;
@@ -1995,7 +1995,8 @@ escp_init(void *lpt)
/* Initialize a device instance. */
dev = (escp_t *) calloc(1, sizeof(escp_t));
dev->ctrl = 0x04;
dev->lpt = lpt;
dev->lpt = lpt_attach(write_data, write_ctrl, strobe, read_status, read_ctrl, NULL, NULL, dev);
rom_get_full_path(dev->fontpath, "roms/printer/fonts/");
@@ -2109,13 +2110,13 @@ static const device_config_t lpt_prt_escp_config[] = {
#endif
// clang-format on
const device_t prt_escp_device = {
const device_t lpt_prt_escp_device = {
.name = "Generic ESC/P 2 Dot-Matrix Printer",
.internal_name = "dot_matrix",
.flags = DEVICE_LPT,
.local = 0,
.init = NULL,
.close = NULL,
.init = escp_init,
.close = escp_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
@@ -2126,20 +2127,3 @@ const device_t prt_escp_device = {
.config = NULL
#endif
};
const lpt_device_t lpt_prt_escp_device = {
.name = "Generic ESC/P 2 Dot-Matrix Printer",
.internal_name = "dot_matrix",
.init = escp_init,
.close = escp_close,
.write_data = write_data,
.write_ctrl = write_ctrl,
.strobe = strobe,
.read_status = read_status,
.read_ctrl = read_ctrl,
.epp_write_data = NULL,
.epp_request_read = NULL,
.priv = NULL,
.lpt = NULL,
.cfgdevice = (device_t *) &prt_escp_device
};

View File

@@ -61,40 +61,55 @@
#define POSTSCRIPT_BUFFER_LENGTH 65536
enum {
LANG_RAW = 0,
LANG_PS,
LANG_PCL_5E,
LANG_PCL_5C,
LANG_HP_RTL,
LANG_PCL_6
};
typedef struct ps_t {
const char *name;
void *lpt;
void * lpt;
pc_timer_t pulse_timer;
pc_timer_t timeout_timer;
pc_timer_t pulse_timer;
pc_timer_t timeout_timer;
char data;
bool ack;
bool select;
bool busy;
bool int_pending;
bool error;
bool autofeed;
bool pcl;
bool pending;
bool pjl;
bool pjl_command;
uint8_t ctrl;
uint8_t pcl_escape;
uint16_t pjl_command_start;
bool ack;
bool select;
bool busy;
bool int_pending;
bool error;
bool autofeed;
bool pcl;
bool pending;
bool pjl;
bool pjl_command;
char printer_path[260];
char data;
char filename[260];
char printer_path[260];
char filename[260];
char buffer[POSTSCRIPT_BUFFER_LENGTH];
size_t buffer_pos;
char buffer[POSTSCRIPT_BUFFER_LENGTH];
uint8_t ctrl;
uint8_t pcl_escape;
uint16_t pjl_command_start;
int lang;
size_t buffer_pos;
} ps_t;
typedef struct gsapi_revision_s {
const char *product;
const char *copyright;
long revision;
long revisiondate;
} gsapi_revision_t;
@@ -155,8 +170,23 @@ convert_to_pdf(ps_t *dev)
gsargv[arg++] = "-dSAFER";
gsargv[arg++] = "-sDEVICE=pdfwrite";
if (dev->pcl) {
gsargv[arg++] = "-LPCL";
gsargv[arg++] = "-lPCL5E";
if (dev->lang == LANG_PCL_6)
gsargv[arg++] = "-LPCLXL";
else {
gsargv[arg++] = "-LPCL";
switch (dev->lang) {
default:
case LANG_PCL_5E:
gsargv[arg++] = "-lPCL5E";
break;
case LANG_PCL_5C:
gsargv[arg++] = "-lPCL5C";
break;
case LANG_HP_RTL:
gsargv[arg++] = "-lRTL";
break;
}
}
}
gsargv[arg++] = "-q";
gsargv[arg++] = "-o";
@@ -196,7 +226,7 @@ reset_ps(ps_t *dev)
dev->ack = false;
if (dev->pending) {
if (ghostscript_handle != NULL)
if ((dev->lang != LANG_RAW) && (ghostscript_handle != NULL))
convert_to_pdf(dev);
dev->filename[0] = 0;
@@ -220,8 +250,14 @@ write_buffer(ps_t *dev, bool finish)
if (dev->buffer_pos == 0)
return;
if (dev->filename[0] == 0)
plat_tempfile(dev->filename, NULL, dev->pcl ? ".pcl" : ".ps");
if (dev->filename[0] == 0) {
if (dev->lang == LANG_RAW)
plat_tempfile(dev->filename, NULL, ".raw");
else if (dev->pcl)
plat_tempfile(dev->filename, NULL, (dev->lang == LANG_PCL_6) ? ".pxl" : ".pcl");
else
plat_tempfile(dev->filename, NULL, ".ps");
}
strcpy(path, dev->printer_path);
path_slash(path);
@@ -244,7 +280,7 @@ write_buffer(ps_t *dev, bool finish)
dev->buffer_pos = 0;
if (finish) {
if (ghostscript_handle != NULL)
if ((dev->lang != LANG_RAW) && (ghostscript_handle != NULL))
convert_to_pdf(dev);
dev->filename[0] = 0;
@@ -262,7 +298,7 @@ timeout_timer(void *priv)
if (dev->buffer_pos != 0)
write_buffer(dev, true);
else if (dev->pending) {
if (ghostscript_handle != NULL)
if ((dev->lang != LANG_RAW) && (ghostscript_handle != NULL))
convert_to_pdf(dev);
dev->filename[0] = 0;
@@ -284,92 +320,115 @@ ps_write_data(uint8_t val, void *priv)
dev->data = (char) val;
}
static int
process_escape(ps_t *dev, int do_pjl)
{
int ret = 0;
if (dev->data == 0x1b)
dev->pcl_escape = 1;
else switch (dev->pcl_escape) {
case 1:
dev->pcl_escape = (dev->data == 0x25) ? 2 : 0;
break;
case 2:
dev->pcl_escape = (dev->data == 0x2d) ? 3 : 0;
break;
case 3:
dev->pcl_escape = (dev->data == 0x31) ? 4 : 0;
break;
case 4:
dev->pcl_escape = (dev->data == 0x32) ? 5 : 0;
break;
case 5:
dev->pcl_escape = (dev->data == 0x33) ? 6 : 0;
break;
case 6:
dev->pcl_escape = (dev->data == 0x34) ? 7 : 0;
break;
case 7:
dev->pcl_escape = (dev->data == 0x35) ? 8 : 0;
break;
case 8:
dev->pcl_escape = 0;
if (dev->data == 0x58) {
if (do_pjl)
dev->pjl = true;
dev->buffer[dev->buffer_pos++] = dev->data;
dev->buffer[dev->buffer_pos] = 0;
/* Wipe the slate clean so that there won't be a bogus empty page output to PDF. */
dev->pending = false;
ret = 1;
}
break;
}
return ret;
}
static void
process_data(ps_t *dev)
{
/* On PCL, check for escape sequences. */
if (dev->pcl) {
if (dev->pjl) {
dev->buffer[dev->buffer_pos++] = dev->data;
/* Filter out any PJL commands. */
if (dev->pjl_command && (dev->data == '\n')) {
dev->pjl_command = false;
if (!memcmp(&(dev->buffer[dev->pjl_command_start]), "@PJL ENTER LANGUAGE=PCL", 0x17))
dev->pjl = false;
else if (!memcmp(&(dev->buffer[dev->pjl_command_start]), "@PJL ENTER LANGUAGE=POSTSCRIPT", 0x1e))
fatal("Printing PostScript using the PCL printer is not (yet) supported!\n");
dev->buffer_pos = dev->pjl_command_start;
} else if (!dev->pjl_command && (dev->buffer_pos >= 0x05) && !memcmp(&(dev->buffer[dev->buffer_pos - 0x5]), "@PJL ", 0x05)) {
dev->pjl_command = true;
dev->pjl_command_start = dev->buffer_pos - 0x05;
}
dev->buffer[dev->buffer_pos] = 0;
return;
} else if (dev->data == 0x1b)
dev->pcl_escape = 1;
else switch (dev->pcl_escape) {
case 1:
dev->pcl_escape = (dev->data == 0x25) ? 2 : 0;
if (dev->data == 0x0e) {
dev->buffer[dev->buffer_pos++] = dev->data;
dev->buffer[dev->buffer_pos] = 0;
if (dev->buffer_pos > 2)
write_buffer(dev, true);
return;
}
break;
case 2:
dev->pcl_escape = (dev->data == 0x2d) ? 3 : 0;
break;
case 3:
dev->pcl_escape = (dev->data == 0x31) ? 4 : 0;
break;
case 4:
dev->pcl_escape = (dev->data == 0x32) ? 5 : 0;
break;
case 5:
dev->pcl_escape = (dev->data == 0x33) ? 6 : 0;
break;
case 6:
dev->pcl_escape = (dev->data == 0x34) ? 7 : 0;
break;
case 7:
dev->pcl_escape = (dev->data == 0x35) ? 8 : 0;
break;
case 8:
dev->pcl_escape = 0;
if (dev->data == 0x58)
dev->pjl = true;
break;
if (dev->lang == LANG_RAW) {
if ((dev->data == 0x1b) || (dev->pcl_escape > 0)) {
if (process_escape(dev, 0))
return;
}
} else if ((dev->data < 0x20) || (dev->data == 0x7f)) {
/* On PostScript, check for non-printable characters. */
switch (dev->data) {
/* The following characters are considered white-space
by the PostScript specification */
case '\t':
case '\n':
case '\f':
case '\r':
break;
} else {
/* On PCL, check for escape sequences. */
if (dev->pcl) {
if (dev->pjl) {
dev->buffer[dev->buffer_pos++] = dev->data;
/* Same with NUL, except we better change it to a space first */
case '\0':
dev->data = ' ';
break;
/* Filter out any PJL commands. */
if (dev->pjl_command && (dev->data == '\n')) {
dev->pjl_command = false;
if (!memcmp(&(dev->buffer[dev->pjl_command_start]), "@PJL ENTER LANGUAGE=PCL", 0x17))
dev->pjl = false;
else if (!memcmp(&(dev->buffer[dev->pjl_command_start]), "@PJL ENTER LANGUAGE=POSTSCRIPT", 0x1e))
fatal("Printing PostScript using the PCL printer is not (yet) supported!\n");
dev->buffer[dev->buffer_pos] = 0x00;
dev->buffer_pos = dev->pjl_command_start;
} else if (!dev->pjl_command && (dev->buffer_pos >= 0x05) && !memcmp(&(dev->buffer[dev->buffer_pos - 0x5]), "@PJL ", 0x05)) {
dev->pjl_command = true;
dev->pjl_command_start = dev->buffer_pos - 0x05;
} else if (!dev->pjl_command && (dev->data == 0x1b))
/* The universal exit code is also valid in PJL. */
dev->pcl_escape = 1;
/* Ctrl+D (0x04) marks the end of the document */
case '\4':
write_buffer(dev, true);
dev->buffer[dev->buffer_pos] = 0;
return;
} else if ((dev->data == 0x1b) || (dev->pcl_escape > 0)) {
if (process_escape(dev, 1))
return;
}
} else if ((dev->data < 0x20) || (dev->data == 0x7f)) {
/* On PostScript, check for non-printable characters. */
switch (dev->data) {
/* The following characters are considered white-space
by the PostScript specification */
case '\t':
case '\n':
case '\f':
case '\r':
break;
/* Don't bother with the others */
default:
return;
/* Same with NUL, except we better change it to a space first */
case '\0':
dev->data = ' ';
break;
/* Ctrl+D (0x04) marks the end of the document */
case '\4':
write_buffer(dev, true);
return;
/* Don't bother with the others */
default:
return;
}
}
}
@@ -460,34 +519,39 @@ ps_read_status(void *priv)
}
static void *
ps_init(void *lpt)
ps_init(const device_t *info)
{
ps_t *dev = (ps_t *) calloc(1, sizeof(ps_t));
gsapi_revision_t rev;
dev->ctrl = 0x04;
dev->lpt = lpt;
dev->pcl = false;
/* Try loading the DLL. */
ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL, ghostscript_imports);
dev->lpt = lpt_attach(ps_write_data, ps_write_ctrl, ps_strobe, ps_read_status, NULL, NULL, NULL, dev);
dev->lang = device_get_config_int("language");
if (dev->lang != LANG_RAW) {
/* Try loading the DLL. */
ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL, ghostscript_imports);
#ifdef PATH_GHOSTSCRIPT_DLL_ALT1
if (ghostscript_handle == NULL) {
ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL_ALT1, ghostscript_imports);
if (ghostscript_handle == NULL) {
ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL_ALT1, ghostscript_imports);
# ifdef PATH_GHOSTSCRIPT_DLL_ALT2
if (ghostscript_handle == NULL)
ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL_ALT2, ghostscript_imports);
if (ghostscript_handle == NULL)
ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL_ALT2, ghostscript_imports);
# endif
}
}
#endif
if (ghostscript_handle == NULL) {
ui_msgbox_header(MBX_ERROR, plat_get_string(STRING_GHOSTSCRIPT_ERROR_TITLE), plat_get_string(STRING_GHOSTSCRIPT_ERROR_DESC));
} else {
if (gsapi_revision(&rev, sizeof(rev)) == 0) {
pclog("Loaded %s, rev %ld (%ld)\n", rev.product, rev.revision, rev.revisiondate);
} else {
dynld_close(ghostscript_handle);
ghostscript_handle = NULL;
if (ghostscript_handle == NULL) {
ui_msgbox_header(MBX_ERROR, plat_get_string(STRING_GHOSTSCRIPT_ERROR_TITLE), plat_get_string(STRING_GHOSTSCRIPT_ERROR_DESC));
} else {
if (gsapi_revision(&rev, sizeof(rev)) == 0) {
pclog("Loaded %s, rev %ld (%ld)\n", rev.product, rev.revision, rev.revisiondate);
} else {
dynld_close(ghostscript_handle);
ghostscript_handle = NULL;
}
}
}
@@ -506,36 +570,40 @@ ps_init(void *lpt)
return dev;
}
#ifdef USE_PCL
static void *
pcl_init(void *lpt)
pcl_init(const device_t *info)
{
ps_t *dev = (ps_t *) calloc(1, sizeof(ps_t));
gsapi_revision_t rev;
dev->ctrl = 0x04;
dev->lpt = lpt;
dev->pcl = true;
/* Try loading the DLL. */
ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL, ghostscript_imports);
dev->lpt = lpt_attach(ps_write_data, ps_write_ctrl, ps_strobe, ps_read_status, NULL, NULL, NULL, dev);
dev->lang = device_get_config_int("language");
if (dev->lang != LANG_RAW) {
/* Try loading the DLL. */
ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL, ghostscript_imports);
#ifdef PATH_GHOSTPCL_DLL_ALT1
if (ghostscript_handle == NULL) {
ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL_ALT1, ghostscript_imports);
if (ghostscript_handle == NULL) {
ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL_ALT1, ghostscript_imports);
# ifdef PATH_GHOSTPCL_DLL_ALT2
if (ghostscript_handle == NULL)
ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL_ALT2, ghostscript_imports);
if (ghostscript_handle == NULL)
ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL_ALT2, ghostscript_imports);
# endif
}
}
#endif
if (ghostscript_handle == NULL) {
ui_msgbox_header(MBX_ERROR, plat_get_string(STRING_GHOSTPCL_ERROR_TITLE), plat_get_string(STRING_GHOSTPCL_ERROR_DESC));
} else {
if (gsapi_revision(&rev, sizeof(rev)) == 0) {
pclog("Loaded %s, rev %ld (%ld)\n", rev.product, rev.revision, rev.revisiondate);
if (ghostscript_handle == NULL) {
ui_msgbox_header(MBX_ERROR, plat_get_string(STRING_GHOSTPCL_ERROR_TITLE), plat_get_string(STRING_GHOSTPCL_ERROR_DESC));
} else {
dynld_close(ghostscript_handle);
ghostscript_handle = NULL;
if (gsapi_revision(&rev, sizeof(rev)) == 0) {
pclog("Loaded %s, rev %ld (%ld)\n", rev.product, rev.revision, rev.revisiondate);
} else {
dynld_close(ghostscript_handle);
ghostscript_handle = NULL;
}
}
}
@@ -553,7 +621,6 @@ pcl_init(void *lpt)
return dev;
}
#endif
static void
ps_close(void *priv)
@@ -574,36 +641,75 @@ ps_close(void *priv)
free(dev);
}
const lpt_device_t lpt_prt_ps_device = {
.name = "Generic PostScript Printer",
.internal_name = "postscript",
.init = ps_init,
.close = ps_close,
.write_data = ps_write_data,
.write_ctrl = ps_write_ctrl,
.strobe = ps_strobe,
.read_status = ps_read_status,
.read_ctrl = NULL,
.epp_write_data = NULL,
.epp_request_read = NULL,
.priv = NULL,
.lpt = NULL
// clang-format off
static const device_config_t lpt_prt_ps_config[] = {
{
.name = "language",
.description = "Language",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = LANG_PS,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "Raw", .value = LANG_RAW },
{ .description = "PDF (PostScript)", .value = LANG_PS },
{ .description = "" }
},
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
};
// clang-format on
// clang-format off
static const device_config_t lpt_prt_pcl_config[] = {
{
.name = "language",
.description = "Language",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = LANG_PCL_5E,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "Raw", .value = LANG_RAW },
{ .description = "PDF (PCL 5e)", .value = LANG_PCL_5E },
{ .description = "PDF (PCL 5c)", .value = LANG_PCL_5C },
{ .description = "PDF (HP-RTL)", .value = LANG_HP_RTL },
{ .description = "PDF (PCL 6)", .value = LANG_PCL_6 },
{ .description = "" }
},
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
};
// clang-format on
const device_t lpt_prt_ps_device = {
.name = "Generic PostScript Printer",
.internal_name = "postscript",
.flags = DEVICE_LPT,
.local = 0,
.init = ps_init,
.close = ps_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = lpt_prt_ps_config
};
#ifdef USE_PCL
const lpt_device_t lpt_prt_pcl_device = {
.name = "Generic PCL5e Printer",
.internal_name = "pcl",
.init = pcl_init,
.close = ps_close,
.write_data = ps_write_data,
.write_ctrl = ps_write_ctrl,
.strobe = ps_strobe,
.read_status = ps_read_status,
.read_ctrl = NULL,
.epp_write_data = NULL,
.epp_request_read = NULL,
.priv = NULL,
.lpt = NULL
const device_t lpt_prt_pcl_device = {
.name = "Generic PCL Printer",
.internal_name = "pcl",
.flags = DEVICE_LPT,
.local = 0,
.init = pcl_init,
.close = ps_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = lpt_prt_pcl_config
};
#endif

View File

@@ -455,13 +455,13 @@ read_status(void *priv)
}
static void *
prnt_init(void *lpt)
prnt_init(const device_t *info)
{
/* Initialize a device instance. */
prnt_t *dev = (prnt_t *) calloc(1, sizeof(prnt_t));
dev->ctrl = 0x04;
dev->lpt = lpt;
dev->lpt = lpt_attach(write_data, write_ctrl, strobe, read_status, NULL, NULL, NULL, dev);
/* Initialize parameters. */
reset_printer(dev);
@@ -523,13 +523,13 @@ static const device_config_t lpt_prt_text_config[] = {
#endif
// clang-format on
const device_t prt_text_device = {
const device_t lpt_prt_text_device = {
.name = "Generic Text Printer",
.internal_name = "text_prt",
.flags = DEVICE_LPT,
.local = 0,
.init = NULL,
.close = NULL,
.init = prnt_init,
.close = prnt_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
@@ -540,20 +540,3 @@ const device_t prt_text_device = {
.config = NULL
#endif
};
const lpt_device_t lpt_prt_text_device = {
.name = "Generic Text Printer",
.internal_name = "text_prt",
.init = prnt_init,
.close = prnt_close,
.write_data = write_data,
.write_ctrl = write_ctrl,
.strobe = strobe,
.read_status = read_status,
.read_ctrl = NULL,
.epp_write_data = NULL,
.epp_request_read = NULL,
.priv = NULL,
.lpt = NULL,
.cfgdevice = (device_t *) &prt_text_device
};

View File

@@ -3017,3 +3017,6 @@ msgstr ""
msgid "To change the system directory, stop all running machines."
msgstr ""
msgid "Raw"
msgstr ""

View File

@@ -3016,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "&Permetre recompilació"
msgid "&Fast forward"
msgstr ""
msgstr "&Avançar ràpidament"
msgid "Fast forward"
msgstr ""
msgstr "Avançar ràpidament"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Per canviar el directori del sistema, atureu totes les màquines en funcionament."
msgid "Raw"
msgstr "En brut"

View File

@@ -3022,5 +3022,7 @@ msgid "Fast forward"
msgstr "Zrychlit"
msgid "To change the system directory, stop all running machines."
msgstr ""
"Před změnou systémového adresáře nejprve zastavte všechny běžící počítače."
msgstr "Před změnou systémového adresáře nejprve zastavte všechny běžící počítače."
msgid "Raw"
msgstr "Surový"

View File

@@ -1,6 +1,6 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-11-29 00:34+0000\n"
"PO-Revision-Date: 2026-01-28 08:57+0000\n"
"Last-Translator: OBattler <oubattler@gmail.com>\n"
"Language-Team: German <https://weblate.86box.net/projects/86box/86box/de/>\n"
"Language: de-DE\n"
@@ -2872,7 +2872,7 @@ msgid "%1 VM Manager"
msgstr ""
msgid "%n disk(s)"
msgstr ""
msgstr "%n Festplatte(n)"
msgid "Unknown Status"
msgstr "Unbekannter Status"
@@ -3016,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "Recompilierung &zulassen"
msgid "&Fast forward"
msgstr ""
msgstr "&Schnellvorlauf"
msgid "Fast forward"
msgstr ""
msgstr "Schnellvorlauf"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Um das Systemverzeichnis zu ändern, stoppen Sie alle laufenden Maschinen."
msgid "Raw"
msgstr "Roh"

View File

@@ -1,6 +1,6 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-01-10 12:56+0000\n"
"PO-Revision-Date: 2026-01-26 17:57+0000\n"
"Last-Translator: DimMan88 <dimman88@hotmail.com>\n"
"Language-Team: Greek <https://weblate.86box.net/projects/86box/86box/el/>\n"
"Language: el-GR\n"
@@ -2919,24 +2919,26 @@ msgstr "Επιτυχής διαγραφή των περιεχομένων NVRAM
msgid "An error occurred trying to wipe the NVRAM contents of the virtual machine \"%1\""
msgstr ""
"Ένα σφάλμα προέκυψε κατά την εκκαθάριση των περιεχομένων της NVRAM της "
"εικονικής μηχανής \"%1\""
msgid "%1 VM Manager"
msgstr ""
msgstr "%1 VM Manager"
msgid "%n disk(s)"
msgstr ""
msgstr "%n δίσκος(οι)"
msgid "Unknown Status"
msgstr ""
msgstr "Άγνωστη Κατάσταση"
msgid "No Machines Found!"
msgstr ""
msgstr "Δεν βρέθηκαν μηχανές!"
msgid "Check for updates on startup"
msgstr "Έλεγχος για ενημερώσεις κατα την εκκίνηση"
msgid "Unable to determine release information"
msgstr ""
msgstr "Αδυναμία προσδιορισμού πληροφοριών έκδοσης"
msgid "There was an error checking for updates:\n\n%1\n\nPlease try again later."
msgstr ""
@@ -2947,82 +2949,84 @@ msgstr ""
"Παρακαλώ προσπαθήστε ξανά αργότερα."
msgid "Update check complete"
msgstr ""
msgstr "Ο έλεγχος ενημερώσεων ολοκληρώθηκε"
msgid "stable"
msgstr ""
msgstr "σταθερή"
msgid "beta"
msgstr ""
msgstr "δοκιμαστική"
msgid "You are running the latest %1 version of 86Box: %2"
msgstr ""
msgstr "Τρέχετε την τελευταία %1 έκδοση του 86Box: %2"
msgid "version"
msgstr ""
msgstr "έκδοση"
msgid "build"
msgstr ""
msgstr "build"
msgid "You are currently running version <b>%1</b>."
msgstr ""
msgstr "Τρέχετε την έκδοση <b>%1</b>."
msgid "<b>Version %1</b> is now available."
msgstr ""
msgstr "<b>Έκδοση %1</b> είναι διαθέσιμη."
msgid "You are currently running build <b>%1</b>."
msgstr ""
msgstr "Τρέχετε το build <b>%1</b>."
msgid "<b>Build %1</b> is now available."
msgstr ""
msgstr "<b>Build %1</b> είναι τώρα διαθέσιμο."
msgid "Would you like to visit the download page?"
msgstr ""
msgstr "Επιθυμείτε να επισκεφθείτε την σελίδα λήψεων;"
msgid "Visit download page"
msgstr ""
msgstr "Επίσκεψη σελίδας λήψεων"
msgid "Update check"
msgstr ""
msgstr "Έλεγχος ενημερώσεων"
msgid "Checking for updates…"
msgstr "Έλεγχος για ενημερώσεις…"
msgid "86Box Update"
msgstr ""
msgstr "Ενημέρωση 86Box"
msgid "Release notes:"
msgstr ""
msgstr "Σημειώσεις έκδοσης:"
msgid "%1 Hz"
msgstr ""
msgstr "%1 Hz"
msgid "Virtual machine crash"
msgstr ""
msgstr "Σφάλμα εικονικής μηχανής"
msgid "The virtual machine \"%1\"'s process has unexpectedly terminated with exit code %2."
msgstr ""
"Η διεργασία της εικονικής μηχανής \"%1\" τερματίστηκε απροσδόκητα με κωδικό "
"εξόδου %2."
msgid "The system will not be added."
msgstr ""
msgstr "Το σύστημα δεν θα προστεθεί."
msgid "&Update mouse every CPU frame"
msgstr "&Ανανέωση ποντικιού ανα καρέ CPU"
msgid "Hue"
msgstr ""
msgstr "Απόχρωση"
msgid "Saturation"
msgstr ""
msgstr "Κορεσμός"
msgid "Contrast"
msgstr ""
msgstr "Αντίθεση"
msgid "Brightness"
msgstr ""
msgstr "Φωτεινότητα"
msgid "Sharpness"
msgstr ""
msgstr "Οξύτητα"
msgid "&CGA composite settings…"
msgstr "Ρυθμίσεις &CGA composite…"
@@ -3073,10 +3077,13 @@ msgid "&Allow recompilation"
msgstr "&Να επιτρέπεται ανασύνταξη"
msgid "&Fast forward"
msgstr ""
msgstr "&Γρήγορα μπροστά"
msgid "Fast forward"
msgstr ""
msgstr "Γρήγορα μπροστά"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Για να αλλάξετε τον κατάλογο συστήματος, σταματήστε πρώτα όλες τις μηχανές σε λειτουργία."
msgid "Raw"
msgstr "Αρχικος"

View File

@@ -3016,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "&Permitir recompilación"
msgid "&Fast forward"
msgstr ""
msgstr "&Avance rápido"
msgid "Fast forward"
msgstr ""
msgstr "Avance rápido"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Para cambiar el directorio del sistema, detenga todas las máquinas en funcionamiento."
msgid "Raw"
msgstr "Plano"

View File

@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2025-12-29 09:54+0000\n"
"Last-Translator: Daniel Gurney <daniel@gurney.dev>\n"
"PO-Revision-Date: 2026-01-28 08:57+0000\n"
"Last-Translator: OBattler <oubattler@gmail.com>\n"
"Language-Team: Finnish <https://weblate.86box.net/projects/86box/86box/fi/>\n"
"Language: fi-FI\n"
"MIME-Version: 1.0\n"
@@ -637,7 +637,7 @@ msgid "MO drives:"
msgstr "Magneettisoptiset asemat (MO):"
msgid "MO:"
msgstr ""
msgstr "MO:"
msgid "Removable disks:"
msgstr "Irrotettavat levyt:"
@@ -1843,7 +1843,7 @@ msgid "Microsoft Serial Mouse"
msgstr "Microsoft-sarjahiiri"
msgid "Microsoft Serial BallPoint"
msgstr ""
msgstr "Microsoft BallPoint-sarjahiiri"
msgid "Logitech Serial Mouse"
msgstr "Logitech-sarjahiiri"
@@ -1930,7 +1930,7 @@ msgid "Enable BIOS extension ROM Writes (ROM #4)"
msgstr "Salli BIOS-laajennuksen ROM-kirjoitukset (ROM #4)"
msgid "Linear framebuffer base"
msgstr ""
msgstr "Lineaarisen kehyspuskurin perusosoite"
msgid "Address"
msgstr "Osoite"
@@ -2179,7 +2179,7 @@ msgid "WSS DMA"
msgstr "WSS-DMA"
msgid "RTC IRQ"
msgstr ""
msgstr "RTC:n IRQ"
msgid "RTC Port Address"
msgstr "RTC-portin osoite"
@@ -2380,10 +2380,10 @@ msgid "Linear"
msgstr "Lineaarinen"
msgid "4th Order"
msgstr ""
msgstr "4. kertaluku"
msgid "7th Order"
msgstr ""
msgstr "7. kertaluku"
msgid "Non-timed (original)"
msgstr "Ajastamaton (alkuperäinen)"
@@ -3016,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "&Salli uudelleenkääntäminen"
msgid "&Fast forward"
msgstr ""
msgstr "&Nopea eteneminen"
msgid "Fast forward"
msgstr ""
msgstr "Nopea eteneminen"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Järjestelmähakemiston muuttamiseksi pysäytä kaikki käynnissä olevat koneet."
msgid "Raw"
msgstr "Raaka"

View File

@@ -3016,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "&Permettre la recompilation"
msgid "&Fast forward"
msgstr ""
msgstr "&Avance rapide"
msgid "Fast forward"
msgstr ""
msgstr "Avance rapide"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Pour modifier le répertoire système, arrêtez toutes les machines en cours d'exécution."
msgid "Raw"
msgstr "Brut"

View File

@@ -3018,10 +3018,13 @@ msgid "&Allow recompilation"
msgstr "&Omogući rekompilaciju"
msgid "&Fast forward"
msgstr ""
msgstr "&Brzo naprijed"
msgid "Fast forward"
msgstr ""
msgstr "Brzo naprijed"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Za promjenu sustavskog direktorija zaustavite sve pokrenute strojeve."
msgid "Raw"
msgstr "Neobrađeni podaci"

View File

@@ -3016,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "&Permetti ricompilazione"
msgid "&Fast forward"
msgstr ""
msgstr "&Avanti veloce"
msgid "Fast forward"
msgstr ""
msgstr "Avanti veloce"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Per modificare la directory di sistema, arrestare tutte le macchine in funzione."
msgid "Raw"
msgstr "Grezzo"

View File

@@ -3017,10 +3017,13 @@ msgid "&Allow recompilation"
msgstr "再コンパイルを許可する(&A)"
msgid "&Fast forward"
msgstr ""
msgstr "早送り(&F)"
msgid "Fast forward"
msgstr ""
msgstr "早送り"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "システムディレクトリを変更するには、稼働中のマシンをすべて停止してください。"
msgid "Raw"
msgstr "生"

View File

@@ -1,8 +1,14 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-01-28 08:57+0000\n"
"Last-Translator: OBattler <oubattler@gmail.com>\n"
"Language-Team: Korean <https://weblate.86box.net/projects/86box/86box/ko/>\n"
"Language: ko-KR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Language: ko_KR\n"
"X-Source-Language: en_US\n"
@@ -1780,7 +1786,7 @@ msgid "VDE Socket:"
msgstr "VDE 소켓:"
msgid "TAP Bridge Device:"
msgstr ""
msgstr "TAP 브리지 장치:"
msgid "86Box Unit Tester"
msgstr "86Box 유닛 테스터"
@@ -2173,16 +2179,16 @@ msgid "WSS DMA"
msgstr "WSS DMA"
msgid "RTC IRQ"
msgstr ""
msgstr "RTC의 IRQ"
msgid "RTC Port Address"
msgstr ""
msgstr "RTC의 포트 주소"
msgid "Onboard RTC"
msgstr ""
msgstr "온보드 RTC"
msgid "Not installed"
msgstr ""
msgstr "설치되지 않음"
msgid "Enable OPL"
msgstr "OPL 사용"
@@ -2806,7 +2812,7 @@ msgid "Toggle fullscreen"
msgstr "전체 화면 모드 전환"
msgid "Toggle UI in fullscreen"
msgstr ""
msgstr "전체 화면 모드에서 UI 전환"
msgid "Release mouse pointer"
msgstr "마우스 포인터를 해제합니다"
@@ -3010,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "재컴파일 허용(&A)"
msgid "&Fast forward"
msgstr ""
msgstr "빠른 전진(&F)"
msgid "Fast forward"
msgstr ""
msgstr "빠른 전진"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "시스템 디렉터리를 변경하려면 실행 중인 모든 머신을 중지하십시오."
msgid "Raw"
msgstr "원본"

View File

@@ -1,8 +1,15 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-01-28 08:57+0000\n"
"Last-Translator: OBattler <oubattler@gmail.com>\n"
"Language-Team: Norwegian Bokmål <https://weblate.86box.net/projects/86box/"
"86box/nb_NO/>\n"
"Language: nb-NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Language: nb_NO\n"
"X-Source-Language: en_US\n"
@@ -1780,7 +1787,7 @@ msgid "VDE Socket:"
msgstr "VDE-kontakt:"
msgid "TAP Bridge Device:"
msgstr ""
msgstr "TAP-broenhet:"
msgid "86Box Unit Tester"
msgstr "86Box-enhetstester"
@@ -2173,16 +2180,16 @@ msgid "WSS DMA"
msgstr "WSS-DMA"
msgid "RTC IRQ"
msgstr ""
msgstr "IRQ for RTC"
msgid "RTC Port Address"
msgstr ""
msgstr "Portadresse for RTC"
msgid "Onboard RTC"
msgstr ""
msgstr "Innebygd RTC"
msgid "Not installed"
msgstr ""
msgstr "Ikke installert"
msgid "Enable OPL"
msgstr "Aktiver OPL"
@@ -2806,7 +2813,7 @@ msgid "Toggle fullscreen"
msgstr "Veksle fullskjerm"
msgid "Toggle UI in fullscreen"
msgstr ""
msgstr "Veksle mellom brukergrensesnittet i fullskjermmodus"
msgid "Release mouse pointer"
msgstr "Frigi musepeker"
@@ -3010,10 +3017,13 @@ msgid "&Allow recompilation"
msgstr "&Tillat rekompilering"
msgid "&Fast forward"
msgstr ""
msgstr "&Spol fremover"
msgid "Fast forward"
msgstr ""
msgstr "Spol fremover"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "For å endre systemkatalogen, stopp alle maskiner som er kjører."
msgid "Raw"
msgstr "Rå"

View File

@@ -1,8 +1,14 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-01-28 08:57+0000\n"
"Last-Translator: OBattler <oubattler@gmail.com>\n"
"Language-Team: Dutch <https://weblate.86box.net/projects/86box/86box/nl/>\n"
"Language: nl-NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Language: nl_NL\n"
"X-Source-Language: en_US\n"
@@ -1780,7 +1786,7 @@ msgid "VDE Socket:"
msgstr "VDE-socket:"
msgid "TAP Bridge Device:"
msgstr ""
msgstr "TAP-brugapparaat:"
msgid "86Box Unit Tester"
msgstr "86Box Apparaattester"
@@ -2173,16 +2179,16 @@ msgid "WSS DMA"
msgstr "WSS DMA"
msgid "RTC IRQ"
msgstr ""
msgstr "IRQ van de RTC"
msgid "RTC Port Address"
msgstr ""
msgstr "Poortadres van de RTC"
msgid "Onboard RTC"
msgstr ""
msgstr "Ingebouwde RTC"
msgid "Not installed"
msgstr ""
msgstr "Niet geïnstalleerd"
msgid "Enable OPL"
msgstr "OPL inschakelen"
@@ -2806,7 +2812,7 @@ msgid "Toggle fullscreen"
msgstr "Volledig scherm omschakelen"
msgid "Toggle UI in fullscreen"
msgstr ""
msgstr "Schakel de UI in volledig scherm"
msgid "Release mouse pointer"
msgstr "Geef muis vrij"
@@ -3010,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "Recompilatie &toestaan"
msgid "&Fast forward"
msgstr ""
msgstr "&Snel vooruitspoelen"
msgid "Fast forward"
msgstr ""
msgstr "Snel vooruitspoelen"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Om de systeemmap te wijzigen, moet u alle actieve machines stoppen."
msgid "Raw"
msgstr "Ruw"

View File

@@ -3017,10 +3017,13 @@ msgid "&Allow recompilation"
msgstr "&Zezwól na rekompilację"
msgid "&Fast forward"
msgstr ""
msgstr "&Przewiń do przodu"
msgid "Fast forward"
msgstr ""
msgstr "Przewiń do przodu"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Aby zmienić katalog systemowy, zatrzymaj wszystkie działające maszyny."
msgid "Raw"
msgstr "Surowy"

View File

@@ -3010,10 +3010,13 @@ msgid "&Allow recompilation"
msgstr "&Permitir recompilação"
msgid "&Fast forward"
msgstr ""
msgstr "&Avançar rapidamente"
msgid "Fast forward"
msgstr ""
msgstr "Avançar rapidamente"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Para alterar o diretório do sistema, pare todas as máquinas em funcionamento."
msgid "Raw"
msgstr "Bruto"

View File

@@ -3017,10 +3017,13 @@ msgid "&Allow recompilation"
msgstr "&Permitir recompilação"
msgid "&Fast forward"
msgstr ""
msgstr "&Avançar rapidamente"
msgid "Fast forward"
msgstr ""
msgstr "Avançar rapidamente"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Para alterar o diretório do sistema, pare todas as máquinas em funcionamento."
msgid "Raw"
msgstr "Bruto"

View File

@@ -3036,3 +3036,6 @@ msgstr "Перемотка вперёд"
msgid "To change the system directory, stop all running machines."
msgstr "Чтобы изменить системную папку, остановите все запущенные машины."
msgid "Raw"
msgstr "Сырой"

View File

@@ -3016,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "&Povoliť rekompiláciu"
msgid "&Fast forward"
msgstr ""
msgstr "&Rýchly posun dopredu"
msgid "Fast forward"
msgstr ""
msgstr "Rýchly posun dopredu"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Ak chcete zmeniť systémový adresár, zastavte všetky bežiace stroje."
msgid "Raw"
msgstr "Surový"

View File

@@ -3018,10 +3018,13 @@ msgid "&Allow recompilation"
msgstr "&Dovoli prevajanje"
msgid "&Fast forward"
msgstr ""
msgstr "&Hitro previj"
msgid "Fast forward"
msgstr ""
msgstr "Hitro previj"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Da bi spremenili sistemski imenik, ustavite vse naprave, ki se izvajajo."
msgid "Raw"
msgstr "Neobdelan"

View File

@@ -1,8 +1,14 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-01-28 08:57+0000\n"
"Last-Translator: OBattler <oubattler@gmail.com>\n"
"Language-Team: Swedish <https://weblate.86box.net/projects/86box/86box/sv/>\n"
"Language: sv-SE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Language: sv_SE\n"
"X-Source-Language: en_US\n"
@@ -1780,7 +1786,7 @@ msgid "VDE Socket:"
msgstr "VDE-sockel:"
msgid "TAP Bridge Device:"
msgstr ""
msgstr "TAP-bryggaenhet:"
msgid "86Box Unit Tester"
msgstr "86Box enhetsprövare"
@@ -2173,16 +2179,16 @@ msgid "WSS DMA"
msgstr "WSS DMA"
msgid "RTC IRQ"
msgstr ""
msgstr "IRQ för RTC"
msgid "RTC Port Address"
msgstr ""
msgstr "Portadress för RTC"
msgid "Onboard RTC"
msgstr ""
msgstr "Inbyggd RTC"
msgid "Not installed"
msgstr ""
msgstr "Ej installerad"
msgid "Enable OPL"
msgstr "Aktivera OPL"
@@ -2806,7 +2812,7 @@ msgid "Toggle fullscreen"
msgstr "Helskärm"
msgid "Toggle UI in fullscreen"
msgstr ""
msgstr "Växla UI till helskärmsläge"
msgid "Release mouse pointer"
msgstr "Släpp muspekare"
@@ -3010,10 +3016,13 @@ msgid "&Allow recompilation"
msgstr "&Tillåt omkompilering"
msgid "&Fast forward"
msgstr ""
msgstr "&Spola fram"
msgid "Fast forward"
msgstr ""
msgstr "Spola fram"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "ör att ändra systemkatalogen, stoppa alla maskiner som är körs."
msgid "Raw"
msgstr "Rå"

View File

@@ -3023,3 +3023,6 @@ msgstr "İleri sar"
msgid "To change the system directory, stop all running machines."
msgstr "Sistem dizinini değiştirmek için tüm çalışan makineleri durdurun."
msgid "Raw"
msgstr "Ham"

View File

@@ -3018,10 +3018,13 @@ msgid "&Allow recompilation"
msgstr "&Дозволити рекомпіляцію"
msgid "&Fast forward"
msgstr ""
msgstr "&Перемотай вперед"
msgid "Fast forward"
msgstr ""
msgstr "Перемотай вперед"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Щоб змінити системний каталог, зупиніть усі машини, що працюють."
msgid "Raw"
msgstr "Сирий"

View File

@@ -1,8 +1,15 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-01-28 08:57+0000\n"
"Last-Translator: OBattler <oubattler@gmail.com>\n"
"Language-Team: Vietnamese <https://weblate.86box.net/projects/86box/86box/vi/"
">\n"
"Language: vi-VN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Language: vi_VN\n"
"X-Source-Language: en_US\n"
@@ -1780,7 +1787,7 @@ msgid "VDE Socket:"
msgstr "Ổ cắm VDE:"
msgid "TAP Bridge Device:"
msgstr ""
msgstr "Thiết bị cầu nối TAP:"
msgid "86Box Unit Tester"
msgstr "Trình kiểm tra đơn vị 86box"
@@ -2173,16 +2180,16 @@ msgid "WSS DMA"
msgstr "WSS DMA"
msgid "RTC IRQ"
msgstr ""
msgstr "IRQ của RTC"
msgid "RTC Port Address"
msgstr ""
msgstr "Địa chỉ cổng của RTC"
msgid "Onboard RTC"
msgstr ""
msgstr "RTC tích hợp trên bo mạch"
msgid "Not installed"
msgstr ""
msgstr "Chưa được cài đặt"
msgid "Enable OPL"
msgstr "Bật OPL"
@@ -2806,7 +2813,7 @@ msgid "Toggle fullscreen"
msgstr "Bật/tắt toàn màn hình"
msgid "Toggle UI in fullscreen"
msgstr ""
msgstr "Chuyển đổi giao diện người dùng sang chế độ toàn màn hình"
msgid "Release mouse pointer"
msgstr "Thả con trỏ chuột"
@@ -3010,10 +3017,13 @@ msgid "&Allow recompilation"
msgstr "&Cho phép biên dịch lại"
msgid "&Fast forward"
msgstr ""
msgstr "&Chuyển nhanh băng"
msgid "Fast forward"
msgstr ""
msgstr "Chuyển nhanh băng"
msgid "To change the system directory, stop all running machines."
msgstr ""
msgstr "Để thay đổi thư mục hệ thống, hãy tắt tất cả các máy đang chạy."
msgid "Raw"
msgstr "Thô"

View File

@@ -3024,3 +3024,6 @@ msgstr "快进"
msgid "To change the system directory, stop all running machines."
msgstr "请在变更系统目录前关闭所有正在运行的虚拟机。"
msgid "Raw"
msgstr "原始"

View File

@@ -3024,3 +3024,6 @@ msgstr "快轉"
msgid "To change the system directory, stop all running machines."
msgstr "欲變更系統目錄,請先停止全部運行中的機器。"
msgid "Raw"
msgstr "原始"

View File

@@ -1,7 +1,7 @@
#ifndef QT_DEFS_HPP
#define QT_DEFS_HPP
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
#define CHECK_STATE_CHANGED checkStateChanged
#else
#define CHECK_STATE_CHANGED stateChanged

View File

@@ -138,13 +138,15 @@ SettingsPorts::onCurrentMachineChanged(int machineId)
if (lptName == nullptr)
break;
const QString name = tr(lptName);
if (lpt_device_available(c)) {
const QString name = tr(lptName);
for (uint8_t i = 0; i < PARALLEL_MAX; ++i) {
int row = Models::AddEntry(models[i], name, c);
for (uint8_t i = 0; i < PARALLEL_MAX; ++i) {
int row = Models::AddEntry(models[i], name, c);
if (c == lpt_ports[i].device)
selectedRows[i] = row - removeRows_[i];
if (c == lpt_ports[i].device)
selectedRows[i] = row - removeRows_[i];
}
}
c++;

View File

@@ -89,11 +89,11 @@ dac_get_buffer(int32_t *buffer, int len, void *priv)
}
static void *
dac_init(void *lpt)
dac_init(UNUSED(const device_t *info))
{
lpt_dac_t *lpt_dac = calloc(1, sizeof(lpt_dac_t));
lpt_dac->lpt = lpt;
lpt_dac->lpt = lpt_attach(dac_write_data, dac_write_ctrl, dac_strobe, dac_read_status, NULL, NULL, NULL, lpt_dac);
sound_add_handler(dac_get_buffer, lpt_dac);
@@ -101,9 +101,9 @@ dac_init(void *lpt)
}
static void *
dac_stereo_init(void *lpt)
dac_stereo_init(const device_t *info)
{
lpt_dac_t *lpt_dac = dac_init(lpt);
lpt_dac_t *lpt_dac = dac_init(info);
lpt_dac->is_stereo = 1;
@@ -117,34 +117,30 @@ dac_close(void *priv)
free(lpt_dac);
}
const lpt_device_t lpt_dac_device = {
.name = "LPT DAC / Covox Speech Thing",
.internal_name = "lpt_dac",
.init = dac_init,
.close = dac_close,
.write_data = dac_write_data,
.write_ctrl = dac_write_ctrl,
.strobe = dac_strobe,
.read_status = dac_read_status,
.read_ctrl = NULL,
.epp_write_data = NULL,
.epp_request_read = NULL,
.priv = NULL,
.lpt = NULL
const device_t lpt_dac_device = {
.name = "LPT DAC / Covox Speech Thing",
.internal_name = "lpt_dac",
.flags = DEVICE_LPT,
.local = 0,
.init = dac_init,
.close = dac_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};
const lpt_device_t lpt_dac_stereo_device = {
.name = "Stereo LPT DAC",
.internal_name = "lpt_dac_stereo",
.init = dac_stereo_init,
.close = dac_close,
.write_data = dac_write_data,
.write_ctrl = dac_write_ctrl,
.strobe = dac_strobe,
.read_status = dac_read_status,
.read_ctrl = NULL,
.epp_write_data = NULL,
.epp_request_read = NULL,
.priv = NULL,
.lpt = NULL
const device_t lpt_dac_stereo_device = {
.name = "Stereo LPT DAC",
.internal_name = "lpt_dac_stereo",
.flags = DEVICE_LPT,
.local = 0,
.init = dac_stereo_init,
.close = dac_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};

View File

@@ -114,11 +114,11 @@ dss_callback(void *priv)
}
static void *
dss_init(void *lpt)
dss_init(UNUSED(const device_t *info))
{
dss_t *dss = calloc(1, sizeof(dss_t));
dss->lpt = lpt;
dss->lpt = lpt_attach(dss_write_data, dss_write_ctrl, NULL, dss_read_status, NULL, NULL, NULL, dss);
sound_add_handler(dss_get_buffer, dss);
timer_add(&dss->timer, dss_callback, dss, 1);
@@ -133,18 +133,16 @@ dss_close(void *priv)
free(dss);
}
const lpt_device_t dss_device = {
.name = "Disney Sound Source",
.internal_name = "dss",
.init = dss_init,
.close = dss_close,
.write_data = dss_write_data,
.strobe = NULL,
.write_ctrl = dss_write_ctrl,
.read_status = dss_read_status,
.read_ctrl = NULL,
.epp_write_data = NULL,
.epp_request_read = NULL,
.priv = NULL,
.lpt = NULL
const device_t dss_device = {
.name = "Disney Sound Source",
.internal_name = "dss",
.flags = DEVICE_LPT,
.local = 0,
.init = dss_init,
.close = dss_close,
.reset = NULL,
.available = NULL,
.speed_changed = NULL,
.force_redraw = NULL,
.config = NULL
};

View File

@@ -12,10 +12,10 @@
# After a successful build, you can install the RPMs as follows:
# sudo dnf install RPMS/$(uname -m)/86Box-3* RPMS/noarch/86Box-roms*
%global romver 5.4
%global romver 6.0
Name: 86Box
Version: 5.4
Version: 6.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> 5.4-1
* Sat Aug 31 Jasmine Iwanek <jriwanek[AT]gmail.com> 6.0-1
- Bump release

View File

@@ -11,7 +11,7 @@
</categories>
<launchable type="desktop-id">net.86box.86Box.desktop</launchable>
<releases>
<release version="5.4" date="2025-12-23"/>
<release version="6.0" date="2026-01-28"/>
</releases>
<content_rating type="oars-1.1" />
<description>

File diff suppressed because it is too large Load Diff

View File

@@ -106,7 +106,11 @@ compaq_plasma_waitstates(UNUSED(void *priv))
int ws;
ws = ws_array[cycles & 0xf];
sub_cycles(ws);
if (is_nec)
sub_cycles_vx0(ws);
else
sub_cycles(ws);
}
static void

View File

@@ -91,7 +91,11 @@ nga_waitstates(UNUSED(void *priv))
int ws;
ws = ws_array[cycles & 0xf];
sub_cycles(ws);
if (is_nec)
sub_cycles_vx0(ws);
else
sub_cycles(ws);
}
void

View File

@@ -157,7 +157,11 @@ ogc_waitstates(UNUSED(void *priv))
int ws;
ws = ws_array[cycles & 0xf];
sub_cycles(ws);
if (is_nec)
sub_cycles_vx0(ws);
else
sub_cycles(ws);
}
void

View File

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