M src/COM.asm +2 -0
@@ 5,6 5,8 @@
INCLUDE "Macros.asm"
DEBUG: equ 1
+GZIP_CRC32: equ 1
+ZLIB_ADLER32: equ 1
org 100H
M src/GzipArchive.asm +24 -0
@@ 17,9 17,13 @@ GzipArchive: MACRO
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 @@ GzipArchive: MACRO
isize:
dd 0
crc32:
+ IF GZIP_CRC32
dd 0
+ ENDIF
_size:
ENDM
@@ 46,7 52,9 @@ GzipArchive_template: GzipArchive
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_ReadHeader:
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 @@ GzipArchive_ReadFooter:
; 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 @@ GzipArchive_DestroyInflate:
; de = writer (min 32K)
; ix = this
GzipArchive_CreateCRC32Checker:
+ IF GZIP_CRC32
push de
push ix
call CRC32Checker_class.New
@@ 192,10 207,12 @@ GzipArchive_CreateCRC32Checker:
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 @@ GzipArchive_DestroyCRC32Checker:
call CRC32Checker_class.Delete
pop ix
ret
+ ENDIF
; ix = this
GzipArchive_Inflate:
@@ 220,9 238,11 @@ GzipArchive_Verify:
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 @@ GzipArchive_VerifyISIZE:
; 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 @@ GzipArchive_VerifyCRC32:
call CRC32Checker_VerifyCRC32
pop ix
ret
+ ENDIF
;
GzipArchive_notGzipError:
@@ 302,4 324,6 @@ GzipArchive_isizeMismatchError:
db "Inflated size mismatch.",13,10,0
GzipArchive_crc32MismatchError:
+ IF GZIP_CRC32
db "Inflated CRC32 mismatch.",13,10,0
+ ENDIF
M src/ZlibArchive.asm +24 -0
@@ 10,9 10,13 @@ ZlibArchive: MACRO
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 @@ ZlibArchive: MACRO
flevel:
dd 0
adler32:
+ IF ZLIB_ADLER32
dd 0
+ ENDIF
_size:
ENDM
@@ 35,7 41,9 @@ ZlibArchive_template: ZlibArchive
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 @@ NoAdd:
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 @@ ZlibArchive_DestroyInflate:
; de = writer (min 32K)
; ix = this
ZlibArchive_CreateAdler32Checker:
+ IF ZLIB_ADLER32
push de
push ix
call Adler32Checker_class.New
@@ 183,10 198,12 @@ ZlibArchive_CreateAdler32Checker:
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 @@ ZlibArchive_DestroyAdler32Checker:
call Adler32Checker_class.Delete
pop ix
ret
+ ENDIF
; ix = this
ZlibArchive_Inflate:
@@ 207,14 225,17 @@ ZlibArchive_Inflate:
; 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 @@ ZlibArchive_VerifyAdler32:
call Adler32Checker_VerifyAdler32
pop ix
ret
+ ENDIF
;
ZlibArchive_invalidFCHECKError:
@@ 243,4 265,6 @@ ZlibArchive_unsupportedPresetDictionaryE
db "Unsupported preset dictionary.",13,10,0
ZlibArchive_adler32MismatchError:
+ IF ZLIB_ADLER32
db "Inflated Adler32 checksum mismatch.",13,10,0
+ ENDIF