Commit 12abac853d38600847c1be2ccf90a67691a3588a

Authored by blueswir1
1 parent ae40972f

Name the magic constants, wrap long lines


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3803 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 221 additions and 103 deletions
hw/slavio_serial.c
@@ -89,6 +89,7 @@ typedef struct { @@ -89,6 +89,7 @@ typedef struct {
89 int rptr, wptr, count; 89 int rptr, wptr, count;
90 } SERIOQueue; 90 } SERIOQueue;
91 91
  92 +#define SERIAL_REGS 16
92 typedef struct ChannelState { 93 typedef struct ChannelState {
93 qemu_irq irq; 94 qemu_irq irq;
94 int reg; 95 int reg;
@@ -96,7 +97,7 @@ typedef struct ChannelState { @@ -96,7 +97,7 @@ typedef struct ChannelState {
96 chn_id_t chn; // this channel, A (base+4) or B (base+0) 97 chn_id_t chn; // this channel, A (base+4) or B (base+0)
97 chn_type_t type; 98 chn_type_t type;
98 struct ChannelState *otherchn; 99 struct ChannelState *otherchn;
99 - uint8_t rx, tx, wregs[16], rregs[16]; 100 + uint8_t rx, tx, wregs[SERIAL_REGS], rregs[SERIAL_REGS];
100 SERIOQueue queue; 101 SERIOQueue queue;
101 CharDriverState *chr; 102 CharDriverState *chr;
102 int e0_mode, led_mode, caps_lock_mode, num_lock_mode; 103 int e0_mode, led_mode, caps_lock_mode, num_lock_mode;
@@ -109,6 +110,107 @@ struct SerialState { @@ -109,6 +110,107 @@ struct SerialState {
109 110
110 #define SERIAL_MAXADDR 7 111 #define SERIAL_MAXADDR 7
111 #define SERIAL_SIZE (SERIAL_MAXADDR + 1) 112 #define SERIAL_SIZE (SERIAL_MAXADDR + 1)
  113 +#define SERIAL_CTRL 0
  114 +#define SERIAL_DATA 1
  115 +
  116 +#define W_CMD 0
  117 +#define CMD_PTR_MASK 0x07
  118 +#define CMD_CMD_MASK 0x38
  119 +#define CMD_HI 0x08
  120 +#define CMD_CLR_TXINT 0x28
  121 +#define CMD_CLR_IUS 0x38
  122 +#define W_INTR 1
  123 +#define INTR_INTALL 0x01
  124 +#define INTR_TXINT 0x02
  125 +#define INTR_RXMODEMSK 0x18
  126 +#define INTR_RXINT1ST 0x08
  127 +#define INTR_RXINTALL 0x10
  128 +#define W_IVEC 2
  129 +#define W_RXCTRL 3
  130 +#define RXCTRL_RXEN 0x01
  131 +#define W_TXCTRL1 4
  132 +#define TXCTRL1_PAREN 0x01
  133 +#define TXCTRL1_PAREV 0x02
  134 +#define TXCTRL1_1STOP 0x04
  135 +#define TXCTRL1_1HSTOP 0x08
  136 +#define TXCTRL1_2STOP 0x0c
  137 +#define TXCTRL1_STPMSK 0x0c
  138 +#define TXCTRL1_CLK1X 0x00
  139 +#define TXCTRL1_CLK16X 0x40
  140 +#define TXCTRL1_CLK32X 0x80
  141 +#define TXCTRL1_CLK64X 0xc0
  142 +#define TXCTRL1_CLKMSK 0xc0
  143 +#define W_TXCTRL2 5
  144 +#define TXCTRL2_TXEN 0x08
  145 +#define TXCTRL2_BITMSK 0x60
  146 +#define TXCTRL2_5BITS 0x00
  147 +#define TXCTRL2_7BITS 0x20
  148 +#define TXCTRL2_6BITS 0x40
  149 +#define TXCTRL2_8BITS 0x60
  150 +#define W_SYNC1 6
  151 +#define W_SYNC2 7
  152 +#define W_TXBUF 8
  153 +#define W_MINTR 9
  154 +#define MINTR_STATUSHI 0x10
  155 +#define MINTR_RST_MASK 0xc0
  156 +#define MINTR_RST_B 0x40
  157 +#define MINTR_RST_A 0x80
  158 +#define MINTR_RST_ALL 0xc0
  159 +#define W_MISC1 10
  160 +#define W_CLOCK 11
  161 +#define CLOCK_TRXC 0x08
  162 +#define W_BRGLO 12
  163 +#define W_BRGHI 13
  164 +#define W_MISC2 14
  165 +#define MISC2_PLLDIS 0x30
  166 +#define W_EXTINT 15
  167 +#define EXTINT_DCD 0x08
  168 +#define EXTINT_SYNCINT 0x10
  169 +#define EXTINT_CTSINT 0x20
  170 +#define EXTINT_TXUNDRN 0x40
  171 +#define EXTINT_BRKINT 0x80
  172 +
  173 +#define R_STATUS 0
  174 +#define STATUS_RXAV 0x01
  175 +#define STATUS_ZERO 0x02
  176 +#define STATUS_TXEMPTY 0x04
  177 +#define STATUS_DCD 0x08
  178 +#define STATUS_SYNC 0x10
  179 +#define STATUS_CTS 0x20
  180 +#define STATUS_TXUNDRN 0x40
  181 +#define STATUS_BRK 0x80
  182 +#define R_SPEC 1
  183 +#define SPEC_ALLSENT 0x01
  184 +#define SPEC_BITS8 0x06
  185 +#define R_IVEC 2
  186 +#define IVEC_TXINTB 0x00
  187 +#define IVEC_LONOINT 0x06
  188 +#define IVEC_LORXINTA 0x0c
  189 +#define IVEC_LORXINTB 0x04
  190 +#define IVEC_LOTXINTA 0x08
  191 +#define IVEC_HINOINT 0x60
  192 +#define IVEC_HIRXINTA 0x30
  193 +#define IVEC_HIRXINTB 0x20
  194 +#define IVEC_HITXINTA 0x10
  195 +#define R_INTR 3
  196 +#define INTR_EXTINTB 0x01
  197 +#define INTR_TXINTB 0x02
  198 +#define INTR_RXINTB 0x04
  199 +#define INTR_EXTINTA 0x08
  200 +#define INTR_TXINTA 0x10
  201 +#define INTR_RXINTA 0x20
  202 +#define R_IPEN 4
  203 +#define R_TXCTRL1 5
  204 +#define R_TXCTRL2 6
  205 +#define R_BC 7
  206 +#define R_RXBUF 8
  207 +#define R_RXCTRL 9
  208 +#define R_MISC 10
  209 +#define R_MISC1 11
  210 +#define R_BRGLO 12
  211 +#define R_BRGHI 13
  212 +#define R_MISC1I 14
  213 +#define R_EXTINT 15
112 214
113 static void handle_kbd_command(ChannelState *s, int val); 215 static void handle_kbd_command(ChannelState *s, int val);
114 static int serial_can_receive(void *opaque); 216 static int serial_can_receive(void *opaque);
@@ -159,11 +261,14 @@ static uint32_t get_queue(void *opaque) @@ -159,11 +261,14 @@ static uint32_t get_queue(void *opaque)
159 261
160 static int slavio_serial_update_irq_chn(ChannelState *s) 262 static int slavio_serial_update_irq_chn(ChannelState *s)
161 { 263 {
162 - if ((s->wregs[1] & 1) && // interrupts enabled  
163 - (((s->wregs[1] & 2) && s->txint == 1) || // tx ints enabled, pending  
164 - ((((s->wregs[1] & 0x18) == 8) || ((s->wregs[1] & 0x18) == 0x10)) && 264 + if ((s->wregs[W_INTR] & INTR_INTALL) && // interrupts enabled
  265 + (((s->wregs[W_INTR] & INTR_TXINT) && s->txint == 1) ||
  266 + // tx ints enabled, pending
  267 + ((((s->wregs[W_INTR] & INTR_RXMODEMSK) == INTR_RXINT1ST) ||
  268 + ((s->wregs[W_INTR] & INTR_RXMODEMSK) == INTR_RXINTALL)) &&
165 s->rxint == 1) || // rx ints enabled, pending 269 s->rxint == 1) || // rx ints enabled, pending
166 - ((s->wregs[15] & 0x80) && (s->rregs[0] & 0x80)))) { // break int e&p 270 + ((s->wregs[W_EXTINT] & EXTINT_BRKINT) &&
  271 + (s->rregs[R_STATUS] & STATUS_BRK)))) { // break int e&p
167 return 1; 272 return 1;
168 } 273 }
169 return 0; 274 return 0;
@@ -189,16 +294,18 @@ static void slavio_serial_reset_chn(ChannelState *s) @@ -189,16 +294,18 @@ static void slavio_serial_reset_chn(ChannelState *s)
189 s->rregs[i] = 0; 294 s->rregs[i] = 0;
190 s->wregs[i] = 0; 295 s->wregs[i] = 0;
191 } 296 }
192 - s->wregs[4] = 4;  
193 - s->wregs[9] = 0xc0;  
194 - s->wregs[11] = 8;  
195 - s->wregs[14] = 0x30;  
196 - s->wregs[15] = 0xf8; 297 + s->wregs[W_TXCTRL1] = TXCTRL1_1STOP; // 1X divisor, 1 stop bit, no parity
  298 + s->wregs[W_MINTR] = MINTR_RST_ALL;
  299 + s->wregs[W_CLOCK] = CLOCK_TRXC; // Synch mode tx clock = TRxC
  300 + s->wregs[W_MISC2] = MISC2_PLLDIS; // PLL disabled
  301 + s->wregs[W_EXTINT] = EXTINT_DCD | EXTINT_SYNCINT | EXTINT_CTSINT |
  302 + EXTINT_TXUNDRN | EXTINT_BRKINT; // Enable most interrupts
197 if (s->disabled) 303 if (s->disabled)
198 - s->rregs[0] = 0x7c; 304 + s->rregs[R_STATUS] = STATUS_TXEMPTY | STATUS_DCD | STATUS_SYNC |
  305 + STATUS_CTS | STATUS_TXUNDRN;
199 else 306 else
200 - s->rregs[0] = 0x44;  
201 - s->rregs[1] = 6; 307 + s->rregs[R_STATUS] = STATUS_TXEMPTY | STATUS_TXUNDRN;
  308 + s->rregs[R_SPEC] = SPEC_BITS8;
202 309
203 s->rx = s->tx = 0; 310 s->rx = s->tx = 0;
204 s->rxint = s->txint = 0; 311 s->rxint = s->txint = 0;
@@ -219,17 +326,17 @@ static inline void clr_rxint(ChannelState *s) @@ -219,17 +326,17 @@ static inline void clr_rxint(ChannelState *s)
219 s->rxint = 0; 326 s->rxint = 0;
220 s->rxint_under_svc = 0; 327 s->rxint_under_svc = 0;
221 if (s->chn == chn_a) { 328 if (s->chn == chn_a) {
222 - if (s->wregs[9] & 0x10)  
223 - s->otherchn->rregs[2] = 0x60; 329 + if (s->wregs[W_MINTR] & MINTR_STATUSHI)
  330 + s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;
224 else 331 else
225 - s->otherchn->rregs[2] = 0x06;  
226 - s->rregs[3] &= ~0x20; 332 + s->otherchn->rregs[R_IVEC] = IVEC_LONOINT;
  333 + s->rregs[R_INTR] &= ~INTR_RXINTA;
227 } else { 334 } else {
228 - if (s->wregs[9] & 0x10)  
229 - s->rregs[2] = 0x60; 335 + if (s->wregs[W_MINTR] & MINTR_STATUSHI)
  336 + s->rregs[R_IVEC] = IVEC_HINOINT;
230 else 337 else
231 - s->rregs[2] = 0x06;  
232 - s->otherchn->rregs[3] &= ~4; 338 + s->rregs[R_IVEC] = IVEC_LONOINT;
  339 + s->otherchn->rregs[R_INTR] &= ~INTR_RXINTB;
233 } 340 }
234 if (s->txint) 341 if (s->txint)
235 set_txint(s); 342 set_txint(s);
@@ -242,21 +349,21 @@ static inline void set_rxint(ChannelState *s) @@ -242,21 +349,21 @@ static inline void set_rxint(ChannelState *s)
242 if (!s->txint_under_svc) { 349 if (!s->txint_under_svc) {
243 s->rxint_under_svc = 1; 350 s->rxint_under_svc = 1;
244 if (s->chn == chn_a) { 351 if (s->chn == chn_a) {
245 - if (s->wregs[9] & 0x10)  
246 - s->otherchn->rregs[2] = 0x30; 352 + if (s->wregs[W_MINTR] & MINTR_STATUSHI)
  353 + s->otherchn->rregs[R_IVEC] = IVEC_HIRXINTA;
247 else 354 else
248 - s->otherchn->rregs[2] = 0x0c; 355 + s->otherchn->rregs[R_IVEC] = IVEC_LORXINTA;
249 } else { 356 } else {
250 - if (s->wregs[9] & 0x10)  
251 - s->rregs[2] = 0x20; 357 + if (s->wregs[W_MINTR] & MINTR_STATUSHI)
  358 + s->rregs[R_IVEC] = IVEC_HIRXINTB;
252 else 359 else
253 - s->rregs[2] = 0x04; 360 + s->rregs[R_IVEC] = IVEC_LORXINTB;
254 } 361 }
255 } 362 }
256 if (s->chn == chn_a) 363 if (s->chn == chn_a)
257 - s->rregs[3] |= 0x20; 364 + s->rregs[R_INTR] |= INTR_RXINTA;
258 else 365 else
259 - s->otherchn->rregs[3] |= 4; 366 + s->otherchn->rregs[R_INTR] |= INTR_RXINTB;
260 slavio_serial_update_irq(s); 367 slavio_serial_update_irq(s);
261 } 368 }
262 369
@@ -265,17 +372,17 @@ static inline void clr_txint(ChannelState *s) @@ -265,17 +372,17 @@ static inline void clr_txint(ChannelState *s)
265 s->txint = 0; 372 s->txint = 0;
266 s->txint_under_svc = 0; 373 s->txint_under_svc = 0;
267 if (s->chn == chn_a) { 374 if (s->chn == chn_a) {
268 - if (s->wregs[9] & 0x10)  
269 - s->otherchn->rregs[2] = 0x60; 375 + if (s->wregs[W_MINTR] & MINTR_STATUSHI)
  376 + s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;
270 else 377 else
271 - s->otherchn->rregs[2] = 0x06;  
272 - s->rregs[3] &= ~0x10; 378 + s->otherchn->rregs[R_IVEC] = IVEC_LONOINT;
  379 + s->rregs[R_INTR] &= ~INTR_TXINTA;
273 } else { 380 } else {
274 - if (s->wregs[9] & 0x10)  
275 - s->rregs[2] = 0x60; 381 + if (s->wregs[W_MINTR] & MINTR_STATUSHI)
  382 + s->rregs[R_IVEC] = IVEC_HINOINT;
276 else 383 else
277 - s->rregs[2] = 0x06;  
278 - s->otherchn->rregs[3] &= ~2; 384 + s->rregs[R_IVEC] = IVEC_LONOINT;
  385 + s->otherchn->rregs[R_INTR] &= ~INTR_TXINTB;
279 } 386 }
280 if (s->rxint) 387 if (s->rxint)
281 set_rxint(s); 388 set_rxint(s);
@@ -288,18 +395,18 @@ static inline void set_txint(ChannelState *s) @@ -288,18 +395,18 @@ static inline void set_txint(ChannelState *s)
288 if (!s->rxint_under_svc) { 395 if (!s->rxint_under_svc) {
289 s->txint_under_svc = 1; 396 s->txint_under_svc = 1;
290 if (s->chn == chn_a) { 397 if (s->chn == chn_a) {
291 - if (s->wregs[9] & 0x10)  
292 - s->otherchn->rregs[2] = 0x10; 398 + if (s->wregs[W_MINTR] & MINTR_STATUSHI)
  399 + s->otherchn->rregs[R_IVEC] = IVEC_HITXINTA;
293 else 400 else
294 - s->otherchn->rregs[2] = 0x08; 401 + s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA;
295 } else { 402 } else {
296 - s->rregs[2] = 0; 403 + s->rregs[R_IVEC] = IVEC_TXINTB;
297 } 404 }
298 } 405 }
299 if (s->chn == chn_a) 406 if (s->chn == chn_a)
300 - s->rregs[3] |= 0x10; 407 + s->rregs[R_INTR] |= INTR_TXINTA;
301 else 408 else
302 - s->otherchn->rregs[3] |= 2; 409 + s->otherchn->rregs[R_INTR] |= INTR_TXINTB;
303 slavio_serial_update_irq(s); 410 slavio_serial_update_irq(s);
304 } 411 }
305 412
@@ -311,45 +418,45 @@ static void slavio_serial_update_parameters(ChannelState *s) @@ -311,45 +418,45 @@ static void slavio_serial_update_parameters(ChannelState *s)
311 if (!s->chr || s->type != ser) 418 if (!s->chr || s->type != ser)
312 return; 419 return;
313 420
314 - if (s->wregs[4] & 1) {  
315 - if (s->wregs[4] & 2) 421 + if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREN) {
  422 + if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREV)
316 parity = 'E'; 423 parity = 'E';
317 else 424 else
318 parity = 'O'; 425 parity = 'O';
319 } else { 426 } else {
320 parity = 'N'; 427 parity = 'N';
321 } 428 }
322 - if ((s->wregs[4] & 0x0c) == 0x0c) 429 + if ((s->wregs[W_TXCTRL1] & TXCTRL1_STPMSK) == TXCTRL1_2STOP)
323 stop_bits = 2; 430 stop_bits = 2;
324 else 431 else
325 stop_bits = 1; 432 stop_bits = 1;
326 - switch (s->wregs[5] & 0x60) {  
327 - case 0x00: 433 + switch (s->wregs[W_TXCTRL2] & TXCTRL2_BITMSK) {
  434 + case TXCTRL2_5BITS:
328 data_bits = 5; 435 data_bits = 5;
329 break; 436 break;
330 - case 0x20: 437 + case TXCTRL2_7BITS:
331 data_bits = 7; 438 data_bits = 7;
332 break; 439 break;
333 - case 0x40: 440 + case TXCTRL2_6BITS:
334 data_bits = 6; 441 data_bits = 6;
335 break; 442 break;
336 default: 443 default:
337 - case 0x60: 444 + case TXCTRL2_8BITS:
338 data_bits = 8; 445 data_bits = 8;
339 break; 446 break;
340 } 447 }
341 - speed = 2457600 / ((s->wregs[12] | (s->wregs[13] << 8)) + 2);  
342 - switch (s->wregs[4] & 0xc0) {  
343 - case 0x00: 448 + speed = 2457600 / ((s->wregs[W_BRGLO] | (s->wregs[W_BRGHI] << 8)) + 2);
  449 + switch (s->wregs[W_TXCTRL1] & TXCTRL1_CLKMSK) {
  450 + case TXCTRL1_CLK1X:
344 break; 451 break;
345 - case 0x40: 452 + case TXCTRL1_CLK16X:
346 speed /= 16; 453 speed /= 16;
347 break; 454 break;
348 - case 0x80: 455 + case TXCTRL1_CLK32X:
349 speed /= 32; 456 speed /= 32;
350 break; 457 break;
351 default: 458 default:
352 - case 0xc0: 459 + case TXCTRL1_CLK64X:
353 speed /= 64; 460 speed /= 64;
354 break; 461 break;
355 } 462 }
@@ -362,7 +469,8 @@ static void slavio_serial_update_parameters(ChannelState *s) @@ -362,7 +469,8 @@ static void slavio_serial_update_parameters(ChannelState *s)
362 qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp); 469 qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
363 } 470 }
364 471
365 -static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) 472 +static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr,
  473 + uint32_t val)
