Optimize PETSCII conversion in charwin

This commit is contained in:
drmortalwombat 2022-02-01 22:00:33 +01:00
parent 25ba5ca789
commit 3507b09207
2 changed files with 27 additions and 6 deletions

View File

@ -181,17 +181,19 @@ bool cwin_cursor_backward(CharWin * win)
return false; return false;
} }
static char p2smap[] = {0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x40, 0x60}; //static char p2smap[] = {0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x40, 0x60};
static char s2pmap[] = {0x40, 0x20, 0x60, 0xb0, 0x40, 0x20, 0x60, 0xb0}; static char p2smap[] = {0x00, 0x00, 0x40, 0x20, 0x80, 0xc0, 0x80, 0x80};
//static char s2pmap[] = {0x40, 0x20, 0x60, 0xa0, 0x40, 0x20, 0x60, 0xa0};
static char s2pmap[] = {0x40, 0x00, 0x20, 0xc0, 0xc0, 0x80, 0xa0, 0x40};
static inline char p2s(char ch) static inline char p2s(char ch)
{ {
return (ch & 0x1f) | p2smap[ch >> 5]; return ch ^ p2smap[ch >> 5];
} }
static inline char s2p(char ch) static inline char s2p(char ch)
{ {
return (ch & 0x1f) | s2pmap[ch >> 5]; return ch ^ s2pmap[ch >> 5];
} }
void cwin_read_string(CharWin * win, char * buffer) void cwin_read_string(CharWin * win, char * buffer)

View File

@ -226,7 +226,7 @@ Expression* Expression::ConstantFold(Errors * errors)
return ex; return ex;
} }
} }
else if (mLeft->mDecType->mType == DT_CONST_INTEGER) else if (mLeft->mDecType->mType == DT_TYPE_INTEGER)
{ {
if (mRight->mDecValue->mType == DT_CONST_FLOAT) if (mRight->mDecValue->mType == DT_CONST_FLOAT)
{ {
@ -238,8 +238,27 @@ Expression* Expression::ConstantFold(Errors * errors)
ex->mDecType = mLeft->mDecType; ex->mDecType = mLeft->mDecType;
return ex; return ex;
} }
else if (mRight->mDecValue->mType == DT_CONST_INTEGER)
{
int64 sval = 1ULL << (8 * mLeft->mDecType->mSize);
int64 v = mRight->mDecValue->mInteger & (sval - 1);
if (mLeft->mDecType->mFlags & DTF_SIGNED)
{
if (v & (sval >> 1))
v -= sval;
} }
else if (mLeft->mDecType->mType == DT_CONST_FLOAT)
Expression* ex = new Expression(mLocation, EX_CONSTANT);
Declaration* dec = new Declaration(mLocation, DT_CONST_INTEGER);
dec->mBase = mLeft->mDecType;
dec->mInteger = v;
ex->mDecValue = dec;
ex->mDecType = mLeft->mDecType;
return ex;
}
}
else if (mLeft->mDecType->mType == DT_TYPE_FLOAT)
{ {
if (mRight->mDecValue->mType == DT_CONST_INTEGER) if (mRight->mDecValue->mType == DT_CONST_INTEGER)
{ {