TITLE BLOC ENTRY BLOC ; ; Suche eines Bytemusters (SBUF) in einem ; Speicherbereich (BUFFER) ; ; Aufruf: CALL BLOC(buffer,countb,sbuf,counts,pos) ; ; , = Pufferlaengen (2 Bytes !) ; = Position von in (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 ; abspeichern LD HL,0 LD (POSWRK),HL ; 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 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 ; = - 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 ; = - 1 JR Z,FNDALL ; zu Ende: fertig LD HL,(COUNTB) AND A SBC HL,BC LD (COUNTB),HL ; = - 1 JR Z,NOTFND ; 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 ; = O CALL SAVCS ; = Anfangswert LD DE,(SADR) ; Pointer2 = Anfangswert POP HL JR NEXTB ; weitersuchen FNDALL: POP HL ; Stackpointer wieder herstellen ! LD HL,(POSWRK) ADD HL,BC ; = + 1 LD DE,(BADR) AND A SBC HL,DE LD (POSWRK),HL ; = - LD HL,(POSADR) LD A,(POSWRK) LD (HL),A INC HL LD A,(POSWRK+1) LD (HL),A ; = 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 ; = O LD HL,1 RET ; ; Unterprogramm: Speichern von ; 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 ; 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 CBADR: DS 2 ; Adresse von SADR: DS 2 ; Adresse von CSADR: DS 2 ; Adresse von POSADR: DS 2 ; Adresse von COUNTB: DS 2 ; COUNTS: DS 2 ; POSWRK: DS 2 ; ; END