.386
.model	tiny,c
.stack	0

dmake	segment	use16
assume	cs:dmake,ds:dmake,es:dmake
org	100h

pszmax		equ	128
pmeret		equ	4096
bmeret		equ	65520
tmeret		equ	65520
maxhossz	equ	33
ziptab		equ	gs:[0]
szaml		equ	dword ptr gs:[2924]

prog:		jmp	near ptr progr

jelzo		db	0
mennyit		dd	0
sokat		dd	0
iseg		dw	0
ioffs		dw	0
oseg		dw	0
ooffs		dw	0
pszam		dw	0
hossz		dw	0
file		dw	0
sorszam		dw	1
boffs		dw	0
bseg		dw	0
toffs		dw	0
tseg		dw	0
szofaj		db	"ifmsrkne"
szofaj2		db	"0123aoe”"
szofaj3		db	0,1,2,3,0,32,64,96
elsbet		db	0
masbet		db	0
kezbet		dw	0
szbyt		db	3
attr		db	0
ksbyt		db	64
szo		db	maxhossz dup(0)
asctab		db	" a o¢u£i¡e‚”“–bcdfghjklmnpqrstvwxyz"
		db	"AO•U—IE™‹š˜BCDFGHJKLMNPQRSTVWXYZ"
		db	"0123456789-/\'>$%*`(<[+=&@#]",34
		db	" .,;:?!){}Ä~",0,13,10,9
htx1		db	"Nincs el‚g szabad t r.",13,10,36
htx2		db	"Hi nyz¢ forr s.",13,10,36
htx3		db	"Hib s vagy nem l‚tez“ <$"
htx4		db	"> file.",13,10,36
htx5		db	"Hiba a <$"
htx6		db	"> sz¢ban.",13,10,36
htx7		db	"Rendben.",13,10,36
pseg		dw	pszmax dup(0)

progr:		push	512
		mov	bx,4096/16+1
		popf
		mov	ah,4ah
		int	21h
		xor	si,si
		mov	bx,(2922+2+1024+2)/16+1
		mov	ah,48h
		int	21h
		jc	hiell
		mov	gs,ax
		xor	di,di
		mov	es,ax
		mov	cx,165
		xor	eax,eax
		rep	stosw
		dec	eax
		mov	cx,648
		rep	stosd
		inc	eax
		mov	cx,257
		rep	stosd
		mov	word ptr szaml[4*128],1000
		mov	bx,bmeret/16+1
		mov	ah,48h
		int	21h
		jc	hiell
		mov	bseg,ax
		xor	di,di
		mov	es,ax
		mov	cx,bmeret/4+1
		xor	eax,eax
		rep	stosd
		mov	bx,tmeret/16+1
		mov	ah,48h
		int	21h
		jc	hiell
		mov	tseg,ax
		xor	di,di
		mov	es,ax
		mov	cx,tmeret/4+1
		xor	eax,eax
		rep	stosd
		mov	cx,pszmax
fogl:		mov	bx,pmeret/16+1
		mov	ah,48h
		int	21h
		jc	hiell
		mov	pseg[si],ax
		push	cx
		mov	es,ax
		inc	si
		xor	di,di
		xor	eax,eax
		mov	cx,pmeret/4+1
		inc	si
		rep	stosd
		pop	cx
		loop	fogl
hiell:		or	si,si
		mov	dx,offset htx1
		jz	hiba
		mov	pszam,si
		mov	si,80h
		mov	dx,offset htx2
		mov	cl,[si]
		jcxz	hiba
		inc	si
		push	ds
		dec	cx
		inc	si
		pop	es
		mov	di,offset progr
		mov	dx,si
		rep	movsb
		mov	dword ptr [si],"cid."
		mov	[si+4],cl
		movsb
		mov	ax,3d00h
		mov	dword ptr [di],"cdt"
		int	21h
		jnc	hibok
fhiba:		mov	si,82h
		jmp	hhiba
chiba:		mov	si,offset progr
hhiba:		mov	dx,offset htx3
		mov	ah,9
		int	21h
		mov	cx,64
		mov	ah,2
hikir:		mov	dl,[si]
		or	dl,dl
		jz	hixir
		int	21h
		inc	si
		loop	hikir
hixir:		mov	dx,offset htx4
hiba:		mov	ah,9
		int	21h
		int	20h
hibok:		mov	file,ax

szoker:		call	olvalt
		jc	kiiras
		cmp	al,91
		jne	szoker
		xor	si,si
		mov	word ptr szbyt,3
		mov	word ptr ksbyt,64
