Subversion Repositories Kolibri OS

Rev

Rev 485 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 485 Rev 551
1
;
1
;
2
; MHC archiver for MenuetOS - very fast compression tool
2
; MHC archiver for MenuetOS - very fast compression tool
3
;
3
;
4
; version 0.09
4
; version 0.09
5
;
5
;
6
; Written by Nikita Lesnikov (nlo_one@mail.ru, Republic of Belarus, Sluck)
6
; Written by Nikita Lesnikov (nlo_one@mail.ru, Republic of Belarus, Sluck)
7
;
7
;
8
 
8
 
9
;==============================================================================
9
;==============================================================================
10
 
10
 
11
;
11
;
12
; Brief file format description:
12
; Brief file format description:
13
;
13
;
14
;                  +-----------+------------------------+
14
;                  +-----------+------------------------+
15
;  File structure: | Method ID | Compressed data        |
15
;  File structure: | Method ID | Compressed data        |
16
;                  +-----------+------------------------+
16
;                  +-----------+------------------------+
17
;
17
;
18
;  Methods list:
18
;  Methods list:
19
;
19
;
20
;    0. LZP (order-2 specified specially for *.ASM,*.RAW and MeOS executables)
20
;    0. LZP (order-2 specified specially for *.ASM,*.RAW and MeOS executables)
21
;
21
;
22
;  New methods can be easily added without loss of compatibility
22
;  New methods can be easily added without loss of compatibility
23
; with older versions
23
; with older versions
24
;
24
;
25
 
25
 
26
;==============================================================================
26
;==============================================================================
27
 
27
 
28
; SYSTEM HEADER
28
; SYSTEM HEADER
29
 
29
 
30
use32
30
use32
31
 
31
 
32
  org 0x0
32
  org 0x0
33
  db "MENUET01"
33
  db "MENUET01"
34
  dd 0x01
34
  dd 0x01
35
  dd ENTRANCE
35
  dd ENTRANCE
36
  dd MHC_END
36
  dd MHC_END
37
  dd 0x300000  ; 3 megs of memory needed
37
  dd 0x300000  ; 3 megs of memory needed
38
  dd 0x2FF000
38
  dd 0x2FF000
39
  dd 0x0
39
  dd 0x0
40
  dd 0x0
40
  dd 0x0
41
 
41
 
42
include 'lang.inc'
42
include 'lang.inc'
43
include '..\..\..\macros.inc'
43
include '..\..\..\macros.inc'
44
; CODE AREA
44
; CODE AREA
45
 
45
 
46
ENTRANCE:
46
ENTRANCE:
47
 
47
 
48
; ======== user interface =========
48
; ======== user interface =========
49
 
49
 
50
 
50
 
51
 call draw_window             ; draw the window
51
 call draw_window             ; draw the window
52
 
52
 
53
 still:
53
 still:
54
 
54
 
55
 mov eax,10                   ; wait for event
55
 mov eax,10                   ; wait for event
56
 mcall
56
 mcall
57
 
57
 
58
 cmp eax,1                    ; redraw?
58
 cmp eax,1                    ; redraw?
59
 jnz no_redraw
59
 jnz no_redraw
60
 call draw_window
60
 call draw_window
61
 no_redraw:
61
 no_redraw:
62
 
62
 
63
 cmp eax,2                    ; key pressed?
63
 cmp eax,2                    ; key pressed?
64
 jz key
64
 jz key
65
 
65
 
66
 cmp eax,3                    ; button pressed?
66
 cmp eax,3                    ; button pressed?
67
 jz button
67
 jz button
68
 
68
 
69
 jmp still
69
 jmp still
70
 
70
 
71
 ; Key handler
71
 ; Key handler
72
 
72
 
73
 key:
73
 key:
74
 mov eax,2   ; read it
74
 mov eax,2   ; read it
75
 mcall
75
 mcall
76
 shr eax,8
76
 shr eax,8
77
 
77
 
78
 cmp byte [editstate],0
78
 cmp byte [editstate],0
79
 jz  still
79
 jz  still
80
 
80
 
81
 cmp al,8    ; backspace
81
 cmp al,8    ; backspace
82
 jnz no_bksp
82
 jnz no_bksp
83
 cmp byte [editpos],0
83
 cmp byte [editpos],0
84
 jz  no_del_last
84
 jz  no_del_last
85
 dec byte [editpos]
85
 dec byte [editpos]
86
 xor ebx,ebx
86
 xor ebx,ebx
87
 mov bl,byte [editpos]
87
 mov bl,byte [editpos]
88
 add ebx,cmfile
88
 add ebx,cmfile
89
 cmp byte [editstate],2
89
 cmp byte [editstate],2
90
 jnz no_add_base_1
90
 jnz no_add_base_1
91
 add ebx,12
91
 add ebx,12
92
 no_add_base_1:
92
 no_add_base_1:
93
 mov byte [ebx],32
93
 mov byte [ebx],32
94
 no_del_last:
94
 no_del_last:
95
 call draw_info
95
 call draw_info
96
 jmp still
96
 jmp still
97
 no_bksp:
97
 no_bksp:
98
 
98
 
99
 cmp al,13            ; enter
99
 cmp al,13            ; enter
100
 jnz no_enter
100
 jnz no_enter
101
 mov byte [editstate],0
101
 mov byte [editstate],0
102
 call draw_info
102
 call draw_info
103
 jmp still
103
 jmp still
104
 no_enter:
104
 no_enter:
105
 
105
 
106
 cmp eax,dword 31
106
 cmp eax,dword 31
107
 jbe no_lit
107
 jbe no_lit
108
 cmp eax,dword 95
108
 cmp eax,dword 95
109
 jb  capital
109
 jb  capital
110
 sub eax,32
110
 sub eax,32
111
 capital:
111
 capital:
112
 xor ebx,ebx
112
 xor ebx,ebx
113
 mov bl,byte [editpos]
113
 mov bl,byte [editpos]
114
 add ebx,cmfile
114
 add ebx,cmfile
115
 cmp byte [editstate],2
115
 cmp byte [editstate],2
116
 jnz no_add_base_2
116
 jnz no_add_base_2
117
 add ebx,12
117
 add ebx,12
118
 no_add_base_2:
118
 no_add_base_2:
119
 mov byte [ebx],al
119
 mov byte [ebx],al
120
 inc byte [editpos]
