wok-next diff memtest/stuff/unpack.S @ rev 13269

memtest: compression (-76K)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Aug 19 08:06:36 2012 +0200 (2012-08-19)
parents
children 1d5a6d3ed1f5
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/memtest/stuff/unpack.S	Sun Aug 19 08:06:36 2012 +0200
     1.3 @@ -0,0 +1,83 @@
     1.4 +#define TOP	0x8FF00
     1.5 +#define SYSTEM	0x10000
     1.6 +#define SETUP	4
     1.7 +
     1.8 +	.text
     1.9 +	.code16
    1.10 +	.org	0
    1.11 +
    1.12 +	.globl	_start
    1.13 +_start:
    1.14 +	pushf
    1.15 +	pushw	%cs
    1.16 +	call	getip
    1.17 +getip:
    1.18 +	pushal
    1.19 +	movw	$0, %bx		// packed sizes
    1.20 +	movw	%sp, %bp
    1.21 +#define START_IP	32(%bp)
    1.22 +	pushw	%ds
    1.23 +	pushw	%es
    1.24 +	subw	$getip-_start, START_IP
    1.25 +
    1.26 +	cld
    1.27 +	pushw	%cs
    1.28 +	popw	%ds	
    1.29 +	movw	$TOP/16, %ax
    1.30 +	movw	%ax, %es
    1.31 +	subw	%bx, %ax	// moved packed data
    1.32 +	movw	START_IP, %si
    1.33 +	movw	$moved-_start, %di
    1.34 +	addw	%si, %di
    1.35 +	pushw	%ds		// save setup seg
    1.36 +	pushw	%es		// moved
    1.37 +	pushw	%di		//   unpack code
    1.38 +	movw	%si, %di
    1.39 +	movw	$end-_start, %cx
    1.40 +	rep
    1.41 +	movsb			// move upack code to $TOP
    1.42 +	pushw	%si		// data offset
    1.43 +	movw	%ax, %es
    1.44 +	movw	$SETUP*512, %cx
    1.45 +	subw	$SETUP*32, %bx
    1.46 +	xorw	%si, %si
    1.47 +	xorw	%di, %di
    1.48 +	rep
    1.49 +	movsb			// move header part
    1.50 +	pushw	$SYSTEM/16
    1.51 +	popw	%ds
    1.52 +movlp:
    1.53 +	xorw	%si, %si
    1.54 +	movw	$8, %cx
    1.55 +	rep
    1.56 +	movsw			// move system part
    1.57 +	subw	$16, %di
    1.58 +	movw	%ds, %cx
    1.59 +	incw	%cx
    1.60 +	movw	%cx, %ds
    1.61 +	movw	%es, %cx
    1.62 +	incw	%cx
    1.63 +	movw	%cx, %es
    1.64 +	decw	%bx
    1.65 +	jns	movlp
    1.66 +	popw	%si		// data offset
    1.67 +	movw	%ax, %ds
    1.68 +	retf
    1.69 +
    1.70 +moved:
    1.71 +	popw	%es		// restore setup seg
    1.72 +	movw	START_IP, %di
    1.73 +	call	unpack		// unpack setup
    1.74 +	pushw	$SYSTEM/16
    1.75 +	popw	%es
    1.76 +	xorw	%di,%di
    1.77 +	call	unpack		// unpack system
    1.78 +	popw	%es
    1.79 +	popw	%ds
    1.80 +	popal
    1.81 +	iret
    1.82 +
    1.83 +unpack:
    1.84 +#include "unlz4.S"
    1.85 +
    1.86 +end: