diff options
Diffstat (limited to 'src/mess/machine/psxcddrv.h')
-rw-r--r-- | src/mess/machine/psxcddrv.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/mess/machine/psxcddrv.h b/src/mess/machine/psxcddrv.h new file mode 100644 index 00000000000..e4904198c63 --- /dev/null +++ b/src/mess/machine/psxcddrv.h @@ -0,0 +1,133 @@ +#ifndef _included_psxcddriver_ +#define _included_psxcddriver_ + +const unsigned int raw_sector_size=2352; + +class io_status +{ +protected: + virtual ~io_status() {} + +public: + io_status() { } + + virtual void cancel()=0; + virtual void release()=0; + virtual bool complete() const=0; + virtual bool block_until_complete() const=0; + virtual INT64 bytes_transferred() const=0; +}; + +enum cdromtype +{ + cdromtype_cd=0, + cdromtype_dvd +}; + +enum tracktype +{ + tracktype_unknown=0, + tracktype_mode1, + tracktype_mode2, + tracktype_audio +}; + +class cdrom_driver +{ + int pf_head, + pf_tail, + num_pf, + pf_head_sector; + unsigned char *pf_buffer; + io_status *pf_status, + *last_pf_status; + INT64 pf_timeout_begin; + + int native_sector_size; + + virtual io_status *read_sectors(const unsigned int sec, const unsigned int numsec, unsigned char *buf)=0; + + bool is_prefetch_sector_loaded(const unsigned int pfsec); + +protected: + void cancel_io(); + void set_native_sector_size(const unsigned int sz); + UINT32 timestamp_frequency; + cdrom_file *m_cd; +private: + running_machine *m_machine; + +public: + cdrom_driver(); + virtual ~cdrom_driver(); + + void set_machine(const running_machine &machine); + void set_cdrom_file(cdrom_file *cdfile) { m_cd = cdfile; } + + virtual bool is_usable(char *error_msg=NULL, const int msglen=0) const=0; + virtual bool read_toc()=0; + + void prefetch_sector(const unsigned int sec); + bool read_sector(const unsigned int sec, + unsigned char *buf, + const bool block=true); + unsigned char *get_prefetch_sector(const unsigned int pfsec, + unsigned int *sz); + + virtual unsigned int get_first_track() const=0; + virtual unsigned int get_num_tracks() const=0; + virtual bool get_track_address(const unsigned int track, + unsigned char *address) const=0; + virtual tracktype get_track_type(const unsigned int track) const=0; + virtual unsigned int find_track(const unsigned int sector, + unsigned int *start_sector=NULL, + unsigned int *end_sector=NULL) const=0; + + virtual cdromtype get_type() const { return cdromtype_cd; } +}; + +// +// +// + +inline unsigned int msf_to_sector(const unsigned char *msf) +{ + unsigned int sec=msf[2]+(msf[1]*75)+(msf[0]*(60*75)); + if (sec>=150) + { + return sec-150; + } + else + { + return 0; + } +} + +inline void sector_to_msf(const unsigned int sec, unsigned char *msf) +{ + unsigned int s=sec+150; + msf[0]=s/(60*75); + s-=msf[0]*(60*75); + msf[1]=s/75; + s-=msf[1]*75; + msf[2]=s; +} + +// +// +// + +inline unsigned char bcd_to_decimal(const unsigned char bcd) +{ + return ((bcd>>4)*10)+(bcd&0xf); +} + +inline unsigned char decimal_to_bcd(const unsigned char dec) +{ + //assert(dec<100); + return ((dec/10)<<4)|(dec%10); +} + +cdrom_driver *open_mess_drv(); + +#endif |