org &8000 ld hl,TestArray call GetArrayLength_WordData_NullTerminated call Monitor ;show registers to screen, code omitted to keep this example short ReturnToBasic: RET GetArrayLength_WordData_NullTerminated: push hl ;we'll need this later loop_GetArrayLength_WordData_NullTerminated ld a,(hl) ;get the low byte ld e,a ;stash it in E inc hl ;next byte ld a,(hl) ;get the high byte dec hl ;go back to low byte, otherwise our length will be off. or a ;compare to zero. This is a shorter and faster way to compare A to zero than "CP 0" jr nz,keepGoing cp e ;compare to E jr z,Terminated_GetArrayLength ;both bytes were zero. KeepGoing: inc hl inc hl ;next word jp loop_GetArrayLength_WordData_NullTerminated ;back to start Terminated_GetArrayLength: pop de ;original array address is in DE ;or a ;normally it's best to clear the carry, but in this situation execution only arrives here after a compare that ;resulted in an equality to zero, which means the carry is guaranteed to be cleared. sbc hl,de ;there is no sub hl,de; only sbc srl h rr l ;divide HL by 2, since each element is 2 bytes. ret ;returns length in hl TestArray: word Apple,Orange byte 0,0 Apple: byte "Apple",0 Orange: byte "Orange",0