PCem

view src/vid_svga_render.c @ 135:abd5259486c3

Mach64 changes : No longer implements CRTC registers beyond 0x18 - NT no longer detects ET4000. RGBA8888 mode supported - fixes NT 32-bit colour mode. Bit order controls supported for CPU 1-bit data - fixes NT 24-bit colour mode.
author TomW
date Thu Jul 24 21:30:17 2014 +0100
parents 2c16e2e509d0
children
line source
1 #include "ibm.h"
2 #include "mem.h"
3 #include "video.h"
4 #include "vid_svga.h"
5 #include "vid_svga_render.h"
7 void svga_render_blank(svga_t *svga)
8 {
9 int x, xx;
11 if (svga->firstline_draw == 2000)
12 svga->firstline_draw = svga->displine;
13 svga->lastline_draw = svga->displine;
15 for (x = 0; x < svga->hdisp; x++)
16 {
17 switch (svga->seqregs[1] & 9)
18 {
19 case 0:
20 for (xx = 0; xx < 9; xx++) ((uint32_t *)buffer32->line[svga->displine])[(x * 9) + xx + 32] = 0;
21 break;
22 case 1:
23 for (xx = 0; xx < 8; xx++) ((uint32_t *)buffer32->line[svga->displine])[(x * 8) + xx + 32] = 0;
24 break;
25 case 8:
26 for (xx = 0; xx < 18; xx++) ((uint32_t *)buffer32->line[svga->displine])[(x * 18) + xx + 32] = 0;
27 break;
28 case 9:
29 for (xx = 0; xx < 16; xx++) ((uint32_t *)buffer32->line[svga->displine])[(x * 16) + xx + 32] = 0;
30 break;
31 }
32 }
33 }
35 void svga_render_text_40(svga_t *svga)
36 {
37 if (svga->firstline_draw == 2000)
38 svga->firstline_draw = svga->displine;
39 svga->lastline_draw = svga->displine;
41 if (svga->fullchange)
42 {
43 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[32];
44 int x, xx;
45 int drawcursor;
46 uint8_t chr, attr, dat;
47 uint32_t charaddr;
48 int fg, bg;
49 int xinc = (svga->seqregs[1] & 1) ? 16 : 18;
51 for (x = 0; x < svga->hdisp; x += xinc)
52 {
53 drawcursor = ((svga->ma == svga->ca) && svga->con && svga->cursoron);
54 chr = svga->vram[(svga->ma << 1) & svga->vrammask];
55 attr = svga->vram[((svga->ma << 1) + 4) & svga->vrammask];
56 if (attr & 8) charaddr = svga->charsetb + (chr * 128);
57 else charaddr = svga->charseta + (chr * 128);
59 if (drawcursor)
60 {
61 bg = svga->pallook[svga->egapal[attr & 15]];
62 fg = svga->pallook[svga->egapal[attr >> 4]];
63 }
64 else
65 {
66 fg = svga->pallook[svga->egapal[attr & 15]];
67 bg = svga->pallook[svga->egapal[attr >> 4]];
68 if (attr & 0x80 && svga->attrregs[0x10] & 8)
69 {
70 bg = svga->pallook[svga->egapal[(attr >> 4) & 7]];
71 if (svga->blink & 16)
72 fg = bg;
73 }
74 }
76 dat = svga->vram[charaddr + (svga->sc << 2)];
77 if (svga->seqregs[1] & 1)
78 {
79 for (xx = 0; xx < 16; xx += 2)
80 p[xx] = p[xx + 1] = (dat & (0x80 >> (xx >> 1))) ? fg : bg;
81 }
82 else
83 {
84 for (xx = 0; xx < 16; xx += 2)
85 p[xx] = p[xx + 1] = (dat & (0x80 >> (xx >> 1))) ? fg : bg;
86 if ((chr & ~0x1F) != 0xC0 || !(svga->attrregs[0x10] & 4))
87 p[16] = p[17] = bg;
88 else
89 p[16] = p[17] = (dat & 1) ? fg : bg;
90 }
91 svga->ma += 4;
92 p += xinc;
93 }
94 svga->ma &= svga->vrammask;
95 }
96 }
98 void svga_render_text_80(svga_t *svga)
99 {
100 if (svga->firstline_draw == 2000)
101 svga->firstline_draw = svga->displine;
102 svga->lastline_draw = svga->displine;
104 if (svga->fullchange)
105 {
106 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[32];
107 int x, xx;
108 int drawcursor;
109 uint8_t chr, attr, dat;
110 uint32_t charaddr;
111 int fg, bg;
112 int xinc = (svga->seqregs[1] & 1) ? 8 : 9;
114 for (x = 0; x < svga->hdisp; x += xinc)
115 {
116 drawcursor = ((svga->ma == svga->ca) && svga->con && svga->cursoron);
117 chr = svga->vram[(svga->ma << 1) & svga->vrammask];
118 attr = svga->vram[((svga->ma << 1) + 4) & svga->vrammask];
119 if (attr & 8) charaddr = svga->charsetb + (chr * 128);
120 else charaddr = svga->charseta + (chr * 128);
122 if (drawcursor)
123 {
124 bg = svga->pallook[svga->egapal[attr & 15]];
125 fg = svga->pallook[svga->egapal[attr >> 4]];
126 }
127 else
128 {
129 fg = svga->pallook[svga->egapal[attr & 15]];
130 bg = svga->pallook[svga->egapal[attr >> 4]];
131 if (attr & 0x80 && svga->attrregs[0x10] & 8)
132 {
133 bg = svga->pallook[svga->egapal[(attr >> 4) & 7]];
134 if (svga->blink & 16)
135 fg = bg;
136 }
137 }
139 dat = svga->vram[charaddr + (svga->sc << 2)];
140 if (svga->seqregs[1] & 1)
141 {
142 for (xx = 0; xx < 8; xx++)
143 p[xx] = (dat & (0x80 >> xx)) ? fg : bg;
144 }
145 else
146 {
147 for (xx = 0; xx < 8; xx++)
148 p[xx] = (dat & (0x80 >> xx)) ? fg : bg;
149 if ((chr & ~0x1F) != 0xC0 || !(svga->attrregs[0x10] & 4))
150 p[8] = bg;
151 else
152 p[8] = (dat & 1) ? fg : bg;
153 }
154 svga->ma += 4;
155 p += xinc;
156 }
157 svga->ma &= svga->vrammask;
158 }
159 }
161 void svga_render_2bpp_lowres(svga_t *svga)
162 {
163 int changed_offset;
165 if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
166 changed_offset = (svga->ma << 1) >> 12;
167 else
168 changed_offset = ((svga->ma << 1) + 0x8000) >> 12;
170 if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange)
171 {
172 int x;
173 int offset = ((8 - svga->scrollcache) << 1) + 16;
174 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
176 if (svga->firstline_draw == 2000)
177 svga->firstline_draw = svga->displine;
178 svga->lastline_draw = svga->displine;
180 for (x = 0; x <= svga->hdisp; x += 16)
181 {
182 uint8_t dat[2];
184 if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
185 {
186 dat[0] = svga->vram[(svga->ma << 1) + 0x8000];
187 dat[1] = svga->vram[(svga->ma << 1) + 0x8004];
188 }
189 else
190 {
191 dat[0] = svga->vram[(svga->ma << 1)];
192 dat[1] = svga->vram[(svga->ma << 1) + 4];
193 }
194 svga->ma += 4;
195 svga->ma &= svga->vrammask;
197 p[0] = p[1] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]];
198 p[2] = p[3] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]];
199 p[4] = p[5] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]];
200 p[6] = p[7] = svga->pallook[svga->egapal[dat[0] & 3]];
201 p[8] = p[9] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]];
202 p[10] = p[11] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]];
203 p[12] = p[13] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]];
204 p[14] = p[15] = svga->pallook[svga->egapal[dat[1] & 3]];
206 p += 16;
207 }
208 }
209 }
211 void svga_render_2bpp_highres(svga_t *svga)
212 {
213 int changed_offset;
215 if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
216 changed_offset = ((svga->ma << 1) | 0x8000) >> 12;
217 else
218 changed_offset = (svga->ma << 1) >> 12;
220 if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange)
221 {
222 int x;
223 int offset = (8 - svga->scrollcache) + 24;
224 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
226 if (svga->firstline_draw == 2000)
227 svga->firstline_draw = svga->displine;
228 svga->lastline_draw = svga->displine;
230 for (x = 0; x <= svga->hdisp; x += 8)
231 {
232 uint8_t dat[2];
234 if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
235 {
236 dat[0] = svga->vram[(svga->ma << 1) + 0x8000];
237 dat[1] = svga->vram[(svga->ma << 1) + 0x8004];
238 }
239 else
240 {
241 dat[0] = svga->vram[(svga->ma << 1)];
242 dat[1] = svga->vram[(svga->ma << 1) + 4];
243 }
244 svga->ma += 4;
245 svga->ma &= svga->vrammask;
247 p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]];
248 p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]];
249 p[2] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]];
250 p[3] = svga->pallook[svga->egapal[dat[0] & 3]];
251 p[4] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]];
252 p[5] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]];
253 p[6] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]];
254 p[7] = svga->pallook[svga->egapal[dat[1] & 3]];
256 p += 8;
257 }
258 }
259 }
261 void svga_render_4bpp_lowres(svga_t *svga)
262 {
263 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
264 {
265 int x;
266 int offset = ((8 - svga->scrollcache) << 1) + 16;
267 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
269 if (svga->firstline_draw == 2000)
270 svga->firstline_draw = svga->displine;
271 svga->lastline_draw = svga->displine;
273 for (x = 0; x <= svga->hdisp; x += 16)
274 {
275 uint8_t edat[4];
276 uint8_t dat;
278 *(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma]);
279 svga->ma += 4;
280 svga->ma &= svga->vrammask;
282 dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
283 p[0] = p[1] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
284 p[2] = p[3] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
285 dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2);
286 p[4] = p[5] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
287 p[6] = p[7] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
288 dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2);
289 p[8] = p[9] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
290 p[10] = p[11] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
291 dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2);
292 p[12] = p[13] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
293 p[14] = p[15] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
295 p += 16;
296 }
297 }
298 }
300 void svga_render_4bpp_highres(svga_t *svga)
301 {
302 int changed_offset;
304 if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
305 changed_offset = (svga->ma | 0x8000) >> 12;
306 else
307 changed_offset = svga->ma >> 12;
309 if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange)
310 {
311 int x;
312 int offset = (8 - svga->scrollcache) + 24;
313 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
315 if (svga->firstline_draw == 2000)
316 svga->firstline_draw = svga->displine;
317 svga->lastline_draw = svga->displine;
319 for (x = 0; x <= svga->hdisp; x += 8)
320 {
321 uint8_t edat[4];
322 uint8_t dat;
324 if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
325 *(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma | 0x8000]);
326 else
327 *(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma]);
328 svga->ma += 4;
329 svga->ma &= svga->vrammask;
331 dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
332 p[0] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
333 p[1] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
334 dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2);
335 p[2] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
336 p[3] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
337 dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2);
338 p[4] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
339 p[5] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
340 dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2);
341 p[6] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
342 p[7] = svga->pallook[svga->egapal[dat & svga->plane_mask]];
344 p += 8;
345 }
346 }
347 }
349 void svga_render_8bpp_lowres(svga_t *svga)
350 {
351 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
352 {
353 int x;
354 int offset = (8 - (svga->scrollcache & 6)) + 24;
355 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
357 if (svga->firstline_draw == 2000)
358 svga->firstline_draw = svga->displine;
359 svga->lastline_draw = svga->displine;
361 for (x = 0; x <= svga->hdisp; x += 8)
362 {
363 uint32_t dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
365 p[0] = p[1] = svga->pallook[dat & 0xff];
366 p[2] = p[3] = svga->pallook[(dat >> 8) & 0xff];
367 p[4] = p[5] = svga->pallook[(dat >> 16) & 0xff];
368 p[6] = p[7] = svga->pallook[(dat >> 24) & 0xff];
370 svga->ma += 4;
371 p += 8;
372 }
373 svga->ma &= svga->vrammask;
374 }
375 }
377 void svga_render_8bpp_highres(svga_t *svga)
378 {
379 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
380 {
381 int x;
382 int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
383 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
385 if (svga->firstline_draw == 2000)
386 svga->firstline_draw = svga->displine;
387 svga->lastline_draw = svga->displine;
389 for (x = 0; x <= svga->hdisp; x += 8)
390 {
391 uint32_t dat;
392 dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
393 p[0] = svga->pallook[dat & 0xff];
394 p[1] = svga->pallook[(dat >> 8) & 0xff];
395 p[2] = svga->pallook[(dat >> 16) & 0xff];
396 p[3] = svga->pallook[(dat >> 24) & 0xff];
398 dat = *(uint32_t *)(&svga->vram[(svga->ma + 4) & svga->vrammask]);
399 p[4] = svga->pallook[dat & 0xff];
400 p[5] = svga->pallook[(dat >> 8) & 0xff];
401 p[6] = svga->pallook[(dat >> 16) & 0xff];
402 p[7] = svga->pallook[(dat >> 24) & 0xff];
404 svga->ma += 8;
405 p += 8;
406 }
407 svga->ma &= svga->vrammask;
408 }
409 }
411 void svga_render_15bpp_lowres(svga_t *svga)
412 {
413 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
414 {
415 int x;
416 int offset = (8 - (svga->scrollcache & 6)) + 24;
417 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
419 if (svga->firstline_draw == 2000)
420 svga->firstline_draw = svga->displine;
421 svga->lastline_draw = svga->displine;
423 for (x = 0; x <= svga->hdisp; x += 4)
424 {
425 uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
427 p[x] = video_15to32[dat & 0xffff];
428 p[x + 1] = video_15to32[dat >> 16];
430 dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
432 p[x] = video_15to32[dat & 0xffff];
433 p[x + 1] = video_15to32[dat >> 16];
434 }
435 svga->ma += x << 1;
436 svga->ma &= svga->vrammask;
437 }
438 }
440 void svga_render_15bpp_highres(svga_t *svga)
441 {
442 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
443 {
444 int x;
445 int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
446 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
448 if (svga->firstline_draw == 2000)
449 svga->firstline_draw = svga->displine;
450 svga->lastline_draw = svga->displine;
452 for (x = 0; x <= svga->hdisp; x += 8)
453 {
454 uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
455 p[x] = video_15to32[dat & 0xffff];
456 p[x + 1] = video_15to32[dat >> 16];
458 dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
459 p[x + 2] = video_15to32[dat & 0xffff];
460 p[x + 3] = video_15to32[dat >> 16];
462 dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 8) & svga->vrammask]);
463 p[x + 4] = video_15to32[dat & 0xffff];
464 p[x + 5] = video_15to32[dat >> 16];
466 dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 12) & svga->vrammask]);
467 p[x + 6] = video_15to32[dat & 0xffff];
468 p[x + 7] = video_15to32[dat >> 16];
469 }
470 svga->ma += x << 1;
471 svga->ma &= svga->vrammask;
472 }
473 }
475 void svga_render_16bpp_lowres(svga_t *svga)
476 {
477 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
478 {
479 int x;
480 int offset = (8 - (svga->scrollcache & 6)) + 24;
481 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
483 if (svga->firstline_draw == 2000)
484 svga->firstline_draw = svga->displine;
485 svga->lastline_draw = svga->displine;
487 for (x = 0; x <= svga->hdisp; x += 4)
488 {
489 uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
491 p[x] = video_16to32[dat & 0xffff];
492 p[x + 1] = video_16to32[dat >> 16];
494 dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
496 p[x] = video_16to32[dat & 0xffff];
497 p[x + 1] = video_16to32[dat >> 16];
498 }
499 svga->ma += x << 1;
500 svga->ma &= svga->vrammask;
501 }
502 }
504 void svga_render_16bpp_highres(svga_t *svga)
505 {
506 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
507 {
508 int x;
509 int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
510 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
512 if (svga->firstline_draw == 2000)
513 svga->firstline_draw = svga->displine;
514 svga->lastline_draw = svga->displine;
516 for (x = 0; x <= svga->hdisp; x += 8)
517 {
518 uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
519 p[x] = video_16to32[dat & 0xffff];
520 p[x + 1] = video_16to32[dat >> 16];
522 dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
523 p[x + 2] = video_16to32[dat & 0xffff];
524 p[x + 3] = video_16to32[dat >> 16];
526 dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 8) & svga->vrammask]);
527 p[x + 4] = video_16to32[dat & 0xffff];
528 p[x + 5] = video_16to32[dat >> 16];
530 dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 12) & svga->vrammask]);
531 p[x + 6] = video_16to32[dat & 0xffff];
532 p[x + 7] = video_16to32[dat >> 16];
533 }
534 svga->ma += x << 1;
535 svga->ma &= svga->vrammask;
536 }
537 }
539 void svga_render_24bpp_lowres(svga_t *svga)
540 {
541 int x, offset;
542 uint32_t fg;
544 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
545 {
546 if (svga->firstline_draw == 2000)
547 svga->firstline_draw = svga->displine;
548 svga->lastline_draw = svga->displine;
550 offset = (8 - (svga->scrollcache & 6)) + 24;
552 for (x = 0; x <= svga->hdisp; x++)
553 {
554 fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
555 svga->ma += 3;
556 svga->ma &= svga->vrammask;
557 ((uint32_t *)buffer32->line[svga->displine])[(x << 1) + offset] = ((uint32_t *)buffer32->line[svga->displine])[(x << 1) + 1 + offset] = fg;
558 }
559 }
560 }
562 void svga_render_24bpp_highres(svga_t *svga)
563 {
564 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
565 {
566 int x;
567 int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
568 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
570 if (svga->firstline_draw == 2000)
571 svga->firstline_draw = svga->displine;
572 svga->lastline_draw = svga->displine;
574 for (x = 0; x <= svga->hdisp; x += 4)
575 {
576 uint32_t dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
577 p[x] = dat & 0xffffff;
579 dat = *(uint32_t *)(&svga->vram[(svga->ma + 3) & svga->vrammask]);
580 p[x + 1] = dat & 0xffffff;
582 dat = *(uint32_t *)(&svga->vram[(svga->ma + 6) & svga->vrammask]);
583 p[x + 2] = dat & 0xffffff;
585 dat = *(uint32_t *)(&svga->vram[(svga->ma + 9) & svga->vrammask]);
586 p[x + 3] = dat & 0xffffff;
588 svga->ma += 12;
589 }
590 svga->ma &= svga->vrammask;
591 }
592 }
594 void svga_render_32bpp_lowres(svga_t *svga)
595 {
596 int x, offset;
597 uint32_t fg;
599 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
600 {
601 if (svga->firstline_draw == 2000)
602 svga->firstline_draw = svga->displine;
603 svga->lastline_draw = svga->displine;
605 offset = (8 - (svga->scrollcache & 6)) + 24;
607 for (x = 0; x <= svga->hdisp; x++)
608 {
609 fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
610 svga->ma += 4;
611 svga->ma &= svga->vrammask;
612 ((uint32_t *)buffer32->line[svga->displine])[(x << 1) + offset] = ((uint32_t *)buffer32->line[svga->displine])[(x << 1) + 1 + offset] = fg;
613 }
614 }
615 }
617 /*72%
618 91%*/
619 void svga_render_32bpp_highres(svga_t *svga)
620 {
621 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange)
622 {
623 int x;
624 int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
625 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
627 if (svga->firstline_draw == 2000)
628 svga->firstline_draw = svga->displine;
629 svga->lastline_draw = svga->displine;
631 for (x = 0; x <= svga->hdisp; x++)
632 {
633 uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vrammask]);
634 p[x] = dat & 0xffffff;
635 }
636 svga->ma += 4;
637 svga->ma &= svga->vrammask;
638 }
639 }
641 void svga_render_RGBA8888_highres(svga_t *svga)
642 {
643 if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange)
644 {
645 int x;
646 int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
647 uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
649 if (svga->firstline_draw == 2000)
650 svga->firstline_draw = svga->displine;
651 svga->lastline_draw = svga->displine;
653 for (x = 0; x <= svga->hdisp; x++)
654 {
655 uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vrammask]);
656 p[x] = dat >> 8;
657 }
658 svga->ma += 4;
659 svga->ma &= svga->vrammask;
660 }
661 }