From 05387498c0f515d2374258161178e3262fd32d76 Mon Sep 17 00:00:00 2001 From: Dimitris Panokostas Date: Mon, 18 Sep 2017 12:54:23 +0200 Subject: [PATCH] WIP - Cleanup after merge #1 --- VSLinux/Amiberry.vcxproj | 13 +- VSLinux/Amiberry.vcxproj.filters | 15 +- VisualGDB/Amiberry/Amiberry.vcxproj | 13 +- VisualGDB/Amiberry/Amiberry.vcxproj.filters | 15 +- data/joystick.bmp | Bin 76854 -> 0 bytes data/mouse.bmp | Bin 76854 -> 0 bytes data/remapping.bmp | Bin 76854 -> 0 bytes src/archivers/7z/7zDec.cpp | 6 +- src/archivers/7z/7zDecode.cpp | 412 ++++++++++---------- src/archivers/7z/7zExtract.cpp | 2 +- src/archivers/7z/7zHeader.h | 2 +- src/archivers/7z/7zItem.h | 2 +- src/archivers/7z/7zStream.cpp | 6 +- src/archivers/7z/CpuArch.c | 6 +- src/archivers/7z/CpuArch.h | 2 +- src/archivers/7z/RotateDefs.h | 2 +- src/archivers/7z/Threads.c | 4 +- src/archivers/7z/Types.h | 6 +- src/archivers/mp2/kjmp2.cpp | 2 +- src/guisan/include/guisan/exception.hpp | 4 +- src/guisan/include/guisan/platform.hpp | 4 +- src/include/ar.h | 75 ++++ src/include/sysdeps.h | 4 +- src/main.cpp | 78 +--- src/threaddep/thread.h | 11 +- 25 files changed, 325 insertions(+), 359 deletions(-) delete mode 100644 data/joystick.bmp delete mode 100644 data/mouse.bmp delete mode 100644 data/remapping.bmp create mode 100644 src/include/ar.h diff --git a/VSLinux/Amiberry.vcxproj b/VSLinux/Amiberry.vcxproj index 68e75d61..5cbee7c7 100644 --- a/VSLinux/Amiberry.vcxproj +++ b/VSLinux/Amiberry.vcxproj @@ -104,25 +104,16 @@ true - - true - true true - - true - true - - true - true @@ -134,9 +125,6 @@ - - true - true @@ -527,6 +515,7 @@ + diff --git a/VSLinux/Amiberry.vcxproj.filters b/VSLinux/Amiberry.vcxproj.filters index a38e4918..2886bc28 100644 --- a/VSLinux/Amiberry.vcxproj.filters +++ b/VSLinux/Amiberry.vcxproj.filters @@ -110,24 +110,15 @@ data - - data - data data - - data - data - - data - data @@ -148,9 +139,6 @@ - - data - data @@ -1241,6 +1229,9 @@ src\archivers\mp2 + + src\include + diff --git a/VisualGDB/Amiberry/Amiberry.vcxproj b/VisualGDB/Amiberry/Amiberry.vcxproj index 96cdc56e..5ba6bbe8 100644 --- a/VisualGDB/Amiberry/Amiberry.vcxproj +++ b/VisualGDB/Amiberry/Amiberry.vcxproj @@ -344,25 +344,16 @@ true - - true - true true - - true - true - - true - true @@ -374,9 +365,6 @@ - - true - true @@ -499,6 +487,7 @@ + diff --git a/VisualGDB/Amiberry/Amiberry.vcxproj.filters b/VisualGDB/Amiberry/Amiberry.vcxproj.filters index 8eab10b1..1381738d 100644 --- a/VisualGDB/Amiberry/Amiberry.vcxproj.filters +++ b/VisualGDB/Amiberry/Amiberry.vcxproj.filters @@ -731,24 +731,15 @@ Resource files\data - - Resource files\data - Resource files\data Resource files\data - - Resource files\data - Resource files\data - - Resource files\data - Resource files\data @@ -769,9 +760,6 @@ - - Resource files\data - Resource files\data @@ -1440,6 +1428,9 @@ Header files\archivers\mp2 + + Header files\include + diff --git a/data/joystick.bmp b/data/joystick.bmp deleted file mode 100644 index 0c12ad1375c53556d003eff5e54364b7bf2ef69a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76854 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 diff --git a/data/mouse.bmp b/data/mouse.bmp deleted file mode 100644 index f94c39e0be02741de4ab9b5ef79f4b72413b63db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76854 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
Dw;(IGuwoMP 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 diff --git a/data/remapping.bmp b/data/remapping.bmp deleted file mode 100644 index e791c2aa28e03e2d294d998ae1d7852eddb1cb72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76854 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 inSize) lookahead = (size_t)inSize; - res = inStream->Look((void *)inStream, (const void **)&inBuf, &lookahead); + res = inStream->Look((void *)inStream, (void **)&inBuf, &lookahead); if (res != SZ_OK) break; @@ -192,7 +192,7 @@ static SRes SzDecodeLzma2(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inS size_t lookahead = (1 << 18); if (lookahead > inSize) lookahead = (size_t)inSize; - res = inStream->Look((void *)inStream, (const void **)&inBuf, &lookahead); + res = inStream->Look((void *)inStream, (void **)&inBuf, &lookahead); if (res != SZ_OK) break; @@ -229,7 +229,7 @@ static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer size_t curSize = (1 << 18); if (curSize > inSize) curSize = (size_t)inSize; - RINOK(inStream->Look((void *)inStream, (const void **)&inBuf, &curSize)); + RINOK(inStream->Look((void *)inStream, (void **)&inBuf, &curSize)); if (curSize == 0) return SZ_ERROR_INPUT_EOF; memcpy(outBuffer, inBuf, curSize); diff --git a/src/archivers/7z/7zDecode.cpp b/src/archivers/7z/7zDecode.cpp index 02526f0e..f18ea9a4 100644 --- a/src/archivers/7z/7zDecode.cpp +++ b/src/archivers/7z/7zDecode.cpp @@ -3,9 +3,9 @@ #include -#include "../../Bcj2.h" -#include "../../Bra.h" -#include "../../LzmaDec.h" +#include "Bcj2.h" +#include "Bra.h" +#include "LzmaDec.h" #include "7zDecode.h" #define k_Copy 0 @@ -20,235 +20,235 @@ static SRes SzDecodeLzma(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inSt SRes res = SZ_OK; LzmaDec_Construct(&state); - RINOK(LzmaDec_AllocateProbs(&state, coder->Props.data, (unsigned)coder->Props.size, allocMain)); + RINOK(LzmaDec_AllocateProbs(&state, coder->Props.data, unsigned(coder->Props.size), allocMain)); state.dic = outBuffer; state.dicBufSize = outSize; LzmaDec_Init(&state); for (;;) { - Byte *inBuf = NULL; + Byte *inBuf = nullptr; size_t lookahead = (1 << 18); if (lookahead > inSize) - lookahead = (size_t)inSize; + lookahead = size_t(inSize); res = inStream->Look((void *)inStream, (void **)&inBuf, &lookahead); if (res != SZ_OK) - break; + break; { - SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos; - ELzmaStatus status; - res = LzmaDec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status); - lookahead -= inProcessed; - inSize -= inProcessed; - if (res != SZ_OK) - break; - if (state.dicPos == state.dicBufSize || (inProcessed == 0 && dicPos == state.dicPos)) - { - if (state.dicBufSize != outSize || lookahead != 0 || - (status != LZMA_STATUS_FINISHED_WITH_MARK && - status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)) - res = SZ_ERROR_DATA; - break; - } - res = inStream->Skip((void *)inStream, inProcessed); - if (res != SZ_OK) - break; + SizeT inProcessed = SizeT(lookahead), dicPos = state.dicPos; + ELzmaStatus status; + res = LzmaDec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status); + lookahead -= inProcessed; + inSize -= inProcessed; + if (res != SZ_OK) + break; + if (state.dicPos == state.dicBufSize || (inProcessed == 0 && dicPos == state.dicPos)) + { + if (state.dicBufSize != outSize || lookahead != 0 || + (status != LZMA_STATUS_FINISHED_WITH_MARK && + status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)) + res = SZ_ERROR_DATA; + break; + } + res = inStream->Skip((void *)inStream, inProcessed); + if (res != SZ_OK) + break; + } } - } - LzmaDec_FreeProbs(&state, allocMain); - return res; -} + LzmaDec_FreeProbs(&state, allocMain); + return res; + } -static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer) -{ - while (inSize > 0) - { - void *inBuf; - size_t curSize = (1 << 18); - if (curSize > inSize) - curSize = (size_t)inSize; - RINOK(inStream->Look((void *)inStream, (void **)&inBuf, &curSize)); - if (curSize == 0) - return SZ_ERROR_INPUT_EOF; - memcpy(outBuffer, inBuf, curSize); - outBuffer += curSize; - inSize -= curSize; - RINOK(inStream->Skip((void *)inStream, curSize)); - } - return SZ_OK; -} + static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer) + { + while (inSize > 0) + { + void *inBuf; + size_t curSize = (1 << 18); + if (curSize > inSize) + curSize = size_t(inSize); + RINOK(inStream->Look((void *)inStream, (void **)&inBuf, &curSize)); + if (curSize == 0) + return SZ_ERROR_INPUT_EOF; + memcpy(outBuffer, inBuf, curSize); + outBuffer += curSize; + inSize -= curSize; + RINOK(inStream->Skip((void *)inStream, curSize)); + } + return SZ_OK; + } #define IS_UNSUPPORTED_METHOD(m) ((m) != k_Copy && (m) != k_LZMA) #define IS_UNSUPPORTED_CODER(c) (IS_UNSUPPORTED_METHOD(c.MethodID) || c.NumInStreams != 1 || c.NumOutStreams != 1) #define IS_NO_BCJ(c) (c.MethodID != k_BCJ || c.NumInStreams != 1 || c.NumOutStreams != 1) #define IS_NO_BCJ2(c) (c.MethodID != k_BCJ2 || c.NumInStreams != 4 || c.NumOutStreams != 1) -SRes CheckSupportedFolder(const CSzFolder *f) -{ - if (f->NumCoders < 1 || f->NumCoders > 4) - return SZ_ERROR_UNSUPPORTED; - if (IS_UNSUPPORTED_CODER(f->Coders[0])) - return SZ_ERROR_UNSUPPORTED; - if (f->NumCoders == 1) - { - if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBindPairs != 0) - return SZ_ERROR_UNSUPPORTED; - return SZ_OK; - } - if (f->NumCoders == 2) - { - if (IS_NO_BCJ(f->Coders[1]) || - f->NumPackStreams != 1 || f->PackStreams[0] != 0 || - f->NumBindPairs != 1 || - f->BindPairs[0].InIndex != 1 || f->BindPairs[0].OutIndex != 0) - return SZ_ERROR_UNSUPPORTED; - return SZ_OK; - } - if (f->NumCoders == 4) - { - if (IS_UNSUPPORTED_CODER(f->Coders[1]) || - IS_UNSUPPORTED_CODER(f->Coders[2]) || - IS_NO_BCJ2(f->Coders[3])) - return SZ_ERROR_UNSUPPORTED; - if (f->NumPackStreams != 4 || - f->PackStreams[0] != 2 || - f->PackStreams[1] != 6 || - f->PackStreams[2] != 1 || - f->PackStreams[3] != 0 || - f->NumBindPairs != 3 || - f->BindPairs[0].InIndex != 5 || f->BindPairs[0].OutIndex != 0 || - f->BindPairs[1].InIndex != 4 || f->BindPairs[1].OutIndex != 1 || - f->BindPairs[2].InIndex != 3 || f->BindPairs[2].OutIndex != 2) - return SZ_ERROR_UNSUPPORTED; - return SZ_OK; - } - return SZ_ERROR_UNSUPPORTED; -} - -UInt64 GetSum(const UInt64 *values, UInt32 index) -{ - UInt64 sum = 0; - UInt32 i; - for (i = 0; i < index; i++) - sum += values[i]; - return sum; -} - -SRes SzDecode2(const UInt64 *packSizes, const CSzFolder *folder, - ILookInStream *inStream, UInt64 startPos, - Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain, - Byte *tempBuf[]) -{ - UInt32 ci; - SizeT tempSizes[3] = { 0, 0, 0}; - SizeT tempSize3 = 0; - Byte *tempBuf3 = 0; - - RINOK(CheckSupportedFolder(folder)); - - for (ci = 0; ci < folder->NumCoders; ci++) - { - CSzCoderInfo *coder = &folder->Coders[ci]; - - if (coder->MethodID == k_Copy || coder->MethodID == k_LZMA) + SRes CheckSupportedFolder(const CSzFolder *f) { - UInt32 si = 0; - UInt64 offset; - UInt64 inSize; - Byte *outBufCur = outBuffer; - SizeT outSizeCur = outSize; - if (folder->NumCoders == 4) - { - UInt32 indices[] = { 3, 2, 0 }; - UInt64 unpackSize = folder->UnpackSizes[ci]; - si = indices[ci]; - if (ci < 2) - { - Byte *temp; - outSizeCur = (SizeT)unpackSize; - if (outSizeCur != unpackSize) - return SZ_ERROR_MEM; - temp = (Byte *)IAlloc_Alloc(allocMain, outSizeCur); - if (temp == 0 && outSizeCur != 0) - return SZ_ERROR_MEM; - outBufCur = tempBuf[1 - ci] = temp; - tempSizes[1 - ci] = outSizeCur; - } - else if (ci == 2) - { - if (unpackSize > outSize) /* check it */ - return SZ_ERROR_PARAM; - tempBuf3 = outBufCur = outBuffer + (outSize - (size_t)unpackSize); - tempSize3 = outSizeCur = (SizeT)unpackSize; - } - else - return SZ_ERROR_UNSUPPORTED; - } - offset = GetSum(packSizes, si); - inSize = packSizes[si]; - RINOK(LookInStream_SeekTo(inStream, startPos + offset)); - - if (coder->MethodID == k_Copy) - { - if (inSize != outSizeCur) /* check it */ - return SZ_ERROR_DATA; - RINOK(SzDecodeCopy(inSize, inStream, outBufCur)); - } - else - { - RINOK(SzDecodeLzma(coder, inSize, inStream, outBufCur, outSizeCur, allocMain)); - } + if (f->NumCoders < 1 || f->NumCoders > 4) + return SZ_ERROR_UNSUPPORTED; + if (IS_UNSUPPORTED_CODER(f->Coders[0])) + return SZ_ERROR_UNSUPPORTED; + if (f->NumCoders == 1) + { + if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBindPairs != 0) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + if (f->NumCoders == 2) + { + if (IS_NO_BCJ(f->Coders[1]) || + f->NumPackStreams != 1 || f->PackStreams[0] != 0 || + f->NumBindPairs != 1 || + f->BindPairs[0].InIndex != 1 || f->BindPairs[0].OutIndex != 0) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + if (f->NumCoders == 4) + { + if (IS_UNSUPPORTED_CODER(f->Coders[1]) || + IS_UNSUPPORTED_CODER(f->Coders[2]) || + IS_NO_BCJ2(f->Coders[3])) + return SZ_ERROR_UNSUPPORTED; + if (f->NumPackStreams != 4 || + f->PackStreams[0] != 2 || + f->PackStreams[1] != 6 || + f->PackStreams[2] != 1 || + f->PackStreams[3] != 0 || + f->NumBindPairs != 3 || + f->BindPairs[0].InIndex != 5 || f->BindPairs[0].OutIndex != 0 || + f->BindPairs[1].InIndex != 4 || f->BindPairs[1].OutIndex != 1 || + f->BindPairs[2].InIndex != 3 || f->BindPairs[2].OutIndex != 2) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + return SZ_ERROR_UNSUPPORTED; } - else if (coder->MethodID == k_BCJ) + + UInt64 GetSum(const UInt64 *values, UInt32 index) { - UInt32 state; - if (ci != 1) - return SZ_ERROR_UNSUPPORTED; - x86_Convert_Init(state); - x86_Convert(outBuffer, outSize, 0, &state, 0); + UInt64 sum = 0; + UInt32 i; + for (i = 0; i < index; i++) + sum += values[i]; + return sum; } - else if (coder->MethodID == k_BCJ2) + + SRes SzDecode2(const UInt64 *packSizes, const CSzFolder *folder, + ILookInStream *inStream, UInt64 startPos, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain, + Byte *tempBuf[]) { - UInt64 offset = GetSum(packSizes, 1); - UInt64 s3Size = packSizes[1]; - SRes res; - if (ci != 3) - return SZ_ERROR_UNSUPPORTED; - RINOK(LookInStream_SeekTo(inStream, startPos + offset)); - tempSizes[2] = (SizeT)s3Size; - if (tempSizes[2] != s3Size) - return SZ_ERROR_MEM; - tempBuf[2] = (Byte *)IAlloc_Alloc(allocMain, tempSizes[2]); - if (tempBuf[2] == 0 && tempSizes[2] != 0) - return SZ_ERROR_MEM; - res = SzDecodeCopy(s3Size, inStream, tempBuf[2]); - RINOK(res) + UInt32 ci; + SizeT tempSizes[3] = { 0, 0, 0}; + SizeT tempSize3 = 0; + Byte *tempBuf3 = 0; - res = Bcj2_Decode( - tempBuf3, tempSize3, - tempBuf[0], tempSizes[0], - tempBuf[1], tempSizes[1], - tempBuf[2], tempSizes[2], - outBuffer, outSize); - RINOK(res) + RINOK(CheckSupportedFolder(folder)); + + for (ci = 0; ci < folder->NumCoders; ci++) + { + CSzCoderInfo *coder = &folder->Coders[ci]; + + if (coder->MethodID == k_Copy || coder->MethodID == k_LZMA) + { + UInt32 si = 0; + UInt64 offset; + UInt64 inSize; + Byte *outBufCur = outBuffer; + SizeT outSizeCur = outSize; + if (folder->NumCoders == 4) + { + UInt32 indices[] = { 3, 2, 0 }; + UInt64 unpackSize = folder->UnpackSizes[ci]; + si = indices[ci]; + if (ci < 2) + { + Byte *temp; + outSizeCur = (SizeT)unpackSize; + if (outSizeCur != unpackSize) + return SZ_ERROR_MEM; + temp = (Byte *)IAlloc_Alloc(allocMain, outSizeCur); + if (temp == 0 && outSizeCur != 0) + return SZ_ERROR_MEM; + outBufCur = tempBuf[1 - ci] = temp; + tempSizes[1 - ci] = outSizeCur; + } + else if (ci == 2) + { + if (unpackSize > outSize) /* check it */ + return SZ_ERROR_PARAM; + tempBuf3 = outBufCur = outBuffer + (outSize - (size_t)unpackSize); + tempSize3 = outSizeCur = (SizeT)unpackSize; + } + else + return SZ_ERROR_UNSUPPORTED; + } + offset = GetSum(packSizes, si); + inSize = packSizes[si]; + RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + + if (coder->MethodID == k_Copy) + { + if (inSize != outSizeCur) /* check it */ + return SZ_ERROR_DATA; + RINOK(SzDecodeCopy(inSize, inStream, outBufCur)); + } + else + { + RINOK(SzDecodeLzma(coder, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + } + else if (coder->MethodID == k_BCJ) + { + UInt32 state; + if (ci != 1) + return SZ_ERROR_UNSUPPORTED; + x86_Convert_Init(state); + x86_Convert(outBuffer, outSize, 0, &state, 0); + } + else if (coder->MethodID == k_BCJ2) + { + UInt64 offset = GetSum(packSizes, 1); + UInt64 s3Size = packSizes[1]; + SRes res; + if (ci != 3) + return SZ_ERROR_UNSUPPORTED; + RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + tempSizes[2] = (SizeT)s3Size; + if (tempSizes[2] != s3Size) + return SZ_ERROR_MEM; + tempBuf[2] = (Byte *)IAlloc_Alloc(allocMain, tempSizes[2]); + if (tempBuf[2] == 0 && tempSizes[2] != 0) + return SZ_ERROR_MEM; + res = SzDecodeCopy(s3Size, inStream, tempBuf[2]); + RINOK(res) + + res = Bcj2_Decode( + tempBuf3, tempSize3, + tempBuf[0], tempSizes[0], + tempBuf[1], tempSizes[1], + tempBuf[2], tempSizes[2], + outBuffer, outSize); + RINOK(res) + } + else + return SZ_ERROR_UNSUPPORTED; + } + return SZ_OK; } - else - return SZ_ERROR_UNSUPPORTED; - } - return SZ_OK; -} -SRes SzDecode(const UInt64 *packSizes, const CSzFolder *folder, - ILookInStream *inStream, UInt64 startPos, - Byte *outBuffer, size_t outSize, ISzAlloc *allocMain) -{ - Byte *tempBuf[3] = { 0, 0, 0}; - int i; - SRes res = SzDecode2(packSizes, folder, inStream, startPos, - outBuffer, (SizeT)outSize, allocMain, tempBuf); - for (i = 0; i < 3; i++) - IAlloc_Free(allocMain, tempBuf[i]); - return res; -} + SRes SzDecode(const UInt64 *packSizes, const CSzFolder *folder, + ILookInStream *inStream, UInt64 startPos, + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain) + { + Byte *tempBuf[3] = { 0, 0, 0}; + int i; + SRes res = SzDecode2(packSizes, folder, inStream, startPos, + outBuffer, (SizeT)outSize, allocMain, tempBuf); + for (i = 0; i < 3; i++) + IAlloc_Free(allocMain, tempBuf[i]); + return res; + } diff --git a/src/archivers/7z/7zExtract.cpp b/src/archivers/7z/7zExtract.cpp index ff79802b..99ef3654 100644 --- a/src/archivers/7z/7zExtract.cpp +++ b/src/archivers/7z/7zExtract.cpp @@ -1,7 +1,7 @@ /* 7zExtract.c -- Extracting from 7z archive 2008-11-23 : Igor Pavlov : Public domain */ -#include "../../7zCrc.h" +#include "7zCrc.h" #include "7zDecode.h" #include "7zExtract.h" diff --git a/src/archivers/7z/7zHeader.h b/src/archivers/7z/7zHeader.h index 9941b6f7..ad095df4 100644 --- a/src/archivers/7z/7zHeader.h +++ b/src/archivers/7z/7zHeader.h @@ -4,7 +4,7 @@ #ifndef __7Z_HEADER_H #define __7Z_HEADER_H -#include "../../Types.h" +#include "Types.h" #define k7zSignatureSize 6 extern Byte k7zSignature[k7zSignatureSize]; diff --git a/src/archivers/7z/7zItem.h b/src/archivers/7z/7zItem.h index 9f1366cd..20a7b7bf 100644 --- a/src/archivers/7z/7zItem.h +++ b/src/archivers/7z/7zItem.h @@ -4,7 +4,7 @@ #ifndef __7Z_ITEM_H #define __7Z_ITEM_H -#include "../../7zBuf.h" +#include "7zBuf.h" typedef struct { diff --git a/src/archivers/7z/7zStream.cpp b/src/archivers/7z/7zStream.cpp index f0959fb0..32c361a7 100644 --- a/src/archivers/7z/7zStream.cpp +++ b/src/archivers/7z/7zStream.cpp @@ -39,7 +39,7 @@ SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset) SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size) { - const void *lookBuf; + void *lookBuf; if (*size == 0) return SZ_OK; RINOK(stream->Look(stream, &lookBuf, size)); @@ -66,7 +66,7 @@ SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size) return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); } -static SRes LookToRead_Look_Lookahead(void *pp, const void **buf, size_t *size) +static SRes LookToRead_Look_Lookahead(void *pp, void **buf, size_t *size) { SRes res = SZ_OK; CLookToRead *p = (CLookToRead *)pp; @@ -84,7 +84,7 @@ static SRes LookToRead_Look_Lookahead(void *pp, const void **buf, size_t *size) return res; } -static SRes LookToRead_Look_Exact(void *pp, const void **buf, size_t *size) +static SRes LookToRead_Look_Exact(void *pp, void **buf, size_t *size) { SRes res = SZ_OK; CLookToRead *p = (CLookToRead *)pp; diff --git a/src/archivers/7z/CpuArch.c b/src/archivers/7z/CpuArch.c index caf21643..0df26272 100644 --- a/src/archivers/7z/CpuArch.c +++ b/src/archivers/7z/CpuArch.c @@ -5,14 +5,14 @@ #ifdef MY_CPU_X86_OR_AMD64 -#if (defined(_MSC_VER) && !defined(MY_CPU_AMD64)) || defined(__GNUC__) +#if (defined(_MSC_VER_) && !defined(MY_CPU_AMD64)) || defined(__GNUC__) #define USE_ASM #endif #if defined(USE_ASM) && !defined(MY_CPU_AMD64) static UInt32 CheckFlag(UInt32 flag) { - #ifdef _MSC_VER + #ifdef _MSC_VER_ __asm pushfd; __asm pop EAX; __asm mov EDX, EAX; @@ -52,7 +52,7 @@ static void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) { #ifdef USE_ASM - #ifdef _MSC_VER + #ifdef _MSC_VER_ UInt32 a2, b2, c2, d2; __asm xor EBX, EBX; diff --git a/src/archivers/7z/CpuArch.h b/src/archivers/7z/CpuArch.h index be3dfa7b..cb75cf68 100644 --- a/src/archivers/7z/CpuArch.h +++ b/src/archivers/7z/CpuArch.h @@ -97,7 +97,7 @@ Stop_Compiling_Bad_Endian #endif -#if defined(MY_CPU_LE_UNALIGN) && defined(_WIN64) && (defined(_MSC_VER) && (_MSC_VER >= 1300)) +#if defined(MY_CPU_LE_UNALIGN) && defined(_WIN64) && (defined(_MSC_VER_) && (_MSC_VER_ >= 1300)) #include #pragma intrinsic(_byteswap_ulong) diff --git a/src/archivers/7z/RotateDefs.h b/src/archivers/7z/RotateDefs.h index c3a1385c..a10b6c8c 100644 --- a/src/archivers/7z/RotateDefs.h +++ b/src/archivers/7z/RotateDefs.h @@ -4,7 +4,7 @@ #ifndef __ROTATE_DEFS_H #define __ROTATE_DEFS_H -#ifdef _MSC_VER +#ifdef _MSC_VER_ #include #define rotlFixed(x, n) _rotl((x), (n)) diff --git a/src/archivers/7z/Threads.c b/src/archivers/7z/Threads.c index 68561067..d9a05615 100644 --- a/src/archivers/7z/Threads.c +++ b/src/archivers/7z/Threads.c @@ -70,14 +70,14 @@ WRes Semaphore_Release1(CSemaphore *p) { return Semaphore_ReleaseN(p, 1); } WRes CriticalSection_Init(CCriticalSection *p) { /* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */ - #ifdef _MSC_VER + #ifdef _MSC_VER_ __try #endif { InitializeCriticalSection(p); /* InitializeCriticalSectionAndSpinCount(p, 0); */ } - #ifdef _MSC_VER + #ifdef _MSC_VER_ __except (EXCEPTION_EXECUTE_HANDLER) { return 1; } #endif return 0; diff --git a/src/archivers/7z/Types.h b/src/archivers/7z/Types.h index 7e4ffe88..2f8542b9 100644 --- a/src/archivers/7z/Types.h +++ b/src/archivers/7z/Types.h @@ -74,7 +74,7 @@ typedef unsigned long UInt64; #else -#if defined(_MSC_VER) || defined(__BORLANDC__) +#if defined(_MSC_VER_) || defined(__BORLANDC__) typedef __int64 Int64; typedef unsigned __int64 UInt64; #define UINT64_CONST(n) n @@ -103,7 +103,7 @@ typedef int Bool; #define MY_STD_CALL #endif -#ifdef _MSC_VER +#ifdef _MSC_VER_ #if _MSC_VER >= 1300 #define MY_NO_INLINE __declspec(noinline) @@ -168,7 +168,7 @@ typedef struct typedef struct { - SRes (*Look)(void *p, const void **buf, size_t *size); + SRes (*Look)(void *p, void **buf, size_t *size); /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. (output(*size) > input(*size)) is not allowed (output(*size) < input(*size)) is allowed */ diff --git a/src/archivers/mp2/kjmp2.cpp b/src/archivers/mp2/kjmp2.cpp index bd943fd4..df2966cb 100644 --- a/src/archivers/mp2/kjmp2.cpp +++ b/src/archivers/mp2/kjmp2.cpp @@ -25,7 +25,7 @@ #include "kjmp2.h" -#ifdef _MSC_VER +#ifdef _MSC_VER_ #define FASTCALL __fastcall #else #define FASTCALL diff --git a/src/guisan/include/guisan/exception.hpp b/src/guisan/include/guisan/exception.hpp index 243d8f1d..ef4f8b26 100644 --- a/src/guisan/include/guisan/exception.hpp +++ b/src/guisan/include/guisan/exception.hpp @@ -62,8 +62,8 @@ #include "guisan/platform.hpp" -#ifdef _MSC_VER -#if _MSC_VER <= 1200 +#ifdef _MSC_VER_ +#if _MSC_VER_ <= 1200 #define __FUNCTION__ "?" #endif #endif diff --git a/src/guisan/include/guisan/platform.hpp b/src/guisan/include/guisan/platform.hpp index b7a7609f..5eb29905 100644 --- a/src/guisan/include/guisan/platform.hpp +++ b/src/guisan/include/guisan/platform.hpp @@ -68,10 +68,10 @@ #define GCN_CORE_DECLSPEC __declspec(dllimport) #define GCN_EXTENSION_DECLSPEC __declspec(dllimport) -#elif defined(_MSC_VER) && defined(GUICHAN_BUILD) +#elif defined(_MSC_VER_) && defined(GUICHAN_BUILD) #define GCN_CORE_DECLSPEC _declspec(dllexport) -#elif defined(_MSC_VER) && defined(GUICHAN_EXTENSION_BUILD) +#elif defined(_MSC_VER_) && defined(GUICHAN_EXTENSION_BUILD) #define GCN_CORE_DECLSPEC _declspec(dllimport) #define GCN_EXTENSION_DECLSPEC _declspec(dllexport) diff --git a/src/include/ar.h b/src/include/ar.h new file mode 100644 index 00000000..1bb0ea63 --- /dev/null +++ b/src/include/ar.h @@ -0,0 +1,75 @@ +#ifndef UAE_AR_H +#define UAE_AR_H + +#include "uae/types.h" + +/* disable HRTMon support by commenting this out */ +#define ACTION_REPLAY_HRTMON + +#ifdef ACTION_REPLAY +#define ACTION_REPLAY_COMMON +#endif + +#ifdef ACTION_REPLAY_HRTMON +#define ACTION_REPLAY_COMMON +#endif + +#ifdef ACTION_REPLAY +/* disable Action Replay ROM/RAM hide by commenting this out */ +/* Better not disable this unless you do plenty of testing first. -Mark */ +#define ACTION_REPLAY_HIDE_CARTRIDGE +#endif + +#define ACTION_REPLAY_WAIT_PC -3 /* Wait for a specified Program counter */ +#define ACTION_REPLAY_INACTIVE -2 +#define ACTION_REPLAY_WAITRESET -1 +#define ACTION_REPLAY_IDLE 1 +#define ACTION_REPLAY_ACTIVATE 2 +#define ACTION_REPLAY_ACTIVE 3 +#define ACTION_REPLAY_DORESET 4 +#define ACTION_REPLAY_HIDE 5 + +extern int action_replay_freeze (void); + +extern uaecptr wait_for_pc; +extern int action_replay_flag; +extern int armodel; + +extern int is_ar_pc_in_rom(void); +extern int is_ar_pc_in_ram(void); +extern void action_replay_enter (void); +extern void action_replay_cia_access (bool write); +extern void action_replay_hide (void); +extern void action_replay_reset (bool hardreset, bool keyboardreset); +extern int action_replay_load (void); +extern int action_replay_unload (int in_memory_reset); + +extern void action_replay_memory_reset (void); +extern void action_replay_init (int); +extern void action_replay_cleanup (void); +extern void REGPARAM3 chipmem_lput_actionreplay23 (uaecptr addr, uae_u32 l) REGPARAM; +extern void REGPARAM3 chipmem_wput_actionreplay23 (uaecptr addr, uae_u32 w) REGPARAM; +extern void REGPARAM3 chipmem_bput_actionreplay1 (uaecptr addr, uae_u32 b) REGPARAM; +extern void REGPARAM3 chipmem_wput_actionreplay1 (uaecptr addr, uae_u32 w) REGPARAM; +extern void REGPARAM3 chipmem_lput_actionreplay1 (uaecptr addr, uae_u32 l) REGPARAM; + +extern void action_replay_version (void); + +extern int hrtmon_flag; + +extern void hrtmon_enter (void); +extern void hrtmon_breakenter (void); +extern void hrtmon_ciaread (void); +extern void hrtmon_hide (void); +extern void hrtmon_reset (void); +extern int hrtmon_load (void); +extern void hrtmon_map_banks (void); + +/*extern uae_u8 *hrtmemory;*/ +extern uae_u32 hrtmem_start, hrtmem_size, hrtmem2_start, hrtmem3_start; + +extern uae_u8 ar_custom[2*256], ar_ciaa[16], ar_ciab[16]; + +extern int hrtmon_lang; + +#endif /* UAE_AR_H */ diff --git a/src/include/sysdeps.h b/src/include/sysdeps.h index ac93fd10..c6976f9a 100644 --- a/src/include/sysdeps.h +++ b/src/include/sysdeps.h @@ -54,7 +54,7 @@ using namespace std; #endif #ifndef __STDC__ -#ifndef _MSC_VER +#ifndef _MSC_VER_ #error "Your compiler is not ANSI. Get a real one." #endif #endif @@ -369,7 +369,7 @@ extern void gui_message(const TCHAR *, ...); #endif #define NOINLINE __attribute__ ((noinline)) #define NORETURN __attribute__ ((noreturn)) -#elif _MSC_VER +#elif _MSC_VER_ #define STATIC_INLINE static __forceinline #define NOINLINE __declspec(noinline) #define NORETURN __declspec(noreturn) diff --git a/src/main.cpp b/src/main.cpp index f0b9c0bf..62122b12 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -158,10 +158,8 @@ void fixup_cpu(struct uae_prefs *p) switch (p->cpu_model) { case 68000: - p->address_space_24 = true; break; case 68010: - p->address_space_24 = true; break; case 68020: break; @@ -171,52 +169,20 @@ void fixup_cpu(struct uae_prefs *p) if (p->fpu_model) p->fpu_model = 68040; break; - case 68060: - if (p->fpu_model) - p->fpu_model = 68060; - break; } - if (p->cpu_model < 68020 && p->cachesize) { - p->cachesize = 0; - error_log(_T("JIT requires 68020 or better CPU.")); - } - - if (p->cpu_model >= 68040 && p->cachesize && p->cpu_compatible) + if (p->cpu_model >= 68020 && p->cachesize && p->cpu_compatible) p->cpu_compatible = false; - if (p->cpu_model >= 68040 && p->cpu_cycle_exact) { - p->cpu_cycle_exact = false; - error_log(_T("68040/060 cycle-exact is not supported.")); + if (p->cachesize && (p->fpu_no_unimplemented)) { + error_log(_T("JIT is not compatible with unimplemented FPU instruction emulation.")); + p->fpu_no_unimplemented = false; } - if ((p->cpu_model < 68030 || p->cachesize) && p->mmu_model) { - error_log(_T("MMU emulation requires 68030/040/060 and it is not JIT compatible.")); - p->mmu_model = 0; - } - - if (p->cachesize && p->cpu_cycle_exact) { - error_log(_T("JIT and cycle-exact can't be enabled simultaneously.")); - p->cachesize = 0; - } - if (p->cachesize && (p->fpu_no_unimplemented || p->int_no_unimplemented)) { - error_log(_T("JIT is not compatible with unimplemented CPU/FPU instruction emulation.")); - p->fpu_no_unimplemented = p->int_no_unimplemented = false; - } - - if (p->cpu_cycle_exact && p->m68k_speed < 0) - p->m68k_speed = 0; - - if (p->immediate_blits && p->blitter_cycle_exact) { - error_log(_T("Cycle-exact and immediate blitter can't be enabled simultaneously.\n")); - p->immediate_blits = false; - } if (p->immediate_blits && p->waiting_blits) { error_log(_T("Immediate blitter and waiting blits can't be enabled simultaneously.\n")); p->waiting_blits = 0; } - if (p->cpu_cycle_exact) - p->cpu_compatible = true; } @@ -485,41 +451,6 @@ static void parse_cmdline_2(int argc, TCHAR **argv) } } -static int diskswapper_cb(struct zfile *f, void *vrsd) -{ - int *num = static_cast(vrsd); - if (*num >= MAX_SPARE_DRIVES) - return 1; - if (zfile_gettype(f) == ZFILE_DISKIMAGE) { - _tcsncpy(currprefs.dfxlist[*num], zfile_getname(f), 255); - (*num)++; - } - return 0; -} - -static void parse_diskswapper(const TCHAR *s) -{ - TCHAR *tmp = my_strdup(s); - TCHAR *delim = _T(","); - TCHAR *p1, *p2; - int num = 0; - - p1 = tmp; - for (;;) { - p2 = strtok(p1, delim); - if (!p2) - break; - p1 = nullptr; - if (num >= MAX_SPARE_DRIVES) - break; - if (!zfile_zopen(p2, diskswapper_cb, &num)) { - _tcsncpy(currprefs.dfxlist[num], p2, 255); - num++; - } - } - free(tmp); -} - static TCHAR *parsetext(const TCHAR *s) { if (*s == '"' || *s == '\'') { @@ -793,7 +724,6 @@ static int real_main2 (int argc, TCHAR **argv) memset(&gui_data, 0, sizeof gui_data); gui_data.cd = -1; gui_data.hd = -1; - gui_data.md = -1; if (!init_shm()) { if (currprefs.start_gui) diff --git a/src/threaddep/thread.h b/src/threaddep/thread.h index 23a0d528..05246bbf 100644 --- a/src/threaddep/thread.h +++ b/src/threaddep/thread.h @@ -6,8 +6,9 @@ * Copyright 1997, 2001 Bernd Schmidt */ -#include "SDL.h" -#include "SDL_thread.h" +#pragma once +#include +#include /* Sempahores. We use POSIX semaphores; if you are porting this to a machine * with different ones, make them look like POSIX semaphores. */ @@ -16,7 +17,7 @@ typedef SDL_sem *uae_sem_t; STATIC_INLINE int uae_sem_init(uae_sem_t *sem, int dummy, int init) { *sem = SDL_CreateSemaphore (init); - return (*sem == 0); + return (*sem == nullptr); } #define uae_sem_destroy(PSEM) SDL_DestroySemaphore (*PSEM) @@ -40,7 +41,7 @@ STATIC_INLINE void uae_end_thread (uae_thread_id *tid) STATIC_INLINE int uae_start_thread (const TCHAR *name, void *(*f) (void *), void *arg, uae_thread_id *foo) { - uae_thread_id id = SDL_CreateThread ((int (*)(void *))f, arg); + uae_thread_id id = SDL_CreateThread ((int (*)(void *))f, "StartThread", arg); if(foo != NULL) *foo = id; return (int)id; @@ -48,7 +49,7 @@ STATIC_INLINE int uae_start_thread (const TCHAR *name, void *(*f) (void *), void STATIC_INLINE int uae_start_thread_fast (void *(*f) (void *), void *arg, uae_thread_id *foo) { - uae_thread_id id = SDL_CreateThread ((int (*)(void *))f, arg); + uae_thread_id id = SDL_CreateThread ((int (*)(void *))f, "StartThreadFast", arg); if(foo != NULL) *foo = id; return (int)id;