Add charwin library and matching code generator optimizations

This commit is contained in:
drmortalwombat 2021-11-18 14:57:43 +01:00
parent 594610c302
commit 4017cc386b
13 changed files with 1151 additions and 41 deletions

505
include/c64/charwin.c Normal file
View File

@ -0,0 +1,505 @@
#include "charwin.h"
static void copy_fwd(char * sdp, const char * ssp, char * cdp, const char * csp, char n)
{
for(char i=0; i<n; i++)
{
sdp[i] = ssp[i];
cdp[i] = csp[i];
}
}
#pragma native(copy_fwd)
static void fill_fwd(char * sdp, char * cdp, char ch, char color, char n)
{
for(char i=0; i<n; i++)
{
sdp[i] = ch;
cdp[i] = color;
}
}
#pragma native(fill_fwd)
static void copy_bwd(char * sdp, const char * ssp, char * cdp, const char * csp, char n)
{
while (n)
{
n--;
sdp[n] = ssp[n];
cdp[n] = csp[n];
}
}
#pragma native(copy_bwd)
void cwin_init(CharWin * win, char * screen, char sx, char sy, char wx, char wy)
{
win->sx = sx;
win->sy = sy;
win->wx = wx;
win->wy = wy;
win->cx = 0;
win->cy = 0;
win->sp = screen + 40 * sy + sx;
win->cp = (char *)0xd800 + 40 * sy + sx;
}
void cwin_clear(CharWin * win)
{
cwin_fill(win, ' ', 1);
}
void cwin_fill(CharWin * win, char ch, char color)
{
char *sp = win->sp, * cp = win->cp;
for(char y=0; y<win->wy; y++)
{
fill_fwd(sp, cp, ch, color, win->wx);
sp += 40;
cp += 40;
}
}
void cwin_cursor_show(CharWin * win, bool show)
{
char * cp = win->sp + 40 * win->cy + win->cx;
if (show)
*cp |= 0x80;
else
*cp &= 0x7f;
}
void cwin_cursor_move(CharWin * win, char cx, char cy)
{
win->cx = cx;
win->cy = cy;
}
bool cwin_cursor_left(CharWin * win)
{
if (win->cx > 0)
{
win->cx--;
return true;
}
return false;
}
bool cwin_cursor_right(CharWin * win)
{
if (win->cx + 1 < win->wx)
{
win->cx++;
return true;
}
return false;
}
bool cwin_cursor_up(CharWin * win)
{
if (win->cy > 0)
{
win->cy--;
return true;
}
return false;
}
bool cwin_cursor_down(CharWin * win)
{
if (win->cy + 1 < win->cy)
{
win->cy++;
return true;
}
return false;
}
bool cwin_cursor_forward(CharWin * win)
{
if (win->cx + 1 < win->wx)
{
win->cx++;
return true;
}
else if (win->cy + 1 < win->wy)
{
win->cx = 0;
win->cy++;
return true;
}
return false;
}
bool cwin_cursor_backward(CharWin * win)
{
if (win->cx > 0)
{
win->cx--;
return true;
}
else if (win->cy > 0)
{
win->cx = win->wx - 1;
win->cy--;
return true;
}
return false;
}
void cwin_read_string(CharWin * win, char * buffer)
{
char * sp = win->sp;
char i = 0;
for(char y=0; y<win->wy; y++)
{
for(char x=0; x<win->wx; x++)
{
char c = sp[x];
if (c & 0x40)
c ^= 0xc0;
if (!(c & 0x20))
c |= 0x40;
buffer[i++] = c;
}
sp += 40;
}
while (i > 0 && buffer[i - 1] == ' ')
i--;
buffer[i] = 0;
}
void cwin_write_string(CharWin * win, const char * buffer)
{
char * dp = win->sp;
for(char y=0; y<win->wy; y++)
{
for(char x=0; x<win->wx; x++)
{
char c = *buffer;
if (c)
{
c &= 0xbf;
if (c & 0x80)
c ^= 0xc0;
dp[x] = c;
buffer++;
}
else
dp[x] = ' ';
}
dp += 40;
}
}
void cwin_put_char(CharWin * win, char ch, char color)
{
cwin_putat_char(win, win->cx, win->cy, ch, color);
win->cx++;
if (win->cx == win->wx)
{
win->cx = 0;
win->cy++;
}
}
void cwin_put_chars(CharWin * win, const char * chars, char num, char color)
{
cwin_putat_chars(win, win->cx, win->cy, chars, color);
win->cx += num;
if (win->cx >= win->wx)
{
win->cx = 0;
win->cy++;
}
}
char cwin_put_string(CharWin * win, const char * str, char color)
{
char n = cwin_putat_string(win, win->cx, win->cy, str, color);
win->cx += n;
if (win->cx >= win->wx)
{
win->cx = 0;
win->cy++;
}
return n;
}
void cwin_putat_char(CharWin * win, char x, char y, char ch, char color)
{
int offset = 40 * y + x;
ch &= 0xbf;
if (ch & 0x80)
ch ^= 0xc0;
win->sp[offset] = ch;
win->cp[offset] = color;
}
void cwin_putat_chars(CharWin * win, char x, char y, const char * chars, char num, char color)
{
int offset = 40 * y + x;
char * sp = win->sp + offset;
char * cp = win->cp + offset;
for(char i=0; i<num; i++)
{
char ch = chars[i];
ch &= 0xbf;
if (ch & 0x80)
ch ^= 0xc0;
sp[i] = ch;
cp[i] = color;
}
}
char cwin_putat_string(CharWin * win, char x, char y, const char * str, char color)
{
int offset = 40 * y + x;
char * sp = win->sp + offset;
char * cp = win->cp + offset;
char i = 0;
while (char ch = str[i])
{
ch &= 0xbf;
if (ch & 0x80)
ch ^= 0xc0;
sp[i] = ch;
cp[i] = color;
i++;
}
return i;
}
void cwin_insert_char(CharWin * win)
{
char y = win->wy - 1, rx = win->wx - 1;
char * sp = win->sp + 40 * y;
char * cp = win->cp + 40 * y;
while (y > win->cy)
{
copy_bwd(sp + 1, sp, cp + 1, cp, rx);
sp -= 40;
cp -= 40;
sp[40] = sp[rx];
cp[40] = cp[rx];
y--;
}
sp += win->cx;
cp += win->cx;
rx -= win->cx;
copy_bwd(sp + 1, sp, cp + 1, cp, rx);
sp[0] = ' ';
}
void cwin_delete_char(CharWin * win)
{
char * sp = win->sp + 40 * win->cy;
char * cp = win->cp + 40 * win->cy;
char x = win->cx, rx = win->wx - 1;
copy_fwd(sp + x, sp + x + 1, cp + x, cp + x + 1, rx - x);
char y = win->cy + 1;
while (y < win->wy)
{
sp[rx] = sp[40];
cp[rx] = cp[40];
sp += 40;
cp += 40;
copy_fwd(sp, sp + 1, cp, cp + 1, rx);
y++;
}
sp[rx] = ' ';
}
int cwin_getch(void)
{
__asm
{
L1:
jsr 0xffe4
cmp #0
beq L1
sta accu
lda #0
sta accu + 1
}
}
bool cwin_edit_char(CharWin * win, char ch)
{
switch (ch)
{
case 13:
case 3:
return true;
case 19:
win->cx = 0;
win->cy = 0;
return false;
case 147:
cwin_clear(win);
return false;
case 17:
cwin_cursor_down(win);
return false;
case 145: // CRSR_UP
cwin_cursor_up(win);
return false;
case 29:
cwin_cursor_forward(win);
return false;
case 157:
cwin_cursor_backward(win);
return false;
case 20:
if (cwin_cursor_backward(win))
cwin_delete_char(win);
return false;
default:
if (ch >= 32 && ch < 128 || ch >= 160)
{
if (win->cy + 1 < win->wy || win->cx + 1 < win->wx)
{
cwin_insert_char(win);
cwin_put_char(win, ch, 1);
}
}
return false;
}
}
char cwin_edit(CharWin * win)
{
for(;;)
{
cwin_cursor_show(win, true);
char ch = cwin_getch();
cwin_cursor_show(win, false);
if (cwin_edit_char(win, ch))
return ch;
}
}
void cwin_scroll_left(CharWin * win, char by)
{
char * sp = win->sp;
char * cp = win->cp;
char rx = win->wx - by;
for(char y=0; y<win->wy; y++)
{
copy_fwd(sp, sp + by, cp, cp + by, rx);
}
}
void cwin_scroll_right(CharWin * win, char by)
{
char * sp = win->sp;
char * cp = win->cp;
char rx = win->wx - by;
for(char y=0; y<win->wy; y++)
{
copy_bwd(sp + by, sp, cp + by, cp, rx);
sp += 40;
cp += 40;
}
}
void cwin_scroll_up(CharWin * win, char by)
{
char * sp = win->sp;
char * cp = win->cp;
char rx = win->wx;
int dst = 40 * by;
for(char y=0; y<win->wy - by; y++)
{
copy_fwd(sp, sp + dst, cp, cp + dst, rx);
sp += 40;
cp += 40;
}
}
void cwin_scroll_down(CharWin * win, char by)
{
char * sp = win->sp + 40 * win->wy;
char * cp = win->cp + 40 * win->wy;
char rx = win->wx;
int dst = 40 * by;
for(char y=0; y<win->wy - by; y++)
{
sp -= 40;
cp -= 40;
copy_fwd(sp, sp - dst, cp, cp - dst, rx);
}
}
void cwin_fill_rect(CharWin * win, char x, char y, char w, char h, char ch, char color)
{
char * sp = win->sp + 40 * y + x;
char * cp = win->cp + 40 * y + x;
for(char y=0; y<h; y++)
{
fill_fwd(sp, cp, ch, color, w);
sp += 40;
cp += 40;
}
}

