It is pretty likely that you will often need a loop label, and even with modules calling them _loop each time gets a bit painful.
A reusable label is made up of a sequence of + plus or - minus symbols. To avoid ambiguity with the addition and subtraction operators, you must surround them in {curly braces}. When you use the label in an expression, the label that is matched is the closest one behind you (in the case of -) or the closest one in front of you (in the case of +). I guess this really needs an example:
ld b, 10 -: ; This is label (A) ld a, b call {+} ; Calls label (B) djnz {-} ; Loops back to label (A) +: ; This is label (B) jr {+} ; Jumps to label (C) +: ; This is label (C) jp {-} ; Jumps to label (A)
Pretty cool. If you need a little more flexibility, such as nesting loops, you can lengthen the names of the labels:
ld b, 20 --: ; (A) push bc ld b, 30 -: ; (B) ; Do stuff djnz {-} ; Loops to (B) pop bc djnz {--} ; Loops to (A)
Another type of reusable label, @, exists. Rather than + and -, you need to specify the offset to it. For example:
@ ; (A) @ ; (B) jp {@} ; Jump one ahead, to C. jp {2@} ; Jump two ahead, to D. jp {-1@} ; Jump one backwards, to B. jp {-2@} ; Jump two backwards, to A. @ ; (C) @ ; (D)