# HG changeset patch # User Laurens Holst # Date 1733527106 -3600 # Sat Dec 07 00:18:26 2024 +0100 # Node ID a3d707f950920646c2e5b091c755454692f17f07 # Parent ca46aa239baf38af758b3f0b9bd3bde6a705540e gunzip: Read decompressed data in blocks. Rather than through callbacks to a writer. This makes it easier to process. Mapped32KWriter and MappedBufferLoader now work without Writer. diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,2 +1,2 @@ -7822e6e3f2dc98efe8c571dfd73042172d492e97 lib/gunzip -d30b04366fbd338ea986834315653980be450151 lib/neonlib +8b931818a05f9ce3242a560ab962956232ad401f lib/gunzip +f5d4ac3a27c5e04578db4551e52ed6f50a111448 lib/neonlib diff --git a/src/Application.asm b/src/Application.asm --- a/src/Application.asm +++ b/src/Application.asm @@ -264,7 +264,7 @@ ret ; ix = this -Application_InflateFile: +Application_InflateFile: PROC push ix call Application_GetCLI call CLI_GetFileInfoBlock @@ -276,9 +276,18 @@ push ix call FileReader_class.New call FileReader_Construct - ld e,ixl - ld d,ixh + push ix + push ix push ix + ld ix,Heap_main + ld bc,Decoders._size + call Heap_Allocate + ld c,e + ld b,d + pop ix + pop hl + push bc + ld de,Mapped32KWriter_BASE_ADDRESS ld a,GZIP_CRC32 ? -1 : 0 call GzipArchive_class.New call GzipArchive_Construct @@ -290,18 +299,14 @@ ld d,ixh ex (sp),ix push ix - push de - push ix - ld ix,Heap_main - ld bc,Decoders._size - call Heap_Allocate - ld c,e - ld b,d + ld hl,InflateLoop + call System_TryCall pop ix - pop de - push bc - ld hl,GzipArchive_Extract - call System_TryCall + ex (sp),ix + call Mapped32KWriter_Destruct + call Mapped32KWriter_class.Delete + pop ix + call GzipArchive_class.Delete pop de push ix ld ix,Heap_main @@ -309,16 +314,24 @@ call Heap_Free pop ix pop ix - ex (sp),ix - call Mapped32KWriter_Destruct - call Mapped32KWriter_class.Delete - pop ix - call GzipArchive_class.Delete - pop ix call FileReader_Destruct call FileReader_class.Delete pop ix jp System_Rethrow +; de = mapped writer +; ix = gzip archive +InflateLoop: + push de + call GzipArchive_Inflate + ex (sp),ix + push af + call Mapped32KWriter_CopyToMappedBuffer + pop af + ex (sp),ix + pop de + jr nz,InflateLoop + ret + ENDP ; ix = this Application_PrintLoading: diff --git a/src/COM.asm b/src/COM.asm --- a/src/COM.asm +++ b/src/COM.asm @@ -46,7 +46,6 @@ INCLUDE "MappedBuffer.asm" INCLUDE "MappedBufferLoader.asm" INCLUDE "MappedReader.asm" - INCLUDE "MappedWriter.asm" INCLUDE "Mapped32KWriter.asm" ; gunzip @@ -58,7 +57,7 @@ INCLUDE "deflate/Branch.asm" INCLUDE "deflate/HuffmanCodes.asm" INCLUDE "Reader.asm" - INCLUDE "Writer.asm" + INCLUDE "BitReader.asm" INCLUDE "FileReader.asm" ENDS diff --git a/src/Mapped32KWriter.asm b/src/Mapped32KWriter.asm --- a/src/Mapped32KWriter.asm +++ b/src/Mapped32KWriter.asm @@ -1,12 +1,11 @@ ; -; Writer backed by a mapped buffer +; Mapped buffer writer for gzip inflate ; Mapped32KWriter_BASE_ADDRESS: equ 4000H Mapped32KWriter_SEGMENT_SIZE: equ 4000H Mapped32KWriter_BUFFER_SIZE: equ 8000H Mapped32KWriter: MACRO - super: Writer buffer: dw 0 originalPage1: MapperSegment @@ -23,11 +22,6 @@ Mapped32KWriter_Construct: ld (ix + Mapped32KWriter.buffer),e ld (ix + Mapped32KWriter.buffer + 1),d - ld hl,Mapped32KWriter_BASE_ADDRESS - ld bc,Mapped32KWriter_BUFFER_SIZE - ld de,Mapped32KWriter_Flush - call Writer_Construct - ld h,40H call Mapper_instance.GetPH ld (ix + Mapped32KWriter.originalPage1.segment),a @@ -38,7 +32,6 @@ ld (ix + Mapped32KWriter.originalPage2.segment),a call Memory_GetSlot ld (ix + Mapped32KWriter.originalPage2.slot),a - push ix call Mapped32KWriter_GetBuffer call MappedBuffer_AllocateAndAddSegment @@ -73,21 +66,11 @@ ld ixh,d ret -; bc = byte count +; hl = byte count ; de = buffer start ; ix = this -; Modifies: af, hl -Mapped32KWriter_Flush: - push bc - push de - call Mapped32KWriter_CopyToMappedBuffer - pop de - pop bc - ret - -; ix = this Mapped32KWriter_CopyToMappedBuffer: PROC - push bc + push hl push de push ix call Mapped32KWriter_GetBuffer diff --git a/src/MappedBuffer.asm b/src/MappedBuffer.asm --- a/src/MappedBuffer.asm +++ b/src/MappedBuffer.asm @@ -150,20 +150,20 @@ pop ix ret -; bc = size to add +; hl = size to add ; ix = this MappedBuffer_IncreaseSize: - ld l,(ix + MappedBuffer.size) - ld h,(ix + MappedBuffer.size + 1) - ld e,(ix + MappedBuffer.size + 2) - ld d,(ix + MappedBuffer.size + 3) + push hl + ld c,(ix + MappedBuffer.size) + ld b,(ix + MappedBuffer.size + 1) add hl,bc ld (ix + MappedBuffer.size),l ld (ix + MappedBuffer.size + 1),h + pop hl ret nc - inc de - ld (ix + MappedBuffer.size + 2),e - ld (ix + MappedBuffer.size + 3),d + inc (ix + MappedBuffer.size + 2) + ret nz + inc (ix + MappedBuffer.size + 3) ret ; dehl = position diff --git a/src/MappedBufferLoader.asm b/src/MappedBufferLoader.asm --- a/src/MappedBufferLoader.asm +++ b/src/MappedBufferLoader.asm @@ -1,14 +1,15 @@ ; ; Buffers an entire file in memory ; -MappedBufferLoader_BASE_ADDRESS: equ 8000H +MappedBufferLoader_PAGE_START: equ 8000H MappedBufferLoader_PAGE_SIZE: equ 4000H +MappedBufferLoader_PAGE_END: equ MappedBufferLoader_PAGE_START + MappedBufferLoader_PAGE_SIZE MappedBufferLoader: MACRO fileHandle: db 0 - writer: - MappedWriter + buffer: + dw 0 _size: ENDM @@ -16,15 +17,9 @@ ; de = mapped buffer ; ix = this MappedBufferLoader_Construct: - push hl - push ix - push de - call MappedBufferLoader_GetWriter - pop de - ld hl,MappedBufferLoader_BASE_ADDRESS - call MappedWriter_Construct - pop ix - pop de + ld (ix + MappedBufferLoader.buffer),e + ld (ix + MappedBufferLoader.buffer + 1),d + ex de,hl ld a,00000001B ; read-only call DOS_OpenFileHandle call DOS_TerminateIfError @@ -35,67 +30,103 @@ MappedBufferLoader_Destruct: ld b,(ix + MappedBufferLoader.fileHandle) call DOS_CloseFileHandle - call DOS_TerminateIfError - push ix - call MappedBufferLoader_GetWriter - call Writer_FinishBlock - pop ix - ret + jp DOS_TerminateIfError -; de <- mapped writer -; ix <- mapped writer -MappedBufferLoader_GetWriter: - ld de,MappedBufferLoader.writer - add ix,de +; ix = this +; de <- buffer +; ix <- buffer +MappedBufferLoader_GetBuffer: + ld e,(ix + MappedBufferLoader.buffer) + ld d,(ix + MappedBufferLoader.buffer + 1) + ld ixl,e + ld ixh,d ret ; ix = this -MappedBufferLoader_Load: - ld h,MappedBufferLoader_BASE_ADDRESS >> 8 +MappedBufferLoader_Load: PROC + ld de,MappedBufferLoader_PAGE_END +Loop: + ld a,d + cp MappedBufferLoader_PAGE_END >> 8 + call nc,NextSegment + call Load + push af + push de + push ix + call MappedBufferLoader_GetBuffer + call MappedBuffer_IncreaseSize + pop ix + pop de + pop af + cp .EOF + ret z + call DOS_TerminateIfError + jr Loop +NextSegment: + push ix + call MappedBufferLoader_GetBuffer + call MappedBuffer_AllocateAndAddSegment + ld h,MappedBufferLoader_PAGE_START >> 8 + call MappedBuffer_SelectSegment + pop ix + ld de,MappedBufferLoader_PAGE_START + ret +Load: + push de + ld h,d call Memory_GetSlot + pop de + ld hl,MappedBufferLoader_PAGE_END + and a + sbc hl,de ld b,a ld a,(Mapper_instance.primaryMapperSlot) cp b - jr nz,MappedBufferLoader_LoadViaBuffer - push ix - call MappedBufferLoader_GetWriter - call Writer_WriteBlockDirect - pop ix - ld l,c - ld h,b + jr z,MappedBufferLoader_LoadDirect + jr MappedBufferLoader_LoadIndirect + ENDP + +; de = destination +; hl = byte count +; ix = this +; a <- error +; de <- updated destination +; hl <- actual byte count +MappedBufferLoader_LoadDirect: + push de ld b,(ix + MappedBufferLoader.fileHandle) call DOS_ReadFromFileHandle - cp .EOF - ret z - call DOS_TerminateIfError - push af - push ix - call MappedBufferLoader_GetWriter - ld c,l - ld b,h - call Writer_Advance - pop ix - pop af - jr MappedBufferLoader_Load + pop de + add hl,de + ex de,hl + ret ; Load data to BASE_ADDRESS via a buffer in the primary mapper. ; Because DOS2 can not load directly into nonprimary mapper slots. +; de = destination +; hl = byte count ; ix = this -MappedBufferLoader_LoadViaBuffer: +; a <- error +; de <- updated destination +; hl <- actual byte count +MappedBufferLoader_LoadIndirect: PROC + push de + ld de,READBUFFER_SIZE + and a + sbc hl,de + add hl,de + jr c,NoClamp + ex de,hl +NoClamp: ld de,READBUFFER - ld hl,READBUFFER_SIZE ld b,(ix + MappedBufferLoader.fileHandle) call DOS_ReadFromFileHandle - cp .EOF - ret z - call DOS_TerminateIfError + pop de push af - push ix - call MappedBufferLoader_GetWriter - ld de,READBUFFER ld c,l ld b,h - call Writer_WriteBlock - pop ix + ld hl,READBUFFER + call System_FastLDIR pop af - jr MappedBufferLoader_Load + ret + ENDP diff --git a/src/MappedWriter.asm b/src/MappedWriter.asm deleted file mode 100644 --- a/src/MappedWriter.asm +++ /dev/null @@ -1,72 +0,0 @@ -; -; Writer backed by a mapped buffer -; -MappedWriter_SEGMENT_SIZE: equ 4000H - -MappedWriter: MACRO - super: Writer - buffer: - dw 0 - _size: - ENDM - -; de = mapped buffer -; hl = base address -; ix = this -MappedWriter_Construct: - ld a,l - and a - call nz,System_ThrowException - ld a,h - and 3FH - call nz,System_ThrowException - ld (ix + MappedWriter.buffer),e - ld (ix + MappedWriter.buffer + 1),d - ld bc,MappedWriter_SEGMENT_SIZE - ld de,MappedWriter_Flush - call Writer_Construct - jr MappedWriter_AllocateNextSegment - -; ix = this -; de <- buffer -; ix <- buffer -MappedWriter_GetBuffer: - ld e,(ix + MappedWriter.buffer) - ld d,(ix + MappedWriter.buffer + 1) - ld ixl,e - ld ixh,d - ret - -; bc = byte count -; de = buffer start -; ix = this -MappedWriter_Flush: - push bc - push de - push ix - call MappedWriter_GetBuffer - call MappedBuffer_IncreaseSize - pop ix - pop de - pop bc - ld l,0 - ld h,(ix + MappedWriter.super.bufferEnd) - and a - sbc hl,de - call c,System_ThrowException - sbc hl,bc - call c,System_ThrowException - ret nz - jr MappedWriter_AllocateNextSegment - -; ix = this -MappedWriter_AllocateNextSegment: - ld h,(ix + MappedWriter.super.bufferStart) - push ix - push hl - call MappedWriter_GetBuffer - call MappedBuffer_AllocateAndAddSegment - pop hl - call MappedBuffer_SelectSegment - pop ix - ret