108
include/c64/charwin.h Normal file
View File

@ -0,0 +1,108 @@
#ifndef C64_CHARWIN_H
#define C64_CHARWIN_H
struct CharWin
{
char sx, sy, wx, wy;
char cx, cy;
char * sp, * cp;
};
// Initialize the CharWin structure for the given screen and coordinates, does
// not clear the window
//
void cwin_init(CharWin * win, char * screen, char sx, char sy, char wx, char wy);
// Clear the window
//
void cwin_clear(CharWin * win);
// Fill the window with the given character and color
//
void cwin_fill(CharWin * win, char ch, char color);
// Show or hide the cursor by setting or clearing the MSB of the character code
//
void cwin_cursor_show(CharWin * win, bool show);
// Move the cursor to the given location
//
void cwin_cursor_move(CharWin * win, char cx, char cy);
// Move the cursor in the window, returns true if the cursor could be moved
//
bool cwin_cursor_left(CharWin * win);
bool cwin_cursor_right(CharWin * win);
bool cwin_cursor_up(CharWin * win);
bool cwin_cursor_down(CharWin * win);
bool cwin_cursor_forward(CharWin * win);
bool cwin_cursor_backward(CharWin * win);
// Read the full window into a string
//
void cwin_read_string(CharWin * win, char * buffer);
// Write the fill window with the given string
//
void cwin_write_string(CharWin * win, const char * buffer);
// Put a single char at the cursor location and advance the cursor
//
void cwin_put_char(CharWin * win, char ch, char color);
// Put an array of chars at the cursor location and advance the cursor
//
void cwin_put_chars(CharWin * win, const char * chars, char num, char color);
// Put a zero terminated string at the cursor location and advance the cursor
//
char cwin_put_string(CharWin * win, const char * str, char color);
// Put a single char at the given window location
//
void cwin_putat_char(CharWin * win, char x, char y, char ch, char color);
// Put an array of chars at the given window location
//
void cwin_putat_chars(CharWin * win, char x, char y, const char * chars, char num, char color);
// Put a zero terminated string at the given window location
//
char cwin_putat_string(CharWin * win, char x, char y, const char * str, char color);
// Insert one space character at the cursor position
//
void cwin_insert_char(CharWin * win);
// Delete the character at the cursor position
//
void cwin_delete_char(CharWin * win);
// Edit the window position using the char as the input
//
bool cwin_edit_char(CharWin * win, char ch);
// Edit the window using keyboard input, returns the key the exited
// the edit, either return or stop
//
char cwin_edit(CharWin * win);
// Scroll the window in the given direction, does not fill the new
// empty space
//
void cwin_scroll_left(CharWin * win, char by);
void cwin_scroll_right(CharWin * win, char by);
void cwin_scroll_up(CharWin * win, char by);
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);
#pragma compile("charwin.c")
#endif

View File

@ -29,6 +29,8 @@ __asm inp_exit
sta $54 sta $54
lda #0 lda #0
sta $13 sta $13
lda #$19
sta $16
rts rts
} }

View File