120
 inc byte [editpos]
121
 cmp byte [editpos],12
121
 cmp byte [editpos],12
122
 jnz no_null_state
122
 jnz no_null_state
123
 mov byte [editstate],0
123
 mov byte [editstate],0
124
 no_null_state:
124
 no_null_state:
125
 call draw_info
125
 call draw_info
126
 no_lit:
126
 no_lit:
127
 
127
 
128
 jmp still
128
 jmp still
129
 
129
 
130
 ; Button handler
130
 ; Button handler
131
 
131
 
132
 button:
132
 button:
133
 
133
 
134
 mov eax,17
134
 mov eax,17
135
 mcall
135
 mcall
136
 
136
 
137
 cmp ah,1
137
 cmp ah,1
138
 jnz no_quit
138
 jnz no_quit
139
 mov eax,-1
139
 mov eax,-1
140
 mcall
140
 mcall
141
 no_quit:
141
 no_quit:
142
 
142
 
143
 cmp ah,4
143
 cmp ah,4
144
 jnz nofirst
144
 jnz nofirst
145
 cld
145
 cld
146
 mov byte [editstate],1
146
 mov byte [editstate],1
147
 mov edi,cmfile
147
 mov edi,cmfile
148
 mov eax,0x20202020
148
 mov eax,0x20202020
149
 mov ecx,3
149
 mov ecx,3
150
 rep stosd
150
 rep stosd
151
 mov byte [editpos],0
151
 mov byte [editpos],0
152
 mov byte [msgid],0
152
 mov byte [msgid],0
153
 call draw_info
153
 call draw_info
154
 nofirst:
154
 nofirst:
155
 
155
 
156
 cmp ah,5
156
 cmp ah,5
157
 jnz nosecond
157
 jnz nosecond
158
 cld
158
 cld
159
 mov byte [editstate],2
159
 mov byte [editstate],2
160
 mov edi,iofile
160
 mov edi,iofile
161
 mov eax,0x20202020
161
 mov eax,0x20202020
162
 mov ecx,3
162
 mov ecx,3
163
 rep stosd
163
 rep stosd
164
 mov byte [editpos],0
164
 mov byte [editpos],0
165
 mov byte [msgid],0
165
 mov byte [msgid],0
166
 call draw_info
166
 call draw_info
167
 nosecond:
167
 nosecond:
168
 
168
 
169
 cmp ah,2
169
 cmp ah,2
170
 jnz no_compress
170
 jnz no_compress
171
 call compress
171
 call compress
172
 no_compress:
172
 no_compress:
173
 
173
 
174
 cmp ah,3
174
 cmp ah,3
175
 jnz no_decompress
175
 jnz no_decompress
176
 call decompress
176
 call decompress
177
 no_decompress:
177
 no_decompress:
178
 
178
 
179
 cmp ah,6
179
 cmp ah,6
180
 jnz no_delete_io
180
 jnz no_delete_io
181
 pusha
181
 pusha
182
 mov eax,32
182
 mov eax,32
183
 mov ebx,iofile
183
 mov ebx,iofile
184
 mcall
184
 mcall
185
 popa
185
 popa
186
 no_delete_io:
186
 no_delete_io:
187
 
187
 
188
 cmp ah,7
188
 cmp ah,7
189
 jnz  no_delete_archive
189
 jnz  no_delete_archive
190
 pusha
190
 pusha
191
 mov eax,32
191
 mov eax,32
192
 mov ebx,cmfile
192
 mov ebx,cmfile
193
 mcall
193
 mcall
194
 popa
194
 popa
195
 no_delete_archive:
195
 no_delete_archive:
196
 
196
 
197
 jmp still
197
 jmp still
198
 
198
 
199
 ; WINDOW DRAW
199
 ; WINDOW DRAW
200
 
200
 
201
 draw_window:
201
 draw_window:
202
 
202
 
203
 mov eax,12  ; Start redrawing
203
 mov eax,12  ; Start redrawing
204
 mov ebx,1
204
 mov ebx,1
205
 mcall
205
 mcall
206
 
206
 
207
 xor eax,eax           ; Define window
207
 xor eax,eax           ; Define window
208
 mov ebx,100*65536+240
208
 mov ebx,100*65536+240
209
 mov ecx,100*65536+130
209
 mov ecx,100*65536+130
210
 mov edx,0x03AAAAAA
210
 mov edx,0x04AAAAAA
211
 mov esi,0x80777777
211
 mov esi,0x80777777
212
 mov edi,0x00777777
212
 mov edi,0x00777777
213
 mcall
213
 mcall
214
 
214
 
215
 mov eax,4              ; Draw all needed texts
215
 mov eax,4              ; Draw all needed texts
216
 mov ebx,8*65536+8
216
 mov ebx,8*65536+8
217
 mov ecx,0x00FFFFFF
217
 mov ecx,0x00FFFFFF
218
 mov edx,title
218
 mov edx,title
219
 mov esi,arclab-title
219
 mov esi,arclab-title
220
 mcall
220
 mcall
221
 
221
 
222
 xor ecx,ecx
222
 xor ecx,ecx
223
 mov edx,arclab
223
 mov edx,arclab
224
 mov esi,unplab-arclab
224
 mov esi,unplab-arclab
225
 add ebx,10*65536+28
225
 add ebx,10*65536+28
226
 mcall
226
 mcall
227
 
227
 
228
 mov edx,unplab
228
 mov edx,unplab
229
 mov esi,fin_text-unplab
229
 mov esi,fin_text-unplab
230
 add ebx,18
230
 add ebx,18
231
 mcall
231
 mcall
232
 
232
 
233
 pusha
233
 pusha
234
 
234
 
235
; mov eax,8            ; Buttons
235
; mov eax,8            ; Buttons
236
; mov ebx,222*65536+10
236
; mov ebx,222*65536+10
237
; mov ecx,6*65536+10
237
; mov ecx,6*65536+10
238
; mov edx,1
238
; mov edx,1
239
; mov esi,0x555555
239
; mov esi,0x555555
240
; mcall
240
; mcall
241
 
241
 
242
 mov eax,8
242
 mov eax,8
243
 mov ebx,15*65536+100
243
 mov ebx,15*65536+100
244
 mov ecx,70*65536+13
244
 mov ecx,70*65536+13
245
 mov edx,2
245
 mov edx,2
246
 mcall
246
 mcall
