Revenir au plan du site

Un champ numérique


Pour gérer un champ numérique, on va avoir besoin d'afficher la valeur du champ, d'avoir éventuellement une référence mémoire depuis laquelle lire et copier la valeur.
struct s_numerique8
struct s_gui gui ; commun à tous les objets de la GUI
adresse_ecran defw ; position écran
adresse_valeur defw 0 ; pointeur sur la valeur
panneauChar defs 2 ; pour afficher le mini-panneau
valeurTexte defs 3 ; valeur en texte +1 terminateur
endstruct
struct s_numerique16
struct s_gui gui ; commun à tous les objets de la GUI
adresse_ecran defw ; position écran
adresse_valeur defw 0 ; pointeur sur la valeur
panneauChar defs 2 ; pour afficher le mini-panneau
valeurTexte defs 5 ; valeur en texte +1 terminateur
endstruct

Nous aurons seulement des touches de contrôle à gérer sur ces champs (pas de saisie texte prévue pour le moment)

Le curseur haut/bas pour incrémenter, la touche Shift pour incrémenter le poids fort des valeurs 16 bits, et le TAB pour sortir du champ. Le reste est trivial et similaire aux autres objets.

GUINumerique8
GuiObjetActionParDefaut (void)
cp CODE_HAUT : jp z,.incremente
cp CODE_BAS : jp z,.decremente
.texte
ret

.incremente ld hl,(ix+s_numerique8.adresse_valeur) : inc (hl) : jr .affiche
.decremente ld hl,(ix+s_numerique8.adresse_valeur) : dec (hl)

.affiche
ld hl,(ix+s_numerique8.adresse_valeur) : ld a,(hl) ; A=valeur 8 bits
ld de,ix : ld hl,s_numerique8.valeurTexte : add hl,de ; HL=destination texte
call .explode8
ld a,(ix+s_gui.selectionne) : add a : add hautBasSprites
;ld (ix+s_numerique8.panneauChar),a : inc a : ld (ix+s_numerique8.panneauChar+1),a
ld de,ix : ld hl,s_numerique8.panneauChar : add hl,de : ld (hl),a : inc hl : inc a : ld (hl),a : dec hl : exx
ld de,(ix+s_numerique8.adresse_ecran)
jp GUIDisplayString

.explode8 push af : rrca : rrca : rrca : rrca : and #F : call .store4
pop af : and #F
.store4 cp 10 : jr c,.decimal : add 'A'-10 : ld (hl),a : inc hl : ret
.decimal add '0' : ld (hl),a : inc hl : ret

Et la version 16 bits qui dispose de deux types d'incréments
GUINumerique16
GuiObjetActionParDefaut (void)
ld hl,shiftCTRL : ld l,(hl) : bit 5,l : jr z,.avecShift ; preserve A
cp CODE_HAUT : jp z,.incremente
cp CODE_BAS : jp z,.decremente
.avecShift
cp CODE_HAUT : jp z,.incrementeFort
cp CODE_BAS : jp z,.decrementeFort

.texte
ret

.getval16 ld hl,(ix+s_numerique16.adresse_valeur) : ld e,(hl) : inc hl : ld d,(hl) : ex hl,de : ret
.incremente call .getval16 : inc hl : jr .setval16
.decremente call .getval16 : dec hl : jr .setval16
.incrementeFort call .getval16 : ld bc,#100 : add hl,bc : jr .setval16
.decrementeFort call .getval16 : ld bc,-#100 : add hl,bc
.setval16 ex hl,de : ld (hl),d : dec hl : ld (hl),e : jr .afficheDE
.affiche
call .getval16 : ex hl,de ; DE=valeur 16 bits
.afficheDE
ld bc,ix : ld hl,s_numerique16.valeurTexte : add hl,bc ; HL=destination texte
call .explode16
ld a,(ix+s_gui.selectionne) : add a : add hautBasSprites
ld de,ix : ld hl,s_numerique16.panneauChar : add hl,de : ld (hl),a : inc hl : inc a : ld (hl),a : dec hl : exx
ld de,(ix+s_numerique16.adresse_ecran)
jp GUIDisplayString

.explode16 ld a,d : call GUINumerique8.explode8 : ld a,e : jp GUINumerique8.explode8

Avec une petite accélération des répétitions dans la gestion clavier, on peut naviguer sans difficulté dans les valeurs.

Comme les sources changent tous et un peu partout, je vous ai fait un petit [ ZIP ]