Previous 199869 Revisions Next

r30728 Friday 30th May, 2014 at 18:30:34 UTC by Dirk Best
Amiga: Emulate DIWHIGH register for ECS machines, reduce some code
duplication.
[src/mame/includes]amiga.h
[src/mame/machine]amiga.c
[src/mame/video]amiga.c amigaaga.c

trunk/src/mame/machine/amiga.c
r30727r30728
15531553            CUSTOM_REG(offset + 32) = (data >> 1) & 0x777;
15541554         }
15551555         break;
1556
1557      // display window start/stop
15561558      case REG_DIWSTRT:
15571559      case REG_DIWSTOP:
1558         if (IS_AGA(state))
1559            amiga_aga_diwhigh_written(space.machine(), 0);
1560         m_diwhigh_valid = false;
15601561         break;
1562
1563      // display window high
15611564      case REG_DIWHIGH:
1562         if (IS_AGA(state))
1563            amiga_aga_diwhigh_written(space.machine(), 1);
1565         if (IS_ECS(state) || IS_AGA(state))
1566         {
1567            m_diwhigh_valid = true;
1568            CUSTOM_REG(REG_DIWHIGH) = data;
1569         }
15641570         break;
15651571
15661572      case REG_BEAMCON0:
trunk/src/mame/includes/amiga.h
r30727r30728
361361   m_centronics_perror(0),
362362   m_centronics_select(0),
363363   m_gayle_reset(false),
364   m_diw(),
365   m_diwhigh_valid(false),
364366   m_previous_lof(true),
365367   m_rx_shift(0),
366368   m_tx_shift(0),
r30727r30728
620622
621623   bool m_gayle_reset;
622624
625   // display window
626   rectangle m_diw;
627   bool m_diwhigh_valid;
628   void update_display_window();
629
623630   bool m_previous_lof;
624631   bitmap_ind16 m_flickerfixer;
625632   bitmap_ind32 m_flickerfixer32;
r30727r30728
667674/*----------- defined in video/amigaaga.c -----------*/
668675
669676void amiga_aga_palette_write(running_machine &machine, int color_reg, UINT16 data);
670void amiga_aga_diwhigh_written(running_machine &machine, int written);
671677
672678#endif /* __AMIGA_H__ */
trunk/src/mame/video/amiga.c
r30727r30728
197197int amiga_copper_execute_next(running_machine &machine, int xpos)
198198{
199199   amiga_state *state = machine.driver_data<amiga_state>();
200   UINT8 ypos = state->m_last_scanline & 0xff;
200201   int word0, word1;
201202
202203   /* bail if not enabled */
r30727r30728
215216   /* if we're waiting, check for a breakthrough */
216217   if (state->m_copper_waiting)
217218   {
218      int curpos = (state->m_last_scanline << 8) | (xpos >> 1);
219      int curpos = (ypos << 8) | (xpos >> 1);
219220
220221      /* if we're past the wait time, stop it and hold up 2 cycles */
221222      if ((curpos & state->m_copper_waitmask) >= (state->m_copper_waitval & state->m_copper_waitmask) &&
r30727r30728
283284         state->m_copper_waitmask = 0xffff;
284285         state->m_copper_waitblit = FALSE;
285286         state->m_copper_waiting = TRUE;
287
286288         return 511;
287289      }
288290   }
r30727r30728
290292   {
291293      /* extract common wait/skip values */
292294      state->m_copper_waitval = word0 & 0xfffe;
295
296#if 0
297      if (state->m_copper_waitval != 0xfffe)
298         state->m_copper_waitval = (word0 & 0x00fe) | ((((word0 >> 8) & 0xff) + 1) << 8);
299#endif
300
293301      state->m_copper_waitmask = word1 | 0x8001;
294302      state->m_copper_waitblit = (~word1 >> 15) & 1;
295303
r30727r30728
305313      /* handle a skip */
306314      else
307315      {
308         int curpos = (state->m_last_scanline << 8) | (xpos >> 1);
316         int curpos = (ypos << 8) | (xpos >> 1);
309317
310318         if (LOG_COPPER)
311319            logerror("  Skipping if %04x & %04x (currently %04x)\n", state->m_copper_waitval, state->m_copper_waitmask, (state->m_last_scanline << 8) | (xpos >> 1));
r30727r30728
613621}
614622
615623
624//**************************************************************************
625//  DISPLAY WINDOW
626//**************************************************************************
616627
628void amiga_state::update_display_window()
629{
630   amiga_state *state = this;
631
632   int vstart = CUSTOM_REG(REG_DIWSTRT) >> 8;
633   int vstop = CUSTOM_REG(REG_DIWSTOP) >> 8;
634   int hstart = CUSTOM_REG(REG_DIWSTRT) & 0xff;
635   int hstop = CUSTOM_REG(REG_DIWSTOP) & 0xff;
636
637   if (m_diwhigh_valid)
638   {
639      vstart |= (CUSTOM_REG(REG_DIWHIGH) & 7) << 8;
640      vstop  |= ((CUSTOM_REG(REG_DIWHIGH) >> 8) & 7) << 8;
641      hstart |= ((CUSTOM_REG(REG_DIWHIGH) >> 5) & 1) << 8;
642      hstop  |= ((CUSTOM_REG(REG_DIWHIGH) >> 13) & 1) << 8;
643   }
644   else
645   {
646      vstop |= ((~CUSTOM_REG(REG_DIWSTOP) >> 7) & 0x100);
647      hstop |= 0x100;
648   }
649
650   if (hstop < hstart)
651   {
652      hstart = 0x00;
653      hstop = 0x1ff;
654   }
655
656   m_diw.set(hstart, hstop, vstart, vstop);
657}
658
659
617660/*************************************
618661 *
619662 *  Single scanline rasterizer
r30727r30728
626669   UINT16 save_color0 = CUSTOM_REG(REG_COLOR00);
627670   int ddf_start_pixel = 0, ddf_stop_pixel = 0;
628671   int hires = 0, dualpf = 0, ham = 0;
629   int hstart = 0, hstop = 0;
630   int vstart = 0, vstop = 0;
631672   int pf1pri = 0, pf2pri = 0;
632673   int planes = 0;
633674
r30727r30728
723764         if ( ( CUSTOM_REG(REG_DDFSTRT) ^ CUSTOM_REG(REG_DDFSTOP) ) & 0x04 )
724765            ddf_stop_pixel += 8;
725766
726         /* compute the horizontal start/stop */
727         hstart = CUSTOM_REG(REG_DIWSTRT) & 0xff;
728         hstop = (CUSTOM_REG(REG_DIWSTOP) & 0xff);
729         hstop |= 0x100;
767         // display window
768         update_display_window();
730769
731         /* compute the vertical start/stop */
732         vstart = CUSTOM_REG(REG_DIWSTRT) >> 8;
733         vstop = (CUSTOM_REG(REG_DIWSTOP) >> 8);
734         vstop |= ((~CUSTOM_REG(REG_DIWSTOP) >> 7) & 0x100);
735
736770         /* extract playfield priorities */
737771         pf1pri = CUSTOM_REG(REG_BPLCON2) & 7;
738772         pf2pri = (CUSTOM_REG(REG_BPLCON2) >> 3) & 7;
r30727r30728
780814      /* to render, we must have bitplane DMA enabled, at least 1 plane, and be within the */
781815      /* vertical display window */
782816      if ((CUSTOM_REG(REG_DMACON) & (DMACON_BPLEN | DMACON_DMAEN)) == (DMACON_BPLEN | DMACON_DMAEN) &&
783         planes > 0 && scanline >= vstart && scanline < vstop)
817         planes > 0 && scanline >= m_diw.min_y && scanline < m_diw.max_y)
784818      {
785819         int pfpix0 = 0, pfpix1 = 0, collide;
786820
r30727r30728
885919            CUSTOM_REG(REG_CLXDAT) |= 0x001;
886920
887921         /* if we are within the display region, render */
888         if (dst != NULL && x >= hstart && x < hstop)
922         if (dst != NULL && x >= m_diw.min_x && x < m_diw.max_x)
889923         {
890924            int pix, pri;
891925
r30727r30728
9751009   }
9761010
9771011   // end of the line: time to add the modulos
978   if (scanline >= vstart && scanline < vstop)
1012   if (scanline >= m_diw.min_y && scanline < m_diw.max_y)
9791013   {
9801014      // update odd planes
9811015      for (pl = 0; pl < planes; pl += 2)
trunk/src/mame/video/amigaaga.c
r30727r30728
399399   }
400400}
401401
402void amiga_aga_diwhigh_written(running_machine &machine, int written)
403{
404   amiga_state *state = machine.driver_data<amiga_state>();
405402
406   state->m_aga_diwhigh_written = written;
407}
408403
409404/*************************************
410405 *
r30727r30728
449444   UINT16 save_color0 = CUSTOM_REG(REG_COLOR00);
450445   int ddf_start_pixel = 0, ddf_stop_pixel = 0;
451446   int hires = 0, dualpf = 0, ham = 0;
452   int hstart = 0, hstop = 0;
453   int vstart = 0, vstop = 0;
454447   int pf1pri = 0, pf2pri = 0;
455448   int planes = 0;
456449
r30727r30728
539532         hires = CUSTOM_REG(REG_BPLCON0) & BPLCON0_HIRES;
540533         ham = CUSTOM_REG(REG_BPLCON0) & BPLCON0_HOMOD;
541534         dualpf = CUSTOM_REG(REG_BPLCON0) & BPLCON0_DBLPF;
542//          lace = CUSTOM_REG(REG_BPLCON0) & BPLCON0_LACE;
543535
544536         /* get default bitoffset */
545537         switch(CUSTOM_REG(REG_FMODE) & 0x3)
r30727r30728
557549         if ( ( CUSTOM_REG(REG_DDFSTRT) ^ CUSTOM_REG(REG_DDFSTOP) ) & 0x04 )
558550            ddf_stop_pixel += 8;
559551
560         /* compute the horizontal start/stop */
561         hstart = CUSTOM_REG(REG_DIWSTRT) & 0xff;
562         hstop = (CUSTOM_REG(REG_DIWSTOP) & 0xff);
552         // display window
553         update_display_window();
563554
564         if (m_aga_diwhigh_written)
565         {
566            hstart |= ((CUSTOM_REG(REG_DIWHIGH) >> 5) & 1) << 8;
567            hstop |= ((CUSTOM_REG(REG_DIWHIGH) >> 13) & 1) << 8;
568         }
569         else
570         {
571            hstop |= 0x100;
572         }
573         if ( hstop < hstart )
574         {
575            hstart = 0x00;
576            hstop = 0x1ff;
577         }
578
579         /* compute the vertical start/stop */
580         vstart = CUSTOM_REG(REG_DIWSTRT) >> 8;
581         vstop = (CUSTOM_REG(REG_DIWSTOP) >> 8);
582         if (m_aga_diwhigh_written)
583         {
584            vstart |= (CUSTOM_REG(REG_DIWHIGH) & 7) << 8;
585            vstop |= ((CUSTOM_REG(REG_DIWHIGH) >> 8) & 7) << 8;
586         }
587         else
588         {
589            vstop |= ((~CUSTOM_REG(REG_DIWSTOP) >> 7) & 0x100);
590         }
591
592555         /* extract playfield priorities */
593556         pf1pri = CUSTOM_REG(REG_BPLCON2) & 7;
594557         pf2pri = (CUSTOM_REG(REG_BPLCON2) >> 3) & 7;
r30727r30728
636599      /* to render, we must have bitplane DMA enabled, at least 1 plane, and be within the */
637600      /* vertical display window */
638601      if ((CUSTOM_REG(REG_DMACON) & (DMACON_BPLEN | DMACON_DMAEN)) == (DMACON_BPLEN | DMACON_DMAEN) &&
639         planes > 0 && scanline >= vstart && scanline < vstop)
602         planes > 0 && scanline >= m_diw.min_y && scanline < m_diw.max_y)
640603      {
641604         int pfpix0 = 0, pfpix1 = 0, collide;
642605
r30727r30728
741704            CUSTOM_REG(REG_CLXDAT) |= 0x001;
742705
743706         /* if we are within the display region, render */
744         if (dst != NULL && x >= hstart && x < hstop)
707         if (dst != NULL && x >= m_diw.min_x && x < m_diw.max_x)
745708         {
746709            int pix, pri;
747710
r30727r30728
854817#endif
855818
856819   /* end of the line: time to add the modulos */
857   if (scanline >= vstart && scanline < vstop)
820   if (scanline >= m_diw.min_y && scanline < m_diw.max_y)
858821   {
859822      /* update odd planes */
860823      for (pl = 0; pl < planes; pl += 2)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team