Previous 199869 Revisions Next

r22016 Friday 22nd March, 2013 at 06:18:38 UTC by Fabio Priuli
(MESS) megadriv.c: temporarily duplicated some DMA code while working towards
a reduction of global variables. nw.
[src/mame/includes]megadriv.h
[src/mame/machine]megacd.c megadriv.c megavdp.c megavdp.h
[src/mess/drivers]megadriv.c
[src/mess/includes]md.h
[src/mess/machine]md_slot.h

trunk/src/mame/machine/megacd.c
r22015r22016
44#include "sound/rf5c68.h"
55
66
7
8// the main MD emulation needs to know the state of these because it appears in the MD regs / affect DMA operations
9int sega_cd_connected = 0x00;
10
11
127// not in the state because the IRQ_CALLBACK needs it, and that can't be a member function?
138UINT16 a12000_halt_reset_reg = 0x0000;
149
r22015r22016
15681563void sega_segacd_device::device_start()
15691564{
15701565   _segacd_68k_cpu = machine().device<cpu_device>(":segacd:segacd_68k");
1571   sega_cd_connected = 1;
15721566
15731567   segacd_gfx_conversion_timer = machine().device<timer_device>(":segacd:stamp_timer");
15741568   segacd_irq3_timer = machine().device<timer_device>(":segacd:irq3_timer");
trunk/src/mame/machine/megadriv.c
r22015r22016
3333int genesis_other_hacks = 0; // misc hacks
3434
3535timer_device* megadriv_scanline_timer;
36cpu_device *_svp_cpu;
3736
3837struct genesis_z80_vars
3938{
r22015r22016
380379
381380READ16_HANDLER( megadriv_68k_io_read )
382381{
382   md_base_state *state = space.machine().driver_data<md_base_state>();
383383   UINT8 retdata;
384384
385385   retdata = 0;
r22015r22016
401401         logerror("%06x read version register\n", space.device().safe_pc());
402402         retdata = megadrive_region_export<<7 | // Export
403403                  megadrive_region_pal<<6 | // NTSC
404                  (sega_cd_connected?0x00:0x20) | // 0x20 = no sega cd
404                  (state->m_segacd ? 0x00 : 0x20) | // 0x20 = no sega cd
405405                  0x00 | // Unused (Always 0)
406406                  0x00 | // Bit 3 of Version Number
407407                  0x00 | // Bit 2 of Version Number
r22015r22016
12011201   return 0; // writeback not allowed
12021202}
12031203
1204// 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)
1205// likewise segaCD, at least when reading wordram? we might need to check what mode we're in here..
1206UINT16 vdp_get_word_from_68k_mem_delayed(running_machine &machine, UINT32 source, address_space & space68k)
1207{
1208   if (source <= 0x3fffff)
1209   {
1210      source -= 2;   // compensate DMA lag
1211      return space68k.read_word(source);
1212   }
1213   else if ((source >= 0xe00000) && (source <= 0xffffff))
1214      return space68k.read_word(source);
1215   else
1216   {
1217      printf("DMA Read unmapped %06x\n",source);
1218      return machine.rand();
1219   }
1220}
1221
12041222void md_base_state::megadriv_init_common()
12051223{
12061224   /* Look to see if this system has the standard Sound Z80 */
r22015r22016
12271245      printf("32x SLAVE SH2 cpu found '%s'\n", _32x_slave_cpu->tag() );
12281246   }
12291247
1230   _svp_cpu = machine().device<cpu_device>("svp");
1231   if (_svp_cpu != NULL)
1232   {
1233      printf("SVP (cpu) found '%s'\n", _svp_cpu->tag());
1234   }
1235
12361248   machine().device("maincpu")->execute().set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(md_base_state::genesis_int_callback),this));
12371249   megadriv_backupram = NULL;
12381250   megadriv_backupram_length = 0;
12391251
12401252   vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_default;
12411253
1254   if (machine().device("svp"))
1255   {
1256      printf("SVP (cpu) found '%s'\n", machine().device("svp")->tag());
1257      vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_delayed;
1258   }
1259   if (machine().device("segacd"))
1260   {
1261      printf("SegaCD found '%s'\n", machine().device("segacd")->tag());
1262      vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_delayed;
1263   }   
1264
12421265   m68k_set_tas_callback(machine().device("maincpu"), megadriv_tas_callback);
12431266
12441267   // the drivers which need 6 buttons pad set this to 1 in their init befare calling the megadrive init
trunk/src/mame/machine/megavdp.c
r22015r22016
99
1010#include "sound/sn76496.h"
1111
12extern cpu_device *_svp_cpu;
13extern int sega_cd_connected;
1412extern timer_device* megadriv_scanline_timer;
1513
1614
17
18
1915#define MAX_HPOSITION 480
2016
2117
r22015r22016
470466
471467UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space& space68k);
472468
469// if either SVP CPU or segaCD is present, there is a lag we have to compensate for
470// hence, variants of this call will be defined in megadriv_init_common for segacd and svp
473471UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space & space68k)
474472{
475473   // should we limit the valid areas here?
r22015r22016
478476
479477   //printf("vdp_get_word_from_68k_mem_default %08x\n", source);
480478
481   if ( source <= 0x3fffff )
482   {
483      if (_svp_cpu != NULL)
484      {
485         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)
486      }
487
488      // likewise segaCD, at least when reading wordram?
489      // we might need to check what mode we're in here..
490      if (sega_cd_connected)
491      {
492         source -= 2;
493      }
494
479   if (source <= 0x3fffff)
495480      return space68k.read_word(source);
496   }
497   else if (( source >= 0xe00000 ) && ( source <= 0xffffff ))
498   {
481   else if ((source >= 0xe00000) && (source <= 0xffffff))
499482      return space68k.read_word(source);
500   }
501483   else
502484   {
503485      printf("DMA Read unmapped %06x\n",source);
504486      return machine.rand();
505487   }
506
507
508488}
509489
510490/*  Table from Charles Macdonald
trunk/src/mame/machine/megavdp.h
r22015r22016
154154extern int genvdp_use_cram;
155155
156156
157UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space & space68k);
158
159
157160class sega_genesis_vdp_device : public sega315_5124_device
158161{
159162public:
trunk/src/mame/includes/megadriv.h
r22015r22016
2525
2626#define MD_CPU_REGION_SIZE 0x800000
2727
28extern int sega_cd_connected;
2928
30
3129/*----------- defined in machine/megadriv.c -----------*/
3230
3331INPUT_PORTS_EXTERN( md_common );
r22015r22016
4139MACHINE_CONFIG_EXTERN( md_pal );
4240MACHINE_CONFIG_EXTERN( md_bootleg );    // for topshoot.c & hshavoc.c
4341
44extern cpu_device *_svp_cpu;
45
4642extern UINT8 megatech_bios_port_cc_dc_r(running_machine &machine, int offset, int ctrl);
4743extern void megadriv_stop_scanline_timer(running_machine &machine);
4844
r22015r22016
8581   md_base_state(const machine_config &mconfig, device_type type, const char *tag)
8682   : driver_device(mconfig, type, tag),
8783      m_vdp(*this,"gen_vdp"),
84      m_segacd(*this,"segacd"),
8885      m_megadrive_ram(*this,"megadrive_ram")
89   {
90      sega_cd_connected = 0;
91   }
86   { }
9287   required_device<sega_genesis_vdp_device> m_vdp;
88   optional_device<sega_segacd_device> m_segacd;
9389   optional_shared_ptr<UINT16> m_megadrive_ram;
9490
9591   DECLARE_DRIVER_INIT(megadriv_c2);
trunk/src/mess/includes/md.h
r22015r22016
5858ADDRESS_MAP_EXTERN( svp_ssp_map, driver_device );
5959ADDRESS_MAP_EXTERN( svp_ext_map, driver_device );
6060extern void svp_init(running_machine &machine);
61extern cpu_device *_svp_cpu;
6261
63
6462#endif
trunk/src/mess/drivers/megadriv.c
r22015r22016
271271 *
272272 *************************************/
273273
274
275UINT16 vdp_get_word_from_68k_mem_console(running_machine &machine, UINT32 source, address_space & space68k)
276{
277   md_cons_state *state = machine.driver_data<md_cons_state>();
278   
279   if (source <= 0x3fffff)
280   {
281      if (state->m_slotcart->get_type() == SEGA_SVP)
282      {
283         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)
284      }
285      return space68k.read_word(source);
286   }
287   else if ((source >= 0xe00000) && (source <= 0xffffff))
288      return space68k.read_word(source);
289   else
290   {
291      printf("DMA Read unmapped %06x\n",source);
292      return machine.rand();
293   }
294}
295
274296static MACHINE_START( ms_megadriv )
275297{
276298   md_cons_state *state = machine.driver_data<md_cons_state>();
277299
278300   mess_init_6buttons_pad(machine);
279
301   
280302   // small hack, until SVP is converted to be a slot device
281303   if (machine.device<cpu_device>("svp") != NULL)
282304      svp_init(machine);
283305   else
284   {
306   {     
307      vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_console;
285308      machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)state->m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)state->m_slotcart));
286309      machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)state->m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)state->m_slotcart));
287310      machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)state->m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)state->m_slotcart));
trunk/src/mess/machine/md_slot.h
r22015r22016
163163   // slot interface overrides
164164   virtual const char * get_default_card_software(const machine_config &config, emu_options &options);
165165
166   int get_type() { return m_type; }
167
166168   int load_list();
167169   int load_nonlist();
168170   int get_cart_type(UINT8 *ROM, UINT32 len);

Previous 199869 Revisions Next


© 1997-2024 The MAME Team