[Philips] VG5000 Forth

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Papy.G a écrit :Ben, alors, un développement en appelant un autre, donc, les petites améliorations de l'éditeur effectuées pour l'assembleur pourraient profiter au Forth de même? :o
C'est l'idée :wink:
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

J'ai un problème avec ce forth. Il ne prend pour arithmetique que des nombres sur 16bits. Il n'y a pas de mode calcul plus poussé en forth?
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Philips] VG5000 Forth

Message par __sam__ »

Le forth est essentiellement un langage 16bits sur les machines 8/16 bits pour des raisons historiques (https://users.ece.cmu.edu/~koopman/stac ... ec4_1.html). Cependant dans certains Forth de 79, il y a des primitives 32bits qui travaillent en combinant 2 cellules 16bits ensemble sur la pile (https://www.complang.tuwien.ac.at/forth ... RTH-79.TXT)

Code : Tout sélectionner

                         11. EXTENSION WORD SETS


11.1  DOUBLE NUMBER WORD SET


2!             d addr --                                "two-store"
     Store  d  in 4 consecutive bytes beginning at addr,  as for  a
     double number.

2@             addr -- d                                "two-fetch"
     Leave on the stack the contents of the four consecutive  bytes
     beginning at addr, as for a double number.

2CONSTANT      d --                                  "two-constant"
     A defining word used in the form:
          d  2CONSTANT  <name>
     to  create  a dictionary entry for <name>,  leaving d  in  its
     parameter  field.   When <name> is later executed,  d will  be
     left on the stack.

2DROP          d --                                      "two-drop"
     Drop the top double number on the stack.

2DUP           d -- d d                                  "two-dupe"
     Duplicate the top double number on the stack.

2OVER          d1 d2 -- d1 d2 d1                         "two-over"
     Leave a copy of the second double number on the stack.

2ROT           d1 d2 d3 -- d2 d3 d1                      "two-rote"
     Rotate the third double number to the top of the stack.

2SWAP          d1 d2 -- d2 d1                            "two-swap"
     Exchange the top two double numbers on the stack.

2VARIABLE                                            "two-variable"
     A defining word used in the form:
               2VARIABLE  <name>
     to  create a dictionary entry of <name> and assign four  bytes
     for  storage  in the parameter field.   When <name>  is  later
     executed,  it  will leave the address of the first byte of its
     parameter field is placed on the stack.

D+             d1 d2 -- d3                   241           "d-plus"
     Leave the arithmetic sum of d1 and d2.

D-             d1 d2 -- d3                   129          "d-minus"
     Subtract d2 from d1 and leave the difference d3.

D.             d --                          129            "d-dot"
     Display d converted according to BASE in a free field  format,
     with one trailing blank.  Display the sign only if negative.

D.R            d n --                                     "d-dot-r"
     Display  d converted according to BASE,  right aligned in an c
     character field. Display the sign only if negative.

D0=            d -- flag                            "d-zero-equals"
     Leave true if d is zero.

D<             d1 d2 -- flag                 244           "d-less"
     True if d1 is less than d2.

D=             d1 d2 -- flag                              "d-equal"
     True if d1 equals d2.

DABS           d1 -- d2                                "d-absolute"
     Leave as a positive double number d2,  the absolute value of a
     double number, d1.  {0..2,147,483,647}

DMAX           d1 d2 -- d3                                  "d-max"
     Leave the larger of two double numbers.

DMIN           d1 d2 -- d3                                  "d-min"
     Leave the smaller of two double numbers.

DNEGATE        d -- -d                       245
     Leave  the double number two's complement of a double  number,
     i.e., the difference 0 less d.

DU<            ud1 ud2 -- flag                           "d-u-less"
     True if ud1 is less than ud2.  Both numbers are unsigned.
Si ces primitives n'existent pas, il doit être amusant de les recréer avec les opérations 16 bits classiques:

Code : Tout sélectionner

: 2dup  ( a b -- a b a b ) over over ;
: 2drop ( a b -- ) drop drop ;
L'addition 32bits est plus coton si on ne peut pas utiliser l'operation ADC (add with carry), mais c'est faisable. Je ne m'y connais pas assez en forth pour implémenter efficacement l'algo suivant (Dominique?)

Code : Tout sélectionner

c2 = a2 + b2
c1 = (((a2&b2) | ((c2&(a2|b2)))<0 ? 1 : 0)  # <--- carry de a2+b2
       + a1 + b1
(oulà ici j'ai du réflechir pour trouver cette formule qui donne la carry de a2+b2, j'espère que ne ne me suis pas planté !)

Code : Tout sélectionner

: D+ ( a1 a2 b1 b2 -- c1 c2 )
    rot   ( a1 b1 b2 a2 )
    2dup  ( a1 b1 b2 a2 b2 a2 )
    2dup  ( a1 b1 b2 a2 b2 a2 b2 a2 )
    or    ( a1 b1 b2 a2 b2 a2 b2|a2 )
    rot   ( a1 b1 b2 a2 b2|a2 b2 a2 )
    +     ( a1 b1 b2 a2 b2|a2 b2+a2 )
    dup   ( a1 b1 b2 a2 b2|a2 b2+a2 b2+a2 )
    >r    ( a1 b1 b2 a2 b2|a2 c2 )
    and   ( a1 b1 b2 a2 (b2|a2)&c2 )
    rot   ( a1 b1 (b2|a2)&c2 b2 a2 )
    and   ( a1 b1 (b2|a2)&c2 b2&a2 )
    or    ( a1 b1 ((b2|a2)&c2|(b2&a2)) )
    0 <   ( a1 b1 (-1 si carry i.e. ((b2|a2)&c2|(b2&a2))<0, 0 sinon) )
    -     ( a1 (b1+carry) ) 
    +     ( a1+b1+carry )
    r>    ( c1 c2 ) 
;
[EDIT] Apparemment si on a l'instruction M+ ( d1 n -- d2 ) qui ajoute un entier 16 bit à un entier 32bits , alors définir D+ est aisé:

Code : Tout sélectionner

: D+  ROT + >R   M+  R> + ;
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Philips] VG5000 Forth

Message par __sam__ »

__sam__ a écrit :

Code : Tout sélectionner

c1 = (((a2&b2) | ((c2&(a2|b2)))<0 ? 1 : 0)  # <--- carry de a2+b2
       + a1 + b1
(oulà ici j'ai du réflechir pour trouver cette formule qui donne la carry de a2+b2, j'espère que ne ne me suis pas planté !)
Ben c'était sur: je me suis planté. La formule devrait plutôt être un truc comme "si le bit de poids fort de a2 et celui de b2 sont à 1 on a une carry, sinon la carry n'a lieu que si a2 ou b2 ont un bit de poids fort à 1 et que c2 ne l'a pas":

Code : Tout sélectionner

c1 = (((a2&b2) | (~c2&(a2|b2)))<0 ? 1 : 0)  # <--- carry de a2+b2
       + a1 + b1
Ce qui donne:

Code : Tout sélectionner

: D+ ( a1 a2 b1 b2 -- c1 c2 )
    rot    ( a1 b1 b2 a2 )
    2dup   ( a1 b1 b2 a2 b2 a2 )
    2dup   ( a1 b1 b2 a2 b2 a2 b2 a2 )
    +      ( a1 b1 b2 a2 b2 a2 b2+a2 )
    dup    ( a1 b1 b2 a2 b2 a2 c2 c2 )
    >r     ( a1 b1 b2 a2 b2 a2 c2 )
    invert ( a1 b1 b2 a2 b2 a2 ~c2 )
    rot    ( a1 b1 b2 a2 ~c2 b2 a2 )
    or     ( a1 b1 b2 a2 ~c2 b2|a2 )
    and    ( a1 b1 b2 a2 ~c2&(b2|a2) )
    rot    ( a1 b1 ~c2&(b2|a2) b2 a2 )
    and    ( a1 b1 ~c2&(b2|a2) b2&a2 )
    or     ( a1 b1 ~c2&(b2|a2)|(b2&a2) )
    0 <    ( a1 b1 (-1 si ~c2&(b2|a2)|(b2&a2)<0, cad si carry, 0 sinon) )
    -      ( a1 (b1+carry) ) 
    +      ( a1+b1+carry )
    r>     ( c1 c2 ) 
;
[EDIT] hum " (a2&b2) | (~c2&(a2|b2))" se ré-écrit en "(a2&b2) | ~((a2+b2)|~(a2&b2))" et on voit qu'on a essentiellement deux quantités à calculer: a2+b2 et a2&b2. Ca se factorise et il y a une belle optimisation à faire pour celui qui est habitué à manipuler les calculs sur la pile. Si je me lance au feeling: ( a2 b2 ) dup2 dup2 + rot and invert or invert rot and or. C'est bon?
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Bonjour à tous

Je brule d'envie de participer, mais malheureusement je ne peux pas - en fait je me l'interdit parce que sinon je plonge dans le sujet et je finis par délaisser ce à quoi je suis tenu.
Sans rentrer dans les détails je prépare la cession d'une TPE courant 2016 et je suis trop impliqué.

Comme expliqué à l'époque ce Forth est une adaptation d'une version "noyau FORTH" pour TRS80 puis ZX81 trouvé dans une revue brésilienne. Considérant qu'à l'époque il fallait faire tourner ce compilateur sur des machines 16 K en laissant de quoi écrire un éditeur et faire des programmes, la priorité est donc restée aux 16 bits (15 + 1 du signe)
- On peut modifier ce FORTH pour accepter le 32 bits. Selon le standard FORTH
124 <CR> est 16 bits
124. <CR> est 32 bits
donc Pour passer aux 32 bits il convient d'abord de modifier dans la routine d'interprétation OUTIN le mot ?NUMBER en lui demandant d'accepter un point après un nombre et de considérer ceci comme un 32 bits.

La routine OUTIN lit le buffer d'entrée et sépare chaque mot (aspace - token) puis (par qsearch) vérifie si le mot est dans la dictionnaire. S'il n'y est pas (par qnumber) vérifie s'il s'agit d'un nombre ...... c'est là qu'il faut lui demander de vérifier si ce n'est pas un 32 bits.

Version "ForthOriginal.asm"

Code : Tout sélectionner

cf_outin:                                      	;  'code field'
        dw c_colon	; 
        dw cf_aspace	; 
        dw cf_token	; 
        dw cf_qsearch	; 
        dw cf_starif	; 
        db $12	; 
        dw cf_qnumber	; 
        dw cf_0equal	; 
        dw cf_starif	; 
        db $17	; 
        dw cf_ftoken	; 
        dw cf_fetch	; 
        dw cf_starif	; 
        db $12	; 
        dw cf_starwhile	; 
        db $e7	; 
        dw cf_qexecut	; 
        dw cf_ftoken	; 
        dw cf_fetch	; 
        dw cf_starif	; 
        db $06	; 
        dw cf_starwhile	; 
        db $DB	; 
        dw cf_question	; 
        dw cf_stop	;  
Je ne sais pas si j'avais donné le fichier source, mais le voici
ForthOriginal.zip
(11.84 Kio) Téléchargé 173 fois
. Excusez mais les notes sont en portugais ;)
En 2010 j'avais fait cette modif dans le fichier "ForthOriginacompletl.asm"
ForthOriginalcomplet.zip
(16.15 Kio) Téléchargé 175 fois
amusez vous bien et désolé de ne pas pouvoir être avec vous...
Vivement la quille !

<Edit> et bonne année à TOUS !!!! <fin Edit>
Xavier

Re: [Philips] VG5000 Forth

Message par Xavier »

Merci pour tout, Dominique. Pour ton travail sur les Forths et ton implication déjà publiée et documentée pour les passionnés.
Je rappelle que la version du compilateur Forth pour Zx81 (Z80/16k) est incluse dans l'émulateur "Vb81 XuR", incluant une librairie de fonctions mathématique et une compatibilité FiG Forth.
<lien vers Vb81 XuR>

à voir aussi:
http://www.forthworks.com/retro
Car le site de Dominique [http://retroforth.com] est réorienté.

Code : Tout sélectionner

Zx81 Forth Compiler.
--------------------



Revised and adapted by Dominique 2009/10

Change done :

Ascii ZX81 conversion table:

		+------------+----------------+
		| ZX81 Forth | Standard Forth |
		+------------+----------------+
		|    (?)     |       '        |
		|   -( )-    |       [ ]      |
		|    +$      |       +!       |
		|    $       |       !        |
		|    C$      |       C!       |
		|    C£      |       C@       |
		|    £       |       @        |
		|    N>      |       #>       |
		|    <N      |       <#       |
		|    N       |       #        |
		|    NS      |       #S       |
		|    NIN     |       #IN      |
		|    *N      |       *#       |
		|    CAR     |       ASCII    |
		+------------+----------------+

For better FIG FORTH’s Standard 
1 - WE RENAME the original words
PAGE to CLS
PTC to AT
TYPE to TIPE (For later correct FIG Standard definition of TYPE) 

2 - Change on the following definition given by the Author:

a) In order to prevent problems with the IMMEDIATE dictionary, FORGET became now 
: FORGET CURRENT £ CONTEXT $ (?) DUP BEGIN COMPILER £ OVER OVER < WHILE DUP C£ + 1+ £ COMPILER $ REPEAT DROP 2 - £ CURRENT £ $ DP £ C£ 3 + - DP $ ;

b) Correction of some tipo with the GRAF routine.
c) several words as ARRAY REVERSE INKEY etc were not included in this file, as they will be included later in specific binary files such as GameUtility – MathUtility – GraficUtility aso  Remembering that they can be included at any time 

