OSDN Git Service

a6de86c6f8abb9d685fdcf1a43089fb4c409a1c7
[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_8_200l(uint32 addr, uint32 offset)
11 {
12         uint32 page_offset = 0;
13         uint32 pagemod;
14 #if defined(_FM77AV_VARIANTS)
15         if(active_page != 0) {
16                 page_offset = 0xc000;
17         }
18 #endif
19 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
20         if(vram_active_block != 0) page_offset += 0x18000;
21 # endif
22         pagemod = addr & 0xc000;
23         return gvram[(((addr + offset) & 0x3fff) | pagemod) + page_offset];
24 }
25
26 uint8 DISPLAY::read_vram_l4_400l(uint32 addr, uint32 offset)
27 {
28 #if defined(_FM77L4)
29         if(addr < 0x8000) {
30                 if(workram) {
31                         uint32 raddr = addr & 0x3fff;
32                         if((multimode_accessmask & 0x04) == 0) {
33                                 return gvram[0x8000 + (raddr + offset) & 0x7fff];
34                         }
35                         return 0xff;
36                 }
37                 pagemod = addr & 0x4000;
38                 return gvram[((addr + offset) & mask) | pagemod];
39         } else if(addr < 0x9800) {
40                 return textvram[addr & 0x0fff];
41         } else { // $9800-$bfff
42                 return subrom_l4[addr - 0x9800];
43         }
44 #endif
45         return 0xff;
46 }
47
48 uint8 DISPLAY::read_vram_8_400l(uint32 addr, uint32 offset)
49 {
50 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
51         uint32 color = vram_bank & 0x03;
52         uint32 pagemod;
53         uint32 page_offset = 0;
54         uint32 raddr;
55         if(addr >= 0x8000) return 0xff;
56 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
57         if(vram_active_block != 0) page_offset += 0x18000;
58 # endif
59         if(color > 2) color = 0;
60         pagemod = 0x8000 * color;
61         return gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset];
62 #endif
63         return 0xff;
64 }
65
66 uint8 DISPLAY::read_vram_8_400l_direct(uint32 addr, uint32 offset)
67 {
68 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
69         uint32 pagemod;
70         uint32 page_offset = 0;
71         pagemod = addr & 0x18000;
72 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
73         //addr = addr % 0x18000;
74         if(vram_active_block != 0) page_offset += 0x18000;
75 # endif
76         return gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset];
77 #endif
78         return 0xff;
79 }
80
81 uint8 DISPLAY::read_vram_4096(uint32 addr, uint32 offset)
82 {
83 #if defined(_FM77AV_VARIANTS)
84         uint32 page_offset = 0;
85         uint32 pagemod;
86         if(active_page != 0) {
87                 page_offset = 0xc000;
88         }
89         pagemod = addr & 0xe000;
90 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
91         if(vram_active_block != 0) page_offset += 0x18000;
92 # endif
93         return gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset];
94 #endif
95         return 0xff;
96 }
97
98 uint8 DISPLAY::read_vram_256k(uint32 addr, uint32 offset)
99 {
100 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
101         uint32 page_offset;
102         uint32 pagemod;
103         page_offset = 0xc000 * (vram_bank & 0x03);
104         pagemod = addr & 0xe000;
105         return gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset];
106 #endif
107         return 0xff;
108 }
109
110
111 void DISPLAY::write_vram_8_200l(uint32 addr, uint32 offset, uint32 data)
112 {
113         uint32 page_offset = 0;
114         uint32 pagemod;
115         uint8 val8 = data & 0xff;
116 #if defined(_FM77AV_VARIANTS)
117         if(active_page != 0) {
118                 page_offset = 0xc000;
119         }
120 #endif
121 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
122         if(vram_active_block) page_offset += 0x18000;
123 #endif
124         pagemod = addr & 0xc000;
125         gvram[(((addr + offset) & 0x3fff) | pagemod) + page_offset] = val8;
126 # if defined(_FM77AV_VARIANTS)  
127         if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
128 # else
129         vram_wrote = true;
130 # endif 
131 }
132
133 void DISPLAY::write_vram_l4_400l(uint32 addr, uint32 offset, uint32 data)
134 {
135 #if defined(_FM77L4)
136         if(addr < 0x8000) {
137                 if(workram) {
138                         uint32 raddr = addr & 0x3fff;
139                         if((multimode_accessmask & 0x04) == 0) {
140                                 gvram[0x8000 + (raddr + offset) & 0x7fff] = (uint8)data;
141                         }
142                         return;
143                 }
144                 pagemod = addr & 0x4000;
145                 gvram[((addr + offset) & mask) | pagemod] = (uint8)data;
146         } else if(addr < 0x9800) {
147           textvram[addr & 0x0fff] = (uint8)data;
148         } else { // $9800-$bfff
149                 //return subrom_l4[addr - 0x9800];
150         }
151         return;
152 #endif  
153 }
154
155 void DISPLAY::write_vram_8_400l(uint32 addr, uint32 offset, uint32 data)
156 {
157 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
158         uint32 color = vram_bank & 0x03;
159         uint32 pagemod;
160         uint32 page_offset = 0;
161         uint8 val8 = (uint8)(data & 0x00ff);
162         if(addr >= 0x8000) return;
163 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
164         if(vram_active_block != 0) page_offset += 0x18000;
165 # endif   
166         if(color > 2) color = 0;
167         pagemod = 0x8000 * color;
168         //offset = (offset & 0x3fff) << 1;
169         gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset] = val8;
170
171         if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
172 #endif
173 }
174
175 void DISPLAY::write_vram_8_400l_direct(uint32 addr, uint32 offset, uint32 data)
176 {
177 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
178         uint32 pagemod;
179         uint32 page_offset = 0;
180         uint8 val8 = (uint8)(data & 0x00ff);
181         //offset = offset & 0x7fff;
182         pagemod = addr & 0x18000;
183 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
184         //addr = addr % 0x18000;
185         if(vram_active_block != 0) page_offset += 0x18000;
186 # endif 
187         gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset] = val8;
188         if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
189 #endif
190 }
191
192 void DISPLAY::write_vram_4096(uint32 addr, uint32 offset, uint32 data)
193 {
194 #if defined(_FM77AV_VARIANTS)
195         uint32 page_offset = 0;
196         uint32 pagemod;
197         if(active_page != 0) {
198                 page_offset = 0xc000;
199         }
200         pagemod = addr & 0xe000;
201 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
202         if(vram_active_block != 0) page_offset += 0x18000;
203 #endif
204         gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset] = (uint8)data;
205         if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
206 #endif
207 }
208
209 void DISPLAY::write_vram_256k(uint32 addr, uint32 offset, uint32 data)
210 {
211 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
212         uint32 page_offset = 0;
213         uint32 pagemod;
214         page_offset = 0xc000 * (vram_bank & 0x03);
215         pagemod = addr & 0xe000;
216         gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset] = (uint8)(data & 0xff);
217         if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
218         return;
219 #endif
220 }
221
222 inline void DISPLAY::GETVRAM_8_200L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
223 {
224         register uint8 b, r, g;
225         register uint32 dot;
226         uint32 yoff_d;
227 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
228         int dpage = vram_display_block;
229 #endif
230 #if defined(_FM77AV_VARIANTS)
231         if(display_page == 1) { // Is this dirty?
232                 yoff_d = offset_point_bank1_bak;
233         } else {
234                 yoff_d = offset_point_bak;
235         }
236 #else
237         yoff_d = offset_point;
238 #endif  
239         yoff_d = (yoff + yoff_d) & 0x3fff;
240 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
241         if(window_inv) {
242                 if(dpage == 0) {
243                         dpage = 1;
244                 } else {
245                         dpage = 0;
246                 }
247         }
248         if(dpage != 0) yoff_d += 0x18000;
249 #endif
250         b = r = g = 0;
251 #if defined(_FM77AV_VARIANTS)
252         if(display_page == 1) {
253                 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x0c000];
254                 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x10000];
255                 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x14000];
256         } else {
257                 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
258                 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x04000];
259                 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x08000];
260         }
261 #else
262         if(mask & 0x01) b = gvram[yoff_d + 0x00000];
263         if(mask & 0x02) r = gvram[yoff_d + 0x04000];
264         if(mask & 0x04) g = gvram[yoff_d + 0x08000];
265 #endif  
266         dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
267         p[0] = dpalette_pixel[dot];
268         dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
269         p[1] = dpalette_pixel[dot];
270         dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
271         p[2] = dpalette_pixel[dot];
272         dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
273         p[3] = dpalette_pixel[dot];
274                                         
275         dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
276         p[4] = dpalette_pixel[dot];
277         dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
278         p[5] = dpalette_pixel[dot];
279         dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
280         p[6] = dpalette_pixel[dot];
281         dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
282         p[7] = dpalette_pixel[dot];
283 }
284
285 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
286 inline void DISPLAY::GETVRAM_8_400L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
287 {
288         register uint8 b, r, g;
289         register uint32 dot;
290         uint32 yoff_d;
291 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
292         int dpage = vram_display_block;
293 # endif
294         
295         if(display_page == 1) { // Is this dirty?
296                 yoff_d = offset_point_bank1_bak;
297         } else {
298                 yoff_d = offset_point_bak;
299         }
300         yoff_d = (yoff + (yoff_d << 1)) & 0x7fff;
301 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
302         if(window_inv) {
303                 if(dpage == 0) {
304                         dpage = 1;
305                 } else {
306                         dpage = 0;
307                 }
308         }
309         if(dpage != 0) yoff_d += 0x18000;
310 # endif
311         b = r = g = 0;
312         if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
313         if(mask & 0x02) r = gvram_shadow[yoff_d + 0x08000];
314         if(mask & 0x04) g = gvram_shadow[yoff_d + 0x10000];
315
316         dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
317         p[0] = dpalette_pixel[dot];
318         dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
319         p[1] = dpalette_pixel[dot];
320         dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
321         p[2] = dpalette_pixel[dot];
322         dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
323         p[3] = dpalette_pixel[dot];
324                                         
325         dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
326         p[4] = dpalette_pixel[dot];
327         dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
328         p[5] = dpalette_pixel[dot];
329         dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
330         p[6] = dpalette_pixel[dot];
331         dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
332         p[7] = dpalette_pixel[dot];
333 }
334
335 inline void DISPLAY::GETVRAM_256k(int yoff, scrntype *p, uint32 mask)
336 {
337         register uint32 b3, r3, g3;
338         register uint32 b4, r4, g4;
339         register uint32 btmp, rtmp, gtmp;
340         
341         register scrntype b, r, g;
342         scrntype pixel;
343         uint32 yoff_d1, yoff_d2;
344         uint32 _bit;
345         int _shift;
346         int cp;
347         
348         r3 = g3 = b3 = 0;
349         r4 = g4 = b4 = 0;
350         r = g = b = 0;
351         
352         yoff_d1 = offset_point_bak;
353         yoff_d2 = offset_point_bank1_bak;
354         yoff_d1 = (yoff + yoff_d1) & 0x1fff;
355         yoff_d2 = (yoff + yoff_d2) & 0x1fff;
356         if(mask & 0x01) {
357                 b3  = gvram_shadow[yoff_d1] << 24;
358                 b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
359                 
360                 b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
361                 b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
362         
363                 b4  = gvram_shadow[yoff_d1 + 0x18000] << 8;
364                 b4 |= gvram_shadow[yoff_d1 + 0x1a000] << 0;
365         }
366         if(mask & 0x02) {
367                 r3  = gvram_shadow[yoff_d1 + 0x04000] << 24;
368                 r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
369                 r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
370                 r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
371                 r4  = gvram_shadow[yoff_d1 + 0x1c000] << 8;
372                 r4 |= gvram_shadow[yoff_d1 + 0x1e000] << 0;
373         }
374
375         if(mask & 0x04) {
376                 g3  = gvram_shadow[yoff_d1 + 0x08000] << 24;
377                 g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
378                 g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
379                 g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
380                 
381                 g4  = gvram_shadow[yoff_d1 + 0x20000] << 8;
382                 g4 |= gvram_shadow[yoff_d1 + 0x22000] << 0;
383         }
384         
385         cp = 0;
386         for(_shift = 7; _shift >= 0; _shift--) {
387                 _bit = 0x01010101 << _shift;
388                 r = g = b = 0;
389                 if(mask & 0x01) {
390                         btmp = (b3 & _bit) >> _shift;
391                         b = (((btmp & (0x01 << 24)) != 0) ? 0x80 : 0) | (((btmp & (0x01 << 16)) != 0)? 0x40 : 0)
392                                 | (((btmp & (0x01 << 8)) != 0) ? 0x20 : 0) | (((btmp & 0x01) != 0) ? 0x10   : 0);
393                         btmp = (b4 & _bit) >> _shift;
394                         b = b | (((btmp & (0x01 << 8)) != 0) ? 0x08 : 0) | (((btmp & 0x01) != 0) ? 0x04 : 0);
395                 }
396                 if(mask & 0x02) {
397                         rtmp = (r3 & _bit) >> _shift;
398                         r = ((rtmp & (0x01 << 24)) ? 0x80 : 0) | ((rtmp & (0x01 << 16)) ? 0x40 : 0)
399                                 | ((rtmp & (0x01 << 8)) ? 0x20 : 0) | ((rtmp & 0x01) ? 0x10   : 0);
400                         rtmp = (r4 & _bit) >> _shift;
401                         r = r | ((rtmp & (0x01 << 8)) ? 0x08 : 0) | ((rtmp & 0x01) ? 0x04 : 0);
402                 }
403                 if(mask & 0x04) {
404                         gtmp = (g3 & _bit) >> _shift;
405                         g = ((gtmp & (0x01 << 24)) ? 0x80 : 0) | ((gtmp & (0x01 << 16)) ? 0x40 : 0)
406                                 | ((gtmp & (0x01 << 8)) ? 0x20 : 0) | ((gtmp & 0x01) ? 0x10   : 0);
407                         gtmp = (g4 & _bit) >> _shift;
408                         g = g | ((gtmp & (0x01 << 8)) ? 0x08 : 0) | ((gtmp & 0x01) ? 0x04 : 0);
409                 }
410         
411                 pixel = RGB_COLOR(r, g, b);
412                 p[cp] = pixel;
413                 p[cp + 1] = pixel;
414                 cp += 2;
415         }
416         
417 }
418 #endif
419
420 #if defined(_FM77AV_VARIANTS)
421 inline void DISPLAY::GETVRAM_4096(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
422 {
423         uint32 b3, r3, g3;
424         scrntype b, r, g;
425         uint32 idx;;
426         scrntype pixel;
427         uint32 yoff_d1, yoff_d2;
428 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
429         int dpage = vram_display_block;
430 # endif
431         
432         yoff_d1 = offset_point_bak;
433         yoff_d2 = offset_point_bank1_bak;
434         yoff_d1 = (yoff + yoff_d1) & 0x1fff;
435         yoff_d2 = (yoff + yoff_d2) & 0x1fff;
436 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
437         if(window_inv) {
438                 if(dpage == 0) {
439                         dpage = 1;
440                 } else {
441                         dpage = 0;
442                 }
443         }
444         if(dpage != 0) {
445                 yoff_d1 += 0x18000;
446                 yoff_d2 += 0x18000;
447         }
448 # endif
449
450         b3  = gvram_shadow[yoff_d1] << 24;
451         b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
452         r3  = gvram_shadow[yoff_d1 + 0x04000] << 24;
453         r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
454                 
455         g3  = gvram_shadow[yoff_d1 + 0x08000] << 24;
456         g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
457                 
458         b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
459         b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
460                 
461         r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
462         r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
463         g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
464         g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
465    
466         g = ((g3 & (0x80 << 24)) >> 20) | ((g3 & (0x80 << 16)) >> 13) | ((g3 & (0x80 << 8)) >> 6)  | ((g3 & 0x80) << 1);
467         r = ((r3 & (0x80 << 24)) >> 24) | ((r3 & (0x80 << 16)) >> 17) | ((r3 & (0x80 << 8)) >> 10) | ((r3 & 0x80) >> 3);
468         b = ((b3 & (0x80 << 24)) >> 28) | ((b3 & (0x80 << 16)) >> 21) | ((b3 & (0x80 << 8)) >> 14) | ((b3 & 0x80) >> 7);
469            
470         idx = (g  | b | r ) & mask;
471         pixel = analog_palette_pixel[idx];
472         p[0] = pixel;
473         p[1] = pixel;
474
475         g = ((g3 & (0x40 << 24)) >> 19) | ((g3 & (0x40 << 16)) >> 12) | ((g3 & (0x40 << 8)) >> 5)  | ((g3 & 0x40) << 2);
476         r = ((r3 & (0x40 << 24)) >> 23) | ((r3 & (0x40 << 16)) >> 16) | ((r3 & (0x40 << 8)) >> 9)  | ((r3 & 0x40) >> 2);
477         b = ((b3 & (0x40 << 24)) >> 27) | ((b3 & (0x40 << 16)) >> 20) | ((b3 & (0x40 << 8)) >> 13) | ((b3 & 0x40) >> 6);
478         
479         //g = ((g3 & (0x40 << 24)) ? 0x800 : 0) | ((g3 & (0x40 << 16)) ? 0x400 : 0) | ((g3 & (0x40 << 8)) ? 0x200 : 0) | ((g3 & 0x40) ? 0x100 : 0);
480         //r = ((r3 & (0x40 << 24)) ? 0x80  : 0) | ((r3 & (0x40 << 16)) ? 0x40  : 0) | ((r3 & (0x40 << 8)) ? 0x20  : 0) | ((r3 & 0x40) ? 0x10  : 0);
481         //b = ((b3 & (0x40 << 24)) ? 0x8   : 0) | ((b3 & (0x40 << 16)) ? 0x4   : 0) | ((b3 & (0x40 << 8)) ? 0x2   : 0) | ((b3 & 0x40) ? 0x1   : 0);
482            
483         idx = (g  | b | r ) & mask;
484         pixel = analog_palette_pixel[idx];
485         p[2] = pixel;
486         p[3] = pixel;
487
488 //      g = ((g3 & (0x20 << 24)) ? 0x800 : 0) | ((g3 & (0x20 << 16)) ? 0x400 : 0) | ((g3 & (0x20 << 8)) ? 0x200 : 0) | ((g3 & 0x20) ? 0x100 : 0);
489 //      r = ((r3 & (0x20 << 24)) ? 0x80  : 0) | ((r3 & (0x20 << 16)) ? 0x40  : 0) | ((r3 & (0x20 << 8)) ? 0x20  : 0) | ((r3 & 0x20) ? 0x10  : 0);
490 //      b = ((b3 & (0x20 << 24)) ? 0x8   : 0) | ((b3 & (0x20 << 16)) ? 0x4   : 0) | ((b3 & (0x20 << 8)) ? 0x2   : 0) | ((b3 & 0x20) ? 0x1   : 0);
491         g = ((g3 & (0x20 << 24)) >> 18) | ((g3 & (0x20 << 16)) >> 11) | ((g3 & (0x20 << 8)) >> 4)  | ((g3 & 0x20) << 3);
492         r = ((r3 & (0x20 << 24)) >> 22) | ((r3 & (0x20 << 16)) >> 15) | ((r3 & (0x20 << 8)) >> 8)  | ((r3 & 0x20) >> 1);
493         b = ((b3 & (0x20 << 24)) >> 26) | ((b3 & (0x20 << 16)) >> 19) | ((b3 & (0x20 << 8)) >> 12) | ((b3 & 0x20) >> 5);
494            
495         idx = (g  | b | r ) & mask;
496         pixel = analog_palette_pixel[idx];
497         p[4] = pixel;
498         p[5] = pixel;
499
500         //g = ((g3 & (0x10 << 24)) ? 0x800 : 0) | ((g3 & (0x10 << 16)) ? 0x400 : 0) | ((g3 & (0x10 << 8)) ? 0x200 : 0) | ((g3 & 0x10) ? 0x100 : 0);
501         //r = ((r3 & (0x10 << 24)) ? 0x80  : 0) | ((r3 & (0x10 << 16)) ? 0x40  : 0) | ((r3 & (0x10 << 8)) ? 0x20  : 0) | ((r3 & 0x10) ? 0x10  : 0);
502         //b = ((b3 & (0x10 << 24)) ? 0x8   : 0) | ((b3 & (0x10 << 16)) ? 0x4   : 0) | ((b3 & (0x10 << 8)) ? 0x2   : 0) | ((b3 & 0x10) ? 0x1   : 0);
503         g = ((g3 & (0x10 << 24)) >> 17) | ((g3 & (0x10 << 16)) >> 10) | ((g3 & (0x10 << 8)) >> 3)  | ((g3 & 0x10) << 4);
504         r = ((r3 & (0x10 << 24)) >> 21) | ((r3 & (0x10 << 16)) >> 14) | ((r3 & (0x10 << 8)) >> 7)  | ((r3 & 0x10) >> 0);
505         b = ((b3 & (0x10 << 24)) >> 25) | ((b3 & (0x10 << 16)) >> 18) | ((b3 & (0x10 << 8)) >> 11) | ((b3 & 0x10) >> 4);
506            
507         idx = (g  | b | r ) & mask;
508         pixel = analog_palette_pixel[idx];
509         p[6] = pixel;
510         p[7] = pixel;
511
512
513         //g = ((g3 & (0x8 << 24)) ? 0x800 : 0) | ((g3 & (0x8 << 16)) ? 0x400 : 0) | ((g3 & (0x8 << 8)) ? 0x200 : 0) | ((g3 & 0x8) ? 0x100 : 0);
514         //r = ((r3 & (0x8 << 24)) ? 0x80  : 0) | ((r3 & (0x8 << 16)) ? 0x40  : 0) | ((r3 & (0x8 << 8)) ? 0x20  : 0) | ((r3 & 0x8) ? 0x10  : 0);
515         //b = ((b3 & (0x8 << 24)) ? 0x8   : 0) | ((b3 & (0x8 << 16)) ? 0x4   : 0) | ((b3 & (0x8 << 8)) ? 0x2   : 0) | ((b3 & 0x8) ? 0x1   : 0);
516         g = ((g3 & (0x8 << 24)) >> 16) | ((g3 & (0x8 << 16)) >> 9)  | ((g3 & (0x8 << 8)) >> 2)  | ((g3 & 0x8) << 5);
517         r = ((r3 & (0x8 << 24)) >> 20) | ((r3 & (0x8 << 16)) >> 13) | ((r3 & (0x8 << 8)) >> 6)  | ((r3 & 0x8) << 1);
518         b = ((b3 & (0x8 << 24)) >> 24) | ((b3 & (0x8 << 16)) >> 17) | ((b3 & (0x8 << 8)) >> 10) | ((b3 & 0x8) >> 3);
519            
520         idx = (g  | b | r ) & mask;
521         pixel = analog_palette_pixel[idx];
522         p[8] = pixel;
523         p[9] = pixel;
524
525         
526         //g = ((g3 & (0x4 << 24)) ? 0x800 : 0) | ((g3 & (0x4 << 16)) ? 0x400 : 0) | ((g3 & (0x4 << 8)) ? 0x200 : 0) | ((g3 & 0x4) ? 0x100 : 0);
527         //r = ((r3 & (0x4 << 24)) ? 0x80  : 0) | ((r3 & (0x4 << 16)) ? 0x40  : 0) | ((r3 & (0x4 << 8)) ? 0x20  : 0) | ((r3 & 0x4) ? 0x10  : 0);
528         //b = ((b3 & (0x4 << 24)) ? 0x8   : 0) | ((b3 & (0x4 << 16)) ? 0x4   : 0) | ((b3 & (0x4 << 8)) ? 0x2   : 0) | ((b3 & 0x4) ? 0x1   : 0);
529         g = ((g3 & (0x4 << 24)) >> 15) | ((g3 & (0x4 << 16)) >> 8)  | ((g3 & (0x4 << 8)) >> 1) | ((g3 & 0x4) << 6);
530         r = ((r3 & (0x4 << 24)) >> 19) | ((r3 & (0x4 << 16)) >> 12) | ((r3 & (0x4 << 8)) >> 5) | ((r3 & 0x4) << 2);
531         b = ((b3 & (0x4 << 24)) >> 23) | ((b3 & (0x4 << 16)) >> 16) | ((b3 & (0x4 << 8)) >> 9) | ((b3 & 0x4) >> 2);
532            
533         idx = (g  | b | r ) & mask;
534         pixel = analog_palette_pixel[idx];
535         p[10] = pixel;
536         p[11] = pixel;
537
538         //g = ((g3 & (0x2 << 24)) ? 0x800 : 0) | ((g3 & (0x2 << 16)) ? 0x400 : 0) | ((g3 & (0x2 << 8)) ? 0x200 : 0) | ((g3 & 0x2) ? 0x100 : 0);
539         //r = ((r3 & (0x2 << 24)) ? 0x80  : 0) | ((r3 & (0x2 << 16)) ? 0x40  : 0) | ((r3 & (0x2 << 8)) ? 0x20  : 0) | ((r3 & 0x2) ? 0x10  : 0);
540         //b = ((b3 & (0x2 << 24)) ? 0x8   : 0) | ((b3 & (0x2 << 16)) ? 0x4   : 0) | ((b3 & (0x2 << 8)) ? 0x2   : 0) | ((b3 & 0x2) ? 0x1   : 0);
541         g = ((g3 & (0x2 << 24)) >> 14) | ((g3 & (0x2 << 16)) >> 7)  | ((g3 & (0x2 << 8)) >> 0) | ((g3 & 0x2) << 7);
542         r = ((r3 & (0x2 << 24)) >> 18) | ((r3 & (0x2 << 16)) >> 11) | ((r3 & (0x2 << 8)) >> 4) | ((r3 & 0x2) << 3);
543         b = ((b3 & (0x2 << 24)) >> 22) | ((b3 & (0x2 << 16)) >> 15) | ((b3 & (0x2 << 8)) >> 8) | ((b3 & 0x2) >> 1);
544            
545         idx = (g  | b | r ) & mask;
546         pixel = analog_palette_pixel[idx];
547         p[12] = pixel;
548         p[13] = pixel;
549
550         //g = ((g3 & (0x1 << 24)) ? 0x800 : 0) | ((g3 & (0x1 << 16)) ? 0x400 : 0) | ((g3 & (0x1 << 8)) ? 0x200 : 0) | ((g3 & 0x1) ? 0x100 : 0);
551         //r = ((r3 & (0x1 << 24)) ? 0x80  : 0) | ((r3 & (0x1 << 16)) ? 0x40  : 0) | ((r3 & (0x1 << 8)) ? 0x20  : 0) | ((r3 & 0x1) ? 0x10  : 0);
552         //b = ((b3 & (0x1 << 24)) ? 0x8   : 0) | ((b3 & (0x1 << 16)) ? 0x4   : 0) | ((b3 & (0x1 << 8)) ? 0x2   : 0) | ((b3 & 0x1) ? 0x1   : 0);
553         g = ((g3 & (0x1 << 24)) >> 13) | ((g3 & (0x1 << 16)) >> 6)  | ((g3 & (0x1 << 8)) << 1) | ((g3 & 0x1) << 8);
554         r = ((r3 & (0x1 << 24)) >> 17) | ((r3 & (0x1 << 16)) >> 10) | ((r3 & (0x1 << 8)) >> 3) | ((r3 & 0x1) << 4);
555         b = ((b3 & (0x1 << 24)) >> 21) | ((b3 & (0x1 << 16)) >> 14) | ((b3 & (0x1 << 8)) >> 7) | ((b3 & 0x1) >> 0);
556            
557         idx = (g  | b | r ) & mask;
558         pixel = analog_palette_pixel[idx];
559         p[14] = pixel;
560         p[15] = pixel;
561 }
562 #endif
563
564 void DISPLAY::draw_screen()
565 {
566         int y;
567         int x;
568         scrntype *p, *pp;
569         register int yoff;
570         register uint32 rgbmask;
571         uint16 wx_begin, wx_end, wy_low, wy_high;
572 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
573         {
574                 wx_begin = window_xbegin;
575                 wx_end   = window_xend;
576                 wy_low   = window_low;
577                 wy_high  = window_high;
578                 bool _flag = window_opened; 
579                 if((wx_begin < wx_end) && (wy_low < wy_high)) {
580                         window_opened = true;
581                 } else {
582                         window_opened = false;
583                 }
584                 if(_flag != window_opened) vram_wrote_shadow = true;
585         }
586 #endif
587         frame_skip_count++;
588 #if defined(_FM77AV_VARIANTS)
589         {
590                 int factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
591                 if(frame_skip_count <= factor) return;
592                 frame_skip_count = 0;
593         }
594 #else
595         {
596                 int factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
597                 if((frame_skip_count <= factor) || !(vram_wrote)) return;
598                 vram_wrote = false;
599                 frame_skip_count = 0;
600         }
601 #endif
602           // Set blank
603         if(!crt_flag) {
604                 for(y = 0; y < 400; y++) {
605                         memset(emu->screen_buffer(y), 0x00, 640 * sizeof(scrntype));
606                 }
607                 return;
608         }
609 # if defined(_FM77AV_VARIANTS)
610         if(!vram_wrote_shadow) return;
611 # endif 
612         if(display_mode == DISPLAY_MODE_8_200L) {
613                 yoff = 0;
614                 rgbmask = ~multimode_dispmask;
615                 for(y = 0; y < 400; y += 2) {
616                         p = emu->screen_buffer(y);
617                         pp = p;
618                         yoff = (y / 2) * 80;
619 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
620                         if(window_opened && (wy_low <= y) && (wy_high > y)) {
621                                         for(x = 0; x < 80; x++) {
622                                                 if((x >= wx_begin) && (x < wx_end)) {
623                                                         GETVRAM_8_200L(yoff, p, rgbmask, true);
624                                                 } else {
625                                                         GETVRAM_8_200L(yoff, p, rgbmask, false);
626                                                 }
627                                                 p += 8;
628                                                 yoff++;
629                                         }
630                         } else
631 # endif
632                         {
633                                 for(x = 0; x < 10; x++) {
634                                         GETVRAM_8_200L(yoff + 0, p, rgbmask, false);
635                                         p += 8;
636                                         
637                                         GETVRAM_8_200L(yoff + 1, p, rgbmask, false);
638                                         p += 8;
639                                         
640                                         GETVRAM_8_200L(yoff + 2, p, rgbmask, false);
641                                         p += 8;
642                                         
643                                         GETVRAM_8_200L(yoff + 3, p, rgbmask, false);
644                                         p += 8;
645                                         
646                                         GETVRAM_8_200L(yoff + 4, p, rgbmask, false);
647                                         p += 8;
648                                         
649                                         GETVRAM_8_200L(yoff + 5, p, rgbmask, false);
650                                         p += 8;
651                                                 
652                                         GETVRAM_8_200L(yoff + 6, p, rgbmask, false);
653                                         p += 8;
654                           
655                                         GETVRAM_8_200L(yoff + 7, p, rgbmask, false);
656                                         p += 8;
657                                         yoff += 8;
658                                 }
659                         }
660                         if(config.scan_line == 0) {
661                                 memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
662                         } else {
663                                 memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
664                         }
665                 }
666 # if defined(_FM77AV_VARIANTS)
667                         vram_wrote_shadow = false;
668 # endif         
669                 return;
670         }
671 # if defined(_FM77AV_VARIANTS)
672         if(display_mode == DISPLAY_MODE_4096) {
673                 uint32 mask = 0;
674                 yoff = 0;
675                 rgbmask = multimode_dispmask;
676                 if((rgbmask & 0x01) == 0) mask = 0x00f;
677                 if((rgbmask & 0x02) == 0) mask = mask | 0x0f0;
678                 if((rgbmask & 0x04) == 0) mask = mask | 0xf00;
679                 for(y = 0; y < 400; y += 2) {
680                         p = emu->screen_buffer(y);
681                         pp = p;
682                         yoff = y * (40 / 2);
683 #  if defined(_FM77AV40EX) || defined(_FM77AV40SX)
684                         if(window_opened && (wy_low <= y) && (wy_high > y)) {
685                                         for(x = 0; x < 40; x++) {
686                                                 if((x >= wx_begin) && (x < wx_end)) {
687                                                         GETVRAM_4096(yoff, p, mask, true);
688                                                 } else {
689                                                         GETVRAM_4096(yoff, p, mask, false);
690                                                 }
691                                                 p += 16;
692                                                 yoff++;
693                                         }
694                         } else
695 #  endif
696                         {
697                                 for(x = 0; x < 5; x++) {
698                                         GETVRAM_4096(yoff + 0, p, mask);
699                                         p += 16;
700                                         
701                                         GETVRAM_4096(yoff + 1, p, mask);
702                                         p += 16;
703                                         
704                                         GETVRAM_4096(yoff + 2, p, mask);
705                                         p += 16;
706                                         
707                                         GETVRAM_4096(yoff + 3, p, mask);
708                                         p += 16;
709                                         
710                                         GETVRAM_4096(yoff + 4, p, mask);
711                                         p += 16;
712                           
713                                         GETVRAM_4096(yoff + 5, p, mask);
714                                         p += 16;
715                                         
716                                         GETVRAM_4096(yoff + 6, p, mask);
717                                         p += 16;
718                                         
719                                         GETVRAM_4096(yoff + 7, p, mask);
720                                         p += 16;
721                                         yoff += 8;
722                                 }
723                         }
724                         if(config.scan_line == 0) {
725                                 memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
726                         } else {
727                                 memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
728                         }
729                 }
730 # if defined(_FM77AV_VARIANTS)
731                 vram_wrote_shadow = false;
732 # endif         
733                 return;
734         }
735 #  if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
736         else if(display_mode == DISPLAY_MODE_8_400L) {
737                 yoff = 0;
738                 rgbmask = ~multimode_dispmask;
739                 for(y = 0; y < 400; y++) {
740                         p = emu->screen_buffer(y);
741                         pp = p;
742                         yoff = y  * 80;
743 #    if defined(_FM77AV40EX) || defined(_FM77AV40SX)
744                         if(window_opened && (wy_low <= y) && (wy_high  > y)) {
745                                 for(x = 0; x < 80; x++) {
746                                         if((x >= wx_begin) && (x < wx_end)) {
747                                                 GETVRAM_8_400L(yoff, p, rgbmask, true);
748                                         } else {
749                                                 GETVRAM_8_400L(yoff, p, rgbmask, false);
750                                         }
751                                         p += 8;
752                                         yoff++;
753                                 }
754                         } else
755 #    endif
756                         for(x = 0; x < 10; x++) {
757                           GETVRAM_8_400L(yoff + 0, p, rgbmask);
758                           p += 8;
759                           
760                           GETVRAM_8_400L(yoff + 1, p, rgbmask);
761                           p += 8;
762
763                           GETVRAM_8_400L(yoff + 2, p, rgbmask);
764                           p += 8;
765
766                           GETVRAM_8_400L(yoff + 3, p, rgbmask);
767                           p += 8;
768
769                           GETVRAM_8_400L(yoff + 4, p, rgbmask);
770                           p += 8;
771                           
772                           GETVRAM_8_400L(yoff + 5, p, rgbmask);
773                           p += 8;
774                           
775                           GETVRAM_8_400L(yoff + 6, p, rgbmask);
776                           p += 8;
777                           
778                           GETVRAM_8_400L(yoff + 7, p, rgbmask);
779                           p += 8;
780                           yoff += 8;
781                         }
782                 }
783 # if defined(_FM77AV_VARIANTS)
784                 vram_wrote_shadow = false;
785 # endif         
786                 return;
787         } else if(display_mode == DISPLAY_MODE_256k) {
788                 rgbmask = ~multimode_dispmask;
789                 for(y = 0; y < 400; y += 2) {
790 # if defined(_FM77AV_VARIANTS)
791                         //if(!vram_wrote_shadow && !vram_draw_table[y >> 1]) continue;
792                         vram_draw_table[y >> 1] = false;        
793 # endif                 
794                         p = emu->screen_buffer(y);
795                         pp = p;
796                         yoff = y * (40 / 2);
797                         {
798                                 for(x = 0; x < 5; x++) {
799                                         GETVRAM_256k(yoff + 0, p, rgbmask);
800                                         p += 16;
801                                         
802                                         GETVRAM_256k(yoff + 1, p, rgbmask);
803                                         p += 16;
804                                         
805                                         GETVRAM_256k(yoff + 2, p, rgbmask);
806                                         p += 16;
807                                         
808                                         GETVRAM_256k(yoff + 3, p, rgbmask);
809                                         p += 16;
810                                         
811                                         GETVRAM_256k(yoff + 4, p, rgbmask);
812                                         p += 16;
813                           
814                                         GETVRAM_256k(yoff + 5, p, rgbmask);
815                                         p += 16;
816                                         
817                                         GETVRAM_256k(yoff + 6, p, rgbmask);
818                                         p += 16;
819                                         
820                                         GETVRAM_256k(yoff + 7, p, rgbmask);
821                                         p += 16;
822                                         yoff += 8;
823                                 }
824                         }
825                         if(config.scan_line == 0) {
826                                 memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
827                         } else {
828                                 memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
829                         }
830                 }
831 # if defined(_FM77AV_VARIANTS)
832                 vram_wrote_shadow = false;
833 # endif         
834                 return;
835         }
836 #  endif // _FM77AV40
837 # endif //_FM77AV_VARIANTS
838
839 }
840