Previous 199869 Revisions Next

r17466 Saturday 25th August, 2012 at 12:55:22 UTC by Tafoid
Moved a bunch of other stuff into the device state involving 32x.  There should be no real functional changes at this point.  From Haze (nw)
[src/mame/includes]megadriv.h
[src/mame/machine]mega32x.c mega32x.h megadriv.c megavdp.c megavdp.h

trunk/src/mame/machine/mega32x.c
r17465r17466
201201
202202
203203/* the main Megadrive emulation needs to know this */
204int _32x_is_connected;
205204cpu_device *_32x_master_cpu;
206205cpu_device *_32x_slave_cpu;
207206
208/* our current main rendering code needs to know this for mixing in */
209int _32x_displaymode;
210int _32x_videopriority;
207/* need to make fifo callback part of device */
208static UINT16 fifo_block_a[4];
209static UINT16 fifo_block_b[4];
210static UINT16* current_fifo_block;
211static UINT16* current_fifo_readblock;
212int current_fifo_write_pos;
213int current_fifo_read_pos;
214int fifo_block_a_full;
215int fifo_block_b_full;
211216
212/* our main vblank handler resets this */
213int _32x_hcount_compare_val;
214217
215218
216static int sh2_are_running;
217static int _32x_adapter_enabled;
218static int _32x_access_auth;
219static int _32x_screenshift;
220
221static int _32x_240mode;
222
223static UINT16 _32x_68k_a15104_reg;
224
225
226static int sh2_master_vint_enable, sh2_slave_vint_enable;
227static int sh2_master_hint_enable, sh2_slave_hint_enable;
228static int sh2_master_cmdint_enable, sh2_slave_cmdint_enable;
229static int sh2_master_pwmint_enable, sh2_slave_pwmint_enable;
230static int sh2_hint_in_vbl;
231
232static int sh2_master_vint_pending;
233static int sh2_slave_vint_pending;
234static int _32x_fb_swap;
235static int _32x_hcount_reg;
236
237void _32x_check_irqs(running_machine& machine);
238
239#define SH2_VRES_IRQ_LEVEL 14
240#define SH2_VINT_IRQ_LEVEL 12
241#define SH2_HINT_IRQ_LEVEL 10
242#define SH2_CINT_IRQ_LEVEL 8
243#define SH2_PINT_IRQ_LEVEL 6
244
245
246static UINT16* _32x_dram0;
247static UINT16* _32x_dram1;
248static UINT16 *_32x_display_dram, *_32x_access_dram;
249static UINT16* _32x_palette;
250static UINT16* _32x_palette_lookup;
251
252
253
254
255219const device_type SEGA_32X_NTSC = &device_creator<sega_32x_ntsc_device>;
256220const device_type SEGA_32X_PAL = &device_creator<sega_32x_pal_device>;
257221
r17465r17466
277241
278242TIMER_CALLBACK( _32x_pwm_callback );
279243
280/****************************************** 32X related ******************************************/
281244
282/**********************************************************************************************/
283// Function Prototypes
284/**********************************************************************************************/
285245
286
287
288static UINT16 _32x_autofill_length;
289static UINT16 _32x_autofill_address;
290static UINT16 _32x_autofill_data;
291
292
293
294
295
296
297246READ16_MEMBER( sega_32x_device::_32x_68k_palette_r )
298247{
299   return _32x_palette[offset];
248   return m_32x_palette[offset];
300249}
301250
302251WRITE16_MEMBER( sega_32x_device::_32x_68k_palette_w )
303252{
304253   int r,g,b, p;
305254
306   COMBINE_DATA(&_32x_palette[offset]);
307   data = _32x_palette[offset];
255   COMBINE_DATA(&m_32x_palette[offset]);
256   data = m_32x_palette[offset];
308257
309258   r = ((data >> 0)  & 0x1f);
310259   g = ((data >> 5)  & 0x1f);
311260   b = ((data >> 10) & 0x1f);
312261   p = ((data >> 15) & 0x01); // priority 'through' bit
313262
314   _32x_palette_lookup[offset] = (r << 10) | (g << 5) | (b << 0) | (p << 15);
263   m_32x_palette_lookup[offset] = (r << 10) | (g << 5) | (b << 0) | (p << 15);
315264
316265   palette_set_color_rgb(space.machine(),offset+0x40,pal5bit(r),pal5bit(g),pal5bit(b));
317266
r17465r17466
319268
320269READ16_MEMBER( sega_32x_device::_32x_68k_dram_r )
321270{
322   return _32x_access_dram[offset];
271   return m_32x_access_dram[offset];
323272}
324273
325274WRITE16_MEMBER( sega_32x_device::_32x_68k_dram_w )
r17465r17466
327276   if ((mem_mask&0xffff) == 0xffff)
328277   {
329278      // 16-bit accesses are normal
330      COMBINE_DATA(&_32x_access_dram[offset]);
279      COMBINE_DATA(&m_32x_access_dram[offset]);
331280   }
332281   else
333282   {
r17465r17466
339288      {
340289         if ((data & 0xff00) != 0x0000)
341290         {
342            _32x_access_dram[offset] = (data & 0xff00) |  (_32x_access_dram[offset] & 0x00ff);
291            m_32x_access_dram[offset] = (data & 0xff00) |  (m_32x_access_dram[offset] & 0x00ff);
343292         }
344293      }
345294      else if ((mem_mask & 0xffff) == 0x00ff)
346295      {
347296         if ((data & 0x00ff) != 0x0000)
348297         {
349            _32x_access_dram[offset] = (data & 0x00ff) |  (_32x_access_dram[offset] & 0xff00);
298            m_32x_access_dram[offset] = (data & 0x00ff) |  (m_32x_access_dram[offset] & 0xff00);
350299         }
351300      }
352301   }
r17465r17466
354303
355304READ16_MEMBER( sega_32x_device::_32x_68k_dram_overwrite_r )
356305{
357   return _32x_access_dram[offset];
306   return m_32x_access_dram[offset];
358307}
359308
360309WRITE16_MEMBER( sega_32x_device::_32x_68k_dram_overwrite_w )
361310{
362   //COMBINE_DATA(&_32x_access_dram[offset+0x10000]);
311   //COMBINE_DATA(&m_32x_access_dram[offset+0x10000]);
363312
364313   if (ACCESSING_BITS_8_15)
365314   {
366315      if (data & 0xff00)
367316      {
368         _32x_access_dram[offset] = (_32x_access_dram[offset]&0x00ff) | (data & 0xff00);
317         m_32x_access_dram[offset] = (m_32x_access_dram[offset]&0x00ff) | (data & 0xff00);
369318      }
370319   }
371320
r17465r17466
373322   {
374323      if (data & 0x00ff)
375324      {
376         _32x_access_dram[offset] = (_32x_access_dram[offset]&0xff00) | (data & 0x00ff);
325         m_32x_access_dram[offset] = (m_32x_access_dram[offset]&0xff00) | (data & 0x00ff);
377326      }
378327   }
379328}
r17465r17466
383332// FIFO
384333/**********************************************************************************************/
385334
386static UINT16 fifo_block_a[4];
387static UINT16 fifo_block_b[4];
388static UINT16* current_fifo_block;
389static UINT16* current_fifo_readblock;
390int current_fifo_write_pos;
391int current_fifo_read_pos;
392int fifo_block_a_full;
393int fifo_block_b_full;
394335
395336
396337
397
398338/*
399339
40034015106 DREQ
r17465r17466
408348
409349*/
410350
411static UINT16 a15106_reg;
412351
413352
353
414354READ16_MEMBER( sega_32x_device::_32x_68k_a15106_r )
415355{
416356   UINT16 retval;
417357
418   retval = a15106_reg;
358   retval = m_a15106_reg;
419359
420360   if (fifo_block_a_full && fifo_block_b_full) retval |= 0x8080;
421361
r17465r17466
426366{
427367   if (ACCESSING_BITS_0_7)
428368   {
429      a15106_reg = data & 0x7;
369      m_a15106_reg = data & 0x7;
430370
431        if (a15106_reg & 0x1) /* NBA Jam TE relies on this */
371        if (m_a15106_reg & 0x1) /* NBA Jam TE relies on this */
432372      {
433373
434374         // install the game rom in the normal 0x000000-0x03fffff space used by the genesis - this allows VDP DMA operations to work as they have to be from this area or RAM
r17465r17466
444384         space.install_rom(0x0000100, 0x03fffff, space.machine().root_device().memregion("maincpu")->base()+0x100);
445385      }
446386
447      if((a15106_reg & 4) == 0) // clears the FIFO state
387      if((m_a15106_reg & 4) == 0) // clears the FIFO state
448388      {
449389         current_fifo_block = fifo_block_a;
450390         current_fifo_readblock = fifo_block_b;
r17465r17466
456396
457397      //printf("_32x_68k_a15106_w %04x\n", data);
458398      /*
459        if (a15106_reg & 0x4)
399        if (m_a15106_reg & 0x4)
460400            printf(" --- 68k Write Mode enabled\n");
461401        else
462402            printf(" --- 68k Write Mode disabled\n");
463403
464        if (a15106_reg & 0x1)
404        if (m_a15106_reg & 0x1)
465405            printf(" --- DMA Start Allowed \n");
466406        else
467407            printf(" --- DMA Start No Operation\n");
r17465r17466
470410   }
471411}
472412
473static UINT16 dreq_src_addr[2],dreq_dst_addr[2],dreq_size;
474413
414
475415READ16_MEMBER( sega_32x_device::_32x_dreq_common_r )
476416{
477417   address_space* _68kspace = space.machine().device("maincpu")->memory().space(AS_PROGRAM);
r17465r17466
480420   {
481421      case 0x00/2: // a15108 / 4008
482422      case 0x02/2: // a1510a / 400a
483         return dreq_src_addr[offset&1];
423         return m_dreq_src_addr[offset&1];
484424
485425      case 0x04/2: // a1510c / 400c
486426      case 0x06/2: // a1510e / 400e
487         return dreq_dst_addr[offset&1];
427         return m_dreq_dst_addr[offset&1];
488428
489429      case 0x08/2: // a15110 / 4010
490         return dreq_size;
430         return m_dreq_size;
491431
492432      case 0x0a/2: // a15112 / 4012
493433         if (&space == _68kspace)
r17465r17466
557497            return;
558498         }
559499
560         dreq_src_addr[offset&1] = ((offset&1) == 0) ? (data & 0xff) : (data & 0xfffe);
500         m_dreq_src_addr[offset&1] = ((offset&1) == 0) ? (data & 0xff) : (data & 0xfffe);
561501
562         //if((dreq_src_addr[0]<<16)|dreq_src_addr[1])
563         //  printf("DREQ set SRC = %08x\n",(dreq_src_addr[0]<<16)|dreq_src_addr[1]);
502         //if((m_dreq_src_addr[0]<<16)|m_dreq_src_addr[1])
503         //  printf("DREQ set SRC = %08x\n",(m_dreq_src_addr[0]<<16)|m_dreq_src_addr[1]);
564504
565505         break;
566506
r17465r17466
572512            return;
573513         }
574514
575         dreq_dst_addr[offset&1] = ((offset&1) == 0) ? (data & 0xff) : (data & 0xffff);
515         m_dreq_dst_addr[offset&1] = ((offset&1) == 0) ? (data & 0xff) : (data & 0xffff);
576516
577         //if((dreq_dst_addr[0]<<16)|dreq_dst_addr[1])
578         //  printf("DREQ set DST = %08x\n",(dreq_dst_addr[0]<<16)|dreq_dst_addr[1]);
517         //if((m_dreq_dst_addr[0]<<16)|m_dreq_dst_addr[1])
518         //  printf("DREQ set DST = %08x\n",(m_dreq_dst_addr[0]<<16)|m_dreq_dst_addr[1]);
579519
580520         break;
581521
r17465r17466
586526            return;
587527         }
588528
589         dreq_size = data & 0xfffc;
529         m_dreq_size = data & 0xfffc;
590530
591         //  if(dreq_size)
592         //      printf("DREQ set SIZE = %04x\n",dreq_size);
531         //  if(m_dreq_size)
532         //      printf("DREQ set SIZE = %04x\n",m_dreq_size);
593533
594534         break;
595535
r17465r17466
612552            return;
613553         }
614554
615         if((a15106_reg & 4) == 0)
555         if((m_a15106_reg & 4) == 0)
616556         {
617557            printf("attempting to WRITE FIFO with 68S cleared!\n"); // corpse32
618558            return;
r17465r17466
660600}
661601
662602
663static UINT8 sega_tv;
664603
604
665605READ16_MEMBER( sega_32x_device::_32x_68k_a1511a_r )
666606{
667   return sega_tv;
607   return m_sega_tv;
668608}
669609
670610WRITE16_MEMBER( sega_32x_device::_32x_68k_a1511a_w )
671611{
672   sega_tv = data & 1;
612   m_sega_tv = data & 1;
673613
674614   printf("SEGA TV register set = %04x\n",data);
675615}
r17465r17466
678618000070 H interrupt vector can be overwritten apparently
679619*/
680620
681static UINT16 hint_vector[2];
682621
683READ16_MEMBER( sega_32x_device::_32x_68k_hint_vector_r )
622
623READ16_MEMBER( sega_32x_device::_32x_68k_m_hint_vector_r )
684624{
685   return hint_vector[offset];
625   return m_hint_vector[offset];
686626}
687627
688WRITE16_MEMBER( sega_32x_device::_32x_68k_hint_vector_w )
628WRITE16_MEMBER( sega_32x_device::_32x_68k_m_hint_vector_w )
689629{
690   hint_vector[offset] = data;
630   m_hint_vector[offset] = data;
691631}
692632
693633// returns MARS, the system ID of the 32x
r17465r17466
711651// control register - used to enable 32x etc.
712652/**********************************************************************************************/
713653
714static UINT16 a15100_reg;
715654
655
716656READ16_MEMBER( sega_32x_device::_32x_68k_a15100_r )
717657{
718   return (_32x_access_auth<<15) | 0x0080;
658   return (m_32x_access_auth<<15) | 0x0080;
719659}
720660
721661WRITE16_MEMBER( sega_32x_device::_32x_68k_a15100_w )
722662{
723663   if (ACCESSING_BITS_0_7)
724664   {
725      a15100_reg = (a15100_reg & 0xff00) | (data & 0x00ff);
665      m_a15100_reg = (m_a15100_reg & 0xff00) | (data & 0x00ff);
726666
727667      if (data & 0x02)
728668      {
r17465r17466
732672
733673      if (data & 0x01)
734674      {
735         _32x_adapter_enabled = 1;
675         m_32x_adapter_enabled = 1;
736676         space.install_rom(0x0880000, 0x08fffff, space.machine().root_device().memregion("gamecart")->base()); // 'fixed' 512kb rom bank
737677
738678         space.install_read_bank(0x0900000, 0x09fffff, "bank12"); // 'bankable' 1024kb rom bank
739         space.machine().root_device().membank("bank12")->set_base(space.machine().root_device().memregion("gamecart")->base()+((_32x_68k_a15104_reg&0x3)*0x100000) );
679         space.machine().root_device().membank("bank12")->set_base(space.machine().root_device().memregion("gamecart")->base()+((m_32x_68k_a15104_reg&0x3)*0x100000) );
740680
741681         space.install_rom(0x0000000, 0x03fffff, space.machine().root_device().memregion("32x_68k_bios")->base());
742682
r17465r17466
748688
749689
750690
751         space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0x000070, 0x000073, read16_delegate(FUNC(sega_32x_device::_32x_68k_hint_vector_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_hint_vector_w),this)); // h interrupt vector
691         space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0x000070, 0x000073, read16_delegate(FUNC(sega_32x_device::_32x_68k_m_hint_vector_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_m_hint_vector_w),this)); // h interrupt vector
752692      }
753693      else
754694      {
755         _32x_adapter_enabled = 0;
695         m_32x_adapter_enabled = 0;
756696
757697         space.install_rom(0x0000000, 0x03fffff, space.machine().root_device().memregion("gamecart")->base());
758         space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0x000070, 0x000073, read16_delegate(FUNC(sega_32x_device::_32x_68k_hint_vector_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_hint_vector_w),this)); // h interrupt vector
698         space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0x000070, 0x000073, read16_delegate(FUNC(sega_32x_device::_32x_68k_m_hint_vector_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_m_hint_vector_w),this)); // h interrupt vector
759699      }
760700   }
761701
762702   if (ACCESSING_BITS_8_15)
763703   {
764      a15100_reg = (a15100_reg & 0x00ff) | (data & 0xff00);
765      _32x_access_auth = (data & 0x8000)>>15;
704      m_a15100_reg = (m_a15100_reg & 0x00ff) | (data & 0xff00);
705      m_32x_access_auth = (data & 0x8000)>>15;
766706   }
767707}
768708
r17465r17466
771711// command interrupt to SH2
772712/**********************************************************************************************/
773713
774static int _32x_68k_a15102_reg;
775714
715
776716READ16_MEMBER( sega_32x_device::_32x_68k_a15102_r )
777717{
778718   //printf("_32x_68k_a15102_r\n");
779   return _32x_68k_a15102_reg;
719   return m_32x_68k_a15102_reg;
780720}
781721
782722WRITE16_MEMBER( sega_32x_device::_32x_68k_a15102_w )
783723{
784724   if (ACCESSING_BITS_0_7)
785725   {
786      _32x_68k_a15102_reg = data & 3;
726      m_32x_68k_a15102_reg = data & 3;
787727
788728      if (data&0x1)
789729      {
790         if (sh2_master_cmdint_enable) device_set_input_line(_32x_master_cpu,SH2_CINT_IRQ_LEVEL,ASSERT_LINE);
730         if (m_sh2_master_cmdint_enable) device_set_input_line(_32x_master_cpu,SH2_CINT_IRQ_LEVEL,ASSERT_LINE);
791731         else printf("master cmdint when masked!\n");
792732      }
793733
794734      if (data&0x2)
795735      {
796         if (sh2_slave_cmdint_enable) device_set_input_line(_32x_slave_cpu,SH2_CINT_IRQ_LEVEL,ASSERT_LINE);
736         if (m_sh2_slave_cmdint_enable) device_set_input_line(_32x_slave_cpu,SH2_CINT_IRQ_LEVEL,ASSERT_LINE);
797737         else printf("slave cmdint when masked!\n");
798738      }
799739   }
r17465r17466
807747
808748READ16_MEMBER( sega_32x_device::_32x_68k_a15104_r )
809749{
810   return _32x_68k_a15104_reg;
750   return m_32x_68k_a15104_reg;
811751}
812752
813753WRITE16_MEMBER( sega_32x_device::_32x_68k_a15104_w )
814754{
815755   if (ACCESSING_BITS_0_7)
816756   {
817      _32x_68k_a15104_reg = (_32x_68k_a15104_reg & 0xff00) | (data & 0x00ff);
757      m_32x_68k_a15104_reg = (m_32x_68k_a15104_reg & 0xff00) | (data & 0x00ff);
818758   }
819759
820760   if (ACCESSING_BITS_8_15)
821761   {
822      _32x_68k_a15104_reg = (_32x_68k_a15104_reg & 0x00ff) | (data & 0xff00);
762      m_32x_68k_a15104_reg = (m_32x_68k_a15104_reg & 0x00ff) | (data & 0xff00);
823763   }
824764
825   space.machine().root_device().membank("bank12")->set_base(space.machine().root_device().memregion("gamecart")->base()+((_32x_68k_a15104_reg&0x3)*0x100000) );
765   space.machine().root_device().membank("bank12")->set_base(space.machine().root_device().memregion("gamecart")->base()+((m_32x_68k_a15104_reg&0x3)*0x100000) );
826766}
827767
828768/**********************************************************************************************/
r17465r17466
830770// Communication Port 0
831771// access from the SH2 via 4020 - 402f
832772/**********************************************************************************************/
833#define _32X_COMMS_PORT_SYNC 0
834static UINT16 commsram[8];
835773
774
836775/**********************************************************************************************/
837776
838777// reads
839READ16_MEMBER( sega_32x_device::_32x_68k_commsram_r )
778READ16_MEMBER( sega_32x_device::_32x_68k_m_commsram_r )
840779{
841780   if (_32X_COMMS_PORT_SYNC) space.machine().scheduler().synchronize();
842   return commsram[offset];
781   return m_commsram[offset];
843782}
844783
845784// writes
846WRITE16_MEMBER( sega_32x_device::_32x_68k_commsram_w )
785WRITE16_MEMBER( sega_32x_device::_32x_68k_m_commsram_w )
847786{
848   COMBINE_DATA(&commsram[offset]);
787   COMBINE_DATA(&m_commsram[offset]);
849788   if (_32X_COMMS_PORT_SYNC) space.machine().scheduler().synchronize();
850789}
851790
r17465r17466
861800- Understand if Speaker OFF makes the FIFO to advance or not
862801*/
863802
864#define PWM_FIFO_SIZE pwm_tm_reg // guess, Marsch calls this register as FIFO width
865#define PWM_CLOCK megadrive_region_pal ? ((MASTER_CLOCK_PAL*3) / 7) : ((MASTER_CLOCK_NTSC*3) / 7)
866803
867static UINT16 pwm_ctrl,pwm_cycle,pwm_tm_reg;
868static UINT16 cur_lch[0x10],cur_rch[0x10];
869static UINT16 pwm_cycle_reg; //used for latching
870static UINT8 pwm_timer_tick;
871static UINT8 lch_index_r,rch_index_r,lch_index_w,rch_index_w;
872static UINT16 lch_fifo_state,rch_fifo_state;
873804
874805
875
876static void calculate_pwm_timer(running_machine &machine)
806void sega_32x_device::calculate_pwm_timer(running_machine &machine)
877807{
878   sega_32x_device* _32xdev = (sega_32x_device*)machine.device(":sega32x");
808   if(m_pwm_tm_reg == 0) { m_pwm_tm_reg = 16; } // zero gives max range
809   if(m_pwm_cycle == 0) { m_pwm_cycle = 4095; } // zero gives max range
879810
880
881   if(pwm_tm_reg == 0) { pwm_tm_reg = 16; } // zero gives max range
882   if(pwm_cycle == 0) { pwm_cycle = 4095; } // zero gives max range
883
884811   /* if both RMD and LMD are set to OFF or pwm cycle register is one, then PWM timer ticks doesn't occur */
885   if(pwm_cycle == 1 || ((pwm_ctrl & 0xf) == 0))
886      _32xdev->m_32x_pwm_timer->adjust(attotime::never);
812   if(m_pwm_cycle == 1 || ((m_pwm_ctrl & 0xf) == 0))
813      m_32x_pwm_timer->adjust(attotime::never);
887814   else
888815   {
889      pwm_timer_tick = 0;
890      lch_fifo_state = rch_fifo_state = 0x4000;
891      lch_index_r = rch_index_r = 0;
892      lch_index_w = rch_index_w = 0;
893      _32xdev->m_32x_pwm_timer->adjust(attotime::from_hz((PWM_CLOCK) / (pwm_cycle - 1)));
816      m_pwm_timer_tick = 0;
817      m_lch_fifo_state = m_rch_fifo_state = 0x4000;
818      m_lch_index_r = m_rch_index_r = 0;
819      m_lch_index_w = m_rch_index_w = 0;
820      m_32x_pwm_timer->adjust(attotime::from_hz((PWM_CLOCK) / (m_pwm_cycle - 1)));
894821   }
895822}
896823
897TIMER_CALLBACK( _32x_pwm_callback )
898{
899   sega_32x_device* _32xdev = (sega_32x_device*)ptr;
900824
901
902   if(lch_index_r < PWM_FIFO_SIZE)
825void sega_32x_device::handle_pwm_callback(void)
826{
827   if(m_lch_index_r < PWM_FIFO_SIZE)
903828   {
904      switch(pwm_ctrl & 3)
829      switch(m_pwm_ctrl & 3)
905830      {
906         case 0: lch_index_r++; /*Speaker OFF*/ break;
907         case 1: _32xdev->m_lch_pwm->write_signed16(cur_lch[lch_index_r++]); break;
908         case 2: _32xdev->m_rch_pwm->write_signed16(cur_lch[lch_index_r++]); break;
831         case 0: m_lch_index_r++; /*Speaker OFF*/ break;
832         case 1: m_lch_pwm->write_signed16(m_cur_lch[m_lch_index_r++]); break;
833         case 2: m_rch_pwm->write_signed16(m_cur_lch[m_lch_index_r++]); break;
909834         case 3: popmessage("Undefined PWM Lch value 3, contact MESSdev"); break;
910835      }
911836
912      lch_index_w = 0;
837      m_lch_index_w = 0;
913838   }
914839
915   lch_fifo_state = (lch_index_r == PWM_FIFO_SIZE) ? 0x4000 : 0x0000;
840   m_lch_fifo_state = (m_lch_index_r == PWM_FIFO_SIZE) ? 0x4000 : 0x0000;
916841
917   if(rch_index_r < PWM_FIFO_SIZE)
842   if(m_rch_index_r < PWM_FIFO_SIZE)
918843   {
919      switch((pwm_ctrl & 0xc) >> 2)
844      switch((m_pwm_ctrl & 0xc) >> 2)
920845      {
921         case 0: rch_index_r++; /*Speaker OFF*/ break;
922         case 1: _32xdev->m_rch_pwm->write_signed16(cur_rch[rch_index_r++]); break;
923         case 2: _32xdev->m_lch_pwm->write_signed16(cur_rch[rch_index_r++]); break;
846         case 0: m_rch_index_r++; /*Speaker OFF*/ break;
847         case 1: m_rch_pwm->write_signed16(m_cur_rch[m_rch_index_r++]); break;
848         case 2: m_lch_pwm->write_signed16(m_cur_rch[m_rch_index_r++]); break;
924849         case 3: popmessage("Undefined PWM Rch value 3, contact MESSdev"); break;
925850      }
926851
927      rch_index_w = 0;
852      m_rch_index_w = 0;
928853   }
929854
930   rch_fifo_state = (rch_index_r == PWM_FIFO_SIZE) ? 0x4000 : 0x0000;
855   m_rch_fifo_state = (m_rch_index_r == PWM_FIFO_SIZE) ? 0x4000 : 0x0000;
931856
932   pwm_timer_tick++;
857   m_pwm_timer_tick++;
933858
934   if(pwm_timer_tick == pwm_tm_reg)
859   if(m_pwm_timer_tick == m_pwm_tm_reg)
935860   {
936      pwm_timer_tick = 0;
861      m_pwm_timer_tick = 0;
937862      if(sh2_master_pwmint_enable) { device_set_input_line(_32x_master_cpu, SH2_PINT_IRQ_LEVEL,ASSERT_LINE); }
938863      if(sh2_slave_pwmint_enable) { device_set_input_line(_32x_slave_cpu, SH2_PINT_IRQ_LEVEL,ASSERT_LINE); }
939864   }
940865
941   _32xdev->m_32x_pwm_timer->adjust(attotime::from_hz((PWM_CLOCK) / (pwm_cycle - 1)));
866   m_32x_pwm_timer->adjust(attotime::from_hz((PWM_CLOCK) / (m_pwm_cycle - 1)));
942867}
943868
869TIMER_CALLBACK( _32x_pwm_callback )
870{
871   sega_32x_device* _32xdev = (sega_32x_device*)ptr;
872   _32xdev->handle_pwm_callback();
873}
874
944875READ16_MEMBER( sega_32x_device::_32x_pwm_r )
945876{
946877   switch(offset)
947878   {
948      case 0x00/2: return pwm_ctrl; //control register
949      case 0x02/2: return pwm_cycle_reg; // cycle register
950      case 0x04/2: return lch_fifo_state; // l ch
951      case 0x06/2: return rch_fifo_state; // r ch
952      case 0x08/2: return lch_fifo_state & rch_fifo_state; // mono ch
879      case 0x00/2: return m_pwm_ctrl; //control register
880      case 0x02/2: return m_pwm_cycle_reg; // cycle register
881      case 0x04/2: return m_lch_fifo_state; // l ch
882      case 0x06/2: return m_rch_fifo_state; // r ch
883      case 0x08/2: return m_lch_fifo_state & m_rch_fifo_state; // mono ch
953884   }
954885
955886   printf("Read at undefined PWM register %02x\n",offset);
r17465r17466
962893   switch(offset)
963894   {
964895      case 0x00/2:
965         pwm_ctrl = data & 0xffff;
966         pwm_tm_reg = (pwm_ctrl & 0xf00) >> 8;
896         m_pwm_ctrl = data & 0xffff;
897         m_pwm_tm_reg = (m_pwm_ctrl & 0xf00) >> 8;
967898         calculate_pwm_timer(space.machine());
968899         break;
969900      case 0x02/2:
970         pwm_cycle = pwm_cycle_reg = data & 0xfff;
901         m_pwm_cycle = m_pwm_cycle_reg = data & 0xfff;
971902         calculate_pwm_timer(space.machine());
972903         break;
973904      case 0x04/2:
974         if(lch_index_w < PWM_FIFO_SIZE)
905         if(m_lch_index_w < PWM_FIFO_SIZE)
975906         {
976            cur_lch[lch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
977            lch_index_r = 0;
907            m_cur_lch[m_lch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
908            m_lch_index_r = 0;
978909         }
979910
980         lch_fifo_state = (lch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
911         m_lch_fifo_state = (m_lch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
981912         break;
982913      case 0x06/2:
983         if(rch_index_w < PWM_FIFO_SIZE)
914         if(m_rch_index_w < PWM_FIFO_SIZE)
984915         {
985            cur_rch[rch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
986            rch_index_r = 0;
916            m_cur_rch[m_rch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
917            m_rch_index_r = 0;
987918         }
988919
989         rch_fifo_state = (rch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
920         m_rch_fifo_state = (m_rch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
990921
991922         break;
992923      case 0x08/2:
993         if(lch_index_w < PWM_FIFO_SIZE)
924         if(m_lch_index_w < PWM_FIFO_SIZE)
994925         {
995            cur_lch[lch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
996            lch_index_r = 0;
926            m_cur_lch[m_lch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
927            m_lch_index_r = 0;
997928         }
998929
999         if(rch_index_w < PWM_FIFO_SIZE)
930         if(m_rch_index_w < PWM_FIFO_SIZE)
1000931         {
1001            cur_rch[rch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
1002            rch_index_r = 0;
932            m_cur_rch[m_rch_index_w++] = ((data & 0xfff) << 4) | (data & 0xf);
933            m_rch_index_r = 0;
1003934         }
1004935
1005         lch_fifo_state = (lch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
1006         rch_fifo_state = (rch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
936         m_lch_fifo_state = (m_lch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
937         m_rch_fifo_state = (m_rch_index_w == PWM_FIFO_SIZE) ? 0x8000 : 0x0000;
1007938
1008939         break;
1009940      default:
r17465r17466
1015946WRITE16_MEMBER( sega_32x_device::_32x_68k_pwm_w )
1016947{
1017948   if(offset == 0/2)
1018      _32x_pwm_w(space,offset,(data & 0x7f) | (pwm_ctrl & 0xff80),mem_mask);
949      _32x_pwm_w(space,offset,(data & 0x7f) | (m_pwm_ctrl & 0xff80),mem_mask);
1019950   else
1020951      _32x_pwm_w(space,offset,data,mem_mask);
1021952}
r17465r17466
1026957// also accessed from the SH2 @ 4100
1027958/**********************************************************************************************/
1028959
1029static UINT16 _32x_a1518a_reg;
1030#define MAX_HPOSITION 480
1031
1032static UINT16 get_hposition(void)
960UINT16 sega_32x_device::get_hposition(void)
1033961{
1034962   attotime time_elapsed_since_megadriv_scanline_timer;
1035963   UINT16 value4;
r17465r17466
1067995      else ntsc = 1;
1068996
1069997      return (ntsc << 15) |
1070            (_32x_videopriority << 7 ) |
1071            ( _32x_240mode << 6 ) |
1072            ( _32x_displaymode << 0 );
998            (m_32x_videopriority << 7 ) |
999            ( m_32x_240mode << 6 ) |
1000            ( m_32x_displaymode << 0 );
10731001
10741002
10751003
10761004      case 0x02/2:
1077         return _32x_screenshift;
1005         return m_32x_screenshift;
10781006
10791007      case 0x04/2:
1080         return _32x_autofill_length;
1008         return m_32x_autofill_length;
10811009
10821010      case 0x06/2:
1083         return _32x_autofill_address;
1011         return m_32x_autofill_address;
10841012
10851013      case 0x08/2:
1086         return _32x_autofill_data;
1014         return m_32x_autofill_data;
10871015
10881016      case 0x0a/2:
1089         UINT16 retdata = _32x_a1518a_reg;
1017         UINT16 retdata = m_32x_a1518a_reg;
10901018         UINT16 hpos = get_hposition();
10911019         int megadrive_hblank_flag = 0;
10921020
r17465r17466
11081036}
11091037
11101038
1111void _32x_check_framebuffer_swap(void)
1039void sega_32x_device::_32x_check_framebuffer_swap(void)
11121040{
1113
1114   if(_32x_is_connected)
1041   // this logic should be correct, but makes things worse?
1042   //if (genesis_scanline_counter >= megadrive_irq6_scanline)
11151043   {
1044      m_32x_a1518a_reg = m_32x_fb_swap & 1;
11161045
1117      // this logic should be correct, but makes things worse?
1118      //if (genesis_scanline_counter >= megadrive_irq6_scanline)
1119      {
1120         _32x_a1518a_reg = _32x_fb_swap & 1;
11211046
11221047
1123
1124         if (_32x_fb_swap & 1)
1125         {
1126            _32x_access_dram = _32x_dram0;
1127            _32x_display_dram = _32x_dram1;
1128         }
1129         else
1130         {
1131            _32x_display_dram = _32x_dram0;
1132            _32x_access_dram = _32x_dram1;
1133         }
1048      if (m_32x_fb_swap & 1)
1049      {
1050         m_32x_access_dram = m_32x_dram0;
1051         m_32x_display_dram = m_32x_dram1;
11341052      }
1053      else
1054      {
1055         m_32x_display_dram = m_32x_dram0;
1056         m_32x_access_dram = m_32x_dram1;
1057      }
11351058   }
11361059}
11371060
r17465r17466
11441067
11451068   if (&space!= _68kspace)
11461069   {
1147      if (_32x_access_auth!=1)
1070      if (m_32x_access_auth!=1)
11481071         return;
11491072   }
11501073
11511074   if (&space== _68kspace)
11521075   {
1153      if (_32x_access_auth!=0)
1076      if (m_32x_access_auth!=0)
11541077         return;
11551078   }
11561079
r17465r17466
11591082   {
11601083
11611084      case 0x00:
1162         //printf("_32x_68k_a15180_w (a15180) %04x %04x   source _32x_access_auth %04x\n",data,mem_mask, _32x_access_auth);
1085         //printf("_32x_68k_a15180_w (a15180) %04x %04x   source m_32x_access_auth %04x\n",data,mem_mask, m_32x_access_auth);
11631086
11641087         if (ACCESSING_BITS_0_7)
11651088         {
1166            _32x_videopriority = (data & 0x80) >> 7;
1167            _32x_240mode   = (data & 0x40) >> 6;
1168            _32x_displaymode   = (data & 0x03) >> 0;
1089            m_32x_videopriority = (data & 0x80) >> 7;
1090            m_32x_240mode   = (data & 0x40) >> 6;
1091            m_32x_displaymode   = (data & 0x03) >> 0;
11691092         }
11701093         break;
11711094
11721095      case 0x02/2:
11731096         if (ACCESSING_BITS_0_7)
11741097         {
1175            _32x_screenshift = data & 1; // allows 1 pixel shifting
1098            m_32x_screenshift = data & 1; // allows 1 pixel shifting
11761099         }
11771100         if (ACCESSING_BITS_8_15)
11781101         {
r17465r17466
11831106      case 0x04/2:
11841107         if (ACCESSING_BITS_0_7)
11851108         {
1186            _32x_autofill_length = data & 0xff;
1109            m_32x_autofill_length = data & 0xff;
11871110         }
11881111
11891112         if (ACCESSING_BITS_8_15)
r17465r17466
11951118      case 0x06/2:
11961119         if (ACCESSING_BITS_0_7)
11971120         {
1198            _32x_autofill_address = (_32x_autofill_address & 0xff00) | (data & 0x00ff);
1121            m_32x_autofill_address = (m_32x_autofill_address & 0xff00) | (data & 0x00ff);
11991122         }
12001123
12011124         if (ACCESSING_BITS_8_15)
12021125         {
1203            _32x_autofill_address = (_32x_autofill_address & 0x00ff) | (data & 0xff00);
1126            m_32x_autofill_address = (m_32x_autofill_address & 0x00ff) | (data & 0xff00);
12041127         }
12051128         break;
12061129
12071130      case 0x08/2:
12081131         if (ACCESSING_BITS_0_7)
12091132         {
1210            _32x_autofill_data = (_32x_autofill_data & 0xff00) | (data & 0x00ff);
1133            m_32x_autofill_data = (m_32x_autofill_data & 0xff00) | (data & 0x00ff);
12111134         }
12121135
12131136         if (ACCESSING_BITS_8_15)
12141137         {
1215            _32x_autofill_data = (_32x_autofill_data & 0x00ff) | (data & 0xff00);
1138            m_32x_autofill_data = (m_32x_autofill_data & 0x00ff) | (data & 0xff00);
12161139         }
12171140
12181141         // do the fill - shouldn't be instant..
12191142         {
12201143            int i;
1221            for (i=0; i<_32x_autofill_length+1;i++)
1144            for (i=0; i<m_32x_autofill_length+1;i++)
12221145            {
1223               _32x_access_dram[_32x_autofill_address] = _32x_autofill_data;
1224               _32x_autofill_address = (_32x_autofill_address & 0xff00) | ((_32x_autofill_address+1) & 0x00ff);
1146               m_32x_access_dram[m_32x_autofill_address] = m_32x_autofill_data;
1147               m_32x_autofill_address = (m_32x_autofill_address & 0xff00) | ((m_32x_autofill_address+1) & 0x00ff);
12251148            }
12261149         }
12271150         break;
12281151
12291152      case 0x0a/2:
12301153         // bit 0 is the framebuffer select, change is delayed until vblank;
1231      //  _32x_a1518a_reg = (_32x_a1518a_reg & 0xfffe);
1154      //  m_32x_a1518a_reg = (m_32x_a1518a_reg & 0xfffe);
12321155         if (ACCESSING_BITS_0_7)
12331156         {
1234            _32x_fb_swap = data & 1;
1157            m_32x_fb_swap = data & 1;
12351158
12361159            _32x_check_framebuffer_swap();
12371160         }
r17465r17466
12711194READ16_MEMBER( sega_32x_device::_32x_sh2_master_4000_r )
12721195{
12731196   UINT16 retvalue = 0x0200;
1274   retvalue |= _32x_access_auth << 15;
1197   retvalue |= m_32x_access_auth << 15;
12751198
1276   retvalue |=   sh2_hint_in_vbl;
1277   retvalue |= sh2_master_vint_enable;
1278   retvalue |= sh2_master_hint_enable;
1279   retvalue |= sh2_master_cmdint_enable;
1199   retvalue |=   m_sh2_hint_in_vbl;
1200   retvalue |= m_sh2_master_vint_enable;
1201   retvalue |= m_sh2_master_hint_enable;
1202   retvalue |= m_sh2_master_cmdint_enable;
12801203   retvalue |= sh2_master_pwmint_enable;
12811204
12821205   return retvalue;
r17465r17466
12861209{
12871210   if (ACCESSING_BITS_8_15)
12881211   {
1289      _32x_access_auth = (data &0x8000) >> 15;
1212      m_32x_access_auth = (data &0x8000) >> 15;
12901213   }
12911214
12921215   if (ACCESSING_BITS_0_7)
12931216   {
1294      sh2_hint_in_vbl = data & 0x80;
1295      sh2_master_vint_enable = data & 0x8;
1296      sh2_master_hint_enable = data & 0x4;
1297      sh2_master_cmdint_enable = data & 0x2;
1217      m_sh2_hint_in_vbl = data & 0x80;
1218      m_sh2_master_vint_enable = data & 0x8;
1219      m_sh2_master_hint_enable = data & 0x4;
1220      m_sh2_master_cmdint_enable = data & 0x2;
12981221      sh2_master_pwmint_enable = data & 0x1;
12991222
1300      //if (sh2_master_hint_enable) printf("sh2_master_hint_enable enable!\n");
1223      //if (m_sh2_master_hint_enable) printf("m_sh2_master_hint_enable enable!\n");
13011224      //if (sh2_master_pwmint_enable) printf("sh2_master_pwn_enable enable!\n");
13021225
13031226      _32x_check_irqs(space.machine());
r17465r17466
13091232READ16_MEMBER( sega_32x_device::_32x_sh2_slave_4000_r )
13101233{
13111234   UINT16 retvalue = 0x0200;
1312   retvalue |= _32x_access_auth << 15;
1313   retvalue |=   sh2_hint_in_vbl;
1314   retvalue |= sh2_slave_vint_enable;
1315   retvalue |= sh2_slave_hint_enable;
1316   retvalue |= sh2_slave_cmdint_enable;
1235   retvalue |= m_32x_access_auth << 15;
1236   retvalue |=   m_sh2_hint_in_vbl;
1237   retvalue |= m_sh2_slave_vint_enable;
1238   retvalue |= m_sh2_slave_hint_enable;
1239   retvalue |= m_sh2_slave_cmdint_enable;
13171240   retvalue |= sh2_slave_pwmint_enable;
13181241
13191242   return retvalue;
r17465r17466
13241247{
13251248   if (ACCESSING_BITS_8_15)
13261249   {
1327      _32x_access_auth = (data &0x8000) >> 15;
1250      m_32x_access_auth = (data &0x8000) >> 15;
13281251   }
13291252
13301253   if (ACCESSING_BITS_0_7)
13311254   {
1332      sh2_hint_in_vbl = data & 0x80;
1333      sh2_slave_vint_enable = data & 0x8;
1334      sh2_slave_hint_enable = data & 0x4;
1335      sh2_slave_cmdint_enable = data & 0x2;
1255      m_sh2_hint_in_vbl = data & 0x80;
1256      m_sh2_slave_vint_enable = data & 0x8;
1257      m_sh2_slave_hint_enable = data & 0x4;
1258      m_sh2_slave_cmdint_enable = data & 0x2;
13361259      sh2_slave_pwmint_enable = data & 0x1;
13371260
1338      //if (sh2_slave_hint_enable) printf("sh2_slave_hint_enable enable!\n");
1261      //if (m_sh2_slave_hint_enable) printf("m_sh2_slave_hint_enable enable!\n");
13391262      //if (sh2_slave_pwmint_enable) printf("sh2_slave_pwm_enable enable!\n");
13401263
13411264      _32x_check_irqs(space.machine());
r17465r17466
13681291/**********************************************************************************************/
13691292READ16_MEMBER( sega_32x_device::_32x_sh2_common_4004_r )
13701293{
1371   return _32x_hcount_reg;
1294   return m_32x_hcount_reg;
13721295}
13731296
13741297WRITE16_MEMBER( sega_32x_device::_32x_sh2_common_4004_w )
13751298{
1376   _32x_hcount_reg = data & 0xff;
1299   m_32x_hcount_reg = data & 0xff;
13771300}
13781301
13791302
r17465r17466
14071330// VINT (vertical interrupt) clear
14081331/**********************************************************************************************/
14091332
1410WRITE16_MEMBER( sega_32x_device::_32x_sh2_master_4016_w ){ sh2_master_vint_pending = 0; _32x_check_irqs(space.machine()); }
1411WRITE16_MEMBER( sega_32x_device::_32x_sh2_slave_4016_w ) { sh2_slave_vint_pending = 0; _32x_check_irqs(space.machine()); }
1333WRITE16_MEMBER( sega_32x_device::_32x_sh2_master_4016_w ){ m_sh2_master_vint_pending = 0; _32x_check_irqs(space.machine()); }
1334WRITE16_MEMBER( sega_32x_device::_32x_sh2_slave_4016_w ) { m_sh2_slave_vint_pending = 0; _32x_check_irqs(space.machine()); }
14121335
14131336/**********************************************************************************************/
14141337// SH2 side 4018
r17465r17466
14241347// Note: flag cleared here is a guess, according to After Burner behaviour
14251348/**********************************************************************************************/
14261349
1427WRITE16_MEMBER( sega_32x_device::_32x_sh2_master_401a_w ){ _32x_68k_a15102_reg &= ~1; device_set_input_line(_32x_master_cpu,SH2_CINT_IRQ_LEVEL,CLEAR_LINE);}
1428WRITE16_MEMBER( sega_32x_device::_32x_sh2_slave_401a_w ) { _32x_68k_a15102_reg &= ~2; device_set_input_line(_32x_slave_cpu, SH2_CINT_IRQ_LEVEL,CLEAR_LINE);}
1350WRITE16_MEMBER( sega_32x_device::_32x_sh2_master_401a_w ){ m_32x_68k_a15102_reg &= ~1; device_set_input_line(_32x_master_cpu,SH2_CINT_IRQ_LEVEL,CLEAR_LINE);}
1351WRITE16_MEMBER( sega_32x_device::_32x_sh2_slave_401a_w ) { m_32x_68k_a15102_reg &= ~2; device_set_input_line(_32x_slave_cpu, SH2_CINT_IRQ_LEVEL,CLEAR_LINE);}
14291352
14301353/**********************************************************************************************/
14311354// SH2 side 401C
r17465r17466
15921515   AM_RANGE(0x00004018, 0x0000401b) AM_READNOP AM_WRITE(_32x_sh2_master_4018_master_401a_w ) // IRQ clear
15931516   AM_RANGE(0x0000401c, 0x0000401f) AM_READNOP AM_WRITE(_32x_sh2_master_401c_master_401e_w ) // IRQ clear
15941517
1595   AM_RANGE(0x00004020, 0x0000402f) AM_READWRITE16(_32x_68k_commsram_r, _32x_68k_commsram_w, 0xffffffff )
1518   AM_RANGE(0x00004020, 0x0000402f) AM_READWRITE16(_32x_68k_m_commsram_r, _32x_68k_m_commsram_w, 0xffffffff )
15961519   AM_RANGE(0x00004030, 0x0000403f) AM_READWRITE16(_32x_pwm_r, _32x_pwm_w, 0xffffffff )
15971520
15981521   AM_RANGE(0x00004100, 0x0000410b) AM_READWRITE16(_32x_common_vdp_regs_r, _32x_common_vdp_regs_w , 0xffffffff)
r17465r17466
16211544   AM_RANGE(0x00004018, 0x0000401b) AM_READNOP AM_WRITE(_32x_sh2_slave_4018_slave_401a_w ) // IRQ clear
16221545   AM_RANGE(0x0000401c, 0x0000401f) AM_READNOP AM_WRITE(_32x_sh2_slave_401c_slave_401e_w ) // IRQ clear
16231546
1624   AM_RANGE(0x00004020, 0x0000402f) AM_READWRITE16(_32x_68k_commsram_r, _32x_68k_commsram_w, 0xffffffff )
1547   AM_RANGE(0x00004020, 0x0000402f) AM_READWRITE16(_32x_68k_m_commsram_r, _32x_68k_m_commsram_w, 0xffffffff )
16251548   AM_RANGE(0x00004030, 0x0000403f) AM_READWRITE16(_32x_pwm_r, _32x_pwm_w, 0xffffffff )
16261549
16271550   AM_RANGE(0x00004100, 0x0000410b) AM_READWRITE16(_32x_common_vdp_regs_r, _32x_common_vdp_regs_w , 0xffffffff)
r17465r17466
16431566
16441567
16451568
1646void _32x_check_irqs(running_machine& machine)
1569void sega_32x_device::_32x_check_irqs(running_machine& machine)
16471570{
16481571
1649   if (sh2_master_vint_enable && sh2_master_vint_pending) device_set_input_line(_32x_master_cpu,SH2_VINT_IRQ_LEVEL,ASSERT_LINE);
1572   if (m_sh2_master_vint_enable && m_sh2_master_vint_pending) device_set_input_line(_32x_master_cpu,SH2_VINT_IRQ_LEVEL,ASSERT_LINE);
16501573   else device_set_input_line(_32x_master_cpu,SH2_VINT_IRQ_LEVEL,CLEAR_LINE);
16511574
1652   if (sh2_slave_vint_enable && sh2_slave_vint_pending) device_set_input_line(_32x_slave_cpu,SH2_VINT_IRQ_LEVEL,ASSERT_LINE);
1575   if (m_sh2_slave_vint_enable && m_sh2_slave_vint_pending) device_set_input_line(_32x_slave_cpu,SH2_VINT_IRQ_LEVEL,ASSERT_LINE);
16531576   else device_set_input_line(_32x_slave_cpu,SH2_VINT_IRQ_LEVEL,CLEAR_LINE);
16541577}
16551578
1656void _32x_scanline_cb0(running_machine& machine)
1579void sega_32x_device::_32x_scanline_cb0(running_machine& machine)
16571580{
1658   sh2_master_vint_pending = 1;
1659   sh2_slave_vint_pending = 1;
1581   m_sh2_master_vint_pending = 1;
1582   m_sh2_slave_vint_pending = 1;
16601583   _32x_check_irqs(machine);
16611584}
16621585
16631586
1664void _32x_scanline_cb1()
1587void sega_32x_device::_32x_scanline_cb1()
16651588{
1666   _32x_hcount_compare_val++;
1589   m_32x_hcount_compare_val++;
16671590
1668   if(_32x_hcount_compare_val >= _32x_hcount_reg)
1591   if(m_32x_hcount_compare_val >= m_32x_hcount_reg)
16691592   {
1670      _32x_hcount_compare_val = -1;
1593      m_32x_hcount_compare_val = -1;
16711594
1672      if(genesis_scanline_counter < 224 || sh2_hint_in_vbl)
1595      if(genesis_scanline_counter < 224 || m_sh2_hint_in_vbl)
16731596      {
1674         if(sh2_master_hint_enable) { device_set_input_line(_32x_master_cpu,SH2_HINT_IRQ_LEVEL,ASSERT_LINE); }
1675         if(sh2_slave_hint_enable) { device_set_input_line(_32x_slave_cpu,SH2_HINT_IRQ_LEVEL,ASSERT_LINE); }
1597         if(m_sh2_master_hint_enable) { device_set_input_line(_32x_master_cpu,SH2_HINT_IRQ_LEVEL,ASSERT_LINE); }
1598         if(m_sh2_slave_hint_enable) { device_set_input_line(_32x_slave_cpu,SH2_HINT_IRQ_LEVEL,ASSERT_LINE); }
16761599      }
16771600   }
16781601}
r17465r17466
16961619}
16971620
16981621
1699static UINT32 _32x_linerender[320+258]; // tmp buffer (bigger than it needs to be to simplify RLE decode)
17001622
1701UINT32* _32x_render_videobuffer_to_screenbuffer_helper(running_machine &machine, int scanline)
1623UINT32* sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(running_machine &machine, int scanline)
17021624{
17031625   int x;
17041626
17051627   /* render 32x output to a buffer */
1706   if (_32x_is_connected && (_32x_displaymode != 0))
1628   if (m_32x_displaymode != 0)
17071629   {
1708      if (_32x_displaymode==1)
1630      if (m_32x_displaymode==1)
17091631      {
17101632
17111633         UINT32 lineoffs;
17121634         int start;
17131635
1714         lineoffs = _32x_display_dram[scanline];
1636         lineoffs = m_32x_display_dram[scanline];
17151637
1716         if (_32x_screenshift == 0) start=0;
1638         if (m_32x_screenshift == 0) start=0;
17171639         else start = -1;
17181640
17191641         for (x=start;x<320;x++)
17201642         {
17211643            UINT16 coldata;
1722            coldata = _32x_display_dram[lineoffs];
1644            coldata = m_32x_display_dram[lineoffs];
17231645
17241646            {
17251647               if (x>=0)
17261648               {
1727                  _32x_linerender[x] = _32x_palette_lookup[(coldata & 0xff00)>>8];
1649                  m_32x_linerender[x] = m_32x_palette_lookup[(coldata & 0xff00)>>8];
17281650               }
17291651
17301652               x++;
17311653
17321654               if (x>=0)
17331655               {
1734                  _32x_linerender[x] = _32x_palette_lookup[(coldata & 0x00ff)];
1656                  m_32x_linerender[x] = m_32x_palette_lookup[(coldata & 0x00ff)];
17351657               }
17361658            }
17371659
r17465r17466
17391661
17401662         }
17411663      }
1742      else if (_32x_displaymode==3) // mode 3 = RLE  (used by BRUTAL intro)
1664      else if (m_32x_displaymode==3) // mode 3 = RLE  (used by BRUTAL intro)
17431665      {
17441666         UINT32 lineoffs;
17451667         int start;
17461668
1747         lineoffs = _32x_display_dram[scanline];
1669         lineoffs = m_32x_display_dram[scanline];
17481670
1749         if (_32x_screenshift == 0) start=0;
1671         if (m_32x_screenshift == 0) start=0;
17501672         else start = -1;
17511673
17521674            x = start;
17531675         while (x<320)
17541676         {
17551677            UINT16 coldata, length, l;
1756            coldata = _32x_display_dram[lineoffs];
1678            coldata = m_32x_display_dram[lineoffs];
17571679            length = ((coldata & 0xff00)>>8)+1;
17581680            coldata = (coldata & 0x00ff)>>0;
17591681            for (l=0;l<length;l++)
17601682            {
17611683               if (x>=0)
17621684               {
1763                  _32x_linerender[x] = _32x_palette_lookup[(coldata)];
1685                  m_32x_linerender[x] = m_32x_palette_lookup[(coldata)];
17641686               }
17651687               x++;
17661688            }
r17465r17466
17741696         UINT32 lineoffs;
17751697         int start;
17761698
1777         lineoffs = _32x_display_dram[scanline];
1699         lineoffs = m_32x_display_dram[scanline];
17781700
1779         if (_32x_screenshift == 0) start=0;
1701         if (m_32x_screenshift == 0) start=0;
17801702         else start = -1;
17811703
17821704            x = start;
17831705         while (x<320)
17841706         {
17851707            UINT16 coldata;
1786            coldata = _32x_display_dram[lineoffs&0xffff];
1708            coldata = m_32x_display_dram[lineoffs&0xffff];
17871709
17881710            // need to swap red and blue around for MAME
17891711            {
r17465r17466
17971719            }
17981720
17991721            if (x>=0)
1800               _32x_linerender[x] = coldata;
1722               m_32x_linerender[x] = coldata;
18011723
18021724            x++;
18031725            lineoffs++;
r17465r17466
18051727      }
18061728   }
18071729
1808   return _32x_linerender;
1730   return m_32x_linerender;
18091731}
18101732
18111733static const sh2_cpu_core sh2_conf_master = { 0, NULL, _32x_fifo_available_callback };
r17465r17466
19111833   m_32x_pwm_timer = machine().scheduler().timer_alloc(FUNC(_32x_pwm_callback), (void*)this);
19121834   m_32x_pwm_timer->adjust(attotime::never);
19131835
1914   _32x_dram0 = auto_alloc_array(machine(), UINT16, 0x40000/2);
1915   _32x_dram1 = auto_alloc_array(machine(), UINT16, 0x40000/2);
1836   m_32x_dram0 = auto_alloc_array(machine(), UINT16, 0x40000/2);
1837   m_32x_dram1 = auto_alloc_array(machine(), UINT16, 0x40000/2);
19161838
1917   memset(_32x_dram0, 0x00, 0x40000);
1918   memset(_32x_dram1, 0x00, 0x40000);
1839   memset(m_32x_dram0, 0x00, 0x40000);
1840   memset(m_32x_dram1, 0x00, 0x40000);
19191841
1920   _32x_palette_lookup = auto_alloc_array(machine(), UINT16, 0x200/2);
1921   _32x_palette = auto_alloc_array(machine(), UINT16, 0x200/2);
1842   m_32x_palette_lookup = auto_alloc_array(machine(), UINT16, 0x200/2);
1843   m_32x_palette = auto_alloc_array(machine(), UINT16, 0x200/2);
19221844
1923   memset(_32x_palette_lookup, 0x00, 0x200);
1924   memset(_32x_palette, 0x00, 0x200);
1845   memset(m_32x_palette_lookup, 0x00, 0x200);
1846   memset(m_32x_palette, 0x00, 0x200);
19251847
1926   _32x_display_dram = _32x_dram0;
1927   _32x_access_dram = _32x_dram1;
1848   m_32x_display_dram = m_32x_dram0;
1849   m_32x_access_dram = m_32x_dram1;
19281850}
19291851
19301852void sega_32x_device::device_reset()
19311853{
19321854   /* Interrupts are masked / disabled at first */
1933   sh2_master_vint_enable = sh2_slave_vint_enable = 0;
1934   sh2_master_hint_enable = sh2_slave_hint_enable = 0;
1935   sh2_master_cmdint_enable = sh2_slave_cmdint_enable = 0;
1855   m_sh2_master_vint_enable = m_sh2_slave_vint_enable = 0;
1856   m_sh2_master_hint_enable = m_sh2_slave_hint_enable = 0;
1857   m_sh2_master_cmdint_enable = m_sh2_slave_cmdint_enable = 0;
19361858   sh2_master_pwmint_enable = sh2_slave_pwmint_enable = 0;
1937   sh2_master_vint_pending = sh2_slave_vint_pending = 0;
1859   m_sh2_master_vint_pending = m_sh2_slave_vint_pending = 0;
19381860
19391861   // start in a reset state
1940   sh2_are_running = 0;
1862   m_sh2_are_running = 0;
19411863
1942   _32x_a1518a_reg = 0x00; // inital value
1943   _32x_68k_a15104_reg = 0x00;
1864   m_32x_a1518a_reg = 0x00; // inital value
1865   m_32x_68k_a15104_reg = 0x00;
19441866
1945   _32x_autofill_length = 0;
1946   _32x_autofill_address = 0;
1947   _32x_autofill_data = 0;
1948   _32x_screenshift = 0;
1949   _32x_videopriority = 0; // MD priority
1950   _32x_displaymode = 0;
1951   _32x_240mode = 0;
1867   m_32x_autofill_length = 0;
1868   m_32x_autofill_address = 0;
1869   m_32x_autofill_data = 0;
1870   m_32x_screenshift = 0;
1871   m_32x_videopriority = 0; // MD priority
1872   m_32x_displaymode = 0;
1873   m_32x_240mode = 0;
19521874
19531875
19541876   current_fifo_block = fifo_block_a;
r17465r17466
19581880   fifo_block_a_full = 0;
19591881   fifo_block_b_full = 0;
19601882
1961   _32x_hcount_compare_val = -1;
1883   m_32x_hcount_compare_val = -1;
19621884
19631885
19641886// moved from init
19651887
1966   _32x_adapter_enabled = 0;
1888   m_32x_adapter_enabled = 0;
19671889
1968   if (_32x_adapter_enabled == 0)
1890   if (m_32x_adapter_enabled == 0)
19691891   {
19701892      machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_rom(0x0000000, 0x03fffff, machine().root_device().memregion(":gamecart")->base());
1971      machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0x000070, 0x000073, read16_delegate(FUNC(sega_32x_device::_32x_68k_hint_vector_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_hint_vector_w),this)); // h interrupt vector
1893      machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0x000070, 0x000073, read16_delegate(FUNC(sega_32x_device::_32x_68k_m_hint_vector_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_m_hint_vector_w),this)); // h interrupt vector
19721894   };
19731895
19741896
1975   a15100_reg = 0x0000;
1897   m_a15100_reg = 0x0000;
19761898   machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0xa15100, 0xa15101, read16_delegate(FUNC(sega_32x_device::_32x_68k_a15100_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_a15100_w),this)); // framebuffer control regs
19771899   machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0xa15102, 0xa15103, read16_delegate(FUNC(sega_32x_device::_32x_68k_a15102_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_a15102_w),this)); // send irq to sh2
19781900   machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0xa15104, 0xa15105, read16_delegate(FUNC(sega_32x_device::_32x_68k_a15104_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_a15104_w),this)); // 68k BANK rom set
r17465r17466
19811903   
19821904   machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0xa1511a, 0xa1511b, read16_delegate(FUNC(sega_32x_device::_32x_68k_a1511a_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_a1511a_w),this)); // SEGA TV
19831905
1984   machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0xa15120, 0xa1512f, read16_delegate(FUNC(sega_32x_device::_32x_68k_commsram_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_commsram_w),this)); // comms reg 0-7
1906   machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0xa15120, 0xa1512f, read16_delegate(FUNC(sega_32x_device::_32x_68k_m_commsram_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_m_commsram_w),this)); // comms reg 0-7
19851907   machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0xa15130, 0xa1513f, read16_delegate(FUNC(sega_32x_device::_32x_pwm_r),this), write16_delegate(FUNC(sega_32x_device::_32x_68k_pwm_w),this));
19861908
19871909   machine().device(":maincpu")->memory().space(AS_PROGRAM)->install_read_handler(0x0a130ec, 0x0a130ef, read16_delegate(FUNC(sega_32x_device::_32x_68k_MARS_r),this)); // system ID
trunk/src/mame/machine/mega32x.h
r17465r17466
55// when using the DRC core.  Needs further investigation, the non-DRC core works either
66// way
77#define _32X_SWAP_MASTER_SLAVE_HACK
8#define _32X_COMMS_PORT_SYNC 0
9#define MAX_HPOSITION 480
10/* need to make some pwm stuff part of device */
11#define PWM_FIFO_SIZE m_pwm_tm_reg // guess, Marsch calls this register as FIFO width
12#define PWM_CLOCK megadrive_region_pal ? ((MASTER_CLOCK_PAL*3) / 7) : ((MASTER_CLOCK_NTSC*3) / 7)
813
914
15
16#define SH2_VRES_IRQ_LEVEL 14
17#define SH2_VINT_IRQ_LEVEL 12
18#define SH2_HINT_IRQ_LEVEL 10
19#define SH2_CINT_IRQ_LEVEL 8
20#define SH2_PINT_IRQ_LEVEL 6
21
22
1023#include "sound/dac.h"
1124
1225#define _32X_MASTER_TAG (":sega32x:32x_master_sh2")
r17465r17466
4760   DECLARE_WRITE16_MEMBER( _32x_dreq_common_w );
4861   DECLARE_READ16_MEMBER( _32x_68k_a1511a_r );
4962   DECLARE_WRITE16_MEMBER( _32x_68k_a1511a_w );
50   DECLARE_READ16_MEMBER( _32x_68k_hint_vector_r );
51   DECLARE_WRITE16_MEMBER( _32x_68k_hint_vector_w );
63   DECLARE_READ16_MEMBER( _32x_68k_m_hint_vector_r );
64   DECLARE_WRITE16_MEMBER( _32x_68k_m_hint_vector_w );
5265   DECLARE_READ16_MEMBER( _32x_68k_MARS_r );
5366   DECLARE_READ16_MEMBER( _32x_68k_a15100_r );
5467   DECLARE_WRITE16_MEMBER( _32x_68k_a15100_w );
r17465r17466
5669   DECLARE_WRITE16_MEMBER( _32x_68k_a15102_w );
5770   DECLARE_READ16_MEMBER( _32x_68k_a15104_r );
5871   DECLARE_WRITE16_MEMBER( _32x_68k_a15104_w );
59   DECLARE_READ16_MEMBER( _32x_68k_commsram_r );
60   DECLARE_WRITE16_MEMBER( _32x_68k_commsram_w );
72   DECLARE_READ16_MEMBER( _32x_68k_m_commsram_r );
73   DECLARE_WRITE16_MEMBER( _32x_68k_m_commsram_w );
6174   DECLARE_READ16_MEMBER( _32x_pwm_r );
6275   DECLARE_WRITE16_MEMBER( _32x_pwm_w );
6376   DECLARE_WRITE16_MEMBER( _32x_68k_pwm_w );
r17465r17466
8699   DECLARE_WRITE16_MEMBER( _32x_sh2_master_401e_w );
87100   DECLARE_WRITE16_MEMBER( _32x_sh2_slave_401e_w );
88101   
102   UINT32* _32x_render_videobuffer_to_screenbuffer_helper(running_machine &machine, int scanline);
103   int sh2_master_pwmint_enable, sh2_slave_pwmint_enable;
104
105   void _32x_check_framebuffer_swap(void);
106   void _32x_check_irqs(running_machine& machine);
107   void _32x_scanline_cb0(running_machine& machine);
108   void _32x_scanline_cb1();
109
110   /* our current main rendering code needs to know this for mixing in */
111   int m_32x_displaymode;
112   int m_32x_videopriority;
113   /* our main vblank handler resets this */
114   int m_32x_hcount_compare_val;
115   int m_sh2_are_running;
116   int m_32x_240mode;
117   UINT16 m_32x_a1518a_reg;
118
119
120   UINT32 m_32x_linerender[320+258]; // tmp buffer (bigger than it needs to be to simplify RLE decode)
121
122
123   void handle_pwm_callback(void);
124   void calculate_pwm_timer(running_machine &machine);
125   UINT16 m_pwm_ctrl,m_pwm_cycle,m_pwm_tm_reg;
126   UINT16 m_cur_lch[0x10],m_cur_rch[0x10];
127   UINT16 m_pwm_cycle_reg; //used for latching
128   UINT8 m_pwm_timer_tick;
129   UINT8 m_lch_index_r,m_rch_index_r,m_lch_index_w,m_rch_index_w;
130   UINT16 m_lch_fifo_state,m_rch_fifo_state;
131
132
133   UINT16 get_hposition(void);
134
89135   emu_timer *m_32x_pwm_timer;
90136protected:
91137   virtual void device_start();
r17465r17466
96142   virtual machine_config_constructor device_mconfig_additions() const;
97143private:
98144//   virtual void device_config_complete();
145   int m_32x_adapter_enabled;
146   int m_32x_access_auth;
147   int m_32x_screenshift;
148
149   UINT16 m_32x_68k_a15104_reg;
150   int m_sh2_master_vint_enable, m_sh2_slave_vint_enable;
151   int m_sh2_master_hint_enable, m_sh2_slave_hint_enable;
152   int m_sh2_master_cmdint_enable, m_sh2_slave_cmdint_enable;
153   int m_sh2_hint_in_vbl;
154   int m_sh2_master_vint_pending;
155   int m_sh2_slave_vint_pending;
156   int m_32x_fb_swap;
157   int m_32x_hcount_reg;
158
159   UINT16 m_32x_autofill_length;
160   UINT16 m_32x_autofill_address;
161   UINT16 m_32x_autofill_data;
162   UINT16 m_a15106_reg;
163   UINT16 m_dreq_src_addr[2],m_dreq_dst_addr[2],m_dreq_size;
164   UINT8 m_sega_tv;
165   UINT16 m_hint_vector[2];
166   UINT16 m_a15100_reg;
167   int m_32x_68k_a15102_reg;
168
169   UINT16 m_commsram[8];
170
171   UINT16* m_32x_dram0;
172   UINT16* m_32x_dram1;
173   UINT16 *m_32x_display_dram, *m_32x_access_dram;
174   UINT16* m_32x_palette;
175   UINT16* m_32x_palette_lookup;
99176};
100177
101178
trunk/src/mame/machine/megadriv.c
r17465r17466
13861386      printf("32x SLAVE SH2 cpu found '%s'\n", _32x_slave_cpu->tag() );
13871387   }
13881388
1389   if ((_32x_master_cpu != NULL) && (_32x_slave_cpu != NULL))
1390   {
1391      _32x_is_connected = 1;
1392   }
1393   else
1394   {
1395      _32x_is_connected = 0;
1396   }
13971389
13981390
1399
14001391   sega_cd_connected = 0;
14011392   segacd_wordram_mapped = 0;
14021393   _segacd_68k_cpu = machine.device<cpu_device>("segacd_68k");
trunk/src/mame/machine/megavdp.c
r17465r17466
22
33#include "emu.h"
44#include "megavdp.h"
5#include "mega32x.h"
56
67/* still have dependencies on the following external gunk */
78
r17465r17466
1112extern int segacd_wordram_mapped;
1213extern timer_device* megadriv_scanline_timer;
1314
14extern UINT32* _32x_render_videobuffer_to_screenbuffer_helper(running_machine &machine, int scanline);
15extern void _32x_scanline_cb0(running_machine& machine);
16extern void _32x_scanline_cb1(void);
17extern void _32x_check_framebuffer_swap(void);
18extern int _32x_hcount_compare_val;
19extern int _32x_displaymode;
20extern int _32x_videopriority;
21extern int _32x_is_connected;
2215
2316
17
2418#define MAX_HPOSITION 480
2519
2620
r17465r17466
25522546/* This converts our render buffer to real screen colours */
25532547void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running_machine &machine, int scanline)
25542548{
2549   sega_32x_device *_32xdev = machine.device<sega_32x_device>("sega32x"); // take this out of the VDP eventually
2550
2551
25552552   UINT16*lineptr;
25562553   int x;
25572554
r17465r17466
25642561      lineptr = m_render_line;
25652562   }
25662563
2567   UINT32* _32x_linerender = _32x_render_videobuffer_to_screenbuffer_helper(machine, scanline);
25682564
2565   if (_32xdev) _32xdev->_32x_render_videobuffer_to_screenbuffer_helper(machine, scanline);
25692566
25702567
2568
25712569   if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT)
25722570   {
25732571
r17465r17466
25782576         int drawn = 0;
25792577
25802578         // low priority 32x - if it's the bg pen, we have a 32x, and it's display is enabled...
2581         if ((dat&0x20000) && (_32x_is_connected) && (_32x_displaymode != 0))
2579         if (_32xdev)
25822580         {
2583            if (!_32x_videopriority)
2581            if ((dat&0x20000) && (_32xdev->m_32x_displaymode != 0))
25842582            {
2585               if (!(_32x_linerender[x]&0x8000))
2583               if (!_32xdev->m_32x_videopriority)
25862584               {
2587                  lineptr[x] = _32x_linerender[x]&0x7fff;
2588                  drawn = 1;
2585                  if (!(_32xdev->m_32x_linerender[x]&0x8000))
2586                  {
2587                     lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2588                     drawn = 1;
2589                  }
25892590               }
2590            }
2591            else
2592            {
2593               if ((_32x_linerender[x]&0x8000))
2591               else
25942592               {
2595                  lineptr[x] = _32x_linerender[x]&0x7fff;
2596                  drawn = 1;
2593                  if ((_32xdev->m_32x_linerender[x]&0x8000))
2594                  {
2595                     lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2596                     drawn = 1;
2597                  }
25972598               }
25982599            }
25992600         }
r17465r17466
26332634         int drawn = 0;
26342635
26352636         // low priority 32x - if it's the bg pen, we have a 32x, and it's display is enabled...
2636         if ((dat&0x20000) && (_32x_is_connected) && (_32x_displaymode != 0))
2637         if (_32xdev)
26372638         {
2638            if (!_32x_videopriority)
2639            if ((dat&0x20000) && (_32xdev->m_32x_displaymode != 0))
26392640            {
2640               if (!(_32x_linerender[x]&0x8000))
2641               if (!_32xdev->m_32x_videopriority)
26412642               {
2642                  lineptr[x] = _32x_linerender[x]&0x7fff;
2643                  drawn = 1;
2643                  if (!(_32xdev->m_32x_linerender[x]&0x8000))
2644                  {
2645                     lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2646                     drawn = 1;
2647                  }
26442648               }
2645            }
2646            else
2647            {
2648               if ((_32x_linerender[x]&0x8000))
2649               else
26492650               {
2650                  lineptr[x] = _32x_linerender[x]&0x7fff;
2651                  drawn = 1;
2651                  if ((_32xdev->m_32x_linerender[x]&0x8000))
2652                  {
2653                     lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2654                     drawn = 1;
2655                  }
26522656               }
26532657            }
26542658         }
2655
2659         
26562660         if (!(dat&0x20000))
26572661            m_render_line_raw[x] = 0x100;
26582662         else
r17465r17466
27122716
27132717
27142718   // high priority 32x
2715   if ((_32x_is_connected) && (_32x_displaymode != 0))
2719   if (_32xdev)
27162720   {
2717      for (x=0;x<320;x++)
2721      if (_32xdev->m_32x_displaymode != 0)
27182722      {
2719         if (!_32x_videopriority)
2723         for (x=0;x<320;x++)
27202724         {
2721            if ((_32x_linerender[x]&0x8000))
2722               lineptr[x] = _32x_linerender[x]&0x7fff;
2725            if (!_32xdev->m_32x_videopriority)
2726            {
2727               if ((_32xdev->m_32x_linerender[x]&0x8000))
2728                  lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2729            }
2730            else
2731            {
2732               if (!(_32xdev->m_32x_linerender[x]&0x8000))
2733                  lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
2734            }
27232735         }
2724         else
2725         {
2726            if (!(_32x_linerender[x]&0x8000))
2727               lineptr[x] = _32x_linerender[x]&0x7fff;
2728         }
27292736      }
27302737   }
27312738}
r17465r17466
27562763       to rounding errors in the timer calculation we're not quite there.  Let's assume we are
27572764       still in the previous scanline for now.
27582765    */
2766   sega_32x_device *_32xdev = machine.device<sega_32x_device>("sega32x"); // take this out of the VDP eventually
27592767
2768
27602769   if (genesis_get_scanline_counter(machine)!=(megadrive_total_scanlines-1))
27612770   {
27622771      if (!m_use_alt_timing) genesis_scanline_counter++;
r17465r17466
27712780         megadrive_vblank_flag = 1;
27722781
27732782         // 32x interrupt!
2774         if (_32x_is_connected)
2775         {
2776            _32x_scanline_cb0(machine);
2777         }
2783         if (_32xdev) _32xdev->_32x_scanline_cb0(machine);
27782784
27792785      }
27802786
27812787
27822788
2783      _32x_check_framebuffer_swap();
2789      if (_32xdev) _32xdev->_32x_check_framebuffer_swap();
27842790
27852791
27862792   //  if (genesis_get_scanline_counter(machine)==0) m_irq4counter = MEGADRIVE_REG0A_HINT_VALUE;
r17465r17466
28122818
28132819      //if (genesis_get_scanline_counter(machine)==0) irq4_on_timer->adjust(attotime::from_usec(2));
28142820
2815      if(_32x_is_connected)
2816      {
2817         _32x_scanline_cb1();
2818      }
2821   
2822      if (_32xdev) _32xdev->_32x_scanline_cb1();
28192823
2824
28202825      if (genesis_get_scanline_counter(machine) == megadrive_z80irq_scanline)
28212826      {
28222827         m_genesis_vdp_sndirqline_callback(machine, true);
r17465r17466
28382843
28392844void sega_genesis_vdp_device::vdp_handle_eof(running_machine &machine)
28402845{
2846   sega_32x_device *_32xdev = machine.device<sega_32x_device>("sega32x"); // take this out of the VDP eventually
2847
28412848   rectangle visarea;
28422849   int scr_width = 320;
28432850
r17465r17466
29132920   machine.primary_screen->configure(480, megadrive_total_scanlines, visarea, machine.primary_screen->frame_period().attoseconds);
29142921
29152922
2916   if(_32x_is_connected)
2917      _32x_hcount_compare_val = -1;
2923   if(_32xdev) _32xdev->m_32x_hcount_compare_val = -1;
29182924}
29192925
29202926
trunk/src/mame/machine/megavdp.h
r17465r17466
22
33#pragma once
44
5
6
57/*  The VDP occupies addresses C00000h to C0001Fh.
68
79 C00000h    -   Data port (8=r/w, 16=r/w)
trunk/src/mame/includes/megadriv.h
r17465r17466
420420
421421
422422
423extern int _32x_is_connected;
424423extern cpu_device *_32x_master_cpu;
425424extern cpu_device *_32x_slave_cpu;
426425
r17465r17466
428427
429428
430429
431extern int megadrive_vblank_flag;
432extern int genesis_scanline_counter;
433430
431
434432class segacd_state : public _32x_state   // use _32x_state as base to make easier the combo 32X + SCD
435433{
436434public:
r17465r17466
468466extern int megadrive_vblank_flag;
469467extern int genesis_scanline_counter;
470468extern UINT16* megadrive_vdp_palette_lookup;
471extern UINT16* megadrive_vdp_palette_lookup_sprite; // for C2
472extern UINT16* megadrive_vdp_palette_lookup_shadow;
473extern UINT16* megadrive_vdp_palette_lookup_highlight;
474extern int segac2_bg_pal_lookup[4];
475extern int segac2_sp_pal_lookup[4];
476extern int genvdp_use_cram;
469
477470extern int megadrive_region_export;
478471extern int megadrive_region_pal;
479TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback );
480472
481473/* machine/megadriv.c */
482474extern TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback );

Previous 199869 Revisions Next


© 1997-2024 The MAME Team