Commit 7ac56ff043e82e540a5aa108bba2b44b407dd60b
1 parent
8281db4d
SSD0323 vertical incrememnt mode.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3696 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
28 additions
and
8 deletions
hw/ssd0323.c
| @@ -30,6 +30,12 @@ do { fprintf(stderr, "ssd0323: error: " fmt , ##args);} while (0) | @@ -30,6 +30,12 @@ do { fprintf(stderr, "ssd0323: error: " fmt , ##args);} while (0) | ||
| 30 | /* Scaling factor for pixels. */ | 30 | /* Scaling factor for pixels. */ |
| 31 | #define MAGNIFY 4 | 31 | #define MAGNIFY 4 |
| 32 | 32 | ||
| 33 | +#define REMAP_SWAP_COLUMN 0x01 | ||
| 34 | +#define REMAP_SWAP_NYBBLE 0x02 | ||
| 35 | +#define REMAP_VERTICAL 0x04 | ||
| 36 | +#define REMAP_SWAP_COM 0x10 | ||
| 37 | +#define REMAP_SPLIT_COM 0x40 | ||
| 38 | + | ||
| 33 | enum ssd0323_mode | 39 | enum ssd0323_mode |
| 34 | { | 40 | { |
| 35 | SSD0323_CMD, | 41 | SSD0323_CMD, |
| @@ -49,6 +55,7 @@ typedef struct { | @@ -49,6 +55,7 @@ typedef struct { | ||
| 49 | int col_start; | 55 | int col_start; |
| 50 | int col_end; | 56 | int col_end; |
| 51 | int redraw; | 57 | int redraw; |
| 58 | + int remap; | ||
| 52 | enum ssd0323_mode mode; | 59 | enum ssd0323_mode mode; |
| 53 | uint8_t framebuffer[128 * 80 / 2]; | 60 | uint8_t framebuffer[128 * 80 / 2]; |
| 54 | } ssd0323_state; | 61 | } ssd0323_state; |
| @@ -60,13 +67,24 @@ int ssd0323_xfer_ssi(void *opaque, int data) | @@ -60,13 +67,24 @@ int ssd0323_xfer_ssi(void *opaque, int data) | ||
| 60 | case SSD0323_DATA: | 67 | case SSD0323_DATA: |
| 61 | DPRINTF("data 0x%02x\n", data); | 68 | DPRINTF("data 0x%02x\n", data); |
| 62 | s->framebuffer[s->col + s->row * 64] = data; | 69 | s->framebuffer[s->col + s->row * 64] = data; |
| 63 | - s->col++; | ||
| 64 | - if (s->col > s->col_end) { | 70 | + if (s->remap & REMAP_VERTICAL) { |
| 65 | s->row++; | 71 | s->row++; |
| 66 | - s->col = s->col_start; | ||
| 67 | - } | ||
| 68 | - if (s->row > s->row_end) { | ||
| 69 | - s->row = s->row_start; | 72 | + if (s->row > s->row_end) { |
| 73 | + s->row = s->row_start; | ||
| 74 | + s->col++; | ||
| 75 | + } | ||
| 76 | + if (s->col > s->col_end) { | ||
| 77 | + s->col = s->col_start; | ||
| 78 | + } | ||
| 79 | + } else { | ||
| 80 | + s->col++; | ||
| 81 | + if (s->col > s->col_end) { | ||
| 82 | + s->row++; | ||
| 83 | + s->col = s->col_start; | ||
| 84 | + } | ||
| 85 | + if (s->row > s->row_end) { | ||
| 86 | + s->row = s->row_start; | ||
| 87 | + } | ||
| 70 | } | 88 | } |
| 71 | s->redraw = 1; | 89 | s->redraw = 1; |
| 72 | break; | 90 | break; |
| @@ -82,12 +100,12 @@ int ssd0323_xfer_ssi(void *opaque, int data) | @@ -82,12 +100,12 @@ int ssd0323_xfer_ssi(void *opaque, int data) | ||
| 82 | #define DATA(x) if (s->cmd_len <= (x)) return 0 | 100 | #define DATA(x) if (s->cmd_len <= (x)) return 0 |
| 83 | case 0x15: /* Set column. */ | 101 | case 0x15: /* Set column. */ |
| 84 | DATA(2); | 102 | DATA(2); |
| 85 | - s->col_start = s->cmd_data[0] % 64; | 103 | + s->col = s->col_start = s->cmd_data[0] % 64; |
| 86 | s->col_end = s->cmd_data[1] % 64; | 104 | s->col_end = s->cmd_data[1] % 64; |
| 87 | break; | 105 | break; |
| 88 | case 0x75: /* Set row. */ | 106 | case 0x75: /* Set row. */ |
| 89 | DATA(2); | 107 | DATA(2); |
| 90 | - s->row_start = s->cmd_data[0] % 80; | 108 | + s->row = s->row_start = s->cmd_data[0] % 80; |
| 91 | s->row_end = s->cmd_data[1] % 80; | 109 | s->row_end = s->cmd_data[1] % 80; |
| 92 | break; | 110 | break; |
| 93 | case 0x81: /* Set contrast */ | 111 | case 0x81: /* Set contrast */ |
| @@ -99,6 +117,7 @@ int ssd0323_xfer_ssi(void *opaque, int data) | @@ -99,6 +117,7 @@ int ssd0323_xfer_ssi(void *opaque, int data) | ||
| 99 | case 0xa0: /* Set remapping. */ | 117 | case 0xa0: /* Set remapping. */ |
| 100 | /* FIXME: Implement this. */ | 118 | /* FIXME: Implement this. */ |
| 101 | DATA(1); | 119 | DATA(1); |
| 120 | + s->remap = s->cmd_data[0]; | ||
| 102 | break; | 121 | break; |
| 103 | case 0xa1: /* Set display start line. */ | 122 | case 0xa1: /* Set display start line. */ |
| 104 | case 0xa2: /* Set display offset. */ | 123 | case 0xa2: /* Set display offset. */ |
| @@ -207,6 +226,7 @@ static void ssd0323_update_display(void *opaque) | @@ -207,6 +226,7 @@ static void ssd0323_update_display(void *opaque) | ||
| 207 | } | 226 | } |
| 208 | p += dest_width; | 227 | p += dest_width; |
| 209 | } | 228 | } |
| 229 | + /* TODO: Implement row/column remapping. */ | ||
| 210 | dest = s->ds->data; | 230 | dest = s->ds->data; |
| 211 | for (y = 0; y < 64; y++) { | 231 | for (y = 0; y < 64; y++) { |
| 212 | line = y; | 232 | line = y; |