diff options
Diffstat (limited to 'src/mame/machine/megacd.h')
-rw-r--r-- | src/mame/machine/megacd.h | 244 |
1 files changed, 105 insertions, 139 deletions
diff --git a/src/mame/machine/megacd.h b/src/mame/machine/megacd.h index 9d447b3d8d9..cab6d1ea258 100644 --- a/src/mame/machine/megacd.h +++ b/src/mame/machine/megacd.h @@ -1,48 +1,113 @@ // license:BSD-3-Clause // copyright-holders:David Haywood /* Sega CD / Mega CD */ +#ifndef MAME_MACHINE_MEGACD_H +#define MAME_MACHINE_MEGACD_H + +#pragma once #include "cpu/m68000/m68000.h" #include "machine/lc89510.h" #include "machine/megacdcd.h" #include "sound/rf5c68.h" -#define SEGACD_CLOCK 12500000 +class sega_segacd_device : public device_t, public device_gfx_interface +{ +public: + // set some variables at start, depending on region (shall be moved to a device interface?) + void set_framerate(int rate) { m_framerate = rate; } + void set_total_scanlines(int total) { m_base_total_scanlines = total; } // this gets set at start only + void update_total_scanlines(bool mode3) { m_total_scanlines = mode3 ? (m_base_total_scanlines * 2) : m_base_total_scanlines; } // this gets set at each EOF -#define RAM_MODE_2MEG (0) -#define RAM_MODE_1MEG (2) + DECLARE_READ16_MEMBER( segacd_dmaaddr_r ); + DECLARE_WRITE16_MEMBER( segacd_dmaaddr_w ); -#define DMA_PCM (0x0400) -#define DMA_PRG (0x0500) -#define DMA_WRAM (0x0700) + DECLARE_WRITE16_MEMBER( scd_a12000_halt_reset_w ); + DECLARE_READ16_MEMBER( scd_a12000_halt_reset_r ); + DECLARE_READ16_MEMBER( scd_a12002_memory_mode_r ); + DECLARE_WRITE8_MEMBER( scd_a12002_memory_mode_w_8_15 ); + DECLARE_WRITE8_MEMBER( scd_a12002_memory_mode_w_0_7 ); + DECLARE_WRITE16_MEMBER( scd_a12002_memory_mode_w ); + DECLARE_READ16_MEMBER( segacd_sub_memory_mode_r ); + DECLARE_WRITE8_MEMBER( segacd_sub_memory_mode_w_8_15 ); + DECLARE_WRITE8_MEMBER( segacd_sub_memory_mode_w_0_7 ); + DECLARE_WRITE16_MEMBER( segacd_sub_memory_mode_w ); + + DECLARE_READ16_MEMBER( segacd_comms_flags_r ); + DECLARE_WRITE16_MEMBER( segacd_comms_flags_subcpu_w ); + DECLARE_WRITE16_MEMBER( segacd_comms_flags_maincpu_w ); + DECLARE_READ16_MEMBER( scd_4m_prgbank_ram_r ); + DECLARE_WRITE16_MEMBER( scd_4m_prgbank_ram_w ); + DECLARE_READ16_MEMBER( segacd_comms_main_part1_r ); + DECLARE_WRITE16_MEMBER( segacd_comms_main_part1_w ); + DECLARE_READ16_MEMBER( segacd_comms_main_part2_r ); + DECLARE_WRITE16_MEMBER( segacd_comms_main_part2_w ); + DECLARE_READ16_MEMBER( segacd_comms_sub_part1_r ); + DECLARE_WRITE16_MEMBER( segacd_comms_sub_part1_w ); + DECLARE_READ16_MEMBER( segacd_comms_sub_part2_r ); + DECLARE_WRITE16_MEMBER( segacd_comms_sub_part2_w ); + + + + DECLARE_READ16_MEMBER( segacd_main_dataram_part1_r ); + DECLARE_WRITE16_MEMBER( segacd_main_dataram_part1_w ); + + DECLARE_READ16_MEMBER( scd_hint_vector_r ); + DECLARE_READ16_MEMBER( scd_a12006_hint_register_r ); + DECLARE_WRITE16_MEMBER( scd_a12006_hint_register_w ); + + + DECLARE_WRITE16_MEMBER( segacd_stopwatch_timer_w ); + DECLARE_READ16_MEMBER( segacd_stopwatch_timer_r ); + DECLARE_READ16_MEMBER( segacd_sub_led_ready_r ); + DECLARE_WRITE16_MEMBER( segacd_sub_led_ready_w ); + DECLARE_READ16_MEMBER( segacd_sub_dataram_part1_r ); + DECLARE_WRITE16_MEMBER( segacd_sub_dataram_part1_w ); + DECLARE_READ16_MEMBER( segacd_sub_dataram_part2_r ); + DECLARE_WRITE16_MEMBER( segacd_sub_dataram_part2_w ); + + + DECLARE_READ16_MEMBER( segacd_stampsize_r ); + DECLARE_WRITE16_MEMBER( segacd_stampsize_w ); -// irq3 timer -#define CHECK_SCD_LV3_INTERRUPT \ - if (m_lc89510_temp->get_segacd_irq_mask() & 0x08) \ - { \ - m_scdcpu->set_input_line(3, HOLD_LINE); \ - } -// from master -#define CHECK_SCD_LV2_INTERRUPT \ - if (m_lc89510_temp->get_segacd_irq_mask() & 0x04) \ - { \ - m_scdcpu->set_input_line(2, HOLD_LINE); \ - } + TILE_GET_INFO_MEMBER( get_stampmap_16x16_1x1_tile_info ); + TILE_GET_INFO_MEMBER( get_stampmap_32x32_1x1_tile_info ); + TILE_GET_INFO_MEMBER( get_stampmap_16x16_16x16_tile_info ); + TILE_GET_INFO_MEMBER( get_stampmap_32x32_16x16_tile_info ); -// gfx convert -#define CHECK_SCD_LV1_INTERRUPT \ - if (m_lc89510_temp->get_segacd_irq_mask() & 0x02) \ - { \ - m_scdcpu->set_input_line(1, HOLD_LINE); \ - } + WRITE16_MEMBER( segacd_trace_vector_base_address_w ); + READ16_MEMBER( segacd_imagebuffer_vdot_size_r ); + WRITE16_MEMBER( segacd_imagebuffer_vdot_size_w ); + READ16_MEMBER( segacd_stampmap_base_address_r ); + WRITE16_MEMBER( segacd_stampmap_base_address_w ); + READ16_MEMBER( segacd_imagebuffer_start_address_r ); + WRITE16_MEMBER( segacd_imagebuffer_start_address_w ); + READ16_MEMBER( segacd_imagebuffer_offset_r ); + WRITE16_MEMBER( segacd_imagebuffer_offset_w ); + READ16_MEMBER( segacd_imagebuffer_vcell_size_r ); + WRITE16_MEMBER( segacd_imagebuffer_vcell_size_w ); + READ16_MEMBER( segacd_imagebuffer_hdot_size_r ); + WRITE16_MEMBER( segacd_imagebuffer_hdot_size_w ); + READ16_MEMBER( segacd_irq3timer_r ); + WRITE16_MEMBER( segacd_irq3timer_w ); + READ8_MEMBER( backupram_r ); + WRITE8_MEMBER( backupram_w ); + READ8_MEMBER( font_color_r ); + WRITE8_MEMBER( font_color_w ); + READ16_MEMBER( font_converted_r ); + TIMER_DEVICE_CALLBACK_MEMBER( dma_timer_callback ); + IRQ_CALLBACK_MEMBER(segacd_sub_int_callback); + + TIMER_DEVICE_CALLBACK_MEMBER( irq3_timer_callback ); + TIMER_DEVICE_CALLBACK_MEMBER( stamp_timer_callback ); -#define SEGACD_IRQ3_TIMER_SPEED (attotime::from_nsec(m_irq3_timer_reg*30720)) + void SegaCD_CDC_Do_DMA( int &dmacount, uint8_t *CDC_BUFFER, uint16_t &dma_addrc, uint16_t &destination ); +protected: + sega_segacd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); -class sega_segacd_device : public device_t, public device_gfx_interface -{ -public: - sega_segacd_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const override; required_device<cpu_device> m_scdcpu; required_device<rf5c68_device> m_rfsnd; @@ -94,15 +159,10 @@ public: uint8_t m_irq3_timer_reg; - TIMER_DEVICE_CALLBACK_MEMBER( irq3_timer_callback ); - TIMER_DEVICE_CALLBACK_MEMBER( stamp_timer_callback ); - inline void write_pixel(uint8_t pix, int pixeloffset); uint16_t segacd_1meg_mode_word_read(int offset, uint16_t mem_mask); void segacd_1meg_mode_word_write(int offset, uint16_t data, uint16_t mem_mask, int use_pm); - DECLARE_READ16_MEMBER( segacd_dmaaddr_r ); - DECLARE_WRITE16_MEMBER( segacd_dmaaddr_w ); uint16_t m_dmaaddr; uint16_t m_a12000_halt_reset_reg; @@ -114,138 +174,44 @@ public: void segacd_mark_tiles_dirty(int offset); int segacd_get_active_stampmap_tilemap(void); - // set some variables at start, depending on region (shall be moved to a device interface?) - void set_framerate(int rate) { m_framerate = rate; } - void set_total_scanlines(int total) { m_base_total_scanlines = total; } // this gets set at start only - void update_total_scanlines(bool mode3) { m_total_scanlines = mode3 ? (m_base_total_scanlines * 2) : m_base_total_scanlines; } // this gets set at each EOF - void SCD_GET_TILE_INFO_16x16_1x1( int& tile_region, int& tileno, int tile_index ); void SCD_GET_TILE_INFO_32x32_1x1( int& tile_region, int& tileno, int tile_index ); void SCD_GET_TILE_INFO_16x16_16x16( int& tile_region, int& tileno, int tile_index ); void SCD_GET_TILE_INFO_32x32_16x16( int& tile_region, int& tileno, int tile_index ); - TILE_GET_INFO_MEMBER( get_stampmap_16x16_1x1_tile_info ); - TILE_GET_INFO_MEMBER( get_stampmap_32x32_1x1_tile_info ); - TILE_GET_INFO_MEMBER( get_stampmap_16x16_16x16_tile_info ); - TILE_GET_INFO_MEMBER( get_stampmap_32x32_16x16_tile_info ); - uint8_t get_stampmap_16x16_1x1_tile_info_pixel(int xpos, int ypos); uint8_t get_stampmap_32x32_1x1_tile_info_pixel(int xpos, int ypos); uint8_t get_stampmap_16x16_16x16_tile_info_pixel(int xpos, int ypos); uint8_t get_stampmap_32x32_16x16_tile_info_pixel(int xpos, int ypos); - WRITE16_MEMBER( scd_a12000_halt_reset_w ); - READ16_MEMBER( scd_a12000_halt_reset_r ); - READ16_MEMBER( scd_a12002_memory_mode_r ); - WRITE8_MEMBER( scd_a12002_memory_mode_w_8_15 ); - WRITE8_MEMBER( scd_a12002_memory_mode_w_0_7 ); - WRITE16_MEMBER( scd_a12002_memory_mode_w ); - READ16_MEMBER( segacd_sub_memory_mode_r ); - WRITE8_MEMBER( segacd_sub_memory_mode_w_8_15 ); - WRITE8_MEMBER( segacd_sub_memory_mode_w_0_7 ); - WRITE16_MEMBER( segacd_sub_memory_mode_w ); - - READ16_MEMBER( segacd_comms_flags_r ); - WRITE16_MEMBER( segacd_comms_flags_subcpu_w ); - WRITE16_MEMBER( segacd_comms_flags_maincpu_w ); - READ16_MEMBER( scd_4m_prgbank_ram_r ); - WRITE16_MEMBER( scd_4m_prgbank_ram_w ); - READ16_MEMBER( segacd_comms_main_part1_r ); - WRITE16_MEMBER( segacd_comms_main_part1_w ); - READ16_MEMBER( segacd_comms_main_part2_r ); - WRITE16_MEMBER( segacd_comms_main_part2_w ); - READ16_MEMBER( segacd_comms_sub_part1_r ); - WRITE16_MEMBER( segacd_comms_sub_part1_w ); - READ16_MEMBER( segacd_comms_sub_part2_r ); - WRITE16_MEMBER( segacd_comms_sub_part2_w ); - - - - READ16_MEMBER( segacd_main_dataram_part1_r ); - WRITE16_MEMBER( segacd_main_dataram_part1_w ); - - READ16_MEMBER( scd_hint_vector_r ); - READ16_MEMBER( scd_a12006_hint_register_r ); - WRITE16_MEMBER( scd_a12006_hint_register_w ); - - - WRITE16_MEMBER( segacd_stopwatch_timer_w ); - READ16_MEMBER( segacd_stopwatch_timer_r ); - READ16_MEMBER( segacd_sub_led_ready_r ); - WRITE16_MEMBER( segacd_sub_led_ready_w ); - READ16_MEMBER( segacd_sub_dataram_part1_r ); - WRITE16_MEMBER( segacd_sub_dataram_part1_w ); - READ16_MEMBER( segacd_sub_dataram_part2_r ); - WRITE16_MEMBER( segacd_sub_dataram_part2_w ); - - - READ16_MEMBER( segacd_stampsize_r ); - WRITE16_MEMBER( segacd_stampsize_w ); - uint8_t read_pixel_from_stampmap(bitmap_ind16* srcbitmap, int x, int y); - WRITE16_MEMBER( segacd_trace_vector_base_address_w ); - READ16_MEMBER( segacd_imagebuffer_vdot_size_r ); - WRITE16_MEMBER( segacd_imagebuffer_vdot_size_w ); - READ16_MEMBER( segacd_stampmap_base_address_r ); - WRITE16_MEMBER( segacd_stampmap_base_address_w ); - READ16_MEMBER( segacd_imagebuffer_start_address_r ); - WRITE16_MEMBER( segacd_imagebuffer_start_address_w ); - READ16_MEMBER( segacd_imagebuffer_offset_r ); - WRITE16_MEMBER( segacd_imagebuffer_offset_w ); - READ16_MEMBER( segacd_imagebuffer_vcell_size_r ); - WRITE16_MEMBER( segacd_imagebuffer_vcell_size_w ); - READ16_MEMBER( segacd_imagebuffer_hdot_size_r ); - WRITE16_MEMBER( segacd_imagebuffer_hdot_size_w ); - READ16_MEMBER( segacd_irq3timer_r ); - WRITE16_MEMBER( segacd_irq3timer_w ); - READ8_MEMBER( backupram_r ); - WRITE8_MEMBER( backupram_w ); - READ8_MEMBER( font_color_r ); - WRITE8_MEMBER( font_color_w ); - READ16_MEMBER( font_converted_r ); - TIMER_DEVICE_CALLBACK_MEMBER( dma_timer_callback ); - IRQ_CALLBACK_MEMBER(segacd_sub_int_callback); - - void SegaCD_CDC_Do_DMA( int &dmacount, uint8_t *CDC_BUFFER, uint16_t &dma_addrc, uint16_t &destination ); - -protected: virtual void device_start() override; virtual void device_reset() override; - - // optional information overrides -// virtual const rom_entry *device_rom_region() const; - virtual machine_config_constructor device_mconfig_additions() const override; -private: - }; class sega_segacd_us_device : public sega_segacd_device { - public: - sega_segacd_us_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - protected: - +public: + sega_segacd_us_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; class sega_segacd_japan_device : public sega_segacd_device { - public: - sega_segacd_japan_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - protected: -// virtual machine_config_constructor device_mconfig_additions() const; +public: + sega_segacd_japan_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; class sega_segacd_europe_device : public sega_segacd_device { - public: - sega_segacd_europe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - protected: -// virtual machine_config_constructor device_mconfig_additions() const; +public: + sega_segacd_europe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -extern const device_type SEGA_SEGACD_US; -extern const device_type SEGA_SEGACD_JAPAN; -extern const device_type SEGA_SEGACD_EUROPE; +DECLARE_DEVICE_TYPE(SEGA_SEGACD_US, sega_segacd_us_device) +DECLARE_DEVICE_TYPE(SEGA_SEGACD_JAPAN, sega_segacd_japan_device) +DECLARE_DEVICE_TYPE(SEGA_SEGACD_EUROPE, sega_segacd_europe_device) + +#endif // MAME_MACHINE_MEGACD_H |