
**************************************************************************
*                                                                        *
*                        ALib v2.1 (8.89) 16.01.95                       *
*                                                                        *
*     Program sîuûâcy do wyôwietlania, otwierania i usuwania bibliotek.  *
*                                                                        *
*     © 1994, 1995 Tadek Knapik. Public Domain.                          *
*                                                                        *
**************************************************************************


	incdir	Includes:
	include	libraries/dosextens.i
	include	exec/execbase.i
	include	exec/lists.i
	include	exec/memory.i
	include	offsets/exec_lib.i
	include	offsets/dos_lib.i
	include	offsets/intuition_lib.i

SIZE		equ	2048

	section	ALibc,code

Begin:
	bra	Start

VerString:
	dc.b	'$VER: ALib v2.1 (8.89) 16.01.95.',0
Author:
	dc.b	'© 1994,1995 Tadek Knapik. Public Domain.',0

Start:
	move.l	a0,a5				;zapamiëtaie ew. argum.

	bsr	AskWB				;czy spod WB
	tst.l	d0
	bne	WBEnd				;niestety tak..

	move.l	a5,a0				;poczâtek argumentów
	cmpi.b	#10,(a0)			;czy podano argumenty?
	beq	Show				;   Nie ?!?
	cmpi.b	#'?',(a0)			; a moûe podano "?"
	beq	Info				;informacja
	move.l	a0,a5				;adres argumentów
	lea	LibName,a1			;bufor na peînâ nazwë
	lea	AddName(pc),a2			;adres rozszerzenia
	bra	OpenIt				;zaczynam kopiowanie

Again:
	lea	LibName,a1			;bufor na peînâ nazwë
	lea	AddName(pc),a2			;adres rozszerzenia
	cmpi.b	#10,(a5)			;czy znak koïca linii?
	bne	OpenIt				;tak
	moveq	#0,d0				;wyzerowanie
	rts					;wyjôcie

;w a5 - poczâtek argumentu, a1 - bufor na nazwë, a2 - bufor z "dodatkiem"

DoName:

Over:						;kopiowanie nazwy
	move.b	(a5),(a1)			;szukanie koïca nazwy
	cmpi.b	#32,(a1)			;(znaku spacji
	beq	Spc				;lub znaku
	cmpi.b	#10,(a1)			;koïca linii)
	beq	Suffix				;znaleziono = skok
	adda.l	#1,a5				;powiëkszenie a0
	adda.l	#1,a1				;i a1 o jeden
	addq.l	#1,d3				;licznik znaków
	bra	Over				;powrót

Spc:
	adda.l	#1,a5				;nastëpna nazwa

Suffix:
	move.b	(a2)+,(a1)+			;kop. znaków rozszerzenia
	bne	Suffix				;jeszcze nie koniec
	add.l	#8,d3				;dîugoôê '.library'
	rts


OpenIt:
	moveq	#0,d7				;
	cmpi.b	#'-',(a5)			;do usuniëcia?
	beq	CloseIt				;tak
	cmpi.b	#'+',(a5)			;opcja '+'?
	bne	HardOpen
	adda.l	#1,a5				;przesuniëcie na nastëpny znak
	moveq	#1,d7				;zaznaczenie opcji

HardOpen:
	bsr	DoName				;poîâczenie nazwy
	move.l	4,a6				;baza exec
	tst.l	d7				;sprawdzam opcjë
	beq	MustOpen			;nie byîo opcji '+'
	move.l	LibList(a6),a0			;nagîówek listy bibliotek
	lea	LibName,a1			;adres nazwy biblioteki
	jsr	_LVOFindName(a6)		;czy taka zostaîa juû otwarta?
	tst.l	d0				;zobaczmy
	bne	EndOpen				;skok, jeôli tak
