summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/cr511b.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/cr511b.h')
-rw-r--r--src/devices/machine/cr511b.h146
1 files changed, 100 insertions, 46 deletions
diff --git a/src/devices/machine/cr511b.h b/src/devices/machine/cr511b.h
index 16d58151d91..e773c8b1f82 100644
--- a/src/devices/machine/cr511b.h
+++ b/src/devices/machine/cr511b.h
@@ -1,11 +1,11 @@
-// license:GPL-2.0+
-// copyright-holders:Dirk Best
+// license: BSD-3-Clause
+// copyright-holders: Dirk Best
/***************************************************************************
CR-511-B CD-ROM drive
CD-ROM drive with a custom MKE/Panasonic interface as used in the
- Commodore CDTV and early SoundBlaster cards.
+ Commodore CDTV. Similar to the interface on early SoundBlaster cards.
1 _RESET 2 GND
3 EFFK 4 SCCK
@@ -35,71 +35,125 @@
#pragma once
-#include "imagedev/chd_cd.h"
+#include "imagedev/cdromimg.h"
#include "sound/cdda.h"
-class cr511b_device : public device_t
+
+class cr511b_device : public cdrom_image_device, public device_mixer_interface
{
public:
- // construction/destruction
cr511b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// callbacks
- auto stch_handler() { return m_stch_handler.bind(); }
- auto sten_handler() { return m_sten_handler.bind(); }
- auto drq_handler() { return m_drq_handler.bind(); }
- auto dten_handler() { return m_dten_handler.bind(); }
- auto scor_handler() { return m_scor_handler.bind(); }
- auto xaen_handler() { return m_xaen_handler.bind(); }
+ auto stch_cb() { return m_stch_cb.bind(); }
+ auto sten_cb() { return m_sten_cb.bind(); }
+ auto drq_cb() { return m_drq_cb.bind(); }
+ auto dten_cb() { return m_dten_cb.bind(); }
+ auto scor_cb() { return m_scor_cb.bind(); }
- DECLARE_READ8_MEMBER( read );
- DECLARE_WRITE8_MEMBER ( write );
+ uint8_t read();
+ void write(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER( enable_w );
- DECLARE_WRITE_LINE_MEMBER( cmd_w );
+ void cmd_w(int state);
+ void enable_w(int state);
protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_add_mconfig(machine_config &config) override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+
+ // device_image_interface implementation
+ virtual std::pair<std::error_condition, std::string> call_load() override;
+ virtual void call_unload() override;
private:
- enum
- {
- STATUS_DOOR_CLOSED = 0x80,
- STATUS_MEDIA = 0x40,
- STATUS_MOTOR = 0x20,
- STATUS_ERROR = 0x10,
- STATUS_SUCCESS = 0x08,
- STATUS_PLAYING = 0x04,
- STATUS_DOOR_LOCKED = 0x02,
- STATUS_READY = 0x01
- };
-
- required_device<cdrom_image_device> m_cdrom;
+ uint32_t lba_to_msf(int32_t lba);
+ int32_t msf_to_lba(uint32_t msf);
+ int size_to_track_type();
+
+ TIMER_CALLBACK_MEMBER(frame_cb);
+
+ TIMER_CALLBACK_MEMBER(stch);
+ void status_change(uint8_t status);
+
+ TIMER_CALLBACK_MEMBER(sten);
+ void status_enable(uint8_t output_length);
+
+ void audio_end_cb(int state);
+
+ // commands
+ void cmd_seek();
+ void cmd_read();
+ void cmd_motor_on();
+ void cmd_motor_off();
+ void cmd_play_lba();
+ void cmd_play_msf();
+ void cmd_play_track();
+ void cmd_read_status();
+ void cmd_read_error();
+ void cmd_version();
+ void cmd_set_mode();
+ void cmd_read_subq();
+ void cmd_read_disc_info();
+ void cmd_read_toc();
+ void cmd_pause();
+ void cmd_front_panel();
+
+ // drive status
+ static constexpr uint8_t STATUS_DOOR_CLOSED = 0x80; // unverified, not used
+ static constexpr uint8_t STATUS_MEDIA = 0x40;
+ static constexpr uint8_t STATUS_MOTOR = 0x20;
+ static constexpr uint8_t STATUS_ERROR = 0x10;
+ static constexpr uint8_t STATUS_SUCCESS = 0x08; // last command has successfully executed
+ static constexpr uint8_t STATUS_PLAYING = 0x04;
+ static constexpr uint8_t STATUS_DOOR_LOCKED = 0x02; // unverified, not used
+ static constexpr uint8_t STATUS_READY = 0x01;
+
+ // audio status
+ static constexpr uint8_t AUDIO_STATUS_INVALID = 0x00;
+ static constexpr uint8_t AUDIO_STATUS_PLAY = 0x11;
+ static constexpr uint8_t AUDIO_STATUS_PAUSED = 0x12;
+ static constexpr uint8_t AUDIO_STATUS_COMPLETED = 0x13;
+ static constexpr uint8_t AUDIO_STATUS_ERROR = 0x14;
+ static constexpr uint8_t AUDIO_STATUS_NO_STATUS = 0x15;
+
required_device<cdda_device> m_cdda;
- devcb_write_line m_stch_handler;
- devcb_write_line m_sten_handler;
- devcb_write_line m_drq_handler;
- devcb_write_line m_dten_handler;
- devcb_write_line m_scor_handler;
- devcb_write_line m_xaen_handler;
+ devcb_write_line m_stch_cb;
+ devcb_write_line m_sten_cb;
+ devcb_write_line m_drq_cb;
+ devcb_write_line m_dten_cb;
+ devcb_write_line m_scor_cb;
emu_timer *m_frame_timer;
+ emu_timer *m_stch_timer;
+ emu_timer *m_sten_timer;
+
+ uint8_t m_input_fifo[16];
+ uint8_t m_input_fifo_pos;
+
+ uint8_t m_output_fifo[16];
+ uint8_t m_output_fifo_pos;
+ uint8_t m_output_fifo_length;
+
+ uint8_t m_status;
+ uint16_t m_sector_size;
- //bool m_motor;
+ uint32_t m_transfer_lba;
+ uint16_t m_transfer_sectors;
+ uint32_t m_transfer_length;
+ uint8_t m_transfer_buffer[2352];
+ uint16_t m_transfer_buffer_pos;
- // state of lines
- int m_enabled;
- int m_cmd;
+ // external lines
+ bool m_enabled;
+ bool m_cmd;
- // data transfer
- //uint8_t m_sector_buffer[CD_MAX_SECTOR_DATA];
+ bool m_status_ready;
+ bool m_data_ready;
};
+// device type declaration
DECLARE_DEVICE_TYPE(CR511B, cr511b_device)
#endif // MAME_MACHINE_CR511B_H