Projet Paint pour MO5 en Forth
Modérateurs : Papy.G, fneck, Carl
Projet Paint pour MO5 en Forth
L’idée est en faire un paint assez complet avec : un effet Élastique (comme si on traçait une ligne depuis un point avec la sourie)
on pourra faire des rectangles, des cercles, des Ellipses, remplir des couleurs, un effet loupe, des Copier/Couper/Coller de parties d'images et la possibilité d'annuler des actions. On doit même pouvoir enregistrer nos œuvres.
On n'en est pas encore là.
L'idée c'est aussi de le rendre le plus explicatif possible (s'il y a intérêt de certains) pour pouvoir le transposer sur d'autres machines FORTH.
Ne me pressez pas trop SVP... Je ne peux pas y travailler tous les jours.
Re: Projet Paint pour MO5 en Forth
La touche 1 fait le point blanc, la touche 0 le point noir.
La touche Q sort du programme.
On commence par TASK qui sera la borne de début, et on travaillera en base Hexadécimale.
Code : Tout sélectionner
: TASK ;
HEX
Elle enlèvent aussi le curseur et son clignotement.
Puis une routine LM de division par 8
On aurait pu garder la séquence d'instructions 8 / , mais c'est toujours autant de temps de gagné.
Code : Tout sélectionner
CREATE DI 1A50 , 0EB6 , SMUDGE
CREATE EI 1CAF , 0EB6 , SMUDGE
CREATE /8 ( a ... ent[a/8])ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE
Ce Forth ne permet pas de redéfinir des mots existants. X est pris par l’Éditeur, alors créons XA et YA
Idem pour COLOR que nous nommerons COLOUR.
Code : Tout sélectionner
140 CONSTANT XMAX C8 CONSTANT YMAX
0 VARIABLE XA 0 VARIABLE YA
0 VARIABLE COLOUR
Code : Tout sélectionner
0 CONSTANT CASE IMMEDIATE
: OF 1 + >R COMPILE OVER COMPILE = [COMPILE] IF COMPILE DROP R> ; IMMEDIATE
: ENDOF >R [COMPILE] ELSE R> ; IMMEDIATE
: ENDCASE COMPILE DROP 0 DO [COMPILE] ENDIF LOOP ; IMMEDIATE
Celle ci en vaut une autre. D'ailleurs on recommande toujours en Forth de multiplier les définitions courtes.
8 18 20 10 représentent les valeurs des flèches.
Pour la lisibilité il est important de bien montrer l'évolution de la pile de données.
Ici ( KEYF ...) veut dire que la touche est dans le sommet de la pile, et la pile sera vide à la sortie
Le AND est une astuce de programmation qui permet d'associer la valeur de KEYF = ET le test > à 0 ou < au MAXI etc..
Le AND laissera 1 ou 0 et c'est ce que demande IF.
Code : Tout sélectionner
: X+ 1 XA +! ; : X- -1 XA +! ;
: Y+ 1 YA +! ; : Y- -1 YA +! ;
: UP ( Key ...Key) DUP 8 = YA @ 0 > AND IF Y- ENDIF ;
: DOWN ( Key ...Key) DUP 18 = YA @ YMAX < AND IF Y+ ENDIF ;
: RIGHT ( Key ...Key) DUP 20 = XA @ XMAX < AND IF X+ ENDIF ;
: LEFT ( Key ...Key) DUP 10 = XA @ 0 > AND IF X- ENDIF ;
Code : Tout sélectionner
: TROUVE-CELL ( XA, YA ... Adr, Mod8 ) 28 * OVER /8 + SWAP 7 AND ;
Code : Tout sélectionner
: FORME A7C0 DUP C@ 1 OR SWAP C! ;
Code : Tout sélectionner
: MASK-PLOT (Adr, Mod8 ... Adr, MaskPlot) CASE 0 OF 80 ENDOF 1 OF 40 ENDOF 2 OF 20 ENDOF 3 OF 10 ENDOF 4 OF 8 ENDOF 5 OF 4 ENDOF 6 OF 2 ENDOF 7 OF 1 ENDOF ENDCASE ;
: MASK-UNPLOT CASE 0 OF 7F ENDOF 1 OF BF ENDOF 2 OF DF ENDOF 3 OF EF ENDOF 4 OF F7 ENDOF 5 OF FB ENDOF 6 OF FD ENDOF 7 OF FE ENDOF ENDCASE ;
Elles sont ici entres ( ) car on peut avoir à faire un PLOT ou UNPLOT en ayant déjà l'adresse écran dans la pile.
Donc ça évitera de recalculer. On peut aussi plus facilement l'écrire en LM
Code : Tout sélectionner
: (PLOT) (Adr, Mod8 ...) MASK-PLOT OVER FORME C@ OR SWAP FORME C! ;
: (UNPLOT) (Adr, Mod8 ...) MASK-UNPLOT OVER FORME C@ AND SWAP FORME C! ;
Code : Tout sélectionner
: (?POINT) (Adr, Mod8 ...flag) MASK-PLOT SWAP FORME C@ AND IF 1 ELSE 0 ENDIF ;
Code : Tout sélectionner
: UNPLOT (XA,YA ...) TROUVE-CELL (UNPLOT) ;
: PLOT (XA,YA ...) TROUVE-CELL (PLOT) ;
: ?POINT (XA,YA ...flag) TROUVE-CELL (?POINT) ;
Code : Tout sélectionner
: PLOT-POINT (X,Y...) COLOUR @ IF PLOT ELSE UNPLOT ENDIF ;
Code : Tout sélectionner
: CHANGE COLOUR @ IF 0 ELSE 1 ENDIF COLOUR ! ;
Code : Tout sélectionner
: FLASH CHANGE FA 0 DO LOOP ;
Code : Tout sélectionner
: DRAW XA @ YA @ PLOT-POINT ;
Code : Tout sélectionner
: INIT CLS 64 YA ! A0 XA ! 1 COLOUR ! ;
Code : Tout sélectionner
: COLOUR? (Key....Key) DUP A = IF 1 COLOUR ! ELSE DUP 1B = IF 0 COLOUR ! ENDIF ENDIF ;
Code : Tout sélectionner
: ?INPUT ( .... Key) KEYF COLOUR? UP DOWN LEFT RIGHT ;
Code : Tout sélectionner
: MO4PAINT 7 0 COLOR DI INIT BEGIN ?INPUT FLASH DRAW FLASH DRAW E = UNTIL EI CLS ;
Mettre la K7 puis faire 1 9 CLOAD PAINT.
Ensuite faire 1 LOAD
Puis lancer par MO4PAINT
Code : Tout sélectionner
: TASK ;
HEX
CREATE DI 1A50 , 0EB6 , SMUDGE
CREATE EI 1CAF , 0EB6 , SMUDGE
CREATE /8 ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE
140 CONSTANT XMAX C8 CONSTANT YMAX
0 VARIABLE XA 0 VARIABLE YA
0 VARIABLE COLOUR
0 CONSTANT CASE IMMEDIATE
: OF 1 + >R COMPILE OVER COMPILE = [COMPILE] IF COMPILE DROP R> ; IMMEDIATE
: ENDOF >R [COMPILE] ELSE R> ; IMMEDIATE
: ENDCASE COMPILE DROP 0 DO [COMPILE] ENDIF LOOP ; IMMEDIATE
: X+ 1 XA +! ; : X- -1 XA +! ;
: Y+ 1 YA +! ; : Y- -1 YA +! ;
: UP DUP 8 = YA @ 0 > AND IF Y- ENDIF ;
: DOWN DUP 18 = YA @ YMAX < AND IF Y+ ENDIF ;
: RIGHT DUP 20 = XA @ XMAX < AND IF X+ ENDIF ;
: LEFT DUP 10 = XA @ 0 > AND IF X- ENDIF ;
: TROUVE-CELL 28 * OVER /8 + SWAP 7 AND ;
: FORME A7C0 DUP C@ 1 OR SWAP C! ;
: MASK-PLOT CASE 0 OF 80 ENDOF 1 OF 40 ENDOF 2 OF 20 ENDOF 3 OF 10 ENDOF 4 OF 8 ENDOF 5 OF 4 ENDOF 6 OF 2 ENDOF 7 OF 1 ENDOF ENDCASE ;
: MASK-UNPLOT CASE 0 OF 7F ENDOF 1 OF BF ENDOF 2 OF DF ENDOF 3 OF EF ENDOF 4 OF F7 ENDOF 5 OF FB ENDOF 6 OF FD ENDOF 7 OF FE ENDOF ENDCASE ;
: (PLOT) MASK-PLOT OVER FORME C@ OR SWAP FORME C! ;
: (UNPLOT) MASK-UNPLOT OVER FORME C@ AND SWAP FORME C! ;
: (?POINT) MASK-PLOT SWAP FORME C@ AND IF 1 ELSE 0 ENDIF ;
: UNPLOT TROUVE-CELL (UNPLOT) ;
: PLOT TROUVE-CELL (PLOT) ;
: ?POINT TROUVE-CELL (?POINT) ;
: PLOT-POINT COLOUR @ IF PLOT ELSE UNPLOT ENDIF ;
: CHANGE COLOUR @ IF 0 ELSE 1 ENDIF COLOUR ! ;
: FLASH CHANGE FA 0 DO LOOP ;
: DRAW XA @ YA @ PLOT-POINT ;
: INIT CLS 64 YA ! A0 XA ! 1 COLOUR ! ;
: COLOUR? DUP A = IF 1 COLOUR ! ELSE DUP 1B = IF 0 COLOUR ! ENDIF ENDIF ;
: ?INPUT KEYF COLOUR? UP DOWN LEFT RIGHT ;
: MO4PAINT 7 0 COLOR DI INIT BEGIN ?INPUT FLASH DRAW FLASH DRAW E = UNTIL EI CLS ;
- Pièces jointes
-
- PaintV1.rar
- (979 octets) Téléchargé 122 fois
-
- Messages : 7987
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Projet Paint pour MO5 en Forth
Si j'essaye un copié collé du code, il bloque car il n'y a pas la définition de "endcase".
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
- fneck
- Site Admin
- Messages : 17534
- Inscription : 01 avr. 2007 12:03
- Localisation : Drôme Provençale (26)
- Contact :
Re: Projet Paint pour MO5 en Forth
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
- Carl
- Modérateur
- Messages : 13299
- Inscription : 08 avr. 2007 13:21
- Localisation : http://www.doledujura.fr
- Contact :
Re: Projet Paint pour MO5 en Forth
carl
Re: Projet Paint pour MO5 en Forth
- Pièces jointes
-
- PaintV1.rar
- (979 octets) Téléchargé 120 fois
- Carl
- Modérateur
- Messages : 13299
- Inscription : 08 avr. 2007 13:21
- Localisation : http://www.doledujura.fr
- Contact :
Re: Projet Paint pour MO5 en Forth
-
- Messages : 7987
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Projet Paint pour MO5 en Forth
@domi: ca marche! On peut commencer à écrire un TRON avec ce code
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: Projet Paint pour MO5 en Forth
Il serait bon de pouvoir balader notre point sans qu'il imprime de couleurs, disons de façon 'Transparente'
On va créer un Flag, appelé TR qui prendra la valeur 1 pour 'transparent'
Code : Tout sélectionner
0 VARIABLE TR
Code : Tout sélectionner
: INIT CLS 64 YA ! A0 XA ! 0 COLOUR ! 1 TR ! ;
Code : Tout sélectionner
: COLOUR? DUP A = IF 1 COLOUR ! 0 TR ! ELSE DUP 1B = IF 0 COLOUR ! 0 TR ! ENDIF ENDIF DUP 2C = IF 1 TR ! ENDIF ;
Code : Tout sélectionner
: TRANSP XA @ YA @ ?POINT IF 0 ELSE 1 ENDIF COLOUR ! ;
Il faut inverser la séquence DRAW FLASH. Je place mon curseur sur une case blanche - TRANSP - me demande d'imprimer du noir ce que fait DRAW- puis Flash remplace par du blanc et le 2° DRAW l'imprime - Le dernier FLASH force l'inversion, mais si je continue en Transparent, ce n'est pas pris en compte..
Code : Tout sélectionner
: MO4PAINT 7 0 COLOR DI INIT BEGIN TR @ IF TRANSP ENDIF ?INPUT DRAW FLASH DRAW FLASH E = UNTIL EI CLS ;
Edit :Maintenant OK
- Pièces jointes
-
- PaintV1-1.rar
- (1007 octets) Téléchargé 119 fois
Re: Projet Paint pour MO5 en Forth
En tous cas merci pour ton aide ! J'y arrivais pas tout seul.__sam__ a écrit :@carl: Il ne faut pas mettre de "." après le CLOAD PAINT
@domi: ca marche! On peut commencer à écrire un TRON avec ce code
Re: Projet Paint pour MO5 en Forth
Re: Projet Paint pour MO5 en Forth
- Carl
- Modérateur
- Messages : 13299
- Inscription : 08 avr. 2007 13:21
- Localisation : http://www.doledujura.fr
- Contact :
Re: Projet Paint pour MO5 en Forth
carl
-
- Messages : 7987
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Projet Paint pour MO5 en Forth
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: Projet Paint pour MO5 en Forth
J'en suis à la phase autres Couleurs. C'est à dire choisir bleu, rouge, cyan etc...
J'ai décidé de me servir de l'écran pour faire le choix de la couleur qu'on désire peindre. Donc il fallait ouvrir
une fenêtre sur l'écran pour avoir un choix multiple.
Mais si on ouvre une fenêtre sur l'écran on efface une partie du dessin........
Je viens de finaliser la commande qui copie la moitié de l'écran dans la mémoire des screens (comme ça on pourra enregistrer en K7, et celle qui la remet sur l'écran.
MSCR = Main screen
Code : Tout sélectionner
0 CONSTANT MSCR
Code : Tout sélectionner
2100 CONSTANT CSCR
Code : Tout sélectionner
: FOND A7C0 DUP C@ FE AND SWAP C! ;
CMOVE fait une copie du contenu de 0 vers 2100 puis incrémente 0 et 2100 de 1, ceci FA0 fois.
Code : Tout sélectionner
: >MINI-CSCR MSCR CSCR FA0 FOND CMOVE MSCR CSCR FA0 1 + + FA0 FORME CMOVE ;
Code : Tout sélectionner
: MINI-CSCR> CSCR MSCR FA0 FOND CMOVE CSCR FA0 1 + + MSCR FA0 FORME CMOVE ;
Code : Tout sélectionner
: MINI-CLS FA0 MSCR DO 70 I FOND C! 0 I FORME C! LOOP ;
Dans la semaine, on appuiera une touche qui ouvrira la fenêtre supérieure de l'écran et on choisira la couleur des points.
A+