2 * Common source code project -> FM-7 -> Display -> Vram access
3 * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
5 * Sep 27, 2015 : Split from display.cpp .
10 #include "fm7_display.h"
12 #include "../hd46505.h"
15 extern config_t config;
19 void DISPLAY::draw_screen()
21 //#if !defined(_FM77AV_VARIANTS)
26 void DISPLAY::draw_screen2()
30 scrntype_t *p, *pp, *p2;
35 uint32_t yoff_d1, yoff_d2;
36 uint16_t wx_begin, wx_end, wy_low, wy_high;
37 bool scan_line = config.scan_line;
38 bool ff = force_update;
40 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
42 wx_begin = window_xbegin;
45 wy_high = window_high;
46 bool _flag = window_opened;
47 if((wx_begin < wx_end) && (wy_low < wy_high)) {
50 window_opened = false;
52 if(_flag != window_opened) {
53 vram_wrote_shadow = true;
57 // frame_skip_count_draw++;
58 #if defined(_FM77AV_VARIANTS)
62 //if(!(vram_wrote_shadow)) return;
63 yoff_d1 = yoff_d2 = offset_point;
68 switch(display_mode) {
69 case DISPLAY_MODE_8_200L:
73 case DISPLAY_MODE_8_400L:
82 # if !defined(FIXED_FRAMEBUFFER_SIZE)
83 emu->set_vm_screen_size(xpixels, ylines, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
85 emu->set_vm_screen_lines(ylines);
89 #if !defined(FIXED_FRAMEBUFFER_SIZE)
90 for(y = 0; y < ylines; y += 8) {
91 for(yy = 0; yy < 8; yy++) {
92 vram_draw_table[y + yy] = false;
93 ppp = emu->get_screen_buffer(y + yy);
94 if(ppp != NULL) memset(ppp, 0x00, xpixels * sizeof(scrntype_t));
98 for(y = 0; y < 400; y += 8) {
99 for(yy = 0; yy < 8; yy++) {
100 vram_draw_table[y + yy] = false;
101 ppp = emu->get_screen_buffer(y + yy);
102 if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype_t));
108 crt_flag_bak = crt_flag;
111 crt_flag_bak = crt_flag;
112 if(!(vram_wrote_shadow | ff)) return;
113 vram_wrote_shadow = false;
114 if(display_mode == DISPLAY_MODE_8_200L) {
115 _render_command_data_t cmd;
119 #if defined(USE_GREEN_DISPLAY)
120 if(use_green_monitor) {
121 cmd.palette = dpalette_pixel_green;
123 cmd.palette = dpalette_pixel;
126 cmd.palette = dpalette_pixel;
128 for(int i = 0; i < 3; i++) {
129 cmd.data[i] = gvram_shadow;
130 cmd.baseaddress[i] = i * 0x4000;
131 cmd.voffset[i] = yoff;
132 cmd.is_render[i] = false;
134 if(!multimode_dispflags[0]) cmd.is_render[0] = true;
135 if(!multimode_dispflags[1]) cmd.is_render[1] = true;
136 if(!multimode_dispflags[2]) cmd.is_render[2] = true;
137 cmd.bit_trans_table[0] = (_bit_trans_table_t*)(&(bit_trans_table_2[0][0])); // B
138 cmd.bit_trans_table[1] = (_bit_trans_table_t*)(&(bit_trans_table_1[0][0])); // R
139 cmd.bit_trans_table[2] = (_bit_trans_table_t*)(&(bit_trans_table_0[0][0])); // G
141 cmd.addrmask = 0x3fff;
142 cmd.addrmask2 = 0x3fff;
145 cmd.render_width = 80;
146 for(y = 0; y < 200; y += 8) {
147 for(yy = 0; yy < 8; yy++) {
149 if(!(vram_draw_table[y + yy] | ff)) continue;
150 vram_draw_table[y + yy] = false;
151 #if !defined(FIXED_FRAMEBUFFER_SIZE)
152 p = emu->get_screen_buffer(y + yy);
155 p = emu->get_screen_buffer((y + yy) * 2);
156 p2 = emu->get_screen_buffer((y + yy) * 2 + 1);
158 if(p == NULL) continue;
159 yoff = (y + yy) * 80;
160 for(int i = 0; i < 3; i++) {
161 cmd.voffset[i] = yoff;
164 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
166 dpage = vram_display_block;
167 bool window_inv = false;
168 if(window_opened && (wy_low <= (y + yy)) && (wy_high > (y + yy))) {
169 if((wx_begin > 0) && (wx_begin < wx_end) && (wx_begin < 80)) {
174 if(_wend >= 80) _wend = 80;
175 cmd.render_width = wx_begin;
176 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
177 #if defined(_FM77AV_VARIANTS)
178 if(display_page_bak == 1) yoff_d += 0xc000;
180 for(int i = 0; i < 3; i++) {
181 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
183 if(cmd.render_width > 0) {
184 if(cmd.render_width > 80) cmd.render_width = 80;
186 Render8Colors_Line(&cmd, p, p2, scan_line);
189 cmd.begin_pos = wx_begin;
190 cmd.render_width = _wend - wx_begin;
191 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
192 #if defined(_FM77AV_VARIANTS)
193 if(display_page_bak == 1) yoff_d += 0xc000;
195 for(int i = 0; i < 3; i++) {
196 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
198 if(cmd.render_width > 0) {
199 if(cmd.render_width > 80) cmd.render_width = 80;
201 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), &(p2[cmd.begin_pos * 8]) , scan_line);
204 cmd.begin_pos = wx_end;
205 cmd.render_width = 80 - wx_end;
206 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
207 #if defined(_FM77AV_VARIANTS)
208 if(display_page_bak == 1) yoff_d += 0xc000;
210 for(int i = 0; i < 3; i++) {
211 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
213 if(cmd.render_width > 0) {
214 if(cmd.render_width > 80) cmd.render_width = 80;
216 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), &(p2[cmd.begin_pos * 8]), scan_line);
218 #if defined(FIXED_FRAMEBUFFER_SIZE)
219 //CopyDrawnData(p, p2, 80, scan_line);
222 } else if((wx_begin <= 0) && (wx_begin < wx_end) && (wx_end >= 0)) {
225 cmd.render_width = wx_end;
226 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
227 #if defined(_FM77AV_VARIANTS)
228 if(display_page_bak == 1) yoff_d += 0xc000;
230 for(int i = 0; i < 3; i++) {
231 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
233 if(cmd.render_width > 0) {
234 if(cmd.render_width > 80) cmd.render_width = 80;
236 if(cmd.render_width > 0) Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), &(p2[cmd.begin_pos * 8]), scan_line);
239 cmd.begin_pos = wx_end;
240 cmd.render_width = 80 - wx_end;
241 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
242 #if defined(_FM77AV_VARIANTS)
243 if(display_page_bak == 1) yoff_d += 0xc000;
245 for(int i = 0; i < 3; i++) {
246 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
248 if(cmd.render_width > 0) {
249 if(cmd.render_width > 80) cmd.render_width = 80;
251 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), &(p2[cmd.begin_pos * 8]), scan_line);
253 #if defined(FIXED_FRAMEBUFFER_SIZE)
254 // CopyDrawnData(p, p2, 80, scan_line);
261 //cmd.render_width = 80;
262 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
263 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
267 #if defined(_FM77AV_VARIANTS)
268 if(display_page_bak == 1) yoff_d += 0xc000;
269 for(int i = 0; i < 3; i++) {
270 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
271 cmd.data[i] = gvram_shadow;
272 cmd.voffset[i] = yoff;
275 // for(int i = 0; i < 3; i++) {
276 // cmd.baseaddress[i] = i * 0x4000;
280 Render8Colors_Line(&cmd, p, p2, scan_line);
281 #if defined(FIXED_FRAMEBUFFER_SIZE)
282 //CopyDrawnData(p, p2, 80, scan_line);
286 if(ff) force_update = false;
290 if(display_mode == DISPLAY_MODE_1_400L) {
292 uint8_t *regs = l4crtc->get_regs();
293 cursor_start = (int)(regs[10] & 0x1f);
294 cursor_end = (int)(regs[11] & 0x1f);
295 cursor_type = (int)((regs[10] & 0x60) >> 5);
296 text_xmax = (int)((uint16_t)regs[1] << 1);
297 text_lines = (int)((regs[9] & 0x1f) + 1);
298 text_ymax = (int)(regs[6] & 0x7f);
300 // Green display had only connected to FM-8, FM-7/NEW7 and FM-77.
301 for(y = 0; y < 400; y += 8) {
302 bool renderf = false;
310 if((y & 0x0f) == 0) {
311 for(yy = 0; yy < 16; yy++) renderf |= vram_draw_table[y + yy];
312 renderf = renderf | ff;
314 for(yy = 0; yy < 16; yy++) vram_draw_table[y + yy] = true;
317 if(use_green_monitor) {
318 for(yy = 0; yy < 8; yy++) {
319 if(!(vram_draw_table[y + yy] | ff)) continue;
320 vram_draw_table[y + yy] = false;
321 p = emu->get_screen_buffer(y + yy);
322 if(p == NULL) continue;
323 yoff = (y + yy) * 80;
324 for(x = 0; x < 10; x++) {
325 for(ii = 0; ii < 8; ii++) {
326 GETVRAM_1_400L_GREEN(yoff + ii, p);
334 for(yy = 0; yy < 8; yy++) {
335 if(!(vram_draw_table[y + yy] | ff)) continue;
336 vram_draw_table[y + yy] = false;
337 p = emu->get_screen_buffer(y + yy);
338 if(p == NULL) continue;
339 yoff = (y + yy) * 80;
340 for(x = 0; x < 10; x++) {
341 for(ii = 0; ii < 8; ii++) {
342 GETVRAM_1_400L(yoff + ii, p);
363 for(x = 0; x < xlim; x++) {
364 naddr = (text_start_addr.w.l + ((y / text_lines) * text_xmax + x) * 2) & 0x0ffe;
365 charcode = text_vram[naddr];
366 attr_code = text_vram[naddr + 1];
368 on_color = GETVRAM_TEXTCOLOR(attr_code, do_green);
370 display_char = ((attr_code & 0x10) == 0);
371 reverse = ((attr_code & 0x08) != 0);
373 for(yy = 0; yy < 16; yy++) {
374 raster = y % text_lines;
376 p = emu->get_screen_buffer(y + yy);
377 if(p == NULL) continue;
378 if((raster < 16) && (display_char || text_blink)) {
379 bitdata = subsys_cg_l4[(uint32_t)charcode * 16 + (uint32_t)raster];
382 if((naddr == (uint32_t)(cursor_addr.w.l)) && (cursor_type != 1) &&
383 (text_blink || (cursor_type == 0))) {
384 if((raster >= cursor_start) && (raster <= cursor_end)) {
388 bitdata = GETVRAM_TEXTPIX(bitdata, reverse, cursor_rev);
391 scrntype_t *pp = &(p[x * 2]);
392 for(ii = 0; ii < 8; ii++) {
393 if((bitdata & 0x80) != 0) {
401 scrntype_t *pp = &(p[x * 2]);
402 for(ii = 0; ii < 8; ii++) {
403 if((bitdata & 0x80) != 0) {
415 if(ff) force_update = false;
419 # if defined(_FM77AV_VARIANTS)
420 if(display_mode == DISPLAY_MODE_4096) {
424 if(!multimode_dispflags[0]) mask = 0x00f;
425 if(!multimode_dispflags[1]) mask = mask | 0x0f0;
426 if(!multimode_dispflags[2]) mask = mask | 0xf00;
427 for(y = 0; y < 200; y += 4) {
428 for(yy = 0; yy < 4; yy++) {
429 if(!(vram_draw_table[y + yy] | ff)) continue;
430 vram_draw_table[y + yy] = false;
432 #if !defined(FIXED_FRAMEBUFFER_SIZE)
433 p = emu->get_screen_buffer(y + yy);
436 p = emu->get_screen_buffer((y + yy) * 2 );
437 p2 = emu->get_screen_buffer((y + yy) * 2 + 1);
439 if(p == NULL) continue;
440 yoff = (y + yy) * 40;
441 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
442 if(window_opened && (wy_low <= (y + yy)) && (wy_high > (y + yy))) {
443 for(x = 0; x < 40; x++) {
444 if((x >= wx_begin) && (x < wx_end)) {
445 GETVRAM_4096(yoff, p, p2, mask, true, scan_line);
447 GETVRAM_4096(yoff, p, p2, mask, false, scan_line);
449 #if defined(FIXED_FRAMEBUFFER_SIZE)
460 for(x = 0; x < 5; x++) {
461 for(ii = 0; ii < 8; ii++) {
462 GETVRAM_4096(yoff + ii, p, p2, mask, false, scan_line);
463 #if defined(FIXED_FRAMEBUFFER_SIZE)
476 if(ff) force_update = false;
479 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
480 else if(display_mode == DISPLAY_MODE_8_400L) {
481 _render_command_data_t cmd;
484 cmd.palette = dpalette_pixel;
485 for(int i = 0; i < 3; i++) {
486 cmd.data[i] = gvram_shadow;
487 cmd.baseaddress[i] = i * 0x8000;
488 cmd.voffset[i] = yoff;
489 cmd.is_render[i] = false;
491 if(!multimode_dispflags[0]) cmd.is_render[0] = true;
492 if(!multimode_dispflags[1]) cmd.is_render[1] = true;
493 if(!multimode_dispflags[2]) cmd.is_render[2] = true;
494 cmd.bit_trans_table[0] = (_bit_trans_table_t*)(&(bit_trans_table_2[0][0])); // B
495 cmd.bit_trans_table[1] = (_bit_trans_table_t*)(&(bit_trans_table_1[0][0])); // R
496 cmd.bit_trans_table[2] = (_bit_trans_table_t*)(&(bit_trans_table_0[0][0])); // G
498 cmd.addrmask = 0x7fff;
499 cmd.addrmask2 = 0x7fff;
502 cmd.render_width = 80;
503 for(y = 0; y < 400; y += 8) {
504 for(yy = 0; yy < 8; yy++) {
505 if(!(vram_draw_table[y + yy] | ff)) continue;
506 vram_draw_table[y + yy] = false;
508 p = emu->get_screen_buffer(y + yy);
509 if(p == NULL) continue;
511 yoff = (y + yy) * 80;
512 for(int i = 0; i < 3; i++) {
513 cmd.voffset[i] = yoff;
516 bool window_inv = false;
518 dpage = vram_display_block;
519 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
520 if(window_opened && (wy_low <= (y + yy)) && (wy_high > (y + yy))) {
521 if((wx_begin > 0) && (wx_begin < wx_end) && (wx_begin < 80)) {
526 if(_wend >= 80) _wend = 80;
527 cmd.render_width = wx_begin;
528 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
529 for(int i = 0; i < 3; i++) {
530 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
532 if(cmd.render_width > 0) {
533 if(cmd.render_width > 80) cmd.render_width = 80;
535 Render8Colors_Line(&cmd, p, NULL, false);
538 cmd.begin_pos = wx_begin;
539 cmd.render_width = _wend - wx_begin;
540 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
541 if(display_page_bak == 1) yoff_d += 0xc000;
542 for(int i = 0; i < 3; i++) {
543 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
545 if(cmd.render_width > 0) {
546 if(cmd.render_width > 80) cmd.render_width = 80;
548 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
551 cmd.begin_pos = wx_end;
552 cmd.render_width = 80 - wx_end;
553 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
554 for(int i = 0; i < 3; i++) {
555 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
557 if(cmd.render_width > 0) {
558 if(cmd.render_width > 80) cmd.render_width = 80;
560 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
563 } else if((wx_begin <= 0) && (wx_begin < wx_end) && (wx_end >= 0)) {
566 cmd.render_width = wx_end;
567 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
568 for(int i = 0; i < 3; i++) {
569 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
571 if(cmd.render_width > 0) {
572 if(cmd.render_width > 80) cmd.render_width = 80;
574 if(cmd.render_width > 0) Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
577 cmd.begin_pos = wx_end;
578 cmd.render_width = 80 - wx_end;
579 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
580 for(int i = 0; i < 3; i++) {
581 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
583 if(cmd.render_width > 0) {
584 if(cmd.render_width > 80) cmd.render_width = 80;
586 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
594 cmd.render_width = 80;
595 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
596 for(int i = 0; i < 3; i++) {
597 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
599 if(cmd.render_width > 0) {
600 if(cmd.render_width > 80) cmd.render_width = 80;
602 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
605 if(ff) force_update = false;
607 } else if(display_mode == DISPLAY_MODE_256k) {
609 //rgbmask = ~multimode_dispmask;
611 for(y = 0; y < 200; y += 4) {
612 for(yy = 0; yy < 4; yy++) {
613 if(!(vram_draw_table[y + yy] | ff)) continue;
614 vram_draw_table[y + yy] = false;
615 #if !defined(FIXED_FRAMEBUFFER_SIZE)
616 p = emu->get_screen_buffer(y + yy);
619 p = emu->get_screen_buffer((y + yy) * 2 );
620 p2 = emu->get_screen_buffer((y + yy) * 2 + 1);
622 if(p == NULL) continue;
624 yoff = (y + yy) * 40;
626 for(x = 0; x < 5; x++) {
627 for(ii = 0; ii < 8; ii++) {
628 GETVRAM_256k(yoff + ii, p, p2, scan_line);
629 #if !defined(FIXED_FRAMEBUFFER_SIZE)
641 if(ff) force_update = false;
645 # endif //_FM77AV_VARIANTS
648 bool DISPLAY::screen_update(void)
651 bool f = screen_update_flag;
652 screen_update_flag = false;
655 if(crt_flag_bak) return true;
660 void DISPLAY::reset_screen_update(void)
662 screen_update_flag = false;
665 void DISPLAY::CopyDrawnData(scrntype_t* src, scrntype_t* dst, int width, bool scan_line)
667 if(dst == NULL) return;
668 if(src == NULL) return;
669 #if defined(_RGB555) || defined(_RGBA565)
670 static const int shift_factor = 2;
672 static const int shift_factor = 3;
674 scrntype_vec8_t* vsrc = (scrntype_vec8_t*)src;
675 scrntype_vec8_t* vdst = (scrntype_vec8_t*)dst;
676 __DECL_ALIGNED(32) scrntype_vec8_t tmp_dd;
677 __DECL_ALIGNED(32) scrntype_vec8_t sline;
680 __DECL_VECTORIZED_LOOP
681 for(int i = 0; i < 8; i++) {
682 sline.w[i] = (scrntype_t)RGBA_COLOR(31, 31, 31, 255);
684 __DECL_VECTORIZED_LOOP
685 for(int i = 0; i < width; i++) {
686 tmp_dd.v = vsrc[i].v;
687 tmp_dd.v = tmp_dd.v >> shift_factor;
688 tmp_dd.v = tmp_dd.v & sline.v;
689 vdst[i].v = tmp_dd.v;
692 __DECL_VECTORIZED_LOOP
693 for(int i = 0; i < width; i++) {
694 tmp_dd.v = vsrc[i].v;
695 vdst[i].v = tmp_dd.v;
702 scrntype_t DISPLAY::GETVRAM_TEXTCOLOR(uint8_t attr, bool do_green)
704 int color = attr & 0x07;
707 static const int green_g_table[16] = {0, 24, 48, 64, 80, 96, 112, 128,
708 140, 155, 175, 186, 210, 220, 240, 255};
710 if((attr & 0x20) != 0) color += 8;
712 g = green_g_table[color];
714 r = (color - 9) * 16;
715 b = (color - 9) * 16;
718 if((attr & 0x20) != 0) {
719 g = ((color & 4) != 0) ? 255 : 0;
720 r = ((color & 2) != 0) ? 255 : 0;
721 b = ((color & 1) != 0) ? 255 : 0;
723 g = ((color & 4) != 0) ? 128 : 0;
724 r = ((color & 2) != 0) ? 128 : 0;
725 b = ((color & 1) != 0) ? 128 : 0;
728 return RGBA_COLOR(r, g, b, 255);
731 uint8_t DISPLAY::GETVRAM_TEXTPIX(uint8_t bitdata, bool reverse, bool cursor_rev)
733 uint8_t ret = bitdata;
735 ret = (uint8_t)(~ret);
738 ret = (uint8_t)(~ret);
743 void DISPLAY::GETVRAM_1_400L(int yoff, scrntype_t *p)
747 if(p == NULL) return;
748 yoff_d = yoff & 0x7fff;
749 pixel = gvram_shadow[yoff_d];
750 uint16_vec8_t *ppx = (uint16_vec8_t *)(&(bit_trans_table_0[pixel][0]));
751 __DECL_ALIGNED(16) uint16_vec8_t tmp_d;
752 __DECL_ALIGNED(32) scrntype_vec8_t tmp_dd;
753 scrntype_vec8_t *vp = (scrntype_vec8_t *)p;
756 tmp_d.v = tmp_d.v >> 5;
758 __DECL_VECTORIZED_LOOP
759 for(int i = 0; i < 8; i++) {
760 tmp_dd.w[i] = dpalette_pixel[tmp_d.w[i]];
766 void DISPLAY::GETVRAM_1_400L_GREEN(int yoff, scrntype_t *p)
770 if(p == NULL) return;
771 yoff_d = yoff & 0x7fff;
772 pixel = gvram_shadow[yoff_d];
773 uint16_vec8_t *ppx = (uint16_vec8_t *)(&(bit_trans_table_0[pixel][0]));
774 __DECL_ALIGNED(16) uint16_vec8_t tmp_d;
775 __DECL_ALIGNED(32) scrntype_vec8_t tmp_dd;
776 scrntype_vec8_t *vp = (scrntype_vec8_t *)p;
779 tmp_d.v = tmp_d.v >> 5;
781 __DECL_VECTORIZED_LOOP
782 for(int i = 0; i < 8; i++) {
783 tmp_dd.w[i] = dpalette_pixel_green[tmp_d.w[i]];
791 #if defined(_FM77AV_VARIANTS)
792 void DISPLAY::GETVRAM_4096(int yoff, scrntype_t *p, scrntype_t *px,
798 uint8_t bb[4], rr[4], gg[4];
799 __DECL_ALIGNED(16) uint16_vec8_t pixels;
800 __DECL_ALIGNED(16) const uint16_t __masks[8] = {(uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask};
806 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
807 int dpage = vram_display_block;
809 if(p == NULL) return;
813 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
826 bb[0] = gvram_shadow[yoff_d1];
827 bb[1] = gvram_shadow[yoff_d1 + 0x02000];
828 rr[0] = gvram_shadow[yoff_d1 + 0x04000];
829 rr[1] = gvram_shadow[yoff_d1 + 0x06000];
830 gg[0] = gvram_shadow[yoff_d1 + 0x08000];
831 gg[1] = gvram_shadow[yoff_d1 + 0x0a000];
833 bb[2] = gvram_shadow[yoff_d2 + 0x0c000];
834 bb[3] = gvram_shadow[yoff_d2 + 0x0e000];
835 rr[2] = gvram_shadow[yoff_d2 + 0x10000];
836 rr[3] = gvram_shadow[yoff_d2 + 0x12000];
837 gg[2] = gvram_shadow[yoff_d2 + 0x14000];
838 gg[3] = gvram_shadow[yoff_d2 + 0x16000];
840 uint16_t *p0, *p1, *p2, *p3;
841 #if !defined(FIXED_FRAMEBUFFER_SIZE)
842 __DECL_ALIGNED(sizeof(scrntype_t) * 8) scrntype_t tmp_dd[8];
844 __DECL_ALIGNED(sizeof(scrntype_t) * 8) scrntype_t tmp_dd[16];
846 __DECL_ALIGNED(16) uint16_vec8_t tmp_g, tmp_r, tmp_b;
847 __v8hi *vp0, *vp1, *vp2, *vp3;
849 vp0 = (__v8hi*)(&(bit_trans_table_0[gg[0]][0]));
850 vp1 = (__v8hi*)(&(bit_trans_table_1[gg[1]][0]));
851 vp2 = (__v8hi*)(&(bit_trans_table_2[gg[2]][0]));
852 vp3 = (__v8hi*)(&(bit_trans_table_3[gg[3]][0]));
854 tmp_g.v = tmp_g.v | *vp1;
855 tmp_g.v = tmp_g.v | *vp2;
856 tmp_g.v = tmp_g.v | *vp3;
858 vp0 = (__v8hi*)(&(bit_trans_table_0[rr[0]][0]));
859 vp1 = (__v8hi*)(&(bit_trans_table_1[rr[1]][0]));
860 vp2 = (__v8hi*)(&(bit_trans_table_2[rr[2]][0]));
861 vp3 = (__v8hi*)(&(bit_trans_table_3[rr[3]][0]));
863 tmp_r.v = tmp_r.v | *vp1;
864 tmp_r.v = tmp_r.v | *vp2;
865 tmp_r.v = tmp_r.v | *vp3;
868 vp0 = (__v8hi*)(&(bit_trans_table_0[bb[0]][0]));
869 vp1 = (__v8hi*)(&(bit_trans_table_1[bb[1]][0]));
870 vp2 = (__v8hi*)(&(bit_trans_table_2[bb[2]][0]));
871 vp3 = (__v8hi*)(&(bit_trans_table_3[bb[3]][0]));
873 tmp_b.v = tmp_b.v | *vp1;
874 tmp_b.v = tmp_b.v | *vp2;
875 tmp_b.v = tmp_b.v | *vp3;
877 __v8hi *mp = (__v8hi*)__masks;
878 tmp_g.v = tmp_g.v << 4;
879 tmp_b.v = tmp_b.v >> 4;
881 pixels.v = pixels.v | tmp_r.v;
882 pixels.v = pixels.v | tmp_g.v;
883 pixels.v = pixels.v & *mp;
886 scrntype_vec8_t *vp = (scrntype_vec8_t*)p;
887 scrntype_vec8_t *dp = (scrntype_vec8_t*)tmp_dd;
888 #if !defined(FIXED_FRAMEBUFFER_SIZE)
889 __DECL_VECTORIZED_LOOP
890 for(int i = 0; i < 8; i++) {
891 tmp_dd[i] = analog_palette_pixel[pixels[i]];
895 __DECL_VECTORIZED_LOOP
896 for(int i = 0; i < 8; i++) {
897 tmp_dd[i * 2] = tmp_dd[i * 2 + 1] = analog_palette_pixel[pixels.w[i]];;
899 scrntype_vec8_t *vpx = (scrntype_vec8_t*)px;
900 __DECL_ALIGNED(32) scrntype_vec8_t vmask;
901 __DECL_VECTORIZED_LOOP
902 for(int i = 0; i < 2; i++) {
907 __DECL_VECTORIZED_LOOP
908 for(int i = 0; i < 2; i++) {
909 #if defined(_RGB888) || defined(_RGBA888)
910 dp[i].v = dp[i].v >> 3;
911 #elif defined(_RGB555)
912 dp[i].v = dp[i].v >> 2;
913 #elif defined(_RGB565)
914 dp[i].v = dp[i].v >> 2;
917 __DECL_VECTORIZED_LOOP
918 for(int i = 0; i < 8; i++) {
919 vmask.w[i] = (const scrntype_t)RGBA_COLOR(31, 31, 31, 255);
921 __DECL_VECTORIZED_LOOP
922 for(int i = 0; i < 2; i++) {
923 dp[i].v = dp[i].v & vmask.v;
927 __DECL_VECTORIZED_LOOP
928 for(int i = 0; i < 2; i++) {
936 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
938 void DISPLAY::GETVRAM_256k(int yoff, scrntype_t *p, scrntype_t *px, bool scan_line)
942 uint32_t btmp, rtmp, gtmp;
951 if(p == NULL) return;
960 uint8_t bb[8], rr[8], gg[8];
962 __DECL_ALIGNED(16) uint16_vec8_t _btmp;
963 __DECL_ALIGNED(16) uint16_vec8_t _rtmp;
964 __DECL_ALIGNED(16) uint16_vec8_t _gtmp;
965 uint16_vec8_t *vp0, *vp1, *vp2, *vp3, *vp4, *vp5;
966 #if !defined(FIXED_FRAMEBUFFER_SIZE)
967 __DECL_ALIGNED(sizeof(scrntype_t) * 8) scrntype_t tmp_dd[8];
969 __DECL_ALIGNED(sizeof(scrntype_t) * 8) scrntype_t tmp_dd[16];
972 if(!multimode_dispflags[0]) {
974 bb[0] = gvram_shadow[yoff_d1];
975 bb[1] = gvram_shadow[yoff_d1 + 0x02000];
977 bb[2] = gvram_shadow[yoff_d2 + 0x0c000];
978 bb[3] = gvram_shadow[yoff_d2 + 0x0e000];
980 bb[4] = gvram_shadow[yoff_d1 + 0x18000];
981 bb[5] = gvram_shadow[yoff_d1 + 0x1a000];
983 vp0 = (uint16_vec8_t*)(&(bit_trans_table_0[bb[0]][0]));
984 vp1 = (uint16_vec8_t*)(&(bit_trans_table_1[bb[1]][0]));
985 vp2 = (uint16_vec8_t*)(&(bit_trans_table_2[bb[2]][0]));
986 vp3 = (uint16_vec8_t*)(&(bit_trans_table_3[bb[3]][0]));
987 vp4 = (uint16_vec8_t*)(&(bit_trans_table_4[bb[4]][0]));
988 vp5 = (uint16_vec8_t*)(&(bit_trans_table_5[bb[5]][0]));
990 _btmp.v = _btmp.v | vp1->v;
991 _btmp.v = _btmp.v | vp2->v;
992 _btmp.v = _btmp.v | vp3->v;
993 _btmp.v = _btmp.v | vp4->v;
994 _btmp.v = _btmp.v | vp5->v;
996 __DECL_VECTORIZED_LOOP
997 for(int i = 0; i < 8; i++) {
1001 if(!multimode_dispflags[1]) {
1004 rr[0] = gvram_shadow[yoff_d1 + 0x04000];
1005 rr[1] = gvram_shadow[yoff_d1 + 0x06000];
1007 rr[2] = gvram_shadow[yoff_d2 + 0x10000];
1008 rr[3] = gvram_shadow[yoff_d2 + 0x12000];
1010 rr[4] = gvram_shadow[yoff_d1 + 0x1c000];
1011 rr[5] = gvram_shadow[yoff_d1 + 0x1e000];
1013 vp0 = (uint16_vec8_t*)(&(bit_trans_table_0[rr[0]][0]));
1014 vp1 = (uint16_vec8_t*)(&(bit_trans_table_1[rr[1]][0]));
1015 vp2 = (uint16_vec8_t*)(&(bit_trans_table_2[rr[2]][0]));
1016 vp3 = (uint16_vec8_t*)(&(bit_trans_table_3[rr[3]][0]));
1017 vp4 = (uint16_vec8_t*)(&(bit_trans_table_4[rr[4]][0]));
1018 vp5 = (uint16_vec8_t*)(&(bit_trans_table_5[rr[5]][0]));
1020 _rtmp.v = _rtmp.v | vp1->v;
1021 _rtmp.v = _rtmp.v | vp2->v;
1022 _rtmp.v = _rtmp.v | vp3->v;
1023 _rtmp.v = _rtmp.v | vp4->v;
1024 _rtmp.v = _rtmp.v | vp5->v;
1026 __DECL_VECTORIZED_LOOP
1027 for(int i = 0; i < 8; i++) {
1031 if(!multimode_dispflags[2]) {
1034 gg[0] = gvram_shadow[yoff_d1 + 0x08000];
1035 gg[1] = gvram_shadow[yoff_d1 + 0x0a000];
1037 gg[2] = gvram_shadow[yoff_d2 + 0x14000];
1038 gg[3] = gvram_shadow[yoff_d2 + 0x16000];
1040 gg[4] = gvram_shadow[yoff_d1 + 0x20000];
1041 gg[5] = gvram_shadow[yoff_d1 + 0x22000];
1043 vp0 = (uint16_vec8_t*)(&(bit_trans_table_0[gg[0]][0]));
1044 vp1 = (uint16_vec8_t*)(&(bit_trans_table_1[gg[1]][0]));
1045 vp2 = (uint16_vec8_t*)(&(bit_trans_table_2[gg[2]][0]));
1046 vp3 = (uint16_vec8_t*)(&(bit_trans_table_3[gg[3]][0]));
1047 vp4 = (uint16_vec8_t*)(&(bit_trans_table_4[gg[4]][0]));
1048 vp5 = (uint16_vec8_t*)(&(bit_trans_table_5[gg[5]][0]));
1050 _gtmp.v = _gtmp.v | vp1->v;
1051 _gtmp.v = _gtmp.v | vp2->v;
1052 _gtmp.v = _gtmp.v | vp3->v;
1053 _gtmp.v = _gtmp.v | vp4->v;
1054 _gtmp.v = _gtmp.v | vp5->v;
1056 __DECL_VECTORIZED_LOOP
1057 for(int i = 0; i < 8; i++) {
1062 scrntype_vec8_t* vpp = (scrntype_vec8_t*)p;
1063 scrntype_vec8_t* dp = (scrntype_vec8_t*)tmp_dd;
1064 #if !defined(FIXED_FRAMEBUFFER_SIZE)
1065 __DECL_VECTORIZED_LOOP
1066 for(int i = 0; i < 8; i++) {
1067 tmp_dd[i] = RGB_COLOR(_rtmp.w[i], _gtmp.w[i], _btmp.w[i]);
1071 __DECL_VECTORIZED_LOOP
1072 for(int i = 0; i < 8; i++) {
1073 tmp_dd[i * 2] = tmp_dd[i * 2 + 1] = RGB_COLOR(_rtmp.w[i], _gtmp.w[i], _btmp.w[i]);
1076 __DECL_VECTORIZED_LOOP
1077 for(int i = 0; i < 2; i++) {
1080 scrntype_vec8_t* vpx = (scrntype_vec8_t*)px;
1082 /* Fancy scanline */
1083 __DECL_VECTORIZED_LOOP
1084 for(int i = 0; i < 2; i++) {
1085 #if defined(_RGB888) || defined(_RGBA888)
1086 dp[i].v = dp[i].v >> 3;
1087 #elif defined(_RGB555)
1088 dp[i].v = dp[i].v >> 2;
1089 #elif defined(_RGB565)
1090 dp[i].v = dp[i].v >> 2;
1093 __DECL_ALIGNED(32) scrntype_vec8_t scanline_data;
1094 __DECL_VECTORIZED_LOOP
1095 for(int i = 0; i < 8; i++) {
1096 scanline_data.w[i] = RGBA_COLOR(31, 31, 31, 255);
1098 __DECL_VECTORIZED_LOOP
1099 for(int i = 0; i < 2; i++) {
1100 dp[i].v = dp[i].v & scanline_data.v;
1104 for(int i = 0; i < 2; i++) {