aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/include
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-07-24 20:51:55 +0000
committerFelix Morgner <felix.morgner@ost.ch>2025-07-24 20:51:55 +0000
commitdd04850c27e8bc273506f4a64bb28b7ddf111dc5 (patch)
treea00212f5c903e80e4e729c87ce34ece2c40e4ee6 /arch/x86_64/include
parentfeac668578a35aac280b59d478a57b6937bb68da (diff)
downloadteachos-dd04850c27e8bc273506f4a64bb28b7ddf111dc5.tar.xz
teachos-dd04850c27e8bc273506f4a64bb28b7ddf111dc5.zip
kapi: rework text device interface
Diffstat (limited to 'arch/x86_64/include')
-rw-r--r--arch/x86_64/include/x86_64/vga/text.hpp122
1 files changed, 48 insertions, 74 deletions
diff --git a/arch/x86_64/include/x86_64/vga/text.hpp b/arch/x86_64/include/x86_64/vga/text.hpp
index 267eae9..f8e6f1b 100644
--- a/arch/x86_64/include/x86_64/vga/text.hpp
+++ b/arch/x86_64/include/x86_64/vga/text.hpp
@@ -1,9 +1,10 @@
#ifndef TEACHOS_X86_64_VIDEO_VGA_TEXT_HPP
#define TEACHOS_X86_64_VIDEO_VGA_TEXT_HPP
+#include "kapi/cio.hpp"
+
#include <cstdint>
#include <string_view>
-#include <type_traits>
namespace teachos::x86_64::vga::text
{
@@ -89,84 +90,57 @@ namespace teachos::x86_64::vga::text
attribute{color::gray, foreground_flag::intense, color::red, background_flag::none};
} // namespace common_attributes
- /**
- * @brief Clear the VGA text mode buffer.
- *
- * @note This function also resets the text mode buffer pointer.
- *
- * @param attribute The attribute to "clear" the screen with.
- */
- auto clear(attribute attribute = common_attributes::gray_on_black) -> void;
-
- /**
- * @brief Enable or disable the VGA text mode cursor.
- *
- * @param enabled Whether or not to enable the cursors.
- */
- auto cursor(bool enabled) -> void;
+ struct device final : teachos::cio::output_device
+ {
+ /**
+ * @brief Clear the VGA text mode buffer.
+ *
+ * @note This function also resets the text mode buffer pointer.
+ *
+ * @param attribute The attribute to "clear" the screen with.
+ */
+ auto clear(attribute attribute = common_attributes::gray_on_black) -> void;
- /**
- * @brief Move the cursor to a new line, scrolling the buffer if necessary.
- */
- auto newline() -> void;
+ /**
+ * @brief Enable or disable the VGA text mode cursor.
+ *
+ * @param enabled Whether or not to enable the cursors.
+ */
+ auto cursor(bool enabled) -> void;
- /**
- * @brief Write a string of code points to the VGA text buffer.
- *
- * @note This function also updates the text mode buffer pointer.
- *
- * @param code_points A string of (8-bit) code points to write to the VGA text mode buffer.
- * @param attribute The attribute to apply to the written sequence of code points.
- * @see vga::text::attribute
- */
- auto write(std::string_view code_points, attribute attribute) -> void;
+ auto write(std::string_view text) -> void override { write(text, common_attributes::green_on_black); }
+ auto writeln(std::string_view text) -> void override { writeln(text, common_attributes::green_on_black); }
+ auto write_error(std::string_view text) -> void override { write(text, common_attributes::red_on_black); }
+ auto writeln_error(std::string_view text) -> void override { writeln(text, common_attributes::red_on_black); }
- /**
- * @brief Write a single character to the VGA text buffer.
- *
- * @note This function also updates the text mode buffer pointer.
- *
- * @param code_point A code point to write to the VGA text mode buffer.
- * @param attribute The attribute to apply to the written sequence of code points.
- * @see vga::text::attribute
- */
- auto write_char(char code_point, attribute attribute) -> void;
+ private:
+ /**
+ * @brief Move the cursor to a new line, scrolling the buffer if necessary.
+ */
+ auto newline() -> void;
- template<typename T>
- concept Integral = std::is_integral_v<T>;
+ /**
+ * @brief Write a string of code points to the VGA text buffer.
+ *
+ * @note This function also updates the text mode buffer pointer.
+ *
+ * @param code_points A string of (8-bit) code points to write to the VGA text mode buffer.
+ * @param attribute The attribute to apply to the written sequence of code points.
+ * @see vga::text::attribute
+ */
+ auto write(std::string_view code_points, attribute attribute) -> void;
- /**
- * @brief Write a integral value to the VGA text buffer.
- *
- * @note This function also updates the text mode buffer pointer.
- *
- * @param value A integral value to write to the VGA text mode buffer.
- * @param attribute The attribute to apply to the written sequence of code points.
- * @see vga::text::attribute
- */
- template<Integral T>
- auto write_number(T value, attribute attribute) -> void
- {
- T current_value = value;
- T divisor = 1;
-
- while (current_value > 9)
- {
- divisor *= 10;
- current_value = current_value / 10;
- }
-
- current_value = value;
- while (divisor > 0)
- {
- uint8_t quotient = current_value / divisor;
- char ascii_digit = quotient + '0';
-
- write_char(ascii_digit, attribute);
- current_value %= divisor;
- divisor /= 10;
- }
- }
+ /**
+ * @brief Write a string of code points followed by a newline to the VGA text buffer.
+ *
+ * @note This function also updates the text mode buffer pointer.
+ *
+ * @param code_points A string of (8-bit) code points to write to the VGA text mode buffer.
+ * @param attribute The attribute to apply to the written sequence of code points.
+ * @see vga::text::attribute
+ */
+ auto writeln(std::string_view code_points, attribute attribute) -> void;
+ };
} // namespace teachos::x86_64::vga::text