@ -4259,6 +4259,16 @@ bool ByteCodeBasicBlock::JoinTailCodeSequences(void)
} }
} }
if (mTrueJump && mFalseJump && mTrueJump->mEntryBlocks.Size() == 1 && mFalseJump->mEntryBlocks.Size() == 1)
{
while (mTrueJump->mIns.Size() > 0 && mFalseJump->mIns.Size() > 0 && !mTrueJump->mIns[0].ChangesAccu() && mTrueJump->mIns[0].IsSame(mFalseJump->mIns[0]))
{
mIns.Push(mTrueJump->mIns[0]);
mTrueJump->mIns.Remove(0);
mFalseJump->mIns.Remove(0);
}
}
if (mTrueJump && mTrueJump->JoinTailCodeSequences()) if (mTrueJump && mTrueJump->JoinTailCodeSequences())
changed = true; changed = true;
if (mFalseJump && mFalseJump->JoinTailCodeSequences()) if (mFalseJump && mFalseJump->JoinTailCodeSequences())
@ -4359,7 +4369,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
// assert(!(live & LIVE_ACCU)); // assert(!(live & LIVE_ACCU));
int accuTemp = -1, addrTemp = -1, accuVal = 0; int accuTemp = -1, addrTemp = -1, accuVal = 0, accuTempByte = -1;
bool accuConst = false; bool accuConst = false;
for (int i = 0; i < mIns.Size(); i++) for (int i = 0; i < mIns.Size(); i++)
@ -4444,6 +4454,22 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
mIns[i + 0].mCode = BC_NOP; mIns[i + 0].mCode = BC_NOP;
progress = true; progress = true;
} }
#endif
#if 1
else if (
mIns[i + 0].mCode == BC_STORE_REG_16 &&
mIns[i + 1].mCode == BC_BINOP_MULI8_16 && mIns[i + 1].mRegister == mIns[i + 0].mRegister &&
mIns[i + 2].mCode == BC_LOAD_REG_16 && mIns[i + 2].mRegister != mIns[i + 0].mRegister &&
mIns[i + 3].IsCommutative() && mIns[i + 3].mRegister == mIns[i + 0].mRegister && mIns[i + 3].mRegisterFinal)
{
mIns[i + 0].mCode = BC_NOP;
mIns[i + 1].mRegister = BC_REG_ACCU;
mIns[i + 1].mLive |= LIVE_ACCU;
mIns[i + 2].mCode = BC_NOP;
mIns[i + 3].mRegister = mIns[i + 2].mRegister;
mIns[i + 3].mRegisterFinal = mIns[i + 2].mRegisterFinal;
progress = true;
}
#endif #endif
} }
#endif #endif
@ -4790,6 +4816,12 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
mIns[i + 1].mCode = BC_NOP; mIns[i + 1].mCode = BC_NOP;
progress = true; progress = true;
} }
else if (mIns[i + 0].mCode == BC_LOAD_REG_16 && mIns[i + 1].mCode == BC_ADDR_REG && mIns[i + 1].mRegister == BC_REG_ACCU && !(mIns[i + 1].mLive & LIVE_ACCU))
{
mIns[i + 0].mCode = BC_ADDR_REG;
mIns[i + 1].mCode = BC_NOP;
progress = true;
}
else if (mIns[i + 1].mCode == BC_LOAD_REG_16 && mIns[i].LoadsRegister(mIns[i + 1].mRegister) && mIns[i + 1].mRegisterFinal) else if (mIns[i + 1].mCode == BC_LOAD_REG_16 && mIns[i].LoadsRegister(mIns[i + 1].mRegister) && mIns[i + 1].mRegisterFinal)
{ {
mIns[i].mRegister = BC_REG_ACCU; mIns[i].mRegister = BC_REG_ACCU;
@ -5005,6 +5037,19 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
mIns[i + 1].mCode = BC_NOP; mIns[i + 1].mCode = BC_NOP;
progress = true; progress = true;
} }
#if 1
else if (
i + 2 == mIns.Size() && mFalseJump &&
mIns[i + 0].mCode == BC_LOAD_REG_8 &&
mIns[i + 1].mCode == BC_BINOP_CMPUR_8 && accuTempByte == mIns[i + 1].mRegister && !(mExitLive & LIVE_ACCU)
)
{
mIns[i + 0].mCode = BC_NOP;
mIns[i + 1].mRegister = mIns[i + 0].mRegister;
mBranch = TransposeBranchCondition(mBranch);
progress = true;
}
#endif
#if 0 #if 0
else if ((mIns[i].mCode == BC_LOAD_LOCAL_16 || mIns[i].mCode == BC_LOAD_ABS_16) && mIns[i + 1].mCode == BC_ADDR_REG && mIns[i].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal) else if ((mIns[i].mCode == BC_LOAD_LOCAL_16 || mIns[i].mCode == BC_LOAD_ABS_16) && mIns[i + 1].mCode == BC_ADDR_REG && mIns[i].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal)
@ -5028,6 +5073,11 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
mIns[i].mCode = BC_NOP; mIns[i].mCode = BC_NOP;
progress = true; progress = true;
} }
else if ((mIns[i].mCode == BC_LOAD_REG_8 || mIns[i].mCode == BC_STORE_REG_8) && accuTempByte == mIns[i].mRegister)
{
mIns[i].mCode = BC_NOP;
progress = true;
}
#endif #endif
if (mIns[i].mCode == BC_ADDR_REG && mIns[i].mRegister == addrTemp) if (mIns[i].mCode == BC_ADDR_REG && mIns[i].mRegister == addrTemp)
{ {
@ -5074,18 +5124,23 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
if (mIns[i].ChangesAccu()) if (mIns[i].ChangesAccu())
{ {
accuTemp = -1; accuTemp = -1;
accuTempByte = -1;
accuConst = false; accuConst = false;
} }
if (mIns[i].ChangesAddr()) if (mIns[i].ChangesAddr())
addrTemp = -1; addrTemp = -1;
if (accuTemp != -1 && mIns[i].ChangesRegister(accuTemp)) if (accuTemp != -1 && mIns[i].ChangesRegister(accuTemp))
accuTemp = -1; accuTemp = -1;
if (accuTempByte != -1 && mIns[i].ChangesRegister(accuTempByte))
accuTempByte = -1;
if (addrTemp != -1 && mIns[i].ChangesRegister(addrTemp)) if (addrTemp != -1 && mIns[i].ChangesRegister(addrTemp))
addrTemp = -1; addrTemp = -1;
if (mIns[i].mCode == BC_LOAD_REG_16 || mIns[i].mCode == BC_STORE_REG_16 || mIns[i].mCode == BC_LOAD_REG_32 || mIns[i].mCode == BC_STORE_REG_32) if (mIns[i].mCode == BC_LOAD_REG_16 || mIns[i].mCode == BC_STORE_REG_16 || mIns[i].mCode == BC_LOAD_REG_32 || mIns[i].mCode == BC_STORE_REG_32)
accuTemp = mIns[i].mRegister; accuTemp = mIns[i].mRegister;
if (mIns[i].mCode == BC_ADDR_REG && mIns[i].mRegister != BC_REG_ACCU) else if (mIns[i].mCode == BC_LOAD_REG_8)
accuTempByte = mIns[i].mRegister;
else if (mIns[i].mCode == BC_ADDR_REG && mIns[i].mRegister != BC_REG_ACCU)
addrTemp = mIns[i].mRegister; addrTemp = mIns[i].mRegister;
if (mIns[i].mRegister == BC_REG_ACCU && !mIns[i].mRelocate) if (mIns[i].mRegister == BC_REG_ACCU && !mIns[i].mRelocate)

View File

@ -20,7 +20,7 @@ const char* ByteCodeDisassembler::TempName(uint8 tmp, char* buffer, InterCodePro
return "ADDR"; return "ADDR";
else if (tmp == BC_REG_ACCU) else if (tmp == BC_REG_ACCU)
return "ACCU"; return "ACCU";
else if (tmp >= BC_REG_FPARAMS && tmp <= BC_REG_FPARAMS + 7) else if (tmp >= BC_REG_FPARAMS && tmp < BC_REG_FPARAMS_END)
{ {
sprintf_s(buffer, 10, "P%d", tmp - BC_REG_FPARAMS); sprintf_s(buffer, 10, "P%d", tmp - BC_REG_FPARAMS);
return buffer; return buffer;
@ -723,7 +723,7 @@ const char* NativeCodeDisassembler::TempName(uint8 tmp, char* buffer, InterCodeP
sprintf_s(buffer, 10, "IP + %d", tmp - BC_REG_IP); sprintf_s(buffer, 10, "IP + %d", tmp - BC_REG_IP);
return buffer; return buffer;
} }
else if (tmp >= BC_REG_FPARAMS && tmp <= BC_REG_FPARAMS + 7) else if (tmp >= BC_REG_FPARAMS && tmp < BC_REG_FPARAMS_END)
{ {
sprintf_s(buffer, 10, "P%d", tmp - BC_REG_FPARAMS); sprintf_s(buffer, 10, "P%d", tmp - BC_REG_FPARAMS);
return buffer; return buffer;

View File

@ -129,7 +129,7 @@ void GlobalAnalyzer::AutoInline(void)
dec = dec->mNext; dec = dec->mNext;
} }
if (nparams <= 8) if (nparams <= BC_REG_FPARAMS_END - BC_REG_FPARAMS)
{ {
f->mBase->mFlags |= DTF_FASTCALL; f->mBase->mFlags |= DTF_FASTCALL;
#if 0 #if 0
@ -290,6 +290,8 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec)
if (ldec->mType == DT_VARIABLE) if (ldec->mType == DT_VARIABLE)
ldec->mFlags |= DTF_VAR_ALIASING; ldec->mFlags |= DTF_VAR_ALIASING;
} }
else if (exp->mToken == TK_MUL)
return exp->mDecType;
break; break;
case EX_POSTFIX: case EX_POSTFIX:
break; break;

View File

@ -3,6 +3,7 @@
uint8 BC_REG_WORK = 0x03; uint8 BC_REG_WORK = 0x03;
uint8 BC_REG_WORK_Y = 0x02; uint8 BC_REG_WORK_Y = 0x02;
uint8 BC_REG_FPARAMS = 0x0d; uint8 BC_REG_FPARAMS = 0x0d;
uint8 BC_REG_FPARAMS_END = 0x19;
uint8 BC_REG_IP = 0x19; uint8 BC_REG_IP = 0x19;
uint8 BC_REG_ACCU = 0x1b; uint8 BC_REG_ACCU = 0x1b;

View File

@ -84,6 +84,7 @@ inline int sprintf_s(char* buffer, int size, const char* format, ...)
extern uint8 BC_REG_WORK; extern uint8 BC_REG_WORK;
extern uint8 BC_REG_WORK_Y; extern uint8 BC_REG_WORK_Y;
extern uint8 BC_REG_FPARAMS; extern uint8 BC_REG_FPARAMS;
extern uint8 BC_REG_FPARAMS_END;
extern uint8 BC_REG_IP; extern uint8 BC_REG_IP;
extern uint8 BC_REG_ACCU; extern uint8 BC_REG_ACCU;

View File

@ -1498,6 +1498,31 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
} }
break; break;
case ASMIT_STA:
if (mMode == ASMIM_ZERO_PAGE && data.mRegs[CPU_REG_A].mMode == NRDM_ZERO_PAGE && mAddress == data.mRegs[CPU_REG_A].mValue)
{
mType = ASMIT_NOP;
mMode = ASMIM_IMPLIED;
changed = true;
}
break;
case ASMIT_STX:
if (mMode == ASMIM_ZERO_PAGE && data.mRegs[CPU_REG_X].mMode == NRDM_ZERO_PAGE && mAddress == data.mRegs[CPU_REG_X].mValue)
{
mType = ASMIT_NOP;
mMode = ASMIM_IMPLIED;
changed = true;
}
break;
case ASMIT_STY:
if (mMode == ASMIM_ZERO_PAGE && data.mRegs[CPU_REG_Y].mMode == NRDM_ZERO_PAGE && mAddress == data.mRegs[CPU_REG_Y].mValue)
{
mType = ASMIT_NOP;
mMode = ASMIM_IMPLIED;
changed = true;
}
break;
case ASMIT_ADC: case ASMIT_ADC:
if (data.mRegs[CPU_REG_C].mMode == NRDM_IMMEDIATE && data.mRegs[CPU_REG_C].mValue == 0) if (data.mRegs[CPU_REG_C].mMode == NRDM_IMMEDIATE && data.mRegs[CPU_REG_C].mValue == 0)
{ {
@ -7362,13 +7387,14 @@ bool NativeCodeBasicBlock::ApplyEntryDataSet(void)
return changed; return changed;
} }
void NativeCodeBasicBlock::FindZeroPageAlias(const NumberSet& statics, NumberSet& invalid, uint8* alias) void NativeCodeBasicBlock::FindZeroPageAlias(const NumberSet& statics, NumberSet& invalid, uint8* alias, int accu)
{ {
if (!mVisited) if (!mVisited)
{ {
mVisited = true; mVisited = true;
int accu = -1; if (mNumEntries > 1)
accu = -1;
for (int i = 0; i < mIns.Size(); i++) for (int i = 0; i < mIns.Size(); i++)
{ {
@ -7400,9 +7426,9 @@ void NativeCodeBasicBlock::FindZeroPageAlias(const NumberSet& statics, NumberSet
} }
if (mTrueJump) if (mTrueJump)
mTrueJump->FindZeroPageAlias(statics, invalid, alias); mTrueJump->FindZeroPageAlias(statics, invalid, alias, accu);
if (mFalseJump) if (mFalseJump)
mFalseJump->FindZeroPageAlias(statics, invalid, alias); mFalseJump->FindZeroPageAlias(statics, invalid, alias, accu);
} }
} }
@ -7477,6 +7503,11 @@ void NativeCodeBasicBlock::GlobalRegisterXMap(int reg)
ins.mType = ASMIT_DEX; ins.mType = ASMIT_DEX;
ins.mMode = ASMIM_IMPLIED; ins.mMode = ASMIM_IMPLIED;
break; break;
case ASMIT_LDX:
assert(ins.mAddress == reg);
ins.mType = ASMIT_NOP;
ins.mMode = ASMIM_IMPLIED;
break;
} }
} }
} }
@ -7517,6 +7548,11 @@ void NativeCodeBasicBlock::GlobalRegisterYMap(int reg)
ins.mType = ASMIT_DEY; ins.mType = ASMIT_DEY;
ins.mMode = ASMIM_IMPLIED; ins.mMode = ASMIM_IMPLIED;
break; break;
case ASMIT_LDY:
assert(ins.mAddress == reg);
ins.mType = ASMIT_NOP;
ins.mMode = ASMIM_IMPLIED;
break;
} }
} }
} }
@ -7685,10 +7721,6 @@ void NativeCodeBasicBlock::GlobalRegisterXYCheck(int* xregs, int* yregs)
for (int i = 0; i < mIns.Size(); i++) for (int i = 0; i < mIns.Size(); i++)
{ {
const NativeCodeInstruction& ins(mIns[i]); const NativeCodeInstruction& ins(mIns[i]);
if (ins.ChangesXReg())
xregs[0] = -1;
if (ins.ChangesYReg())
yregs[0] = -1;
if (ins.mMode == ASMIM_ZERO_PAGE) if (ins.mMode == ASMIM_ZERO_PAGE)
{ {
switch (ins.mType) switch (ins.mType)
@ -7699,6 +7731,24 @@ void NativeCodeBasicBlock::GlobalRegisterXYCheck(int* xregs, int* yregs)
if (xregs[ins.mAddress] >= 0) if (xregs[ins.mAddress] >= 0)
xregs[ins.mAddress]++; xregs[ins.mAddress]++;
break; break;
case ASMIT_LDY:
if (yregs[ins.mAddress] >= 0)
yregs[ins.mAddress] += 2;
for (int i = 1; i < 256; i++)
if (i != ins.mAddress)
yregs[i] = -1;
xregs[ins.mAddress] = -1;
break;
case ASMIT_LDX:
if (xregs[ins.mAddress] >= 0)
xregs[ins.mAddress] += 2;
for (int i = 1; i < 256; i++)
if (i != ins.mAddress)
xregs[i] = -1;
yregs[ins.mAddress] = -1;
break;
case ASMIT_STA: case ASMIT_STA:
if (ins.mLive & LIVE_CPU_REG_Z) if (ins.mLive & LIVE_CPU_REG_Z)
{ {
@ -7737,6 +7787,13 @@ void NativeCodeBasicBlock::GlobalRegisterXYCheck(int* xregs, int* yregs)
{ {
} }
else
{
if (ins.ChangesXReg())
xregs[0] = -1;
if (ins.ChangesYReg())
yregs[0] = -1;
}
} }
if (xregs[0] >= 0 || yregs[0] >= 0) if (xregs[0] >= 0 || yregs[0] >= 0)
@ -7749,19 +7806,28 @@ void NativeCodeBasicBlock::GlobalRegisterXYCheck(int* xregs, int* yregs)
} }
} }
void NativeCodeBasicBlock::RemapZeroPage(const uint8* remap) bool NativeCodeBasicBlock::RemapZeroPage(const uint8* remap)
{ {
bool modified = false;
if (!mVisited) if (!mVisited)
{ {
mVisited = true; mVisited = true;
for (int i = 0; i < mIns.Size(); i++) for (int i = 0; i < mIns.Size(); i++)
{ {
int addr;
switch (mIns[i].mMode) switch (mIns[i].mMode)
{ {
case ASMIM_ZERO_PAGE: case ASMIM_ZERO_PAGE:
case ASMIM_INDIRECT_Y: case ASMIM_INDIRECT_Y:
mIns[i].mAddress = remap[mIns[i].mAddress]; addr = remap[mIns[i].mAddress];
if (addr != mIns[i].mAddress)
{
mIns[i].mAddress = addr;
modified = true;
}
break; break;
case ASMIM_ABSOLUTE: case ASMIM_ABSOLUTE:
if (mIns[i].mType == ASMIT_JSR && mIns[i].mLinkerObject) if (mIns[i].mType == ASMIT_JSR && mIns[i].mLinkerObject)
@ -7770,18 +7836,26 @@ void NativeCodeBasicBlock::RemapZeroPage(const uint8* remap)
for (int j = 0; j < lo->mNumTemporaries; j++) for (int j = 0; j < lo->mNumTemporaries; j++)
{ {
lo->mTemporaries[j] = remap[lo->mTemporaries[j]]; addr = remap[lo->mTemporaries[j]];
if (addr != lo->mTemporaries[j])
{
lo->mTemporaries[j] = addr;
modified = true;
}
} }
} }
break; break;
} }
} }
if (mTrueJump) if (mTrueJump && mTrueJump->RemapZeroPage(remap))
mTrueJump->RemapZeroPage(remap); modified = true;
if (mFalseJump)
mFalseJump->RemapZeroPage(remap); if (mFalseJump && mFalseJump->RemapZeroPage(remap))
modified = true;
} }
return modified;
} }
bool NativeCodeBasicBlock::SameTail(const NativeCodeInstruction& ins) const bool NativeCodeBasicBlock::SameTail(const NativeCodeInstruction& ins) const
@ -8094,6 +8168,37 @@ bool NativeCodeBasicBlock::FindAddressSumY(int at, int reg, int & apos, int& bre
return true; return true;
} }
else if (
mIns[j + 0].mType == ASMIT_STA && mIns[j + 0].mMode == ASMIM_ZERO_PAGE &&
mIns[j + 1].mType == ASMIT_CLC &&
mIns[j + 2].mType == ASMIT_ADC && mIns[j + 2].mMode == ASMIM_ZERO_PAGE &&
mIns[j + 3].mType == ASMIT_STA && mIns[j + 3].mMode == ASMIM_ZERO_PAGE && mIns[j + 3].mAddress == reg &&
mIns[j + 4].mType == ASMIT_LDA && mIns[j + 4].mMode == ASMIM_ZERO_PAGE && mIns[j + 4].mAddress == mIns[j + 2].mAddress + 1 &&
mIns[j + 5].mType == ASMIT_ADC && mIns[j + 5].mMode == ASMIM_IMMEDIATE && mIns[j + 5].mAddress == 0 &&
mIns[j + 6].mType == ASMIT_STA && mIns[j + 6].mMode == ASMIM_ZERO_PAGE && mIns[j + 6].mAddress == reg + 1)
{
breg = mIns[j + 2].mAddress;
ireg = mIns[j + 0].mAddress;
int k = j + 7;
while (k < at)
{
if (mIns[k].mMode == ASMIM_ZERO_PAGE && (mIns[k].mAddress == breg || mIns[k].mAddress == breg + 1 || mIns[k].mAddress == ireg) && mIns[k].ChangesAddress())
return false;
if (breg == reg)
{
if (mIns[k].mMode == ASMIM_ZERO_PAGE && (mIns[k].mAddress == breg || mIns[k].mAddress == breg + 1))
return false;
if (mIns[k].mMode == ASMIM_INDIRECT_Y && mIns[k].mAddress == breg)
return false;
}
k++;
}
apos = j;
return true;
}
if (mIns[j + 6].mMode == ASMIM_ZERO_PAGE && (mIns[j + 6].mAddress == reg || mIns[j + 6].mAddress == reg + 1) && mIns[j + 6].ChangesAddress()) if (mIns[j + 6].mMode == ASMIM_ZERO_PAGE && (mIns[j + 6].mAddress == reg || mIns[j + 6].mAddress == reg + 1) && mIns[j + 6].ChangesAddress())
return false; return false;
@ -9832,6 +9937,25 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
progress = true; progress = true;
} }
#endif #endif
else if (
mIns[i + 0].mType == ASMIT_STA &&
mIns[i + 1].mType == ASMIT_LDY && mIns[i + 0].SameEffectiveAddress(mIns[i + 1]))
{
mIns[i + 1].mType = ASMIT_TAY;
mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 0].mLive |= LIVE_CPU_REG_A;
progress = true;
}
else if (
mIns[i + 0].mType == ASMIT_STA &&
mIns[i + 1].mType == ASMIT_LDX && mIns[i + 0].SameEffectiveAddress(mIns[i + 1]))
{
mIns[i + 1].mType = ASMIT_TAX;
mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 0].mLive |= LIVE_CPU_REG_A;
progress = true;
}
else if ( else if (
mIns[i + 0].mType == ASMIT_TXA && mIns[i + 0].mType == ASMIT_TXA &&
mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE)) mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE))
@ -10323,6 +10447,17 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 3].mType = ASMIT_DEC; mIns[i + 3].mType = ASMIT_DEC;
progress = true; progress = true;
} }
else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) &&
mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 &&
(mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) &&
(mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0)
{
mIns[i + 0].mType = ASMIT_DEC;
mIns[i + 1].mType = ASMIT_NOP;
mIns[i + 2].mType = ASMIT_NOP;
mIns[i + 3].mType = ASMIT_LDA;
progress = true;
}
else if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && else if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) &&
mIns[i + 0].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 && mIns[i + 0].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 &&
(mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE) && (mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE) &&
@ -11201,7 +11336,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
} }
void NativeCodeProcedure::MapFastParamsToTemps(void) bool NativeCodeProcedure::MapFastParamsToTemps(void)
{ {
NumberSet used(256), modified(256), statics(256), pairs(256); NumberSet used(256), modified(256), statics(256), pairs(256);
@ -11213,7 +11348,7 @@ void NativeCodeProcedure::MapFastParamsToTemps(void)
for (int i = BC_REG_TMP; i < 256; i++) for (int i = BC_REG_TMP; i < 256; i++)
used -= i; used -= i;
for (int i = BC_REG_FPARAMS; i < BC_REG_FPARAMS + 8; i++) for (int i = BC_REG_FPARAMS; i < BC_REG_FPARAMS_END; i++)
if (!modified[i]) if (!modified[i])
statics += i; statics += i;
@ -11222,7 +11357,7 @@ void NativeCodeProcedure::MapFastParamsToTemps(void)
alias[i] = 0; alias[i] = 0;
ResetVisited(); ResetVisited();
mEntryBlock->FindZeroPageAlias(statics, used, alias); mEntryBlock->FindZeroPageAlias(statics, used, alias, -1);
for (int i = 1; i < 256; i++) for (int i = 1; i < 256; i++)
{ {
@ -11235,7 +11370,7 @@ void NativeCodeProcedure::MapFastParamsToTemps(void)
} }
ResetVisited(); ResetVisited();
mEntryBlock->RemapZeroPage(alias); return mEntryBlock->RemapZeroPage(alias);
} }
void NativeCodeProcedure::Optimize(void) void NativeCodeProcedure::Optimize(void)
@ -11243,7 +11378,7 @@ void NativeCodeProcedure::Optimize(void)
#if 1 #if 1
int step = 0; int step = 0;
bool changed; bool changed, xmapped = false, ymapped = false;
do do
{ {
changed = false; changed = false;
@ -11291,7 +11426,8 @@ void NativeCodeProcedure::Optimize(void)
if (step == 2) if (step == 2)
{ {
MapFastParamsToTemps(); if (MapFastParamsToTemps())
changed = true;
} }
if (step > 2) if (step > 2)
@ -11320,12 +11456,20 @@ void NativeCodeProcedure::Optimize(void)
xregs[BC_REG_WORK + i] = -1; xregs[BC_REG_WORK + i] = -1;
yregs[BC_REG_WORK + i] = -1; yregs[BC_REG_WORK + i] = -1;
} }
for (int i = 0; i < 8; i++)
if (!mInterProc->mLeafProcedure)
{ {
xregs[BC_REG_FPARAMS + i] = -1; for (int i = BC_REG_FPARAMS; i < BC_REG_FPARAMS_END; i++)
yregs[BC_REG_FPARAMS + i] = -1; {
xregs[i] = -1;
yregs[i] = -1;
}
} }
if (xmapped)
xregs[0] = -1;
if (ymapped)
yregs[0] = -1;
ResetVisited(); ResetVisited();
mEntryBlock->GlobalRegisterXYCheck(xregs, yregs); mEntryBlock->GlobalRegisterXYCheck(xregs, yregs);
@ -11339,7 +11483,10 @@ void NativeCodeProcedure::Optimize(void)
{ {
ResetVisited(); ResetVisited();
mEntryBlock->GlobalRegisterXMap(j); mEntryBlock->GlobalRegisterXMap(j);
if (j >= BC_REG_FPARAMS && j < BC_REG_FPARAMS_END)
mEntryBlock->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDX, ASMIM_ZERO_PAGE, j));
changed = true; changed = true;
xmapped = true;
} }
} }
@ -11353,7 +11500,10 @@ void NativeCodeProcedure::Optimize(void)
{ {
ResetVisited(); ResetVisited();
mEntryBlock->GlobalRegisterYMap(j); mEntryBlock->GlobalRegisterYMap(j);
if (j >= BC_REG_FPARAMS && j < BC_REG_FPARAMS_END)
mEntryBlock->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, j));
changed = true; changed = true;
ymapped = true;
} }
} }

