		opt	d-,p+

codelen		equ	0
textlen		equ	2
outhandle	equ	4
textadr		equ	8
codeadr		equ	12

*************************************************************************
* Name		:	INPUT.s		Version	:	1.0		*
* Autor		:	Merlin/dv-team	Datum	:	18.12.1989	*
*************************************************************************
* Funktion	:	Syntax INPUT <code> <text>			*
*			gibt <text> aus und erwartet dann eine Eingabe, *
*			die mit <code> verglichen wird. Bei Gleichheit	*
*			wird OK, sonst WARN zurückgegeben. Ist kein	*
*			Standard-Output vorhanden, wird ERROR gegeben.	*
*			<code> endet am ersten Leerzeichen und darf -	*
*			wie die Eingabe - max. 32 Zeichen lang sein.	*
*************************************************************************
* Geschrieben und assembliert mit dem HiSoft-DEVPAC-Assembler. Hinweis  *
* für SEKA-Benutzer: 'equ' in '=' ändern, erste Zeile 'opt ...' löschen *
*************************************************************************

* EXEC-Funktionen
_LVOOldOpenLibrary	equ	-408
_LVOCloseLibrary	equ	-414
* DOS-Funktionen
_LVOOutput		equ	-60
_LVOWrite		equ	-48
_LVORead		equ	-42

*diverse interne Offset-Konstanten
codelen		equ	0
textlen		equ	2
outhandle	equ	4
textadr		equ	8
codeadr		equ	12

_start		bra		_main		;erst die Daten
variable	dc.w		0		;codelen
		dc.w		0		;textlen
		dc.l		0		;outhandle
		dc.l		0		;textadr
		dc.l		0		;codeadr
dosname		dc.b		'dos.library',0	;dosname
syn_text	dc.b		10,'              SYNTAX: INPUT <code> <text>',10
		dc.b		   '      if no <code> needed, start <text> with SPACE',10
		dc.b		   'returns OK (0) if <code> EQU inputdata, else WARNING (5)',10
		dc.b		   '    if no CLI-window opened, returncode is ERROR (10)',10,10
		even
buffer		ds.b		32
syn_len		equ		buffer-syn_text

_main		movem.l		a0/d0,-(sp)	;Zeiger + Länge Parameter-
						;string sichern

*-> 		Sonderfälle: '?' eingegeben oder garnichts	      <-*
		lea		variable(pc),a5
		cmpi.w		#1,d0
		beq		syntax
		cmp.b		#'?',(a0)
		beq		syntax

*-> Parameterstring in <code> und <text> parsen + deren Länge finden  <-*
		move.w		d0,d2
lookspace	cmp.b		#32,(a0)+
		dbeq		d2,lookspace
		cmp.b		#-1,d2		;kein Space gefunden?
		beq		syntax		;sic!

*-> Länge <code> = d0 - d2
		move.l		d0,d3
		sub.w		d2,d3
		move.w		d3,codelen(a5)

		subi.w		#2,d2		;Länge <text> ohne LF
		move.w		d2,textlen(a5)

*-> Anfangsadressen der Strings speichern
		movem.l		(sp)+,a0/d0
		move.l		a0,codeadr(a5)
		add.l		d3,a0
		add.l		#1,a0		;Space überspringen
		move.l		a0,textadr(a5)

*-> Library öffnen + Output-Handle ermitteln
		lea		dosname(pc),a1
		move.l		4.w,a6
		jsr		_LVOOldOpenLibrary(a6)
		move.l		d0,a6		;DOSBase in A6

		jsr		_LVOOutput(a6)
		move.l		d0,outhandle(a5)
		beq		error

*-> jetzt <text> ausgeben
		move.l		d0,d1
		move.l		textadr(a5),d2
		move.w		textlen(a5),d3
		ext.l		d3
		jsr		_LVOWrite(a6)

*-> max. 32 Zeichen Eingabe holen
		move.l		outhandle(a5),d1
		lea		buffer(pc),a0
		move.l		a0,d2
		move.l		#32,d3
		jsr		_LVORead(a6)

*-> war überhaupt ein Codewort vorgegeben?
		tst.w		codelen(a5)
		beq		ok		;nein, also ok

*-> Codewort mit Eingabe vergleichen
		move.w		codelen(a5),d0
		subi.w		#1,d0
		move.l		codeadr(a5),a0
		lea		buffer(pc),a1

test		move.b		(a0)+,d4
		move.b		(a1)+,d5
		cmp.b		d4,d5
		bne		warning
		dbra		d0,test

ok		bsr		close_all
		clr.l		d0
		rts

warning		bsr		close_all
		move.l		#5,d0
		rts

error		bsr		close_all
		move.l		#10,d0
		rts

syntax		movem.l		(sp)+,a0/d0	;Stack entlasten
		lea		dosname(pc),a1
		move.l		4.w,a6
		jsr		_LVOOldOpenLibrary(a6)
		move.l		d0,a6		;DOSBase in A6

		jsr		_LVOOutput(a6)
		move.l		d0,outhandle(a5)
		beq		error

		move.l		d0,d1
		lea		syn_text(pc),a0
		move.l		a0,d2
		move.l		#syn_len,d3
		jsr		_LVOWrite(a6)

		bra		ok

close_all	move.l		a6,a1
		move.l		4.w,a6
		jsr		_LVOCloseLibrary(a6)
		rts

