VGA.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "types.h"
  2. #include "VGA.h"
  3. #include "i386.h"
  4. #include "IO.h"
  5. #include "StdLib.h"
  6. #include "Process.h"
  7. static byte* vga_mem = nullptr;
  8. void vga_clear_row(word line)
  9. {
  10. InterruptDisabler disabler;
  11. word* linemem = (word*)&vga_mem[line * 160];
  12. for (word i = 0; i < 80; ++i) {
  13. linemem[i] = 0x0720;
  14. }
  15. }
  16. void vga_clear()
  17. {
  18. InterruptDisabler disabler;
  19. for (word i = 0; i < 25; ++i)
  20. vga_clear_row(i);
  21. }
  22. void vga_putch_at(byte row, byte column, byte ch, byte attr)
  23. {
  24. word cur = (row * 160) + (column * 2);
  25. vga_mem[cur] = ch;
  26. vga_mem[cur + 1] = attr;
  27. }
  28. word vga_get_start_address()
  29. {
  30. word value;
  31. IO::out8(0x3d4, 0x0d);
  32. value = IO::in8(0x3d5) << 8;
  33. IO::out8(0x3d4, 0x0c);
  34. value |= IO::in8(0x3d5);
  35. return value;
  36. }
  37. void vga_set_start_address(word value)
  38. {
  39. IO::out8(0x3d4, 0x0c);
  40. IO::out8(0x3d5, MSB(value));
  41. IO::out8(0x3d4, 0x0d);
  42. IO::out8(0x3d5, LSB(value));
  43. }
  44. void vga_init()
  45. {
  46. vga_mem = (byte*)0xb8000;
  47. for (word i = 0; i < (80 * 25); ++i) {
  48. vga_mem[i*2] = ' ';
  49. vga_mem[i*2 + 1] = 0x07;
  50. }
  51. vga_set_cursor(0);
  52. }
  53. WORD vga_get_cursor()
  54. {
  55. WORD value;
  56. IO::out8(0x3d4, 0x0e);
  57. value = IO::in8(0x3d5) << 8;
  58. IO::out8(0x3d4, 0x0f);
  59. value |= IO::in8(0x3d5);
  60. return value;
  61. }
  62. void vga_set_cursor(WORD value)
  63. {
  64. IO::out8(0x3d4, 0x0e);
  65. IO::out8(0x3d5, MSB(value));
  66. IO::out8(0x3d4, 0x0f);
  67. IO::out8(0x3d5, LSB(value));
  68. }
  69. void vga_set_cursor(BYTE row, BYTE column)
  70. {
  71. vga_set_cursor(row * 80 + column);
  72. }
  73. void vga_set_cursor(byte row, byte column, word start_address)
  74. {
  75. vga_set_cursor((start_address) + (row * 80 + column));
  76. }