I think this is around what you want:
;############################
;input: hl = start of string
; de = string to find
;output: hl = start of string in string
; b = offset to start of string
; carry if string not found
inString:
ld b, 0
inStringLp:
ld a, (hl)
or a
scf
ret z
ld a, (de)
cp (hl)
jr nz, notAMatch
push hl
push de
checkMatchLoop:
inc hl
inc de
ld a, (de)
or a
jr nz, notTotalMatch
pop de
pop hl
ret
notTotalMatch:
cp (hl)
jr z, checkMatchLoop
pop de
pop hl
notAMatch:
inc b
inc hl
jr inStringLp
I could make it faster, but it would be bigger, so it's a trade.
Edit:
After reading that section of 28 days, I should mention that you need to use zero terminated strings for this. You will almost never use length prefixed, so don't worry about that.