Voici ce que fait ton code.
xor a ; mettre 0 dans a
rrd ; mettre les 4 bit de poids faible de a dans les 4 bits de poids fort de l'emplacement mémoire hl et placer les 4 bits de poids fort de l'emplacement pointé par hl dans les 4 bits de poids faible de l'emplacement hl et mettre les 4 bits des poids faible de l'emplacement memoire hl dans les 4 bits de poids faible de a
inc hl ; on se déplace un octet plus loin dans la mémoire
rrd ; on mélange encore mais avec un autre emplacement mémoire
etc...
On ne mélange pas avec hl mais avec (hl)
Donc si hl vaut 0x5000 comme dans l'exemple du pdf ci dessous, alors on melange avec l'emplacement mémoire et pas 0x5000...
Bref, à la fin j'imagine qu'on va se servir de a comme une composante pour le random.
Regarde ici pour rrd :
http://www.z80.info/zip/z80cpu_um.pdf
Ou ici (moins détaillé) :
http://www.z80.info/z80syntx.htm#RRD
Note que rrd est très lent (18 T-states c'est abominable).
Généralement on utilise aussi le registre r comme le fait Joe Wingbermuehle avec sa fonction random (ion) :
;-----> Generate a random number
; input b=upper bound
; ouput a=answer 0<=a<b
; all registers are preserved except: af and bc
random:
push hl
push de
ld hl,(randData)
ld a,r
ld d,a
ld e,(hl)
add hl,de
add a,l
xor h
ld (randData),hl
sbc hl,hl
ld e,a
ld d,h
randomLoop:
add hl,de
djnz randomLoop
ld a,h
pop de
pop hl
ret
Mais avec cette fonction il faut choisir un emplacement randData pour que ça fonctionne.