247
 
247
 
248
 inc edx
248
 inc edx
249
 add ebx,110*65536
249
 add ebx,110*65536
250
 mcall
250
 mcall
251
 
251
 
252
 inc edx
252
 inc edx
253
 mov ebx,214*65536+11
253
 mov ebx,214*65536+11
254
 mov ecx,33*65536+11
254
 mov ecx,33*65536+11
255
 mcall
255
 mcall
256
 
256
 
257
 inc edx
257
 inc edx
258
 add ecx,18*65536
258
 add ecx,18*65536
259
 mcall
259
 mcall
260
 
260
 
261
 inc edx
261
 inc edx
262
 mov ebx,15*65536+100
262
 mov ebx,15*65536+100
263
 mov ecx,86*65536+13
263
 mov ecx,86*65536+13
264
 mcall
264
 mcall
265
 
265
 
266
 inc edx
266
 inc edx
267
 add ebx,110*65536
267
 add ebx,110*65536
268
 mcall
268
 mcall
269
 
269
 
270
 popa
270
 popa
271
 
271
 
272
 mov ecx,0x00FFFFFF
272
 mov ecx,0x00FFFFFF
273
 mov edx,keylab
273
 mov edx,keylab
274
 mov esi,dellab-keylab
274
 mov esi,dellab-keylab
275
 add ebx,19
275
 add ebx,19
276
 mcall
276
 mcall
277
 
277
 
278
 mov edx,dellab
278
 mov edx,dellab
279
 mov esi,title-dellab
279
 mov esi,title-dellab
280
 add ebx,16
280
 add ebx,16
281
 mcall
281
 mcall
282
 
282
 
283
 call draw_info
283
 call draw_info
284
 
284
 
285
 mov eax,12          ; Finish redrawing
285
 mov eax,12          ; Finish redrawing
286
 mov ebx,2
286
 mov ebx,2
287
 mcall
287
 mcall
288
 
288
 
289
 ret
289
 ret
290
 
290
 
291
 draw_info:          ; Draw filenames and compressor state
291
 draw_info:          ; Draw filenames and compressor state
292
 
292
 
293
 activecolor equ 0x00112299
293
 activecolor equ 0x00112299
294
 
294
 
295
 pusha ; Save registers
295
 pusha ; Save registers
296
 
296
 
297
 mov eax,13               ; Clean draw area
297
 mov eax,13               ; Clean draw area
298
 mov ebx,127*65536+85
298
 mov ebx,127*65536+85
299
 mov ecx,33*65536+33
299
 mov ecx,33*65536+33
300
 mov edx,0x00AAAAAA
300
 mov edx,0x00AAAAAA
301
 mcall
301
 mcall
302
 
302
 
303
 mov eax,4 ; Draw filenames
303
 mov eax,4 ; Draw filenames
304
 mov ebx,134*65536+36
304
 mov ebx,134*65536+36
305
 mov edx,cmfile
305
 mov edx,cmfile
306
 xor ecx,ecx
306
 xor ecx,ecx
307
 mov esi,12
307
 mov esi,12
308
 cmp byte [editstate],1
308
 cmp byte [editstate],1
309
 jnz no_active_1
309
 jnz no_active_1
310
 mov ecx,activecolor
310
 mov ecx,activecolor
311
 no_active_1:
311
 no_active_1:
312
 mcall
312
 mcall
313
 xor ecx,ecx
313
 xor ecx,ecx
314
 cmp byte [editstate],2
314
 cmp byte [editstate],2
315
 jnz no_active_2
315
 jnz no_active_2
316
 mov ecx,activecolor
316
 mov ecx,activecolor
317
 no_active_2:
317
 no_active_2:
318
 add ebx,18
318
 add ebx,18
319
 add edx,12
319
 add edx,12
320
 mcall
320
 mcall
321
 
321
 
322
 mov eax,13             ; Clean info area
322
 mov eax,13             ; Clean info area
323
 mov ebx,14*65536+210
323
 mov ebx,14*65536+210
324
 mov ecx,107*65536+14
324
 mov ecx,107*65536+14
325
 mov edx,0x00AAAAAA
325
 mov edx,0x00AAAAAA
326
 mcall
326
 mcall
327
 
327
 
328
 cmp byte [msgid],0     ; Draw info string
328
 cmp byte [msgid],0     ; Draw info string
329
 jz notype
329
 jz notype
330
 mov ebx,16*65536+110
330
 mov ebx,16*65536+110
331
 xor ecx,ecx
331
 xor ecx,ecx
332
 mov esi,16
332
 mov esi,16
333
 mov al, byte [msgid]
333
 mov al, byte [msgid]
334
 dec al
334
 dec al
335
 shl al,4
335
 shl al,4
336
 xor ah,ah
336
 xor ah,ah
337
 xor edx,edx
337
 xor edx,edx
338
 mov dx,ax
338
 mov dx,ax
339
 add edx,msgtable
339
 add edx,msgtable
340
 mov eax,4
340
 mov eax,4
341
 mcall
341
 mcall
342
 notype:
342
 notype:
343
 
343
 
344
 popa ; Restore registers
344
 popa ; Restore registers
345
 
345
 
346
 ret
346
 ret
347
 
347
 
348
 ; interface data
348
 ; interface data
349
 
349
 
350
 if lang eq de
350
 if lang eq de
351
 keylab db "    PACKEN           ENTPACKEN"
351
 keylab db "    PACKEN           ENTPACKEN"
352
 dellab db "   LOESCHE I/O      LOESCHE *.MHC"
352
 dellab db "   LOESCHE I/O      LOESCHE *.MHC"
353
 title  db "MHC 0.09"
353
 title  db "MHC 0.09"
354
 arclab db "GEOACJTE DATEI:"
354
 arclab db "GEOACJTE DATEI:"
355
 unplab db "EIN/AUSGABE DATEI:"
355
 unplab db "EIN/AUSGABE DATEI:"
356
 fin_text:
356
 fin_text:
357
 
357
 
358
 cmfile db "FILENAME.MHC"
358
 cmfile db "FILENAME.MHC"
359
 iofile db "FILENAME.XYZ"
359
 iofile db "FILENAME.XYZ"
360
 
360
 
361
 msgtable:
361
 msgtable:
362
 db "PACKE...        "
362
 db "PACKE...        "
363
 db "ENTPACKE...     "
