;	EXEC
FindTask	=-294
Wait		=-318
Signal		=-324
AddPort		=-354
RemPort		=-360
FindPort	=-390
OldOpenLibrary	=-408
CloseLibrary	=-414
OpenLibrary	=-552
CacheClearU	=-636

;	DOS
Open		=-30
Close		=-36
Read		=-42
Write		=-48
Output		=-60
Lock		=-84
UnLock		=-90
Examine		=-102
SetComment	=-180
SetFiledate	=-396

;	INTUITION
DisplayAlert	=-90

;	DISKFONT
AvailFonts	=-36


;	ZMIENNE
fileinfoblock	=0
buffer		=262
bufbytes	=266
file		=270
filesize	=274

varsize		=278

OLDSYS		=34
NEWSYS		=36

	move.b	#NEWSYS,system
	lea	dosname,a1
	moveq	#36,d0
	move.l	4,a6
	jsr	OpenLibrary(a6)		; otworzenie OS2.0 dos.library...
	move.l	d0,dosbase
	tst.l	d0
	bne.s	OS20

	move.b	#OLDSYS,system
	lea	dosname,a1
	move.l	4,a6
	jsr	OldOpenLibrary(a6)	; otworzenie dos.library...
	move.l	d0,dosbase

OS20:
	lea	intname,a1
	move.l	4,a6
	jsr	OldOpenLibrary(a6)	; ...i intuition
	move.l	d0,intbase

	lea	portname,a1		; sprawdzenie, czy w systemie znajduje
	move.l	4,a6			; sië juû port o nazwie
	jsr	FindPort(a6)		; "FontsCat port".
	tst.l	d0
	beq.s	notinstalled

;	Jeôli tak, to program jest juû zainstalowany i naleûy go usunâê

	move.l	d0,a1
	move.l	16(a1),a1
	move.l	4,a6
	move.l	#$1000,d0
	jsr	Signal(a6)		; wysîanie sygnaîu Ctrl-C

	bsr.w	closelibraries		; zamkniëcie bibliotek

	clr.l	d0			; wyjôcie z programu
	rts

;	Instalowanie programu

notinstalled:
	lea	installinfo,a0
	bsr.w	CLIoutput		; wysîanie informacji o zainstalowaniu

	suba.l	a1,a1
	move.l	4,a6
	jsr	FindTask(a6)		; znalezienie struktury wîasnego tasku
	move.l	d0,Task

	lea	myport,a1
	jsr	AddPort(a6)		; dodanie do systemu wîasnego portu

	lea	diskfontname,a1
	move.l	4,a6
	jsr	OldOpenLibrary(a6)	; otworzenie diskfont.library
	tst.l	d0
	beq.w	nodiskfont
	move.l	d0,diskfontbase

	move.l	diskfontbase,a6
	move.l	AvailFonts+2(a6),AvailFontsAdr
					; zachowanie oryginalnego adresu
					; funkcji AvailFonts
	move.l	#MyAvailFonts,AvailFonts+2(a6)
					; i "podwieszenie" wîasnej procedury
	bsr.w	cacheclear		; wyczyszczenie cache

loop_wait:
	move.l	#$1000,d0
	move.l	4,a6
	jsr	Wait(a6)		; czekanie na Ctrl-C

deinstall:
	move.l	diskfontbase,a6
	cmp.l	#MyAvailFonts,AvailFonts+2(a6)
					; sprawdzenie, czy jakiô inny program
					; nie zmieniî wektora AvailFonts
	beq.s	remove

	move.l	intbase,a6
	moveq	#0,d0
	moveq	#31,d1
	lea	cannotremove,a0
	jsr	DisplayAlert(a6)	; jeôli tak - wyôwietlenie komunikatu
	bra.s	loop_wait		; i dalsze czekanie

;	Usuwanie programu i powrót do systemu

