PCem

changeset 9:229a4aba5d38

Video optimisations. Fixed VRAM mask on S3.
author TomW
date Tue Jul 09 19:30:53 2013 +0100
parents d53edbb92515
children 9541531878eb
files src/808x.c src/pc.c src/vid_ati18800.c src/vid_ati28800.c src/vid_ati_mach64.c src/vid_cl5429.c src/vid_et4000.c src/vid_et4000w32.c src/vid_oti067.c src/vid_paradise.c src/vid_s3.c src/vid_s3_virge.c src/vid_svga.c src/vid_svga_render.c src/vid_svga_render.h src/vid_tvga.c src/vid_vga.c src/video.c src/video.h
diffstat 19 files changed, 378 insertions(+), 240 deletions(-) [+]
line diff
     1.1 --- a/src/808x.c	Sun Jul 07 13:31:32 2013 +0100
     1.2 +++ b/src/808x.c	Tue Jul 09 19:30:53 2013 +0100
     1.3 @@ -812,14 +812,12 @@
     1.4          if (((a&0xF)-(b&0xF))&0x10)      flags|=A_FLAG;
     1.5  }
     1.6  
     1.7 -int totaldiff = 0;
     1.8  int current_diff = 0;
     1.9  void clockhardware()
    1.10  {
    1.11          int diff = cycdiff - cycles - current_diff;
    1.12          
    1.13          current_diff += diff;
    1.14 -        totaldiff += diff;
    1.15          pit.c[0] -= diff;
    1.16          pit.c[1] -= diff;
    1.17          if (ppi.pb & 1) pit.c[2] -= diff;
     2.1 --- a/src/pc.c	Sun Jul 07 13:31:32 2013 +0100
     2.2 +++ b/src/pc.c	Tue Jul 09 19:30:53 2013 +0100
     2.3 @@ -307,7 +307,7 @@
     2.4  int serial_fifo_read, serial_fifo_write;
     2.5  
     2.6  int emu_fps = 0;
     2.7 -extern int totaldiff;
     2.8 +
     2.9  void runpc()
    2.10  {
    2.11          char s[200];
    2.12 @@ -350,8 +350,7 @@
    2.13                  if (win_title_update)
    2.14                  {
    2.15                          win_title_update=0;
    2.16 -                        sprintf(s, "PCem v0.7 - %s - %s - %s - %i%% - %i", model_getname(), models[model].cpu[cpu_manufacturer].cpus[cpu].name, (!mousecapture) ? "Click to capture mouse" : "Press CTRL-END to release mouse", fps, totaldiff);
    2.17 -                        totaldiff = 0;
    2.18 +                        sprintf(s, "PCem v0.7 - %s - %s - %s - %i%%", model_getname(), models[model].cpu[cpu_manufacturer].cpus[cpu].name, (!mousecapture) ? "Click to capture mouse" : "Press CTRL-END to release mouse", fps);
    2.19                          set_window_title(s);
    2.20                  }
    2.21                  done++;
     3.1 --- a/src/vid_ati18800.c	Sun Jul 07 13:31:32 2013 +0100
     3.2 +++ b/src/vid_ati18800.c	Tue Jul 09 19:30:53 2013 +0100
     3.3 @@ -63,7 +63,7 @@
     3.4                  {
     3.5                          if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
     3.6                          {
     3.7 -                                fullchange = changeframecount;
     3.8 +                                svga->fullchange = changeframecount;
     3.9                                  svga_recalctimings(svga);
    3.10                          }
    3.11                  }
     4.1 --- a/src/vid_ati28800.c	Sun Jul 07 13:31:32 2013 +0100
     4.2 +++ b/src/vid_ati28800.c	Tue Jul 09 19:30:53 2013 +0100
     4.3 @@ -65,7 +65,7 @@
     4.4                  {
     4.5                          if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
     4.6                          {
     4.7 -                                fullchange = changeframecount;
     4.8 +                                svga->fullchange = changeframecount;
     4.9                                  svga_recalctimings(svga);
    4.10                          }
    4.11                  }
     5.1 --- a/src/vid_ati_mach64.c	Sun Jul 07 13:31:32 2013 +0100
     5.2 +++ b/src/vid_ati_mach64.c	Tue Jul 09 19:30:53 2013 +0100
     5.3 @@ -230,7 +230,7 @@
     5.4                  {
     5.5                          if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
     5.6                          {
     5.7 -                                fullchange = changeframecount;
     5.8 +                                svga->fullchange = changeframecount;
     5.9                                  svga_recalctimings(svga);
    5.10                          }
    5.11                  }
    5.12 @@ -1151,7 +1151,7 @@
    5.13                  case 0x14: case 0x15: case 0x16: case 0x17:
    5.14                  WRITE8(addr, mach64->crtc_off_pitch, val);
    5.15                  svga_recalctimings(&mach64->svga);
    5.16 -                fullchange = changeframecount;
    5.17 +                svga->fullchange = changeframecount;
    5.18                  break;
    5.19                  
    5.20                  case 0x18:
     6.1 --- a/src/vid_cl5429.c	Sun Jul 07 13:31:32 2013 +0100
     6.2 +++ b/src/vid_cl5429.c	Tue Jul 09 19:30:53 2013 +0100
     6.3 @@ -143,7 +143,7 @@
     6.4                  {
     6.5                          if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
     6.6                          {
     6.7 -                                fullchange = changeframecount;
     6.8 +                                svga->fullchange = changeframecount;
     6.9                                  svga_recalctimings(svga);
    6.10                          }
    6.11                  }
    6.12 @@ -323,7 +323,7 @@
    6.13          
    6.14  //        if (svga_output) pclog("Write LFB %08X %02X ", addr, val);
    6.15          if (!(svga->gdcreg[6] & 1)) 
    6.16 -                fullchange = 2;
    6.17 +                svga->fullchange = 2;
    6.18          if (svga->chain4 && (svga->writemode < 4))
    6.19          {
    6.20                  writemask2 = 1 << (addr & 3);
     7.1 --- a/src/vid_et4000.c	Sun Jul 07 13:31:32 2013 +0100
     7.2 +++ b/src/vid_et4000.c	Tue Jul 09 19:30:53 2013 +0100
     7.3 @@ -52,7 +52,7 @@
     7.4                  {
     7.5                          if (svga->crtcreg < 0xE || svga->crtcreg > 0x10)
     7.6                          {
     7.7 -                                fullchange = changeframecount;
     7.8 +                                svga->fullchange = changeframecount;
     7.9                                  svga_recalctimings(svga);
    7.10                          }
    7.11                  }
     8.1 --- a/src/vid_et4000w32.c	Sun Jul 07 13:31:32 2013 +0100
     8.2 +++ b/src/vid_et4000w32.c	Tue Jul 09 19:30:53 2013 +0100
     8.3 @@ -124,7 +124,7 @@
     8.4                  {
     8.5                          if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
     8.6                          {
     8.7 -                                fullchange = changeframecount;
     8.8 +                                svga->fullchange = changeframecount;
     8.9                                  svga_recalctimings(svga);
    8.10                          }
    8.11                  }
     9.1 --- a/src/vid_oti067.c	Sun Jul 07 13:31:32 2013 +0100
     9.2 +++ b/src/vid_oti067.c	Tue Jul 09 19:30:53 2013 +0100
     9.3 @@ -38,7 +38,7 @@
     9.4                  {
     9.5                          if (svga->crtcreg < 0xE || svga->crtcreg > 0x10)
     9.6                          {
     9.7 -                                fullchange = changeframecount;
     9.8 +                                svga->fullchange = changeframecount;
     9.9                                  svga_recalctimings(svga);
    9.10                          }
    9.11                  }
    10.1 --- a/src/vid_paradise.c	Sun Jul 07 13:31:32 2013 +0100
    10.2 +++ b/src/vid_paradise.c	Tue Jul 09 19:30:53 2013 +0100
    10.3 @@ -121,7 +121,7 @@
    10.4                  {
    10.5                          if (svga->crtcreg < 0xe ||  svga->crtcreg > 0x10)
    10.6                          {
    10.7 -                                fullchange = changeframecount;
    10.8 +                                svga->fullchange = changeframecount;
    10.9                                  svga_recalctimings(&paradise->svga);
   10.10                          }
   10.11                  }
    11.1 --- a/src/vid_s3.c	Sun Jul 07 13:31:32 2013 +0100
    11.2 +++ b/src/vid_s3.c	Tue Jul 09 19:30:53 2013 +0100
    11.3 @@ -107,7 +107,7 @@
    11.4                  {
    11.5                          case 0x31:
    11.6                          s3->ma_ext = (s3->ma_ext & 0x1c) | ((val & 0x30) >> 4);
    11.7 -                        svga->vrammask = (val & 8) ? 0x3fffff : 0x3ffff;
    11.8 +                        svga->vrammask = /*(val & 8) ? */0x3fffff/* : 0x3ffff*/;
    11.9                          break;
   11.10                          
   11.11                          case 0x50:
   11.12 @@ -134,6 +134,7 @@
   11.13                          break;
   11.14                          case 0x51:
   11.15                          s3->bank = (s3->bank & 0x4f) | ((val & 0xc) << 2);
   11.16 +//                        pclog("CRTC write R51 %02X\n", val);
   11.17                          if (svga->chain4) svga->write_bank = svga->read_bank = s3->bank << 16;
   11.18                          else              svga->write_bank = svga->read_bank = s3->bank << 14;
   11.19                          s3->ma_ext = (s3->ma_ext & ~0xc) | ((val & 3) << 2);
   11.20 @@ -189,7 +190,7 @@
   11.21                  {
   11.22                          if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
   11.23                          {
   11.24 -                                fullchange = changeframecount;
   11.25 +                                svga->fullchange = changeframecount;
   11.26                                  svga_recalctimings(svga);
   11.27                          }
   11.28                  }
    12.1 --- a/src/vid_s3_virge.c	Sun Jul 07 13:31:32 2013 +0100
    12.2 +++ b/src/vid_s3_virge.c	Tue Jul 09 19:30:53 2013 +0100
    12.3 @@ -160,7 +160,7 @@
    12.4                  {
    12.5                          if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
    12.6                          {
    12.7 -                                fullchange = changeframecount;
    12.8 +                                svga->fullchange = changeframecount;
    12.9                                  svga_recalctimings(svga);
   12.10                          }
   12.11                  }
    13.1 --- a/src/vid_svga.c	Sun Jul 07 13:31:32 2013 +0100
    13.2 +++ b/src/vid_svga.c	Tue Jul 09 19:30:53 2013 +0100
    13.3 @@ -298,7 +298,10 @@
    13.4                                          svga->render = svga_render_4bpp_highres;
    13.5                                  break;
    13.6                                  case 0x20: /*4 colours*/
    13.7 -                                svga->render = svga_render_2bpp_lowres;
    13.8 +                                if (svga->seqregs[1] & 8) /*Low res (320)*/
    13.9 +                                        svga->render = svga_render_2bpp_lowres;
   13.10 +                                else
   13.11 +                                        svga->render = svga_render_2bpp_highres;
   13.12                                  break;
   13.13                                  case 0x40: case 0x60: /*256+ colours*/
   13.14                                  switch (svga->bpp)
   13.15 @@ -497,7 +500,7 @@
   13.16                                  svga->fullchange = 2;
   13.17                          svga->blink++;
   13.18  
   13.19 -                        for (x = 0; x < 2048; x++) 
   13.20 +                        for (x = 0; x < (svga->vram_limit >> 10); x++) 
   13.21                          {
   13.22                                  if (svga->changedvram[x]) 
   13.23                                          svga->changedvram[x]--;
    14.1 --- a/src/vid_svga_render.c	Sun Jul 07 13:31:32 2013 +0100
    14.2 +++ b/src/vid_svga_render.c	Tue Jul 09 19:30:53 2013 +0100
    14.3 @@ -37,8 +37,9 @@
    14.4                  svga->firstline_draw = svga->displine;
    14.5          svga->lastline_draw = svga->displine;
    14.6          
    14.7 -        if (fullchange)
    14.8 +        if (svga->fullchange)
    14.9          {
   14.10 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[32];
   14.11                  int x, xx;
   14.12                  int drawcursor;
   14.13                  uint8_t chr, attr, dat;
   14.14 @@ -74,21 +75,22 @@
   14.15                          dat = svga->vram[charaddr + (svga->sc << 2)];
   14.16                          if (svga->seqregs[1] & 1) 
   14.17                          { 
   14.18 -                                for (xx = 0; xx < 8; xx++) 
   14.19 -                                        ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + (xx << 1)) & 2047] = ((uint32_t *)buffer32->line[svga->displine])[(x + 33 + (xx << 1)) & 2047] = (dat & (0x80 >> xx)) ? fg : bg;
   14.20 +                                for (xx = 0; xx < 16; xx += 2) 
   14.21 +                                        p[xx] = p[xx + 1] = (dat & (0x80 >> (xx >> 1))) ? fg : bg;
   14.22                          }
   14.23                          else
   14.24                          {
   14.25 -                                for (xx = 0; xx < 8; xx++) 
   14.26 -                                        ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + (xx << 1)) & 2047] = ((uint32_t *)buffer32->line[svga->displine])[(x + 33 + (xx << 1)) & 2047] = (dat & (0x80 >> xx)) ? fg : bg;
   14.27 +                                for (xx = 0; xx < 16; xx += 2)
   14.28 +                                        p[xx] = p[xx + 1] = (dat & (0x80 >> (xx >> 1))) ? fg : bg;
   14.29                                  if ((chr & ~0x1F) != 0xC0 || !(svga->attrregs[0x10] & 4)) 
   14.30 -                                        ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + 16) & 2047] = ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + 17) & 2047] = bg;
   14.31 +                                        p[16] = p[17] = bg;
   14.32                                  else                  
   14.33 -                                        ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + 16) & 2047] = ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + 17) & 2047] = (dat & 1) ? fg : bg;
   14.34 +                                        p[16] = p[17] = (dat & 1) ? fg : bg;
   14.35                          }
   14.36                          svga->ma += 4; 
   14.37 -                        svga->ma &= svga->vrammask;
   14.38 +                        p += xinc;
   14.39                  }
   14.40 +                svga->ma &= svga->vrammask;
   14.41          }
   14.42  }
   14.43  
   14.44 @@ -98,8 +100,9 @@
   14.45                  svga->firstline_draw = svga->displine;
   14.46          svga->lastline_draw = svga->displine;
   14.47          
   14.48 -        if (fullchange)
   14.49 +        if (svga->fullchange)
   14.50          {
   14.51 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[32];
   14.52                  int x, xx;
   14.53                  int drawcursor;
   14.54                  uint8_t chr, attr, dat;
   14.55 @@ -136,293 +139,399 @@
   14.56                          if (svga->seqregs[1] & 1) 
   14.57                          { 
   14.58                                  for (xx = 0; xx < 8; xx++) 
   14.59 -                                        ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + xx) & 2047] = (dat & (0x80 >> xx)) ? fg : bg;
   14.60 +                                        p[xx] = (dat & (0x80 >> xx)) ? fg : bg;
   14.61                          }
   14.62                          else
   14.63                          {
   14.64                                  for (xx = 0; xx < 8; xx++) 
   14.65 -                                        ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + xx) & 2047] = (dat & (0x80 >> xx)) ? fg : bg;
   14.66 +                                        p[xx] = (dat & (0x80 >> xx)) ? fg : bg;
   14.67                                  if ((chr & ~0x1F) != 0xC0 || !(svga->attrregs[0x10] & 4)) 
   14.68 -                                        ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + 8) & 2047] = bg;
   14.69 +                                        p[8] = bg;
   14.70                                  else                  
   14.71 -                                        ((uint32_t *)buffer32->line[svga->displine])[(x + 32 + 8) & 2047] = (dat & 1) ? fg : bg;
   14.72 +                                        p[8] = (dat & 1) ? fg : bg;
   14.73 +                        }
   14.74 +                        svga->ma += 4; 
   14.75 +                        p += xinc;
   14.76 +                }
   14.77 +                svga->ma &= svga->vrammask;
   14.78 +        }
   14.79 +}
   14.80 +
   14.81 +void svga_render_2bpp_lowres(svga_t *svga)
   14.82 +{
   14.83 +        int changed_offset;
   14.84 +        
   14.85 +        if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
   14.86 +                changed_offset = (svga->ma << 1) >> 10;
   14.87 +        else
   14.88 +                changed_offset = ((svga->ma << 1) + 0x8000) >> 10;
   14.89 +                
   14.90 +        if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange)
   14.91 +        {
   14.92 +                int x;
   14.93 +                int offset = ((8 - svga->scrollcache) << 1) + 16;
   14.94 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
   14.95 +                
   14.96 +                if (svga->firstline_draw == 2000) 
   14.97 +                        svga->firstline_draw = svga->displine;
   14.98 +                svga->lastline_draw = svga->displine;
   14.99 +                       
  14.100 +                for (x = 0; x <= svga->hdisp; x += 16)
  14.101 +                {
  14.102 +                        uint8_t dat[2];
  14.103 +                        
  14.104 +                        if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
  14.105 +                        {
  14.106 +                                dat[0] = svga->vram[(svga->ma << 1) + 0x8000];
  14.107 +                                dat[1] = svga->vram[(svga->ma << 1) + 0x8004];
  14.108 +                        }
  14.109 +                        else
  14.110 +                        {
  14.111 +                                dat[0] = svga->vram[(svga->ma << 1)];
  14.112 +                                dat[1] = svga->vram[(svga->ma << 1) + 4];
  14.113                          }
  14.114                          svga->ma += 4; 
  14.115                          svga->ma &= svga->vrammask;
  14.116 +
  14.117 +                        p[0]  = p[1]  = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]];
  14.118 +                        p[2]  = p[3]  = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]];
  14.119 +                        p[4]  = p[5]  = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]];
  14.120 +                        p[6]  = p[7]  = svga->pallook[svga->egapal[dat[0] & 3]];
  14.121 +                        p[8]  = p[9]  = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]];
  14.122 +                        p[10] = p[11] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]];
  14.123 +                        p[12] = p[13] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]];
  14.124 +                        p[14] = p[15] = svga->pallook[svga->egapal[dat[1] & 3]];
  14.125 +
  14.126 +                        p += 16;
  14.127 +                }
  14.128 +        }
  14.129 +}
  14.130 +
  14.131 +void svga_render_2bpp_highres(svga_t *svga)
  14.132 +{
  14.133 +        int changed_offset;
  14.134 +        
  14.135 +        if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
  14.136 +                changed_offset = ((svga->ma << 1) | 0x8000) >> 10;
  14.137 +        else
  14.138 +                changed_offset = (svga->ma << 1) >> 10;
  14.139 +                                
  14.140 +        if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange)
  14.141 +        {
  14.142 +                int x;
  14.143 +                int offset = (8 - svga->scrollcache) + 24;
  14.144 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.145 +                
  14.146 +                if (svga->firstline_draw == 2000) 
  14.147 +                        svga->firstline_draw = svga->displine;
  14.148 +                svga->lastline_draw = svga->displine;
  14.149 +                       
  14.150 +                for (x = 0; x <= svga->hdisp; x += 8)
  14.151 +                {
  14.152 +                        uint8_t dat[2];
  14.153 +                        
  14.154 +                        if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
  14.155 +                        {
  14.156 +                                dat[0] = svga->vram[(svga->ma << 1) + 0x8000];
  14.157 +                                dat[1] = svga->vram[(svga->ma << 1) + 0x8004];
  14.158 +                        }
  14.159 +                        else
  14.160 +                        {
  14.161 +                                dat[0] = svga->vram[(svga->ma << 1)];
  14.162 +                                dat[1] = svga->vram[(svga->ma << 1) + 4];
  14.163 +                        }
  14.164 +                        svga->ma += 4; 
  14.165 +                        svga->ma &= svga->vrammask;
  14.166 +
  14.167 +                        p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]];
  14.168 +                        p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]];
  14.169 +                        p[2] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]];
  14.170 +                        p[3] = svga->pallook[svga->egapal[dat[0] & 3]];
  14.171 +                        p[4] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]];
  14.172 +                        p[5] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]];
  14.173 +                        p[6] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]];
  14.174 +                        p[7] = svga->pallook[svga->egapal[dat[1] & 3]];
  14.175 +                        
  14.176 +                        p += 8;
  14.177                  }
  14.178          }
  14.179  }
  14.180  
  14.181  void svga_render_4bpp_lowres(svga_t *svga)
  14.182  {
  14.183 -        int x, offset;
  14.184 -        uint8_t edat[4], dat;
  14.185 -        
  14.186 -        if (svga->firstline_draw == 2000) 
  14.187 -                svga->firstline_draw = svga->displine;
  14.188 -        svga->lastline_draw = svga->displine;
  14.189 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.190 +        {
  14.191 +                int x;
  14.192 +                int offset = ((8 - svga->scrollcache) << 1) + 16;
  14.193 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.194 +                
  14.195 +                if (svga->firstline_draw == 2000) 
  14.196 +                        svga->firstline_draw = svga->displine;
  14.197 +                svga->lastline_draw = svga->displine;
  14.198  
  14.199 -        offset = ((8 - svga->scrollcache) << 1) + 16;
  14.200 -        for (x = 0; x <= svga->hdisp; x += 16)
  14.201 -        {
  14.202 -                edat[0] = svga->vram[svga->ma];
  14.203 -                edat[1] = svga->vram[svga->ma | 0x1];
  14.204 -                edat[2] = svga->vram[svga->ma | 0x2];
  14.205 -                edat[3] = svga->vram[svga->ma | 0x3];
  14.206 -                svga->ma += 4; 
  14.207 -                svga->ma &= svga->vrammask;
  14.208 +                for (x = 0; x <= svga->hdisp; x += 16)
  14.209 +                {
  14.210 +                        uint8_t edat[4];
  14.211 +                        uint8_t dat;
  14.212  
  14.213 -                dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2);
  14.214 -                ((uint32_t *)buffer32->line[svga->displine])[x + 14 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 15 + offset] = svga->pallook[svga->egapal[dat & 0xf]];
  14.215 -                ((uint32_t *)buffer32->line[svga->displine])[x + 12 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 13 + offset] = svga->pallook[svga->egapal[dat >> 4]];
  14.216 -                dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2);
  14.217 -                ((uint32_t *)buffer32->line[svga->displine])[x + 10 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 11 + offset] = svga->pallook[svga->egapal[dat & 0xf]];
  14.218 -                ((uint32_t *)buffer32->line[svga->displine])[x +  8 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  9 + offset] = svga->pallook[svga->egapal[dat >> 4]];
  14.219 -                dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2);
  14.220 -                ((uint32_t *)buffer32->line[svga->displine])[x +  6 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  7 + offset] = svga->pallook[svga->egapal[dat & 0xf]];
  14.221 -                ((uint32_t *)buffer32->line[svga->displine])[x +  4 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  5 + offset] = svga->pallook[svga->egapal[dat >> 4]];
  14.222 -                dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
  14.223 -                ((uint32_t *)buffer32->line[svga->displine])[x +  2 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  3 + offset] = svga->pallook[svga->egapal[dat & 0xf]];
  14.224 -                ((uint32_t *)buffer32->line[svga->displine])[x      + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  1 + offset] = svga->pallook[svga->egapal[dat >> 4]];
  14.225 +                        *(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma]);                        
  14.226 +                        svga->ma += 4; 
  14.227 +                        svga->ma &= svga->vrammask;
  14.228 +
  14.229 +                        dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
  14.230 +                        p[0]  = p[1]  = svga->pallook[svga->egapal[dat >> 4]];
  14.231 +                        p[2]  = p[3]  = svga->pallook[svga->egapal[dat & 0xf]];
  14.232 +                        dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2);
  14.233 +                        p[4]  = p[5]  = svga->pallook[svga->egapal[dat >> 4]];
  14.234 +                        p[6]  = p[7]  = svga->pallook[svga->egapal[dat & 0xf]];
  14.235 +                        dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2);
  14.236 +                        p[8]  = p[9]  = svga->pallook[svga->egapal[dat >> 4]];
  14.237 +                        p[10] = p[11] = svga->pallook[svga->egapal[dat & 0xf]];
  14.238 +                        dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2);
  14.239 +                        p[12] = p[13] = svga->pallook[svga->egapal[dat >> 4]];
  14.240 +                        p[14] = p[15] = svga->pallook[svga->egapal[dat & 0xf]];
  14.241 +                                                
  14.242 +                        p += 16;
  14.243 +                }
  14.244          }
  14.245  }
  14.246  
  14.247  void svga_render_4bpp_highres(svga_t *svga)
  14.248  {
  14.249 -        int x, offset;
  14.250 -        uint8_t edat[4], dat;
  14.251 +        int changed_offset;
  14.252          
  14.253 -        if (svga->firstline_draw == 2000) 
  14.254 -                svga->firstline_draw = svga->displine;
  14.255 -        svga->lastline_draw = svga->displine;
  14.256 +        if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
  14.257 +                changed_offset = (svga->ma | 0x8000) >> 10;
  14.258 +        else
  14.259 +                changed_offset = svga->ma >> 10;
  14.260 +                
  14.261 +        if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->changedvram[changed_offset + 2] || svga->fullchange)
  14.262 +        {
  14.263 +                int x;
  14.264 +                int offset = (8 - svga->scrollcache) + 24;
  14.265 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.266 +        
  14.267 +                if (svga->firstline_draw == 2000) 
  14.268 +                        svga->firstline_draw = svga->displine;
  14.269 +                svga->lastline_draw = svga->displine;
  14.270 +                
  14.271 +                for (x = 0; x <= svga->hdisp; x += 8)
  14.272 +                {
  14.273 +                        uint8_t edat[4];
  14.274 +                        uint8_t dat;
  14.275  
  14.276 -        offset = (8 - svga->scrollcache) + 24;
  14.277 -        for (x = 0; x <= svga->hdisp; x += 8)
  14.278 -        {
  14.279 -                edat[0] = svga->vram[svga->ma];
  14.280 -                edat[1] = svga->vram[svga->ma | 0x1];
  14.281 -                edat[2] = svga->vram[svga->ma | 0x2];
  14.282 -                edat[3] = svga->vram[svga->ma | 0x3];
  14.283 -                svga->ma += 4;
  14.284 -                svga->ma &= svga->vrammask;
  14.285 +                        if (svga->sc & 1 && !(svga->crtc[0x17] & 1))                       
  14.286 +                                *(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma | 0x8000]);
  14.287 +                        else
  14.288 +                                *(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma]);
  14.289 +                        svga->ma += 4;
  14.290 +                        svga->ma &= svga->vrammask;
  14.291  
  14.292 -                dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2);
  14.293 -                ((uint32_t *)buffer32->line[svga->displine])[x + 7 + offset] = svga->pallook[svga->egapal[dat & 0xf]];
  14.294 -                ((uint32_t *)buffer32->line[svga->displine])[x + 6 + offset] = svga->pallook[svga->egapal[dat >> 4]];
  14.295 -                dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2);
  14.296 -                ((uint32_t *)buffer32->line[svga->displine])[x + 5 + offset] = svga->pallook[svga->egapal[dat & 0xf]];
  14.297 -                ((uint32_t *)buffer32->line[svga->displine])[x + 4 + offset] = svga->pallook[svga->egapal[dat >> 4]];
  14.298 -                dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2);
  14.299 -                ((uint32_t *)buffer32->line[svga->displine])[x + 3 + offset] = svga->pallook[svga->egapal[dat & 0xf]];
  14.300 -                ((uint32_t *)buffer32->line[svga->displine])[x + 2 + offset] = svga->pallook[svga->egapal[dat >> 4]];
  14.301 -                dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
  14.302 -                ((uint32_t *)buffer32->line[svga->displine])[x + 1 + offset] = svga->pallook[svga->egapal[dat & 0xf]];
  14.303 -                ((uint32_t *)buffer32->line[svga->displine])[x +     offset] = svga->pallook[svga->egapal[dat >> 4]];
  14.304 -        }
  14.305 -}
  14.306 -
  14.307 -void svga_render_2bpp_lowres(svga_t *svga)
  14.308 -{
  14.309 -        int x, offset;
  14.310 -        uint8_t edat[2], dat;
  14.311 -                
  14.312 -        if (svga->firstline_draw == 2000) 
  14.313 -                svga->firstline_draw = svga->displine;
  14.314 -        svga->lastline_draw = svga->displine;
  14.315 -        offset = ((8 - svga->scrollcache) << 1) + 16;
  14.316 -        
  14.317 -        /*Low res (320) only, though high res (640) should be possible*/
  14.318 -        for (x = 0; x <= svga->hdisp; x += 16)
  14.319 -        {
  14.320 -                if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
  14.321 -                {
  14.322 -                        edat[0] = svga->vram[(svga->ma << 1) + 0x8000];
  14.323 -                        edat[1] = svga->vram[(svga->ma << 1) + 0x8004];
  14.324 +                        dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
  14.325 +                        p[0] = svga->pallook[svga->egapal[dat >> 4]];
  14.326 +                        p[1] = svga->pallook[svga->egapal[dat & 0xf]];
  14.327 +                        dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2);
  14.328 +                        p[2] = svga->pallook[svga->egapal[dat >> 4]];
  14.329 +                        p[3] = svga->pallook[svga->egapal[dat & 0xf]];
  14.330 +                        dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2);
  14.331 +                        p[4] = svga->pallook[svga->egapal[dat >> 4]];
  14.332 +                        p[5] = svga->pallook[svga->egapal[dat & 0xf]];
  14.333 +                        dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2);
  14.334 +                        p[6] = svga->pallook[svga->egapal[dat >> 4]];
  14.335 +                        p[7] = svga->pallook[svga->egapal[dat & 0xf]];
  14.336 +                        
  14.337 +                        p += 8;
  14.338                  }
  14.339 -                else
  14.340 -                {
  14.341 -                        edat[0] = svga->vram[(svga->ma << 1)];
  14.342 -                        edat[1] = svga->vram[(svga->ma << 1) + 4];
  14.343 -                }
  14.344 -                svga->ma += 4; svga->ma &= svga->vrammask;
  14.345 -
  14.346 -                ((uint32_t *)buffer32->line[svga->displine])[x + 14 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 15 + offset] = svga->pallook[svga->egapal[edat[1] & 3]];
  14.347 -                ((uint32_t *)buffer32->line[svga->displine])[x + 12 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 13 + offset] = svga->pallook[svga->egapal[(edat[1] >> 2) & 3]];
  14.348 -                ((uint32_t *)buffer32->line[svga->displine])[x + 10 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 11 + offset] = svga->pallook[svga->egapal[(edat[1] >> 4) & 3]];
  14.349 -                ((uint32_t *)buffer32->line[svga->displine])[x +  8 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  9 + offset] = svga->pallook[svga->egapal[(edat[1] >> 6) & 3]];
  14.350 -                ((uint32_t *)buffer32->line[svga->displine])[x +  6 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  7 + offset] = svga->pallook[svga->egapal[edat[0] & 3]];
  14.351 -                ((uint32_t *)buffer32->line[svga->displine])[x +  4 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  5 + offset] = svga->pallook[svga->egapal[(edat[0] >> 2) & 3]];
  14.352 -                ((uint32_t *)buffer32->line[svga->displine])[x +  2 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  3 + offset] = svga->pallook[svga->egapal[(edat[0] >> 4) & 3]];
  14.353 -                ((uint32_t *)buffer32->line[svga->displine])[x +      offset] = ((uint32_t *)buffer32->line[svga->displine])[x +  1 + offset] = svga->pallook[svga->egapal[(edat[0] >> 6) & 3]];
  14.354          }
  14.355  }
  14.356  
  14.357  void svga_render_8bpp_lowres(svga_t *svga)
  14.358  {
  14.359 -        int x, offset;
  14.360 -        uint8_t edat[4];
  14.361 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.362 +        {
  14.363 +                int x;
  14.364 +                int offset = (8 - (svga->scrollcache & 6)) + 24;
  14.365 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.366                  
  14.367 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.368 -        {
  14.369                  if (svga->firstline_draw == 2000) 
  14.370                          svga->firstline_draw = svga->displine;
  14.371                  svga->lastline_draw = svga->displine;
  14.372 -
  14.373 -                offset = (8 - (svga->scrollcache & 6)) + 24;
  14.374                                                                  
  14.375                  for (x = 0; x <= svga->hdisp; x += 8)
  14.376                  {
  14.377 -                        edat[0] = svga->vram[svga->ma];
  14.378 -                        edat[1] = svga->vram[svga->ma | 0x1];
  14.379 -                        edat[2] = svga->vram[svga->ma | 0x2];
  14.380 -                        edat[3] = svga->vram[svga->ma | 0x3];
  14.381 -                        svga->ma += 4; 
  14.382 -                        svga->ma &= svga->vrammask;                       
  14.383 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 6 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 7 + offset] = svga->pallook[edat[3]];
  14.384 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 4 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 5 + offset] = svga->pallook[edat[2]];
  14.385 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 2 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 3 + offset] = svga->pallook[edat[1]];
  14.386 -                        ((uint32_t *)buffer32->line[svga->displine])[x +     offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 1 + offset] = svga->pallook[edat[0]];
  14.387 +                        uint32_t dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
  14.388 +                        
  14.389 +                        p[0] = p[1] = svga->pallook[dat & 0xff];
  14.390 +                        p[2] = p[3] = svga->pallook[(dat >> 8) & 0xff];
  14.391 +                        p[4] = p[5] = svga->pallook[(dat >> 16) & 0xff];
  14.392 +                        p[6] = p[7] = svga->pallook[(dat >> 24) & 0xff];
  14.393 +                        
  14.394 +                        svga->ma += 4;
  14.395 +                        p += 8;
  14.396                  }
  14.397 +                svga->ma &= svga->vrammask;
  14.398          }
  14.399  }
  14.400  
  14.401  void svga_render_8bpp_highres(svga_t *svga)
  14.402  {
  14.403 -        int x, offset;
  14.404 -        uint8_t edat[4];
  14.405 -                
  14.406 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.407 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.408          {
  14.409 +                int x;
  14.410 +                int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.411 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.412 +
  14.413                  if (svga->firstline_draw == 2000) 
  14.414                          svga->firstline_draw = svga->displine;
  14.415                  svga->lastline_draw = svga->displine;
  14.416 -
  14.417 -                offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.418                                                                  
  14.419                  for (x = 0; x <= svga->hdisp; x += 8)
  14.420                  {
  14.421 -                        edat[0] = svga->vram[svga->ma];
  14.422 -                        edat[1] = svga->vram[svga->ma | 0x1];
  14.423 -                        edat[2] = svga->vram[svga->ma | 0x2];
  14.424 -                        edat[3] = svga->vram[svga->ma | 0x3];
  14.425 -                        svga->ma += 4; 
  14.426 -                        svga->ma &= svga->vrammask;
  14.427 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 3 + offset] = svga->pallook[edat[3]];
  14.428 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 2 + offset] = svga->pallook[edat[2]];
  14.429 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 1 + offset] = svga->pallook[edat[1]];
  14.430 -                        ((uint32_t *)buffer32->line[svga->displine])[x +     offset] = svga->pallook[edat[0]];
  14.431 +                        uint32_t dat;
  14.432 +                        dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
  14.433 +                        p[0] = svga->pallook[dat & 0xff];
  14.434 +                        p[1] = svga->pallook[(dat >> 8) & 0xff];
  14.435 +                        p[2] = svga->pallook[(dat >> 16) & 0xff];
  14.436 +                        p[3] = svga->pallook[(dat >> 24) & 0xff];
  14.437 +
  14.438 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + 4) & svga->vrammask]);
  14.439 +                        p[4] = svga->pallook[dat & 0xff];
  14.440 +                        p[5] = svga->pallook[(dat >> 8) & 0xff];
  14.441 +                        p[6] = svga->pallook[(dat >> 16) & 0xff];
  14.442 +                        p[7] = svga->pallook[(dat >> 24) & 0xff];
  14.443                          
  14.444 -                        edat[0] = svga->vram[svga->ma];
  14.445 -                        edat[1] = svga->vram[svga->ma | 0x1];
  14.446 -                        edat[2] = svga->vram[svga->ma | 0x2];
  14.447 -                        edat[3] = svga->vram[svga->ma | 0x3];
  14.448 -                        svga->ma += 4; 
  14.449 -                        svga->ma &= svga->vrammask;
  14.450 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 7 + offset] = svga->pallook[edat[3]];
  14.451 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 6 + offset] = svga->pallook[edat[2]];
  14.452 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 5 + offset] = svga->pallook[edat[1]];
  14.453 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 4 + offset] = svga->pallook[edat[0]];
  14.454 +                        svga->ma += 8;
  14.455 +                        p += 8;
  14.456                  }
  14.457 +                svga->ma &= svga->vrammask;
  14.458          }
  14.459  }
  14.460  
  14.461  void svga_render_15bpp_lowres(svga_t *svga)
  14.462  {
  14.463 -        int x, offset;
  14.464 -        uint16_t fg, bg;
  14.465 -        
  14.466 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.467 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.468          {
  14.469 +                int x;
  14.470 +                int offset = (8 - (svga->scrollcache & 6)) + 24;
  14.471 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.472 +                
  14.473                  if (svga->firstline_draw == 2000) 
  14.474                          svga->firstline_draw = svga->displine;
  14.475                  svga->lastline_draw = svga->displine;
  14.476 -
  14.477 -                offset = (8 - (svga->scrollcache & 6)) + 24;
  14.478 -
  14.479 +               
  14.480                  for (x = 0; x <= svga->hdisp; x += 4)
  14.481                  {
  14.482 -                        fg = svga->vram[svga->ma]       | (svga->vram[svga->ma | 0x1] << 8);
  14.483 -                        bg = svga->vram[svga->ma | 0x2] | (svga->vram[svga->ma | 0x3] << 8);
  14.484 -                        svga->ma += 4; 
  14.485 -                        svga->ma &= svga->vrammask;
  14.486 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 2 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 3 + offset] = ((bg & 31) << 3) | (((bg >> 5) & 31) << 11) | (((bg >> 10) & 31) << 19);
  14.487 -                        ((uint32_t *)buffer32->line[svga->displine])[x +     offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 1 + offset] = ((fg & 31) << 3) | (((fg >> 5) & 31) << 11) | (((fg >> 10) & 31) << 19);
  14.488 +                        uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
  14.489 +
  14.490 +                        p[x]     = video_15to32[dat & 0xffff];
  14.491 +                        p[x + 1] = video_15to32[dat >> 16];
  14.492 +
  14.493 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
  14.494 +
  14.495 +                        p[x]     = video_15to32[dat & 0xffff];
  14.496 +                        p[x + 1] = video_15to32[dat >> 16];
  14.497                  }
  14.498 +                svga->ma += x << 1; 
  14.499 +                svga->ma &= svga->vrammask;
  14.500          }
  14.501  }
  14.502  
  14.503  void svga_render_15bpp_highres(svga_t *svga)
  14.504  {
  14.505 -        int x, offset;
  14.506 -        uint16_t fg, bg;
  14.507 -        
  14.508 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.509 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.510          {
  14.511 +                int x;
  14.512 +                int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.513 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.514 +
  14.515                  if (svga->firstline_draw == 2000) 
  14.516                          svga->firstline_draw = svga->displine;
  14.517                  svga->lastline_draw = svga->displine;
  14.518  
  14.519 -                offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.520 +                for (x = 0; x <= svga->hdisp; x += 8)
  14.521 +                {
  14.522 +                        uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
  14.523 +                        p[x]     = video_15to32[dat & 0xffff];
  14.524 +                        p[x + 1] = video_15to32[dat >> 16];
  14.525 +                        
  14.526 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
  14.527 +                        p[x + 2] = video_15to32[dat & 0xffff];
  14.528 +                        p[x + 3] = video_15to32[dat >> 16];
  14.529  
  14.530 -                for (x = 0; x <= svga->hdisp; x += 2)
  14.531 -                {
  14.532 -                        fg = svga->vram[svga->ma]       | (svga->vram[svga->ma | 0x1] << 8);
  14.533 -                        bg = svga->vram[svga->ma | 0x2] | (svga->vram[svga->ma | 0x3] << 8);
  14.534 -                        svga->ma += 4; 
  14.535 -                        svga->ma &= svga->vrammask;
  14.536 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 1 + offset] = ((bg & 31) << 3) | (((bg >> 5) & 31) << 11) | (((bg >> 10) & 31) << 19);
  14.537 -                        ((uint32_t *)buffer32->line[svga->displine])[x +     offset] = ((fg & 31) << 3) | (((fg >> 5) & 31) << 11) | (((fg >> 10) & 31) << 19);
  14.538 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 8) & svga->vrammask]);
  14.539 +                        p[x + 4] = video_15to32[dat & 0xffff];
  14.540 +                        p[x + 5] = video_15to32[dat >> 16];
  14.541 +
  14.542 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 12) & svga->vrammask]);
  14.543 +                        p[x + 6] = video_15to32[dat & 0xffff];
  14.544 +                        p[x + 7] = video_15to32[dat >> 16];
  14.545                  }
  14.546 +                svga->ma += x << 1; 
  14.547 +                svga->ma &= svga->vrammask;
  14.548          }
  14.549  }
  14.550  
  14.551  void svga_render_16bpp_lowres(svga_t *svga)
  14.552  {
  14.553 -        int x, offset;
  14.554 -        uint16_t fg, bg;
  14.555 -        
  14.556 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.557 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.558          {
  14.559 +                int x;
  14.560 +                int offset = (8 - (svga->scrollcache & 6)) + 24;
  14.561 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.562 +                
  14.563                  if (svga->firstline_draw == 2000) 
  14.564                          svga->firstline_draw = svga->displine;
  14.565                  svga->lastline_draw = svga->displine;
  14.566 -
  14.567 -                offset = (8 - (svga->scrollcache & 6)) + 24;
  14.568 -
  14.569 +               
  14.570                  for (x = 0; x <= svga->hdisp; x += 4)
  14.571                  {
  14.572 -                        fg = svga->vram[svga->ma]       | (svga->vram[svga->ma | 0x1] << 8);
  14.573 -                        bg = svga->vram[svga->ma | 0x2] | (svga->vram[svga->ma | 0x3] << 8);
  14.574 -                        svga->ma += 4; 
  14.575 -                        svga->ma &= svga->vrammask;
  14.576 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 2 + offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 3 + offset] = ((bg & 31) << 3) | (((bg >> 5) & 63) << 10) | (((bg >> 11) & 31) << 19);
  14.577 -                        ((uint32_t *)buffer32->line[svga->displine])[x +     offset] = ((uint32_t *)buffer32->line[svga->displine])[x + 1 + offset] = ((fg & 31) << 3) | (((fg >> 5) & 63) << 10) | (((fg >> 11) & 31) << 19);
  14.578 +                        uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
  14.579 +
  14.580 +                        p[x]     = video_16to32[dat & 0xffff];
  14.581 +                        p[x + 1] = video_16to32[dat >> 16];
  14.582 +
  14.583 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
  14.584 +
  14.585 +                        p[x]     = video_16to32[dat & 0xffff];
  14.586 +                        p[x + 1] = video_16to32[dat >> 16];
  14.587                  }
  14.588 +                svga->ma += x << 1; 
  14.589 +                svga->ma &= svga->vrammask;
  14.590          }
  14.591  }
  14.592  
  14.593  void svga_render_16bpp_highres(svga_t *svga)
  14.594  {
  14.595 -        int x, offset;
  14.596 -        uint16_t fg, bg;
  14.597 -        
  14.598 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.599 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.600          {
  14.601 +                int x;
  14.602 +                int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.603 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.604 +
  14.605                  if (svga->firstline_draw == 2000) 
  14.606                          svga->firstline_draw = svga->displine;
  14.607                  svga->lastline_draw = svga->displine;
  14.608  
  14.609 -                offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.610 -                                                                
  14.611 -                for (x = 0; x <= svga->hdisp; x += 2)
  14.612 +                for (x = 0; x <= svga->hdisp; x += 8)
  14.613                  {
  14.614 -                        fg = svga->vram[svga->ma]       | (svga->vram[svga->ma | 0x1] << 8);
  14.615 -                        bg = svga->vram[svga->ma | 0x2] | (svga->vram[svga->ma | 0x3] << 8);
  14.616 -                        svga->ma += 4; 
  14.617 -                        svga->ma &= svga->vrammask;
  14.618 -                        ((uint32_t *)buffer32->line[svga->displine])[x + 1 + offset] = ((bg & 31) << 3) | (((bg >> 5) & 63) << 10) | (((bg >> 11) & 31) << 19);
  14.619 -                        ((uint32_t *)buffer32->line[svga->displine])[x +     offset] = ((fg & 31) << 3) | (((fg >> 5) & 63) << 10) | (((fg >> 11) & 31) << 19);
  14.620 +                        uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
  14.621 +                        p[x]     = video_16to32[dat & 0xffff];
  14.622 +                        p[x + 1] = video_16to32[dat >> 16];
  14.623 +                        
  14.624 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
  14.625 +                        p[x + 2] = video_16to32[dat & 0xffff];
  14.626 +                        p[x + 3] = video_16to32[dat >> 16];
  14.627 +
  14.628 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 8) & svga->vrammask]);
  14.629 +                        p[x + 4] = video_16to32[dat & 0xffff];
  14.630 +                        p[x + 5] = video_16to32[dat >> 16];
  14.631 +
  14.632 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 12) & svga->vrammask]);
  14.633 +                        p[x + 6] = video_16to32[dat & 0xffff];
  14.634 +                        p[x + 7] = video_16to32[dat >> 16];
  14.635                  }
  14.636 +                svga->ma += x << 1; 
  14.637 +                svga->ma &= svga->vrammask;
  14.638          }
  14.639  }
  14.640  
  14.641 @@ -431,7 +540,7 @@
  14.642          int x, offset;
  14.643          uint32_t fg;
  14.644          
  14.645 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.646 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.647          {
  14.648                  if (svga->firstline_draw == 2000) 
  14.649                          svga->firstline_draw = svga->displine;
  14.650 @@ -451,24 +560,33 @@
  14.651  
  14.652  void svga_render_24bpp_highres(svga_t *svga)
  14.653  {
  14.654 -        int x, offset;
  14.655 -        uint32_t fg;
  14.656 -        
  14.657 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.658 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.659          {
  14.660 +                int x;
  14.661 +                int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.662 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.663 +                
  14.664                  if (svga->firstline_draw == 2000) 
  14.665                          svga->firstline_draw = svga->displine;
  14.666                  svga->lastline_draw = svga->displine;
  14.667  
  14.668 -                offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.669 -
  14.670 -                for (x = 0; x <= svga->hdisp; x++)
  14.671 +                for (x = 0; x <= svga->hdisp; x += 4)
  14.672                  {
  14.673 -                        fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
  14.674 -                        svga->ma += 3; 
  14.675 -                        svga->ma &= svga->vrammask;
  14.676 -                        ((uint32_t *)buffer32->line[svga->displine])[x + offset] = fg;
  14.677 +                        uint32_t dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
  14.678 +                        p[x] = dat & 0xffffff;
  14.679 +                        
  14.680 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + 3) & svga->vrammask]);
  14.681 +                        p[x + 1] = dat & 0xffffff;
  14.682 +                        
  14.683 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + 6) & svga->vrammask]);
  14.684 +                        p[x + 2] = dat & 0xffffff;
  14.685 +                        
  14.686 +                        dat = *(uint32_t *)(&svga->vram[(svga->ma + 9) & svga->vrammask]);
  14.687 +                        p[x + 3] = dat & 0xffffff;
  14.688 +                        
  14.689 +                        svga->ma += 12;
  14.690                  }
  14.691 +                svga->ma &= svga->vrammask;
  14.692          }
  14.693  }
  14.694  
  14.695 @@ -477,7 +595,7 @@
  14.696          int x, offset;
  14.697          uint32_t fg;
  14.698          
  14.699 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.700 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.701          {
  14.702                  if (svga->firstline_draw == 2000) 
  14.703                          svga->firstline_draw = svga->displine;
  14.704 @@ -495,26 +613,27 @@
  14.705          }
  14.706  }
  14.707  
  14.708 +/*72%
  14.709 +  91%*/
  14.710  void svga_render_32bpp_highres(svga_t *svga)
  14.711  {
  14.712 -        int x, offset;
  14.713 -        uint32_t fg;
  14.714 -        
  14.715 -        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || fullchange)
  14.716 +        if (svga->changedvram[svga->ma >> 10] || svga->changedvram[(svga->ma >> 10) + 1] || svga->changedvram[(svga->ma >> 10) + 2] || svga->fullchange)
  14.717          {
  14.718 +                int x;
  14.719 +                int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.720 +                uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
  14.721 +                
  14.722                  if (svga->firstline_draw == 2000) 
  14.723                          svga->firstline_draw = svga->displine;
  14.724                  svga->lastline_draw = svga->displine;
  14.725  
  14.726 -                offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
  14.727 -
  14.728                  for (x = 0; x <= svga->hdisp; x++)
  14.729                  {
  14.730 -                        fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
  14.731 -                        svga->ma += 4; 
  14.732 -                        svga->ma &= svga->vrammask;
  14.733 -                        ((uint32_t *)buffer32->line[svga->displine])[x + offset] = fg;
  14.734 +                        uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vrammask]);
  14.735 +                        p[x] = dat & 0xffffff;
  14.736                  }
  14.737 +                svga->ma += 4; 
  14.738 +                svga->ma &= svga->vrammask;
  14.739          }
  14.740  }
  14.741  
    15.1 --- a/src/vid_svga_render.h	Sun Jul 07 13:31:32 2013 +0100
    15.2 +++ b/src/vid_svga_render.h	Tue Jul 09 19:30:53 2013 +0100
    15.3 @@ -14,6 +14,7 @@
    15.4  void svga_render_text_80(svga_t *svga);
    15.5  
    15.6  void svga_render_2bpp_lowres(svga_t *svga);
    15.7 +void svga_render_2bpp_highres(svga_t *svga);
    15.8  void svga_render_4bpp_lowres(svga_t *svga);
    15.9  void svga_render_4bpp_highres(svga_t *svga);
   15.10  void svga_render_8bpp_lowres(svga_t *svga);
    16.1 --- a/src/vid_tvga.c	Sun Jul 07 13:31:32 2013 +0100
    16.2 +++ b/src/vid_tvga.c	Tue Jul 09 19:30:53 2013 +0100
    16.3 @@ -140,7 +140,7 @@
    16.4                  {
    16.5                          if (svga->crtcreg < 0xE || svga->crtcreg > 0x10)
    16.6                          {
    16.7 -                                fullchange = changeframecount;
    16.8 +                                svga->fullchange = changeframecount;
    16.9                                  svga_recalctimings(svga);
   16.10                          }
   16.11                  }
    17.1 --- a/src/vid_vga.c	Sun Jul 07 13:31:32 2013 +0100
    17.2 +++ b/src/vid_vga.c	Tue Jul 09 19:30:53 2013 +0100
    17.3 @@ -36,7 +36,7 @@
    17.4                  {
    17.5                          if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
    17.6                          {
    17.7 -                                fullchange = changeframecount;
    17.8 +                                svga->fullchange = changeframecount;
    17.9                                  svga_recalctimings(svga);
   17.10                          }
   17.11                  }
    18.1 --- a/src/video.c	Sun Jul 07 13:31:32 2013 +0100
    18.2 +++ b/src/video.c	Tue Jul 09 19:30:53 2013 +0100
    18.3 @@ -1,3 +1,4 @@
    18.4 +#include <stdlib.h>
    18.5  #include <stdio.h>
    18.6  #include <math.h>
    18.7  #include "ibm.h"
    18.8 @@ -30,6 +31,8 @@
    18.9  #include "vid_tvga.h"
   18.10  #include "vid_vga.h"
   18.11  
   18.12 +uint32_t *video_15to32, *video_16to32;
   18.13 +
   18.14  int egareads=0,egawrites=0;
   18.15  int changeframecount=2;
   18.16  
   18.17 @@ -380,9 +383,21 @@
   18.18  //                        printf("Edat %i,%i now %02X\n",c,d,edatlookup[c][d]);
   18.19                  }
   18.20          }
   18.21 +
   18.22 +        video_15to32 = malloc(4 * 65536);
   18.23 +        for (c = 0; c < 65536; c++)
   18.24 +                video_15to32[c] = ((c & 31) << 3) | (((c >> 5) & 31) << 11) | (((c >> 10) & 31) << 19);
   18.25 +
   18.26 +        video_16to32 = malloc(4 * 65536);
   18.27 +        for (c = 0; c < 65536; c++)
   18.28 +                video_16to32[c] = ((c & 31) << 3) | (((c >> 5) & 63) << 10) | (((c >> 11) & 31) << 19);
   18.29 +
   18.30  }
   18.31  
   18.32  void closevideo()
   18.33  {
   18.34 +        free(video_15to32);
   18.35 +        free(video_16to32);
   18.36          destroy_bitmap(buffer);
   18.37 +        destroy_bitmap(buffer32);
   18.38  }
    19.1 --- a/src/video.h	Sun Jul 07 13:31:32 2013 +0100
    19.2 +++ b/src/video.h	Tue Jul 09 19:30:53 2013 +0100
    19.3 @@ -19,6 +19,8 @@
    19.4  extern uint8_t fontdat[256][8];
    19.5  extern uint8_t fontdatm[256][16];
    19.6  
    19.7 +extern uint32_t *video_15to32, *video_16to32;
    19.8 +
    19.9  extern int xsize,ysize;
   19.10  
   19.11  typedef struct