363
 db "ENTPACKE...     "
364
 db "KEIN I/O!       "
364
 db "KEIN I/O!       "
365
 db "KEINE *.MHC!    "
365
 db "KEINE *.MHC!    "
366
 db "FALSCHE METHODe!"
366
 db "FALSCHE METHODe!"
367
 
367
 
368
 else
368
 else
369
 keylab db "    COMPRESS         DECOMPRESS"
369
 keylab db "    COMPRESS         DECOMPRESS"
370
 dellab db "   DELETE I/O       DELETE *.MHC"
370
 dellab db "   DELETE I/O       DELETE *.MHC"
371
 title  db "MHC 0.09"
371
 title  db "MHC 0.09"
372
 arclab db "COMPRESSED FILE:"
372
 arclab db "COMPRESSED FILE:"
373
 unplab db "INPUT/OUTPUT FILE:"
373
 unplab db "INPUT/OUTPUT FILE:"
374
 fin_text:
374
 fin_text:
375
 
375
 
376
 cmfile db "FILENAME.MHC"
376
 cmfile db "FILENAME.MHC"
377
 iofile db "FILENAME.XYZ"
377
 iofile db "FILENAME.XYZ"
378
 
378
 
379
 msgtable:
379
 msgtable:
380
 db "COMPRESSING...  "
380
 db "COMPRESSING...  "
381
 db "DECOMPRESSING..."
381
 db "DECOMPRESSING..."
382
 db "I/O NOT FOUND!  "
382
 db "I/O NOT FOUND!  "
383
 db "*.MHC NOT FOUND!"
383
 db "*.MHC NOT FOUND!"
384
 db "INVALID METHOD! "
384
 db "INVALID METHOD! "
385
 
385
 
386
 end if
386
 end if
387
 
387
 
388
 
388
 
389
 editstate db 0
389
 editstate db 0
390
 editpos db 0
390
 editpos db 0
391
 msgid db 0
391
 msgid db 0
392
 
392
 
393
 
393
 
394
; ======== compression/decompression engine ========
394
; ======== compression/decompression engine ========
395
 
395
 
396
; Adresses declaration
396
; Adresses declaration
397
 
397
 
398
 hashtable equ  MHC_END
398
 hashtable equ  MHC_END
399
 ifile     equ  hashtable+65536*4
399
 ifile     equ  hashtable+65536*4
400
 ofile     equ  ifile+1000000
400
 ofile     equ  ifile+1000000
401
 
401
 
402
 compress:   ; File compression
402
 compress:   ; File compression
403
 
403
 
404
 call fill_filebufs
404
 call fill_filebufs
405
 
405
 
406
 mov eax,6
406
 mov eax,6
407
 mov ebx,iofile
407
 mov ebx,iofile
408
 xor ecx,ecx
408
 xor ecx,ecx
409
 mov edx,ecx
409
 mov edx,ecx
410
 not edx
410
 not edx
411
 mov esi,ifile
411
 mov esi,ifile
412
 mcall
412
 mcall
413
 
413
 
414
 cmp eax,0xFFFFFFFF
414
 cmp eax,0xFFFFFFFF
415
 jnz  compress_filefound              ; i/o file not found
415
 jnz  compress_filefound              ; i/o file not found
416
 mov byte [msgid],3
416
 mov byte [msgid],3
417
 call draw_info
417
 call draw_info
418
 ret
418
 ret
419
 
419
 
420
 compress_filefound:
420
 compress_filefound:
421
 
421
 
422
 mov byte [msgid],1
422
 mov byte [msgid],1
423
 call draw_info
423
 call draw_info
424
 
424
 
425
 jmp lzp_compress                    ; compress with order-2 LZP
425
 jmp lzp_compress                    ; compress with order-2 LZP
426
 compress_dumpdata:
426
 compress_dumpdata:
427
 
427
 
428
 push edx
428
 push edx
429
 
429
 
430
 mov eax,32
430
 mov eax,32
431
 mov ebx,cmfile
431
 mov ebx,cmfile
432
 mcall
432
 mcall
433
 
433
 
434
 mov eax,33
434
 mov eax,33
435
 pop edx
435
 pop edx
436
 mov ebx,cmfile
436
 mov ebx,cmfile
437
 mov ecx,ofile
437
 mov ecx,ofile
438
 xor esi,esi
438
 xor esi,esi
439
 mcall
439
 mcall
440
 
440
 
441
 mov byte [msgid],0
441
 mov byte [msgid],0
442
 call draw_info
442
 call draw_info
443
 
443
 
444
 ret
444
 ret
445
 
445
 
446
 
446
 
447
 decompress: ; File decompression
447
 decompress: ; File decompression
448
 
448
 
449
 call fill_filebufs
449
 call fill_filebufs
450
 
450
 
451
 mov  eax,6
451
 mov  eax,6
452
 mov ebx,cmfile
452
 mov ebx,cmfile
453
 xor ecx,ecx
453
 xor ecx,ecx
454
 mov edx,ecx
454
 mov edx,ecx
455
 not edx
455
 not edx
456
 mov esi,ofile
456
 mov esi,ofile
457
 mcall
457
 mcall
458
 
458
 
459
 cmp eax,0xFFFFFFFF
459
 cmp eax,0xFFFFFFFF
460
 jnz  decompress_filefound              ; *.mhc file not found
460
 jnz  decompress_filefound              ; *.mhc file not found
461
 mov byte [msgid],4
461
 mov byte [msgid],4
462
 call draw_info
462
 call draw_info
463
 ret
463
 ret
464
 
464
 
465
 decompress_filefound:
465
 decompress_filefound:
466
 
466
 
467
 cmp byte [ofile],0                     ; Invalid method!
467
 cmp byte [ofile],0                     ; Invalid method!
468
 jz  right_method
468
 jz  right_method
469
 mov byte [msgid],5
469
 mov byte [msgid],5
470
 call draw_info
470
 call draw_info
471
 ret
471
 ret
472
 
472
 
473
 right_method:
473
 right_method:
474
 mov byte [msgid],2
474
 mov byte [msgid],2
475
 call draw_info
475
 call draw_info
476
 
476
 
477
 jmp lzp_decompress
477
 jmp lzp_decompress
478
 decompress_dumpdata:
478
 decompress_dumpdata:
479
 
479
 
480
 push edx
480
 push edx
481
 
481
 
482
 mov eax,32
