diff options
Diffstat (limited to 'src/kernel/dev/vgatxt.cpp')
-rw-r--r-- | src/kernel/dev/vgatxt.cpp | 34 |
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; +} |