MustOpen:
	moveq	#0,d0				;objëtna wersja biblioteki
	lea	LibName,a1			;bufor z nazwâ biblioteki
	jsr	_LVOOpenLibrary(a6)		;otwarcie danej biblioteki
	tst.l	d0				;dla pewnoôci
	beq	NoLib				;brak tej biblioteki
	tst.l	d7				;jeûeli opcja '+', to muszë
	beq	EndOpen				;jâ teraz zamknâê
	move.l	d0,a1				;adres biblioteki
	jsr	_LVOCloseLibrary(a6)		;zamkniëcie

EndOpen:
	moveq	#0,d3				;wyzerowanie rejestru
	bra	Again				;wracamy..

CloseIt:
	adda.l	#1,a5
	bsr	DoName				;poîâczenie nazwy
	move.l	4,a6				;execbase
	jsr	_LVOForbid(a6)			;wyîâczenie multitaskingu
	move.l	LibList(a6),a0			;poczâtek listy bibliotek
	lea	LibName,a1			;nazwa biblioteki
	jsr	_LVOFindName(a6)		;czy otwarta?
	move.l	d0,a4				;adres biblioteki
	beq	NotOpen
	move.l	d0,a1
	moveq	#0,d7
	move.w	LIB_OPENCNT(a1),d7		;ile razy otwarta
	subq.l	#1,d7

CloseLoop:
	move.l	a4,a1				;zamykanie biblioteki
	jsr	_LVOCloseLibrary(a6)		;tyle razy, ile razy
	dbf	d7,CloseLoop			;zostaîa otwarta

	move.l	a4,a1				;adres struktury node
	jsr	_LVORemLibrary(a6)		;usuniëcie biblioteki
	jsr	_LVOPermit(a6)			;multitasking	
	moveq	#0,d3				;wyzerowanie rejestru
	bra	Again				;wracamy..


NotOpen:
	jsr	_LVOPermit(a6)			;wîâczenie multitaskingu
	lea	NotOpenMes(pc),a0		;napis
	bsr	DisplayError			;wyôwietlenie
	moveq	#0,d3
	bra	Again




Info:
	bsr	OpenDos				;otworzenie biblioteki dos
	move.l	d0,a6				;adres do a6
	jsr	_LVOOutput(a6)			;zbadanie "wyjôcia" inform.
	beq	Koniec				;brak = wyjôcie z prog.
	move.l	d0,d4				;adres do d4
	lea	InfoMes(pc),a2			;adres informacji
	moveq	#1,d3				;jeden znak do wyôwieetlenia

DisplayLoop:
	tst.b	(a2)				;zero?
	beq	DisplayOver			;tak!
	move.l	a2,d2				;nie
	move.l	d4,d1				;output
	jsr	_LVOWrite(a6)			;wypisanie informacji
	moveq	#1,d1				;1/50 sekundy do odczekania
	jsr	_LVODelay(a6)			;opóúnienie
	adda.l	#1,a2				;na nastëpny znak
	bra	DisplayLoop

DisplayOver:
	move.l	#10,d1				;koïcowe opóúnienie
	jsr	_LVODelay(a6)			;1/10 sekundy
	bsr	CloseDos
	moveq	#0,d0				;wyzerowanie rejestru
	rts

Koniec:
	move.l	#10,d0
	rts					;bye bye

NoLib:
	lea	NoLibMes(pc),a0			;napis
	bsr	DisplayError			;wyôwietlenie
	moveq	#0,d3
	bra	Again


DisplayError:
	moveq	#0,d3
	move.l	#0,Lenght			;
	move.l	4,a6				;baza exec
	lea	DataStream(pc),a1		;adres zmiennej
	lea	PutChProc(pc),a2		;procedurka
	lea	ErrString,a3			;wynik
	jsr	_LVORawDoFmt(a6)		;formatowanie
	bsr	OpenDos				;otwarcie dos.library
	move.l	_DosBase,a6			;baza dosu
	jsr	_LVOOutput(a6)			;czy jest "wyjôcie"
	move.l	d0,d1				;kopiujë ew. adres
	beq	NoOut				;no cóû..
	lea	ErrString,a0			;adres napisu
	move.l	a0,d2				;do d2
	move.l	Lenght,d3			;dîugoôê
	jsr	_LVOWrite(a6)			;wypisanie informacji
