diff options
Diffstat (limited to 'uisimulator/lcd.c')
-rw-r--r-- | uisimulator/lcd.c | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/uisimulator/lcd.c b/uisimulator/lcd.c index 052330c115..294302c9ac 100644 --- a/uisimulator/lcd.c +++ b/uisimulator/lcd.c | |||
@@ -24,8 +24,13 @@ | |||
24 | #include "lcd.h" | 24 | #include "lcd.h" |
25 | #ifdef LCD_DEBUG | 25 | #ifdef LCD_DEBUG |
26 | #include <stdio.h> | 26 | #include <stdio.h> |
27 | |||
28 | #define PRINT(x) printf x | ||
29 | #else | ||
30 | #define PRINT(x) | ||
27 | #endif | 31 | #endif |
28 | 32 | ||
33 | |||
29 | #define DISP_X LCD_WIDTH /* Display width in pixels */ | 34 | #define DISP_X LCD_WIDTH /* Display width in pixels */ |
30 | #define DISP_Y LCD_HEIGHT /* Display height in pixels */ | 35 | #define DISP_Y LCD_HEIGHT /* Display height in pixels */ |
31 | 36 | ||
@@ -168,14 +173,11 @@ void lcd_position(int x, int y) | |||
168 | if (x >= 0 && x < DISP_X && y >= 0 && y < DISP_Y) { | 173 | if (x >= 0 && x < DISP_X && y >= 0 && y < DISP_Y) { |
169 | lcd_x = x; | 174 | lcd_x = x; |
170 | lcd_y = y; | 175 | lcd_y = y; |
171 | #ifdef LCD_DEBUG | 176 | PRINT(("lcd_position: set to %d, %d\n", x, y)); |
172 | fprintf(stderr, "lcd_position: set to %d, %d\n", x, y); | ||
173 | #endif | ||
174 | } | 177 | } |
175 | #ifdef LCD_DEBUG | ||
176 | else | 178 | else |
177 | fprintf(stderr, "lcd_position: not set\n"); | 179 | PRINT(("lcd_position: not set\n")); |
178 | #endif | 180 | |
179 | 181 | ||
180 | } | 182 | } |
181 | 183 | ||
@@ -198,8 +200,12 @@ void lcd_clear(void) | |||
198 | */ | 200 | */ |
199 | void lcd_char (int ch, char invert) | 201 | void lcd_char (int ch, char invert) |
200 | { | 202 | { |
201 | unsigned char (*dp)[DISP_X] = (void *) &display[lcd_y/8][lcd_x]; | 203 | unsigned char yrow = lcd_y/8; |
202 | unsigned long shift, mask, col; | 204 | unsigned char (*dp)[LCD_WIDTH] = &display[yrow][lcd_x]; |
205 | unsigned char shift, mask, col; | ||
206 | |||
207 | PRINT(("lcd_char: output %c (%02x) at %d, %d (yrow %d)\n", | ||
208 | ch, ch, lcd_x, lcd_y, yrow)); | ||
203 | 209 | ||
204 | /* Limit to char generation table */ | 210 | /* Limit to char generation table */ |
205 | if (ch < ASCII_MIN || ch > ASCII_MAX) | 211 | if (ch < ASCII_MIN || ch > ASCII_MAX) |
@@ -214,9 +220,14 @@ void lcd_char (int ch, char invert) | |||
214 | /* Write each char column */ | 220 | /* Write each char column */ |
215 | for (col = 0; col < CHAR_X-1; col++) { | 221 | for (col = 0; col < CHAR_X-1; col++) { |
216 | unsigned long data = (lcd_font_data[ch-ASCII_MIN][col] << shift) ^ invert; | 222 | unsigned long data = (lcd_font_data[ch-ASCII_MIN][col] << shift) ^ invert; |
223 | |||
224 | PRINT(("OR[0]: %02x on x %d y %d \n", data&0xff, col+lcd_x, yrow)); | ||
225 | |||
217 | dp[0][col] = (dp[0][col] & mask) | data; | 226 | dp[0][col] = (dp[0][col] & mask) | data; |
218 | if (lcd_y < DISP_Y-8) | 227 | if (lcd_y < DISP_Y-8) { |
228 | PRINT(("OR[1]: %02x on x %d y %d\n", (data>>8), col+lcd_x, yrow+1)); | ||
219 | dp[1][col] = (dp[1][col] & (mask >> 8)) | (data >> 8); | 229 | dp[1][col] = (dp[1][col] & (mask >> 8)) | (data >> 8); |
230 | } | ||
220 | } | 231 | } |
221 | 232 | ||
222 | /* Column after char */ | 233 | /* Column after char */ |
@@ -232,10 +243,8 @@ void lcd_string(const char *text, char invert) | |||
232 | { | 243 | { |
233 | int ch; | 244 | int ch; |
234 | 245 | ||
235 | #ifdef LCD_DEBUG | 246 | PRINT(("lcd_string: output %s at %d, %d\n", text, lcd_x, lcd_y)); |
236 | fprintf(stderr, "lcd_string: output %s at %d, %d\n", | 247 | |
237 | text, lcd_x, lcd_y); | ||
238 | #endif | ||
239 | while ((ch = *text++) != '\0') { | 248 | while ((ch = *text++) != '\0') { |
240 | if (lcd_y > DISP_Y-CHAR_Y) { | 249 | if (lcd_y > DISP_Y-CHAR_Y) { |
241 | /* Scroll (8 pixels) */ | 250 | /* Scroll (8 pixels) */ |
@@ -248,16 +257,13 @@ void lcd_string(const char *text, char invert) | |||
248 | else { | 257 | else { |
249 | lcd_char (ch, invert); | 258 | lcd_char (ch, invert); |
250 | lcd_x += CHAR_X; | 259 | lcd_x += CHAR_X; |
251 | } | ||
252 | 260 | ||
253 | if (lcd_x > DISP_X-CHAR_X) { | 261 | if (lcd_x > DISP_X-CHAR_X) { |
254 | /* Wrap to next line */ | 262 | /* Wrap to next line */ |
255 | lcd_x = 0; | 263 | lcd_x = 0; |
256 | lcd_y += CHAR_Y; | 264 | lcd_y += CHAR_Y; |
265 | } | ||
257 | } | 266 | } |
258 | } | 267 | } |
259 | #ifdef LCD_DEBUG | 268 | PRINT(("lcd_string: position after write: %d, %d\n", lcd_x, lcd_y)); |
260 | fprintf(stderr, "lcd_string: position after write: %d, %d\n", | ||
261 | lcd_x, lcd_y); | ||
262 | #endif | ||
263 | } | 269 | } |