d) We switched STATE and MODE, giving back to STATE his original FIG purpose of Interpretation/compilation flag.
So,  in the THOMAS LÖW document

CASE: became 
: CASE: <BUILDS STATE 1SET DOES> SWAP 2 * + £  EXECUT ;

;CODE became
: ;CODE *N SCODE , STATE 0SET ; IMMEDIATE


3 - A Forth Editor written in Forth, beginning at h8000, were included. 


4 - VLIST list the dictionary.

EDIT            EP              COPY            S-AR            
S-AV            RETI            NIN             AJO             
REC             AVA             MP              LECIN$          
LECIN£          LECIN           LEC             DELETE          
INSERT          (IS)            (DS)            (DL)            
(IL)            CMOVE>          FORMAT          CLEAR           
ERASE           FILL            WRITE           -->             
COMPIL          READ            CMOVE           (LOOP-SCR)      
(LOOP-LINE)     (CS)            (CL)            (WL)            
(RL)            ENTETE          LIST            SCR             
(SCR)           (LINE)          FIRST           LIMIT           
SCR/DISK        L/SCR           B/LIN           R0              
S0              >R              MAX             MIN             
*               MULT            L-EDIT          VLIST           
LIST-VOC        LIST-WORD       LIST            L-EDIT          
LOAD            AT              /MOD            NOT             
XOR             OR              /               ALLOT           
MAX             MIN             HEX             DECIMAL         
FORGET          IMMEDIATE       <BUILDS         OUTIN           
VARIABLE        CONSTANT        DOES>           (?)             
:               CREATE          ?NUMBER         SCODE           
.               NS              N               PICK            
NEXT            END,            ?SEARCH         ENTRY           
?EXECUTE        DO,             D/MOD           NUMBER          
*               CAR             <N              C£              
J               N>              TYPE            SIGN            
R>              I               1SET            0SET            
AND             0=              +SP             EXECUT          
£               CLS             SWAP            -               
+               ,               *N              $               
ABS             TOKEN           SEARCH          KEY             
DROP            EMIT            ROT             0<              
>               <               DUP             DP              
STATE           COMPILER        CURRENT         CONTEXT         
ASPACE          BASE            FTOKEN          MODE            
CURSOR          LBP             INPUT           QUESTION        
=               HERE            CR              C$              
OVER            C,              1+              *(              
2+              +$              *WHILE          *END            
*ELSE           *IF             
                         
."              LEAVE           +LOOP           REPEAT          
WHILE           UNTIL           BEGIN           LOOP            
DO              ELSE            THEN            IF              
;                               
                             

5 - HERE point at h5EDB



Original project by
Professor Antonio Costa for "Compilador FORTH" Micro Sistemas N° 22 - august 1983.
http://www.datacassete.com.br/revistas/ms/20/micro_sistemas_22.pdf\

Zx81 conversion by
Tomas Löw for his conversion to ZX81 computer
Based on Ericson Benjamim's scans and the PDF documents.

Dominique.
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Vu l'activité sur forth, je me suis dit que j'allais travailler sur le Forth pour VG5000.
Je suis tombé sur un bug dans l'éditeur Dominique. Si tu tapes directement backspace (sans rien avoir tapé avant) tu obtiens le caractère ASCII 7. Normalement, il ne devrait rien se passer. J'ai essayé de fixer ce bug. Mais aucune idée d'où vient le problème. Quand on tape un texte la touche backspace agit correctement. C'est simplement quand on l'utilise comme première touche que le bug apparaît.

Dominique, peux-tu y jeter un oeil?
Pièces jointes
Screenshot_20160508_083955.png
Screenshot_20160508_083955.png (5.86 Kio) Consulté 6287 fois
Dernière modification par joaopa le 08 mai 2016 20:56, modifié 1 fois.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Salut

Je veux bien essayer de regarder, quoique ce moniteur soit ancien. Pourrais tu m'envoyer une copie de la K7 afin que je retrouve la bonne "source". J'ai fini par faire différentes versions et le manque de temps m'avait empêché de corriger tous les bugs.

! A+
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Ne cherche pas. Je viens de trouver. C'est complètement tordu. Dans le listing du forth, ce cas a été prévu. Et dans ce cas la, ca émet un son. Je suppose que sous Zx81, la routine de ce son est call 7. Forh appelle cette routine. Dans notre cas, on se retrouve avec un emit_c pour la valeur de A=7, ce qui affiche le caractère vu dans la prise d'écran. P..ain, 1heure et demie pour trouver cette connerie!!
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

Je crains que le débug soit assez long.
Un des problèmes vient des valeurs des touches clavier qui doivent être modifiées.
Mais pour celà il faut suivre la logique du compilateur.
Je te conseille de mettre un point d'arret à 64EB (C'est de la que la routine waitakey est censée avoir en A la valeur de la touche.)
Si tu fais un "pas à pas" tu tombes rapidement sur la routine EXPECT (5DA0).
Il faut comprendre ce que fait EXPECT. Elle est censée tester la Flèche gauche (entre autres). Or la valeur qu'elle attend pour flèche gauche est celle donnée en 5DB8 = 0E 00 ! Or la flèche, si je crois me souvenir doit être 08 (et non 0E).
Il y aurait déjà ça à corriger plus plus plus des tas de trucs
Je te propose, si tu es d'accord, d'attendre un petit peu avant que je me re-plonge; Il faut un jour ou l'autre mettre droit ce Forth bancal. Pour ma part je termine les routines 32 bits de division, puis j'ai hélas de gros soucis familiaux qui vont m’empêcher de me concentrer sur le sujet pour une quinzaine.
J'aimerai qu'on puisse y travailler ensemble puisque tu domines parfaitement le VG d'après ce que j'ai pu voir de tes excellents travaux précédents.
OK ? Merci
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Philips] VG5000 Forth

