diff options
| author | B. Watson <urchlay@slackware.uk> | 2026-03-01 02:00:23 -0500 |
|---|---|---|
| committer | B. Watson <urchlay@slackware.uk> | 2026-03-01 02:00:23 -0500 |
| commit | 6521e971cdb772c53256d84a54c8d7b2d1ffa632 (patch) | |
| tree | 28af564e7a12dd629d791e815834b3782177ec0c /src/screen.c | |
| parent | d3a19b319e8ecdf111de44ffa9847474301edcbb (diff) | |
| download | fujinet-chat-6521e971cdb772c53256d84a54c8d7b2d1ffa632.tar.gz | |
Scrollback!
Diffstat (limited to 'src/screen.c')
| -rw-r--r-- | src/screen.c | 50 |
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 */ |
