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; | ... | ... |