CMI8x38 megacommit
This commit is contained in:
@@ -613,6 +613,9 @@ extern int machine_at_s370sba_init(const machine_t *);
|
||||
extern int machine_at_apas3_init(const machine_t *);
|
||||
extern int machine_at_gt694va_init(const machine_t *);
|
||||
extern int machine_at_cuv4xls_init(const machine_t *);
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t *at_cuv4xls_get_device(void);
|
||||
#endif
|
||||
extern int machine_at_6via90ap_init(const machine_t *);
|
||||
extern int machine_at_s1857_init(const machine_t *);
|
||||
extern int machine_at_p6bap_init(const machine_t *);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#ifndef EMU_SOUND_MIDI_H
|
||||
# define EMU_SOUND_MIDI_H
|
||||
|
||||
#define EMU_SOUND_MIDI_H
|
||||
|
||||
#define SYSEX_SIZE 8192
|
||||
|
||||
@@ -14,34 +13,31 @@ extern void (*input_msg)(void *p, uint8_t *msg, uint32_t len);
|
||||
extern int (*input_sysex)(void *p, uint8_t *buf, uint32_t len, int abort);
|
||||
extern void *midi_in_p;
|
||||
|
||||
extern int midi_device_available(int card);
|
||||
extern int midi_in_device_available(int card);
|
||||
extern int midi_device_available(int card);
|
||||
extern int midi_in_device_available(int card);
|
||||
#ifdef EMU_DEVICE_H
|
||||
const device_t *midi_device_getdevice(int card);
|
||||
const device_t *midi_in_device_getdevice(int card);
|
||||
#endif
|
||||
extern int midi_device_has_config(int card);
|
||||
extern int midi_in_device_has_config(int card);
|
||||
extern char * midi_device_get_internal_name(int card);
|
||||
extern char * midi_in_device_get_internal_name(int card);
|
||||
extern int midi_device_get_from_internal_name(char *s);
|
||||
extern int midi_in_device_get_from_internal_name(char *s);
|
||||
extern void midi_device_init();
|
||||
extern void midi_in_device_init();
|
||||
extern int midi_device_has_config(int card);
|
||||
extern int midi_in_device_has_config(int card);
|
||||
extern char *midi_device_get_internal_name(int card);
|
||||
extern char *midi_in_device_get_internal_name(int card);
|
||||
extern int midi_device_get_from_internal_name(char *s);
|
||||
extern int midi_in_device_get_from_internal_name(char *s);
|
||||
extern void midi_device_init();
|
||||
extern void midi_in_device_init();
|
||||
|
||||
|
||||
typedef struct midi_device_t
|
||||
{
|
||||
typedef struct midi_device_t {
|
||||
void (*play_sysex)(uint8_t *sysex, unsigned int len);
|
||||
void (*play_msg)(uint8_t *msg);
|
||||
void (*poll)();
|
||||
int (*write)(uint8_t val);
|
||||
} midi_device_t;
|
||||
|
||||
typedef struct midi_in_handler_t
|
||||
{
|
||||
typedef struct midi_in_handler_t {
|
||||
uint8_t *buf;
|
||||
int cnt;
|
||||
int cnt;
|
||||
uint32_t len;
|
||||
|
||||
void (*msg)(void *p, uint8_t *msg, uint32_t len);
|
||||
@@ -50,60 +46,59 @@ typedef struct midi_in_handler_t
|
||||
struct midi_in_handler_t *prev, *next;
|
||||
} midi_in_handler_t;
|
||||
|
||||
typedef struct midi_t
|
||||
{
|
||||
typedef struct midi_t {
|
||||
uint8_t midi_rt_buf[8], midi_cmd_buf[8],
|
||||
midi_status, midi_sysex_data[SYSEX_SIZE];
|
||||
midi_status, midi_sysex_data[SYSEX_SIZE];
|
||||
int midi_cmd_pos, midi_cmd_len, midi_cmd_r,
|
||||
midi_realtime, thruchan, midi_clockout;
|
||||
midi_realtime, thruchan, midi_clockout;
|
||||
unsigned int midi_sysex_start, midi_sysex_delay,
|
||||
midi_pos;
|
||||
midi_device_t *m_out_device, *m_in_device;
|
||||
midi_pos;
|
||||
midi_device_t *m_out_device, *m_in_device;
|
||||
} midi_t;
|
||||
|
||||
extern midi_t *midi, *midi_in;
|
||||
|
||||
extern void midi_init(midi_device_t* device);
|
||||
extern void midi_in_init(midi_device_t* device, midi_t **mididev);
|
||||
extern void midi_close();
|
||||
extern void midi_in_close(void);
|
||||
extern void midi_raw_out_rt_byte(uint8_t val);
|
||||
extern void midi_raw_out_thru_rt_byte(uint8_t val);
|
||||
extern void midi_raw_out_byte(uint8_t val);
|
||||
extern void midi_clear_buffer(void);
|
||||
extern void midi_poll();
|
||||
extern void midi_init(midi_device_t *device);
|
||||
extern void midi_in_init(midi_device_t *device, midi_t **mididev);
|
||||
extern void midi_close();
|
||||
extern void midi_in_close(void);
|
||||
extern void midi_raw_out_rt_byte(uint8_t val);
|
||||
extern void midi_raw_out_thru_rt_byte(uint8_t val);
|
||||
extern void midi_raw_out_byte(uint8_t val);
|
||||
extern void midi_clear_buffer(void);
|
||||
extern void midi_poll();
|
||||
|
||||
extern void midi_in_handler(int set, void (*msg)(void *p, uint8_t *msg, uint32_t len), int (*sysex)(void *p, uint8_t *buffer, uint32_t len, int abort), void *p);
|
||||
extern void midi_in_handlers_clear(void);
|
||||
extern void midi_in_msg(uint8_t *msg, uint32_t len);
|
||||
extern void midi_in_sysex(uint8_t *buffer, uint32_t len);
|
||||
extern void midi_in_handler(int set, void (*msg)(void *p, uint8_t *msg, uint32_t len), int (*sysex)(void *p, uint8_t *buffer, uint32_t len, int abort), void *p);
|
||||
extern void midi_in_handlers_clear(void);
|
||||
extern void midi_in_msg(uint8_t *msg, uint32_t len);
|
||||
extern void midi_in_sysex(uint8_t *buffer, uint32_t len);
|
||||
|
||||
#if 0
|
||||
#ifdef _WIN32
|
||||
#define SYSTEM_MIDI_NAME "Windows MIDI"
|
||||
#define SYSTEM_MIDI_INTERNAL_NAME "windows_midi"
|
||||
# ifdef _WIN32
|
||||
# define SYSTEM_MIDI_NAME "Windows MIDI"
|
||||
# define SYSTEM_MIDI_INTERNAL_NAME "windows_midi"
|
||||
# else
|
||||
# define SYSTEM_MIDI_NAME "System MIDI"
|
||||
# define SYSTEM_MIDI_INTERNAL_NAME "system_midi"
|
||||
# endif
|
||||
#else
|
||||
#define SYSTEM_MIDI_NAME "System MIDI"
|
||||
#define SYSTEM_MIDI_INTERNAL_NAME "system_midi"
|
||||
#endif
|
||||
#else
|
||||
#define SYSTEM_MIDI_NAME "System MIDI"
|
||||
#define SYSTEM_MIDI_INTERNAL_NAME "system_midi"
|
||||
# define SYSTEM_MIDI_NAME "System MIDI"
|
||||
# define SYSTEM_MIDI_INTERNAL_NAME "system_midi"
|
||||
#endif
|
||||
|
||||
#define MIDI_INPUT_NAME "MIDI Input Device"
|
||||
#define MIDI_INPUT_NAME "MIDI Input Device"
|
||||
#define MIDI_INPUT_INTERNAL_NAME "midi_in"
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t rtmidi_device;
|
||||
extern const device_t rtmidi_input_device;
|
||||
#ifdef USE_FLUIDSYNTH
|
||||
# ifdef USE_FLUIDSYNTH
|
||||
extern const device_t fluidsynth_device;
|
||||
#endif
|
||||
#ifdef USE_MUNT
|
||||
# endif
|
||||
# ifdef USE_MUNT
|
||||
extern const device_t mt32_device;
|
||||
extern const device_t cm32l_device;
|
||||
#endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /*EMU_SOUND_MIDI_H*/
|
||||
#endif /*EMU_SOUND_MIDI_H*/
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
#ifndef EMU_SOUND_RTMIDI_H
|
||||
# define EMU_SOUND_RTMIDI_H
|
||||
#define EMU_SOUND_RTMIDI_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int rtmidi_get_num_devs(void);
|
||||
extern void rtmidi_get_dev_name(int num, char *s);
|
||||
extern int rtmidi_in_get_num_devs(void);
|
||||
extern void rtmidi_in_get_dev_name(int num, char *s);
|
||||
extern int rtmidi_get_num_devs(void);
|
||||
extern void rtmidi_get_dev_name(int num, char *s);
|
||||
extern int rtmidi_in_get_num_devs(void);
|
||||
extern void rtmidi_in_get_dev_name(int num, char *s);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -111,6 +111,7 @@ extern char *plat_get_extension(char *s);
|
||||
extern void plat_append_filename(char *dest, const char *s1, const char *s2);
|
||||
extern void plat_put_backslash(char *s);
|
||||
extern void plat_path_slash(char *path);
|
||||
extern void plat_path_normalize(char *path);
|
||||
extern int plat_path_abs(char *path);
|
||||
extern int plat_dir_check(char *path);
|
||||
extern int plat_dir_create(char *path);
|
||||
|
||||
@@ -28,6 +28,7 @@ extern const device_t scsi_lcs6821n_device;
|
||||
extern const device_t scsi_rt1000b_device;
|
||||
extern const device_t scsi_t128_device;
|
||||
extern const device_t scsi_t130b_device;
|
||||
extern const device_t scsi_ls2000_device;
|
||||
#if defined(DEV_BRANCH) && defined(USE_SUMO)
|
||||
extern const device_t scsi_scsiat_device;
|
||||
#endif
|
||||
|
||||
@@ -15,82 +15,81 @@
|
||||
* Copyright 2021 RichardG.
|
||||
*/
|
||||
#ifndef SOUND_AC97_H
|
||||
# define SOUND_AC97_H
|
||||
#define SOUND_AC97_H
|
||||
|
||||
#define AC97_VENDOR_ID(f, s, t, dev) ((((f) & 0xff) << 24) | (((s) & 0xff) << 16) | (((t) & 0xff) << 8) | ((dev) & 0xff))
|
||||
#define AC97_VENDOR_ID(f, s, t, dev) ((((f) &0xff) << 24) | (((s) &0xff) << 16) | (((t) &0xff) << 8) | ((dev) &0xff))
|
||||
|
||||
/* 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_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_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_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) */
|
||||
|
||||
/* Reset bits (reset_flags), register 00. */
|
||||
#define AC97_MICPCM (1 << 0)
|
||||
#define AC97_MODEMLINE (1 << 1)
|
||||
#define AC97_TONECTL (1 << 2)
|
||||
#define AC97_SIMSTEREO (1 << 3)
|
||||
#define AC97_HPOUT (1 << 4)
|
||||
#define AC97_LOUDNESS (1 << 5)
|
||||
#define AC97_DAC_18B (1 << 6)
|
||||
#define AC97_DAC_20B (1 << 7)
|
||||
#define AC97_ADC_18B (1 << 8)
|
||||
#define AC97_ADC_20B (1 << 9)
|
||||
#define AC97_3D_SHIFT 10
|
||||
#define AC97_MICPCM (1 << 0)
|
||||
#define AC97_MODEMLINE (1 << 1)
|
||||
#define AC97_TONECTL (1 << 2)
|
||||
#define AC97_SIMSTEREO (1 << 3)
|
||||
#define AC97_HPOUT (1 << 4)
|
||||
#define AC97_LOUDNESS (1 << 5)
|
||||
#define AC97_DAC_18B (1 << 6)
|
||||
#define AC97_DAC_20B (1 << 7)
|
||||
#define AC97_ADC_18B (1 << 8)
|
||||
#define AC97_ADC_20B (1 << 9)
|
||||
#define AC97_3D_SHIFT 10
|
||||
|
||||
/* Extended Audio ID bits (extid_flags), register 28. */
|
||||
#define AC97_VRA (1 << 0)
|
||||
#define AC97_DRA (1 << 1)
|
||||
#define AC97_SPDIF (1 << 2)
|
||||
#define AC97_VRM (1 << 3)
|
||||
#define AC97_CDAC (1 << 6)
|
||||
#define AC97_SDAC (1 << 7)
|
||||
#define AC97_LDAC (1 << 8)
|
||||
#define AC97_AMAP (1 << 9)
|
||||
#define AC97_REV_2_1 (0 << 10)
|
||||
#define AC97_REV_2_2 (1 << 10)
|
||||
#define AC97_REV_2_3 (2 << 10)
|
||||
#define AC97_REV_MASK (3 << 10)
|
||||
#define AC97_VRA (1 << 0)
|
||||
#define AC97_DRA (1 << 1)
|
||||
#define AC97_SPDIF (1 << 2)
|
||||
#define AC97_VRM (1 << 3)
|
||||
#define AC97_CDAC (1 << 6)
|
||||
#define AC97_SDAC (1 << 7)
|
||||
#define AC97_LDAC (1 << 8)
|
||||
#define AC97_AMAP (1 << 9)
|
||||
#define AC97_REV_2_1 (0 << 10)
|
||||
#define AC97_REV_2_2 (1 << 10)
|
||||
#define AC97_REV_2_3 (2 << 10)
|
||||
#define AC97_REV_MASK (3 << 10)
|
||||
|
||||
/* Volume bits. */
|
||||
#define AC97_MUTE (1 << 15)
|
||||
#define AC97_MUTE_L (1 << 15)
|
||||
#define AC97_MUTE_R (1 << 7)
|
||||
#define AC97_MUTE (1 << 15)
|
||||
#define AC97_MUTE_L (1 << 15)
|
||||
#define AC97_MUTE_R (1 << 7)
|
||||
|
||||
/* General Purpose bits, register 20. */
|
||||
/* POP already defined */
|
||||
#define AC97_ST (1 << 14)
|
||||
#define AC97_3D (1 << 13)
|
||||
#define AC97_LD (1 << 12)
|
||||
#define AC97_DRSS_MASK (3 << 10)
|
||||
#define AC97_MIX (1 << 9)
|
||||
#define AC97_ST (1 << 14)
|
||||
#define AC97_3D (1 << 13)
|
||||
#define AC97_LD (1 << 12)
|
||||
#define AC97_DRSS_MASK (3 << 10)
|
||||
#define AC97_MIX (1 << 9)
|
||||
/* MS already defined */
|
||||
/* LPBK already defined */
|
||||
|
||||
/* Extended Audio Status/Control bits, register 2A. */
|
||||
#define AC97_SPSA_SHIFT 4
|
||||
#define AC97_SPSA_MASK 3
|
||||
#define AC97_MADC (1 << 9)
|
||||
#define AC97_SPCV (1 << 10)
|
||||
#define AC97_PRI (1 << 11)
|
||||
#define AC97_PRJ (1 << 12)
|
||||
#define AC97_PRK (1 << 13)
|
||||
#define AC97_PRL (1 << 14)
|
||||
|
||||
#define AC97_SPSA_SHIFT 4
|
||||
#define AC97_SPSA_MASK 3
|
||||
#define AC97_MADC (1 << 9)
|
||||
#define AC97_SPCV (1 << 10)
|
||||
#define AC97_PRI (1 << 11)
|
||||
#define AC97_PRJ (1 << 12)
|
||||
#define AC97_PRK (1 << 13)
|
||||
#define AC97_PRL (1 << 14)
|
||||
|
||||
/* New codecs should be added to the end of this enum to avoid breaking configs. */
|
||||
enum {
|
||||
@@ -104,52 +103,49 @@ enum {
|
||||
AC97_CODEC_AK4540
|
||||
};
|
||||
|
||||
|
||||
typedef struct {
|
||||
const uint16_t index, value, write_mask;
|
||||
} ac97_vendor_reg_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t vendor_id, min_rate, max_rate, misc_flags;
|
||||
uint16_t reset_flags, extid_flags,
|
||||
powerdown_mask, regs[64];
|
||||
uint8_t codec_id, vendor_reg_page_max;
|
||||
uint32_t vendor_id, min_rate, max_rate, misc_flags;
|
||||
uint16_t reset_flags, extid_flags,
|
||||
powerdown_mask, regs[64];
|
||||
uint8_t codec_id, vendor_reg_page_max;
|
||||
const ac97_vendor_reg_t *vendor_regs;
|
||||
uint16_t *vendor_reg_pages;
|
||||
uint16_t *vendor_reg_pages;
|
||||
} ac97_codec_t;
|
||||
|
||||
|
||||
extern uint16_t ac97_codec_readw(ac97_codec_t *dev, uint8_t reg);
|
||||
extern void ac97_codec_writew(ac97_codec_t *dev, uint8_t reg, uint16_t val);
|
||||
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 uint16_t ac97_codec_readw(ac97_codec_t *dev, uint8_t reg);
|
||||
extern void ac97_codec_writew(ac97_codec_t *dev, uint8_t reg, uint16_t val);
|
||||
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 const device_t *ac97_codec_get(int model);
|
||||
|
||||
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 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 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 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, **ac97_modem_codec;
|
||||
extern int ac97_codec_count, ac97_modem_codec_count,
|
||||
ac97_codec_id, ac97_modem_codec_id;
|
||||
extern ac97_codec_t **ac97_codec, **ac97_modem_codec;
|
||||
extern int ac97_codec_count, ac97_modem_codec_count,
|
||||
ac97_codec_id, ac97_modem_codec_id;
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t ad1881_device;
|
||||
extern const device_t ak4540_device;
|
||||
extern const device_t alc100_device;
|
||||
extern const device_t cs4297_device;
|
||||
extern const device_t cs4297a_device;
|
||||
extern const device_t stac9708_device;
|
||||
extern const device_t stac9721_device;
|
||||
extern const device_t wm9701a_device;
|
||||
extern const device_t ad1881_device;
|
||||
extern const device_t ak4540_device;
|
||||
extern const device_t alc100_device;
|
||||
extern const device_t cs4297_device;
|
||||
extern const device_t cs4297a_device;
|
||||
extern const device_t stac9708_device;
|
||||
extern const device_t stac9721_device;
|
||||
extern const device_t wm9701a_device;
|
||||
|
||||
extern const device_t ac97_via_device;
|
||||
extern const device_t ac97_via_device;
|
||||
#endif
|
||||
|
||||
#endif /*SOUND_AC97_H*/
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#ifndef SOUND_AD1848_H
|
||||
# define SOUND_AD1848_H
|
||||
#define SOUND_AD1848_H
|
||||
|
||||
enum {
|
||||
AD1848_TYPE_DEFAULT = 0,
|
||||
@@ -30,44 +30,42 @@ enum {
|
||||
AD1848_TYPE_CS4236
|
||||
};
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint8_t type, index, xindex, regs[32], xregs[32], status; /* 16 original registers + 16 CS4231A extensions + 32 CS4236 extensions */
|
||||
uint8_t type, index, xindex, regs[32], xregs[32], status; /* 16 original registers + 16 CS4231A extensions + 32 CS4236 extensions */
|
||||
|
||||
int count;
|
||||
uint8_t trd, mce, wten: 1;
|
||||
int count;
|
||||
uint8_t trd, mce, wten : 1;
|
||||
|
||||
int16_t out_l, out_r;
|
||||
double cd_vol_l, cd_vol_r;
|
||||
int fm_vol_l, fm_vol_r;
|
||||
uint8_t fmt_mask, wave_vol_mask;
|
||||
int16_t out_l, out_r;
|
||||
double cd_vol_l, cd_vol_r;
|
||||
int fm_vol_l, fm_vol_r;
|
||||
uint8_t fmt_mask, wave_vol_mask;
|
||||
|
||||
uint8_t enable: 1, irq: 4, dma: 3;
|
||||
int freq;
|
||||
uint8_t enable : 1, irq : 4, dma : 3;
|
||||
int freq;
|
||||
|
||||
pc_timer_t timer_count;
|
||||
uint64_t timer_latch;
|
||||
pc_timer_t timer_count;
|
||||
uint64_t timer_latch;
|
||||
|
||||
int16_t buffer[SOUNDBUFLEN * 2];
|
||||
int pos;
|
||||
int16_t buffer[SOUNDBUFLEN * 2];
|
||||
int pos;
|
||||
|
||||
void *cram_priv,
|
||||
(*cram_write)(uint16_t addr, uint8_t val, void *priv);
|
||||
uint8_t (*cram_read)(uint16_t addr, void *priv);
|
||||
void *cram_priv,
|
||||
(*cram_write)(uint16_t addr, uint8_t val, void *priv);
|
||||
uint8_t (*cram_read)(uint16_t addr, void *priv);
|
||||
} ad1848_t;
|
||||
|
||||
extern void ad1848_setirq(ad1848_t *ad1848, int irq);
|
||||
extern void ad1848_setdma(ad1848_t *ad1848, int dma);
|
||||
extern void ad1848_updatevolmask(ad1848_t *ad1848);
|
||||
|
||||
extern void ad1848_setirq(ad1848_t *ad1848, int irq);
|
||||
extern void ad1848_setdma(ad1848_t *ad1848, int dma);
|
||||
extern void ad1848_updatevolmask(ad1848_t *ad1848);
|
||||
extern uint8_t ad1848_read(uint16_t addr, void *priv);
|
||||
extern void ad1848_write(uint16_t addr, uint8_t val, void *priv);
|
||||
|
||||
extern uint8_t ad1848_read(uint16_t addr, void *priv);
|
||||
extern void ad1848_write(uint16_t addr, uint8_t val, void *priv);
|
||||
extern void ad1848_update(ad1848_t *ad1848);
|
||||
extern void ad1848_speed_changed(ad1848_t *ad1848);
|
||||
extern void ad1848_filter_cd_audio(int channel, double *buffer, void *priv);
|
||||
|
||||
extern void ad1848_update(ad1848_t *ad1848);
|
||||
extern void ad1848_speed_changed(ad1848_t *ad1848);
|
||||
extern void ad1848_filter_cd_audio(int channel, double *buffer, void *priv);
|
||||
|
||||
extern void ad1848_init(ad1848_t *ad1848, uint8_t type);
|
||||
extern void ad1848_init(ad1848_t *ad1848, uint8_t type);
|
||||
|
||||
#endif /*SOUND_AD1848_H*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef SOUND_AZT2316A_H
|
||||
# define SOUND_AZT2316A_H
|
||||
#define SOUND_AZT2316A_H
|
||||
|
||||
extern void azt2316a_enable_wss(uint8_t enable, void *p);
|
||||
|
||||
|
||||
@@ -1,35 +1,33 @@
|
||||
#ifndef SOUND_CMS_H
|
||||
# define SOUND_CMS_H
|
||||
#define SOUND_CMS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <86box/sound.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define MASTER_CLOCK 7159090
|
||||
|
||||
typedef struct cms_t
|
||||
{
|
||||
int addrs[2];
|
||||
uint8_t regs[2][32];
|
||||
uint16_t latch[2][6];
|
||||
int freq[2][6];
|
||||
float count[2][6];
|
||||
int vol[2][6][2];
|
||||
int stat[2][6];
|
||||
uint16_t noise[2][2];
|
||||
uint16_t noisefreq[2][2];
|
||||
int noisecount[2][2];
|
||||
int noisetype[2][2];
|
||||
typedef struct cms_t {
|
||||
int addrs[2];
|
||||
uint8_t regs[2][32];
|
||||
uint16_t latch[2][6];
|
||||
int freq[2][6];
|
||||
float count[2][6];
|
||||
int vol[2][6][2];
|
||||
int stat[2][6];
|
||||
uint16_t noise[2][2];
|
||||
uint16_t noisefreq[2][2];
|
||||
int noisecount[2][2];
|
||||
int noisetype[2][2];
|
||||
|
||||
uint8_t latched_data;
|
||||
uint8_t latched_data;
|
||||
|
||||
int16_t buffer[SOUNDBUFLEN * 2];
|
||||
int16_t buffer[SOUNDBUFLEN * 2];
|
||||
|
||||
int pos;
|
||||
int pos;
|
||||
} cms_t;
|
||||
|
||||
|
||||
extern void cms_update(cms_t *cms);
|
||||
extern void cms_write(uint16_t addr, uint8_t val, void *p);
|
||||
extern void cms_update(cms_t *cms);
|
||||
extern void cms_write(uint16_t addr, uint8_t val, void *p);
|
||||
extern uint8_t cms_read(uint16_t addr, void *p);
|
||||
|
||||
#endif /*SOUND_CMS_H*/
|
||||
#endif /*SOUND_CMS_H*/
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
#ifndef SOUND_EMU8K_H
|
||||
# define SOUND_EMU8K_H
|
||||
#define SOUND_EMU8K_H
|
||||
|
||||
/* All these defines are in samples, not in bytes. */
|
||||
#define EMU8K_MEM_ADDRESS_MASK 0xFFFFFF
|
||||
#define EMU8K_RAM_MEM_START 0x200000
|
||||
#define EMU8K_FM_MEM_ADDRESS 0xFFFFE0
|
||||
#define EMU8K_MEM_ADDRESS_MASK 0xFFFFFF
|
||||
#define EMU8K_RAM_MEM_START 0x200000
|
||||
#define EMU8K_FM_MEM_ADDRESS 0xFFFFE0
|
||||
#define EMU8K_RAM_POINTERS_MASK 0x3F
|
||||
#define EMU8K_LFOCHORUS_SIZE 0x4000
|
||||
#define EMU8K_LFOCHORUS_SIZE 0x4000
|
||||
/*
|
||||
* Everything in this file assumes little endian
|
||||
*/
|
||||
/* used for the increment of oscillator position*/
|
||||
typedef struct emu8k_mem_internal_t {
|
||||
union {
|
||||
uint64_t addr;
|
||||
struct {
|
||||
uint16_t fract_lw_address;
|
||||
uint16_t fract_address;
|
||||
uint32_t int_address;
|
||||
};
|
||||
union {
|
||||
uint64_t addr;
|
||||
struct {
|
||||
uint16_t fract_lw_address;
|
||||
uint16_t fract_address;
|
||||
uint32_t int_address;
|
||||
};
|
||||
};
|
||||
} emu8k_mem_internal_t;
|
||||
|
||||
/* used for access to ram pointers from oscillator position. */
|
||||
typedef struct emu8k_mem_pointers_t {
|
||||
union {
|
||||
uint32_t addr;
|
||||
struct {
|
||||
uint16_t lw_address;
|
||||
uint8_t hb_address;
|
||||
uint8_t unused_address;
|
||||
};
|
||||
union {
|
||||
uint32_t addr;
|
||||
struct {
|
||||
uint16_t lw_address;
|
||||
uint8_t hb_address;
|
||||
uint8_t unused_address;
|
||||
};
|
||||
};
|
||||
} emu8k_mem_pointers_t;
|
||||
|
||||
/*
|
||||
@@ -84,33 +84,30 @@ typedef struct emu8k_mem_pointers_t {
|
||||
* This allows to operate db values by simply adding them.
|
||||
*/
|
||||
typedef struct emu8k_envelope_t {
|
||||
int state;
|
||||
int32_t delay_samples, hold_samples, attack_samples;
|
||||
int32_t value_amp_hz, value_db_oct;
|
||||
int32_t sustain_value_db_oct;
|
||||
int32_t attack_amount_amp_hz, ramp_amount_db_oct;
|
||||
int state;
|
||||
int32_t delay_samples, hold_samples, attack_samples;
|
||||
int32_t value_amp_hz, value_db_oct;
|
||||
int32_t sustain_value_db_oct;
|
||||
int32_t attack_amount_amp_hz, ramp_amount_db_oct;
|
||||
} emu8k_envelope_t;
|
||||
|
||||
|
||||
|
||||
typedef struct emu8k_chorus_eng_t {
|
||||
int32_t write;
|
||||
int32_t feedback;
|
||||
int32_t delay_samples_central;
|
||||
double lfodepth_multip;
|
||||
double delay_offset_samples_right;
|
||||
emu8k_mem_internal_t lfo_inc;
|
||||
emu8k_mem_internal_t lfo_pos;
|
||||
int32_t write;
|
||||
int32_t feedback;
|
||||
int32_t delay_samples_central;
|
||||
double lfodepth_multip;
|
||||
double delay_offset_samples_right;
|
||||
emu8k_mem_internal_t lfo_inc;
|
||||
emu8k_mem_internal_t lfo_pos;
|
||||
|
||||
int32_t chorus_left_buffer[EMU8K_LFOCHORUS_SIZE];
|
||||
int32_t chorus_right_buffer[EMU8K_LFOCHORUS_SIZE];
|
||||
int32_t chorus_left_buffer[EMU8K_LFOCHORUS_SIZE];
|
||||
int32_t chorus_right_buffer[EMU8K_LFOCHORUS_SIZE];
|
||||
|
||||
} emu8k_chorus_eng_t;
|
||||
|
||||
/* 32 * 242. 32 comes from the "right" room resso case.*/
|
||||
#define MAX_REFL_SIZE 7744
|
||||
|
||||
|
||||
/* Reverb parameters description, extracted from AST sources.
|
||||
Mix level
|
||||
Decay
|
||||
@@ -133,267 +130,258 @@ typedef struct emu8k_chorus_eng_t {
|
||||
Ref 6 feedback L&R
|
||||
*/
|
||||
typedef struct emu8k_reverb_combfilter_t {
|
||||
int read_pos;
|
||||
int32_t reflection[MAX_REFL_SIZE];
|
||||
float output_gain;
|
||||
float feedback;
|
||||
float damp1;
|
||||
float damp2;
|
||||
int bufsize;
|
||||
int32_t filterstore;
|
||||
int read_pos;
|
||||
int32_t reflection[MAX_REFL_SIZE];
|
||||
float output_gain;
|
||||
float feedback;
|
||||
float damp1;
|
||||
float damp2;
|
||||
int bufsize;
|
||||
int32_t filterstore;
|
||||
} emu8k_reverb_combfilter_t;
|
||||
|
||||
typedef struct emu8k_reverb_eng_t {
|
||||
|
||||
int16_t out_mix;
|
||||
int16_t link_return_amp; /* tail part output gain ? */
|
||||
int8_t link_return_type;
|
||||
int16_t out_mix;
|
||||
int16_t link_return_amp; /* tail part output gain ? */
|
||||
int8_t link_return_type;
|
||||
|
||||
uint8_t refl_in_amp;
|
||||
uint8_t refl_in_amp;
|
||||
|
||||
emu8k_reverb_combfilter_t reflections[6];
|
||||
emu8k_reverb_combfilter_t allpass[8];
|
||||
emu8k_reverb_combfilter_t tailL;
|
||||
emu8k_reverb_combfilter_t tailR;
|
||||
emu8k_reverb_combfilter_t reflections[6];
|
||||
emu8k_reverb_combfilter_t allpass[8];
|
||||
emu8k_reverb_combfilter_t tailL;
|
||||
emu8k_reverb_combfilter_t tailR;
|
||||
|
||||
emu8k_reverb_combfilter_t damper;
|
||||
emu8k_reverb_combfilter_t damper;
|
||||
} emu8k_reverb_eng_t;
|
||||
|
||||
typedef struct emu8k_slide_t {
|
||||
int32_t last;
|
||||
int32_t last;
|
||||
} emu8k_slide_t;
|
||||
|
||||
|
||||
typedef struct emu8k_voice_t
|
||||
{
|
||||
union {
|
||||
uint32_t cpf;
|
||||
struct {
|
||||
uint16_t cpf_curr_frac_addr; /* fractional part of the playing cursor. */
|
||||
uint16_t cpf_curr_pitch; /* 0x4000 = no shift. Linear increment */
|
||||
};
|
||||
typedef struct emu8k_voice_t {
|
||||
union {
|
||||
uint32_t cpf;
|
||||
struct {
|
||||
uint16_t cpf_curr_frac_addr; /* fractional part of the playing cursor. */
|
||||
uint16_t cpf_curr_pitch; /* 0x4000 = no shift. Linear increment */
|
||||
};
|
||||
union {
|
||||
uint32_t ptrx;
|
||||
struct {
|
||||
uint8_t ptrx_pan_aux;
|
||||
uint8_t ptrx_revb_send;
|
||||
uint16_t ptrx_pit_target; /* target pitch to which slide at curr_pitch speed. */
|
||||
};
|
||||
};
|
||||
union {
|
||||
uint32_t ptrx;
|
||||
struct {
|
||||
uint8_t ptrx_pan_aux;
|
||||
uint8_t ptrx_revb_send;
|
||||
uint16_t ptrx_pit_target; /* target pitch to which slide at curr_pitch speed. */
|
||||
};
|
||||
union {
|
||||
uint32_t cvcf;
|
||||
struct {
|
||||
uint16_t cvcf_curr_filt_ctoff;
|
||||
uint16_t cvcf_curr_volume;
|
||||
};
|
||||
};
|
||||
union {
|
||||
uint32_t cvcf;
|
||||
struct {
|
||||
uint16_t cvcf_curr_filt_ctoff;
|
||||
uint16_t cvcf_curr_volume;
|
||||
};
|
||||
emu8k_slide_t volumeslide;
|
||||
union {
|
||||
uint32_t vtft;
|
||||
struct {
|
||||
uint16_t vtft_filter_target;
|
||||
uint16_t vtft_vol_target; /* written to by the envelope engine. */
|
||||
};
|
||||
};
|
||||
emu8k_slide_t volumeslide;
|
||||
union {
|
||||
uint32_t vtft;
|
||||
struct {
|
||||
uint16_t vtft_filter_target;
|
||||
uint16_t vtft_vol_target; /* written to by the envelope engine. */
|
||||
};
|
||||
/* These registers are used at least by the Windows drivers, and seem to be resetting
|
||||
* something, similarly to targets and current, but... of what?
|
||||
* what is curious is that if they are already zero, they are not written to, so it really
|
||||
* looks like they are information about the status of the channel. (lfo position maybe?) */
|
||||
uint32_t unknown_data0_4;
|
||||
uint32_t unknown_data0_5;
|
||||
union {
|
||||
uint32_t psst;
|
||||
struct {
|
||||
uint16_t psst_lw_address;
|
||||
uint8_t psst_hw_address;
|
||||
uint8_t psst_pan;
|
||||
};
|
||||
#define PSST_LOOP_START_MASK 0x00FFFFFF /* In samples, i.e. uint16_t array[BOARD_RAM/2]; */
|
||||
};
|
||||
/* These registers are used at least by the Windows drivers, and seem to be resetting
|
||||
* something, similarly to targets and current, but... of what?
|
||||
* what is curious is that if they are already zero, they are not written to, so it really
|
||||
* looks like they are information about the status of the channel. (lfo position maybe?) */
|
||||
uint32_t unknown_data0_4;
|
||||
uint32_t unknown_data0_5;
|
||||
union {
|
||||
uint32_t psst;
|
||||
struct {
|
||||
uint16_t psst_lw_address;
|
||||
uint8_t psst_hw_address;
|
||||
uint8_t psst_pan;
|
||||
};
|
||||
union {
|
||||
uint32_t csl;
|
||||
struct {
|
||||
uint16_t csl_lw_address;
|
||||
uint8_t csl_hw_address;
|
||||
uint8_t csl_chor_send;
|
||||
};
|
||||
#define CSL_LOOP_END_MASK 0x00FFFFFF /* In samples, i.e. uint16_t array[BOARD_RAM/2]; */
|
||||
#define PSST_LOOP_START_MASK 0x00FFFFFF /* In samples, i.e. uint16_t array[BOARD_RAM/2]; */
|
||||
};
|
||||
union {
|
||||
uint32_t csl;
|
||||
struct {
|
||||
uint16_t csl_lw_address;
|
||||
uint8_t csl_hw_address;
|
||||
uint8_t csl_chor_send;
|
||||
};
|
||||
union {
|
||||
uint32_t ccca;
|
||||
struct {
|
||||
uint16_t ccca_lw_addr;
|
||||
uint8_t ccca_hb_addr;
|
||||
uint8_t ccca_qcontrol;
|
||||
};
|
||||
#define CSL_LOOP_END_MASK 0x00FFFFFF /* In samples, i.e. uint16_t array[BOARD_RAM/2]; */
|
||||
};
|
||||
union {
|
||||
uint32_t ccca;
|
||||
struct {
|
||||
uint16_t ccca_lw_addr;
|
||||
uint8_t ccca_hb_addr;
|
||||
uint8_t ccca_qcontrol;
|
||||
};
|
||||
#define CCCA_FILTQ_GET(ccca) (ccca>>28)
|
||||
#define CCCA_FILTQ_SET(ccca,q) ccca = (ccca&0x0FFFFFFF) | (q<<28)
|
||||
/* Bit 27 should always be zero */
|
||||
#define CCCA_DMA_ACTIVE(ccca) (ccca&0x04000000)
|
||||
#define CCCA_DMA_WRITE_MODE(ccca) (ccca&0x02000000)
|
||||
#define CCCA_DMA_WRITE_RIGHT(ccca) (ccca&0x01000000)
|
||||
};
|
||||
#define CCCA_FILTQ_GET(ccca) (ccca >> 28)
|
||||
#define CCCA_FILTQ_SET(ccca, q) ccca = (ccca & 0x0FFFFFFF) | (q << 28)
|
||||
/* Bit 27 should always be zero */
|
||||
#define CCCA_DMA_ACTIVE(ccca) (ccca & 0x04000000)
|
||||
#define CCCA_DMA_WRITE_MODE(ccca) (ccca & 0x02000000)
|
||||
#define CCCA_DMA_WRITE_RIGHT(ccca) (ccca & 0x01000000)
|
||||
|
||||
uint16_t envvol;
|
||||
#define ENVVOL_NODELAY(envol) (envvol&0x8000)
|
||||
/* Verified with a soundfont bank. 7FFF is the minimum delay time, and 0 is the max delay time */
|
||||
#define ENVVOL_TO_EMU_SAMPLES(envvol) (envvol&0x8000) ? 0 : ((0x8000-(envvol&0x7FFF)) <<5)
|
||||
uint16_t envvol;
|
||||
#define ENVVOL_NODELAY(envol) (envvol & 0x8000)
|
||||
/* Verified with a soundfont bank. 7FFF is the minimum delay time, and 0 is the max delay time */
|
||||
#define ENVVOL_TO_EMU_SAMPLES(envvol) (envvol & 0x8000) ? 0 : ((0x8000 - (envvol & 0x7FFF)) << 5)
|
||||
|
||||
uint16_t dcysusv;
|
||||
#define DCYSUSV_IS_RELEASE(dcysusv) (dcysusv&0x8000)
|
||||
#define DCYSUSV_GENERATOR_ENGINE_ON(dcysusv) !(dcysusv&0x0080)
|
||||
#define DCYSUSV_SUSVALUE_GET(dcysusv) ((dcysusv>>8)&0x7F)
|
||||
/* Inverting the range compared to documentation because the envelope runs from 0dBFS = 0 to -96dBFS = (1 <<21) */
|
||||
#define DCYSUSV_SUS_TO_ENV_RANGE(susvalue) (((0x7F-susvalue) << 21)/0x7F)
|
||||
#define DCYSUSV_DECAYRELEASE_GET(dcysusv) (dcysusv&0x7F)
|
||||
uint16_t dcysusv;
|
||||
#define DCYSUSV_IS_RELEASE(dcysusv) (dcysusv & 0x8000)
|
||||
#define DCYSUSV_GENERATOR_ENGINE_ON(dcysusv) !(dcysusv & 0x0080)
|
||||
#define DCYSUSV_SUSVALUE_GET(dcysusv) ((dcysusv >> 8) & 0x7F)
|
||||
/* Inverting the range compared to documentation because the envelope runs from 0dBFS = 0 to -96dBFS = (1 <<21) */
|
||||
#define DCYSUSV_SUS_TO_ENV_RANGE(susvalue) (((0x7F - susvalue) << 21) / 0x7F)
|
||||
#define DCYSUSV_DECAYRELEASE_GET(dcysusv) (dcysusv & 0x7F)
|
||||
|
||||
uint16_t envval;
|
||||
#define ENVVAL_NODELAY(enval) (envval&0x8000)
|
||||
/* Verified with a soundfont bank. 7FFF is the minimum delay time, and 0 is the max delay time */
|
||||
#define ENVVAL_TO_EMU_SAMPLES(envval)(envval&0x8000) ? 0 : ((0x8000-(envval&0x7FFF)) <<5)
|
||||
uint16_t envval;
|
||||
#define ENVVAL_NODELAY(enval) (envval & 0x8000)
|
||||
/* Verified with a soundfont bank. 7FFF is the minimum delay time, and 0 is the max delay time */
|
||||
#define ENVVAL_TO_EMU_SAMPLES(envval) (envval & 0x8000) ? 0 : ((0x8000 - (envval & 0x7FFF)) << 5)
|
||||
|
||||
uint16_t dcysus;
|
||||
#define DCYSUS_IS_RELEASE(dcysus) (dcysus&0x8000)
|
||||
#define DCYSUS_SUSVALUE_GET(dcysus) ((dcysus>>8)&0x7F)
|
||||
#define DCYSUS_SUS_TO_ENV_RANGE(susvalue) ((susvalue << 21)/0x7F)
|
||||
#define DCYSUS_DECAYRELEASE_GET(dcysus) (dcysus&0x7F)
|
||||
uint16_t dcysus;
|
||||
#define DCYSUS_IS_RELEASE(dcysus) (dcysus & 0x8000)
|
||||
#define DCYSUS_SUSVALUE_GET(dcysus) ((dcysus >> 8) & 0x7F)
|
||||
#define DCYSUS_SUS_TO_ENV_RANGE(susvalue) ((susvalue << 21) / 0x7F)
|
||||
#define DCYSUS_DECAYRELEASE_GET(dcysus) (dcysus & 0x7F)
|
||||
|
||||
uint16_t atkhldv;
|
||||
#define ATKHLDV_TRIGGER(atkhldv) !(atkhldv&0x8000)
|
||||
#define ATKHLDV_HOLD(atkhldv) ((atkhldv>>8)&0x7F)
|
||||
#define ATKHLDV_HOLD_TO_EMU_SAMPLES(atkhldv) (4096*(0x7F-((atkhldv>>8)&0x7F)))
|
||||
#define ATKHLDV_ATTACK(atkhldv) (atkhldv&0x7F)
|
||||
uint16_t atkhldv;
|
||||
#define ATKHLDV_TRIGGER(atkhldv) !(atkhldv & 0x8000)
|
||||
#define ATKHLDV_HOLD(atkhldv) ((atkhldv >> 8) & 0x7F)
|
||||
#define ATKHLDV_HOLD_TO_EMU_SAMPLES(atkhldv) (4096 * (0x7F - ((atkhldv >> 8) & 0x7F)))
|
||||
#define ATKHLDV_ATTACK(atkhldv) (atkhldv & 0x7F)
|
||||
|
||||
uint16_t lfo1val, lfo2val;
|
||||
#define LFOxVAL_NODELAY(lfoxval) (lfoxval&0x8000)
|
||||
#define LFOxVAL_TO_EMU_SAMPLES(lfoxval) (lfoxval&0x8000) ? 0 : ((0x8000-(lfoxval&0x7FFF)) <<5)
|
||||
uint16_t lfo1val, lfo2val;
|
||||
#define LFOxVAL_NODELAY(lfoxval) (lfoxval & 0x8000)
|
||||
#define LFOxVAL_TO_EMU_SAMPLES(lfoxval) (lfoxval & 0x8000) ? 0 : ((0x8000 - (lfoxval & 0x7FFF)) << 5)
|
||||
|
||||
uint16_t atkhld;
|
||||
#define ATKHLD_TRIGGER(atkhld) !(atkhld&0x8000)
|
||||
#define ATKHLD_HOLD(atkhld) ((atkhld>>8)&0x7F)
|
||||
#define ATKHLD_HOLD_TO_EMU_SAMPLES(atkhld) (4096*(0x7F-((atkhld>>8)&0x7F)))
|
||||
#define ATKHLD_ATTACK(atkhld) (atkhld&0x7F)
|
||||
uint16_t atkhld;
|
||||
#define ATKHLD_TRIGGER(atkhld) !(atkhld & 0x8000)
|
||||
#define ATKHLD_HOLD(atkhld) ((atkhld >> 8) & 0x7F)
|
||||
#define ATKHLD_HOLD_TO_EMU_SAMPLES(atkhld) (4096 * (0x7F - ((atkhld >> 8) & 0x7F)))
|
||||
#define ATKHLD_ATTACK(atkhld) (atkhld & 0x7F)
|
||||
|
||||
uint16_t ip;
|
||||
#define INTIAL_PITCH_CENTER 0xE000
|
||||
#define INTIAL_PITCH_OCTAVE 0x1000
|
||||
|
||||
uint16_t ip;
|
||||
#define INTIAL_PITCH_CENTER 0xE000
|
||||
#define INTIAL_PITCH_OCTAVE 0x1000
|
||||
|
||||
union {
|
||||
uint16_t ifatn;
|
||||
struct{
|
||||
uint8_t ifatn_attenuation;
|
||||
uint8_t ifatn_init_filter;
|
||||
};
|
||||
union {
|
||||
uint16_t ifatn;
|
||||
struct {
|
||||
uint8_t ifatn_attenuation;
|
||||
uint8_t ifatn_init_filter;
|
||||
};
|
||||
union {
|
||||
uint16_t pefe;
|
||||
struct {
|
||||
int8_t pefe_modenv_filter_height;
|
||||
int8_t pefe_modenv_pitch_height;
|
||||
};
|
||||
};
|
||||
union {
|
||||
uint16_t pefe;
|
||||
struct {
|
||||
int8_t pefe_modenv_filter_height;
|
||||
int8_t pefe_modenv_pitch_height;
|
||||
};
|
||||
union {
|
||||
uint16_t fmmod;
|
||||
struct {
|
||||
int8_t fmmod_lfo1_filt_mod;
|
||||
int8_t fmmod_lfo1_vibrato;
|
||||
};
|
||||
};
|
||||
union {
|
||||
uint16_t fmmod;
|
||||
struct {
|
||||
int8_t fmmod_lfo1_filt_mod;
|
||||
int8_t fmmod_lfo1_vibrato;
|
||||
};
|
||||
union {
|
||||
uint16_t tremfrq;
|
||||
struct {
|
||||
uint8_t tremfrq_lfo1_freq;
|
||||
int8_t tremfrq_lfo1_tremolo;
|
||||
};
|
||||
};
|
||||
union {
|
||||
uint16_t tremfrq;
|
||||
struct {
|
||||
uint8_t tremfrq_lfo1_freq;
|
||||
int8_t tremfrq_lfo1_tremolo;
|
||||
};
|
||||
union {
|
||||
uint16_t fm2frq2;
|
||||
struct {
|
||||
uint8_t fm2frq2_lfo2_freq;
|
||||
int8_t fm2frq2_lfo2_vibrato;
|
||||
};
|
||||
};
|
||||
union {
|
||||
uint16_t fm2frq2;
|
||||
struct {
|
||||
uint8_t fm2frq2_lfo2_freq;
|
||||
int8_t fm2frq2_lfo2_vibrato;
|
||||
};
|
||||
};
|
||||
|
||||
int env_engine_on;
|
||||
int env_engine_on;
|
||||
|
||||
emu8k_mem_internal_t addr, loop_start, loop_end;
|
||||
emu8k_mem_internal_t addr, loop_start, loop_end;
|
||||
|
||||
int32_t initial_att;
|
||||
int32_t initial_filter;
|
||||
int32_t initial_att;
|
||||
int32_t initial_filter;
|
||||
|
||||
emu8k_envelope_t vol_envelope;
|
||||
emu8k_envelope_t mod_envelope;
|
||||
emu8k_envelope_t vol_envelope;
|
||||
emu8k_envelope_t mod_envelope;
|
||||
|
||||
int64_t lfo1_speed, lfo2_speed;
|
||||
emu8k_mem_internal_t lfo1_count, lfo2_count;
|
||||
int32_t lfo1_delay_samples, lfo2_delay_samples;
|
||||
int vol_l, vol_r;
|
||||
int64_t lfo1_speed, lfo2_speed;
|
||||
emu8k_mem_internal_t lfo1_count, lfo2_count;
|
||||
int32_t lfo1_delay_samples, lfo2_delay_samples;
|
||||
int vol_l, vol_r;
|
||||
|
||||
int16_t fixed_modenv_filter_height;
|
||||
int16_t fixed_modenv_pitch_height;
|
||||
int16_t fixed_lfo1_filt_mod;
|
||||
int16_t fixed_lfo1_vibrato;
|
||||
int16_t fixed_lfo1_tremolo;
|
||||
int16_t fixed_lfo2_vibrato;
|
||||
int16_t fixed_modenv_filter_height;
|
||||
int16_t fixed_modenv_pitch_height;
|
||||
int16_t fixed_lfo1_filt_mod;
|
||||
int16_t fixed_lfo1_vibrato;
|
||||
int16_t fixed_lfo1_tremolo;
|
||||
int16_t fixed_lfo2_vibrato;
|
||||
|
||||
/* filter internal data. */
|
||||
int filterq_idx;
|
||||
int32_t filt_att;
|
||||
int64_t filt_buffer[5];
|
||||
/* filter internal data. */
|
||||
int filterq_idx;
|
||||
int32_t filt_att;
|
||||
int64_t filt_buffer[5];
|
||||
|
||||
} emu8k_voice_t;
|
||||
|
||||
typedef struct emu8k_t
|
||||
{
|
||||
emu8k_voice_t voice[32];
|
||||
typedef struct emu8k_t {
|
||||
emu8k_voice_t voice[32];
|
||||
|
||||
uint16_t hwcf1, hwcf2, hwcf3;
|
||||
uint32_t hwcf4, hwcf5, hwcf6, hwcf7;
|
||||
uint16_t hwcf1, hwcf2, hwcf3;
|
||||
uint32_t hwcf4, hwcf5, hwcf6, hwcf7;
|
||||
|
||||
uint16_t init1[32], init2[32], init3[32], init4[32];
|
||||
uint16_t init1[32], init2[32], init3[32], init4[32];
|
||||
|
||||
uint32_t smalr, smarr, smalw, smarw;
|
||||
uint16_t smld_buffer, smrd_buffer;
|
||||
uint32_t smalr, smarr, smalw, smarw;
|
||||
uint16_t smld_buffer, smrd_buffer;
|
||||
|
||||
uint16_t wc;
|
||||
uint16_t wc;
|
||||
|
||||
uint16_t id;
|
||||
uint16_t id;
|
||||
|
||||
/* The empty block is used to act as an unallocated memory returning zero. */
|
||||
int16_t *ram, *rom, *empty;
|
||||
/* The empty block is used to act as an unallocated memory returning zero. */
|
||||
int16_t *ram, *rom, *empty;
|
||||
|
||||
/* RAM pointers are a way to avoid checking ram boundaries on read */
|
||||
int16_t *ram_pointers[0x100];
|
||||
uint32_t ram_end_addr;
|
||||
/* RAM pointers are a way to avoid checking ram boundaries on read */
|
||||
int16_t *ram_pointers[0x100];
|
||||
uint32_t ram_end_addr;
|
||||
|
||||
int cur_reg, cur_voice;
|
||||
int cur_reg, cur_voice;
|
||||
|
||||
int16_t out_l, out_r;
|
||||
int16_t out_l, out_r;
|
||||
|
||||
emu8k_chorus_eng_t chorus_engine;
|
||||
int32_t chorus_in_buffer[SOUNDBUFLEN];
|
||||
emu8k_reverb_eng_t reverb_engine;
|
||||
int32_t reverb_in_buffer[SOUNDBUFLEN];
|
||||
emu8k_chorus_eng_t chorus_engine;
|
||||
int32_t chorus_in_buffer[SOUNDBUFLEN];
|
||||
emu8k_reverb_eng_t reverb_engine;
|
||||
int32_t reverb_in_buffer[SOUNDBUFLEN];
|
||||
|
||||
int pos;
|
||||
int32_t buffer[SOUNDBUFLEN * 2];
|
||||
int pos;
|
||||
int32_t buffer[SOUNDBUFLEN * 2];
|
||||
|
||||
uint16_t addr;
|
||||
uint16_t addr;
|
||||
} emu8k_t;
|
||||
|
||||
|
||||
|
||||
void emu8k_change_addr(emu8k_t *emu8k, uint16_t emu_addr);
|
||||
void emu8k_init(emu8k_t *emu8k, uint16_t emu_addr, int onboard_ram);
|
||||
void emu8k_close(emu8k_t *emu8k);
|
||||
|
||||
void emu8k_update(emu8k_t *emu8k);
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Section E - Introduction to the EMU8000 Chip
|
||||
@@ -656,12 +644,12 @@ Short Delay Short Delay + Feedback
|
||||
|
||||
// Chorus Params
|
||||
typedef struct {
|
||||
WORD FbkLevel; // Feedback Level (0xE600-0xE6FF)
|
||||
WORD Delay; // Delay (0-0x0DA3) [1/44100 sec]
|
||||
WORD LfoDepth; // LFO Depth (0xBC00-0xBCFF)
|
||||
DWORD DelayR; // Right Delay (0-0xFFFFFFFF) [1/256/44100 sec]
|
||||
DWORD LfoFreq; // LFO Frequency (0-0xFFFFFFFF)
|
||||
} CHORUS_TYPE;
|
||||
WORD FbkLevel; // Feedback Level (0xE600-0xE6FF)
|
||||
WORD Delay; // Delay (0-0x0DA3) [1/44100 sec]
|
||||
WORD LfoDepth; // LFO Depth (0xBC00-0xBCFF)
|
||||
DWORD DelayR; // Right Delay (0-0xFFFFFFFF) [1/256/44100 sec]
|
||||
DWORD LfoFreq; // LFO Frequency (0-0xFFFFFFFF)
|
||||
} CHORUS_TYPE;
|
||||
|
||||
|
||||
Registers to write the Reverb Parameters to (they are all 16-bit):
|
||||
|
||||
@@ -21,30 +21,28 @@
|
||||
*/
|
||||
|
||||
#ifndef SOUND_MPU401_H
|
||||
# define SOUND_MPU401_H
|
||||
#define SOUND_MPU401_H
|
||||
|
||||
#define MPU401_VERSION 0x15
|
||||
#define MPU401_REVISION 0x01
|
||||
#define MPU401_QUEUE 64
|
||||
#define MPU401_INPUT_QUEUE 1024
|
||||
#define MPU401_TIMECONSTANT (60000000/1000.0f)
|
||||
#define MPU401_RESETBUSY 27.0f
|
||||
#define MPU401_VERSION 0x15
|
||||
#define MPU401_REVISION 0x01
|
||||
#define MPU401_QUEUE 64
|
||||
#define MPU401_INPUT_QUEUE 1024
|
||||
#define MPU401_TIMECONSTANT (60000000 / 1000.0f)
|
||||
#define MPU401_RESETBUSY 27.0f
|
||||
|
||||
/*helpers*/
|
||||
#define M_GETKEY key[key/32]&(1<<(key%32))
|
||||
#define M_SETKEY key[key/32]|=(1<<(key%32))
|
||||
#define M_DELKEY key[key/32]&=~(1<<(key%32))
|
||||
#define M_GETKEY key[key / 32] & (1 << (key % 32))
|
||||
#define M_SETKEY key[key / 32] |= (1 << (key % 32))
|
||||
#define M_DELKEY key[key / 32] &= ~(1 << (key % 32))
|
||||
|
||||
typedef enum MpuMode
|
||||
{
|
||||
typedef enum MpuMode {
|
||||
M_UART,
|
||||
M_INTELLIGENT
|
||||
} MpuMode;
|
||||
|
||||
#define M_MCA 0x10
|
||||
|
||||
typedef enum MpuDataType
|
||||
{
|
||||
typedef enum MpuDataType {
|
||||
T_OVERFLOW,
|
||||
T_MARK,
|
||||
T_MIDI_SYS,
|
||||
@@ -52,118 +50,114 @@ typedef enum MpuDataType
|
||||
T_COMMAND
|
||||
} MpuDataType;
|
||||
|
||||
typedef enum RecState
|
||||
{
|
||||
M_RECOFF,
|
||||
M_RECSTB,
|
||||
M_RECON
|
||||
typedef enum RecState {
|
||||
M_RECOFF,
|
||||
M_RECSTB,
|
||||
M_RECON
|
||||
} RecState;
|
||||
|
||||
/* Messages sent to MPU-401 from host */
|
||||
#define MSG_EOX 0xf7
|
||||
#define MSG_OVERFLOW 0xf8
|
||||
#define MSG_MARK 0xfc
|
||||
#define MSG_EOX 0xf7
|
||||
#define MSG_OVERFLOW 0xf8
|
||||
#define MSG_MARK 0xfc
|
||||
|
||||
/* Messages sent to host from MPU-401 */
|
||||
#define MSG_MPU_OVERFLOW 0xf8
|
||||
#define MSG_MPU_COMMAND_REQ 0xf9
|
||||
#define MSG_MPU_END 0xfc
|
||||
#define MSG_MPU_CLOCK 0xfd
|
||||
#define MSG_MPU_ACK 0xfe
|
||||
#define MSG_MPU_OVERFLOW 0xf8
|
||||
#define MSG_MPU_COMMAND_REQ 0xf9
|
||||
#define MSG_MPU_END 0xfc
|
||||
#define MSG_MPU_CLOCK 0xfd
|
||||
#define MSG_MPU_ACK 0xfe
|
||||
|
||||
typedef struct mpu_t
|
||||
{
|
||||
typedef struct mpu_t {
|
||||
uint16_t addr;
|
||||
int uart_mode, intelligent,
|
||||
irq, midi_thru,
|
||||
queue_pos, queue_used;
|
||||
int uart_mode, intelligent,
|
||||
irq, midi_thru,
|
||||
queue_pos, queue_used;
|
||||
uint8_t rx_data, is_mca,
|
||||
status,
|
||||
queue[MPU401_QUEUE], pos_regs[8];
|
||||
MpuMode mode;
|
||||
uint8_t rec_queue[MPU401_INPUT_QUEUE];
|
||||
int rec_queue_pos, rec_queue_used;
|
||||
uint32_t ch_toref[16];
|
||||
struct track
|
||||
{
|
||||
int counter;
|
||||
uint8_t value[3], sys_val,
|
||||
vlength,length;
|
||||
MpuDataType type;
|
||||
status,
|
||||
queue[MPU401_QUEUE], pos_regs[8];
|
||||
MpuMode mode;
|
||||
uint8_t rec_queue[MPU401_INPUT_QUEUE];
|
||||
int rec_queue_pos, rec_queue_used;
|
||||
uint32_t ch_toref[16];
|
||||
struct track {
|
||||
int counter;
|
||||
uint8_t value[3], sys_val,
|
||||
vlength, length;
|
||||
MpuDataType type;
|
||||
} playbuf[8], condbuf;
|
||||
struct {
|
||||
int conductor, cond_req,
|
||||
cond_set, block_ack,
|
||||
playing, reset,
|
||||
wsd, wsm, wsd_start,
|
||||
run_irq, irq_pending,
|
||||
track_req,
|
||||
send_now, eoi_scheduled,
|
||||
data_onoff, clock_to_host,
|
||||
sync_in, sysex_in_finished,
|
||||
rec_copy;
|
||||
RecState rec;
|
||||
uint8_t tmask, cmask,
|
||||
amask,
|
||||
last_rtcmd;
|
||||
uint16_t midi_mask, req_mask;
|
||||
uint32_t command_byte, cmd_pending,
|
||||
track, old_track;
|
||||
int conductor, cond_req,
|
||||
cond_set, block_ack,
|
||||
playing, reset,
|
||||
wsd, wsm, wsd_start,
|
||||
run_irq, irq_pending,
|
||||
track_req,
|
||||
send_now, eoi_scheduled,
|
||||
data_onoff, clock_to_host,
|
||||
sync_in, sysex_in_finished,
|
||||
rec_copy;
|
||||
RecState rec;
|
||||
uint8_t tmask, cmask,
|
||||
amask,
|
||||
last_rtcmd;
|
||||
uint16_t midi_mask, req_mask;
|
||||
uint32_t command_byte, cmd_pending,
|
||||
track, old_track;
|
||||
} state;
|
||||
struct {
|
||||
uint8_t timebase, old_timebase,
|
||||
tempo, old_tempo,
|
||||
tempo_rel, old_tempo_rel,
|
||||
tempo_grad, cth_rate[4],
|
||||
cth_mode, midimetro,
|
||||
metromeas;
|
||||
uint32_t cth_counter, cth_old,
|
||||
rec_counter;
|
||||
int32_t measure_counter, meas_old,
|
||||
freq;
|
||||
int ticks_in, active;
|
||||
float freq_mod;
|
||||
uint8_t timebase, old_timebase,
|
||||
tempo, old_tempo,
|
||||
tempo_rel, old_tempo_rel,
|
||||
tempo_grad, cth_rate[4],
|
||||
cth_mode, midimetro,
|
||||
metromeas;
|
||||
uint32_t cth_counter, cth_old,
|
||||
rec_counter;
|
||||
int32_t measure_counter, meas_old,
|
||||
freq;
|
||||
int ticks_in, active;
|
||||
float freq_mod;
|
||||
} clock;
|
||||
struct {
|
||||
int all_thru, midi_thru,
|
||||
sysex_thru, commonmsgs_thru,
|
||||
modemsgs_in, commonmsgs_in,
|
||||
bender_in, sysex_in,
|
||||
allnotesoff_out, rt_affection,
|
||||
rt_out, rt_in,
|
||||
timing_in_stop, data_in_stop,
|
||||
rec_measure_end;
|
||||
uint8_t prchg_buf[16];
|
||||
uint16_t prchg_mask;
|
||||
} filter;
|
||||
struct {
|
||||
int on;
|
||||
uint8_t chan, trmask;
|
||||
uint32_t key[4];
|
||||
} chanref[5], inputref[16];
|
||||
pc_timer_t mpu401_event_callback, mpu401_eoi_callback,
|
||||
mpu401_reset_callback;
|
||||
void (*ext_irq_update)(void *priv, int set);
|
||||
int (*ext_irq_pending)(void *priv);
|
||||
void *priv;
|
||||
struct {
|
||||
int all_thru, midi_thru,
|
||||
sysex_thru, commonmsgs_thru,
|
||||
modemsgs_in, commonmsgs_in,
|
||||
bender_in, sysex_in,
|
||||
allnotesoff_out, rt_affection,
|
||||
rt_out, rt_in,
|
||||
timing_in_stop, data_in_stop,
|
||||
rec_measure_end;
|
||||
uint8_t prchg_buf[16];
|
||||
uint16_t prchg_mask;
|
||||
} filter;
|
||||
struct {
|
||||
int on;
|
||||
uint8_t chan, trmask;
|
||||
uint32_t key[4];
|
||||
} chanref[5], inputref[16];
|
||||
pc_timer_t mpu401_event_callback, mpu401_eoi_callback,
|
||||
mpu401_reset_callback;
|
||||
void (*ext_irq_update)(void *priv, int set);
|
||||
int (*ext_irq_pending)(void *priv);
|
||||
void *priv;
|
||||
} mpu_t;
|
||||
|
||||
extern int mpu401_standalone_enable, mpu401_already_loaded;
|
||||
extern int mpu401_standalone_enable, mpu401_already_loaded;
|
||||
|
||||
extern const device_t mpu401_device;
|
||||
extern const device_t mpu401_mca_device;
|
||||
extern const device_t mpu401_device;
|
||||
extern const device_t mpu401_mca_device;
|
||||
|
||||
extern uint8_t MPU401_ReadData(mpu_t *mpu);
|
||||
extern void mpu401_write(uint16_t addr, uint8_t val, void *priv);
|
||||
extern uint8_t mpu401_read(uint16_t addr, void *priv);
|
||||
extern void mpu401_setirq(mpu_t *mpu, int irq);
|
||||
extern void mpu401_change_addr(mpu_t *mpu, uint16_t addr);
|
||||
extern void mpu401_init(mpu_t *mpu, uint16_t addr, int irq, int mode, int receive_input);
|
||||
extern void mpu401_device_add(void);
|
||||
extern void mpu401_irq_attach(mpu_t *mpu, void (*ext_irq_update)(void *priv, int set), int (*ext_irq_pending)(void *priv), void *priv);
|
||||
|
||||
extern uint8_t MPU401_ReadData(mpu_t *mpu);
|
||||
extern void mpu401_write(uint16_t addr, uint8_t val, void *priv);
|
||||
extern uint8_t mpu401_read(uint16_t addr, void *priv);
|
||||
extern void mpu401_setirq(mpu_t *mpu, int irq);
|
||||
extern void mpu401_change_addr(mpu_t *mpu, uint16_t addr);
|
||||
extern void mpu401_init(mpu_t *mpu, uint16_t addr, int irq, int mode, int receive_input);
|
||||
extern void mpu401_device_add(void);
|
||||
extern void mpu401_irq_attach(mpu_t *mpu, void (*ext_irq_update)(void *priv, int set), int (*ext_irq_pending)(void *priv), void *priv);
|
||||
extern int MPU401_InputSysex(void *p, uint8_t *buffer, uint32_t len, int abort);
|
||||
extern void MPU401_InputMsg(void *p, uint8_t *msg, uint32_t len);
|
||||
|
||||
extern int MPU401_InputSysex(void *p, uint8_t *buffer, uint32_t len, int abort);
|
||||
extern void MPU401_InputMsg(void *p, uint8_t *msg, uint32_t len);
|
||||
|
||||
#endif /*SOUND_MPU401_H*/
|
||||
#endif /*SOUND_MPU401_H*/
|
||||
|
||||
@@ -15,41 +15,40 @@
|
||||
* Copyright 2016-2020 Miran Grca.
|
||||
*/
|
||||
#ifndef SOUND_OPL_H
|
||||
# define SOUND_OPL_H
|
||||
#define SOUND_OPL_H
|
||||
|
||||
typedef void (*tmrfunc)(void *priv, int timer, uint64_t period);
|
||||
typedef void (*tmrfunc)(void *priv, int timer, uint64_t period);
|
||||
|
||||
/* Define an OPLx chip. */
|
||||
typedef struct {
|
||||
#ifdef SOUND_OPL_NUKED_H
|
||||
nuked_t *opl;
|
||||
nuked_t *opl;
|
||||
#else
|
||||
void *opl;
|
||||
void *opl;
|
||||
#endif
|
||||
int8_t flags, pad;
|
||||
int8_t flags, pad;
|
||||
|
||||
uint16_t port;
|
||||
uint8_t status, timer_ctrl;
|
||||
uint16_t timer_count[2],
|
||||
timer_cur_count[2];
|
||||
uint16_t port;
|
||||
uint8_t status, timer_ctrl;
|
||||
uint16_t timer_count[2],
|
||||
timer_cur_count[2];
|
||||
|
||||
pc_timer_t timers[2];
|
||||
pc_timer_t timers[2];
|
||||
|
||||
int pos;
|
||||
int32_t buffer[SOUNDBUFLEN * 2];
|
||||
int pos;
|
||||
int32_t buffer[SOUNDBUFLEN * 2];
|
||||
} opl_t;
|
||||
|
||||
extern void opl_set_do_cycles(opl_t *dev, int8_t do_cycles);
|
||||
|
||||
extern void opl_set_do_cycles(opl_t *dev, int8_t do_cycles);
|
||||
extern uint8_t opl2_read(uint16_t port, void *);
|
||||
extern void opl2_write(uint16_t port, uint8_t val, void *);
|
||||
extern void opl2_init(opl_t *);
|
||||
extern void opl2_update(opl_t *);
|
||||
|
||||
extern uint8_t opl2_read(uint16_t port, void *);
|
||||
extern void opl2_write(uint16_t port, uint8_t val, void *);
|
||||
extern void opl2_init(opl_t *);
|
||||
extern void opl2_update(opl_t *);
|
||||
extern uint8_t opl3_read(uint16_t port, void *);
|
||||
extern void opl3_write(uint16_t port, uint8_t val, void *);
|
||||
extern void opl3_init(opl_t *);
|
||||
extern void opl3_update(opl_t *);
|
||||
|
||||
extern uint8_t opl3_read(uint16_t port, void *);
|
||||
extern void opl3_write(uint16_t port, uint8_t val, void *);
|
||||
extern void opl3_init(opl_t *);
|
||||
extern void opl3_update(opl_t *);
|
||||
|
||||
#endif /*SOUND_OPL_H*/
|
||||
#endif /*SOUND_OPL_H*/
|
||||
|
||||
@@ -18,18 +18,17 @@
|
||||
*/
|
||||
|
||||
#ifndef SOUND_OPL_NUKED_H
|
||||
# define SOUND_OPL_NUKED_H
|
||||
#define SOUND_OPL_NUKED_H
|
||||
|
||||
extern void *nuked_init(uint32_t sample_rate);
|
||||
extern void nuked_close(void *);
|
||||
|
||||
extern void * nuked_init(uint32_t sample_rate);
|
||||
extern void nuked_close(void *);
|
||||
extern uint16_t nuked_write_addr(void *, uint16_t port, uint8_t val);
|
||||
extern void nuked_write_reg(void *, uint16_t reg, uint8_t v);
|
||||
extern void nuked_write_reg_buffered(void *, uint16_t reg, uint8_t v);
|
||||
|
||||
extern uint16_t nuked_write_addr(void *, uint16_t port, uint8_t val);
|
||||
extern void nuked_write_reg(void *, uint16_t reg, uint8_t v);
|
||||
extern void nuked_write_reg_buffered(void *, uint16_t reg, uint8_t v);
|
||||
extern void nuked_generate(void *, int32_t *buf);
|
||||
extern void nuked_generate_resampled(void *, int32_t *buf);
|
||||
extern void nuked_generate_stream(void *, int32_t *sndptr, uint32_t num);
|
||||
|
||||
extern void nuked_generate(void *, int32_t *buf);
|
||||
extern void nuked_generate_resampled(void *, int32_t *buf);
|
||||
extern void nuked_generate_stream(void *, int32_t *sndptr, uint32_t num);
|
||||
|
||||
#endif /*SOUND_OPL_NUKED_H*/
|
||||
#endif /*SOUND_OPL_NUKED_H*/
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
#ifndef SOUND_RESID_H
|
||||
# define SOUND_RESID_H
|
||||
#define SOUND_RESID_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void *sid_init();
|
||||
void sid_close(void *p);
|
||||
void sid_reset(void *p);
|
||||
uint8_t sid_read(uint16_t addr, void *p);
|
||||
void sid_write(uint16_t addr, uint8_t val, void *p);
|
||||
void sid_fillbuf(int16_t *buf, int len, void *p);
|
||||
void *sid_init();
|
||||
void sid_close(void *p);
|
||||
void sid_reset(void *p);
|
||||
uint8_t sid_read(uint16_t addr, void *p);
|
||||
void sid_write(uint16_t addr, uint8_t val, void *p);
|
||||
void sid_fillbuf(int16_t *buf, int len, void *p);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,143 +1,157 @@
|
||||
/*
|
||||
* 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, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* TheCollector1995, <mariogplayer@gmail.com>
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* TheCollector1995, <mariogplayer@gmail.com>
|
||||
*
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
*/
|
||||
|
||||
#ifndef SOUND_SND_SB_H
|
||||
# define SOUND_SND_SB_H
|
||||
#define SOUND_SND_SB_H
|
||||
|
||||
#include <86box/snd_cms.h>
|
||||
#include <86box/snd_emu8k.h>
|
||||
#include <86box/snd_mpu401.h>
|
||||
#include <86box/snd_opl.h>
|
||||
#include <86box/snd_sb_dsp.h>
|
||||
#include <86box/snd_cms.h>
|
||||
|
||||
#define SADLIB 1 /* No DSP */
|
||||
#define SB1 2 /* DSP v1.05 */
|
||||
#define SB15 3 /* DSP v2.00 */
|
||||
#define SB2 4 /* DSP v2.01 - needed for high-speed DMA */
|
||||
#define SBPRO 5 /* DSP v3.00 */
|
||||
#define SBPRO2 6 /* DSP v3.02 + OPL3 */
|
||||
#define SB16 7 /* DSP v4.05 + OPL3 */
|
||||
#define SBAWE32 8 /* DSP v4.13 + OPL3 */
|
||||
#define SBAWE64 9 /* DSP v4.16 + OPL3 */
|
||||
#define SADLIB 1 /* No DSP */
|
||||
#define SB1 2 /* DSP v1.05 */
|
||||
#define SB15 3 /* DSP v2.00 */
|
||||
#define SB2 4 /* DSP v2.01 - needed for high-speed DMA */
|
||||
#define SBPRO 5 /* DSP v3.00 */
|
||||
#define SBPRO2 6 /* DSP v3.02 + OPL3 */
|
||||
#define SB16 7 /* DSP v4.05 + OPL3 */
|
||||
#define SBAWE32 8 /* DSP v4.13 + OPL3 */
|
||||
#define SBAWE64 9 /* DSP v4.16 + OPL3 */
|
||||
|
||||
/* SB 2.0 CD version */
|
||||
typedef struct sb_ct1335_mixer_t
|
||||
{
|
||||
double master;
|
||||
double voice;
|
||||
double fm;
|
||||
double cd;
|
||||
typedef struct sb_ct1335_mixer_t {
|
||||
double master;
|
||||
double voice;
|
||||
double fm;
|
||||
double cd;
|
||||
|
||||
uint8_t index;
|
||||
uint8_t regs[256];
|
||||
uint8_t index;
|
||||
uint8_t regs[256];
|
||||
} sb_ct1335_mixer_t;
|
||||
|
||||
/* SB PRO */
|
||||
typedef struct sb_ct1345_mixer_t
|
||||
{
|
||||
double master_l, master_r;
|
||||
double voice_l, voice_r;
|
||||
double fm_l, fm_r;
|
||||
double cd_l, cd_r;
|
||||
double line_l, line_r;
|
||||
double mic;
|
||||
/*see sb_ct1745_mixer for values for input selector*/
|
||||
int32_t input_selector;
|
||||
typedef struct sb_ct1345_mixer_t {
|
||||
double master_l,
|
||||
master_r;
|
||||
double voice_l,
|
||||
voice_r;
|
||||
double fm_l,
|
||||
fm_r;
|
||||
double cd_l,
|
||||
cd_r;
|
||||
double line_l,
|
||||
line_r;
|
||||
double mic;
|
||||
/*see sb_ct1745_mixer for values for input selector*/
|
||||
int32_t input_selector;
|
||||
|
||||
int input_filter;
|
||||
int in_filter_freq;
|
||||
int output_filter;
|
||||
int input_filter;
|
||||
int in_filter_freq;
|
||||
int output_filter;
|
||||
|
||||
int stereo;
|
||||
int stereo_isleft;
|
||||
int stereo;
|
||||
int stereo_isleft;
|
||||
|
||||
uint8_t index;
|
||||
uint8_t regs[256];
|
||||
uint8_t index;
|
||||
uint8_t regs[256];
|
||||
|
||||
} sb_ct1345_mixer_t;
|
||||
|
||||
/* SB16 and AWE32 */
|
||||
typedef struct sb_ct1745_mixer_t
|
||||
{
|
||||
double master_l, master_r;
|
||||
double voice_l, voice_r;
|
||||
double fm_l, fm_r;
|
||||
double cd_l, cd_r;
|
||||
double line_l, line_r;
|
||||
double mic;
|
||||
double speaker;
|
||||
typedef struct sb_ct1745_mixer_t {
|
||||
double master_l,
|
||||
master_r;
|
||||
double voice_l,
|
||||
voice_r;
|
||||
double fm_l,
|
||||
fm_r;
|
||||
double cd_l,
|
||||
cd_r;
|
||||
double line_l,
|
||||
line_r;
|
||||
double mic;
|
||||
double speaker;
|
||||
|
||||
int bass_l, bass_r;
|
||||
int treble_l, treble_r;
|
||||
int bass_l,
|
||||
bass_r;
|
||||
int treble_l,
|
||||
treble_r;
|
||||
|
||||
int output_selector;
|
||||
#define OUTPUT_MIC 1
|
||||
#define OUTPUT_CD_R 2
|
||||
#define OUTPUT_CD_L 4
|
||||
#define OUTPUT_LINE_R 8
|
||||
#define OUTPUT_LINE_L 16
|
||||
int output_selector;
|
||||
#define OUTPUT_MIC 1
|
||||
#define OUTPUT_CD_R 2
|
||||
#define OUTPUT_CD_L 4
|
||||
#define OUTPUT_LINE_R 8
|
||||
#define OUTPUT_LINE_L 16
|
||||
|
||||
int input_selector_left;
|
||||
int input_selector_right;
|
||||
#define INPUT_MIC 1
|
||||
#define INPUT_CD_R 2
|
||||
#define INPUT_CD_L 4
|
||||
#define INPUT_LINE_R 8
|
||||
#define INPUT_LINE_L 16
|
||||
#define INPUT_MIDI_R 32
|
||||
#define INPUT_MIDI_L 64
|
||||
int input_selector_left;
|
||||
int input_selector_right;
|
||||
#define INPUT_MIC 1
|
||||
#define INPUT_CD_R 2
|
||||
#define INPUT_CD_L 4
|
||||
#define INPUT_LINE_R 8
|
||||
#define INPUT_LINE_L 16
|
||||
#define INPUT_MIDI_R 32
|
||||
#define INPUT_MIDI_L 64
|
||||
|
||||
int mic_agc;
|
||||
int mic_agc;
|
||||
|
||||
int32_t input_gain_L;
|
||||
int32_t input_gain_R;
|
||||
double output_gain_L;
|
||||
double output_gain_R;
|
||||
int32_t input_gain_L;
|
||||
int32_t input_gain_R;
|
||||
double output_gain_L;
|
||||
double output_gain_R;
|
||||
|
||||
uint8_t index;
|
||||
uint8_t regs[256];
|
||||
uint8_t index;
|
||||
uint8_t regs[256];
|
||||
|
||||
int output_filter; /* for clones */
|
||||
} sb_ct1745_mixer_t;
|
||||
|
||||
typedef struct sb_t
|
||||
{
|
||||
uint8_t cms_enabled, opl_enabled, mixer_enabled;
|
||||
cms_t cms;
|
||||
opl_t opl, opl2;
|
||||
sb_dsp_t dsp;
|
||||
union {
|
||||
sb_ct1335_mixer_t mixer_sb2;
|
||||
sb_ct1345_mixer_t mixer_sbpro;
|
||||
sb_ct1745_mixer_t mixer_sb16;
|
||||
};
|
||||
mpu_t *mpu;
|
||||
emu8k_t emu8k;
|
||||
void *gameport;
|
||||
typedef struct sb_t {
|
||||
uint8_t cms_enabled,
|
||||
opl_enabled,
|
||||
mixer_enabled;
|
||||
cms_t cms;
|
||||
opl_t opl,
|
||||
opl2;
|
||||
sb_dsp_t dsp;
|
||||
union {
|
||||
sb_ct1335_mixer_t mixer_sb2;
|
||||
sb_ct1345_mixer_t mixer_sbpro;
|
||||
sb_ct1745_mixer_t mixer_sb16;
|
||||
};
|
||||
mpu_t *mpu;
|
||||
emu8k_t emu8k;
|
||||
void *gameport;
|
||||
|
||||
int pos;
|
||||
int pos;
|
||||
|
||||
uint8_t pos_regs[8], pnp_rom[512];
|
||||
uint8_t pos_regs[8],
|
||||
pnp_rom[512];
|
||||
|
||||
uint16_t opl_pnp_addr;
|
||||
uint16_t opl_pnp_addr;
|
||||
} sb_t;
|
||||
|
||||
extern void sb_ct1345_mixer_write(uint16_t addr, uint8_t val, void *p);
|
||||
extern void sb_ct1345_mixer_write(uint16_t addr, uint8_t val, void *p);
|
||||
extern uint8_t sb_ct1345_mixer_read(uint16_t addr, void *p);
|
||||
extern void sb_ct1345_mixer_reset(sb_t* sb);
|
||||
extern void sb_ct1345_mixer_reset(sb_t *sb);
|
||||
|
||||
extern void sb_ct1745_mixer_write(uint16_t addr, uint8_t val, void *p);
|
||||
extern uint8_t sb_ct1745_mixer_read(uint16_t addr, void *p);
|
||||
@@ -149,4 +163,4 @@ extern void sb16_awe32_filter_cd_audio(int channel, double *buffer, void *p);
|
||||
extern void sb_close(void *p);
|
||||
extern void sb_speed_changed(void *p);
|
||||
|
||||
#endif /*SOUND_SND_SB_H*/
|
||||
#endif /*SOUND_SND_SB_H*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef SOUND_SND_SB_DSP_H
|
||||
# define SOUND_SND_SB_DSP_H
|
||||
#define SOUND_SND_SB_DSP_H
|
||||
|
||||
/*Sound Blaster Clones, for quirks*/
|
||||
#define SB_SUBTYPE_DEFAULT 0 /*Handle as a Creative card*/
|
||||
@@ -7,101 +7,99 @@
|
||||
#define SB_SUBTYPE_CLONE_AZT1605_0X0C 2 /*Aztech Sound Galaxy Nova 16 Extra / Packard Bell Forte 16, DSP 2.1 - SBPRO2 clone*/
|
||||
|
||||
/* aztech-related */
|
||||
#define IS_AZTECH(dsp) ((dsp)->sb_subtype == SB_SUBTYPE_CLONE_AZT2316A_0X11 || (dsp)->sb_subtype == SB_SUBTYPE_CLONE_AZT1605_0X0C) /* check for future AZT cards here */
|
||||
#define AZTECH_EEPROM_SIZE 16
|
||||
#define IS_AZTECH(dsp) ((dsp)->sb_subtype == SB_SUBTYPE_CLONE_AZT2316A_0X11 || (dsp)->sb_subtype == SB_SUBTYPE_CLONE_AZT1605_0X0C) /* check for future AZT cards here */
|
||||
#define AZTECH_EEPROM_SIZE 16
|
||||
|
||||
typedef struct sb_dsp_t
|
||||
{
|
||||
int sb_type;
|
||||
int sb_subtype; /* which clone */
|
||||
void *parent; /* "sb_t *" if default subtype, "azt2316a_t *" if aztech. */
|
||||
typedef struct sb_dsp_t {
|
||||
int sb_type;
|
||||
int sb_subtype; /* which clone */
|
||||
void *parent; /* "sb_t *" if default subtype, "azt2316a_t *" if aztech. */
|
||||
|
||||
int sb_8_length, sb_8_format, sb_8_autoinit, sb_8_pause, sb_8_enable, sb_8_autolen, sb_8_output;
|
||||
int sb_8_dmanum;
|
||||
int sb_16_length, sb_16_format, sb_16_autoinit, sb_16_pause, sb_16_enable, sb_16_autolen, sb_16_output;
|
||||
int sb_16_dmanum;
|
||||
int sb_pausetime;
|
||||
int sb_8_length, sb_8_format, sb_8_autoinit, sb_8_pause, sb_8_enable, sb_8_autolen, sb_8_output;
|
||||
int sb_8_dmanum;
|
||||
int sb_16_length, sb_16_format, sb_16_autoinit, sb_16_pause, sb_16_enable, sb_16_autolen, sb_16_output;
|
||||
int sb_16_dmanum;
|
||||
int sb_pausetime;
|
||||
|
||||
uint8_t sb_read_data[256];
|
||||
int sb_read_wp, sb_read_rp;
|
||||
int sb_speaker;
|
||||
int muted;
|
||||
uint8_t sb_read_data[256];
|
||||
int sb_read_wp, sb_read_rp;
|
||||
int sb_speaker;
|
||||
int muted;
|
||||
|
||||
int sb_data_stat;
|
||||
int sb_data_stat;
|
||||
|
||||
int midi_in_sysex;
|
||||
int midi_in_poll;
|
||||
int uart_midi;
|
||||
int uart_irq;
|
||||
int onebyte_midi;
|
||||
int midi_in_timestamp;
|
||||
int midi_in_sysex;
|
||||
int midi_in_poll;
|
||||
int uart_midi;
|
||||
int uart_irq;
|
||||
int onebyte_midi;
|
||||
int midi_in_timestamp;
|
||||
|
||||
int sb_irqnum;
|
||||
int sb_irqnum;
|
||||
|
||||
uint8_t sbe2;
|
||||
int sbe2count;
|
||||
uint8_t sbe2;
|
||||
int sbe2count;
|
||||
|
||||
uint8_t sb_data[8];
|
||||
uint8_t sb_data[8];
|
||||
|
||||
int sb_freq;
|
||||
int sb_freq;
|
||||
|
||||
int16_t sbdat;
|
||||
int sbdat2;
|
||||
int16_t sbdatl, sbdatr;
|
||||
int16_t sbdat;
|
||||
int sbdat2;
|
||||
int16_t sbdatl, sbdatr;
|
||||
|
||||
uint8_t sbref;
|
||||
int8_t sbstep;
|
||||
uint8_t sbref;
|
||||
int8_t sbstep;
|
||||
|
||||
int sbdacpos;
|
||||
int sbdacpos;
|
||||
|
||||
int sbleftright;
|
||||
int sbleftright;
|
||||
|
||||
int sbreset;
|
||||
uint8_t sbreaddat;
|
||||
uint8_t sb_command;
|
||||
uint8_t sb_test;
|
||||
int sb_timei, sb_timeo;
|
||||
int sbreset;
|
||||
uint8_t sbreaddat;
|
||||
uint8_t sb_command;
|
||||
uint8_t sb_test;
|
||||
int sb_timei, sb_timeo;
|
||||
|
||||
int sb_irq8, sb_irq16, sb_irq401;
|
||||
int sb_irqm8, sb_irqm16, sb_irqm401;
|
||||
int sb_irq8, sb_irq16, sb_irq401;
|
||||
int sb_irqm8, sb_irqm16, sb_irqm401;
|
||||
|
||||
uint8_t sb_asp_regs[256];
|
||||
uint8_t sb_asp_mode;
|
||||
uint8_t sb_asp_regs[256];
|
||||
uint8_t sb_asp_mode;
|
||||
|
||||
uint8_t sb_asp_ram[2048];
|
||||
int sb_asp_ram_index;
|
||||
uint8_t sb_asp_ram[2048];
|
||||
int sb_asp_ram_index;
|
||||
|
||||
uint8_t sb_8051_ram[256];
|
||||
uint8_t sb_8051_ram[256];
|
||||
|
||||
int sbenable, sb_enable_i;
|
||||
int sbenable, sb_enable_i;
|
||||
|
||||
pc_timer_t output_timer, input_timer;
|
||||
pc_timer_t output_timer, input_timer;
|
||||
|
||||
uint64_t sblatcho, sblatchi;
|
||||
uint64_t sblatcho, sblatchi;
|
||||
|
||||
uint16_t sb_addr;
|
||||
uint16_t sb_addr;
|
||||
|
||||
int stereo;
|
||||
int stereo;
|
||||
|
||||
int asp_data_len;
|
||||
int asp_data_len;
|
||||
|
||||
pc_timer_t wb_timer;
|
||||
int wb_full;
|
||||
pc_timer_t wb_timer;
|
||||
int wb_full;
|
||||
|
||||
int busy_count;
|
||||
int busy_count;
|
||||
|
||||
int record_pos_read;
|
||||
int record_pos_write;
|
||||
int16_t record_buffer[0xFFFF];
|
||||
int16_t buffer[SOUNDBUFLEN * 2];
|
||||
int pos;
|
||||
int record_pos_read;
|
||||
int record_pos_write;
|
||||
int16_t record_buffer[0xFFFF];
|
||||
int16_t buffer[SOUNDBUFLEN * 2];
|
||||
int pos;
|
||||
|
||||
uint8_t azt_eeprom[AZTECH_EEPROM_SIZE]; /* the eeprom in the Aztech cards is attached to the DSP */
|
||||
uint8_t azt_eeprom[AZTECH_EEPROM_SIZE]; /* the eeprom in the Aztech cards is attached to the DSP */
|
||||
|
||||
mpu_t *mpu;
|
||||
mpu_t *mpu;
|
||||
} sb_dsp_t;
|
||||
|
||||
|
||||
void sb_dsp_input_msg(void *p, uint8_t *msg, uint32_t len);
|
||||
|
||||
int sb_dsp_input_sysex(void *p, uint8_t *buffer, uint32_t len, int abort);
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
#ifndef SOUND_SN76489_H
|
||||
# define SOUND_SN76489_H
|
||||
#define SOUND_SN76489_H
|
||||
|
||||
enum
|
||||
{
|
||||
SN76496,
|
||||
NCR8496,
|
||||
PSSJ
|
||||
enum {
|
||||
SN76496,
|
||||
NCR8496,
|
||||
PSSJ
|
||||
};
|
||||
|
||||
extern const device_t sn76489_device;
|
||||
@@ -13,23 +12,22 @@ extern const device_t ncr8496_device;
|
||||
|
||||
extern int sn76489_mute;
|
||||
|
||||
typedef struct sn76489_t
|
||||
{
|
||||
int stat[4];
|
||||
int latch[4], count[4];
|
||||
int freqlo[4], freqhi[4];
|
||||
int vol[4];
|
||||
uint32_t shift;
|
||||
uint8_t noise;
|
||||
int lasttone;
|
||||
uint8_t firstdat;
|
||||
int type;
|
||||
int extra_divide;
|
||||
typedef struct sn76489_t {
|
||||
int stat[4];
|
||||
int latch[4], count[4];
|
||||
int freqlo[4], freqhi[4];
|
||||
int vol[4];
|
||||
uint32_t shift;
|
||||
uint8_t noise;
|
||||
int lasttone;
|
||||
uint8_t firstdat;
|
||||
int type;
|
||||
int extra_divide;
|
||||
|
||||
int16_t buffer[SOUNDBUFLEN];
|
||||
int pos;
|
||||
int16_t buffer[SOUNDBUFLEN];
|
||||
int pos;
|
||||
|
||||
double psgconst;
|
||||
double psgconst;
|
||||
} sn76489_t;
|
||||
|
||||
void sn76489_init(sn76489_t *sn76489, uint16_t base, uint16_t size, int type, int freq);
|
||||
|
||||
@@ -18,17 +18,16 @@
|
||||
*/
|
||||
|
||||
#ifndef SOUND_SPEAKER_H
|
||||
# define SOUND_SPEAKER_H
|
||||
#define SOUND_SPEAKER_H
|
||||
|
||||
extern int speaker_mute;
|
||||
extern int speaker_mute;
|
||||
|
||||
extern int speaker_gated;
|
||||
extern int speaker_enable, was_speaker_enable;
|
||||
extern int speaker_gated;
|
||||
extern int speaker_enable, was_speaker_enable;
|
||||
|
||||
extern void speaker_init();
|
||||
|
||||
extern void speaker_init();
|
||||
|
||||
extern void speaker_set_count(uint8_t new_m, int new_count);
|
||||
extern void speaker_update(void);
|
||||
extern void speaker_set_count(uint8_t new_m, int new_count);
|
||||
extern void speaker_update(void);
|
||||
|
||||
#endif /*SOUND_SPEAKER_H*/
|
||||
|
||||
@@ -1,26 +1,25 @@
|
||||
#ifndef SOUND_YM7128_H
|
||||
# define SOUND_YM7128_H
|
||||
#define SOUND_YM7128_H
|
||||
|
||||
typedef struct ym7128_t
|
||||
{
|
||||
int a0, sci;
|
||||
uint8_t dat;
|
||||
typedef struct ym7128_t {
|
||||
int a0, sci;
|
||||
uint8_t dat;
|
||||
|
||||
int reg_sel;
|
||||
uint8_t regs[32];
|
||||
int reg_sel;
|
||||
uint8_t regs[32];
|
||||
|
||||
int gl[8], gr[8];
|
||||
int vm, vc, vl, vr;
|
||||
int c0, c1;
|
||||
int t[9];
|
||||
int gl[8], gr[8];
|
||||
int vm, vc, vl, vr;
|
||||
int c0, c1;
|
||||
int t[9];
|
||||
|
||||
int16_t filter_dat;
|
||||
int16_t prev_l, prev_r;
|
||||
int16_t filter_dat;
|
||||
int16_t prev_l, prev_r;
|
||||
|
||||
int16_t delay_buffer[2400];
|
||||
int delay_pos;
|
||||
int16_t delay_buffer[2400];
|
||||
int delay_pos;
|
||||
|
||||
int16_t last_samp;
|
||||
int16_t last_samp;
|
||||
} ym7128_t;
|
||||
|
||||
void ym7128_init(ym7128_t *ym7128);
|
||||
|
||||
@@ -1,78 +1,76 @@
|
||||
/*
|
||||
* 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 emulation core.
|
||||
* Sound emulation core.
|
||||
*
|
||||
*
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
*/
|
||||
|
||||
#ifndef EMU_SOUND_H
|
||||
# define EMU_SOUND_H
|
||||
#define EMU_SOUND_H
|
||||
|
||||
extern int sound_gain;
|
||||
|
||||
#define SOUNDBUFLEN (48000/50)
|
||||
|
||||
#define CD_FREQ 44100
|
||||
#define CD_BUFLEN (CD_FREQ / 10)
|
||||
#define SOUNDBUFLEN (48000 / 50)
|
||||
|
||||
#define CD_FREQ 44100
|
||||
#define CD_BUFLEN (CD_FREQ / 10)
|
||||
|
||||
enum {
|
||||
SOUND_NONE = 0,
|
||||
SOUND_INTERNAL
|
||||
};
|
||||
|
||||
extern int ppispeakon;
|
||||
extern int gated,
|
||||
speakval,
|
||||
speakon;
|
||||
|
||||
extern int ppispeakon;
|
||||
extern int gated,
|
||||
speakval,
|
||||
speakon;
|
||||
extern int sound_pos_global;
|
||||
extern int sound_card_current;
|
||||
|
||||
extern int sound_pos_global;
|
||||
extern int sound_card_current;
|
||||
extern void sound_add_handler(void (*get_buffer)(int32_t *buffer,
|
||||
int len, void *p),
|
||||
void *p);
|
||||
extern void sound_set_cd_audio_filter(void (*filter)(int channel,
|
||||
double *buffer, void *p),
|
||||
void *p);
|
||||
|
||||
|
||||
extern void sound_add_handler(void (*get_buffer)(int32_t *buffer, \
|
||||
int len, void *p), void *p);
|
||||
extern void sound_set_cd_audio_filter(void (*filter)(int channel, \
|
||||
double *buffer, void *p), void *p);
|
||||
|
||||
extern int sound_card_available(int card);
|
||||
extern int sound_card_available(int card);
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t *sound_card_getdevice(int card);
|
||||
extern const device_t *sound_card_getdevice(int card);
|
||||
#endif
|
||||
extern int sound_card_has_config(int card);
|
||||
extern char *sound_card_get_internal_name(int card);
|
||||
extern int sound_card_get_from_internal_name(char *s);
|
||||
extern void sound_card_init(void);
|
||||
extern void sound_set_cd_volume(unsigned int vol_l, unsigned int vol_r);
|
||||
extern int sound_card_has_config(int card);
|
||||
extern char *sound_card_get_internal_name(int card);
|
||||
extern int sound_card_get_from_internal_name(char *s);
|
||||
extern void sound_card_init(void);
|
||||
extern void sound_set_cd_volume(unsigned int vol_l, unsigned int vol_r);
|
||||
|
||||
extern void sound_speed_changed(void);
|
||||
extern void sound_speed_changed(void);
|
||||
|
||||
extern void sound_init(void);
|
||||
extern void sound_reset(void);
|
||||
extern void sound_init(void);
|
||||
extern void sound_reset(void);
|
||||
|
||||
extern void sound_card_reset(void);
|
||||
extern void sound_card_reset(void);
|
||||
|
||||
extern void sound_cd_thread_end(void);
|
||||
extern void sound_cd_thread_reset(void);
|
||||
|
||||
extern void closeal(void);
|
||||
extern void inital(void);
|
||||
extern void givealbuffer(void *buf);
|
||||
extern void givealbuffer_cd(void *buf);
|
||||
extern void sound_cd_thread_end(void);
|
||||
extern void sound_cd_thread_reset(void);
|
||||
|
||||
extern void closeal(void);
|
||||
extern void inital(void);
|
||||
extern void givealbuffer(void *buf);
|
||||
extern void givealbuffer_cd(void *buf);
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
/* AdLib and AdLib Gold */
|
||||
@@ -94,20 +92,20 @@ extern const device_t cms_device;
|
||||
/* Gravis UltraSound and UltraSound Max */
|
||||
extern const device_t gus_device;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_PAS16)
|
||||
# if defined(DEV_BRANCH) && defined(USE_PAS16)
|
||||
/* Pro Audio Spectrum 16 */
|
||||
extern const device_t pas16_device;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
/* IBM PS/1 Audio Card */
|
||||
extern const device_t ps1snd_device;
|
||||
|
||||
/* Tandy PSSJ */
|
||||
extern const device_t pssj_device;
|
||||
#if defined(DEV_BRANCH) && defined(USE_TANDY_ISA)
|
||||
# if defined(DEV_BRANCH) && defined(USE_TANDY_ISA)
|
||||
extern const device_t pssj_isa_device;
|
||||
extern const device_t tndy_device;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
/* Creative Labs Sound Blaster */
|
||||
extern const device_t sb_1_device;
|
||||
@@ -121,6 +119,7 @@ extern const device_t sb_pro_compat_device;
|
||||
extern const device_t sb_16_device;
|
||||
extern const device_t sb_16_pnp_device;
|
||||
extern const device_t sb_16_compat_device;
|
||||
extern const device_t sb_16_compat_nompu_device;
|
||||
extern const device_t sb_32_pnp_device;
|
||||
extern const device_t sb_awe32_device;
|
||||
extern const device_t sb_awe32_pnp_device;
|
||||
@@ -149,4 +148,4 @@ extern const device_t cmi8738_device;
|
||||
extern const device_t cmi8738_onboard_device;
|
||||
#endif
|
||||
|
||||
#endif /*EMU_SOUND_H*/
|
||||
#endif /*EMU_SOUND_H*/
|
||||
|
||||
@@ -158,7 +158,8 @@ typedef struct svga_t
|
||||
|
||||
/*Force CRTC to dword mode, regardless of CR14/CR17. Required for S3 enhanced mode*/
|
||||
int force_dword_mode;
|
||||
int force_byte_mode;
|
||||
|
||||
int force_old_addr;
|
||||
|
||||
int remap_required;
|
||||
uint32_t (*remap_func)(struct svga_t *svga, uint32_t in_addr);
|
||||
|
||||
@@ -104,7 +104,7 @@ void svga_recalc_remap_func(svga_t *svga)
|
||||
{
|
||||
int func_nr;
|
||||
|
||||
if (svga->fb_only || svga->force_byte_mode)
|
||||
if (svga->fb_only)
|
||||
func_nr = 0;
|
||||
else {
|
||||
if (svga->force_dword_mode)
|
||||
|
||||
Reference in New Issue
Block a user