MiniForthFpga V1.0
© F.BROTON Février 2003
http ://fbroton.free.fr/MiniForth.html
un émulateur de la carte
Coeur FORTH V0.99
© JPB.FORTH Février 2003
http ://jpb.forth.free.fr.
Ce programme est un
démonstrateur/émulateur/débogueur de la carte Coeur Forth Fpga présentée sur le
site http ://jpb.forth.free.fr.
Il permet donc d'évaluer
cette carte, avant de la construire, et de faire quelques petits programmes en
FORTH. Néanmoins un certain nombre de différences existe et le comportement
réel sera parfois différent. Le but n’a pas été de coller au plus près de la
carte (car le hard de cette carte peut évoluer selon les choix de réalisation
et le budget de chacun) mais de donner une bonne idée de ce que l’on pouvait en
attendre. Le plus gros des restrictions et différences est détaillé ci-dessous,
au fil de l’eau.
Cet émulateur a été conçu
pour tourner sur tout PC équipé d’un Windows
32 bits (95, 98, Me, XP, NT, 2000). Il nécessite une machine au moins à 300 MHz
et a été testé sur des PC à 800 MHz et 1,2 GHz. Avec une dégradation notable
des performances, il peut également tourner sur un iMac avec un émulateur PC
supportant Windows.
Tant qu’il n’y a pas trop
de calculs, ce qui est très souvent le cas (utilisation de petits programmes ou
du multitache temps réel) l’émulation est assez fidèle. Néanmoins l’interface
graphique consomme beaucoup de ressources. C’est d’ailleurs pourquoi elle a été
partiellement accélérée par l’émulateur.
La base de ce démonstrateur est un émulateur de CPU FPGA. Ce cpu est un cpu
propriétaire dont les instructions au nombre de 32 sont spécialisées pour le
FORTH. En plus du CPU, une émulation de la mémoire et des périphériques
existant sur la carte a été faite, notamment pour assurer les entrées/sorties
(de base un terminal série, une souris et un écran VGA). Le programme peut se
suffire à lui seul, mais on peut aussi connecter des terminaux sur les ports du
PC, le PC émulant alors seulement le fonctionnement de la carte.
6)
L'émulateur de mémoire FLASH
8)
L'émulateur de registres d’extension
9)
L'émulateur de circuit reset
10)
L’émulateur de port A et port B
12)
Principes généraux de l'interface graphique
18)
Compatibilité, version et bugs
19)
Re-installation du noyau FORTH
20)
Chiffres, remerciements, projets et copyrights
Créez un répertoire temporaire sur le disque dur (ou
servez vous du c:\Temp de Windows) et recopiez les fichiers setup.exe, MiniFort.001 et MiniFort.002 (du kit de distribution)
dedans, éventuellement après les avoir dézippés.
Lancez le setup.exe et modifiez éventuellement le chemin
d'installation (par défaut c:\MiniForthFpga) MiniForthFpga Directory.
Détruisez le répertoire temporaire et lancez MiniForthFpga.exe.
Utilisez toujours
le kit de distribution. La recopie des
fichiers de l’application (MiniForthFpga.exe et MiniForthFpga.uir) ne suffit
pas. Vous pouvez déplacer ces 2 fichiers sur votre machine dans un autre
répertoire si vous voulez mais pour les installer sur un autre PC, utilisez le
kit, car d’autres fichiers (dll,…) sont aussi installés.
Tous les réglages utilisateurs sont stockés dans un
fichier MiniForthFpga.ini qui est
créé s’il n’existe pas. Si le programme a un comportement anormal, commencez
par supprimer ce fichier. Il sera recréé avec des valeurs par défaut qui
doivent satisfaire le plus grand nombre et qui de plus sont stables. Faites de
même si vous n’arrivez plus à atteindre certaines fenêtres.
Un quatrième fichier MiniForthFpga.bot
est également installé. Il contient le code minimal de boot qui permet de
télécharger le code FORTH de base. Ceci constitue le minimum vital. Pour plus
de simplicité, un cinquième fichier MiniForthFpga.bin
est installé. Il reflète le contenu de la flash et contient l’une des
dernières versions du système de JPB. Vous aurez par la suite tout le loisir de
faire vos mises à jour du système à partir du site JPB FORTH.
Les seuls fichiers vitaux sont donc l’exécutable MiniForthFpga.exe, le fichier de
ressources graphiques de l’émulateur MiniForthFpga.uir,
et le fichier image de la ROM de boot JPB FORTH MiniForthFpga.bot, que l’on peut aussi récupérer sur l’internet.
Sous Windows NT/2000 vous devrez être administrateur lors
de l’installation sur une machine (ce n’est plus vrai ensuite pour pouvoir
l’utiliser).
Cet émulateur a été conçu pour pouvoir se passer d’un
programme annexe de type HyperTerminal (qui est livré avec Windows et qui n’est
d’ailleurs pas un exemple de stabilité !). Il a pour avantage d’être
intégré et donc d’être sous contrôle. Il n’a pas un nombre de colonnes
prédéfini et s’adapte à la largeur que vous donnerez à la fenêtre (rappel en
bas à gauche) (ici 43 colonnes par 18 lignes).
Dans le menu Terminal/Réglages on peut librement changer les couleurs du
fond d’écran et du texte. Si on active le menu Terminal/Verrouillage Majuscule,
tous les caractères alphabétiques seront mis en majuscule à la saisie avant
d’être envoyé au FORTH, qui est un grand adepte des majuscules.
Le menu Terminal/Efface Terminal nettoie
entièrement l’écran de façon irrémédiable. Il est possible d’enregistrer une
image texte de l’écran y compris l’historique (lignes au dessus de l’écran,
accessibles par l’ascenseur) dans un fichier par le menu Terminal/Sauve Terminal.
Une LED verte FPGA oscillante indique que le FPGA
tourne bien. Elle devient rouge en cas d’erreur de fonctionnement ou d’arrêt du
CPU.
Vous ne serez amener à utiliser ce terminal que quand
vous voudrez installer un nouveau logiciel applicatif de base FORTH. Il
correspond en fait à ce qui se passe sur la liaison série, quand il n’y a pas
d’interface graphique active. Pour passer du mode Terminal texte au mode
Vga graphique, remuez l’interrupteur Vga/Term visible en bas à gauche
de la fenêtre.
La saisie d’une ligne FORTH ne gère en sus des caractères
que les touches Suppr, Backspace, flèche droite/gauche, tabulation (convertie
en espace) et Echap. Le reste est non géré. En dehors de la saisie intégrale
des commandes au clavier, plusieurs façons existent pour se simplifier la
tache :
·
Le CTRL
C, CTRL D (équivalent au CTRL C, CTRL V habituel de Windows) dans le
terminal lui même ou entre une autre application et le terminal (dans l’autre
sens continuez d’utiliser le CTRL V !).
·
Le double-clic gauche à la souris sur
un mot présent dans le texte du terminal suivi par un clic droit recopie ce mot
dans la saisie suivi d’un espace (au lieu du clic droit on peut aussi utiliser
le CTRL Z).
·
Le menu Terminal/Charge Terminal
ou CTRL L permet de déposer dans la
saisie tout le contenu d’un fichier texte. C’est la méthode officielle pour
télécharger tous les programmes sur la carte. Le transfert peut être interrompu
par CTRL C, X, Q, ou S.
Pour augmenter les performances d’affichage, celui-ci ne
se fait pas en continu mais lors des périodes de rafraîchissement de toutes les
fenêtres, à savoir une fois toutes les Emulateur/Réglages/Intervalle Affichage périodes
HTR. Pour ne pas avoir un affichage trop
saccadé on prendra soin de ne pas mettre une valeur trop grande dans ce
champ (restez en dessous des 200 millisecondes pour le produit Intervalle
Période x Intervalle Affichage).
Les restrictions actuelles
de l'émulateur sont:
·
Pour une raison système, on ne peut pas
écrire sur la dernière ligne de l’écran.
·
Pour une autre raison système,
l’historique de l’émulateur (lignes au dessus de l’écran) a été limitée à 2048
lignes.
·
Pour une dernière raison système, on ne
peut pas faire de CTRL C, CTRL V. Le CTRL V étant déjà interprété par le
système, il faut apprendre la séquence CTRL C, CTRL D qui fait la même chose.
Et si vous êtes un utilisateur habitué de Windows vous verrez que les habitudes
sont dures à changer !
L’écran VGA est la véritable nouveauté pour les
utilisateurs de la carte CŒUR FORTH. Il apporte à un faible coût,
puisque intégré dans le FPGA, la possibilité d’avoir une interface graphique
qui peut supporter le multi-fenêtrage et utiliser un périphérique de pointage
tel qu’une souris. De part la quantité de mémoire allouée, le nombre de couleur
est limité à 256. Sur l’émulateur différentes résolutions existent, à l’inverse
de ce que la carte est capable de faire (1 seule résolution).
La version du CŒUR FORTH V0.99 ne gère que le 640x480. Si
pour une future version vous avez besoin de changer la résolution, allez dans Emulateur/Réglages/Résolution.
La souris PC est automatiquement déroutée vers la souris
de l’émulateur quand elle passe sur la fenêtre de l’écran VGA afin d’avoir
un fonctionnement des plus souples. Les menus de l’émulateur restent
accessibles à chaque instant. Les fenêtres du système FORTH peuvent être
déplacées et redimensionnées, bien que la façon de faire diffère du monde
Windows. Les icônes s’ouvrent en double-cliquant dessus.
La gestion de l’écran graphique consomme beaucoup de
temps processeur sur la carte et sur l’émulateur. Aussi certaines optimisations
ont été faites dans l’émulateur pour accroître la fluidité et par là même le
confort.
Pour passer du mode Vga graphique au mode Terminal
texte, remuez l’interrupteur Vga/Term visible en bas à gauche de la
fenêtre.
Les restrictions actuelles
de l'émulateur sont:
·
A cause des optimisations, l’écriture
d’un pixel par le FPGA n’apparaît pas instantanément dans la fenêtre de
l’émulateur (à savoir une fois toutes les Emulateur/Réglages/Intervalle Affichage périodes
HTR). De plus des pixels qui n’ont pas été modifiés exactement en même temps
vont apparaître simultanément. Mais cela reste très peu visible.
·
Les 256 couleurs de la palette sont
recalculées et pourraient être légèrement différentes sur la vraie carte.
L'émulateur qui a été écrit spécialement pour ce
programme est un émulateur complet
du Fpga, voire plus. C'est à dire que certains mécanismes non implémentés dans
le Fpga existent dans l’émulateur, notamment des contrôles d’adressage plus
poussés pour aider la mise au point. Il a été écrit comme on dit couramment
« from scratch » à partir de la spécification de JPB.
Comme le Fpga est un cpu non figé, il se peut que dans
d'éventuels développements futurs, des opcodes soient modifiés. Dans ces cas
là, il faudra veiller à avoir un émulateur et un logiciel applicatif de base
compatible. Sinon, l’émulateur risquera de s'arrêter de lui même et d’afficher
une erreur. A tout instant on peut faire un reset quelconque (chaud ou froid) de la carte pour redémarrer
l’applicatif. Néanmoins il vaut mieux éviter de le faire quand la LED d’accès à
la FLASH clignote en JAUNE (accès en écriture en cours). Dans ce cas là on risquerait
de redémarrer avec une FLASH incohérente.
L’émulateur FPGA fonctionne en mode normal (RUNNING),
peut être suspendu (menu Emulateur/Arrêt) ou passer en mode
trace RUNNING (liste toutes les instructions exécutées et registres) ou enfin
en mode trace pas à pas (permet de surprendre la naissance d’une bogue).
Lors d’un RESET froid ou très froid, tous les registres
sont réinitialisés.
A l’affichage tous les registres sont affichés en
hexadécimal.
A noter que le registre S est le registre en
dessous du sommet de la pile (T).
Les .0, .1 ou .2 qui sont dans l’affichage du PC
indique quelle instruction du mot de 16 bits est en cours (il peut y en avoir
3).
Le FPGA est orienté 16 bits.
Les restrictions actuelles
de l'émulateur sont:
·
Contrôle supplémentaire de l’espace
d’adressage.
·
Surveillance des pointeurs de pile lors
de l’exécution des opcodes manipulant les piles.
·
Les instructions implémentées peuvent
encore contenir des bogues (tout n'a pas pu être testé). Dans ce but il existe
dans un menu Débogueur/Trace qui s'active par Débogueur/Réglages et qui permet de tracer le comportement
du FPGA pendant un paquet d'instructions successives.
·
Gestion des vecteurs d'exception.
Seules les exceptions utilisées ont été déverminées.
A titre d’information, le source de l’émulateur du FPGA
fait 400 lignes de C du fait du faible nombre d’instructions, processeur RISC
oblige (celui du 68000 qui est un CISC en faisait 1500). En plus de
l'émulateur, le programme contient un désassembleur FPGA orienté FORTH
(recherche des noms de fonctions).
13 Registres |
|||
Adresse IO Réelle |
Nom |
Description |
Largeur utile |
Variable |
T |
Sommet de la
pile de donnée |
16 |
Variable |
R |
Sommet de la
pile de retour |
16 |
Aucune |
A |
Registre
d’adresse (poids faible) |
16 |
0 |
PA |
Page A (poids
fort) |
5 |
1 |
PR |
Page R (poids
fort) |
5 |
2 |
PNTT |
Pointeur de la
pile de donnée |
8 |
3 |
PNTR |
Pointeur de la
pile de retour |
8 |
4 |
CE |
Contrôle Etat |
5 |
5 |
SA |
Sauvegarde A
(pendant les ITs) |
16 |
6 |
SPA |
Sauvegarde Page
A (pendant les ITs) |
5 |
7 |
SPR |
Sauvegarde Page
R(pendant les ITs) |
5 |
8 |
SCE |
Sauvegarde
Contrôle Etat(pendant les ITs) |
5 |
Aucune |
PC |
Pointeur
programme d’exécution |
21 |
33 Instructions |
||
Code |
Mnémonique |
Description |
0 |
JMP |
Branchement relatif inconditionnel |
1 |
JZ |
Branchement relatif si T est égal à 0 |
2 |
CALL |
Empilement de PC dans R (2 niveaux) et branchement
relatif |
3 |
JNC |
Branchement relatif si C est égale à 0 |
4 |
FCW |
Lecture du registre d’extension pointé par R dans T |
5 |
STCW |
Ecriture de T dans le registre d’extension pointé par R |
6 |
RET |
Dépilement de PC depuis R (2 niveaux) |
7 |
IRET |
Dépilement de PC depuis R (2 niveaux) et des registres
sauvegardés |
8 |
FTCHRP |
Lecture d’un octet ou mot (selon B) pointé par (Page R,
R) et incrémentation de 1 ou 2 de (Page R, R) |
9 |
FTCHAP |
Lecture d’un octet ou mot (selon B) pointé par (Page A,
A) et incrémentation de 1 ou 2 de (Page A, A) |
10 |
LIT |
Lecture du mot pointé par PC et incrémentation par 2 de
PC |
11 |
FTCHA |
Lecture d’un octet ou mot (selon B) pointé par (Page A,
A) |
12 |
STRP |
Ecriture d’un octet ou mot (selon B) pointé par (Page
R, R) et incrémentation de 1 ou 2 de (Page R, R) |
13 |
STAP |
Ecriture d’un octet ou mot (selon B) pointé par (Page
A, A) et incrémentation de 1 ou 2 de (Page A, A) |
14 |
SWI |
Interruption logicielle |
15 |
STA |
Ecriture d’un octet ou mot (selon B) pointé par (Page
A, A) |
16 |
COM |
Complément à 1 de T |
17 |
ROLC |
Rotation à gauche de T avec C |
18 |
RORC |
Rotation à droite de T avec C |
19 |
ADDC |
Addition de S et T si bit 0 de T dans T |
20 |
XORR |
Ou exclusif de S et T dans T |
21 |
ANDD |
Et logique de S et T dans T |
22 |
RES |
Réservé pour de futurs développements |
23 |
ADDD |
Addition de S et T dans T |
24 |
POP |
Dépilement de R dans T |
25 |
POPA |
Empilement de A dans T |
26 |
DUP |
Empilement de T dans T |
27 |
OVER |
Empilement de S dans T |
28 |
PUSH |
Empilement de T dans R |
29 |
PUSHA |
Dépilement de T dans A |
30 |
NOP |
Délai d’un cycle machine |
31 |
DROP |
Dépilement de T |
xxxxx1 |
CALLA |
Empilement de PC dans R (2 niveaux) et branchement
absolu |
Pour plus de détails, voir la documentation concernant
les registres, les drapeaux et les instructions de ce processeur sur le site
JPB FORTH.
En dehors de la ROM de boot contenue dans le FPGA
lui-même, la carte COEUR FORTH contient une flash de 1 Moctets ; plus
précisément 2 flashs de 512 Koctets (partie haute et partie basse de la fenêtre
ci-dessus, séparée par un trait noir). C’est cette flash qui va contenir les
différents programmes résidents et notamment le logiciel applicatif de base
FORTH. Par défaut, le rouge indique une partie utilisée de la FLASH. L’abscisse
est graduée en Kmots de 16 bits.
En fait la FLASH est gérer par blocs de 64 Koctets.
L’applicatif de base (v099_telec.bin) est stocké en mode 16 bits et donc
à cheval sur les 2 flashs (c’est le bloc rouge à gauche ci-dessus, qui occupe
le premier bloc de 64Kmots soit 128Koctets). Le système de fichier gère le
reste des flashs, mais cette fois-ci en accès 8 bits et ce par page de
64Koctets. Le bloc rouge à droite ci-dessus contient v099_v040_lance.bin.
Ce n’est pas simple à expliquer et à comprendre, mais regardez le registre
flash pendant que vous réinstallez tout le système et ce sera peut-être
plus clair.
Dans le kit d’installation, pour des raisons de facilité,
une FLASH copie de la v099 est
intégrée (ROM de référence pour ce développement). La FLASH utilisée doit
impérativement s’appeler MiniForthFpga.bin.
Chaque utilisateur est ensuite libre de récupérer ou de se faire des versions
différentes et de les renommer pour pouvoir être prise en compte par
l’émulateur.
Au RESET (froid ou très froid), la FLASH est branchée à
partir de $000000 (et se termine donc en $0FFFFF). Sur la vraie carte, pour des
raisons d’économies hardware, elle est ensuite répliquée en alternance avec la
RAM. Dans l'émulateur elle n'est pas
répliquée de la même manière car j’ai voulu mettre dans le plan mémoire la
RAM vidéo (ce qui n’est pas fait sur la vraie carte du fait de contraintes sur
le timing mémoire) de $500000 à $5FFFFF,
et les registres internes du FPGA (ce qui n’est également pas fait sur
la vraie carte) de $600000 à $6FFFFF. Ceci a été fait afin d’unifier/simplifier
le système et de permettre une visualisation de ces espaces spéciaux via
l’outil standard de vidage mémoire.
Après la séquence d'initialisation, l’espace FLASH se
retrouve de $100000 a $1FFFFF, et le système a été recopié en RAM. La FLASH
n’est quasiment plus utilisée, à part pour lire ou écrire des fichiers.
Les accès à la FLASH font clignoter la LED FLASH sur la
fenêtre principale selon le code des couleurs suivant :
·
GRIS : pas d’accès,
·
VERT : lecture,
·
JAUNE : écriture,
·
ROUGE : effacement total,
·
ORANGE : effacement page.
Les restrictions actuelles
de l'émulateur sont:
·
Temps d’accès plus lents qu’en RAM non
émulés.
·
Espace FLASH non exactement répliqué
(insertion d’une image de la RAM vidéo et des registres internes).
La RAM équipant la carte CŒUR FORTH a une capacité de
1Moctets.
Au RESET la RAM est branchée à partir de $100000 (et se
termine donc en $1FFFFF). Pour des raisons d’économies hardware, elle est
ensuite répliquée en alternance avec la FLASH.
Après la séquence d'initialisation, l’espace RAM se
retrouve de $000000 a $0FFFFF.
Au RESET très froid toute la mémoire est effacée et
remplie avec le motif présent dans l’objet Emulateur/Réglages/Motif RAM Reset Très
Froid (par défaut à 0). A noter que ce motif est impérativement défini
sur 32 bits. Ceci permet de voir quelles adresses sont écrasées par le système
au démarrage ou par la suite. Il est à noter que sur la vraie carte actuelle,
cette fonctionnalité n'existe pas.
Dans l’émulateur, la RAM
réservée est en permanence de la taille maximum (1Mo). On peut écrire et lire
dans cet espace de 1Mo en permanence avec les menus Emulateur/Charge Mémoire
Ram et Sauve Mémoire Ram.
Pas de restriction
actuelle de l'émulateur.
Ces registres correspondent aux registres qu’il y avait
dans le 68681 de la carte 68000, à ceci près que sur la carte CŒUR FORTH, ils
sont implémentés dans le FPGA lui-même. D’autre part ces registres ne sont pas
dans le plan d’adressage des mémoires FLASH et RAM. Ils sont dans un espace
réservé d’entrées/sortie (un peu à la façon Z80). A noter que sur l’émulateur
ils sont de plus visibles dans le plan mémoire en $600000 (un peu à la façon
6502).
A noter qu’à l’inverse des zones FLASH et ROM qui
changent d’adresse, cette zone est fixe.
L'émulation de ce circuit est faite de façon allégée pour
assurer le strict nécessaire avec la carte CŒUR FORTH. Les accès aux UART sont
détournés et renvoyés soit vers le terminal intégré soit vers une ou plusieurs
liaison série du PC. Les 2 UARTS sont par contre gérés. Les liaisons séries
sont tamponnées par l'émulateur en entrée et en sortie par des espaces de 100
Ko.
Lors d’un RESET froid ou très froid, tous les registres
sont réinitialisés.
A l’affichage tous les registres sont affichés en binaire
et hexadécimal. Certains registres sont internes et ne peuvent être lus ou
relus par le CPU. Les vitesses des liaisons séries sont décodées en clair en
rouge.
Par rapport à la vraie carte, de nombreux registres ont
été rajoutés dans l’émulateur. Certains en avance par rapport au développement
du hard, d’autres pour le « fun ». Voici un tableau les reprenant
exhaustivement :
29 Registres
d’extension |
||||||
Adresse IO réelle (carte) |
Adresse MEMOIRE virtuelle (émulateur) |
Nom du registre |
Existence CŒUR
FORTH |
Utilisé en
V0.99 |
Accès |
Note |
$0000 |
$600000 |
PA |
O |
O |
R/W |
Registres FPGA internes |
$0001 |
$600002 |
PR |
O |
O |
R/W |
" |
$0002 |
$600004 |
PNTT |
O |
O |
R/W |
" |
$0003 |
$600006 |
PNTR |
O |
O |
R/W |
" |
$0004 |
$600008 |
CE |
O |
O |
R/W |
" |
$0005 |
$60000A |
SA |
O |
O |
R/W |
" |
$0006 |
$60000C |
SPA |
O |
O |
R/W |
" |
$0007 |
$60000E |
SPR |
O |
O |
R/W |
" |
$0008 |
$600010 |
SCE |
O |
O |
R/W |
" |
$001D |
$60003A |
PCH |
N |
N |
R |
Rajout des seuls registres FPGA internes manquant |
$001E |
$60003C |
PCL |
N |
N |
R |
" |
$001F |
$60003E |
A |
N |
N |
R/W |
" |
$00F6 |
$6001EC |
SOUND |
N |
O |
R/W |
Permet de faire du bruit. |
$00F7 |
$6001EE |
RESOLUTION_X |
N |
N |
R |
Largeur de l’écran VGA (statique) |
$00F8 |
$6001F0 |
RESOLUTION_Y |
N |
N |
R |
Hauteur de l’écran VGA (statique) |
$00F9 |
$6001F2 |
MOUSE_X |
N |
O |
R/W |
Abscisse de la souris |
$00FA |
$6001F4 |
MOUSE_Y |
N |
O |
R/W |
Ordonnée de la souris |
$00FB |
$6001F6 |
MOUSE_BUTTON |
N |
O |
R/W |
Etat des boutons de la souris |
$00FC |
$6001F8 |
KEYBOARD |
N |
O |
R/W |
Touche clavier appuyée |
$00FD |
$6001FA |
TIME_H |
N |
N |
R |
Temps absolu en format 32 bits |
$00FE |
$6001FC |
TIME_L |
N |
N |
R |
" |
$00FF |
$6001FE |
RESET |
N |
N |
W |
Commande interne du reset de l’émulateur (réservé) |
$0100 |
$600200 |
TIMER |
O |
O |
R/W |
Génère la HTR |
$0101 |
$600202 |
UART_BAUDA |
O |
O |
R/W |
Port série A |
$0102 |
$600204 |
UART_CTRLA |
O |
O |
R/W |
" |
$0103 |
$600206 |
UART_DATAA |
O |
O |
R/W |
" |
$0104 |
$600208 |
UART_BAUDB |
N |
N |
R/W |
Port série B |
$0105 |
$60020A |
UART_CTRLB |
N |
N |
R/W |
" |
$0106 |
$60020C |
UART_DATAB |
N |
N |
R/W |
" |
$0110 |
$600220 |
PORT_A |
N |
N |
R/W |
Port 16 bits A (à noter que la LED VOYANT est branchée sur le bit 0 de ce
port) |
$0111 |
$600222 |
PORT_B |
N |
N |
R/W |
Port 16 bits B |
$0120 |
$600240 |
USB_CMD/USB_ERR |
N |
N |
R/W |
Pour préparer l’USB |
$0121 |
$600242 |
USB_UNIT |
N |
N |
R/W |
" |
$0122 |
$600244 |
USB_SECTOR |
N |
N |
R/W |
" |
$0123 |
$600246 |
USB_DATA |
N |
N |
R/W |
" |
$0124 |
$600248 |
USB_CNT |
N |
N |
R/W |
" |
$0130 |
$600260 |
DMA_ORGNH |
N |
N |
R/W |
Vraiment pour le fun |
$0131 |
$600262 |
DMA_ORGNL |
N |
N |
R/W |
" |
$0132 |
$600264 |
DMA_DESTH |
N |
N |
R/W |
" |
$0133 |
$600266 |
DMA_DESTL |
N |
N |
R/W |
" |
$0134 |
$600268 |
DMA_CNT |
N |
N |
R/W |
" |
$0180 |
$600300 |
VGA |
O |
O |
R/W |
Ecran VGA (fifo) |
$0200 à $02FF |
$600400 à $6005FF |
T |
O |
O |
R/W |
Pile données (256 mots de 16 bits) |
$0300 à $03FF |
$600600 à $6007FF |
R |
O |
O |
R/W |
Pile retour (256 mots de 16 bits) |
Les restrictions actuelles
de l'émulateur sont:
·
L’émulateur limite les flux d’échanges
entre le FORTH et le PC à 1 octet par HTR (soit au maximum à 1 octet par ms),
ce qui représente approximativement une vitesse de 9600 bauds.
·
Les vitesses des liaisons série ne
servent que quand on utilise un terminal externe au PC relié par COM1/COM2.
Avec le terminal intégré, le réglage est indifférent. De plus quand on utilise
un terminal externe, c’est la vitesse déclarée dans Terminal/Réglages/Baudrate
qui prime.
·
Les vitesses utilisables des liaisons
séries sont 110, 300, 600, 1200, 2400,
4800, 9600, 14400, 19200, 28800, 38400, 56000, 57600, 115200 bauds.
·
La position de la souris n’est
rafraîchie qu’à chaque HTR.
·
La FIFO VGA en écriture n’est pas gérée
à la différence de la réalité, du fait de l’absence de contrainte de
l’émulateur dû au balayage vidéo (fifo émulateur réduite à une taille de 1).
·
La FIFO VGA en lecture fait 8 éléments
à la différence de la réalité (fifo carte réduite à une taille de 1).
Sur la vraie carte, au RESET la FLASH occupe la zone
$000000 à $0FFFFF et la RAM de $100000 à $1FFFFF. Après la séquence
d'initialisation (notamment après une écriture dans le bit S du registre CE),
la RAM se retrouve de $000000 à $0FFFFF et la FLASH de $100000 à $1FFFFF. Le
re-basculement se produit après l’application d’un RESET. L'émulateur est conforme à ce principe.
Pas de restriction
actuelle de l'émulateur.
Ils permettent de simuler un port au format 16 bits où
sont branchés des LEDS et des interrupteurs. Cela consiste en un périphérique
de sortie primitif où l’on peut afficher quelques informations. Ces registres
sont totalement artificiels car il n’existent pas sur la vraie carte (c’est un
souvenir de la carte 68000). .
Le port s'initialise systématiquement à $FFFF au
démarrage ou lors d’un RESET très froid. En sortie, les LEDS (dont la couleur
est réglable dans Emulateur/Réglages/Couleur Leds Port A et B) visualisent l'état
1 de chaque bit (si l'interrupteur est en position HiZ). En entrée, les interrupteurs permettent d'imposer un 0 avec la position 0. Pour
imposer un 1, il faut être en position HiZ et écrire un 1. Cela est un peu
tordu, mais reflète le comportement réel d’un port classique.
Le champ Donnée
Ecrite indique la valeur que la carte a écrit dans le circuit, mais n’est
pas modifiable par l’utilisateur. Le champ Donnée
Lue peut être écrit par l’utilisateur pour simuler l’entrée d’un mot (c’est
une autre façon de forcer la valeur à relire qui n’existe pas dans la réalité
ou la seule façon est avec les interrupteurs). Un $FFFF est alors
automatiquement placé dans Donnée Ecrite.
L’adresse de ces 2 ports est fixe et l’on y accède
virtuellement via la zone des registres d’extension du FPGA.
Port |
Adresse |
A |
$110 |
B |
$111 |
Les restrictions actuelles
de l'émulateur sont:
·
L’affichage de LEDS est fait au rythme
général des affichages et selon la vitesse d’écriture, des effets stroboscopiques peuvent apparaître laissant croire que rien
ne se passe. L’utilisateur peut régler la vitesse d’affichage dans Emulateur/Réglages/Intervalle
Affichage.
Sur la vraie carte, une interruption HTR (horloge temps réel) a lieu toutes les millisecondes, ce qui permet de compter le temps écoulé
et de basculer d'une tâche à une autre. Deux autres interruptions permettent de
traiter les caractères à émettre et à recevoir sur la liaison série vers un
terminal assurant les entrées/sorties.
L'émulateur utilise une pseudo HTR qui peut être aussi
rapide que 1 milliseconde (limite basse de Windows). Néanmoins cette base de
temps peut être réglée plus lente par l'utilisateur par pas de 1 milliseconde.
Sur les PC lents (100 MHz) l'utilisateur aura peut-être intérêt à ralentir
cette base de temps s’il constate que le PC n’a plus le temps de tout faire.
Sur les PC plus rapides, cette base de temps peut être laissée à 1
milliseconde. Cette base de temps est modifiable dans Emulateur/Réglages/Intervalle
Période HTR.
A la différence de la vraie carte, un PC doit garder du
temps pour gérer toutes les applications Windows. Aussi le principe retenu est
d'exécuter un nombre d'instructions FPGA lors de chaque HTR avant de redonner
la main au système et avant la prochaine HTR. Ce nombre d'instructions peut aussi être réglé dans Emulateur/Réglages/Nombre
Instructions FPGA par HTR (sa valeur minimale est de 7000 et la valeur
conseillée de 10000 instructions).
Cette valeur est un nombre maximal d’instructions que le CPU exécutera, mais si
celui-ci se place en attente d’interruption, ce nombre ne sera jamais atteint
et il passera à la HTR suivante sans rien faire de plus. Si la valeur mise est
trop grande, on aura un glissement du temps réel, étant donné que dans
l’émulateur, la HTR n’est pas plus prioritaire. Plus le PC sera rapide, plus on
peut mettre un grand nombre d'instructions, et plus le FPGA virtuel que l’on
aura sera rapide.
Fréquence du PC |
Intervalle Période HTR conseillé en ms |
Nb max d’instructions FPGA
conseillé |
100 MHz |
4 |
5000 |
300 MHz |
2 |
5000 |
500 MHz |
1 |
6000 |
750 MHz |
1 |
7000 |
1 GHz |
1 |
>8000 |
1,5 GHz |
1 |
>8000 |
2 GHz |
1 |
>8000 |
Un système de
calibrage automatique aurait pu être fait. J'ai, pour l'instant, vu l'optique
du programme, préféré laisser le contrôle total à l'utilisateur (quitte à ce
qu’il puisse faire des sottises !). Cela permet de régler artificiellement
plus ou moins la puissance de la carte (Mips).
Les interruptions pour les entrées/sorties sont quand à elles gérées entre 2 HTR pour
optimiser les transferts et des différences avec la carte sont à prévoir (en
mieux ou en moins bien) sur les flux réception et émission. Aujourd’hui un
débit maximum voisin du 9600 bauds
original est assuré.
La fenêtre principale rassemble un émulateur de terminal
texte et un émulateur graphique VGA qui par l’intermédiaire d’une barre des
menus donne accès à tous les émulateurs et outils intégrés. Dans les menus un chevron indique que l'option est active
ou que la fenêtre correspondante est déjà ouverte. Une deuxième sélection fait
alors réapparaître cette dernière en avant-plan. Ceci est vrai sauf pour la
fenêtre Trace qui a un comportement
différent. Le deuxième clic ferme cette fenêtre. Cela est dû au fait que l'on
ne peut fermer cette fenêtre système de la même façon que les autres fenêtres
de l'application.
Les réglages
que l'on fait sont immédiatement pris en compte. Ca simplifie le code
(ca évite les variables temporaires), ca dynamise le code (on voit tout de
suite ce qu'on fait), par contre quand on fait une erreur on se ramasse plus
vite aussi. Quand on saisit une valeur, il faut faire un appui sur Entrée pour
que la valeur soit prise en compte. Tous les réglages utilisateurs sont stockés
dans le fichier MiniForthFpga.ini.
Si le programme a un comportement anormal, commencez par effacer ce fichier. Il
sera recréé avec des valeurs par défaut qui doivent satisfaire le plus grand
nombre et qui sont stables.
Quand le programme est quitté normalement (s’il n'y a pas
de plantage), il sauvegarde tous ses réglages, conserve la position des
fenêtres et si elles sont ouvertes. Bien que cela soit géré, il se peut que
certaines fenêtres ne soient plus accessibles lors de leur ouverture. Dans ce
cas là, détruire le fichier MiniForthFpga.ini permet de s'en sortir. Certains
réglages annexes ne sont par contre pas mémorisés, c'est normal.
Les affichages des différents outils (qui n'existent pas
sur la carte, ou qui serait du hard externe) sont tous dynamiques (changent au
fil du temps) mais cependant ils ne sont pas rafraîchis en temps réel pour ne
pas dégrader les performances de l’émulateur. En règle générale, tous les
affichages sont faits lors d'une HTR, une HTR sur n. L’utilisateur peut régler
la vitesse d’affichage dans Emulateur/Réglages/Intervalle Affichage
(un nombre faible indique une vitesse de réaffichage élevée impliquant une
vitesse d’émulation de la carte ralentie : la somme affichage+émulation
étant constante si l’une augmente, l’autre baisse). Ce système peut générer des
effets stroboscopiques (la donnée change mais l’affichage ne voit qu’un
changement sur n).
La résolution de l’écran VGA (si elle est gérée par le
logiciel applicatif de base) peut être modifiée dynamiquement dans Emulateur/Réglages/Résolution.
La taille est affichée en bas à gauche de la fenêtre principale. Le logiciel
applicatif de base gère souvent une résolution de 640x480 pixels soit la
résolution VGA.
Les commandes accessibles par les menus sont réparties
dans 3 groupes : un menu pour
les commandes relatives à la fenêtre principale (Terminal/VGA) ; un menu
pour les commandes relatives aux fenêtres des différents émulateurs ; un
menu pour les commandes relatives aux outils d’investigation, le débogueur. Ces
menus correspondent en fait au niveau de l’utilisateur. L’utilisateur novice se
contentera du menu Terminal. Au bout
d’un moment d’utilisation, l’utilisateur
habitué pourra utiliser également le menu Emulateur. Enfin pour les utilisateurs
avancés qui voudront laisser traîner leurs yeux en mémoire ou mettre leur
nez dans le code FPGA, il existe le menu Débogueur.
Charge Terminal: permet de recopier dans le terminal intégré un fichier texte FORTH, de la
même façon que l'on ferait avec un CTRL C, CTRL V dans la fenêtre d’un
l'HyperTerminal sur un PC. C’est la méthode officielle pour télécharger les
programmes sur la carte en mode TERMINAL (mais pas en mode VGA). Le transfert
peut alors être interrompu par CTRL C, X, Q, ou S. L’extension par défaut de ce
type de fichier est .txt.
Sauve Terminal: sauvegarde
tout le contenu du terminal intégré (soit au maximum les dernières 2048 lignes)
dans un fichier texte sur le PC. Cela permet de garder une trace de l'exécution
ou des erreurs. L’extension par défaut de ce type de fichier est TRM.
Efface Terminal: nettoie la
fenêtre du terminal intégré (soit au maximum 2048 lignes). Impossible de revenir
en arrière.
Charge Xmodem: permet de
télécharger un fichier texte ou binaire vers la carte. C’est la méthode
officielle pour télécharger les programmes sur la carte en mode VGA. Il n’y a
pas d’extension par défaut pour ce type de fichier. Le noyau FORTH doit au
préalable passer également en XMODEM.
Sauve Xmodem: permet de
sauver un fichier texte ou binaire vers le PC. Il n’y a pas d’extension par
défaut pour ce type de fichier. . Le noyau FORTH doit au préalable passer
également en XMODEM.
Verrouillage Majuscule: tous les
caractères alphabétiques seront mis en majuscule à la saisie dans le terminal
intégré avant d’être envoyé au FORTH, qui est un grand adepte des majuscules.
Réglages: contient
tous les réglages relatifs au menu Terminal. Permet de définir si on utilise le
terminal intégré ou si on utilise un terminal externe branché sur un port série
du PC (ce peut aussi être grâce à un rebouclage du COM1 vers COM2 du PC,
l'HyperTerminal de Windows). Les entrées/sorties peuvent être routées vers 0, 1,
plusieurs ou toutes les interfaces. Attention de ne pas en abuser. Permet de
définir les couleurs de texte et de
fond du terminal intégré. Permet de
fixer la tabulation courante pour
les sorties écran (non encore gérée par le noyau FORTH). Permet de définir la langue du logiciel (anglais ou
français). Afficher et régler la vitesse
des ports série quand ils sont actifs.
Quitter: permet de
sortir définitivement du logiciel. Tous les réglages sont sauvegardés
automatiquement. Un clic dans le coin supérieur droit de la fenêtre principale
aboutit au même résultat.
Reset Chaud: le RESET
chaud permet de ne perdre aucune définition, par contre dans certains cas de
plantage, il ne permet pas de reprendre la main, ou il reprend la main avec une
mémoire qui n’est pas très propre. Il ne faut donc pas en abuser. Le RESET
chaud permet de redémarrer à une adresse configurable dans l’objet Emulateur/Réglages/Adresse Reset A Chaud.
Par défaut c'est l'adresse de la fonction ABORT
qui est en $77E4 dans la version 0.99 du binaire. Pour d'autres versions du
logiciel, c’est de la responsabilité de l’utilisateur que de renseigner ce
vecteur (il suffit de faire un HEX FIND ABORT .) et de mettre l'adresse dans le
champs mentionné ci dessus pour s'assurer un fonctionnement correct. Pour aider
l’utilisateur, un système de recherche
automatique de ce vecteur est intégré au code (mais il se peut qu’il ne
marche pas avec toutes les versions ultérieures de la FLASH). Il est à noter
que sur la vraie carte actuelle, cette fonctionnalité n'existe pas.
Reset Froid: cette
action entraîne le RESET du FPGA et de ses périphériques et donc de la carte.
Dans le cas où le FPGA est arrêté suite à une erreur ou un arrêt volontaire, il
est remis en fonction. Toutes les fonctions qui avaient été compilées sont
perdues. Même si elles sont encore en partie présentes en mémoire, les
pointeurs qui les gèrent sont réinitialisés. La mémoire qui n'est pas
initialisée par JPB FORTH n'est pas altérée, ce qui permet d'y stocker des
choses. Le contenu de cette mémoire est par contre perdu définitivement dès que
l'on quitte l’émulateur. On peut par contre la sauvegarder/recharger par les
menus Sauve Mémoire Ram/Charge Mémoire Ram ci-dessous.
Reset Très Froid: cette action est équivalente au RESET froid (voir ci-dessus) à ceci près
que toute la mémoire est préalablement effacée et remplie avec le motif de
RESET réglable dans l’objet Emulateur/Réglages/Motif RAM/FLASH/VGA Reset
Très Froid (voir le chapitre sur la mémoire RAM). Le contenu du système
de fichier FLASH est effacé, bien que le logiciel applicatif de base soit
conservé en FLASH. Ceci permet de partiellement s’en sortir, si le système de
fichier est par exemple accidentellement corrompu et qu’on n’arrive pas à
prendre la main au démarrage.
Arrêt: le FPGA est gelé
(la LED FPGA passe au rouge). Permet de quasiment suspendre le temps. On peut
sortir de cette situation en re-sélectionnant Arrêt (pour repasser en marche),
en faisant un RESET ou en quittant le logiciel.
Registres Fpga: permet
d'afficher le contenu des registres du FPGA en pseudo temps réel. Un clic dans
le coin supérieur droit de cette fenêtre la ferme (voir aussi le chapitre sur
l’émulateur de FPGA).
Registres Flash: permet d'afficher synthétiquement le contenu de la FLASH en pseudo temps
réel pour voir son taux de remplissage. Un clic dans le coin supérieur droit de
cette fenêtre la ferme (voir aussi le chapitre sur l’émulateur de mémoire
FLASH).
Registres Extension: permet d'afficher le contenu des registres d’extension du FPGA en pseudo
temps réel. Un clic dans le coin supérieur droit de cette fenêtre la ferme
(voir aussi le chapitre sur l’émulateur de registres d’extension).
Registres Port A: permet d'afficher le contenu du registre d’un port de 16 bits en pseudo
temps réel. Un clic dans le coin supérieur droit de cette fenêtre la ferme
(voir aussi le chapitre sur l’émulateur de port A et port B).
Registres Port B: permet d'afficher le contenu du registre d’un port de 16 bits en pseudo
temps réel. Un clic dans le coin supérieur droit de cette fenêtre la ferme
(voir aussi le chapitre sur l’émulateur de port A et port B).
Charge Mémoire Ram: permet de mettre dans la mémoire de la carte un fichier du PC contenant
par exemple des données à traiter. Attention:
tout le fichier est chargé et cette commande travaille dans le plan RAM de 1Mo.
L’adresse destination en mémoire est demandée en hexadécimal. Si le fichier
déborde de l’espace RAM , il est tronqué (pas de rebouclage en début de
RAM). Cette fonctionnalité n’existe pas sur la vraie carte où tous les
transferts de données se font par XMODEM. Il n’y a pas d’extension par défaut
pour ce type de fichier.
Sauve Mémoire Ram: permet de mettre une image de la mémoire de la carte dans un fichier du PC
contenant par exemple des résultats traités. Attention: cette commande travaille dans le plan RAM de 1Mo. L’
adresse source en mémoire et la
longueur sont demandées en hexadécimal. Si la zone déborde de l’espace
RAM , le fichier est tronqué (pas de rebouclage en début de RAM). Cette
fonctionnalité n’existe pas sur la vraie carte où tous les transferts de
données se font par XMODEM. Il n’y a pas d’extension par défaut pour ce type de
fichier.
Réglages: contient
tous les réglages relatifs au menu Emulateur. Permet de choisir la taille de
l’écran graphique VGA parmi 6 résolutions entre 320x240 et 1024x1024.
Permet de basculer en mode de boot pour recharger l’ensemble du logiciel
applicatif de base. Permet de spécifier l’intervalle
de la période HTR et le nombre d’instructions FPGA par HTR (voir
ci-dessus le séquencement de la carte). Permet de choisir l’intervalle d’affichage en HTR (voir ci-dessus Principe généraux
de l’interface graphique), le motif
écrit dans la RAM/FLASH/VGA lors
d’un RESET très froid, l’adresse de
branchement lors d’un RESET chaud. Permet de définir la couleur du registre FLASH. Définit la couleur des LEDS
des fenêtres Registres Port A et B.
Ce menu est réservé aux
utilisateurs avancés. Ne vous y
aventurez que quand vous aurez une bonne maîtrise du logiciel et une bonne connaissance de ce document, du FPGA et de la carte. En règle
générale, les outils de ce menu n’ont hélas pas d’équivalent sur la vraie
carte.
Vidage Mémoire: permet d’afficher
une fenêtre visualisant le vidage du plan mémoire (c’est à dire ce que voit le
FPGA) en pseudo temps réel. L’interface permet de visualiser tous les 4Go
d’espace adressable sur 32 bits en modifiant l’adresse de base en hexadécimal en haut à gauche. Pour déplacer la
zone visualisée on peut utiliser Page Haut/Page Bas ou Flèche Haut/ Flèche Bas.
Comme le FPGA n’a que 2Mo d’espace adressable (le bus ne sort qu’en 21 bits),
le reste de l’espace consiste en une réplication de cette zone de 2Mo. En fait au
lieu d’avoir une réplication en RAM/FLASH/ RAM/FLASH/ RAM/FLASH/ RAM/FLASH/ en
2Mo comme sur la vraie carte, l’émulateur à une réplication en RAM/FLASH/
RAM/FLASH/ RAM/VGA/ REGISTRES/FLASH/ en 8Mo.
Quand il y a des valeurs ? ?, cela signifie qu’il n’y a rien dans le plan mémoire à
cette adresse (ni RAM, ni FLASH, ni périphérique) et qu’un accès avec le FORTH
à cette adresse se soldera par une erreur
bus rattrapée par le logiciel qui arrêtera l’émulateur FORTH. L’affichage
est dynamique et permet de voir les compteurs
évoluer, les zones mémoires se remplir, il permet aussi de voir l’effet de
la redondance. Le seul manque de cet outil est qu’il permette également
d’éditer la mémoire. Mais ce serait dangereux et le FORTH est là qui permet de
le faire de façon on ne peut plus simple.
Sauve Vidage: sauvegarde
tout le contenu de la fenêtre de vidage mémoire telle qu’il est affiché, dans
un fichier texte sur le PC. Cela permet de garder l’image d’une zone mémoire
comme référence pour faire une comparaison ultérieure. L’extension par défaut
de ce type de fichier est DUM.
Désassemblage Mémoire: permet d’afficher une fenêtre visualisant le désassemblage du plan mémoire
(c’est à dire ce que voit le FPGA) en pseudo temps réel. L’interface permet de
visualiser tous les 4Go d’espace adressable sur 32 bits en modifiant l’adresse de base en hexadécimal en
haut à gauche. Pour déplacer la zone visualisée on peut utiliser Page Haut/Page
Bas ou Flèche Haut/ Flèche Bas.
Quand il y a des valeurs ? ? dans la zone vidage,
cela signifie qu’il n’y a rien dans le plan mémoire à cette adresse (ni RAM, ni
FLASH, ni périphérique) et qu’un accès avec le FORTH à cette adresse se soldera
par une erreur bus. L’affichage est
dynamique et permet de voir le code se construire ou changer.
C’est un désassembleur FPGA classique auquel une zone
FORTH a été adjointe pour présenter le nom de la routine FORTH sur laquelle un
CALL ou CALLA pointe. On distingue 6 zones dans l’exemple de désassemblage
de la fonction FORTH BELL:
Adresse Mnémonique Opérande FORTH Vidage Ascii
00005300.0
JMP $0000531C 00 1A ..
00005302.0
JMP $00004F46 04 42 .B
00005304.0
FTCHRP
00005304.1
ANDD
00005304.2
RET
45 4C EL
00005306.0
FTCHAP
00005306.1
COM
00005306.2
????
4C 00 L.
00005308.0
LIT #$0007
00005308.1
LIT #$0000
00005308.2
NOP
52 BC 00 07 00 00 ¼....
0000530E.0
CALL $00005202 (EMIT) 16 F2 .ò
00005310.0
RET
37 BC 7¼
Les .0, .1 et .2 indiquent quelle instruction (de 5 bits)
du mot de 16 bits est désassemblée.
On peut ainsi aisément décompiler cette fonction (les
huit premières lignes ne sont pas significatives) et obtenir :
: BELL 7 EMIT ;
Mais le but de cet outil n’est pas de ressourcer tout le
JPB FORTH, c’est seulement pour quand on a un doute, de vérifier que le travail
de compilation a été bien fait.
Sauve Désassemblage: sauvegarde tout le contenu de la fenêtre de désassemblage mémoire tel
qu’il est affiché, dans un fichier texte sur le PC. Cela permet de lister un
morceau de code. L’extension par défaut de ce type de fichier est DES.
Trace: permet d'afficher
le contenu de la fenêtre système de trace. Pour fermer cette fenêtre il faut
impérativement recliquer sur le menu Trace. Cette fenêtre sert en partenariat
avec le menu suivant Réglages qui fixe les conditions, à stocker la trace des
instructions FPGA (contenu des registres+OPCODES). Pour sauver cette trace on
peut faire un copier coller vers une autre fenêtre d’un éditeur de texte
Windows (par exemple WordPad). Voici par exemple ce que l’on obtient si on
trace la routine BELL vu ci-dessus :
====== TRACE PC=$00005308 ====================
19-02-2003 22:48:06 ======
Pas 0
SPR=0000 SPA=0001 SA=0000 SCE=4800 PR=0000 PA=0000
A=0000 CE=0800 ....S
PNTT=0200 S=0000 T=0000 PNTR=03F4 R=0000
PC=00005308.0 LIT #$0007
Pas 1
SPR=0000 SPA=0001 SA=0000 SCE=4800 PR=0000 PA=0000
A=0000 CE=4800 .I..S
PNTT=02FF S=0000 T=0007 PNTR=03F4 R=0000
PC=00005308.1 LIT #$0000
Pas 2
SPR=0000 SPA=0001 SA=0000 SCE=4800 PR=0000 PA=0000
A=0000 CE=4800 .I..S
PNTT=02FE S=0007 T=0000 PNTR=03F4 R=0000 PC=00005308.2 NOP
Pas 3
SPR=0000 SPA=0001 SA=0000 SCE=4800 PR=0000 PA=0000
A=0000 CE=4800 .I..S
PNTT=02FE S=0007 T=0000 PNTR=03F4 R=0000
PC=0000530E.0 CALL $00005202
On obtient les conditions de déclenchement, la date et pour chaque pas du
FPGA, son numéro, le vidage de tous les registres internes du FPGA et enfin le
désassemblage de l’instruction (non encore exécutée, elle le sera lors du
passage au pas suivant).
Efface Trace: nettoie la fenêtre de trace.
Impossible de revenir en arrière.
Réglages: permet de
spécifier les conditions de déclenchement de la trace.
Pour rester simple le critère de déclenchement est soit quand le PROGRAM
COUNTER du FPGA atteint une certaine adresse sur 32 bits (quand Et Registre vaut Aucun), soit une
double condition sur la valeur du PC sur 32 bits et sur la valeur d’un registre
FPGA sur 16 bits (quand Et Registre
vaut le nom d'un des registres du FPGA). Pour passer en mode trace pas à pas lors de l’appel de la
fonction BELL renseignez la fenêtre Réglages
Débogueur comme ci-dessus ( pour trouver l’adresse de la fonction BELL dans
votre ROM, il suffit de faire HEX FIND BELL . ) puis taper BELL et valider.
Vous obtiendrez quelque chose comme la trace ci-dessus. Noter que le bouton d’armement ressort lorsque le critère
de déclenchement est rencontré et que l’on passe du mode normal au mode trace. On
rebascule vers le mode normal quand
le nombre d’instructions FPGA prévu (ici 50) est déroulé. Ce nombre
d’instructions est modifiable même une fois en mode trace.
C’est une trace en mode pas à pas, c’est à dire que vous devez
valider chaque pas en appuyant sur le bouton Pas (la LED FPGA est passée en rouge pour indiquer que le FPGA est
arrêté). C’est très pratique pour suivre le FPGA.
Vous pouvez également
faire une trace en mode running en
appuyant sur le bouton Exécution
avant d’armer la trace. C’est pratique quand le nombre de pas à faire et grand
et que vous ne savez pas trop ce que vous cherchez. Vous ferez alors du
dépouillage.
Vous pouvez enfin passer
du mode trace pas à pas au mode trace en mode running en appuyant sur
le bouton Exécution une fois que
vous êtes entrés en mode trace pas à pas (l’inverse n’est pas
faisable).
L’utilisation d’un registre en plus du PC pour le
déclenchement n’a rien de sorcier si ce n’est qu’il faut savoir quelle valeur
chercher et par quel registre elle va transiter (se reporter au site de JPB
FORTH pour connaître l’utilisation des registres).
Statistiques: permet
d’afficher quelques statistiques sur le fonctionnement de l’émulateur et du
code applicatif.
Les couleurs des courbes sont modifiables dans l’objet Debogueur/Réglages/Couleur
Opcodes/Routines/….
Le graphique Opcodes indique depuis le lancement
de l’émulateur le nombre exécuté de chacune des 33 instructions. L’échelle peut
être mise en logarithmique. En cliquant sur une colonne on obtient le
nombre exact et l’intitulé au dessus du graphique. On peut aussi zoomer dans le
graphique en jonglant avec les touches SHIFT et les boutons de la souris. Il
est conseillé d’arrêter le FPGA si on veut zoomer.
Le graphique Routines indique depuis le lancement
de l’émulateur le nombre exécuté de chacun des mot-clefs FORTH. L’échelle peut
être mise en logarithmique. En cliquant sur une colonne on obtient le
nombre exact, l’adresse du mot-clef et l’intitulé au dessus du graphique. On
peut aussi zoomer dans le graphique en jonglant avec les touches SHIFT et les
boutons de la souris.
Le graphique Activité indique dans une fenêtre
glissante le taux d’occupation du CPU. Si l’on augmente le nombre
d’instructions par HTR, ce taux diminue. Si on le diminue, le taux augmente. Ce
peut être un moyen de régler le nombre d’instruction par HTR. L’idéal est de
rester en dessous de 50% afin d’avoir de la marge pour quand on veut faire un
peu de calcul.
Efface Statistiques: nettoie la
fenêtre de statistiques. Impossible de revenir en arrière.
A propos de MiniForthFpga: donne la version courante de l’émulateur et l'adresse du site de JPB
FORTH. Un clic dans le coin supérieur droit de cette fenêtre la ferme.
V0.5: Première version en test
envoyée à tous les membres du forum en mars 2002 pour évaluation.
V0.6: Ajout de l’écran VGA.
V0.7: Modification de l’écran de
statistique. Ajout des registres SOUND et RESOLUTION.
V0.8: Ajout du protocole d’écriture
en FLASH.
V0.9: Modification des Resets.
V1.0: Accélération des accès à
l’écran VGA, du téléchargement Xmodem. Ajout de la LED FLASH.
V099_TELEC.BIN + V099_V040_LANCE.BIN:
Cette version V1.0 de MiniForthFpga a été conçue et déboguée face à la ROM
V0.99 du 08/12/2002 de JPB FORTH.
TETRIS.TXT V0.10:
Pas de problème.
PALETTE.TXT V1.00:
Pas de problème.
Voici les opérations nécessaires pour installer un
nouveau noyau depuis le néant. Ceci est utile quand on veut faire une mise a
jour avec une version plus récente ou re-installer la version courante suite à
un problème. La procédure décrite ici est la méthode standard, qui est très
proche de la procédure avec la vraie carte. Une méthode plus rapide évitant le
premier transfert Xmodem existe aussi (supprimer MiniForthFpga.bin, puis
recopier v099_telec.bin dans MiniForthFpga.bin).
Attention cette méthode
dépend énormément du processus codé dans le noyau FORTH. Si cette procedure
devient caduque, se reporter alors au site de JPB FORTH. Elle n'est fournie ici
que pour aider l'utilisateur.
Première partie: le système de
base
·
Lancez l'émulateur.
·
Positionnez l'objet Emulateur/Réglages/Mode Boot sur ROM.
·
Dans la fenêtre principale passez en mode Terminal (en bas à gauche)
puis faites un Emulateur/Reset Très Froid. Confirmez. Vous devez
voir apparaître dans le terminal:
FORTH core V
0.1
M.BOVET L.FOUBE
www.eif.ch
XMODEM boot V 1.5
JPB
jpb.forth.free.fr
·
Faites ensuite Terminal/Charge Xmodem avec la version du
logiciel applicatif de base désirée ( ici par exemple v099_telec.bin).
Vous devez voir apparaître sur le coté gauche du terminal:
Xmodem:
10 Essais
xxx Acks
0 Nack
·
Rebasculez l'objet Emulateur/Réglages/Mode Boot sur FLASH.
·
Attendre patiemment que le téléchargement s'arrête et que l'affichage
ci-dessus disparaisse ( ca dure environ 3 minutes ). Puis la LED FLASH doit
clignoter et le système démarrer.
·
Répondez "N" à la question du changement de nom de
système.
Deuxième partie: le système
graphique
·
Une fois la première partie effectuée,
vous êtes donc en mode Terminal.
·
Faites Terminal/Charge Terminal avec le fichier init_flash.txt.
·
Répondez "N" à la question concernant le changement de nom
de système.
·
Faites ensuite Terminal/Charge Xmodem avec la version du
logiciel applicatif graphique désirée ( ici par exemple v099_v040_lance.bin ).
Vous devez voir apparaître sur le coté gauche du terminal:
Xmodem:
10 Essais
xxx Acks
0 Nack
·
Attendez patiemment que le téléchargement s'arrête et que l'affichage
ci-dessus disparaisse ( encore 3 minutes ). Pour passer le temps, vous pouvez
ouvrir Emulateur/Registre Flash. La LED FLASH doit clignoter
JAUNE pour indiquer les écritures du fichier en FLASH.
·
Faites ensuite Terminal/Charge Xmodem avec la version du
logiciel applicatif lanceur désirée ( ici par exemple lance_vga.bin).
Vous devez voir apparaître sur le coté gauche du terminal:
Xmodem:
10 Essais
xxx Acks
0 Nack
·
Attendez patiemment que le téléchargement s'arrête et que l'affichage
ci-dessus disparaisse (c'est très rapide). Le système rend la
main (OK>).
·
Dans la fenêtre principale repassez en mode Vga (en bas à gauche)
puis faites un Emulateur/Reset
Froid. Vérifiez que ca redémarre correctement.
·
Par sécurité, quittez l'emulateur (confirmez) pour enregistrer sur le
disque du PC le contenu de la nouvelle FLASH.
Troisième partie (optionnelle):
les applications
·
Une fois les 2 premières parties
effectuées et après avoir tout redémarré, vous êtes donc en mode Vga.
·
Ouvrez la fenêtre shell FORTH (celle marquée d'un F stylilsé) en
double-cliquant dessus et tapez par exemple dedans XMODEM_RECOIT"
./APPLICATIONS/JEUX/TETRIS.TXT"
·
Faites ensuite Terminal/Charge Xmodem avec l'application
désirée ( ici par exemple tetris.txt ). Vous devez voir apparaître sur
le coté gauche du terminal:
Xmodem:
10 Essais
xxx Acks
0 Nack
·
Attendez patiemment que le téléchargement s'arrête et que l'affichage
ci-dessus disparaîsse. Une animation vous fait patientez. La LED FLASH doit
clignoter JAUNE pour indiquer les écritures du fichier en FLASH. Le système
rend la main (OK>).
·
Par sécurité, quittez l'émulateur (confirmez) pour enregistrer sur le
disque du PC le contenu de la nouvelle FLASH.
·
Pour lancer l'application, il faut d'abord la compiler ( toujours dans la
fenêtre F ) avec CF" ./APPLICATIONS/JEUX/TETRIS.TXT"
·
Puis la lancer en tapant TETRIS.
·
Ouvrez la fenêtre TETRIS (celle marquée d'une icône changeante) en
double-cliquant dessus.
·
Jouez.
Pour plus de facilité, la FLASH
contenue dans le kit d'installation est déja dans cet état et contient les
premières applications TETRIS et PALETTE.
MiniForthFpga V1.0 a été écrit en langage C à l’aide de
LabWindows CVI, un environnement de développement sur PC/SUN issu du monde industriel
et que je conseille à tous ceux qui veulent faire de petites applications assez
graphiques sans se prendre la tête avec les API de Windows. Il est d’une
stabilité remarquable et possède un excellent débogueur. Dommage que ce ne soit
pas un produit grand public.
Le source fait 4600 lignes de code parfois dense et
représente une taille de 260 Ko. L’émulateur FPGA représente 1/10 du volume,
les autres émulateurs 1/3 et la gestion de l’interface graphique le reste. Il a été écrit à partir de l’émulateur
MiniForth68k écrit l’an dernier dont il a repris l’ossature et une grande
partie des fonctionnalités.
Tout d’abord merci à Charles H. MOORE pour avoir créé ce
langage semi-compilé si original à la fin des années 60.
Ensuite merci à JPB d’avoir apporté les éclaircissements
techniques sur le fonctionnement interne de sa machine quand ma compréhension
faisait défaut. Merci à lui aussi pour avoir assuré la phase d’alpha tests.
Maintenant c’est à vous de bosser. Que diable !
Utilisez le forum de JPB FORTH pour communiquer vos
questions, les points à éclaircir dans la documentation, les fautes à
supprimer, lister les bogues trouvées, soumettre des évolutions et proposer vos
applications (ca fera plaisir à JPB):
jpb_forth@yahoogroups.com
La prochaine version
devrait contenir les idées qui auront germé d’ici là.
LabWindows CVI est une marque déposée de National Instruments Corporation.
Windows 95, 98, 2000, NT, Millenium, HyperTerminal, WordPad sont des
marques déposés de Microsoft Corporation.