Merge pull request #6602 from Domppari/fdd_bios_post_test_audio_support

FDD BIOS POST test audio support and AMIBIOS special case
This commit is contained in:
Miran Grča
2025-12-21 22:20:33 +01:00
committed by GitHub
5 changed files with 492 additions and 105 deletions

View File

@@ -26,6 +26,12 @@
#define SEEK_RECALIBRATE -999
#define DEFAULT_SEEK_TIME_MS 10.0
/* BIOS boot status - used to detect POST vs normal operation */
typedef enum {
BIOS_BOOT_POST = 0, /* System is in POST (Power-On Self Test) */
BIOS_BOOT_NORMAL = 1 /* POST complete, normal operation */
} bios_boot_status_t;
#ifdef __cplusplus
extern "C" {
#endif
@@ -118,6 +124,12 @@ extern int fdd_hole(int drive);
extern void fdd_stop(int drive);
extern void fdd_do_writeback(int drive);
/* BIOS boot status functions */
extern bios_boot_status_t fdd_get_boot_status(void);
extern void fdd_set_boot_status(bios_boot_status_t status);
extern void fdd_boot_status_reset(void);
extern int fdd_is_post_complete(void);
extern int motorspin;
extern uint64_t motoron[FDD_NUM];

View File

@@ -16,6 +16,7 @@
#define EMU_FDD_AUDIO_H
#include <stdint.h>
#include <86box/fdd.h>
#ifdef __cplusplus
extern "C" {
@@ -29,6 +30,9 @@ extern "C" {
/* Maximum number of simultaneous seek sounds per drive */
#define MAX_CONCURRENT_SEEKS 8
/* Number of BIOS vendors (for BIOS-specific samples) */
#define BIOS_VENDOR_COUNT 7
/* Audio sample configuration structure */
typedef struct {
char filename[512];
@@ -45,7 +49,15 @@ typedef struct {
audio_sample_config_t spindlemotor_stop;
audio_sample_config_t seek_up[MAX_SEEK_SAMPLES];
audio_sample_config_t seek_down[MAX_SEEK_SAMPLES];
double seek_time_ms[MAX_SEEK_SAMPLES]; /* Seek time in milliseconds for each track count */
audio_sample_config_t post_seek_up[MAX_SEEK_SAMPLES];
audio_sample_config_t post_seek_down[MAX_SEEK_SAMPLES];
/* BIOS vendor-specific POST seek samples [vendor][track] */
audio_sample_config_t bios_post_seek_up[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES];
audio_sample_config_t bios_post_seek_down[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES];
double seek_time_ms[MAX_SEEK_SAMPLES];
double post_seek_time_ms[MAX_SEEK_SAMPLES];
/* BIOS vendor-specific POST seek times [vendor][track] */
double bios_post_seek_time_ms[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES];
int total_tracks; /* 40 or 80 */
} fdd_audio_profile_config_t;
@@ -76,6 +88,45 @@ typedef struct {
uint32_t data_size;
} wav_header_t;
/* Audio sample structure */
typedef struct {
char filename[512];
int16_t *buffer;
int samples;
float volume;
} audio_sample_t;
typedef struct {
int position;
int active;
} single_step_state_t;
/* Multi-track seek audio state */
typedef struct {
int position;
int active;
int duration_samples;
int from_track;
int to_track;
int track_diff;
audio_sample_t *sample_to_play;
} multi_seek_state_t;
/* Drive type specific audio samples */
typedef struct {
audio_sample_t spindlemotor_start;
audio_sample_t spindlemotor_loop;
audio_sample_t spindlemotor_stop;
/* Individual seek samples for each track count (indexed 0-78 for 1-79 tracks) */
audio_sample_t seek_up[MAX_SEEK_SAMPLES];
audio_sample_t seek_down[MAX_SEEK_SAMPLES];
audio_sample_t post_seek_up[MAX_SEEK_SAMPLES];
audio_sample_t post_seek_down[MAX_SEEK_SAMPLES];
/* BIOS vendor-specific POST seek samples [vendor][track] */
audio_sample_t bios_post_seek_up[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES];
audio_sample_t bios_post_seek_down[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES];
} drive_audio_samples_t;
/* Fade duration: 75ms at 48kHz = 3600 samples */
#define FADE_DURATION_MS 75
#define FADE_SAMPLES (48000 * FADE_DURATION_MS / 1000)
@@ -89,6 +140,8 @@ extern const char* fdd_audio_get_profile_internal_name(int id);
extern int fdd_audio_get_profile_by_internal_name(const char *internal_name);
extern double fdd_audio_get_seek_time(int drive, int track_count, int is_seek_down);
extern void load_profile_samples(int profile_id);
extern int fdd_get_audio_profile(int drive);
extern bios_boot_status_t fdd_get_boot_status(void);
#else