2017-05-30 03:38:38 +02:00
|
|
|
/*
|
|
|
|
|
* 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.
|
|
|
|
|
*
|
2018-10-10 22:33:24 +02:00
|
|
|
* Generic CD-ROM drive core header.
|
2017-05-30 03:38:38 +02:00
|
|
|
*
|
2020-03-25 00:46:02 +02:00
|
|
|
*
|
2017-05-30 03:38:38 +02:00
|
|
|
*
|
|
|
|
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
2017-10-13 02:44:32 -04:00
|
|
|
*
|
2019-09-26 10:02:43 +02:00
|
|
|
* Copyright 2016-2019 Miran Grca.
|
2017-05-30 03:38:38 +02:00
|
|
|
*/
|
2017-06-04 02:11:19 -04:00
|
|
|
#ifndef EMU_CDROM_H
|
|
|
|
|
#define EMU_CDROM_H
|
2017-05-30 03:38:38 +02:00
|
|
|
|
2016-11-12 15:06:38 +01:00
|
|
|
|
2018-04-25 23:51:13 +02:00
|
|
|
#define CDROM_NUM 4
|
2017-01-16 01:49:19 +01:00
|
|
|
|
2018-04-25 23:51:13 +02:00
|
|
|
#define CD_STATUS_EMPTY 0
|
|
|
|
|
#define CD_STATUS_DATA_ONLY 1
|
2018-10-30 13:32:25 +01:00
|
|
|
#define CD_STATUS_PAUSED 2
|
|
|
|
|
#define CD_STATUS_PLAYING 3
|
2018-04-25 23:51:13 +02:00
|
|
|
#define CD_STATUS_STOPPED 4
|
2018-10-30 13:32:25 +01:00
|
|
|
#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
|
2017-11-02 02:28:00 -05:00
|
|
|
|
2017-01-16 01:49:19 +01:00
|
|
|
#define BUF_SIZE 32768
|
|
|
|
|
|
2017-05-08 04:54:17 +02:00
|
|
|
#define CDROM_IMAGE 200
|
2017-01-16 01:49:19 +01:00
|
|
|
|
2018-10-17 05:29:48 +02:00
|
|
|
/* 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
2017-06-04 02:11:19 -04:00
|
|
|
|
2017-11-02 02:28:00 -05:00
|
|
|
enum {
|
|
|
|
|
CDROM_BUS_DISABLED = 0,
|
PIC rewrite, proper SMRAM API, complete SiS 471 rewrite and addition of 40x, 460, and 461, changes to mem.c/h, disabled Voodoo memory dumping on exit, bumped SDL Hardware scale quality to 2, bumped IDE/ATAPI drives to ATA-6, finally bumped emulator version to 3.0, redid the bus type ID's to allow for planned ATAPI hard disks, made SST flash set its high mappings to the correct address if the CPU is 16-bit, and added the SiS 401 AMI 486 Clone, AOpen Vi15G, and the Soyo 4SA2 (486 with SiS 496/497 that can boot from CD-ROM), assorted 286+ protected mode fixes (for slightly more accuracy), and fixes to 808x emulation (MS Word 1.0 and 1.10 for DOS now work correctly from floppy).
2020-10-14 23:15:01 +02:00
|
|
|
CDROM_BUS_ATAPI = 5,
|
2017-11-02 02:28:00 -05:00
|
|
|
CDROM_BUS_SCSI,
|
2018-04-25 23:51:13 +02:00
|
|
|
CDROM_BUS_USB
|
2017-11-02 02:28:00 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2018-10-17 05:29:48 +02:00
|
|
|
/* To shut up the GCC compilers. */
|
|
|
|
|
struct cdrom;
|
2018-04-25 23:51:13 +02:00
|
|
|
|
|
|
|
|
|
2018-10-30 13:32:25 +01:00
|
|
|
typedef struct {
|
|
|
|
|
uint8_t attr, track,
|
|
|
|
|
index,
|
|
|
|
|
abs_m, abs_s, abs_f,
|
|
|
|
|
rel_m, rel_s, rel_f;
|
|
|
|
|
} subchannel_t;
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
int number;
|
|
|
|
|
uint8_t attr, m, s, f;
|
|
|
|
|
} track_info_t;
|
|
|
|
|
|
2018-10-17 05:29:48 +02:00
|
|
|
/* Define the various CD-ROM drive operations (ops). */
|
|
|
|
|
typedef struct {
|
2018-10-30 13:32:25 +01:00
|
|
|
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);
|
2021-09-02 20:52:30 +02:00
|
|
|
int (*is_track_pre)(struct cdrom *dev, uint32_t lba);
|
2018-10-30 13:32:25 +01:00
|
|
|
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);
|
2018-10-17 05:29:48 +02:00
|
|
|
void (*exit)(struct cdrom *dev);
|
|
|
|
|
} cdrom_ops_t;
|
|
|
|
|
|
|
|
|
|
typedef struct cdrom {
|
2020-11-16 00:01:21 +01:00
|
|
|
uint8_t id;
|
|
|
|
|
|
|
|
|
|
union {
|
|
|
|
|
uint8_t res, res0, /* Reserved for other ID's. */
|
|
|
|
|
res1,
|
|
|
|
|
ide_channel, scsi_device_id;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
uint8_t bus_type, /* 0 = ATAPI, 1 = SCSI */
|
2018-10-17 05:29:48 +02:00
|
|
|
bus_mode, /* Bit 0 = PIO suported;
|
2018-10-10 22:33:24 +02:00
|
|
|
Bit 1 = DMA supportd. */
|
2018-10-30 13:32:25 +01:00
|
|
|
cd_status, /* Struct variable reserved for
|
|
|
|
|
media status. */
|
|
|
|
|
speed, cur_speed;
|
2018-04-25 23:51:13 +02:00
|
|
|
|
2018-10-17 05:29:48 +02:00
|
|
|
FILE* img_fp;
|
2018-10-30 13:32:25 +01:00
|
|
|
void *priv;
|
|
|
|
|
|
2021-03-14 20:35:01 +01:00
|
|
|
char image_path[1024],
|
2018-10-30 13:32:25 +01:00
|
|
|
prev_image_path[1024];
|
|
|
|
|
|
|
|
|
|
uint32_t sound_on, cdrom_capacity,
|
|
|
|
|
pad, seek_pos,
|
|
|
|
|
seek_diff, cd_end;
|
2018-04-25 23:51:13 +02:00
|
|
|
|
2018-10-30 13:32:25 +01:00
|
|
|
int host_drive, prev_host_drive,
|
2020-03-24 01:00:28 +01:00
|
|
|
cd_buflen, noplay;
|
2018-10-17 05:29:48 +02:00
|
|
|
|
|
|
|
|
const cdrom_ops_t *ops;
|
|
|
|
|
|
|
|
|
|
void *image;
|
2018-10-10 22:33:24 +02:00
|
|
|
|
|
|
|
|
void (*insert)(void *p);
|
2018-10-17 05:29:48 +02:00
|
|
|
void (*close)(void *p);
|
2018-10-10 22:33:24 +02:00
|
|
|
uint32_t (*get_volume)(void *p, int channel);
|
|
|
|
|
uint32_t (*get_channel)(void *p, int channel);
|
2017-01-16 01:49:19 +01:00
|
|
|
|
2018-10-17 05:29:48 +02:00
|
|
|
int16_t cd_buffer[BUF_SIZE];
|
|
|
|
|
} cdrom_t;
|
2017-01-16 01:49:19 +01:00
|
|
|
|
2017-10-16 04:54:41 -04:00
|
|
|
|
2018-10-17 05:29:48 +02:00
|
|
|
extern cdrom_t cdrom[CDROM_NUM];
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2017-10-16 04:54:41 -04:00
|
|
|
extern int cdrom_lba_to_msf_accurate(int lba);
|
2018-10-17 05:29:48 +02:00
|
|
|
extern double cdrom_seek_time(cdrom_t *dev);
|
2018-10-30 13:32:25 +01:00
|
|
|
extern void cdrom_stop(cdrom_t *dev);
|
2021-09-02 20:52:30 +02:00
|
|
|
extern int cdrom_is_pre(cdrom_t *dev, uint32_t lba);
|
2018-10-30 13:32:25 +01:00
|
|
|
extern int cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len);
|
|
|
|
|
extern uint8_t cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf);
|
2020-03-24 01:00:28 +01:00
|
|
|
extern uint8_t cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit);
|
|
|
|
|
extern uint8_t cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type);
|
2018-10-30 13:32:25 +01:00
|
|
|
extern void cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume);
|
|
|
|
|
extern uint8_t cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf);
|
2020-03-24 01:00:28 +01:00
|
|
|
extern uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b);
|
2018-10-30 13:32:25 +01:00
|
|
|
extern int cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type,
|
|
|
|
|
unsigned char start_track, int msf, int max_len);
|
|
|
|
|
extern int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf,
|
|
|
|
|
int cdrom_sector_type, int cdrom_sector_flags, int *len);
|
2020-03-24 01:00:28 +01:00
|
|
|
extern void cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type);
|
|
|
|
|
|
2018-10-17 05:29:48 +02:00
|
|
|
extern void cdrom_seek(cdrom_t *dev, uint32_t pos);
|
2017-05-08 04:54:17 +02:00
|
|
|
|
2018-04-25 23:51:13 +02:00
|
|
|
extern void cdrom_close_handler(uint8_t id);
|
2018-10-17 05:29:48 +02:00
|
|
|
extern void cdrom_insert(uint8_t id);
|
|
|
|
|
extern void cdrom_eject(uint8_t id);
|
|
|
|
|
extern void cdrom_reload(uint8_t id);
|
|
|
|
|
|
2021-03-14 20:35:01 +01:00
|
|
|
extern int cdrom_image_open(cdrom_t *dev, const char *fn);
|
2018-10-17 05:29:48 +02:00
|
|
|
extern void cdrom_image_close(cdrom_t *dev);
|
|
|
|
|
extern void cdrom_image_reset(cdrom_t *dev);
|
|
|
|
|
|
|
|
|
|
extern void cdrom_update_cdb(uint8_t *cdb, int lba_pos,
|
|
|
|
|
int number_of_blocks);
|
2017-01-16 01:49:19 +01:00
|
|
|
|
2018-07-15 01:41:53 +02:00
|
|
|
extern int find_cdrom_for_scsi_id(uint8_t scsi_id);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2018-10-17 05:29:48 +02:00
|
|
|
extern void cdrom_close(void);
|
2017-10-13 02:44:32 -04:00
|
|
|
extern void cdrom_global_init(void);
|
|
|
|
|
extern void cdrom_global_reset(void);
|
2017-10-11 05:56:45 -04:00
|
|
|
extern void cdrom_hard_reset(void);
|
2018-10-10 22:33:24 +02:00
|
|
|
extern void scsi_cdrom_drive_reset(int c);
|
2017-10-08 05:04:38 +02:00
|
|
|
|
2017-10-16 04:54:41 -04:00
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2017-06-04 02:11:19 -04:00
|
|
|
|
|
|
|
|
#endif /*EMU_CDROM_H*/
|