szbeolv:	push	si
		call	olvalt
		pop	si
		jc	szmegv
		cmp	al,85
		je	szmegv
		or	si,si
		jnz	tata
		or	al,al
		jz	szbeolv
tata:		cmp	si,maxhossz
		jae	szbeolv
		cmp	al,112
		jae	szbeolv
		mov	szo[si],al
		inc	si
		jmp	szbeolv
szmegv:		inc	si
tete:		dec	si
		jz	szoker
		cmp	szo[si-1],0
		je	tete
		mov	al,szo
		cmp	al,71
		jae	titi
		sub	al,35
		jbe	titi
		or	ksbyt,32
		mov	szo,al
titi:		mov	hossz,si
		call	olvnuj
		jc	szavat
		mov	bx,offset asctab
		mov	cx,8
		mov	di,offset szofaj
		xlat
		repne	scasb
		jne	szahib
		mov	ax,di
		sub	ax,offset szofaj+1
		shl	al,2
		or	szbyt,al
szfcik:		call	olnuj
		jc	szavat
		or	al,al
		jz	olvattr
		cmp	al,112
		jae	olvattr
		cmp	al,81
		je	minusz
		cmp	al,93
		jne	byker
		or	ksbyt,64
		jmp	szfcik
minusz:		and	ksbyt,not 64
		jmp	szfcik
byker:		mov	bx,offset asctab
		mov	di,7
		xlat
szbykr:		cmp	al,szofaj2[di]
		je	szbymv
		dec	di
		jns	szbykr
szahib:		mov	dx,offset htx5
		mov	ah,9
		int	21h
		mov	si,offset szo
		mov	cx,hossz
		mov	ah,2
szakir:		movzx	di,byte ptr [si]
		mov	dl,asctab[di]
		int	21h
		inc	si
		loop	szakir
		mov	dx,offset htx6
		mov	ah,9
		int	21h
		jmp	szavat
szbymv:		mov	al,szofaj3[di]
		cmp	di,4
		jae	szoror
		cmp	al,4
		jae	szoror
		cmp	al,byte	ptr hossz
		jbe	szomor
		mov	al,byte	ptr hossz
szomor:		and	szbyt,not 3
szoror:		or	szbyt,al
		jmp	szfcik
olvattr:	call	olvszam
		jc	szavat
		test	szbyt,16
		jnz	nemrag
		test	szbyt,12
		jz	ige
		cmp	al,8
		jae	szahib
		mov	attr,al
		call	olszam
		jc	szavat
		cmp	al,4
		jae	szahib
		shl	al,3
		or	attr,al
		mov	al,32
		jmp	olcik
nemrag:		mov	attr,al
		jmp	szavat
ige:		cmp	al,4
		jae	szahib
		mov	attr,al
		mov	al,4
olcik:		push	ax
		call	olszam01
		pop	ax
		jc	szavat
		jz	oltov
		or	attr,al
oltov:		add	al,al
		jnc	olcik
szavat:		mov	al,szbyt
		and	al,3
		cmp	al,byte ptr hossz
		jbe	szavaz
		mov	al,byte ptr hossz
		and	szbyt,not 3
		or	szbyt,al
szavaz:		push	ds
		mov	si,offset szo
		test	al,2
		pop	es
		mov	di,si
		jz	nemell2
		lodsw
		or	al,al
		jz	nemell
		cmp	al,36
		jae	nemell
		or	ah,ah
		jz	nemell
		cmp	ah,36
		jb	novel
nemell:		dec	si
		dec	si
nemell2:	xor	ax,ax
novel:		test	ksbyt,64
		push	ax
		jz	osszetett
eltar:		mov	ax,hossz
		add	ax,di
		sub	ax,si
		cmp	al,32
		jb	nonon
		mov	al,31
nonon:		or	ksbyt,al
		cbw
		mov	cx,ax
		rep	movsb
		mov	cx,ax
		mov	ax,sorszam
		add	ax,ax
		shr	al,1
		stosw
		inc	sorszam
		pop	ax
		call	nirseg
		mov 	al,ah
		call	nirseg
		mov	si,offset szbyt
		lodsb
		call	nirseg
		lodsb
		call	nirseg
		lodsb
		call	nirseg
		jcxz	csukl
elcikl:		lodsb
		call	irseg
		loop	elcikl
csukl:		lodsb
		call	nirseg
		lodsb
		call	nirseg
		mov	eax,mennyit
		mov	sokat,eax
		jmp	szoker
osszetett:	jmp	eltar

kiiras:		mov	bx,file
		mov	ah,3eh
		int	21h
		push	gs
		xor	di,di
		mov	cx,120
		pop	es
kisker:		xor	ebx,ebx
		lea	esi,ds:[255]
nagyker:	cmp	ebx,szaml[4*esi]
		jg	nagytov
		mov	ebx,szaml[4*esi]
		mov	eax,esi
nagytov:	dec	esi
		jns	nagyker
		mov	szaml[4*eax],esi
		stosb
		loop	kisker
		mov	dx,offset progr
		mov	ah,3ch
		int	21h
		jc	chiba
		push	ds
		mov	file,ax
		xor	dx,dx
		push	es
		mov	cx,2922
		mov	bx,ax
		pop	ds
		mov	ah,40h
		int	21h
		pop	ds
		jc	chiba
tovabb:		mov	dx,word ptr elsbet
		mov	eax,sokat
		mov	dword ptr oseg,0
		mov	mennyit,eax
kkvetk:		push	ds
		pop	es
kovetk:		mov	eax,dword ptr oseg
		mov	di,offset kezbet
		mov	cx,5
		mov	dword ptr iseg,eax
szfejl:		call	olvseg
		jc	ennyi
		stosb
		loop	szfejl
		and	al,31
		mov	cl,al
		inc	cx
		inc	cx
szkiolv:	call	olvseg
		jc	ennyi
		stosb
		loop	szkiolv
		mov	ax,kezbet
		or	ax,ax
		js	kovetk
		or	jelzo,1
		cmp	al,dl
		jne	kovetk
		or	jelzo,2
		cmp	ah,dh
		jne	kovetk
		les	di,dword ptr boffs
		or	jelzo,4
		cmp	di,bmeret-64
		mov	al,ksbyt
		mov	si,offset szbyt
		jae	evveg
		mov	cl,al
		movsw
		and	cx,31
		test	al,64
		movsb
		jz	kyss
		cmp	cl,5
		push	dx
		jb	kiccs
		call	zip
		cmp	cx,dx
		xchg	si,di
		mov	al,ksbyt
		jae	kiss
		and	al,96
		or	al,cl
		dec	di
		mov	ksbyt,al
		stosb
		add	si,dx
		add	di,cx
		pop	dx
		jmp	kuss
kiss:		mov	cx,dx
kiccs:		and	al,not 64
		dec	di
		mov	ksbyt,al
		stosb
		pop	dx
kyss:		rep	movsb
kuss:		movsw
		mov	boffs,di
evveg:		mov	al,-1
		call	nirseg
		call	nirseg
		jmp	kkvetk
ennyi:		test	jelzo,1
		jz	lezar
		test	jelzo,2
		jz	stovabb
		test	jelzo,4
		jz	blottov
		and	jelzo,not 4
		les	di,dword ptr boffs
		mov	al,128
		stosb
		mov	boffs,di
		xchg	di,toffs
		mov	ah,36
		mov	al,dl
		mul	ah
		add	al,dh
		adc	ah,0
		and	eax,2047
		mov	gs:[330][2*eax],di
blottov:	inc	masbet
		cmp	masbet,36
		jb	tovabb
		mov	cx,boffs
		and	jelzo,not 2
		jcxz	stovabb
		and	edx,63
		xor	si,si
		push	dx
		mov	gs:[186][2*edx],cx
		push	ds
		mov	di,si
		mov	es,tseg
		mov	ds,bseg
		call	pack
		pop	ds
		pop	dx
		mov	gs:[258][2*edx],cx

		xor	dx,dx
		mov	bx,file
		push	ds
		mov	boffs,dx
		mov	toffs,dx
		mov	ds,tseg
		mov	ah,40h
		int	21h
		pop	ds
		jc	chiba
stovabb:	and	jelzo,not 1
		mov	masbet,1
		inc	elsbet
		cmp	elsbet,36
		jb	tovabb

lezar:		mov	ax,sorszam
		xor	cx,cx
		mov	bx,file
		mov	gs:[184],ax
		mov	dx,cx
		mov	ax,4200h
		int	21h
		jc	chiba
		push	ds
		mov	cx,2922
		push	gs
		mov	ah,40h
		pop	ds
		int	21h
		pop	ds
		jc	chiba
		mov	ah,3eh
		int	21h
		mov	dx,offset htx7
		jmp	hiba

olvalt:		mov	bx,file
		mov	cx,1
		mov	dx,81h
		mov	ah,3fh
		int	21h
		jc	olveg
		cmp	al,1
		jb	olveg
		mov	al,ds:[81h]
		cmp	al,"["
		je	megje
		cmp	al,"{"
		je	megje
		cmp	al,"\"
		je	ujfile
		push	ds
		mov	cx,htx1-asctab
		mov	di,offset asctab
		pop	es
		repne	scasb
		mov	ax,di
		sub	ax,offset asctab+1