366 { 474 {
367 SerialState *serial = opaque; 475 SerialState *serial = opaque;
368 ChannelState *s; 476 ChannelState *s;
@@ -374,21 +482,22 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint @@ -374,21 +482,22 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint
374 channel = (addr & SERIAL_MAXADDR) >> 2; 482 channel = (addr & SERIAL_MAXADDR) >> 2;
375 s = &serial->chn[channel]; 483 s = &serial->chn[channel];
376 switch (saddr) { 484 switch (saddr) {
377 - case 0:  
378 - SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, val & 0xff); 485 + case SERIAL_CTRL:
  486 + SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg,
  487 + val & 0xff);
379 newreg = 0; 488 newreg = 0;
380 switch (s->reg) { 489 switch (s->reg) {
381 - case 0:  
382 - newreg = val & 7;  
383 - val &= 0x38; 490 + case W_CMD:
  491 + newreg = val & CMD_PTR_MASK;
  492 + val &= CMD_CMD_MASK;
384 switch (val) { 493 switch (val) {
385 - case 8:  
386 - newreg |= 0x8; 494 + case CMD_HI:
  495 + newreg |= CMD_HI;
387 break; 496 break;
388 - case 0x28: 497 + case CMD_CLR_TXINT:
389 clr_txint(s); 498 clr_txint(s);
390 break; 499 break;
391 - case 0x38: 500 + case CMD_CLR_IUS:
392 if (s->rxint_under_svc) 501 if (s->rxint_under_svc)
393 clr_rxint(s); 502 clr_rxint(s);
394 else if (s->txint_under_svc) 503 else if (s->txint_under_svc)
@@ -398,31 +507,31 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint @@ -398,31 +507,31 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint
398 break; 507 break;
399 } 508 }
400 break; 509 break;
401 - case 1 ... 3:  
402 - case 6 ... 8:  
403 - case 10 ... 11:  
404 - case 14 ... 15: 510 + case W_INTR ... W_RXCTRL:
  511 + case W_SYNC1 ... W_TXBUF:
  512 + case W_MISC1 ... W_CLOCK:
  513 + case W_MISC2 ... W_EXTINT:
405 s->wregs[s->reg] = val; 514 s->wregs[s->reg] = val;
406 break; 515 break;
407 - case 4:  
408 - case 5:  
409 - case 12:  
410 - case 13: 516 + case W_TXCTRL1:
  517 + case W_TXCTRL2:
  518 + case W_BRGLO:
  519 + case W_BRGHI:
411 s->wregs[s->reg] = val; 520 s->wregs[s->reg] = val;
412 slavio_serial_update_parameters(s); 521 slavio_serial_update_parameters(s);
413 break; 522 break;
414 - case 9:  
415 - switch (val & 0xc0) { 523 + case W_MINTR:
  524 + switch (val & MINTR_RST_MASK) {
416 case 0: 525 case 0:
417 default: 526 default:
418 break; 527 break;
419 - case 0x40: 528 + case MINTR_RST_B:
420 slavio_serial_reset_chn(&serial->chn[1]); 529 slavio_serial_reset_chn(&serial->chn[1]);
421 return; 530 return;
422 - case 0x80: 531 + case MINTR_RST_A:
423 slavio_serial_reset_chn(&serial->chn[0]); 532 slavio_serial_reset_chn(&serial->chn[0]);
424 return; 533 return;
425 - case 0xc0: 534 + case MINTR_RST_ALL:
426 slavio_serial_reset(serial); 535 slavio_serial_reset(serial);
427 return; 536 return;
428 } 537 }
@@ -435,18 +544,18 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint @@ -435,18 +544,18 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint
435 else 544 else
436 s->reg = 0; 545 s->reg = 0;
437 break; 546 break;
438 - case 1: 547 + case SERIAL_DATA:
439 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val); 548 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val);
440 s->tx = val; 549 s->tx = val;
441 - if (s->wregs[5] & 8) { // tx enabled 550 + if (s->wregs[W_TXCTRL2] & TXCTRL2_TXEN) { // tx enabled
442 if (s->chr) 551 if (s->chr)
443 qemu_chr_write(s->chr, &s->tx, 1); 552 qemu_chr_write(s->chr, &s->tx, 1);
444 else if (s->type == kbd && !s->disabled) { 553 else if (s->type == kbd && !s->disabled) {
445 handle_kbd_command(s, val); 554 handle_kbd_command(s, val);
446 } 555 }
447 } 556 }
448 - s->rregs[0] |= 4; // Tx buffer empty  
449 - s->rregs[1] |= 1; // All sent 557 + s->rregs[R_STATUS] |= STATUS_TXEMPTY; // Tx buffer empty
  558 + s->rregs[R_SPEC] |= SPEC_ALLSENT; // All sent
450 set_txint(s); 559 set_txint(s);
451 break; 560 break;
452 default: 561 default:
@@ -466,13 +575,14 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr) @@ -466,13 +575,14 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr)
466 channel = (addr & SERIAL_MAXADDR) >> 2; 575 channel = (addr & SERIAL_MAXADDR) >> 2;
467 s = &serial->chn[channel]; 576 s = &serial->chn[channel];
468 switch (saddr) { 577 switch (saddr) {
469 - case 0:  
470 - SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, s->rregs[s->reg]); 578 + case SERIAL_CTRL:
  579 + SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg,
  580 + s->rregs[s->reg]);
