Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

video_subr.c 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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 <ipxe/console.h>
  11. #include <ipxe/init.h>
  12. #include "vga.h"
  13. #include <config/console.h>
  14. /* Set default console usage if applicable */
  15. #if ! ( defined ( CONSOLE_DIRECT_VGA ) && \
  16. CONSOLE_EXPLICIT ( CONSOLE_DIRECT_VGA ) )
  17. #undef CONSOLE_DIRECT_VGA
  18. #define CONSOLE_DIRECT_VGA ( CONSOLE_USAGE_ALL & ~CONSOLE_USAGE_LOG )
  19. #endif
  20. struct console_driver vga_console __console_driver;
  21. static char *vidmem; /* The video buffer */
  22. static int video_line, video_col;
  23. #define VIDBUFFER 0xB8000
  24. static void memsetw(void *s, int c, unsigned int n)
  25. {
  26. unsigned int i;
  27. u16 *ss = (u16 *) s;
  28. for (i = 0; i < n; i++) {
  29. ss[i] = ( u16 ) c;
  30. }
  31. }
  32. static void video_init(void)
  33. {
  34. static int inited=0;
  35. vidmem = (char *)phys_to_virt(VIDBUFFER);
  36. if (!inited) {
  37. video_line = 0;
  38. video_col = 0;
  39. memsetw(vidmem, VGA_ATTR_CLR_WHT, 2*1024); //
  40. inited=1;
  41. }
  42. }
  43. static void video_scroll(void)
  44. {
  45. int i;
  46. memcpy(vidmem, vidmem + COLS * 2, (LINES - 1) * COLS * 2);
  47. for (i = (LINES - 1) * COLS * 2; i < LINES * COLS * 2; i += 2)
  48. vidmem[i] = ' ';
  49. }
  50. static void vga_putc(int byte)
  51. {
  52. if (byte == '\n') {
  53. video_line++;
  54. video_col = 0;
  55. } else if (byte == '\r') {
  56. video_col = 0;
  57. } else if (byte == '\b') {
  58. video_col--;
  59. } else if (byte == '\t') {
  60. video_col += 4;
  61. } else if (byte == '\a') {
  62. //beep
  63. //beep(500);
  64. } else {
  65. vidmem[((video_col + (video_line *COLS)) * 2)] = byte;
  66. vidmem[((video_col + (video_line *COLS)) * 2) +1] = VGA_ATTR_CLR_WHT;
  67. video_col++;
  68. }
  69. if (video_col < 0) {
  70. video_col = 0;
  71. }
  72. if (video_col >= COLS) {
  73. video_line++;
  74. video_col = 0;
  75. }
  76. if (video_line >= LINES) {
  77. video_scroll();
  78. video_line--;
  79. }
  80. // move the cursor
  81. write_crtc((video_col + (video_line *COLS)) >> 8, CRTC_CURSOR_HI);
  82. write_crtc((video_col + (video_line *COLS)) & 0x0ff, CRTC_CURSOR_LO);
  83. }
  84. struct console_driver vga_console __console_driver = {
  85. .putchar = vga_putc,
  86. .disabled = CONSOLE_DISABLED,
  87. .usage = CONSOLE_DIRECT_VGA,
  88. };
  89. struct init_fn video_init_fn __init_fn ( INIT_EARLY ) = {
  90. .initialise = video_init,
  91. };