1 #include "rockmacros.h"
9 #include "palette-presets.h"
17 struct scan scan IBSS_ATTR
;
20 #define WND (scan.wnd)
23 #define BUF (scan.buf)
25 #define BUF (scan.buf[scanline_ind])
28 #define PRI (scan.pri)
30 #define PAL (scan.pal)
32 #define VS (scan.vs) /* vissprites */
35 #define L (scan.l) /* line */
36 #define X (scan.x) /* screen position */
38 #define S (scan.s) /* tilemap position */
40 #define U (scan.u) /* position within tile */
47 byte patpix
[4096][8][8]
48 #if defined(CPU_COLDFIRE)
49 __attribute__ ((aligned(16))) /* to profit from burst mode */
56 static int scanline_ind
=0;
59 static int dmg_pal
[4][4];
61 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
67 #ifndef ASM_UPDATEPATPIX
68 static void updatepatpix(void) ICODE_ATTR
;
69 static void updatepatpix(void)
72 #if ((CONFIG_CPU != SH7034) && !defined(CPU_COLDFIRE))
75 byte
*vram
= lcd
.vbank
[0];
77 if (!anydirty
) return;
78 for (i
= 0; i
< 1024; i
++)
80 if (i
== 384) i
= 512;
82 if (!patdirty
[i
]) continue;
84 for (j
= 0; j
< 8; j
++)
86 #if CONFIG_CPU == SH7034
103 "mov.b r0,@(1,%0) \n"
104 "mov.b r0,@(6,%1) \n"
110 "mov.b r0,@(2,%0) \n"
111 "mov.b r0,@(5,%1) \n"
117 "mov.b r0,@(3,%0) \n"
118 "mov.b r0,@(4,%1) \n"
124 "mov.b r0,@(4,%0) \n"
125 "mov.b r0,@(3,%1) \n"
131 "mov.b r0,@(5,%0) \n"
132 "mov.b r0,@(2,%1) \n"
138 "mov.b r0,@(6,%0) \n"
139 "mov.b r0,@(1,%1) \n"
145 "mov.b r0,@(7,%0) \n"
149 /* %0 */ "r"(patpix
[i
+1024][j
]),
150 /* %1 */ "r"(patpix
[i
][j
]),
151 /* %2 */ "r"(&vram
[(i
<<4)|(j
<<1)])
155 #elif defined(CPU_COLDFIRE)
157 "move.b (%2),%%d2 \n"
158 "move.b (1,%2),%%d1 \n"
163 "addx.l %%d0,%%d0 \n"
165 "addx.l %%d0,%%d0 \n"
166 "move.b %%d0,-(%1) \n"
169 "addx.l %%d0,%%d0 \n"
171 "addx.l %%d0,%%d0 \n"
172 "move.b %%d0,-(%1) \n"
175 "addx.l %%d0,%%d0 \n"
177 "addx.l %%d0,%%d0 \n"
178 "move.b %%d0,-(%1) \n"
181 "addx.l %%d0,%%d0 \n"
183 "addx.l %%d0,%%d0 \n"
184 "move.l %%d0,(%0) \n"
185 "move.b %%d0,-(%1) \n"
188 "addx.l %%d0,%%d0 \n"
190 "addx.l %%d0,%%d0 \n"
191 "move.b %%d0,-(%1) \n"
194 "addx.l %%d0,%%d0 \n"
196 "addx.l %%d0,%%d0 \n"
197 "move.b %%d0,-(%1) \n"
200 "addx.l %%d0,%%d0 \n"
202 "addx.l %%d0,%%d0 \n"
203 "move.b %%d0,-(%1) \n"
206 "addx.l %%d0,%%d0 \n"
208 "addx.l %%d0,%%d0 \n"
209 "move.l %%d0,(4,%0) \n"
210 "move.b %%d0,-(%1) \n"
213 /* %0 */ "a"(patpix
[i
+1024][j
]),
214 /* %1 */ "a"(patpix
[i
][j
]),
215 /* %2 */ "a"(&vram
[(i
<<4)|(j
<<1)])
220 a
= ((i
<<4) | (j
<<1));
221 for (k
= 0; k
< 8; k
++)
223 c
= vram
[a
] & BIT_N(k
) ? 1 : 0;
224 c
|= vram
[a
+1] & BIT_N(k
) ? 2 : 0;
225 patpix
[i
+1024][j
][k
] = c
;
227 for (k
= 0; k
< 8; k
++)
229 patpix
[i
+1024][j
][7-k
];
232 #if CONFIG_CPU == SH7034
235 "mov.l @(4,%0),r1 \n"
236 "mov.l r0,@(56,%1) \n"
237 "mov.l r1,@(60,%1) \n"
238 "mov.l @(8,%0),r0 \n"
239 "mov.l @(12,%0),r1 \n"
240 "mov.l r0,@(48,%1) \n"
241 "mov.l r1,@(52,%1) \n"
242 "mov.l @(16,%0),r0 \n"
243 "mov.l @(20,%0),r1 \n"
244 "mov.l r0,@(40,%1) \n"
245 "mov.l r1,@(44,%1) \n"
246 "mov.l @(24,%0),r0 \n"
247 "mov.l @(28,%0),r1 \n"
248 "mov.l r0,@(32,%1) \n"
249 "mov.l r1,@(36,%1) \n"
250 "mov.l @(32,%0),r0 \n"
251 "mov.l @(36,%0),r1 \n"
252 "mov.l r0,@(24,%1) \n"
253 "mov.l r1,@(28,%1) \n"
254 "mov.l @(40,%0),r0 \n"
255 "mov.l @(44,%0),r1 \n"
256 "mov.l r0,@(16,%1) \n"
257 "mov.l r1,@(20,%1) \n"
258 "mov.l @(48,%0),r0 \n"
259 "mov.l @(52,%0),r1 \n"
260 "mov.l r0,@(8,%1) \n"
261 "mov.l r1,@(12,%1) \n"
262 "mov.l @(56,%0),r0 \n"
263 "mov.l @(60,%0),r1 \n"
265 "mov.l r1,@(4,%1) \n"
271 "mov.l @(4,%0),r1 \n"
272 "mov.l r0,@(56,%1) \n"
273 "mov.l r1,@(60,%1) \n"
274 "mov.l @(8,%0),r0 \n"
275 "mov.l @(12,%0),r1 \n"
276 "mov.l r0,@(48,%1) \n"
277 "mov.l r1,@(52,%1) \n"
278 "mov.l @(16,%0),r0 \n"
279 "mov.l @(20,%0),r1 \n"
280 "mov.l r0,@(40,%1) \n"
281 "mov.l r1,@(44,%1) \n"
282 "mov.l @(24,%0),r0 \n"
283 "mov.l @(28,%0),r1 \n"
284 "mov.l r0,@(32,%1) \n"
285 "mov.l r1,@(36,%1) \n"
286 "mov.l @(32,%0),r0 \n"
287 "mov.l @(36,%0),r1 \n"
288 "mov.l r0,@(24,%1) \n"
289 "mov.l r1,@(28,%1) \n"
290 "mov.l @(40,%0),r0 \n"
291 "mov.l @(44,%0),r1 \n"
292 "mov.l r0,@(16,%1) \n"
293 "mov.l r1,@(20,%1) \n"
294 "mov.l @(48,%0),r0 \n"
295 "mov.l @(52,%0),r1 \n"
296 "mov.l r0,@(8,%1) \n"
297 "mov.l r1,@(12,%1) \n"
298 "mov.l @(56,%0),r0 \n"
299 "mov.l @(60,%0),r1 \n"
301 "mov.l r1,@(4,%1) \n"
304 /* %0 */ "r"(patpix
[i
][0]),
305 /* %1 */ "r"(patpix
[i
+2048][0]),
306 /* %2 */ "r"(1024*64)
310 #elif defined(CPU_COLDFIRE)
312 "movem.l (%0),%%d0-%%d3 \n"
313 "move.l %%d0,%%d4 \n"
314 "move.l %%d1,%%d5 \n"
315 "movem.l %%d2-%%d5,(48,%1) \n"
316 "movem.l (16,%0),%%d0-%%d3 \n"
317 "move.l %%d0,%%d4 \n"
318 "move.l %%d1,%%d5 \n"
319 "movem.l %%d2-%%d5,(32,%1) \n"
320 "movem.l (32,%0),%%d0-%%d3 \n"
321 "move.l %%d0,%%d4 \n"
322 "move.l %%d1,%%d5 \n"
323 "movem.l %%d2-%%d5,(16,%1) \n"
324 "movem.l (48,%0),%%d0-%%d3 \n"
325 "move.l %%d0,%%d4 \n"
326 "move.l %%d1,%%d5 \n"
327 "movem.l %%d2-%%d5,(%1) \n"
333 "movem.l (%0),%%d0-%%d3 \n"
334 "move.l %%d0,%%d4 \n"
335 "move.l %%d1,%%d5 \n"
336 "movem.l %%d2-%%d5,(48,%1) \n"
337 "movem.l (16,%0),%%d0-%%d3 \n"
338 "move.l %%d0,%%d4 \n"
339 "move.l %%d1,%%d5 \n"
340 "movem.l %%d2-%%d5,(32,%1) \n"
341 "movem.l (32,%0),%%d0-%%d3 \n"
342 "move.l %%d0,%%d4 \n"
343 "move.l %%d1,%%d5 \n"
344 "movem.l %%d2-%%d5,(16,%1) \n"
345 "movem.l (48,%0),%%d0-%%d3 \n"
346 "move.l %%d0,%%d4 \n"
347 "move.l %%d1,%%d5 \n"
348 "movem.l %%d2-%%d5,(%1) \n"
351 /* %0 */ "a"(patpix
[i
][0]),
352 /* %1 */ "a"(patpix
[i
+2048][0]),
353 /* %2 */ "i"(1024*64)
355 "d0", "d1", "d2", "d3", "d4", "d5"
358 for (j
= 0; j
< 8; j
++)
360 for (k
= 0; k
< 8; k
++)
362 patpix
[i
+2048][j
][k
] =
364 patpix
[i
+3072][j
][k
] =
365 patpix
[i
+1024][7-j
][k
];
372 #endif /* ASM_UPDATEPATPIX */
376 static void tilebuf(void) ICODE_ATTR
;
377 static void tilebuf(void)
381 byte
*tilemap
, *attrmap
;
384 static int wraptable
[64] =
386 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
387 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,-32
390 base
= ((R_LCDC
&0x08)?0x1C00:0x1800) + (T
<<5) + S
;
391 tilemap
= lcd
.vbank
[0] + base
;
392 attrmap
= lcd
.vbank
[1] + base
;
394 wrap
= wraptable
+ S
;
395 cnt
= ((WX
+ 7) >> 3) + 1;
399 for (i
= cnt
; i
> 0; i
--)
401 *(tilebuf
++) = *tilemap
402 | (((int)*attrmap
& 0x08) << 6)
403 | (((int)*attrmap
& 0x60) << 5);
404 *(tilebuf
++) = (((int)*attrmap
& 0x07) << 2);
405 attrmap
+= *wrap
+ 1;
406 tilemap
+= *(wrap
++) + 1;
409 for (i
= cnt
; i
> 0; i
--)
411 *(tilebuf
++) = (256 + ((n8
)*tilemap
))
412 | (((int)*attrmap
& 0x08) << 6)
413 | (((int)*attrmap
& 0x60) << 5);
414 *(tilebuf
++) = (((int)*attrmap
& 0x07) << 2);
415 attrmap
+= *wrap
+ 1;
416 tilemap
+= *(wrap
++) + 1;
422 for (i
= cnt
; i
> 0; i
--)
424 *(tilebuf
++) = *(tilemap
++);
425 tilemap
+= *(wrap
++);
428 for (i
= cnt
; i
> 0; i
--)
430 *(tilebuf
++) = (256 + ((n8
)*(tilemap
++)));
431 tilemap
+= *(wrap
++);
435 if (WX
>= 160) return;
437 base
= ((R_LCDC
&0x40)?0x1C00:0x1800) + (WT
<<5);
438 tilemap
= lcd
.vbank
[0] + base
;
439 attrmap
= lcd
.vbank
[1] + base
;
441 cnt
= ((160 - WX
) >> 3) + 1;
446 for (i
= cnt
; i
> 0; i
--)
448 *(tilebuf
++) = *(tilemap
++)
449 | (((int)*attrmap
& 0x08) << 6)
450 | (((int)*attrmap
& 0x60) << 5);
451 *(tilebuf
++) = (((int)*(attrmap
++)&7) << 2);
454 for (i
= cnt
; i
> 0; i
--)
456 *(tilebuf
++) = (256 + ((n8
)*(tilemap
++)))
457 | (((int)*attrmap
& 0x08) << 6)
458 | (((int)*attrmap
& 0x60) << 5);
459 *(tilebuf
++) = (((int)*(attrmap
++)&7) << 2);
466 for (i
= cnt
; i
> 0; i
--)
467 *(tilebuf
++) = *(tilemap
++);
469 for (i
= cnt
; i
> 0; i
--)
470 *(tilebuf
++) = (256 + ((n8
)*(tilemap
++)));
476 * WX = WND start (if 0, no need to do anything) -> WY
477 * U = start...something...thingy... 7 at most
479 static void bg_scan(void) ICODE_ATTR
;
480 static void bg_scan(void)
491 src
= patpix
[*(tile
++)][V
] + U
;
492 memcpy(dest
, src
, 8-U
);
495 if (cnt
<= 0) return;
498 #if defined(CPU_COLDFIRE)
500 "move.l (%1)+,(%0)+ \n"
501 "move.l (%1)+,(%0)+ \n"
505 /* %1 */ "a" (patpix
[*(tile
++)][V
])
509 src
= patpix
[*(tile
++)][V
];
515 src
= patpix
[*tile
][V
];
517 *(dest
++) = *(src
++);
520 static void wnd_scan(void) ICODE_ATTR
;
521 static void wnd_scan(void)
527 if (WX
>= 160) return;
534 #if defined(CPU_COLDFIRE)
536 "move.l (%1)+,(%0)+ \n"
537 "move.l (%1)+,(%0)+ \n"
541 /* %1 */ "a" (patpix
[*(tile
++)][WV
])
545 src
= patpix
[*(tile
++)][WV
];
551 src
= patpix
[*tile
][WV
];
553 *(dest
++) = *(src
++);
556 static void blendcpy(byte
*dest
, byte
*src
, byte b
, int cnt
)
558 while (cnt
--) *(dest
++) = *(src
++) | b
;
561 static int priused(void *attr
)
564 return (int)((a
[0]|a
[1]|a
[2]|a
[3]|a
[4]|a
[5]|a
[6]|a
[7])&0x80808080);
567 static void bg_scan_pri(void) ICODE_ATTR
;
568 static void bg_scan_pri(void)
577 src
= lcd
.vbank
[1] + ((R_LCDC
&0x08)?0x1C00:0x1800) + (T
<<5);
581 memset(dest
, 0, cnt
);
585 memset(dest
, src
[i
++&31]&128, 8-U
);
588 if (cnt
<= 0) return;
591 memset(dest
, src
[i
++&31]&128, 8);
595 memset(dest
, src
[i
&31]&128, cnt
);
598 static void wnd_scan_pri(void) ICODE_ATTR
;
599 static void wnd_scan_pri(void)
604 if (WX
>= 160) return;
608 src
= lcd
.vbank
[1] + ((R_LCDC
&0x40)?0x1C00:0x1800) + (WT
<<5);
612 memset(dest
, 0, cnt
);
618 memset(dest
, src
[i
++]&128, 8);
622 memset(dest
, src
[i
]&128, cnt
);
625 static void bg_scan_color(void)
636 src
= patpix
[*(tile
++)][V
] + U
;
637 blendcpy(dest
, src
, *(tile
++), 8-U
);
640 if (cnt
<= 0) return;
643 src
= patpix
[*(tile
++)][V
];
644 #if defined(CPU_COLDFIRE)
646 "move.l (%2)+,%%d1 \n"
648 "move.b %%d1,%%d2 \n"
650 "move.b (%1)+,%%d0 \n"
652 "move.b %%d0,(%0)+ \n"
654 "move.b (%1)+,%%d0 \n"
656 "move.b %%d0,(%0)+ \n"
658 "move.b (%1)+,%%d0 \n"
660 "move.b %%d0,(%0)+ \n"
662 "move.b (%1)+,%%d0 \n"
664 "move.b %%d0,(%0)+ \n"
666 "move.b (%1)+,%%d0 \n"
668 "move.b %%d0,(%0)+ \n"
670 "move.b (%1)+,%%d0 \n"
672 "move.b %%d0,(%0)+ \n"
674 "move.b (%1)+,%%d0 \n"
676 "move.b %%d0,(%0)+ \n"
678 "move.b (%1)+,%%d0 \n"
680 "move.b %%d0,(%0)+ \n"
690 blendcpy(dest
, src
, *(tile
++), 8);
695 src
= patpix
[*(tile
++)][V
];
696 blendcpy(dest
, src
, *(tile
++), cnt
);
699 static void wnd_scan_color(void)
705 if (WX
>= 160) return;
712 src
= patpix
[*(tile
++)][WV
];
713 blendcpy(dest
, src
, *(tile
++), 8);
717 src
= patpix
[*(tile
++)][WV
];
718 blendcpy(dest
, src
, *(tile
++), cnt
);
721 static void spr_enum(void) ICODE_ATTR
;
722 static void spr_enum(void)
730 if (!(R_LCDC
& 0x02)) return;
734 for (i
= 40; i
; i
--, o
++)
736 if (L
>= o
->y
|| L
+ 16 < o
->y
)
738 if (L
+ 8 >= o
->y
&& !(R_LCDC
& 0x04))
740 VS
[NS
].x
= (int)o
->x
- 8;
741 v
= L
- (int)o
->y
+ 16;
744 pat
= o
->pat
| (((int)o
->flags
& 0x60) << 5)
745 | (((int)o
->flags
& 0x08) << 6);
746 VS
[NS
].pal
= 32 + ((o
->flags
& 0x07) << 2);
750 pat
= o
->pat
| (((int)o
->flags
& 0x60) << 5);
751 VS
[NS
].pal
= 32 + ((o
->flags
& 0x10) >> 2);
753 VS
[NS
].pri
= (o
->flags
& 0x80) >> 7;
762 if (o
->flags
& 0x40) pat
^= 1;
764 VS
[NS
].buf
= patpix
[pat
][v
];
765 if (++NS
== 10) break;
768 for (i
= 0; i
< NS
; i
++)
770 for (j
= i
+ 1; j
< NS
; j
++)
772 if (VS
[i
].x
> VS
[j
].x
)
782 static void spr_scan(void) ICODE_ATTR
;
783 static void spr_scan(void)
786 byte pal
, b
, ns
= NS
;
787 byte
*src
, *dest
, *bg
, *pri
;
788 struct vissprite
*vs
;
789 static byte bgdup
[256];
793 memcpy(bgdup
, BUF
, 256);
796 for (; ns
; ns
--, vs
--)
799 if (x
> 159) continue;
800 if (x
< -7) continue;
811 if (x
> 152) i
= 160 - x
;
817 bg
= bgdup
+ (dest
- BUF
);
821 if (b
&& !(bg
[i
]&3)) dest
[i
] = pal
|b
;
826 bg
= bgdup
+ (dest
- BUF
);
827 pri
= PRI
+ (dest
- BUF
);
831 if (b
&& (!pri
[i
] || !(bg
[i
]&3)))
835 else while (i
--) if (src
[i
]) dest
[i
] = pal
|src
[i
];
839 /* Scaling defines */
840 #define DX ((LCD_WIDTH<<16) / 160)
841 #define DXI ((160<<16) / LCD_WIDTH)
842 #define DY ((LCD_HEIGHT<<16) / 144)
843 #define DYI ((144<<16) / LCD_HEIGHT)
845 #define DXR ((LCD_WIDTH<<16) / 144)
846 #define DXIR ((144<<16) / LCD_WIDTH)
847 #define DYR ((LCD_HEIGHT<<16) / 160)
848 #define DYIR ((160<<16) / LCD_HEIGHT)
850 /* Defines for scale offsets:
852 * S3 if scaled and maintain ratio
854 * R's are the rotated defines
856 #if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144)
857 #define S1 ((LCD_HEIGHT-144)/2)*LCD_WIDTH + ((LCD_WIDTH-160)/2)
859 #define S1R ((LCD_HEIGHT-160)/2)*LCD_WIDTH + ((LCD_WIDTH-144)/2)+144
860 #define S2R (LCD_WIDTH-1)
862 #elif (LCD_WIDTH>=160) && (LCD_HEIGHT<=144)
865 #define S1R LCD_WIDTH-1
866 #define S2R LCD_WIDTH-1
868 #elif (LCD_WIDTH<=160) && (LCD_HEIGHT>=144)
869 #define S1 ((LCD_HEIGHT-144)/2)*LCD_WIDTH
870 #define S2 ((LCD_HEIGHT-144)/2)*LCD_WIDTH
871 #define S1R LCD_WIDTH-1
872 #define S2R LCD_WIDTH-1
877 #define S1R LCD_WIDTH-1
878 #define S2R LCD_WIDTH-1
881 #if (LCD_WIDTH>LCD_HEIGHT)
882 #define S3 ((LCD_WIDTH-((160*DY)>>16))/2)
883 #define S3R LCD_WIDTH-1
885 #define S3 ((LCD_HEIGHT-((144*DX)>>16))/2)*LCD_WIDTH
886 #define S3R ((LCD_HEIGHT-((160*DXR)>>16))/2)*LCD_WIDTH+LCD_WIDTH-1
891 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
892 vdest
=(unsigned char*)rb
->lcd_framebuffer
;
894 vdest
=rb
->lcd_framebuffer
;
897 #ifdef HAVE_LCD_COLOR
899 if(options
.rotate
==1) {
900 if(options
.scaling
== 0)
902 else if (options
.scaling
== 1)
906 } else if(options
.rotate
==2) {
907 if(options
.scaling
== 0)
908 vdest
+=(LCD_WIDTH
*LCD_HEIGHT
)-S2R
;
909 else if (options
.scaling
== 1)
910 vdest
+=(LCD_WIDTH
*LCD_HEIGHT
)-S3R
;
912 vdest
+=(LCD_WIDTH
*LCD_HEIGHT
)-S1R
-144;
914 if(options
.scaling
== 0)
916 else if (options
.scaling
== 1)
925 #ifdef HAVE_LCD_COLOR
926 int SCALEWL IDATA_ATTR
=1<<16;
927 int SCALEWS IDATA_ATTR
=1<<16;
928 int SCALEHL IDATA_ATTR
=1<<16;
929 int SCALEHS IDATA_ATTR
=1<<16;
930 int swidth IDATA_ATTR
=160;
931 int sremain IDATA_ATTR
=LCD_WIDTH
-160;
934 void setvidmode(void)
937 #ifdef HAVE_LCD_COLOR
938 switch(options
.scaling
)
956 case 1: /* Maintain Ratio */
998 swidth
=((160*SCALEWL
)>>16);
1000 if(options
.rotate
==1) {
1001 sremain
=-(((160*SCALEWL
)>>16)*LCD_WIDTH
+1);
1002 } else if(options
.rotate
==2) {
1003 sremain
=(((160*SCALEWL
)>>16)*LCD_WIDTH
+1);
1005 sremain
=LCD_WIDTH
-swidth
;
1010 void lcd_refreshline(void)
1012 #ifdef HAVE_LCD_COLOR
1016 if (!(R_LCDC
& 0x80))
1017 return; /* should not happen... */
1019 #if (LCD_HEIGHT <= 128) && !defined(HAVE_LCD_COLOR)
1020 if ( (fb
.mode
==0&&(R_LY
>= 128)) ||
1021 (fb
.mode
==1&&(R_LY
< 16)) ||
1022 (fb
.mode
==2&&(R_LY
<8||R_LY
>=136)) ||
1023 (fb
.mode
==3&&((R_LY
%9)==8))
1025 #if LCD_HEIGHT == 64
1026 || (R_LY
& 1) /* calculate only even lines */
1036 Y
= (R_SCY
+ L
) & 0xff;
1043 if (WY
>L
|| WY
<0 || WY
>143 || WX
<-7 || WX
>159 || !(R_LCDC
&0x20))
1069 #if !defined(HAVE_LCD_COLOR)
1071 if (scanline_ind
== 7)
1072 #elif LCD_DEPTH == 2
1073 if (scanline_ind
== 3)
1079 vid_update(L
-((int)(L
/9)));
1082 /* Universal Scaling pulled from PrBoom and modified for rockboy */
1084 static int hpt IDATA_ATTR
=0x8000;
1086 while((hpt
>>16)<L
+1)
1089 register unsigned int srcpt
=0x8000;
1090 register unsigned int wcount
=swidth
;
1093 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
1094 *vdest
= BUF
[srcpt
>>16];
1096 *vdest
= PAL
[BUF
[srcpt
>>16]];
1098 if (options
.rotate
== 1) {
1100 } else if (options
.rotate
== 2) {
1113 if(options
.showstats
)
1115 snprintf(frameout
,sizeof(frameout
),"FPS: %d Frameskip: %d ",options
.fps
, options
.frameskip
);
1116 rb
->lcd_putsxy(0,LCD_HEIGHT
-10,frameout
);
1117 rb
->lcd_update_rect(0,LCD_HEIGHT
-10, LCD_WIDTH
, 10);
1122 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
1123 if(options
.scaling
==3) {
1124 rb
->lcd_blit_pal256((unsigned char*)rb
->lcd_framebuffer
,(LCD_WIDTH
-160)/2, (LCD_HEIGHT
-144)/2, (LCD_WIDTH
-160)/2, (LCD_HEIGHT
-144)/2, 160, 144);
1126 rb
->lcd_blit_pal256((unsigned char*)rb
->lcd_framebuffer
,0,0,0,0,LCD_WIDTH
,LCD_HEIGHT
);
1129 if(options
.scaling
==3) {
1130 rb
->lcd_update_rect( (LCD_WIDTH
-160)/2, (LCD_HEIGHT
-144)/2, 160, 144);
1140 scanline_ind
= (scanline_ind
+1) % 8;
1141 #elif LCD_DEPTH == 2
1142 scanline_ind
= (scanline_ind
+1) % 4;
1146 #ifdef HAVE_LCD_COLOR
1149 memcpy(dmg_pal
,palettes
[options
.pal
], sizeof(dmg_pal
));
1153 static void updatepalette(int i
)
1157 c
= (lcd
.pal
[i
<<1] | ((int)lcd
.pal
[(i
<<1)|1] << 8)) & 0x7FFF;
1158 r
= (c
& 0x001F) << 3;
1159 g
= (c
& 0x03E0) >> 2;
1160 b
= (c
& 0x7C00) >> 7;
1165 r
= (r
>> fb
.cc
[0].r
) << fb
.cc
[0].l
;
1166 g
= (g
>> fb
.cc
[1].r
) << fb
.cc
[1].l
;
1167 b
= (b
>> fb
.cc
[2].r
) << fb
.cc
[2].l
;
1169 #if LCD_PIXELFORMAT == RGB565
1171 #elif LCD_PIXELFORMAT == RGB565SWAPPED
1175 /* updatepalette might get called, but the pallete does not necessarily
1176 * need to be updated.
1181 #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
1182 rb
->lcd_pal256_update_pal(PAL
);
1186 #endif /* HAVE_LCD_COLOR */
1188 void pal_write(int i
, byte b
)
1190 if (lcd
.pal
[i
] == b
) return;
1192 #ifdef HAVE_LCD_COLOR
1193 updatepalette(i
>>1);
1197 void pal_write_dmg(int i
, int mapnum
, byte d
)
1200 int *cmap
= dmg_pal
[mapnum
];
1205 for (j
= 0; j
< 8; j
+= 2)
1207 c
= cmap
[(d
>> j
) & 3];
1208 r
= (c
& 0xf8) >> 3;
1209 g
= (c
& 0xf800) >> 6;
1210 b
= (c
& 0xf80000) >> 9;
1212 /* FIXME - handle directly without faking cgb */
1213 pal_write(i
+j
, c
& 0xff);
1214 pal_write(i
+j
+1, c
>> 8);
1218 void vram_write(addr a
, byte b
)
1220 lcd
.vbank
[R_VBK
&1][a
] = b
;
1221 if (a
>= 0x1800) return;
1222 patdirty
[((R_VBK
&1)<<9)+(a
>>4)] = 1;
1227 void vram_dirty(void)
1230 memset(patdirty
, 1, sizeof patdirty
);
1233 void pal_dirty(void)
1235 #ifdef HAVE_LCD_COLOR
1241 pal_write_dmg(0, 0, R_BGP
);
1242 pal_write_dmg(8, 1, R_BGP
);
1243 pal_write_dmg(64, 2, R_OBP0
);
1244 pal_write_dmg(72, 3, R_OBP1
);
1246 #ifdef HAVE_LCD_COLOR
1247 for (i
= 0; i
< 64; i
++)
1252 void lcd_reset(void)
1254 memset(&lcd
, 0, sizeof lcd
);