summaryrefslogtreecommitdiff
path: root/src/kernel/dev/vgatxt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/dev/vgatxt.cpp')
-rw-r--r--src/kernel/dev/vgatxt.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/kernel/dev/vgatxt.cpp b/src/kernel/dev/vgatxt.cpp
index eb57eb9..7abbaf9 100644
--- a/src/kernel/dev/vgatxt.cpp
+++ b/src/kernel/dev/vgatxt.cpp
@@ -4,11 +4,12 @@
#include <mem/mem.h>
static uint16_t *video_memory = (uint16_t*)((size_t)K_HIGHHALF_ADDR + 0xB8000);
+#define VIDMEM_SIZE (80 * 25 * 2)
vgatxt *text_display;
vgatxt::vgatxt(node *parent) : display(parent) {
- // nothing to do, really
+ dev_type = DT_VGATXT;
}
int vgatxt::text_w() {
@@ -52,3 +53,34 @@ void vgatxt::text_scroll(int n, uint8_t fgcolor, uint8_t bgcolor) {
// TODO
}
}
+
+
+// Operations as a FS node
+
+size_t vgatxt::get_size() { // size as a node of the filesystem
+ return (text_w() << 16) + text_h();
+}
+
+int vgatxt::read(size_t offset, size_t len, char *buffer) {
+ if (offset > VIDMEM_SIZE) return 0;
+ if (offset + len > VIDMEM_SIZE) len = VIDMEM_SIZE - offset;
+
+ char *vm = (char*)video_memory;
+ memcpy(buffer, vm + offset, len);
+ return len;
+}
+
+int vgatxt::write(size_t offset, size_t len, char *buffer) {
+ if (offset > VIDMEM_SIZE) return 0;
+ if (offset + len > VIDMEM_SIZE) len = VIDMEM_SIZE - offset;
+
+ char *vm = (char*)video_memory;
+ memcpy(vm + offset, buffer, len);
+ return len;
+}
+
+int vgatxt::dev_control(char *data) {
+ uint16_t *d = (uint16_t*)data;
+ text_setcsr(d[0], d[1], d[2] != 0);
+ return 0;
+}