;--------------------------------------------------------------------
;
;	Proggy:		LHSFX
;
;
;	Version:	V1.5a
;
;	Date:		14/11/92
;
;
;	Author:		Mike Kennedy and Ralf Thanner
;
;	Assembler:	ASM-ONE  (old syntax)
;
;--------------------------------------------------------------------
;
;  This source is not well optimized and may still include some
;  bugs and should  therefore not be seen as an example of good
;  programming. The only thing  I did was adding some stuff and
;  removing bugs. The decrunch header is still awfull and  some
;  other parts of the code too, but I'm really too lazy because
;  there are other and better SFX (like LHAsfx) around.
;
;  So do what you want with this piece but don't blame  ME  for
;  this code!-)
;
;  Be carefull when you assemble it  with an assembler like DEVPAC
;  with optimisation, coz the decrunch header includes lots of bad
;  code but has a hard-coded reloc table at the end. This makes it
;  a little bit complicated, and gives you only the choice  either
;  to rewrite the complete header or not to touch this area:-((
;  Look at 'SFX header' for a short overview. 
; 
;--------------------------------------------------------------------
;                       ****** History ******
;--------------------------------------------------------------------
;
; V1.2   28/05/91        [INTERNAL]
;
;     - removed Mikes bugs (LHSfx crashed sometimes; not all mem freed)
;
;     - added filerequester of req.library!
;       (if you don't have the req.lib you must type the name.-(
;
;     - removed screen color cycle during crunch.
;
;     - tried to improve the code a little bit!
;       ( fixed bugs, added file req., made it more multitasking
;         friendly and the code is still shorter! )
;
;     - changed:        DESTINATION  > ram:testfile
;                to     ARCHIVE NAME > ram:testfile
;
;
;     - changed:        'Press Left Mouse Button'
;                to     'Press RIGHT Mouse Button' for DMOUSE user!
;
----------------------------------------------------------------------
;
; V1.3   14/06/91        [INTERNAL]
;
;     - the filerequester is now also used for 'ARCHIV NAME' and
;       'EXTRACT PATH'.
;
;     - short instructions at the beginning ( only with req.lib. ).
;
;     - '.SFX' will be added automagically to archiv name.
;
;     - added led-cycling during crunch. ( is he still crunching?? )
;       ( In a multitasking system i prefer something more subtil than
;         a flashing screen. )
;
;     - added requester for '[F]ile' or '[D]isplay' choice.
;
;     - 'CON' and 'ANSI' part thrown out.
;       ( filelenght reduced from 18kb to 9kb! )
;
;---------------------------------------------------------------------
;
; V1.4   22/10/91        [INTERNAL]
;
;     - added requester for 'Overwrite [Y]es / [N]o' decision.
;
;     - removed some of my own bugs and some of Mike.
;
;     - the 'EXTRACT PATH' has only to be declared once.
;
;---------------------------------------------------------------------
;
; V1.5   03/11/92        Public release
;
;     - rewrote part of the code and removed bugs.
;
;     - changed TASKPRI during crunch from '0' to '+8'.
;
;     - handles now different 'source file dirs' correct (V1.5a).
;
;=====================================================================
;                 ********** Allgemeine Konstanten ***********
;=====================================================================
; a6 = $dff000	(oder execbase)
; a5 = pointer auf globales Variablenfeld (VAR)
;--------------------------------------------------------------------

disable		EQU	-120	; 	Exec.library
enable		EQU	-126
forbid		EQU	-132
permit		EQU	-138
allocmem	EQU	-198
freemem		EQU	-210
availmem	EQU	-216
findname	EQU	-276
addtask		EQU	-282
findtask	EQU	-294
settaskpri	EQU	-300
allocsignal	EQU	-330
freesignal	EQU	-336
addport		EQU	-354
RemPort		EQU	-360
putmsg		EQU	-366
getmsg		EQU	-372
replymsg	EQU	-378
waitport	EQU	-384
findport	EQU	-390
closelib	EQU	-414
OpenDevice	EQU	-444
CloseDevice	EQU	-450
doio		EQU	-456
openresource	EQU	-498
openlib		EQU	-552

Center			EQU	-$1e	;	Req-Library
SetSize			EQU	-$24
SetLocation		EQU	-$2a
ReadLocation		EQU	-$30
Format			EQU	-$36
FakeFunction1		EQU	-$3c 
FakeFunction2		EQU	-$42 
FakeFunction3		EQU	-$48 
FakeFunction4		EQU	-$4e 
FileRequester		EQU	-$54
ColorRequester		EQU	-$5a
DrawBox			EQU	-$60
MakeButton		EQU	-$66
MakeScrollBar		EQU	-$6c
PurgeFiles		EQU	-$72
GetFontHeightAndWidth	EQU	-$78
MakeGadget		EQU	-$7e
MakeString		EQU	-$84
MakeProp		EQU	-$8a
LinkGadget		EQU	-$90
LinkStringGadget	EQU	-$96
LinkPropGadget		EQU	-$9c
GetString		EQU	-$a2
RealTimeScroll		EQU	-$a8
TextRequest		EQU	-$ae
GetLong			EQU	-$b4
RawKeyToAscii		EQU	-$ba
ExtendedColorRequester	EQU	-$c0
NewGetString		EQU	-$c6

*************************************************************************
FRQSHOWINFO	EQU $00000001 ; .info files to show.  They default to hidden.
FRQEXTSELECT	EQU $00000002 ; extended select.  Default is not.
FRQCACHING	EQU $00000004 ; directory caching.  Default is not.
FRQGETFONTS	EQU $00000008 ; font Requester rather than a file Requester.
FRQINFOGADGET	EQU $00000010 ; hide-info files gadget.
FRQHIDEWILDS	EQU $00000020 ; DON'T want 'show' and 'hide' string gadgets.
FRQABSOLUTEXY	EQU $00000040 ; absolute x,y positions rather than centering on mouse.
FRQCACHEPURGE	EQU $00000080 ; Purge the cache whenever the directory date stamp changes if this is set.
FRQNOHALFCACHE	EQU $00000100 ; Don't cache a directory unless it is completely read in when this is set.
FRQNOSORT	EQU $00000200 ; DON'T want sorted directories.
FRQNODRAG	EQU $00000400 ; DON'T want a drag bar and depth gadgets.
FRQSAVING	EQU $00000800 ; selecting a file to save to.
FRQLOADING	EQU $00001000 ; selecting a file(s) to load from.
FRQDIRONLY	EQU $00002000 ; select a directory, rather than a file.
DSIZE		EQU 130		;Directory SIZE	;DON'T CHANGE !!
FCHARS		EQU 30		;Filename SIZE	;DON'T CHANGE !!
WILDLENGTH	EQU 30	     	;Wildcards SIZE	;DON'T CHANGE !!
**********************************************************************


;=====================================================================
;                             ** MAIN **
;=====================================================================

; code by MIKE and me...

start:


	movem.l	d0-d7/a0-a6,-(SP)

	MOVE.L		4.w,A6
	lea		VAR(PC),A5	; master base to avoid reloc_32
					; hunks and to get faster code..
	suba.l		a1,a1
	jsr	findtask(a6)
	move.l		d0,a4
	move.l		d0,my_task-var(a5)

;	LEA		$5c(A4),A1	; MSG Port
;	move.l		a1,port1-var(a5)

	tst.l		$ac(a4)
	bne.b	cli_call

* Worbench Part

	lea		$5c(a4),a0
	jsr	waitport(a6)
	lea		$5c(a4),a0
	jsr	getmsg(a6)
	move.l		d0,A4	; WB_Message

	jsr	forbid(a6)
	move.l		A4,a1
	jsr	replymsg(a6)
	movem.l 	(a7)+,d0-d7/a0-a6
	moveq		#00,d0
	rts

* CLI-PARAMETER HANDLER

cli_call
	movem.l 	(a7)+,d0-d7/a0-a6

	MOVE.L		4.w,A6
	lea		VAR(PC),A5

	lea		reqname(pc),a1	; open req.lib
	moveq		#0,d0
	jsr	-552(a6)
	move.l		d0,reqbase-var(a5)

led_test
	btst		#1,$bfe001
	seq		led-var(a5)
	bset		#1,$bfe001

	LEA		doslibrary(pc),A1
	moveq		#0,d0
	JSR	-552(A6)
	MOVE.L		D0,dosbase-var(a5)	; dosbase
	beq.w		nix_dos_open
	move.l		d0,a6

	jsr	-60(a6)				; output
	MOVE.L		D0,conbase0-var(a5)
	BEQ.W	dos_open_aber_no_con

;	MOVE.L		#mes0,D2
	lea		mes0(pc),a0
	MOVE.l		#mes0leng,D3
	bsr.w	write_text		; write begin text

	tst.l		reqbase-var(a5)
	bne.b	oh_no

;	MOVE.L		#mes1,D2
	lea		mes1(pc),a0
	MOVE.l		#mes1leng,D3
	bsr.w	write_text		; write begin text

oh_no
	MOVE.L		#$9C40,D0		
	MOVE.L		#$10001,D1	; Clear&Public
	MOVE.L		4.w,A6
	JSR	-$C6(A6)
	MOVE.L		D0,alloc0-var(a5)	; alloc mem
	beq.w	alloc0_no

overwrite_no
	tst.l		reqbase-var(a5)
	beq.b	war_nix1

	bsr.w	about

	lea		load_title1(pc),a1	; Archivname
	moveq		#0,d0
	bra.w		use_it

war_nix1
;	MOVE.L		#mDestination0,D2	; 'archiv name'
	lea		mDestination0(pc),a0
	MOVEq		#$18,D3
	bsr.w	write_text

	moveq		#0,d0
	bsr.w		enter_arh_name		; 0 Archiv

	LEA		name_buff(pc),A0
	TST.L		(A0)
	beq.b	war_nix1
	CMP.L		#'exit',(A0)
	beq.w	free_mem
	CMP.L		#'EXIT',(A0)
	beq.w	free_mem
howdi1
	lea		var(pc),a5
	MOVE.L		A0,D1
	moveq		#-2,D2
	MOVE.L		dosbase(pc),A6
	JSR	-$54(A6)			; lock
	TST.L		D0
	beq.b	overwrite_yes1
	MOVE.L		D0,lock_handle-var(a5)
	MOVE.L		D0,D1

;	MOVE.L		#info_block,D2
	lea		info_block(pc),a0
	move.l		a0,d2

	MOVE.L		dosbase(pc),A6
	JSR	-$66(A6)			; examine
	MOVE.L		lock_handle(PC),D1
	MOVE.L		dosbase(pc),A6
	JSR	-$5A(A6)			; unlock
	MOVE.L		is_it_datei(PC),D0
	TST.L		D0
	BLT.s	ask_for_overwrite

;	MOVE.L		#mThatsadirect,D2	; 'That's a directory'
	lea		mThatsadirect(pc),a0
	MOVEq		#$22,D3

	bsr.w	write_text
	bra.w	overwrite_no

ask_for_overwrite
	tst.l		reqbase-var(a5)
	beq.b	ask_for_overwrite1
	bra.w	req_ask_overwrite
ask_for_overwrite1
;	MOVE.L		#mFileExistsOv,D2	; 'File exists /overwrite?'
	lea		mFileExistsOv(pc),a0
	MOVEq		#$2B,D3
	bsr.w	write_text
	bsr.w	two_input
	CMP.B		#$59,(A0)	; y (overwrite?)
	beq.b	overwrite_yes
	CMP.B		#$79,(A0)
	beq.b	overwrite_yes
	bra.w	overwrite_no

overwrite_yes
	MOVE.L		#name_buff,D1
	MOVE.L		dosbase(pc),A6
	JSR	-72(A6)			; Delete
overwrite_yes1

	MOVE.L		#name_buff,D1
	MOVE.L		#$3EE,D2
	MOVE.L		dosbase(pc),A6
	JSR	-$1E(A6)		; Open
	TST.L		D0
	bne.b	lbC000134		; hat geklappt
	bra.w	write_file_error

lbC000134
	lea		VAR(PC),a5
	MOVE.L		D0,File_handle-var(a5)
	move.l		d0,d1
	MOVE.L		#sfx_hunk,D2
	MOVE.L		#sfx_len,D3
	JSR	-$30(A6)		; Write
	tst.l		d0
	bmi.w	lbc00066e
;	MOVE.L		#mArchiveOpene,D2	; 'Archiv opened..'
	lea		mArchiveOpene(pc),a0
	MOVEq		#$1C,D3
	bsr.w	write_text

main_loop:
	lea		VAR(PC),A5
	tst.l		reqbase-var(a5)
	beq.b	war_nix
	lea		load_title(pc),a1
	moveq		#1,d0
	bra.w		use_it
war_nix
;	MOVE.L		#mOriginal0m,D2	; 'Original >'
	lea		mOriginal0m(pc),a0
	MOVEq		#$15,D3
	BSR.W	write_text		; text schreiben

	moveq		#1,d0
	bsr.w	enter_arh_name		; 1 File

	LEA		name_buff(pc),A0
	TST.L		(A0)
	beq.w	lbC000518
	CMP.L		#'EXIT',(A0)
	beq.w	lbC000692
	CMP.L		#'exit',(A0)
	beq.w	lbC000692
howdi
	MOVE.L		A0,D1
	MOVEq		#-2,D2		; 'lese lock'
	MOVE.L		dosbase(pc),A6
	JSR	-84(A6)			; Lock
	TST.L		D0
	beq.w	lbC0006EC

	MOVE.L		D0,lock_handle-var(a5)
	move.l		d0,d1

;	MOVE.L		#info_block,D2
	lea		info_block(pc),a0
	move.l		a0,d2

	MOVE.L		dosbase(pc),A6
	JSR	-102(A6)			; Examine
	MOVE.L		lock_handle(PC),D1
	MOVE.L		dosbase(pc),A6
	JSR	-$5A(A6)
	MOVE.L		is_it_datei(PC),D0
	TST.L		D0
	BLT.b	lbC000206
;	MOVE.L		#mCannotcompre,D2	; 'cannot compress a direc'
	lea		mCannotcompre(pc),a0
	MOVEq		#$29,D3
	bsr.w		write_text
	bra.w	main_loop
lbC000206
;	MOVE.L		#pfeil,D2		; ' (xxxx) bytes'
	lea		pfeil(pc),a0
	MOVEq		#6,D3
	bsr.w	write_text
;	MOVE.L		#name_buff,D2
	lea		name_buff(pc),a0
	MOVE.L		name_len(pc),D3
	bsr.w	write_text
;	MOVE.L		#ascii,D2
	lea		ascii(pc),a0
	MOVEq		#6,D3
	bsr.w	write_text
	MOVE.L		file_len_imlock(PC),D0
	BSR.W	lbC00079C

;	MOVE.L		#ascii0,D2
	lea		ascii0(pc),a0

	MOVEq		#9,D3
	bsr.w	write_text
;	MOVE.L		#bytes1,D2
	lea		bytes1(pc),a0
	MOVEq		#9,D3
	bsr.w	write_text
	MOVE.L		file_len_imlock(PC),D0
	MOVE.L		D0,file_len_backsave-var(a5)
	MOVE.L		D0,D1
	DIVU		#8,D1
	AND.L		#$FFFF,D1
	ADD.L		D1,D0
	ADD.L		#$40,D0		; header/file-len/packed/pack_chksum
	MOVE.L		D0,file_len_umgerechnet-var(a5)
	MOVE.L		4.w,A6
	MOVE.L		#$10001,D1
	JSR	-$C6(A6)			; Alloc
	TST.L		D0
	beq.w	lbC00065A
	MOVE.L		D0,extract_buf-var(a5)
	MOVE.L		file_len_backsave(pc),D0
	MOVE.L		#$10001,D1		; Public
;	MOVE.L		4.w,A6
	JSR	-$C6(A6)			; Alloc
	TST.L		D0
	beq.w	lbC000646
	MOVE.L		D0,alloc2-var(a5)
	MOVE.L		#name_buff,D1
	MOVE.L		#$3ED,D2
	MOVE.L		dosbase(pc),A6
	JSR	-$1E(A6)			; Open
	TST.L		D0
	beq.w	lbC000632
	MOVE.L		D0,D1
	MOVE.L		D0,file_handle2-var(a5)
	MOVE.L		alloc2(pc),D2
	MOVE.L		file_len_backsave(pc),D3
	MOVE.L		dosbase(pc),A6
	JSR	-$2A(A6)			; Read
	CMP.L		file_len_backsave(pc),D0
	bne.w	lbC000622
	MOVE.L		file_handle2(pc),D1
	MOVE.L		dosbase(pc),A6
	JSR	-$24(A6)			; Close
;	MOVE.L		#mCompressingP,D2	; 'Compressing please wait...'
	lea		mCompressingP(pc),a0
	MOVEq		#$2A,D3
	bsr.w	write_text
	LEA		crunch_strucc(pc),A0
	MOVE.L		alloc2(pc),(A0)+
	MOVE.L		file_len_backsave(pc),(A0)+
	MOVE.L		extract_buf(pc),(A0)
	ADD.L		#$40,(A0)+
	MOVE.L		file_len_umgerechnet(pc),(A0)+
	MOVE.L		alloc0(pc),(A0)+
	MOVE.L		#$9C40,(A0)+
	CLR.L		(A0)
;--------------------------------------------------------------------
set_task_pri:

	move.l		$04.w,a6
	move.l		my_task(pc),a1
	moveq		#8,d0
	jsr	-300(a6)			; set task pri
;--------------------------------------------------------------------
	LEA		crunch_strucc(pc),A0
	bsr.w	lbC0007FC		; cruncher
;--------------------------------------------------------------------
	movem.l		d0-d7/a0-a6,-(SP)
	move.l		$04.w,a6
	move.l		my_task(pc),a1
	moveq		#0,d0
	jsr	-300(a6)			; set task pri
	movem.l 	(a7)+,d0-d7/a0-a6
;--------------------------------------------------------------------
	MOVE.L		D0,packed_len-var(a5)
	MOVE.L		alloc2(pc),A1
	MOVE.L		file_len_backsave(pc),D0
	MOVE.L		4.w,A6
	JSR	-$D2(A6)
;	MOVE.L		#mCompressed,D2		; 'Compressed xxx'
	lea		mCompressed(pc),a0
	MOVEq		#$10,D3
	bsr.w	write_text
;	MOVE.L		#ascii0,D2
	MOVEq		#9,D3
	lea		ascii0(pc),a0
	bsr.w		write_text
;	MOVE.L		#bytestobytes0,D2	; xxxx bytes to'
	lea		bytestobytes0(pc),a0
	MOVEq		#10,D3
	bsr.w	write_text
	MOVE.L		packed_len(pc),D0
	bsr.w	lbC00079C
;	MOVE.L		#ascii0,D2		; alte byte zahl
	lea		ascii0(pc),a0
	MOVEq		#9,D3
	bsr.w		write_text
;	MOVE.L		#bytes0m,D2		; ' bytes'
	lea		bytes0m(pc),a0
	MOVEq		#12,D3
	bsr.w	write_text

	MOVE.L		extract_buf(pc),A0
	MOVE.L		packed_len(pc),D0
	moveq		#0,d2
	moveq		#0,d1
lbC0003DE
	MOVE.B		(A0)+,D1
	ADD.L		D1,D2
	DBRA	D0,lbC0003DE
	MOVE.L		D2,pack_checksum-var(a5)
lbC0003EE

	tst.l		reqbase-var(a5)
	beq.b	lbc0003ee1
	bra.w	ask_exit
lbC0003Ee1
;	MOVE.L		#mFileorDispla,D2	; 'File or Display'
	lea		mFileorDispla(pc),a0
	MOVEq		#$20,D3
	bsr.w	write_text
	bsr.w	two_input
	CMP.B		#'f',(A0)
	beq.b	lbC000448
	CMP.B		#'F',(A0)
	beq.b	lbC000448
	CMP.B		#'d',(A0)
	beq.b	lbC000426
	CMP.B		#'D',(A0)
	beq.b	lbC000426
	bra.b	lbC0003EE1
sfg
	MOVE.L		file_len_backsave(pc),(A0)+
	MOVE.L		packed_len(pc),(A0)+
	MOVE.L		pack_checksum(pc),(A0)
	rts
lbC000426
	MOVE.L		extract_buf(pc),A0
	MOVE.L		#$22222222,(A0)+	; Display
	bsr.b	sfg
	bra.w	lbC0004C6			; bei Display gibbet keinen
lbC000448					; 'extract' path
	MOVE.L		extract_buf(pc),A0
	MOVE.L		#$11111111,(A0)+	; File
	bsr.b	sfg

lbC000466
	tst.w		arq-var(a5)
	bne.b	do_the_complete_copy_name

	move.w		#-1,arq-var(a5)		; Extract Path nur einmal

	tst.l		reqbase-var(a5)
	beq.b	cli_trot
	bra.w	and_again		; zurueck nach lbc0004c6

do_the_complete_copy_name:
	lea		backsave_buf(pc),a1	; old extract path
	move.l		extract_buf(pc),a0
	lea		$10(a0),a0
copy_dir_to_sfx:
	move.b		(a1)+,(a0)+
	bne.b	copy_dir_to_sfx

	subq.l		#1,a0

	lea		name_buff(pc),A1
	MOVE.L		load_dir_len-var(a5),d0
	add.l		d0,a1
copy_name_to_sfx:
	move.b		(a1)+,(a0)+
	bne.b	copy_name_to_sfx
	clr.b		-(a0)

	bra.b	lbC0004C6

cli_trot

;	MOVE.L		#mExtractPath0,D2
	lea		mExtractPath0(pc),a0
	MOVEq		#$19,D3
	bsr.w	write_text

	MOVE.L		conbase0(pc),D1
	MOVE.L		extract_buf(pc),D2
	ADD.L		#$10,D2
	MOVEq		#$30,D3
	MOVE.L		dosbase(pc),A6
	JSR	-42(A6)				; read

	MOVE.L		extract_buf(pc),A0
	ADD.L		#$10,A0
lbC0004A4
	CMP.B		#10,(A0)+
	bne.b	lbC0004A4
	clr.b		-1(a0)
	move.l		a0,a1
	MOVE.L		extract_buf(pc),A0
	ADD.L		#$10,A0
	tst.b		(a0)
	beq.b	cli_trot

;do_the_copy_name:
;	subq.l		#1,a1
;	lea		name_buff(pc),A0
;	MOVE.L		name_len-var(a5),d0
;	subq.l		#1,d0
;copy_cli_name_to_sfx:
;	move.b		(a0)+,(a1)+
;	dbf	d0,copy_cli_name_to_sfx

lbC0004C6
	MOVE.L		File_handle(pc),D1
	MOVE.L		extract_buf(pc),D2
	MOVE.L		packed_len(pc),D3
	ADD.L		#$40,D3

	ADD.L		D3,new_filepacked_len-var(a5)
	MOVE.L		dosbase(pc),A6

	JSR	-48(A6)				; write

	tst.l		d0
	bmi.w	lbc000622

	MOVE.L		extract_buf(pc),A1
	MOVE.L		file_len_umgerechnet(pc),D0
	MOVE.L		4.w,A6
	JSR	-210(A6)			; free mem

;	MOVE.L		#mAddedtoArchi,D2	; 'Added to Archive...'
	lea		mAddedtoArchi(pc),a0
	MOVEq		#$1E,D3
	bsr.w	write_text
	bra.w	main_loop

lbC000518
	LEA		lbL000DE0(pc),A0
	MOVE.L		A0,lbL000DD4-var(a5)
	MOVE.L		#4,lbL000DD0-var(a5)
	MOVE.L		new_filepacked_len(pc),D0
	ADDq.L		#4,D0
	DIVU		#4,D0
	SWAP		D0
	TST.W		D0
	beq.b	fix_sfx_hunk
	CLR.W		D0
	SWAP		D0
	ADDq.L		#1,D0
	SWAP		D0
	SUBq.L		#2,lbL000DD4-var(a5)
	ADDq.L		#2,lbL000DD0-var(a5)
fix_sfx_hunk
	SWAP		D0
	LEA		sfx_hunk(pc),A0	; ARCHIV HUNK
	MOVE.L		D0,$1C(A0)
	MOVE.L		D0,$914(A0)
	MOVE.L		File_handle(pc),D1

;	MOVE.L		#lbL000DD8,D2
	lea		lbl000dd8(pc),a0
	move.l		a0,d2

	MOVEq		#4,D3
	move.l		dosbase(pc),a6
	JSR	-$30(A6)		; Write
	tst.w		d0
	bmi.W	lbc00066e

	MOVE.L		File_handle(pc),D1
	MOVE.L		lbL000DD4(pc),D2
	MOVE.L		lbL000DD0(pc),D3
	JSR	-$30(A6)
	tst.w		d0
	bmi.W	lbc00066e

	MOVE.L		File_handle(pc),D1
	MOVEq		#0,D2
	moveq		#0,d3
	not.l		d3
	MOVE.L		dosbase(pc),A6
	JSR	-$42(A6)
	TST.L		D0
	BLT.B	lbC00066E
	MOVE.L		File_handle(pc),D1

;	MOVE.L		#sfx_hunk,D2
	lea		sfx_hunk(pc),a0
	move.l		a0,d2

	MOVE.L		#sfx_len,D3
	JSR	-$30(A6)
	tst.w		d0
	bmi.s	lbc00066e

	MOVE.L		File_handle(pc),D1
	MOVE.L		dosbase(pc),A6
	JSR	-$24(A6)

;	bsr	moxi
;	MOVE.L		#mArchiveSucce,D2
	lea		mArchiveSucce(pc),a0
	MOVE.l		#malen,D3
	bsr.b	write_text
;right_mouse_button1:
;	moveq		#$0a,d1
;	jsr	-198(a6)		; Delay
;	BTST		#10,$dff016
;	bne	right_mouse_button1

	BRA.B	free_mem

;-------------------------------------------------------------------------
write_text:
	movem.l		d0-d1/a0-a1/a6,-(sp)
	move.l		a0,d2
	move.l		dosbase(pc),a6
	move.l		conbase0(pc),d1 ; window
	tst.l		d1
	beq.b	writer_no
	jsr	-$30(a6)
writer_no:
	movem.l		(SP)+,d0-d1/a0-a1/a6
	rts
;--------------------------------------------------------------------------

lbC000622
	MOVE.L		file_handle2(pc),D1
	bsr.b	moxi1
;	MOVE.L	dosbase(pc),A6
;	JSR	-$24(A6)
lbC000632
;	MOVE.L		#mErrorreading,D2
	lea		mErrorreading(pc),a0
	MOVEq		#$2E,D3
	bsr.b	write_text
	bra.w	main_loop

moxi
	MOVE.L		File_handle(pc),D1
moxi1
	MOVE.L		dosbase(pc),A6
	Jmp	-$24(A6)

lbC000646
lbC00065A
;	MOVE.L		#mCouldntalloc,D2
	lea		mCouldntalloc(pc),a0
	MOVEq		#$30,D3
	bsr.b	write_text
	bra.w	main_loop

lbC00066E
	bsr.b moxi

write_file_error
;	MOVE.L		#mErrorreading,D2
	lea		mErrorreading(pc),a0
	MOVEq		#$2E,D3
	bsr.b	write_text
	bra.w	overwrite_no

real_ende
lbC000692
	bsr.b	moxi

free_mem
	MOVE.L		alloc0(pc),A1
	MOVE.L		#$9C40,D0
	MOVE.L		4.w,A6
	JSR	-$D2(A6)
	BRA.B	kurz_vor_ende

alloc0_no
;	MOVE.L		#mCouldntalloc,D2
	lea		mCouldntalloc(pc),a0
	MOVEq		#$30,D3
	bsr.b	write_text

kurz_vor_ende

;MOVE.L	dosbase(pc),A6
;MOVE.L	conbase0(pc),D1
;JSR	-$24(A6)
;bsr	moxi1

dos_open_aber_no_con
	MOVE.L		4.w,A6
	MOVE.L		dosbase(pc),A1
	JSR	-414(A6)		; close dos
nix_dos_open
	tst.l		reqbase-var(a5)
	beq.b	das_warx

;lea		frq_Structure(pc),a0
;move.l		reqbase(pc),a6
;jsr	Purgefiles(a6)
;move.l		$04.w,a6

	move.l		reqbase(pc),a1
	jsr	-414(a6)

das_warx
	tst.b		led-var(a5)		; LED ist jetzt genauso
	bne.b	led_light			; wie vor aufruf...
	bset		#1,$bfe001
	bra.b	led_dark
led_light
	bclr		#1,$bfe001
led_dark
;	movem.l		(SP)+,d0-d7/a0-a6
	moveq	#0,d0
	RTS

lbC0006EC
;	MOVE.L	#mThatfiledoes,D2
	lea		mThatfiledoes(pc),a0
	MOVEq		#$25,D3
	bsr.w	write_text
	bra.w	main_loop

claro
	LEA		name_buff(pc),A0
	MOVEq		#$13,D1
lbC00070C
	CLR.L		(A0)+
	DBRA	D1,lbC00070C
	rts

enter_arh_name
	move.l		d0,-(sp)
;	moveq		#0,d0
	bsr.b	claro

	LEA		name_buff(pc),A0
	move.l		a0,d2
	MOVE.L		conbase0(pc),D1
	MOVEq		#$50,D3
	MOVE.L		dosbase(pc),A6
	JSR	-$2A(A6)			; Read
	SUBq.L		#1,D0			; wegen 'Return'
	MOVE.L		D0,name_len-var(a5)
	LEA		name_buff(pc),A0
lbC000740
	CMP.B		#10,(A0)+		; 'Return'
	bne.b	lbC000740
	subq.l		#1,a0		; return weg

li	move.l		(sp)+,d0	; 0 archiv  | 1 file
	tst.l		d0
	bne.b	az
	move.b		#'.',(a0)+
	move.b		#'S',(a0)+
	move.b		#'F',(a0)+
	move.b		#'X',(a0)+
	clr.b		(a0)
	addq.l		#4,name_len-var(a5)
	rts
az:
	clr.b		(A0)		; return weg
	RTS

two_input:
	LEA		lbL000E5C(pc),A0
	clr.l		(a0)
	MOVE.L		conbase0(pc),D1

;	MOVE.L		#lbL000E5C,D2
	lea		lbl000e5c(pc),a6
	move.l		a6,d2

	MOVEq		#2,D3		; 2 Zeichen
	MOVE.L		dosbase(pc),A6
	JSR	-$2A(A6)		; Read
	LEA		lbL000E5C(pc),A0
	CMP.B		#10,(A0)
	bne.b		lbC000788
	CLR.L		(A0)
lbC000788
	RTS

lbC00079C
	MOVEQ		#7,D2
	LEA		ascii0(pc),A2
	MOVE.L		A2,A0

	LEA		lbL0007DC(pc),A1
lbC0007AC
	MOVEQ		#$30,D1
lbC0007AE
	ADDQ.W		#1,D1
	SUB.L		(A1),D0
	BCC.b	lbC0007AE
	SUBQ.W		#1,D1
	ADD.L		(A1),D0
	MOVE.B		D1,(A0)+
	ADDq.L		#4,A1
	DBRA	D2,lbC0007AC

	MOVE.L		A2,A0
lbC0007C6
	clr.B		(A0)+
	CMP.B		#$30,(A0)
	beq.b	lbC0007C6
	RTS

	cnop 0,4
VAR:
	dc.b	"$VER: LHSFX V1.5a (14.11.92)",0

	cnop 0,4

;--------------------------------------------------------------------
;                         *** Variablen ***
;--------------------------------------------------------------------

backsave_buf:	blk.l	40

my_task:	dc.l	0

ascii0	dc.b	'00000000',0
	even
lbL0007DC
	dc.l	$989680
	dc.l	$F4240
	dc.l	$186A0
	dc.l	$2710
	dc.l	$3E8
	dc.l	$64
	dc.l	10
	dc.l	1
doslibrary
	dc.b	'dos.library',0

	cnop 0,4
dosbase:	dc.l	0
lock_handle:	dc.l	0

info_block
	dc.l	0
is_it_datei
	dc.l	0

	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
file_len_imlock:		; Laenge in bytes
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
file_handle2	dc.l	0
File_handle	dc.l	0
alloc2		dc.l	0
extract_buf	dc.l	0
file_len_backsave	dc.l	0
file_len_umgerechnet	dc.l	0
new_filepacked_len	dc.l	0
packed_len	dc.l	0
pack_checksum	dc.l	0
alloc0		dc.l	0
lbL000DD0	dc.l	0
lbL000DD4	dc.l	0
lbL000DD8	dc.l	$FFFFFFFF
		dc.l	0
lbL000DE0	dc.l	$3F2
crunch_strucc	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
	dc.l	0
conbase0	dc.l	0
;conbase1	dc.l	0
name_buff	blk.l	21,0
name_len	dc.l	0
dir_len:	dc.l	0
load_dir_len:	dc.l	0
lbL000E5C	dc.l	0
arq		dc.w	0
even
led		dc.b	0
	even
;--------------------------------------------------------------------
;                      *** my code (R.T.) ***
;--------------------------------------------------------------------

use_it
	movem.l		d0-d7/a0-a6,-(a7); save registers
	move.l		d0,-(sp)
	bsr.w	claro
	lea		load_dir(pc),a2
	lea		load_file(pc),a3
	move.l		load_flags(pc),d0
	lea		frq_1(pc),a0
	lea		frq_3(pc),a4
	move.l		a1,(a0)+
	move.l		a2,(a0)+
	move.l		a3,(a0)+
	move.l		d0,(a4)
	lea		frq_Structure(pc),a0
	move.l		reqbase(pc),a6
	moveq		#0,d0
	jsr	FileRequester(a6)
	tst.w		d0
	beq.b	das_war_dann_nix

	moveq		#0,d1
	lea		load_dir(pc),a0
	LEA		name_buff(pc),A1
	lea		load_file(pc),a2
work_script_string:			; A0,A1,A2 & D0
	addq.w		#1,d1
	move.b		(a0)+,(a1)+
	bne.b	work_script_string
	subq.w		#2,d1
	subq.w		#2,a1
	move.b		(a1),d0
	cmp.b		#':',d0
	beq.b	work_script_string1
	cmp.b		#'/',d0
	beq.b	work_script_string1
	addq.l		#1,a1
	add.w		#1,d1
	move.b		#'/',(a1)
work_script_string1
	addq.l		#1,a1
	move.l		d1,load_dir_len-var(a5)
	add.l		#1,load_dir_len-var(a5)
work_script_string2
	addq.w		#1,d1
	move.b		(a2)+,(a1)+
	bne.b	work_script_string2

	subq.l		#1,a1

	move.l		(sp)+,d0	; 0 Archiv | 1 File
	tst.l		d0
	bne.b	wq

	move.b		#'.',(a1)+
	move.b		#'S',(a1)+
	move.b		#'F',(a1)+
	move.b		#'X',(a1)+
	clr.b		(a1)
	movem.l 	(a7)+,d0-d7/a0-a6
	LEA		name_buff(pc),A0
	bra.w	howdi1
wq
	MOVE.L		D1,name_len-var(a5)
	clr.b		(a1)

	movem.l 	(a7)+,d0-d7/a0-a6
	LEA		name_buff(pc),A0
	bra.w	howdi


das_war_dann_nix
	move.l		(sp)+,d0
	tst.l		d0
	bne.b	wq1
	movem.l 	(a7)+,d0-d7/a0-a6
	bra.w	free_mem			; archiv
wq1
	movem.l 	(a7)+,d0-d7/a0-a6
	bra.w	lBC000518			; file

ask_exit:
	movem.l		d0-d7/a0-a6,-(a7); save registers
	lea		master_text(pc),a1	
	sub.l		a2,a2
	sub.l		a3,a3
	lea		ask_exit_text1(pc),a4
	lea		ask_exit_text0(pc),a5
	bsr.w	set_text_req
	tst.w		d0
	beq.b	disp
	movem.l 	(a7)+,d0-d7/a0-a6
	bra.w	lbc000448	; file
disp
	movem.l 	(a7)+,d0-d7/a0-a6
	bra.w	lbc000426	; display

req_ask_overwrite
	movem.l		d0-d7/a0-a6,-(a7); save registers
	lea		master_text1(pc),a1	
	sub.l		a2,a2
	sub.l		a3,a3
	lea		ask_exit_text2(pc),a4
	lea		ask_exit_text3(pc),a5
	bsr.w	set_text_req
	tst.w		d0
	beq.b	ov_n
	movem.l 	(a7)+,d0-d7/a0-a6
	bra.w	overwrite_yes
ov_n
	movem.l 	(a7)+,d0-d7/a0-a6
	bra.w	overwrite_no

	cnop 0,4

nio:	blk.l	4,0
 master_Text:
	DC.B "    Do you want the just crunched part as a    ",10
	dc.b " [F]ile decrunched or as a TEXT [D]isplayed ?? ",10,0

	EVEN
 ask_exit_Text1:	DC.b " »» F «« ",0
	even
 ask_exit_text0:	DC.b " »» D «« ",0
	EVEN
 master_Text1:
	DC.B "    Archiv exists. Shall I overwrite it?    ",10,0

	EVEN
 ask_exit_Text2:	DC.b " »» Y «« ",0
	even
 ask_exit_text3:	DC.b " »» N «« ",0

	cnop 0,4

; entpack dir festlegen
and_again:
	movem.l		d0-d7/a0-a6,-(a7); save registers
and_agi:
	lea		load_title2(pc),a1
	lea		load_dir1(pc),a2
	lea		load_file1(pc),a3
	move.l		load_flags3(pc),d0
	lea		frq_1(pc),a0
	lea		frq_3(pc),a4
	move.l		a1,(a0)+
	move.l		a2,(a0)+
	move.l		a3,(a0)+
	move.l		d0,(a4)
	lea		frq_Structure(pc),a0
	move.l		reqbase(pc),a6
	moveq		#0,d0
	jsr	FileRequester(a6)
	tst.w		d0
	beq.b	and_agi

	lea		load_dir1(pc),a0
	move.l		extract_buf(pc),A1
	lea		$10(a1),a1
	moveq		#0,d1
work_script_string0
	addq.w		#1,d1
	move.b		(a0)+,(a1)+
	bne.b	work_script_string0
	subq.w		#2,d1
	subq.l		#2,a1
	move.b		(a1),d0
	cmp.b		#':',d0
	beq.b	work_script_string10
	cmp.b		#'/',d0
	beq.b	work_script_string10
	addq.l		#1,a1
	addq.w		#1,d1
	move.b		#'/',(a1)
work_script_string10
	addq.w		#1,d1
	move.l		d1,dir_len-var(a5)

	addq.l		#1,a1
	clr.b		(a1)

	move.l		a1,a2

; saves the extract path back
	lea		backsave_buf(pc),a1
	move.l		extract_buf(pc),a0
	lea		$10(a0),a0
work_script_string_buff:
	move.b		(a0)+,(a1)+
	bne.b	work_script_string_buff


; inserts the name the first time

	lea		name_buff(pc),A0
	MOVE.L		load_dir_len-var(a5),d0
	add.l		d0,a0
cli_name_to_sfx:
	move.b		(a0)+,(a2)+
	bne.b	cli_name_to_sfx

	clr.b		-1(a2)

	movem.l 	(a7)+,d0-d7/a0-a6

	bra.w	lbc0004c6
;---------------------------------------------------------------------
about:
	lea		about_text(pc),a1
	lea		about_middletext(pc),a3
	sub.l		a4,a4
	sub.l		a5,a5
	sub.l		a2,a2
;	bsr.b	set_text_req

*****************************************************************************
; 	A1 -> message text
; 	A2 -> zeiger auf controls
; 	A3 -> middle   2
; 	A4 -> left     1	positive
; 	A5 -> right    0	negative
set_text_req:
	lea		TR_structure(pc),a0
	move.l		a1,(a0)+
	move.l		a2,(a0)+
	addq.l		#4,a0	
	move.l		a3,(a0)+
	move.l		a4,(a0)+
	move.l		a5,(a0)
	move.l		reqbase(pc),a6
	lea		TR_Structure(pc),a0
	jsr	TextRequest(a6)
	lea		Var(pc),a5
	rts
	cnop 0,4
;=============================================================================
;=                         TextRequester-Structure                           =
;=============================================================================
TR_Structure:
	DC.l 0	;This is the message text, including printf() style formatting if desired.
	DC.l 0	;This is the address of the parameter list, if printf() style formatting is used.
on_my_window1: 
	DC.l 0	;TR_Window	;This is an optional (zero if not used) pointer to a window on the screen you
			;would like the Requester to show up on.
	DC.l 0	; lower middle (returns 2).
	DC.l 0	; lower left hand corner (returns 1).
	DC.l 0	; lower right (returns 0).
	DC.l TR_title	; title for the window.
	DC.w 0 ;TR_KeyMask	;This is the qualifier mask for the keyboard shortcuts.
			;Use $FFFF to allow any qualifiers (or none).
			;Zero means that no keyboard shortcuts are allowed.
	DC.w 0	;TR_textcolor	;Color of the text.  Uses Color 1 if no Color specified.
	DC.w 3	;TR_detailcolor	;Detail and block color, as in a NewWindow structure.  If
	DC.w 2	;TR_blockcolor	;both are left zero, block pen will be set to 1.
	DC.w 0	;TR_versionnumber	;Make SURE this is set to zero.
	DC.l 0	;TR_rfu1	;Make SURE you leave these two zeroed also.
	DC.l 0	;TR_rfu2	;Make SURE you leave these two zeroed also.
 TR_Title:	DC.b 0

	even
;=============================================================================
;=                         FileRequester-Structure                           =
;=============================================================================
;frq_Flags: EQU FRQINFOGADGET!FRQABSOLUTEXY!FRQLOADING;
;ESS_Structure:	;ExtendedSelectStructure
; DC.l 0	;ESS_NextFile	;This must be the first element!
; DC.w 0	;ESS_NameLength	;File name length, not including the terminating zero.
; DC.w 0	;ESS_Pad
; DC.l 0	;ESS_Node	;Node that the user has extended selected.
;==============================================================================
;=         When  using  extended  select,  the  directory pointer is Required =
;= since  only  the  file  names  are stored in the frq_ExtendedSelect linked =
;= list.   When  not  using  extended select, you can either have frq_Dir and =
;= frq_File  point  be initialized, or you can have frq_PathName initialized, =
;= or  both.   frq_PathName will contain the concatenation of the file and    =
;= directory chosen.                                                          =
;==============================================================================
	EVEN

frq_Structure:
 DC.w 0	; frq_VersionNumber : MUST BE ZERO !!!!!!!!!
frq_1:
 DC.l 0		;Hailing text
 DC.l 0		;Directory array (must be DSIZE+1 characters long)
 DC.l 0 	;Filename array (must be FCHARS+1 characters long)
	;If you initialize this variable then the file Requester will place the complete path name in here on exit.
frq_2:
 DC.l frq_PathName	;Complete path name array - (must be DSIZE+FCHARS+2 long)
on_my_window: 
 DC.l 0	; frq_Window : Window Requesting or NULL
	;Initialize these to the number of lines and columns you want to appear in the inner window that
	;displays the file names.  If you leave these set to zero then default values will be used.
 DC.w 15	; frq_MaxExtendedSelect : Zero implies a maximum of 65535, as long as FRQEXTSELECT is set.
 DC.w 16	; frq_numlines   : Number of lines in file window.
 DC.w 32	; frq_numcolumns : Number of columns in file window.
 DC.w 12	; frq_devcolumns : Number of columns in device window.
frq_3:
 DC.l 0	;Various - umm - flags.  See above for more info.
 DC.w 3	; frq_dirnamescolor    : These five colors will all default
 DC.w 0	; frq_filenamescolor   : to color one if you don't specify
 DC.w 3	; frq_devicenamescolor : a color (ie; if you specify color zero).
 DC.w 0	; frq_fontnamescolor   : If you want color zero to be used, specify
 DC.w 3	; frq_fontsizescolor   : color 32, or some other too large number
	;which mods down to zero.
 DC.w 0	; frq_detailcolor : If both of these colors are specified as
 DC.w 0	; frq_blockcolor  : zero then the block pen will be set to one.
 DC.w 0	; frq_gadgettextcolor   : The color for the text of the five boolean gadgets.  Defaults to 1.
 DC.w 0	; frq_textmessagecolor  : The color for the message at the screen top.  Defaults to 1.
 DC.w 0	; frq_stringnamecolor   : The color for the words Drawer, File, Hide and Show.  Defaults to 3.
 DC.w 0	; frq_stringgadgetcolor : The color for the borders of the string gadgets.  Defaults to 3.
 DC.w 0	; frq_boxbordercolor : The color for the boxes around the file and directory areas.  Defaults to 3.
 DC.w 0	; frq_gadgetboxcolor : The color for the boxes around the five boolean gadgets.  Defaults to 3.
 blk.b 36,0	; frq_RFU_Stuff,36 : This area, which is reserved for
	;future use, should all be zero.
 blk.b 12	; frq_DirDateStamp,ds_SIZEOF : A copy of the cached directories date stamp. (12 Bytes !!)
	;There should never be any need to change this.
 DC.w 0; frq_WindowLeftEdge : These two fields are only used when the
 DC.w 8; frq_WindowTopEdge  : FRQABSOLUTEXY flag is set.  They specify
	;the location of the upper left hand
	;corner of the window.
 DC.w 0	; frq_FontYSize : These fields are used to return the selected
 DC.w 0	; frq_FontStyle : font size and style, only applicable when the
	;font bit is set.
	;If you set the extended select bit and the user extended selects, the list of filenames will start from here.
acid:
 DC.l 0	; frq_ExtendedSelect : Linked list of ESStructures if more than one filename is chosen.
	;All of the following variables you shouldn't need to touch.  They contain fields that the file
	;Requester sets and likes to preserve over calls, just to make life easier for the user.
frq_WildHide:	DC.B "*.info"
frq_WildHide0:	equ *-frq_WildHide
	blk.b WILDLENGTH+2-frq_WildHide0 ; frq_Hide Wildcards for files to hide.
frq_WildShow:	DC.B 0
frq_WildShow0:	equ *-frq_WildShow
	blk.b WILDLENGTH+2-frq_WildShow0 ; frq_Show Wildcards for files to show.
 DC.w 0	; frq_FileBufferPos : Cursor's  position  and first
 DC.w 0	; frq_FileDispPos   : displayed character number in
 DC.w 0	; frq_DirBufferPos  : the three string gadgets.  No
 DC.w 0	; frq_DirDispPos    : need  to initialized these if
 DC.w 0	; frq_HideBufferPos : you don't want to.
 DC.w 0	; frq_HideDispPos
 DC.w 0	; frq_ShowBufferPos
 DC.w 0	; frq_ShowDispPos
;==============================================================================
;=         The  following  fields are PRIVATE!  Don't go messing with them or =
;==============================================================================
 DC.l 0	; frq_Memory  : Memory allocated for dir entries.
 DC.l 0	; frq_Memory2 : Used for currently hidden files.
 DC.l 0	; frq_Lock    : Contains lock on directories being read across calls.
 blk.b DSIZE+2	; frq_PrivateDirBuffer : Used for keeping a record of which
	;directory we have file names for.
 DC.l 0	; frq_FileInfoBlock
 DC.w 0	; frq_NumEntries
 DC.w 0	; frq_NumHiddenEntries
 DC.w 0	; frq_filestartnumber
 DC.w 0	; frq_devicestartnumber
;=============================================================================
frq_PathName:	blk.b DSIZE+FCHARS+2	;Here Will Be The Complete PathName !!!
;-----------------------------------------------------------------------------
	EVEN
 reqbase:	dc.l	0
 reqname:	dc.b	'req.library',0
	EVEN
 load_Flags1: EQU FRQSHOWINFO!FRQINFOGADGET!FRQABSOLUTEXY!FRQLOADING
 load_flags:	dc.l load_flags1
 load_File:	DC.b 0
 load_File0:	EQU *-load_File
	blk.b FCHARS+1-load_File0
 load_Title:	DC.b "«« CHOOSE FILE TO CRUNCH »»",0
	EVEN
 load_Dir:	DC.b "RAM:"
 load_Dir0:	EQU *-load_Dir
	blk.b DSIZE+1-load_Dir0
	even
 load_Title1:	DC.b "«« CHOOSE ARCHIVNAME »»",0
	even
 load_Title2:	DC.b "«« CHOOSE EXTRACT PATH »»",0
	even
 load_Flags2: EQU FRQDIRONLY!FRQINFOGADGET!FRQABSOLUTEXY!FRQLOADING
 load_flags3:	dc.l load_flags2
 load_File1:	DC.b 0
 load_File2:	EQU *-load_File1
	blk.b FCHARS+1-load_File2
	even
 load_Dir1:	DC.b "RAM:"
 load_Dir2:	EQU *-load_Dir1
	blk.b DSIZE+1-load_Dir2
	EVEN
 about_Text:
	dc.b "-----------------------------------------------",10
	DC.b "          »»  LhSFX Archive  V1.5  ««          ",10
	dc.b "            By Mike Kennedy  © 1991            ",10
	dc.b "       Cruncher and Decruncher  © by MXM       ",10
	dc.b "       Improved by Ralf Thanner in 91/92       ",10
	dc.b "-----------------------------------------------",10,10
	dc.b " 1.  Choose ARCHIVNAME. '.SFX' will be added.  ",10 
	dc.b " 2.  Choose FILE to crunch.                    ",10,10
	dc.b " 3.  Choose if it's [F]ile or [D]isplay.       ",10,10
	dc.b " 4.  Choose EXTRACT path for archive.          ",10,10
	dc.b " 5.  Now quit or go to step 2.                 ",10,10
	dc.b " To close off and finish an archive just click ",10
	dc.b " the 'FORGET IT' or  'CANCEL' icon in the file ",10
	dc.b " drawer.                                       ",10,0

	even
 about_middletext:
	DC.b " »» OK «« ",0
	EVEN

;===========================================================================
;
;        A data compression system for the Commodore Amiga computer
;           written by Holger P. Krekel and Olaf 'Olsen' Barthel
;                  © Copyright 1990, all rights reserved.
;
;===========================================================================
;
;******* Thanks for these versions ********
; LZHUF.C English version 1.0
; Based on Japanese version 29-NOV-1988
; LZSS coded by Haruhiko OKUMURA
; Adaptive Huffman Coding coded by Haruyasu YOSHIZAKI
; Edited and translated to English by Kenji RIKITAKE

;******* Many thanks to Olaf for knowledge and the above ******
;******* sourcecodes 					*******
;******* they were used to get to know some methods 	*******
;**************************************************************
;******* LZHUF Packing 					*******
;******* written in assembly by HPK 24/08/90		*******
;
;===========================================================================

; damm well programmed code...

lbC0007FC
	MOVEM.L	D2-D7/A2-A6,-(SP)
	PEA	(A0)
	bsr.w	lbC000A4E
	MOVE.L	(SP)+,A0
	SUB.L	8(A0),A1
	CMP.W	#$10,D7
	beq.b	lbC000814
	ADDQ.L	#2,A1
lbC000814
	MOVE.L	A1,12(A0)
	MOVE.L	A1,D0
	MOVEM.L	(SP)+,D2-D7/A2-A6
	RTS

lbC000820
	MOVEQ	#1,D4
	LEA	-$2078(A3),A6
	LEA	(A6),A2
	ADD.W	D0,A2
	MOVE.W	(A2)+,D5
	ADD.W	#$1001,D5
	ADD.W	D5,D5
	MOVE.W	#$2000,D6
	MOVE.W	D6,0(A3,D0.W)
	MOVE.W	D6,0(A4,D0.W)
	MOVEQ	#0,D6
	MOVE.L	A2,D3
lbC000842
	MOVE.L	D3,A2
lbC000844
	TST.W	D4
	BPL.b	lbC00085C
	MOVE.W	0(A3,D5.W),D2
	CMP.W	#$2000,D2
	bne.b	lbC000870
	MOVE.W	D0,0(A3,D5.W)
	MOVE.W	D5,0(A5,D0.W)
	RTS

lbC00085C
	MOVE.W	0(A4,D5.W),D2
	CMP.W	#$2000,D2
	bne.b	lbC000870
	MOVE.W	D0,0(A4,D5.W)
	MOVE.W	D5,0(A5,D0.W)
	RTS

lbC000870
	MOVE.W	D2,D5
	LEA	-$2076(A3),A6
	ADD.W	D2,A6
	MOVE.L	A2,D3
	MOVE.W	(A2)+,D4
	SUB.W	(A6)+,D4
	bne.b	lbC000842
	MOVE.W	(A2)+,D4
	SUB.W	(A6)+,D4
	bne.b	lbC000842
	MOVEQ	#$39,D2
lbC000888
	MOVE.W	(A2)+,D4
	SUB.W	(A6)+,D4
	DBNE	D2,lbC000888

	NEG.W	D2
	ADD.W	#$3C,D2
	MOVE.L	D3,A2
	CMP.W	D6,D2
	BLT.b	lbC000844
	beq.b	lbC0008B4
	MOVE.W	D2,D6
	MOVE.W	D0,D3
	SUB.W	D5,D3
	AND.W	#$1FFE,D3
	MOVE.W	D3,$6206(A3)
	CMP.W	#$3C,D2
	BCS.b	lbC000844
	bra.b	lbC0008D2

lbC0008B4
	bchg	#1,$bfe001
;	MOVE.W	D3,$DFF182
	MOVE.W	D0,D3
	SUB.W	D5,D3
	AND.W	#$1FFE,D3
	CMP.W	$6206(A3),D3
	BCC.w	lbC000844
	MOVE.W	D3,$6206(A3)
	BRA.w	lbC000844

lbC0008D2
	MOVE.W	0(A5,D5.W),0(A5,D0.W)
	MOVE.W	0(A3,D5.W),0(A3,D0.W)
	MOVE.W	0(A4,D5.W),0(A4,D0.W)
	MOVE.W	0(A3,D5.W),D2
	MOVE.W	D0,0(A5,D2.W)
	MOVE.W	0(A4,D5.W),D2
	MOVE.W	D0,0(A5,D2.W)
	MOVE.W	0(A5,D5.W),D2
	CMP.W	0(A4,D2.W),D5
	bne.b	lbC000904
	MOVE.W	D0,0(A4,D2.W)
	bra.b	lbC000908

lbC000904
	MOVE.W	D0,0(A3,D2.W)
lbC000908
	MOVE.W	#$2000,0(A5,D5.W)
	RTS

lbC000910
	MOVE.W	#$2000,D4
	CMP.W	0(A5,D0.W),D4
	beq.b	lbC000992
	CMP.W	0(A4,D0.W),D4
	bne.b	lbC000926
	MOVE.W	0(A3,D0.W),D2
	bra.b	lbC000972

lbC000926
	CMP.W	0(A3,D0.W),D4
	bne.b	lbC000932
	MOVE.W	0(A4,D0.W),D2
	bra.b	lbC000972

lbC000932
	MOVE.W	0(A3,D0.W),D2
	CMP.W	0(A4,D2.W),D4
	beq.b	lbC000966
lbC00093C
	MOVE.W	0(A4,D2.W),D2
	CMP.W	0(A4,D2.W),D4
	bne.b	lbC00093C
	MOVE.W	0(A5,D2.W),D3
	MOVE.W	0(A3,D2.W),0(A4,D3.W)
	MOVE.W	0(A3,D2.W),D3
	MOVE.W	0(A5,D2.W),0(A5,D3.W)
	MOVE.W	0(A3,D0.W),D3
	MOVE.W	D3,0(A3,D2.W)
	MOVE.W	D2,0(A5,D3.W)
lbC000966
	MOVE.W	0(A4,D0.W),D3
	MOVE.W	D3,0(A4,D2.W)
	MOVE.W	D2,0(A5,D3.W)
lbC000972
	MOVE.W	0(A5,D0.W),D3
	MOVE.W	D3,0(A5,D2.W)
	CMP.W	0(A4,D3.W),D0
	beq.b	lbC00098A
	MOVE.W	D2,0(A3,D3.W)
	MOVE.W	D4,0(A5,D0.W)
	RTS

lbC00098A
	MOVE.W	D2,0(A4,D3.W)
	MOVE.W	D4,0(A5,D0.W)
lbC000992
	RTS

lbC000994
	ADD.W	D0,D0
	MOVE.W	D0,D1
	NEG.W	D1
	LEA	-$2A5C(A3),A2
	MOVE.W	-2(A2,D1.W),D1
	MOVEQ	#0,D3
	MOVEQ	#1,D2
	MOVEQ	#0,D4
lbC0009A8
	LSR.W	D2,D3
	BTST	D2,D1
	beq.b	lbC0009B2
	OR.W	#$8000,D3
lbC0009B2
	ADD.W	D2,D4
	MOVE.W	0(A2,D1.W),D1
	CMP.W	#$4F0,D1
	bne.b	lbC0009A8
	SWAP	D3
	CLR.W	D3
	ROL.L	D7,D3
	OR.W	D3,(A1)
	SUB.B	D4,D7
	BGT.b	lbC0009D4
	ADDQ.L	#2,A1
	SWAP	D3
	MOVE.W	D3,(A1)
	MOVEQ	#$10,D3
	ADD.W	D3,D7
lbC0009D4
	CMP.W	#$8000,-$2CDA(A3)
	beq.b	lbC000A4C
	LEA	-$31CA(A3),A5
	LEA	-$2A5C(A3),A4
	LEA	-$256A(A3),A3
	MOVEQ	#1,D4
	NEG.W	D0
	MOVE.W	-2(A4,D0.W),D0
lbC0009F0
	LEA	0(A5,D0.W),A2
	MOVE.W	(A2),D1
	ADD.W	D4,D1
	MOVE.W	D1,(A2)+
	CMP.W	(A2)+,D1
	BLS.b	lbC000A3A
lbC0009FE
	CMP.W	(A2)+,D1
	BHI.b	lbC0009FE
	SUBQ.L	#4,A2
	MOVE.L	A2,D2
	SUB.L	A5,D2
	MOVE.W	(A2),0(A5,D0.W)
	MOVE.W	D1,(A2)
	MOVE.W	0(A3,D0.W),D1
	BMI.b	lbC000A18
	MOVE.W	D2,2(A4,D1.W)
lbC000A18
	MOVE.W	D2,0(A4,D1.W)
	MOVE.W	0(A3,D2.W),D3
	BMI.b	lbC000A26
	MOVE.W	D0,2(A4,D3.W)
lbC000A26
	MOVE.W	D1,0(A3,D2.W)
	MOVE.W	D0,0(A4,D3.W)
	MOVE.W	D3,0(A3,D0.W)
	MOVE.W	0(A4,D2.W),D0
	bne.b	lbC0009F0
	bra.b	lbC000A40

lbC000A3A
	MOVE.W	0(A4,D0.W),D0
	bne.b	lbC0009F0
lbC000A40
	LEA	$31CA(A5),A3
	LEA	$51CC(A5),A4
	LEA	$73CE(A5),A5
lbC000A4C
	RTS

lbC000A4E
	PEA	(A0)
	MOVE.L	$10(A0),A6
	MOVE.L	A6,A0
	LEA	$C60(A6),A1
	LEA	$76E(A6),A2
	MOVEQ	#-$2,D0
	MOVEQ	#0,D3
	MOVEQ	#1,D1
	MOVEQ	#2,D2
	MOVE.W	#$13C,D7
lbC000A6A
	MOVE.W	D1,(A0)+
	MOVE.W	D0,(A1)+
	MOVE.W	D3,-(A2)
	SUB.W	D2,D0
	ADD.W	D2,D3
	DBRA	D7,lbC000A6A

	MOVEQ	#0,D6
	MOVE.L	#$27A,D7
	MOVE.L	A6,A0
	LEA	$27A(A6),A1
	LEA	$EDA(A6),A2
	LEA	$76E(A6),A3
	MOVEQ	#4,D4
	MOVEQ	#2,D2
	MOVE.W	#$13B,D1
lbC000A96
	MOVE.W	(A0)+,D0
	ADD.W	(A0)+,D0
	MOVE.W	D0,(A1)+
	MOVE.W	D6,(A2)+
	MOVE.W	D7,(A3)+
	MOVE.W	D7,(A3)+
	ADD.W	D4,D6
	ADD.W	D2,D7
	DBRA	D1,lbC000A96

	MOVE.W	D1,(A1)
	CLR.W	$C5E(A6)
	MOVEQ	#$7F,D0
	MOVE.L	#$20002000,D1
	LEA	$71CE(A6),A0
lbC000ABC
	MOVE.L	D1,(A0)+
	DBRA	D0,lbC000ABC

	MOVE.W	#$3FF,D0
	LEA	$73CE(A6),A0
lbC000ACA
	MOVE.L	D1,(A0)+
	MOVE.L	D1,(A0)+
	DBRA	D0,lbC000ACA

	MOVE.L	(SP)+,A6
	MOVE.L	(A6),A0
	MOVE.L	8(A6),A1
	MOVE.L	4(A6),D0
	MOVE.L	$10(A6),A2
	ADD.L	A0,D0
	MOVE.L	D0,-(SP)
	LEA	$1152(A2),A6
	MOVE.W	#$7E2,D1
	MOVEQ	#0,D0
lbC000AF0
	MOVE.L	D0,(A6)+
	DBRA	D1,lbC000AF0

	LEA	$30DA(A2),A6
	MOVEQ	#0,D2
	MOVEQ	#0,D3
lbC000AFE
	MOVE.B	(A0)+,D3
	CMP.L	(SP),A0
	BHI.b	lbC000B0E
	MOVE.W	D3,(A6)+
	ADDQ.W	#1,D2
	CMP.W	#$3C,D2
	BCS.b	lbC000AFE
lbC000B0E
	LEA	$31CA(A2),A3
	LEA	$51CC(A2),A4
	LEA	$73CE(A2),A5
	MOVE.W	D2,$4206(A4)
	CLR.W	(A1)
	MOVEQ	#$10,D7
	MOVEQ	#0,D0
	MOVE.W	#$1F88,D1
	MOVE.W	D0,-(SP)
	MOVE.W	D1,-(SP)
	MOVE.W	D1,D0
	BSR.w	lbC000820
	MOVE.W	(SP)+,D1
	MOVE.W	(SP)+,D0
lbC000B36
	CMP.W	$4206(A4),D6
	BLS.b	lbC000B40
	MOVE.W	$4206(A4),D6
lbC000B40
	CMP.W	#2,D6
	BCS.b	lbC000C0E
	MOVE.W	D1,-(SP)
	MOVE.W	D0,-(SP)
	MOVE.W	D6,D0
	ADD.W	#$FF,D0
	BSR.w	lbC000994
	MOVEQ	#0,D0
	MOVE.W	$6206(A3),D0
	ROR.L	#7,D0
	ADD.W	D0,D0
	MOVE.W	lbW000B8E(PC,D0.W),D1
	MOVE.B	D1,D3
	CLR.B	D1
	SWAP	D0
	LSR.W	D3,D0
	OR.W	D0,D1
	ADDQ.W	#6,D3
	SWAP	D1
	CLR.W	D1
	ROL.L	D7,D1
	OR.W	D1,(A1)
	SUB.B	D3,D7
	BGT.S	lbC000B86
	ADDQ.L	#2,A1
	SWAP	D1
	MOVE.W	D1,(A1)
	MOVEQ	#$10,D1
	ADD.W	D1,D7
lbC000B86
	MOVE.W	(SP)+,D0
	MOVE.W	(SP)+,D1
	BRA.b	lbC000C24
lbC000C0E
	MOVEQ	#1,D6
	MOVE.W	D1,-(SP)
	MOVE.W	D0,-(SP)
	LEA	-$2078(A3),A6
	MOVE.W	0(A6,D1.W),D0
	BSR.w	lbC000994
	MOVE.W	(SP)+,D0
	MOVE.W	(SP)+,D1
lbC000C24
	MOVE.W	D6,D5
	SUBQ.W	#1,D5
lbC000C28
	BSR.w	lbC000910
	MOVE.B	(A0)+,D3
	CMP.L	(SP),A0
	BLS.w	lbC000C4A
	SUBQ.W	#1,$4206(A4)
	bne.w	lbC000C60
	BGT.w	lbC000B36
	MOVEQ	#0,D0
	MOVE.W	#$13C,D0
	BSR.w	lbC000994
	ADDQ.L	#4,SP
	RTS

	cnop	0,4

lbW000B8E
	dc.w	3
	dc.w	$2004
	dc.w	$3004
	dc.w	$4004
	dc.w	$5005
	dc.w	$5805
	dc.w	$6005
	dc.w	$6805
	dc.w	$7005
	dc.w	$7805
	dc.w	$8005
	dc.w	$8805
	dc.w	$9006
	dc.w	$9406
	dc.w	$9806
	dc.w	$9C06
	dc.w	$A006
	dc.w	$A406
	dc.w	$A806
	dc.w	$AC06
	dc.w	$B006
	dc.w	$B406
	dc.w	$B806
	dc.w	$BC06
	dc.w	$C007
	dc.w	$C207
	dc.w	$C407
	dc.w	$C607
	dc.w	$C807
	dc.w	$CA07
	dc.w	$CC07
	dc.w	$CE07
	dc.w	$D007
	dc.w	$D207
	dc.w	$D407
	dc.w	$D607
	dc.w	$D807
	dc.w	$DA07
	dc.w	$DC07
	dc.w	$DE07
	dc.w	$E007
	dc.w	$E207
	dc.w	$E407
	dc.w	$E607
	dc.w	$E807
	dc.w	$EA07
	dc.w	$EC07
	dc.w	$EE07
	dc.w	$F008
	dc.w	$F108
	dc.w	$F208
	dc.w	$F308
	dc.w	$F408
	dc.w	$F508
	dc.w	$F608
	dc.w	$F708
	dc.w	$F808
	dc.w	$F908
	dc.w	$FA08
	dc.w	$FB08
	dc.w	$FC08
	dc.w	$FD08
	dc.w	$FE08
	dc.w	$FF08

lbC000C4A
	LEA	-$2078(A3),A6
	MOVE.B	D3,1(A6,D0.W)
	CMP.W	#$76,D0
	BCC.b	lbC000C60
	LEA	$2000(A6),A2
	MOVE.B	D3,1(A2,D0.W)
lbC000C60
	MOVEQ	#2,D2
	ADD.W	D2,D0
	ADD.W	D2,D1
	MOVE.W	#$1FFE,D2
	AND.W	D2,D0
	AND.W	D2,D1
	MOVE.W	D5,-(SP)
	MOVE.W	D0,-(SP)
	MOVE.W	D1,D0
	bsr.w	lbC000820
	MOVE.W	(SP)+,D0
	MOVE.W	(SP)+,D5
	DBRA	D5,lbC000C28

	bra.w	lbC000B36

;===========================================================================

	cnop 0,4
mes0:
	dc.b ''
	dc.b $0a,$9b,'7;32;41m'
	dc.b $1b,'[1m'
	dc.b ' »»»  LhSFX Archive  V1.5  ««« '   
	dc.b $9b,'0;31;40m'
	dc.b $0a,$0a
	dc.b $1b,'[3m'
	dc.b ' LhSFX Archive V1.0 by Mike Kennedy  © 1991',$0a
	dc.b ' LhSFX Archive V1.5 by Ralf Thanner  © 1992',$0a
	dc.b ' Crunch & Decrunch © by Holger Krekel & Olaf Barthel',$0a,$0a
	dc.b $1b,'[0m'
mes0end:
mes0leng = mes0end-mes0
	even
mes1:
	dc.b " Didn't find 'requester.library', now you must use the cli-interface! "
	dc.b $0a
mes1end:
mes1leng = mes1end-mes1
	even

mOriginal0m
	dc.b	10
	dc.b	$1B
	dc.b	'[1mOriginal > '
	dc.b	$1B
	dc.b	'[0m',0,0

	even
mThatfiledoes:
	dc.b	$1B
	dc.b	"[3mThat file doesn't exist ..."
	dc.b	$1B
	dc.b	'[0m',$A,0
	dc.b	0

	even
mCannotcompre	dc.b	$1B
	dc.b	'[3mCannot compress a directory ...'
	dc.b	$1B
	dc.b	'[0m',$A,0
	dc.b	0

	even
mFileorDispla	dc.b	10
	dc.b	$1B
	dc.b	'[1m[F]ile or [D]isplay > '
	dc.b	$1B
	dc.b	'[0m',0

	even
mCompressingP	dc.b	10
	dc.b	$1B
	dc.b	'[3mCompressing ... Please Wait ...'
	dc.b	$1B
	dc.b	'[0m',$A,0

	even
mExtractPath0	dc.b	10
	dc.b	$1B
	dc.b	'[1mExtract Path > '
	dc.b	$1B
	dc.b	'[0m',0,0

	even
mDestination0	dc.b	10
	dc.b	$1B
	dc.b	'[1mARCHIV NAME > '
	dc.b	$1B
	dc.b	'[0m',0

	even
pfeil
	dc.l	$A20BB3E
	dc.w	$2000
ascii	dc.b	'    (',0
bytes1	dc.b	' bytes)',$A,0
	dc.b	0

	even
mCouldntalloc	dc.b	10
	dc.b	$1B
	dc.b	"[3mCouldn't allocate enough memory ..."
	dc.b	$1B
	dc.b	'[0m'
	dc.b	7
	dc.b	7
	dc.b	10
	dc.b	0

	even
mThatsadirect	dc.b	10
	dc.b	$1B
	dc.b	"[3mThat's a directory ..."
	dc.b	$1B
	dc.b	'[0m',$A
	dc.b	7
	dc.b	0

	even
mFileExistsOv	dc.b	10
	dc.b	$1B
	dc.b	'[1mArchiv Exists.  Overwrite <y/n>? '
	dc.b	$1B
	dc.b	'[0m'
	dc.b	7
	dc.b	0

	even
mErrorreading	dc.b	10
	dc.b	$1B
	dc.b	'[3mError reading or writing file ...'
	dc.b	$1B
	dc.b	'[0m'
	dc.b	7
	dc.b	7
	dc.b	10
	dc.b	0

	even
mArchiveSucce	dc.b	10
	dc.b	$1B
	dc.b	'[33mArchive Successfully Completed ...',$A,$A
	dc.b	$1B
	dc.b	'[0m',$0a,$0a,0
maend
malen=maend-mArchiveSucce

	even
mCompressed	dc.b	10
	dc.b	$1B
	dc.b	'[1mCompressed '
bytestobytes0	dc.b	' bytes to '
bytes0m	dc.b	' bytes.'
	dc.b	$1B
	dc.b	'[0m',$A

	even
mArchiveOpene	dc.b	10
	dc.b	$1B
	dc.b	'[1mArchive Opened ...'
	dc.b	$1B
	dc.b	'[0m',$A

	even
mAddedtoArchi	dc.b	10
	dc.b	$1B
	dc.b	'[1mAdded to Archive ...'
	dc.b	$1B
	dc.b	'[0m',$A

	cnop 0,4
;--------------------------------------------------------------------
;                        *** SFX header ***
;--------------------------------------------------------------------
;
; here is still a lot to do, but now it's your turn....
;
; be carefull, don't change a bit coz othewrwise it won't decrunch
; anymore. If you want to improve it you MUST rewrite the complete
; code. 
; Mike uses a hard coded reloc table (look at 'how_can_someone_do_
; such_shit') for his header and makes it therfore a little bit
; complicate to change the code... ha ha ha 
;
; The rest of the code looked like this part below so you can
; surely imagine that I had some troubles...
;
sfx_hunk
lbL003D00
	dc.l	$3F3
	dc.l	0
	dc.l	3
	dc.l	0
	dc.l	2
	dc.l	$20F
	dc.l	$465
	dc.l	1
	dc.l	$3E9
	dc.l	$20F

decruncher
	LEA	0,A1
	MOVE.L	A1,$318
	LEA	$2EC,A1		; Dosname
	MOVEA.L	4,A6		; what about '4.w' ?
	JSR	-$228(A6)	; OpenLib
	MOVE.L	D0,$2FC	; Dosbase
	BEQ.L	lbC003F78
	MOVEA.L	D0,A6
	JSR	-$3C(A6)	; Output
	MOVE.L	D0,$304	; OutputHandle	
	LEA	$320,A0
	BSR.L	lbC003F7C
	LEA	$308,A4
	LEA	0,A5
lbC003D70
	CMPI.L	#$11111111,(A5)	; is it File
	BEQ.L	lbC003D92
	CMPI.L	#$22222222,(A5)	; or Display ?
	BEQ.L	lbC003EB4	; Show txt and wait mouse
	CMPI.L	#$FFFFFFFF,(A5)
	BEQ.L	lbC003F44
	BRA.L	lbC003F60

lbC003D92			; file entpacken
	LEA	$40(A5),A0
	MOVE.L	A0,0(A4)
	MOVE.L	8(A5),4(A4)
	MOVE.L	4(A5),12(A4)
	MOVE.L	4(A5),D0
	BSR.L	lbC003FE8		; AllocMem
	BEQ.L	lbC003F52
	MOVE.L	D0,8(A4)
	LEA	$10(A5),A0
	BSR.L	lbC003F7C
	LEA	$10(A5),A0
lbC003DC2
	CMPI.B	#$2F,(A0)
	BEQ.L	lbC003DDC	; Create Dir
lbC003DCA
	ADDA.L	#1,A0
	CMPI.B	#0,(A0)
	BEQ.L	lbC003E2C	; No DIr
	BRA.L	lbC003DC2

lbC003DDC
	MOVE.B	#0,(A0)
	MOVE.L	A0,$2F8
	LEA	$10(A5),A0
	MOVE.L	A0,D1
	MOVE.L	#$FFFFFFFE,D2
	MOVEA.L	$2FC,A6			; Dosbase	
	JSR	-$54(A6)	; Lock
	TST.L	D0
	BNE.L	lbC003E18
	LEA	$10(A5),A0
	MOVE.L	A0,D1
	MOVEA.L	$2FC,A6			; Dosbase
	JSR	-$78(A6)	; CreateDir
	TST.L	D0
	BEQ.L	lbC003F60
lbC003E18
	MOVE.L	D0,D1
	JSR	-$5A(A6)	; Unlock
	MOVEA.L	$2F8,A0
	MOVE.B	#$2F,(A0)
	BRA.L	lbC003DCA

lbC003E2C
	LEA	$10(A5),A0
	MOVE.L	A0,D1
	MOVE.L	#$3Ec,D2	; Mode RW
	MOVEA.L	$2FC,A6			; Dosbase	
	JSR	-$1E(A6)	; OPEN
	MOVE.L	D0,$300			; FileHandle
	TST.L	D0
	BNE.S	lbC003E50
	BRA.L	lbC003F6A

lbC003E50
	MOVE.L	12(A4),D2
	LEA	Bytes.MSG(PC),A2
	BSR.L	lbC003F9A
	LEA	$2DA,A0
	BSR.L	lbC003F7C
	LEA	$308,A0
	BSR.L	lbC00414C
	MOVE.L	$300,D1
	MOVE.L	8(A4),D2
	MOVE.L	D0,D3
	JSR	-$30(A6)	; Write
	CMP.W	#$FFFF,D0
	MOVE.L	$300,D1
	JSR	-$24(A6)	; Close
	CLR.L	$300
	MOVEA.L	8(A4),A1
	MOVE.L	12(A4),D0
	MOVE.L	4.w,A6
	JSR	-$D2(A6)	; FreeMem
	LEA	8(A5),A0
	ADDA.L	(A0),A5
	ADDA.L	#$40,A5
	BRA.L	lbC003D70

lbC003EB4
	LEA	$40(A5),A0
	MOVE.L	A0,0(A4)
	MOVE.L	8(A5),4(A4)
	MOVE.L	4(A5),12(A4)
	MOVE.L	4(A5),D0
	BSR.L	lbC003FE8		; AllocMem
	BEQ.L	lbC003F52
	MOVE.L	D0,8(A4)
	LEA	$308,A0
	BSR.L	lbC00414C
	LEA	$382,A0
	BSR.L	lbC003F7C
	MOVE.L	$304,D1		; OutputHandle
	MOVE.L	8(A4),D2
	MOVE.L	12(A4),D3
	MOVEA.L	$2FC,A6			; Dosbase
	JSR	-$30(A6)	; Write
	MOVEA.L	8(A4),A1
	MOVE.L	12(A4),D0
	MOVE.L	4.w,A6
	JSR	-$D2(A6)	; FreeMem
	LEA	$386,A0
	BSR.L	lbC003F7C
lbC003F1E
	BTST	#6,$BFE001	; Mouse after display
	BNE.L	lbC003F1E
	LEA	$3B2,A0
	BSR.L	lbC003F7C
	LEA	8(A5),A0
	ADDA.L	(A0),A5
	ADDA.L	#$40,A5
	BRA.L	lbC003D70

lbC003F44
	LEA	$35E,A0
	BSR.L	lbC003F7C
	BRA.L	lbC003F6A

lbC003F52
	LEA	$3F6,A0
	BSR.L	lbC003F7C
	BRA.L	lbC003F6A

lbC003F60
	LEA	$3B4,A0
	BSR.L	lbC003F7C
lbC003F6A
	MOVEA.L	$2FC,A1			; Dosbase
	MOVE.L	4.w,A6
	JSR	-$19E(A6)	; Close Lib
lbC003F78
;	CLR.L	D0
	moveq	#0,d0
	RTS

lbC003F7C
	MOVEA.L	A0,A1
lbC003F7E
	TST.B	(A1)+
	BNE.S	lbC003F7E
	SUBA.L	A0,A1
	MOVE.L	A1,D3
	MOVE.L	A0,D2
	MOVE.L	$304,D1		; OutputHandle
	MOVEA.L	$2FC,A6		; Dosbase
	JSR	-$30(A6)	; WRITE
	RTS

lbC003F9A
	MOVEQ	#7,D0
	MOVEA.L	A2,A0
	LEA	lbL003FC8(PC),A1
lbC003FA2
	MOVEQ	#$30,D1
lbC003FA4
	ADDQ.W	#1,D1
	SUB.L	(A1),D2
	BCC.S	lbC003FA4
	SUBQ.W	#1,D1
	ADD.L	(A1),D2
	MOVE.B	D1,(A0)+
	ADDA.L	#4,A1		; Addq.l ???
	DBRA	D0,lbC003FA2
	MOVEA.L	A2,A0
lbC003FBC
	MOVE.B	#$20,(A0)+
	CMPI.B	#$30,(A0)
	BEQ.S	lbC003FBC
	RTS

lbL003FC8
	dc.l	$989680
	dc.l	$F4240
	dc.l	$186A0
	dc.l	$2710
	dc.l	$3E8
	dc.l	$64
	dc.l	10
	dc.l	1

lbC003FE8
	MOVEM.L	D1-D7/A0-A6,-(SP)
	MOVE.L	#1,D1			; aaargh...
	MOVE.L	4.w,A6
	JSR	-$C6(A6)		; AllocMem
	TST.L	D0
	MOVEM.L	(SP)+,D1-D7/A0-A6
	RTS

	dc.w	$202D
Bytes.MSG
	dc.b	'         Bytes',$A,0
	dc.b	'dos.library',0,0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	0
	dc.b	$11
	dc.b	$94
	dc.b	10
	dc.b	$1B


	dc.b	'[42;33m LHSFX Archive '
	dc.b	$1B
	dc.b	'[0m By '
	dc.b	$1B
	dc.b	'[1mMK, MXM & RT'
	dc.b	$1B
	dc.b	'[0m  '
	dc.b	$A9
	dc.b	'1992',$A,$A,0

	dc.b	10
	dc.b	$1B
	dc.b	'[3mFinished Uncompressing !'
	dc.b	$1B
	dc.b	'[0m',$A,$A,0
	dc.b	$1B
	dc.b	'c',0,0
	dc.b	$1B
	dc.b	'[23H'
	dc.b	$1B
	dc.b	'[41;30m Press Left Mouse Button '
	dc.b	$1B
	dc.b	'[0m',0,0
	dc.b	10
	dc.b	0
	dc.b	10
	dc.b	$1B
	dc.b	'[1mError in Archive!  Bad Checksum or Invali'
	dc.b	'd Filetype.'
	dc.b	$1B
	dc.b	'[0m',$A,$A
	dc.b	7
	dc.b	0
	dc.b	0
	dc.b	10
	dc.b	$1B
	dc.b	'[1mUnable to Allocate Enough Memory!'
	dc.b	$1B
	dc.b	'[0m',$A,$A
	dc.b	7
	dc.b	0

lbC00414C
	MOVEM.L	D2-D7/A2-A6,-(SP)
	PEA	(A0)
	BSR.L	lbC0041E4
	MOVE.L	A1,D0
	move.l	(sp)+,A0
	SUB.L	8(A0),D0
	MOVE.L	D0,12(A0)
	MOVEM.L	(SP)+,D2-D7/A2-A6
	RTS

	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	MOVE.B	(A2)+,(A1)+
	BRA.L	lbC00426C

lbC0041E4
	PEA	(A0)
	MOVEA.L	$10(A0),A6
	MOVEA.L	A6,A0
	LEA	$C60(A6),A1
	LEA	$76E(A6),A2
	MOVEQ	#-2,D0
	MOVEQ	#0,D3
	MOVEQ	#1,D1
	MOVEQ	#2,D2
	MOVE.W	#$13C,D7
lbC004200
	MOVE.W	D1,(A0)+
	MOVE.W	D0,(A1)+
	MOVE.W	D3,-(A2)
	SUB.W	D2,D0
	ADD.W	D2,D3
	DBRA	D7,lbC004200
	MOVEQ	#0,D6
	MOVE.L	#$27A,D7
	MOVEA.L	A6,A0
	LEA	$27A(A6),A1
	LEA	$EDA(A6),A2
	LEA	$76E(A6),A3
	MOVEQ	#4,D4
	MOVEQ	#2,D2
	MOVE.W	#$13B,D1
lbC00422C
	MOVE.W	(A0)+,D0
	ADD.W	(A0)+,D0
	MOVE.W	D0,(A1)+
	MOVE.W	D6,(A2)+
	MOVE.W	D7,(A3)+
	MOVE.W	D7,(A3)+
	ADD.W	D4,D6
	ADD.W	D2,D7
	DBRA	D1,lbC00422C
	MOVE.W	D1,(A1)
	CLR.W	$C5E(A6)
	move.l	(sp)+,A5
	MOVEA.L	(A5),A0
	MOVEA.L	8(A5),A1
	MOVEA.L	$10(A5),A6
	MOVEA.L	A6,A5
	LEA	$76E(A6),A4
	LEA	$C60(A6),A3
	MOVEQ	#1,D4
	MOVEQ	#15,D5
	MOVE.W	(A0)+,D6
	BRA.S	lbC00426C

lbC004264
	NEG.W	D7
	LSR.W	D4,D7
	SUB.W	D4,D7
	MOVE.B	D7,(A1)+
lbC00426C
	MOVE.W	$4F0(A3),D7
lbC004270
	ADD.W	D6,D6
	BCC.L	lbC004288
	MOVE.W	2(A3,D7.W),D7
	DBMI	D5,lbC004270
	BMI.L	lbC004292
lbC004282
	MOVEQ	#15,D5
	MOVE.W	(A0)+,D6
	BRA.S	lbC004270

lbC004288
	MOVE.W	0(A3,D7.W),D7
	DBMI	D5,lbC004270
	BPL.S	lbC004282
lbC004292
	DBRA	D5,lbC00429A
	MOVE.W	(A0)+,D6
	MOVEQ	#15,D5
lbC00429A
	CMPI.W	#$8000,$4F0(A5)
	BEQ.L	lbC0042F8
	MOVE.W	0(A4,D7.W),D0
lbC0042A8
	LEA	0(A5,D0.W),A2
	MOVE.W	(A2),D1
	ADD.W	D4,D1
	MOVE.W	D1,(A2)+
	CMP.W	(A2)+,D1
	BLS.S	lbC0042F2
lbC0042B6
	CMP.W	(A2)+,D1
	BHI.S	lbC0042B6
	SUBQ.L	#4,A2
	MOVE.L	A2,D2
	SUB.L	A5,D2
	MOVE.W	(A2),0(A5,D0.W)
	MOVE.W	D1,(A2)
	MOVE.W	0(A3,D0.W),D1
	BMI.S	lbC0042D0
	MOVE.W	D2,2(A4,D1.W)
lbC0042D0
	MOVE.W	D2,0(A4,D1.W)
	MOVE.W	0(A3,D2.W),D3
	BMI.S	lbC0042DE
	MOVE.W	D0,2(A4,D3.W)
lbC0042DE
	MOVE.W	D1,0(A3,D2.W)
	MOVE.W	D0,0(A4,D3.W)
	MOVE.W	D3,0(A3,D0.W)
	MOVE.W	0(A4,D2.W),D0
	BNE.S	lbC0042A8
	BRA.S	lbC0042F8

lbC0042F2
	MOVE.W	0(A4,D0.W),D0
	BNE.S	lbC0042A8
lbC0042F8
	CMPI.W	#$FE00,D7
	BGE.L	lbC004264
	CMPI.W	#$FD86,D7
	BGT.S	lbC004308
	RTS

lbC004308
	ROL.W	#8,D6
	SUBQ.W	#7,D5
	BCC.S	lbC004328
	MOVEQ	#0,D3
	MOVE.W	(A0)+,D3
	SWAP	D3
	NEG.W	D5
	ROL.L	D5,D3
	MOVE.W	D3,D1
	OR.B	D6,D1
	SWAP	D3
	MOVE.W	D3,D6
	NEG.W	D5
	MOVEQ	#15,D2
	ADD.W	D2,D5
	BRA.S	lbC004336

lbC004328
	MOVEQ	#0,D1
	MOVE.B	D6,D1
	CLR.B	D6
	DBRA	D5,lbC004336
	MOVE.W	(A0)+,D6
	MOVEQ	#15,D5
lbC004336
	MOVE.W	D1,D3
	ADD.W	D3,D3
	MOVE.W	lbW004364(PC,D3.W),D3
	CLR.W	D2
	MOVE.B	D3,D2
	CLR.B	D3
	LSR.W	#2,D3
lbC004346
	ADD.W	D6,D6
	ADDX.W	D1,D1
	DBRA	D5,lbC004352
	MOVEQ	#15,D5
	MOVE.W	(A0)+,D6
lbC004352
	DBRA	D2,lbC004346
	ANDI.W	#$3F,D1
	OR.W	D3,D1
	LEA	(A1),A2
	SUBA.W	D1,A2
	JMP	lbL0043E0(PC,D7.W)

lbW004364
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	0
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$101
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
	dc.w	$201
lbL0043E0
	dc.l	$2010201
	dc.l	$3010301
	dc.l	$3010301
	dc.l	$3010301
	dc.l	$3010301
	dc.l	$3010301
	dc.l	$3010301
	dc.l	$3010301
	dc.l	$3010301
	dc.l	$4020402
	dc.l	$4020402
	dc.l	$4020402
	dc.l	$4020402
	dc.l	$5020502
	dc.l	$5020502
	dc.l	$5020502
	dc.l	$5020502
	dc.l	$6020602
	dc.l	$6020602
	dc.l	$6020602
	dc.l	$6020602
	dc.l	$7020702
	dc.l	$7020702
	dc.l	$7020702
	dc.l	$7020702
	dc.l	$8020802
	dc.l	$8020802
	dc.l	$8020802
	dc.l	$8020802
	dc.l	$9020902
	dc.l	$9020902
	dc.l	$9020902
	dc.l	$9020902
	dc.l	$A020A02
	dc.l	$A020A02
	dc.l	$A020A02
	dc.l	$A020A02
	dc.l	$B020B02
	dc.l	$B020B02
	dc.l	$B020B02
	dc.l	$B020B02
	dc.l	$C030C03
	dc.l	$C030C03
	dc.l	$D030D03
	dc.l	$D030D03
	dc.l	$E030E03
	dc.l	$E030E03
	dc.l	$F030F03
	dc.l	$F030F03
	dc.l	$10031003
	dc.l	$10031003
	dc.l	$11031103
	dc.l	$11031103
	dc.l	$12031203
	dc.l	$12031203
	dc.l	$13031303
	dc.l	$13031303
	dc.l	$14031403
	dc.l	$14031403
	dc.l	$15031503
	dc.l	$15031503
	dc.l	$16031603
	dc.l	$16031603
	dc.l	$17031703
	dc.l	$17031703
	dc.l	$18041804
	dc.l	$19041904
	dc.l	$1A041A04
	dc.l	$1B041B04
	dc.l	$1C041C04
	dc.l	$1D041D04
	dc.l	$1E041E04
	dc.l	$1F041F04
	dc.l	$20042004
	dc.l	$21042104
	dc.l	$22042204
	dc.l	$23042304
	dc.l	$24042404
	dc.l	$25042504
	dc.l	$26042604
	dc.l	$27042704
	dc.l	$28042804
	dc.l	$29042904
	dc.l	$2A042A04
	dc.l	$2B042B04
	dc.l	$2C042C04
	dc.l	$2D042D04
	dc.l	$2E042E04
	dc.l	$2F042F04
	dc.l	$30053105
	dc.l	$32053305
	dc.l	$34053505
	dc.l	$36053705
	dc.l	$38053905
	dc.l	$3A053B05
	dc.l	$3C053D05
	dc.l	$3E053F05
how_can_someone_do_such_shit:
	dc.l	$3EC
	dc.l	$1D
	dc.l	0
	dc.l	8
	dc.l	14
	dc.l	$1E
	dc.l	$2E
	dc.l	$34
	dc.l	$3E
	dc.l	$BA
	dc.l	$CC
	dc.l	$E2
	dc.l	$F8
	dc.l	$112
	dc.l	$11C
	dc.l	$136
	dc.l	$140
	dc.l	$14A
	dc.l	$15E
	dc.l	$168
	dc.l	$1B2
	dc.l	$1BC
	dc.l	$1C6
	dc.l	$1D4
	dc.l	$1EE
	dc.l	$204
	dc.l	$21E
	dc.l	$22C
	dc.l	$23A
	dc.l	$244
	dc.l	$262
	dc.l	$268
	dc.l	1
	dc.l	1
	dc.l	2
	dc.l	1
	dc.l	2
	dc.l	$44
	dc.l	0
	dc.l	$3F2
	dc.l	$3EB
	dc.l	$465
	dc.l	$3F2
	dc.l	$3EA
	dc.l	1
end_of_sfx
sfx_len= end_of_sfx-sfx_hunk
