	include "exec/types.i"
	include "exec/initializers.i"
	include "exec/libraries.i"
	include "exec/lists.i"
	include "exec/resident.i"
	include "exec/strings.i"
	include "libraries/dos.i"
	include "exec/io.i"

callsys	macro
	jsr _LVO\1(a6)
	endm

xlib	macro
	xref	_LVO\1
	endm

* Die vorhandenen Funktionen 

	xref	_testfunktion
	xref	_berechnen
	xref	_request
	xref	_copy
	xref	_check
	xref	_checkback
	xref	_ev
	xref	_AnzahlKlammern
	xref	_left
	xref	_right
	xref	_mid
	xref	_UmwStoF
	xref	_stof
	xref	_Fak
	xref	_NuK
	xref	_EventAbfrage
	xref	_UmwFtoS
	xref	_Print

	xlib	FreeMem
	xlib	Remove
	xlib	OpenLibrary
	xlib	CloseLibrary

	xdef	_SysBase
	xdef	_IntuitionBase
	xdef	_GfxBase
	xdef	_MathIeeeDoubBasBase
	xdef	_MathIeeeDoubTransBase


VERSION		equ	1
REVISION	equ	1

	STRUCTURE TestBase,LIB_SIZE
		BPTR	ToolLib_SegList
		APTR	ToolLib_SysBase
		APTR	ToolLib_GfxBase
		APTR	ToolLib_IntuitionBase
		APTR	ToolLib_MathIeeeDoubBasBase
		APTR	ToolLib_MathIeeeDoubTransBase
		Label	ToolLib_SIZEOF

TESTLIBNAME	macro
	dc.b	'tool.library',0
	endm


	SECTION "tool",CODE

	moveq	#RETURN_FAIL,d0
	rts
ROMTag:
	dc.w	RTC_MATCHWORD
	dc.l	ROMTag
	dc.l	EndCode
	dc.b	RTF_AUTOINIT
	dc.b	VERSION
	dc.b	NT_LIBRARY
	dc.b	0
	dc.l	libraryName
	dc.l	idString
	dc.l	Init

libraryName:
	TESTLIBNAME

	cnop	0,2

idString:
	dc.b	'ToolLibrary 1.00 22-Oct-1989',CR,LF,0

	cnop	0,2

gfxName:
	dc.b	'graphics.library',0

	cnop	0,2

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

mabName:
	dc.b	'mathieeedoubbas.library',0

matName:
	dc.b	'mathieeedoubtrans.library',0

	cnop	0,2
Init:
	dc.l	ToolLib_SIZEOF
	dc.l	funcTable
	dc.l	dataTable
	dc.l	.InitLib

funcTable:
	dc.l	.OpenLib
	dc.l	.CloseLib
	dc.l	.ExpungeLib
	dc.l	.ExtFuncLib
	dc.l	.testfunktion
	dc.l	.berechnen
	dc.l	.request
	dc.l	.copy
	dc.l	.check
	dc.l	.checkback
	dc.l	.ev
	dc.l	.AnzahlKlammern
	dc.l	.left
	dc.l	.right
	dc.l	.mid
	dc.l	.UmwStoF
	dc.l	.stof
	dc.l	.Fak
	dc.l	.NuK
	dc.l	.EventAbfrage
; Siehe unten. Wird das Abgeändert, dann muß die Reihenfolge hier mit der
; Reihenfolge in Tool.FD übereinstimmen !!!!
	dc.l	.a 
	dc.l	.a
	dc.l	.a
	dc.l	.a
	dc.l	.a
	dc.l	.a
	dc.l	.UmwFtoS
	dc.l	.Print
	dc.l	-1


dataTable:
	INITBYTE 	LH_TYPE,NT_LIBRARY
	INITLONG	LN_NAME,libraryName
	INITBYTE	LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
	INITWORD	LIB_VERSION,VERSION
	INITWORD	LIB_REVISION,REVISION
	INITLONG	LIB_IDSTRING,idString
	dc.l	0


.InitLib:
	move.l	a5,-(sp)
	movea.l	d0,a5
	move.l	a0,ToolLib_SegList(a5)
	lea	gfxName(pc),a1
	moveq	#LIBRARY_VERSION,d0
	callsys	OpenLibrary
	tst	d0
	beq.s	1$
	move.l	d0,_GfxBase
	move.l	d0,ToolLib_GfxBase(a5)

	lea	intName(pc),a1
	moveq	#LIBRARY_VERSION,d0
	callsys	OpenLibrary
	tst	d0
	beq.s	1$
	move.l	d0,_IntuitionBase
	move.l	d0,ToolLib_IntuitionBase(a5)

	lea	mabName(pc),a1
	moveq	#LIBRARY_VERSION,d0
	callsys	OpenLibrary
	tst	d0
	beq.s	1$
	move.l	d0,_MathIeeeDoubBasBase
	move.l	d0,ToolLib_MathIeeeDoubBasBase(a5)

	lea	matName(pc),a1
	moveq	#LIBRARY_VERSION,d0
	callsys	OpenLibrary
	tst	d0
	beq.s	1$
	move.l	d0,_MathIeeeDoubTransBase
	move.l	d0,ToolLib_MathIeeeDoubTransBase(a5)

	move.l	a6,ToolLib_SysBase(a5)
	move.l	a6,_SysBase
	move.l	a5,d0
1$	movea.l	(sp)+,a5
	rts

.OpenLib:
	addq.w	#1,LIB_OPENCNT(a6)
	bclr	#LIBB_DELEXP,LIB_FLAGS(a6)
	move.l	a6,d0
	rts

.CloseLib:
	moveq	#0,d0
	subq.w	#1,LIB_OPENCNT(a6)
	bne.s	1$
	btst	#LIBB_DELEXP,LIB_FLAGS(a6)
	beq.s	1$
	bsr.s	.ExpungeLib
