Rétro Coding sur VICE
Ça fait déjà quelque fois que j’en parle, mais je suis un fan de rétro. Je pense que pour apprécier ce qu’on a aujourd’hui, il faut savoir apprécier ce qu’il y avait avant. Aujourd’hui, j’aimerais aller là ou je ne suis jamais allé, soit écrire du BASIC dans un Commodore 64 via l’émulateur VICE.
Mais pourquoi diantre?!
Pour exactement la même raison qu’un peintre va se limiter lui-même à une palette de couleurs précise pour faire une toile. On s’applique une ou plusieurs restrictions pour laisser notre cerveau arriver avec des solutions hors du commun. Donc, avant même de savoir comme ça fonctionne, je vais tenter de reproduire le classique « to do application ».
Préparation
Pour cet article, j’ai utilisé Ubuntu et j’ai installé Vice via apt. Si vous utilisez Windows, téléchargez ici.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Installer Vice sudo apt install vice # Obtenir l'émulateur cd ~ wget http://www.zimmers.net/anonftp/pub/cbm/crossplatform/emulators/VICE/vice-3.3.tar.gz tar -zxvf vice-3.3.tar.gz # Copier dans les dossiers de vice cd vice-3.3/data/C64 sudo cp chargen kernal basic /usr/lib/vice/C64 cd ../DRIVES sudo cp d1541II d1571cr dos* /usr/lib/vice/DRIVES/ |
Une fois vice et l’environnement du C64 est prêt, rouler :
1 |
x64sc |
Vous devriez voir soit un écran qui vous est familier, soit quelque chose d’effrayant et incompréhensible, tout dépendant l’âge que vous avez 😛
Quelles sont nos restrictions?
Vite comme ça, on voit qu’on a 38 911 octets de disponible pour notre code qui sera écrit en BASIC, mais je ne pense pas qu’on risque d’utiliser tout ça 😛 par contre, vous voyez l’éditeur? Pas de menu, pas de barre de défilement, pas de recherche… on écrit une ligne, on fait « enter », elle est traitée 😉
Ceci dit, mis à part les restriction de l’environnement, on peut ajouter à ça une restriction au niveau des fonctions BASIC disponibles. Un très bon exemple de ça, c’est qu’il n’existe pas d’instruction « else » pour le « if ».
J’ai parlé du fait qu’il faut mettre les numéros de ligne avant le code? Ouaip! on écrit 10 PRINT "HELLO WORLD!". Comme ça, si on se trompe, on peut écraser le code d’une ligne en remettant le même numéro de ligne. Il faut donc prévoir des « espaces » entre les numéros si on veut y ajouter du code plus tard. Par exemple :
1 2 |
10 PRINT "HELLO WORLD!" 20 GOTO 10 |
Ce bout de code affichera HELLO WORLD! en boucle (esc pour quitter), mais on pourrait ensuite taper :
1 |
15 PRINT "BONJOUR LE MONDE!" |
Et la ligne serait alors insérée entre la 10 et la 20.
Oh! Et… dernier point. Vous vous souvenez de votre prof qui vous disait de ne JAMAIS utiliser de GOTO ? Ici c’est la norme.
Les commandes de base pour exécuter le code
Au démarrage, la RAM est vide. Commencez à taper du code et faites « enter » pour envoyer la ligne en mémoire.
Pour lister le contenu du code qui se trouve en mémoire, il faut exécuter LIST. Le C64 devrait vous répondre READY .
Pour exécuter le code en mémoire, tapez RUN. Le C64 devrait vous répondre READY .
Si vous voulez recommencer depuis le début, tapez NEW pour réinitialiser le programme. Le C64 devrait vous répondre READY .
Let’s GoOoOo!
L’objectif étant de recréer l’application de gestion de tâches à faire que j’ai l’habitude d’utiliser comme exemple lorsque je donne des formations. Dans cette application, on peut :
- créer une tâche à faire
- marquer une tâche comme complétée
- lister les tâches
Pour y arriver, gardons ça au plus simple pour commencer. La liste des tâches sera conservée dans un tableau de chaînes de caractères alors que l’indicateur pour vérifier si une tâche est complétée ou non sera stocké dans un deuxième tableau. Comme ça, on pourra retrouver l’information des deux propriétés en utilisant le même indice.
Initialisation
Cette section nous permettra d’initialiser les différentes variables qui seront utilisées et préparer l’écran pour l’affichage.
1 2 3 4 5 |
10 print chr$(147) 15 max% = 10 20 dim t$(max%) 25 dim s%(max%) 30 current% = 1 |
J’ai perdu qui là? Pas de panique, c’est du chinois, c’est normal 🙂 Ça fait partie de l’exercice.
PRINT CHR$(147) permet simplement d’effacer le contenu affiché à l’écran. Pourquoi CHR$(147) ?

