OSDN Git Service

[VM][Qt][OSD][CMake] Fix FTBFSs at least for FM-7 series with GCC/*nix/Qt.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fm7 / vram.cpp
1 /*
2  * Common source code project -> FM-7 -> Display -> Vram access
3  * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
4  * History:
5  *  Sep 27, 2015 : Split from display.cpp .
6  */
7
8 #include "fm7_display.h"
9
10 uint8 DISPLAY::read_vram_l4_400l(uint32 addr, uint32 offset)
11 {
12 #if defined(_FM77L4)
13         if(addr < 0x8000) {
14                 if(workram) {
15                         uint32 raddr = addr & 0x3fff;
16                         if((multimode_accessmask & 0x04) == 0) {
17                                 return gvram[0x8000 + (raddr + offset) & 0x7fff];
18                         }
19                         return 0xff;
20                 }
21                 pagemod = addr & 0x4000;
22                 return gvram[((addr + offset) & mask) | pagemod];
23         } else if(addr < 0x9800) {
24                 return textvram[addr & 0x0fff];
25         } else { // $9800-$bfff
26                 return subrom_l4[addr - 0x9800];
27         }
28 #endif
29         return 0xff;
30 }
31
32 void DISPLAY::write_vram_l4_400l(uint32 addr, uint32 offset, uint32 data)
33 {
34 #if defined(_FM77L4)
35         if(addr < 0x8000) {
36                 if(workram) {
37                         uint32 raddr = addr & 0x3fff;
38                         if((multimode_accessmask & 0x04) == 0) {
39                                 gvram[0x8000 + (raddr + offset) & 0x7fff] = (uint8)data;
40                         }
41                         return;
42                 }
43                 pagemod = addr & 0x4000;
44                 gvram[((addr + offset) & mask) | pagemod] = (uint8)data;
45         } else if(addr < 0x9800) {
46           textvram[addr & 0x0fff] = (uint8)data;
47         } else { // $9800-$bfff
48                 //return subrom_l4[addr - 0x9800];
49         }
50         return;
51 #endif  
52 }
53
54 inline void DISPLAY::GETVRAM_8_200L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
55 {
56         register uint8 b, r, g;
57         register uint32 dot;
58         uint32 yoff_d;
59 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
60         int dpage = vram_display_block;
61 #endif
62         if(p == NULL) return;
63 #if defined(_FM77AV_VARIANTS)
64         if(display_page == 1) { // Is this dirty?
65                 yoff_d = offset_point_bank1_bak;
66         } else {
67                 yoff_d = offset_point_bak;
68         }
69 #else
70         yoff_d = offset_point;
71 #endif  
72         yoff_d = (yoff + yoff_d) & 0x3fff;
73 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
74         if(window_inv) {
75                 if(dpage == 0) {
76                         dpage = 1;
77                 } else {
78                         dpage = 0;
79                 }
80         }
81         if(dpage != 0) yoff_d += 0x18000;
82 #endif
83         b = r = g = 0;
84 #if defined(_FM77AV_VARIANTS)
85         if(display_page == 1) {
86                 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x0c000];
87                 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x10000];
88                 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x14000];
89         } else {
90                 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
91                 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x04000];
92                 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x08000];
93         }
94 #else
95         if(mask & 0x01) b = gvram[yoff_d + 0x00000];
96         if(mask & 0x02) r = gvram[yoff_d + 0x04000];
97         if(mask & 0x04) g = gvram[yoff_d + 0x08000];
98 #endif  
99         dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
100         p[0] = dpalette_pixel[dot];
101         dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
102         p[1] = dpalette_pixel[dot];
103         dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
104         p[2] = dpalette_pixel[dot];
105         dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
106         p[3] = dpalette_pixel[dot];
107                                         
108         dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
109         p[4] = dpalette_pixel[dot];
110         dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
111         p[5] = dpalette_pixel[dot];
112         dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
113         p[6] = dpalette_pixel[dot];
114         dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
115         p[7] = dpalette_pixel[dot];
116 }
117
118 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
119 inline void DISPLAY::GETVRAM_8_400L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
120 {
121         register uint8 b, r, g;
122         register uint32 dot;
123         uint32 yoff_d;
124 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
125         int dpage = vram_display_block;
126 # endif
127         if(p == NULL) return;
128         if(display_page == 1) { // Is this dirty?
129                 yoff_d = offset_point_bank1_bak;
130         } else {
131                 yoff_d = offset_point_bak;
132         }
133         yoff_d = (yoff + (yoff_d << 1)) & 0x7fff;
134 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
135         if(window_inv) {
136                 if(dpage == 0) {
137                         dpage = 1;
138                 } else {
139                         dpage = 0;
140                 }
141         }
142         if(dpage != 0) yoff_d += 0x18000;
143 # endif
144         b = r = g = 0;
145         if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
146         if(mask & 0x02) r = gvram_shadow[yoff_d + 0x08000];
147         if(mask & 0x04) g = gvram_shadow[yoff_d + 0x10000];
148
149         dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
150         p[0] = dpalette_pixel[dot];
151         dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
152         p[1] = dpalette_pixel[dot];
153         dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
154         p[2] = dpalette_pixel[dot];
155         dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
156         p[3] = dpalette_pixel[dot];
157                                         
158         dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
159         p[4] = dpalette_pixel[dot];
160         dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
161         p[5] = dpalette_pixel[dot];
162         dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
163         p[6] = dpalette_pixel[dot];
164         dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
165         p[7] = dpalette_pixel[dot];
166 }
167
168 inline void DISPLAY::GETVRAM_256k(int yoff, scrntype *p, uint32 mask)
169 {
170         register uint32 b3, r3, g3;
171         register uint32 b4, r4, g4;
172         register uint32 btmp, rtmp, gtmp;
173         
174         register scrntype b, r, g;
175         scrntype pixel;
176         uint32 yoff_d1, yoff_d2;
177         uint32 _bit;
178         int _shift;
179         int cp;
180         if(p == NULL) return;
181         
182         r3 = g3 = b3 = 0;
183         r4 = g4 = b4 = 0;
184         r = g = b = 0;
185         
186         yoff_d1 = offset_point_bak;
187         yoff_d2 = offset_point_bank1_bak;
188         yoff_d1 = (yoff + yoff_d1) & 0x1fff;
189         yoff_d2 = (yoff + yoff_d2) & 0x1fff;
190         if(mask & 0x01) {
191                 b3  = gvram_shadow[yoff_d1] << 24;
192                 b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
193                 
194                 b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
195                 b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
196         
197                 b4  = gvram_shadow[yoff_d1 + 0x18000] << 8;
198                 b4 |= gvram_shadow[yoff_d1 + 0x1a000] << 0;
199         }
200         if(mask & 0x02) {
201                 r3  = gvram_shadow[yoff_d1 + 0x04000] << 24;
202                 r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
203                 r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
204                 r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
205                 r4  = gvram_shadow[yoff_d1 + 0x1c000] << 8;
206                 r4 |= gvram_shadow[yoff_d1 + 0x1e000] << 0;
207         }
208
209         if(mask & 0x04) {
210                 g3  = gvram_shadow[yoff_d1 + 0x08000] << 24;
211                 g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
212                 g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
213                 g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
214                 
215                 g4  = gvram_shadow[yoff_d1 + 0x20000] << 8;
216                 g4 |= gvram_shadow[yoff_d1 + 0x22000] << 0;
217         }
218         
219         cp = 0;
220         for(_shift = 7; _shift >= 0; _shift--) {
221                 _bit = 0x01010101 << _shift;
222                 r = g = b = 0;
223                 if(mask & 0x01) {
224                         btmp = (b3 & _bit) >> _shift;
225                         b = (((btmp & (0x01 << 24)) != 0) ? 0x80 : 0) | (((btmp & (0x01 << 16)) != 0)? 0x40 : 0)
226                                 | (((btmp & (0x01 << 8)) != 0) ? 0x20 : 0) | (((btmp & 0x01) != 0) ? 0x10   : 0);
227                         btmp = (b4 & _bit) >> _shift;
228                         b = b | (((btmp & (0x01 << 8)) != 0) ? 0x08 : 0) | (((btmp & 0x01) != 0) ? 0x04 : 0);
229                 }
230                 if(mask & 0x02) {
231                         rtmp = (r3 & _bit) >> _shift;
232                         r = ((rtmp & (0x01 << 24)) ? 0x80 : 0) | ((rtmp & (0x01 << 16)) ? 0x40 : 0)
233                                 | ((rtmp & (0x01 << 8)) ? 0x20 : 0) | ((rtmp & 0x01) ? 0x10   : 0);
234                         rtmp = (r4 & _bit) >> _shift;
235                         r = r | ((rtmp & (0x01 << 8)) ? 0x08 : 0) | ((rtmp & 0x01) ? 0x04 : 0);
236                 }
237                 if(mask & 0x04) {
238                         gtmp = (g3 & _bit) >> _shift;
239                         g = ((gtmp & (0x01 << 24)) ? 0x80 : 0) | ((gtmp & (0x01 << 16)) ? 0x40 : 0)
240                                 | ((gtmp & (0x01 << 8)) ? 0x20 : 0) | ((gtmp & 0x01) ? 0x10   : 0);
241                         gtmp = (g4 & _bit) >> _shift;
242                         g = g | ((gtmp & (0x01 << 8)) ? 0x08 : 0) | ((gtmp & 0x01) ? 0x04 : 0);
243                 }
244         
245                 pixel = RGB_COLOR(r, g, b);
246                 p[cp] = pixel;
247                 //p[cp + 1] = pixel;
248                 cp += 1;
249         }
250         
251 }
252 #endif
253
254 #if defined(_FM77AV_VARIANTS)
255 inline void DISPLAY::GETVRAM_4096(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
256 {
257         uint32 b3, r3, g3;
258         scrntype b, r, g;
259         uint32 idx;;
260         scrntype pixel;
261         uint32 yoff_d1, yoff_d2;
262 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
263         int dpage = vram_display_block;
264 # endif
265         if(p == NULL) return;
266         
267         yoff_d1 = offset_point_bak;
268         yoff_d2 = offset_point_bank1_bak;
269         yoff_d1 = (yoff + yoff_d1) & 0x1fff;
270         yoff_d2 = (yoff + yoff_d2) & 0x1fff;
271 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
272         if(window_inv) {
273                 if(dpage == 0) {
274                         dpage = 1;
275                 } else {
276                         dpage = 0;
277                 }
278         }
279         if(dpage != 0) {
280                 yoff_d1 += 0x18000;
281                 yoff_d2 += 0x18000;
282         }
283 # endif
284
285         b3  = gvram_shadow[yoff_d1] << 24;
286         b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
287         r3  = gvram_shadow[yoff_d1 + 0x04000] << 24;
288         r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
289                 
290         g3  = gvram_shadow[yoff_d1 + 0x08000] << 24;
291         g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
292                 
293         b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
294         b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
295                 
296         r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
297         r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
298         g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
299         g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
300    
301         g = ((g3 & (0x80 << 24)) >> 20) | ((g3 & (0x80 << 16)) >> 13) | ((g3 & (0x80 << 8)) >> 6)  | ((g3 & 0x80) << 1);
302         r = ((r3 & (0x80 << 24)) >> 24) | ((r3 & (0x80 << 16)) >> 17) | ((r3 & (0x80 << 8)) >> 10) | ((r3 & 0x80) >> 3);
303         b = ((b3 & (0x80 << 24)) >> 28) | ((b3 & (0x80 << 16)) >> 21) | ((b3 & (0x80 << 8)) >> 14) | ((b3 & 0x80) >> 7);
304            
305         idx = (g  | b | r ) & mask;
306         pixel = analog_palette_pixel[idx];
307         p[0] = pixel;
308         //p[1] = pixel;
309
310         g = ((g3 & (0x40 << 24)) >> 19) | ((g3 & (0x40 << 16)) >> 12) | ((g3 & (0x40 << 8)) >> 5)  | ((g3 & 0x40) << 2);
311         r = ((r3 & (0x40 << 24)) >> 23) | ((r3 & (0x40 << 16)) >> 16) | ((r3 & (0x40 << 8)) >> 9)  | ((r3 & 0x40) >> 2);
312         b = ((b3 & (0x40 << 24)) >> 27) | ((b3 & (0x40 << 16)) >> 20) | ((b3 & (0x40 << 8)) >> 13) | ((b3 & 0x40) >> 6);
313         
314         idx = (g  | b | r ) & mask;
315         pixel = analog_palette_pixel[idx];
316         p[1] = pixel;
317         //p[3] = pixel;
318
319         g = ((g3 & (0x20 << 24)) >> 18) | ((g3 & (0x20 << 16)) >> 11) | ((g3 & (0x20 << 8)) >> 4)  | ((g3 & 0x20) << 3);
320         r = ((r3 & (0x20 << 24)) >> 22) | ((r3 & (0x20 << 16)) >> 15) | ((r3 & (0x20 << 8)) >> 8)  | ((r3 & 0x20) >> 1);
321         b = ((b3 & (0x20 << 24)) >> 26) | ((b3 & (0x20 << 16)) >> 19) | ((b3 & (0x20 << 8)) >> 12) | ((b3 & 0x20) >> 5);
322            
323         idx = (g  | b | r ) & mask;
324         pixel = analog_palette_pixel[idx];
325         p[2] = pixel;
326         //p[5] = pixel;
327
328         g = ((g3 & (0x10 << 24)) >> 17) | ((g3 & (0x10 << 16)) >> 10) | ((g3 & (0x10 << 8)) >> 3)  | ((g3 & 0x10) << 4);
329         r = ((r3 & (0x10 << 24)) >> 21) | ((r3 & (0x10 << 16)) >> 14) | ((r3 & (0x10 << 8)) >> 7)  | ((r3 & 0x10) >> 0);
330         b = ((b3 & (0x10 << 24)) >> 25) | ((b3 & (0x10 << 16)) >> 18) | ((b3 & (0x10 << 8)) >> 11) | ((b3 & 0x10) >> 4);
331            
332         idx = (g  | b | r ) & mask;
333         pixel = analog_palette_pixel[idx];
334         p[3] = pixel;
335         //p[7] = pixel;
336
337         g = ((g3 & (0x8 << 24)) >> 16) | ((g3 & (0x8 << 16)) >> 9)  | ((g3 & (0x8 << 8)) >> 2)  | ((g3 & 0x8) << 5);
338         r = ((r3 & (0x8 << 24)) >> 20) | ((r3 & (0x8 << 16)) >> 13) | ((r3 & (0x8 << 8)) >> 6)  | ((r3 & 0x8) << 1);
339         b = ((b3 & (0x8 << 24)) >> 24) | ((b3 & (0x8 << 16)) >> 17) | ((b3 & (0x8 << 8)) >> 10) | ((b3 & 0x8) >> 3);
340            
341         idx = (g  | b | r ) & mask;
342         pixel = analog_palette_pixel[idx];
343         p[4] = pixel;
344         //p[9] = pixel;
345
346         
347         g = ((g3 & (0x4 << 24)) >> 15) | ((g3 & (0x4 << 16)) >> 8)  | ((g3 & (0x4 << 8)) >> 1) | ((g3 & 0x4) << 6);
348         r = ((r3 & (0x4 << 24)) >> 19) | ((r3 & (0x4 << 16)) >> 12) | ((r3 & (0x4 << 8)) >> 5) | ((r3 & 0x4) << 2);
349         b = ((b3 & (0x4 << 24)) >> 23) | ((b3 & (0x4 << 16)) >> 16) | ((b3 & (0x4 << 8)) >> 9) | ((b3 & 0x4) >> 2);
350            
351         idx = (g  | b | r ) & mask;
352         pixel = analog_palette_pixel[idx];
353         p[5] = pixel;
354         //p[11] = pixel;
355
356         g = ((g3 & (0x2 << 24)) >> 14) | ((g3 & (0x2 << 16)) >> 7)  | ((g3 & (0x2 << 8)) >> 0) | ((g3 & 0x2) << 7);
357         r = ((r3 & (0x2 << 24)) >> 18) | ((r3 & (0x2 << 16)) >> 11) | ((r3 & (0x2 << 8)) >> 4) | ((r3 & 0x2) << 3);
358         b = ((b3 & (0x2 << 24)) >> 22) | ((b3 & (0x2 << 16)) >> 15) | ((b3 & (0x2 << 8)) >> 8) | ((b3 & 0x2) >> 1);
359            
360         idx = (g  | b | r ) & mask;
361         pixel = analog_palette_pixel[idx];
362         p[6] = pixel;
363         //p[13] = pixel;
364
365         g = ((g3 & (0x1 << 24)) >> 13) | ((g3 & (0x1 << 16)) >> 6)  | ((g3 & (0x1 << 8)) << 1) | ((g3 & 0x1) << 8);
366         r = ((r3 & (0x1 << 24)) >> 17) | ((r3 & (0x1 << 16)) >> 10) | ((r3 & (0x1 << 8)) >> 3) | ((r3 & 0x1) << 4);
367         b = ((b3 & (0x1 << 24)) >> 21) | ((b3 & (0x1 << 16)) >> 14) | ((b3 & (0x1 << 8)) >> 7) | ((b3 & 0x1) >> 0);
368            
369         idx = (g  | b | r ) & mask;
370         pixel = analog_palette_pixel[idx];
371         p[7] = pixel;
372         //p[15] = pixel;
373 }
374 #endif
375
376 void DISPLAY::draw_screen()
377 {
378         int y;
379         int x;
380         scrntype *p, *pp;
381         register int yoff;
382         register uint32 rgbmask;
383         uint16 wx_begin, wx_end, wy_low, wy_high;
384 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
385         {
386                 wx_begin = window_xbegin;
387                 wx_end   = window_xend;
388                 wy_low   = window_low;
389                 wy_high  = window_high;
390                 bool _flag = window_opened; 
391                 if((wx_begin < wx_end) && (wy_low < wy_high)) {
392                         window_opened = true;
393                 } else {
394                         window_opened = false;
395                 }
396                 if(_flag != window_opened) vram_wrote_shadow = true;
397         }
398 #endif
399         frame_skip_count++;
400 #if defined(_FM77AV_VARIANTS)
401         {
402                 int factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
403                 if(frame_skip_count <= factor) return;
404                 frame_skip_count = 0;
405         }
406 #else
407         {
408                 int factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
409                 if((frame_skip_count <= factor) || !(vram_wrote)) return;
410                 vram_wrote = false;
411                 frame_skip_count = 0;
412         }
413 #endif
414           // Set blank
415         if(!crt_flag) {
416                 if(crt_flag_bak) {
417                         scrntype *ppp;
418                         if(display_mode == DISPLAY_MODE_8_200L) {
419                                 emu->set_vm_screen_size(640, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
420                                 for(y = 0; y < 200; y++) {
421                                         ppp = emu->screen_buffer(y);
422                                         if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype));
423                                 }
424                         } else if(display_mode == DISPLAY_MODE_8_400L) {
425                                 emu->set_vm_screen_size(640, 400, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
426                                 for(y = 0; y < 400; y++) {
427                                         ppp = emu->screen_buffer(y);
428                                         if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype));
429                                 }
430                         } else { // 320x200
431                                 emu->set_vm_screen_size(320, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
432                                 for(y = 0; y < 200; y++) {
433                                         ppp = emu->screen_buffer(y);
434                                         if(ppp != NULL) memset(ppp, 0x00, 320 * sizeof(scrntype));
435                                 }
436                         }
437                 }
438                 crt_flag_bak = crt_flag;
439                 return;
440         }
441         crt_flag_bak = crt_flag;
442 # if defined(_FM77AV_VARIANTS)
443         if(!vram_wrote_shadow) return;
444 # endif
445         if(display_mode == DISPLAY_MODE_8_200L) {
446                 emu->set_vm_screen_size(640, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
447                 yoff = 0;
448                 rgbmask = ~multimode_dispmask;
449                 for(y = 0; y < 200; y ++) {
450                         p = emu->screen_buffer(y);
451                         if(p == NULL) continue;
452                         pp = p;
453                         yoff = y  * 80;
454 # if defined(_FM77AV_VARIANTS)
455                         vram_draw_table[y] = false;     
456 # endif                 
457 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
458                         if(window_opened && (wy_low <= y) && (wy_high > y)) {
459                                         for(x = 0; x < 80; x++) {
460                                                 if((x >= wx_begin) && (x < wx_end)) {
461                                                         GETVRAM_8_200L(yoff, p, rgbmask, true);
462                                                 } else {
463                                                         GETVRAM_8_200L(yoff, p, rgbmask, false);
464                                                 }
465                                                 p += 8;
466                                                 yoff++;
467                                         }
468                         } else
469 # endif
470                         {
471                                 for(x = 0; x < 10; x++) {
472                                         GETVRAM_8_200L(yoff + 0, p, rgbmask, false);
473                                         p += 8;
474                                         
475                                         GETVRAM_8_200L(yoff + 1, p, rgbmask, false);
476                                         p += 8;
477                                         
478                                         GETVRAM_8_200L(yoff + 2, p, rgbmask, false);
479                                         p += 8;
480                                         
481                                         GETVRAM_8_200L(yoff + 3, p, rgbmask, false);
482                                         p += 8;
483                                         
484                                         GETVRAM_8_200L(yoff + 4, p, rgbmask, false);
485                                         p += 8;
486                                         
487                                         GETVRAM_8_200L(yoff + 5, p, rgbmask, false);
488                                         p += 8;
489                                                 
490                                         GETVRAM_8_200L(yoff + 6, p, rgbmask, false);
491                                         p += 8;
492                           
493                                         GETVRAM_8_200L(yoff + 7, p, rgbmask, false);
494                                         p += 8;
495                                         yoff += 8;
496                                 }
497                         }
498                         //if(config.scan_line == 0) {
499                         //      memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
500                         //} else {
501                         //      memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
502                         //}
503                 }
504 # if defined(_FM77AV_VARIANTS)
505                 vram_wrote_shadow = false;
506 # endif         
507                 return;
508         }
509 # if defined(_FM77AV_VARIANTS)
510         if(display_mode == DISPLAY_MODE_4096) {
511                 emu->set_vm_screen_size(320, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
512                 uint32 mask = 0;
513                 yoff = 0;
514                 rgbmask = multimode_dispmask;
515                 if((rgbmask & 0x01) == 0) mask = 0x00f;
516                 if((rgbmask & 0x02) == 0) mask = mask | 0x0f0;
517                 if((rgbmask & 0x04) == 0) mask = mask | 0xf00;
518                 for(y = 0; y < 200; y ++) {
519                         p = emu->screen_buffer(y);
520                         if(p == NULL) continue;
521                         pp = p;
522                         yoff = y * 40;
523 # if defined(_FM77AV_VARIANTS)
524                         vram_draw_table[y] = false;     
525 # endif                 
526 #  if defined(_FM77AV40EX) || defined(_FM77AV40SX)
527                         if(window_opened && (wy_low <= y) && (wy_high > y)) {
528                                         for(x = 0; x < 40; x++) {
529                                                 if((x >= wx_begin) && (x < wx_end)) {
530                                                         GETVRAM_4096(yoff, p, mask, true);
531                                                 } else {
532                                                         GETVRAM_4096(yoff, p, mask, false);
533                                                 }
534                                                 p += 8;
535                                                 yoff++;
536                                         }
537                         } else
538 #  endif
539                         {
540                                 for(x = 0; x < 5; x++) {
541                                         GETVRAM_4096(yoff + 0, p, mask);
542                                         p += 8;
543                                         
544                                         GETVRAM_4096(yoff + 1, p, mask);
545                                         p += 8;
546                                         
547                                         GETVRAM_4096(yoff + 2, p, mask);
548                                         p += 8;
549                                         
550                                         GETVRAM_4096(yoff + 3, p, mask);
551                                         p += 8;
552                                         
553                                         GETVRAM_4096(yoff + 4, p, mask);
554                                         p += 8;
555                           
556                                         GETVRAM_4096(yoff + 5, p, mask);
557                                         p += 8;
558                                         
559                                         GETVRAM_4096(yoff + 6, p, mask);
560                                         p += 8;
561                                         
562                                         GETVRAM_4096(yoff + 7, p, mask);
563                                         p += 8;
564                                         yoff += 8;
565                                 }
566                         }
567                         //if(config.scan_line == 0) {
568                         //      memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
569                         //} else {
570                         //      memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
571                         //}
572                 }
573                 vram_wrote_shadow = false;
574                 return;
575         }
576 #  if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
577         else if(display_mode == DISPLAY_MODE_8_400L) {
578                 emu->set_vm_screen_size(640, 400, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
579                 yoff = 0;
580                 rgbmask = ~multimode_dispmask;
581                 for(y = 0; y < 400; y++) {
582                         p = emu->screen_buffer(y);
583                         if(p == NULL) continue;
584                         pp = p;
585                         yoff = y  * 80;
586 # if defined(_FM77AV_VARIANTS)
587                         vram_draw_table[y] = false;     
588 # endif                 
589 #    if defined(_FM77AV40EX) || defined(_FM77AV40SX)
590                         if(window_opened && (wy_low <= y) && (wy_high  > y)) {
591                                 for(x = 0; x < 80; x++) {
592                                         if((x >= wx_begin) && (x < wx_end)) {
593                                                 GETVRAM_8_400L(yoff, p, rgbmask, true);
594                                         } else {
595                                                 GETVRAM_8_400L(yoff, p, rgbmask, false);
596                                         }
597                                         p += 8;
598                                         yoff++;
599                                 }
600                         } else
601 #    endif
602                         for(x = 0; x < 10; x++) {
603                                 GETVRAM_8_400L(yoff + 0, p, rgbmask);
604                                 p += 8;
605                           
606                                 GETVRAM_8_400L(yoff + 1, p, rgbmask);
607                                 p += 8;
608
609                                 GETVRAM_8_400L(yoff + 2, p, rgbmask);
610                                 p += 8;
611
612                                 GETVRAM_8_400L(yoff + 3, p, rgbmask);
613                                 p += 8;
614
615                                 GETVRAM_8_400L(yoff + 4, p, rgbmask);
616                                 p += 8;
617                           
618                                 GETVRAM_8_400L(yoff + 5, p, rgbmask);
619                                 p += 8;
620                           
621                                 GETVRAM_8_400L(yoff + 6, p, rgbmask);
622                                 p += 8;
623                           
624                                 GETVRAM_8_400L(yoff + 7, p, rgbmask);
625                                 p += 8;
626                                 yoff += 8;
627                         }
628                 }
629                 vram_wrote_shadow = false;
630                 return;
631         } else if(display_mode == DISPLAY_MODE_256k) {
632                 emu->set_vm_screen_size(320, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
633                 rgbmask = ~multimode_dispmask;
634                 for(y = 0; y < 200; y++) {
635 # if defined(_FM77AV_VARIANTS)
636                         vram_draw_table[y] = false;     
637 # endif                 
638                         p = emu->screen_buffer(y);
639                         if(p == NULL) continue;
640                         pp = p;
641                         yoff = y * 40;
642                         {
643                                 for(x = 0; x < 5; x++) {
644                                         GETVRAM_256k(yoff + 0, p, rgbmask);
645                                         p += 8;
646                                         
647                                         GETVRAM_256k(yoff + 1, p, rgbmask);
648                                         p += 8;
649                                         
650                                         GETVRAM_256k(yoff + 2, p, rgbmask);
651                                         p += 8;
652                                         
653                                         GETVRAM_256k(yoff + 3, p, rgbmask);
654                                         p += 8;
655                                         
656                                         GETVRAM_256k(yoff + 4, p, rgbmask);
657                                         p += 8;
658                           
659                                         GETVRAM_256k(yoff + 5, p, rgbmask);
660                                         p += 8;
661                                         
662                                         GETVRAM_256k(yoff + 6, p, rgbmask);
663                                         p += 8;
664                                         
665                                         GETVRAM_256k(yoff + 7, p, rgbmask);
666                                         p += 8;
667                                         yoff += 8;
668                                 }
669                         }
670                         //if(config.scan_line == 0) {
671                         //      memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
672                         //} else {
673                         //      memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
674                         //}
675                 }
676                 vram_wrote_shadow = false;
677                 return;
678         }
679 #  endif // _FM77AV40
680 # endif //_FM77AV_VARIANTS
681 }
682
683 bool DISPLAY::screen_update(void)
684 {
685         bool f = screen_update_flag;
686         screen_update_flag = false;
687         return f;
688 }
689
690 void DISPLAY::reset_screen_update(void)
691 {
692         screen_update_flag = false;
693 }