482
 mov eax,32
483
 mov ebx,iofile
483
 mov ebx,iofile
484
 mcall
484
 mcall
485
 
485
 
486
 mov eax,33
486
 mov eax,33
487
 pop edx
487
 pop edx
488
 mov ebx,iofile
488
 mov ebx,iofile
489
 mov ecx,ifile
489
 mov ecx,ifile
490
 xor esi,esi
490
 xor esi,esi
491
 mcall
491
 mcall
492
 
492
 
493
 mov byte [msgid],0
493
 mov byte [msgid],0
494
 call draw_info
494
 call draw_info
495
 
495
 
496
 ret
496
 ret
497
 
497
 
498
 fill_filebufs:             ; Fill filebufs with garbage to simplify matching
498
 fill_filebufs:             ; Fill filebufs with garbage to simplify matching
499
 pusha
499
 pusha
500
 cld
500
 cld
501
 mov eax,0xF7D9A03F         ; <- "magic number" :) just garbage...
501
 mov eax,0xF7D9A03F         ; <- "magic number" :) just garbage...
502
 mov ecx,2000000/4
502
 mov ecx,2000000/4
503
 mov edi,ifile
503
 mov edi,ifile
504
 rep stosd
504
 rep stosd
505
 popa
505
 popa
506
 ret
506
 ret
507
 
507
 
508
; ==== algorithms section ====
508
; ==== algorithms section ====
509
 
509
 
510
; Method 0: LZP compression algorithm
510
; Method 0: LZP compression algorithm
511
 
511
 
512
 lzp_compress:           ; EDX - how much bytes to dump
512
 lzp_compress:           ; EDX - how much bytes to dump
513
 
513
 
514
 cld                     ; clear direction flag
514
 cld                     ; clear direction flag
515
 
515
 
516
 mov esi,ifile           ; init pointers
516
 mov esi,ifile           ; init pointers
517
 mov edi,ofile
517
 mov edi,ofile
518
 
518
 
519
 push eax                ; write header: ID0+4bfilesize => total 5 bytes
519
 push eax                ; write header: ID0+4bfilesize => total 5 bytes
520
 xor eax,eax
520
 xor eax,eax
521
 stosb
521
 stosb
522
 pop eax
522
 pop eax
523
 stosd
523
 stosd
524
 
524
 
525
 pusha                   ; fill hash table
525
 pusha                   ; fill hash table
526
 mov eax,ifile
526
 mov eax,ifile
527
 mov edi,hashtable
527
 mov edi,hashtable
528
 mov ecx,65536
528
 mov ecx,65536
529
 rep stosd
529
 rep stosd
530
 popa
530
 popa
531
 
531
 
532
 add eax,esi              ; calculate endpointer
532
 add eax,esi              ; calculate endpointer
533
 mov dword [endpointer],eax
533
 mov dword [endpointer],eax
534
 
534
 
535
 movsw                    ; copy three bytes
535
 movsw                    ; copy three bytes
536
 movsb
536
 movsb
537
 
537
 
538
 mov dword [controlp],edi
538
 mov dword [controlp],edi
539
 inc edi
539
 inc edi
540
 
540
 
541
 mov byte [controld],0
541
 mov byte [controld],0
542
 mov byte [controlb],0
542
 mov byte [controlb],0
543
 
543
 
544
 c_loop:
544
 c_loop:
545
 cmp dword [endpointer],esi  ; check end of file
545
 cmp dword [endpointer],esi  ; check end of file
546
 ja  c_loop_ok
546
 ja  c_loop_ok
547
 jmp finish_c_loop
547
 jmp finish_c_loop
548
 c_loop_ok:
548
 c_loop_ok:
549
 
549
 
550
 call chash
550
 call chash
551
 call compare
551
 call compare
552
 jz   two_match_c
552
 jz   two_match_c
553
 
553
 
554
 lodsb
554
 lodsb
555
 mov byte [literal],al
555
 mov byte [literal],al
556
 call chash
556
 call chash
557
 call compare
557
 call compare
558
 jz   lit_match_c
558
 jz   lit_match_c
559
 
559
 
560
 mov  al,0
560
 mov  al,0
561
 call putbit
561
 call putbit
562
 mov  al,byte [literal]
562
 mov  al,byte [literal]
563
 stosb
563
 stosb
564
 movsb
564
 movsb
565
 jmp  end_c_loop
565
 jmp  end_c_loop
566
 
566
 
567
 lit_match_c:
567
 lit_match_c:
568
 mov al,1
568
 mov al,1
569
 call putbit
569
 call putbit
570
 mov al,0
570
 mov al,0
571
 call putbit
571
 call putbit
572
 mov al,byte [literal]
572
 mov al,byte [literal]
573
 stosb
573
 stosb
574
 jmp encode_match
574
 jmp encode_match
575
 
575
 
576
 two_match_c:
576
 two_match_c:
577
 mov al,1
577
 mov al,1
578
 call putbit
578
 call putbit
579
 call putbit
579
 call putbit
580
 
580
 
581
 encode_match:
581
 encode_match:
582
 call incpos
582
 call incpos
583
 call compare
583
 call compare
584
 jz one_c
584
 jz one_c
585
 mov al,0
585
 mov al,0
586
 call putbit
586
 call putbit
587
 jmp end_c_loop
587
 jmp end_c_loop
588
 one_c:
588
 one_c:
589
 
589
 
590
 call incpos
590
 call incpos
591
 mov  al,1
591
 mov  al,1
592
 call putbit
592
 call putbit
593
 
593
 
594
 call compare
594
 call compare
595
 jnz ec1
595
 jnz ec1
596
 call incpos
596
 call incpos
597
 call compare
597
 call compare
598
 jnz ec2
598
 jnz ec2
599
 call incpos
599
 call incpos
600
 call compare
600
 call compare
601
 jnz ec3
601
 jnz ec3
602
 call incpos
602
 call incpos
603
 mov al,1
603
 mov al,1
604
 call putbit
604
 call putbit
605
 call putbit
605
 call putbit
606
 call compare
606
 call compare
607
 jnz ec4
607
 jnz ec4
608
 call incpos
608
 call incpos
609
 call compare
609
 call compare
610
 jnz ec5
610
 jnz ec5
611
 call incpos
611
 call incpos
612
 call compare
612
 call compare
613
 jnz ec6
613
 jnz ec6
