Advertisement
Testaware

XUP Module v2.6.5.1 (x86)

Aug 27th, 2017
2,565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ********************************************************************************
  2. ; XUP Module v2.6.5.1 (x86) [ eXtended UnPack Library ]
  3. ; --------------------------------------------------------------------------------
  4. ; Coded ® 29-12-2011 by Peace^TST (PB 4.51) - build: 27-08-2017 (PB 5.44 LTS)
  5. ; --------------------------------------------------------------------------------
  6. ; Unpack:   PP20, FIMP, XPK->SQSH|PWPK|IMPL|BZP2|GZIP|NONE, ICE!|ATM5, JCalG1, ZIP
  7. ; ********************************************************************************
  8.  
  9. XIncludeFile   "i_xup_structure.pbi"
  10.  
  11. DeclareModule  XUP
  12. Declare  Free(*RS)
  13. Declare  Unpack(*RS)
  14. EndDeclareModule
  15.  
  16. Module   XUP
  17.  
  18. #XUP_WINAPI =  1  ; Windows API ->  0 = off / 1 = on
  19.  
  20. ; *************************************************************************************************************
  21. ; i_XUP.pbi    :  Main-Structure / Error enumeration (s. i_xup_structure.pbi)
  22. ; *************************************************************************************************************
  23. Structure   RS_XUP
  24.    *IN_Ptr     ;*Ptr to packed data or @Filename
  25.    IN_Len.i    ;Size of packed data or NULL if Filename
  26.    *OUT_Ptr    ;*Ptr to unpacked data
  27.    OUT_Len.i   ;Size of unpacked data
  28.    PK_Mode.i   ;Mode of packing (Zip/JCalG1)**
  29.    PK_Level.i  ;Efficiency (0-9)**
  30.    Error.i     ;Errorcode -> 0 = all OK or error
  31.    Flags.i     ;Private! (if not NULL, *IN_Ptr init by XUP_Unpack)
  32. EndStructure
  33.  
  34. Enumeration ; *** Errors
  35.    #XUPERR_OK  =  0
  36.    #XUPERR_FILE
  37.    #XUPERR_UNPACK
  38.    #XUPERR_NOTPACKED
  39.    #XUPERR_UNKNOWN
  40. EndEnumeration
  41.  
  42. ; *************************************************************************************************************
  43. ; i_XUP.pbi    :  Macros
  44. ; *************************************************************************************************************
  45. CompilerIf  #XUP_WINAPI
  46.  
  47.    Macro MA_MemAlloc(SIZE)          :  GlobalAlloc_(#GMEM_ZEROINIT, SIZE)  :  EndMacro
  48.    Macro MA_MemFree(PTR)            :  GlobalFree_(PTR)                    :  EndMacro
  49.    Macro MA_MemSize(PTR)            :  GlobalSize_(PTR)                    :  EndMacro
  50.    Macro MA_MemMove(SRC, DST, SIZE) :  MoveMemory_(DST, SRC, SIZE)         :  EndMacro
  51.    Macro MA_MemCopy(SRC, DST, SIZE) :  CopyMemory_(DST, SRC, SIZE)         :  EndMacro
  52.    Macro MA_MemFill(PTR, SIZE, VAL) :  FillMemory_(PTR, SIZE, VAL)         :  EndMacro
  53.  
  54.    Macro MA_FileOpen(FILENAME)
  55.       CreateFile_(FILENAME, #GENERIC_READ, #FILE_SHARE_READ, #NUL, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NUL)
  56.    EndMacro
  57.    Macro MA_FileSize(HFILE)            :  GetFileSize_(HFILE, #NUL)                 :  EndMacro
  58.    Macro MA_FileRead(HFILE, PTR, SIZE) :  ReadFile_(HFILE, PTR, SIZE, @SIZE, #NUL)  :  EndMacro
  59.    Macro MA_FileClose(HFILE)           :  CloseHandle_(HFILE)                       :  EndMacro
  60.  
  61. CompilerElse
  62.  
  63.    Macro MA_MemAlloc(SIZE)          :  AllocateMemory(SIZE)       :  EndMacro
  64.    Macro MA_MemFree(PTR)            :  FreeMemory(PTR)            :  EndMacro
  65.    Macro MA_MemSize(PTR)            :  MemorySize(PTR)            :  EndMacro
  66.    Macro MA_MemMove(SRC, DST, SIZE) :  MoveMemory(SRC, DST, SIZE) :  EndMacro
  67.    Macro MA_MemCopy(SRC, DST, SIZE) :  CopyMemory(SRC, DST, SIZE) :  EndMacro
  68.    Macro MA_MemFill(PTR, SIZE, VAL) :  FillMemory(PTR, SIZE, VAL) :  EndMacro
  69.  
  70.    Macro MA_FileOpen(FILENAME)         :  ReadFile(#PB_Any, PeekS(FILENAME))  :  EndMacro
  71.    Macro MA_FileSize(HFILE)            :  Lof(HFILE)                          :  EndMacro
  72.    Macro MA_FileRead(HFILE, PTR, SIZE) :  ReadData(HFILE, PTR, SIZE)          :  EndMacro
  73.    Macro MA_FileClose(HFILE)           :  CloseFile(HFILE)                    :  EndMacro
  74.  
  75. CompilerEndIf
  76.  
  77. Macro MA_Error(VAL)
  78.    If *RS\OUT_Len <= #Null
  79.       *RS\Error   =  VAL
  80.    Else
  81.       *RS\Error   =  #XUPERR_OK
  82.    EndIf
  83.    ProcedureReturn   *RS\Error
  84. EndMacro
  85.  
  86. Macro UINT32(a)
  87.    ((((a)&$FF)<<24)|(((a)&$FF00)<<8)|(((a)>>8)&$FF00)|(((a)>>24)&$FF))
  88. EndMacro
  89.  
  90. Macro ID_LONG(a,b,c,d)
  91.    (a)|(b<<8)|(c<<16)|(d<<24)
  92. EndMacro
  93. Macro ID_WORD(a,b)
  94.    (a)|(b<<8)
  95. EndMacro
  96.  
  97. ; *************************************************************************************************************
  98. ; i_XUP.pbi    :  Enumeration
  99. ; *************************************************************************************************************
  100. EnumerationBinary ; *** Flags
  101.    #XUPFLG_MEMORY
  102.    #XUPFLG_FILE
  103. EndEnumeration
  104.  
  105. ; *************************************************************************************************************
  106. ; i_XUP.pbi    :  #XUP_MODE   =  1<<?  or #NUL
  107. ; *************************************************************************************************************
  108. EnumerationBinary ; *** UnPack Bitwise Modes
  109.    #XUP_PP20      ; Amiga PowerPacker
  110.    #XUP_FIMP      ; Amiga FileImploder
  111.    #XUP_XPKF      ; Amiga XPK [SQSH|PWPK|IMPL|BZP2|GZIP|NONE]
  112.    #XUP_NONE      ; Amiga XPK NONE
  113.    #XUP_JCAL      ; JCalG1
  114.    #XUP_BZP2      ; BZip2
  115.    #XUP_GZIP      ; GZip & Zip
  116.    #XUP_NPKZ      ; NoisePlug Zip
  117.    #XUP_ICEI      ; ICE! & ATOMIK
  118.    #XUP_PACK      ; Allow compression
  119. EndEnumeration
  120.  
  121. #XUP_MC68   =  #XUP_PP20|#XUP_FIMP|#XUP_NONE|#XUP_XPKF   ; *** Small AMIGA unpacker only
  122. ;#XUP_MODE  =  #XUP_MC68|#XUP_JCAL|#XUP_BZP2|#XUP_GZIP   ; *** Used unpacker
  123.  
  124. CompilerIf  Defined(XUP_MODE,    #PB_Constant)  =  0
  125.    #XUP_MODE   =  $FFFFFFFF!(#XUP_PACK);|#XUP_JCAL|#XUP_ICEI)  ; All unpackers but no JCalG1/ICEI and no packing (Default)
  126. CompilerEndIf
  127. CompilerIf  Defined(NUL,         #PB_Constant)  =  0
  128.    #NUL  =  0
  129. CompilerEndIf
  130. CompilerIf  Defined(XUP_PATH$,   #PB_Constant)  =  0
  131.    #XUP_PATH$  =  #PB_Compiler_FilePath + "Include\"
  132. CompilerEndIf
  133.  
  134. ; NoisePlug JCalG1 + Zipped
  135. #XUPID_JCAL =  ID_WORD('J','C')  ;'CJ'    ; NoisePlug JCalG1
  136. #XUPID_NPKZ =  ID_WORD('Z','C')  ;'CZ'    ; NoisePlug Zipped
  137.  
  138. ; PP20
  139. #XUPID_PP10 =  ID_LONG('P','P','1','0')   ;'01PP'  ; PowerPacker v1.0
  140. #XUPID_PP11 =  ID_LONG('P','P','1','1')   ;'11PP'  ; PowerPacker v1.1
  141. #XUPID_PP15 =  ID_LONG('P','P','1','5')   ;'51PP'  ; PowerPacker v1.5
  142. #XUPID_PP20 =  ID_LONG('P','P','2','0')   ;'02PP'  ; PowerPacker v2.0+
  143. #XUPID_PPLS =  ID_LONG('P','P','L','S')   ;'SLPP'  ; PowerPacker LoadSeg
  144. #XUPID_PPBK =  ID_LONG('P','P','b','k')   ;'kbPP'  ; PowerPacker AMOSPro PPBank
  145.  
  146. ; FIMP
  147. #XUPID_FIMP =  ID_LONG('I','M','P','!')   ;'!PMI'
  148. #XUPID_MADE =  ID_LONG('M','A','D','E')   ;'EDAM'
  149. #XUPID_IFHC =  ID_LONG('I','F','H','C')   ;'CHFI'
  150. #XUPID_PARA =  ID_LONG('P','A','R','A')   ;'ARAP'
  151. #XUPID_9CDR =  ID_LONG('9','C','D','R')   ;'RDC9'
  152. #XUPID_FLTI =  ID_LONG('F','L','T','!')   ;'!TLF'
  153. #XUPID_DUPA =  ID_LONG('D','u','p','a')   ;'apuD'
  154.  
  155. ; XPK Compressors
  156. #XUPID_XPKF =  ID_LONG('X','P','K','F')   ;'FKPX'
  157. #XUPID_SQSH =  ID_LONG('S','Q','S','H')   ;'HSQS'
  158. #XUPID_PWPK =  ID_LONG('P','W','P','K')   ;'KPWP'
  159. #XUPID_BZP2 =  ID_LONG('B','Z','P','2')   ;'2PZB'
  160. #XUPID_NONE =  ID_LONG('N','O','N','E')   ;'ENON'
  161. #XUPID_GZIP =  ID_LONG('G','Z','I','P')   ;'PIZG'
  162. #XUPID_IMPL =  ID_LONG('I','M','P','L')   ;'LPMI'  ; XPKF -> IMPL = Bug > 64Kb
  163. #XUPID_RLEN =  ID_LONG('R','L','E','N')   ;'NELR'
  164.  
  165. ; ICE & ATOMIK (Atari)
  166. #XUPID_IC21 =  ID_LONG('I','c','e','!')   ;'!ecI'  ; ICE Packer 2.1
  167. #XUPID_IC24 =  ID_LONG('I','C','E','!')   ;'!ECI'  ; ICE Packer 2.4
  168. #XUPID_ATM5 =  ID_LONG('A','T','M','5')   ;'5MTA'  ; Atomik Packer 3.5
  169.  
  170. #XUPPAK_JCAL   =  1<<0  ; JCalG1 CompressMem
  171. #XUPPAK_ZIPM   =  1<<1  ; Zip CompressMem
  172.  
  173. ; *************************************************************************************************************
  174. ; i_XUP.pbi    :  Includelibs
  175. ; *************************************************************************************************************
  176. #XUPLIB_BZP2$  =  "bzip2_x86.lib"
  177. #XUPLIB_GZIP$  =  "zlib_x86.lib"
  178. #XUPLIB_PP20$  =  "pp20_x86.lib"
  179. #XUPLIB_FIMP$  =  "fimp_x86.lib"
  180. #XUPLIB_SQSH$  =  "xpk_sqsh_x86.a"
  181. #XUPLIB_JCAL$  =  "jcalg1_static_x86.lib"
  182. #XUPLIB_ICEI$  =  "unicelib_x86.lib"
  183.  
  184. CompilerIf  #XUP_MODE   &  #XUP_PP20
  185.    ; *** Amiga PowerPacker Data (PP20)
  186.    ImportC  #XUPLIB_PP20$
  187.       PPK_GetSize(*src, srclen)                    As "_ppGetDecrunchSize"
  188.       PPK_Decrunch(*src, *dest, srclen, destlen)   As "_ppDecrunchMemory"
  189.    EndImport
  190. CompilerEndIf
  191. CompilerIf  #XUP_MODE   &  #XUP_FIMP
  192.    ; *** Amiga FileImploder (FImp)
  193.    ImportC  #XUPLIB_FIMP$
  194.       IMP_GetSize(*src)                            As "_impGetExplodeSize"
  195.       IMP_Decrunch(*src, srclen, *dest, destlen)   As "_impExplode"
  196.    EndImport
  197. CompilerEndIf
  198. CompilerIf  #XUP_MODE   &  #XUP_XPKF
  199.    ; *** Amiga eXtendedPacKer (XPK\compressors)
  200.    ImportC  #XUPLIB_SQSH$
  201.       XPK_Check(*src, *srclen, *dstlen)   As "__Z9xpk_checkPhS_S_"
  202.       XPK_Unpack(*src, *dst)              As "__Z10xpk_unpackPhS_"
  203.       ;XPK_GetSize(*src)         As "_XPK_Length"
  204.       ;XPK_Decrunch(*src, *dest) As "_XPK_Unpack"
  205.    EndImport
  206. CompilerEndIf
  207. CompilerIf  #XUP_MODE   &  #XUP_JCAL
  208.    Import   #XUPLIB_JCAL$
  209.       JCA_Decrunch(*src, *dest)  As "_JCALG1_Decompress_Fast@8"
  210.       ;JCA_Decrunch(*src, *dest) As "_JCALG1_Decompress_Small@8"
  211.       ;JCA_Crunch(*src, srclen, *dest, Windowsize.l, *pAlloc, *pDealloc, *pCallback, bDisableChecksum.l) As _JCALG1_Compress@32
  212.    EndImport
  213. CompilerEndIf
  214. CompilerIf  #XUP_MODE   &  #XUP_BZP2
  215.    ; *** BZip2
  216.    Import   #XUPLIB_BZP2$
  217.       BZ2_Decrunch(*DestBuff, *DestSize, *SourceBuff, iSourceSize, small, verbosity)   As "_BZ2_bzBuffToBuffDecompress@24"
  218.       ;BZ2_bzBuffToBuffCompress.i (*DestBuff, *DestSize, *SourceBuff, iSourceSize, iBlockSize, verbosity, workFactor)
  219.       ;BZ2_bzBuffToBuffDecompress.i (*DestBuff, *DestSize, *SourceBuff, iSourceSize, small, verbosity)
  220.    EndImport
  221. CompilerEndIf
  222. CompilerIf  #XUP_MODE   &  (#XUP_GZIP  |  #XUP_NPKZ)
  223.    ; *** Zip
  224.    ImportC #XUPLIB_GZIP$
  225.       ZIP_Decrunch(*DestBuff, *iDestSize, *SourceBuff, iSourceSize)                    As "_uncompress"
  226.       CompilerIf  #XUP_MODE&#XUP_PACK
  227.          ZIP_Crunch(*DestBuff, *iDestSize, *SourceBuff, iSourceSize, iCompressionLevel)   As "_compress2"
  228.       CompilerEndIf
  229.       ;compress2.i(*DestBuff, *iDestSize, *SourceBuff, iSourceSize, iCompressionLevel)
  230.       ;uncompress.i(*DestBuff, *iDestSize, *SourceBuff, iSourceSize)
  231.    EndImport
  232. CompilerEndIf
  233. CompilerIf  #XUP_MODE   &  #XUP_ICEI
  234.    ; *** Atari ICE! & Atomik Unpacker
  235.    ImportC  #XUPLIB_ICEI$
  236.       ; Atomik Packer 3.5
  237.       ; atm_35_get_long()        As "_atm_35_get_long"
  238.       ; atm_35_getbits()         As "_atm_35_getbits"
  239.       atm_35_header(*src)        As "_atm_35_header"
  240.       atm_35_packedsize(*src)    As "_atm_35_packedsize"
  241.       atm_35_origsize(*src)      As "_atm_35_origsize"
  242.       atm_35_depack(*src, *dest) As "_atm_35_depack"
  243.  
  244.       ; Pack Ice 2.1
  245.       ; get_long()               As "_get_long"
  246.       ; ice_get_long()           As "_ice_get_long"
  247.       ; ice_getbits()            As "_ice_getbits"
  248.       ice_21_header(*src)        As "_ice_21_header"
  249.       ice_21_packedsize(*src)    As "_ice_21_packedsize"
  250.       ice_21_origsize(*src)      As "_ice_21_origsize"
  251.       ice_21_depack(*src, *dest) As "_ice_21_depack"
  252.  
  253.       ; Pack Ice 2.4
  254.       ; get24_long()             As "_get24_long"
  255.       ; ice24_get_long()         As "_ice24_get_long"
  256.       ; ice24_getbits()          As "_ice24_getbits"
  257.       ice_24_header(*src)        As "_ice_24_header"
  258.       ice_24_packedsize(*src)    As "_ice_24_packedsize"
  259.       ice_24_origsize(*src)      As "_ice_24_origsize"
  260.       ice_24_depack(*src, *dest) As "_ice_24_depack"
  261.    EndImport
  262. CompilerEndIf
  263.  
  264. ; *************************************************************************************************************
  265. ; i_XUP.pbi    :  Functions(struc RS_XUP)
  266. ; *************************************************************************************************************
  267. Procedure   Free(*RS.RS_XUP)
  268.  
  269.    ; Should be called before or after unpacking (free intern memory allocation)
  270.  
  271.    With  *RS
  272.  
  273.       If \OUT_Ptr >  #Null
  274.          If \OUT_Ptr <> \IN_Ptr
  275.             MA_MemFree(\OUT_Ptr)
  276.          EndIf
  277.       EndIf
  278.  
  279.       If \Flags   &  #XUPFLG_FILE
  280.          If \IN_Ptr  >  #Null
  281.             MA_MemFree(\IN_Ptr)
  282.          EndIf
  283.          \IN_Ptr  =  #Null
  284.          \IN_Len  =  #Null
  285.       EndIf
  286.  
  287.       \OUT_Ptr =  #Null
  288.       \OUT_Len =  #Null
  289.  
  290.       \Flags   =  #Null
  291.       \Error   =  #Null
  292.  
  293.       ;ClearStructure(@*RS, RS_XUP)
  294.  
  295.    EndWith
  296.  
  297. EndProcedure
  298. Procedure   Unpack(*RS.RS_XUP)
  299.  
  300.    ; *********************************************************************************
  301.    ; In:    RS\IN_Ptr   -> *Ptr to membuf of packed data -> or *StrPtr of @Filename$
  302.    ;        RS\IN_Len   -> Size of packed membuf. If *Ptr = @Filename$ MUST! be #NULL
  303.    ;
  304.    ; Out:   RS\OUT_Ptr  -> *Ptr to unpacked data
  305.    ;        RS\OUT_Len  -> Size of unpacked membuf -> NUL if error
  306.    ;
  307.    ; Pack:  RS\PK_Mode  -> Unpack = *Ptr to Suffix / Pack = Mode (JC/ZC)
  308.    ;        RS\PK_Level -> Level of pack-effiziency (0-9)
  309.    ;
  310.    ; Misc:  RS\Error    -> <> NUL = Error when packing
  311.    ;        RS\Flags    -> #XUP_FLAG_FILE -> IN_Ptr = @Filename$ (free intern memory)
  312.    ; *********************************************************************************
  313.  
  314.    Protected   i, hFile
  315.  
  316.    With  *RS
  317.  
  318.       ; ******************************************************************
  319.       ; * IN_LEN <= 0 then -> IN_PTR = @Filename$ -> Flag = #XUP_FLAG_FILE
  320.       ; ******************************************************************
  321.       If \IN_Len  <= #Null
  322.          hFile =  MA_FileOpen(\IN_Ptr)
  323.          If hFile
  324.             \Flags   =  #XUPFLG_FILE   ; s. XUP_Free()
  325.             \IN_Len  =  MA_FileSize(hFile)
  326.             \IN_Ptr  =  MA_MemAlloc(\IN_Len+SizeOf(Long))   ; Add long if text (zero-ending)
  327.             MA_FileRead(hFile, \IN_Ptr, \IN_Len)
  328.             MA_FileClose(hFile)
  329.          Else
  330.             \Error   =  #XUPERR_FILE
  331.             ProcedureReturn   \Error
  332.          EndIf
  333.       EndIf
  334.  
  335.       If \IN_Len  >  #NUL
  336.  
  337.          \OUT_Ptr =  \IN_Ptr
  338.          \OUT_Len =  \IN_Len
  339.  
  340.          ;*********************************************
  341.          ;* NPK Z -> ZC
  342.          ;*********************************************
  343.          CompilerIf  #XUP_MODE   &  #XUP_NPKZ
  344.             If PeekW(\IN_Ptr) =  #XUPID_NPKZ
  345.                \OUT_Len =  PeekL(\IN_Ptr+SizeOf(Word))
  346.                If \OUT_Len >  0  And   \OUT_Len <  $FFFFF
  347.                   For   i  =  \IN_Len - 32   To \IN_Len
  348.                      If PeekL(\IN_Ptr + i)   =  'DIPN'   ;NPID TAG -> iNPID+lSIZE+szEXT$
  349.                         \PK_Mode =  \IN_Ptr + i
  350.                         \IN_Len  =  i
  351.                         Break
  352.                      EndIf
  353.                   Next
  354.                   \OUT_Ptr =  MA_MemAlloc(\OUT_Len)
  355.                   If ZIP_Decrunch(\OUT_Ptr, @\OUT_Len, \IN_Ptr+6, \IN_Len)
  356.                      MA_MemFree(\OUT_Ptr)
  357.                      \OUT_Ptr =  #NUL
  358.                      \OUT_Len =  #NUL
  359.                   EndIf
  360.                EndIf
  361.                MA_Error(#XUPERR_UNPACK)
  362.             EndIf
  363.          CompilerEndIf
  364.  
  365.          ;*********************************************
  366.          ;* NPK JCalG1 -> JC
  367.          ;*********************************************
  368.          CompilerIf  #XUP_MODE   &  #XUP_JCAL
  369.             If PeekW(\IN_Ptr) =  #XUPID_JCAL
  370.                \OUT_Len =  PeekL(\IN_Ptr+SizeOf(Word))
  371.                If \OUT_Len >  0  And   \OUT_Len <  $FFFFF
  372.                   For   i  =  \IN_Len - 32   To \IN_Len
  373.                      If PeekL(\IN_Ptr + i)   =  'DIPN'   ;NPID (NoisePlug)
  374.                         \PK_Mode =  \IN_Ptr + i
  375.                         \IN_Len  =  i
  376.                         Break
  377.                      EndIf
  378.                   Next
  379.                   If \PK_Mode
  380.                      \OUT_Ptr =  MA_MemAlloc(\OUT_Len)
  381.                      If \OUT_Ptr
  382.                         \OUT_Len =  JCA_Decrunch(\IN_Ptr, \OUT_Ptr)  ; \OUT_Len  =  UnpackMemory(\IN_Ptr, \OUT_Ptr)
  383.                         If \OUT_Len =  #NUL
  384.                            MA_MemFree(\OUT_Ptr)
  385.                            \OUT_Ptr =  #NUL
  386.                         EndIf
  387.                      Else
  388.                         \OUT_Len =  #NUL
  389.                      EndIf
  390.                   Else
  391.                      \OUT_Len =  #NUL
  392.                   EndIf
  393.                EndIf
  394.                MA_Error(#XUPERR_UNPACK)
  395.             EndIf
  396.          CompilerEndIf
  397.  
  398.          ;*********************************************
  399.          ;* Amiga XPKF -> PWPK|IMPL|SQSH|BZP2|GZIP|NONE
  400.          ;*********************************************
  401.          CompilerIf  #XUP_MODE   &  #XUP_XPKF
  402.             If PeekL(\IN_Ptr) =  #XUPID_XPKF
  403.                Select   PeekL(\IN_Ptr+8)
  404.  
  405.                      CompilerIf  #XUP_MODE   &  #XUP_PP20
  406.                      Case  #XUPID_PWPK ;Convert XPKF -> PWPK = PP20...
  407.                         Select   PeekB(\IN_Ptr+\IN_Len-13)
  408.                            Case  0  :  i  =  $09090909
  409.                            Case  1  :  i  =  $0A0A0A09   ;01010100
  410.                            Case  2  :  i  =  $0B0B0A09   ;02020100
  411.                            Case  3  :  i  =  $0C0C0A09   ;03030200
  412.                            Default  :  i  =  $0D0C0A09   ;04030100
  413.                         EndSelect
  414.                         MA_MemMove(\IN_Ptr + $30, \IN_Ptr + $8, \IN_Len - $38)
  415.                         PokeL(\IN_Ptr, #XUPID_PP20)
  416.                         PokeL(\IN_Ptr + 4, i)
  417.                         \IN_Len  -  $38
  418.                      CompilerEndIf
  419.  
  420.                      CompilerIf  #XUP_MODE   &  (#XUP_BZP2  |  #XUP_GZIP)
  421.                      Case  #XUPID_BZP2, #XUPID_GZIP   ;Convert XPKF -> BZP2 = BZ / GZIP = ZIP...
  422.                         MA_MemMove(\IN_Ptr + $2C, \IN_Ptr, \IN_Len - $2C)
  423.                         \OUT_Len =  PeekI(\IN_Ptr)
  424.                         \OUT_Len =  UINT32(\OUT_Len)
  425.                         PokeI(\IN_Ptr, \OUT_Len)
  426.                         \IN_Len  -  $38
  427.                      CompilerEndIf
  428.  
  429.                      CompilerIf  #XUP_MODE   &  #XUP_NONE
  430.                      Case  #XUPID_NONE ;Unpack XPKF -> NONE
  431.                         \OUT_Len =  \IN_Len  -  $2C
  432.                         \OUT_Ptr =  MA_MemAlloc(\OUT_Len)   ; Important: Packed IN_Len > Unpacked OUT_Len
  433.                         MA_MemCopy(\IN_Ptr + $2C, \OUT_Ptr, \OUT_Len)
  434.                         ProcedureReturn   #XUPERR_OK
  435.                      CompilerEndIf
  436.  
  437.                      CompilerIf  #XUP_MODE   &  #XUP_FIMP
  438.                      Case  #XUPID_IMPL ;Convert XPKF = IMPL -> IMP!...
  439.                         MA_MemMove(\IN_Ptr + $30, \IN_Ptr, \IN_Len - $30)
  440.                         \IN_Len  -  $36
  441.                      CompilerEndIf
  442.  
  443.                   Case  #XUPID_SQSH ;Unpack XPKF -> SQSH / Bug? in returned \OUT_Len, must! calculated
  444.                      If XPK_Check(\IN_Ptr, @\IN_Len, @\OUT_Len)   >  #NUL
  445.                         \OUT_Len =  PeekL(\IN_Ptr  +  $C)
  446.                         \OUT_Len =  UINT32(\OUT_Len)
  447.                         \OUT_Ptr =  MA_MemAlloc(\OUT_Len * 2)
  448.                         If XPK_Unpack(\IN_Ptr, \OUT_Ptr) <  #NUL
  449.                            MA_MemFree(\OUT_Ptr)
  450.                            \OUT_Ptr =  #NUL
  451.                            \OUT_Len =  #NUL
  452.                         EndIf
  453.                      EndIf
  454.  
  455.                      MA_Error(#XUPERR_UNPACK)   ; If ERROR then EndProcedure
  456.  
  457.                EndSelect
  458.             EndIf
  459.          CompilerEndIf
  460.  
  461.          ;*********************************************
  462.          ;* Amiga PowerPacker PP20|PP11|PPLS|PPbk
  463.          ;*********************************************
  464.          CompilerIf  #XUP_MODE   &  #XUP_PP20
  465.             Select   PeekL(\IN_Ptr)
  466.                Case  #XUPID_PP20,#XUPID_PPBK,#XUPID_PP10,#XUPID_PP11,#XUPID_PP15,#XUPID_PPLS
  467.                   \OUT_Len =  PPK_GetSize(\IN_Ptr, \IN_Len)
  468.                   If \OUT_Len >  0
  469.                      \OUT_Ptr =  MA_MemAlloc(\OUT_Len)
  470.                      If PPK_Decrunch(\IN_Ptr, \OUT_Ptr, \IN_Len, \OUT_Len) >= #NUL
  471.                         If PeekL(\IN_Ptr) =  #XUPID_PPBK ;AMOSPro Bank? ID="Work"+SPC[4]
  472.                            MA_MemMove(\OUT_Ptr+8, \OUT_Ptr, \OUT_Len-8)
  473.                            \OUT_Len -  8
  474.                         EndIf
  475.                      Else
  476.                         MA_MemFree(\OUT_Ptr)
  477.                         \OUT_Len =  #NUL
  478.                         \OUT_Ptr =  #NUL
  479.                      EndIf
  480.                   EndIf
  481.                   MA_Error(#XUPERR_UNPACK)   ; If ERROR then EndProcedure
  482.             EndSelect
  483.          CompilerEndIf
  484.  
  485.          ;*********************************************
  486.          ;* Amiga FileImploder (FImp) IMP!
  487.          ;*********************************************
  488.          CompilerIf  #XUP_MODE   &  #XUP_FIMP
  489.             Select   PeekL(\IN_Ptr)
  490.                Case  #XUPID_FIMP,#XUPID_MADE,#XUPID_IFHC,#XUPID_PARA,#XUPID_9CDR,#XUPID_FLTI,#XUPID_DUPA
  491.                   \OUT_Len =  IMP_GetSize(\IN_Ptr)
  492.                   If \OUT_Len >  0
  493.                      \OUT_Ptr =  MA_MemAlloc(\OUT_Len * 2)
  494.                      If IMP_Decrunch(\IN_Ptr, \IN_Len, \OUT_Ptr, \OUT_Len) <  #NUL  ;ERROR?
  495.                         MA_MemFree(\OUT_Ptr)
  496.                         \OUT_Ptr =  #NUL
  497.                         \OUT_Len =  #NUL
  498.                      EndIf
  499.                   EndIf
  500.                   MA_Error(#XUPERR_UNPACK)   ; If ERROR then EndProcedure
  501.             EndSelect
  502.          CompilerEndIf
  503.  
  504.          ;*********************************************
  505.          ;* Atari ICE! & ATOMIK -> Ice!|ICE!|ATM5
  506.          ;*********************************************
  507.          CompilerIf  #XUP_MODE   &  #XUP_ICEI
  508.             Select   PeekL(\IN_Ptr)
  509.                Case  #XUPID_IC21,#XUPID_IC24,#XUPID_ATM5
  510.                   Select   PeekL(\IN_Ptr)
  511.                      Case  #XUPID_IC21 :  \OUT_Len =  ice_21_origsize(\IN_Ptr)
  512.                      Case  #XUPID_IC24 :  \OUT_Len =  ice_24_origsize(\IN_Ptr)
  513.                      Case  #XUPID_ATM5 :  \OUT_Len =  atm_35_origsize(\IN_Ptr)
  514.                   EndSelect
  515.                   If \OUT_Len >  0
  516.                      \OUT_Ptr =  MA_MemAlloc(\OUT_Len)
  517.                      Select   PeekL(\IN_Ptr)
  518.                         Case  #XUPID_IC21 :  \OUT_Len =  ice_21_depack(\IN_Ptr, \OUT_Ptr)
  519.                         Case  #XUPID_IC24 :  \OUT_Len =  ice_24_depack(\IN_Ptr, \OUT_Ptr)
  520.                         Case  #XUPID_ATM5 :  \OUT_Len =  atm_35_depack(\IN_Ptr, \OUT_Ptr)
  521.                      EndSelect
  522.                      If \OUT_Len <= #NUL  ;ERROR
  523.                         MA_MemFree(\OUT_Ptr)
  524.                         \OUT_Ptr =  #NUL
  525.                         \OUT_Len =  #NUL
  526.                      EndIf
  527.                   EndIf
  528.                   MA_Error(#XUPERR_UNPACK)   ; If ERROR then EndProcedure
  529.             EndSelect
  530.          CompilerEndIf
  531.  
  532.          ;*********************************************
  533.          ;* BZip2 (Buffer)
  534.          ;*********************************************
  535.          CompilerIf  #XUP_MODE   &  #XUP_BZP2
  536.             If PeekW(\IN_Ptr+SizeOf(Long))   =  'ZB'
  537.                \OUT_Len =  PeekL(\IN_Ptr)
  538.                \OUT_Ptr =  MA_MemAlloc(\OUT_Len)
  539.                If BZ2_Decrunch(\OUT_Ptr, @\OUT_Len, \IN_Ptr + SizeOf(Long), \IN_Len - SizeOf(Long), 0, 0)
  540.                   MA_MemFree(\OUT_Ptr)
  541.                   \OUT_Ptr =  #NUL
  542.                   \OUT_Len =  #NUL
  543.                EndIf
  544.                MA_Error(#XUPERR_UNPACK)   ; If ERROR then EndProcedure
  545.             EndIf
  546.          CompilerEndIf
  547.  
  548.          ;*********************************************
  549.          ;* GZip (Buffer)
  550.          ;*********************************************
  551.          CompilerIf  #XUP_MODE   &  #XUP_GZIP
  552.             If PeekB(\IN_Ptr+SizeOf(Long))   =  'x'
  553.                \OUT_Len =  PeekL(\IN_Ptr)
  554.                \OUT_Ptr =  MA_MemAlloc(\OUT_Len)
  555.                If ZIP_Decrunch(\OUT_Ptr, @\OUT_Len, \IN_Ptr + SizeOf(Long), \IN_Len - SizeOf(Long))
  556.                   MA_MemFree(\OUT_Ptr)
  557.                   \OUT_Ptr =  #NUL
  558.                   \OUT_Len =  #NUL
  559.                EndIf
  560.                MA_Error(#XUPERR_UNPACK)   ; If ERROR then EndProcedure
  561.             EndIf
  562.          CompilerEndIf
  563.  
  564.       EndIf
  565.  
  566.       If \IN_Len  =  \OUT_Len Or \IN_Ptr  =  \OUT_Ptr
  567.          ProcedureReturn   #XUPERR_NOTPACKED
  568.       EndIf
  569.  
  570.    EndWith
  571.  
  572.    ProcedureReturn   #XUPERR_OK  ; All OK, return #NULL
  573.  
  574. EndProcedure
  575.  
  576. EndModule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement