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.

Aucun commentaire:

Publier un commentaire