Un champ numériquePour 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 endstructNous 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 : retEt 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.explode8Avec 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 ]
Roudoudou CPCrulez[Content Management System] v8.732-desktop Page créée en 060 millisecondes et consultée 26 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|