aboutsummaryrefslogtreecommitdiff
path: root/kernel/writer.dats
diff options
context:
space:
mode:
authorXander <xander@icth.xyz>2023-07-03 14:48:38 +0200
committerXander <xander@icth.xyz>2023-07-03 14:48:38 +0200
commit52b6f5d7e03f6918d56f80fab2deaa807d08764a (patch)
treece03948769dc34c286d91874e7c4fc8d6e8ff121 /kernel/writer.dats
parentd7df4f130521f6005feda56a15f82eb3bf8597dd (diff)
downloadats-os-52b6f5d7e03f6918d56f80fab2deaa807d08764a.tar.xz
ats-os-52b6f5d7e03f6918d56f80fab2deaa807d08764a.zip
Now using static writer
Diffstat (limited to 'kernel/writer.dats')
-rw-r--r--kernel/writer.dats98
1 files changed, 58 insertions, 40 deletions
diff --git a/kernel/writer.dats b/kernel/writer.dats
index 9ea10b8..0d67129 100644
--- a/kernel/writer.dats
+++ b/kernel/writer.dats
@@ -2,57 +2,75 @@
staload "kernel/writer.sats"
-extern castfn i2u8 {n: nat} (i: int n): uint8 n
+%{^
+ #define get_buffer() ((void *) 0xB8000)
+%}
-extern fun get_vram():<> [l: agz] (@[screenChar][N] @ l | ptr l) = "mac#"
+extern fun get_buffer():<> buffer = "mac#"
+extern prfun eat_buffer (pf: buffer): void
-extern prfun eat_writer (pf: writer): void
+staload WRITER = {
+ staload "kernel/writer.sats"
+ extern fun getref (): [l:addr] vtakeoutptr (writer)
-%{^
- #define get_vram() ((void *) 0xB8000 + 1988)
-%}
+ fun color_value(c : color): uint8 =
+ case+ c of
+ | Black() => i2u8 0
+ | Blue() => i2u8 1
+ | Green() => i2u8 2
+ | Cyan() => i2u8 3
+ | Red() => i2u8 4
+ | Magenta() => i2u8 5
+ | Brown() => i2u8 6
+ | LightGray() => i2u8 7
+ | DarkGray() => i2u8 8
+ | LightBlue() => i2u8 9
+ | LightGreen() => i2u8 10
+ | LightCyan() => i2u8 11
+ | LightRed() => i2u8 12
+ | Pink() => i2u8 13
+ | Yellow() => i2u8 14
+ | White() => i2u8 15
+
+ fun code_value(foreground: color, background:color): uint8 =
+ (color_value(background) << 4) lor color_value(foreground)
+
+ local
-fun color_value(c : color): uint8 =
- case+ c of
- | Black() => i2u8 0
- | Blue() => i2u8 1
- | Green() => i2u8 2
- | Cyan() => i2u8 3
- | Red() => i2u8 4
- | Magenta() => i2u8 5
- | Brown() => i2u8 6
- | LightGray() => i2u8 7
- | DarkGray() => i2u8 8
- | LightBlue() => i2u8 9
- | LightGreen() => i2u8 10
- | LightCyan() => i2u8 11
- | LightRed() => i2u8 12
- | Pink() => i2u8 13
- | Yellow() => i2u8 14
- | White() => i2u8 15
-
-fun code_value(foreground: color, background:color): uint8 =
- (color_value(background) << 4) lor color_value(foreground)
+ var _val: writer = @{position = 0, color_code = code_value(White,Black)} : writer
+ val p_val = addr@(_val)
+
+ in
+
+ implement getref () = let
+ extern praxi __assert{l:addr} (ptr: ptr (l)): vtakeout0 (writer@l)
+ prval (pf, fpf) = __assert (p_val)
+ in
+ (pf, fpf | p_val)
+ end
+ end
+}
fun put_char (c : char, writer: &writer) : void = let
- val v = writer.buffer.1
+ val buf = get_buffer()
val pos = writer.position
in
- v->[writer.position] := @{ ascii_character = c, color_code = writer.color_code};
+ buf.1->[writer.position] := @{ ascii_character = c, color_code = writer.color_code};
+
+ if (pos < N - 1) then
+ writer.position := succ(pos);
- if (pos < N - 1) then
- writer.position := succ(pos)
+ let prval() = eat_buffer buf in () end
end
-implement print_char(c : char) : void = let
- val (pf_vram | vram) = get_vram()
- var writer = @{position = 0, color_code = code_value(Black,Yellow), buffer = (pf_vram | vram)} : writer
+
+implement put_string (str : string) : void = let
+ val (pf, fpf | p_val) = $WRITER.getref()
+ implement string_foreach$fwork<writer> (c,env) = put_char(c,env)
+ val _ = string_foreach_env<writer> (g1ofg0(str),!p_val)
+ prval() = fpf(pf)
in
- put_char(c,writer);
- put_char(c,writer);
- put_char(c,writer);
- put_char(c,writer);
- put_char(c,writer);
- let prval () = eat_writer writer in () end
end
+
+