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: