Revenir au plan du site


Mini routines Z80 utiles


NEG HL
xor a
sub l
ld l,a
sbc a
sub h
ld h,a

Ajouter une valeur 8 bits signée à HL
; HL = HL + C
ld a,c
add a  ; récupère le signe de C
sbc a  ; si signé, alors A=255 sinon A=0
ld b,a ; répercuter le signe de C dans BC
add hl,bc

Valeur absolue de HL
absHL
bit 7,h : ret z ; positif, rien à faire
xor a : sub l : ld l,a
sbc a : sub h : ld h,a
ret

Valeur absolue de BC
absBC
bit 7,b : ret z ; positif, rien à faire
xor a : sub c : ld c,a
sbc a : sub b : ld b,a
ret

Valeur absolue de DE
absDE
bit 7,d : ret z ; positif, rien à faire
xor a : sub e : ld e,a
sbc a : sub d : ld d,a
ret

Valeur absolue de A
absA
or a : ret p ; positif, rien à faire
neg
ret

Comparaison de HL et DE :
CP_HL_DE
or a
sbc hl,de
add hl,de
ret

Effacer une zone mémoire sur une longueur donnée
memset
xor a
.loop
ld (hl),a
cpi
jp pe,.loop
ret

Désactiver le système temporairement :
desactiver_systeme
di
ld hl,(#38) : ld (restaure_systeme+1),hl
ld hl,#C9FB : ld (#38),hl
ei
ret
restaure_systeme
ld hl,#C9FB : ld (#38),hl
ret

Affichage décimal de la valeur de HL
dispHL
ld bc,-10000 : call num1
ld bc,-1000 : call num1
ld bc,-100 : call num1
ld c,-10 : call num1
ld c,-1
num1
ld a,'0'-1
num2
inc a
add hl,bc
jr c,num2
sbc hl,bc
call affiche_caractere_ascii
ret

Comment calculer la racine carré de HL? Voici une routine qui le fait en arrondissant à l'inférieur :
racineHL ; résultat dans le registre E
ld bc,#800
ld e,c
xor a
.shl4loop
add hl,hl
rl c
adc hl,hl
rl c
jr nc,$+4
set 0,l
ld a,e
add a
ld e,a
add a
bit 0,l
jr nz,$+5
sub c
jr nc,$+7
  ld a,c
  sub e
  inc e
  sub e
  ld c,a
djnz .shl4loop
bit 0,l
ret z
inc b
ret