L’assembleur Homade propose une syntaxe simple basée sur la
notation post-fixée. Un programme Homade est composé de
plusieurs parties et repose sur un sous ensemble du langage
Forth. On doit pouvoir réaliser un interpréteur Forth qui
émulerait le comportement d'un programme Homade. L’intérêt
d'utiliser Forth est double : le processeur Homade est un
processeur à pile et donc sont code binaire est basé sur une
notation post-fixée, le langage Forth permet d'ajouter des mots
clefs dans le dictionnaire dynamiquement et cette propriété sera
très utile pour intégrer la reconfiguration dynamique d'IP dans
les couches langages dans les versions futures. Forth est
fortement utilisé dans le monde des systèmes embarqués, ici on
l'utilise aussi comme langage de description de l'assembleur lui
même. Vous pouvez lire ce papier
pour comprendre comment écrire un compilateur simple passe
en Forth. Il nous a fortement inspiré.
.
L'ensemble des compilations ont été validées sur le compilateur GNU Forth. Le
fichier de définition des mots Homade est indispensable avant la
transformation un fichier asm vers vhdl. Ce fichier est
disponible ici pour la
version V1.4. Elle devra être mis à jour en intégrant vos
propres définitions de mots en fonction des IPs que vous ajoutez
au processeur Homade pour votre propre usage.
Le résultat produit est un code VHDL qui spécifie le contenu le
la ROM contenant les instructions à exécuter par le
processeur Homade.

L'assembleur Homade repose sur trois types de composants de
calcul:
<Homadeasm> :=
<Static_IP_list>
<VC_ID_list>
<Func_ID_list>
Program
[
[<VC_decl_list>]
[<function_decl_list>] begin]
<instruction_list>
endprogram
<..._list> := [ <...> ] *
<VC_ID>:= VARIABLE <id_VC>
<Func_ID>:= VARIABLE <id_Function>
<Static_IP> := ':' <my_IP_name> [ <16bits_hexa_value> binary ! <instruction_list> ] ';'
<VC_decl> := <id_Function> VC
<function_decl> := <id_Function> FUNCTION
<instruction_list>
RETURN
<instruction> := <id_Function> CALL !
<IP_name> !
IF <instruction_list>
{ELSE <instruction_list>}
ENDIF !
REPEAT <instruction_list> {AGAIN!UNTIL}!
DO <instruction_list>
LOOP !
<Hexa_constant> BR !
<Hexa_constant> BNZ !
<Hexa_constant> BZ !
<Hexa_constant> BA !
< three_word_homade_program > <id_VC> WIM !
HLT !
NOP !
<Hexa_constant> LIT
< three_word_homade_program > : = [ <id_Function> CALL ] ! [ <IP_name> RETRUN NULL ] ! [ <Ip-name >3] ! [ <IP_name>2 RETURN ] -- not usual
variable read
variable print
program
read function
f lit
waitbtn
switch
leddup
return
print function
bufout
return
begin
repeat
read call
read call
add
print call
again
hlt
endprogram
: IPname abcd binary ;
program
IPname
hlt
endprogram
variable vc1
variable vc2
variable VC3
variable readprogramvc1 VC
vc2 VC
vc3 VC
read function
add
returnbegin
read call
read call vc1 wim
add return null vc2 wim
1234 binary 5678 binary 9ABC binary vc3 wim
vc1 callendprogram