summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/psxcddrv.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/psxcddrv.h')
-rw-r--r--src/mess/machine/psxcddrv.h133
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