********************************************************************************
*
*	Program:	Error
*	Filename:	Error.a
*
*	Contents:	Gibt einen Textstring mittlels DisplayAlert aus.
*			Der Textstring wird automatisch im Wordwarp-Verfahren
*			formatierrt. Ein $0a oder $0d-Byte markiert das Ende
*			einer Zeile. Ein 0-Byte markiert das Ende des
*			Textstrings.
*			Inputs: a0.l Zeiger auf TextString (0= Unknown Soft-
*				ware Error)
*			Output: d0.b 01= linke, 00= rechte Maustaste gedrückt
*
*	Language:	68000 Assembler
*
*	Author:		Johannes R. Geiss
*
*	Copyright:	Amigavisions
*
*	History:	$HISTORY:
*			2.2 (26-Oct-91) changed JRG
*			2.1 (19-Oct-91) changed JRG
*			2.0 (10-Oct-91) changed JRG
*			1.2 (10-Oct-91) changed JRG
*			1.1 (02-Jun-91) changed to linkable code JRG
*			1.0 (27-Jan-90) written JRG
*
*	Version:	$VER: Error.a 2.2 (26-Oct-91)
*
********************************************************************************


*------ Includes
	include 'xref.i'
	include 'call.i'


*------ Imports
	XLIB	AllocMem
	XLIB	FreeMem
	XLIB	DisplayAlert
	XLIB	DisplayBeep
	xref	_IntuitionBase
	xref	_SysBase


*------ Exports
	xdef	Error


********************************************************************************

	SECTION Error

*------ Main procedure
*
* Input: a0.l Zeiger auf Text (0=Unknown Error)
*
* Output: d0.b 01=linke, 00=rechte Maustaste gedrückt

Error	movem.l d2-d3/a4-a6,-(a7)
	movea.l a0,a5			; Zeiger auf TextString holen
	cmpa.l	#0,a5
	bne.s	ImpText			; Zeiger =0 ?
	movea.l #FehlerText,a5		; Eingenen Text holen
ImpText move.l	#$7c8,d0		; $7c8 Bytes Puffer holen
	clr.l	d1
	CALLEXE AllocMem
	move.l	d0,TextBase
	beq	DeadEnd			; Kein Pufer bekommen
	moveq.l #8,d2
	moveq.l #2,d1
	movea.l TextBase,a4		; Zeiger auf Puffer
Loop4	addq.l	#8,d2			; Koordinaten justieren
	cmpi.b	#$c8,d2
	beq.s	Loop8			; letzte Zeile erreicht
	move.w	#78,d0			; max Textbreite
Loop2	addq.b	#8,d1
	clr.b	(a4)+			; Puffer initialisieren
	move.b	#$08,(a4)+
	move.b	d1,(a4)+
Loop5	move.b	(a5)+,d3		; Text in Puffer übertragen
	bne.s	Lab1
	subq.l	#1,a5
	bra.s	Loop6
Lab1	cmpi.b	#$0a,d3
	beq.s	Loop6
	cmpi.b	#$0d,d3
	beq.s	Loop6
	move.b	d3,(a4)+
	dbf	d0,Loop5
Loop7	subq.l	#1,a4
	cmpi.b	#$20,-(a5)		; =SPACE ? (Word-warp)
	bne.s	Loop7			; nein
	addq.l	#1,a5
Loop6	clr.b	(a4)+
	tst.b	(a5)			; Ende des Textes ?
	beq.s	Loop3			; ja
	move.b	#$ff,(a4)+
	bra.s	Loop4			; nächste Zeile
Loop8	subq.l	#1,a4
Loop3	clr.b	(a4)+			; Ende-Markierung setzen
	moveq.l #0,d0
	movea.l TextBase,a0
	move.l	d2,d1
	CALLITU DisplayAlert		; DisplayAlert
	move.b	d0,-(a7)		; Mousebuttonflag merken
	movea.l TextBase,a1
	move.l	#$7c8,d0
	CALLEXE FreeMem
	move.b	(a7)+,d0		; Mousebuttonflag holen
Out	movem.l (a7)+,d2-d3/a4-a6
	rts

DeadEnd suba.l	a0,a0			; Keinen Puffer bekommen
	CALLITU DisplayBeep
	bra.s	Out


********************************************************************************

	section data,DATA

*------ Datafield
FehlerText
 DC.B $0a
 DC.B '        Unknown software failure!     Press any mousebutton to continue.'
 DC.B $0a,$0a,0


********************************************************************************

	section data,BSS

*------ BSSfield
TextBase	ds.l	1
	END
