diff options
author | Karl Kurbjun <kkurbjun@gmail.com> | 2009-08-09 03:20:55 +0000 |
---|---|---|
committer | Karl Kurbjun <kkurbjun@gmail.com> | 2009-08-09 03:20:55 +0000 |
commit | 4cded9c7b96957afe596f6647c52b7e9d07c3b1b (patch) | |
tree | 3dfeac6cf3815850e42f7699d99cc77ea5581ba2 /apps/plugins | |
parent | 7f971e017670880685be276898ec80189ee0940b (diff) | |
download | rockbox-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
Diffstat (limited to 'apps/plugins')
-rw-r--r-- | apps/plugins/rockboy/emu.c | 1 | ||||
-rw-r--r-- | apps/plugins/rockboy/lcd.c | 91 | ||||
-rw-r--r-- | apps/plugins/rockboy/mem.c | 8 | ||||
-rw-r--r-- | apps/plugins/rockboy/menu.c | 36 | ||||
-rw-r--r-- | apps/plugins/rockboy/rockboy.c | 9 |
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 | ||
59 | static int dmg_pal[4][4]; | 59 | static int dmg_pal[4][4]; |
60 | 60 | ||
61 | #if defined(HAVE_LCD_MODES) && (HAVE_LCD_MODES & LCD_MODE_PAL256) | ||
62 | unsigned char *vdest; | ||
63 | #else | ||
61 | fb_data *vdest; | 64 | fb_data *vdest; |
65 | #endif | ||
62 | 66 | ||
63 | #ifndef ASM_UPDATEPATPIX | 67 | #ifndef ASM_UPDATEPATPIX |
64 | static void updatepatpix(void) ICODE_ATTR; | 68 | static 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 | ||
846 | void 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 | ||
889 | void 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 | ||
917 | void setvidmode(void) | 934 | void 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 | ||
1175 | void vram_dirty(void) | 1227 | void 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 */ |
34 | static void do_opt_menu(void); | 15 | static void do_opt_menu(void); |
35 | static void do_slot_menu(bool is_load); | 16 | static 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(); |