471 ret = s->rregs[s->reg]; 581 ret = s->rregs[s->reg];
472 s->reg = 0; 582 s->reg = 0;
473 return ret; 583 return ret;
474 - case 1:  
475 - s->rregs[0] &= ~1; 584 + case SERIAL_DATA:
  585 + s->rregs[R_STATUS] &= ~STATUS_RXAV;
476 clr_rxint(s); 586 clr_rxint(s);
477 if (s->type == kbd || s->type == mouse) 587 if (s->type == kbd || s->type == mouse)
478 ret = get_queue(s); 588 ret = get_queue(s);
@@ -493,26 +603,26 @@ static int serial_can_receive(void *opaque) @@ -493,26 +603,26 @@ static int serial_can_receive(void *opaque)
493 ChannelState *s = opaque; 603 ChannelState *s = opaque;
494 int ret; 604 int ret;
495 605
496 - if (((s->wregs[3] & 1) == 0) // Rx not enabled  
497 - || ((s->rregs[0] & 1) == 1)) // char already available 606 + if (((s->wregs[W_RXCTRL] & RXCTRL_RXEN) == 0) // Rx not enabled
  607 + || ((s->rregs[R_STATUS] & STATUS_RXAV) == STATUS_RXAV))
  608 + // char already available
498 ret = 0; 609 ret = 0;
499 else 610 else
500 ret = 1; 611 ret = 1;
501 - //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret);  
502 return ret; 612 return ret;
503 } 613 }
504 614
505 static void serial_receive_byte(ChannelState *s, int ch) 615 static void serial_receive_byte(ChannelState *s, int ch)
506 { 616 {
507 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s), ch); 617 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s), ch);
508 - s->rregs[0] |= 1; 618 + s->rregs[R_STATUS] |= STATUS_RXAV;
509 s->rx = ch; 619 s->rx = ch;
510 set_rxint(s); 620 set_rxint(s);
511 } 621 }
512 622
513 static void serial_receive_break(ChannelState *s) 623 static void serial_receive_break(ChannelState *s)
514 { 624 {
515 - s->rregs[0] |= 0x80; 625 + s->rregs[R_STATUS] |= STATUS_BRK;
516 slavio_serial_update_irq(s); 626 slavio_serial_update_irq(s);
517 } 627 }
518 628
@@ -553,8 +663,8 @@ static void slavio_serial_save_chn(QEMUFile *f, ChannelState *s) @@ -553,8 +663,8 @@ static void slavio_serial_save_chn(QEMUFile *f, ChannelState *s)
553 qemu_put_be32s(f, &s->txint_under_svc); 663 qemu_put_be32s(f, &s->txint_under_svc);
554 qemu_put_8s(f, &s->rx); 664 qemu_put_8s(f, &s->rx);
555 qemu_put_8s(f, &s->tx); 665 qemu_put_8s(f, &s->tx);
556 - qemu_put_buffer(f, s->wregs, 16);  
557 - qemu_put_buffer(f, s->rregs, 16); 666 + qemu_put_buffer(f, s->wregs, SERIAL_REGS);
  667 + qemu_put_buffer(f, s->rregs, SERIAL_REGS);
