1 // license:BSD-3-Clause 2 // copyright-holders:Ryan Holtz 3 /****************************************************************************** 4 5 6 CD-i Mono-I CDIC MCU simulation 7 ------------------- 8 9 written by Ryan Holtz 10 11 12 ******************************************************************************* 13 14 STATUS: 15 16 - Just enough for the Mono-I CD-i board to work somewhat properly. 17 18 TODO: 19 20 - Decapping and proper emulation. 21 22 *******************************************************************************/ 23 24 #ifndef MAME_MACHINE_CDICDIC_H 25 #define MAME_MACHINE_CDICDIC_H 26 27 #pragma once 28 29 #include "imagedev/chd_cd.h" 30 #include "machine/scc68070.h" 31 #include "sound/cdda.h" 32 #include "sound/dmadac.h" 33 #include "cdrom.h" 34 35 36 //************************************************************************** 37 // TYPE DEFINITIONS 38 //************************************************************************** 39 40 // ======================> cdicdic_device 41 42 class cdicdic_device : public device_t 43 { 44 public: 45 // construction/destruction 46 cdicdic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 47 set_clock2(uint32_t clock)48 void set_clock2(uint32_t clock) { m_clock2 = clock; } set_clock2(const XTAL & xtal)49 void set_clock2(const XTAL &xtal) { set_clock2(xtal.value()); } clock2()50 uint32_t clock2() const { return m_clock2; } 51 intreq_callback()52 auto intreq_callback() { return m_intreq_callback.bind(); } 53 54 // non-static internal members 55 void sample_trigger(); 56 void process_delayed_command(); 57 58 uint16_t regs_r(offs_t offset, uint16_t mem_mask = ~0); 59 void regs_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 60 uint16_t ram_r(offs_t offset, uint16_t mem_mask = ~0); 61 void ram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 62 63 uint8_t intack_r(); 64 65 protected: 66 // device-level overrides 67 virtual void device_resolve_objects() override; 68 virtual void device_start() override; 69 virtual void device_reset() override; 70 71 // internal callbacks 72 TIMER_CALLBACK_MEMBER( periodic_sample_trigger ); 73 TIMER_CALLBACK_MEMBER( audio_sample_trigger ); 74 TIMER_CALLBACK_MEMBER( initial_sample_trigger ); 75 TIMER_CALLBACK_MEMBER( trigger_readback_int ); 76 77 private: 78 enum 79 { 80 CDIC_SECTOR_SYNC = 0, 81 82 CDIC_SECTOR_HEADER = 12, 83 84 CDIC_SECTOR_MODE = 15, 85 86 CDIC_SECTOR_FILE1 = 16, 87 CDIC_SECTOR_CHAN1 = 17, 88 CDIC_SECTOR_SUBMODE1 = 18, 89 CDIC_SECTOR_CODING1 = 19, 90 91 CDIC_SECTOR_FILE2 = 20, 92 CDIC_SECTOR_CHAN2 = 21, 93 CDIC_SECTOR_SUBMODE2 = 22, 94 CDIC_SECTOR_CODING2 = 23, 95 96 CDIC_SECTOR_DATA = 24, 97 98 CDIC_SECTOR_SIZE = 2352, 99 100 CDIC_SECTOR_DATASIZE = 2048, 101 CDIC_SECTOR_AUDIOSIZE = 2304, 102 CDIC_SECTOR_VIDEOSIZE = 2324, 103 104 CDIC_SUBMODE_EOF = 0x80, 105 CDIC_SUBMODE_RT = 0x40, 106 CDIC_SUBMODE_FORM = 0x20, 107 CDIC_SUBMODE_TRIG = 0x10, 108 CDIC_SUBMODE_DATA = 0x08, 109 CDIC_SUBMODE_AUDIO = 0x04, 110 CDIC_SUBMODE_VIDEO = 0x02, 111 CDIC_SUBMODE_EOR = 0x01 112 }; 113 114 int is_valid_sample_buf(uint16_t addr) const; 115 double sample_buf_freq(uint16_t addr) const; 116 int sample_buf_size(uint16_t addr) const; 117 118 devcb_write_line m_intreq_callback; 119 120 required_address_space m_memory_space; 121 required_device_array<dmadac_sound_device, 2> m_dmadac; 122 required_device<scc68070_device> m_scc; 123 required_device<cdda_device> m_cdda; 124 optional_device<cdrom_image_device> m_cdrom_dev; 125 126 uint32_t m_clock2; 127 128 // internal state 129 uint16_t m_command; // CDIC Command Register (0x303c00) 130 uint32_t m_time; // CDIC Time Register (0x303c02) 131 uint16_t m_file; // CDIC File Register (0x303c06) 132 uint32_t m_channel; // CDIC Channel Register (0x303c08) 133 uint16_t m_audio_channel; // CDIC Audio Channel Register (0x303c0c) 134 135 uint16_t m_audio_buffer; // CDIC Audio Buffer Register (0x303ff4) 136 uint16_t m_x_buffer; // CDIC X-Buffer Register (0x303ff6) 137 uint16_t m_dma_control; // CDIC DMA Control Register (0x303ff8) 138 uint16_t m_z_buffer; // CDIC Z-Buffer Register (0x303ffa) 139 uint16_t m_interrupt_vector; // CDIC Interrupt Vector Register (0x303ffc) 140 uint16_t m_data_buffer; // CDIC Data Buffer Register (0x303ffe) 141 142 emu_timer *m_interrupt_timer; 143 cdrom_file *m_cd; 144 145 emu_timer *m_audio_sample_timer; 146 emu_timer *m_audio_playback_timer; 147 emu_timer *m_periodic_sample_timer[2]; 148 int32_t m_audio_sample_freq; 149 int32_t m_audio_sample_size; 150 151 uint16_t m_decode_addr; 152 uint8_t m_decode_delay; 153 attotime m_decode_period; 154 bool m_break_on_achan; 155 bool m_valid_audio_sample; 156 157 int m_xa_last[4]; 158 std::unique_ptr<uint16_t[]> m_ram; 159 std::unique_ptr<int16_t[]> m_samples[2]; 160 161 static void decode_xa_mono(int32_t *cdic_xa_last, const uint8_t *xa, int16_t *dp); 162 static void decode_xa_mono8(int32_t *cdic_xa_last, const uint8_t *xa, int16_t *dp); 163 static void decode_xa_stereo(int32_t *cdic_xa_last, const uint8_t *xa, int16_t *dp); 164 static void decode_xa_stereo8(int32_t *cdic_xa_last, const uint8_t *xa, int16_t *dp); 165 166 static const int32_t s_cdic_adpcm_filter_coef[5][2]; 167 168 uint32_t increment_cdda_frame_bcd(uint32_t bcd); 169 uint32_t increment_cdda_sector_bcd(uint32_t bcd); 170 void decode_audio_sector(const uint8_t *xa, int32_t triggered); 171 void play_audio_sector(); 172 }; 173 174 // device type definition 175 DECLARE_DEVICE_TYPE(CDI_CDIC, cdicdic_device) 176 177 #endif // MAME_MACHINE_CDICDIC_H 178