removes external dependency on tinf by replacing the compression algorithm with a simpler, faster, smaller and more auditable fixed-width LZ77 encoding purpose-tailored to x86 code mixed with data. before: decompressor.bin 2,492 bytes (tinf dependency) with .text 0x875 and .rodata 0x13c bytes each. after: decompressor.bin consists only of .text, 0xe6-byte decompressor; 90.8% reduction in decompressor volume. the dependency on gzip during compile-time is replaced by host/limlzpack.c, a Lempel-Ziv encoder in 275 SLoC that uses a suffix array matchfinder (prefix-doubling in mathcal O(n log^2 n) and Storer-Szymanski backwards parse. the fixed-width formats packets as [F][LLLL][MMM], favouring a literal-skewed distribution with F switching between one-byte and two-byte offsets (favouring recent statistics). integrity checking is done via crc32 with the polynomial 0xEDB88320, reflected. the effective loss in compression ratio by using a tremendously simpler and less packed with edge cases algorithm causes a compression ratio hit well below 1KB, factoring in the stub sizes. also adds new machinery for host cc detection per review.
61 lines
950 B
NASM
61 lines
950 B
NASM
org 0x7c00
|
|
bits 16
|
|
|
|
start:
|
|
cli
|
|
cld
|
|
jmp 0x0000:.initialise_cs
|
|
.initialise_cs:
|
|
xor ax, ax
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov ss, ax
|
|
mov sp, 0x7c00
|
|
|
|
lgdt [gdt]
|
|
|
|
mov eax, cr0
|
|
bts ax, 0
|
|
mov cr0, eax
|
|
|
|
jmp 0x08:.mode32
|
|
bits 32
|
|
.mode32:
|
|
mov eax, 0x10
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov fs, ax
|
|
mov gs, ax
|
|
mov ss, ax
|
|
|
|
push 0x1
|
|
and edx, 0xff
|
|
push edx
|
|
|
|
push stage2.size
|
|
push (stage2 - decompressor) + 0x70000
|
|
|
|
mov esi, decompressor
|
|
mov edi, 0x70000
|
|
mov ecx, stage2.fullsize
|
|
rep movsb
|
|
|
|
call 0x70000
|
|
|
|
; Includes
|
|
|
|
%include '../gdt.asm'
|
|
|
|
; ********************* Stage 2 *********************
|
|
|
|
decompressor:
|
|
%strcat DECOMPRESSOR_PATH BUILDDIR, '/decompressor-build/decompressor.bin'
|
|
incbin DECOMPRESSOR_PATH
|
|
|
|
align 16
|
|
stage2:
|
|
%strcat STAGE2_PATH BUILDDIR, '/common-bios/stage2.bin.limlz'
|
|
incbin STAGE2_PATH
|
|
.size: equ $ - stage2
|
|
.fullsize: equ $ - decompressor
|