;***********************************************
;	larc_.asm -- extract *.lzs
;***********************************************
			page	0, 128

include	amscls.inc
$_init	GEN


CGROUP	GROUP	TEXT
DGROUP	GROUP	DATA,BSS

TEXT	segment byte public 'CODE'
	assume	cs:CGROUP, ds:DGROUP, ss:DGROUP
TEXT	ends

DATA	segment byte public 'DATA'
DATA	ends

BSS	segment byte public 'DATA'
MAGIC0		=		18
MAGIC5		=		19

flag_		db		1 dup (?)
flagcnt_	db		1 dup (?)
matchpos_	dw		1 dup (?)
BSS	ends

TEXT	segment byte public 'CODE'
	assume	cs:CGROUP, ds:DGROUP, ss:DGROUP
;
;ushort decode_c_lzs(void)
;

	public	decode_c_lzs_
decode_c_lzs_:		
	mov		al,1
	call	getbits_
	$_if <test	ax, ax>, NZ
		mov		al, 8
		jmp		getbits_
	$_endif
	mov		al, 11
	call	getbits_
	mov		matchpos_, ax
	mov		al, 4
	call	getbits_
	add		ax, 256
	ret


;
;ushort decode_p_lzs(int loc)
;

	public	decode_p_lzs_
decode_p_lzs_:		
	sub		ax, matchpos_
	sub		ax, MAGIC0
	and		ax, 07ffh
	ret


;
;void decode_start_lzs(void)
;

	public	decode_start_lzs_
decode_start_lzs_:		
	jmp		init_getbits_


;
;ushort decode_c_lz5(void)
;

	public	decode_c_lz5_
decode_c_lz5_:		
	$_if <dec flagcnt_>, S
		mov		flagcnt_, 7
		mov		ax, infile_
		call	fgetc_
		mov		flag_, al
	$_endif
	mov		ax,	infile_
	call	fgetc_
	$_if <shr flag_, 1>, NC
		mov		matchpos_, ax
		mov		ax, infile_
		call	fgetc_
		mov		bx, ax
		and		bx, 0f0h
		shl		bx, 1
		shl		bx, 1
		shl		bx, 1
		shl		bx, 1
		add		matchpos_, bx
		and		ax, 0fh
		add		ax, 100h
	$_endif
	ret


;
;ushort decode_p_lz5(int loc)
;

	public	decode_p_lz5_
decode_p_lz5_:		
	sub		ax, word ptr DGROUP:[matchpos_]
	sub		ax, MAGIC5
	and		ax, 0fffh
	ret


;
;void decode_start_lz5(void)
;

	public	decode_start_lz5_
decode_start_lz5_:		
	push	cx
	push	di
	xor		ax, ax
	mov		flagcnt_, al
	push	ds
	pop		es
	cld
	mov		di, offset DGROUP:text_ + 3000h + 18
	mov		ch, al
	$_do
		mov		cl, 13
		rep		stosb
	$_until <inc al>, Z
	$_do
		stosb
	$_until <inc al>, Z
	$_do
		dec		al
		stosb
	$_until , Z
	mov		cx, 128
	rep		stosb
	mov		cx, 128 - 18
	mov		al, ' '
	rep		stosb
	pop		di
	pop		cx
	RET	

	EXTRN	getbits_:near
	EXTRN	init_getbits_:near
	EXTRN	memset_:near
	EXTRN	fgetc_:near

TEXT	ends

	EXTRN	text_:byte
	EXTRN	infile_:word

	END