remove:
	move.l	diskfontbase,a6
	move.l	AvailFontsAdr,AvailFonts+2(a6)
					; przywrócenie oryginalnej wartoôci
					; wektorowi funkcji AvailFonts
	bsr.w	cacheclear		; wyczyszczenie cache
	lea	myport,a1
	move.l	4,a6
	jsr	RemPort(a6)		; usuniëcie MsgPort'u

	lea	removeinfo,a0
	bsr.b	CLIoutput		; powiadomienie o usuniëciu programu

	move.l	diskfontbase,a1
	move.l	4,a6
	jsr	CloseLibrary(a6)	; zamkniëcie diskfont.library

nodiskfont:
	bsr.b	closelibraries		; i pozostaîych bibliotek

	clr.l	d0

	rts				; * K * O * N * I * E * C *       :-)

; Czyszczenie cache procesora

cacheclear:
	move.l	4,a6
	cmp.w	#37,20(a6)
	blt.s	cacheend
	jsr	CacheClearU(a6)
cacheend:
	rts

;	Zamkniëcie bibliotek

closelibraries:
	move.l	dosbase,a1
	move.l	4,a6
	jsr	CloseLibrary(a6)

	move.l	intbase,a1
	move.l	4,a6
	jsr	CloseLibrary(a6)
	rts

;	Procedura wyôwietlajâca komunikat w oknie CLI

;	Wejôcie: a0 - adres komunikatu zakoïczonego zerem

;	uûyte rejestry: d0,d1,d2,d3,a0,a1,a6

CLIoutput:
	move.l	a0,-(sp)
	moveq	#-1,d0
out_loop:
	add.l	#1,d0
	tst.b	(a0)+
	bne.s	out_loop
	move.l	d0,-(sp)
	move.l	dosbase,a6
	jsr	Output(a6)
	tst.l	d0
	beq.s	out_err
	move.l	d0,d1
	move.l	(sp)+,d3
	move.l	(sp)+,d2
	move.l	dosbase,a6
	jsr	Write(a6)
	rts
out_err:
	move.l	(sp)+,d0
	move.l	(sp)+,d1
	rts

;	Procedura zastëpujâca Availfonts

MyAvailFonts:
	btst	#1,d1			; czcionki z dysku ?
	bne.b	DiskFonts
	move.l	a5,-(sp)		; jeôli program domaga sië czcionek
	move.l	AvailFontsAdr,a5	; z ROM'u - wywoîywana jest oryginalna
	jsr	(a5)			; funkcja AvailFonts
	move.l	(sp)+,a5
	rts				; powrót

;	Czcionki z dysku

diskfonts:
	move.l	a4,-(sp)
	sub.l	#varsize,sp
	move.l	sp,a4

	movem.l	d1-d3/d7/a0/a1/a6,-(sp)

	move.l	a0,buffer(a4)		; zapamiëtanie wartoôci przekazywanych
	move.l	d0,bufbytes(a4)		; do procedury (w a0 - adres bufora
					; na listë fontów, w d0 - jego rozmiar)
	lea	fontscat,a0
	bsr.w	fsize
	
	move.l	132(a0),d1
	move.l	136(a0),d2
	move.l	140(a0),d3

	lea	fontscatname,a0
	bsr.w	FSize			; sprawdzenie dîugoôci pliku z
					; katalogiem fontów
	cmp.b	#OLDSYS,system
	beq.s	nocompdate

	cmp.l	132(a0),d1		; porównanie dat
	bne.w	nocatalog
	cmp.l	136(a0),d2
	bne.w	nocatalog
	cmp.l	140(a0),d3
	bne.w	nocatalog

nocompdate:
	cmp.l	bufbytes(a4),d0
	bge.b	nomem			; jeôli bufor jest zbyt maîy - wyjôcie

	move.l	#fontscatname,d1
	move.l	#$3ed,d2		; MODE=OldFile
	move.l	dosbase,a6
	jsr	Open(a6)		; otworzenie katalogu do odczytu
	tst.l	d0
	beq.s	nocatalog
	move.l	d0,file(a4)

	move.l	file(a4),d1
	move.l	buffer(a4),d2
	move.l	filesize(a4),d3
	move.l	dosbase,a6
	jsr	Read(a6)		; odczytanie katalogu do bufora

	move.l	file(a4),d1
	move.l	dosbase,a6
	jsr	Close(a6)		; zamkniëcie pliku

