Le
SysOFFYop les gens, je vous présente mon projet actuel. Un système virtuelle old school. (Une console virtuel pour faire simple)
J'avais envie de créer "une console ou un micro ordinateur 8 bits", j'avais fais une paire de test avec fusion mais de bien concret jusque à ce que je tombe sur l'interpreteur
Chip-8 et des articles sur le comment créer un emulateur du chip-8. (Ou re créer son interpreteur pour être exacte)
Et je me suis lancé dans ce projet mais je me dévie un peu du chip-8 pour mon propre interpreteur.
Pour commencer c'est quoi le Chip-8 ? C'est un "processeur virtuel" qui pouvait tourner véritablemment sur de vielle machine et des calculatrices. Il simule des registres, et utilise son propre langage machine.
Le Chip-8 intégre 34 instructions. Nous sommes loins du nombre d'instruction existant des deux procos 8bits qui se sont bataillé à cette époque. Le chip-8 est donc un bon exercise pour apprendre à créer un émulateur...
Le interpreteur je l'appelle le "SysOff" pour tout simplement Système Offgame.
"Le proco" le ChipOFF.
Le procésseur comprend les opcodes (instruction machine) du Chip-8 avec l'ajoute d'autre opcode qui sont déja en place ou qui sera mis en place mais n'est pas compatible avec les fichiers binaire dédié à au chip-8 pour la simpel raison que pour décoder une instruction je préférer garder l'ordre poids Fort + poids Faible d'un double octets. La norme du chip-8 est l'inverse.
CaractéristiquesLe SysOff permet d'afficher 90 points sur 40 seulement deux couleurs affichable (Noir/Blanc)
La Ram est de 4096 octets. (4ko) Les 512 premiers octets sont réservés au système
La Vram est de 512 octets qui ne sont pas emputé au 4ko. Un octet donne 8 points à l'écran.
Au niveau des contrôles 5 boutons. (Haut,Bas,Gauche,Droite,Feu)
L'architecture16 Registres 8 bits(De 0 à 15 ($0-$f)) donc le derniers fait office de Registre de Drapeau.
Un Registre 16 bits (I) qui est un pointeur d'adresse.
Un Registre 12 bits (PC) qui est le pointeur de la prochaine instruction à interpréter
Un Registre compteur de son 8 bits. C'est simple si le compteur de son est supérieur à 0, ça lance un Bip
Un Registre Compteur de jeu 8 bits
Les deux compteurs sont décrémenté de 1toutes les 4 instructions.
La pile qui permet de mémoriser 16 Adresses. (Mode LIFO, Derniers entrée / premier à être sortie)
Et son registre 8 bits qui permet de pointer sur la pile la plus haute.
(32 octets + 1 pour le registres). Mémoire interne dédié pour la pile)
Coder le SysOFFL'interpréteur se code en langage machine.
Le programme permet de lire un fichier binaire et mémoriser son contenu a partir de l'adresse 512.
Pour mes tests "je code en dure" les mémorisations d'instruction dans la mémoire.
Un "compilateur" est prévus plus tard !
Le langage utilisé pour ce système virtuelLe langage utilisé est le Dark Basic. C'est simple à mettre en oeuvre, rapide, pour un prototype c'est sympathique.
La pile et les registres sont mémorisés dans des tableau.
La VRAM aussi.
La RAM (les 4k) eu parcontre sont directement mémoriser dans la mémoire du PC ! La dark basic permet de créer des blocks de mémoire et pouvoir y travailler.
Du boulot !Du boulot est encore à faire.
Ajouter des opcodes comme par exemple pouvoir manipuler la pile autre qu'avec PC. J'ai encore un peu de "places"
Continuer la mémorisation de la police d'écriture.(Pour le moment je suis à K)
Gestion du système !
Création d'exemple
Et créer un compilateur
Les opcodes Voici les opcodes qui fonctionne. (enfin normalement si ça bug pas et plus ou moins xd)
$00E0
Effacer l'écran.
La VRAM est réinitialisé à 0 ce qui efface l'écran.
$00EE
Retour de la sous routine.
Mémorise l'adresse de la Pile dans le Compteur de programme pour la prochaine adresse d'instruction.
La pile est décrémenté de 1
$1nnn
Sauter à une adresse.
Le Compteur de programme est modifié en fonction de la valeur NNN
$2nnn
Aller à une sous routine
Le compteur de programme est mémorisé dans la pile
Saut à l'adresse nnn
$3xkk
Sauter la prochaine instruction si kk est égale de la valeur contenue dans le registre x
La valeur du registre X est comparé a la valeur kk. Si il y a égalité, le PC est incrémenté de 2 pour sauter la prochaine instruction.
$4xkk
Sauter la prochaine instruction si kk est différent de la valeur contenue dans le registre x
La valeur du registre X est comparé a la valeur kk. Si les deux valeurs sont différents, le PC est incrémenté de 2 pour sauter la prochaine instruction.
$5xyo
Sauter la prochaine instruction si le contenu du registre X est égale au contenu du registre Y.
La valeur du registre X est comparé a la valeur du registre Y. Si il y a égalité, le PC est incrémenté de 2 pour sauter la prochaine instruction.
$6xkk
La valeur kk est chargé dans le registre X
$7xkk
La valeur kk est ajouté au contenu du registre X
$8xy0
La valeur contenu dans le registre Y est chargé dans le registre X
$8xy1
Le Registre X est remplacé par l'opération logique du contenue du registre X (or) Registre Y
$8xy2
Le Registre X est remplacé par l'opération logique du contenue du registre X (and) Registre Y
$8xy3
Le Registre X est remplacé par l'opération logique du contenue du registre X (xor) Registre Y
$8xy4
Le contenu du registre Y est éditionné au contenu du registre X, avec le registre 15 = 1 si c'est supérieur à 255. (Sinon le registre 15 passe à 0)
$8xy5
Le contenu du registre Y est soustrait au contenu du registre X, avec le registre 15 = 1 si c'est inférieur à 0 (Sinon le registre 15 passe à 0)
$8xy6
Décalage de 1 sur la droite du registre X
Le Registre F prend la valeur du bits plus à droite de X
$8xy7
Le contenu du registre Y est soustrait au contenu du registre X.
Si la valeur est négative alors le registre F prend la valeur de 1 sinon elle devient 0
$8xyE
Décalage de 1 sur la gauche du registre X
Le Registre F prend la valeur du bits plus à droite de X
$9xy0
Si le contenu du registre X est différent du contenu du registre Y alors on saute la prochaine instruction.Le Pc est incrémenté de 2
$Annn
Le registre I prend la valeur de nnn
$Bnnn
Saute à l'instruction contenu à l'adresse nnn + le contenu du registre 0
$Cxkk
Le registre X prendre une valeur aléatoire entre 0 et la valeur kk
$Dxyn
Affiche le « sprites » à la position de la valeur contenu au registre x et Y. Charge les 8 premier bites a l'adresse contenu dans le registre I. Exécute n ligne.
$Ex9E
Saute la prochaine instruction si le numéros du bouton utilisé est égale au contenu du registre X
$ExA2
Saute la prochaine instruction si le numéros du bouton utilisé est différent au contenu du registre X
$Fx00
Charge le contenu du registre X à l'adresse contenu dans le registre I
$Fx07
Le Registre X prend le contenu du registre compteur de jeu
$Fx0A
Attendre qu'une touche est utilisé. La valeur de la touche est mémorisé dans le registre x
$Fx15
Le registre compteur de jeu prend le contenu du registre X
$Fx18
Le compteur de Son prend la valeur contenu dans le registre X
$Fx1E
Le contenu du registre X est additionné au contenu du registre I.
$Fx29
Mémorise dans le registre I, l'adresse de départ ou se trouve le numéros du caractére à afficher contenu dans le registre X
$Fx33
Le contenu du registre x est découpé en centaine, dizaine, et unité (base de 10) et placé dans l'adresse I,I+1,I+2
$Fx55
Charge le contenu du registre 0 à X à l'adresse pointant de I à I+X
$Fx65
Charge le contenu de l'adresse I à I+X dans le registre 0 à X
DiversLien du code source actuel pour information.
(Version test 00,00,05)
Lien