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()
26 scrntype_t *p, *pp, *p2;
27 uint32_t yoff_d1, yoff_d2;
28 uint16_t wx_begin = -1, wx_end = -1, wy_low = 1024, wy_high = -1;
29 bool scan_line = config.scan_line;
30 bool ff = force_update;
31 int dmode = display_mode;
32 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
34 wx_begin = window_xbegin;
37 wy_high = window_high;
38 bool _flag = window_opened;
39 if((wx_begin < wx_end) && (wy_low < wy_high)) {
42 window_opened = false;
44 if(_flag != window_opened) {
45 vram_wrote_shadow = true;
49 #if defined(_FM77AV_VARIANTS)
53 //if(!(vram_wrote_shadow)) return;
54 yoff_d1 = yoff_d2 = offset_point;
59 case DISPLAY_MODE_8_200L:
63 case DISPLAY_MODE_1_400L:
64 case DISPLAY_MODE_8_400L:
73 # if !defined(FIXED_FRAMEBUFFER_SIZE)
74 emu->set_vm_screen_size(xpixels, ylines, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
76 emu->set_vm_screen_lines(ylines);
81 crt_flag_bak = crt_flag;
84 crt_flag_bak = crt_flag;
85 if(!(vram_wrote_shadow | ff)) return;
86 vram_wrote_shadow = false;
88 _render_command_data_t cmd;
89 memset(cmd, 0x00, sizeof(cmd));
92 int wpixels = xpixels >> 3;
93 for(y = 0; y < ylines; y += 8) {
94 for(yy = 0; yy < 8; yy++) {
95 if(!(vram_draw_table[y + yy] | ff)) continue;
96 vram_draw_table[y + yy] = false;
97 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
99 dpage = vram_display_block;
100 bool window_inv = false;
101 if((check_window(dmode, yy + y)) && (dmode != DISPLAY_MODE_256k)) {
102 if((wx_begin > 0) && (wx_begin < wx_end) && (wx_begin < wpixels)) {
103 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
104 if(display_page_bak == 1) yoff_d += 0xc000;
105 draw_window(dmode, yy + y, 0, wx_begin,
106 yoff_d1, yoff_d2, yoff_d);
107 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
108 if(display_page_bak == 1) yoff_d += 0xc000;
109 draw_window(dmode, yy + y,
110 wx_begin, ((wx_end >= wpixels) ? wpixels : wx_end) - wx_begin,
111 yoff_d1, yoff_d2, yoff_d); // if 0?
112 if(wx_end < wpixels) {
113 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
114 if(display_page_bak == 1) yoff_d += 0xc000;
115 draw_window(dmode, yy + y, wx_end, wpixels - wx_end,
116 yoff_d1, yoff_d2, yoff_d);
119 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
120 if(display_page_bak == 1) yoff_d += 0xc000;
121 draw_window(dmode, yy + y, 0, wx_end,
122 yoff_d1, yoff_d2, yoff_d); // if 0?
123 if(wx_end < wpixels) {
124 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
125 if(display_page_bak == 1) yoff_d += 0xc000;
126 draw_window(dmode, yy + y, wx_end , wpixels - wx_end,
127 yoff_d1, yoff_d2, yoff_d);
131 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
132 if(display_page_bak == 1) yoff_d += 0xc000;
133 draw_line(dmode, yy + y, yoff_d1, yoff_d2, yoff_d);
136 #elif defined(_FM77AV_VARIANTS)
137 if(display_page_bak == 1) yoff_d += 0xc000;
138 draw_line(dmode, yy + y, yoff_d1, yoff_d2, yoff_d);
140 #elif defined(_FM77L4)
141 draw_line(dmode, yy + y, yoff_d1, yoff_d2, yoff_d);
144 draw_line(dmode, yy + y, yoff_d1, yoff_d2, yoff_d);
152 void DISPLAY::draw_screen2()
156 scrntype_t *p, *pp, *p2;
161 uint32_t yoff_d1, yoff_d2;
162 uint16_t wx_begin, wx_end, wy_low, wy_high;
163 bool scan_line = config.scan_line;
164 bool ff = force_update;
166 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
168 wx_begin = window_xbegin;
169 wx_end = window_xend;
171 wy_high = window_high;
172 bool _flag = window_opened;
173 if((wx_begin < wx_end) && (wy_low < wy_high)) {
174 window_opened = true;
176 window_opened = false;
178 if(_flag != window_opened) {
179 vram_wrote_shadow = true;
183 // frame_skip_count_draw++;
184 #if defined(_FM77AV_VARIANTS)
188 //if(!(vram_wrote_shadow)) return;
189 yoff_d1 = yoff_d2 = offset_point;
194 switch(display_mode) {
195 case DISPLAY_MODE_8_200L:
199 case DISPLAY_MODE_8_400L:
208 # if !defined(FIXED_FRAMEBUFFER_SIZE)
209 emu->set_vm_screen_size(xpixels, ylines, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
211 emu->set_vm_screen_lines(ylines);
215 #if !defined(FIXED_FRAMEBUFFER_SIZE)
216 for(y = 0; y < ylines; y += 8) {
217 for(yy = 0; yy < 8; yy++) {
218 vram_draw_table[y + yy] = false;
219 ppp = emu->get_screen_buffer(y + yy);
220 if(ppp != NULL) memset(ppp, 0x00, xpixels * sizeof(scrntype_t));
224 for(y = 0; y < 400; y += 8) {
225 for(yy = 0; yy < 8; yy++) {
226 vram_draw_table[y + yy] = false;
227 ppp = emu->get_screen_buffer(y + yy);
228 if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype_t));
234 crt_flag_bak = crt_flag;
237 crt_flag_bak = crt_flag;
238 if(!(vram_wrote_shadow | ff)) return;
239 vram_wrote_shadow = false;
240 if(display_mode == DISPLAY_MODE_8_200L) {
241 _render_command_data_t cmd;
245 #if defined(USE_GREEN_DISPLAY)
246 if(use_green_monitor) {
247 cmd.palette = dpalette_pixel_green;
249 cmd.palette = dpalette_pixel;
252 cmd.palette = dpalette_pixel;
254 for(int i = 0; i < 3; i++) {
255 cmd.data[i] = gvram_shadow;
256 cmd.baseaddress[i] = i * 0x4000;
257 cmd.voffset[i] = yoff;
258 cmd.is_render[i] = false;
260 if(!multimode_dispflags[0]) cmd.is_render[0] = true;
261 if(!multimode_dispflags[1]) cmd.is_render[1] = true;
262 if(!multimode_dispflags[2]) cmd.is_render[2] = true;
263 cmd.bit_trans_table[0] = (_bit_trans_table_t*)(&(bit_trans_table_2[0][0])); // B
264 cmd.bit_trans_table[1] = (_bit_trans_table_t*)(&(bit_trans_table_1[0][0])); // R
265 cmd.bit_trans_table[2] = (_bit_trans_table_t*)(&(bit_trans_table_0[0][0])); // G
267 cmd.addrmask = 0x3fff;
268 cmd.addrmask2 = 0x3fff;
271 cmd.render_width = 80;
272 for(y = 0; y < 200; y += 8) {
273 for(yy = 0; yy < 8; yy++) {
275 if(!(vram_draw_table[y + yy] | ff)) continue;
276 vram_draw_table[y + yy] = false;
277 #if !defined(FIXED_FRAMEBUFFER_SIZE)
278 p = emu->get_screen_buffer(y + yy);
281 p = emu->get_screen_buffer((y + yy) * 2);
282 p2 = emu->get_screen_buffer((y + yy) * 2 + 1);
284 if(p == NULL) continue;
285 yoff = (y + yy) * 80;
286 for(int i = 0; i < 3; i++) {
287 cmd.voffset[i] = yoff;
290 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
292 dpage = vram_display_block;
293 bool window_inv = false;
294 if(window_opened && (wy_low <= (y + yy)) && (wy_high > (y + yy))) {
295 if((wx_begin > 0) && (wx_begin < wx_end) && (wx_begin < 80)) {
300 if(_wend >= 80) _wend = 80;
301 cmd.render_width = wx_begin;
302 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
303 if(display_page_bak == 1) yoff_d += 0xc000;
304 for(int i = 0; i < 3; i++) {
305 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
307 if(cmd.render_width > 0) {
308 if(cmd.render_width > 80) cmd.render_width = 80;
310 Render8Colors_Line(&cmd, p, p2, scan_line);
313 cmd.begin_pos = wx_begin;
314 cmd.render_width = _wend - wx_begin;
315 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
316 if(display_page_bak == 1) yoff_d += 0xc000;
317 for(int i = 0; i < 3; i++) {
318 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
320 if(cmd.render_width > 0) {
321 if(cmd.render_width > 80) cmd.render_width = 80;
323 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), &(p2[cmd.begin_pos * 8]) , scan_line);
326 cmd.begin_pos = wx_end;
327 cmd.render_width = 80 - wx_end;
328 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
329 if(display_page_bak == 1) yoff_d += 0xc000;
330 for(int i = 0; i < 3; i++) {
331 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
333 if(cmd.render_width > 0) {
334 if(cmd.render_width > 80) cmd.render_width = 80;
336 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), &(p2[cmd.begin_pos * 8]), scan_line);
339 } else if((wx_begin <= 0) && (wx_begin < wx_end) && (wx_end >= 0)) {
342 cmd.render_width = wx_end;
343 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
344 if(display_page_bak == 1) yoff_d += 0xc000;
345 for(int i = 0; i < 3; i++) {
346 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
348 if(cmd.render_width > 0) {
349 if(cmd.render_width > 80) cmd.render_width = 80;
351 if(cmd.render_width > 0) Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), &(p2[cmd.begin_pos * 8]), scan_line);
354 cmd.begin_pos = wx_end;
355 cmd.render_width = 80 - wx_end;
356 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
357 if(display_page_bak == 1) yoff_d += 0xc000;
358 for(int i = 0; i < 3; i++) {
359 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
361 if(cmd.render_width > 0) {
362 if(cmd.render_width > 80) cmd.render_width = 80;
364 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), &(p2[cmd.begin_pos * 8]), scan_line);
371 //cmd.render_width = 80;
372 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
373 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
377 #if defined(_FM77AV_VARIANTS)
378 if(display_page_bak == 1) yoff_d += 0xc000;
379 for(int i = 0; i < 3; i++) {
380 cmd.baseaddress[i] = yoff_d + (i * 0x4000);
381 cmd.data[i] = gvram_shadow;
382 cmd.voffset[i] = yoff;
385 // for(int i = 0; i < 3; i++) {
386 // cmd.baseaddress[i] = i * 0x4000;
390 Render8Colors_Line(&cmd, p, p2, scan_line);
391 #if defined(FIXED_FRAMEBUFFER_SIZE)
392 //CopyDrawnData(p, p2, 80, scan_line);
396 if(ff) force_update = false;
400 if(display_mode == DISPLAY_MODE_1_400L) {
402 uint8_t *regs = l4crtc->get_regs();
403 cursor_start = (int)(regs[10] & 0x1f);
404 cursor_end = (int)(regs[11] & 0x1f);
405 cursor_type = (int)((regs[10] & 0x60) >> 5);
406 text_xmax = (int)((uint16_t)regs[1] << 1);
407 text_lines = (int)((regs[9] & 0x1f) + 1);
408 text_ymax = (int)(regs[6] & 0x7f);
410 // Green display had only connected to FM-8, FM-7/NEW7 and FM-77.
411 for(y = 0; y < 400; y += 8) {
412 bool renderf = false;
420 if((y & 0x0f) == 0) {
421 for(yy = 0; yy < 16; yy++) renderf |= vram_draw_table[y + yy];
422 renderf = renderf | ff;
424 for(yy = 0; yy < 16; yy++) vram_draw_table[y + yy] = true;
427 if(use_green_monitor) {
428 for(yy = 0; yy < 8; yy++) {
429 if(!(vram_draw_table[y + yy] | ff)) continue;
430 vram_draw_table[y + yy] = false;
431 p = emu->get_screen_buffer(y + yy);
432 if(p == NULL) continue;
433 yoff = (y + yy) * 80;
434 for(x = 0; x < 10; x++) {
435 for(ii = 0; ii < 8; ii++) {
436 GETVRAM_1_400L_GREEN(yoff + ii, p);
444 for(yy = 0; yy < 8; yy++) {
445 if(!(vram_draw_table[y + yy] | ff)) continue;
446 vram_draw_table[y + yy] = false;
447 p = emu->get_screen_buffer(y + yy);
448 if(p == NULL) continue;
449 yoff = (y + yy) * 80;
450 for(x = 0; x < 10; x++) {
451 for(ii = 0; ii < 8; ii++) {
452 GETVRAM_1_400L(yoff + ii, p);
473 for(x = 0; x < xlim; x++) {
474 naddr = (text_start_addr.w.l + ((y / text_lines) * text_xmax + x) * 2) & 0x0ffe;
475 charcode = text_vram[naddr];
476 attr_code = text_vram[naddr + 1];
478 on_color = GETVRAM_TEXTCOLOR(attr_code, do_green);
480 display_char = ((attr_code & 0x10) == 0);
481 reverse = ((attr_code & 0x08) != 0);
483 for(yy = 0; yy < 16; yy++) {
484 raster = y % text_lines;
486 p = emu->get_screen_buffer(y + yy);
487 if(p == NULL) continue;
488 if((raster < 16) && (display_char || text_blink)) {
489 bitdata = subsys_cg_l4[(uint32_t)charcode * 16 + (uint32_t)raster];
492 if((naddr == (uint32_t)(cursor_addr.w.l)) && (cursor_type != 1) &&
493 (text_blink || (cursor_type == 0))) {
494 if((raster >= cursor_start) && (raster <= cursor_end)) {
498 bitdata = GETVRAM_TEXTPIX(bitdata, reverse, cursor_rev);
501 scrntype_t *pp = &(p[x * 2]);
502 for(ii = 0; ii < 8; ii++) {
503 if((bitdata & 0x80) != 0) {
511 scrntype_t *pp = &(p[x * 2]);
512 for(ii = 0; ii < 8; ii++) {
513 if((bitdata & 0x80) != 0) {
525 if(ff) force_update = false;
529 # if defined(_FM77AV_VARIANTS)
530 if(display_mode == DISPLAY_MODE_4096) {
534 if(!multimode_dispflags[0]) mask = 0x00f;
535 if(!multimode_dispflags[1]) mask = mask | 0x0f0;
536 if(!multimode_dispflags[2]) mask = mask | 0xf00;
537 for(y = 0; y < 200; y += 4) {
538 for(yy = 0; yy < 4; yy++) {
539 if(!(vram_draw_table[y + yy] | ff)) continue;
540 vram_draw_table[y + yy] = false;
542 #if !defined(FIXED_FRAMEBUFFER_SIZE)
543 p = emu->get_screen_buffer(y + yy);
546 p = emu->get_screen_buffer((y + yy) * 2 );
547 p2 = emu->get_screen_buffer((y + yy) * 2 + 1);
549 if(p == NULL) continue;
550 yoff = (y + yy) * 40;
551 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
552 if(window_opened && (wy_low <= (y + yy)) && (wy_high > (y + yy))) {
553 for(x = 0; x < 40; x++) {
554 if((x >= wx_begin) && (x < wx_end)) {
555 GETVRAM_4096(yoff, p, p2, mask, true, scan_line);
557 GETVRAM_4096(yoff, p, p2, mask, false, scan_line);
559 #if defined(FIXED_FRAMEBUFFER_SIZE)
570 for(x = 0; x < 5; x++) {
571 for(ii = 0; ii < 8; ii++) {
572 GETVRAM_4096(yoff + ii, p, p2, mask, false, scan_line);
573 #if defined(FIXED_FRAMEBUFFER_SIZE)
586 if(ff) force_update = false;
589 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
590 else if(display_mode == DISPLAY_MODE_8_400L) {
591 _render_command_data_t cmd;
594 cmd.palette = dpalette_pixel;
595 for(int i = 0; i < 3; i++) {
596 cmd.data[i] = gvram_shadow;
597 cmd.baseaddress[i] = i * 0x8000;
598 cmd.voffset[i] = yoff;
599 cmd.is_render[i] = false;
601 if(!multimode_dispflags[0]) cmd.is_render[0] = true;
602 if(!multimode_dispflags[1]) cmd.is_render[1] = true;
603 if(!multimode_dispflags[2]) cmd.is_render[2] = true;
604 cmd.bit_trans_table[0] = (_bit_trans_table_t*)(&(bit_trans_table_2[0][0])); // B
605 cmd.bit_trans_table[1] = (_bit_trans_table_t*)(&(bit_trans_table_1[0][0])); // R
606 cmd.bit_trans_table[2] = (_bit_trans_table_t*)(&(bit_trans_table_0[0][0])); // G
608 cmd.addrmask = 0x7fff;
609 cmd.addrmask2 = 0x7fff;
612 cmd.render_width = 80;
613 for(y = 0; y < 400; y += 8) {
614 for(yy = 0; yy < 8; yy++) {
615 if(!(vram_draw_table[y + yy] | ff)) continue;
616 vram_draw_table[y + yy] = false;
618 p = emu->get_screen_buffer(y + yy);
619 if(p == NULL) continue;
621 yoff = (y + yy) * 80;
622 for(int i = 0; i < 3; i++) {
623 cmd.voffset[i] = yoff;
626 bool window_inv = false;
628 dpage = vram_display_block;
629 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
630 if(window_opened && (wy_low <= (y + yy)) && (wy_high > (y + yy))) {
631 if((wx_begin > 0) && (wx_begin < wx_end) && (wx_begin < 80)) {
636 if(_wend >= 80) _wend = 80;
637 cmd.render_width = wx_begin;
638 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
639 for(int i = 0; i < 3; i++) {
640 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
642 if(cmd.render_width > 0) {
643 if(cmd.render_width > 80) cmd.render_width = 80;
645 Render8Colors_Line(&cmd, p, NULL, false);
648 cmd.begin_pos = wx_begin;
649 cmd.render_width = _wend - wx_begin;
650 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
651 if(display_page_bak == 1) yoff_d += 0xc000;
652 for(int i = 0; i < 3; i++) {
653 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
655 if(cmd.render_width > 0) {
656 if(cmd.render_width > 80) cmd.render_width = 80;
658 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
661 cmd.begin_pos = wx_end;
662 cmd.render_width = 80 - wx_end;
663 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
664 for(int i = 0; i < 3; i++) {
665 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
667 if(cmd.render_width > 0) {
668 if(cmd.render_width > 80) cmd.render_width = 80;
670 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
673 } else if((wx_begin <= 0) && (wx_begin < wx_end) && (wx_end >= 0)) {
676 cmd.render_width = wx_end;
677 yoff_d = (dpage != 0) ? 0x00000 : 0x18000;
678 for(int i = 0; i < 3; i++) {
679 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
681 if(cmd.render_width > 0) {
682 if(cmd.render_width > 80) cmd.render_width = 80;
684 if(cmd.render_width > 0) Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
687 cmd.begin_pos = wx_end;
688 cmd.render_width = 80 - wx_end;
689 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
690 for(int i = 0; i < 3; i++) {
691 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
693 if(cmd.render_width > 0) {
694 if(cmd.render_width > 80) cmd.render_width = 80;
696 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
704 cmd.render_width = 80;
705 yoff_d = (dpage != 0) ? 0x18000 : 0x00000;
706 for(int i = 0; i < 3; i++) {
707 cmd.baseaddress[i] = yoff_d + (i * 0x8000);
709 if(cmd.render_width > 0) {
710 if(cmd.render_width > 80) cmd.render_width = 80;
712 Render8Colors_Line(&cmd, &(p[cmd.begin_pos * 8]), NULL, false);
715 if(ff) force_update = false;
717 } else if(display_mode == DISPLAY_MODE_256k) {
719 //rgbmask = ~multimode_dispmask;
721 for(y = 0; y < 200; y += 4) {
722 for(yy = 0; yy < 4; yy++) {
723 if(!(vram_draw_table[y + yy] | ff)) continue;
724 vram_draw_table[y + yy] = false;
725 #if !defined(FIXED_FRAMEBUFFER_SIZE)
726 p = emu->get_screen_buffer(y + yy);
729 p = emu->get_screen_buffer((y + yy) * 2 );
730 p2 = emu->get_screen_buffer((y + yy) * 2 + 1);
732 if(p == NULL) continue;
734 yoff = (y + yy) * 40;
736 for(x = 0; x < 5; x++) {
737 for(ii = 0; ii < 8; ii++) {
738 GETVRAM_256k(yoff + ii, p, p2, scan_line);
739 #if !defined(FIXED_FRAMEBUFFER_SIZE)
751 if(ff) force_update = false;
755 # endif //_FM77AV_VARIANTS
758 bool DISPLAY::screen_update(void)
761 bool f = screen_update_flag;
762 screen_update_flag = false;
765 if(crt_flag_bak) return true;
770 void DISPLAY::reset_screen_update(void)
772 screen_update_flag = false;
775 void DISPLAY::CopyDrawnData(scrntype_t* src, scrntype_t* dst, int width, bool scan_line)
777 if(dst == NULL) return;
778 if(src == NULL) return;
779 #if defined(_RGB555) || defined(_RGBA565)
780 static const int shift_factor = 2;
782 static const int shift_factor = 3;
784 scrntype_vec8_t* vsrc = (scrntype_vec8_t*)src;
785 scrntype_vec8_t* vdst = (scrntype_vec8_t*)dst;
786 __DECL_ALIGNED(32) scrntype_vec8_t tmp_dd;
787 __DECL_ALIGNED(32) scrntype_vec8_t sline;
790 __DECL_VECTORIZED_LOOP
791 for(int i = 0; i < 8; i++) {
792 sline.w[i] = (scrntype_t)RGBA_COLOR(31, 31, 31, 255);
794 __DECL_VECTORIZED_LOOP
795 for(int i = 0; i < width; i++) {
796 tmp_dd.v = vsrc[i].v;
797 tmp_dd.v = tmp_dd.v >> shift_factor;
798 tmp_dd.v = tmp_dd.v & sline.v;
799 vdst[i].v = tmp_dd.v;
802 __DECL_VECTORIZED_LOOP
803 for(int i = 0; i < width; i++) {
804 tmp_dd.v = vsrc[i].v;
805 vdst[i].v = tmp_dd.v;
812 scrntype_t DISPLAY::GETVRAM_TEXTCOLOR(uint8_t attr, bool do_green)
814 int color = attr & 0x07;
817 static const int green_g_table[16] = {0, 24, 48, 64, 80, 96, 112, 128,
818 140, 155, 175, 186, 210, 220, 240, 255};
820 if((attr & 0x20) != 0) color += 8;
822 g = green_g_table[color];
824 r = (color - 9) * 16;
825 b = (color - 9) * 16;
828 if((attr & 0x20) != 0) {
829 g = ((color & 4) != 0) ? 255 : 0;
830 r = ((color & 2) != 0) ? 255 : 0;
831 b = ((color & 1) != 0) ? 255 : 0;
833 g = ((color & 4) != 0) ? 128 : 0;
834 r = ((color & 2) != 0) ? 128 : 0;
835 b = ((color & 1) != 0) ? 128 : 0;
838 return RGBA_COLOR(r, g, b, 255);
841 uint8_t DISPLAY::GETVRAM_TEXTPIX(uint8_t bitdata, bool reverse, bool cursor_rev)
843 uint8_t ret = bitdata;
845 ret = (uint8_t)(~ret);
848 ret = (uint8_t)(~ret);
853 void DISPLAY::GETVRAM_1_400L(int yoff, scrntype_t *p)
857 if(p == NULL) return;
858 yoff_d = yoff & 0x7fff;
859 pixel = gvram_shadow[yoff_d];
860 uint16_vec8_t *ppx = (uint16_vec8_t *)(&(bit_trans_table_0[pixel][0]));
861 __DECL_ALIGNED(16) uint16_vec8_t tmp_d;
862 __DECL_ALIGNED(32) scrntype_vec8_t tmp_dd;
863 scrntype_vec8_t *vp = (scrntype_vec8_t *)p;
866 tmp_d.v = tmp_d.v >> 5;
868 __DECL_VECTORIZED_LOOP
869 for(int i = 0; i < 8; i++) {
870 tmp_dd.w[i] = dpalette_pixel[tmp_d.w[i]];
876 void DISPLAY::GETVRAM_1_400L_GREEN(int yoff, scrntype_t *p)
880 if(p == NULL) return;
881 yoff_d = yoff & 0x7fff;
882 pixel = gvram_shadow[yoff_d];
883 uint16_vec8_t *ppx = (uint16_vec8_t *)(&(bit_trans_table_0[pixel][0]));
884 __DECL_ALIGNED(16) uint16_vec8_t tmp_d;
885 __DECL_ALIGNED(32) scrntype_vec8_t tmp_dd;
886 scrntype_vec8_t *vp = (scrntype_vec8_t *)p;
889 tmp_d.v = tmp_d.v >> 5;
891 __DECL_VECTORIZED_LOOP
892 for(int i = 0; i < 8; i++) {
893 tmp_dd.w[i] = dpalette_pixel_green[tmp_d.w[i]];
901 #if defined(_FM77AV_VARIANTS)
902 void DISPLAY::GETVRAM_4096(int yoff, scrntype_t *p, scrntype_t *px,
908 uint8_t bb[4], rr[4], gg[4];
909 __DECL_ALIGNED(16) uint16_vec8_t pixels;
910 __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};
916 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
917 int dpage = vram_display_block;
919 if(p == NULL) return;
923 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
936 bb[0] = gvram_shadow[yoff_d1];
937 bb[1] = gvram_shadow[yoff_d1 + 0x02000];
938 rr[0] = gvram_shadow[yoff_d1 + 0x04000];
939 rr[1] = gvram_shadow[yoff_d1 + 0x06000];
940 gg[0] = gvram_shadow[yoff_d1 + 0x08000];
941 gg[1] = gvram_shadow[yoff_d1 + 0x0a000];
943 bb[2] = gvram_shadow[yoff_d2 + 0x0c000];
944 bb[3] = gvram_shadow[yoff_d2 + 0x0e000];
945 rr[2] = gvram_shadow[yoff_d2 + 0x10000];
946 rr[3] = gvram_shadow[yoff_d2 + 0x12000];
947 gg[2] = gvram_shadow[yoff_d2 + 0x14000];
948 gg[3] = gvram_shadow[yoff_d2 + 0x16000];
950 uint16_t *p0, *p1, *p2, *p3;
951 #if !defined(FIXED_FRAMEBUFFER_SIZE)
952 __DECL_ALIGNED(sizeof(scrntype_t) * 8) scrntype_t tmp_dd[8];
954 __DECL_ALIGNED(sizeof(scrntype_t) * 8) scrntype_t tmp_dd[16];
956 __DECL_ALIGNED(16) uint16_vec8_t tmp_g, tmp_r, tmp_b;
957 __v8hi *vp0, *vp1, *vp2, *vp3;
959 vp0 = (__v8hi*)(&(bit_trans_table_0[gg[0]][0]));
960 vp1 = (__v8hi*)(&(bit_trans_table_1[gg[1]][0]));
961 vp2 = (__v8hi*)(&(bit_trans_table_2[gg[2]][0]));
962 vp3 = (__v8hi*)(&(bit_trans_table_3[gg[3]][0]));
964 tmp_g.v = tmp_g.v | *vp1;
965 tmp_g.v = tmp_g.v | *vp2;
966 tmp_g.v = tmp_g.v | *vp3;
968 vp0 = (__v8hi*)(&(bit_trans_table_0[rr[0]][0]));
969 vp1 = (__v8hi*)(&(bit_trans_table_1[rr[1]][0]));
970 vp2 = (__v8hi*)(&(bit_trans_table_2[rr[2]][0]));
971 vp3 = (__v8hi*)(&(bit_trans_table_3[rr[3]][0]));
973 tmp_r.v = tmp_r.v | *vp1;
974 tmp_r.v = tmp_r.v | *vp2;
975 tmp_r.v = tmp_r.v | *vp3;
978 vp0 = (__v8hi*)(&(bit_trans_table_0[bb[0]][0]));
979 vp1 = (__v8hi*)(&(bit_trans_table_1[bb[1]][0]));
980 vp2 = (__v8hi*)(&(bit_trans_table_2[bb[2]][0]));
981 vp3 = (__v8hi*)(&(bit_trans_table_3[bb[3]][0]));
983 tmp_b.v = tmp_b.v | *vp1;
984 tmp_b.v = tmp_b.v | *vp2;
985 tmp_b.v = tmp_b.v | *vp3;
987 __v8hi *mp = (__v8hi*)__masks;
988 tmp_g.v = tmp_g.v << 4;
989 tmp_b.v = tmp_b.v >> 4;
991 pixels.v = pixels.v | tmp_r.v;
992 pixels.v = pixels.v | tmp_g.v;
993 pixels.v = pixels.v & *mp;
996 scrntype_vec8_t *vp = (scrntype_vec8_t*)p;
997 scrntype_vec8_t *dp = (scrntype_vec8_t*)tmp_dd;
998 #if !defined(FIXED_FRAMEBUFFER_SIZE)
999 __DECL_VECTORIZED_LOOP
1000 for(int i = 0; i < 8; i++) {
1001 tmp_dd[i] = analog_palette_pixel[pixels[i]];
1005 __DECL_VECTORIZED_LOOP
1006 for(int i = 0; i < 8; i++) {
1007 tmp_dd[i * 2] = tmp_dd[i * 2 + 1] = analog_palette_pixel[pixels.w[i]];;
1009 scrntype_vec8_t *vpx = (scrntype_vec8_t*)px;
1010 __DECL_ALIGNED(32) scrntype_vec8_t vmask;
1011 __DECL_VECTORIZED_LOOP
1012 for(int i = 0; i < 2; i++) {
1016 /* Fancy scanline */
1017 __DECL_VECTORIZED_LOOP
1018 for(int i = 0; i < 2; i++) {
1019 #if defined(_RGB888) || defined(_RGBA888)
1020 dp[i].v = dp[i].v >> 3;
1021 #elif defined(_RGB555)
1022 dp[i].v = dp[i].v >> 2;
1023 #elif defined(_RGB565)
1024 dp[i].v = dp[i].v >> 2;
1027 __DECL_VECTORIZED_LOOP
1028 for(int i = 0; i < 8; i++) {
1029 vmask.w[i] = (const scrntype_t)RGBA_COLOR(31, 31, 31, 255);
1031 __DECL_VECTORIZED_LOOP
1032 for(int i = 0; i < 2; i++) {
1033 dp[i].v = dp[i].v & vmask.v;
1037 __DECL_VECTORIZED_LOOP
1038 for(int i = 0; i < 2; i++) {
1046 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
1048 void DISPLAY::GETVRAM_256k(int yoff, scrntype_t *p, scrntype_t *px, bool scan_line)
1050 uint32_t b3, r3, g3;
1051 uint32_t b4, r4, g4;
1052 uint32_t btmp, rtmp, gtmp;
1061 if(p == NULL) return;
1070 uint8_t bb[8], rr[8], gg[8];
1072 __DECL_ALIGNED(16) uint16_vec8_t _btmp;
1073 __DECL_ALIGNED(16) uint16_vec8_t _rtmp;
1074 __DECL_ALIGNED(16) uint16_vec8_t _gtmp;
1075 uint16_vec8_t *vp0, *vp1, *vp2, *vp3, *vp4, *vp5;
1076 #if !defined(FIXED_FRAMEBUFFER_SIZE)
1077 __DECL_ALIGNED(sizeof(scrntype_t) * 8) scrntype_t tmp_dd[8];
1079 __DECL_ALIGNED(sizeof(scrntype_t) * 8) scrntype_t tmp_dd[16];
1081 // if(mask & 0x01) {
1082 if(!multimode_dispflags[0]) {
1084 bb[0] = gvram_shadow[yoff_d1];
1085 bb[1] = gvram_shadow[yoff_d1 + 0x02000];
1087 bb[2] = gvram_shadow[yoff_d2 + 0x0c000];
1088 bb[3] = gvram_shadow[yoff_d2 + 0x0e000];
1090 bb[4] = gvram_shadow[yoff_d1 + 0x18000];
1091 bb[5] = gvram_shadow[yoff_d1 + 0x1a000];
1093 vp0 = (uint16_vec8_t*)(&(bit_trans_table_0[bb[0]][0]));
1094 vp1 = (uint16_vec8_t*)(&(bit_trans_table_1[bb[1]][0]));
1095 vp2 = (uint16_vec8_t*)(&(bit_trans_table_2[bb[2]][0]));
1096 vp3 = (uint16_vec8_t*)(&(bit_trans_table_3[bb[3]][0]));
1097 vp4 = (uint16_vec8_t*)(&(bit_trans_table_4[bb[4]][0]));
1098 vp5 = (uint16_vec8_t*)(&(bit_trans_table_5[bb[5]][0]));
1100 _btmp.v = _btmp.v | vp1->v;
1101 _btmp.v = _btmp.v | vp2->v;
1102 _btmp.v = _btmp.v | vp3->v;
1103 _btmp.v = _btmp.v | vp4->v;
1104 _btmp.v = _btmp.v | vp5->v;
1106 __DECL_VECTORIZED_LOOP
1107 for(int i = 0; i < 8; i++) {
1111 if(!multimode_dispflags[1]) {
1114 rr[0] = gvram_shadow[yoff_d1 + 0x04000];
1115 rr[1] = gvram_shadow[yoff_d1 + 0x06000];
1117 rr[2] = gvram_shadow[yoff_d2 + 0x10000];
1118 rr[3] = gvram_shadow[yoff_d2 + 0x12000];
1120 rr[4] = gvram_shadow[yoff_d1 + 0x1c000];
1121 rr[5] = gvram_shadow[yoff_d1 + 0x1e000];
1123 vp0 = (uint16_vec8_t*)(&(bit_trans_table_0[rr[0]][0]));
1124 vp1 = (uint16_vec8_t*)(&(bit_trans_table_1[rr[1]][0]));
1125 vp2 = (uint16_vec8_t*)(&(bit_trans_table_2[rr[2]][0]));
1126 vp3 = (uint16_vec8_t*)(&(bit_trans_table_3[rr[3]][0]));
1127 vp4 = (uint16_vec8_t*)(&(bit_trans_table_4[rr[4]][0]));
1128 vp5 = (uint16_vec8_t*)(&(bit_trans_table_5[rr[5]][0]));
1130 _rtmp.v = _rtmp.v | vp1->v;
1131 _rtmp.v = _rtmp.v | vp2->v;
1132 _rtmp.v = _rtmp.v | vp3->v;
1133 _rtmp.v = _rtmp.v | vp4->v;
1134 _rtmp.v = _rtmp.v | vp5->v;
1136 __DECL_VECTORIZED_LOOP
1137 for(int i = 0; i < 8; i++) {
1141 if(!multimode_dispflags[2]) {
1144 gg[0] = gvram_shadow[yoff_d1 + 0x08000];
1145 gg[1] = gvram_shadow[yoff_d1 + 0x0a000];
1147 gg[2] = gvram_shadow[yoff_d2 + 0x14000];
1148 gg[3] = gvram_shadow[yoff_d2 + 0x16000];
1150 gg[4] = gvram_shadow[yoff_d1 + 0x20000];
1151 gg[5] = gvram_shadow[yoff_d1 + 0x22000];
1153 vp0 = (uint16_vec8_t*)(&(bit_trans_table_0[gg[0]][0]));
1154 vp1 = (uint16_vec8_t*)(&(bit_trans_table_1[gg[1]][0]));
1155 vp2 = (uint16_vec8_t*)(&(bit_trans_table_2[gg[2]][0]));
1156 vp3 = (uint16_vec8_t*)(&(bit_trans_table_3[gg[3]][0]));
1157 vp4 = (uint16_vec8_t*)(&(bit_trans_table_4[gg[4]][0]));
1158 vp5 = (uint16_vec8_t*)(&(bit_trans_table_5[gg[5]][0]));
1160 _gtmp.v = _gtmp.v | vp1->v;
1161 _gtmp.v = _gtmp.v | vp2->v;
1162 _gtmp.v = _gtmp.v | vp3->v;
1163 _gtmp.v = _gtmp.v | vp4->v;
1164 _gtmp.v = _gtmp.v | vp5->v;
1166 __DECL_VECTORIZED_LOOP
1167 for(int i = 0; i < 8; i++) {
1172 scrntype_vec8_t* vpp = (scrntype_vec8_t*)p;
1173 scrntype_vec8_t* dp = (scrntype_vec8_t*)tmp_dd;
1174 #if !defined(FIXED_FRAMEBUFFER_SIZE)
1175 __DECL_VECTORIZED_LOOP
1176 for(int i = 0; i < 8; i++) {
1177 tmp_dd[i] = RGB_COLOR(_rtmp.w[i], _gtmp.w[i], _btmp.w[i]);
1181 __DECL_VECTORIZED_LOOP
1182 for(int i = 0; i < 8; i++) {
1183 tmp_dd[i * 2] = tmp_dd[i * 2 + 1] = RGB_COLOR(_rtmp.w[i], _gtmp.w[i], _btmp.w[i]);
1186 __DECL_VECTORIZED_LOOP
1187 for(int i = 0; i < 2; i++) {
1190 scrntype_vec8_t* vpx = (scrntype_vec8_t*)px;
1192 /* Fancy scanline */
1193 __DECL_VECTORIZED_LOOP
1194 for(int i = 0; i < 2; i++) {
1195 #if defined(_RGB888) || defined(_RGBA888)
1196 dp[i].v = dp[i].v >> 3;
1197 #elif defined(_RGB555)
1198 dp[i].v = dp[i].v >> 2;
1199 #elif defined(_RGB565)
1200 dp[i].v = dp[i].v >> 2;
1203 __DECL_ALIGNED(32) scrntype_vec8_t scanline_data;
1204 __DECL_VECTORIZED_LOOP
1205 for(int i = 0; i < 8; i++) {
1206 scanline_data.w[i] = RGBA_COLOR(31, 31, 31, 255);
1208 __DECL_VECTORIZED_LOOP
1209 for(int i = 0; i < 2; i++) {
1210 dp[i].v = dp[i].v & scanline_data.v;
1214 for(int i = 0; i < 2; i++) {