Magellan Linux

Contents of /trunk/mkinitrd-magellan/isolinux/rllpack.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File size: 2374 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 ; -*- fundamental -*-
2 ; -----------------------------------------------------------------------
3 ;
4 ; Copyright 2004 H. Peter Anvin - All Rights Reserved
5 ;
6 ; This program is free software; you can redistribute it and/or modify
7 ; it under the terms of the GNU General Public License as published by
8 ; the Free Software Foundation, Inc., 53 Temple Place Ste 330,
9 ; Boston MA 02111-1307, USA; either version 2 of the License, or
10 ; (at your option) any later version; incorporated herein by reference.
11 ;
12 ; -----------------------------------------------------------------------
13 ; $Id: rllpack.inc,v 1.1 2007-09-01 22:44:05 niro Exp $
14
15 ;
16 ; rllpack.inc
17 ;
18 ; Very simple RLL compressor/decompressor, used to pack binary structures
19 ; together.
20 ;
21 ; Format of leading byte
22 ; 1-128 = x verbatim bytes follow
23 ; 129-255 = (x-126) times subsequent byte
24 ; 0 = end of data
25 ;
26
27 section .text
28
29 ;
30 ; rllpack:
31 ; Pack CX bytes from DS:SI into ES:DI
32 ; Returns updated SI, DI and CX = number of bytes output
33 ;
34 rllpack:
35 push ax
36 push bx
37 push cx
38 push bp
39 push di
40 .startseq:
41 xor ax,ax ; Zero byte
42 xor bx,bx ; Run length zero
43 mov bp,di ; Pointer to header byte
44 stosb ; Store header byte (might be zero)
45 jcxz .done_null
46 .stdbyte:
47 lodsb
48 stosb
49 dec cx
50 cmp ah,al
51 je .same
52 .diff:
53 mov ah,al
54 xor bx,bx
55 .plainbyte:
56 inc bx
57 inc byte [es:bp]
58 jcxz .done
59 jns .stdbyte
60 jmp .startseq
61 .same:
62 cmp bl,2
63 jb .plainbyte
64 ; 3 bytes or more in a row, time to convert sequence
65 sub byte [es:bp],bl
66 jnz .normal
67 dec di ; We killed a whole stretch, remove start byte
68 .normal:
69 inc bx
70 sub di,bx
71 mov bp,di
72 mov al,bl
73 add al,126
74 stosb
75 mov al,ah
76 stosb
77 .getrun:
78 jcxz .done
79 cmp bl,255-126
80 jae .startseq
81 lodsb
82 cmp al,ah
83 jne .nomatch
84 inc bx
85 inc byte [es:bp]
86 dec cx
87 jmp .getrun
88 .nomatch:
89 dec si
90 jmp .startseq
91 .done:
92 xor al,al
93 stosb
94 .done_null:
95 pop dx
96 sub dx,di
97 neg dx
98 pop bp
99 pop cx
100 pop bx
101 pop ax
102 ret
103 ;
104 ; rllunpack:
105 ; Unpack bytes from DS:SI into ES:DI
106 ; On return SI, DI are updated and CX contains number of bytes output
107 ;
108 rllunpack:
109 push ax
110 push di
111 xor cx,cx
112 .header:
113 lodsb
114 and al,al
115 jz .done
116 cmp al,129
117 jae .isrun
118 ; Not a run
119 mov cl,al
120 rep movsb
121 jmp .header
122 .isrun:
123 sub al,126
124 mov cl,al
125 lodsb
126 rep stosb
127 jmp .header
128 .done:
129 pop cx
130 sub cx,di
131 neg cx
132 pop ax
133 ret