Files
Main_MiSTer/ide.h
2023-09-02 23:57:22 +08:00

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