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(¶dise->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