NoOut:
	bsr	CloseDos			;zamkniëcie dos.library
	rts

PutChProc:
	move.b	d0,(a3)+			;przeniesienie znaku
	add.l	#1,Lenght			;dîugoôê
	rts


OpenDos:
	move.l	4.w,a6				;baza exec
	lea	DosName(pc),a1			;nazwa bibl. dos	
	jsr	_LVOOldOpenLibrary(a6)		;otworzenie bibl. dos
	move.l	d0,_DosBase			;zapam. adresu dos.library
	rts

CloseDos:
	move.l	4.w,a6				;baza exec.library
	move.l	_DosBase,a1			;baza dos.library
	jsr	_LVOCloseLibrary(a6)		;zamkniëcie bibl. dos
	rts

CopyName:
	addq.l	#1,d3				;dîugoôê nazwy
	move.b	(a1)+,(a3)+			;kopiowanie nazwy
	bne	CopyName
	suba.l	#1,a3				;ustawienie sië na zero
	move.b	#10,(a3)+			;wstawienie koïca linii
	rts



Show:
	bsr	OpenDos
	move.l	d0,a6				;adres do a6
	jsr	_LVOOutput(a6)			;zbadanie "wyjôcia" inform.
	move.l	d0,_OutBase			;adres wyjôcia
	beq	Koniec				;brak = wyjôcie z prog.

	move.l	4,a6				;baza exec
	move.l	#SIZE,d0			;rozmiar alokowanej pamiëci
	move.l	#MEMF_CLEAR,d1			;typ pamiëci
	jsr	_LVOAllocMem(a6)		;pamiëê na nazwy bibliotek
	move.l	d0,_MemBase			;poczâtek zaalokowanej pamiëci
	beq	MemError			;brak pamiëci?

	moveq	#0,d3				;wyzerowanie licznika
	lea	Header,a1
	move.l	d0,a3
	bsr	CopyName			;skopiowanie nagîówka

	jsr	_LVOForbid(a6)			;zatrzymanie multitaskingu
	move.l	LibList(a6),a4			;adres listy bibliotek
	move.l	MLH_HEAD(a4),a4			;poczâtek listy
	tst.l	(a4)				;maîo moûliwe
	beq	Koniec				;aby byîo zero

Next:
	move.l	LN_NAME(a4),a1			;poczâtek nazwy
	bsr	CopyName			;skopiowanie nazwy
	move.l	LN_SUCC(a4),a4			;adres nastëpnej biblioteki
	tst.l	(a4)				;jeôli nie zero,
	bne	Next				;to jedziemy spowrotem

	move.b	#10,(a3)+			;znak koïca linii
	addq.l	#1,d3				;licznik znaków
	move.b	#0,(a3)
	move.l	4,a6				;baza exec
	jsr	_LVOPermit(a6)			;wîâczenie multitaskingu
	move.l	_MemBase,a3
	move.l	_DosBase,a6
	moveq	#0,d4

Display:
	move.l	_OutBase,d1			;baza wyjôcia
	move.l	a3,d2				;adres nazwy biblioteki
	move.b	d3,d4				;przechowujë
	jsr	_LVOWrite(a6)			;wyôwietlenie
	bmi	Koniec				;bîâd

NoMore:
	bsr	CloseDos			;zamkniëcie biblioteki dos
	moveq	#0,d0				;wyzerowanie
	rts


