mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:32:45 +00:00 
			
		
		
		
	Merge VGA into VirtualConsole.
This commit is contained in:
		
							parent
							
								
									c653bb09b3
								
							
						
					
					
						commit
						2ac5e14c08
					
				
					 13 changed files with 34 additions and 123 deletions
				
			
		|  | @ -189,10 +189,10 @@ heads: | |||
|     dw 2 | ||||
| 
 | ||||
| msg_sectors_loaded: | ||||
|     db "sectors loaded", 0x0d, 0x0a, 0 | ||||
|     db "done!", 0x0d, 0x0a, 0 | ||||
| 
 | ||||
| message: | ||||
|     db "boot!", 0x0d, 0x0a, 0 | ||||
|     db "Loading kernel", 0 | ||||
| 
 | ||||
| fug_message: | ||||
|     db "FUG!", 0x0d, 0x0a, 0 | ||||
|  |  | |||
|  | @ -1,5 +1,4 @@ | |||
| #include "Console.h" | ||||
| #include "VGA.h" | ||||
| #include "IO.h" | ||||
| #include "kprintf.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| #include "types.h" | ||||
| #include "i386.h" | ||||
| #include "IO.h" | ||||
| #include "VGA.h" | ||||
| #include "PIC.h" | ||||
| #include "Keyboard.h" | ||||
| #include "VirtualConsole.h" | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| KERNEL_OBJS = \
 | ||||
|        _start.o \
 | ||||
|        init.o \
 | ||||
|        VGA.o \
 | ||||
|        kmalloc.o \
 | ||||
|        StdLib.o \
 | ||||
|        i386.o \
 | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| #include "types.h" | ||||
| #include "i386.h" | ||||
| #include "IO.h" | ||||
| #include "VGA.h" | ||||
| #include "PIC.h" | ||||
| #include "Assertions.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| #include "types.h" | ||||
| #include "Process.h" | ||||
| #include "kmalloc.h" | ||||
| #include "VGA.h" | ||||
| #include "StdLib.h" | ||||
| #include "i386.h" | ||||
| #include "system.h" | ||||
|  |  | |||
|  | @ -1,89 +0,0 @@ | |||
| #include "types.h" | ||||
| #include "VGA.h" | ||||
| #include "i386.h" | ||||
| #include "IO.h" | ||||
| #include "StdLib.h" | ||||
| #include "Process.h" | ||||
| 
 | ||||
| static byte* vga_mem = nullptr; | ||||
| 
 | ||||