Du gros fun en vue 😛 CURRENT correspond à l’indice du prochain todo à ajouter, on se souvient, BASIC commence à 1 pas à 0 😛
Les lignes 20 et 25 déclarent les deux tableaux, le premier étant un tableau de chaînes de caractères à cause du suffixe $ au nom de la variable, et l’autre contient des entiers à cause du suffixe %. J’ai bien dit entier. Il n’existe pas de type booléen pour nos variables sur le C64, nous stockerons donc 0 (false) ou 1 (true)
Boucle principale
Lorsqu’on programme avec un langage procédurale, on doit avoir une boucle d’exécution qui va permettre à l’utilisateur de garder le programme ouvert tant qu’il ne désire pas quitter. Ça nous prend donc un point d’entrée pour boucler. Ici, on va simplement retenir le numéro de ligne et effacer le contenu à l’écran pour préparer l’affichage du menu :
1 |
35 PRINT CHR$(147) |
Menu et liste
Affichons simplement un menu indiquant à l’utilisateur les différentes options possibles :
1 2 3 4 5 6 7 8 |
40 print "todo app - menu principal" 45 print " 1. creer un todo" 50 print " 2. completer un todo" 55 print " 3. quitter" 60 print "choix";:input choice% 65 if choice% = 1 then goto 85 75 if choice% = 3 then end 80 goto 35 |
Pour faire simple, j’ai laissé la ligne 70 absente pour pouvoir insérer le IF CHOICE = 2 THEN GOTO ... lorsque j’aurai une idée de ou sera la ligne du début du code pour le choix deux. La ligne qui contient PRINT "CHOIX";:INPUT CHOICE% permet de prendre l’entrée de l’utilisateur et de stocker cette valeur dans la variable CHOICE, puis on branche l’exécution avec un GOTO ou un END selon le choix, sinon on reboucle à l’initialisation du menu pour redemander son choix à l’utilisateur.
Créer un todo
Si l’utilisateur choisi l’option 1, demandons-lui simplement la description de tâche, puis ajoutons-là avec son indicateur aux deux tablaux, puis on retourne à l’écran principal :
1 2 3 4 5 |
85 print "description";:input desc$ 90 t$(current%) = desc$ 95 s%(current%) = 0 100 current% = current% + 1 105 goto 35 |
Marquer un todo comme complété
Ici, on va afficher la liste des TODO avec leur indice, puis un indicateur à savoir si la tâche et faite ou non, puis la description. Pour finir, on demande à l’utilisateur de choisir le todo à compléter, en profitant du fait qu’on débute à l’indice 0 pour permettre à l’utilisateur d’annuler l’action :
1 2 3 4 5 6 7 |
110 print "id","done","desc" 115 for i = 1 to max%: print i,s%(i),t$(i):next i 120 print "0 pour annuler" 125 print "id a completer";:input id% 130 if id% = 0 then goto 35 135 s%(id%) = 1 140 goto 35 |
Tester la solution
Pour lancer, simplement exécuter RUN.
Code complet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
10 print chr$(147) 15 max% = 10 20 dim t$(max%) 25 dim s%(max%) 30 current% = 1 35 print chr$(147) 40 print "todo app - menu principal" 45 print " 1. creer un todo" 50 print " 2. completer un todo" 55 print " 3. quitter" 60 print "choix";:input choice% 65 if choice% = 1 then goto 85 70 if choice% = 2 then goto 110 75 if choice% = 3 then end 80 goto 35 85 print "description";:input desc$ 90 t$(current%) = desc$ 95 s%(current%) = 0 100 current% = current% + 1 105 goto 35 110 print "id","done","desc" 115 for i = 1 to max%: print i,s%(i),t$(i):next i 120 print "0 pour annuler" 125 print "id a completer";:input id% 130 if id% = 0 then goto 35 135 s%(id%) = 1 140 goto 35 |
Conclusion
Bon. Aujourd’hui, j’espère que vous avez appris que les vielles technos peuvent aussi être cool. Ça nous force à penser autrement. Par exemple, si on voulait ajouter une autre propritété aux todos, comme par exemple la date de création, comment on aurait pu recréer le concept de l’objet pour le pas avoir 1 tableau par propriété? Faudrait s’y pencher un peu 😛
Si vous avez aimé, n’hésitez pas à partager dans vos réseaux!
Cheers!
Commentaires
1 commentaire
Très cool. J’en avais un C64 quand j’étais au primaire. Je me souviens juste de la commande Load « le nom du jeu » ,8,1.
Je me rappelle que dans les dernières pages du manuel utilisateur il y avait quelques programmes que l’on pouvait coder. Une dizaine de lignes pour émettre un simple « bip » sonore. Ca n’avait pas réveillé de passion à ce moment-là et je n’ai pas codé de nouveau avant le cégep.
Bonne idée de billet de blogue ! Bonne année 2021.
Laisser un commentaire