614
 call incpos
614
 call incpos
615
 call compare
615
 call compare
616
 jnz ec7
616
 jnz ec7
617
 call incpos
617
 call incpos
618
 call compare
618
 call compare
619
 jnz ec8
619
 jnz ec8
620
 call incpos
620
 call incpos
621
 call compare
621
 call compare
622
 jnz ec9
622
 jnz ec9
623
 call incpos
623
 call incpos
624
 call compare
624
 call compare
625
 jnz ec10
625
 jnz ec10
626
 call incpos
626
 call incpos
627
 
627
 
628
 mov al,1
628
 mov al,1
629
 call putbit
629
 call putbit
630
 call putbit
630
 call putbit
631
 call putbit
631
 call putbit
632
 xor  ecx,ecx
632
 xor  ecx,ecx
633
 
633
 
634
 match_loop_c:
634
 match_loop_c:
635
 cmp  esi,dword [endpointer]
635
 cmp  esi,dword [endpointer]
636
 jae   out_match_loop_c
636
 jae   out_match_loop_c
637
 call compare
637
 call compare
638
 jnz  out_match_loop_c
638
 jnz  out_match_loop_c
639
 inc  ecx
639
 inc  ecx
640
 call incpos
640
 call incpos
641
 jmp  match_loop_c
641
 jmp  match_loop_c
642
 out_match_loop_c:
642
 out_match_loop_c:
643
 
643
 
644
 mov al,0xFF
644
 mov al,0xFF
645
 out_lg:
645
 out_lg:
646
 cmp ecx,255
646
 cmp ecx,255
647
 jb  out_lg_out
647
 jb  out_lg_out
648
 stosb
648
 stosb
649
 sub ecx,255
649
 sub ecx,255
650
 jmp out_lg
650
 jmp out_lg
651
 out_lg_out:
651
 out_lg_out:
652
 mov al,cl
652
 mov al,cl
653
 stosb
653
 stosb
654
 jmp end_c_loop
654
 jmp end_c_loop
655
 
655
 
656
 ec10:
656
 ec10:
657
 mov al,1
657
 mov al,1
658
 call putbit
658
 call putbit
659
 call putbit
659
 call putbit
660
 mov al,0
660
 mov al,0
661
 call putbit
661
 call putbit
662
 jmp end_c_loop
662
 jmp end_c_loop
663
 
663
 
664
 ec9:
664
 ec9:
665
 mov al,1
665
 mov al,1
666
 call putbit
666
 call putbit
667
 mov al,0
667
 mov al,0
668
 call putbit
668
 call putbit
669
 mov al,1
669
 mov al,1
670
 call putbit
670
 call putbit
671
 jmp end_c_loop
671
 jmp end_c_loop
672
 
672
 
673
 ec8:
673
 ec8:
674
 mov al,1
674
 mov al,1
675
 call putbit
675
 call putbit
676
 mov al,0
676
 mov al,0
677
 call putbit
677
 call putbit
678
 call putbit
678
 call putbit
679
 jmp end_c_loop
679
 jmp end_c_loop
680
 
680
 
681
 ec7:
681
 ec7:
682
 mov al,0
682
 mov al,0
683
 call putbit
683
 call putbit
684
 mov al,1
684
 mov al,1
685
 call putbit
685
 call putbit
686
 call putbit
686
 call putbit
687
 jmp end_c_loop
687
 jmp end_c_loop
688
 
688
 
689
 ec6:
689
 ec6:
690
 mov al,0
690
 mov al,0
691
 call putbit
691
 call putbit
692
 mov al,1
692
 mov al,1
693
 call putbit
693
 call putbit
694
 mov al,0
694
 mov al,0
695
 call putbit
695
 call putbit
696
 jmp end_c_loop
696
 jmp end_c_loop
697
 
697
 
698
 ec5:
698
 ec5:
699
 mov al,0
699
 mov al,0
700
 call putbit
700
 call putbit
701
 call putbit
701
 call putbit
702
 mov al,1
702
 mov al,1
703
 call putbit
703
 call putbit
704
 jmp end_c_loop
704
 jmp end_c_loop
705
 
705
 
706
 ec4:
706
 ec4:
707
 mov al,0
707
 mov al,0
708
 call putbit
708
 call putbit
709
 call putbit
709
 call putbit
710
 call putbit
710
 call putbit
711
 jmp end_c_loop
711
 jmp end_c_loop
712
 
712
 
713
 ec3:
713
 ec3:
714
 mov al,1
714
 mov al,1
715
 call putbit
715
 call putbit
716
 mov al,0
716
 mov al,0
717
 call putbit
717
 call putbit
718
 jmp end_c_loop
718
 jmp end_c_loop
719
 
719
 
720
 ec2:
720
 ec2:
721
 mov al,0
721
 mov al,0
722
 call putbit
722
 call putbit
723
 mov al,1
723
 mov al,1
724
 call putbit
724
 call putbit
725
 jmp end_c_loop
725
 jmp end_c_loop
726
 
726
 
727
 ec1:
727
 ec1:
728
 mov al,0
728
 mov al,0
729
 call putbit
729
 call putbit
730
 call putbit
730
 call putbit
731
 
731
 
732
 end_c_loop:
732
 end_c_loop:
733
 jmp c_loop
733
 jmp c_loop
734
 
734
 
735
 finish_c_loop:
735
 finish_c_loop:
736
 
736
 
737
 mov eax,dword [controlp] ; store last tagbyte
737
 mov eax,dword [controlp] ; store last tagbyte
738
 mov bl,byte [controld]
738
 mov bl,byte [controld]
739
 mov [eax], byte bl
739
 mov [eax], byte bl
740
 
740
 
741
 sub edi,ofile ; calculate dump size
741
 sub edi,ofile ; calculate dump size
742
 mov edx,edi
742
 mov edx,edi
743
 
743
 
744
 jmp compress_dumpdata
744
 jmp compress_dumpdata
745
 
745
 
746
; LZP decompression algorithm
746
; LZP decompression algorithm
747
 
747
 
748
 lzp_decompress:                        ; EDX - how much bytes to dump
748
 lzp_decompress:                        ; EDX - how much bytes to dump
749
 
749
 
750
 cld
750
 cld
751
 
751
 
752
 mov edi,ifile
752
 mov edi,ifile
753
 mov esi,ofile+1
753
 mov esi,ofile+1