Message par __sam__ »

joaopa a écrit :Dans notre cas, on se retrouve avec un emit_c pour la valeur de A=7, ce qui affiche le caractère vu dans la prise d'écran.
Il me semble en effet qu"'en ASCII ctrl-g alias chr(7), alias "BEL", alias "\a" en C fait beep. C'est pas tout récent, ca date du code Baudot de 1870 :mrgreen: https://www.wikiwand.com/en/Bell_character
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [Philips] VG5000 Forth

Message par Dominique »

joaopa a écrit :Je suppose que sous Zx81, la routine de ce son est call 7.
Je pense que ce call 7 ne vient pas du ZX81. Le listing VG5000beta n'a rien à voir avec le ZX81, mais avec l'implantation standard du Figforth pour les machines avec ce processeur
Le document dit : "Version for TC/TR STD bus CPU card."
Dans les instructions FIGFORINSTRUCT.txt ils disent :
. . . .
3. Edit the FIG assembly listing on your system, re-write the I-O
routines, and assemble.

4. Load someone else's object code up to the installation dependent
code. Hand assemble equivalents for your system and poke in
with your monitor. Begin execution and type in (self-compile)
the rest of the system. This takes about two hours once you
understand the structure of Forth (but that will take much more
time!).


Et c'est ce que je n'ai pas terminé. Ce qui bloque comme je t'ai dit c'est ce travail d'adaptation des adresses et touches clavier.
J'en avais fait une grande partie, mais il manquait encore ce travail de révision.
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Bonjour,

