aboutsummaryrefslogtreecommitdiff
path: root/src/screen.c
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2026-03-01 02:00:23 -0500
committerB. Watson <urchlay@slackware.uk>2026-03-01 02:00:23 -0500
commit6521e971cdb772c53256d84a54c8d7b2d1ffa632 (patch)
tree28af564e7a12dd629d791e815834b3782177ec0c /src/screen.c
parentd3a19b319e8ecdf111de44ffa9847474301edcbb (diff)
downloadfujinet-chat-6521e971cdb772c53256d84a54c8d7b2d1ffa632.tar.gz
Scrollback!
Diffstat (limited to 'src/screen.c')
-rw-r--r--src/screen.c50
1 files changed, 38 insertions, 12 deletions
diff --git a/src/screen.c b/src/screen.c
index b98a26a..252d39d 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -25,14 +25,17 @@ void scr_waitvcount(u8 c) {
}
static void scr_clear(char s) {
- memset(screen_addrs[s], 0, SCREEN_SIZE);
+ memset(screen_top_addrs[s], 0, 1000);
+ memset(screen_bot_addrs[s], 0, 1000);
memset(scr_names[s], 0, 32);
memset(scr_topics[s], 0, LINE_SIZE);
}
static void scr_scroll(char s) {
- memmove(screen_addrs[s], screen_addrs[s] + 40, 880);
- memset(screen_botlines[s], 0, 40);
+ memmove(screen_top_addrs[s], screen_top_addrs[s] + 40, 960);
+ memmove(screen_top_addrs[s] + 960, screen_bot_addrs[s], 40);
+ memmove(screen_bot_addrs[s], screen_bot_addrs[s] + 40, 920);
+ memset(screen_lastlines[s], 0, 40);
}
void scr_init(void) {
@@ -41,7 +44,7 @@ void scr_init(void) {
old_dma = OS.sdmctl;
OS.sdmctl = 0;
scr_waitvcount(112); /* after the last GR.0 line */
- *SDLST = DLIST_ADDR;
+ *SDLST = DLIST_BOT_ADDR;
OS.chbas = FONT_ADDR_HI;
for(i = 0; i < MAX_SCREENS; i++) {
@@ -106,21 +109,36 @@ void scr_display(char s) {
scr_current = s;
scr_waitvcount(112);
- *dlist_top_lms = (u16)screen_addrs[s];
+ *dlist_bot_lms = (u16)screen_bot_addrs[s];
scr_show_status(s);
}
+void scr_scrollback(void) {
+ // OS.color2 = 0;
+ scr_waitvcount(112);
+ *dlist_top_lms = (u16)screen_top_addrs[scr_current];
+ *SDLST = (u16)dlist_top;
+}
+
+void scr_end_scrollback(void) {
+ // OS.color2 = 192;
+ scr_waitvcount(112);
+ *SDLST = (u16)dlist_bot;
+}
+
void scr_show_status(char s) {
int i;
char *p, sc;
- status_box[0] = s + 177; /* inverse number */
- status_box[1] = ':';
- strncpy(status_box + 2, scr_names[s], 32);
- strncpy(status_box + 40, scr_topics[s], 40);
+ /* this part should be moved to _create() */
+ p = status_boxes[s];
+ p[0] = s + 177; /* inverse number */
+ p[1] = ':';
+ strncpy(p + 2, scr_names[s], 32);
+ strncpy(p + 40, scr_topics[s], 40);
- p = status_box + 33;
+ p += 33;
for(i = 0; i < MAX_SCREENS; i++) {
switch(scr_status[i]) {
case SCR_ACTIVE:
@@ -134,7 +152,7 @@ void scr_show_status(char s) {
}
scr_waitvcount(112);
- *dlist_bottom_lms = (u16)status_box;
+ *dlist_status_lms = (u16)status_boxes[s];
}
void scr_refresh(void) {
@@ -152,6 +170,14 @@ char scr_getbyname(const char *name) {
return 0;
}
+void scr_putc_active(char c) {
+ scr_putc(scr_active, c);
+}
+
+void scr_eol_active(void) {
+ scr_putc(scr_active, '\n');
+}
+
/* TODO: skip color codes (start with 0x03 or 0x04).
if we're going to ever support utf-8, decode it here...
also, 0x16 is supposed to be reverse video. not widely used/supported.
@@ -176,7 +202,7 @@ void scr_putc(char s, char c) {
xpos = 0;
}
- dest = screen_botlines[s] + xpos;
+ dest = screen_lastlines[s] + xpos;
if(c & 0x80) {
/* utf-8 (or maybe latin-1), we don't support it yet */