;	Wpisanie adresów nazw czcionek do struktur TextAttr

	move.l	buffer(a4),a0
	move.w	(a0)+,d0		; d0 - iloôê fontów
	move.l	a0,a1
	move.w	d0,d7
	sub.w	#1,d7			; trzeba odjâê 1, bo uûywamy DBF
	ext.l	d0
	mulu	#10,d0			; iloôê fontów *10 (dîugoôê TextAttr)
	add.l	d0,a1			; + adres bufora daje adres nazwy
					; pierwszego fontu
seloop2:
	move.l	a1,2(a0)		; wpisywanie kolejnych adresów
	adda.l	#10,a0
seloop:
	tst.b	(a1)+			; szukanie nastëpnej nazwy fontu
	bne.s	seloop
	dbf	d7,seloop2
;-----------------------------
	movem.l	(sp)+,d1-d3/d7/a0/a1/a6
	add.l	#varsize,sp
	move.l	(sp)+,a4
	clr.l	d0			; brak bîëdu
	rts				; powrót

;	Bufor jest zbyt maîy, wiëc nie moûna wczytaê katalogu.

nomem:
	movem.l	(sp)+,d1-d3/d7/a0/a1/a6
	move.l	filesize(a4),d0		; w d0 zwracany jest wymagany
	add.l	#varsize,sp		; rozmiar bufora
	move.l	(sp)+,a4
	rts				; powrót

;	Katalogu czcionek nie ma na dysku, wiëc trzeba go stworzyê

nocatalog:
	movem.l	(sp)+,d1-d3/d7/a0/a1/a6
	move.l	bufbytes(a4),d0
	moveq	#-1,d1
	move.l	a5,-(sp)
	move.l	AvailFontsAdr,a5
	jsr	(a5)			; skok do systemowego AvailFonts
	move.l	(sp)+,a5
	tst.l	d0
	beq.s	writecatalog		; jeôli d0=0 - moûna przystâpiê do
					; nagrywania katalogu.
	add.l	#varsize,sp
	move.l	(sp)+,a4
	rts				; powrót

writecatalog:
	movem.l	d0-d3/d7/a0-a2/a6,-(sp)
	move.l	#fontscatname,d1
	move.l	#$3ee,d2		; MODE=NewFile
	move.l	dosbase,a6
	jsr	Open(a6)		; otworzenie nowego pliku z fontami
	tst.l	d0
	beq.w	cannotwrite
	move.l	d0,file(a4)

	move.l	buffer(a4),a0
	move.w	(a0)+,d0		; obliczenie dîugoôci listy fontów
	ext.l	d0			; (ale bez ich nazw)
	mulu	#10,d0
	add.l	#2,d0

	move.l	file(a4),d1
	move.l	buffer(a4),d2
	move.l	d0,d3
	move.l	dosbase,a6
	jsr	Write(a6)		; nagranie listy fontów (wszystkich
					; struktur TextAttr)
;-------Nagrywanie nazw czcionek-------

	move.l	buffer(a4),a0
	move.w	(a0)+,d7		; iloôê fontów do d7
	sub.w	#1,d7			; -1, bo uûywane z DBF
writeloop:
	move.l	2(a0),a1		; adres nazwy fontu ze struktury
	move.l	a1,a2			; TextAttr do a1 i a2
	clr.l	d0
; Search for end of text
sloop:	addq	#1,d0			; szukanie koïca nazwy
	tst.b	(a1)+
	bne.s	sloop

