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:
directive | utilisation | description |
---|---|---|
EQU |
| 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 |
DEFN | DEFN identifier string | Directive 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 |
| Directive d'assembleur. Permet de créer une ou plusieurs donnée de type BYTE (8 bits) dans l'espace programme. |
DW |
| Directive d'assembleur. Permet de créer une ou plusieurs donnée de type word (16 bits) dans l'espace programme. |
ASCII |
| 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.
Aucun commentaire:
Publier un commentaire
Remarque : Seuls les membres de ce blogue sont autorisés à publier des commentaires.