mirror of
https://github.com/MiSTer-devel/Main_MiSTer.git
synced 2026-04-12 03:04:02 +00:00
126 lines
2.7 KiB
C++
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
|