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 | 30 | /* Scaling factor for pixels. */ |
| 31 | 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 | 39 | enum ssd0323_mode |
| 34 | 40 | { |
| 35 | 41 | SSD0323_CMD, |
| ... | ... | @@ -49,6 +55,7 @@ typedef struct { |
| 49 | 55 | int col_start; |
| 50 | 56 | int col_end; |
| 51 | 57 | int redraw; |
| 58 | + int remap; | |
| 52 | 59 | enum ssd0323_mode mode; |
| 53 | 60 | uint8_t framebuffer[128 * 80 / 2]; |
| 54 | 61 | } ssd0323_state; |
| ... | ... | @@ -60,13 +67,24 @@ int ssd0323_xfer_ssi(void *opaque, int data) |
| 60 | 67 | case SSD0323_DATA: |
| 61 | 68 | DPRINTF("data 0x%02x\n", data); |
| 62 | 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 | 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 | 89 | s->redraw = 1; |
| 72 | 90 | break; |
| ... | ... | @@ -82,12 +100,12 @@ int ssd0323_xfer_ssi(void *opaque, int data) |
| 82 | 100 | #define DATA(x) if (s->cmd_len <= (x)) return 0 |
| 83 | 101 | case 0x15: /* Set column. */ |
| 84 | 102 | DATA(2); |
| 85 | - s->col_start = s->cmd_data[0] % 64; | |
| 103 | + s->col = s->col_start = s->cmd_data[0] % 64; | |
| 86 | 104 | s->col_end = s->cmd_data[1] % 64; |
| 87 | 105 | break; |
| 88 | 106 | case 0x75: /* Set row. */ |
| 89 | 107 | DATA(2); |
| 90 | - s->row_start = s->cmd_data[0] % 80; | |
| 108 | + s->row = s->row_start = s->cmd_data[0] % 80; | |
| 91 | 109 | s->row_end = s->cmd_data[1] % 80; |
| 92 | 110 | break; |
| 93 | 111 | case 0x81: /* Set contrast */ |
| ... | ... | @@ -99,6 +117,7 @@ int ssd0323_xfer_ssi(void *opaque, int data) |
| 99 | 117 | case 0xa0: /* Set remapping. */ |
| 100 | 118 | /* FIXME: Implement this. */ |
| 101 | 119 | DATA(1); |
| 120 | + s->remap = s->cmd_data[0]; | |
| 102 | 121 | break; |
| 103 | 122 | case 0xa1: /* Set display start line. */ |
| 104 | 123 | case 0xa2: /* Set display offset. */ |
| ... | ... | @@ -207,6 +226,7 @@ static void ssd0323_update_display(void *opaque) |
| 207 | 226 | } |
| 208 | 227 | p += dest_width; |
| 209 | 228 | } |
| 229 | + /* TODO: Implement row/column remapping. */ | |
| 210 | 230 | dest = s->ds->data; |
| 211 | 231 | for (y = 0; y < 64; y++) { |
| 212 | 232 | line = y; | ... | ... |