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
|