From 99da9e2e4f542b1237033c903979b5d46ea42692 Mon Sep 17 00:00:00 2001 From: giomba Date: Sun, 22 Oct 2023 11:38:45 +0200 Subject: [PATCH] Add (soft) video abstraction library. --- src/video.c | 28 ++++++++++++++++++++++++++++ src/video.h | 10 ++++++++++ src/video_a.asm | 26 ++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 src/video.c create mode 100644 src/video.h create mode 100644 src/video_a.asm diff --git a/src/video.c b/src/video.c new file mode 100644 index 0000000..38f5174 --- /dev/null +++ b/src/video.c @@ -0,0 +1,28 @@ +#include "video.h" + +#include + +static char *const VIDEO_MEMORY = (char *)0xd000; +static uint16_t offset = 0; + +void video_putchar(char c) { + if (c == '\n' || c == '\r') { + offset += 80 - (offset % 80); + + } else if (c == '\t') { + offset += 8 - offset % 8; + } else { + *(VIDEO_MEMORY + offset++) = c; + } + + offset = offset % 2000; +} + +void video_put(uint8_t x, uint8_t y, char c) { + if (x >= 80) + return; + if (y >= 25) + return; + + *(VIDEO_MEMORY + x + y * 80) = c; +} diff --git a/src/video.h b/src/video.h new file mode 100644 index 0000000..72d851d --- /dev/null +++ b/src/video.h @@ -0,0 +1,10 @@ +#ifndef CEDA_PRINT_H +#define CEDA_PRINT_H + +#include + +void video_cls(void); +void video_put(uint8_t x, uint8_t y, char c); +void video_putchar(char c); + +#endif // CEDA_PRINT_H diff --git a/src/video_a.asm b/src/video_a.asm new file mode 100644 index 0000000..56508ca --- /dev/null +++ b/src/video_a.asm @@ -0,0 +1,26 @@ +SECTION code +PUBLIC _video_cls + +_video_cls: + push af + push bc + push de + push hl + + ld hl,$d000 + ld de,2000 + ld c,$20 +_video_cls_loop: + ld (hl),c + inc hl + dec de + ld a,d + or e + jp nz,_video_cls_loop + + pop hl + pop de + pop bc + pop af + + ret