mirror of
https://github.com/pfusik/xasm.git
synced 2024-12-22 00:29:15 +00:00
MS-DOS COM-format program compressor.
This commit is contained in:
commit
cc9174ba41
274
compack.asm
Normal file
274
compack.asm
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user