olveg:		ret
megje:		add	al,2
		xchg	ax,bx
megev:		push	bx
		mov	cx,1
		mov	dx,81h
		mov	ah,3fh
		mov	bx,file
		int	21h
		pop	bx
		jc	olveg
		cmp	al,1
		jb	olveg
		mov	al,ds:[81h]
		cmp	al,bl
		jne	megev
		jmp	olvalt
ujfile:		mov	cx,64
		inc	dx
		mov	ah,3fh
		int	21h
		jc	fhiba
		mov	di,dx
		mov	cx,ax
		jcxz	megvan
megcikl:	cmp	byte ptr [di],33
		jb	megvan
		inc	di
		loop	megcikl
megvan:		mov	[di],ch
		mov	ah,3eh
		int	21h
		mov	ax,3d00h
		int	21h
		jc	fhiba
		mov	file,ax
		jmp	olvalt

olvtov:		call	olvalt
		jc	tolveg
		or	al,al
		jz	olvtov
		cmp	al,112
		jae	olvtov
colveg:		clc
tolveg:		ret

olvnuj:		call	olvtov
		jmp	ololt

olnuj:		call	olvalt
ololt:		jc	tolveg
		cmp	al,91
		jne	colveg
		mov	cx,-1
		mov	bx,file
		mov	ax,4201h
		mov	dx,cx
		int	21h
		jc	fhiba
solveg:		stc
		ret

olvszam:	call	olvnuj
		jmp	olszt

olszam:		call	olnuj
olszt:		jc	tolveg
		sub	al,71
		jb	tolveg
		cmp	al,10
lveg:		jae	solveg
		or	al,al
		ret

olszam01:	call	olszam
		jc	tolveg
		cmp	al,2
		jmp	lveg

irseg:		test	ksbyt,64
		movzx	eax,al
		jz	nirseg
		inc	szaml[4*eax]
nirseg:		mov	bx,iseg
		cmp	bx,pszam
		jae	irosz
		mov	es,pseg[bx]
		mov	di,ioffs
		stosb
		cmp	di,pmeret
		jb	irben
		add	iseg,2
		xor	di,di
irben:		mov	ioffs,di
		inc	mennyit
		clc
		ret
irosz:		stc
		ret

olvseg:		mov	bx,oseg
		cmp	bx,pszam
		jae	irosz
		cmp	mennyit,0
		je	irosz
		mov	fs,pseg[bx]
		mov	si,ooffs
		lodsb	fs:[si]
		cmp	si,pmeret
		jb	orben
		add	oseg,2
		xor	si,si
orben:		mov	ooffs,si
		dec	mennyit
		clc
		ret

zip:		push	cx
		mov	bp,cx
		push	si
		or	bp,bp
		mov	ch,16
		push	di
		jz	zilveg
zilp:		lodsb
		mov	bx,8
nelp:		cmp	al,ziptab[bx-8]
		je	szomv
		inc	bl
		jns	nelp
		mov	bh,al
		mov	bl,5
		call	beforg
		mov	bl,bh
		jmp	zelso5
szomv:		cmp	bl,32
		jb	elso
		mov	bh,bl
zelso5:		shr	bl,5
		call	beforg
		mov	bl,bh
elso:		call	beforg
ziltov:		dec	bp
		jnz	zilp
zilveg:		mov	bx,bp
		call	beforg
		mov	cl,ch
		shl	dx,cl
		cmp	ch,8
		xchg	ax,dx
		xchg	al,ah
		stosw
		jb	zilw
		dec	di
zilw:		mov	cx,di
		pop	si
		pop	di
		sub	cx,si
		pop	dx
		ret

beforg:		mov	cl,5
		sub	ch,cl
		jb	foforg
		shl	dx,cl
		and	bl,31
		or	dl,bl
		ret
foforg:		add	cl,ch
		jz	dxforg
		shl	bl,3
forcl:		add	bl,bl
		adc	dx,dx
		dec	cl
		jnz	forcl
		xchg	ax,dx
		xchg	al,ah
		mov	cl,ch
		stosw
forbl:		add	bl,bl
		adc	dx,dx
		inc	cl
		jnz	forbl
		add	ch,16
		ret
dxforg:		xchg	ax,dx
		mov	ch,11
		xchg	al,ah
		mov	dl,bl
		stosw
		ret

include	<parancs.asm>
include	<pack.asm>

szvege:
dmake	ends

end	prog
