You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

video_subr.c 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. *
  3. * modified from linuxbios code
  4. * by Cai Qiang <rimy2000@hotmail.com>
  5. *
  6. */
  7. #include "stddef.h"
  8. #include "string.h"
  9. #include <ipxe/io.h>
  10. #include "console.h"
  11. #include <ipxe/init.h>
  12. #include "vga.h"
  13. struct console_driver vga_console;
  14. static char *vidmem; /* The video buffer */
  15. static int video_line, video_col;
  16. #define VIDBUFFER 0xB8000
  17. static void memsetw(void *s, int c, unsigned int n)
  18. {
  19. unsigned int i;
  20. u16 *ss = (u16 *) s;
  21. for (i = 0; i < n; i++) {
  22. ss[i] = ( u16 ) c;
  23. }
  24. }
  25. static void video_init(void)
  26. {
  27. static int inited=0;
  28. vidmem = (char *)phys_to_virt(VIDBUFFER);
  29. if (!inited) {
  30. video_line = 0;
  31. video_col = 0;
  32. memsetw(vidmem, VGA_ATTR_CLR_WHT, 2*1024); //
  33. inited=1;
  34. }
  35. }
  36. static void video_scroll(void)
  37. {
  38. int i;
  39. memcpy(vidmem, vidmem + COLS * 2, (LINES - 1) * COLS * 2);
  40. for (i = (LINES - 1) * COLS * 2; i < LINES * COLS * 2; i += 2)
  41. vidmem[i] = ' ';
  42. }
  43. static void vga_putc(int byte)
  44. {
  45. if (byte == '\n') {
  46. video_line++;
  47. video_col = 0;
  48. } else if (byte == '\r') {
  49. video_col = 0;
  50. } else if (byte == '\b') {
  51. video_col--;
  52. } else if (byte == '\t') {
  53. video_col += 4;
  54. } else if (byte == '\a') {
  55. //beep
  56. //beep(500);
  57. } else {
  58. vidmem[((video_col + (video_line *COLS)) * 2)] = byte;
  59. vidmem[((video_col + (video_line *COLS)) * 2) +1] = VGA_ATTR_CLR_WHT;
  60. video_col++;
  61. }
  62. if (video_col < 0) {
  63. video_col = 0;
  64. }
  65. if (video_col >= COLS) {
  66. video_line++;
  67. video_col = 0;
  68. }
  69. if (video_line >= LINES) {
  70. video_scroll();
  71. video_line--;
  72. }
  73. // move the cursor
  74. write_crtc((video_col + (video_line *COLS)) >> 8, CRTC_CURSOR_HI);
  75. write_crtc((video_col + (video_line *COLS)) & 0x0ff, CRTC_CURSOR_LO);
  76. }
  77. struct console_driver vga_console __console_driver = {
  78. .putchar = vga_putc,
  79. .disabled = 1,
  80. };
  81. struct init_fn video_init_fn __init_fn ( INIT_EARLY ) = {
  82. .initialise = video_init,
  83. };