From a8acde291bcc3a03a131de183c678a73c4bdba83 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Mon, 6 Dec 2021 09:41:25 +0100 Subject: [PATCH] Fixed charwin petscii screen code conversion --- include/c64/charwin.c | 62 ++++++++++++++++++------------------------- include/c64/charwin.h | 6 ++++- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/include/c64/charwin.c b/include/c64/charwin.c index f29939e..dca0e90 100644 --- a/include/c64/charwin.c +++ b/include/c64/charwin.c @@ -169,6 +169,19 @@ bool cwin_cursor_backward(CharWin * win) return false; } +static char p2smap[] = {0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x40, 0x60}; +static char s2pmap[] = {0x40, 0x20, 0x60, 0xb0, 0x40, 0x20, 0x60, 0xb0}; + +static inline char p2s(char ch) +{ + return (ch & 0x1f) | p2smap[ch >> 5]; +} + +static inline char s2p(char ch) +{ + return (ch & 0x1f) | s2pmap[ch >> 5]; +} + void cwin_read_string(CharWin * win, char * buffer) { char * sp = win->sp; @@ -178,12 +191,7 @@ void cwin_read_string(CharWin * win, char * buffer) { for(char x=0; xwx; x++) { - char c = sp[x]; - if (c & 0x40) - c ^= 0xc0; - if (!(c & 0x20)) - c |= 0x40; - buffer[i++] = c; + buffer[i++] = s2p(sp[x]); } sp += 40; } @@ -202,9 +210,7 @@ void cwin_write_string(CharWin * win, const char * buffer) char ch = *buffer; if (ch) { - ch = (ch & 0x3f) | ((ch & 0x80) >> 1); - - dp[x] = ch; + dp[x] = p2s(ch); buffer++; } else @@ -252,9 +258,7 @@ void cwin_putat_char(CharWin * win, char x, char y, char ch, char color) { int offset = mul40[y] + x; - ch = (ch & 0x3f) | ((ch & 0x80) >> 1); - - win->sp[offset] = ch; + win->sp[offset] = p2s(ch); win->cp[offset] = color; } @@ -271,9 +275,7 @@ void cwin_putat_chars(CharWin * win, char x, char y, const char * chars, char nu { char ch = chars[i]; - ch = (ch & 0x3f) | ((ch & 0x80) >> 1); - - sp[i] = ch; + sp[i] = p2s(ch); cp[i] = color; } } @@ -290,9 +292,7 @@ char cwin_putat_string(CharWin * win, char x, char y, const char * str, char col char i = 0; while (char ch = str[i]) { - ch = (ch & 0x3f) | ((ch & 0x80) >> 1); - - sp[i] = ch; + sp[i] = p2s(ch); cp[i] = color; i++; } @@ -307,14 +307,7 @@ char cwin_getat_char(CharWin * win, char x, char y) { char * sp = win->sp + mul40[y] + x; - char c = *sp; - - if (c & 0x40) - c ^= 0xc0; - if (!(c & 0x20)) - c |= 0x40; - - return c; + return s2p(*sp); } void cwin_getat_chars(CharWin * win, char x, char y, char * chars, char num) @@ -323,14 +316,7 @@ void cwin_getat_chars(CharWin * win, char x, char y, char * chars, char num) for(char i=0; i 0) { @@ -545,3 +530,8 @@ void cwin_fill_rect(CharWin * win, char x, char y, char w, char h, char ch, char } } } + +void cwin_fill_rect(CharWin * win, char x, char y, char w, char h, char ch, char color) +{ + cwin_fill_rect_raw(win, x, y, w, h, p2s(ch), color); +} diff --git a/include/c64/charwin.h b/include/c64/charwin.h index b7e0572..b0a0f92 100644 --- a/include/c64/charwin.h +++ b/include/c64/charwin.h @@ -114,7 +114,11 @@ void cwin_scroll_down(CharWin * win, char by); // Fill the given rectangle with the character and color // -void cwin_fill_rect(CharWin * win, char x, char y, char w, char h, char ch, char color); +inline void cwin_fill_rect(CharWin * win, char x, char y, char w, char h, char ch, char color); + +// Fill the given rectangle with the screen code and color +// +void cwin_fill_rect_raw(CharWin * win, char x, char y, char w, char h, char ch, char color); #pragma compile("charwin.c")