	PAGE 70
	TITLE WAITLIB
;
;	W A I T L I B
;
;	IST EINE SAMMLUNG VON SUBROUTINEN,
;	DIE EINE GEWISSE WARTEZEIT VERSTREICHEN LASSEN.
;
;	FOLGENDE ROUTINEN K\NNEN AUFGERUFEN WERDEN:
;
;	CALL WAITS(SEC%,MSGFLG%)		IN BASIC-PROGRAMMEN
;	SEC%	= WARTEZEIT IN SEKUNDEN
;	MSGFLG%	= MESSAGE FLAG (0 OHNE BILDSCHIRM-MELDUNG, <>0 MIT B.)
;
;	CALL WAITMS(MSEC%)			IN BASIC-PROGRAMMEN
;	MSEC%	= WARTEZEIT IN MILLI-SEKUNDEN
;
;	CALL WAITMD				IN M80-PROGRAMMEN
;	DE	= WARTEZEIT IN MILLI-SEKUNDEN
;
;
;	WAITS RUFT DIE SYSTEM-ROUTINE (FDOS) F]R DIE BILDSCHIRMAUSGABE.
;
;
;	ENTWURF UND PROGRAMMIERUNG	A.HERRMANN	01.07.81
;
;
;------------------------------------------------------------------------
	.Z80
	ENTRY WAITS,WAITMS,WAITMD
FDOS	EQU 5			;FDOS ENTRY
	PAGE 70
WAITS:	LD A,(DE)		;****  ENTRY POINT ****
	LD (MSGFLG),A
	LD E,(HL)
	INC HL
	LD D,(HL)
	EX DE,HL		;HL = SEKUNDEN
	LD A,L
	OR H
	JR Z,WEXIT		;=0 SEC ?
WLOOP:	LD A,(MSGFLG)
	OR A
	JR Z,WSECND
	PUSH HL			;MIT MESSAGE
	LD DE,MSGSEC
	CALL CONV3		;HL IN 3-BYTE STRING KONVERTIEREN
	LD C,9
	LD DE,MSG
	CALL FDOS		;UND AUSGEBEN
	POP HL
WSECND:	LD DE,1000
	CALL WAITMD		;1000 MILLISEK. WARTEN
	DEC HL
	LD A,L
	OR H
	JR NZ,WLOOP		;FERTIG ?
	LD A,(MSGFLG)
	OR A
	JR Z,WEXIT
	LD C,9
	LD DE,MSGEND
	CALL FDOS		;MESSAGE L\SCHEN
WEXIT:	RET
	;
MSGFLG:	DB 0			;MESSAGE FLAG
MSG:	DB 0DH			;BILDSCHIRM-MELDUNG
	DB 'WAITING FOR '
MSGSEC:	DB '000 SEC'
	DB '$'
MSGEND:	DB 0DH
	DB '                   ';MELDUNG L\SCHEN (19 BLANKS)
	DB 0DH,'$'
	;
	;
WAITMS:	LD E,(HL)		;****  ENTRY POINT  ****
	INC HL
	LD D,(HL)
	;
WAITMD:	PUSH AF			;****  ENTRY POINT  ****
	PUSH BC			;DE = MILLISEKUNDEN
WAITM1:	LD A,E
	OR D
	JR Z,WAITM3
	LD C,249		;ZEITKONSTANTE F]R 4 MHz-CLOCK
WAITM2: DEC C			;HERUNTERZ[HLEN = 1 MSEC
	JR NZ,WAITM2
	DEC DE
	JR WAITM1
WAITM3:	POP BC
	POP AF
	RET
	;
;------------------------------------------------------------------------
CONV3:	INC DE			;KONVERTIERT INTEGER IN HL
	INC DE			;IN 3-BYTE ASCII-STRING AB DE.
	LD B,3
CONV31: CALL DIV10		;HL DURCH 10 DIVIDIEREN
	LD A,H			;REST AUS DEM OBEREN HALBBYTE
	RR A			;INS UNTERE SCHIEBEN
	RR A
	RR A
	RR A
	AND 0FH			;HERAUSMASKIEREN,
	OR 30H			;ALS ASCII-ZEICHEN CODIEREN
	LD (DE),A		;UND ABSPEICHERN.
	LD A,H			;QUOTIENT IN L UND UNTEREM HALBBYTE VON H
	AND 0FH
	LD H,A
	DEC DE
	DJNZ CONV31		;ALLE 3 STELLEN GENERIERT ?
	RET
	;
DIV10:	PUSH BC		;DIVIDIERT HL DURCH 10.
	PUSH DE
	LD B,12		;DIVIDEND HAT 12+4 BITS.
	LD D,0A0H	;DIVISOR (=10) IM OBEREN HALBBYTE VON D
	LD E,0
DIVBIT:	XOR A		;CLEAR CARRY FLAG
	ADD HL,HL	;HL 1 BIT NACH LINKS
	PUSH AF		;SAVE CARRY FLAG
	XOR A		;CLEAR CARRY FLAG
	SBC HL,DE	;"GEHT DE IN HL"?
	INC HL		;ANGENOMMEN, JA.
	JR NC,DIVNXT-1	;FALLS NICHT
	POP AF		;UND FALLS VORHER
	JR C,DIVNXT	;KEIN CARRY,
	ADD HL,DE	;SUBTRAKTION UND
	DEC HL		;QUOTIENTEN-STELLE
	JR $+3		;ZUR]CKNEHMEN.
	POP AF
DIVNXT:	DJNZ DIVBIT
	POP DE
	POP BC
	RET
;------------------------------------------------------------------------
	END
