summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/megacd.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/megacd.h')
-rw-r--r--src/mame/machine/megacd.h244
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