Files
Main_MiSTer/support/saturn/saturn.h

126 lines
2.7 KiB
C++

#ifndef SATURN_H
#define SATURN_H
#include "../../cd.h"
//#define SATURN_DEBUG 1
// CDD command
#define SATURN_COMM_NOP 0x00
#define SATURN_COMM_SEEK_RING 0x02
#define SATURN_COMM_TOC 0x03
#define SATURN_COMM_STOP 0x04
#define SATURN_COMM_READ 0x06
#define SATURN_COMM_PAUSE 0x08
#define SATURN_COMM_SEEK 0x09
#define SATURN_COMM_FW_SCAN 0x0A
#define SATURN_COMM_RW_SCAN 0x0B
// CDD status
#define SATURN_STAT_NOP 0x00
#define SATURN_STAT_TOC 0x06
#define SATURN_STAT_STOP 0x12
#define SATURN_STAT_SEEK 0x22
#define SATURN_STAT_AUDIO 0x34
#define SATURN_STAT_DATA 0x36
#define SATURN_STAT_IDLE 0x46
#define SATURN_STAT_OPEN 0x80
#define SATURN_STAT_NODISK 0x83
#define SATURN_STAT_SEEK_RING 0xB2
typedef enum {
Idle,
Open,
ReadTOC,
Read,
Pause,
Stop,
Seek,
SeekRead,
SeekRing
} satstate_t;
class satcdd_t
{
public:
int loaded;
satstate_t state;
int speed;
SendDataFunc SendData;
satcdd_t();
int Load(const char *filename);
void Unload();
void Reset();
void Process(uint8_t* time_mode);
void Update();
void CommandExec();
uint8_t* GetStatus();
int SetCommand(uint8_t* data);
int GetBootHeader(uint8_t *buf);
bool wwf_hack;
bool roadrash_hack;
private:
toc_t toc;
int lba;
int track;
int index;
int seek_lba;
uint16_t sectorSize;
int toc_pos;
satstate_t next_state;
bool lid_open;
bool stop_pend;
bool seek_pend;
bool read_pend;
bool final_read;
bool seek_ring;
bool seek_ring2;
bool pause_pend;
bool read_toc;
int seek_delay;
uint8_t stat[12];
uint8_t comm[12];
uint8_t cd_buf[4096 + 2];
int audioLength;
int audioFirst;
int chd_hunknum;
uint8_t *chd_hunkbuf;
int chd_audio_read_lba;
int LoadCUE(const char* filename);
void LBAToMSF(int lba, msf_t* msf);
int CalcSeekDelay(int lba_old, int lba_new);
int GetFAD(uint8_t* cmd);
int GetSectorOffsetByIndex(int tno, int idx);
void SetChecksum(uint8_t* stat);
int CheckCommand(uint8_t* cmd);
void ReadData(uint8_t *buf);
int ReadCDDA(uint8_t *buf, int first);
void MakeSecureRingData(uint8_t *buf);
uint32_t DataSectorCalcCRC(uint8_t* buf, int len);
int DataSectorSend(uint8_t* header, int speed);
int AudioSectorSend(int first);
int RingDataSend(uint8_t* header, int speed);
};
extern satcdd_t satcdd;
extern uint32_t saturn_frame_cnt;
#define CD_DATA_IO_INDEX 0x8
#define BOOT_IO_INDEX 0xC
#define SAVE_IO_INDEX 0x4 // fake download to trigger save loading
void saturn_poll();
void saturn_set_image(int num, const char *filename);
void saturn_reset();
void saturn_fill_blanksave(uint8_t *buffer, uint32_t lba);
int saturn_send_data(uint8_t* buf, int len, uint8_t index);
void saturn_mount_save(const char *filename, bool is_auto = false);
#endif