Fixed charwin petscii screen code conversion

This commit is contained in:
drmortalwombat 2021-12-06 09:41:25 +01:00
parent 695d4cf914
commit a8acde291b
2 changed files with 31 additions and 37 deletions

View File

@ -169,6 +169,19 @@ bool cwin_cursor_backward(CharWin * win)
return false; 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) void cwin_read_string(CharWin * win, char * buffer)
{ {
char * sp = win->sp; char * sp = win->sp;
@ -178,12 +191,7 @@ void cwin_read_string(CharWin * win, char * buffer)
{ {
for(char x=0; x<win->wx; x++) for(char x=0; x<win->wx; x++)
{ {
char c = sp[x]; buffer[i++] = s2p(sp[x]);
if (c & 0x40)
c ^= 0xc0;
if (!(c & 0x20))
c |= 0x40;
buffer[i++] = c;
} }
sp += 40; sp += 40;
} }
@ -202,9 +210,7 @@ void cwin_write_string(CharWin * win, const char * buffer)
char ch = *buffer; char ch = *buffer;
if (ch) if (ch)
{ {
ch = (ch & 0x3f) | ((ch & 0x80) >> 1); dp[x] = p2s(ch);
dp[x] = ch;
buffer++; buffer++;
} }
else else
@ -252,9 +258,7 @@ void cwin_putat_char(CharWin * win, char x, char y, char ch, char color)
{ {
int offset = mul40[y] + x; int offset = mul40[y] + x;
ch = (ch & 0x3f) | ((ch & 0x80) >> 1); win->sp[offset] = p2s(ch);
win->sp[offset] = ch;
win->cp[offset] = color; 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]; char ch = chars[i];
ch = (ch & 0x3f) | ((ch & 0x80) >> 1); sp[i] = p2s(ch);
sp[i] = ch;
cp[i] = color; 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; char i = 0;
while (char ch = str[i]) while (char ch = str[i])
{ {
ch = (ch & 0x3f) | ((ch & 0x80) >> 1); sp[i] = p2s(ch);
sp[i] = ch;
cp[i] = color; cp[i] = color;
i++; i++;
} }
@ -307,14 +307,7 @@ char cwin_getat_char(CharWin * win, char x, char y)
{ {
char * sp = win->sp + mul40[y] + x; char * sp = win->sp + mul40[y] + x;
char c = *sp; return s2p(*sp);
if (c & 0x40)
c ^= 0xc0;
if (!(c & 0x20))
c |= 0x40;
return c;
} }
void cwin_getat_chars(CharWin * win, char x, char y, char * chars, char num) 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<num; i++) for(char i=0; i<num; i++)
{ {
char c = sp[i]; chars[i] = s2p(sp[i]);
if (c & 0x40)
c ^= 0xc0;
if (!(c & 0x20))
c |= 0x40;
chars[i] = c;
} }
} }
@ -529,8 +515,7 @@ void cwin_scroll_down(CharWin * win, char by)
} }
} }
void cwin_fill_rect_raw(CharWin * win, char x, char y, char w, char h, char ch, char color)
void cwin_fill_rect(CharWin * win, char x, char y, char w, char h, char ch, char color)
{ {
if (w > 0) if (w > 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);
}

View File

@ -114,7 +114,11 @@ void cwin_scroll_down(CharWin * win, char by);
// Fill the given rectangle with the character and color // 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") #pragma compile("charwin.c")