| void vga_clear_row(word line) | ||||
| { | ||||
|     InterruptDisabler disabler; | ||||
|     word* linemem = (word*)&vga_mem[line * 160]; | ||||
|     for (word i = 0; i < 80; ++i) { | ||||
|         linemem[i] = 0x0720; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void vga_clear() | ||||
| { | ||||
|     InterruptDisabler disabler; | ||||
|     for (word i = 0; i < 25; ++i) | ||||
|         vga_clear_row(i); | ||||
| } | ||||
| 
 | ||||
| void vga_putch_at(byte row, byte column, byte ch, byte attr) | ||||
| { | ||||
|     word cur = (row * 160) + (column * 2); | ||||
|     vga_mem[cur] = ch; | ||||
|     vga_mem[cur + 1] = attr; | ||||
| } | ||||
| 
 | ||||
| word vga_get_start_address() | ||||
| { | ||||
|     word value; | ||||
|     IO::out8(0x3d4, 0x0d); | ||||
|     value = IO::in8(0x3d5) << 8; | ||||
|     IO::out8(0x3d4, 0x0c); | ||||
|     value |= IO::in8(0x3d5); | ||||
|     return value; | ||||
| } | ||||
| 
 | ||||
| void vga_set_start_address(word value) | ||||
| { | ||||
|     IO::out8(0x3d4, 0x0c); | ||||
|     IO::out8(0x3d5, MSB(value)); | ||||
|     IO::out8(0x3d4, 0x0d); | ||||
|     IO::out8(0x3d5, LSB(value)); | ||||
| } | ||||
| 
 | ||||
| void vga_init() | ||||
| { | ||||
|     vga_mem = (byte*)0xb8000; | ||||
| 
 | ||||
|     for (word i = 0; i < (80 * 25); ++i) { | ||||
|         vga_mem[i*2] = ' '; | ||||
|         vga_mem[i*2 + 1] = 0x07; | ||||
|     } | ||||
| 
 | ||||
|     vga_set_cursor(0); | ||||
| } | ||||
| 
 | ||||
| WORD vga_get_cursor() | ||||
| { | ||||
|     WORD value; | ||||
|     IO::out8(0x3d4, 0x0e); | ||||
|     value = IO::in8(0x3d5) << 8; | ||||
|     IO::out8(0x3d4, 0x0f); | ||||
|     value |= IO::in8(0x3d5); | ||||
|     return value; | ||||
| } | ||||
| 
 | ||||
| void vga_set_cursor(WORD value) | ||||
| { | ||||
|     IO::out8(0x3d4, 0x0e); | ||||
|     IO::out8(0x3d5, MSB(value)); | ||||
|     IO::out8(0x3d4, 0x0f); | ||||
|     IO::out8(0x3d5, LSB(value)); | ||||
| } | ||||
| 
 | ||||
| void vga_set_cursor(BYTE row, BYTE column) | ||||
| { | ||||
|     vga_set_cursor(row * 80 + column); | ||||
| } | ||||
| 
 | ||||
| void vga_set_cursor(byte row, byte column, word start_address) | ||||
| { | ||||
|     vga_set_cursor((start_address) + (row * 80 + column)); | ||||
| } | ||||
							
								
								
									
										15
									
								
								Kernel/VGA.h
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								Kernel/VGA.h
									
										
									
									
									
								
							|  | @ -1,15 +0,0 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include "types.h" | ||||
| 
 | ||||
| void vga_init(); | ||||
| void vga_set_cursor(WORD); | ||||
| void vga_set_cursor(byte row, byte column, word start_address); | ||||
| void vga_set_cursor(BYTE row, BYTE column); | ||||
| WORD vga_get_cursor(); | ||||
| void vga_putch_at(byte row, byte column, byte ch, byte attr); | ||||
| void vga_scroll_up(); | ||||
| void vga_clear(); | ||||
| void vga_clear_row(word); | ||||
| word vga_get_start_address(); | ||||
| void vga_set_start_address(word); | ||||
|  | @ -1,7 +1,7 @@ | |||
| #include "VirtualConsole.h" | ||||
| #include "VGA.h" | ||||
| #include "kmalloc.h" | ||||
| #include "i386.h" | ||||
| #include "IO.h" | ||||
| #include "StdLib.h" | ||||
| #include "Keyboard.h" | ||||
| #include <AK/String.h> | ||||
|  | @ -10,6 +10,26 @@ static byte* s_vga_buffer; | |||
| static VirtualConsole* s_consoles[6]; | ||||
| static int s_active_console; | ||||
| 
 | ||||
| void VirtualConsole::get_vga_cursor(byte& row, byte& column) | ||||
| { | ||||
|     word value; | ||||
|     IO::out8(0x3d4, 0x0e); | ||||
|     value = IO::in8(0x3d5) << 8; | ||||
|     IO::out8(0x3d4, 0x0f); | ||||
|     value |= IO::in8(0x3d5); | ||||
|     row = value / 80; | ||||
|     column = value % 80; | ||||
| } | ||||
| 
 | ||||
| void VirtualConsole::flush_vga_cursor() | ||||
| { | ||||
|     word value = m_current_vga_start_address + (m_cursor_row * 80 + m_cursor_column); | ||||
|     IO::out8(0x3d4, 0x0e); | ||||
|     IO::out8(0x3d5, MSB(value)); | ||||
|     IO::out8(0x3d4, 0x0f); | ||||
|     IO::out8(0x3d5, LSB(value)); | ||||
| } | ||||
| 
 | ||||
| void VirtualConsole::initialize() | ||||
| { | ||||
|     s_vga_buffer = (byte*)0xb8000; | ||||
|  | @ -25,9 +45,7 @@ VirtualConsole::VirtualConsole(unsigned index, InitialContents initial_contents) | |||
|     m_buffer = (byte*)kmalloc_eternal(80 * 25 * 2); | ||||
|     if (initial_contents == AdoptCurrentVGABuffer) { | ||||
|         memcpy(m_buffer, s_vga_buffer, 80 * 25 * 2); | ||||
|         auto vgaCursor = vga_get_cursor(); | ||||
|         m_cursor_row = vgaCursor / 80; | ||||
|         m_cursor_column = vgaCursor % 80; | ||||
|         get_vga_cursor(m_cursor_row, m_cursor_column); | ||||
|     } else { | ||||
|         word* line_mem = reinterpret_cast<word*>(m_buffer); | ||||
|         for (word i = 0; i < 80 * 25; ++i) | ||||
|  | @ -79,7 +97,7 @@ void VirtualConsole::set_active(bool b) | |||
| 
 | ||||
|     memcpy(s_vga_buffer, m_buffer, 80 * 25 * 2); | ||||
|     set_vga_start_row(0); | ||||
|     vga_set_cursor(m_cursor_row, m_cursor_column, m_current_vga_start_address); | ||||
|     flush_vga_cursor(); | ||||
| 
 | ||||
|     Keyboard::the().setClient(this); | ||||
| } | ||||
|  | @ -331,7 +349,7 @@ void VirtualConsole::set_cursor(unsigned row, unsigned column) | |||
|     m_cursor_row = row; | ||||
|     m_cursor_column = column; | ||||
|     if (m_active) | ||||
|         vga_set_cursor(m_cursor_row, m_cursor_column, m_current_vga_start_address); | ||||
|         flush_vga_cursor(); | ||||
| } | ||||
| 
 | ||||
| void VirtualConsole::put_character_at(unsigned row, unsigned column, byte ch) | ||||
|  | @ -453,5 +471,8 @@ void VirtualConsole::set_vga_start_row(word row) | |||
|     m_vga_start_row = row; | ||||
|     m_current_vga_start_address = row * 80; | ||||
|     m_current_vga_window = s_vga_buffer + row * 160; | ||||
|     vga_set_start_address(m_current_vga_start_address); | ||||
|     IO::out8(0x3d4, 0x0c); | ||||
|     IO::out8(0x3d5, MSB(m_current_vga_start_address)); | ||||
|     IO::out8(0x3d4, 0x0d); | ||||
|     IO::out8(0x3d5, LSB(m_current_vga_start_address)); | ||||
| } | ||||
|  |  | |||
|  | @ -29,6 +29,9 @@ private: | |||
|     void set_active(bool); | ||||
|     void on_char(byte, bool shouldEmit); | ||||
| 
 | ||||
|     void get_vga_cursor(byte& row, byte& column); | ||||
|     void flush_vga_cursor(); | ||||
| 
 | ||||
|     byte* m_buffer; | ||||
|     unsigned m_index; | ||||
|     bool m_active { false }; | ||||
|  |  | |||
|  | @ -1,6 +1,5 @@ | |||
| #include "types.h" | ||||
| #include "kmalloc.h" | ||||
| #include "VGA.h" | ||||
| #include "i386.h" | ||||
| #include "Assertions.h" | ||||
| #include "Process.h" | ||||
|  |  | |||
|  | @ -1,5 +1,4 @@ | |||
| #include "types.h" | ||||
| #include "VGA.h" | ||||
| #include "kmalloc.h" | ||||
| #include "i386.h" | ||||
| #include "i8253.h" | ||||
|  | @ -267,7 +266,6 @@ void init() | |||
| #endif | ||||
| 
 | ||||
|     kmalloc_init(); | ||||
|     vga_init(); | ||||
| 
 | ||||
|     auto console = make<Console>(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,9 +7,8 @@ | |||
| #include "kmalloc.h" | ||||
| #include "StdLib.h" | ||||
| #include "i386.h" | ||||
| #include "VGA.h" | ||||
| #include "system.h" | ||||
| #include "Assertions.h" | ||||
| #include <AK/Assertions.h> | ||||
| 
 | ||||
| #define SANITIZE_KMALLOC | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling