jeudi 27 novembre 2014

oscillateur

Dans cet article j'explique le fonctionnement des oscillateurs électroniques.

Le pendule

Avant d'expliquer l'oscillateur électronique je vais débuter par une analogie mécanique, le pendule, une balançoire en fait. l'enfant assis dans la balançoire apprend rapidement comment la mettre en mouvement mais aussi comment la freiner. Pour la mettre en mouvement il se laisse tomber vers l'arrière en tirant sur les cordes puis reprends sa position initiale. En répétant de mouvement il augmente l'amplitude des oscillations. Il n'applique pas cette force à n'importe quel moment met lorsque la balançoire atteint le point mort haut arrière, juste au moment ou la descente s'entame. Ainsi l'énergie qu'il apporte au pendule est en phase avec le mouvement de celui-ci. Par contre lorsqu'il veut diminuer l'amplitude il pousse sur les cordes vers l'avant lorsqu'il est en ascension frontale. A ce moment l'énergie qu'il applique est en anti-phase.

Si on accrochait un crayon sur le bord du siège de la balançoire et qu'on faisait défiler a vitesse régulière un large bande de papier le long de la balançoire de sorte que le crayon frotte sur celle-ci, on verrait apparaître sur la bande de papier une onde sinusoïdale.

Circuit accordé

L'inductance et le condensateur sont en quelque sortent des composants complémentaires en électronique. En effet l'inductance accumule de l'énergie dans un champ magnétique et le condensateur dans dans un champ électrique. Si on les combines comme sur cette illustration on obtient un circuit accordé qui possède une fréquence de résonance.

Supposons le montage suivant:

C'est l'équivalent électronique de la balançoire. Si on enfonce le bouton le transistor Q1 entre en conduction et fourni de l'énergie au circuit accordé. Lorsqu'on relâche le bouton. Une certaine quantité d'énergie est accumulée dans le champ magnétique de l'inductance L et le champ électrique du condensateur c. Lorsque le transistor cesse de conduire le champ magnétique de l'inductance s'effondre créant une tension au bornes de celle-ci. Cette tension génère un courant qui va accumuler une charge supplémentaire dans le condensateur. Lorsque le champ magnétique est complètement effondré le condensateur ne reçoit plus de courant par contre il commence à se décharger à travers l'inductance. Ainsi l'énergie est transférée en alternance entre le champ magnétique et le champ électrique. La fréquence à laquelle cette oscillation se produit dépend des valeurs de L et C selon la formule Fosc=1/(2*PI*√(L*C)). C'est l'équivalent du pendule ou l'énergie oscille entre la forme énergie potentielle maximale lorsque le pendule est à l'arrêt aux extrémités de sa course et énergie cinétique maximale lorsque le pendule est au point le plus bas.

Oscillateur électronique

Pour obtenir un oscillateur électronique dont l'oscillation est entretenue il suffit de peser sur le bouton au bon rythme et en phase avec l'oscillation du circuit accordé. Évidemment on ne peut faire ça à la main mais il y a une façon simple d'y arrivé. En récoltant une partie de l'énergie fournie au circuit accordée et en la renvoyant à l'entrée du transistor Q1 de sorte que ce signal une fois amplifié soit en phase avec l'oscillation naturelle du circuit accordée. On appelle ça une rétro-action positive. Examinons le circuit.

Ce montage s'appelle base commune car du point de vue de l'analyse circuit A.C. (courant alternatif) la base du transistor est maintenue au commun de l'alimentation (négatif de la pile dans ce schéma) à travers le condensateur C3 dont l'impédance (résistance AC) est très faible à la fréquence de fonctionnement de l'oscillateur. L'entrée de l'amplificateur ici c'est l'émetteur et le signal de rétro-action est fournie à travers C2. C2 est choisi de sorte qu'il y a suffisamment de signal qui est retourné à l'entrée de l'amplificateur pour maintenir une oscillation stable. Si C2 fourni trop de rétro-action au lieu d'avoir une onde sinusoïdale à la sortie on va avoir de la distorsion, sa valeur ne doit donc être ni trop grande ni trop petite.

J'ai mentionné le terme base commune. Il y a 3 types de montages pour les transistors bi-jonctions, base-commune, émetteur-commun qui est le plus utilisé et finalement collecteur-commun. On peut fabriquer un oscillateur avec n'importe quel type de montage. Le critère pour obtenir une oscillation soutenue est que le gain en boucle fermée soit >= 1. Avec un gain 1 l'onde est sinusoïdale, supérieur à 1 on ajoute de la distorsion. Un gain de 1 signifie qu'on ajoute juste de qu'il faut d'énergie au circuit accordé pour compenser les pertes du aux résistances parasites. A cette valeur de gain on obtient une onde sinusoïdale d'amplitude constante.

Oscillateur à cristal

J'ai commencé cet article par une analogie mécanique, l'oscillateur à cristal est intéressant parce qu'il est à la fois mécanique et électronique. En effet il utilise l'effet piézo-électrique qui est un phénomène électro-mécanique. Un cristal est constitué d'une lamelle de quartz avec une électrode sur chaque face. Lorsqu'une tension électrique est appliquée sur ces électrodes il y a une déformation mécanique du cristal. Lorsque cette tension électrique est relâchée le cristal oscille à une fréquence précise. Comme pour un pendule cette oscillation va s'amortir si elle n'est pas entretenue. N'essayer pas de sortir un cristal de son boitier pour le voir osciller, cette oscillation est à l'échelle microscopique au niveau du réseau d'atomes.

Le schéma suivant illustre un oscillateur à cristal dans un montage collecteur-commun. On l'appelle ainsi car le collecteur est au commun de l'alimentation car en haute fréquence la résistance entre le collecteur et le commun est à toute fin pratique nulle. Ici l'entrée de l'amplificateur c'est la base et la sortie c'est l'émetteur.

C1 et C2 forment un diviseur de tension qui permet de déterminer la valeur de la rétro-action. Ils ont aussi une influence sur la fréquence d'oscillation du cristal puisqu'ils sont en parallèle avec celui-ci.

Oscillateur avec porte logique

Habituellement dans les montages en circuits logiques ont utilise des portes logiques pour fabriquer l'oscillateur. En voici une illustration.

Ici un inverseur est utilisé dans un montage dit Pierce gate oscillator. La résistance de 1M produit une rétro-action négative de sorte que la porte fonctionne comme un amplificateur linéaire au lieu de son mode logique normal. Notez qu'il s'agit d'un inverseur donc le signal en sortie est en anti-phase avec l'entrée. Donc pour produire une oscillation soutenue il faut ajouter un déphasage supplémentaire de 180 degrés. Un déphasage de 360 degrés est équivalent à 0 degrés donc en phase. Le réseau formé par XTAL,C1,C2,C3 produit le déphasage nécessaire. La résistance de 1K réduit l'intensité de la rétro-action. Les condensateurs C1,C2,C3 ont un influence sur la fréquence d'oscillation, c'est pourquoi C1 est ajustable. En pratique dans la majorité des cas on néglige l'installation de C1 à moins que le montage requiert une très grande précision en fréquence. Les MCUs qui ont un circuit pour oscillateur à cristal en interne utilisent en fait ce type de montage.

Distortion

Un circuit électronique n'est jamais parfait il y a toujours un certain niveau de bruit dans le circuit. Ce bruit de fond est causé par l'agitation thermique et est proportionnel à la température. En fait ce bruit de fond est indispensable au démarrage des oscillations. Pour qu'il y est une rétro-action positive il faut d'abord qu'il y est un signal à la sortie de l'amplificateur. Il y a une autre façon de voir l'oscillateur. On peut le voir comme un amplificateur qui retourne le signal à sa sortie vers l'entrée à travers un filtre. Ce filtre laisse passé une fréquence déterminée et bloque les autres de sorte que seule cette fréquence est amplifiée. Au départ il faut que le gain soit supérieur à 1 pour qu'il est amplification mais si ce gain demeure supérieur à 1 l'amplificateur va saturé et le résultat ne sera pas une onde sinusoïdale.

L'astuce pour obtenir un signal de sortie qui s'approche le plus possible d'une sinoïde est de réduire le gain à 1 avant que l'amplificateur ne sature. Généralement ceci est obtenu simplement en choisissant le point d'opération du transistor de sorte que le gain diminue avec l'amplitude du signal.

J'ai fait quelques simulations dans le logiciel LTspice et voici un exemple d'oscillateur Clapp.

L'étage de sortie formée par le transistor Q2 ne participe pas à l'oscillation il ne sert qu'à isoler l'oscillateur formé par Q1, L2, C1,C2,C3.

sortie de l'oscillateur

On voit que le signal à la sortie augmente de façon logarithmique à partir de zéro jusqu'à une valeur maximale. Plus le gain initial est proche de l'unité plus il faut de temps à l'oscillateur pour atteindre la valeur maximale. Dans cette simulation il faut environ 100µS pour atteindre l'amplitude maximale.

Examin de la forme d'onde

J'ai zoomer une petite partie du signal ci-haut pour évaluer à l'oeil la forme d'onde. C'est un sinoïde presque parfait. Donc le gain de Q1 a diminué à la valeur 1 avant la saturation, c'est le résultat escompté.

Analyse de Fourier

Voici le résultat de l'analyse DFT du signal à la sortie de Q2. La pointe qui approche de la ligne du 0db correspond à la fréquence de l'oscillateur. La fréquence est donc d'environ 15,5Mhz. La valeur théorique calculée est de 15,66Mhz. A la droite du pic principal on voit une série d'autres pics de plus faible amplitude. Ce sont les harmoniques de la fondamentale. Leur hauteur indique le niveau de distorsion. On voie que la première harmonique est à environ 48db plus bas que la fondamentale. Ce qui est assez bon. 60db serait excellent. En plus des harmoniques on voit le bruit de fond aussi appelé distorsion de phase. Somme toute ce montage produit un signal d'assez bonne qualité reste à voir s'il serait stable en situation réelle. Pour améliorer la stabilité dans un montage réel il faut utiliser pour les condensateurs C1,C2,C3 et C4 des céramique de type NPO ou C0G.

Oscillateurs RC

Dans les fréquences audio le type d'oscillateur le plus fréquemment utilise des filtres RC (Résistance/condensateur). Les oscillateurs les plus simples à réaliser sont les multivibrateurs bistables. Ils produisent des ondes rectangulaires. En voici deux exemples simulés dans LTspice.

Le montage classique qui produit des ondes complémentaire en Vc1 et Vc2.
R3-C1 et R4-C2 détermine la durée de chaque demi-période. En ajustant les valeurs on peut donc obtenir un rapport cyclique différent de 50%.
Voici un deuxième type de bistable. Celui-ci produit un train d'impulsion très courtes. L'intervalle entre les impulsions est déterminé par la constante de temps R2-C1. Dans cette exemple l'intervalle est de 583µs et la largeur des impulsions est de 8,5µs.

Oscillateur sinusoïdale audio-fréquence

La méthode la plus simple de produire une onde sinusoïdale en audio fréquence est d'utiliser un amplificateur opérationnel avec un pont de Wein.

La fréquence d'oscillation est Fo=1/2*PI*R*C ou R est la valeur de R3 ou R4 et C est la valeur de C1 ou C2. Dans cette exemple on a donc Fo=1/2*3.1415*10e3*10e-9=1,59Khertz. Le pont de Wein est constitué des composants C1,C2,R3,R4. Les résistances R1,R2 détermine le gain de l'amplificateur opérationnel. Les 2 diodes D1,D2 et la résistance R5 sont utilisés pour diminuer le gain avant la saturation de l'amplificateur. Les diodes introduisent un élément de non linéarité dans le gain. Plus elles conduisent plus la résistance équivalante R1//R5 diminue entrainant une perte de gain. Voici à quoi ressemble le signal de sortie.
Avec le limiteur de gain.
Sortie si on enlève D1,D2 et R5.

Ce circuit n'est pas optimum même avec le limiteur de gain il y a encore trop de distortion dans le signal. Un oscillateur de Wein bien conçu peut avoir une distorsion harmonique aussi faible que 0,003% selon Horowitz et Hill1.

Oscillateur sinusoïdal 1Khz avec transistor bi-jonction

Ce circuit est un oscillateur à décalage de phase réalisé avec un transistor bi-jonction 2N3904.

Il s'agit d'un montage en émetteur commun. La sortie au collecteur de Q1 Vc1 est en anti-phase avec l'entrée Vb1. Donc pour produire une rétroaction positive il faut décaler la phase du signal en Vc1 avant de l'injecter en Vb1. C'est le rôle du réseau de condensateurs et résistances C1,C2,C3 et R1,R2,R3. Chaque pôle décale la phase de 60° pour un total de 180°. Pour éviter la saturation on diminue le gain de l'amplificateur en insérant la résistance R6 de 47 ohm en série avec C4. Le calcul de la fréquence se fait par la formule suivante lorsque R1=R2=R3 et C1=C2=C3.

   Fo=1/(2*PI*R*C*√6)
Signal de sortie, environ 100mV RMS.
Analyse FFT du signal à la sortie selon le simulateur LTspice. La première harmonique est atténuée d'environ 32db par rapport à la fondamentale.

En guise de conclusion

Pour conclure voici un vidéo qui montre comment fabriquer un mouchard qui transmet dans la bande FM. Une recherche dans Google permet de trouver de nombreux exemples de ce type de montage ainsi que plusieurs autres vidéo sur youtube.


NOTES

  1. The art of electronics 3rd edition, Paul Horwitz et Winfield Hill, editeur: Cambridge university press.

dimanche 23 novembre 2014

Lazarus

Ce matin je me réjouis car j'ai découvert que Lazare est ressuscité1. Dans les années 80 je suivais des cours d'informatique à l'UQAR et le langage de programmation utilisé pour ces cours était le Borland Turbo Pascal qui était très populaire à cette époque. Puis MS-DOS a été remplacé par Windows et Turbo Pascal est devenu Borland Delphi maintenant vendu par Embarcadero. Professionnellement j'ai développé quelques applications en delphi 6 mais à titre personnel je n'ai jamais été intéressé à défrayer le coût de la version la moins coûteuse de cet environnement qui vaut 209US$ Je suis donc passé à d'autre IDE comme SharpDevelop. C# est un langage intéressant et l'IDE de SharpDevelop aussi mais comme c'est construit par dessus .NET c'est restrictif en terme de plateformes cibles.

Lazarus

Ce que j'ai découvert ce matin c'est l'existance d'un projet open source appellé Lazarus. C'est un IDE qui utilise le compilateur Free Pascal. Cet IDE est un clone libre et gratuit de Delphi. les projets Delphi peuvent même être importés dans cet environnement, le langage étant le même c'est à dire Pascal Objet.

Cet IDE est disponible sous Windows 32/64bits, GNU/Linux 32/64 bits, OSX Intel 32bits/PowerPC. Le compilateur Free Pascal compile du code natif. Il ne nécessite donc pas l'installation de machine virtuelle Java ou CLI (.NET) et tout les librairies associés à ces gros systèmes.

Formidable avec cet IDE je vais pouvoir développer des applications Desktop aussi bien pour Windows que pour Linux dans un environnement et un langage qui me sont familiers.


1) humour hautement dépendant de la culture d'origine de l'auteur.

jeudi 13 novembre 2014

CHIPcon partie 9, ccemul

Dans ce neuvième article sur le projet CHIPcon je présente l'utilitaire ccemul. Il s'agit d'un simulateur de la console CHIPcon fonctionnant sous Windows. Ce simulateur ne permet pas seulement d'exécuter des jeux CHIPcon et SCHIP mais possède aussi des facilités de débogages. Avec les utilitaires ccasm et cc-dasm il complète le CHIPcon DEV KIT. Voici une capture d'écran de la fenêtre principale de l'émulateur.

Utilisation du clavier

Le simulateur est configuré pour le clavier Nord-Américain QWERTY et utilise les touches à gauche du clavier de la façon suivante. Le chiffre entre parenthèse représente la correspondance sur le keypad de la console CHIPcon.

1 (1)2 (2)3 (3)4 (A)
Q (4)W (5)E (6)R (B)
A (7)S (8)D (9)F (C)
Z (E)X (0)C (F)V (D)

Sur la fenêtre principale de l'application le seul contrôle qui peut avoir le focus du clavier, hormis le menu, est le contrôle de vitesse (speed). Donc pour lire les touches du clavier l'émulateur utilise les événements keydown et keyup associé à ce contrôle. Si on presse la touche alt à gauche de la barre d'espacement le focus du clavier passe à la barre de menu et donc le jeux ne réponds plus événements du clavier. Il faut donc s'assurer que c'est bien le contrôle d'ajustement de la vitesse qui a le focus, ce qui par défaut est bien le cas.

Flux de travail

Le développement d'un jeux pour la console CHIPcon se fait selon le flux de travail suivant:

Après avoir écris le programme source dans son éditeur préféré en prenant soin d'utiliser un encodage ANSI pour le fichier, l'auteur utilise ccasm pour assembler ce code source en fichier binaire. Optionnellement il peut générer un fichier *.ppf en utilisant l'option -p pour voir de quoi a l'air le code pré-traité tel qu'il est transmis à l'assembleur proprement dit. Cette option est surtout utile lors du développement de l'assembleur lui-même. L'autre option -s sert à générer un fichier texte qui contient la liste des cibles (labels) qui sont dans le programme source. Ce fichier est utilisé pour le débogage du jeux dans le simulateur ccemul. Une fois le jeux complété et débogué le fichier binaire est copié sur une carte SD et utilisé sur la console CHIPcon.

Pour créer un fichier *.lbl il faut utiliser l'option -s symbol_file lors de l'assemblage du fichier source.


ccasm lem.chp lem.bin -slem.lbl
Si on ouvre un fichier xyz.bin dans le simulateur, celui-ci regarde s'il y a un fichier xyz.lbl dans le même répertoire et charge la liste des symboles qu'il contient. La boite de dialogue Break points affiche cette liste et permet ainsi de créer un point d'arrêt à la position d'une de ces étiquettes. Si aucun fichier xyz.lbl n'existe un message d'erreur apparait mais le jeux va quand être exécuté mais il ne sera pas possible de mettre des points d'arrêt. Si vous donnez une autre extension à ce fichier vous devrez le charger manuellement avec l'option Load labels file du menu debug.
Le nombre à droite du nom de l'étiquette est l'adresse programme où est situé cette étiquette.

Vidéo de présentaion de ccemul

Le vidéo suivant présente le fonctionnement de ccemul.

Jeux LEM

J'ai créé une version du jeux des années 197x lunar landing pour CHIPcon. Je l'ai baptisé LEM du nom du module lunaire du projet Apollo. Il s'agit de faire alunir le LEM de façon sécuritaire. Sous l'effet de la gravité lunaire le LEM accélère continuellement alors qu'il se dirige vers le sol. Il faut le ralentir en utilisant la fusée principale touche 2. Il faut aussi le posé sur le seul endroit plat. Pour se déplacer horizontalement il y a 2 fusées latérales. touche 4 vers la gauche et touche 6 vers la droite. Pour un alunissage sécuritaire non seulement il faut se poser sur le plat mais il faut que les vitesses horizontales et verticales soient inférieures à 2 unités. Au départ le réservoir contient 100 unités de carburant. Le coin supérieur gauche indique le niveau de carburant.

Un alunissage réussi fait apparaitre le message congratulation! sinon c'est écris You crashed!. Le score (nombre de succès/nombre d'essais) s'affiche à la fin de chaque essais. Il faut enfoncer n'importe qu'elle touche pour le prochain essai.

Conclusion

Bien qu'un projet n'est jamais vraiment complété, ceci est le dernier article de cette série. Il y a peut-être encore un (des) bogue(s) moins évident qui se cache dans le firmware de la console ou de l'un des programmes du DEV KIT, mais tel qu'il est se projet est suffisamment stable pour être utilisable.

Ce projet m'a conduit beaucoup plus loin que ce que j'avais prévu au départ. Tout ça est open source donc si ça vous intéresse vous pouvez le prendre en main et le mener plus loin, ou simplement construire votre propre console CHIPcon pour y jouer les jeux disponible sur www.chip.com.


liens

CHIPcon partie 1, présentation du projet.
chipcon partie 2, machine virtuelle
CHIPcon partie 3, module SRAM
CHIPcon partie 4, tvout
CHIPcon partie 5, clavier et émulateur PC.
CHIPcon partie 6, interface carte SD
CHIPcon partie 7, le boitier
CHIPcon partie 8, ccasm
dépot githup du projet.
page www.chip.com rassemblant beauceaup d'information sur CHIP-8/SCHIP/MegaCHIP
article de wikipedia sur CHIP-8
Page de Roland Riegel concernant sa librairie MMC/SD/SDHC.

NOTE: ccemul a été développé avec SharpDevelop version 5 et compilé pour le .NET version 3 et processeur Intel 32 bits. Le programme compilé devrait donc fonctionné sur tout PC avec un windows 32/64 bits avec les librairies runtime .NET version 3+ installées.

mercredi 5 novembre 2014

CHIPcon partie 8, ccasm

C'est bien beau d'avoir une console de jeux mais il faut aussi pouvoir écrire des programmes pour cette console. Comme CHIPcon ajoute 4 instructions à celles de SCHIP il a bien fallu que je cré un assembleur spécifique à CHIPcon. J'ai baptisé cet assembleur ccasm (CHIPcon assembler). Le code source et le binaire compilé pour Windows avec minGW gcc 4.8.1 se trouve dans le répertoire tools. Son utilisation est des plus simple:


ccasm test.chp  test.bin [-p test.ppf]
test.chp est le nom du fichier source assembleur CHIPcon.
test.bin est le nom du fichier binaire qui sera généré par ccasm.
L'option -p si elle est présente produit un fichier contenant les lignes pré-processées tel que passées à l'assembleur. test.ppf est le nom du fichier générer par le pré-processeur.

ccasm

Pour connaître les instructions supportées par la machine virtuelle de CHIPcon il faut se référer à la table présentée dans la partie 2 de cette série.

En plus des instructions machines l'assembleur supporte les directives suivantes:

directiveutilisationdescription
EQU
EQU identifier expression
Directive de pré-processeur.
Comme pour la plupart des assembleurs cette directive permet de définir des symboles de substitution pour des constantes numériques.
exemple:
EQU BYTE_PER_ROW 128/8
DEFNDEFN identifier stringDirective de pré-processeur.
Permet de substiuer une chaîne de caratère par un nom symbolique. Utile pour nommer les variables VX.
exemple:
DEFN xpos V4
DB
DB BYTE [,BYTE]
Directive d'assembleur.
Permet de créer une ou plusieurs donnée de type BYTE (8 bits) dans l'espace programme.
DW
DW WORD [,WORD]
Directive d'assembleur.
Permet de créer une ou plusieurs donnée de type word (16 bits) dans l'espace programme.
ASCII
ASCII "text..."
Directiver d'assembeur.
Permet de créer une chaîne de caractères terminée par un zéro dans l'espace programme. Cette chaîne peut-être affichée à l'écran en utilisant le code opérationnel PRT.

Expressions

Partout où une constante numérique est applicable une expression arithmétique peut-être utilisée. Les opérateurs reconnus sont '+' addition, '-' soustraction, '*' multiplication, '/' division et '%' modulo ainsi que les parenthèses '(',')'.
exemple:


;programme hello world

equ SCREEN_WIDTH 128
equ SCREEN_HEIGH 64
equ CHAR_HEIGH 8
equ CHAR_WIDTH 6
equ CHAR_PER_LINE  SCREEN_WIDTH/CHAR_WIDTH
equ TEXT_LEN 12

defn XPOS V3
defn YPOS V4