754
 
754
 
755
 pusha                   ; fill hash table
755
 pusha                   ; fill hash table
756
 mov eax,ifile
756
 mov eax,ifile
757
 mov edi,hashtable
757
 mov edi,hashtable
758
 mov ecx,65536
758
 mov ecx,65536
759
 rep stosd
759
 rep stosd
760
 popa
760
 popa
761
 
761
 
762
 lodsd
762
 lodsd
763
 
763
 
764
 mov ebx,edi
764
 mov ebx,edi
765
 add ebx,eax
765
 add ebx,eax
766
 mov dword [endpointer],ebx
766
 mov dword [endpointer],ebx
767
 
767
 
768
 movsw
768
 movsw
769
 movsb
769
 movsb
770
 
770
 
771
 lodsb
771
 lodsb
772
 mov byte [controld],al
772
 mov byte [controld],al
773
 mov byte [controlb],0
773
 mov byte [controlb],0
774
 
774
 
775
 d_loop:
775
 d_loop:
776
 cmp dword [endpointer],edi
776
 cmp dword [endpointer],edi
777
 ja d_loop_ok
777
 ja d_loop_ok
778
 jmp finish_d_loop
778
 jmp finish_d_loop
779
 d_loop_ok:
779
 d_loop_ok:
780
 
780
 
781
 call getbit
781
 call getbit
782
 cmp  al,0
782
 cmp  al,0
783
 jnz  match_d
783
 jnz  match_d
784
 call dhash
784
 call dhash
785
 movsb
785
 movsb
786
 call dhash
786
 call dhash
787
 movsb
787
 movsb
788
 jmp end_d_loop
788
 jmp end_d_loop
789
 
789
 
790
 match_d:
790
 match_d:
791
 
791
 
792
 call getbit
792
 call getbit
793
 cmp  al,0
793
 cmp  al,0
794
 jnz  no_literal_before_match
794
 jnz  no_literal_before_match
795
 call dhash
795
 call dhash
796
 movsb
796
 movsb
797
 no_literal_before_match:
797
 no_literal_before_match:
798
 
798
 
799
 call dhash
799
 call dhash
800
 mov ecx,1
800
 mov ecx,1
801
 call copymatch
801
 call copymatch
802
 
802
 
803
 call getbit
803
 call getbit
804
 cmp  al,0
804
 cmp  al,0
805
 jz   end_d_loop
805
 jz   end_d_loop
806
 mov  ecx,1
806
 mov  ecx,1
807
 call copymatch
807
 call copymatch
808
 call getbit
808
 call getbit
809
 cmp  al,0
809
 cmp  al,0
810
 jz   dc2
810
 jz   dc2
811
 mov  ecx,2
811
 mov  ecx,2
812
 call copymatch
812
 call copymatch
813
 call getbit
813
 call getbit
814
 cmp  al,0
814
 cmp  al,0
815
 jz   end_d_loop
815
 jz   end_d_loop
816
 mov  ecx,1
816
 mov  ecx,1
817
 call copymatch
817
 call copymatch
818
 call getbit
818
 call getbit
819
 cmp  al,0
819
 cmp  al,0
820
 jz   dc4
820
 jz   dc4
821
 mov  ecx,4
821
 mov  ecx,4
822
 call copymatch
822
 call copymatch
823
 call getbit
823
 call getbit
824
 cmp  al,0
824
 cmp  al,0
825
 jz   dc5
825
 jz   dc5
826
 call getbit
826
 call getbit
827
 cmp  al,0
827
 cmp  al,0
828
 jz   dc6
828
 jz   dc6
829
 mov  ecx,3
829
 mov  ecx,3
830
 call copymatch
830
 call copymatch
831
 
831
 
832
 do:
832
 do:
833
 lodsb
833
 lodsb
834
 xor  ecx,ecx
834
 xor  ecx,ecx
835
 mov  cl,al
835
 mov  cl,al
836
 call copymatch
836
 call copymatch
837
 cmp  al,0xFF
837
 cmp  al,0xFF
838
 jnz  end_do
838
 jnz  end_do
839
 jmp do
839
 jmp do
840
 end_do:
840
 end_do:
841
 jmp end_d_loop
841
 jmp end_d_loop
842
 
842
 
843
 dc6:
843
 dc6:
844
 mov ecx,2
844
 mov ecx,2
845
 call copymatch
845
 call copymatch
846
 jmp  end_d_loop
846
 jmp  end_d_loop
847
 
847
 
848
 dc5:
848
 dc5:
849
 call getbit
849
 call getbit
850
 cmp  al,0
850
 cmp  al,0
851
 jz   ndc5
851
 jz   ndc5
852
 mov  ecx,1
852
 mov  ecx,1
853
 call copymatch
853
 call copymatch
854
 ndc5:
854
 ndc5:
855
 jmp  end_d_loop
855
 jmp  end_d_loop
856
 
856
 
857
 dc4:
857
 dc4:
858
 call getbit
858
 call getbit
859
 cmp  al,0
859
 cmp  al,0
860
 jz   ndc4
860
 jz   ndc4
861
 call getbit
861
 call getbit
862
 mov  ecx,3
862
 mov  ecx,3
863
 cmp  al,1
863
 cmp  al,1
864
 jz   ndcc4
864
 jz   ndcc4
865
 dec  ecx
865
 dec  ecx
866
 ndcc4:
866
 ndcc4:
867
 call copymatch
867
 call copymatch
868
 jmp  end_d_loop
868
 jmp  end_d_loop
869
 ndc4:
869
 ndc4:
870
 call getbit
870
 call getbit
871
 cmp  al,0
871
 cmp  al,0
872
 jz   ndccc4
872
 jz   ndccc4
873
 mov  ecx,1
873
 mov  ecx,1
874
 call copymatch
874
 call copymatch
875
 ndccc4:
875
 ndccc4:
876
 jmp  end_d_loop
876
 jmp  end_d_loop
877
 
877
 
878
 dc2:
878
 dc2:
879
 call getbit
879
 call getbit
880
 cmp al,0
880
 cmp al,0
881
 jz  ndc2
881
 jz  ndc2
882
 mov ecx,1
882
 mov ecx,1
883
 call copymatch
883
 call copymatch
884
 ndc2:
884
 ndc2:
885
 
885
 
886
 end_d_loop:
886
 end_d_loop:
887
 jmp d_loop