étant donné que je viens de finir un interpréteur Lisp pour VG5000, il faut vraiment finir ce Forth. Ainsi le VG5000 commencera à avoir une logithèque de langage un peu correcte.

Voici ce que je compte implémenter dans ce forth: sauvegarde de l'espace de travail (ce qui évitera le retour au basic pour enregistrer), chargement de l'espace de travail et chargement d'un programme forth écrit dans l'éditeur de texte FICHIER. Il suffira juste d'adapter ce que j'ai fait dans 8KLIsp. Ca ne devrait pas être trop difficile.
J'ai apporté quelques améliorations à l'éditeur. Je les porterai pour ce forth.
Ensuite, faire une deuxième version avec des routines de calculs mathématiques en nombres flottants. Là il faudra l'extension 16K pour en profiter un peu.

Et le rêve ultime: une cartouche Fig-Forth pour remplacer le basic résident et ainsi disposer des 16Ko de base du VG5000.
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: [Philips] VG5000 Forth

Message par joaopa »

Bonjour,

j'ai essayé de taper le listing de sokoban avec le compilateur forth présent dans ce topic, mais j'échoue lamentablement. Ce listing est-il prévu pour le fig-forth de VG5000 ou c'est pour un autre?
Merci d'avance

Je demande ceci car j'ai commencé à améliorer ce fig-forth (la partie editeur....), mais je bloque pour la suite
Pièces jointes
FigForth.z80.zip
(14.05 Kio) Téléchargé 136 fois
Répondre