Fix placement of sections in cartridges at other locations than start
This commit is contained in:
parent
ca93f107c3
commit
5a8dbfea60
|
@ -349,7 +349,7 @@ void Linker::Link(void)
|
||||||
else if (obj->mRegion->mCartridge >= 0)
|
else if (obj->mRegion->mCartridge >= 0)
|
||||||
{
|
{
|
||||||
mCartridgeBankUsed[obj->mRegion->mCartridge] = true;
|
mCartridgeBankUsed[obj->mRegion->mCartridge] = true;
|
||||||
memcpy(mCartridge[obj->mRegion->mCartridge] + obj->mAddress - obj->mRegion->mStart, obj->mData, obj->mSize);
|
memcpy(mCartridge[obj->mRegion->mCartridge] + obj->mAddress - 0x8000, obj->mData, obj->mSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -374,7 +374,7 @@ void Linker::Link(void)
|
||||||
if (obj->mRegion->mCartridge < 0)
|
if (obj->mRegion->mCartridge < 0)
|
||||||
dp = mMemory + obj->mAddress + ref->mOffset;
|
dp = mMemory + obj->mAddress + ref->mOffset;
|
||||||
else
|
else
|
||||||
dp = mCartridge[obj->mRegion->mCartridge] + obj->mAddress - obj->mRegion->mStart + ref->mOffset;
|
dp = mCartridge[obj->mRegion->mCartridge] + obj->mAddress - 0x8000 + ref->mOffset;
|
||||||
|
|
||||||
if (ref->mFlags & LREF_LOWBYTE)
|
if (ref->mFlags & LREF_LOWBYTE)
|
||||||
*dp++ = raddr & 0xff;
|
*dp++ = raddr & 0xff;
|
||||||
|
@ -637,7 +637,7 @@ bool Linker::WriteAsmFile(const char* filename)
|
||||||
if (obj->mRegion->mCartridge < 0)
|
if (obj->mRegion->mCartridge < 0)
|
||||||
mNativeDisassembler.Disassemble(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this);
|
mNativeDisassembler.Disassemble(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this);
|
||||||
else
|
else
|
||||||
mNativeDisassembler.Disassemble(file, mCartridge[obj->mRegion->mCartridge] - obj->mRegion->mStart, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this);
|
mNativeDisassembler.Disassemble(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,24 @@ void NativeRegisterData::Reset(void)
|
||||||
mValue = GlobalValueNumber++;
|
mValue = GlobalValueNumber++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NativeRegisterData::SameData(const NativeRegisterData& d) const
|
||||||
|
{
|
||||||
|
if (mMode != d.mMode)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (mMode)
|
||||||
|
{
|
||||||
|
case NRDM_IMMEDIATE:
|
||||||
|
case NRDM_ZERO_PAGE:
|
||||||
|
return mValue == d.mValue;
|
||||||
|
case NRDM_IMMEDIATE_ADDRESS:
|
||||||
|
case NRDM_ABSOLUTE:
|
||||||
|
return mValue == d.mValue && mLinkerObject == d.mLinkerObject && mFlags == d.mFlags;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void NativeRegisterDataSet::Reset(void)
|
void NativeRegisterDataSet::Reset(void)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < NUM_REGS; i++)
|
for (int i = 0; i < NUM_REGS; i++)
|
||||||
|
@ -2005,6 +2023,12 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
mMode = ASMIM_IMMEDIATE_ADDRESS;
|
mMode = ASMIM_IMMEDIATE_ADDRESS;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
else if (data.mRegs[mAddress].SameData(data.mRegs[CPU_REG_A]))
|
||||||
|
{
|
||||||
|
mType = ASMIT_NOP;
|
||||||
|
mMode = ASMIM_IMPLIED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
else if (data.mRegs[mAddress].mMode == NRDM_ZERO_PAGE)
|
else if (data.mRegs[mAddress].mMode == NRDM_ZERO_PAGE)
|
||||||
{
|
{
|
||||||
data.mRegs[CPU_REG_A] = data.mRegs[mAddress];
|
data.mRegs[CPU_REG_A] = data.mRegs[mAddress];
|
||||||
|
@ -2064,6 +2088,13 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
data.mRegs[CPU_REG_X] = data.mRegs[CPU_REG_A];
|
data.mRegs[CPU_REG_X] = data.mRegs[CPU_REG_A];
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
else if (data.mRegs[mAddress].SameData(data.mRegs[CPU_REG_A]))
|
||||||
|
{
|
||||||
|
mType = ASMIT_TAX;
|
||||||
|
mMode = ASMIM_IMPLIED;
|
||||||
|
data.mRegs[CPU_REG_X] = data.mRegs[CPU_REG_A];
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
#if 1
|
#if 1
|
||||||
else if (data.mRegs[mAddress].mMode == NRDM_ZERO_PAGE)
|
else if (data.mRegs[mAddress].mMode == NRDM_ZERO_PAGE)
|
||||||
{
|
{
|
||||||
|
@ -2109,6 +2140,13 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
data.mRegs[CPU_REG_Y] = data.mRegs[CPU_REG_A];
|
data.mRegs[CPU_REG_Y] = data.mRegs[CPU_REG_A];
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
else if (data.mRegs[mAddress].SameData(data.mRegs[CPU_REG_A]))
|
||||||
|
{
|
||||||
|
mType = ASMIT_TAY;
|
||||||
|
mMode = ASMIM_IMPLIED;
|
||||||
|
data.mRegs[CPU_REG_Y] = data.mRegs[CPU_REG_A];
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
#if 1
|
#if 1
|
||||||
else if (data.mRegs[mAddress].mMode == NRDM_ZERO_PAGE)
|
else if (data.mRegs[mAddress].mMode == NRDM_ZERO_PAGE)
|
||||||
{
|
{
|
||||||
|
@ -2261,6 +2299,7 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
data.mRegs[CPU_REG_A].mMode = NRDM_ABSOLUTE;
|
data.mRegs[CPU_REG_A].mMode = NRDM_ABSOLUTE;
|
||||||
data.mRegs[CPU_REG_A].mLinkerObject = mLinkerObject;
|
data.mRegs[CPU_REG_A].mLinkerObject = mLinkerObject;
|
||||||
data.mRegs[CPU_REG_A].mValue = mAddress;
|
data.mRegs[CPU_REG_A].mValue = mAddress;
|
||||||
|
data.mRegs[CPU_REG_A].mFlags = mFlags;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -9486,6 +9525,43 @@ bool NativeCodeBasicBlock::FindGlobalAddressSumY(int at, int reg, bool direct, i
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NativeCodeBasicBlock::JoinTAXARange(int from, int to)
|
||||||
|
{
|
||||||
|
int start = from;
|
||||||
|
if (from >= 2)
|
||||||
|
{
|
||||||
|
start = from - 2;
|
||||||
|
if (mIns[start].mType == ASMIT_LDA && mIns[start].mMode == ASMIM_ZERO_PAGE && mIns[start + 1].mType == ASMIT_AND && mIns[start + 1].mMode == ASMIM_IMMEDIATE)
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int i = from + 1; i < to; i++)
|
||||||
|
{
|
||||||
|
if (mIns[i].mMode == ASMIM_ZERO_PAGE && mIns[i].mAddress == mIns[start].mAddress && mIns[i].ChangesAddress())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
mIns.Remove(to);
|
||||||
|
for (int i = start; i < from; i++)
|
||||||
|
{
|
||||||
|
mIns.Insert(to, mIns[start]);
|
||||||
|
mIns.Remove(start);
|
||||||
|
}
|
||||||
|
mIns.Remove(start);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NativeCodeBasicBlock::JoinTAYARange(int from, int to)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool NativeCodeBasicBlock::PatchGlobalAdressSumYByX(int at, int reg, const NativeCodeInstruction& ains, int addr)
|
bool NativeCodeBasicBlock::PatchGlobalAdressSumYByX(int at, int reg, const NativeCodeInstruction& ains, int addr)
|
||||||
{
|
{
|
||||||
int yindex = 0;
|
int yindex = 0;
|
||||||
|
@ -12290,6 +12366,55 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int taxPos = -1, tayPos = -1;
|
||||||
|
for (int i = 0; i < mIns.Size(); i++)
|
||||||
|
{
|
||||||
|
if (mIns[i].mType == ASMIT_TAX)
|
||||||
|
{
|
||||||
|
if (!(mIns[i].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z | LIVE_CPU_REG_C)))
|
||||||
|
taxPos = i;
|
||||||
|
else
|
||||||
|
taxPos = -1;
|
||||||
|
}
|
||||||
|
else if (mIns[i].mType == ASMIT_TAY)
|
||||||
|
{
|
||||||
|
if (!(mIns[i].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z | LIVE_CPU_REG_C)))
|
||||||
|
tayPos = i;
|
||||||
|
else
|
||||||
|
tayPos = -1;
|
||||||
|
}
|
||||||
|
else if (mIns[i].ChangesXReg())
|
||||||
|
taxPos = -1;
|
||||||
|
else if (mIns[i].ChangesYReg())
|
||||||
|
tayPos = -1;
|
||||||
|
else if (mIns[i].mType == ASMIT_TXA)
|
||||||
|
{
|
||||||
|
if (!(mIns[i].mLive & (LIVE_CPU_REG_X | LIVE_CPU_REG_Z)))
|
||||||
|
{
|
||||||
|
if (JoinTAXARange(taxPos, i))
|
||||||
|
changed = true;
|
||||||
|
taxPos = -1; tayPos = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
taxPos = -1;
|
||||||
|
}
|
||||||
|
else if (mIns[i].mType == ASMIT_TYA)
|
||||||
|
{
|
||||||
|
if (!(mIns[i].mLive & (LIVE_CPU_REG_Y | LIVE_CPU_REG_Z)))
|
||||||
|
{
|
||||||
|
if (JoinTAYARange(tayPos, i))
|
||||||
|
changed = true;
|
||||||
|
taxPos = -1; tayPos = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
taxPos = -1;
|
||||||
|
}
|
||||||
|
else if (mIns[i].RequiresXReg())
|
||||||
|
taxPos = -1;
|
||||||
|
else if (mIns[i].RequiresYReg())
|
||||||
|
tayPos = -1;
|
||||||
|
}
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (pass > 1)
|
if (pass > 1)
|
||||||
{
|
{
|
||||||
|
@ -13875,6 +14000,70 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
||||||
mIns[i + 3].mMode = ASMIM_IMPLIED;
|
mIns[i + 3].mMode = ASMIM_IMPLIED;
|
||||||
progress = true;
|
progress = true;
|
||||||
}
|
}
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_TXA &&
|
||||||
|
mIns[i + 1].mType == ASMIT_CLC &&
|
||||||
|
mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 &&
|
||||||
|
mIns[i + 3].mType == ASMIT_STA && (mIns[i + 3].mMode == ASMIM_ZERO_PAGE || mIns[i + 3].mMode == ASMIM_ABSOLUTE) &&
|
||||||
|
!(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_X | LIVE_CPU_REG_C)))
|
||||||
|
{
|
||||||
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
||||||
|
mIns[i + 1].mType = ASMIT_INX; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
if (mIns[i + 2].mAddress == 2)
|
||||||
|
mIns[i + 2].mType = ASMIT_INX;
|
||||||
|
else
|
||||||
|
mIns[i + 3].mType = ASMIT_NOP;
|
||||||
|
mIns[i + 3].mType = ASMIT_STX;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_TXA &&
|
||||||
|
mIns[i + 1].mType == ASMIT_SEC &&
|
||||||
|
mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 &&
|
||||||
|
mIns[i + 3].mType == ASMIT_STA && (mIns[i + 3].mMode == ASMIM_ZERO_PAGE || mIns[i + 3].mMode == ASMIM_ABSOLUTE) &&
|
||||||
|
!(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_X | LIVE_CPU_REG_C)))
|
||||||
|
{
|
||||||
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
||||||
|
mIns[i + 1].mType = ASMIT_DEX; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
if (mIns[i + 2].mAddress == 2)
|
||||||
|
mIns[i + 2].mType = ASMIT_DEX;
|
||||||
|
else
|
||||||
|
mIns[i + 3].mType = ASMIT_NOP;
|
||||||
|
mIns[i + 3].mType = ASMIT_STX;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_TYA &&
|
||||||
|
mIns[i + 1].mType == ASMIT_CLC &&
|
||||||
|
mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 &&
|
||||||
|
mIns[i + 3].mType == ASMIT_STA && (mIns[i + 3].mMode == ASMIM_ZERO_PAGE || mIns[i + 3].mMode == ASMIM_ABSOLUTE) &&
|
||||||
|
!(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Y | LIVE_CPU_REG_C)))
|
||||||
|
{
|
||||||
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
||||||
|
mIns[i + 1].mType = ASMIT_INY; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
if (mIns[i + 2].mAddress == 2)
|
||||||
|
mIns[i + 2].mType = ASMIT_INY;
|
||||||
|
else
|
||||||
|
mIns[i + 3].mType = ASMIT_NOP;
|
||||||
|
mIns[i + 3].mType = ASMIT_STY;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_TYA &&
|
||||||
|
mIns[i + 1].mType == ASMIT_SEC &&
|
||||||
|
mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 &&
|
||||||
|
mIns[i + 3].mType == ASMIT_STA && (mIns[i + 3].mMode == ASMIM_ZERO_PAGE || mIns[i + 3].mMode == ASMIM_ABSOLUTE) &&
|
||||||
|
!(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Y | LIVE_CPU_REG_C)))
|
||||||
|
{
|
||||||
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
||||||
|
mIns[i + 1].mType = ASMIT_DEY; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
if (mIns[i + 2].mAddress == 2)
|
||||||
|
mIns[i + 2].mType = ASMIT_DEY;
|
||||||
|
else
|
||||||
|
mIns[i + 3].mType = ASMIT_NOP;
|
||||||
|
mIns[i + 3].mType = ASMIT_STY;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
|
||||||
else if (
|
else if (
|
||||||
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
||||||
|
|
|
@ -27,6 +27,8 @@ struct NativeRegisterData
|
||||||
NativeRegisterData(void);
|
NativeRegisterData(void);
|
||||||
|
|
||||||
void Reset(void);
|
void Reset(void);
|
||||||
|
|
||||||
|
bool SameData(const NativeRegisterData& d) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NativeRegisterDataSet
|
struct NativeRegisterDataSet
|
||||||
|
@ -222,6 +224,8 @@ public:
|
||||||
bool MoveAddHighByteDown(int at);
|
bool MoveAddHighByteDown(int at);
|
||||||
bool ReverseLoadCommutativeOpUp(int aload, int aop);
|
bool ReverseLoadCommutativeOpUp(int aload, int aop);
|
||||||
|
|
||||||
|
bool JoinTAXARange(int from, int to);
|
||||||
|
bool JoinTAYARange(int from, int to);
|
||||||
bool PatchGlobalAdressSumYByX(int at, int reg, const NativeCodeInstruction& ains, int addr);
|
bool PatchGlobalAdressSumYByX(int at, int reg, const NativeCodeInstruction& ains, int addr);
|
||||||
|
|
||||||
bool ValueForwarding(const NativeRegisterDataSet& data, bool global);
|
bool ValueForwarding(const NativeRegisterDataSet& data, bool global);
|
||||||
|
|
|
@ -73,7 +73,7 @@ int main(int argc, const char** argv)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
strcpy(strProductName, "oscar64");
|
strcpy(strProductName, "oscar64");
|
||||||
strcpy(strProductVersion, "1.2.64");
|
strcpy(strProductVersion, "1.2.65");
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
uint32_t length = sizeof(basePath);
|
uint32_t length = sizeof(basePath);
|
||||||
|
|
|
@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,2,64,0
|
FILEVERSION 1,2,65,0
|
||||||
PRODUCTVERSION 1,2,64,0
|
PRODUCTVERSION 1,2,65,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.2.64.0"
|
VALUE "FileVersion", "1.2.65.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.2.64.0"
|
VALUE "ProductVersion", "1.2.65.0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -3169,15 +3169,15 @@
|
||||||
{
|
{
|
||||||
"Name" = "8:Microsoft Visual Studio"
|
"Name" = "8:Microsoft Visual Studio"
|
||||||
"ProductName" = "8:oscar64"
|
"ProductName" = "8:oscar64"
|
||||||
"ProductCode" = "8:{1260D4CA-BF60-4790-8BCD-CBF821D925A6}"
|
"ProductCode" = "8:{0FB2DB6E-9367-4974-9A50-08F7ACC08077}"
|
||||||
"PackageCode" = "8:{D10B71B9-5CF7-4BB4-818F-66EE5EC3965C}"
|
"PackageCode" = "8:{5D22AE55-B504-4AAB-9129-C8AAB71ECD3C}"
|
||||||
"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.2.64"
|
"ProductVersion" = "8:1.2.65"
|
||||||
"Manufacturer" = "8:oscar64"
|
"Manufacturer" = "8:oscar64"
|
||||||
"ARPHELPTELEPHONE" = "8:"
|
"ARPHELPTELEPHONE" = "8:"
|
||||||
"ARPHELPLINK" = "8:"
|
"ARPHELPLINK" = "8:"
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue