ùúùú  L                                    ;
;
;Create New Dictonary v 1.2  (2-4-98)
;
;Program ten doîacza wyrazy z biblioteki
;dodatkowej do podstawowej. 
;
;copyright Jaroslaw Paruzel
;47-100 Strzelce Opolskie
;K. Wyszynskiego 8/34
;	POLAND
;e-mail: yarex@zero.bg.po.opole.pl
;	 jarekp@bet.po.opole.pl
;

		INCDIR	INCLUDE:
		INCLUDE	exec.offs
		INCLUDE	dos.offs

		INCLUDE	libraries/dos.i
		INCLUDE	libraries/dosextens.i

		INCLUDE	exec/exec.i


Exec_Base		equ	4
DBufferSize		equ	9046

		STRUCTURE	CNDict,0
		LONG	Dos_Base
		LONG	FileHD

		LONG	PrefDEnd
		LONG	PrefDStart

		LONG	ProgWEnd
		LONG	ProgWStart

		LONG	UserWEnd
		LONG	UserWStart

		LONG	WordArrayEnd
		LONG	WordArray
		LONG	HeaderBase

		LONG	UserN
		LONG	ProgN
		LONG	WordCount
		LONG	Tabl
		LONG	ConBase
		LONG	ConBase1
		STRUCT	SortArray,256	
		STRUCT	DBuffer,DBufferSize+1024
		LABEL	CNDict_SIZEOFF		



;
;odszukanie naszego zadania
;
			movem.l	d1-d7/a0-a6,-(sp)
			suba.l	a1,a1
			movea.l	[Exec_Base].w,a6
			jsr	_LVOFindTask(a6)
			movea.l	d0,a4
;
;testowanie czy zadanie uruchomione zostaîo
;z cli czy z workbencha
;
			moveq	#0,d0
			tst.l	pr_CLI(a4)
			bne.s	FromCLI			;Uruchamiajac pod ASM ONE
;						zmienic na - beq FromCLI
;
;jezeli z workbencha to pobranie wiadomosci
;
			lea	pr_MsgPort(a4),a0
			jsr	_LVOWaitPort(a6)
			lea	pr_MsgPort(a4),a0
			jsr	_LVOGetMsg(a6)

FromCLI			lea	TaskBase(pc),a0
			move.l	d0,(a0)

			move.l	#CNDict_SIZEOFF,d0
			move.l	#MEMF_PUBLIC+MEMF_CLEAR,d1
			bsr.W	AllocMemory
			beq.W	ErrAllocMem
			move.l	d0,a5

;Set sortarray
			lea	SortArray(a5),a1
			lea	AsciiTabela(pc),a0

			moveq	#0,d0
			moveq	#0,d1
SetSALoop		addq.l	#1,d0
			move.b	(a0)+,d1
			beq.s	EndSetSA
			move.b	d0,(a1,d1.w)
			bra.s	SetSALoop
EndSetSA
;
;Open dos.library
			lea	DosName(pc),a1
			moveq	#0,d0
			move.l	[Exec_Base].w,a6
			jsr	_LVOOpenLibrary(a6)
			move.l	d0,Dos_Base(a5)
			beq.W	ErrOpenDos

;Open output console

			move.l	d0,a6
			jsr	_LVOOutput(a6)
			move.l	d0,ConBase(a5)		
			bne.s	ConOpen
			lea	Console(pc),a1
			move.l	a1,d1
			move.l	#MODE_NEWFILE,d2
			jsr	_LVOOpen(a6)
			move.l	d0,ConBase1(a5)
ConOpen			

;load pref file 
			lea	LoadFile(pc),a1
			bsr.W	WriteText
			lea	FileName(pc),a1
			bsr.W	WritelnText
			bsr.W	OpenAndRead
			beq.W	ErrOpenPrefF

;encrypt pref file	
			add.l	a1,d0
			move.l	a1,PrefDStart(a5)
			move.l	d0,PrefDEnd(a5)

			move.l	d0,a2
			move.l	a1,a3
			addq.l	#8,a3
Loopxx			moveq	#-1,d1
Loopx1			addq.l	#1,d1
			eor.b	d1,(a3)+
			cmp.l	a2,a3
			bgt.b	EndDec
			tst.b	-1(a3)
			beq.b	Loopxx
			bra.b	Loopx1