View File

@ -201,8 +201,8 @@ public:
bool ApplyEntryDataSet(void); bool ApplyEntryDataSet(void);
void CollectZeroPageUsage(NumberSet& used, NumberSet& modified, NumberSet& pairs); void CollectZeroPageUsage(NumberSet& used, NumberSet& modified, NumberSet& pairs);
void FindZeroPageAlias(const NumberSet& statics, NumberSet& invalid, uint8* alias); void FindZeroPageAlias(const NumberSet& statics, NumberSet& invalid, uint8* alias, int accu);
void RemapZeroPage(const uint8* remap); bool RemapZeroPage(const uint8* remap);
void GlobalRegisterXYCheck(int* xregs, int * yregs); void GlobalRegisterXYCheck(int* xregs, int * yregs);
void GlobalRegisterXMap(int reg); void GlobalRegisterXMap(int reg);
@ -238,7 +238,7 @@ class NativeCodeProcedure
void CompileInterBlock(InterCodeProcedure* iproc, InterCodeBasicBlock* iblock, NativeCodeBasicBlock*block); void CompileInterBlock(InterCodeProcedure* iproc, InterCodeBasicBlock* iblock, NativeCodeBasicBlock*block);
void MapFastParamsToTemps(void); bool MapFastParamsToTemps(void);
void CompressTemporaries(void); void CompressTemporaries(void);
void BuildDataFlowSets(void); void BuildDataFlowSets(void);