high
cls
ld I, REG_INIT 
ld V4,[i] ; initialisation registres V0..V4
ld I, MSG
prt XPOS,YPOS ; imprime message à  l'écran
exit
REG_INIT:
db 0, 0, CHAR_HEIGH*4, CHAR_WIDTH*(CHAR_PER_LINE-TEXT_LEN)/2
MSG:
ascii "hello world!"

Assemblé avec l'option -p le fichier pré-processé contiendrais:


13  HIGH 
14  CLS 
15  LD I , REG_INIT 
16  LD V4 , [ I ] 
17  LD I , MSG 
18  PRT V3 , V4 
19  EXIT 
20 REG_INIT: 
21  DB 0 , 0 , 8 * 4 , 6 * ( 21 - 12 ) / 2 
22 MSG: 
23  ASCII "hello world!"

Commentaires

Les commentaires commence par ';' et se termine à la fin de la ligne.

Identificateur

Les identificateurs commence par une lettre ou le caractère '_'. Ce premier caractère peut-être suivi de lettres,chiffres et '_'. Les identificateurs sont utilisées pour les étiquettes et les symboles définis par EQU et DEFN.

Étiquettes

Les étiquettes sont placées en début de ligne et immédiatement suivie du caractère ':'. Les étiquettes sont des repères pour les instructions JP étiquette, les appels de sous-routines CALL étiquette ainsi que pour le chargement du registre pointeur de données LD I, étiquette. Le caractères ':' ne fait pas partie du nom de l'étiquette et ne doit donc être utilisé qu'à l'endroit où l'étiquette est définie. Une instruction peut suivre une étiquette sur la même ligne.


boucle: LD V1, 4 ; ceci est valide
MSG: ascii "hello world!"  ; ceci est  valide

Nombres et bases

ccasm reconnait les nombres entiers seulement dans les bases décimal, hexadécimal et binaire. Le caractère # indique un nombre hexadécimal et le caractère '$' indique un nombre binaire. Dans les nombres binaires le zéro peut-être remplacé par un point '.' dans le but d'accentuer la forme des sprites.
exemples:


546      ; nombre décimal
#f585    ; nombre hexadécimal
$101001  ; nombre binaire
$1.1..1  ; même nombre binaire 

; le point à la place du zéro permet
; de mieux visualiser la forme du sprite
sprite:
DB $..1111..
DB $.1....1.
DB $1......1
DB $1.1..1.1
DB $1......1
DB $1..11..1
DB $.1....1.
DB $..1111..

code source

Le code source du programme doit-être en ASCII ou ANSI (Windows). L'assembleur est insensible à la casse, les lettres étant converties automatiquement en majuscules. Il n'y a qu'une instruction par ligne. Le traitement se fait par ligne en 2 phases. En première phase si la ligne est une directive EQU ou DEFN le nouveau symbole est créé dans la liste. Si la ligne est une instruction assembleur ou une directive de donnée, le pré-processeur analyse chaque mot de la ligne et substitue les symboles définis par des EQU et DEFN. Il converti aussi les lettres minuscules en majuscules. Cette ligne pré-processée est ensuite assemblée en phase 2.
La description formelle de la syntaxe reconnue par ccasm est dans le fichier tools/ccasm_bnf.txt

Avec son assembleur et son dé-assembleur CHIPcon est prêt pour le développement de jeux. Mais ce serait mieux s'il y avait un émulateur sur le PC pour éviter d'avoir à copier le fichier binaire sur carte SD afin de le tester sur la console. Opération qui doit-être répétée de nombreuses fois lors du développement. La création de cet émulateur ccemul est donc la prochaine étape de ce projet.


liens

CHIPcon partie 1, présentation du projet.
chipcon partie 2, machine virtuelle
CHIPcon partie 3, module SRAM
CHIPcon partie 4, tvout
CHIPcon partie 5, clavier et émulateur PC.
CHIPcon partie 6, interface carte SD
CHIPcon partie 7, le boitier
dépot githup du projet.
page www.chip.com rassemblant beauceaup d'information sur CHIP-8/SCHIP/MegaCHIP
article de wikipedia sur CHIP-8
Page de Roland Riegel concernant sa librairie MMC/SD/SDHC.