AskWB:
	move.l	4,a6
	move.l	#0,_WBPointer		;dla pewnoôci
	sub.l	a1,a1			;nazwa tasku do szukania 0
	jsr	_LVOFindTask(a6)	;a wiëc szukam tego taska
	move.l	d0,a0			;
	tst.l	pr_CLI(a0)		;czy task spod CLI
	bne	NonWB			;tak
	lea	pr_MsgPort(a0),a0	;adres portu
	move.l	a0,a2			;tam teû
	jsr	_LVOWaitPort(a6)	;
	move.l	a2,a0			;adres portu
	jsr	_LVOGetMsg(a6)		;
	move.l	d0,_WBPointer		;zapamiëtanie
	bsr	DisplayCLIOnly		;tylko spod CLI lub Shella
	moveq	#1,d0			;szukujë sië do opuszczenia pokîadu
	rts


NonWB:
	moveq	#0,d0			;znacznik OK
	rts

WBEnd:
	move.l	4,a6
	jsr	_LVOForbid(a6)		;wstrzymanie multitaskingu
	move.l	_WBPointer,a1		;wskaúnik do a1
	jsr	_LVOReplyMsg(a6)	;zwrócenie
	move.l	#10,d0			;return code
	rts


OpenIntui:				;bibl. potrzebna do alertów
	move.l	4.W,a6			;baza biblioteki exec
	moveq	#0,d0			;obojëtna wersja intuition.library
	lea	IntuiName(pc),a1	;nazwa intuition do a1
	jsr	_LVOOpenLibrary(a6)	;otwarcie bibl. intuition
	move.l	d0,_IntuiBase		;zapa. adresu bazowego
	rts

CloseIntui:
	move.l	4.W,a6			;baza biblioteki exec
	move.l	_IntuiBase,a1		;baza bibl. intuition
	jsr	_LVOCloseLibrary(a6)	;zamkniëcie biblioteki intuition
	rts

DisplayCLIOnly:
	bsr	OpenIntui		;otwarcie biblioteki intuition
	move.l	_IntuiBase,a6		;baza intuition
	moveq	#0,d0			;numer alertu
	lea	CLIOnlyMes(pc),a0	;adres tekstu
	move.l	#20,d1			;wysokoôê ramki
	jsr	_LVODisplayAlert(a6)	;wyôwietlenie
	bsr	CloseIntui		;zamkniëcie biblioteki
	rts


MemError:
	bsr	OpenIntui		;otwarcie biblioteki intuition
	move.l	_IntuiBase,a6		;baza intuition
	moveq	#0,d0			;numer alertu
	lea	NoMemMes(pc),a0		;adres tekstu
	move.l	#20,d1			;wysokoôê ramki
	jsr	_LVODisplayAlert(a6)	;wyôwietlenie
	bsr	CloseIntui		;zamkniëcie biblioteki
	bra	Koniec


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

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

AddName:
	dc.b	'.library',0

NoLibMes:
	dc.b	' Kîopoty z otwarciem %s.',10,0

NotOpenMes:
	dc.b	' Biblioteka %s nie zostaîa wczeôniej otwarta!',10,0

NoMemMes:
	dc.b	0,228,12,'Brak pamiëci na bufor!!!',0,0

CLIOnlyMes:
	dc.b	0,80,12,'ALib v2.1.   Program uruchamialny tylko spod CLI lub Shella.',0,0,0

Header:
	dc.b	10,' Otwarte biblioteki:',10,10,'utility.library',0

DataStream:
	dc.l	LibName

InfoMes:
	dc.b	10
	dc.b	' ALib v2.1 by Tadek Knapik    ',10
	dc.b	' Uûycie >ALib [-][+][katalog:nazwa]',10,10,0


;		*****	Nowy hunk   *****

	section	ALibd,bss

_DosBase:
	ds.l	1

_IntuiBase:
	ds.l	1

_OutBase:
	ds.l	1

_MemBase:
	ds.l	1

_WBPointer:
	ds.l	1

Lenght:
	ds.l	1

LibName:
	ds.b	255

ErrString:
	ds.b	255

