wok rev 25514
Add memtest64
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Thu Feb 16 14:18:05 2023 +0000 (21 months ago) |
parents | 2956e54cc56a |
children | 8acc87b18a99 |
files | memtest-efi32/receipt memtest-efi64/receipt memtest/receipt memtest64/receipt memtest64/stuff/bootloader.S memtest64/stuff/pack memtest64/stuff/unlz4.S memtest64/stuff/unlzma.S memtest64/stuff/unlzsa1.S memtest64/stuff/unlzsa2.S memtest64/stuff/unpack.S memtest64/stuff/unpackx.S |
line diff
1.1 --- a/memtest-efi32/receipt Tue Feb 14 15:41:57 2023 +0000 1.2 +++ b/memtest-efi32/receipt Thu Feb 16 14:18:05 2023 +0000 1.3 @@ -1,7 +1,7 @@ 1.4 # SliTaz package receipt. 1.5 1.6 PACKAGE="memtest-efi32" 1.7 -VERSION="6.01" 1.8 +VERSION="6.10" 1.9 CATEGORY="base-system" 1.10 SHORT_DESC="Memory failures detection tool." 1.11 MAINTAINER="pascal.bellard@slitaz.org"
2.1 --- a/memtest-efi64/receipt Tue Feb 14 15:41:57 2023 +0000 2.2 +++ b/memtest-efi64/receipt Thu Feb 16 14:18:05 2023 +0000 2.3 @@ -1,7 +1,7 @@ 2.4 # SliTaz package receipt. 2.5 2.6 PACKAGE="memtest-efi64" 2.7 -VERSION="6.01" 2.8 +VERSION="6.10" 2.9 CATEGORY="base-system" 2.10 SHORT_DESC="Memory failures detection tool." 2.11 MAINTAINER="pascal.bellard@slitaz.org"
3.1 --- a/memtest/receipt Tue Feb 14 15:41:57 2023 +0000 3.2 +++ b/memtest/receipt Thu Feb 16 14:18:05 2023 +0000 3.3 @@ -66,7 +66,6 @@ 3.4 # Rules to configure and make the package. 3.5 compile_rules() 3.6 { 3.7 - # Need CPUID instruction (586+ cpu) 3.8 sed -i 's|64, MT_VERSION "." GIT_HASH|65, MT_VERSION ".SliTaz"|;s|"\.x32"|".386"|' app/display.c 3.9 sed 's|gcc|gcc-83|;s|march=i586|march=i486|' -i build32/Makefile 3.10 patch -p0 < $stuff/memtest86\+-6-386.patch
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/memtest64/receipt Thu Feb 16 14:18:05 2023 +0000 4.3 @@ -0,0 +1,86 @@ 4.4 +# SliTaz package receipt. 4.5 + 4.6 +PACKAGE="memtest64" 4.7 +VERSION="6.10" 4.8 +CATEGORY="base-system" 4.9 +SHORT_DESC="Memory failures detection tool." 4.10 +MAINTAINER="pascal.bellard@slitaz.org" 4.11 +LICENSE="GPL2" 4.12 +TARBALL="$PACKAGE-$VERSION.zip" 4.13 +WEB_SITE="https://www.memtest.org/" # https://github.com/memtest86plus/memtest86plus/ 4.14 +WGET_URL="https://memtest.org/download/v$VERSION/mt86plus_${VERSION}.binaries.zip" 4.15 + 4.16 +# What is the latest version available today? 4.17 +current_version() 4.18 +{ 4.19 + wget -O - $WEB_SITE 2>/dev/null | \ 4.20 + sed '/binaries.zip/!d;s|.*mt86plus_||;s|.binaries.zip.*||;q' 4.21 +} 4.22 + 4.23 +asm() 4.24 +{ 4.25 + cc -o $1.o -Wa,-a=$1.lst -c $1.S 4.26 + objcopy --only-section=.text -O binary $1.o $1.bin 4.27 +} 4.28 + 4.29 +tune_lzma() 4.30 +{ 4.31 + file=$1 4.32 + shift 4.33 + for i in lzma lz4x2 lzsa1x2 lzsa2x2 ; do 4.34 + cp $stuff/*.S $stuff/pack . 4.35 + sed "s/VERSION/$VERSION/;s|lzma1=|&nice=${1:-64},|" -i pack 4.36 + while [ -n "$2" ]; do 4.37 + sed "s|^#define PROP_$2 .*|#define PROP_$2 $3|" -i unlzma.S 4.38 + shift 2 4.39 + done 4.40 + sed -i "s|uncompress|un${i%x2}|" unpack.S 4.41 + asm bootloader 4.42 + asm unpack 4.43 + cp pack pack.bak 4.44 + ./pack --build bootloader.bin unpack.bin 4.45 + PACKER=${i%x2} ./pack $file $file.${i%x2} 4.46 + if [ $(stat -c %s $file.${i%x2}) -ge $((0x101F0)) ]; then 4.47 + rm $file.${i%x2} 4.48 + cp pack.bak pack 4.49 + sed -e "s|^#define FLAT16.*// lzma case|#define FLAT16 0 // ${i%x2}|" -i unpack.S 4.50 + asm unpack 4.51 + ./pack --build bootloader.bin unpack.bin 4.52 + PACKER=${i%x2} ./pack $file $file.${i%x2} 4.53 + fi 4.54 + mv unpack.lst unpack.lst.${i%x2} 4.55 + if [ "${i#*x}" = "2" ]; then 4.56 + cp pack.bak pack 4.57 + sed -e "s|^#define DOUBLE_PACKED|#define DOUBLE_PACKED 1 // $i|" -i unpack.S 4.58 + asm unpack 4.59 + ./pack --build bootloader.bin unpack.bin 4.60 + PACKER=${i%x2} ./pack $file $file.$i 4.61 + mv unpack.lst unpack.lst.$i 4.62 + fi 4.63 + done 4.64 +} 4.65 + 4.66 +# Rules to configure and make the package. 4.67 +compile_rules() 4.68 +{ 4.69 + tune_lzma memtest64.bin 55,mf=bt2 LC 3 PB 2 4.70 +} 4.71 + 4.72 +# Rules to gen a SliTaz package suitable for Tazpkg. 4.73 +genpkg_rules() 4.74 +{ 4.75 + mkdir -p $fs/boot 4.76 + cp $src/memtest64.bin.lzma $fs/boot/memtest64.exe 4.77 +} 4.78 + 4.79 +# Pre and post install commands for Tazpkg. 4.80 +post_install() 4.81 +{ 4.82 + [ -s $1/boot/isolinux/isolinux.cfg ] && 4.83 + ! grep -qs 'Check 64bits memory' $1/boot/isolinux/isolinux.cfg && sed -i \ 4.84 +'s|LABEL md5|LABEL memtest64 mem64 ram64\ 4.85 + MENU LABEL Check 64bits memory\ 4.86 + KERNEL /boot/memtest64.exe\ 4.87 +\n&|' $1/boot/isolinux/isolinux.cfg 4.88 + true 4.89 +}
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 5.2 +++ b/memtest64/stuff/bootloader.S Thu Feb 16 14:18:05 2023 +0000 5.3 @@ -0,0 +1,684 @@ 5.4 +// Image/zImage & tiny bzImage linux kernel boot sector, (C) SliTaz, GPL2. 5.5 + 5.6 +SYSSEG = 0x1000 5.7 +setup_sects = 497 5.8 +syssize = 500 5.9 +cmd_line_ptr = 0x228 5.10 + 5.11 + .text 5.12 + .code16 5.13 + .org 0 5.14 + .globl _start 5.15 +_start: 5.16 + 5.17 +#define CODESZ 512 /* patched by installer */ 5.18 + 5.19 +// Default kernel format is 386 Image/zImage 5.20 +//#define BZIMAGE 0x207 /* setup version ; for bzImage < 512 Kb only */ 5.21 +//#define ELKS /* 8086/286 linux port */ 5.22 + 5.23 +/* some extra features */ 5.24 +#define EXE_SUPPORT real mode dos .exe file support +208/264 5.25 +#define CMDLINE dos kernel cmdline support +45 5.26 +#define BUGGY_CMDLINE verify cmdline length +2 5.27 +#define VCPI VCPI 4.0 support (386+) +109 5.28 +#define SHUTDOWNDOS shutdown DOS services +29 5.29 +#define CHK_DOS_INT19 do not trace bios +12/13 5.30 + 5.31 +/* some contraints to reduce the code size */ 5.32 +//#define FLOPPY_1440K_ONLY 1.44M floppies support only -26 5.33 +//#define FLOPPY_HAS_2_SIDES hardcoded heads count to 2 -15 5.34 +//#define NO_CMDLINE_SHRINK remove heading spaces ? -6-21 5.35 +//#define NO_CMDLINE_FILE remove @cmdline file support ? -21 5.36 +#define NO_DOTS show progression dots ? -5 5.37 +#ifndef BZIMAGE 5.38 +//#define TINY_ZIMAGE system < 64Kb ? -11 5.39 +//#define NO_MINSETUP default setup (dos only) ? -4 5.40 +//#define NO_CURSOR_DEFINITION -8 5.41 +#endif 5.42 + 5.43 +#ifdef ELKS 5.44 + .arch i8086 5.45 +INITSEG = 0x0100 5.46 +SETUPSEG = 0x0120 5.47 +#define ONLY8086 5.48 +#undef BZIMAGE 5.49 +#undef VCPI 5.50 +#else 5.51 +INITSEG = 0x9000 5.52 +SETUPSEG = 0x9020 5.53 +#endif 5.54 + 5.55 +.macro shlclw cnt,obj 5.56 +#ifdef ONLY8086 5.57 + movb \cnt,%cl 5.58 + shlw %cl,\obj 5.59 +#else 5.60 + shlw \cnt,\obj 5.61 +#endif 5.62 +.endm 5.63 + 5.64 +.macro shrclw cnt,obj 5.65 +#ifdef ONLY8086 5.66 + movb \cnt,%cl 5.67 + shrw %cl,\obj 5.68 +#else 5.69 + shrw \cnt,\obj 5.70 +#endif 5.71 +.endm 5.72 + 5.73 +#ifdef EXE_SUPPORT 5.74 +#define EXEADRS(x) (x+0xE0) 5.75 +#define FLAT20(x) (x+16*INITSEG) 5.76 + 5.77 +.macro trace_int19 5.78 +#ifdef ONLY8086 5.79 + xorw %si, %si 5.80 + movw %si, %ds 5.81 +# ifdef CHK_DOS_INT19 5.82 + cmpb $0xF0, 4*0x19+3(%si) 5.83 + jne stepit 5.84 + pushw %es 5.85 + movw $skip_step19, %si 5.86 + pushw %si 5.87 + retf 5.88 +stepit: 5.89 +# endif 5.90 + pushw 4+2(%si) 5.91 + pushw 4(%si) 5.92 + movw $step19, 4(%si) 5.93 + movw $INITSEG, 4+2(%si) 5.94 +#else 5.95 + pushl $4 5.96 + popw %si 5.97 + popw %ds 5.98 +# ifdef CHK_DOS_INT19 5.99 + cmpb $0xF0, 4*0x19+3-4(%si) 5.100 + jne stepit 5.101 + pushw %es 5.102 + pushw $skip_step19 5.103 + retf 5.104 +stepit: 5.105 +# endif 5.106 + pushl (%si) 5.107 + movl $step19+(INITSEG<<16), (%si) 5.108 +#endif 5.109 + pushfw 5.110 + popw %ax 5.111 + incb %ah # set TF 5.112 + pushw %ax 5.113 + popfw 5.114 +#ifdef ONLY8086 5.115 + ljmp *4*0x19(%si) 5.116 +#else 5.117 + ljmp *4*0x19-4(%si) 5.118 +#endif 5.119 +.endm 5.120 + 5.121 +stacktop = 0x9E00 # in 0x8000 .. 0xA000 5.122 + decw %bp // Magic number: MZ 5.123 + popw %dx 5.124 + jmp start // Bytes on last page of file 5.125 + .word (CODESZ+511)/512 // Pages in file INSTALLER 5.126 + .word 0 // Relocations 5.127 + .word (end_header-_start)/16 // Size of header in paragraphs 5.128 + .word 4096 // Minimum extra paragraphs needed 5.129 + .word -1 // Maximum extra paragraphs needed 5.130 + .word (CODESZ+15)/16 // Initial (relative) SS value INSTALLER 5.131 + .word stacktop // Initial SP value 5.132 + .word 0 // Checksum INSTALLER? 5.133 + .word EXEADRS(comstart) // Initial IP value 5.134 + .word 0xFFF0 // Initial (relative) CS value 5.135 +// .word 0x001C // File address of relocation table 5.136 +// .word 0,0,0 // Overlay number 5.137 +#else 5.138 +#undef VCPI 5.139 +#endif 5.140 +start: 5.141 + xorw %ax, %ax # %ax = 0 5.142 +zeroed = 12 # zeroed registers 5.143 + movw $zeroed/2, %cx # clear gdt + offset, %ds, limits 5.144 +stacktop = 0x9E00 # in 0x8000 .. 0xA000 (+zeroed+12) 5.145 +#ifdef ONLY8086 5.146 + movw $INITSEG, %bx 5.147 +#else 5.148 + pushw $INITSEG 5.149 +#endif 5.150 +end_header: 5.151 + cld # assume nothing 5.152 +#if defined(BZIMAGE) && BZIMAGE >= 0x202 5.153 + popw %es # %es contain INITSEG 5.154 + movw %es, %di 5.155 +#else 5.156 + # cmdline offset at 0x22 5.157 + movw $stacktop, %di # stacktop is an arbitrary value >= 5.158 + # length of bootsect + length of 5.159 + # setup + room for stack; 5.160 + # 12 is disk parm size. 5.161 +# ifdef ONLY8086 5.162 + pushw %bx 5.163 +# endif 5.164 + popw %es # %es contain INITSEG 5.165 +#endif 5.166 + pushw %es 5.167 + popw %ss # %es = %ss = INITSEG 5.168 + movw %di, %sp # put stack at INITSEG:stacktop-... 5.169 +#ifdef EXE_SUPPORT 5.170 + cwd # force %dx = 0 (floppy only) 5.171 +#endif 5.172 + 5.173 +# Many BIOS's default disk parameter tables will not recognize 5.174 +# multi-sector reads beyond the maximum sector number specified 5.175 +# in the default diskette parameter tables - this may mean 7 5.176 +# sectors in some cases. 5.177 +# 5.178 +# Since single sector reads are slow and out of the question, 5.179 +# we must take care of this by creating new parameter tables 5.180 +# (for the first disk) in RAM. We can set the maximum sector 5.181 +# count to 36 - the most we will encounter on an ED 2.88. 5.182 +# 5.183 +# High doesn't hurt. Low does. Let's use the max: 63 5.184 + 5.185 + rep # don't worry about cld 5.186 + stosw # already done above 5.187 + popw %bx # offset = 0 5.188 + popw %ds # %ds = 0 5.189 + 5.190 + movb setup_sects+0x7C00, %al # read bootsector + setup (%ds = 0) 5.191 + incw %ax 5.192 + 5.193 + ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address 5.194 + pushw %es 5.195 + pushw %di 5.196 + movb $6, %cl # copy 12 bytes 5.197 + rep # don't worry about cld 5.198 + movsw # already done above 5.199 + movw %cx, %ds # %ds = 0 5.200 +#ifdef ONLY8086 5.201 + popw 0x78(%bx) # update parameter table address 5.202 + popw 0x78+2(%bx) 5.203 +#else 5.204 + popl 0x78(%bx) # update parameter table address 5.205 +#endif 5.206 + pushw %ss 5.207 + popw %ds # now %ds = %es = %ss = INITSEG 5.208 + movb $63, 0x4-12(%di) # patch sector count, %di = stacktop 5.209 + 5.210 + xchg %ax, %di # sector count 5.211 + popw %ax # limits = 0 5.212 + incw %cx # cylinder 0, sector 1, clear Z 5.213 + call read_first_sectors # read setup 5.214 + 5.215 +# This routine loads the system at address LOADSEG, making sure 5.216 +# no 64kB boundaries are crossed. We try to load it as fast as 5.217 +# possible, loading whole tracks whenever we can. 5.218 + 5.219 + movw syssize, %di 5.220 + decw %di 5.221 + shrclw $9-4, %di 5.222 + incw %di 5.223 + movw $SYSSEG, %cx 5.224 +#ifdef BZIMAGE 5.225 + push %cx 5.226 +#endif 5.227 + call read_sectorsCX 5.228 + 5.229 +# This procedure turns off the floppy drive motor, so 5.230 +# that we enter the kernel in a known state, and 5.231 +# don't have to worry about it later. 5.232 + 5.233 +kill_motor: 5.234 + xchgw %ax, %di # reset FDC (%di < 128) 5.235 + int $0x13 5.236 + 5.237 +# After that (everything loaded), we jump to the setup-routine 5.238 +# loaded directly after the bootblock: 5.239 +# Segments are as follows: %ds = %ss = INITSEG 5.240 + 5.241 +#ifdef BZIMAGE 5.242 + popw %bx 5.243 + popw %si // SYSSEG:0 5.244 +movesys: // %bx = DS, %si 5.245 + movw $16, %ax 5.246 + mulw %bx 5.247 + addw %si, %ax 5.248 + adcw $0x9300, %dx // %dx:%ax src flat address 5.249 + movw $9, %cx 5.250 +zero1: 5.251 + pushw $0 // 2E..1E 5.252 + loop zero1 5.253 + //pushl $0x93100000 // 1A: dest 5.254 + pushw $0x9310 5.255 + pushw %cx 5.256 + pushw $-1 // 18 5.257 + pushw %cx // 16 5.258 + pushw %dx // src 5.259 + pushw %ax 5.260 + pushw $-1 // 10 5.261 + movb $8, %cl 5.262 + movw %cx, %bx // will move 8*64 = 512Kb 5.263 +zero2: 5.264 + pushw $0 // 0E..00 5.265 + loop zero2 5.266 + movw %sp, %si 5.267 + pushw %ss 5.268 + popw %es 5.269 + pushw %es 5.270 + popw %ds 5.271 +syslp: 5.272 + movb $0x80, %ch 5.273 + movb $0x87, %ah 5.274 + int $0x15 5.275 + incb 0x14(%si) 5.276 + incb 0x1C(%si) 5.277 + decw %bx 5.278 + jne syslp 5.279 +#endif 5.280 +jmp_setup: 5.281 + cli 5.282 + ljmp $SETUPSEG, $0 5.283 + 5.284 +#ifdef EXE_SUPPORT 5.285 +#ifdef SHUTDOWNDOS 5.286 +doiret: 5.287 + iret 5.288 +step19: 5.289 + pushw %si 5.290 + pushw %ds 5.291 + movw %sp, %si 5.292 + ldsw %ss:4(%si), %si 5.293 + cmpw $0x19CD, (%si) 5.294 + popw %ds 5.295 + popw %si 5.296 + jne doiret 5.297 + xorw %si, %si 5.298 + movw %si, %ds 5.299 + pushw %cs 5.300 + popw %ss 5.301 + movw $stacktop-4-16, %sp 5.302 +#ifdef ONLY8086 5.303 + popw 4(%si) 5.304 + popw 4+2(%si) 5.305 +skip_step19: 5.306 + popw %bp 5.307 + popw %di 5.308 + popw %si 5.309 + popw %dx 5.310 + popw %cx 5.311 + popw %bx 5.312 + popw %ax 5.313 +#else 5.314 + popl 4(%si) 5.315 +skip_step19: 5.316 + popaw 5.317 +#endif 5.318 +#ifdef BZIMAGE 5.319 + jmp movesys 5.320 +#endif 5.321 +#endif 5.322 +#ifndef BZIMAGE 5.323 +movesys: // %ax = SYSSEG, %bx = DS, %si 5.324 + shrclw $4, %si 5.325 + addw %si, %bx 5.326 +#ifdef TINY_ZIMAGE 5.327 + movw $0xFFFF, %cx 5.328 + xorw %si, %si 5.329 + xorw %di, %di 5.330 + cmpw %ax, %bx 5.331 + jnc forward 5.332 + decw %si 5.333 + decw %di 5.334 + std 5.335 +forward: 5.336 + movw %ax, %es 5.337 + movw %bx, %ds 5.338 + rep 5.339 + movsb 5.340 + cld 5.341 +#else 5.342 + subw %ax, %bx 5.343 + jnc forward 5.344 + //movw $0x8FFF, %ax 5.345 + movb $0x90, %ah 5.346 +forward: 5.347 + movw %ax, %es 5.348 + movw %ax, %di 5.349 + addw %bx, %di 5.350 + movw %di, %ds 5.351 + sbbw %di, %di // %di = 0 : -1 5.352 + cmc // C = 1 : 0 5.353 + adcw %di, %ax 5.354 + xorw %si, %si 5.355 + xorw %di, %di 5.356 + movb $0x10, %cl 5.357 + cmpb %cl, %ah // move 512k 5.358 + rep 5.359 + movsb 5.360 + jns forward 5.361 +#endif 5.362 +#ifndef NO_CURSOR_DEFINITION 5.363 + movb $1, %ah 5.364 + movb $0, %bh 5.365 + movb $0x20, %ch // 0x2000 5.366 + int $0x10 5.367 +#endif 5.368 + pushw %ss 5.369 + popw %ds 5.370 + jmp jmp_setup 5.371 +#endif 5.372 +comstart: 5.373 + cld # assume nothing 5.374 +#ifdef ONLY8086 5.375 + movw $INITSEG, %ax 5.376 + pushw %ax 5.377 +#else 5.378 + pushw $INITSEG 5.379 +#endif 5.380 + popw %es 5.381 +#ifdef CMDLINE 5.382 + movw %sp, %di 5.383 + movw $0x80, %si 5.384 + lodsb 5.385 + cbw 5.386 + xchgw %ax, %cx 5.387 +#ifdef BUGGY_CMDLINE 5.388 + test %cl, %cl # C=O=0, set S & Z 5.389 + jng nocmdline # Z == 1 or O != S ? 5.390 +#else 5.391 + jcxz nocmdline 5.392 +#endif 5.393 +# if defined(BZIMAGE) && BZIMAGE >= 0x202 5.394 + movw $INITSEG/16+stacktop/256, EXEADRS(cmd_line_ptr+1) 5.395 +# else 5.396 + movw $0xA33F, 0x7F(%si) 5.397 +# endif 5.398 +# ifndef NO_CMDLINE_SHRINK 5.399 +skipspace: 5.400 + lodsb 5.401 + cmpb $0x20, %al 5.402 + je skipspace 5.403 +# ifndef NO_CMDLINE_FILE 5.404 + movw %si,%dx 5.405 + decw %si 5.406 + subb $'@',%al 5.407 + jne notafile 5.408 + movb $0x3D,%ah 5.409 + int $0x21 5.410 + jc notafile 5.411 + xchgw %ax,%bx 5.412 + //movw %si,%dx // ~320 bytes max 5.413 + movw $EXEADRS(notafile)-130,%cx 5.414 + movb $0x3F,%ah 5.415 + int $0x21 5.416 + xchgw %ax,%cx 5.417 +notafile: 5.418 +# else 5.419 + decw %si 5.420 +# endif 5.421 +# endif 5.422 + rep 5.423 + movsb 5.424 +nocmdline: 5.425 + orb EXEADRS(setup_sects), %ch 5.426 +# ifndef NO_MINSETUP 5.427 +# ifndef BZIMAGE 5.428 + jnz setupok 5.429 + mov $4, %ch 5.430 +setupok: 5.431 +# endif 5.432 +# endif 5.433 +#else 5.434 + movb EXEADRS(setup_sects), %ch 5.435 +#endif 5.436 + movb $(512-(end_header-_start))/2, %cl 5.437 + movw $0x100, %si 5.438 + movw $end_header, %di 5.439 + rep 5.440 + movsw 5.441 + movw $SYSSEG, %ax 5.442 + movw %ds, %bx 5.443 + pushw %es 5.444 + popw %ss 5.445 +#ifndef SHUTDOWNDOS 5.446 + pushw %es 5.447 + pushw $movesys 5.448 +#endif 5.449 +#ifdef VCPI 5.450 + pushaw 5.451 + smsww %ax 5.452 + andb $1, %al 5.453 + je isrm 5.454 + movw $EXEADRS(gdt_vcpi),%si 5.455 + movw $pagebuf-0x90000,%di // %es = 0x9000 5.456 + movl $pagebuf+3,%es:0x1000(%di) 5.457 +call_vcpi: 5.458 + movb $0xDE,%ah // DE01, EBX = getiface(DS:SI, ES:DI) 5.459 + int $0x67 5.460 + movl $FLAT20(sw2pm_params),%esi 5.461 + movb $0x0C,%al // DE0C switchpm(ESI) 5.462 + jmp call_vcpi 5.463 +pm_code: 5.464 + .byte 0x6A, SEL_DATA // pushw $SEL_DATA 5.465 + popw %ss 5.466 + movl %cr0,%eax 5.467 + andl $0x7FFFFFFE,%eax 5.468 + movl %eax,%cr0 5.469 + movl %eax,%cr3 5.470 +isrm: 5.471 +# ifdef SHUTDOWNDOS 5.472 + trace_int19 5.473 +# else 5.474 + popaw 5.475 + retf 5.476 +# endif 5.477 +#else 5.478 +# ifdef SHUTDOWNDOS 5.479 +# ifdef ONLY8086 5.480 + pushw %ax 5.481 + pushw %bx 5.482 + pushw %cx 5.483 + pushw %dx 5.484 + pushw %si 5.485 + pushw %di 5.486 + pushw %bp 5.487 +# else 5.488 + pushaw 5.489 +# endif 5.490 + trace_int19 5.491 +# endif 5.492 + retf 5.493 +#endif 5.494 +#endif 5.495 + 5.496 +# read_sectors reads %di sectors into %es:0 buffer. 5.497 +# %es:0 is updated to the next memory location. 5.498 +# First, sectors are read sector by sector until 5.499 +# sector per track count is known. Then they are 5.500 +# read track by track. 5.501 +# Assume no error on first track. 5.502 + 5.503 +#ifdef FLOPPY_1440K_ONLY 5.504 +#ifndef FLOPPY_HAS_2_SIDES 5.505 +#define FLOPPY_HAS_2_SIDES hardcore heads count to 2 5.506 +#endif 5.507 +#define FLOPPY_SECTORS 18 /* 18 sectors */ 5.508 +#else 5.509 +#define FLOPPY_HEADS 2 /* 2 heads minimum */ 5.510 +#endif 5.511 + 5.512 +return: 5.513 +#ifndef NO_DOTS 5.514 + movw $0xE2E,%ax 5.515 + int $0x10 5.516 +#endif 5.517 + ret 5.518 + 5.519 +check_limits: 5.520 +#ifndef FLOPPY_1440K_ONLY 5.521 + popw %dx 5.522 + cmpb %al, %cl # max sector known ? 5.523 + ja next_head # no -> store it 5.524 +#ifndef FLOPPY_HAS_2_SIDES 5.525 +#ifdef FLOPPY_HEADS 5.526 + cmpb $FLOPPY_HEADS, %dh # 2 heads minimum 5.527 + jb check_cylinder 5.528 +#endif 5.529 + cmpb %ah, %dh # max head known ? 5.530 + ja next_cylinder # no -> store it 5.531 +check_cylinder: 5.532 +#endif 5.533 + pushw %ax 5.534 + cbw # %ah = 0 5.535 +#else 5.536 + pushw %dx 5.537 +#endif 5.538 + int $0x13 # reset controler 5.539 +#ifndef FLOPPY_1440K_ONLY 5.540 + popw %ax 5.541 + movb $1, %al # sector by sector... 5.542 +#else 5.543 + movw $1, %ax 5.544 + jmp more1trk 5.545 +#endif 5.546 +read_sectorslp: 5.547 + pushw %dx # some bios break dx... 5.548 +#ifndef FLOPPY_1440K_ONLY 5.549 + pushw %ax # limits 5.550 + subb %cl, %al # sectors remaining in track 5.551 + ja tolastsect 5.552 + movb $1, %al # first track sector by sector 5.553 +tolastsect: 5.554 +#else 5.555 + movb $FLOPPY_SECTORS+1, %al 5.556 + subb %cl, %al # sectors remaining in track 5.557 +#endif 5.558 + cbw 5.559 + cmpw %di, %ax 5.560 + jb more1trk 5.561 + movw %di, %ax # sectors to read 5.562 +more1trk: 5.563 + pushw %ax # save context 5.564 + movb $2, %ah # cmd: read chs 5.565 + int $0x13 5.566 +#ifndef FLOPPY_1440K_ONLY 5.567 + popw %dx # save %ax 5.568 + popw %ax # limits 5.569 +#else 5.570 + popw %ax # restore context 5.571 + popw %dx 5.572 +#endif 5.573 + jc check_limits 5.574 +#ifndef FLOPPY_1440K_ONLY 5.575 + xchgw %ax, %bp 5.576 + addw %dx,%cx # next sector 5.577 + movw %cx, %si 5.578 + pushw %dx 5.579 + shlclw $5, %dx 5.580 + movw %es, %cx 5.581 + addw %dx, %cx 5.582 + popw %dx 5.583 + subw %dx,%di # update sector counter 5.584 + popw %dx 5.585 +#else 5.586 + addw %ax,%cx # next sector 5.587 + movw %cx, %si 5.588 + pushw %ax 5.589 + shlclw $5, %ax 5.590 + movw %es, %cx 5.591 + addw %ax, %cx 5.592 + popw %ax 5.593 + subw %ax,%di # update sector counter 5.594 +#endif 5.595 +read_sectorsCX: 5.596 + movw %cx, %es # next location 5.597 + jz return 5.598 +read_sectors: 5.599 + movw %si, %cx 5.600 +#ifndef FLOPPY_1440K_ONLY 5.601 +# al is last sector+1 5.602 +# ah is last head+1 5.603 + xchgw %ax, %bp 5.604 +#endif 5.605 +#ifndef FLOPPY_1440K_ONLY 5.606 + cmpb %al,%cl # reach sector limit ? 5.607 + jne bdendlp 5.608 +next_head: 5.609 + movb %cl,%al 5.610 +#else 5.611 + cmpb $FLOPPY_SECTORS+1,%cl # reach sector limit ? 5.612 + jne bdendlp 5.613 +#endif 5.614 + movb $1,%cl # first sector 5.615 +#ifndef FLOPPY_HAS_2_SIDES 5.616 + incb %dh # next head 5.617 + cmpb %ah, %dh # reach head limit ? 5.618 + jne bdendlp 5.619 +next_cylinder: 5.620 + movb %dh,%ah 5.621 + movb $0,%dh # first head 5.622 +#else 5.623 + xorb %cl,%dh # next head 5.624 + jne bdendlp # reach head limit ? 5.625 +#endif 5.626 +# NOTE : support 256 cylinders max 5.627 + incb %ch # next cylinder 5.628 +read_first_sectors: 5.629 +bdendlp: 5.630 + jmp read_sectorslp 5.631 + 5.632 +#ifdef VCPI 5.633 +pagebuf = 0x98000 5.634 +tss = gdt_abs-40 5.635 +gdt = gdt_abs-32 5.636 +gdt_null = gdt_abs-32 5.637 +gdt_vcpi = gdt_abs-24 5.638 +gdt_vcpi2 = gdt_abs-16 5.639 +gdt_vcpi3 = gdt_abs-8 5.640 +gdt_abs: 5.641 +SEL_DATA = gdt_abs-gdt_null 5.642 + .word 0xFFFF 5.643 + .long 0x92000000 5.644 + .byte 0x8F,0 5.645 +gdt_code: 5.646 + .word 0xFFFF 5.647 +gdt_code_base: 5.648 + .long 0x9A000000+FLAT20(0) 5.649 + .byte 0x8F,0 5.650 +gdt_tss: 5.651 + .word 0x00FF 5.652 +gdt_tss_base: 5.653 + .long 0x89000000+FLAT20(tss) 5.654 + .byte 0,0 5.655 +gdtr: 5.656 +gdt_lim: 5.657 + .word 0xFFFF 5.658 +gdt_base: 5.659 + .long FLAT20(gdt) 5.660 +sw2pm_params: 5.661 +sw2pm_cr3: 5.662 + .long pagebuf+0x1000 5.663 +sw2pm_gdtr_ptr: 5.664 + .long FLAT20(gdtr) 5.665 +sw2pm_idtr_ptr: 5.666 + .long FLAT20(idtr) 5.667 +sw2pm_ldtr: 5.668 + .word 0 5.669 +sw2pm_tr: 5.670 +SEL_TSS = gdt_tss-gdt_null 5.671 + .word SEL_TSS 5.672 +sw2pm_jumpaddr: 5.673 + .long pm_code 5.674 +SEL_CODE = gdt_code-gdt_null 5.675 + .word SEL_CODE 5.676 +idtr: 5.677 +idt_lim: 5.678 + .word 0x03FF 5.679 +idt_base: 5.680 + .long 0 5.681 +#endif 5.682 +#ifdef ELKS 5.683 + .org 0x1E3 5.684 + .byte 13,10,7 5.685 + .asciz "ELKS Boot" 5.686 +#endif 5.687 + .org 0x1F1
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 6.2 +++ b/memtest64/stuff/pack Thu Feb 16 14:18:05 2023 +0000 6.3 @@ -0,0 +1,101 @@ 6.4 +#!/bin/sh 6.5 +if [ "$1" == "--build" ]; then 6.6 + set -- ${2:-bootloader.bin} ${3:-unpack.bin} 6.7 + x=$(grep -s packed_syssize$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.8 + [ -n "$x" ] && sed -i "s/XXXP/$((513+0x$x))/" $0 || sed -i "/XXXP$/d" $0 6.9 + x=$(grep -s setup_byte$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.10 + [ -n "$x" ] && sed -i "s/XXXSB/$((513+0x$x))/" $0 || sed -i "/XXXSB/d" $0 6.11 + x=$(grep -s setup_word$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.12 + [ -n "$x" ] && sed -i "s/XXXSW/$((514+0x$x))/" $0 || sed -i "/XXXSW/d" $0 6.13 + x=$(grep -s setup_para$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.14 + [ -n "$x" ] && sed -i "s/XXXSP/$((514+0x$x))/" $0 || sed -i "/XXXSP/d" $0 6.15 + x=$(grep -s setup_seg$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.16 + [ -n "$x" ] && sed -i "s/XXXSS/$((513+0x$x))/" $0 || sed -i "/XXXSS/d" $0 6.17 + x=$(grep -s setup_keep$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.18 + if [ -n "$x" ]; then 6.19 + sed -i "s/XXXK2 //" $0 6.20 + else 6.21 + x=$(grep -s setup_syssize$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.22 + if [ -n "$x" ]; then 6.23 + sed -i "s/XXXK2/bs=500 skip=1/" $0 6.24 + else 6.25 + sed -i "s/XXXK2/bs=512 skip=1/" $0 6.26 + fi 6.27 + fi 6.28 + x=$(grep -s double_packed$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.29 + [ -n "$x" ] && sed -i "s/| compress /&& 2 /" $0 6.30 + x=$(grep -s update_code32_start$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.31 + [ -n "$x" ] && sed -i '/XXXU2/d; s| XXXU1||' $0 || sed -i '/XXXU1/d; s| XXXU2||' $0 6.32 + x=$(grep -s lzsa.block$ ${2/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.33 + [ -n "$x" ] && sed -i 's| XXXR||' $0 || sed -i 's| XXXR| -r|;s|tail -c +4|cat|' $0 6.34 + helpmsg=$(grep -s helpmsg$ ${1/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.35 + helpend=$(grep -s helpend$ ${1/.bin/.lst}|sed '$!d;s/.*t:\([^ ]*\).*/\1/') 6.36 + if [ -n "$helpmsg" ]; then 6.37 + sed -i "s/YYY/$((0x$helpmsg))/" $0 6.38 + sed -i "s/ZZZ/$((0x$helpend-0x$helpmsg))/" $0 6.39 + else 6.40 + sed -i '/YYY/d' $0 6.41 + fi 6.42 + cat >> $0 <<EOM 6.43 +$(dd if=$1 bs=512 count=1 conv=sync 2> /dev/null | cat - $2 | gzip -9 | uuencode -m -) 6.44 +EOT 6.45 +EOM 6.46 + sed -i '/--build/,/^fi/d' $0 6.47 + exit 6.48 +fi 6.49 + 6.50 +store() 6.51 +{ 6.52 + n=$1 6.53 + for i in $(seq 1 ${4:-2}); do 6.54 + printf '\\\\x%02X' $(($n & 255)) 6.55 + n=$(($n >> 8)) 6.56 + done | xargs echo -en | dd conv=notrunc bs=1 of=$2 seek=$3 6.57 +} 6.58 + 6.59 +bits() 6.60 +{ 6.61 + sed "/^#define PROP_$1/!d;s|.*PROP_...||" unlzma.S 6.62 +} 6.63 + 6.64 +compress() 6.65 +{ 6.66 + case "$PACKER" in 6.67 + lz4) lz4 -l --best | tail -c +5 ;; 6.68 + lzsa1) cat > /tmp/in$$$1 ; lzsa XXXR -f1 /tmp/in$$$1 /tmp/out$$$1 ; tail -c +4 /tmp/out$$$1 ; rm -f /tmp/in$$$1 /tmp/out$$$1 ;; 6.69 + lzsa2) cat > /tmp/in$$$1 ; lzsa XXXR -f2 /tmp/in$$$1 /tmp/out$$$1 ; tail -c +4 /tmp/out$$$1 ; rm -f /tmp/in$$$1 /tmp/out$$$1 ;; 6.70 + *) xz -z -e --format=raw --lzma1=lc=$(bits LC),lp=$(bits LP),pb=$(bits PB) --stdout 6.71 + esac 6.72 +} 6.73 + 6.74 +main() 6.75 +{ 6.76 + uudecode | gunzip >$2 6.77 + dd if=$1 bs=1 skip=497 seek=497 count=15 of=$2 conv=notrunc 6.78 + setup="$(echo $(od -j 497 -N 1 -dAn $1))" 6.79 + [ $setup -eq 0 ] && setup=4 6.80 + store $setup $2 497 1 6.81 + setup=$((setup+1)) 6.82 + store $setup $2 XXXSB 1 6.83 + store $setup $2 XXXSW 1 6.84 + store $((32*setup+0xF000)) $2 XXXSP 6.85 + store $((0x1000 - 32*setup)) $2 XXXSS 6.86 + cp $1 /tmp/un$$ XXXU1 6.87 + store 1 /tmp/un$$ 534 1 XXXU1 6.88 + dd if=/tmp/un$$ XXXK2 | compress >>$2 XXXU1 6.89 + rm -f /tmp/un$$ XXXU1 6.90 + dd if=$1 XXXK2 | compress >>$2 XXXU2 6.91 + size=$(stat -c %s $2) 6.92 + syssize=$(((size-512*setup+15)/16)) 6.93 + store $((syssize + 0x1000 + 0x1000)) $2 XXXP 6.94 + store $syssize $2 500 6.95 + store $(((size+511)/512)) $2 4 6.96 + store $(((size+15)/16)) $2 14 6.97 + echo -e "$3" | dd conv=notrunc bs=1 seek=YYY of=$2 count=ZZZ 6.98 +} 6.99 + 6.100 +HELP="$(unix2dos <<EOT 6.101 +Memtest86+ VERSION GPLv2 6.102 +EOT 6.103 +)" 6.104 +main $1 ${2:-$1.packed} "${3:-$HELP}" 2>/dev/null <<EOT
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 7.2 +++ b/memtest64/stuff/unlz4.S Thu Feb 16 14:18:05 2023 +0000 7.3 @@ -0,0 +1,132 @@ 7.4 +// Lz4Decode: 7.5 +#ifndef FLAT32 7.6 +// input ds:si=inStream, es:di=outStream 7.7 +// output outStream[], ds:si, es:di 7.8 + .code16 7.9 +#define AX %ax 7.10 +#define BX %bx 7.11 +#define CX %cx 7.12 +#define SI %si 7.13 +#define DI %di 7.14 +#else 7.15 +// input esi=inStream, edi=outStream 7.16 +// output outStream[], ds:esi, es:edi 7.17 + .code32 7.18 +#define AX %eax 7.19 +#define BX %ebx 7.20 +#define CX %ecx 7.21 +#define SI %esi 7.22 +#define DI %edi 7.23 +#endif 7.24 + 7.25 +#define ARCHIVE_MAGICNUMBER 0x184C2102 7.26 + 7.27 +//#define PARANOIA // cover rare cases, optional 7.28 + 7.29 +lz4main: 7.30 +#ifdef PARANOIA 7.31 + cld 7.32 +# if !defined(FLAT32) && !defined(FLAT16OUT) 7.33 + xorl %cx, %cx 7.34 + call lz4mov 7.35 +# endif 7.36 +#endif 7.37 + lodsl // get chunkSize 7.38 +#ifndef NO_LZ4_HEADER 7.39 + cmpl $ARCHIVE_MAGICNUMBER, %eax 7.40 + je lz4main 7.41 +#endif 7.42 + orl %eax, %eax // end of file ? 7.43 + je lz4quit 7.44 + xchgl %eax, %edx 7.45 +lz4chunk: // uncompress chunk 7.46 + lodsb // get token 7.47 + movb %al, %bl 7.48 + shrb $4, %al 7.49 + call lz4len // get literal length 7.50 + subl %ecx, %edx // count literal 7.51 +#if !defined(FLAT32) && !defined(FLAT16OUT) && (!defined(FLAT16) || !defined(PARANOIA)) 7.52 +#define NeedLz4mov 7.53 + call lz4mov // copy literals 7.54 +#else 7.55 + rep movsb 7.56 +#endif 7.57 + subl $1+2, %edx // count token & string address 7.58 + jle lz4main 7.59 + lodsw // get string address 7.60 + xchg AX, BX 7.61 + call lz4len // get string length 7.62 + add $4, CX 7.63 +#if !defined(FLAT32) && !defined(FLAT16OUT) 7.64 + pushw %ds 7.65 + pushw %si 7.66 + movw %di, %si 7.67 + subw %bx, %si 7.68 + movw %es, %ax 7.69 + jnc axok 7.70 + subb $0x10, %ah 7.71 +axok: 7.72 +.macro norm reg 7.73 + movw %si, \reg 7.74 + andw $0xF, %si 7.75 + shrw $4, \reg 7.76 + addw \reg, %ax 7.77 + movw %ax, %ds 7.78 + movw %di, \reg 7.79 + andw $0xF, %di 7.80 + shrw $4, \reg 7.81 + movw %es, %ax 7.82 + addw \reg, %ax 7.83 + movw %ax, %es 7.84 +.endm 7.85 +# if !defined (NeedLz4mov) 7.86 + norm %bp 7.87 + rep movsb 7.88 +# else 7.89 + call lz4movStr // copy string 7.90 +# endif 7.91 + popw %si 7.92 + popw %ds 7.93 +#else 7.94 + xchg AX, SI 7.95 + mov DI, SI 7.96 + sub BX, SI 7.97 + rep movsb %es:(SI), %es:(DI) 7.98 + xchg AX, SI 7.99 +#endif 7.100 + jmp lz4chunk 7.101 + 7.102 +#if defined(NeedLz4mov) 7.103 +# if defined(PARANOIA) 7.104 +lz4movlp: 7.105 + xchgw %ax, %cx 7.106 + movw $0x3C00, %cx 7.107 + rep movsl 7.108 + xchgw %ax, %cx 7.109 + sub $0xF0, %ch 7.110 +# endif 7.111 +lz4mov: 7.112 + movw %ds, %ax 7.113 +lz4movStr: 7.114 + norm %bp 7.115 +# if defined(PARANOIA) 7.116 + cmp $0xFF, %ch // catch FFFX case 7.117 + jz lz4movlp 7.118 +# endif 7.119 + rep movsb 7.120 + ret 7.121 +#endif 7.122 + 7.123 +lz4len: // get length in %ecx 7.124 + andl $0xF, %eax 7.125 + movl %eax, %ecx 7.126 + cmpb $0xF, %al 7.127 + jne lz4quit 7.128 +lz4len2: 7.129 + lodsb 7.130 + decl %edx // remaining chunk size 7.131 + addw %ax, %cx 7.132 + cmpb $0xFF, %al 7.133 + je lz4len2 7.134 +lz4quit: 7.135 + ret
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 8.2 +++ b/memtest64/stuff/unlzma.S Thu Feb 16 14:18:05 2023 +0000 8.3 @@ -0,0 +1,1028 @@ 8.4 +// #define RC_NORMALIZE if (Range < kTopValue) { Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; } 8.5 +// 8.6 +// #define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound) 8.7 +// #define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits; 8.8 +// #define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits; 8.9 +// 8.10 +//#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \ 8.11 +// { UpdateBit0(p); mi <<= 1; A0; } else \ 8.12 +// { UpdateBit1(p); mi = (mi + mi) + 1; A1; } 8.13 +// 8.14 +// #define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;) 8.15 +// 8.16 +// #define RangeDecoderBitTreeDecode(probs, numLevels, res) \ 8.17 +// { int i = numLevels; res = 1; \ 8.18 +// do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \ 8.19 +// res -= (1 << numLevels); } 8.20 +/* 8.21 + * Compression with : lzma e src dst -eos -pb2 -lp0 -lc3 8.22 + */ 8.23 + 8.24 +#define PROP_PB 2 8.25 +#define PROP_LP 0 8.26 +#define PROP_LC 3 8.27 +#define PROPS (PROP_LC+(PROP_LP*9)+(PROP_PB*45)) 8.28 + 8.29 +// static const Byte *Buffer; 8.30 +// static UInt32 bound, Code, Range; 8.31 + 8.32 +/* 8.33 + * Buffer register DS:SI 8.34 + * all var based ws=ss:bp 8.35 + */ 8.36 + 8.37 +rep0 = -4 // long 8.38 +rep1 = rep0-4 // long 8.39 +rep2 = rep0-8 // long 8.40 +rep3 = rep0-12 // long 8.41 +state = -17 // byte, 0..11 8.42 +posState = state-1 // byte, 0..15 8.43 +posState2 = posState-1 // byte, 0..15 8.44 +scratched = rep0-16 // byte = 1 8.45 +Code = -24 // long 8.46 +outStream = -28 // long 8.47 +nowPos = outStream // long 8.48 +Range = Code-8 // long 8.49 +#define LOCALS 32 8.50 + 8.51 +// int LzmaDecode(CLzmaDecoderState *vs, 8.52 +// const unsigned char *inStream, 8.53 +// unsigned char *outStream) 8.54 +// { 8.55 +// CProb *p = vs->Probs; 8.56 +// SizeT nowPos = 0; 8.57 +// #define posStateMask = (1 << (vs->Properties.pb)) - 1; 8.58 +// #define literalPosMask = (1 << (vs->Properties.lp)) - 1; 8.59 +// int lc = vs->Properties.lc, state = 0, len = 0; 8.60 +// UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1; 8.61 +// 8.62 +// { 8.63 +// UInt32 i, numProbs = Literal /*1846*/ 8.64 +// + ((UInt32)LZMA_LIT_SIZE /*768*/ << (lc + vs->Properties.lp)); 8.65 +// for (i = 0; i < numProbs; i++) p[i] = kBitModelTotal /*2048*/ >> 1; 8.66 + 8.67 +#define WS (1846+(768<<(PROP_LC+PROP_LP))) 8.68 +#if (WS+WS+LOCALS) >= 65000 8.69 +/* MAX WS = (1846+(768<<(8+4))) > 3MB! */ 8.70 +#error invalid (lc,lp,pb) : out of memory 8.71 +#endif 8.72 + 8.73 +ws1 = WS 8.74 +ws2 = ws1*2 8.75 +ws = ws2+LOCALS+15 8.76 + 8.77 +#ifndef FLAT32 8.78 +#define AX %ax 8.79 +#define BX %bx 8.80 +#define CX %cx 8.81 +#define DX %dx 8.82 +#define SI %si 8.83 +#define DI %di 8.84 +#define BP %bp 8.85 +#define SP %sp 8.86 +#define CWD cwd 8.87 +#else 8.88 +#define AX %eax 8.89 +#define BX %ebx 8.90 +#define CX %ecx 8.91 +#define DX %edx 8.92 +#define SI %esi 8.93 +#define DI %edi 8.94 +#define BP %ebp 8.95 +#define SP %esp 8.96 +#define CWD cdq 8.97 +#endif 8.98 +/* 8.99 + * LzmaDecode: 8.100 +#ifndef FLAT32 8.101 + * input ds:si=inStream, es:di=outStream 8.102 + * output outStream[], ds:si, es:di 8.103 + .code 16 8.104 +#else 8.105 + * input esi=inStream, edi=outStream 8.106 + * output outStream[], esi, edi 8.107 + .code 32 8.108 +#endif 8.109 + */ 8.110 + 8.111 + mov $ws1, CX 8.112 +#ifdef ONLY8086 8.113 + .arch i8086 8.114 + movw $2048/2, %ax 8.115 +lzd1: 8.116 + pushw %ax 8.117 +#else 8.118 +lzd1: 8.119 + pushw $2048/2 8.120 +#endif 8.121 + loop lzd1 8.122 + mov SP, BP 8.123 + movb $((LOCALS+3)/4)*2, %cl 8.124 +#ifdef ONLY8086 8.125 + movw $1, %ax 8.126 + cwd 8.127 +initlocals: 8.128 + pushw %dx 8.129 + pushw %ax 8.130 +#else 8.131 +initlocals: 8.132 + pushl $1 8.133 +#endif 8.134 + loop initlocals 8.135 + 8.136 +#if !defined(FLAT32) && !defined(FLAT16OUT) 8.137 + movb $4, %cl 8.138 + movw %es, %bx 8.139 + shrw %cl, %bx 8.140 + movw %es, %dx 8.141 + shlw %cl, %dx 8.142 + addw %dx, %di 8.143 + movw %di, outStream(%bp) 8.144 + adcb %bh, outStream+2(%bp) 8.145 + incw %cx 8.146 +#else 8.147 + movb $5, %cl 8.148 + mov DI, outStream(BP) 8.149 +#endif 8.150 + 8.151 +// Byte previousByte = 0; 8.152 + xor BX, BX 8.153 + 8.154 +// #define RC_INIT(buffer) 8.155 +// Buffer = buffer; Code = 0; Range = 0xFFFFFFFF; 8.156 +// { int i; for(i=0; i<5; i++) { Code = (Code<<8) | RC_READ_BYTE; }} 8.157 +// } 8.158 +// RC_INIT(inStream); 8.159 + 8.160 +#ifndef NO_LZMA_HEADER 8.161 +#ifdef CHECK_LZMA_HEADER 8.162 + cmp.w $0x5A4C, (SI) // lzip header ('LZIP' version:1 dicobits:1) 8.163 + je lzip_header 8.164 + cmp.w $0x5D, (SI) // lzma header (0x5D dicosz:4 orgsz:8) 8.165 + jne no_header 8.166 + add $13-6, SI // skip lzma header 8.167 +lzip_header: 8.168 + add $6, SI // skip lzip header 8.169 +no_header: 8.170 +#else 8.171 + add $13, SI // skip lzma header (0x5D dicosz:4 orgsz:8) 8.172 +#endif 8.173 +#endif 8.174 +setrep: 8.175 + call RC_LOAD_BYTE 8.176 + decb Range(BP) 8.177 + loop setrep 8.178 + 8.179 +lzdmainlp: 8.180 +// while(1) { 8.181 +// CProb *prob; 8.182 +// int posState = (int)((nowPos) & posStateMask); 8.183 +// 8.184 +// prob = p + IsMatch /*0*/ + (state << kNumPosBitsMax /*4*/) + posState; 8.185 +// if (Bit0(prob)) { /* char */ 8.186 + 8.187 + xor DX, DX 8.188 + call Bit1state // Bit1(dx + (state << kNumPosBitsMax /*4*/) + posState) 8.189 + mov $state, DI 8.190 + jc lzdstring 8.191 + 8.192 +// prob = p + Literal /*1846*/ + (LZMA_LIT_SIZE /*768*/ * 8.193 +// ((((nowPos) & literalPosMask) << lc) + (previousByte >> (8 - lc)))); 8.194 + 8.195 +#if PROP_LC != 0 8.196 +# ifdef ONLY8086 8.197 + movb $8-PROP_LC, %cl 8.198 + shrb %cl, %bl 8.199 +# else 8.200 + shrb $8-PROP_LC, %bl 8.201 +# endif 8.202 +#else 8.203 + xor %bx,%bx 8.204 +#endif 8.205 + 8.206 +#if PROP_LP != 0 8.207 + movb posState2(BP), %dl 8.208 +# if PROP_LC != 0 8.209 +# ifdef ONLY8086 8.210 + movb $PROP_LC, %cl 8.211 + shl %cl, DX 8.212 +# else 8.213 + shl $PROP_LC, DX 8.214 +# endif 8.215 + movb $0, %bh 8.216 +# endif 8.217 + add BX, DX 8.218 +#endif 8.219 + 8.220 +#if PROP_LC == 0 && PROP_LP == 0 8.221 + mov $1846, AX 8.222 +#else 8.223 + movb $3, %ah 8.224 + mul BX // dx = 3*bh 8.225 + add $1846, AX 8.226 +#endif 8.227 + 8.228 +// int symbol = 1; 8.229 + 8.230 + CWD 8.231 + inc DX // symbol = 1 8.232 + xchg AX, CX // save prob 8.233 + 8.234 +// if (state >= kNumLitStates /*7*/) { /* previous was string */ 8.235 +// if (state < 4) state = 0; 8.236 + 8.237 +lzd6z: 8.238 + subb $3, (BP, DI) 8.239 + 8.240 +// if (state < 4) state = 0; 8.241 + 8.242 + jnc lzd6 8.243 + movb %dh, (BP, DI) // %dh = 0 8.244 + 8.245 +lzd6: 8.246 +// else if (state < 10) state -= 3; 8.247 + 8.248 + cmpb $10-3, (BP, DI) 8.249 + 8.250 +// else state -= 6; 8.251 + 8.252 + jnb lzd6z 8.253 + cmpb $7-3-1, (BP, DI) 8.254 + jbe lzd3 8.255 + 8.256 +// int matchByte = outStream[nowPos - rep0]; 8.257 + 8.258 + call DicoRep02ESDI // %bl = outStream[nowPos - rep0]; 8.259 + 8.260 +// do { 8.261 +// int bit; 8.262 +// CProb *probLit; 8.263 +// matchByte <<= 1; bit = (matchByte & 0x100); 8.264 + 8.265 + movb $1, %bh 8.266 +lzd4: 8.267 + shlb $1, %bl // matchByte <<= 1 8.268 + sbb DI, DI // save bit=C 8.269 + 8.270 +// probLit = prob + 0x100 + bit + symbol; 8.271 + 8.272 + mov CX, AX // restore prob 8.273 + adcb %bh, %ah // + bit + 0x100 8.274 + 8.275 +// RC_GET_BIT2(probLit, symbol, if (bit) break, if (!bit) break) 8.276 + 8.277 + call Bit1axdx // C,%ax = Bit1(prob+%ax) 8.278 + rclb $1, %dl // symbol <<= 1; symbol |= C 8.279 + jc lzd5 // if symbol >= 0x100 8.280 + cmp DI, AX 8.281 + jz lzd4 // if bit == Bit1(prob+%ax) 8.282 + 8.283 +// } while (symbol < 0x100); 8.284 +// } 8.285 +lzd3: 8.286 +// while (symbol < 0x100) { 8.287 +// CProb *probLit = prob + symbol; 8.288 +// RC_GET_BIT(probLit, symbol) 8.289 +// } 8.290 + 8.291 + xor BX, BX 8.292 + jmp lzd4 8.293 +lzd5: 8.294 + 8.295 +// outStream[nowPos++] = previousByte = (Byte)symbol; 8.296 + 8.297 + xchg AX, DX 8.298 + call outchar // %bl = outStream[nowPos++] = %al; 8.299 + jmp lzdmainlp 8.300 + 8.301 +// } 8.302 + 8.303 +lzdstring: 8.304 + mov $1, CX 8.305 + 8.306 +// else { /* string */ 8.307 +// prob = p + IsRep /*192*/ + state; 8.308 + 8.309 + movb $192, %dl 8.310 + addb (BP, DI), %dl 8.311 + mov $rep0, DI 8.312 + 8.313 +// if (Bit0(prob)) { 8.314 + 8.315 + call Bit1dx // Bit1(prob) 8.316 + jc lzd8 8.317 + 8.318 +// rep3 = rep2; rep2 = rep1; rep1 = rep0; 8.319 +// state = (state < kNumLitStates /*7*/) ? 0 : 3; 8.320 + 8.321 + stc 8.322 + 8.323 +// prob = p + LenCoder /*818*/; 8.324 + 8.325 + mov $818, DX 8.326 + 8.327 +// } 8.328 + 8.329 + jmp lzd11a 8.330 + 8.331 +// else { 8.332 +lzd8: 8.333 +// prob += kNumStates /*12*/; 8.334 +// if (Bit0(prob)) { 8.335 + call Bit1dx12 // prob += 12; Bit1(prob) 8.336 + jc lzd11 8.337 +// prob = p + IsRep0Long /*240*/ + (state << kNumPosBitsMax /*4*/) 8.338 +// + posState; 8.339 + movb $240, %dl // dh=0 8.340 + 8.341 +// if (Bit0(prob)) { 8.342 + 8.343 + call Bit1state // Bit1(dx + (state << kNumPosBitsMax /*4*/) + posState) 8.344 + jc lzd12 8.345 + 8.346 +// // if (nowPos == 0) return LZMA_RESULT_DATA_ERROR; 8.347 +// state = (state < kNumLitStates /*7*/) ? 9 : 11; 8.348 + 8.349 + movb $9, %dl 8.350 + 8.351 +// len++; goto string; 8.352 + jmp lzd13string // ax = 0 8.353 +// } 8.354 +// } 8.355 +// else { 8.356 +lzd11: 8.357 +// UInt32 distance = rep1; 8.358 +// prob += kNumStates /*12*/; 8.359 +// if (!Bit0(prob)) { 8.360 + 8.361 + call Bit1dx12 // prob += 12; Bit1(prob) 8.362 + jnc lzd11z 8.363 + 8.364 +// prob += kNumStates /*12*/; 8.365 +// if (Bit0(prob)) distance = rep2; 8.366 + 8.367 + call Bit1dx12 // prob += 12; Bit1(prob) 8.368 +lzd11a: 8.369 + adcb %cl, %cl 8.370 + 8.371 +// else { distance = rep3; rep3 = rep2; } 8.372 +// rep2 = rep1; 8.373 +// } 8.374 +// rep1 = rep0; rep0 = distance; 8.375 + 8.376 +lzd11z: 8.377 +# ifdef ONLY8086 8.378 + shl $1, CX 8.379 + shl $1, CX // 8->32 bits 8.380 + sub CX, DI // &rep[cx] 8.381 + movw (BP, DI), %ax 8.382 + pushw 2(BP, DI) 8.383 +rotreplp: 8.384 + movb 4(BP, DI), %bl 8.385 + movb %bl, (BP, DI) 8.386 + inc DI 8.387 + loop rotreplp 8.388 + popw %bx 8.389 + testb %dh, %dh 8.390 + jnz lzd10 8.391 + movw %ax, (BP, DI) 8.392 + movw %bx, 2(BP, DI) 8.393 +# else 8.394 + shl $2, CX // 8->32 bits 8.395 + sub CX, DI // &rep[cx] 8.396 + movl (BP, DI), %eax 8.397 +rotreplp: 8.398 + movb 4(BP, DI), %bl 8.399 + movb %bl, (BP, DI) 8.400 + inc DI 8.401 + loop rotreplp 8.402 + testb %dh, %dh 8.403 + jnz lzd10 8.404 + movl %eax, (BP, DI) 8.405 +# endif 8.406 + 8.407 +// } 8.408 +lzd12: 8.409 +// state = (state < kNumLitStates /*7*/) ? 8 : 11; 8.410 + 8.411 + movb $0x08, %cl 8.412 + 8.413 +// prob = p + RepLenCoder /*1332*/; 8.414 + 8.415 + mov $1332, DX 8.416 + 8.417 +// } 8.418 +lzd10: 8.419 + push CX // CX = 0 8.420 + 8.421 +// { /* get len */ 8.422 +// int numBits, offset; 8.423 +// CProb *probLen = prob + LenChoice /*0*/; 8.424 +// numBits = kLenNumLowBits /*3*/; 8.425 + 8.426 + movb $8, %cl // numBits : 3,3,8 8.427 + 8.428 +// if (Bit0(probLen)) { 8.429 + 8.430 + call Bit1dx // Bit1(prob) 8.431 + xchg AX, BX 8.432 + inc DX 8.433 + jnc lzd15 // bx=0 8.434 + 8.435 +// probLen = prob + LenLow/*2*/ + (posState << kLenNumLowBits/*3*/); 8.436 +// offset = 0; 8.437 +// } 8.438 +// else { 8.439 +// probLen = prob + LenChoice2 /*1*/; 8.440 + 8.441 + call Bit1dx // Bit1(prob) 8.442 + add AX, BX 8.443 + 8.444 +#if PROP_PB != 0 8.445 + inc AX // ah=0 8.446 +#endif 8.447 + jc lzd16 // %ax=0, %bx=-2 8.448 +lzd15: 8.449 +#if PROP_PB != 0 8.450 + movb $8, %al 8.451 + mulb posState(BP) 8.452 +#endif 8.453 + 8.454 +// if (Bit0(probLen)) { 8.455 +// probLen = prob + LenMid/*130*/ + (posState << kLenNumMidBits/*3*/); 8.456 + 8.457 + movb $3, %cl // numBits : 3,3,8 8.458 +lzd16: 8.459 +#if PROP_PB != 0 8.460 + add $2-128-1, AX // probLen : 2,130,258 8.461 +#else 8.462 + mov $2-128-1, AX // probLen : 2,130,258 8.463 +#endif 8.464 + add DX, AX 8.465 + mov $-8+1, DX // offset : 0,8,16 8.466 +lzdargslp: 8.467 + add $8, DX 8.468 + add $128, AX 8.469 + inc BX 8.470 + jle lzdargslp // leave with bx=1 8.471 + 8.472 +// offset = kLenNumLowSymbols /*8*/; 8.473 +// //numBits = kLenNumMidBits /*3*/; 8.474 +// } 8.475 +// else { 8.476 +// probLen = prob + LenHigh /*258*/; 8.477 +// offset = kLenNumLowSymbols /*8*/ + kLenNumMidSymbols /*8*/; 8.478 +// numBits = kLenNumHighBits /*8*/; 8.479 +// } 8.480 +// } 8.481 +// RangeDecoderBitTreeDecode(probLen, numBits, len); len += offset; 8.482 + 8.483 + push DX 8.484 + call RangeDecoder // %ax=probs, %cx=numLevels, %ax=res 8.485 + pop DX 8.486 + add DX, AX // offset 8.487 + pop DX // 0 8.488 +lzd13string: 8.489 + push AX 8.490 + 8.491 +// state = (state < kNumLitStates /*7*/) ? dl : dl|3; 8.492 + 8.493 + movb $7, %cl 8.494 + cmpb %cl, state(BP) 8.495 + jb new_state 8.496 + orb $3, %dl 8.497 +new_state: 8.498 + movb %dl, state(BP) 8.499 + 8.500 +// } /* get len */ 8.501 +// if (state < 4) { 8.502 + 8.503 + cmpb $4-1, %dl 8.504 + ja lzd19 8.505 + 8.506 +// int posSlot; 8.507 +// state += kNumLitStates /*7*/; 8.508 + 8.509 + addb %cl, state(BP) 8.510 + 8.511 +// prob = p + PosSlot /*432*/ + (((len < kNumLenToPosStates /*4*/) ? 8.512 +// len : kNumLenToPosStates - 1) << kNumPosSlotBits /*6*/); 8.513 + 8.514 + cmp $4+1, AX 8.515 + jb lzd21 8.516 + mov $3+1, AX 8.517 + 8.518 +lzd21: 8.519 + 8.520 + dec CX // cx = 6 8.521 + shl %cl, AX 8.522 + add $432-64, AX 8.523 + 8.524 +// RangeDecoderBitTreeDecode(prob, kNumPosSlotBits /*6*/, posSlot); 8.525 + 8.526 + call RangeDecoder // %ax=probs, %cx=numLevels, %ax=res 8.527 + 8.528 +// if (posSlot >= kStartPosModelIndex /*4*/) { 8.529 +// int numDirectBits = ((posSlot >> 1) - 1); 8.530 + 8.531 +#ifndef FLAT32 8.532 + movw %cx, 2(%bp, %di) // %cx = 0 8.533 +#endif 8.534 + mov AX, (BP, DI) 8.535 + mov AX, CX 8.536 + shrw $1, CX 8.537 + dec CX 8.538 + cmpb $4, %al 8.539 + jb lzd22 8.540 + 8.541 +// rep0 = (2 | ((UInt32)posSlot & 1)); 8.542 + 8.543 + andb %bl, (BP, DI) // %bx=1 8.544 + orb $2, (BP, DI) 8.545 + 8.546 +// if (posSlot < kEndPosModelIndex /*14*/) { 8.547 + 8.548 + cmpb $14, %al 8.549 + jnb lzd23 8.550 + 8.551 +// rep0 <<= numDirectBits; 8.552 + 8.553 + neg AX 8.554 +# ifdef ONLY8086 8.555 + pushw %cx 8.556 + movb $0, %ch 8.557 +shllrep0: 8.558 + shlw $1, (BP, DI) 8.559 + rclw $1, 2(BP, DI) 8.560 + loop shllrep0 8.561 + popw %cx 8.562 +# else 8.563 + shll %cl, (BP, DI) 8.564 +# endif 8.565 + add (BP, DI), AX 8.566 + 8.567 +// prob = p + SpecPos /*688*/ + rep0 - posSlot - 1; 8.568 + 8.569 + add $687, AX 8.570 + jmp lzd24 8.571 + 8.572 +// } 8.573 +// else { 8.574 +lzd23: 8.575 +// numDirectBits -= kNumAlignBits /*4*/; 8.576 +// do { 8.577 +// RC_NORMALIZE; Range >>= 1; rep0 <<= 1; 8.578 +// if (Code >= Range) { Code -= Range; rep0 |= 1; } 8.579 + 8.580 +lzd23z: 8.581 + call RC_NORMALIZE 8.582 +# ifdef ONLY8086 8.583 + pushw %dx 8.584 + shrw $1, Range+2(BP) 8.585 + rcrw $1, Range(BP) 8.586 + movw Range(BP), %ax 8.587 + movw Range+2(BP), %dx 8.588 + cmpw Code+2(BP), %dx 8.589 + ja lzd25 8.590 + jb lzd25x 8.591 + cmpw Code(BP), %ax 8.592 + ja lzd25 8.593 +lzd25x: 8.594 + subw %ax, Code(BP) 8.595 + sbbw %dx, Code+2(BP) 8.596 + stc 8.597 +lzd25: 8.598 + popw %dx 8.599 + rclw $1, (BP, DI) 8.600 + rclw $1, 2(BP, DI) 8.601 +# else 8.602 + shrl $1, Range(BP) 8.603 + movl Range(BP), %eax 8.604 + cmpl Code(BP), %eax 8.605 + ja lzd25 8.606 + subl %eax, Code(BP) 8.607 + stc 8.608 +lzd25: 8.609 + rcll $1, (BP, DI) 8.610 +# endif 8.611 + 8.612 +// } while (--numDirectBits != 0); 8.613 + 8.614 + cmpb $4+1, %cl 8.615 + loopne lzd23z 8.616 + 8.617 +// prob = p + Align /* 802 */; numDirectBits = kNumAlignBits /*4*/; 8.618 +// rep0 <<= numDirectBits; 8.619 + 8.620 +# ifdef ONLY8086 8.621 + pushw %cx 8.622 + movb $0, %ch 8.623 +shlrep0: 8.624 + shlw $1, (BP, DI) 8.625 + rclw $1, 2(BP, DI) 8.626 + loop shlrep0 8.627 + popw %cx 8.628 +# else 8.629 + shll %cl, (BP, DI) 8.630 +# endif 8.631 + mov $802, AX 8.632 +// } 8.633 + 8.634 +lzd24: 8.635 + call RangeDecoder // %ax=probs, %cx=numLevels, %ax=res 8.636 + 8.637 +// { 8.638 +// int i = 1, mi = 1; 8.639 +// do { 8.640 +// CProb *prob3 = prob + mi; 8.641 +// RC_GET_BIT2(prob3, mi, ; , rep0 |= i); 8.642 + 8.643 + orb %dh, (BP, DI) // update rep0 with DirectBits 8.644 + 8.645 +// i <<= 1; 8.646 +// } while(--numDirectBits != 0); 8.647 +// } 8.648 +// } else rep0 = posSlot; 8.649 +lzd22: 8.650 +// if (++rep0 == (UInt32)(0)) break; /* EOF */ 8.651 + 8.652 +# ifdef ONLY8086 8.653 + incw (BP, DI) 8.654 + jnz lzd19 8.655 + incw 2(BP, DI) 8.656 +# else 8.657 + incl (BP, DI) 8.658 +# endif 8.659 + 8.660 +lzd19: 8.661 + pop CX 8.662 + jz lzdone 8.663 + 8.664 +// } 8.665 +// len += kMatchMinLen;/*2*/ 8.666 + 8.667 + inc CX 8.668 + 8.669 +// string: // if (rep0 > nowPos) return LZMA_RESULT_DATA_ERROR; 8.670 +// do { 8.671 +lzd13z: 8.672 +// previousByte = outStream[nowPos - rep0]; 8.673 +// outStream[nowPos++] = previousByte; 8.674 + 8.675 + call outcharDico // %bl = outStream[nowPos++] = outStream[nowPos - rep0] 8.676 + 8.677 +// } while(--len != 0); 8.678 + 8.679 + loop lzd13z 8.680 + 8.681 +// } /* char/string */ 8.682 +// } 8.683 + 8.684 + jmp lzdmainlp 8.685 + 8.686 +lzdone: 8.687 +// //RC_NORMALIZE; 8.688 +// //*inSizeProcessed = (SizeT)(Buffer - inStream); *outSizeProcessed = nowPos; 8.689 +// return LZMA_RESULT_OK; 8.690 + call Dico2ESDI // set es & di (rep0 = 0) 8.691 + lea ws2(BP), SP // dealloc 8.692 + ret 8.693 +// } 8.694 + 8.695 +// al = outStream[nowPos - rep0]; 8.696 + 8.697 +/* 8.698 + * output es:di, al 8.699 + * scratch bh, cl, flags 8.700 + */ 8.701 + 8.702 +DicoRep02ESDI: 8.703 + stc 8.704 + 8.705 +// bl = outStream[nowPos]; 8.706 + 8.707 +/* 8.708 + * output es:di, bl 8.709 + * scratch bh, cl, flags 8.710 + */ 8.711 + 8.712 +Dico2ESDI: 8.713 +#if !defined(FLAT32) && !defined(FLAT16OUT) 8.714 +# ifdef ONLY8086 8.715 + pushw %ax 8.716 + movw nowPos(%bp), %bx 8.717 + movw nowPos+2(%bp), %ax 8.718 + jnc Dico2ESDIz 8.719 + subw rep0(%bp), %bx 8.720 + sbbw rep0+2(%bp), %ax 8.721 +Dico2ESDIz: 8.722 + movw $0xF, %di 8.723 + andw %bx, %di 8.724 + pushw %cx 8.725 + movb $4, %cl 8.726 + shrw %cl, %bx 8.727 + shlw %cl, %ax 8.728 + popw %cx 8.729 + addb %al, %bh 8.730 + popw %ax 8.731 +# else 8.732 + movl nowPos(%bp), %ebx 8.733 + jnc Dico2ESDIz 8.734 + subl rep0(%bp), %ebx 8.735 +Dico2ESDIz: 8.736 + movw %bx, %di 8.737 + xorw %bx, %bx 8.738 + shrl $4, %ebx 8.739 +# endif 8.740 + movw %bx, %es 8.741 +#else 8.742 + mov nowPos(BP), DI 8.743 + jnc Dico2ESDIz 8.744 + sub rep0(BP), DI 8.745 +Dico2ESDIz: 8.746 +#endif 8.747 +#ifdef FLAT32 8.748 + movb (DI), %bl 8.749 +#else 8.750 + movb %es:(%di), %bl 8.751 +#endif 8.752 + ret 8.753 + 8.754 +outcharDico: 8.755 + 8.756 +// bl = outStream[nowPos++] = outStream[nowPos - rep0] 8.757 + 8.758 +/* 8.759 + * output es:di, bl 8.760 + * update nowPos 8.761 + * scratch ax, dx, bh, cl, flags 8.762 + */ 8.763 + 8.764 + call DicoRep02ESDI // %bl = outStream[nowPos - rep0] 8.765 + xchg AX, BX 8.766 +outchar: 8.767 + 8.768 +// bl = outStream[nowPos++] = previousByte = al; 8.769 + 8.770 +/* 8.771 + * output bl 8.772 + * update nowPos 8.773 + * scratch ax, dx, bh, di, cl, flags 8.774 + */ 8.775 + 8.776 + clc 8.777 + call Dico2ESDI 8.778 + stosb 8.779 + xchg AX, BX // previous byte 8.780 + 8.781 +// int posState = (int)((nowPos) & posStateMask); 8.782 + 8.783 +#if PROP_PB != 0 && PROP_LP != 0 8.784 + addw $0x0101, posState2(BP) 8.785 + andb $(((1 << PROP_PB) -1)<<8)+((1 << PROP_LP) -1), posState2(BP) 8.786 +#else 8.787 +# if PROP_PB != 0 8.788 + incb posState(BP) 8.789 + andb $((1 << PROP_PB) -1), posState(BP) 8.790 +# endif 8.791 +# if PROP_LP != 0 8.792 + incb posState2(BP) 8.793 + andb $((1 << PROP_LP) -1), posState2(BP) 8.794 +# endif 8.795 +#endif 8.796 +#ifdef ONLY8086 8.797 + incw nowPos(BP) 8.798 + jnz incnowPosDone 8.799 + incw nowPos+2(BP) 8.800 +incnowPosDone: 8.801 +#else 8.802 + incl nowPos(BP) 8.803 +#endif 8.804 + ret 8.805 + 8.806 +// 8.807 +// #define RC_NORMALIZE if (Range < kTopValue) 8.808 +// { Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; } 8.809 + 8.810 +/* 8.811 + * update Range, Code, ds:si 8.812 + * scratch flags 8.813 + */ 8.814 + 8.815 +RC_NORMALIZE: 8.816 + cmpb $0, Range+3(BP) 8.817 + jne RC_NORMALIZE_1 8.818 +RC_LOAD_BYTE: 8.819 + push AX 8.820 +#ifdef ONLY8086 8.821 + movw Range+1(BP), %ax 8.822 + movw %ax, Range+2(BP) 8.823 + movw Code+1(BP), %ax 8.824 + movw %ax, Code+2(BP) 8.825 + xorw %ax, %ax 8.826 + movb Range(BP), %ah 8.827 + movw %ax, Range(BP) 8.828 + movb Code(BP), %ah 8.829 + movw %ax, Code(BP) 8.830 +#else 8.831 + shll $8, Range(BP) 8.832 + shll $8, Code(BP) 8.833 +#endif 8.834 +#if !defined(FLAT16) && !defined(FLAT32) 8.835 + testw %si, %si 8.836 + jns RC_READ_BYTE 8.837 + movw %ds, %ax 8.838 + incw %ax 8.839 + movw %ax, %ds 8.840 + addw $-16, %si 8.841 +RC_READ_BYTE: 8.842 +#endif 8.843 + lodsb 8.844 + movb %al, Code(BP) 8.845 + pop AX 8.846 +RC_NORMALIZE_1: 8.847 + ret 8.848 + 8.849 +// Bit1(dx + (state << kNumPosBitsMax /*4*/) + posState) 8.850 + 8.851 +Bit1state: 8.852 + movb $16, %al 8.853 + mulb state(BP) 8.854 +# if PROP_PB != 0 8.855 + addb posState(BP), %al 8.856 +# endif 8.857 +Bit1axdx: 8.858 + add DX, AX 8.859 + jmp Bit1 8.860 + 8.861 +// prob += 12; Bit1(prob) 8.862 + 8.863 +Bit1dx12: 8.864 + add $12, DX 8.865 +Bit1dx: 8.866 + mov DX, AX 8.867 + 8.868 +// static int Bit1(CProb *p) 8.869 + 8.870 +Bit1: 8.871 +/* 8.872 + * input ax=p 8.873 + * output C, ax 8.874 + * update bound, Range, Code, ds:si 8.875 + * scratch flags 8.876 + */ 8.877 + 8.878 +// { 8.879 +// RC_NORMALIZE; 8.880 + 8.881 + call RC_NORMALIZE // kill %ax, update %si 8.882 + 8.883 +#ifdef ONLY8086 8.884 + pushw %ax 8.885 + pushw %cx 8.886 + pushw %dx 8.887 + pushw %di 8.888 +#else 8.889 + pushal 8.890 +#endif 8.891 + 8.892 + xchg AX, DI 8.893 + add DI, DI // short * 8.894 + 8.895 + 8.896 +// bound = (Range>>kNumBitModelTotalBits /*11*/) * *(p); 8.897 + 8.898 +#ifdef ONLY8086 8.899 + movw Range(BP), %dx 8.900 + movw Range+2(BP), %ax 8.901 + movw $11, %cx 8.902 +shr11lp: 8.903 + shrw $1, %ax 8.904 + rcrw $1, %dx 8.905 + loop shr11lp 8.906 + movw %dx, %cx 8.907 + mulw (BP, DI) 8.908 + xchgw %ax, %cx 8.909 + mulw (BP, DI) 8.910 + addw %cx, %dx 8.911 +#else 8.912 + movl Range(BP), %eax 8.913 + shrl $11, %eax 8.914 + movzwl (BP, DI), %edx 8.915 + mull %edx 8.916 +#endif 8.917 + 8.918 +// if (Code < bound) { 8.919 + 8.920 +#ifdef ONLY8086 8.921 + cmpw Code+2(BP), %dx 8.922 + jb Bit1_1 8.923 + ja Bit1_1x 8.924 + cmpw Code(BP), %ax 8.925 + jbe Bit1_1 8.926 +Bit1_1x: 8.927 + 8.928 +// Range = bound; 8.929 + 8.930 + movw %ax, Range(BP) 8.931 + movw %dx, Range+2(BP) 8.932 +#else 8.933 + cmpl Code(BP), %eax 8.934 + jbe Bit1_1 8.935 + 8.936 +// Range = bound; 8.937 + 8.938 + movl %eax, Range(BP) 8.939 +#endif 8.940 + 8.941 +// *(p) += (kBitModelTotal /*2048*/ - *(p)) >> kNumMoveBits /*5*/; 8.942 + 8.943 + movw $2048, %ax 8.944 + 8.945 +// return 0; 8.946 + 8.947 + jmp Bit1_2 8.948 + 8.949 +// } 8.950 +// else { 8.951 + 8.952 +Bit1_1: 8.953 + 8.954 +// Range -= bound; Code -= bound; 8.955 + 8.956 +#ifdef ONLY8086 8.957 + subw %ax, Range(BP) 8.958 + sbbw %dx, Range+2(BP) 8.959 + subw %ax, Code(BP) 8.960 + sbbw %dx, Code+2(BP) 8.961 +#else 8.962 + subl %eax, Range(BP) 8.963 + subl %eax, Code(BP) 8.964 +#endif 8.965 + 8.966 +// *(p) -= (*(p)) >> kNumMoveBits /*5*/; 8.967 + 8.968 + movw $31, %ax 8.969 + 8.970 +// return 1; 8.971 + 8.972 + stc 8.973 +Bit1_2: 8.974 + pushf 8.975 + subw (BP, DI), %ax 8.976 +#ifdef ONLY8086 8.977 + movb $5, %cl 8.978 + sarw %cl, %ax 8.979 +#else 8.980 + sarw $5, %ax 8.981 +#endif 8.982 + addw %ax, (BP, DI) 8.983 + popf 8.984 +#ifdef ONLY8086 8.985 + popw %di 8.986 + popw %dx 8.987 + popw %cx 8.988 + popw %ax 8.989 +#else 8.990 + popal 8.991 +#endif 8.992 + sbb AX, AX 8.993 + 8.994 +// } 8.995 +// } 8.996 + 8.997 + ret 8.998 + 8.999 +RangeDecoder: 8.1000 + 8.1001 +/* 8.1002 + * input ax=probs cx=numLevels (< 8) bx=1 8.1003 + * output ax=res (backward), dh (forward) 8.1004 + * update bound, Range, Code, ds:si 8.1005 + * scratch flags, cx=0, dl 8.1006 + */ 8.1007 + 8.1008 + push BX 8.1009 + 8.1010 +// { int i = numLevels; res = 1; 8.1011 + mov BX, DX // res = 1 8.1012 + 8.1013 +// do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); 8.1014 + 8.1015 +RangeDecoder_1: 8.1016 + push AX 8.1017 + call Bit1axdx // C,%ax = Bit1(prob+%ax) 8.1018 + rclb $1, %dl // res <<= 1; res |= C 8.1019 + andb %bl, %al // current bit 8.1020 + orb %al, %bh // store in bh 8.1021 + shlb $1, %bl // update max 8.1022 + pop AX 8.1023 + loop RangeDecoder_1 8.1024 + 8.1025 +// res -= (1 << numLevels); } 8.1026 + 8.1027 + xchg AX, BX // move bh to dh 8.1028 + xchg AX, DX // and dl to al 8.1029 + sub %dl, %al // sub max 8.1030 + pop BX 8.1031 + ret
9.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 9.2 +++ b/memtest64/stuff/unlzsa1.S Thu Feb 16 14:18:05 2023 +0000 9.3 @@ -0,0 +1,197 @@ 9.4 +// Lzsa1Decode: 9.5 +#ifndef FLAT32 9.6 +// input ds:si=inStream, es:di=outStream 9.7 +// output outStream[], ds:si, es:di 9.8 + .code16 9.9 +#define AX %ax 9.10 +#define BX %bx 9.11 +#define SI %si 9.12 +#define DI %di 9.13 +#else 9.14 +// input esi=inStream, edi=outStream 9.15 +// output outStream[], ds:esi, es:edi 9.16 + .code32 9.17 +#define AX %eax 9.18 +#define BX %ebx 9.19 +#define SI %esi 9.20 +#define DI %edi 9.21 +#endif 9.22 + 9.23 +MATCH_RUN_LEN = 15 9.24 +LITERALS_RUN_LEN = 7 9.25 +MIN_MATCH_SIZE = 3 9.26 +MIN_LITERALS_SIZE = 0 9.27 + 9.28 +#define PACKED_ONLY // assume no copy block, optional 9.29 +//#define PARANOIA // cover rare cases, optional 9.30 + 9.31 +lzsa1main: 9.32 +#ifdef PARANOIA 9.33 + cld 9.34 +#endif 9.35 +#ifdef FLAT16OUT 9.36 +#define RAW_FORMAT 9.37 +#endif 9.38 +#ifndef RAW_FORMAT 9.39 +# if defined(PARANOIA) && !defined(FLAT32) && !defined(FLAT16) 9.40 + xorw %cx, %cx 9.41 + call normalize 9.42 +# endif 9.43 +# ifndef NO_LZSA1_HEADER 9.44 + lodsw 9.45 + cmpw $0x9E7B, %ax // magic 9.46 + jne lzsa1main 9.47 + lodsb 9.48 + cmpb $0, %al // lzsa1 9.49 + jne lzsa1main 9.50 +# endif 9.51 +lzsa1block: // uncompress chunk 9.52 + lodsw // block size 9.53 + xchgw %ax, %cx 9.54 + lodsb 9.55 +# ifndef PACKED_ONLY 9.56 + orb %al, %al 9.57 + jns lzsa1compressed 9.58 +# if !defined(FLAT32) && !defined(FLAT16OUT) 9.59 + movw %cx, %dx 9.60 + movb $0, %cl 9.61 + movb $0, %dh 9.62 +copytail: 9.63 + call lzsa1movStr 9.64 + xchg %dx, %cx 9.65 + incw %cx 9.66 + loop copytail 9.67 +# else 9.68 + movsb // copy block 9.69 +copylp: 9.70 + movsb // copy block 9.71 + loop copylp // handle 64K case 9.72 +# endif 9.73 + jmp lzsa1block // end of block 9.74 +lzsa1compressed: 9.75 + jne lzsa1chunk // 64Kb block 9.76 +# endif 9.77 + jcxz lzsa1quit // bail if we hit EOD 9.78 + pushw %cx 9.79 +# if !defined(FLAT32) && !defined(FLAT16) 9.80 + xorw %cx, %cx 9.81 + call normalize 9.82 +# define NeedNormalize 9.83 +# endif 9.84 + popw %dx 9.85 + addw %si, %dx 9.86 +#endif 9.87 +lzsa1chunk: // uncompress chunk 9.88 + lodsb // get token O|LLL|MMMM 9.89 + movb %al, %bl // keep token in bl 9.90 + shrb $4, %al // shift literals length into place 9.91 + movw $LITERALS_RUN_LEN*256+MIN_LITERALS_SIZE, %cx 9.92 + call lzsa1len // %ch = LITERALS_RUN_LEN 9.93 +#if defined(NeedNormalize) 9.94 + call lzsa1movLit // copy %cx literals from %ds:%si to %es:%di 9.95 +#else 9.96 + rep movsb // copy %cx literals from %ds:%si to %es:%di 9.97 +#endif 9.98 +#ifndef RAW_FORMAT 9.99 + cmpw %dx, %si 9.100 + jae lzsa1block // bail if we hit EOD 9.101 +#endif 9.102 +#ifdef FLAT32 9.103 + orl $-1, %eax 9.104 +#else 9.105 + movb $-1, %ah 9.106 +#endif 9.107 + testb %bl, %bl // check match offset size in token (O bit) 9.108 + jns lzsa1ShortOfs 9.109 + lodsw 9.110 + .byte 0x3C // mask lodsb with cmpb $0xAC, %al 9.111 +lzsa1ShortOfs: 9.112 + lodsb 9.113 + xchg AX, BX // %bx: match offset %ax: original token 9.114 + movw $MATCH_RUN_LEN*256+MIN_MATCH_SIZE, %cx 9.115 + call lzsa1len 9.116 +#ifdef RAW_FORMAT 9.117 + jcxz lzsa1quit // bail if we hit EOD 9.118 +#endif 9.119 +#if !defined(FLAT32) && !defined(FLAT16OUT) 9.120 + pushw %ds 9.121 + pushw %si 9.122 + movw %di, %si 9.123 + addw %bx, %si 9.124 + movw %es, %ax 9.125 + jc axok 9.126 + subb $0x10, %ah 9.127 +axok: 9.128 +.macro norm reg 9.129 + movw %si, \reg 9.130 + subw %si, %dx 9.131 + andw $0xF, %si 9.132 + addw %si, %dx 9.133 + shrw $4, \reg 9.134 + addw \reg, %ax 9.135 + movw %ax, %ds 9.136 + movw %di, \reg 9.137 + andw $0xF, %di 9.138 + shrw $4, \reg 9.139 + movw %es, %ax 9.140 + addw \reg, %ax 9.141 + movw %ax, %es 9.142 +.endm 9.143 + pushw %dx 9.144 +# if defined(NeedNormalize) || defined(PARANOIA) 9.145 + call lzsa1movStr // copy string 9.146 +# else 9.147 + norm %bp 9.148 + rep movsb 9.149 +# endif 9.150 + popw %dx 9.151 + popw %si 9.152 + popw %ds 9.153 +#else 9.154 + xchg AX, SI // save %si 9.155 + lea (BX,DI), SI 9.156 + rep movsb %es:(SI), %es:(DI) 9.157 + xchg AX, SI // restore %si 9.158 +#endif 9.159 + jmp lzsa1chunk 9.160 + 9.161 +lzsa1len: // get length in %ecx 9.162 + andb %ch, %al 9.163 + cbw // clear %ah 9.164 + cmpb %ch, %al 9.165 + jne lzsa1minNumber // S=0-6, L=0-14 9.166 + lodsb 9.167 + addb %ch, %cl 9.168 +lzsa1minNumber: 9.169 + addb %cl, %al 9.170 + jnc lzsa1gotNumber // 0-255 9.171 + movb %al, %ah // S=256-1791, L=256-3839 or S=256-511, L=256-511 9.172 + jne lzsa1midNumber 9.173 + lodsw // 0-65535 9.174 + .byte 0x3C // mask lodsb with cmpb $0xAC, %al 9.175 +lzsa1midNumber: 9.176 + lodsb 9.177 +lzsa1gotNumber: 9.178 + xchgw %ax, %cx 9.179 +lzsa1quit: 9.180 + ret 9.181 + 9.182 +#if defined(NeedNormalize) || defined(PARANOIA) 9.183 +# if defined(PARANOIA) 9.184 +lzsa1movlp: 9.185 + decw %ch 9.186 + rep movsb 9.187 + incw %ch 9.188 +# endif 9.189 +normalize: 9.190 +lzsa1movLit: 9.191 + movw %ds, %ax 9.192 +lzsa1movStr: 9.193 + norm %bp 9.194 +# if defined(PARANOIA) 9.195 + cmpb $0xFF, %ch // catch FFFX case 9.196 + je lzsa1movlp 9.197 +# endif 9.198 + rep movsb 9.199 + ret 9.200 +#endif
10.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 10.2 +++ b/memtest64/stuff/unlzsa2.S Thu Feb 16 14:18:05 2023 +0000 10.3 @@ -0,0 +1,274 @@ 10.4 +// Lzsa2Decode: 10.5 +#ifndef FLAT32 10.6 +// input ds:si=inStream, es:di=outStream 10.7 +// output outStream[], ds:si, es:di 10.8 + .code16 10.9 +#define AX %ax 10.10 +#define BX %bx 10.11 +#define BP %bp 10.12 +#define SI %si 10.13 +#define DI %di 10.14 +#else 10.15 +// input esi=inStream, edi=outStream 10.16 +// output outStream[], ds:esi, es:edi 10.17 + .code32 10.18 +#define AX %eax 10.19 +#define BX %ebx 10.20 +#define BP %ebp 10.21 +#define SI %esi 10.22 +#define DI %edi 10.23 +#endif 10.24 + 10.25 +MATCH_RUN_LEN = 7 10.26 +LITERALS_RUN_LEN = 3 10.27 +MIN_MATCH_SIZE = 2 10.28 +MIN_LITERALS_SIZE = 0 10.29 + 10.30 +#define PACKED_ONLY // assume no copy block, optional 10.31 +//#define PARANOIA // cover rare cases, optional 10.32 + 10.33 +lzsa2main: 10.34 +#ifdef PARANOIA 10.35 + cld 10.36 +#endif 10.37 +#ifdef FLAT16OUT 10.38 +#define RAW_FORMAT 10.39 +#endif 10.40 +#ifndef RAW_FORMAT 10.41 +# if defined(PARANOIA) && !defined(FLAT32) && !defined(FLAT16) 10.42 + xorw %cx, %cx 10.43 + call normalize 10.44 +# endif 10.45 +# ifndef NO_LZSA2_HEADER 10.46 + lodsw 10.47 + cmpw $0x9E7B, %ax // magic 10.48 + jne lzsa2main 10.49 + lodsb 10.50 + testb $0x20, %al // lzsa2 10.51 + je lzsa2main 10.52 +# endif 10.53 +lzsa2block: // uncompress chunk 10.54 +# if !defined(FLAT32) && !defined(FLAT16) 10.55 + xorw %cx, %cx 10.56 + call normalize 10.57 +# endif 10.58 + lodsw // block size 10.59 + xchgw %ax, %cx 10.60 + lodsb 10.61 +# ifndef PACKED_ONLY 10.62 + orb %al, %al 10.63 + jns lzsa2compressed 10.64 +# if !defined(FLAT32) && !defined(FLAT16OUT) 10.65 + movw %cx, %dx 10.66 + movb $0, %cl 10.67 + movb $0, %dh 10.68 +copytail: 10.69 + call lzsa1movStr 10.70 + xchg %dx, %cx 10.71 + incw %cx 10.72 + loop copytail 10.73 +# else 10.74 + movsb // copy block 10.75 +copylp: 10.76 + movsb // copy block 10.77 + loop copylp // handle 64K case 10.78 +# endif 10.79 + jmp lzsa2block // end of block 10.80 +lzsa2compressed: 10.81 + jne lzsa2chunk // 64Kb block 10.82 +# endif 10.83 + jcxz lzsa2quit // bail if we hit EOD 10.84 +# if !defined(FLAT16) 10.85 + pushw %cx 10.86 + xorw %cx, %cx 10.87 + call normalize 10.88 +# define NeedNormalize 10.89 + popw %dx 10.90 + addw %si, %dx 10.91 +# else 10.92 + movw %si, %dx 10.93 + addw %cx, %dx 10.94 +# endif 10.95 +#else 10.96 +# if !defined(FLAT16) 10.97 + xorw %cx, %cx 10.98 + call normalize 10.99 +# define NeedNormalize 10.100 +# endif 10.101 +#endif 10.102 + movb $0, %bh // no nibble stored 10.103 +lzsa2chunk: // uncompress chunk 10.104 + lodsb // get token XYZ|LL|MMM 10.105 + movb %al, %bl // keep token in bl 10.106 + movw $LITERALS_RUN_LEN+256*MIN_LITERALS_SIZE, %cx 10.107 + shrb %cl, %al // shift literals length into place 10.108 + call lzsa2len // %cl = LITERALS_RUN_LEN 10.109 +#if defined(NeedNormalize) 10.110 + pushw %bp 10.111 + call lzsa2movLit // copy %cx literals from %ds:%si to %es:%di 10.112 + popw %bp 10.113 +#else 10.114 + rep movsb // copy %cx literals from %ds:%si to %es:%di 10.115 +#endif 10.116 +#ifndef RAW_FORMAT 10.117 +maxsi: 10.118 + cmpw %dx, %si 10.119 + jae lzsa2block // bail if we hit EOD 10.120 +#endif 10.121 +#ifdef FLAT32 10.122 + orl $-1, %eax // set offset bits 31-8 to 1 10.123 +#else 10.124 + movb $-1, %ah // set offset bits 15-8 to 1 10.125 +#endif 10.126 +// XYZ 10.127 + testb $0xC0, %bl // check match offset mode in token (X bit) 10.128 + bt $5, %bx // move bit 5 to carry 10.129 + js rep_match_or_large_offset 10.130 + jne offset_9_bit 10.131 +// 00Z 5-bit offset: read a nibble for offset bits 1-4 and use the inverted bit Z of the token as bit 0 of the offset. 10.132 +// set bits 5-15 of the offset to 1. 10.133 + call getByteFromNibbleAndC 10.134 + jmp get_match_length 10.135 +offset_9_bit: 10.136 +// 01Z 9-bit offset: read a byte for offset bits 0-7 and use the inverted bit Z for bit 8 of the offset. 10.137 +// set bits 9-15 of the offset to 1. 10.138 + sbbb %cl, %ah // clear bit 8 if Z bit is clear 10.139 + jmp get_match_length_0 10.140 + 10.141 +getNibble: 10.142 + xorb $0xF0, %bh // toggle nibble stored flags 10.143 + movb %bh, %al 10.144 + jns gotnibble 10.145 + lodsb 10.146 + movb $0xF0, %bh 10.147 + orb %al, %bh 10.148 + shrb $4, %al 10.149 +gotnibble: 10.150 +lzsa2quit: 10.151 + ret 10.152 + 10.153 +rep_match_or_large_offset: 10.154 + jpe rep_match_or_16_bit 10.155 +//10Z 13-bit offset: read a nibble for offset bits 9-12 and use the inverted bit Z for bit 8 of the offset, 10.156 +// then read a byte for offset bits 0-7. set bits 13-15 of the offset to 1. 10.157 +// substract 512 from the offset to get the final value. 10.158 + call getByteFromNibbleAndC 10.159 + subb $2, %al // substract 512 10.160 + jmp get_match_length_1 10.161 +rep_match_or_16_bit: 10.162 + jc repeat_match // rep-match 10.163 +//110 16-bit offset: read a byte for offset bits 8-15, then another byte for offset bits 0-7. 10.164 + lodsb // Get 2-byte match offset 10.165 +get_match_length_1: 10.166 + xchgb %al, %ah 10.167 +get_match_length_0: 10.168 + lodsb // load match offset bits 0-7 10.169 +get_match_length: 10.170 + xchgw %ax, %bp // bp: offset 10.171 +repeat_match: 10.172 +//111 repeat offset: reuse the offset value of the previous match command. 10.173 + 10.174 + movb %bl, %al // %al: original token 10.175 + movw $MATCH_RUN_LEN+256*MIN_MATCH_SIZE, %cx 10.176 + call lzsa2len 10.177 +#ifdef RAW_FORMAT 10.178 + jcxz lzsa2quit // bail if we hit EOD 10.179 +#endif 10.180 +#if !defined(FLAT32) && !defined(FLAT16OUT) 10.181 + pushw %ds 10.182 + pushw %si 10.183 + movw %di, %si 10.184 + addw %bp, %si 10.185 + movw %es, %ax 10.186 + jc axok 10.187 + subb $0x10, %ah 10.188 +axok: 10.189 +.macro norm reg 10.190 + movw %si, \reg 10.191 + subw %si, %dx 10.192 + andw $0xF, %si 10.193 + addw %si, %dx 10.194 + shrw $4, \reg 10.195 + addw \reg, %ax 10.196 + movw %ax, %ds 10.197 + movw %di, \reg 10.198 + andw $0xF, %di 10.199 + shrw $4, \reg 10.200 + movw %es, %ax 10.201 + addw \reg, %ax 10.202 + movw %ax, %es 10.203 +.endm 10.204 + pushw %bp 10.205 + pushw %dx 10.206 +# if defined(NeedNormalize) || defined(PARANOIA) 10.207 + call lzsa2movStr // copy string 10.208 +# else 10.209 + norm %bp 10.210 + rep movsb 10.211 +# endif 10.212 + popw %dx 10.213 + popw %bp 10.214 + popw %si 10.215 + popw %ds 10.216 +#else 10.217 + xchg AX, SI // save %si 10.218 + lea (BP,DI), SI 10.219 + rep movsb %es:(SI), %es:(DI) 10.220 + xchg AX, SI // restore %si 10.221 +#endif 10.222 + jmp lzsa2chunk 10.223 + 10.224 +getByteFromNibbleAndC: 10.225 + pushfw 10.226 + call getNibble // get nibble for offset bits 0-3 10.227 + popfw 10.228 + rclb $1, %al 10.229 + xorb $0xE1, %al // set offset bits 7-5 to 1 10.230 + ret 10.231 + 10.232 +lzsa2len: // get length in %cx 10.233 + andb %cl, %al 10.234 + cbw // clear %ah 10.235 + cmpb %al, %cl 10.236 + jne lzsa2minNumber // S=0-2, L=0-6 10.237 + call getNibble 10.238 + cmp $0xF, %al 10.239 + jne lzsa2noExtraByte 10.240 + addb %al, %ch 10.241 + lodsb 10.242 +lzsa2noExtraByte: 10.243 + addb %cl, %ch 10.244 +lzsa2minNumber: 10.245 + addb %ch, %al 10.246 + jnc lzsa2gotNumber // 0-255 10.247 +#if 0 10.248 + je lzsa2BigNumber 10.249 + movb %al, %ah // S=256-767, L=256-1791 10.250 + lodsb 10.251 + .byte 0xB1 // mask lodsw with movb $0xAD, %cl 10.252 +lzsa2BigNumber: 10.253 +#endif 10.254 + lodsw // 0-65535 10.255 +lzsa2gotNumber: 10.256 + xchgw %ax, %cx 10.257 + ret 10.258 + 10.259 +#if defined(NeedNormalize) || defined(PARANOIA) 10.260 +# if defined(PARANOIA) 10.261 +lzsa2movlp: 10.262 + decw %ch 10.263 + rep movsb 10.264 + incw %ch 10.265 +# endif 10.266 +normalize: 10.267 +lzsa2movLit: 10.268 + movw %ds, %ax 10.269 +lzsa2movStr: 10.270 + norm %bp 10.271 +# if defined(PARANOIA) 10.272 + cmpb $0xFF, %ch // catch FFFX case 10.273 + je lzsa2movlp 10.274 +# endif 10.275 + rep movsb 10.276 + ret 10.277 +#endif
11.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 11.2 +++ b/memtest64/stuff/unpack.S Thu Feb 16 14:18:05 2023 +0000 11.3 @@ -0,0 +1,323 @@ 11.4 +#define SYSTEM 0x10000 11.5 +#define SETUP 14 11.6 +#define SYSSIZE 0x1F4 11.7 +#define SETUPSIZE 0x1F1 11.8 + 11.9 +#define KEEP_BOOTSECTOR 0 11.10 +#define LINUX_HEADER 0 11.11 +#define UPDATE_SYSSIZE 0 11.12 +#define FLAT16 1 // lzma case 11.13 +#define FLAT16OUT 0 11.14 +#define COPYTOHIGHMEM 0 11.15 +#define UPDATE_CODE32_START 1 11.16 +#define DOUBLE_PACKED 0 11.17 +#define SAVEREGS 0 11.18 +#define ELKS 0 11.19 + 11.20 + .text 11.21 + .code16 11.22 + .org 0 11.23 + 11.24 +#if KEEP_BOOTSECTOR 11.25 +#undef UPDATE_SYSSIZE 11.26 +#define UPDATE_SYSSIZE 0 11.27 +#endif 11.28 +#if ELKS 11.29 + .arch i8086 11.30 +#define FLAT16 1 11.31 +#define KEEP_BOOTSECTOR 1 11.32 +#define LINUX_HEADER 0 11.33 +#define SAVEREGS 0 11.34 +#define TOPSEG 0x2000 11.35 +#else 11.36 +#define TOPSEG 0x8000 11.37 +#endif 11.38 + 11.39 +.macro pusham 11.40 +#if ELKS 11.41 + pushw %ax 11.42 +// movw %sp, %ax 11.43 +// incw %ax // emulate popa behaviour 11.44 +// incw %ax 11.45 + pushw %cx 11.46 + pushw %dx 11.47 + pushw %bx 11.48 +// pushw %ax // %sp 11.49 + pushw %bp 11.50 + pushw %si 11.51 + pushw %di 11.52 +#else 11.53 + pushaw 11.54 +#endif 11.55 +.endm 11.56 + 11.57 +.macro popam 11.58 +#if ELKS 11.59 + popw %di 11.60 + popw %si 11.61 + popw %bp 11.62 +// popw %ax 11.63 + popw %bx 11.64 + popw %dx 11.65 + popw %cx 11.66 + popw %ax 11.67 +#else 11.68 + popaw 11.69 +#endif 11.70 +.endm 11.71 + 11.72 +.macro pushm val 11.73 +#if ELKS 11.74 + movw \val, %ax 11.75 + pushw %ax 11.76 +#else 11.77 + pushw \val 11.78 +#endif 11.79 +.endm 11.80 + 11.81 +.macro shrwm cnt, reg 11.82 +#if ELKS 11.83 + .rept \cnt 11.84 + shrw $1, \reg 11.85 + .endr 11.86 +#else 11.87 + shrw $\cnt, \reg 11.88 +#endif 11.89 +.endm 11.90 + 11.91 + .globl _start 11.92 +_start: 11.93 +#if LINUX_HEADER 11.94 + jmp start2 11.95 + .ascii "HdrS" // 202 magic 11.96 + .word 0x200 // 206 version 2.00 11.97 + .long 0 // 208 realmode_swtch 11.98 + .word SYSTEM/16 // 20C start_sys_seg 11.99 + .word 0 // 20E kernel_version 11.100 + .byte 0 // 210 type_of_loader 11.101 + .byte 0 // 211 loadflags 11.102 + .word 0 // 212 setup_move_size 11.103 + .long SYSTEM // 214 code32_start 11.104 + .long 0 // 218 ramdisk_image 11.105 + .long 0 // 21C ramdisk_size 11.106 + .long 0 // 220 bootsect_kludge 11.107 +start2: 11.108 +#endif 11.109 +#if SAVEREGS 11.110 + pushfw 11.111 + pushw %cs 11.112 + pushw $0 11.113 + pusham 11.114 + xorw %si, %si 11.115 + pushw %ds 11.116 + pushw %es 11.117 + cld 11.118 +#else 11.119 + pushw %cs // return adress is %cs:0 11.120 + xorw %si, %si 11.121 + pushw %si 11.122 +#endif // SAVEREGS 11.123 + pushw %ds // <A> bootsector+setup segment 11.124 +#if FLAT16 11.125 +# 1- move 9000..9020+stp -> TOPSEG 11.126 + pushm $TOPSEG 11.127 + popw %es 11.128 +# if SAVEREGS 11.129 +setup_word: 11.130 + movw $SETUP*256+256, %cx 11.131 + pushw %cx // <B> bootsector+setup words 11.132 +# endif 11.133 + pushw %es // <C> TOPSEG 11.134 + pushw %es 11.135 +# if SAVEREGS 11.136 + xorw %di, %di // %ds:%si = 9000:0000 %es:%di = TOPSEG:0 11.137 + pushm $0x200+cont 11.138 + rep 11.139 + movsw 11.140 + lret 11.141 +cont: 11.142 +# else 11.143 + movw $-0x200, %di 11.144 + call jumpinto 11.145 +# endif 11.146 +# 2- move 1000..1000+sys -> TOPSEG+stp 11.147 + pushm $0x1000 11.148 + popw %ds 11.149 + xorw %si, %si // %ds:%si = 1000:0 11.150 + subw %di, %cx // %cx = 64K - setupsz 11.151 + rep 11.152 + movsb 11.153 +# 3- unlz(TOPSEG+stp:end, 1000-stp:0) 11.154 +setup_seg: 11.155 + pushm $0x1000-(SETUP*32)-32 11.156 + popw %es 11.157 +#else // FLAT16 11.158 +# 1- move 9020..9020+unpack -> 0700 and jump into 11.159 + movw $0x700, %cx // Up to 3.5KB for unpacker (unlzma is << 1KB) 11.160 + movw %cx, %es // Use 7000 .. 7E00, keep up to 23 elks setup sectors 11.161 + pushw %es 11.162 + xorw %di, %di // %ds:%si = 9000:0000 %es:%di = 0700:0000 11.163 + pushm $0x200+cont 11.164 +# if SAVEREGS 11.165 + rep 11.166 + movsw 11.167 + lret 11.168 +# else 11.169 + jmp jumpinto 11.170 +# endif 11.171 +cont: 11.172 +# 2- move 9020..9020+stp -> 9000-sys-stp 11.173 + movw %ds, %dx 11.174 +setup_byte: 11.175 + movb $SETUP+1, %ch 11.176 +setup_para: 11.177 + subw $SETUP*32+32+0xF000, %dx 11.178 +packed_syssize: 11.179 + movw $0+0x1000, %ax 11.180 + pushw %cx // <B> bootsector+setup words 11.181 + subw %ax, %dx 11.182 + movw %dx, %es 11.183 + pushw %es // <C> 9000-sys-stp 11.184 + xorw %si, %si 11.185 + xorw %di, %di // %ds:%si = 9000:0 %es:%di = 9000-sys-stp:0 11.186 + rep 11.187 + movsw 11.188 +# 3- move 1000..1000+sys -> 9000-sys 11.189 + movw %ds, %dx 11.190 +mvsys: 11.191 + decw %ax 11.192 + decw %dx 11.193 + movw %ax, %ds 11.194 + movw %dx, %es 11.195 + xorw %si, %si 11.196 + xorw %di, %di 11.197 + movw $8, %cx 11.198 + rep 11.199 + movsw 11.200 + cmpw $0x1000, %ax 11.201 + jne mvsys 11.202 +# 4- unlz(9000-sys-stp:end, 1000-stp:0) 11.203 +setup_seg: 11.204 + pushm $0x1000-(SETUP*32)-32 11.205 + popw %es 11.206 +#endif // FLAT16 11.207 + popw %ds // <C> 11.208 +#if FLAT16 && SAVEREGS == 0 11.209 + movw $end-_start, %si // %ds:%si = TOPSSEG:compressed 11.210 +#else 11.211 + movw $0x200+end-_start, %si // %ds:%si = 9000-sys-stp:compressed 11.212 +#endif 11.213 +#if KEEP_BOOTSECTOR 11.214 +setup_keep: 11.215 + xorw %di, %di 11.216 +#else 11.217 +# if UPDATE_SYSSIZE 11.218 +setup_syssize: 11.219 + movw $0x1F4, %di // %es:%di = 1000-setup-bootsector:SYSSIZE 11.220 +# else 11.221 + movw $0x200, %di 11.222 +# endif 11.223 +#endif 11.224 + pushw %di 11.225 + pushw %es 11.226 +#if DOUBLE_PACKED 11.227 +double_packed: 11.228 + pushm $0x4000 11.229 + popw %es 11.230 + pushw %di 11.231 + pushw %es 11.232 + call unpack 11.233 + popw %ds 11.234 + popw %si 11.235 + popw %es 11.236 + popw %di 11.237 + pushw %di 11.238 + pushw %es 11.239 +#endif 11.240 + call unpack 11.241 +#if COPYTOHIGHMEM 11.242 +# if FLAT16OUT 11.243 + movw $0x9310+1, %ax // from 1000:FFFF 11.244 +# else 11.245 +# if 0 11.246 + movw %es, %ax 11.247 + shrw $12, %ax 11.248 + orw $0x9310, %ax 11.249 +# else 11.250 + movw $0x9310+7, %ax // from 7000:FFFF 11.251 +# endif 11.252 +# endif 11.253 + pushw %ss 11.254 + popw %es 11.255 + movw $8, %cx 11.256 +zero1: 11.257 + pushw $0 // 2E..20 11.258 + loop zero1 11.259 +src: 11.260 + pushw %cx // 1E, 16 11.261 + pushw %ax // 1A: dst %ax:%cx, 12: src %ax:%cx 11.262 + pushw %cx 11.263 + pushw $-1 // 18, 10: full 64K segment 11.264 + subb $0x10, %al 11.265 + jnc src 11.266 + movb $8, %cl 11.267 +zero2: 11.268 + pushw $0 // 0E..00 11.269 + loop zero2 11.270 + movw %sp, %si 11.271 +syslp: 11.272 + movb $0x80, %ch 11.273 + movb $0x87, %ah 11.274 + int $0x15 11.275 +# if FLAT16OUT == 0 11.276 + decb %es:0x1C(%si) 11.277 + decb %es:0x14(%si) 11.278 + jne syslp // down to 1000:0000 11.279 +# endif 11.280 + addw $0x30, %sp 11.281 +#endif // COPYTOHIGHMEM 11.282 + popw %ds 11.283 + popw %si // %ds:%si = 1000-setup-bootsector:SYSSIZE / 0 11.284 +#if UPDATE_CODE32_START 11.285 +update_code32_start: 11.286 +// movb $1, 0x216 11.287 +#endif 11.288 +#if FLAT16 == 0 || SAVEREGS 11.289 + popw %cx // <B> bootsector+setup words 11.290 +#endif 11.291 + popw %es // <A> bootsector+setup segment 11.292 + movw %si, %di 11.293 +jumpinto: 11.294 +#if FLAT16 && SAVEREGS == 0 11.295 +setup_word: 11.296 + movw $SETUP*256+256, %cx 11.297 +#endif 11.298 +# 5- move 1000-stp..1000 -> 9000 11.299 + rep 11.300 + movsw 11.301 +#if SAVEREGS 11.302 + popw %es 11.303 + popw %ds 11.304 + popam 11.305 + iret 11.306 +#else 11.307 + lret 11.308 +#endif 11.309 + 11.310 +unpack: 11.311 +#define NO_LZMA_HEADER 11.312 +#define NO_LZSA2_HEADER 11.313 +#define NO_LZSA1_HEADER 11.314 +#define NO_LZ4_HEADER 11.315 +#if ELKS 11.316 +#define ONLY8086 1 11.317 +#endif 11.318 +#if defined(FLAT16OUT) && FLAT16OUT == 0 11.319 +#undef FLAT16OUT 11.320 +#endif 11.321 +#if defined(FLAT16) && FLAT16 == 0 11.322 +#undef FLAT16 11.323 +#endif 11.324 +#include "uncompress.S" 11.325 + 11.326 +end:
12.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 12.2 +++ b/memtest64/stuff/unpackx.S Thu Feb 16 14:18:05 2023 +0000 12.3 @@ -0,0 +1,323 @@ 12.4 +#define SYSTEM 0x10000 12.5 +#define SETUP 14 12.6 +#define SYSSIZE 0x1F4 12.7 +#define SETUPSIZE 0x1F1 12.8 + 12.9 +#define KEEP_BOOTSECTOR 0 12.10 +#define LINUX_HEADER 0 12.11 +#define UPDATE_SYSSIZE 1 12.12 +#define FLAT16 1 // lzma case 12.13 +#define FLAT16OUT 0 12.14 +#define COPYTOHIGHMEM 0 12.15 +#define UPDATE_CODE32_START 0 12.16 +#define DOUBLE_PACKED 0 12.17 +#define SAVEREGS 0 12.18 +#define ELKS 0 12.19 + 12.20 + .text 12.21 + .code16 12.22 + .org 0 12.23 + 12.24 +#if KEEP_BOOTSECTOR 12.25 +#undef UPDATE_SYSSIZE 12.26 +#define UPDATE_SYSSIZE 0 12.27 +#endif 12.28 +#if ELKS 12.29 + .arch i8086 12.30 +#define FLAT16 1 12.31 +#define KEEP_BOOTSECTOR 1 12.32 +#define LINUX_HEADER 0 12.33 +#define SAVEREGS 0 12.34 +#define TOPSEG 0x2000 12.35 +#else 12.36 +#define TOPSEG 0x8000 12.37 +#endif 12.38 + 12.39 +.macro pusham 12.40 +#if ELKS 12.41 + pushw %ax 12.42 +// movw %sp, %ax 12.43 +// incw %ax // emulate popa behaviour 12.44 +// incw %ax 12.45 + pushw %cx 12.46 + pushw %dx 12.47 + pushw %bx 12.48 +// pushw %ax // %sp 12.49 + pushw %bp 12.50 + pushw %si 12.51 + pushw %di 12.52 +#else 12.53 + pushaw 12.54 +#endif 12.55 +.endm 12.56 + 12.57 +.macro popam 12.58 +#if ELKS 12.59 + popw %di 12.60 + popw %si 12.61 + popw %bp 12.62 +// popw %ax 12.63 + popw %bx 12.64 + popw %dx 12.65 + popw %cx 12.66 + popw %ax 12.67 +#else 12.68 + popaw 12.69 +#endif 12.70 +.endm 12.71 + 12.72 +.macro pushm val 12.73 +#if ELKS 12.74 + movw \val, %ax 12.75 + pushw %ax 12.76 +#else 12.77 + pushw \val 12.78 +#endif 12.79 +.endm 12.80 + 12.81 +.macro shrwm cnt, reg 12.82 +#if ELKS 12.83 + .rept \cnt 12.84 + shrw $1, \reg 12.85 + .endr 12.86 +#else 12.87 + shrw $\cnt, \reg 12.88 +#endif 12.89 +.endm 12.90 + 12.91 + .globl _start 12.92 +_start: 12.93 +#if LINUX_HEADER 12.94 + jmp start2 12.95 + .ascii "HdrS" // 202 magic 12.96 + .word 0x200 // 206 version 2.00 12.97 + .long 0 // 208 realmode_swtch 12.98 + .word SYSTEM/16 // 20C start_sys_seg 12.99 + .word 0 // 20E kernel_version 12.100 + .byte 0 // 210 type_of_loader 12.101 + .byte 0 // 211 loadflags 12.102 + .word 0 // 212 setup_move_size 12.103 + .long SYSTEM // 214 code32_start 12.104 + .long 0 // 218 ramdisk_image 12.105 + .long 0 // 21C ramdisk_size 12.106 + .long 0 // 220 bootsect_kludge 12.107 +start2: 12.108 +#endif 12.109 +#if SAVEREGS 12.110 + pushfw 12.111 + pushw %cs 12.112 + pushw $0 12.113 + pusham 12.114 + xorw %si, %si 12.115 + pushw %ds 12.116 + pushw %es 12.117 + cld 12.118 +#else 12.119 + pushw %cs // return adress is %cs:0 12.120 + xorw %si, %si 12.121 + pushw %si 12.122 +#endif // SAVEREGS 12.123 + pushw %ds // <A> bootsector+setup segment 12.124 +#if FLAT16 12.125 +# 1- move 9000..9020+stp -> TOPSEG 12.126 + pushm $TOPSEG 12.127 + popw %es 12.128 +# if SAVEREGS 12.129 +setup_word: 12.130 + movw $SETUP*256+256, %cx 12.131 + pushw %cx // <B> bootsector+setup words 12.132 +# endif 12.133 + pushw %es // <C> TOPSEG 12.134 + pushw %es 12.135 +# if SAVEREGS 12.136 + xorw %di, %di // %ds:%si = 9000:0000 %es:%di = TOPSEG:0 12.137 + pushm $0x200+cont 12.138 + rep 12.139 + movsw 12.140 + lret 12.141 +cont: 12.142 +# else 12.143 + movw $-0x200, %di 12.144 + call jumpinto 12.145 +# endif 12.146 +# 2- move 1000..1000+sys -> TOPSEG+stp 12.147 + pushm $0x1000 12.148 + popw %ds 12.149 + xorw %si, %si // %ds:%si = 1000:0 12.150 + subw %di, %cx // %cx = 64K - setupsz 12.151 + rep 12.152 + movsb 12.153 +# 3- unlz(TOPSEG+stp:end, 1000-stp:0) 12.154 +setup_seg: 12.155 + pushm $0x1000-(SETUP*32)-32 12.156 + popw %es 12.157 +#else // FLAT16 12.158 +# 1- move 9020..9020+unpack -> 0700 and jump into 12.159 + movw $0x700, %cx // Up to 3.5KB for unpacker (unlzma is << 1KB) 12.160 + movw %cx, %es // Use 7000 .. 7E00, keep up to 23 elks setup sectors 12.161 + pushw %es 12.162 + xorw %di, %di // %ds:%si = 9000:0000 %es:%di = 0700:0000 12.163 + pushm $0x200+cont 12.164 +# if SAVEREGS 12.165 + rep 12.166 + movsw 12.167 + lret 12.168 +# else 12.169 + jmp jumpinto 12.170 +# endif 12.171 +cont: 12.172 +# 2- move 9020..9020+stp -> 9000-sys-stp 12.173 + movw %ds, %dx 12.174 +setup_byte: 12.175 + movb $SETUP+1, %ch 12.176 +setup_para: 12.177 + subw $SETUP*32+32+0xF000, %dx 12.178 +packed_syssize: 12.179 + movw $0+0x1000, %ax 12.180 + pushw %cx // <B> bootsector+setup words 12.181 + subw %ax, %dx 12.182 + movw %dx, %es 12.183 + pushw %es // <C> 9000-sys-stp 12.184 + xorw %si, %si 12.185 + xorw %di, %di // %ds:%si = 9000:0 %es:%di = 9000-sys-stp:0 12.186 + rep 12.187 + movsw 12.188 +# 3- move 1000..1000+sys -> 9000-sys 12.189 + movw %ds, %dx 12.190 +mvsys: 12.191 + decw %ax 12.192 + decw %dx 12.193 + movw %ax, %ds 12.194 + movw %dx, %es 12.195 + xorw %si, %si 12.196 + xorw %di, %di 12.197 + movw $8, %cx 12.198 + rep 12.199 + movsw 12.200 + cmpw $0x1000, %ax 12.201 + jne mvsys 12.202 +# 4- unlz(9000-sys-stp:end, 1000-stp:0) 12.203 +setup_seg: 12.204 + pushm $0x1000-(SETUP*32)-32 12.205 + popw %es 12.206 +#endif // FLAT16 12.207 + popw %ds // <C> 12.208 +#if FLAT16 && SAVEREGS == 0 12.209 + movw $end-_start, %si // %ds:%si = TOPSSEG:compressed 12.210 +#else 12.211 + movw $0x200+end-_start, %si // %ds:%si = 9000-sys-stp:compressed 12.212 +#endif 12.213 +#if KEEP_BOOTSECTOR 12.214 +setup_keep: 12.215 + xorw %di, %di 12.216 +#else 12.217 +# if UPDATE_SYSSIZE 12.218 +setup_syssize: 12.219 + movw $0x1F4, %di // %es:%di = 1000-setup-bootsector:SYSSIZE 12.220 +# else 12.221 + movw $0x200, %di 12.222 +# endif 12.223 +#endif 12.224 + pushw %di 12.225 + pushw %es 12.226 +#if DOUBLE_PACKED 12.227 +double_packed: 12.228 + pushm $0x4000 12.229 + popw %es 12.230 + pushw %di 12.231 + pushw %es 12.232 + call unpack 12.233 + popw %ds 12.234 + popw %si 12.235 + popw %es 12.236 + popw %di 12.237 + pushw %di 12.238 + pushw %es 12.239 +#endif 12.240 + call unpack 12.241 +#if COPYTOHIGHMEM 12.242 +# if FLAT16OUT 12.243 + movw $0x9310+1, %ax // from 1000:FFFF 12.244 +# else 12.245 +# if 0 12.246 + movw %es, %ax 12.247 + shrw $12, %ax 12.248 + orw $0x9310, %ax 12.249 +# else 12.250 + movw $0x9310+7, %ax // from 7000:FFFF 12.251 +# endif 12.252 +# endif 12.253 + pushw %ss 12.254 + popw %es 12.255 + movw $8, %cx 12.256 +zero1: 12.257 + pushw $0 // 2E..20 12.258 + loop zero1 12.259 +src: 12.260 + pushw %cx // 1E, 16 12.261 + pushw %ax // 1A: dst %ax:%cx, 12: src %ax:%cx 12.262 + pushw %cx 12.263 + pushw $-1 // 18, 10: full 64K segment 12.264 + subb $0x10, %al 12.265 + jnc src 12.266 + movb $8, %cl 12.267 +zero2: 12.268 + pushw $0 // 0E..00 12.269 + loop zero2 12.270 + movw %sp, %si 12.271 +syslp: 12.272 + movb $0x80, %ch 12.273 + movb $0x87, %ah 12.274 + int $0x15 12.275 +# if FLAT16OUT == 0 12.276 + decb %es:0x1C(%si) 12.277 + decb %es:0x14(%si) 12.278 + jne syslp // down to 1000:0000 12.279 +# endif 12.280 + addw $0x30, %sp 12.281 +#endif // COPYTOHIGHMEM 12.282 + popw %ds 12.283 + popw %si // %ds:%si = 1000-setup-bootsector:SYSSIZE / 0 12.284 +#if UPDATE_CODE32_START 12.285 +update_code32_start: 12.286 +// movb $1, 0x216 12.287 +#endif 12.288 +#if FLAT16 == 0 || SAVEREGS 12.289 + popw %cx // <B> bootsector+setup words 12.290 +#endif 12.291 + popw %es // <A> bootsector+setup segment 12.292 + movw %si, %di 12.293 +jumpinto: 12.294 +#if FLAT16 && SAVEREGS == 0 12.295 +setup_word: 12.296 + movw $SETUP*256+256, %cx 12.297 +#endif 12.298 +# 5- move 1000-stp..1000 -> 9000 12.299 + rep 12.300 + movsw 12.301 +#if SAVEREGS 12.302 + popw %es 12.303 + popw %ds 12.304 + popam 12.305 + iret 12.306 +#else 12.307 + lret 12.308 +#endif 12.309 + 12.310 +unpack: 12.311 +#define NO_LZMA_HEADER 12.312 +#define NO_LZSA2_HEADER 12.313 +#define NO_LZSA1_HEADER 12.314 +#define NO_LZ4_HEADER 12.315 +#if ELKS 12.316 +#define ONLY8086 1 12.317 +#endif 12.318 +#if defined(FLAT16OUT) && FLAT16OUT == 0 12.319 +#undef FLAT16OUT 12.320 +#endif 12.321 +#if defined(FLAT16) && FLAT16 == 0 12.322 +#undef FLAT16 12.323 +#endif 12.324 +#include "uncompress.S" 12.325 + 12.326 +end: