Previous 199869 Revisions Next

r20808 Thursday 7th February, 2013 at 19:12:43 UTC by Angelo Salese
Reverted previous fix, needs rewrite anyway
[src/mame/includes]stv.h
[src/mame/video]stvvdp1.c

trunk/src/mame/includes/stv.h
r20807r20808
6868      rectangle user_cliprect;
6969      UINT16    *framebuffer[2];
7070      UINT16    **framebuffer_draw_lines;
71      UINT8     *gfx_decode;
7172      UINT16    lopr;
7273      UINT16    copr;
7374      UINT16    ewdr;
trunk/src/mame/video/stvvdp1.c
r20807r20808
1616#include "emu.h"
1717#include "includes/stv.h"
1818
19#define VDP1_LOG 1
19#define VDP1_LOG 0
2020
2121
2222enum { FRAC_SHIFT = 16 };
r20807r20808
311311
312312WRITE32_MEMBER ( saturn_state::saturn_vdp1_vram_w )
313313{
314   COMBINE_DATA(&m_vdp1_vram[offset]);
314   UINT8 *vdp1 = m_vdp1.gfx_decode;
315
316   COMBINE_DATA (&m_vdp1_vram[offset]);
317
318//  if (((offset * 4) > 0xdf) && ((offset * 4) < 0x140))
319//  {
320//      logerror("cpu %s (PC=%08X): VRAM dword write to %08X = %08X & %08X\n", space.device().tag(), space.device().safe_pc(), offset*4, data, mem_mask);
321//  }
322
323   data = m_vdp1_vram[offset];
324   /* put in gfx region for easy decoding */
325   vdp1[offset*4+0] = (data & 0xff000000) >> 24;
326   vdp1[offset*4+1] = (data & 0x00ff0000) >> 16;
327   vdp1[offset*4+2] = (data & 0x0000ff00) >> 8;
328   vdp1[offset*4+3] = (data & 0x000000ff) >> 0;
315329}
316330
317331WRITE32_MEMBER ( saturn_state::saturn_vdp1_framebuffer0_w )
r20807r20808
824838
825839void saturn_state::drawpixel_8bpp_trans(int x, int y, int patterndata, int offsetcnt)
826840{
827   UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram;
828841   UINT16 pix;
829842
830   pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff];
843   pix = m_vdp1.gfx_decode[patterndata+offsetcnt];
831844   if ( pix & 0xff )
832845   {
833846      m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank;
r20807r20808
836849
837850void saturn_state::drawpixel_4bpp_notrans(int x, int y, int patterndata, int offsetcnt)
838851{
839   UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram;
840852   UINT16 pix;
841853
842   pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff];
843   pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ;
854   pix = m_vdp1.gfx_decode[patterndata+offsetcnt/2];
855   pix = offsetcnt&1 ? (pix & 0x0f) : ((pix & 0xf0)>>4);
844856   m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank;
845857}
846858
847859void saturn_state::drawpixel_4bpp_trans(int x, int y, int patterndata, int offsetcnt)
848860{
849   UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram;
850861   UINT16 pix;
851862
852   pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff];
853   pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ;
863   pix = m_vdp1.gfx_decode[patterndata+offsetcnt/2];
864   pix = offsetcnt&1 ? (pix & 0x0f) : ((pix & 0xf0)>>4);
854865   if ( pix )
855866      m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank;
856867}
857868
858869void saturn_state::drawpixel_generic(int x, int y, int patterndata, int offsetcnt)
859870{
860   UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram;
861871   int pix,mode,transmask, spd = stv2_current_sprite.CMDPMOD & 0x40;
862872   int mesh = stv2_current_sprite.CMDPMOD & 0x100;
863873   int pix2;
r20807r20808
887897      {
888898         case 0x0000: // mode 0 16 colour bank mode (4bits) (hanagumi blocks)
889899            // most of the shienryu sprites use this mode
890            pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff];
891            pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ;
900            pix = m_vdp1.gfx_decode[(patterndata+offsetcnt/2) & 0xfffff];
901            pix = offsetcnt&1 ? (pix & 0x0f) : ((pix & 0xf0)>>4);
892902            pix = pix+((stv2_current_sprite.CMDCOLR&0xfff0));
893903            mode = 0;
894904            transmask = 0xf;
895905            break;
896906         case 0x0008: // mode 1 16 colour lookup table mode (4bits)
897907            // shienryu explosisons (and some enemies) use this mode
898            pix2 = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff];
899            pix2 = offsetcnt&1 ?  (pix2 & 0x0f):((pix2 & 0xf0)>>4);
908            pix2 = m_vdp1.gfx_decode[(patterndata+offsetcnt/2) & 0xfffff];
909            pix = offsetcnt&1 ? (pix & 0x0f) : ((pix & 0xf0)>>4);
900910            pix = pix2&1 ?
901911            ((((m_vdp1_vram[(((stv2_current_sprite.CMDCOLR&0xffff)*8)>>2)+((pix2&0xfffe)/2)])) & 0x0000ffff) >> 0):
902912            ((((m_vdp1_vram[(((stv2_current_sprite.CMDCOLR&0xffff)*8)>>2)+((pix2&0xfffe)/2)])) & 0xffff0000) >> 16);
r20807r20808
917927            }
918928            break;
919929         case 0x0010: // mode 2 64 colour bank mode (8bits) (character select portraits on hanagumi)
920            pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff];
930            pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff];
921931            mode = 2;
922932            pix = pix+(stv2_current_sprite.CMDCOLR&0xffc0);
923933            transmask = 0x3f;
924934            break;
925935         case 0x0018: // mode 3 128 colour bank mode (8bits) (little characters on hanagumi use this mode)
926            pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff];
936            pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff];
927937            pix = pix+(stv2_current_sprite.CMDCOLR&0xff80);
928938            transmask = 0x7f;
929939            mode = 3;
930940            break;
931941         case 0x0020: // mode 4 256 colour bank mode (8bits) (hanagumi title)
932            pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff];
942            pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff];
933943            pix = pix+(stv2_current_sprite.CMDCOLR&0xff00);
934944            transmask = 0xff;
935945            mode = 4;
936946            break;
937947         case 0x0028: // mode 5 32,768 colour RGB mode (16bits)
938            pix = vdp1_vram[((patterndata+offsetcnt*2+1)^3) & 0x7ffff] | (vdp1_vram[((patterndata+offsetcnt*2)^3) & 0x7ffff]<<8) ;
948            pix = m_vdp1.gfx_decode[(patterndata+offsetcnt*2+1) & 0xfffff] | (m_vdp1.gfx_decode[(patterndata+offsetcnt*2) & 0xfffff]<<8) ;
939949            mode = 5;
940950            transmask = -1; /* TODO: check me */
941951            break;
r20807r20808
20392049
20402050void saturn_state::stv_vdp1_state_save_postload( void )
20412051{
2052   UINT8 *vdp1 = m_vdp1.gfx_decode;
2053   int offset;
2054   UINT32 data;
2055
20422056   m_vdp1.framebuffer_mode = -1;
20432057   m_vdp1.framebuffer_double_interlace = -1;
20442058
20452059   stv_set_framebuffer_config();
2060
2061   for (offset = 0; offset < 0x80000/4; offset++ )
2062   {
2063      data = m_vdp1_vram[offset];
2064      /* put in gfx region for easy decoding */
2065      vdp1[offset*4+0] = (data & 0xff000000) >> 24;
2066      vdp1[offset*4+1] = (data & 0x00ff0000) >> 16;
2067      vdp1[offset*4+2] = (data & 0x0000ff00) >> 8;
2068      vdp1[offset*4+3] = (data & 0x000000ff) >> 0;
2069   }
20462070}
20472071
20482072int saturn_state::stv_vdp1_start ( void )
20492073{
20502074   m_vdp1_regs = auto_alloc_array_clear(machine(), UINT16, 0x020/2 );
20512075   m_vdp1_vram = auto_alloc_array_clear(machine(), UINT32, 0x100000/4 );
2076   m_vdp1.gfx_decode = auto_alloc_array(machine(), UINT8, 0x100000 );
20522077
20532078   stv_vdp1_shading_data = auto_alloc(machine(), struct stv_vdp1_poly_scanline_data);
20542079

Previous 199869 Revisions Next


© 1997-2024 The MAME Team