Files
Main/support/pcecd/pcecd.h
Sergey Dvodnenko 39e391445e pcecd: cdda play modes added, some tweaks
* pcecd: fix reset cdd in bios

* pcecd: cdda play modes added, some tweaks
2020-04-29 22:43:35 +08:00

133 lines
3.0 KiB
C++

#ifndef PCECD_H
#define PCECD_H
// CDD command
#define PCECD_COMM_TESTUNIT 0x00
#define PCECD_COMM_REQUESTSENSE 0x03
#define PCECD_COMM_READ6 0x08
#define PCECD_COMM_MODESELECT6 0x15
#define PCECD_COMM_SAPSP 0xD8
#define PCECD_COMM_SAPEP 0xD9
#define PCECD_COMM_PAUSE 0xDA
#define PCECD_COMM_READSUBQ 0xDD
#define PCECD_COMM_GETDIRINFO 0xDE
#define PCECD_STATE_IDLE 0
#define PCECD_STATE_NODISC 1
#define PCECD_STATE_READ 2
#define PCECD_STATE_PLAY 3
#define PCECD_STATE_PAUSE 4
#define PCECD_STATUS_GOOD 0
#define PCECD_STATUS_CHECK_COND 1
#define PCECD_STATUS_CONDITION_MET 2
#define PCECD_STATUS_BUSY 4
#define PCECD_STATUS_INTERMEDIATE 8
#define SENSEKEY_NO_SENSE 0x0
#define SENSEKEY_NOT_READY 0x2
#define SENSEKEY_MEDIUM_ERROR 0x3
#define SENSEKEY_HARDWARE_ERROR 0x4
#define SENSEKEY_ILLEGAL_REQUEST 0x5
#define SENSEKEY_UNIT_ATTENTION 0x6
#define SENSEKEY_ABORTED_COMMAND 0xB
#define NSE_NO_DISC 0x0B
#define NSE_TRAY_OPEN 0x0D
#define NSE_SEEK_ERROR 0x15
#define NSE_HEADER_READ_ERROR 0x16
#define NSE_NOT_AUDIO_TRACK 0x1C
#define NSE_NOT_DATA_TRACK 0x1D
#define NSE_INVALID_COMMAND 0x20
#define NSE_INVALID_ADDRESS 0x21
#define NSE_INVALID_PARAMETER 0x22
#define NSE_END_OF_VOLUME 0x25
#define NSE_INVALID_REQUEST_IN_CDB 0x27
#define NSE_DISC_CHANGED 0x28
#define NSE_AUDIO_NOT_PLAYING 0x2C
#define PCECD_CDDAMODE_SILENT 0x00
#define PCECD_CDDAMODE_NORMAL 0x01
#define PCECD_CDDAMODE_INTERRUPT 0x02
#define PCECD_CDDAMODE_LOOP 0x03
#include "../../cd.h"
typedef struct
{
uint8_t key;
uint8_t asc;
uint8_t ascq;
uint8_t fru;
} sense_t;
class pcecdd_t
{
public:
uint32_t latency;
uint8_t state;
uint8_t isData;
int loaded;
SendDataFunc SendData;
int has_status;
bool data_req;
bool can_read_next;
pcecdd_t();
int Load(const char *filename);
void Unload();
void Reset();
void Update();
void CommandExec();
int GetStatus(uint8_t* buf);
int SetCommand(uint8_t* buf);
void PendStatus(uint8_t status, uint8_t message);
private:
toc_t toc;
int index;
int lba;
int cnt;
int scanOffset;
int audioLength;
int audioOffset;
//uint8_t state;
int CDDAStart;
int CDDAEnd;
uint8_t CDDAMode;
sense_t sense;
uint8_t stat[2];
uint8_t comm[12];
uint8_t sec_buf[2352 + 2];
int LoadCUE(const char* filename);
int SectorSend(uint8_t* header);
void ReadData(uint8_t *buf);
int ReadCDDA(uint8_t *buf);
void ReadSubcode(uint16_t* buf);
void LBAToMSF(int lba, msf_t* msf);
void MSFToLBA(int* lba, msf_t* msf);
void MSFToLBA(int* lba, uint8_t m, uint8_t s, uint8_t f);
int GetTrackByLBA(int lba, toc_t* toc);
void CommandError(uint8_t key, uint8_t asc, uint8_t ascq, uint8_t fru);
};
#define BCD(v) ((uint8_t)((((v)/10) << 4) | ((v)%10)))
#define U8(v) ((uint8_t)(((((v)&0xF0) >> 4) * 10) + ((v)&0x0F)))
#define CD_SCAN_SPEED 30
//pcecdd.cpp
extern pcecdd_t pcecdd;
void pcecd_poll();
void pcecd_set_image(int num, const char *filename);
int pcecd_send_data(uint8_t* buf, int len, uint8_t index);
void pcecd_reset();
int pcecd_using_cd();
#endif