mirror of
https://github.com/polpo/picogus.git
synced 2026-10-25 21:40:16 +00:00
282 lines
8.0 KiB
C
282 lines
8.0 KiB
C
/*
|
|
* 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.
|
|
*
|
|
* Generic CD-ROM drive core header.
|
|
*
|
|
* Authors: Miran Grca, <mgrca8@gmail.com>,
|
|
* Kevin Moonlight, <me@yyzkevin.com>
|
|
* Ian Scott, <ian@polpo.org>
|
|
*
|
|
* Copyright 2016-2019 Miran Grca.
|
|
* Copyright (C) 2024 Kevin Moonlight
|
|
* Copyright (C) 2025 Ian Scott
|
|
* Copyright (C) 2025 Daniel Arnold
|
|
*/
|
|
|
|
#ifndef EMU_CDROM_H
|
|
#define EMU_CDROM_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
|
|
#define CD_STATUS_EMPTY 0
|
|
#define CD_STATUS_DATA_ONLY 1
|
|
#define CD_STATUS_PAUSED 2
|
|
#define CD_STATUS_PLAYING 3
|
|
#define CD_STATUS_STOPPED 4
|
|
#define CD_STATUS_PLAYING_COMPLETED 5
|
|
|
|
/* Medium changed flag. */
|
|
#define CD_STATUS_MEDIUM_CHANGED 0x80
|
|
|
|
#define CD_TRACK_AUDIO 0x08
|
|
#define CD_TRACK_MODE2 0x04
|
|
|
|
#define CD_READ_DATA 0
|
|
#define CD_READ_AUDIO 1
|
|
#define CD_READ_RAW 2
|
|
|
|
#define CD_TOC_NORMAL 0
|
|
#define CD_TOC_SESSION 1
|
|
#define CD_TOC_RAW 2
|
|
|
|
#define CD_IMAGE_HISTORY 4
|
|
|
|
// #define BUF_SIZE 32768
|
|
#define BUF_SIZE 4096
|
|
|
|
#define CDROM_IMAGE 200
|
|
|
|
#define RAW_SECTOR_SIZE 2352
|
|
#define SAMPLES_PER_SECTOR 1176
|
|
#define STEREO_SAMPLES_PER_SECTOR 588
|
|
|
|
#define STAT_READY 0x01
|
|
#define STAT_PLAY 0x08
|
|
#define STAT_ERROR 0x10
|
|
#define STAT_DISK 0x40
|
|
#define STAT_TRAY 0x80
|
|
|
|
/* This is so that if/when this is changed to something else,
|
|
changing this one define will be enough. */
|
|
#define CDROM_EMPTY !dev->host_drive
|
|
|
|
#include "../../common/picogus.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* To shut up the GCC compilers. */
|
|
struct cdrom;
|
|
|
|
typedef enum
|
|
{
|
|
CD_COMMAND_NONE,
|
|
CD_COMMAND_IMAGE_LOAD,
|
|
CD_COMMAND_IMAGE_LOAD_INDEX,
|
|
CD_COMMAND_IMAGE_EJECT,
|
|
CD_COMMAND_IMAGE_LIST
|
|
} cdrom_image_command_t;
|
|
|
|
/*
|
|
typedef enum
|
|
{
|
|
CD_STATUS_ERROR = -1,
|
|
CD_STATUS_IDLE,
|
|
CD_STATUS_BUSY,
|
|
CD_STATUS_READY,
|
|
} cdrom_image_status_t;
|
|
*/
|
|
|
|
typedef struct subchannel_t {
|
|
uint8_t attr;
|
|
uint8_t track;
|
|
uint8_t index;
|
|
uint8_t abs_m;
|
|
uint8_t abs_s;
|
|
uint8_t abs_f;
|
|
uint8_t rel_m;
|
|
uint8_t rel_s;
|
|
uint8_t rel_f;
|
|
} subchannel_t;
|
|
|
|
typedef struct track_info_t {
|
|
int number;
|
|
uint8_t attr;
|
|
uint8_t m;
|
|
uint8_t s;
|
|
uint8_t f;
|
|
} track_info_t;
|
|
|
|
/* Define the various CD-ROM drive operations (ops). */
|
|
typedef struct cdrom_ops_t {
|
|
void (*get_tracks)(struct cdrom *dev, int *first, int *last);
|
|
void (*get_track_info)(struct cdrom *dev, uint32_t track, int end, track_info_t *ti);
|
|
void (*get_subchannel)(struct cdrom *dev, uint32_t lba, subchannel_t *subc);
|
|
int (*is_track_pre)(struct cdrom *dev, uint32_t lba);
|
|
int (*sector_size)(struct cdrom *dev, uint32_t lba);
|
|
int (*read_sector)(struct cdrom *dev, int type, uint8_t *b, uint32_t lba);
|
|
int (*track_type)(struct cdrom *dev, uint32_t lba);
|
|
void (*exit)(struct cdrom *dev);
|
|
} cdrom_ops_t;
|
|
|
|
|
|
typedef struct cdrom_fifo_t {
|
|
uint8_t *data;
|
|
uint16_t size;
|
|
volatile uint16_t head;
|
|
volatile uint16_t tail;
|
|
} cdrom_fifo_t;
|
|
|
|
|
|
#include "audio/audio_fifo.h"
|
|
|
|
typedef struct cdrom {
|
|
uint8_t id;
|
|
|
|
cdrom_fifo_t info_fifo;
|
|
cdrom_fifo_t data_fifo;
|
|
|
|
volatile uint8_t req_m;
|
|
volatile uint8_t req_s;
|
|
volatile uint8_t req_f;
|
|
volatile uint8_t req_cur;
|
|
volatile uint8_t req_total;
|
|
|
|
uint8_t media_changed;
|
|
cdrom_image_command_t image_command;
|
|
cdrom_image_status_t image_status;
|
|
uint8_t image_data;
|
|
uint8_t disk_loaded;
|
|
|
|
uint8_t cd_status; /* Struct variable reserved for
|
|
media status. */
|
|
uint8_t speed;
|
|
uint8_t cur_speed;
|
|
|
|
|
|
uint8_t errors[8];
|
|
|
|
int is_dir;
|
|
void *priv;
|
|
|
|
char **image_list;
|
|
int image_count;
|
|
char image_path[128];
|
|
|
|
uint32_t sound_on;
|
|
uint32_t cdrom_capacity;
|
|
volatile uint32_t seek_pos;
|
|
volatile uint32_t seek_diff;
|
|
uint32_t cd_end;
|
|
uint32_t type;
|
|
|
|
int host_drive;
|
|
int prev_host_drive;
|
|
volatile int cd_buflen;
|
|
int audio_op;
|
|
int audio_muted_soft;
|
|
|
|
const cdrom_ops_t *ops;
|
|
|
|
void *image;
|
|
|
|
void (*insert)(void *priv);
|
|
void (*close)(void *priv);
|
|
uint32_t (*get_volume)(void *p, int channel);
|
|
uint32_t (*get_channel)(void *p, int channel);
|
|
|
|
const char *error_str;
|
|
|
|
// int16_t cd_buffer[BUF_SIZE];
|
|
uint8_t audio_sector_buffer[RAW_SECTOR_SIZE];
|
|
sample_pair *current_sector_samples; // Convenience pointer: (sample_pair*)audio_sector_buffer
|
|
int audio_sector_consumed_pairs; // Stereo pairs consumed from current_sector_samples
|
|
|
|
#if USE_CD_AUDIO_FIFO
|
|
audio_fifo_t audio_fifo;
|
|
#endif
|
|
} cdrom_t;
|
|
|
|
extern cdrom_t cdrom;
|
|
|
|
extern void cdrom_error(cdrom_t *dev,uint8_t code);
|
|
extern void cdrom_read_errors(cdrom_t *dev,uint8_t *b);
|
|
extern uint8_t cdrom_has_errors(cdrom_t *dev);
|
|
|
|
void cdrom_fifo_init(cdrom_fifo_t *fifo,uint16_t size);
|
|
void cdrom_fifo_write(cdrom_fifo_t *fifo,uint8_t val);
|
|
void cdrom_fifo_write_multiple(cdrom_fifo_t *fifo, const uint8_t *data, size_t data_size);
|
|
uint16_t cdrom_fifo_level(cdrom_fifo_t *fifo);
|
|
uint8_t cdrom_fifo_read(cdrom_fifo_t *fifo);
|
|
void cdrom_fifo_clear(cdrom_fifo_t *fifo);
|
|
|
|
void cdrom_read_data(cdrom_t *dev);
|
|
void cdrom_tasks(cdrom_t *dev);
|
|
|
|
void cdrom_output_status(cdrom_t *dev);
|
|
uint8_t cdrom_status(cdrom_t *dev);
|
|
|
|
#if USE_CD_AUDIO_FIFO
|
|
extern audio_fifo_t* cdrom_audio_fifo_peek(cdrom_t *dev);
|
|
void cdrom_audio_fifo_init(cdrom_t *dev);
|
|
#endif
|
|
|
|
extern int cdrom_lba_to_msf_accurate(int lba);
|
|
extern double cdrom_seek_time(cdrom_t *dev);
|
|
extern void cdrom_stop(cdrom_t *dev);
|
|
extern int cdrom_is_pre(cdrom_t *dev, uint32_t lba);
|
|
extern bool cdrom_audio_callback(cdrom_t *dev, uint32_t len);
|
|
extern uint32_t cdrom_audio_callback_simple(cdrom_t *dev, int16_t *buffer, uint32_t len, bool pad);
|
|
|
|
extern uint8_t cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit);
|
|
extern uint8_t cdrom_audio_track_search_pioneer(cdrom_t *dev, uint32_t pos, uint8_t playbit);
|
|
extern uint8_t cdrom_audio_play_pioneer(cdrom_t *dev, uint32_t pos);
|
|
extern uint8_t cdrom_audio_play_toshiba(cdrom_t *dev, uint32_t pos, int type);
|
|
extern void cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume);
|
|
|
|
//Kevin
|
|
extern uint8_t cdrom_read_toc(cdrom_t *dev, unsigned char *b, uint8_t track);
|
|
extern uint8_t cdrom_disc_info(cdrom_t *dev,unsigned char *b);
|
|
extern uint8_t cdrom_disc_capacity(cdrom_t *dev,unsigned char *b);
|
|
extern uint8_t cdrom_seek(cdrom_t *dev, int m, int s, int f);
|
|
extern uint8_t cdrom_audio_playmsf(cdrom_t *dev, int m,int s, int f, int M, int S, int F);
|
|
extern uint8_t cdrom_get_subq(cdrom_t *dev,uint8_t *b);
|
|
|
|
extern void cdrom_close_handler(uint8_t id);
|
|
extern void cdrom_insert(uint8_t id);
|
|
extern void cdrom_eject(uint8_t id);
|
|
extern void cdrom_reload(uint8_t id);
|
|
|
|
extern int cdrom_image_open(cdrom_t *dev, const char *fn);
|
|
extern void cdrom_image_close(cdrom_t *dev);
|
|
extern void cdrom_image_reset(cdrom_t *dev);
|
|
|
|
extern void cdrom_ioctl_eject(void);
|
|
extern void cdrom_ioctl_load(void);
|
|
extern int cdrom_ioctl_open(cdrom_t *dev, const char d);
|
|
|
|
extern void cdrom_update_cdb(uint8_t *cdb, int lba_pos,
|
|
int number_of_blocks);
|
|
|
|
extern int find_cdrom_for_scsi_id(uint8_t scsi_id);
|
|
|
|
extern void cdrom_close(void);
|
|
extern void cdrom_global_init(void);
|
|
|
|
extern int32_t cd_audio_volume;
|
|
extern void cdrom_set_volume_scale(uint8_t percent);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /*EMU_CDROM_H*/
|