EndDec			
			bsr.W	FindZero			
			move.l	a1,ProgN(a5)
			bsr.W	FindZero
			move.l	a1,UserN(a5)

			lea	LoadFile(pc),a1
			bsr.W	WriteText
			move.l	UserN(a5),a1
			bsr.W	WritelnText
			bsr.W	OpenAndRead

			add.l	a1,d0
			movem.l	d0/a1,UserWEnd(a5)

			lea	LoadFile(pc),a1
			bsr.W	WriteText
			move.l	ProgN(a5),a1
			bsr.W	WritelnText
			bsr.W	OpenAndRead
			beq.W	ErrOpenProgF

			add.l	a1,d0
			movem.l	d0/a1,ProgWEnd(a5)

			moveq	#0,d7

			movem.l	ProgWEnd(a5),a0/a1
			cmp.l	#$ffffffff,4(a1)
			bne.b	NoHeader
			add.l	(a1),a1

NoHeader		bsr.w	CountWord
			movem.l	UserWEnd(a5),a0/a1

			cmp.l	a0,a1
			beq.b	UserNotF

			bsr.w	CountWord

UserNotF		move.l	d7,WordCount(a5)
			move.l	d7,d0
			lea	DigitBuffer(pc),a0
			bsr.w	LongToAscii
			clr.b	(a0)+
			lea	IntoText(pc),a1
			bsr.W	WritelnText

			move.l	WordCount(a5),d0
			lsl.l	#2,d0
			move.l	#MEMF_PUBLIC,d1
			move.l	d0,-(sp)
			bsr.W	AllocMemory
			move.l	(sp)+,a1
			tst.l	d0
			beq.W	ErrAllocMemFA
			move.l	d0,WordArray(a5)
			add.l	d0,a1
			move.l	a1,WordArrayEnd(a5)

			move.l	d0,a2

			movem.l	ProgWEnd(a5),a0/a1

			cmp.l	#$ffffffff,4(a1)
			bne.b	NoHeaderFA
			add.l	(a1),a1

NoHeaderFA		bsr.w	FillArray
			movem.l	UserWEnd(a5),a0/a1

			cmp.l	a1,a0
			beq.b	UserNotF1
			
			bsr.w	FillArray


UserNotF1		lea	SortingWord(pc),a1
			bsr.W	WritelnText

			bsr.w	SortWordArray

			lea	Finished(pc),a1
			bsr.W	WritelnText
			
			move.l	WordArray(a5),a3
			move.l	WordCount(a5),d3
			moveq	#0,d1
			moveq	#20,d0
GetNextItem		tst.l	d3
			beq.b	EndCalcHeader
			subq.l	#1,d3
			move.l	(a3)+,a0
			
			moveq	#0,d2
			move.b	(a0),d2
			lsl.l	#8,d2
			move.b	1(a0),d2
			beq.s	CHZero			
			lsl.l	#8,d2
			move.b	2(a0),d2
			beq.s	CHZero1
			lsl.l	#8,d2
			move.b	3(a0),d2
			bra.b	CHZero2
CHZero			lsl.l	#8,d2
CHZero1			lsl.l	#8,d2
CHZero2			and.l	#$dfdfdfdf,d2

			cmp.l	d1,d2
			beq.s	GetNextItem
			move.l	d2,d1
			addq.l	#8,d0
			bra.s	GetNextItem
EndCalcHeader		
			move.l	#MEMF_PUBLIC,d1
			move.l	d0,-(sp)
			bsr.W	AllocMemory
			move.l	(sp)+,d1
			move.l	d0,HeaderBase(a5)
			beq.W	ErrAllocMemFH
			move.l	d0,a2
			move.l	d1,(a2)+
			move.l	#$ffffffff,(a2)+
			clr.l	(a2)+
			
			move.l	WordArray(a5),a3
			move.l	WordCount(a5),d3
			moveq	#0,d0
			moveq	#0,d1
GetNextItemCrH		tst.l	d3
			beq.b	EndCreateHeader
			subq.l	#1,d3
			move.l	(a3)+,a0
			
			moveq	#0,d2
			move.b	(a0),d2
			lsl.l	#8,d2
			move.b	1(a0),d2
			beq.s	CrHZero			
			lsl.l	#8,d2
			move.b	2(a0),d2
			beq.s	CrHZero1
			lsl.l	#8,d2
			move.b	3(a0),d2
			bra.b	CrHZero2
CrHZero			lsl.l	#8,d2
CrHZero1		lsl.l	#8,d2		
CrHZero2		and.l	#$dfdfdfdf,d2

			cmp.l	d1,d2
			beq.s	CSLoop
			move.l	d2,d1
			move.l	d2,(a2)+
			move.l	d0,(a2)+
			move.w	d0,$dff180
CSLoop			addq.l	#1,d0
			tst.b	(a0)+
			bne.b	CSLoop

			bra.s	GetNextItemCrH
EndCreateHeader		clr.l	(a2)+
			move.l	d0,(a2)

;			lea	TestN(pc),a0
;			move.l	a0,ProgN(a5)

			lea	SaveFile(pc),a1
			bsr.W	WriteText
			move.l	ProgN(a5),a1
			bsr.W	WritelnText
			move.l	ProgN(a5),a1
			move.l	a1,d1
			move.l	#MODE_NEWFILE,d2
			bsr.W	OpenFile
			move.l	d0,FileHD(a5)
			beq.s	Err_OpFilex

			move.l	HeaderBase(a5),a1
			move.l	a1,d2
			move.l	(a1),d3
			bsr.W	WriteFile

		
			move.l	WordArray(a5),a0
			move.l	WordCount(a5),d0


WriteNext_1		lea	DBuffer(a5),a1
			moveq	#0,d3
			move.l	a1,d2

WriteNext		tst.l	d0
			beq.b	EndWrite
			subq.l	#1,d0
			move.l	(a0)+,a3

CopyLoop		addq.l	#1,d3
			move.b	(a3)+,(a1)+
			bne.b	CopyLoop

			cmp.l	#DBufferSize,d3
			bcs.b	WriteNext

			movem.l	d0/a0,-(sp)
			bsr.w	WriteFile
			movem.l	(sp)+,a0/d0
			bra.b	WriteNext_1

EndWrite		tst.l	d3
			beq.b	AllDataWrite

			bsr.w	WriteFile
			
AllDataWrite		bsr.W	CloseFile	




Err_OpFilex		move.l	HeaderBase(a5),a1
			move.l	(a1),d0
			move.l	[Exec_Base].w,a6
			jsr	_LVOFreeMem(a6)




ErrAllocMemFH		lea	WordArrayEnd(a5),a0
			bsr.w	FreeMemX
			
ErrAllocMemFA

			lea	ProgWEnd(a5),a0
			bsr.w	FreeMemX
			
ErrOpenProgF		lea	UserWEnd(a5),a0
			bsr.w	FreeMemX

ErrOpenUserF		lea	PrefDEnd(a5),a0
			bsr.w	FreeMemX
			
ErrOpenPrefF		tst.l	ConBase1(a5)
			beq.s	Not_OpenCon
			move.l	Dos_Base(a5),a6
			move.l	#50*5,d1
			jsr	_LVODelay(a6)
			move.l	ConBase1(a5),d1
			jsr	_LVOClose(a6)

Not_OpenCon		move.l	[Exec_Base].w,a6
			move.l	Dos_Base(a5),a1
			jsr	_LVOCloseLibrary(a6)
			move.l	a5,a1
			move.l	#CNDict_SIZEOFF,d0
			move.l	[Exec_Base].w,a6
			jsr	_LVOFreeMem(a6)

ErrAllocMem		moveq	#1,d0

ErrOpenDos		subq.l	#1,d0

			move.l	TaskBase(pc),d0
			move.l	[Exec_Base].w,a6
			beq.s	FromCLI1
			jsr	_LVOForbid(a6)
			movea.l	TaskBase(pc),a1
			jsr	_LVOReplyMsg(a6)
FromCLI1		movem.l	(sp)+,d1-d7/a0-a6
			moveq	#0,d0
			rts
;
;
;
CountWord		cmp.b	#$0a,(a1)
			bne.b	No0a
			clr.b	(a1)		
No0a			cmp.l	a0,a1
			bcc.b	EndCountW
			tst.b	(a1)+	
			bne.b	CountWord
			addq.l	#1,d7
			bra.b	CountWord
EndCountW		rts
;
;
;
FillArray		cmp.l	a0,a1
			bcc.b	EndFillArray
			tst.b	(a1)
			beq.b	FindZeroFA
			move.l	a1,(a2)+
FindZeroFA		cmp.l	a0,a1
			bcc.b	EndFillArray
			tst.b	(a1)+
			bne.b	FindZeroFA
			bra.b	FillArray

EndFillArray		rts
;
;Sortowanie wyrazów metodâ "Szybkâ"
;
SortWordArray		
			move.l	WordCount(a5),d0
			move.l	WordArray(a5),a0

			lea	SortArray(a5),a3
			subq.l	#1,d0
			move.l	d0,d1
Sort_Loop		cmpi.l	#1,d1
			blt.s	Sort_Exit
			lsr.l	#1,d1
Sort_Loop2		moveq	#0,d2
			move.l	d0,d3
			sub.l	d1,d3
Sort_Loop1		move.l	d3,d4
			lsl.l	#2,d4
			lea	$00(a0,d4.l),a1
			move.l	d3,d4
			add.l	d1,d4
			lsl.l	#2,d4
			lea	$00(a0,d4.l),a2
			movem.l	a1-a2,-(sp)
			cmpa.l	a1,a2
			beq.s	Sort_omin
			movea.l	(a1),a1
			movea.l	(a2),a2
			moveq	#0,d4
			moveq	#0,d5
Sort_Loop3		move.b	(a2)+,d4
			andi.b	#223,d4
			move.b	$00(a3,d4.w),d5
			move.b	(a1)+,d4		
			andi.b	#223,d4
			cmp.b	$00(a3,d4.w),d5
			beq.s	Sort_Loop3				
			bhi.s	Sort_omin
			movem.l	(sp),a1-a2
			move.l	(a1),d5
			move.l	(a2),(a1)
			move.l	d5,(a2)
			move.w	d5,$dff180
			moveq	#1,d2
Sort_omin		addq.l	#8,sp
			subq.l	#1,d3
			bcc.b	Sort_Loop1
			tst.l	d2
			beq.s	Sort_Loop			
			bra.s	Sort_Loop2
Sort_Exit		rts
;
;
;
FindZero		tst.b	(a1)+
			bne.s	FindZero
			rts
;
;a1 - filename
;rezultat a1 - adress , d0 - dîugoôê 0 gdy bîâd
;
OpenAndRead		move.l	a1,d1
			move.l	#MODE_OLDFILE,d2
			bsr.s	OpenFile
			move.l	d0,FileHD(a5)
			beq.s	Err_OpFile
			moveq	#OFFSET_END,d3
			bsr.W	SeekFile
			bmi.s	Err_Seek
			moveq	#OFFSET_BEGINNING,d3
			bsr.W	SeekFile
			bmi.s	Err_Seek		
			beq.s	Err_Seek
			move.l	d0,-(sp)

			move.l	#MEMF_PUBLIC,d1
			bsr.W	AllocMemory
			move.l	(sp)+,d3
			move.l	d0,d2
			beq.s	Err_Seek
			move.l	d2,-(sp)
			move.l	d3,-(sp)
			bsr.s	ReadFile
			movem.l	(sp),a1/d1
			cmp.l	d0,d1
			bne.s	Err_Read
			bsr.s	CloseFile		
			movem.l	(sp)+,a1/d0
			tst.l	d0
			rts

Err_Read		addq.l	#8,sp
			move.l	d1,d0
			move.l	[Exec_Base].w,a6
			jsr	_LVOFreeMem(a6)
Err_Seek		bsr.s	CloseFile
Err_OpFile		moveq	#0,d0
			rts
;
OpenFile		move.l	d1,-(sp)
			movea.l	Dos_Base(a5),a6
			jsr	_LVOOpen(a6)
			tst.l	d0
			bne.s	OpenFileOk
			lea	TextOpenFile(pc),a1
			bsr.s	WriteText
			move.l	(sp),a1
			bsr.s	WriteText
			lea	TextError(pc),a1
			bsr.s	WritelnText			
OpenFileOk		addq.l	#4,sp
			rts

CloseFile		move.l	FileHD(a5),d1
			movea.l	Dos_Base(a5),a6
			jmp	_LVOClose(a6)

ReadFile		move.l	d3,-(sp)
			move.l	FileHD(a5),d1
			movea.l	Dos_Base(a5),a6
			jsr	_LVORead(a6)
			cmp.l	(sp),d0
			beq.s	ReadFileOk
			lea	TextReadError(pc),a1
			bsr.s	WritelnText			
ReadFileOk		addq.l	#4,sp
			rts

WriteFile		move.l	d3,-(sp)
			move.l	FileHD(a5),d1
			move.l	Dos_Base(a5),a6
			jsr	_LVOWrite(a6)
			cmp.l	(sp),d0
			beq.s	WriteFileOk
			lea	TextWriteError(pc),a1
			bsr.s	WritelnText			
WriteFileOk		addq.l	#4,sp
			rts

SeekFile		move.l	FileHD(a5),d1
			moveq	#0,d2
			movea.l	Dos_Base(a5),a6
			jsr	_LVOSeek(a6)
			tst.l	d0
			rts

WritelnText		bsr.s	WriteText
			movem.l	d0-d7/a0-a6,-(sp)
			lea	LNText(pc),a1
			bra.s	WriteText1
			

WriteText		movem.l	d0-d7/a0-a6,-(sp)
WriteText1		move.l	ConBase(a5),d1
			add.l	ConBase1(a5),d1
			beq.s	No_WriteText
			move.l	a1,d2
			moveq	#-1,d3
