mirror of
https://github.com/86Box/86Box.git
synced 2026-02-24 02:18:20 -07:00
Merge branch 'master' into pc98x1
This commit is contained in:
2
.github/workflows/cmake_linux.yml
vendored
2
.github/workflows/cmake_linux.yml
vendored
@@ -106,7 +106,7 @@ jobs:
|
||||
build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build
|
||||
|
||||
- name: Run sonar-scanner
|
||||
# if: 0
|
||||
if: 0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
|
||||
25
src/device.c
25
src/device.c
@@ -493,14 +493,26 @@ device_get_name(const device_t *dev, int bus, char *name)
|
||||
sbus = (dev->flags & DEVICE_AT) ? "ISA16" : "ISA";
|
||||
else if (dev->flags & DEVICE_CBUS)
|
||||
sbus = "C-BUS";
|
||||
else if (dev->flags & DEVICE_PCMCIA)
|
||||
sbus = "PCMCIA";
|
||||
else if (dev->flags & DEVICE_MCA)
|
||||
sbus = "MCA";
|
||||
else if (dev->flags & DEVICE_HIL)
|
||||
sbus = "HP HIL";
|
||||
else if (dev->flags & DEVICE_EISA)
|
||||
sbus = "EISA";
|
||||
else if (dev->flags & DEVICE_AT32)
|
||||
sbus = "AT/32";
|
||||
else if (dev->flags & DEVICE_OLB)
|
||||
sbus = "OLB";
|
||||
else if (dev->flags & DEVICE_VLB)
|
||||
sbus = "VLB";
|
||||
else if (dev->flags & DEVICE_PCI)
|
||||
sbus = "PCI";
|
||||
else if (dev->flags & DEVICE_CARDBUS)
|
||||
sbus = "CARDBUS";
|
||||
else if (dev->flags & DEVICE_USB)
|
||||
sbus = "USB";
|
||||
else if (dev->flags & DEVICE_AGP)
|
||||
sbus = "AGP";
|
||||
else if (dev->flags & DEVICE_AC97)
|
||||
@@ -767,13 +779,16 @@ device_is_valid(const device_t *device, int m)
|
||||
if ((device->flags & DEVICE_ATKBC) && !machine_has_bus(m, MACHINE_BUS_ISA16) && !machine_has_bus(m, MACHINE_BUS_DM_KBC))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_PS2) && !machine_has_bus(m, MACHINE_BUS_PS2_PORTS))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_ISA) && !machine_has_bus(m, MACHINE_BUS_ISA))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_CBUS) && !machine_has_bus(m, MACHINE_BUS_CBUS))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_PCMCIA) && !machine_has_bus(m, MACHINE_BUS_PCMCIA))
|
||||
if ((device->flags & DEVICE_PCMCIA) && !machine_has_bus(m, MACHINE_BUS_PCMCIA) && !machine_has_bus(m, MACHINE_BUS_ISA))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_MCA) && !machine_has_bus(m, MACHINE_BUS_MCA))
|
||||
@@ -785,6 +800,9 @@ device_is_valid(const device_t *device, int m)
|
||||
if ((device->flags & DEVICE_EISA) && !machine_has_bus(m, MACHINE_BUS_EISA))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_AT32) && !machine_has_bus(m, MACHINE_BUS_AT32))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_OLB) && !machine_has_bus(m, MACHINE_BUS_OLB))
|
||||
return 0;
|
||||
|
||||
@@ -794,7 +812,7 @@ device_is_valid(const device_t *device, int m)
|
||||
if ((device->flags & DEVICE_PCI) && !machine_has_bus(m, MACHINE_BUS_PCI))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_CARDBUS) && !machine_has_bus(m, MACHINE_BUS_CARDBUS))
|
||||
if ((device->flags & DEVICE_CARDBUS) && !machine_has_bus(m, MACHINE_BUS_CARDBUS) && !machine_has_bus(m, MACHINE_BUS_PCI))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_USB) && !machine_has_bus(m, MACHINE_BUS_USB))
|
||||
@@ -803,9 +821,6 @@ device_is_valid(const device_t *device, int m)
|
||||
if ((device->flags & DEVICE_AGP) && !machine_has_bus(m, MACHINE_BUS_AGP))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_PS2) && !machine_has_bus(m, MACHINE_BUS_PS2_PORTS))
|
||||
return 0;
|
||||
|
||||
if ((device->flags & DEVICE_AC97) && !machine_has_bus(m, MACHINE_BUS_AC97))
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -458,3 +458,17 @@ const device_t ide_w83769f_pci_34_device = {
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
const device_t ide_w83769f_pci_single_channel_device = {
|
||||
.name = "Winbond W83769F PCI (Single Channel)",
|
||||
.internal_name = "ide_w83769f_pci_single_channel",
|
||||
.flags = DEVICE_PCI,
|
||||
.local = 0x200b4,
|
||||
.init = w83769f_init,
|
||||
.close = w83769f_close,
|
||||
.reset = w83769f_reset,
|
||||
{ .available = NULL },
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
|
||||
@@ -89,6 +89,7 @@ extern const device_t ide_w83769f_vlb_device; /* Winbond W8376
|
||||
extern const device_t ide_w83769f_vlb_34_device; /* Winbond W83769F VLB (Port 34h) */
|
||||
extern const device_t ide_w83769f_pci_device; /* Winbond W83769F PCI */
|
||||
extern const device_t ide_w83769f_pci_34_device; /* Winbond W83769F PCI (Port 34h) */
|
||||
extern const device_t ide_w83769f_pci_single_channel_device; /* Winbond W83769F PCI (Only primary channel) */
|
||||
|
||||
extern const device_t ide_ter_device;
|
||||
extern const device_t ide_ter_pnp_device;
|
||||
|
||||
@@ -641,6 +641,7 @@ extern int machine_at_valuepointp60_init(const machine_t *);
|
||||
extern int machine_at_revenge_init(const machine_t *);
|
||||
extern int machine_at_586is_init(const machine_t *);
|
||||
extern int machine_at_pb520r_init(const machine_t *);
|
||||
extern int machine_at_m5pi_init(const machine_t *);
|
||||
|
||||
extern int machine_at_excalibur_init(const machine_t *);
|
||||
|
||||
|
||||
@@ -11,9 +11,11 @@
|
||||
* Authors: Sarah Walker, <https://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* TheCollector1995, <mariogplayer@gmail.com>
|
||||
* Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
*
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
* Copyright 2024-2025 Jasmine Iwanek.
|
||||
*/
|
||||
|
||||
#ifndef SOUND_SND_SB_H
|
||||
@@ -196,6 +198,12 @@ typedef struct sb_t {
|
||||
void (*opl_mix)(void*, double*, double*);
|
||||
} sb_t;
|
||||
|
||||
typedef struct goldfinch_t {
|
||||
emu8k_t emu8k;
|
||||
|
||||
uint8_t pnp_rom[512];
|
||||
} goldfinch_t;
|
||||
|
||||
extern void sb_ct1345_mixer_write(uint16_t addr, uint8_t val, void *priv);
|
||||
extern uint8_t sb_ct1345_mixer_read(uint16_t addr, void *priv);
|
||||
extern void sb_ct1345_mixer_reset(sb_t *sb);
|
||||
|
||||
@@ -158,6 +158,7 @@ extern const device_t sb_16_pnp_ide_device;
|
||||
extern const device_t sb_16_compat_device;
|
||||
extern const device_t sb_16_compat_nompu_device;
|
||||
extern const device_t sb_16_reply_mca_device;
|
||||
extern const device_t sb_goldfinch_device;
|
||||
extern const device_t sb_32_pnp_device;
|
||||
extern const device_t sb_awe32_device;
|
||||
extern const device_t sb_awe32_pnp_device;
|
||||
|
||||
@@ -354,6 +354,36 @@ machine_at_pb520r_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
machine_at_m5pi_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bios_load_linear_inverted("roms/machines/m5pi/M5PI10R.BIN",
|
||||
0x000e0000, 131072, 0);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
|
||||
machine_at_common_init(model);
|
||||
|
||||
pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING);
|
||||
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x0f, PCI_CARD_NORMAL, 1, 2, 3, 4);
|
||||
pci_register_slot(0x0c, PCI_CARD_NORMAL, 2, 3, 4, 1);
|
||||
pci_register_slot(0x0b, PCI_CARD_NORMAL, 3, 4, 1, 2);
|
||||
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
|
||||
device_add(&i430lx_device);
|
||||
device_add(&sio_zb_device);
|
||||
device_add(&keyboard_ps2_phoenix_device);
|
||||
device_add(&ide_w83769f_pci_single_channel_device);
|
||||
device_add(&fdc37c665_ide_sec_device);
|
||||
device_add(&intel_flash_bxt_ami_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
machine_at_excalibur_init(const machine_t *model)
|
||||
{
|
||||
|
||||
@@ -9366,6 +9366,46 @@ const machine_t machines[] = {
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
/* The M5Pi appears to have a Phoenix MultiKey KBC firmware according to photos. */
|
||||
{
|
||||
.name = "[i430LX] Micronics M5Pi",
|
||||
.internal_name = "m5pi",
|
||||
.type = MACHINE_TYPE_SOCKET4,
|
||||
.chipset = MACHINE_CHIPSET_INTEL_430LX,
|
||||
.init = machine_at_m5pi_init,
|
||||
.p1_handler = NULL,
|
||||
.gpio_handler = NULL,
|
||||
.available_flag = MACHINE_AVAILABLE,
|
||||
.gpio_acpi_handler = NULL,
|
||||
.cpu = {
|
||||
.package = CPU_PKG_SOCKET4,
|
||||
.block = CPU_BLOCK_NONE,
|
||||
.min_bus = 60000000,
|
||||
.max_bus = 66666667,
|
||||
.min_voltage = 5000,
|
||||
.max_voltage = 5000,
|
||||
.min_multi = MACHINE_MULTIPLIER_FIXED,
|
||||
.max_multi = MACHINE_MULTIPLIER_FIXED
|
||||
},
|
||||
.bus_flags = MACHINE_PCI,
|
||||
.flags = MACHINE_IDE_DUAL | MACHINE_APM,
|
||||
.ram = {
|
||||
.min = 2048,
|
||||
.max = 131072,
|
||||
.step = 2048
|
||||
},
|
||||
.nvrmask = 127,
|
||||
.kbc_device = NULL,
|
||||
.kbc_p1 = 0xff,
|
||||
.gpio = 0xffffffff,
|
||||
.gpio_acpi = 0xffffffff,
|
||||
.device = NULL,
|
||||
.fdc_device = NULL,
|
||||
.sio_device = NULL,
|
||||
.vid_device = NULL,
|
||||
.snd_device = NULL,
|
||||
.net_device = NULL
|
||||
},
|
||||
|
||||
/* OPTi 596/597 */
|
||||
/* This uses an AMI KBC firmware in PS/2 mode (it sends command A5 with the
|
||||
|
||||
@@ -163,8 +163,7 @@ kbd_handle(uint16_t scancode, uint16_t flags)
|
||||
We use scan code 0xFFFF to mean a mapping that
|
||||
has a prefix other than E0 and that is not E1 1D,
|
||||
which is, for our purposes, invalid. */
|
||||
|
||||
/* Translate right CTRL to left ALT if the user has so
|
||||
/* Translate right CTRL to left ALT if the user has so
|
||||
chosen. */
|
||||
if ((scancode == 0x11d) && rctrl_is_lalt)
|
||||
scancode = 0x038;
|
||||
@@ -173,18 +172,8 @@ kbd_handle(uint16_t scancode, uint16_t flags)
|
||||
it's not an invalid scan code. */
|
||||
if (scancode != 0xFFFF)
|
||||
keyboard_input(!(flags & LLKHF_UP), scancode);
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK
|
||||
input_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LPKBDLLHOOKSTRUCT lpKdhs = (LPKBDLLHOOKSTRUCT) lParam;
|
||||
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
|
||||
main_window->checkFullscreenHotkey();
|
||||
|
||||
return CallNextHookEx(NULL, nCode, wParam, lParam);
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK
|
||||
@@ -194,44 +183,38 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
|
||||
/* Checks if CTRL was pressed. */
|
||||
BOOL bCtrlDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);
|
||||
|
||||
if ((GetForegroundWindow() == ((HWND) main_window->winId())) && !(lpKdhs->scanCode & 0xff00))
|
||||
kbd_handle(lpKdhs->scanCode, lpKdhs->flags);
|
||||
|
||||
if ((nCode < 0) || (nCode != HC_ACTION) || (!mouse_capture && !video_fullscreen))
|
||||
return CallNextHookEx(NULL, nCode, wParam, lParam);
|
||||
else if ((lpKdhs->scanCode == 0x01) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
|
||||
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) {
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
|
||||
return TRUE;
|
||||
} else if ((lpKdhs->scanCode == 0x01) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) {
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
else if ((lpKdhs->scanCode == 0x01) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
|
||||
return TRUE;
|
||||
} else if ((lpKdhs->scanCode == 0x0f) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
|
||||
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) {
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
else if ((lpKdhs->scanCode == 0x0f) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
|
||||
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
|
||||
return TRUE;
|
||||
} else if ((lpKdhs->scanCode == 0x0f) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) {
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
else if ((lpKdhs->scanCode == 0x0f) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
|
||||
return TRUE;
|
||||
} else if ((lpKdhs->scanCode == 0x39) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
|
||||
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) {
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
else if ((lpKdhs->scanCode == 0x39) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
|
||||
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
|
||||
return TRUE;
|
||||
} else if ((lpKdhs->scanCode == 0x3e) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
|
||||
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) {
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
else if ((lpKdhs->scanCode == 0x3e) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
|
||||
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
|
||||
return TRUE;
|
||||
} else if ((lpKdhs->scanCode == 0x49) && bCtrlDown && !(lpKdhs->flags & LLKHF_UP)) {
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
else if ((lpKdhs->scanCode == 0x49) && bCtrlDown && !(lpKdhs->flags & LLKHF_UP))
|
||||
return TRUE;
|
||||
} else if ((lpKdhs->scanCode >= 0x5b) && (lpKdhs->scanCode <= 0x5d) && (lpKdhs->flags & LLKHF_EXTENDED)) {
|
||||
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
|
||||
else if ((lpKdhs->scanCode >= 0x5b) && (lpKdhs->scanCode <= 0x5d) && (lpKdhs->flags & LLKHF_EXTENDED))
|
||||
return TRUE;
|
||||
} else
|
||||
else
|
||||
return CallNextHookEx(NULL, nCode, wParam, lParam);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_WINDOWS
|
||||
static HHOOK llhook = NULL;
|
||||
static HHOOK llihook = NULL;
|
||||
#endif
|
||||
|
||||
void
|
||||
@@ -494,12 +477,17 @@ main(int argc, char *argv[])
|
||||
});
|
||||
}
|
||||
|
||||
/* Force raw input if a debugger is present. */
|
||||
if (IsDebuggerPresent()) {
|
||||
pclog("WARNING: Debugged detected, forcing raw input\n");
|
||||
raw_input = 1;
|
||||
}
|
||||
|
||||
/* Setup raw input */
|
||||
auto rawInputFilter = WindowsRawInputFilter::Register(main_window);
|
||||
if (rawInputFilter) {
|
||||
app.installNativeEventFilter(rawInputFilter.get());
|
||||
if (raw_input)
|
||||
main_window->setSendKeyboardInput(false);
|
||||
main_window->setSendKeyboardInput(false);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -561,10 +549,7 @@ main(int argc, char *argv[])
|
||||
#ifdef Q_OS_WINDOWS
|
||||
if (!raw_input) {
|
||||
llhook = SetWindowsHookEx(WH_KEYBOARD_LL, emu_LowLevelKeyboardProc, NULL, 0);
|
||||
llihook = SetWindowsHookEx(WH_KEYBOARD_LL, input_LowLevelKeyboardProc, NULL, GetCurrentThreadId());
|
||||
atexit([] () -> void {
|
||||
if (llihook)
|
||||
UnhookWindowsHookEx(llihook);
|
||||
if (llhook)
|
||||
UnhookWindowsHookEx(llhook);
|
||||
});
|
||||
|
||||
@@ -1,23 +1,21 @@
|
||||
/*
|
||||
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||
* running old operating systems and software designed for IBM
|
||||
* PC systems and compatibles from 1981 through fairly recent
|
||||
* system designs based on the PCI bus.
|
||||
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
||||
* running old operating systems and software designed for IBM
|
||||
* PC systems and compatibles from 1981 through fairly recent
|
||||
* system designs based on the PCI bus.
|
||||
*
|
||||
* This file is part of the 86Box distribution.
|
||||
* This file is part of the 86Box distribution.
|
||||
*
|
||||
* Sound Blaster emulation.
|
||||
* Sound Blaster emulation.
|
||||
*
|
||||
* Authors: Sarah Walker, <https://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* TheCollector1995, <mariogplayer@gmail.com>
|
||||
* Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
*
|
||||
*
|
||||
* Authors: Sarah Walker, <https://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* TheCollector1995, <mariogplayer@gmail.com>
|
||||
* Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
*
|
||||
* Copyright 2008-2020 Sarah Walker.
|
||||
* Copyright 2016-2020 Miran Grca.
|
||||
* Copyright 2024 Jasmine Iwanek.
|
||||
* Copyright 2008-2020 Sarah Walker.
|
||||
* Copyright 2016-2020 Miran Grca.
|
||||
* Copyright 2024-2025 Jasmine Iwanek.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
@@ -64,6 +62,7 @@
|
||||
#define PNP_ROM_SB_VIBRA16C "roms/sound/creative/CT4180 PnP.BIN"
|
||||
#define PNP_ROM_SB_VIBRA16CL "roms/sound/creative/CT4100 PnP.BIN"
|
||||
#define PNP_ROM_SB_VIBRA16XV "roms/sound/creative/CT4170 PnP.BIN"
|
||||
#define PNP_ROM_SB_GOLDFINCH "roms/sound/creative/CT1920 PnP.BIN"
|
||||
#define PNP_ROM_SB_32_PNP "roms/sound/creative/CT3600 PnP.BIN"
|
||||
#define PNP_ROM_SB_AWE32_PNP "roms/sound/creative/CT3980 PnP.BIN"
|
||||
#define PNP_ROM_SB_AWE64_VALUE "roms/sound/creative/CT4520 PnP.BIN"
|
||||
@@ -509,6 +508,28 @@ sb_get_music_buffer_sb16_awe32(int32_t *buffer, const int len, void *priv)
|
||||
sb->opl.reset_buffer(sb->opl.priv);
|
||||
}
|
||||
|
||||
// TODO: Goldfinch
|
||||
static void
|
||||
sb_get_wavetable_buffer_goldfinch(int32_t *buffer, const int len, void *priv)
|
||||
{
|
||||
goldfinch_t *goldfinch = (goldfinch_t *) priv;
|
||||
|
||||
emu8k_update(&goldfinch->emu8k);
|
||||
|
||||
for (int c = 0; c < len * 2; c += 2) {
|
||||
double out_l = 0.0;
|
||||
double out_r = 0.0;
|
||||
|
||||
out_l += ((double) goldfinch->emu8k.buffer[c]);
|
||||
out_r += ((double) goldfinch->emu8k.buffer[c + 1]);
|
||||
|
||||
buffer[c] += (int32_t) out_l;
|
||||
buffer[c + 1] += (int32_t) out_r;
|
||||
}
|
||||
|
||||
goldfinch->emu8k.pos = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
sb_get_wavetable_buffer_sb16_awe32(int32_t *buffer, const int len, void *priv)
|
||||
{
|
||||
@@ -2217,6 +2238,21 @@ sb_vibra16_pnp_config_changed(const uint8_t ld, isapnp_device_config_t *config,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
goldfinch_pnp_config_changed(const uint8_t ld, isapnp_device_config_t *config, void *priv)
|
||||
{
|
||||
goldfinch_t *goldfinch = (goldfinch_t *) priv;
|
||||
|
||||
switch (ld) {
|
||||
default:
|
||||
break;
|
||||
|
||||
case 0: /* WaveTable */
|
||||
emu8k_change_addr(&goldfinch->emu8k, (config->activate && (config->io[0].base != ISAPNP_IO_DISABLED)) ? config->io[0].base : 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
sb_awe32_pnp_config_changed(const uint8_t ld, isapnp_device_config_t *config, void *priv)
|
||||
{
|
||||
@@ -3550,6 +3586,12 @@ sb_awe32_available(void)
|
||||
return rom_present(EMU8K_ROM_PATH);
|
||||
}
|
||||
|
||||
static int
|
||||
sb_goldfinch_available(void)
|
||||
{
|
||||
return sb_awe32_available() && rom_present(PNP_ROM_SB_GOLDFINCH);
|
||||
}
|
||||
|
||||
static int
|
||||
sb_32_pnp_available(void)
|
||||
{
|
||||
@@ -3659,6 +3701,54 @@ sb_awe32_init(UNUSED(const device_t *info))
|
||||
return sb;
|
||||
}
|
||||
|
||||
static void *
|
||||
sb_goldfinch_init(const device_t *info)
|
||||
{
|
||||
goldfinch_t *goldfinch = malloc(sizeof(goldfinch_t));
|
||||
int onboard_ram = device_get_config_int("onboard_ram");
|
||||
|
||||
memset(goldfinch, 0x00, sizeof(goldfinch_t));
|
||||
|
||||
wavetable_add_handler(sb_get_wavetable_buffer_goldfinch, goldfinch);
|
||||
|
||||
emu8k_init(&goldfinch->emu8k, 0, onboard_ram);
|
||||
|
||||
const char *pnp_rom_file = NULL;
|
||||
switch (info->local) {
|
||||
case 0:
|
||||
pnp_rom_file = PNP_ROM_SB_GOLDFINCH;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
uint8_t *pnp_rom = NULL;
|
||||
if (pnp_rom_file) {
|
||||
FILE *fp = rom_fopen(pnp_rom_file, "rb");
|
||||
uint16_t pnp_rom_len = 256;
|
||||
if (fp) {
|
||||
if (fread(goldfinch->pnp_rom, 1, pnp_rom_len, fp) == pnp_rom_len)
|
||||
pnp_rom = goldfinch->pnp_rom;
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
switch (info->local) {
|
||||
case 0:
|
||||
isapnp_add_card(pnp_rom, sizeof(goldfinch->pnp_rom), goldfinch_pnp_config_changed,
|
||||
NULL, NULL, NULL, goldfinch);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
emu8k_change_addr(&goldfinch->emu8k, 0);
|
||||
|
||||
return goldfinch;
|
||||
}
|
||||
|
||||
static void *
|
||||
sb_awe32_pnp_init(const device_t *info)
|
||||
{
|
||||
@@ -4054,6 +4144,16 @@ sb_close(void *priv)
|
||||
free(sb);
|
||||
}
|
||||
|
||||
static void
|
||||
sb_goldfinch_close(void *priv)
|
||||
{
|
||||
goldfinch_t *goldfinch = (goldfinch_t *) priv;
|
||||
|
||||
emu8k_close(&goldfinch->emu8k);
|
||||
|
||||
free(goldfinch);
|
||||
}
|
||||
|
||||
static void
|
||||
sb_awe32_close(void *priv)
|
||||
{
|
||||
@@ -4765,6 +4865,54 @@ static const device_config_t sb_16_pnp_config[] = {
|
||||
{ .name = "", .description = "", .type = CONFIG_END }
|
||||
};
|
||||
|
||||
static const device_config_t sb_goldfinch_config[] = {
|
||||
{
|
||||
.name = "onboard_ram",
|
||||
.description = "Memory size",
|
||||
.type = CONFIG_SELECTION,
|
||||
.default_string = "",
|
||||
.default_int = 0,
|
||||
.file_filter = "",
|
||||
.spinner = { 0 },
|
||||
.selection = {
|
||||
{
|
||||
.description = "None",
|
||||
.value = 0
|
||||
},
|
||||
{
|
||||
.description = "512 KB",
|
||||
.value = 512
|
||||
},
|
||||
{
|
||||
.description = "1 MB",
|
||||
.value = 1024
|
||||
},
|
||||
{
|
||||
.description = "2 MB",
|
||||
.value = 2048
|
||||
},
|
||||
{
|
||||
.description = "4 MB",
|
||||
.value = 4096
|
||||
},
|
||||
{
|
||||
.description = "8 MB",
|
||||
.value = 8192
|
||||
},
|
||||
{
|
||||
.description = "16 MB",
|
||||
.value = 16384
|
||||
},
|
||||
{
|
||||
.description = "28 MB",
|
||||
.value = 28672
|
||||
},
|
||||
{ .description = "" }
|
||||
}
|
||||
},
|
||||
{ .name = "", .description = "", .type = CONFIG_END }
|
||||
};
|
||||
|
||||
static const device_config_t sb_32_pnp_config[] = {
|
||||
{
|
||||
.name = "onboard_ram",
|
||||
@@ -5922,6 +6070,20 @@ const device_t sb_16_compat_nompu_device = {
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
const device_t sb_goldfinch_device = {
|
||||
.name = "Creative EMU8000 PnP (Goldfinch)",
|
||||
.internal_name = "sb_goldfinch",
|
||||
.flags = DEVICE_ISA | DEVICE_AT,
|
||||
.local = 0,
|
||||
.init = sb_goldfinch_init,
|
||||
.close = sb_goldfinch_close,
|
||||
.reset = NULL,
|
||||
.available = sb_goldfinch_available,
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = sb_goldfinch_config
|
||||
};
|
||||
|
||||
const device_t sb_32_pnp_device = {
|
||||
.name = "Sound Blaster 32 PnP",
|
||||
.internal_name = "sb32_pnp",
|
||||
|
||||
@@ -123,6 +123,7 @@ static const SOUND_CARD sound_cards[] = {
|
||||
{ &sb_16_device },
|
||||
{ &sb_16_pnp_device },
|
||||
{ &sb_16_pnp_ide_device },
|
||||
{ &sb_goldfinch_device },
|
||||
{ &sb_32_pnp_device },
|
||||
{ &sb_awe32_device },
|
||||
{ &sb_awe32_pnp_device },
|
||||
|
||||
Reference in New Issue
Block a user