mirror of
https://github.com/MiSTer-devel/Main_MiSTer.git
synced 2026-04-12 03:04:02 +00:00
161 lines
3.5 KiB
C
161 lines
3.5 KiB
C
#ifndef IDE_H
|
|
#define IDE_H
|
|
|
|
#include "support/chd/mister_chd.h"
|
|
|
|
#define ATA_STATUS_BSY 0x80 // busy
|
|
#define ATA_STATUS_RDY 0x40 // ready
|
|
#define ATA_STATUS_RDP 0x20 // performance read
|
|
#define ATA_STATUS_DSC 0x10 // seek complete
|
|
#define ATA_STATUS_SERV 0x10 // service
|
|
#define ATA_STATUS_DRQ 0x08 // data request
|
|
#define ATA_STATUS_IRQ 0x04 // rise IRQ
|
|
#define ATA_STATUS_END 0x02 // last read
|
|
#define ATA_STATUS_ERR 0x01 // error (ATA)
|
|
#define ATA_STATUS_CHK 0x01 // check (ATAPI)
|
|
|
|
#define ATA_ERR_ICRC 0x80 // ATA Ultra DMA bad CRC
|
|
#define ATA_ERR_BBK 0x80 // ATA bad block
|
|
#define ATA_ERR_UNC 0x40 // ATA uncorrected error
|
|
#define ATA_ERR_MC 0x20 // ATA media change
|
|
#define ATA_ERR_IDNF 0x10 // ATA id not found
|
|
#define ATA_ERR_MCR 0x08 // ATA media change request
|
|
#define ATA_ERR_ABRT 0x04 // ATA command aborted
|
|
#define ATA_ERR_NTK0 0x02 // ATA track 0 not found
|
|
#define ATA_ERR_NDAM 0x01 // ATA address mark not found
|
|
|
|
#define IDE_STATE_IDLE 0
|
|
#define IDE_STATE_RESET 1
|
|
#define IDE_STATE_INIT_RW 2
|
|
#define IDE_STATE_WAIT_PKT_CMD 3
|
|
#define IDE_STATE_WAIT_PKT_RD 4
|
|
#define IDE_STATE_WAIT_PKT_END 5
|
|
#define IDE_STATE_WAIT_PKT_MODE 6
|
|
|
|
struct regs_t
|
|
{
|
|
uint8_t io_done;
|
|
uint8_t io_fast;
|
|
uint8_t features;
|
|
uint8_t sector_count;
|
|
uint8_t sector;
|
|
uint16_t cylinder;
|
|
uint8_t head;
|
|
uint8_t drv;
|
|
uint8_t lba;
|
|
uint8_t cmd;
|
|
|
|
uint16_t pkt_size_limit;
|
|
uint16_t pkt_io_size;
|
|
uint32_t pkt_lba;
|
|
uint32_t pkt_cnt;
|
|
|
|
uint8_t io_size;
|
|
uint8_t error;
|
|
uint8_t status;
|
|
};
|
|
|
|
struct track_t
|
|
{
|
|
fileTYPE f;
|
|
char filename[1024];
|
|
uint32_t start;
|
|
uint32_t length;
|
|
uint32_t skip;
|
|
uint16_t sectorSize;
|
|
uint8_t attr;
|
|
uint8_t mode2;
|
|
uint8_t number;
|
|
int chd_offset;
|
|
};
|
|
|
|
struct drive_t
|
|
{
|
|
fileTYPE *f;
|
|
|
|
uint8_t present;
|
|
uint8_t drvnum;
|
|
|
|
uint16_t cylinders;
|
|
uint16_t heads;
|
|
uint16_t spt;
|
|
uint32_t total_sectors;
|
|
uint32_t spb;
|
|
|
|
uint32_t offset;
|
|
uint32_t type;
|
|
|
|
uint8_t placeholder;
|
|
uint8_t allow_placeholder;
|
|
uint8_t cd;
|
|
uint8_t load_state;
|
|
uint8_t last_load_state;
|
|
uint8_t track_cnt;
|
|
uint8_t data_num;
|
|
track_t track[50];
|
|
|
|
uint8_t playing;
|
|
uint8_t paused;
|
|
uint32_t play_start_lba;
|
|
uint32_t play_end_lba;
|
|
float volume_l;
|
|
float volume_r;
|
|
bool mcr_flag;
|
|
uint8_t atapi_sense_key;
|
|
uint8_t atapi_asc_code;
|
|
uint8_t atapi_ascq_code;
|
|
|
|
chd_file *chd_f;
|
|
int chd_hunknum;
|
|
uint8_t *chd_hunkbuf;
|
|
uint32_t chd_total_size;
|
|
uint32_t chd_last_partial_lba;
|
|
|
|
uint16_t id[256];
|
|
};
|
|
|
|
struct ide_config
|
|
{
|
|
uint32_t base;
|
|
uint32_t bitoff;
|
|
uint32_t state;
|
|
uint32_t null;
|
|
uint32_t prepcnt;
|
|
regs_t regs;
|
|
|
|
drive_t drive[2];
|
|
};
|
|
|
|
struct chs_t
|
|
{
|
|
uint32_t sectors;
|
|
uint32_t heads;
|
|
uint32_t cylinders;
|
|
uint32_t offset;
|
|
};
|
|
|
|
#include "ide_cdrom.h"
|
|
|
|
extern ide_config ide_inst[2];
|
|
extern const uint32_t ide_io_max_size;
|
|
extern uint8_t ide_buf[];
|
|
|
|
void ide_print_regs(regs_t *regs);
|
|
void ide_get_regs(ide_config *ide);
|
|
void ide_set_regs(ide_config *ide);
|
|
|
|
void ide_sendbuf(ide_config *ide, uint16_t reg, uint32_t length, uint16_t *data);
|
|
void ide_recvbuf(ide_config *ide, uint16_t reg, uint32_t length, uint16_t *data);
|
|
void ide_reg_set(ide_config *ide, uint16_t reg, uint16_t value);
|
|
|
|
uint16_t ide_check();
|
|
int ide_img_mount(fileTYPE *f, const char *name, int rw);
|
|
void ide_img_set(uint32_t drvnum, fileTYPE *f, int cd, int sectors = 0, int heads = 0, int offset = 0, int type = 0);
|
|
int ide_is_placeholder(int num);
|
|
void ide_reset(uint8_t hotswap[4]);
|
|
int ide_open(uint8_t unit, const char* filename);
|
|
|
|
void ide_io(int num, int req);
|
|
|
|
#endif
|