View File

@ -75,7 +75,7 @@ int main(int argc, const char** argv)
DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath)); DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath));
#else #else
printf("Starting oscar64 1.1.46\n"); printf("Starting oscar64 1.1.47\n");
#ifdef __APPLE__ #ifdef __APPLE__
uint32_t length = sizeof(basePath); uint32_t length = sizeof(basePath);

View File

@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,1,46,0 FILEVERSION 1,1,47,0
PRODUCTVERSION 1,1,46,0 PRODUCTVERSION 1,1,47,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -43,12 +43,12 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "oscar64" VALUE "CompanyName", "oscar64"
VALUE "FileDescription", "oscar64 compiler" VALUE "FileDescription", "oscar64 compiler"
VALUE "FileVersion", "1.1.46.0" VALUE "FileVersion", "1.1.47.0"
VALUE "InternalName", "oscar64.exe" VALUE "InternalName", "oscar64.exe"
VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "LegalCopyright", "Copyright (C) 2021"
VALUE "OriginalFilename", "oscar64.exe" VALUE "OriginalFilename", "oscar64.exe"
VALUE "ProductName", "oscar64" VALUE "ProductName", "oscar64"
VALUE "ProductVersion", "1.1.46.0" VALUE "ProductVersion", "1.1.47.0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -14,6 +14,12 @@
"BackwardsCompatibleGUIDGeneration" = "8:TRUE" "BackwardsCompatibleGUIDGeneration" = "8:TRUE"
"Hierarchy" "Hierarchy"
{ {
"Entry"
{
"MsmKey" = "8:_03D7013B0D39A89CEA9D267005ADCE39"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry" "Entry"
{ {
"MsmKey" = "8:_0D8B657E4A954DBFAF14055CDFFB384C" "MsmKey" = "8:_0D8B657E4A954DBFAF14055CDFFB384C"
@ -40,6 +46,12 @@
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_2CA3A525072974368303677563606FFE"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_317711E6E48744A18655469B4C53767E" "MsmKey" = "8:_317711E6E48744A18655469B4C53767E"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
@ -58,6 +70,12 @@
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_3FA71395262A4AB4A1C2839FD6B91190"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_3FFD08277B804985BDF072C0C1877287" "MsmKey" = "8:_3FFD08277B804985BDF072C0C1877287"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
@ -82,6 +100,18 @@
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_777CE896BB0B3C09C1B5FB6CB3BFE84F"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_7A40466D5E5D2D3FD71213A0C0AA5075"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_7EA67552E0B34B9BA70152AD9E369EA6" "MsmKey" = "8:_7EA67552E0B34B9BA70152AD9E369EA6"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
@ -130,6 +160,12 @@
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_B2B920A649CF4027457BBAB004078A03"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_B4265CBF352343D2867DBCCE67D9F493" "MsmKey" = "8:_B4265CBF352343D2867DBCCE67D9F493"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
@ -148,12 +184,30 @@
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_CD97BB2D0A3349FD86EE0058561FB8A7"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_D0E45B48D76B4407B0BDE4378C1DB2C7" "MsmKey" = "8:_D0E45B48D76B4407B0BDE4378C1DB2C7"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_DC9FDF52011EB7C47318682BA0B3F26F"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_DE2BF7C92569053E7C3DCE88AB7E2566"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_E218D776D9014F99BE2B046AEF2D6E8B" "MsmKey" = "8:_E218D776D9014F99BE2B046AEF2D6E8B"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
@ -190,12 +244,24 @@
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_EA3C0BCB01F2639DFA2E37EC8436E5F6"
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_EDDED74E9AC24D9C8C7811F3A20ACA53" "MsmKey" = "8:_EDDED74E9AC24D9C8C7811F3A20ACA53"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_F35970F9D8FA46B09F36D7E9DE5532CA"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_F8F279E2317342BB8F6FD09FE8FE4EF5" "MsmKey" = "8:_F8F279E2317342BB8F6FD09FE8FE4EF5"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
@ -293,6 +359,26 @@
} }
"File" "File"
{ {
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_03D7013B0D39A89CEA9D267005ADCE39"
{
"SourcePath" = "8:VCRUNTIME140.dll"
"TargetName" = "8:VCRUNTIME140.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_0D8B657E4A954DBFAF14055CDFFB384C" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_0D8B657E4A954DBFAF14055CDFFB384C"
{ {
"SourcePath" = "8:..\\include\\crt.c" "SourcePath" = "8:..\\include\\crt.c"
@ -373,6 +459,26 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "IsolateTo" = "8:"
} }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2CA3A525072974368303677563606FFE"
{
"SourcePath" = "8:api-ms-win-crt-heap-l1-1-0.dll"
"TargetName" = "8:api-ms-win-crt-heap-l1-1-0.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_317711E6E48744A18655469B4C53767E" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_317711E6E48744A18655469B4C53767E"
{ {
"SourcePath" = "8:..\\include\\math.c" "SourcePath" = "8:..\\include\\math.c"
@ -433,6 +539,26 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "IsolateTo" = "8:"
} }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3FA71395262A4AB4A1C2839FD6B91190"
{
"SourcePath" = "8:api-ms-win-crt-stdio-l1-1-0.dll"
"TargetName" = "8:api-ms-win-crt-stdio-l1-1-0.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3FFD08277B804985BDF072C0C1877287" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3FFD08277B804985BDF072C0C1877287"
{ {
"SourcePath" = "8:..\\include\\assert.c" "SourcePath" = "8:..\\include\\assert.c"
@ -513,6 +639,46 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "IsolateTo" = "8:"
} }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_777CE896BB0B3C09C1B5FB6CB3BFE84F"
{
"SourcePath" = "8:api-ms-win-crt-filesystem-l1-1-0.dll"
"TargetName" = "8:api-ms-win-crt-filesystem-l1-1-0.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7A40466D5E5D2D3FD71213A0C0AA5075"
{
"SourcePath" = "8:api-ms-win-crt-locale-l1-1-0.dll"
"TargetName" = "8:api-ms-win-crt-locale-l1-1-0.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7EA67552E0B34B9BA70152AD9E369EA6" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7EA67552E0B34B9BA70152AD9E369EA6"
{ {
"SourcePath" = "8:..\\include\\c64\\joystick.h" "SourcePath" = "8:..\\include\\c64\\joystick.h"
@ -673,6 +839,26 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "IsolateTo" = "8:"
} }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B2B920A649CF4027457BBAB004078A03"
{
"SourcePath" = "8:api-ms-win-crt-math-l1-1-0.dll"
"TargetName" = "8:api-ms-win-crt-math-l1-1-0.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B4265CBF352343D2867DBCCE67D9F493" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B4265CBF352343D2867DBCCE67D9F493"
{ {
"SourcePath" = "8:..\\include\\c64\\joystick.c" "SourcePath" = "8:..\\include\\c64\\joystick.c"
@ -733,6 +919,26 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "IsolateTo" = "8:"
} }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CD97BB2D0A3349FD86EE0058561FB8A7"
{
"SourcePath" = "8:..\\include\\c64\\charwin.c"
"TargetName" = "8:charwin.c"
"Tag" = "8:"
"Folder" = "8:_247D4CAD3CB843B3A8A4DC2D90F47C28"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D0E45B48D76B4407B0BDE4378C1DB2C7" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D0E45B48D76B4407B0BDE4378C1DB2C7"
{ {
"SourcePath" = "8:..\\include\\stdlib.h" "SourcePath" = "8:..\\include\\stdlib.h"
@ -753,6 +959,46 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "IsolateTo" = "8:"
} }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DC9FDF52011EB7C47318682BA0B3F26F"
{
"SourcePath" = "8:api-ms-win-crt-string-l1-1-0.dll"
"TargetName" = "8:api-ms-win-crt-string-l1-1-0.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DE2BF7C92569053E7C3DCE88AB7E2566"
{
"SourcePath" = "8:api-ms-win-crt-runtime-l1-1-0.dll"
"TargetName" = "8:api-ms-win-crt-runtime-l1-1-0.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E218D776D9014F99BE2B046AEF2D6E8B" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E218D776D9014F99BE2B046AEF2D6E8B"
{ {
"SourcePath" = "8:..\\include\\stdlib.c" "SourcePath" = "8:..\\include\\stdlib.c"
@ -873,6 +1119,26 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "IsolateTo" = "8:"
} }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EA3C0BCB01F2639DFA2E37EC8436E5F6"
{
"SourcePath" = "8:VERSION.dll"
"TargetName" = "8:VERSION.dll"
"Tag" = "8:"
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EDDED74E9AC24D9C8C7811F3A20ACA53" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EDDED74E9AC24D9C8C7811F3A20ACA53"
{ {
"SourcePath" = "8:..\\include\\stdio.c" "SourcePath" = "8:..\\include\\stdio.c"
@ -893,6 +1159,26 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "IsolateTo" = "8:"
} }
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F35970F9D8FA46B09F36D7E9DE5532CA"
{
"SourcePath" = "8:..\\include\\c64\\charwin.h"
"TargetName" = "8:charwin.h"
"Tag" = "8:"
"Folder" = "8:_247D4CAD3CB843B3A8A4DC2D90F47C28"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F8F279E2317342BB8F6FD09FE8FE4EF5" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F8F279E2317342BB8F6FD09FE8FE4EF5"
{ {
"SourcePath" = "8:..\\include\\time.c" "SourcePath" = "8:..\\include\\time.c"
@ -1002,15 +1288,15 @@
{ {
"Name" = "8:Microsoft Visual Studio" "Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:oscar64" "ProductName" = "8:oscar64"
"ProductCode" = "8:{D9384A3A-0824-4B69-BB39-AD285E447E21}" "ProductCode" = "8:{EA556725-C618-4DCA-8731-FE0EF6CF6D7F}"
"PackageCode" = "8:{5A2AEDDB-CA52-4E07-AAED-2D8E2FB82314}" "PackageCode" = "8:{619DBA8C-9505-41A7-89E6-83338C010CCE}"
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
"AspNetVersion" = "8:2.0.50727.0" "AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE" "RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE" "RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE" "InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.1.46" "ProductVersion" = "8:1.1.47"
"Manufacturer" = "8:oscar64" "Manufacturer" = "8:oscar64"
"ARPHELPTELEPHONE" = "8:" "ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:" "ARPHELPLINK" = "8:"