Previous 199869 Revisions Next

r29442 Tuesday 8th April, 2014 at 11:33:41 UTC by Alex Jackson
megacd.c: Convert to device_gfx_interface, use device finders, cleanups [Alex Jackson]
[src/mess/drivers]megadriv.c
[src/mess/machine]megacd.c megacd.h

trunk/src/mess/drivers/megadriv.c
r29441r29442
696696   MCFG_SCREEN_VBLANK_DRIVER(md_cons_state, screen_eof_console)
697697
698698   MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_US, 0)
699   MCFG_GFX_PALETTE("gen_vdp:palette")
699700
700701   MCFG_CDROM_ADD( "cdrom",scd_cdrom )
701702
r29441r29442
712713   MCFG_SCREEN_VBLANK_DRIVER(md_cons_state, screen_eof_console)
713714
714715   MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_EUROPE, 0)
716   MCFG_GFX_PALETTE("gen_vdp:palette")
715717
716718   MCFG_CDROM_ADD( "cdrom",scd_cdrom )
717719
r29441r29442
728730   MCFG_SCREEN_VBLANK_DRIVER(md_cons_state, screen_eof_console)
729731
730732   MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_JAPAN, 0)
733   MCFG_GFX_PALETTE("gen_vdp:palette")
731734
732735   MCFG_CDROM_ADD( "cdrom",scd_cdrom )
733736
r29441r29442
738741static MACHINE_CONFIG_DERIVED( genesis_32x_scd, genesis_32x )
739742
740743   MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_US, 0)
744   MCFG_GFX_PALETTE("gen_vdp:palette")
745
741746   MCFG_CDROM_ADD( "cdrom",scd_cdrom )
742747
743748   MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
trunk/src/mess/machine/megacd.h
r29441r29442
33#include "cpu/m68000/m68000.h"
44#include "machine/lc89510.h"
55#include "machine/megacdcd.h"
6#include "sound/rf5c68.h"
67
78#define SEGACD_CLOCK      12500000
89
r29441r29442
1516
1617// irq3 timer
1718#define CHECK_SCD_LV3_INTERRUPT \
18   if (lc89510_temp->get_segacd_irq_mask() & 0x08) \
19   if (m_lc89510_temp->get_segacd_irq_mask() & 0x08) \
1920   { \
2021      m_scdcpu->set_input_line(3, HOLD_LINE); \
2122   }
2223// from master
2324#define CHECK_SCD_LV2_INTERRUPT \
24   if (lc89510_temp->get_segacd_irq_mask() & 0x04) \
25   if (m_lc89510_temp->get_segacd_irq_mask() & 0x04) \
2526   { \
2627      m_scdcpu->set_input_line(2, HOLD_LINE); \
2728   }
2829
2930// gfx convert
3031#define CHECK_SCD_LV1_INTERRUPT \
31   if (lc89510_temp->get_segacd_irq_mask() & 0x02) \
32   if (m_lc89510_temp->get_segacd_irq_mask() & 0x02) \
3233   { \
3334      m_scdcpu->set_input_line(1, HOLD_LINE); \
3435   }
3536
36#define SEGACD_IRQ3_TIMER_SPEED (attotime::from_nsec(segacd_irq3_timer_reg*30720))
37#define SEGACD_IRQ3_TIMER_SPEED (attotime::from_nsec(m_irq3_timer_reg*30720))
3738
3839
39class sega_segacd_device : public device_t
40class sega_segacd_device : public device_t, public device_gfx_interface
4041{
4142public:
4243   sega_segacd_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
4344
4445   required_device<cpu_device> m_scdcpu;
45   lc89510_temp_device *lc89510_temp;
46   required_device<rf5c68_device> m_rfsnd;
47   required_device<lc89510_temp_device> m_lc89510_temp;
48   required_device<timer_device> m_stopwatch_timer;
49   required_device<timer_device> m_stamp_timer;
50   required_device<timer_device> m_irq3_timer;
51   required_device<timer_device> m_dma_timer;
52   //required_device<timer_device> m_hock_timer;
4653
47   UINT16 *segacd_backupram;
48   timer_device *stopwatch_timer;
49   UINT8 segacd_font_color;
50   UINT16* segacd_font_bits;
54   required_shared_ptr<UINT16> m_prgram;
55   required_shared_ptr<UINT16> m_dataram;
56   required_shared_ptr<UINT16> m_font_bits;
57
58   // can't use a memshare because it's 8-bit RAM in a 16-bit address space
59   dynamic_array<UINT8> m_backupram;
60
61   UINT8 m_font_color;
62
5163   UINT16 scd_rammode;
5264   UINT32 scd_mode_dmna_ret_flags ;
5365
54   timer_device *segacd_gfx_conversion_timer;
55   timer_device *segacd_irq3_timer;
56   //timer_device *segacd_hock_timer;
57
58   UINT16* segacd_4meg_prgram;  // pointer to SubCPU PrgRAM
59   UINT16* segacd_dataram;
60   UINT16* segacd_dataram2;
6166   tilemap_t    *segacd_stampmap[4];
6267
6368
r29441r29442
8489   int segacd_redled;// = 0;
8590   int segacd_greenled;// = 0;
8691   int segacd_ready;// = 1; // actually set 100ms after startup?
87   UINT16 segacd_irq3_timer_reg;
92   UINT8 m_irq3_timer_reg;
8893
8994
90   TIMER_DEVICE_CALLBACK_MEMBER( segacd_irq3_timer_callback );
91   TIMER_DEVICE_CALLBACK_MEMBER( segacd_gfx_conversion_timer_callback );
95   TIMER_DEVICE_CALLBACK_MEMBER( irq3_timer_callback );
96   TIMER_DEVICE_CALLBACK_MEMBER( stamp_timer_callback );
9297
9398   UINT16 handle_segacd_sub_int_callback(int irqline);
9499
95   inline void write_pixel(running_machine& machine, UINT8 pix, int pixeloffset );
100   inline void write_pixel(UINT8 pix, int pixeloffset);
96101   UINT16 segacd_1meg_mode_word_read(int offset, UINT16 mem_mask);
97102   void segacd_1meg_mode_word_write(int offset, UINT16 data, UINT16 mem_mask, int use_pm);
98103
r29441r29442
106111   int m_base_total_scanlines;
107112   int m_total_scanlines;
108113
109   void segacd_mark_tiles_dirty(running_machine& machine, int offset);
114   void segacd_mark_tiles_dirty(int offset);
110115   int segacd_get_active_stampmap_tilemap(void);
111116
112117   // set some variables at start, depending on region (shall be moved to a device interface?)
r29441r29442
124129   TILE_GET_INFO_MEMBER( get_stampmap_16x16_16x16_tile_info );
125130   TILE_GET_INFO_MEMBER( get_stampmap_32x32_16x16_tile_info );
126131
127   UINT8 get_stampmap_16x16_1x1_tile_info_pixel(running_machine& machine, int xpos, int ypos);
128   UINT8 get_stampmap_32x32_1x1_tile_info_pixel(running_machine& machine, int xpos, int ypos);
129   UINT8 get_stampmap_16x16_16x16_tile_info_pixel(running_machine& machine, int xpos, int ypos);
130   UINT8 get_stampmap_32x32_16x16_tile_info_pixel(running_machine& machine, int xpos, int ypos);
132   UINT8 get_stampmap_16x16_1x1_tile_info_pixel(int xpos, int ypos);
133   UINT8 get_stampmap_32x32_1x1_tile_info_pixel(int xpos, int ypos);
134   UINT8 get_stampmap_16x16_16x16_tile_info_pixel(int xpos, int ypos);
135   UINT8 get_stampmap_32x32_16x16_tile_info_pixel(int xpos, int ypos);
131136
132137   WRITE16_MEMBER( scd_a12000_halt_reset_w );
133138   READ16_MEMBER( scd_a12000_halt_reset_r );
r29441r29442
177182   READ16_MEMBER( segacd_stampsize_r );
178183   WRITE16_MEMBER( segacd_stampsize_w );
179184
180   UINT8 read_pixel_from_stampmap( running_machine& machine, bitmap_ind16* srcbitmap, int x, int y);
185   UINT8 read_pixel_from_stampmap(bitmap_ind16* srcbitmap, int x, int y);
181186
182187   WRITE16_MEMBER( segacd_trace_vector_base_address_w );
183188   READ16_MEMBER( segacd_imagebuffer_vdot_size_r );
r29441r29442
194199   WRITE16_MEMBER( segacd_imagebuffer_hdot_size_w );
195200   READ16_MEMBER( segacd_irq3timer_r );
196201   WRITE16_MEMBER( segacd_irq3timer_w );
197   READ16_MEMBER( segacd_backupram_r );
198   WRITE16_MEMBER( segacd_backupram_w );
199   READ16_MEMBER( segacd_font_color_r );
200   WRITE16_MEMBER( segacd_font_color_w );
201   READ16_MEMBER( segacd_font_converted_r );
202   TIMER_DEVICE_CALLBACK_MEMBER( scd_dma_timer_callback );
202   READ8_MEMBER( backupram_r );
203   WRITE8_MEMBER( backupram_w );
204   READ8_MEMBER( font_color_r );
205   WRITE8_MEMBER( font_color_w );
206   READ16_MEMBER( font_converted_r );
207   TIMER_DEVICE_CALLBACK_MEMBER( dma_timer_callback );
203208   IRQ_CALLBACK_MEMBER(segacd_sub_int_callback);
204209
205210   void SegaCD_CDC_Do_DMA( int &dmacount, UINT8 *CDC_BUFFER, UINT16 &dma_addrc, UINT16 &destination );
206   timer_device* scd_dma_timer;
207   required_device<gfxdecode_device> m_gfxdecode;
208211
209212protected:
210213   virtual void device_start();
trunk/src/mess/machine/megacd.c
r29441r29442
22#include "machine/megacd.h"
33#include "machine/nvram.h"
44#include "megacd.lh"
5#include "sound/rf5c68.h"
65
76
7const device_type SEGA_SEGACD_US = &device_creator<sega_segacd_us_device>;
8const device_type SEGA_SEGACD_JAPAN = &device_creator<sega_segacd_japan_device>;
9const device_type SEGA_SEGACD_EUROPE = &device_creator<sega_segacd_europe_device>;
10
11
812/* Callback when the genesis enters interrupt code */
913IRQ_CALLBACK_MEMBER(sega_segacd_device::segacd_sub_int_callback)
1014{
r29441r29442
1923}
2024
2125
22const device_type SEGA_SEGACD_US = &device_creator<sega_segacd_us_device>;
23const device_type SEGA_SEGACD_JAPAN = &device_creator<sega_segacd_japan_device>;
24const device_type SEGA_SEGACD_EUROPE = &device_creator<sega_segacd_europe_device>;
25
26sega_segacd_device::sega_segacd_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
27   : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
28      m_scdcpu(*this, "segacd_68k"),
29      m_gfxdecode(*this, "gfxdecode")
26TIMER_DEVICE_CALLBACK_MEMBER( sega_segacd_device::irq3_timer_callback )
3027{
31}
32
33sega_segacd_us_device::sega_segacd_us_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
34   : sega_segacd_device(mconfig, SEGA_SEGACD_US, "sega_segacd_us", tag, owner, clock, "sega_segacd_us", __FILE__)
35{
36}
37
38sega_segacd_japan_device::sega_segacd_japan_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
39   : sega_segacd_device(mconfig, SEGA_SEGACD_JAPAN, "sega_segacd_japan", tag, owner, clock, "sega_segacd_japan", __FILE__)
40{
41}
42
43sega_segacd_europe_device::sega_segacd_europe_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
44   : sega_segacd_device(mconfig, SEGA_SEGACD_EUROPE, "sega_segacd_europe", tag, owner, clock, "sega_segacd_europe", __FILE__)
45{
46}
47
48
49TIMER_DEVICE_CALLBACK_MEMBER( sega_segacd_device::segacd_irq3_timer_callback )
50{
5128   CHECK_SCD_LV3_INTERRUPT
52   segacd_irq3_timer->adjust(SEGACD_IRQ3_TIMER_SPEED);
29   m_irq3_timer->adjust(SEGACD_IRQ3_TIMER_SPEED);
5330}
5431
5532
56TIMER_DEVICE_CALLBACK_MEMBER( sega_segacd_device::segacd_gfx_conversion_timer_callback )
33TIMER_DEVICE_CALLBACK_MEMBER( sega_segacd_device::stamp_timer_callback )
5734{
58   //printf("segacd_gfx_conversion_timer_callback\n");
35   //printf("stamp_timer_callback\n");
5936
6037   CHECK_SCD_LV1_INTERRUPT
6138
r29441r29442
6643}
6744
6845
69
70
71ADDRESS_MAP_START( segacd_map, AS_PROGRAM, 16, sega_segacd_device )
72   AM_RANGE(0x000000, 0x07ffff) AM_RAM AM_SHARE("segacd_program")
73
46static ADDRESS_MAP_START( segacd_map, AS_PROGRAM, 16, sega_segacd_device )
47   AM_RANGE(0x000000, 0x07ffff) AM_RAM AM_SHARE("prgram")
7448   AM_RANGE(0x080000, 0x0bffff) AM_READWRITE(segacd_sub_dataram_part1_r, segacd_sub_dataram_part1_w) AM_SHARE("dataram")
7549   AM_RANGE(0x0c0000, 0x0dffff) AM_READWRITE(segacd_sub_dataram_part2_r, segacd_sub_dataram_part2_w) //AM_SHARE("dataram2")
7650
77   AM_RANGE(0xfe0000, 0xfe3fff) AM_READWRITE(segacd_backupram_r,segacd_backupram_w) AM_SHARE("backupram") // backup RAM, odd bytes only!
51   AM_RANGE(0xfe0000, 0xfe3fff) AM_READWRITE8(backupram_r, backupram_w, 0x00ff) // backup RAM, odd bytes only!
7852
7953   AM_RANGE(0xff0000, 0xff001f) AM_DEVWRITE8("rfsnd", rf5c68_device, rf5c68_w, 0x00ff)  // PCM, RF5C164
8054   AM_RANGE(0xff0020, 0xff003f) AM_DEVREAD8("rfsnd", rf5c68_device, rf5c68_r, 0x00ff)
8155   AM_RANGE(0xff2000, 0xff3fff) AM_DEVREADWRITE8("rfsnd", rf5c68_device, rf5c68_mem_r, rf5c68_mem_w,0x00ff)  // PCM, RF5C164
8256
83
8457   AM_RANGE(0xff8000 ,0xff8001) AM_READWRITE(segacd_sub_led_ready_r, segacd_sub_led_ready_w)
8558   AM_RANGE(0xff8002 ,0xff8003) AM_READWRITE(segacd_sub_memory_mode_r, segacd_sub_memory_mode_w)
8659
r29441r29442
9871   AM_RANGE(0xff8036, 0xff8037) AM_DEVREADWRITE("tempcdc",lc89510_temp_device,segacd_cdd_ctrl_r,segacd_cdd_ctrl_w)
9972   AM_RANGE(0xff8038, 0xff8041) AM_DEVREAD8("tempcdc",lc89510_temp_device,segacd_cdd_rx_r,0xffff)
10073   AM_RANGE(0xff8042, 0xff804b) AM_DEVWRITE8("tempcdc",lc89510_temp_device,segacd_cdd_tx_w,0xffff)
101   AM_RANGE(0xff804c, 0xff804d) AM_READWRITE(segacd_font_color_r, segacd_font_color_w)
102   AM_RANGE(0xff804e, 0xff804f) AM_RAM AM_SHARE("segacd_font")
103   AM_RANGE(0xff8050, 0xff8057) AM_READ(segacd_font_converted_r)
74   AM_RANGE(0xff804c, 0xff804d) AM_READWRITE8(font_color_r, font_color_w, 0x00ff)
75   AM_RANGE(0xff804e, 0xff804f) AM_RAM AM_SHARE("font_bits")
76   AM_RANGE(0xff8050, 0xff8057) AM_READ(font_converted_r)
10477   AM_RANGE(0xff8058, 0xff8059) AM_READWRITE(segacd_stampsize_r, segacd_stampsize_w) // Stamp size
10578   AM_RANGE(0xff805a, 0xff805b) AM_READWRITE(segacd_stampmap_base_address_r, segacd_stampmap_base_address_w) // Stamp map base address
10679   AM_RANGE(0xff805c, 0xff805d) AM_READWRITE(segacd_imagebuffer_vcell_size_r, segacd_imagebuffer_vcell_size_w)// Image buffer V cell size
r29441r29442
12699#define SEGACD_NUM_TILES16 (0x40000/SEGACD_BYTES_PER_TILE16)
127100#define SEGACD_NUM_TILES32 (0x40000/SEGACD_BYTES_PER_TILE32)
128101
129#define _16x16_SEQUENCE_1  { 8,12,0,4,24,28,16,20, 512+8, 512+12, 512+0, 512+4, 512+24, 512+28, 512+16, 512+20 },
130#define _16x16_SEQUENCE_1_FLIP  { 512+20,512+16,512+28,512+24,512+4,512+0, 512+12,512+8, 20,16,28,24,4,0,12,8 },
102#define _16x16_SEQUENCE_1  { STEP8(0, 4), STEP8(512, 4) },
103#define _16x16_SEQUENCE_1_FLIP  { STEP8(512+28, -4), STEP8(28, -4) },
131104
132#define _16x16_SEQUENCE_2  { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, 8*32, 9*32,10*32,11*32,12*32,13*32,14*32,15*32 },
133#define _16x16_SEQUENCE_2_FLIP  { 15*32, 14*32, 13*32, 12*32, 11*32, 10*32, 9*32, 8*32, 7*32, 6*32, 5*32, 4*32, 3*32, 2*32, 1*32, 0*32 },
105#define _16x16_SEQUENCE_2  { STEP16(0, 32) },
106#define _16x16_SEQUENCE_2_FLIP  { STEP16(15*32, -32) },
134107
135108
136109#define _16x16_START \
r29441r29442
153126   8*512 \
154127};
155128
129#define _32x32_SEQUENCE_1 { STEP8(0, 4), STEP8(1024, 4), STEP8(2048, 4), STEP8(3072, 4) },
130#define _32x32_SEQUENCE_1_FLIP { STEP8(3072+28, -4), STEP8(2048+28, -4), STEP8(1024+28, -4), STEP8(28, -4) },
156131
157#define _32x32_SEQUENCE_1 \
158   { 8,12,0,4,24,28,16,20, \
159   1024+8, 1024+12, 1024+0, 1024+4, 1024+24, 1024+28, 1024+16, 1024+20, \
160   2048+8, 2048+12, 2048+0, 2048+4, 2048+24, 2048+28, 2048+16, 2048+20, \
161   3072+8, 3072+12, 3072+0, 3072+4, 3072+24, 3072+28, 3072+16, 3072+20  \
162   },
163#define _32x32_SEQUENCE_1_FLIP \
164{ 3072+20, 3072+16, 3072+28, 3072+24, 3072+4, 3072+0, 3072+12, 3072+8, \
165   2048+20, 2048+16, 2048+28, 2048+24, 2048+4, 2048+0, 2048+12, 2048+8, \
166   1024+20, 1024+16, 1024+28, 1024+24, 1024+4, 1024+0, 1024+12, 1024+8, \
167   20, 16, 28, 24, 4, 0, 12, 8},
132#define _32x32_SEQUENCE_2 { STEP32(0, 32) },
133#define _32x32_SEQUENCE_2_FLIP { STEP32(31*32, -32) },
168134
169#define _32x32_SEQUENCE_2 \
170      { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, \
171      8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32, \
172      16*32,17*32,18*32,19*32,20*32,21*32,22*32,23*32, \
173      24*32,25*32, 26*32, 27*32, 28*32, 29*32, 30*32, 31*32},
174#define _32x32_SEQUENCE_2_FLIP \
175{ 31*32, 30*32, 29*32, 28*32, 27*32, 26*32, 25*32, 24*32, \
176   23*32, 22*32, 21*32, 20*32, 19*32, 18*32, 17*32, 16*32, \
177   15*32, 14*32, 13*32, 12*32, 11*32, 10*32, 9*32 , 8*32 , \
178   7*32 , 6*32 , 5*32 , 4*32 , 3*32 , 2*32 , 1*32 , 0*32},
179135
180136/* 16x16 decodes */
181137static const gfx_layout sega_16x16_r00_f0_layout =
r29441r29442
275231   _32x32_SEQUENCE_1_FLIP
276232_32x32_END
277233
278GFXDECODE_START( segacd )
279   GFXDECODE_ENTRY( NULL, 0, sega_16x16_r00_f0_layout, 0, 0 )
280   GFXDECODE_ENTRY( NULL, 0, sega_16x16_r01_f0_layout, 0, 0 )
281   GFXDECODE_ENTRY( NULL, 0, sega_16x16_r10_f0_layout, 0, 0 )
282   GFXDECODE_ENTRY( NULL, 0, sega_16x16_r11_f0_layout, 0, 0 )
283   GFXDECODE_ENTRY( NULL, 0, sega_16x16_r00_f1_layout, 0, 0 )
284   GFXDECODE_ENTRY( NULL, 0, sega_16x16_r11_f1_layout, 0, 0 )
285   GFXDECODE_ENTRY( NULL, 0, sega_16x16_r10_f1_layout, 0, 0 )
286   GFXDECODE_ENTRY( NULL, 0, sega_16x16_r01_f1_layout, 0, 0 )
287   GFXDECODE_ENTRY( NULL, 0, sega_32x32_r00_f0_layout, 0, 0 )
288   GFXDECODE_ENTRY( NULL, 0, sega_32x32_r01_f0_layout, 0, 0 )
289   GFXDECODE_ENTRY( NULL, 0, sega_32x32_r10_f0_layout, 0, 0 )
290   GFXDECODE_ENTRY( NULL, 0, sega_32x32_r11_f0_layout, 0, 0 )
291   GFXDECODE_ENTRY( NULL, 0, sega_32x32_r00_f1_layout, 0, 0 )
292   GFXDECODE_ENTRY( NULL, 0, sega_32x32_r11_f1_layout, 0, 0 )
293   GFXDECODE_ENTRY( NULL, 0, sega_32x32_r10_f1_layout, 0, 0 )
294   GFXDECODE_ENTRY( NULL, 0, sega_32x32_r01_f1_layout, 0, 0 )
234static GFXDECODE_START( segacd )
235   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_16x16_r00_f0_layout, 0, 0 )
236   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_16x16_r01_f0_layout, 0, 0 )
237   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_16x16_r10_f0_layout, 0, 0 )
238   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_16x16_r11_f0_layout, 0, 0 )
239   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_16x16_r00_f1_layout, 0, 0 )
240   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_16x16_r11_f1_layout, 0, 0 )
241   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_16x16_r10_f1_layout, 0, 0 )
242   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_16x16_r01_f1_layout, 0, 0 )
243   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_32x32_r00_f0_layout, 0, 0 )
244   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_32x32_r01_f0_layout, 0, 0 )
245   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_32x32_r10_f0_layout, 0, 0 )
246   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_32x32_r11_f0_layout, 0, 0 )
247   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_32x32_r00_f1_layout, 0, 0 )
248   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_32x32_r11_f1_layout, 0, 0 )
249   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_32x32_r10_f1_layout, 0, 0 )
250   GFXDECODE_DEVICE_RAM( "dataram", 0, sega_32x32_r01_f1_layout, 0, 0 )
295251GFXDECODE_END
296252
297253
298
299254static MACHINE_CONFIG_FRAGMENT( segacd_fragment )
300255
301256   MCFG_CPU_ADD("segacd_68k", M68000, SEGACD_CLOCK ) /* 12.5 MHz */
r29441r29442
308263   MCFG_SEGACD_HACK_SET_CDC_DO_DMA( sega_segacd_device, SegaCD_CDC_Do_DMA ) // hack
309264
310265   MCFG_TIMER_ADD_NONE("sw_timer") //stopwatch timer
311   MCFG_TIMER_DRIVER_ADD("irq3_timer", sega_segacd_device, segacd_irq3_timer_callback)
312   MCFG_TIMER_DRIVER_ADD("stamp_timer", sega_segacd_device, segacd_gfx_conversion_timer_callback)
313   MCFG_TIMER_DRIVER_ADD("scd_dma_timer", sega_segacd_device, scd_dma_timer_callback)
266   MCFG_TIMER_DRIVER_ADD("stamp_timer", sega_segacd_device, stamp_timer_callback)
267   MCFG_TIMER_DRIVER_ADD("irq3_timer", sega_segacd_device, irq3_timer_callback)
268   MCFG_TIMER_DRIVER_ADD("dma_timer", sega_segacd_device, dma_timer_callback)
314269
315   MCFG_GFXDECODE_ADD("gfxdecode", "^gen_vdp:palette", segacd) // FIXME
316
317270   MCFG_DEFAULT_LAYOUT( layout_megacd )
318271
319272   MCFG_RF5C68_ADD("rfsnd", SEGACD_CLOCK) // RF5C164!
r29441r29442
333286}
334287
335288
289sega_segacd_device::sega_segacd_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
290   : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
291      device_gfx_interface(mconfig, *this, GFXDECODE_NAME( segacd )),
292      m_scdcpu(*this, "segacd_68k"),
293      m_rfsnd(*this, "rfsnd"),
294      m_lc89510_temp(*this, "tempcdc"),
295      m_stopwatch_timer(*this, "sw_timer"),
296      m_stamp_timer(*this, "stamp_timer"),
297      m_irq3_timer(*this, "irq3_timer"),
298      m_dma_timer(*this, "dma_timer"),
299      m_prgram(*this, "prgram"),
300      m_dataram(*this, "dataram"),
301      m_font_bits(*this, "font_bits")
302{
303}
336304
305sega_segacd_us_device::sega_segacd_us_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
306   : sega_segacd_device(mconfig, SEGA_SEGACD_US, "sega_segacd_us", tag, owner, clock, "sega_segacd_us", __FILE__)
307{
308}
337309
310sega_segacd_japan_device::sega_segacd_japan_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
311   : sega_segacd_device(mconfig, SEGA_SEGACD_JAPAN, "sega_segacd_japan", tag, owner, clock, "sega_segacd_japan", __FILE__)
312{
313}
338314
315sega_segacd_europe_device::sega_segacd_europe_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
316   : sega_segacd_device(mconfig, SEGA_SEGACD_EUROPE, "sega_segacd_europe", tag, owner, clock, "sega_segacd_europe", __FILE__)
317{
318}
339319
340inline void sega_segacd_device::write_pixel(running_machine& machine, UINT8 pix, int pixeloffset )
320
321inline void sega_segacd_device::write_pixel(UINT8 pix, int pixeloffset)
341322{
342323   int shift = 12-(4*(pixeloffset&0x3));
343324   UINT16 datamask = (0x000f) << shift;
r29441r29442
350331   switch (segacd_memory_priority_mode)
351332   {
352333      case 0x00: // normal write, just write the data
353         segacd_dataram[offset] = segacd_dataram[offset] &~ datamask;
354         segacd_dataram[offset] |= pix << shift;
334         m_dataram[offset] = m_dataram[offset] &~ datamask;
335         m_dataram[offset] |= pix << shift;
355336         break;
356337
357338      case 0x01: // underwrite, only write if the existing data is 0
358         if ((segacd_dataram[offset]&datamask) == 0x0000)
339         if ((m_dataram[offset]&datamask) == 0x0000)
359340         {
360            segacd_dataram[offset] = segacd_dataram[offset] &~ datamask;
361            segacd_dataram[offset] |= pix << shift;
341            m_dataram[offset] = m_dataram[offset] &~ datamask;
342            m_dataram[offset] |= pix << shift;
362343         }
363344         break;
364345
365346      case 0x02: // overwrite, only write non-zero data
366347         if (pix)
367348         {
368            segacd_dataram[offset] = segacd_dataram[offset] &~ datamask;
369            segacd_dataram[offset] |= pix << shift;
349            m_dataram[offset] = m_dataram[offset] &~ datamask;
350            m_dataram[offset] |= pix << shift;
370351         }
371352         break;
372353
373354      default:
374355      case 0x03:
375         pix = machine.rand() & 0x000f;
376         segacd_dataram[offset] = segacd_dataram[offset] &~ datamask;
377         segacd_dataram[offset] |= pix << shift;
356         pix = machine().rand() & 0x000f;
357         m_dataram[offset] = m_dataram[offset] &~ datamask;
358         m_dataram[offset] |= pix << shift;
378359         break;
379360
380361   }
r29441r29442
393374
394375   offset &=0x1ffff;
395376
396   return segacd_dataram[offset];
377   return m_dataram[offset];
397378}
398379
399380
r29441r29442
413394      switch (segacd_memory_priority_mode)
414395      {
415396         case 0x00: // normal write, just write the data
416            COMBINE_DATA(&segacd_dataram[offset]);
397            COMBINE_DATA(&m_dataram[offset]);
417398            break;
418399
419400         case 0x01: // underwrite, only write if the existing data is 0
420401            if (ACCESSING_BITS_8_15)
421402            {
422               if ((segacd_dataram[offset]&0xf000) == 0x0000) segacd_dataram[offset] |= (data)&0xf000;
423               if ((segacd_dataram[offset]&0x0f00) == 0x0000) segacd_dataram[offset] |= (data)&0x0f00;
403               if ((m_dataram[offset]&0xf000) == 0x0000) m_dataram[offset] |= (data)&0xf000;
404               if ((m_dataram[offset]&0x0f00) == 0x0000) m_dataram[offset] |= (data)&0x0f00;
424405            }
425406            if (ACCESSING_BITS_0_7)
426407            {
427               if ((segacd_dataram[offset]&0x00f0) == 0x0000) segacd_dataram[offset] |= (data)&0x00f0;
428               if ((segacd_dataram[offset]&0x000f) == 0x0000) segacd_dataram[offset] |= (data)&0x000f;
408               if ((m_dataram[offset]&0x00f0) == 0x0000) m_dataram[offset] |= (data)&0x00f0;
409               if ((m_dataram[offset]&0x000f) == 0x0000) m_dataram[offset] |= (data)&0x000f;
429410            }
430411            break;
431412
432413         case 0x02: // overwrite, only write non-zero data
433414            if (ACCESSING_BITS_8_15)
434415            {
435               if ((data)&0xf000) segacd_dataram[offset] = (segacd_dataram[offset] & 0x0fff) | ((data)&0xf000);
436               if ((data)&0x0f00) segacd_dataram[offset] = (segacd_dataram[offset] & 0xf0ff) | ((data)&0x0f00);
416               if ((data)&0xf000) m_dataram[offset] = (m_dataram[offset] & 0x0fff) | ((data)&0xf000);
417               if ((data)&0x0f00) m_dataram[offset] = (m_dataram[offset] & 0xf0ff) | ((data)&0x0f00);
437418            }
438419            if (ACCESSING_BITS_0_7)
439420            {
440               if ((data)&0x00f0) segacd_dataram[offset] = (segacd_dataram[offset] & 0xff0f) | ((data)&0x00f0);
441               if ((data)&0x000f) segacd_dataram[offset] = (segacd_dataram[offset] & 0xfff0) | ((data)&0x000f);
421               if ((data)&0x00f0) m_dataram[offset] = (m_dataram[offset] & 0xff0f) | ((data)&0x00f0);
422               if ((data)&0x000f) m_dataram[offset] = (m_dataram[offset] & 0xfff0) | ((data)&0x000f);
442423            }
443424            break;
444425
445426         default:
446427         case 0x03: // invalid?
447            COMBINE_DATA(&segacd_dataram[offset]);
428            COMBINE_DATA(&m_dataram[offset]);
448429            break;
449430
450431      }
451432   }
452433   else
453434   {
454      COMBINE_DATA(&segacd_dataram[offset]);
435      COMBINE_DATA(&m_dataram[offset]);
455436   }
456437}
457438
r29441r29442
731712READ16_MEMBER( sega_segacd_device::scd_4m_prgbank_ram_r )
732713{
733714   UINT16 realoffset = ((segacd_4meg_prgbank * 0x20000)/2) + offset;
734   return segacd_4meg_prgram[realoffset];
715   return m_prgram[realoffset];
735716
736717}
737718
r29441r29442
742723   // todo:
743724   // check for write protection? (or does that only apply to writes on the SubCPU side?
744725
745   COMBINE_DATA(&segacd_4meg_prgram[realoffset]);
726   COMBINE_DATA(&m_prgram[realoffset]);
746727
747728}
748729
r29441r29442
797778      // is this correct?
798779      if (!(scd_rammode&1))
799780      {
800         //printf("segacd_main_dataram_part1_r in mode 0 %08x %04x\n", offset*2, segacd_dataram[offset]);
781         //printf("segacd_main_dataram_part1_r in mode 0 %08x %04x\n", offset*2, m_dataram[offset]);
801782
802         return segacd_dataram[offset];
783         return m_dataram[offset];
803784
804785      }
805786      else
r29441r29442
864845      // is this correct?
865846      if (!(scd_rammode&1))
866847      {
867         COMBINE_DATA(&segacd_dataram[offset]);
868         segacd_mark_tiles_dirty(space.machine(), offset);
848         COMBINE_DATA(&m_dataram[offset]);
849         segacd_mark_tiles_dirty(offset);
869850      }
870851      else
871852      {
r29441r29442
925906}
926907
927908
928
929
930
931
932void sega_segacd_device::segacd_mark_tiles_dirty(running_machine& machine, int offset)
909void sega_segacd_device::segacd_mark_tiles_dirty(int offset)
933910{
934   m_gfxdecode->gfx(0)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
935   m_gfxdecode->gfx(1)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
936   m_gfxdecode->gfx(2)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
937   m_gfxdecode->gfx(3)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
938   m_gfxdecode->gfx(4)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
939   m_gfxdecode->gfx(5)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
940   m_gfxdecode->gfx(6)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
941   m_gfxdecode->gfx(7)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
911   gfx(0)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
912   gfx(1)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
913   gfx(2)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
914   gfx(3)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
915   gfx(4)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
916   gfx(5)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
917   gfx(6)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
918   gfx(7)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE16));
942919
943   m_gfxdecode->gfx(8)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
944   m_gfxdecode->gfx(9)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
945   m_gfxdecode->gfx(10)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
946   m_gfxdecode->gfx(11)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
947   m_gfxdecode->gfx(12)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
948   m_gfxdecode->gfx(13)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
949   m_gfxdecode->gfx(14)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
950   m_gfxdecode->gfx(15)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
920   gfx(8)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
921   gfx(9)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
922   gfx(10)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
923   gfx(11)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
924   gfx(12)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
925   gfx(13)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
926   gfx(14)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
927   gfx(15)->mark_dirty((offset*2)/(SEGACD_BYTES_PER_TILE32));
951928}
952929
953930
r29441r29442
964941   tile_region = 0; // 16x16 tiles
965942   int tile_base = (segacd_stampmap_base_address & 0xff80) * 4;
966943
967   int tiledat = segacd_dataram[((tile_base>>1)+tile_index) & 0x1ffff];
944   int tiledat = m_dataram[((tile_base>>1)+tile_index) & 0x1ffff];
968945   tileno = tiledat & 0x07ff;
969946   int xflip =  tiledat & 0x8000;
970947   int roll  =  (tiledat & 0x6000)>>13;
r29441r29442
978955   tile_region = 8; // 32x32 tiles
979956   int tile_base = (segacd_stampmap_base_address & 0xffe0) * 4;
980957
981   int tiledat = segacd_dataram[((tile_base>>1)+tile_index) & 0x1ffff];
958   int tiledat = m_dataram[((tile_base>>1)+tile_index) & 0x1ffff];
982959   tileno = (tiledat & 0x07fc)>>2;
983960   int xflip =  tiledat & 0x8000;
984961   int roll  =  (tiledat & 0x6000)>>13;
r29441r29442
993970   tile_region = 0; // 16x16 tiles
994971   int tile_base = (0x8000) * 4; // fixed address in this mode
995972
996   int tiledat = segacd_dataram[((tile_base>>1)+tile_index) & 0x1ffff];
973   int tiledat = m_dataram[((tile_base>>1)+tile_index) & 0x1ffff];
997974   tileno = tiledat & 0x07ff;
998975   int xflip =  tiledat & 0x8000;
999976   int roll  =  (tiledat & 0x6000)>>13;
r29441r29442
1008985   tile_region = 8; // 32x32 tiles
1009986   int tile_base = (segacd_stampmap_base_address & 0xe000) * 4;
1010987
1011   int tiledat = segacd_dataram[((tile_base>>1)+tile_index) & 0x1ffff];
988   int tiledat = m_dataram[((tile_base>>1)+tile_index) & 0x1ffff];
1012989   tileno = (tiledat & 0x07fc)>>2;
1013990   int xflip =  tiledat & 0x8000;
1014991   int roll  =  (tiledat & 0x6000)>>13;
r29441r29442
10521029
10531030// non-tilemap functions to get a pixel from a 'tilemap' based on the above, but looking up each pixel, as to avoid the heavy cache bitmap
10541031
1055inline UINT8 sega_segacd_device::get_stampmap_16x16_1x1_tile_info_pixel(running_machine& machine, int xpos, int ypos)
1032inline UINT8 sega_segacd_device::get_stampmap_16x16_1x1_tile_info_pixel(int xpos, int ypos)
10561033{
10571034   const int tilesize = 4; // 0xf pixels
10581035   const int tilemapsize = 0x0f;
r29441r29442
10821059   int tile_region, tileno;
10831060   SCD_GET_TILE_INFO_16x16_1x1(tile_region,tileno,(int)tile_index);
10841061
1085   gfx_element *gfx = m_gfxdecode->gfx(tile_region);
1086   tileno %= gfx->elements();
1062   tileno %= gfx(tile_region)->elements();
10871063
10881064   if (tileno==0) return 0x00;
10891065
1090   const UINT8* srcdata = gfx->get_data(tileno);
1066   const UINT8* srcdata = gfx(tile_region)->get_data(tileno);
10911067   return srcdata[((ypos&((1<<tilesize)-1))*(1<<tilesize))+(xpos&((1<<tilesize)-1))];
10921068}
10931069
1094inline UINT8 sega_segacd_device::get_stampmap_32x32_1x1_tile_info_pixel(running_machine& machine, int xpos, int ypos)
1070inline UINT8 sega_segacd_device::get_stampmap_32x32_1x1_tile_info_pixel(int xpos, int ypos)
10951071{
10961072   const int tilesize = 5; // 0x1f pixels
10971073   const int tilemapsize = 0x07;
r29441r29442
11211097   int tile_region, tileno;
11221098   SCD_GET_TILE_INFO_32x32_1x1(tile_region,tileno,(int)tile_index);
11231099
1124   gfx_element *gfx = m_gfxdecode->gfx(tile_region);
1125   tileno %= gfx->elements();
1100   tileno %= gfx(tile_region)->elements();
11261101
11271102   if (tileno==0) return 0x00; // does this apply in this mode?
11281103
1129   const UINT8* srcdata = gfx->get_data(tileno);
1104   const UINT8* srcdata = gfx(tile_region)->get_data(tileno);
11301105   return srcdata[((ypos&((1<<tilesize)-1))*(1<<tilesize))+(xpos&((1<<tilesize)-1))];
11311106}
11321107
1133inline UINT8 sega_segacd_device::get_stampmap_16x16_16x16_tile_info_pixel(running_machine& machine, int xpos, int ypos)
1108inline UINT8 sega_segacd_device::get_stampmap_16x16_16x16_tile_info_pixel(int xpos, int ypos)
11341109{
11351110   const int tilesize = 4; // 0xf pixels
11361111   const int tilemapsize = 0xff;
r29441r29442
11601135   int tile_region, tileno;
11611136   SCD_GET_TILE_INFO_16x16_16x16(tile_region,tileno,(int)tile_index);
11621137
1163   gfx_element *gfx = m_gfxdecode->gfx(tile_region);
1164   tileno %= gfx->elements();
1138   tileno %= gfx(tile_region)->elements();
11651139
11661140   if (tileno==0) return 0x00; // does this apply in this mode
11671141
1168   const UINT8* srcdata = gfx->get_data(tileno);
1142   const UINT8* srcdata = gfx(tile_region)->get_data(tileno);
11691143   return srcdata[((ypos&((1<<tilesize)-1))*(1<<tilesize))+(xpos&((1<<tilesize)-1))];
11701144}
11711145
1172inline UINT8 sega_segacd_device::get_stampmap_32x32_16x16_tile_info_pixel(running_machine& machine, int xpos, int ypos)
1146inline UINT8 sega_segacd_device::get_stampmap_32x32_16x16_tile_info_pixel(int xpos, int ypos)
11731147{
11741148   const int tilesize = 5; // 0x1f pixels
11751149   const int tilemapsize = 0x7f;
r29441r29442
11991173   int tile_region, tileno;
12001174   SCD_GET_TILE_INFO_32x32_16x16(tile_region,tileno,(int)tile_index);
12011175
1202   gfx_element *gfx = m_gfxdecode->gfx(tile_region);
1203   tileno %= gfx->elements();
1176   tileno %= gfx(tile_region)->elements();
12041177
12051178   if (tileno==0) return 0x00;
12061179
1207   const UINT8* srcdata = gfx->get_data(tileno);
1180   const UINT8* srcdata = gfx(tile_region)->get_data(tileno);
12081181   return srcdata[((ypos&((1<<tilesize)-1))*(1<<tilesize))+(xpos&((1<<tilesize)-1))];
12091182}
12101183
r29441r29442
12131186WRITE16_MEMBER( sega_segacd_device::segacd_stopwatch_timer_w )
12141187{
12151188   if(data == 0)
1216      stopwatch_timer->reset();
1189      m_stopwatch_timer->reset();
12171190   else
12181191      printf("Stopwatch timer %04x\n",data);
12191192}
12201193
12211194READ16_MEMBER( sega_segacd_device::segacd_stopwatch_timer_r )
12221195{
1223   INT32 result = (stopwatch_timer->time_elapsed() * ATTOSECONDS_TO_HZ(ATTOSECONDS_IN_USEC(30.72))).as_double();
1196   INT32 result = (m_stopwatch_timer->time_elapsed() * ATTOSECONDS_TO_HZ(ATTOSECONDS_IN_USEC(30.72))).as_double();
12241197
12251198   return result & 0xfff;
12261199}
r29441r29442
12791252   {
12801253      // is this correct?
12811254      if (scd_rammode&1)
1282         return segacd_dataram[offset];
1255         return m_dataram[offset];
12831256      else
12841257      {
12851258         //printf("Illegal: segacd_sub_dataram_part1_r in mode 0 without permission\n");
r29441r29442
13221295      // is this correct?
13231296      if (scd_rammode&1)
13241297      {
1325         COMBINE_DATA(&segacd_dataram[offset]);
1326         segacd_mark_tiles_dirty(space.machine(), offset);
1298         COMBINE_DATA(&m_dataram[offset]);
1299         segacd_mark_tiles_dirty(offset);
13271300      }
13281301      else
13291302      {
r29441r29442
14521425// the lower 3 bits of segacd_imagebuffer_hdot_size are set
14531426
14541427// this really needs to be doing it's own lookups rather than depending on the inefficient MAME cache..
1455inline UINT8 sega_segacd_device::read_pixel_from_stampmap( running_machine& machine, bitmap_ind16* srcbitmap, int x, int y)
1428inline UINT8 sega_segacd_device::read_pixel_from_stampmap(bitmap_ind16* srcbitmap, int x, int y)
14561429{
14571430/*
14581431    if (!srcbitmap)
r29441r29442
14701443
14711444   switch (segacd_get_active_stampmap_tilemap()&3)
14721445   {
1473      case 0x00: return get_stampmap_16x16_1x1_tile_info_pixel( machine, x, y );
1474      case 0x01: return get_stampmap_32x32_1x1_tile_info_pixel( machine, x, y );
1475      case 0x02: return get_stampmap_16x16_16x16_tile_info_pixel( machine, x, y );
1476      case 0x03: return get_stampmap_32x32_16x16_tile_info_pixel( machine, x, y );
1446      case 0x00: return get_stampmap_16x16_1x1_tile_info_pixel( x, y );
1447      case 0x01: return get_stampmap_32x32_1x1_tile_info_pixel( x, y );
1448      case 0x02: return get_stampmap_16x16_16x16_tile_info_pixel( x, y );
1449      case 0x03: return get_stampmap_32x32_16x16_tile_info_pixel( x, y );
14771450   }
14781451
14791452   return 0;
r29441r29442
15041477      segacd_conversion_active = 1;
15051478
15061479      // todo: proper time calculation
1507      segacd_gfx_conversion_timer->adjust(attotime::from_nsec(30000));
1480      m_stamp_timer->adjust(attotime::from_nsec(30000));
15081481
15091482
15101483
r29441r29442
15211494         INT16 tilemapxoffs,tilemapyoffs;
15221495         INT16 deltax,deltay;
15231496
1524         tilemapxoffs = segacd_dataram[(currbase+0x0)>>1];
1525         tilemapyoffs = segacd_dataram[(currbase+0x2)>>1];
1526         deltax = segacd_dataram[(currbase+0x4)>>1]; // x-zoom
1527         deltay = segacd_dataram[(currbase+0x6)>>1]; // rotation
1497         tilemapxoffs = m_dataram[(currbase+0x0)>>1];
1498         tilemapyoffs = m_dataram[(currbase+0x2)>>1];
1499         deltax = m_dataram[(currbase+0x4)>>1]; // x-zoom
1500         deltay = m_dataram[(currbase+0x6)>>1]; // rotation
15281501
15291502         //printf("%06x:  %04x (%d) %04x (%d) %04x %04x\n", currbase, tilemapxoffs, tilemapxoffs>>3, tilemapyoffs, tilemapyoffs>>3, deltax, deltay);
15301503
r29441r29442
15371510            //int i;
15381511            UINT8 pix = 0x0;
15391512
1540            pix = read_pixel_from_stampmap(space.machine(), srcbitmap, xbase>>(3+8), ybase>>(3+8));
1513            pix = read_pixel_from_stampmap(srcbitmap, xbase>>(3+8), ybase>>(3+8));
15411514
15421515            xbase += deltax;
15431516            ybase += deltay;
r29441r29442
15571530
15581531            offset+=countx & 0x7;
15591532
1560            write_pixel( space.machine(), pix, offset );
1533            write_pixel( pix, offset );
15611534
1562            segacd_mark_tiles_dirty(space.machine(), (offset>>3));
1563            segacd_mark_tiles_dirty(space.machine(), (offset>>3)+1);
1535            segacd_mark_tiles_dirty(offset>>3);
1536            segacd_mark_tiles_dirty((offset>>3)+1);
15641537
15651538         }
15661539
r29441r29442
16481621
16491622READ16_MEMBER( sega_segacd_device::segacd_irq3timer_r )
16501623{
1651   return segacd_irq3_timer_reg; // always returns value written, not current counter!
1624   return m_irq3_timer_reg; // always returns value written, not current counter!
16521625}
16531626
16541627
r29441r29442
16561629{
16571630   if (ACCESSING_BITS_0_7)
16581631   {
1659      segacd_irq3_timer_reg = data & 0xff;
1632      m_irq3_timer_reg = data & 0xff;
16601633
16611634      // time = reg * 30.72 us
16621635
1663      if (segacd_irq3_timer_reg)
1664         segacd_irq3_timer->adjust(SEGACD_IRQ3_TIMER_SPEED);
1636      if (m_irq3_timer_reg)
1637         m_irq3_timer->adjust(SEGACD_IRQ3_TIMER_SPEED);
16651638      else
1666         segacd_irq3_timer->adjust(attotime::never);
1639         m_irq3_timer->adjust(attotime::never);
16671640
1668      //printf("segacd_irq3timer_w %02x\n", segacd_irq3_timer_reg);
1641      //printf("segacd_irq3timer_w %02x\n", segacd_m_irq3_timer_reg);
16691642   }
16701643}
16711644
16721645
1673
1674
1675
1676
1677
1678READ16_MEMBER( sega_segacd_device::segacd_backupram_r )
1646READ8_MEMBER( sega_segacd_device::backupram_r )
16791647{
1680   if(ACCESSING_BITS_8_15 && !(space.debugger_access()))
1681      printf("Warning: read to backupram even bytes! [%04x]\n",offset);
1682
1683   return segacd_backupram[offset] & 0xff;
1648   return m_backupram[offset];
16841649}
16851650
1686WRITE16_MEMBER( sega_segacd_device::segacd_backupram_w )
1651WRITE8_MEMBER( sega_segacd_device::backupram_w )
16871652{
1688   if(ACCESSING_BITS_0_7)
1689      segacd_backupram[offset] = data;
1690
1691   if(ACCESSING_BITS_8_15 && !(space.debugger_access()))
1692      printf("Warning: write to backupram even bytes! [%04x] %02x\n",offset,data);
1653   m_backupram[offset] = data;
16931654}
16941655
1695READ16_MEMBER( sega_segacd_device::segacd_font_color_r )
1656READ8_MEMBER( sega_segacd_device::font_color_r )
16961657{
1697   return segacd_font_color;
1658   return m_font_color;
16981659}
16991660
1700WRITE16_MEMBER( sega_segacd_device::segacd_font_color_w )
1661WRITE8_MEMBER( sega_segacd_device::font_color_w )
17011662{
1702   if (ACCESSING_BITS_0_7)
1703   {
1704      segacd_font_color = data & 0xff;
1705   }
1663   m_font_color = data;
17061664}
17071665
1708READ16_MEMBER( sega_segacd_device::segacd_font_converted_r )
1666READ16_MEMBER( sega_segacd_device::font_converted_r )
17091667{
1710   int scbg = (segacd_font_color & 0x0f);
1711   int scfg = (segacd_font_color & 0xf0)>>4;
1668   int scbg = (m_font_color & 0x0f);
1669   int scfg = (m_font_color & 0xf0)>>4;
17121670   UINT16 retdata = 0;
17131671   int bit;
17141672
17151673   for (bit=0;bit<4;bit++)
17161674   {
1717      if (*segacd_font_bits&((0x1000>>offset*4)<<bit))
1675      if (*m_font_bits&((0x1000>>offset*4)<<bit))
17181676         retdata |= scfg << (bit*4);
17191677      else
17201678         retdata |= scbg << (bit*4);
r29441r29442
17291687
17301688void sega_segacd_device::device_start()
17311689{
1732   if (!m_gfxdecode->started())
1733      throw device_missing_dependencies();
1734
1735   segacd_gfx_conversion_timer = machine().device<timer_device>(":segacd:stamp_timer");
1736   segacd_irq3_timer = machine().device<timer_device>(":segacd:irq3_timer");
1737   scd_dma_timer = machine().device<timer_device>(":segacd:scd_dma_timer");
1738
17391690   address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
17401691
1741   segacd_font_bits = reinterpret_cast<UINT16 *>(memshare(":segacd:segacd_font")->ptr());
1742   segacd_backupram = reinterpret_cast<UINT16 *>(memshare(":segacd:backupram")->ptr());
1743   segacd_dataram = reinterpret_cast<UINT16 *>(memshare(":segacd:dataram")->ptr());
1744//  segacd_dataram2 = reinterpret_cast<UINT16 *>(memshare(":segacd:dataram2")->ptr());
1745   segacd_4meg_prgram = reinterpret_cast<UINT16 *>(memshare(":segacd:segacd_program")->ptr());
1692   m_backupram.resize(0x2000);
1693   subdevice<nvram_device>("backupram")->set_base(m_backupram, 0x2000);
17461694
17471695   segacd_4meg_prgbank = 0;
17481696
1749
17501697   space.unmap_readwrite        (0x020000,0x3fffff);
17511698
1752
17531699   space.install_read_handler (0x0020000, 0x003ffff, read16_delegate(FUNC(sega_segacd_device::scd_4m_prgbank_ram_r),this) );
17541700   space.install_write_handler (0x0020000, 0x003ffff, write16_delegate(FUNC(sega_segacd_device::scd_4m_prgbank_ram_w),this) );
17551701
r29441r29442
17751721
17761722   space.install_read_handler (0x0000070, 0x0000073, read16_delegate(FUNC(sega_segacd_device::scd_hint_vector_r),this) );
17771723
1778   /* create the char set (gfx will then be updated dynamically from RAM) */
1779   for (int i = 0; i < 16; i++)
1780      m_gfxdecode->gfx(i)->set_source((UINT8 *)segacd_dataram);
1724   segacd_stampmap[0] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(sega_segacd_device::get_stampmap_16x16_1x1_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 16, 16);
1725   segacd_stampmap[1] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(sega_segacd_device::get_stampmap_32x32_1x1_tile_info),this), TILEMAP_SCAN_ROWS, 32, 32, 8, 8);
1726   segacd_stampmap[2] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(sega_segacd_device::get_stampmap_16x16_16x16_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 256, 256); // 128kb!
1727   segacd_stampmap[3] = &machine().tilemap().create(*this, tilemap_get_info_delegate(FUNC(sega_segacd_device::get_stampmap_32x32_16x16_tile_info),this), TILEMAP_SCAN_ROWS, 32, 32, 128, 128); // 32kb!
17811728
1782   segacd_stampmap[0] = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(sega_segacd_device::get_stampmap_16x16_1x1_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 16, 16);
1783   segacd_stampmap[1] = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(sega_segacd_device::get_stampmap_32x32_1x1_tile_info),this), TILEMAP_SCAN_ROWS, 32, 32, 8, 8);
1784   segacd_stampmap[2] = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(sega_segacd_device::get_stampmap_16x16_16x16_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 256, 256); // 128kb!
1785   segacd_stampmap[3] = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(sega_segacd_device::get_stampmap_32x32_16x16_tile_info),this), TILEMAP_SCAN_ROWS, 32, 32, 128, 128); // 32kb!
1786
17871729   // todo register save state stuff
17881730}
17891731
r29441r29442
18091751   scd_rammode = 0;
18101752   scd_mode_dmna_ret_flags = 0x5421;
18111753
1812   lc89510_temp = machine().device<lc89510_temp_device>(":segacd:tempcdc");
1813   lc89510_temp->reset_cd();
1754   m_lc89510_temp->reset_cd();
18141755   m_dmaaddr = 0;
1815   scd_dma_timer->adjust(attotime::zero);
1756   m_dma_timer->adjust(attotime::zero);
18161757
1817   stopwatch_timer = machine().device<timer_device>(":segacd:sw_timer");
1818
18191758   m_total_scanlines = 262;
18201759
18211760   // HACK!!!! timegal, anettfut, roadaven end up with the SubCPU waiting in a loop for *something*
r29441r29442
18481787   segacd_redled = 0;
18491788   segacd_greenled = 0;
18501789   segacd_ready = 1; // actually set 100ms after startup?
1851   segacd_irq3_timer_reg = 0;
1790   m_irq3_timer_reg = 0;
18521791
1853   segacd_gfx_conversion_timer->adjust(attotime::never);
1854   segacd_irq3_timer->adjust(attotime::never);
1792   m_stamp_timer->adjust(attotime::never);
1793   m_irq3_timer->adjust(attotime::never);
18551794
18561795}
18571796
18581797
18591798// todo: tidy up
1860TIMER_DEVICE_CALLBACK_MEMBER( sega_segacd_device::scd_dma_timer_callback )
1799TIMER_DEVICE_CALLBACK_MEMBER( sega_segacd_device::dma_timer_callback )
18611800{
18621801   // todo: accurate timing of this!
18631802
18641803   #define RATE 256
1865   lc89510_temp->CDC_Do_DMA(machine(), RATE);
1804   m_lc89510_temp->CDC_Do_DMA(machine(), RATE);
18661805
18671806   // timed reset of flags
18681807   scd_mode_dmna_ret_flags |= 0x0021;
18691808
1870   scd_dma_timer->adjust(attotime::from_hz(m_framerate) / m_total_scanlines);
1809   m_dma_timer->adjust(attotime::from_hz(m_framerate) / m_total_scanlines);
18711810
18721811}
18731812
r29441r29442
18751814void sega_segacd_device::SegaCD_CDC_Do_DMA(int &dmacount, UINT8 *CDC_BUFFER, UINT16 &dma_addrc, UINT16 &destination )
18761815{
18771816   int length = dmacount;
1878   UINT8 *dest;
1817   UINT16 *dest;
18791818   int srcoffset = 0;
18801819   int dstoffset = 0;
18811820   address_space& space = m_scdcpu->space(AS_PROGRAM);
r29441r29442
18991838
19001839      if (destination==DMA_PRG)
19011840      {
1902         dest = (UINT8 *) segacd_4meg_prgram;
1841         dest = m_prgram;
19031842      }
19041843      else if (destination==DMA_WRAM)
19051844      {
1906         dest = (UINT8*)segacd_dataram;
1845         dest = m_dataram;
19071846      }
19081847      else if (destination==DMA_PCM)
19091848      {
r29441r29442
19161855
19171856      if (PCM_DMA)
19181857      {
1919         space.write_byte(0xff2000+(((dstoffset*2)+1)&0x1fff),data >> 8);
1920         space.write_byte(0xff2000+(((dstoffset*2)+3)&0x1fff),data & 0xff);
1858         m_rfsnd->rf5c68_mem_w(space, dstoffset & 0xfff, data >> 8);
1859         m_rfsnd->rf5c68_mem_w(space, (dstoffset+1) & 0xfff, data);
19211860      //  printf("PCM_DMA writing %04x %04x\n",0xff2000+(dstoffset*2), data);
19221861      }
19231862      else
r29441r29442
19301869               {
19311870                  dstoffset &= 0x3ffff;
19321871
1933                  dest[dstoffset+1] = data >>8;
1934                  dest[dstoffset+0] = data&0xff;
1872                  dest[dstoffset/2] = data;
19351873
1936                  segacd_mark_tiles_dirty(space.machine(), dstoffset/2);
1874                  segacd_mark_tiles_dirty(dstoffset/2);
19371875               }
19381876               else
19391877               {
r29441r29442
19531891            else
19541892            {
19551893               // main ram
1956               dest[dstoffset+1] = data >>8;
1957               dest[dstoffset+0] = data&0xff;
1894               dest[dstoffset/2] = data;
19581895            }
19591896
19601897         }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team