; ----- a2 - adres nazwy fontu ; d0 - dîugoôê nazwy -----

	move.l	a0,-(sp)
	move.l	file(a4),d1
	move.l	a2,d2
	move.l	d0,d3
	move.l	dosbase,a6
	jsr	Write(a6)		; nagranie nazwy do pliku
	move.l	(sp)+,a0

	adda.l	#10,a0			; obliczenie adresu nastëpnej
					; struktury TextAttr
	dbf	d7,writeloop		; i powrót

;--------------------------------

	move.l	file(a4),d1
	move.l	dosbase,a6
	jsr	Close(a6)		; zamkniëcie pliku

	cmp.b	#OLDSYS,system
	beq.s	nosetdate

	lea	fontscatname,a0
	bsr.b	fsize

	add.l	#132,a0
	move.l	a0,d2
	move.l	#fontscat,d1
	jsr	SetFileDate(a6)		; ustawienie daty

nosetdate:
cannotwrite:
	movem.l	(sp)+,d0-d3/d7/a0-a2/a6
	add.l	#varsize,sp
	move.l	(sp)+,a4
	rts

;	Funkcja podajâca dîugoôê pliku

; wejôcie: a0 - nazwa pliku
; wyjôcie: dîugoôê pliku w d0 oraz pod etykietâ filesize
;	   a0 - fileinfoblock

fsize:
	movem.l	d1/d2/a1/a6,-(sp)

	move.l	a0,d1
	moveq	#-2,d2
	move.l	dosbase,a6
	jsr	Lock(a6)
	tst.l	d0
	beq.s	lerr
	move.l	d0,d1

	move.l	d1,-(sp)
	move.l	#fileinfoblock,d2
	add.l	a4,d2
	add.l	#3,d2
	and.l	#$fffffffc,d2
	move.l	dosbase,a6
	jsr	Examine(a6)
	move.l	d2,a0
	move.l	124(a0),filesize(a4)
	move.l	(sp)+,d1

	move.l	a0,-(sp)
	move.l	dosbase,a6
	jsr	Unlock(a6)
	move.l	(sp)+,a0

loadend:
	movem.l	(sp)+,d1/d2/a1/a6
	move.l	filesize(a4),d0
	rts
lerr:
	movem.l	(sp)+,d1/d2/a1/a6
	move.l	#0,filesize(a4)
	clr.l	d0
	rts

diskfontname:
	dc.b	'diskfont.library',0

	even

dosname:
	dc.b	'dos.library',0

	even

intname:
	dc.b	'intuition.library',0

	even

myport:
;	-  Node   -
	dc.l	0		; Succ
	dc.l	0		; Pred
	dc.b	4		; Type=NT_MsgPort
	dc.b	-128		; Pri
	dc.l	PortName	; Name
;	- MsgPort -
	dc.b	2		; Flags=ignore
	dc.b	0		; SigBit
Task:	dc.l	0		; Task
;	-  List   -
Head:	dc.l	Tail		; Head
Tail:	dc.l	0		; Tail
	dc.l	Head		; TailPred
	dc.b	4		; Type=NT_MsgPort
	dc.b	0		; pad

PortName:
	dc.b	'FontsCat port',0

system:
	dc.b	0

fontscat:
	dc.b	'FONTS:',0
fontscatname:
	dc.b	'FONTS:Catalog',0
installinfo:
	dc.b	'FontsCat v.1.0 by PP/TERMOS/UNION succesfully installed.'
	dc.b	10,0
removeinfo:
	dc.b	'FontsCat v.1.0 by PP/TERMOS/UNION succesfully removed.'
	dc.b	10,0
cannotremove:
	dc.b	0,224,13
	dc.b	"WARNING !  I CAN'T EXIT !"
	dc.b	0,1
	dc.b	0,104,23
	dc.b	"Other programs have patched system routines used by me."
	dc.b	0,0

	dc.b	'$VER: FontsCat 1.0 (15.04.95)',0

	even

diskfontbase:
	dc.l	0
intbase:
	dc.l	0
dosbase:
	dc.l	0
availfontsadr:
	dc.l	0
