From cc9174ba4176775e80cb366cd5025ea537d3b17c Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Wed, 1 Apr 1998 11:35:16 +0200 Subject: [PATCH] MS-DOS COM-format program compressor. --- compack.asm | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 compack.asm diff --git a/compack.asm b/compack.asm new file mode 100644 index 0000000..b2d4163 --- /dev/null +++ b/compack.asm @@ -0,0 +1,274 @@ +; COMpack +; b. Fox + + IDEAL + P386 + MODEL TINY + CODESEG + ORG 100h + include 'fox.mak' +start: +; db 1024 dup(0) ;4 self-packing + +inplen = 24000 +outlen = 27000 + + print hello + mov di, 81h + movzx cx, [di-1] + jcxz usg + mov al, ' ' + repe scasb + je usg + push cx di + dec di + inc cx + mov al, '?' + repne scasb + pop di cx + jne nousg + +usg: print usgtxt + int 20h + +getfil: lea si, [di-1] + mov al, ' ' + repne scasb + jne noout1 + dec di +noout1: mov cx, di + sub cx, si + mov di, offset fname + rep movsb + mov bx, di +srchex: dec bx + cmp [byte bx], '\' + je addext + cmp [byte bx], '.' + je extexs + cmp bx, offset fname + ja srchex +addext: mov ax, 'c.' + stosw + mov ax, 'mo' + stosw +extexs: mov [word di], 0a0dh + mov [byte di+2], '$' + print namtxt + print fname + mov [byte di], 0 +rts: ret + + smartdisk + +nousg: print srctxt + call getfil + push si + + fopen + mov cx, inplen + fread inpbuf + mov dx, offset lontxt + cmp ax, inplen + je panic + push ax + add [filend], ax + fclose + pop cx + + mov dx, offset emptxt + jcxz panic + mov di, offset inpbuf + xor al, al + repe scasb + jne spox +panic: print + int 20h + +spox: dec di + push di + mov [filbgn], di + sub di, offset inpbuf + add [destad], di + add [reljad], di + lda cx + inc ax + call prilen + + pop bx + mov si, offset firflg + mov di, offset outbuf + +pack1: push si di + mov ax, 1 + mov bp, [filend] + lea si, [bx-0ffh] + cmp si, [filbgn] + jnb pack2 + mov si, [filbgn] + cmp si, bx + je packn + +pack2: mov di, bx + mov cx, bp + sub cx, bx + push si + repe cmpsb + pop si + je pack3 + dec di +pack3: mov cx, di + sub cx, bx + cmp cx, ax + jbe pack4 + lda cx + mov dx, si +pack4: inc si + cmp si, bx + jb pack2 + +packn: pop di si + mov bp, ax + sta cx + mov ax, 1 + +putfl1: cmp cx, 2 + rcl [byte si], 1 + jnc putfl2 + mov si, di + stosb +putfl2: loop putfl1 + + cmp bp, ax + mov al, [bx] + je putbyt + mov al, dl + sub al, bl +putbyt: stosb + mov ah, 1 + cmp [si], ah + jne swpflg + mov [si], ax + inc si +swpflg: add bx, bp + cmp bx, [filend] + jb pack1 + + shl [byte si], 1 + jnc corfl1 + mov al, 80h + stosb + jmp corfl3 +corfl1: stc +corfl2: rcl [byte si], 1 + jnc corfl2 +corfl3: rcl [firflg], 1 ;+ + xor al, al + stosb + + sub di, offset depack + mov [filend], di + + print pkdtxt + pop di + mov cx, 81h + add cl, [80h] + sub cx, di + jz nowri + mov al, ' ' + repe scasb + je nowri + mov ax, [filend] + inc ah + cmp ax, [destad] + ja nospac + + call getfil + fcreate + mov cx, [filend] + fwrite depack + fclose + +nowri: mov ax, [filend] + +prilen: mov di, offset lenlst + mov bx, 10 +outnm1: xor dx, dx + div bx + add dl, '0' +outnm2: mov [di], dl + dec di + test ax, ax + jnz outnm1 + mov dl, ' ' + cmp di, offset lennum + jnb outnm2 + print lentxt + ret + +nospac: mov dx, offset zertxt + dos 9 + jmp nowri + +hello db 'COMpack 1.0 by Fox/Taquart',eot +usgtxt db 'This is FREEWARE packer for .COM programs.',eol + db 'Syntax:',eol + db 'COMPACK inpfile [outfile]',eol + db '"inpfile" specifies source path\filename',eol + db '"outfile" specifies target path\filename',eol + db 'The ".COM" extension of filename is default and you don''t have to write it',eol + db 'If you don''t give "outfile" parameter, no file will be saved',eol + db 'and you can only watch the results of packing',eol +zertxt db 'If you want the file saved, you must compile some zero bytes at the beginning',eol + db 'of file to reserve the space for packed data. The code should immediately',eol + db 'follow the zeros.',eot + +srctxt db 'Source file:',eot +pkdtxt db 'Packed file:',eot +namtxt db ' Name: $' +lentxt db 'Length: ' +lennum db ' ' +lenlst db ' bytes',eot +emptxt db 'File is empty!',eot +lontxt db 'File is too long!',eot + smarterr + +filbgn dw inpbuf +filend dw inpbuf + +depack: mov si, offset packed-depack+100h + mov di, 100h +destad = word $-2 + mov al, 1 +firflg = byte $-1 + xor cx, cx +dep1: movsb + dec cx +dep2: inc cx +dep3: add al, al + jnz dep4 + lodsb + adc al, al ;+ +dep4: jnc dep2 + jcxz dep1 + sbb bx, bx ;+ + and bl, [si] + db 0fh,84h ;jz near +reljad dw depack-reljmp +reljmp: inc si + inc cx + push si + lea si, [di+bx] + rep movsb + pop si + jmp dep3 +packed: + +outbuf db outlen dup(?) + +fname: + +inpbuf db inplen dup(?) + + ENDS + END start \ No newline at end of file