Previous 15994 Revisions Next

r9366 Tuesday 12th October, 2010 at 22:21:50 UTC by Angelo Salese
[Mega CD]: more works with the video buffers [David Haywood]
[src/mame/drivers]megadriv.c

src/mame/drivers/megadriv.c
r9365r9366
327327#define SH2_CINT_IRQ_LEVEL 8
328328#define SH2_PINT_IRQ_LEVEL 6
329329
330// Fifa96 needs the CPUs swapped for the gameplay to enter due to some race conditions
331// when using the DRC core.  Needs further investigation, the non-DRC core works either
332// way
333#define _32X_SWAP_MASTER_SLAVE_HACK
330334
331335static UINT16* _32x_dram0;
332336static UINT16* _32x_dram1;
r9365r9366
336340/* SegaCD! */
337341static cpu_device *_segacd_68k_cpu;
338342static emu_timer *segacd_gfx_conversion_timer;
343static int segacd_wordram_mapped = 0;
339344
340345/* SVP (virtua racing) */
341346static cpu_device *_svp_cpu;
r9365r9366
864869      {
865870         source -= 2; // the SVP introduces some kind of DMA 'lag', which we have to compensate for, this is obvious even on gfx DMAd from ROM (the Speedometer)
866871      }
872     
873      // likewise segaCD, at least when reading wordram?
874      // we might need to check what mode we're in here..
875      if (segacd_wordram_mapped)
876      {
877         source -= 2;
878      }
867879
868880      return space68k->read_word(source);
869881   }
r9365r9366
38363848static UINT16* segacd_4meg_prgram;  // pointer to SubCPU PrgRAM
38373849static UINT16 segacd_hint_register;
38383850static UINT16 segacd_imagebuffer_vdot_size;
3851static UINT16 segacd_imagebuffer_vcell_size;
3852static UINT16 segacd_imagebuffer_hdot_size;
38393853
38403854static UINT16 a12000_halt_reset_reg = 0x0000;
38413855int segacd_conversion_active = 0;
r9365r9366
39183932
39193933static WRITE16_HANDLER( scd_a12002_memory_mode_w )
39203934{
3921   printf("scd_a12002_memory_mode_w %04x %04x\n", data, mem_mask);
3935   //printf("scd_a12002_memory_mode_w %04x %04x\n", data, mem_mask);
39223936
39233937   if (ACCESSING_BITS_0_7)
39243938   {
39253939
3926      if (data&0x0001) printf("ret bit set (invalid? can't set from main68k?)\n");
3940      //if (data&0x0001) printf("ret bit set (invalid? can't set from main68k?)\n");
39273941      if (data&0x0002)
39283942      {
3929         printf("dmn set (swap requested)\n"); // give ram to sub?
3943         //printf("dmn set (swap requested)\n"); // give ram to sub?
39303944
39313945         // this should take some time?
39323946         segacd_maincpu_has_ram_access = 0;
39333947      }
39343948
39353949
3936      if (data&0x0004) printf("mode set (invalid? can't set from main68k?)\n");
3937      if (data&0x0038) printf("unknown bits set\n");
3950      //if (data&0x0004) printf("mode set (invalid? can't set from main68k?)\n");
3951      //if (data&0x0038) printf("unknown bits set\n");
39383952
39393953      //if (data&0x00c0)
39403954      {
3941         printf("bank set to %02x\n", (data&0x00c0)>>6);
3955         //printf("bank set to %02x\n", (data&0x00c0)>>6);
39423956         segacd_4meg_prgbank = (data&0x00c0)>>6;
39433957
39443958      }
r9365r9366
39703984
39713985static WRITE16_HANDLER( segacd_sub_memory_mode_w )
39723986{
3973   printf("segacd_sub_memory_mode_w %04x %04x\n", data, mem_mask);
3987   //printf("segacd_sub_memory_mode_w %04x %04x\n", data, mem_mask);
39743988
39753989   if (ACCESSING_BITS_0_7)
39763990   {
39773991      if (data&0x0001)
39783992      {
3979         printf("ret bit set\n");
3993         //printf("ret bit set\n");
39803994         segacd_maincpu_has_ram_access = 1;
39813995      }
39823996
39833997
3984      if (data&0x0002) printf("dmn set (swap requested) (invalid, can't be set from sub68k?\n");
3998      //if (data&0x0002) printf("dmn set (swap requested) (invalid, can't be set from sub68k?\n");
39853999
39864000      //if (data&0x0004)
39874001      {
39884002         segacd_ram_mode = (data&0x0004)>>2;
3989         printf("mode set %d\n", segacd_ram_mode);
4003         //printf("mode set %d\n", segacd_ram_mode);
39904004      }
39914005
39924006      //if (data&0x0018)
39934007      {
39944008
39954009         segacd_memory_priority_mode = (data&0x0018)>>3;
3996         printf("priority mode bits set to %d\n", segacd_memory_priority_mode);
4010         //printf("priority mode bits set to %d\n", segacd_memory_priority_mode);
39974011
39984012      }
39994013
4000      if (data&0x00e0) printf("unknown bits set\n");
4014      //if (data&0x00e0) printf("unknown bits set\n");
40014015   }
40024016
40034017   if (ACCESSING_BITS_8_15)
r9365r9366
46294643   memory_install_read_bank(space, 0x0020000, 0x003ffff, 0, 0, "scd_4m_prgbank");
46304644   memory_set_bankptr(space->machine,  "scd_4m_prgbank", segacd_4meg_prgram + segacd_4meg_prgbank * 0x20000 );
46314645   memory_install_write16_handler (space, 0x0020000, 0x003ffff, 0, 0, scd_4m_prgbank_ram_w );
4646   segacd_wordram_mapped = 1;
4647   
46324648
46334649   memory_install_readwrite16_handler(cputag_get_address_space(space->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x200000, 0x23ffff, 0, 0, segacd_main_dataram_part1_r, segacd_main_dataram_part1_w); // RAM shared with sub
46344650
r9365r9366
50965112      segacd_mark_stampmaps_dirty();
50975113
50985114      segacd_conversion_active = 1;
5099      timer_adjust_oneshot(segacd_gfx_conversion_timer, ATTOTIME_IN_HZ(1), 0);
5115     
5116      // todo: proper time calculation
5117      timer_adjust_oneshot(segacd_gfx_conversion_timer, ATTOTIME_IN_HZ(1000), 0);
51005118
51015119
51025120      int i;
r9365r9366
51245142         x = BITMAP_ADDR16(srcbitmap,10,10);
51255143         UINT16 datax;
51265144         datax = x[0];
5127
5128         for (int i=0;i<0x100;i++)
5145         
5146         // I don't quite understand what happens if the lower bits of hdotsize are set.. do we end up rounding up?
5147         // this 'buffersize' clearly fills the frame for the SegaCD logo screen at least
5148         int buffersize = ((segacd_imagebuffer_vcell_size+1) * (segacd_imagebuffer_hdot_size>>3)*0x20)/2;  // 0x20 = 8x8x4 tile, /2 due to word offset
5149         //buffersize -= 8;
5150         
5151         for (int i=0;i< buffersize ;i++)
51295152         {
51305153            int offsetx = ((segacd_imagebuffer_start_address&0xfff8)*2)+i;
51315154
r9365r9366
51995222   printf("segacd_imagebuffer_offset_w %04x\n", segacd_imagebuffer_offset);
52005223}
52015224
5225static READ16_HANDLER( segacd_imagebuffer_vcell_size_r )
5226{
5227   return segacd_imagebuffer_vcell_size;
5228}   
52025229
5230static WRITE16_HANDLER( segacd_imagebuffer_vcell_size_w )
5231{
5232   COMBINE_DATA(&segacd_imagebuffer_vcell_size);
5233}
5234
5235
5236static READ16_HANDLER( segacd_imagebuffer_hdot_size_r )
5237{
5238   return segacd_imagebuffer_hdot_size;
5239}   
5240
5241static WRITE16_HANDLER( segacd_imagebuffer_hdot_size_w )
5242{
5243   COMBINE_DATA(&segacd_imagebuffer_hdot_size);
5244}
5245
5246
5247
52035248static ADDRESS_MAP_START( segacd_map, ADDRESS_SPACE_PROGRAM, 16 )
52045249   AM_RANGE(0x000000, 0x07ffff) AM_RAM AM_BASE(&segacd_4meg_prgram)
52055250
r9365r9366
52315276//   AM_RANGE(0xff8050, 0xff8057) // Font data (read only)
52325277   AM_RANGE(0xff8058, 0xff8059) AM_READWRITE(segacd_stampsize_r, segacd_stampsize_w) // Stamp size
52335278   AM_RANGE(0xff805a, 0xff805b) AM_READWRITE(segacd_stampmap_base_address_r, segacd_stampmap_base_address_w) // Stamp map base address
5234//   AM_RANGE(0xff805c, 0xff805d) // Image buffer V cell size
5279   AM_RANGE(0xff805c, 0xff805d) AM_READWRITE(segacd_imagebuffer_vcell_size_r, segacd_imagebuffer_vcell_size_w)// Image buffer V cell size
52355280   AM_RANGE(0xff805e, 0xff805f) AM_READWRITE(segacd_imagebuffer_start_address_r, segacd_imagebuffer_start_address_w) // Image buffer start address
52365281   AM_RANGE(0xff8060, 0xff8061) AM_READWRITE(segacd_imagebuffer_offset_r, segacd_imagebuffer_offset_w)
5237//   AM_RANGE(0xff8062, 0xff8063) // Image buffer H dot size
5282   AM_RANGE(0xff8062, 0xff8063) AM_READWRITE(segacd_imagebuffer_hdot_size_r, segacd_imagebuffer_hdot_size_w) // Image buffer H dot size
52385283   AM_RANGE(0xff8064, 0xff8065) AM_READWRITE(segacd_imagebuffer_vdot_size_r, segacd_imagebuffer_vdot_size_w ) // Image buffer V dot size
52395284   AM_RANGE(0xff8066, 0xff8067) AM_WRITE(segacd_trace_vector_base_address_w)// Trace vector base address
52405285//   AM_RANGE(0xff8068, 0xff8069) // Subcode address
r9365r9366
80748119
80758120MACHINE_CONFIG_DERIVED( genesis_32x, megadriv )
80768121
8122#ifndef _32X_SWAP_MASTER_SLAVE_HACK
80778123   MDRV_CPU_ADD("32x_master_sh2", SH2, (MASTER_CLOCK_NTSC*3)/7 )
80788124   MDRV_CPU_PROGRAM_MAP(sh2_main_map)
80798125   MDRV_CPU_CONFIG(sh2_conf_master)
8126#endif
80808127
80818128   MDRV_CPU_ADD("32x_slave_sh2", SH2, (MASTER_CLOCK_NTSC*3)/7 )
80828129   MDRV_CPU_PROGRAM_MAP(sh2_slave_map)
80838130   MDRV_CPU_CONFIG(sh2_conf_slave)
80848131
8132#ifdef _32X_SWAP_MASTER_SLAVE_HACK
8133   MDRV_CPU_ADD("32x_master_sh2", SH2, (MASTER_CLOCK_NTSC*3)/7 )
8134   MDRV_CPU_PROGRAM_MAP(sh2_main_map)
8135   MDRV_CPU_CONFIG(sh2_conf_master)
8136#endif
8137
80858138   // brutal needs at least 30000 or the backgrounds don't animate properly / lock up, and the game
80868139   // freezes.  Some stage seem to need as high as 80000 ?   this *KILLS* performance
80878140   //
r9365r9366
81148167
81158168MACHINE_CONFIG_DERIVED( genesis_32x_pal, megadpal )
81168169
8170#ifndef _32X_SWAP_MASTER_SLAVE_HACK
81178171   MDRV_CPU_ADD("32x_master_sh2", SH2, (MASTER_CLOCK_PAL*3)/7 )
81188172   MDRV_CPU_PROGRAM_MAP(sh2_main_map)
81198173   MDRV_CPU_CONFIG(sh2_conf_master)
8174#endif
81208175
81218176   MDRV_CPU_ADD("32x_slave_sh2", SH2, (MASTER_CLOCK_PAL*3)/7 )
81228177   MDRV_CPU_PROGRAM_MAP(sh2_slave_map)
81238178   MDRV_CPU_CONFIG(sh2_conf_slave)
81248179
8180#ifdef _32X_SWAP_MASTER_SLAVE_HACK
8181   MDRV_CPU_ADD("32x_master_sh2", SH2, (MASTER_CLOCK_PAL*3)/7 )
8182   MDRV_CPU_PROGRAM_MAP(sh2_main_map)
8183   MDRV_CPU_CONFIG(sh2_conf_master)
8184#endif
8185
81258186   // brutal needs at least 30000 or the backgrounds don't animate properly / lock up, and the game
81268187   // freezes.  Some stage seem to need as high as 80000 ?   this *KILLS* performance
81278188   //
r9365r9366
82448305   }
82458306
82468307   sega_cd_connected = 0;
8308   segacd_wordram_mapped = 0;
82478309   _segacd_68k_cpu = machine->device<cpu_device>("segacd_68k");
82488310   if (_segacd_68k_cpu != NULL)
82498311   {

Previous 15994 Revisions Next


© 1998-2018 The MESS Team