Rev 4347 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4347 | Rev 4348 | ||
---|---|---|---|
Line 42... | Line 42... | ||
42 | #include <arch/mm/page.h> |
42 | #include <arch/mm/page.h> |
43 | #include <synch/spinlock.h> |
43 | #include <synch/spinlock.h> |
44 | #include <arch/types.h> |
44 | #include <arch/types.h> |
45 | #include <arch/asm.h> |
45 | #include <arch/asm.h> |
46 | #include <memstr.h> |
46 | #include <memstr.h> |
- | 47 | #include <string.h> |
|
47 | #include <console/chardev.h> |
48 | #include <console/chardev.h> |
48 | #include <console/console.h> |
49 | #include <console/console.h> |
49 | #include <sysinfo/sysinfo.h> |
50 | #include <sysinfo/sysinfo.h> |
50 | #include <ddi/ddi.h> |
51 | #include <ddi/ddi.h> |
51 | 52 | ||
Line 423... | Line 424... | ||
423 | } |
424 | } |
424 | 425 | ||
425 | /* |
426 | /* |
426 | * This function takes care of scrolling. |
427 | * This function takes care of scrolling. |
427 | */ |
428 | */ |
428 | static void ega_check_cursor(void) |
429 | static void ega_check_cursor(bool silent) |
429 | { |
430 | { |
430 | if (ega_cursor < EGA_SCREEN) |
431 | if (ega_cursor < EGA_SCREEN) |
431 | return; |
432 | return; |
432 | 433 | ||
433 | memmove((void *) videoram, (void *) (videoram + EGA_COLS * 2), |
- | |
434 | (EGA_SCREEN - EGA_COLS) * 2); |
- | |
435 | memmove((void *) backbuf, (void *) (backbuf + EGA_COLS * 2), |
434 | memmove((void *) backbuf, (void *) (backbuf + EGA_COLS * 2), |
436 | (EGA_SCREEN - EGA_COLS) * 2); |
435 | (EGA_SCREEN - EGA_COLS) * 2); |
437 | memsetw(videoram + (EGA_SCREEN - EGA_COLS) * 2, EGA_COLS, EMPTY_CHAR); |
- | |
438 | memsetw(backbuf + (EGA_SCREEN - EGA_COLS) * 2, EGA_COLS, EMPTY_CHAR); |
436 | memsetw(backbuf + (EGA_SCREEN - EGA_COLS) * 2, EGA_COLS, EMPTY_CHAR); |
- | 437 | ||
- | 438 | if (!silent) { |
|
- | 439 | memmove((void *) videoram, (void *) (videoram + EGA_COLS * 2), |
|
- | 440 | (EGA_SCREEN - EGA_COLS) * 2); |
|
- | 441 | memsetw(videoram + (EGA_SCREEN - EGA_COLS) * 2, EGA_COLS, EMPTY_CHAR); |
|
- | 442 | } |
|
- | 443 | ||
439 | ega_cursor = ega_cursor - EGA_COLS; |
444 | ega_cursor = ega_cursor - EGA_COLS; |
440 | } |
445 | } |
441 | 446 | ||
442 | static void ega_show_cursor(void) |
447 | static void ega_show_cursor(bool silent) |
443 | { |
448 | { |
- | 449 | if (!silent) { |
|
444 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0a); |
450 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0a); |
445 | uint8_t stat = pio_read_8(ega_base + EGA_DATA_REG); |
451 | uint8_t stat = pio_read_8(ega_base + EGA_DATA_REG); |
446 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0a); |
452 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0a); |
447 | pio_write_8(ega_base + EGA_DATA_REG, stat & (~(1 << 5))); |
453 | pio_write_8(ega_base + EGA_DATA_REG, stat & (~(1 << 5))); |
- | 454 | } |
|
448 | } |
455 | } |
449 | 456 | ||
450 | static void ega_move_cursor(void) |
457 | static void ega_move_cursor(bool silent) |
451 | { |
458 | { |
- | 459 | if (!silent) { |
|
452 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0e); |
460 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0e); |
453 | pio_write_8(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff)); |
461 | pio_write_8(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff)); |
454 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0f); |
462 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0f); |
455 | pio_write_8(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff)); |
463 | pio_write_8(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff)); |
- | 464 | } |
|
456 | } |
465 | } |
457 | 466 | ||
458 | static void ega_sync_cursor(void) |
467 | static void ega_sync_cursor(bool silent) |
459 | { |
468 | { |
- | 469 | if (!silent) { |
|
460 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0e); |
470 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0e); |
461 | uint8_t hi = pio_read_8(ega_base + EGA_DATA_REG); |
471 | uint8_t hi = pio_read_8(ega_base + EGA_DATA_REG); |
462 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0f); |
472 | pio_write_8(ega_base + EGA_INDEX_REG, 0x0f); |
463 | uint8_t lo = pio_read_8(ega_base + EGA_DATA_REG); |
473 | uint8_t lo = pio_read_8(ega_base + EGA_DATA_REG); |
464 | 474 | ||
465 | ega_cursor = (hi << 8) | lo; |
475 | ega_cursor = (hi << 8) | lo; |
- | 476 | } else |
|
- | 477 | ega_cursor = 0; |
|
466 | 478 | ||
467 | if (ega_cursor >= EGA_SCREEN) |
479 | if (ega_cursor >= EGA_SCREEN) |
468 | ega_cursor = 0; |
480 | ega_cursor = 0; |
469 | 481 | ||
470 | if ((ega_cursor % EGA_COLS) != 0) |
482 | if ((ega_cursor % EGA_COLS) != 0) |
471 | ega_cursor = (ega_cursor + EGA_COLS) - ega_cursor % EGA_COLS; |
483 | ega_cursor = (ega_cursor + EGA_COLS) - ega_cursor % EGA_COLS; |
472 | 484 | ||
473 | memsetw(videoram + ega_cursor * 2, EGA_SCREEN - ega_cursor, EMPTY_CHAR); |
- | |
474 | memsetw(backbuf + ega_cursor * 2, EGA_SCREEN - ega_cursor, EMPTY_CHAR); |
485 | memsetw(backbuf + ega_cursor * 2, EGA_SCREEN - ega_cursor, EMPTY_CHAR); |
475 | 486 | ||
- | 487 | if (!silent) |
|
- | 488 | memsetw(videoram + ega_cursor * 2, EGA_SCREEN - ega_cursor, EMPTY_CHAR); |
|
- | 489 | ||
476 | ega_check_cursor(); |
490 | ega_check_cursor(silent); |
477 | ega_move_cursor(); |
491 | ega_move_cursor(silent); |
478 | ega_show_cursor(); |
492 | ega_show_cursor(silent); |
479 | } |
493 | } |
480 | 494 | ||
481 | static void ega_display_char(wchar_t ch, bool silent) |
495 | static void ega_display_char(wchar_t ch, bool silent) |
482 | { |
496 | { |
483 | uint16_t index = ega_oem_glyph(ch); |
497 | uint16_t index = ega_oem_glyph(ch); |
484 | uint8_t glyph; |
498 | uint8_t glyph; |
485 | uint8_t style; |
499 | uint8_t style; |
486 | 500 | ||
487 | if ((index >> 8)) { |
501 | if ((index >> 8)) { |
488 | glyph = '?'; |
502 | glyph = U_SPECIAL; |
489 | style = INVAL; |
503 | style = INVAL; |
490 | } else { |
504 | } else { |
491 | glyph = index & 0xff; |
505 | glyph = index & 0xff; |
492 | style = STYLE; |
506 | style = STYLE; |
493 | } |
507 | } |
Line 522... | Line 536... | ||
522 | default: |
536 | default: |
523 | ega_display_char(ch, silent); |
537 | ega_display_char(ch, silent); |
524 | ega_cursor++; |
538 | ega_cursor++; |
525 | break; |
539 | break; |
526 | } |
540 | } |
527 | ega_check_cursor(); |
541 | ega_check_cursor(silent); |
528 | - | ||
529 | if (!silent) |
- | |
530 | ega_move_cursor(); |
542 | ega_move_cursor(silent); |
531 | 543 | ||
532 | spinlock_unlock(&egalock); |
544 | spinlock_unlock(&egalock); |
533 | interrupts_restore(ipl); |
545 | interrupts_restore(ipl); |
534 | } |
546 | } |
535 | 547 | ||
Line 549... | Line 561... | ||
549 | 561 | ||
550 | videoram = (uint8_t *) hw_map(videoram_phys, EGA_VRAM_SIZE); |
562 | videoram = (uint8_t *) hw_map(videoram_phys, EGA_VRAM_SIZE); |
551 | 563 | ||
552 | /* Synchronize the back buffer and cursor position. */ |
564 | /* Synchronize the back buffer and cursor position. */ |
553 | memcpy(backbuf, videoram, EGA_VRAM_SIZE); |
565 | memcpy(backbuf, videoram, EGA_VRAM_SIZE); |
554 | ega_sync_cursor(); |
566 | ega_sync_cursor(silent); |
555 | 567 | ||
556 | outdev_initialize("ega", &ega_console, &ega_ops); |
568 | outdev_initialize("ega", &ega_console, &ega_ops); |
557 | stdout = &ega_console; |
569 | stdout = &ega_console; |
558 | 570 | ||
559 | sysinfo_set_item_val("fb", NULL, true); |
571 | sysinfo_set_item_val("fb", NULL, true); |
Line 565... | Line 577... | ||
565 | } |
577 | } |
566 | 578 | ||
567 | void ega_redraw(void) |
579 | void ega_redraw(void) |
568 | { |
580 | { |
569 | memcpy(videoram, backbuf, EGA_VRAM_SIZE); |
581 | memcpy(videoram, backbuf, EGA_VRAM_SIZE); |
570 | ega_move_cursor(); |
582 | ega_move_cursor(silent); |
571 | ega_show_cursor(); |
583 | ega_show_cursor(silent); |
572 | } |
584 | } |
573 | 585 | ||
574 | /** @} |
586 | /** @} |
575 | */ |
587 | */ |