# HG changeset patch # User Laurens Holst # Date 1510345312 -3600 # Fri Nov 10 21:21:52 2017 +0100 # Node ID 5153e796c57baacdf35351b420a8c292caa96261 # Parent dcc2a9695290836e7387d0946941d237dd6d6877 GzipArchive/ZlibArchive: Option to exclude CRC32 / Adler32 from compilation. diff --git a/src/COM.asm b/src/COM.asm --- a/src/COM.asm +++ b/src/COM.asm @@ -5,6 +5,8 @@ INCLUDE "Macros.asm" DEBUG: equ 1 +GZIP_CRC32: equ 1 +ZLIB_ADLER32: equ 1 org 100H diff --git a/src/GzipArchive.asm b/src/GzipArchive.asm --- a/src/GzipArchive.asm +++ b/src/GzipArchive.asm @@ -17,9 +17,13 @@ inflate: dw 0 crc32CheckEnabled: + IF GZIP_CRC32 db 0 + ENDIF crc32Checker: + IF GZIP_CRC32 dw 0 + ENDIF flags: db 0 mtime: @@ -31,7 +35,9 @@ isize: dd 0 crc32: + IF GZIP_CRC32 dd 0 + ENDIF _size: ENDM @@ -46,7 +52,9 @@ GzipArchive_Construct: ld (ix + GzipArchive.reader),e ld (ix + GzipArchive.reader + 1),d + IF GZIP_CRC32 ld (ix + GzipArchive.crc32CheckEnabled),a + ENDIF call GzipArchive_ReadHeader ld e,ixl ld d,ixh @@ -131,10 +139,12 @@ GzipArchive_ReadFooter: call GzipArchive_GetReaderIY call Reader_ReadDoubleWord_IY + IF GZIP_CRC32 ld (ix + GzipArchive.crc32),l ld (ix + GzipArchive.crc32 + 1),h ld (ix + GzipArchive.crc32 + 2),e ld (ix + GzipArchive.crc32 + 3),d + ENDIF call Reader_ReadDoubleWord_IY ld (ix + GzipArchive.isize),l ld (ix + GzipArchive.isize + 1),h @@ -145,15 +155,19 @@ ; de = writer (min 32K) ; ix = this GzipArchive_Extract: + IF GZIP_CRC32 bit 0,(ix + GzipArchive.crc32CheckEnabled) call nz,GzipArchive_CreateCRC32Checker + ENDIF call GzipArchive_CreateInflate call GzipArchive_Inflate call GzipArchive_ReadFooter call GzipArchive_Verify call GzipArchive_DestroyInflate + IF GZIP_CRC32 bit 0,(ix + GzipArchive.crc32CheckEnabled) call nz,GzipArchive_DestroyCRC32Checker + ENDIF ret ; de = writer (min 32K) @@ -183,6 +197,7 @@ ; de = writer (min 32K) ; ix = this GzipArchive_CreateCRC32Checker: + IF GZIP_CRC32 push de push ix call CRC32Checker_class.New @@ -192,10 +207,12 @@ ld (ix + GzipArchive.crc32Checker + 1),d pop de ret + ENDIF ; de = writer (min 32K) ; ix = this GzipArchive_DestroyCRC32Checker: + IF GZIP_CRC32 ld e,(ix + GzipArchive.crc32Checker) ld d,(ix + GzipArchive.crc32Checker + 1) push ix @@ -205,6 +222,7 @@ call CRC32Checker_class.Delete pop ix ret + ENDIF ; ix = this GzipArchive_Inflate: @@ -220,9 +238,11 @@ ld hl,GzipArchive_isizeMismatchError jp nz,System_TerminateWithError + IF GZIP_CRC32 call GzipArchive_VerifyCRC32 ld hl,GzipArchive_crc32MismatchError jp nz,System_TerminateWithError + ENDIF ret ; ix = this @@ -274,6 +294,7 @@ ; ix = this ; f <- nz: mismatch GzipArchive_VerifyCRC32: + IF GZIP_CRC32 bit 0,(ix + GzipArchive.crc32CheckEnabled) ret z ld e,(ix + GzipArchive.crc32Checker) @@ -287,6 +308,7 @@ call CRC32Checker_VerifyCRC32 pop ix ret + ENDIF ; GzipArchive_notGzipError: @@ -302,4 +324,6 @@ db "Inflated size mismatch.",13,10,0 GzipArchive_crc32MismatchError: + IF GZIP_CRC32 db "Inflated CRC32 mismatch.",13,10,0 + ENDIF diff --git a/src/ZlibArchive.asm b/src/ZlibArchive.asm --- a/src/ZlibArchive.asm +++ b/src/ZlibArchive.asm @@ -10,9 +10,13 @@ inflate: dw 0 adler32CheckEnabled: + IF ZLIB_ADLER32 db 0 + ENDIF adler32Checker: + IF ZLIB_ADLER32 dw 0 + ENDIF cm: db 0 cinfo: @@ -20,7 +24,9 @@ flevel: dd 0 adler32: + IF ZLIB_ADLER32 dd 0 + ENDIF _size: ENDM @@ -35,7 +41,9 @@ ZlibArchive_Construct: ld (ix + ZlibArchive.reader),e ld (ix + ZlibArchive.reader + 1),d + IF ZLIB_ADLER32 ld (ix + ZlibArchive.adler32CheckEnabled),a + ENDIF call ZlibArchive_ReadHeader ld e,ixl ld d,ixh @@ -127,24 +135,30 @@ ZlibArchive_ReadFooter: call ZlibArchive_GetReaderIY call Reader_ReadDoubleWordBE_IY + IF ZLIB_ADLER32 ld (ix + ZlibArchive.adler32),l ld (ix + ZlibArchive.adler32 + 1),h ld (ix + ZlibArchive.adler32 + 2),e ld (ix + ZlibArchive.adler32 + 3),d + ENDIF ret ; de = writer (min 32K) ; ix = this ZlibArchive_Extract: + IF ZLIB_ADLER32 bit 0,(ix + ZlibArchive.adler32CheckEnabled) call nz,ZlibArchive_CreateAdler32Checker + ENDIF call ZlibArchive_CreateInflate call ZlibArchive_Inflate call ZlibArchive_ReadFooter call ZlibArchive_Verify call ZlibArchive_DestroyInflate + IF ZLIB_ADLER32 bit 0,(ix + ZlibArchive.adler32CheckEnabled) call nz,ZlibArchive_DestroyAdler32Checker + ENDIF ret ; de = writer (min 32K) @@ -174,6 +188,7 @@ ; de = writer (min 32K) ; ix = this ZlibArchive_CreateAdler32Checker: + IF ZLIB_ADLER32 push de push ix call Adler32Checker_class.New @@ -183,10 +198,12 @@ ld (ix + ZlibArchive.adler32Checker + 1),d pop de ret + ENDIF ; de = writer (min 32K) ; ix = this ZlibArchive_DestroyAdler32Checker: + IF ZLIB_ADLER32 ld e,(ix + ZlibArchive.adler32Checker) ld d,(ix + ZlibArchive.adler32Checker + 1) push ix @@ -196,6 +213,7 @@ call Adler32Checker_class.Delete pop ix ret + ENDIF ; ix = this ZlibArchive_Inflate: @@ -207,14 +225,17 @@ ; ix = this ZlibArchive_Verify: + IF ZLIB_ADLER32 call ZlibArchive_VerifyAdler32 ld hl,ZlibArchive_adler32MismatchError jp nz,System_TerminateWithError + ENDIF ret ; ix = this ; f <- nz: mismatch ZlibArchive_VerifyAdler32: + IF ZLIB_ADLER32 bit 0,(ix + ZlibArchive.adler32CheckEnabled) ret z ld e,(ix + ZlibArchive.adler32Checker) @@ -228,6 +249,7 @@ call Adler32Checker_VerifyAdler32 pop ix ret + ENDIF ; ZlibArchive_invalidFCHECKError: @@ -243,4 +265,6 @@ db "Unsupported preset dictionary.",13,10,0 ZlibArchive_adler32MismatchError: + IF ZLIB_ADLER32 db "Inflated Adler32 checksum mismatch.",13,10,0 + ENDIF