TITLE	BLOC
	ENTRY	BLOC
;
;	Suche eines Bytemusters (SBUF) in einem
;	Speicherbereich (BUFFER)
;
;	Aufruf: CALL BLOC(buffer,countb,sbuf,counts,pos)
;
;	<countb>,<counts> = Pufferlaengen (2 Bytes !)
;	<pos> = Position von <sbuf> in <buffer> (2 Bytes !)
;
BLOC:	LD (BADR),HL	; 1. Parameter sichern
	LD (CBADR),DE	; 2. Parameter sichern
	LD A,3		; Anzahl restl. Parameter = 3
	LD HL,SADR
	CALL $AT##	; Parameter 3-5 sichern
	CALL SAVCB	; <countb; abspeichern
	CALL SAVCS	; <counts> abspeichern
	LD HL,0
	LD (POSWRK),HL	; <poswrk> loeschen
	LD HL,(BADR)	; Pointer1 in HL
	LD DE,(SADR)	; Pointer2 in DE
	LD BC,1
;
NEXTB:  LD A,(DE)
	CP (HL)		; Bytes vergleichen
	JR NZ,INCB	; nicht gleich: weiter
	LD (POSWRK),HL	; gleich: Pointer in <poswrk> sichern
	JR MATCH
;
INCB:	PUSH HL		; Pointer1 sichern
	LD HL,(COUNTB)
	AND A		; Carry-Flag loeschen
	SBC HL,BC	; 16-Bit-Dekrementierung
	LD (COUNTB),HL	; <countb> = <countb> - 1
	JR Z,NOTFND	; alle Bytes getestet?
	POP HL		; Pointer1 wieder herstellen
	INC HL		; Pointer1 = Pointer1 + 1
	JR NEXTB	; Naechstes Byte testen
;
MATCH:	PUSH HL		; Pointer1 sichern
	LD HL,(COUNTS)
	AND A		; Carry-Flag loeschen
	SBC HL,BC	; 16-Bit-Dekrementierung
	LD (COUNTS),HL	; <counts> = <counts> - 1
	JR Z,FNDALL     ; <sbuf> zu Ende: fertig
	LD HL,(COUNTB)
	AND A
	SBC HL,BC
	LD (COUNTB),HL	; <countb> = <countb> - 1
	JR Z,NOTFND	; <buffer> zu Ende: nicht gefunden
	POP HL		; Pointer1 wieder herstellen
	INC HL		; Pointer1 = Pointer1 + 1
	INC DE		; Pointer2 = Pointer2 + 1
	LD A,(DE)
	CP (HL)		; Bytes vergleichen
	JR Z,MATCH	; gleich: naechstes Byte testen
	PUSH HL		; ungleich: Pointer2 zurücksetzen
	LD HL,0
	LD (POSWRK),HL	; <poswrk> = O
	CALL SAVCS	; <counts> = Anfangswert
	LD DE,(SADR)	; Pointer2 = Anfangswert
	POP HL
	JR NEXTB	; weitersuchen
FNDALL:	POP HL		; Stackpointer wieder herstellen !
	LD HL,(POSWRK)
	ADD HL,BC	; <poswrk>  = <poswrk> + 1
	LD DE,(BADR)
	AND A
	SBC HL,DE
	LD (POSWRK),HL	; <poswrk> = <poswrk> - <badr>
	LD HL,(POSADR)
	LD A,(POSWRK)
	LD (HL),A
	INC HL
	LD A,(POSWRK+1)
	LD (HL),A	; <pos> = <poswrk>
	LD HL,1		; RETURN-STATUS
	RET
NOTFND:	POP HL		; Stackpointer wieder herstellen !
	LD A,0
	LD HL,(POSADR)
	LD (HL),A
	INC HL
	LD (HL),A	; <pos> = O
	LD HL,1
	RET
;
;	Unterprogramm: Speichern von <countb>
;
SAVCB:	LD HL,(CBADR)
	LD A,(HL)	; LOW BYTE
	LD (COUNTB),A
	INC HL
	LD A,(HL)	; HIGH BYTE
	LD (COUNTB+1),A
	RET
;
;	Unterprogramm: Speichern von <counts>
;
SAVCS:	LD HL,(CSADR)
	LD A,(HL)	; LOW BYTE
	LD (COUNTS),A
	INC HL
	LD A,(HL)	; HIGH BYTE
	LD (COUNTS+1),A
	RET
;
;	Arbeitsspeicher:
;
BADR:	DS 2		; Adresse von <buffer>
CBADR:	DS 2		; Adresse von <countb>
SADR:	DS 2		; Adresse von <sbuf>
CSADR:	DS 2		; Adresse von <counts>
POSADR:	DS 2		; Adresse von <pos>
COUNTB:	DS 2		; <countb>
COUNTS:	DS 2		; <counts>
POSWRK:	DS 2		; <poswrk>
;
	END
Bild 4. Die Suche nach einem Bytemuster
[Hier als Z80-Quelldatei]