1$	rts

.ExpungeLib:
	movem.l	d2/a5/a6,-(sp)
	tst.w	LIB_OPENCNT(a6)
	beq.s	1$
	bset	#LIBB_DELEXP,LIB_FLAGS(a6)
	moveq	#0,d0
	bra.s	2$
1$	move.l	a6,a5

	move.l	ToolLib_SysBase(a5),a6
	movea.l	ToolLib_GfxBase(a5),a1
	callsys	CloseLibrary
	movea.l	ToolLib_IntuitionBase(a5),a1
	callsys	CloseLibrary
	movea.l	ToolLib_MathIeeeDoubBasBase(a5),a1
	callsys	CloseLibrary
	movea.l	ToolLib_MathIeeeDoubTransBase(a5),a1
	callsys	CloseLibrary

	move.l	a5,a1
	callsys	Remove
	move.l	ToolLib_SegList(a5),d2
	movea.l	a5,a1
	moveq	#0,d0
	move.w	LIB_NEGSIZE(a5),d0
	suba.l	d0,a1
	add.w	LIB_POSSIZE(a5),d0
	callsys	FreeMem
	move.l	d2,d0
2$	movem.l	(sp)+,d2/a5/a6
	rts


.ExtFuncLib:
	moveq	#0,d0
	rts


* Konvertierungsroutinen (Parameter aus den Registern auf den Stack)

.testfunktion
	move.l	a0,-(a7)
	jsr	_testfunktion(pc)
	addq.l	#4,sp
	rts

.berechnen
	movem.l	d0-d3,-(a7)
	jsr	_berechnen(pc)
	add.l	#16,sp
	rts

.request
	movem.l	d0-d2,-(a7)
	jsr	_request(pc)
	add.l	#12,sp
	rts

.copy
	movem.l	d0-d3,-(a7)
	jsr	_copy
	add.l	#16,sp
	rts

.check
	move.l	a0,-(a7)
	movem.l	d0-d3,-(a7)
	jsr	_check
	add.l	#20,sp
	rts

.checkback
	move.l	a0,-(a7)
	movem.l	d0-d3,-(a7)
	jsr	_check
	add.l	#20,sp
	rts

.ev
	movem.l	d0-d2,-(a7)
	jsr	_ev
	add.l	#12,sp
	rts

.AnzahlKlammern
	move.l	a0,-(a7)
	jsr	_AnzahlKlammern
	addq.l	#4,sp
	rts

.left
	move.l	d0,-(a7)
	move.l	a0,-(a7)
	jsr	_left
	add.l	#8,sp
	rts

.right
	move.l	d0,-(a7)
	move.l	a0,-(a7)
	jsr	_right
	add.l	#8,sp
	rts

.mid
	movem.l	d0-d1,-(a7)
	move.l	a0,-(a7)
	jsr	_mid
	add.l	#12,sp
	rts

.UmwStoF
	move.l	a0,-(a7)
	jsr	_UmwStoF
	addq.l	#4,sp
	rts

.stof
	move.l	a0,-(a7)
	jsr 	_stof
	addq.l	#4,sp
	rts

.Fak
	move.l	d0,-(a7)
	jsr	_Fak
	addq.l	#4,sp
	rts

.NuK
	movem.l	d0-d1,-(a7)
	jsr	_NuK
	add.l	#8,sp
	rts

.EventAbfrage
	movem.l	a0-a1,-(a7)
	jsr	_EventAbfrage
	add.l	#8,sp
	rts

; Hier waren sonst 6 Funktionen, die einfach aus der Amiga.Lib angelinkt wurden
; Create/Delete IO etc. Mit diesen Funktionen könnte diese Library nicht als
; PD vertrieben werden. Also habe ich hier die Funktionen herausgeworden.
; Wer will, kann die Library neu durchlinken und hat dann eine Version mit den 
; 6 Funktionen. Entsprechend muß dann Tool.fd und Tool.h abgeändert werden.
; Tool.h kann mit Hilfe von fd2pragma (Lattice) neu erstellt werden.
;.CreatePort
;	move.l	d0,-(a7)
;	move.l	a0,-(a7)
;	jsr	_CreatePort
;	add.l	#8,sp
;	rts
;
;.DeletePort
;	move.l	a0,-(a7)
;	jsr	_DeletePort
;	addq.l	#4,sp
;	rts
;
;* Die Funktionen sind gleich, StdIO benutzt feste Speichergröße
;.CreateStdIO
;	moveq	#IOSTD_SIZE,d0
;.CreateExtIO
;	move.l	d0,-(a7)
;	move.l	a0,-(a7)
;	jsr	_CreateExtIO
;	add.l	#8,sp
;	rts
;
;* Die Funktionen sind gleich, StdIO benutzt feste Speichergröße
;
;.DeleteStdIO
;	moveq	#IOSTD_SIZE,d0
;.DeleteExtIO	
;	move.l	a0,-(a7)
;	jsr	_DeleteExtIO
;	addq.l	#4,sp
;	rts
;

.a	move.l	#0,d0
	rts

.UmwFtoS
	move.l	d0,-(a7)
	move.l	a0,-(a7)
	jsr	_UmwFtoS
	add.l	#8,sp
	rts

.Print
	movem.l	d0-d2,-(a7)
	movem.l	a0-a1,-(a7)
	jsr	_Print
	add.l	#20,sp
	rts

EndCode:

	
	section "data2",bss

* Die öffentlichen Symbole 

_SysBase		ds.l	1
_GfxBase		ds.l	1
_IntuitionBase		ds.l	1
_MathIeeeDoubBasBase	ds.l	1
_MathIeeeDoubTransBase	ds.l	1


	end
	
