diff options
Diffstat (limited to 'src/devices/machine/cr511b.h')
-rw-r--r-- | src/devices/machine/cr511b.h | 146 |
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 |