; Fill B bytes at (HL) with A fill: push bc push hl .loop: ld (hl), a inc hl djnz .loop pop hl pop bc ret ; Increase HL until the memory address it points to is equal to A for a maximum ; of 0xff bytes. Returns the new HL value as well as the number of bytes ; iterated in A. ; If a null char is encountered before we find A, processing is stopped in the ; same way as if we found our char (so, we look for A *or* 0) ; Set Z if the character is found. Unsets it if not findchar: push bc ld c, a ; let's use C as our cp target ld b, 0xff .loop: ld a, (hl) cp c jr z, .match or a ; cp 0 jr z, .nomatch inc hl djnz .loop .nomatch: inc a ; unset Z jr .end .match: ; We ran 0xff-B loops. That's the result that goes in A. ld a, 0xff sub b cp a ; ensure Z .end: pop bc ret ; Compares strings pointed to by HL and DE up to A count of characters. If ; equal, Z is set. If not equal, Z is reset. strncmp: push bc push hl push de ld b, a .loop: ld a, (de) cp (hl) jr nz, .end ; not equal? break early. NZ is carried out ; to the called cp 0 ; If our chars are null, stop the cmp jr z, .end ; The positive result will be carried to the ; caller inc hl inc de djnz .loop ; We went through all chars with success, but our current Z flag is ; unset because of the cp 0. Let's do a dummy CP to set the Z flag. cp a .end: pop de pop hl pop bc ; Because we don't call anything else than CP that modify the Z flag, ; our Z value will be that of the last cp (reset if we broke the loop ; early, set otherwise) ret ; Transforms the character in A, if it's in the a-z range, into its upcase ; version. upcase: cp 'a' ret c ; A < 'a'. nothing to do cp 'z'+1 ret nc ; A >= 'z'+1. nothing to do ; 'a' - 'A' == 0x20 sub 0x20 ret