From 4017cc386b638c4c634e0720091caff88ca51426 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Thu, 18 Nov 2021 14:57:43 +0100 Subject: [PATCH] Add charwin library and matching code generator optimizations --- include/c64/charwin.c | 505 +++++++++++++++++++++++++++++++ include/c64/charwin.h | 108 +++++++ include/crt.c | 2 + oscar64/ByteCodeGenerator.cpp | 59 +++- oscar64/Disassembler.cpp | 4 +- oscar64/GlobalAnalyzer.cpp | 6 +- oscar64/MachineTypes.cpp | 1 + oscar64/MachineTypes.h | 1 + oscar64/NativeCodeGenerator.cpp | 198 ++++++++++-- oscar64/NativeCodeGenerator.h | 6 +- oscar64/oscar64.cpp | 2 +- oscar64/oscar64.rc | 8 +- oscar64setup/oscar64setup.vdproj | 292 +++++++++++++++++- 13 files changed, 1151 insertions(+), 41 deletions(-) create mode 100644 include/c64/charwin.c create mode 100644 include/c64/charwin.h diff --git a/include/c64/charwin.c b/include/c64/charwin.c new file mode 100644 index 0000000..db41205 --- /dev/null +++ b/include/c64/charwin.c @@ -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; isx = 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; ywy; 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; ywy; y++) + { + for(char x=0; xwx; 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; ywy; y++) + { + for(char x=0; xwx; 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; isp + 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; ywy; 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; ywy; 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; ywy - 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; ywy - 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; ymEntryBlocks.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()) changed = true; if (mFalseJump && mFalseJump->JoinTailCodeSequences()) @@ -4359,7 +4369,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase) // assert(!(live & LIVE_ACCU)); - int accuTemp = -1, addrTemp = -1, accuVal = 0; + int accuTemp = -1, addrTemp = -1, accuVal = 0, accuTempByte = -1; bool accuConst = false; for (int i = 0; i < mIns.Size(); i++) @@ -4444,6 +4454,22 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase) mIns[i + 0].mCode = BC_NOP; 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 @@ -4790,6 +4816,12 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase) mIns[i + 1].mCode = BC_NOP; 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) { mIns[i].mRegister = BC_REG_ACCU; @@ -5005,6 +5037,19 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase) mIns[i + 1].mCode = BC_NOP; 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 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; 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 if (mIns[i].mCode == BC_ADDR_REG && mIns[i].mRegister == addrTemp) { @@ -5074,18 +5124,23 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase) if (mIns[i].ChangesAccu()) { accuTemp = -1; + accuTempByte = -1; accuConst = false; } if (mIns[i].ChangesAddr()) addrTemp = -1; if (accuTemp != -1 && mIns[i].ChangesRegister(accuTemp)) accuTemp = -1; + if (accuTempByte != -1 && mIns[i].ChangesRegister(accuTempByte)) + accuTempByte = -1; if (addrTemp != -1 && mIns[i].ChangesRegister(addrTemp)) 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) 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; if (mIns[i].mRegister == BC_REG_ACCU && !mIns[i].mRelocate) diff --git a/oscar64/Disassembler.cpp b/oscar64/Disassembler.cpp index 9cd7a47..fac686f 100644 --- a/oscar64/Disassembler.cpp +++ b/oscar64/Disassembler.cpp @@ -20,7 +20,7 @@ const char* ByteCodeDisassembler::TempName(uint8 tmp, char* buffer, InterCodePro return "ADDR"; else if (tmp == BC_REG_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); 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); 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); return buffer; diff --git a/oscar64/GlobalAnalyzer.cpp b/oscar64/GlobalAnalyzer.cpp index a7e7bce..a61ab66 100644 --- a/oscar64/GlobalAnalyzer.cpp +++ b/oscar64/GlobalAnalyzer.cpp @@ -129,7 +129,7 @@ void GlobalAnalyzer::AutoInline(void) dec = dec->mNext; } - if (nparams <= 8) + if (nparams <= BC_REG_FPARAMS_END - BC_REG_FPARAMS) { f->mBase->mFlags |= DTF_FASTCALL; #if 0 @@ -289,7 +289,9 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec) { if (ldec->mType == DT_VARIABLE) ldec->mFlags |= DTF_VAR_ALIASING; - } + } + else if (exp->mToken == TK_MUL) + return exp->mDecType; break; case EX_POSTFIX: break; diff --git a/oscar64/MachineTypes.cpp b/oscar64/MachineTypes.cpp index 5dfd0db..aeb3c71 100644 --- a/oscar64/MachineTypes.cpp +++ b/oscar64/MachineTypes.cpp @@ -3,6 +3,7 @@ uint8 BC_REG_WORK = 0x03; uint8 BC_REG_WORK_Y = 0x02; uint8 BC_REG_FPARAMS = 0x0d; +uint8 BC_REG_FPARAMS_END = 0x19; uint8 BC_REG_IP = 0x19; uint8 BC_REG_ACCU = 0x1b; diff --git a/oscar64/MachineTypes.h b/oscar64/MachineTypes.h index 026baab..59d2cbd 100644 --- a/oscar64/MachineTypes.h +++ b/oscar64/MachineTypes.h @@ -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_Y; extern uint8 BC_REG_FPARAMS; +extern uint8 BC_REG_FPARAMS_END; extern uint8 BC_REG_IP; extern uint8 BC_REG_ACCU; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index c1231bd..f3394f8 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -1498,6 +1498,31 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT } 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: 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; } -void NativeCodeBasicBlock::FindZeroPageAlias(const NumberSet& statics, NumberSet& invalid, uint8* alias) +void NativeCodeBasicBlock::FindZeroPageAlias(const NumberSet& statics, NumberSet& invalid, uint8* alias, int accu) { if (!mVisited) { mVisited = true; - int accu = -1; + if (mNumEntries > 1) + accu = -1; for (int i = 0; i < mIns.Size(); i++) { @@ -7400,9 +7426,9 @@ void NativeCodeBasicBlock::FindZeroPageAlias(const NumberSet& statics, NumberSet } if (mTrueJump) - mTrueJump->FindZeroPageAlias(statics, invalid, alias); + mTrueJump->FindZeroPageAlias(statics, invalid, alias, accu); 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.mMode = ASMIM_IMPLIED; 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.mMode = ASMIM_IMPLIED; 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++) { const NativeCodeInstruction& ins(mIns[i]); - if (ins.ChangesXReg()) - xregs[0] = -1; - if (ins.ChangesYReg()) - yregs[0] = -1; if (ins.mMode == ASMIM_ZERO_PAGE) { switch (ins.mType) @@ -7699,6 +7731,24 @@ void NativeCodeBasicBlock::GlobalRegisterXYCheck(int* xregs, int* yregs) if (xregs[ins.mAddress] >= 0) xregs[ins.mAddress]++; 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: 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) @@ -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) { mVisited = true; for (int i = 0; i < mIns.Size(); i++) { + int addr; + switch (mIns[i].mMode) { case ASMIM_ZERO_PAGE: 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; case ASMIM_ABSOLUTE: 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++) { - lo->mTemporaries[j] = remap[lo->mTemporaries[j]]; + addr = remap[lo->mTemporaries[j]]; + if (addr != lo->mTemporaries[j]) + { + lo->mTemporaries[j] = addr; + modified = true; + } } } break; } } - if (mTrueJump) - mTrueJump->RemapZeroPage(remap); - if (mFalseJump) - mFalseJump->RemapZeroPage(remap); + if (mTrueJump && mTrueJump->RemapZeroPage(remap)) + modified = true; + + if (mFalseJump && mFalseJump->RemapZeroPage(remap)) + modified = true; } + + return modified; } bool NativeCodeBasicBlock::SameTail(const NativeCodeInstruction& ins) const @@ -8094,6 +8168,37 @@ bool NativeCodeBasicBlock::FindAddressSumY(int at, int reg, int & apos, int& bre 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()) return false; @@ -9832,6 +9937,25 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass) progress = true; } #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 ( 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)) @@ -10323,6 +10447,17 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass) mIns[i + 3].mType = ASMIT_DEC; 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]) && 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) && @@ -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); @@ -11213,7 +11348,7 @@ void NativeCodeProcedure::MapFastParamsToTemps(void) for (int i = BC_REG_TMP; i < 256; 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]) statics += i; @@ -11222,7 +11357,7 @@ void NativeCodeProcedure::MapFastParamsToTemps(void) alias[i] = 0; ResetVisited(); - mEntryBlock->FindZeroPageAlias(statics, used, alias); + mEntryBlock->FindZeroPageAlias(statics, used, alias, -1); for (int i = 1; i < 256; i++) { @@ -11235,7 +11370,7 @@ void NativeCodeProcedure::MapFastParamsToTemps(void) } ResetVisited(); - mEntryBlock->RemapZeroPage(alias); + return mEntryBlock->RemapZeroPage(alias); } void NativeCodeProcedure::Optimize(void) @@ -11243,7 +11378,7 @@ void NativeCodeProcedure::Optimize(void) #if 1 int step = 0; - bool changed; + bool changed, xmapped = false, ymapped = false; do { changed = false; @@ -11291,7 +11426,8 @@ void NativeCodeProcedure::Optimize(void) if (step == 2) { - MapFastParamsToTemps(); + if (MapFastParamsToTemps()) + changed = true; } if (step > 2) @@ -11320,12 +11456,20 @@ void NativeCodeProcedure::Optimize(void) xregs[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; - yregs[BC_REG_FPARAMS + i] = -1; + for (int i = BC_REG_FPARAMS; i < BC_REG_FPARAMS_END; i++) + { + xregs[i] = -1; + yregs[i] = -1; + } } + if (xmapped) + xregs[0] = -1; + if (ymapped) + yregs[0] = -1; ResetVisited(); mEntryBlock->GlobalRegisterXYCheck(xregs, yregs); @@ -11339,7 +11483,10 @@ void NativeCodeProcedure::Optimize(void) { ResetVisited(); 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; + xmapped = true; } } @@ -11353,7 +11500,10 @@ void NativeCodeProcedure::Optimize(void) { ResetVisited(); 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; + ymapped = true; } } diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index 12e4b90..42c33fa 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -201,8 +201,8 @@ public: bool ApplyEntryDataSet(void); void CollectZeroPageUsage(NumberSet& used, NumberSet& modified, NumberSet& pairs); - void FindZeroPageAlias(const NumberSet& statics, NumberSet& invalid, uint8* alias); - void RemapZeroPage(const uint8* remap); + void FindZeroPageAlias(const NumberSet& statics, NumberSet& invalid, uint8* alias, int accu); + bool RemapZeroPage(const uint8* remap); void GlobalRegisterXYCheck(int* xregs, int * yregs); void GlobalRegisterXMap(int reg); @@ -238,7 +238,7 @@ class NativeCodeProcedure void CompileInterBlock(InterCodeProcedure* iproc, InterCodeBasicBlock* iblock, NativeCodeBasicBlock*block); - void MapFastParamsToTemps(void); + bool MapFastParamsToTemps(void); void CompressTemporaries(void); void BuildDataFlowSets(void); diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 1e05b59..a513a14 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -75,7 +75,7 @@ int main(int argc, const char** argv) DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath)); #else - printf("Starting oscar64 1.1.46\n"); + printf("Starting oscar64 1.1.47\n"); #ifdef __APPLE__ uint32_t length = sizeof(basePath); diff --git a/oscar64/oscar64.rc b/oscar64/oscar64.rc index 3a9ced3..76363a5 100644 --- a/oscar64/oscar64.rc +++ b/oscar64/oscar64.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,1,46,0 - PRODUCTVERSION 1,1,46,0 + FILEVERSION 1,1,47,0 + PRODUCTVERSION 1,1,47,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,12 +43,12 @@ BEGIN BEGIN VALUE "CompanyName", "oscar64" VALUE "FileDescription", "oscar64 compiler" - VALUE "FileVersion", "1.1.46.0" + VALUE "FileVersion", "1.1.47.0" VALUE "InternalName", "oscar64.exe" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "oscar64.exe" VALUE "ProductName", "oscar64" - VALUE "ProductVersion", "1.1.46.0" + VALUE "ProductVersion", "1.1.47.0" END END BLOCK "VarFileInfo" diff --git a/oscar64setup/oscar64setup.vdproj b/oscar64setup/oscar64setup.vdproj index 00634b4..5eef267 100644 --- a/oscar64setup/oscar64setup.vdproj +++ b/oscar64setup/oscar64setup.vdproj @@ -14,6 +14,12 @@ "BackwardsCompatibleGUIDGeneration" = "8:TRUE" "Hierarchy" { + "Entry" + { + "MsmKey" = "8:_03D7013B0D39A89CEA9D267005ADCE39" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } "Entry" { "MsmKey" = "8:_0D8B657E4A954DBFAF14055CDFFB384C" @@ -40,6 +46,12 @@ } "Entry" { + "MsmKey" = "8:_2CA3A525072974368303677563606FFE" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_317711E6E48744A18655469B4C53767E" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -58,6 +70,12 @@ } "Entry" { + "MsmKey" = "8:_3FA71395262A4AB4A1C2839FD6B91190" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_3FFD08277B804985BDF072C0C1877287" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -82,6 +100,18 @@ } "Entry" { + "MsmKey" = "8:_777CE896BB0B3C09C1B5FB6CB3BFE84F" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_7A40466D5E5D2D3FD71213A0C0AA5075" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_7EA67552E0B34B9BA70152AD9E369EA6" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -130,6 +160,12 @@ } "Entry" { + "MsmKey" = "8:_B2B920A649CF4027457BBAB004078A03" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_B4265CBF352343D2867DBCCE67D9F493" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -148,12 +184,30 @@ } "Entry" { + "MsmKey" = "8:_CD97BB2D0A3349FD86EE0058561FB8A7" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_D0E45B48D76B4407B0BDE4378C1DB2C7" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { + "MsmKey" = "8:_DC9FDF52011EB7C47318682BA0B3F26F" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DE2BF7C92569053E7C3DCE88AB7E2566" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_E218D776D9014F99BE2B046AEF2D6E8B" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -190,12 +244,24 @@ } "Entry" { + "MsmKey" = "8:_EA3C0BCB01F2639DFA2E37EC8436E5F6" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_EDDED74E9AC24D9C8C7811F3A20ACA53" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { + "MsmKey" = "8:_F35970F9D8FA46B09F36D7E9DE5532CA" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_F8F279E2317342BB8F6FD09FE8FE4EF5" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -293,6 +359,26 @@ } "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" { "SourcePath" = "8:..\\include\\crt.c" @@ -373,6 +459,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\math.c" @@ -433,6 +539,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\assert.c" @@ -513,6 +639,46 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\c64\\joystick.h" @@ -673,6 +839,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\c64\\joystick.c" @@ -733,6 +919,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\stdlib.h" @@ -753,6 +959,46 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\stdlib.c" @@ -873,6 +1119,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\stdio.c" @@ -893,6 +1159,26 @@ "IsDependency" = "11:FALSE" "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" { "SourcePath" = "8:..\\include\\time.c" @@ -1002,15 +1288,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:oscar64" - "ProductCode" = "8:{D9384A3A-0824-4B69-BB39-AD285E447E21}" - "PackageCode" = "8:{5A2AEDDB-CA52-4E07-AAED-2D8E2FB82314}" + "ProductCode" = "8:{EA556725-C618-4DCA-8731-FE0EF6CF6D7F}" + "PackageCode" = "8:{619DBA8C-9505-41A7-89E6-83338C010CCE}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.1.46" + "ProductVersion" = "8:1.1.47" "Manufacturer" = "8:oscar64" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:"