558 } 668 }
559 669
560 static void slavio_serial_save(QEMUFile *f, void *opaque) 670 static void slavio_serial_save(QEMUFile *f, void *opaque)
@@ -582,8 +692,8 @@ static int slavio_serial_load_chn(QEMUFile *f, ChannelState *s, int version_id) @@ -582,8 +692,8 @@ static int slavio_serial_load_chn(QEMUFile *f, ChannelState *s, int version_id)
582 } 692 }
583 qemu_get_8s(f, &s->rx); 693 qemu_get_8s(f, &s->rx);
584 qemu_get_8s(f, &s->tx); 694 qemu_get_8s(f, &s->tx);
585 - qemu_get_buffer(f, s->wregs, 16);  
586 - qemu_get_buffer(f, s->rregs, 16); 695 + qemu_get_buffer(f, s->wregs, SERIAL_REGS);
  696 + qemu_get_buffer(f, s->rregs, SERIAL_REGS);
587 return 0; 697 return 0;
588 } 698 }
589 699
@@ -610,7 +720,9 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, @@ -610,7 +720,9 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq,
610 if (!s) 720 if (!s)
611 return NULL; 721 return NULL;
612 722
613 - slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s); 723 + slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read,
  724 + slavio_serial_mem_write,
  725 + s);
