summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Kurbjun <kkurbjun@gmail.com>2009-08-09 03:20:55 +0000
committerKarl Kurbjun <kkurbjun@gmail.com>2009-08-09 03:20:55 +0000
commit4cded9c7b96957afe596f6647c52b7e9d07c3b1b (patch)
tree3dfeac6cf3815850e42f7699d99cc77ea5581ba2
parent7f971e017670880685be276898ec80189ee0940b (diff)
downloadrockbox-4cded9c7b96957afe596f6647c52b7e9d07c3b1b.tar.gz
rockbox-4cded9c7b96957afe596f6647c52b7e9d07c3b1b.zip
Rockboy: Significantly reduce the number of palette updates, add support for hardware palette mode, screen can now be rotated left or right.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22214 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/rockboy/emu.c1
-rw-r--r--apps/plugins/rockboy/lcd.c91
-rw-r--r--apps/plugins/rockboy/mem.c8
-rw-r--r--apps/plugins/rockboy/menu.c36
-rw-r--r--apps/plugins/rockboy/rockboy.c9
5 files changed, 102 insertions, 43 deletions
diff --git a/apps/plugins/rockboy/emu.c b/apps/plugins/rockboy/emu.c
index 8b75211ab0..1e171cbae2 100644
--- a/apps/plugins/rockboy/emu.c
+++ b/apps/plugins/rockboy/emu.c
@@ -41,6 +41,7 @@ void emu_run(void)
41#ifdef HAVE_ADJUSTABLE_CPU_FREQ 41#ifdef HAVE_ADJUSTABLE_CPU_FREQ
42 rb->cpu_boost(true); 42 rb->cpu_boost(true);
43#endif 43#endif
44 set_pal();
44 45
45 while(!shut) 46 while(!shut)
46 { 47 {
diff --git a/apps/plugins/rockboy/lcd.c b/apps/plugins/rockboy/lcd.c
index 372e9e0736..0da9fc7e9d 100644
--- a/apps/plugins/rockboy/lcd.c
+++ b/apps/plugins/rockboy/lcd.c
@@ -58,7 +58,11 @@ static int scanline_ind=0;
58 58
59static int dmg_pal[4][4]; 59static int dmg_pal[4][4];
60 60
61#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
62unsigned char *vdest;
63#else
61fb_data *vdest; 64fb_data *vdest;
65#endif
62 66
63#ifndef ASM_UPDATEPATPIX 67#ifndef ASM_UPDATEPATPIX
64static void updatepatpix(void) ICODE_ATTR; 68static void updatepatpix(void) ICODE_ATTR;
@@ -843,9 +847,12 @@ static void spr_scan(void)
843#define DYR ((LCD_HEIGHT<<16) / 160) 847#define DYR ((LCD_HEIGHT<<16) / 160)
844#define DYIR ((160<<16) / LCD_HEIGHT) 848#define DYIR ((160<<16) / LCD_HEIGHT)
845 849
846void lcd_begin(void) 850/* Defines for scale offsets:
847{ 851 * S2 is for scaled
848 852 * S3 if scaled and maintain ratio
853 * S1 is unscaled
854 * R's are the rotated defines
855 */
849#if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144) 856#if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144)
850#define S1 ((LCD_HEIGHT-144)/2)*LCD_WIDTH + ((LCD_WIDTH-160)/2) 857#define S1 ((LCD_HEIGHT-144)/2)*LCD_WIDTH + ((LCD_WIDTH-160)/2)
851#define S2 0 858#define S2 0
@@ -879,21 +886,31 @@ void lcd_begin(void)
879#define S3R ((LCD_HEIGHT-((160*DXR)>>16))/2)*LCD_WIDTH+LCD_WIDTH-1 886#define S3R ((LCD_HEIGHT-((160*DXR)>>16))/2)*LCD_WIDTH+LCD_WIDTH-1
880#endif 887#endif
881 888
889void lcd_begin(void)
890{
891#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
892 vdest=(unsigned char*)rb->lcd_framebuffer;
893#else
882 vdest=rb->lcd_framebuffer; 894 vdest=rb->lcd_framebuffer;
895#endif
896
883#ifdef HAVE_LCD_COLOR 897#ifdef HAVE_LCD_COLOR
884 set_pal();
885 898
886 if(options.rotate) 899 if(options.rotate==1) {
887 {
888 if(options.scaling == 0) 900 if(options.scaling == 0)
889 vdest+=+S2R; 901 vdest+=S2R;
890 else if (options.scaling == 1) 902 else if (options.scaling == 1)
891 vdest+=S3R; 903 vdest+=S3R;
892 else 904 else
893 vdest+=S1R; 905 vdest+=S1R;
894 } 906 } else if(options.rotate==2) {
895 else 907 if(options.scaling == 0)
896 { 908 vdest+=(LCD_WIDTH*LCD_HEIGHT)-S2R;
909 else if (options.scaling == 1)
910 vdest+=(LCD_WIDTH*LCD_HEIGHT)-S3R;
911 else
912 vdest+=(LCD_WIDTH*LCD_HEIGHT)-S1R-144;
913 } else {
897 if(options.scaling == 0) 914 if(options.scaling == 0)
898 vdest+=S2; 915 vdest+=S2;
899 else if (options.scaling == 1) 916 else if (options.scaling == 1)
@@ -916,6 +933,7 @@ int sremain IDATA_ATTR=LCD_WIDTH-160;
916 933
917void setvidmode(void) 934void setvidmode(void)
918{ 935{
936
919#ifdef HAVE_LCD_COLOR 937#ifdef HAVE_LCD_COLOR
920 switch(options.scaling) 938 switch(options.scaling)
921 { 939 {
@@ -977,12 +995,15 @@ void setvidmode(void)
977 SCALEHL=1<<16; 995 SCALEHL=1<<16;
978 SCALEHS=1<<16; 996 SCALEHS=1<<16;
979 } 997 }
980 swidth=(160*SCALEWL)>>16; 998 swidth=((160*SCALEWL)>>16);
981 999
982 if(options.rotate) 1000 if(options.rotate==1) {
983 sremain=-(((160*SCALEWL)>>16)*LCD_WIDTH+1); 1001 sremain=-(((160*SCALEWL)>>16)*LCD_WIDTH+1);
984 else 1002 } else if(options.rotate==2) {
1003 sremain=(((160*SCALEWL)>>16)*LCD_WIDTH+1);
1004 } else {
985 sremain=LCD_WIDTH-swidth; 1005 sremain=LCD_WIDTH-swidth;
1006 }
986#endif 1007#endif
987} 1008}
988 1009
@@ -1067,18 +1088,24 @@ void lcd_refreshline(void)
1067 hpt+=SCALEHS; 1088 hpt+=SCALEHS;
1068 register unsigned int srcpt=0x8000; 1089 register unsigned int srcpt=0x8000;
1069 register unsigned int wcount=swidth; 1090 register unsigned int wcount=swidth;
1070 register unsigned int remain=sremain;
1071 while(wcount--) 1091 while(wcount--)
1072 { 1092 {
1093#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
1094 *vdest = BUF[srcpt>>16];
1095#else
1073 *vdest = PAL[BUF[srcpt>>16]]; 1096 *vdest = PAL[BUF[srcpt>>16]];
1074 if (options.rotate) 1097#endif
1098 if (options.rotate == 1) {
1075 vdest+=LCD_WIDTH; 1099 vdest+=LCD_WIDTH;
1076 else 1100 } else if (options.rotate == 2) {
1101 vdest-=LCD_WIDTH;
1102 } else {
1077 vdest++; 1103 vdest++;
1104 }
1078 1105
1079 srcpt+=SCALEWS; 1106 srcpt+=SCALEWS;
1080 } 1107 }
1081 vdest+=remain; 1108 vdest+=sremain;
1082 } 1109 }
1083 1110
1084 if(L==143) 1111 if(L==143)
@@ -1087,10 +1114,24 @@ void lcd_refreshline(void)
1087 { 1114 {
1088 snprintf(frameout,sizeof(frameout),"FPS: %d Frameskip: %d ",options.fps, options.frameskip); 1115 snprintf(frameout,sizeof(frameout),"FPS: %d Frameskip: %d ",options.fps, options.frameskip);
1089 rb->lcd_putsxy(0,LCD_HEIGHT-10,frameout); 1116 rb->lcd_putsxy(0,LCD_HEIGHT-10,frameout);
1117 rb->lcd_update_rect(0,LCD_HEIGHT-10, LCD_WIDTH, 10);
1090 } 1118 }
1091 1119
1092 hpt=0x8000; 1120 hpt=0x8000;
1093 rb->lcd_update(); 1121
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);
1125 } else {
1126 rb->lcd_blit_pal256((unsigned char*)rb->lcd_framebuffer,0,0,0,0,LCD_WIDTH,LCD_HEIGHT);
1127 }
1128#else
1129 if(options.scaling==3) {
1130 rb->lcd_update_rect( (LCD_WIDTH-160)/2, (LCD_HEIGHT-144)/2, 160, 144);
1131 } else {
1132 rb->lcd_update();
1133 }
1134#endif
1094 } 1135 }
1095 1136
1096#endif 1137#endif
@@ -1130,7 +1171,17 @@ static void updatepalette(int i)
1130#elif LCD_PIXELFORMAT == RGB565SWAPPED 1171#elif LCD_PIXELFORMAT == RGB565SWAPPED
1131 c = swap16(r|g|b); 1172 c = swap16(r|g|b);
1132#endif 1173#endif
1133 PAL[i] = c; 1174
1175 /* updatepalette might get called, but the pallete does not necessarily
1176 * need to be updated.
1177 */
1178 if(PAL[i]!=c)
1179 {
1180 PAL[i] = c;
1181#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
1182 rb->lcd_pal256_update_pal(PAL);
1183#endif
1184 }
1134} 1185}
1135#endif /* HAVE_LCD_COLOR */ 1186#endif /* HAVE_LCD_COLOR */
1136 1187
@@ -1170,6 +1221,7 @@ void vram_write(addr a, byte b)
1170 if (a >= 0x1800) return; 1221 if (a >= 0x1800) return;
1171 patdirty[((R_VBK&1)<<9)+(a>>4)] = 1; 1222 patdirty[((R_VBK&1)<<9)+(a>>4)] = 1;
1172 anydirty = 1; 1223 anydirty = 1;
1224 pal_dirty();
1173} 1225}
1174 1226
1175void vram_dirty(void) 1227void vram_dirty(void)
@@ -1203,3 +1255,4 @@ void lcd_reset(void)
1203 lcd_begin(); 1255 lcd_begin();
1204 vram_dirty(); 1256 vram_dirty();
1205} 1257}
1258
diff --git a/apps/plugins/rockboy/mem.c b/apps/plugins/rockboy/mem.c
index 93072f5d51..e00dadfa3c 100644
--- a/apps/plugins/rockboy/mem.c
+++ b/apps/plugins/rockboy/mem.c
@@ -129,18 +129,18 @@ static void ioreg_write(byte r, byte b)
129 break; 129 break;
130 case RI_BGP: 130 case RI_BGP:
131 if (R_BGP == b) break; 131 if (R_BGP == b) break;
132 /* pal_write_dmg(0, 0, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ 132 pal_write_dmg(0, 0, b);
133 /* pal_write_dmg(8, 1, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ 133 pal_write_dmg(8, 1, b);
134 R_BGP = b; 134 R_BGP = b;
135 break; 135 break;
136 case RI_OBP0: 136 case RI_OBP0:
137 if (R_OBP0 == b) break; 137 if (R_OBP0 == b) break;
138 /* pal_write_dmg(64, 2, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ 138 pal_write_dmg(64, 2, b);
139 R_OBP0 = b; 139 R_OBP0 = b;
140 break; 140 break;
141 case RI_OBP1: 141 case RI_OBP1:
142 if (R_OBP1 == b) break; 142 if (R_OBP1 == b) break;
143 /* pal_write_dmg(72, 3, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ 143 pal_write_dmg(72, 3, b);
144 R_OBP1 = b; 144 R_OBP1 = b;
145 break; 145 break;
146 case RI_IF: 146 case RI_IF:
diff --git a/apps/plugins/rockboy/menu.c b/apps/plugins/rockboy/menu.c
index 76de224294..cc12e8e67a 100644
--- a/apps/plugins/rockboy/menu.c
+++ b/apps/plugins/rockboy/menu.c
@@ -11,25 +11,6 @@
11#include "rtc-gb.h" 11#include "rtc-gb.h"
12#include "pcm.h" 12#include "pcm.h"
13 13
14#if CONFIG_KEYPAD == IPOD_4G_PAD
15#define MENU_BUTTON_UP BUTTON_SCROLL_BACK
16#define MENU_BUTTON_DOWN BUTTON_SCROLL_FWD
17#define MENU_BUTTON_LEFT BUTTON_LEFT
18#define MENU_BUTTON_RIGHT BUTTON_RIGHT
19
20#elif CONFIG_KEYPAD == IRIVER_H10_PAD
21#define MENU_BUTTON_UP BUTTON_SCROLL_UP
22#define MENU_BUTTON_DOWN BUTTON_SCROLL_DOWN
23#define MENU_BUTTON_LEFT BUTTON_LEFT
24#define MENU_BUTTON_RIGHT BUTTON_RIGHT
25
26#else
27#define MENU_BUTTON_UP BUTTON_UP
28#define MENU_BUTTON_DOWN BUTTON_DOWN
29#define MENU_BUTTON_LEFT BUTTON_LEFT
30#define MENU_BUTTON_RIGHT BUTTON_RIGHT
31#endif
32
33/* load/save state function declarations */ 14/* load/save state function declarations */
34static void do_opt_menu(void); 15static void do_opt_menu(void);
35static void do_slot_menu(bool is_load); 16static void do_slot_menu(bool is_load);
@@ -92,6 +73,10 @@ int do_user_menu(void) {
92 time = rb->mktime(rb->get_time()); 73 time = rb->mktime(rb->get_time());
93#endif 74#endif
94 75
76#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
77 rb->lcd_set_mode(LCD_MODE_RGB565);
78#endif
79
95 /* Clean out the button Queue */ 80 /* Clean out the button Queue */
96 while (rb->button_get(false) != BUTTON_NONE) 81 while (rb->button_get(false) != BUTTON_NONE)
97 rb->yield(); 82 rb->yield();
@@ -136,6 +121,10 @@ int do_user_menu(void) {
136#endif 121#endif
137 while (time-- > 0) rtc_tick(); 122 while (time-- > 0) rtc_tick();
138 123
124#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
125 rb->lcd_set_mode(LCD_MODE_PAL256);
126#endif
127
139 return ret; 128 return ret;
140} 129}
141 130
@@ -344,6 +333,12 @@ static void do_opt_menu(void)
344 { "On" , -1 }, 333 { "On" , -1 },
345 }; 334 };
346 335
336 static const struct opt_items rotate[] = {
337 { "No rotation", -1 },
338 { "Rotate Right" , -1 },
339 { "Rotate Left" , -1 },
340 };
341
347 static const struct opt_items frameskip[]= { 342 static const struct opt_items frameskip[]= {
348 { "0 Max", -1 }, 343 { "0 Max", -1 },
349 { "1 Max", -1 }, 344 { "1 Max", -1 },
@@ -421,7 +416,8 @@ static void do_opt_menu(void)
421 setvidmode(); 416 setvidmode();
422 break; 417 break;
423 case 5: /* Screen rotate */ 418 case 5: /* Screen rotate */
424 rb->set_option("Screen Rotate", &options.rotate, INT, onoff, 2, NULL ); 419 rb->set_option("Screen Rotate", &options.rotate, INT, rotate,
420 sizeof(rotate)/sizeof(*rotate), NULL );
425 setvidmode(); 421 setvidmode();
426 break; 422 break;
427 case 6: /* Palette */ 423 case 6: /* Palette */
diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c
index ed75fb7d17..d073f9306f 100644
--- a/apps/plugins/rockboy/rockboy.c
+++ b/apps/plugins/rockboy/rockboy.c
@@ -385,12 +385,20 @@ enum plugin_status plugin_start(const void* parameter)
385 rb->wheel_send_events(false); 385 rb->wheel_send_events(false);
386#endif 386#endif
387 387
388#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
389 rb->lcd_set_mode(LCD_MODE_PAL256);
390#endif
391
388 gnuboy_main(parameter); 392 gnuboy_main(parameter);
389 393
390#ifdef HAVE_WHEEL_POSITION 394#ifdef HAVE_WHEEL_POSITION
391 rb->wheel_send_events(true); 395 rb->wheel_send_events(true);
392#endif 396#endif
393 397
398#if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256)
399 rb->lcd_set_mode(LCD_MODE_RGB565);
400#endif
401
394 if(shut&&!cleanshut) 402 if(shut&&!cleanshut)
395 { 403 {
396 rb->splash(HZ/2, errormsg); 404 rb->splash(HZ/2, errormsg);
@@ -398,6 +406,7 @@ enum plugin_status plugin_start(const void* parameter)
398 } 406 }
399 if(!rb->audio_status()) 407 if(!rb->audio_status())
400 pcm_close(); 408 pcm_close();
409
401 rb->splash(HZ/2, "Closing Rockboy"); 410 rb->splash(HZ/2, "Closing Rockboy");
402 411
403 savesettings(); 412 savesettings();