Master merge

This commit is contained in:
Toni Riikonen
2025-11-28 00:00:08 +02:00
204 changed files with 7679 additions and 6151 deletions

View File

@@ -98,6 +98,48 @@
# define LIKELY(x) (x)
#endif
/* Platform-specific atomic handling */
#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
/* On x86/x64, aligned int/uint32_t accesses are naturally atomic */
/* Use volatile for performance, as the original code did */
#define ATOMIC_INT volatile int
#define ATOMIC_UINT volatile uint32_t
#define ATOMIC_DOUBLE volatile double
#define ATOMIC_LOAD(var) (var)
#define ATOMIC_STORE(var, val) ((var) = (val))
#define ATOMIC_INC(var) (++(var))
#define ATOMIC_DEC(var) (--(var))
#define ATOMIC_ADD(var, val) ((var) += (val))
#define ATOMIC_SUB(var, val) ((var) -= (val))
#define ATOMIC_DOUBLE_ADD(var, val) ((var) += (val))
#else
/* On ARM and other architectures, use proper atomics */
#ifdef failing_code
#ifdef __cplusplus
# include <atomic>
using atomic_int = std::atomic<int>;
using atomic_uint = std::atomic<unsigned int>;
#else
# include <stdatomic.h>
#endif
#else
#ifndef __cplusplus
# include <stdatomic.h>
#endif
#endif
#define ATOMIC_INT atomic_int
#define ATOMIC_UINT atomic_uint
#define ATOMIC_DOUBLE _Atomic double
#define ATOMIC_LOAD(var) atomic_load(&(var))
#define ATOMIC_STORE(var, val) atomic_store(&(var), (val))
#define ATOMIC_INC(var) atomic_fetch_add(&(var), 1)
#define ATOMIC_DEC(var) atomic_fetch_sub(&(var), 1)
#define ATOMIC_ADD(var, val) atomic_fetch_add(&(var), val)
#define ATOMIC_SUB(var, val) atomic_fetch_sub(&(var), val)
#define ATOMIC_DOUBLE_ADD(var, val) atomic_double_add(&(var), val)
#endif
#ifdef __cplusplus
extern "C" {
#endif
@@ -288,7 +330,7 @@ struct accelKey {
char desc[64];
char seq[64];
};
#define NUM_ACCELS 8
#define NUM_ACCELS 9
extern struct accelKey acc_keys[NUM_ACCELS];
extern struct accelKey def_acc_keys[NUM_ACCELS];
extern int FindAccelerator(const char *name);

View File

@@ -142,9 +142,10 @@ static const struct cdrom_drive_types_s {
/* TODO: Find an IDENTIFY and/or INQUIRY dump. */
{ "GOLDSTAR", "GCD-R560B", "1.00", "goldstar_r560b", BUS_TYPE_IDE, 0, 6, 36, 0, 0, { 4, 2, 2, -1 } },
{ "HITACHI", "CDR-8130", "0020", "hitachi_r8130", BUS_TYPE_IDE, 0, 16, 36, 0, 0, { 4, 2, 2, -1 } },
{ "HITACHI", "GD-7500", "A1 ", "hitachi_7500", BUS_TYPE_IDE, 0, 40, 36, 0, 0, { 4, 2, 2, 2 } }, /* DVD. */
{ "HITACHI", "CDR-8435", "0010", "hitachi_r8435", BUS_TYPE_IDE, 0, 32, 36, 0, 0, { 4, 2, 2, -1 } },
{ "HITACHI", "GD-7500", "A1 ", "hitachi_7500", BUS_TYPE_IDE, 0, 40, 36, 0, 1, { 4, 2, 2, 2 } }, /* DVD. */
{ "HL-DT-ST", "CD-ROM GCR-8526B", "1.01", "hldtst_8526b", BUS_TYPE_IDE, 0, 52, 36, 0, 0, { 4, 2, 2, 2 } },
{ "HL-DT-ST", "DVDRAM GSA-4160", "A302", "hldtst_4160", BUS_TYPE_IDE, 0, 40, 36, 0, 0, { 4, 2, 2, 2 } },
{ "HL-DT-ST", "DVDRAM GSA-4160", "A302", "hldtst_4160", BUS_TYPE_IDE, 0, 40, 36, 0, 1, { 4, 2, 2, 2 } },
{ "KENWOOD", "CD-ROM UCR-421", "208E", "kenwood_421", BUS_TYPE_IDE, 0, 72, 36, 0, 0, { 4, 2, 2, 4 } },
/*
This is a laptop/notebook drive, as is also evident from the name:
@@ -182,6 +183,7 @@ static const struct cdrom_drive_types_s {
{ "TEAC", "CD-532E", "2.0A", "teac_532e", BUS_TYPE_IDE, 0, 32, 36, 0, 0, { 3, 2, 2, -1 } },
{ "TOSHIBA", "CD-ROM XM-5302TA", "0305", "toshiba_5302ta", BUS_TYPE_IDE, 0, 4, 96, 0, 0, { 0, -1, -1, -1 } },
{ "TOSHIBA", "CD-ROM XM-5702B", "TA70", "toshiba_5702b", BUS_TYPE_IDE, 0, 12, 96, 0, 0, { 3, 2, 1, -1 } },
{ "TOSHIBA", "CD-ROM XM-6102B", "WA70", "toshiba_6102b", BUS_TYPE_IDE, 0, 24, 96, 0, 0, { 4, 2, 2, -1 } },
{ "TOSHIBA", "CD-ROM XM-6202B", "1512", "toshiba_6202b", BUS_TYPE_IDE, 0, 32, 96, 0, 0, { 4, 2, 2, -1 } },
{ "TOSHIBA", "CD-ROM XM-6402B", "1008", "toshiba_6402b", BUS_TYPE_IDE, 0, 32, 96, 0, 0, { 4, 2, 2, 2 } },
{ "TOSHIBA", "CD-ROM XM-6702B", "1007", "toshiba_6720b", BUS_TYPE_IDE, 0, 48, 96, 0, 0, { 4, 2, 2, 2 } },

View File

@@ -55,6 +55,10 @@ extern int isartc_get_from_internal_name(const char *str);
extern const device_t *isartc_get_device(int t);
extern int isartc_has_config(int board);
/* On-board RTC devices */
extern const device_t vendex_xt_rtc_onboard_device;
extern const device_t rtc58167_device;
#ifdef __cplusplus
}
#endif

View File

@@ -926,6 +926,7 @@ extern int machine_at_optiplexgxl_init(const machine_t *);
extern const device_t pt2000_device;
#endif
extern int machine_at_pt2000_init(const machine_t *);
extern int machine_at_morrison32_init(const machine_t *);
extern int machine_at_pc330_65x6_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t zappa_device;
@@ -970,6 +971,7 @@ extern const device_t p54tp4xe_device;
#endif
extern int machine_at_p54tp4xe_init(const machine_t *);
extern int machine_at_exp8551_init(const machine_t *);
extern int machine_at_hpholly_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t vectra52_device;
#endif
@@ -1024,7 +1026,11 @@ extern int machine_at_amis727_init(const machine_t *);
extern const device_t ap5s_device;
#endif
extern int machine_at_ap5s_init(const machine_t *);
extern int machine_at_fm562_init(const machine_t *);
extern int machine_at_pc140_6260_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t ms5124_device;
#endif
extern int machine_at_ms5124_init(const machine_t *);
/* VLSI Wildcat */
@@ -1038,6 +1044,7 @@ extern int machine_at_p55t2p4_init(const machine_t *);
extern void machine_at_p65up5_common_init(const machine_t *, const device_t *northbridge);
#endif
extern int machine_at_p65up5_cp55t2d_init(const machine_t *);
extern int machine_at_rubyusb_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t cu430hx_device;
#endif
@@ -1248,6 +1255,10 @@ extern int machine_at_ficka6130_init(const machine_t *);
/* VIA Apollo Pro 133 */
extern int machine_at_p3v133_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t ms6199va_device;
#endif
extern int machine_at_ms6199va_init(const machine_t *);
/* VIA Apollo Pro 133A */
extern int machine_at_p3v4x_init(const machine_t *);
@@ -1289,6 +1300,9 @@ extern int machine_at_cubx_init(const machine_t *);
/* i440ZX */
extern int machine_at_63a1_init(const machine_t *);
/* SiS 600 */
extern int machine_at_7sbb_init(const machine_t *);
/* SMSC VictoryBX-66 */
extern int machine_at_atc7020bxii_init(const machine_t *);
extern int machine_at_m773_init(const machine_t *);
@@ -1302,9 +1316,11 @@ extern int machine_at_p6bap_init(const machine_t *);
/* VIA Apollo Pro 133A */
extern int machine_at_6via90ap_init(const machine_t *);
extern int machine_at_cuv4xls_init(const machine_t *);
/* SiS 600 */
extern int machine_at_7sbb_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t ms6318_device;
#endif
extern int machine_at_ms6318_init(const machine_t *);
extern int machine_at_cairo5_init(const machine_t *);
/* m_at_misc.c */
extern int machine_at_vpc2007_init(const machine_t *);
@@ -1446,6 +1462,10 @@ extern int machine_xt_pb8810_init(const machine_t *);
extern int machine_xt_sansx16_init(const machine_t *);
extern int machine_xt_pcxt_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t to16_device;
#endif
extern int machine_xt_to16_init(const machine_t *);
#ifdef EMU_DEVICE_H
extern const device_t vendex_device;
#endif
extern int machine_xt_vendex_init(const machine_t *);

View File

@@ -132,6 +132,7 @@ extern int update_icons;
extern int kbd_req_capture;
extern int hide_status_bar;
extern int hide_tool_bar;
extern int fullscreen_ui_visible;
/* System-related functions. */
extern FILE *plat_fopen(const char *path, const char *mode);

View File

@@ -8,9 +8,11 @@
*
* Definitions for AC'97 audio emulation.
*
*
*
* Authors: RichardG, <richardg867@gmail.com>
*
* Copyright 2021 RichardG.
* Copyright 2021-2025 RichardG.
*/
#ifndef SOUND_AC97_H
#define SOUND_AC97_H
@@ -19,23 +21,26 @@
/* Misc support bits (misc_flags). Most of these are not part of any
registers, but control enabling/disabling of registers and bits. */
#define AC97_MASTER_6B (1 << 0) /* register 02 bits [13,5] (ML5/MR5) */
#define AC97_AUXOUT (1 << 1) /* register 04 */
#define AC97_AUXOUT_6B (1 << 2) /* register 04 bits [13,5] (ML5/MR5) */
#define AC97_MONOOUT (1 << 3) /* register 06 */
#define AC97_MONOOUT_6B (1 << 4) /* register 06 bit 5 (MM5) */
#define AC97_PCBEEP (1 << 5) /* register 0A */
#define AC97_PCBEEP_GEN (1 << 6) /* register 0A bits [12:5] (F[7:0]) */
#define AC97_PHONE (1 << 9) /* register 0C */
#define AC97_VIDEO (1 << 10) /* register 14 */
#define AC97_AUXIN (1 << 11) /* register 16 */
#define AC97_AUDIO (1 << 0) /* audio codec */
#define AC97_MODEM (1 << 1) /* modem codec */
#define AC97_MASTER_6B (1 << 2) /* register 02 bits [13,5] (ML5/MR5) */
#define AC97_AUXOUT (1 << 3) /* register 04 */
#define AC97_AUXOUT_6B (1 << 4) /* register 04 bits [13,5] (ML5/MR5) */
#define AC97_MONOOUT (1 << 5) /* register 06 */
#define AC97_MONOOUT_6B (1 << 6) /* register 06 bit 5 (MM5) */
#define AC97_PCBEEP (1 << 9) /* register 0A */
#define AC97_PCBEEP_GEN (1 << 10) /* register 0A bits [12:5] (F[7:0]) */
#define AC97_PHONE (1 << 11) /* register 0C */
#define AC97_VIDEO (1 << 12) /* register 14 */
#define AC97_AUXIN (1 << 13) /* register 16 */
#define AC97_POP (1 << 15) /* register 20 bit 15 (POP) - definition shared with General Purpose bits */
#define AC97_MS (1 << 8) /* register 20 bit 8 (MS) - definition shared with General Purpose bits */
#define AC97_LPBK (1 << 7) /* register 20 bit 7 (LPBK) - definition shared with General Purpose bits */
#define AC97_DSA (1 << 12) /* register 28 bits [5:4] (DSA[1:0]) */
#define AC97_LFE_6B (1 << 13) /* register 36 bit 13 (LFE5) */
#define AC97_CENTER_6B (1 << 14) /* register 36 bit 5 (CNT5) */
#define AC97_SURR_6B (1 << 16) /* register 38 bits [13,5] (LSR5/RSR5) */
#define AC97_DSA (1 << 14) /* register 28 bits [5:4] (DSA[1:0]) */
#define AC97_LFE_6B (1 << 16) /* register 36 bit 13 (LFE5) */
#define AC97_CENTER_6B (1 << 17) /* register 36 bit 5 (CNT5) */
#define AC97_SURR_6B (1 << 18) /* register 38 bits [13,5] (LSR5/RSR5) */
#define AC97_GAIN_3B (1 << 19) /* registers [1C:1E] (audio) or [46:4A] (modem) bits [8,0] are always 0 (spec violation?) if this is set */
/* Reset bits (reset_flags), register 00. */
#define AC97_MICPCM (1 << 0)
@@ -89,6 +94,14 @@
#define AC97_PRK (1 << 13)
#define AC97_PRL (1 << 14)
/* Extended Modem ID bits, register 3C. */
#define AC97_LIN1 (1 << 0)
#define AC97_LIN2 (1 << 1)
#define AC97_HSET (1 << 2)
#define AC97_CID1 (1 << 3)
#define AC97_CID2 (1 << 4)
#define AC97_CIDR (1 << 7) /* special case: not part of register 3C, but rather 56 bit 13 */
/* Codec IDs. */
#define AC97_CODEC_AD1881 AC97_VENDOR_ID('A', 'D', 'S', 0x40)
#define AC97_CODEC_AK4540 AC97_VENDOR_ID('A', 'D', 'S', 0x40)
@@ -100,6 +113,7 @@
#define AC97_CODEC_TR28023 AC97_VENDOR_ID('T', 'R', 'A', 0x03)
#define AC97_CODEC_W83971D AC97_VENDOR_ID('W', 'E', 'C', 0x01)
#define AC97_CODEC_WM9701A AC97_VENDOR_ID('W', 'M', 'L', 0x00)
#define AC97_CODEC_SI3036 AC97_VENDOR_ID('S', 'I', 'L', 0x22)
typedef struct ac97_vendor_reg_t {
uint8_t page; /* for paged registers [60:6F], 0 otherwise */
@@ -115,6 +129,8 @@ typedef struct ac97_codec_t {
uint8_t vendor_reg_page_max;
const ac97_vendor_reg_t *vendor_regs;
uint16_t *vendor_reg_pages;
uint16_t gpi;
uint16_t gpo;
} ac97_codec_t;
extern uint16_t ac97_codec_readw(ac97_codec_t *dev, uint8_t reg);
@@ -122,22 +138,21 @@ extern void ac97_codec_writew(ac97_codec_t *dev, uint8_t reg, uint16_
extern void ac97_codec_reset(void *priv);
extern void ac97_codec_getattn(void *priv, uint8_t reg, int *l, int *r);
extern uint32_t ac97_codec_getrate(void *priv, uint8_t reg);
extern void ac97_codec_setgpi(void *priv, uint16_t gpi);
extern void ac97_codec_setgpo(void *priv, uint16_t gpo);
extern const device_t *ac97_codec_get(uint32_t id);
extern void ac97_via_set_slot(void *priv, int slot, int irq_pin);
extern uint8_t ac97_via_read_status(void *priv, uint8_t modem);
extern void ac97_via_write_control(void *priv, uint8_t modem, uint8_t val);
extern uint8_t ac97_via_read_status(void *priv);
extern void ac97_via_write_control(void *priv, uint8_t val);
extern void ac97_via_remap_audio_sgd(void *priv, uint16_t new_io_base, uint8_t enable);
extern void ac97_via_remap_modem_sgd(void *priv, uint16_t new_io_base, uint8_t enable);
extern void ac97_via_remap_audio_codec(void *priv, uint16_t new_io_base, uint8_t enable);
extern void ac97_via_remap_modem_codec(void *priv, uint16_t new_io_base, uint8_t enable);
extern ac97_codec_t **ac97_codec;
extern ac97_codec_t **ac97_modem_codec;
extern int ac97_codec_count;
extern int ac97_modem_codec_count;
extern int ac97_codec_id;
extern int ac97_modem_codec_id;
#ifdef EMU_DEVICE_H
extern const device_t ad1881_device;
@@ -151,6 +166,9 @@ extern const device_t stac9721_device;
extern const device_t tr28023_device;
extern const device_t w83971d_device;
extern const device_t wm9701a_device;
#ifdef USE_SOFTMODEM
extern const device_t si3036_device;
#endif
extern const device_t ac97_via_device;
#endif

View File

@@ -22,11 +22,12 @@
enum {
AD1848_TYPE_DEFAULT = 0,
AD1848_TYPE_CS4248 = 1,
AD1848_TYPE_CS4231 = 2,
AD1848_TYPE_CS4232 = 3,
AD1848_TYPE_CS4236 = 4,
AD1848_TYPE_CS4236B = 5,
AD1848_TYPE_CS4235 = 6
AD1848_TYPE_OPTI930 = 2,
AD1848_TYPE_CS4231 = 3,
AD1848_TYPE_CS4232 = 4,
AD1848_TYPE_CS4236 = 5,
AD1848_TYPE_CS4236B = 6,
AD1848_TYPE_CS4235 = 7
};
enum {
@@ -44,6 +45,7 @@ typedef struct ad1848_t {
uint8_t regs[32];
uint8_t xregs[32];
uint8_t status; /* 16 original registers + 16 CS4231A extensions + 32 CS4236 extensions */
uint8_t opti930_mode2;
int count;
uint8_t trd;

View File

@@ -222,6 +222,9 @@ extern const device_t entertainer_device;
/* Mindscape Music Board */
extern const device_t mmb_device;
/* OPTi 82c930 */
extern const device_t opti_82c930_device;
/* Pro Audio Spectrum Plus, 16, and 16D */
extern const device_t pasplus_device;
extern const device_t pas16_device;

View File

@@ -29,6 +29,7 @@
# define FLAG_512K_MASK 512
# define FLAG_NO_SHIFT3 1024 /* Needed for Bochs VBE. */
# define FLAG_PRECISETIME 2048 /* Needed for Copper demo if on dynarec. */
# define FLAG_PANNING_ATI 4096
struct monitor_t;
typedef struct hwcursor_t {
@@ -136,6 +137,7 @@ typedef struct svga_t {
int ps_bit_bug;
int ati_4color;
int vblankend;
int panning_blank;
int render_line_offset;
int start_retrace_latch;
int vga_mode;

View File

@@ -29,13 +29,6 @@
#define TEX_CACHE_MAX 64
#ifdef __cplusplus
# include <atomic>
using atomic_int = std::atomic<int>;
#else
# include <stdatomic.h>
#endif
enum {
VOODOO_1 = 0,
VOODOO_SB50,
@@ -230,8 +223,8 @@ typedef struct voodoo_params_t {
typedef struct texture_t {
uint32_t base;
uint32_t tLOD;
atomic_int refcount;
atomic_int refcount_r[4];
ATOMIC_INT refcount;
ATOMIC_INT refcount_r[4];
int is16;
uint32_t palette_checksum;
uint32_t addr_start[4];
@@ -400,16 +393,16 @@ typedef struct voodoo_t {
int type;
fifo_entry_t fifo[FIFO_SIZE];
atomic_int fifo_read_idx;
atomic_int fifo_write_idx;
atomic_int cmd_read;
atomic_int cmd_written;
atomic_int cmd_written_fifo;
atomic_int cmd_written_fifo_2;
ATOMIC_INT fifo_read_idx;
ATOMIC_INT fifo_write_idx;
ATOMIC_INT cmd_read;
ATOMIC_INT cmd_written;
ATOMIC_INT cmd_written_fifo;
ATOMIC_INT cmd_written_fifo_2;
voodoo_params_t params_buffer[PARAM_SIZE];
atomic_int params_read_idx[4];
atomic_int params_write_idx;
ATOMIC_INT params_read_idx[4];
ATOMIC_INT params_write_idx;
uint32_t cmdfifo_base;
uint32_t cmdfifo_end;
@@ -418,9 +411,9 @@ typedef struct voodoo_t {
int cmdfifo_ret_addr;
int cmdfifo_in_sub;
int cmdfifo_in_agp;
atomic_int cmdfifo_depth_rd;
atomic_int cmdfifo_depth_wr;
atomic_int cmdfifo_enabled;
ATOMIC_INT cmdfifo_depth_rd;
ATOMIC_INT cmdfifo_depth_wr;
ATOMIC_INT cmdfifo_enabled;
uint32_t cmdfifo_amin;
uint32_t cmdfifo_amax;
int cmdfifo_holecount;
@@ -432,14 +425,14 @@ typedef struct voodoo_t {
int cmdfifo_ret_addr_2;
int cmdfifo_in_sub_2;
int cmdfifo_in_agp_2;
atomic_int cmdfifo_depth_rd_2;
atomic_int cmdfifo_depth_wr_2;
atomic_int cmdfifo_enabled_2;
ATOMIC_INT cmdfifo_depth_rd_2;
ATOMIC_INT cmdfifo_depth_wr_2;
ATOMIC_INT cmdfifo_enabled_2;
uint32_t cmdfifo_amin_2;
uint32_t cmdfifo_amax_2;
int cmdfifo_holecount_2;
atomic_uint cmd_status, cmd_status_2;
ATOMIC_UINT cmd_status, cmd_status_2;
uint32_t sSetupMode;
vert_t verts[4];