887
 jmp d_loop
888
 finish_d_loop:
888
 finish_d_loop:
889
 
889
 
890
 mov edx, dword [ofile+1]
890
 mov edx, dword [ofile+1]
891
 
891
 
892
 jmp decompress_dumpdata
892
 jmp decompress_dumpdata
893
 
893
 
894
; LZP subroutines
894
; LZP subroutines
895
 
895
 
896
 putbit:                  ; bit -> byte tag, AL holds bit for output
896
 putbit:                  ; bit -> byte tag, AL holds bit for output
897
 pusha
897
 pusha
898
 mov cl,byte [controlb]
898
 mov cl,byte [controlb]
899
 shl al,cl
899
 shl al,cl
900
 mov bl,byte [controld]
900
 mov bl,byte [controld]
901
 or  bl,al
901
 or  bl,al
902
 mov byte [controld],bl
902
 mov byte [controld],bl
903
 inc cl
903
 inc cl
904
 cmp cl,8
904
 cmp cl,8
905
 jnz just_increment
905
 jnz just_increment
906
 mov byte [controlb],0
906
 mov byte [controlb],0
907
 mov byte [controld],0
907
 mov byte [controld],0
908
 push edi
908
 push edi
909
 mov  edi, dword [controlp]
909
 mov  edi, dword [controlp]
910
 mov  al,bl
910
 mov  al,bl
911
 stosb
911
 stosb
912
 pop  edi
912
 pop  edi
913
 mov dword [controlp],edi
913
 mov dword [controlp],edi
914
 popa
914
 popa
915
 inc edi
915
 inc edi
916
 ret
916
 ret
917
 just_increment:
917
 just_increment:
918
 mov byte [controlb],cl
918
 mov byte [controlb],cl
919
 popa
919
 popa
920
 ret
920
 ret
921
 
921
 
922
 getbit:                       ; tag byte -> bit, AL holds input
922
 getbit:                       ; tag byte -> bit, AL holds input
923
 push ecx
923
 push ecx
924
 mov al,byte [controld]
924
 mov al,byte [controld]
925
 mov cl,byte [controlb]
925
 mov cl,byte [controlb]
926
 shr al,cl
926
 shr al,cl
927
 and al,1
927
 and al,1
928
 inc cl
928
 inc cl
929
 cmp cl,8
929
 cmp cl,8
930
 jnz just_increment_d
930
 jnz just_increment_d
931
 mov byte [controlb],0
931
 mov byte [controlb],0
932
 push eax
932
 push eax
933
 lodsb
933
 lodsb
934
 mov byte [controld],al
934
 mov byte [controld],al
935
 pop  eax
935
 pop  eax
936
 pop  ecx
936
 pop  ecx
937
 ret
937
 ret
938
 just_increment_d:
938
 just_increment_d:
939
 mov byte [controlb],cl
939
 mov byte [controlb],cl
940
 pop ecx
940
 pop ecx
941
 ret
941
 ret
942
 
942
 
943
 chash:                        ; calculate hash -> mp -> fill position
943
 chash:                        ; calculate hash -> mp -> fill position
944
 pusha
944
 pusha
945
 xor  eax,eax
945
 xor  eax,eax
946
 mov  al, byte [esi-1]
946
 mov  al, byte [esi-1]
947
 mov  ah, byte [esi-2]
947
 mov  ah, byte [esi-2]
948
 shl  eax,2
948
 shl  eax,2
949
 add  eax,hashtable
949
 add  eax,hashtable
950
 mov  edx,dword [eax]
950
 mov  edx,dword [eax]
951
 mov  dword [mp],edx
951
 mov  dword [mp],edx
952
 mov  dword [eax],esi
952
 mov  dword [eax],esi
953
 popa
953
 popa
954
 ret
954
 ret
955
 
955
 
956
 dhash:                        ; calculate hash -> mp -> fill position
956
 dhash:                        ; calculate hash -> mp -> fill position
957
 pusha
957
 pusha
958
 xor  eax,eax
958
 xor  eax,eax
959
 mov  al, byte [edi-1]
959
 mov  al, byte [edi-1]
960
 mov  ah, byte [edi-2]
960
 mov  ah, byte [edi-2]
961
 shl  eax,2
961
 shl  eax,2
962
 add  eax,hashtable
962
 add  eax,hashtable
963
 mov  edx,dword [eax]
963
 mov  edx,dword [eax]
964
 mov  dword [mp],edx
964
 mov  dword [mp],edx
965
 mov  dword [eax],edi
965
 mov  dword [eax],edi
966
 popa
966
 popa
967
 ret
967
 ret
968
 
968
 
969
 copymatch:                    ; ECX bytes from [mp] to [rp]
969
 copymatch:                    ; ECX bytes from [mp] to [rp]
970
 push esi
970
 push esi
971
 mov  esi,dword [mp]
971
 mov  esi,dword [mp]
972
 rep  movsb
972
 rep  movsb
973
 mov  dword [mp],esi
973
 mov  dword [mp],esi
974
 pop  esi
974
 pop  esi
975
 ret
975
 ret
976
 
976
 
977
 compare:                      ; compare [mp] with [cpos]
977
 compare:                      ; compare [mp] with [cpos]
978
 push edi
978
 push edi
979
 push esi
979
 push esi
980
 mov  edi,dword [mp]
980
 mov  edi,dword [mp]
981
 cmpsb
981
 cmpsb
982
 pop  esi
982
 pop  esi
983
 pop  edi
983
 pop  edi
984
 ret
984
 ret
985
 
985
 
986
 incpos:
986
 incpos:
987
 inc  dword [mp]
987
 inc  dword [mp]
988
 inc  esi
988
 inc  esi
989
 ret
989
 ret
990
 
990
 
991
 
991
 
992
; LZP algorithm data
992
; LZP algorithm data
993
 
993
 
994
 endpointer     dd      0
994
 endpointer     dd      0
995
 controlp       dd      0
995
 controlp       dd      0
996
 controlb       db      0
996
 controlb       db      0
997
 controld       db      0
997
 controld       db      0
998
 mp  dd 0
998
 mp  dd 0
999
 literal        db      0
999
 literal        db      0
1000
 
1000
 
1001
MHC_END: ; the end... - Nikita Lesnikov (nlo_one)
1001
MHC_END: ; the end... - Nikita Lesnikov (nlo_one)