#include "kapi/cio.hpp" #include "arch/boot/boot.hpp" #include "arch/boot/ld.hpp" #include "arch/vga/crtc.hpp" #include "arch/vga/text.hpp" #include #include #include #include namespace arch::vga::text { namespace { constexpr auto default_buffer_address = std::uintptr_t{0xb8000}; constexpr auto default_buffer_width = 80z; constexpr auto default_buffer_height = 25z; constexpr auto bit_cursor_enabled = 5U; } // namespace device::device() : m_buffer{ default_buffer_width, default_buffer_height, std::bit_cast(default_buffer_address + std::bit_cast(&boot::TEACHOS_VMA)), kapi::boot::bootstrap_information.vga_buffer_index} { clear(); } auto device::clear() -> void { m_buffer.clear(); } auto device::cursor(bool enabled) -> void { auto cursor_disable_byte = std::byte{!enabled} << bit_cursor_enabled; crtc::address::write(crtc::registers::cursor_start); crtc::data::write(crtc::data::read() | cursor_disable_byte); } auto device::write(kapi::cio::output_stream stream, std::string_view text) -> void { auto attributes = [&] -> attribute { switch (stream) { case kapi::cio::output_stream::stderr: return red_on_black; default: return green_on_black; } }(); m_buffer.write(text, attributes); } } // namespace arch::vga::text