summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/bus/psx/memcard.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/bus/psx/memcard.h')
-rw-r--r--src/emu/bus/psx/memcard.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/emu/bus/psx/memcard.h b/src/emu/bus/psx/memcard.h
new file mode 100644
index 00000000000..7763658770a
--- /dev/null
+++ b/src/emu/bus/psx/memcard.h
@@ -0,0 +1,75 @@
+#pragma once
+
+#ifndef _PSXCARD_
+#define _PSXCARD_
+
+#include "emu.h"
+
+class psx_controller_port_device;
+
+#define MCFG_PSXCARD_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, PSXCARD, 0)
+
+class psxcard_device : public device_t,
+ public device_image_interface
+{
+public:
+ psxcard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual iodevice_t image_type() const { return IO_MEMCARD; }
+
+ virtual bool is_readable() const { return 1; }
+ virtual bool is_writeable() const { return 1; }
+ virtual bool is_creatable() const { return 1; }
+ virtual bool must_be_loaded() const { return 0; }
+ virtual bool is_reset_on_load() const { return 0; }
+ virtual const char *file_extensions() const { return "mc"; }
+ virtual const option_guide *create_option_guide() const { return NULL; }
+
+ virtual bool call_load();
+ virtual bool call_create(int format_type, option_resolution *format_options);
+
+ void disable(bool state) { m_disabled = state; if(state) unload(); }
+
+private:
+ unsigned char pkt[0x8b], pkt_ptr, pkt_sz, cmd;
+ unsigned short addr;
+ int state;
+ bool m_disabled;
+
+ UINT8 m_odata;
+ UINT8 m_idata;
+ int m_bit;
+ int m_count;
+ bool m_pad;
+
+ bool m_clock;
+ bool m_sel;
+ bool m_ack;
+ bool m_rx;
+
+ emu_timer *m_ack_timer;
+ psx_controller_port_device *m_owner;
+
+ void read_card(const unsigned short addr, unsigned char *buf);
+ void write_card(const unsigned short addr, unsigned char *buf);
+ unsigned char checksum_data(const unsigned char *buf, const unsigned int sz);
+ void do_card();
+ bool transfer(UINT8 to, UINT8 *from);
+ void ack_timer(void *ptr, int param);
+
+public:
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_config_complete();
+
+ void clock_w(bool state) { if(m_clock && !m_sel && !state && !m_pad) do_card(); m_clock = state; }
+ void sel_w(bool state);
+ bool rx_r() { return m_rx; }
+ bool ack_r() { return m_ack; }
+};
+
+// device type definition
+extern const device_type PSXCARD;
+
+#endif