GetSizeString		addq.l	#1,d3
			tst.b	(a1)+
			bne.s	GetSizeString
			move.l	Dos_Base(a5),a6
			jsr	_LVOWrite(a6)
No_WriteText		movem.l	(sp)+,d0-d7/a0-a6
			rts

AllocMemory		movea.l	[Exec_Base].w,a6
			jsr	_LVOAllocMem(a6)
			tst.l	d0
			bne.b	AMOK
			lea	NoEnoughtMemory(pc),a1
			bsr.b	WritelnText
			moveq	#0,d0
AMOK			rts

;
;
FreeMemX		
			movem.l	(a0),d0/a1
			sub.l	a1,d0
			beq.b	FreeMemEsc
			clr.l	(a0)+
			clr.l	(a0)
			move.l	[Exec_Base].w,a6
			jsr	_LVOFreeMem(a6)
FreeMemEsc		rts

;
;Zamiana dîugiej liczby na ciag ASCII
;A0 -Poczatek 10 bajtowego bufora
;d0 -Liczba do konwersji
;
LongToAscii		movem.l	d1-d4,-(sp)
			move.l	#1000000000,d2
			moveq	#0,d4
LongToAscii_Loop	move.l	d2,d1
			bsr.s	UDIVMOD32
			tst.l	d4
			bne.s	DIGITZERO
			tst.l	d0
			beq.s	NODIGITZERO
			moveq	#1,d4
DIGITZERO		move.b	d0,(a0)
			add.b	#'0',(a0)+
NODIGITZERO		move.l	d2,d0
			move.l	d1,d3
			moveq	#10,d1
			bsr.s	UDIVMOD32
			move.l	d0,d2
			move.l	d3,d0
			tst.l	d2
			bne.s	LongToAscii_Loop
			tst.l	d4
			bne.s	NOZero
			move.b	#'0',(a0)+
NOZero			movem.l	(sp)+,d1-d4
			rts
;
;UDIVMOD32
;D0-DIVINDEND,D1-DIVISOR
;
UDIVMOD32
lbC00002C		MOVE.L	D3,-(SP)
			CMPI.L	#$FFFF,D1
			BHI.s	lbC000052
			MOVE.L	D1,D3
			SWAP	D0
			MOVE.W	D0,D3
			BEQ.s	lbC000042
			DIVU.W	D1,D3
			MOVE.W	D3,D0
lbC000042		SWAP	D0
			MOVE.W	D0,D3
			DIVU.W	D1,D3
			MOVE.W	D3,D0
			SWAP	D3
			MOVE.W	D3,D1
			MOVE.L	(SP)+,D3
			RTS

lbC000052		MOVE.L	D2,-(SP)
			MOVE.L	D1,D3
			MOVE.L	D0,D1
			CLR.W	D1
			SWAP	D1
			SWAP	D0
			CLR.W	D0
			MOVEQ	#15,D2
lbC000062		ADD.L	D0,D0
			ADDX.L	D1,D1
			CMP.L	D1,D3
			BHI.s	lbC00006E
			SUB.L	D3,D1
			ADDQ.W	#1,D0
lbC00006E		DBRA	D2,lbC000062
			MOVEM.L	(SP)+,D2/D3
			RTS

TaskBase		dc.l	0			
;
DosName			dc.b	'dos.library',0
FileName		dc.b	's:orto.cfg',0
TestN			dc.b	'dh0:testort',0

AsciiTabela		dc.b	'AaÂâBbCcÊêDdEeËëFfGgHhIiJjKkLlÎîMmNn'
			dc.b	'ÏïOoÓóPpQqRrSsÔôTtUuVvWwXxYyZzÚúÛû-',0
TextOpenFile		dc.b	'  Open File -> ',0
TextReadError		dc.b	'  Read Error !',0
TextWriteError		dc.b	'  Write Error !',0  
TextError		dc.b	' Error !',0
LoadFile		dc.b	'Load File -> ',0
SaveFile		dc.b	'Save File -> ',0
NoEnoughtMemory		dc.b	"  I CAN NOT allocate memory!",0
SortingWord		dc.b	"Sorting word array, please wait.",0
Finished		dc.b	"Finished sorting",$a
			dc.b	"Creating header, please wait",0
IntoText		dc.b	"Into librarys are -"
DigitBuffer		dc.b	"0000000000000000000"

Console			dc.b	'CON:0/0/640/100/Create New Dictonary V2.3 by Jaroslaw Paruzel',0
LNText			dc.b	$0a,0
Digits			blk.b	11,0