614 cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); 726 cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory);
615 727
616 s->chn[0].chr = chr1; 728 s->chn[0].chr = chr1;
@@ -629,7 +741,8 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq, @@ -629,7 +741,8 @@ SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq,
629 } 741 }
630 s->chn[0].otherchn = &s->chn[1]; 742 s->chn[0].otherchn = &s->chn[1];
631 s->chn[1].otherchn = &s->chn[0]; 743 s->chn[1].otherchn = &s->chn[0];
632 - register_savevm("slavio_serial", base, 2, slavio_serial_save, slavio_serial_load, s); 744 + register_savevm("slavio_serial", base, 2, slavio_serial_save,
  745 + slavio_serial_load, s);
633 qemu_register_reset(slavio_serial_reset, s); 746 qemu_register_reset(slavio_serial_reset, s);
634 slavio_serial_reset(s); 747 slavio_serial_reset(s);
635 return s; 748 return s;
@@ -662,7 +775,8 @@ static void sunkbd_event(void *opaque, int ch) @@ -662,7 +775,8 @@ static void sunkbd_event(void *opaque, int ch)
662 ChannelState *s = opaque; 775 ChannelState *s = opaque;
663 int release = ch & 0x80; 776 int release = ch & 0x80;
664 777
665 - KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch, release? "release" : "press"); 778 + KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch, release? "release" :
  779 + "press");
666 switch (ch) { 780 switch (ch) {
667 case 58: // Caps lock press 781 case 58: // Caps lock press
668 s->caps_lock_mode ^= 1; 782 s->caps_lock_mode ^= 1;
@@ -792,12 +906,16 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, @@ -792,12 +906,16 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq,
792 s->chn[0].disabled = disabled; 906 s->chn[0].disabled = disabled;
793 s->chn[1].disabled = disabled; 907 s->chn[1].disabled = disabled;
794 908
795 - slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s); 909 + slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read,
  910 + slavio_serial_mem_write,
  911 + s);
796 cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory); 912 cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory);
797 913
798 - qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, "QEMU Sun Mouse"); 914 + qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0,
  915 + "QEMU Sun Mouse");
799 qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); 916 qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]);
800 - register_savevm("slavio_serial_mouse", base, 2, slavio_serial_save, slavio_serial_load, s); 917 + register_savevm("slavio_serial_mouse", base, 2, slavio_serial_save,
  918 + slavio_serial_load, s);
801 qemu_register_reset(slavio_serial_reset, s); 919 qemu_register_reset(slavio_serial_reset, s);
802 slavio_serial_reset(s); 920 slavio_serial_reset(s);
803 } 921 }