	PAGE 60
	ENTRY SUCH
BDOS	EQU 0005
	.Z80
	.COMMENT #

SUCH	sucht nach einem Byte oder einem Wort im Speicher.
Das Programm kann im ZSID eingesetzt werden.

Eingabe (alles in Hex)
Bhhhh,bb	Suche ab Adr. hhhh das Byte bb
Bhhhh,		Suche ab Adr. hhhh das zuletzt gesuchte Byte
B,bb		Suche ab der mom.Adresse das Byte bb
B		dto. das zuletzt gesuchte Byte

Whhhh,wwww	analog fuer ein Wort
usw.

Ausgabe
aaaa		Adresse des gefundenen Bytes oder Wortes
??		Falls nicht gefunden, bzw. bei Syntaxfehler
#
SUCH:	LD DE,IBUFF
	LD C,0AH
	CALL BDOS	; LIES KOMMANDO
	LD DE,MESS	; ECHO CR,LF
	LD C,09
	CALL BDOS
	LD DE,IBUFF
	INC DE
	LD A,(DE)
	OR A
	JR Z,ERR	; LEER?
	LD C,A
	LD B,0		; LAENGE DES KOMMANDOS
	INC DE
	LD A,(DE)
	CP 'B'
	JR Z,SUCHB	; B = BYTE SUCHEN
	CP 'W'
	JR Z,SUCHW	; W = WORT SUCHEN
;
ERR:	LD DE,ERRM	; ERROR MELDUNG ABSETZEN
EXIT:	LD C,09
	CALL BDOS
	NOP		; PLATZ FUER EINEN ZSID-PASSPOINT
	RET		; EXIT
;
ERRM:	DB '??'
MESS:	DB 0DH,0AH
	DB '$'
IBUFF:	DB 20
	DS 20		; 20 ZEICHEN INPUT BUFFER
;
SUCHB:	CALL ADEC	; ADRESSE DECOD. NACH HL
	JR C,ERR	; CARRY IST ERROR FLAG
	CALL BDEC	; BYTE DECOD. NACH A
	JR C,ERR
	LD DE,0
	EX DE,HL
	SBC HL,DE
	LD B,H
	LD C,L		; BC = ZEICHENZAEHLER BIS FFFF
	EX DE,HL
	CPIR
	LD A,B
	OR C
	JR Z,ERR	; NICHT GEF.?
OUTHL:	LD (ADDR),HL
	DEC HL
	LD A,H		; DOCH. ADRESSE AUSGEBEN.
	CALL SHIFT
	LD A,H
	CALL NOSH
	LD A,L
	CALL SHIFT
	LD A,L
	CALL NOSH
	LD DE,MESS
	JR EXIT		; FERTIG.
;
SUCHW:	CALL ADEC	; ADRESSE DECOD. NACH HL
	JR C,ERR	; CARRY IST ERROR FLAG
	CALL BDEC	; 1.BYTE DECOD. NACH A
	JR C,ERR
	LD (BYTE+1),A
	CALL BDEC	; 2.BYTE DECOD. NACH A
	JR C,ERR
	LD DE,0
	EX DE,HL
	SBC HL,DE
	LD B,H
	LD C,L		; BC = ZEICHENZAEHLER BIS FFFF
	EX DE,HL
WLOOP:	LD A,(BYTE+1)	; NACH 1.BYTE SUCHEN
	CPIR
	LD A,B
	OR C
	JR Z,ERR	; NICHT GEF.?
	LD A,(BYTE)
	CP (HL)		; 2.BYTE VERGL.
	JR NZ,WLOOP
	JR OUTHL
;
ADDR:	DW 0		; MOM. ADRESSE
BYTE:	DW 0		; MOM. SUCH-BYTE/WORT
;
SHIFT:	SRL A		; HEX-AUSGABE OBERES HALB-BYTE
	SRL A
	SRL A
	SRL A
NOSH:	AND 0FH		; UNTERES HALB-BYTE
	OR 30H
	CP 3AH
	JR C,OUTP
	ADD A,7
OUTP:	LD C,2
	LD E,A
	PUSH HL
	CALL BDOS
	POP HL
	RET
;
ADEC:	DEC BC		; ZEICHENZAEHLER FUER INPUT STRING
	LD A,B
	OR C
	JR Z,AOLD
	INC DE		; NAECHSTES ZEICHEN
	LD A,(DE)
	CP ','
	JR NZ,ADEC1
	DEC BC
	INC DE
AOLD:	LD HL,(ADDR)	; AB ALTER ADRESSE SUCHEN
	JR ADEC8
ADEC1:	LD HL,0		; NEUE ADRESSE ZUS'SETZEN
ADEC2:	SUB 30H
	JR C,ADEC9	; SYNTAX ERROR
	CP 10
	JR C,ADEC3
	SUB 7
	CP 16
	JR NC,ADEC9
ADEC3:	CALL SHHL	; SHIFT HL 4 BITS NACH LINKS
	OR L
	LD L,A
	DEC BC
	LD A,B
	OR C
	JR Z,ADEC8
	INC DE
	LD A,(DE)
	CP ','
	JR NZ,ADEC2
	INC DE
	DEC BC
ADEC8:	SCF		; NO-ERROR EXIT
	CCF
	RET
ADEC9:	SCF		; ERROR EXIT
	RET
;
SHHL:	ADD HL,HL
	ADD HL,HL
	ADD HL,HL
	ADD HL,HL
	RET
;
BDEC:	LD A,B		; BYTE BEI DE NACH A DECODIEREN
	OR C
	LD A,(BYTE)
	RET Z		; ALTES SUCH-BYTE VERWENDEN
	LD A,(DE)
	SUB 30H
	JR C,BDEC9	; SYNTAX ERROR?
	CP 10
	JR C,BDEC1
	SUB 7
	CP 16
	JR NC,BDEC9
BDEC1:	LD (BYTE),A
	DEC BC
	LD A,B
	OR C
	LD A,(BYTE)
	RET Z		; NUR EIN HALB-BYTE?
	INC DE		; NEIN.
	LD A,(DE)
	SUB 30H
	JR C,BDEC9	; SYNTAX ERROR?
	CP 10
	JR C,BDEC2
	SUB 7
	CP 16
	JR NC,BDEC9
BDEC2:	PUSH HL
	LD HL,BYTE
	SLA (HL)
	SLA (HL)
	SLA (HL)
	SLA (HL)
	OR (HL)
	LD (BYTE),A
	POP HL
	INC DE
	DEC BC
	RET		; NO-ERROR EXIT
BDEC9:	SCF		; ERROR EXIT
	RET
;
	END
