Site logo

Triceraprog
La programmation depuis le Crétacé

  • Injecter un programme dans un émulateur VG5000µ ()

    Reprenons sur la programmation en assembleur sur VG5000µ depuis un ordinateur actuel. Car s'il est possible et tout à fait légitime, par hobby, de programmer directement sur la machine, à l'ancienne, pour « retro programmer » comme il y a du « retro gaming » en éprouvant les sensations originelles, ce n'est pas mon but ici.

    Mon but, c'est de pouvoir programmer depuis un éditeur de texte simple, mais pas trop, et de pouvoir mettre au point avec certaines facilités comme un retour d'erreur d'assemblage et l'accès à un debuggeur. Et tout ceci avec une chaîne qui minimise les manipulations répétitives.

    Minimiser les manipulations répétitives permet de rester concentré au maximum sur ce que je fais. Je n'ai pas envie, à chaque lancement, de taper des commandes particulières ou de faire quelques clics souris, toujours les mêmes, avec un risque de me tromper et de chasser un bug que je crois être là alors que je me suis juste trompé dans une manipulation.

    Il y a de nombreuses manière d'automatiser une chaîne de construction de programme. Certains choix sont contraints par les outils que l'on utilise. D'autres sont des choix par préférences.

    Après avoir fait mon travail de reflexion, lorsque je passe à la partie d'entrée au clavier, les données sont les suivantes :

    • j'entre le code source dans un éditeur,
    • j'effectue une action qui produit un fichier binaire,
    • ce fichier binaire doit se lancer dans un émulateur et/ou produire un fichier pour chargement sur machine réelle,
    • s'il y a des erreurs, les afficher,
    • s'il n'y a pas d'erreurs l'émulateur se lance automatiquement et lance à son tour le programme.

    Cette dernière opération est mon point de départ et le sujet de cet article. Vous aurez compris au passage, et suite à l'article précédent, que j'utiliserai un émulateur pour la mise au point, avant de passer sur machine réelle pour confirmation du fonctionnement.

    Choix de l'émulateur

    Au niveau VG5000µ, au moment de l'écriture, il n'y a pas beaucoup de choix : soit DCVG5K, soit MAME. Les deux possèdent un debuggeur et le moyen d'injecter un binaire en mémoire.

    Je vois en MAME deux avantages pour moi : la possibilité de scripter le debuggeur et le lancement en natif sous Linux, qui est derrière le système d'exploitation que j'utilise (Ubuntu). DCVG5K a l'avantage de la légèreté dû au fait qu'il est dédié à une seule machine, ainsi que de la simplicité d'utilisation.

    Pour savoir comment utiliser MAME, c'est très simple, il suffit de taper mame -showusage en ligne de commande... Ooops... 462 lignes d'explication de paramètres... Et ce n'est qu'un résumé.

    MAME est un gros morceau et j'espère qu'avec les renseignements de cet article, je vous aurait débrousaillé le terrain.

    Lancement de l'émulation

    Avant toute chose : tout ce que j'explique est du lancement en ligne de commande. Il est possible de faire la même chose à travers des fichiers de configuration ou des raccourcis Windows avec paramètres mais le but final est d'inclure ça à un script de lancement. La ligne de commande est aussi la manière la plus simple de jouer avec les paramètres (pour peu qu'on utilise un shell moderne).

    Pour lancer l'émulation du VG5000µ, c'est tout simplement :

    mame64 vg5k

    Note : l'exécutable s'appelle mame64 pour quoi car je compile la version depuis les sources. Suivant les distributions de MAME, il peut avoir un autre nom.

    Note : Si MAME vous annonce qu'il vous manque une ROM, revenez à mon article précédent, dumpez votre ROM, placez-là dans le répertoire attendu par MAME et c'est reparti.

    Le lancement de l'émulateur dans cette configuration lance la machine après un bandeau la présentant et, à l'heure actuelle, un bandeau rouge indiquant que l'émulation ne fonctionne pas. En effet, l'émulation n'est pas considérée comme terminée ; mais en ce qui nous concerne, cela sera suffisant.

    J'ai évoqué un debuggeur. Il est accessible sous plusieurs formes et je vais laisser celle par défaut :

    mame64 vg5k -ramsize 48k -nomax -window -debug

    J'ai ajouté au passage quelques options supplémentaires :

    • -ramsize 48k indique que je veux l'extension RAM maximale disponible sur le VG5000µ (l'autre option est 32k, et par défaut, la machine aura ses 16k)
    • -nomax indique que je ne veux pas maximiser la fenêtre
    • -window indique que je veux lancer l'émulateur dans une fenêtre et non en plein écran
    • -debug, bien entendu, lance le debugger

    En mode debugger par défaut, l'émulation ne se lance pas tout de suite. Elle est immédiatement mise en pause. Sur l'image suivante, vous pouvez voir que le PC est à $0000, sur la première instruction qui sera exécutée par le processeur de la machine jp $1000.

    Debugger par défaut (Qt) sur MAME

    Ce debugger accepte des raccourcis clavier mais peut aussi accepter des commandes. Le debugger peut aussi prendre ses commandes depuis un fichier texte grace à la commande source.

    Je vous invite à entrer le texte suivant dans un fichier debug.txt.

    go $2adf
    load hello.bin,$7000
    go
    

    Note : go $2adf indique de lancer l'émulation avec un point d'arrêt temporaire à l'adresse $2adf, qui est une addresse qui, lorsqu'elle est atteinte, garanti que le VG5000µ a terminé son initialisation.

    Puis d'avoir un fichier binaire au nom de hello.bin de mettre ces deux fichiers dans le répertoire de travail de MAME.

    Et enfin, depuis le debuggeur, taper source debug.txt

    Le debuggeur devrait afficher :

    >go $2adf
    Stopped at temporary breakpoint 2ADF on CPU ':maincpu'
    >load hello.bin,$7000
    Data loaded successfully to memory : 0x7000 to 0x7018
    >go
    

    Suivant votre fichier, l'addresse 0x7018 peut varier. Dans mon cas, le fichier provient du résultat de l'assembleur d'un article précédent.

    Dans le debuggeur, vous pouvez ouvrir une fenêtre de visualisation de mémoire pour vérifier que le fichier binaire a été injecté. Et si votre fichier est le même que le mien, vous pouvez entrer CALL &"7000" dans la machine émulée pour voir apparaître Bonjour! à l'écran.

    C'est déjà bien, non ?

    Automatique on a dit !

    C'est bien... mais taper source à chaque lancement, c'est long, on peut se tromper et cela serait mieux si cela pouvait être automatique.

    Et c'est tout à fait possible :

    mame64 vg5k -ramsize 48k -window -nomax -debug -debugscript debug.txt

    -debugscript, comme son nom l'indique, fourni un nom de script pour le debugger qui sera exécuté au démarrage. Juste après le lancement de l'émulateur, le fichier binaire est donc injecté sans manipulation.

    D'accord, mais il faut encore taper la commande CALL &"7000" pour lancer le programme, et avec la disposition d'un clavier qui change entre la machine émulée et la machine hôte, personnellement, je trouve cela fastidieux (surtout pour la touche ", qui est une touche morte dans ma configuration par défaut).

    Pas de problème :

    mame64 vg5k -ramsize 48k -window -nomax -debug -debugscript debug.txt -autoboot_command 'CALL &"7000"\n' -autoboot_delay 2

    • -autoboot_command indique la chaîne à passer à l'émulateur comme si les touches étaient appuyées,
    • -autoboot_delay pose un délai de 2 secondes avant de lancer les commandes, ce qui laisse le temps au script de s'exécuter.

    À vrai dire, le délai de 2 secondes est la valeur par défaut, mais l'idée était de montrer la commande, pour pouvoir ajuster le délai.

    Là, ça commence à être pas mal.

    Mais...

    Mais il y a deux choses encore qui me chiffonnent. Tout d'abord, la fenêtre du debuggeur se place au-dessus de ma fenêtre d'émulation, et je dois systématiquement la bouger pour voir le résultat. Il y a bien la possibilité d'utiliser la commande -debugger none, mais alors le script n'est plus exécuté.

    Il y a la possibilité d'utiliser un debuggeur qui utilise la bibliothèque imgui et qui s'affiche dans la fenêtre d'émulation. Je vous suggère alors de passer -nomax en -max. Possibilité aussi pour le debugger par défaut (mais imgui est semi-transparent, le debugger par défaut opaque).

    mame64 vg5k -ramsize 48k -window -max -debug -debugscript debug.txt -autoboot_command 'CALL &"7000"\n' -autoboot_delay 2 -debugger imgui -video bgfx

    Cela donne déjà de quoi s'amuser et automatiser la chaîne de développement. Il y a cependant moyen d'aller encore plus loin avec MAME. Ça sera pour la prochaine fois.

    Debugger utilisant ImGUI sur MAME


  • Travailler sur émulateur et dump de la ROM VG5000µ ()

    Précédemment, j'ai commencé à parler d'une chaîne d'assemblage pour développer un programme depuis un ordinateur actuel vers une machine ancienne, le VG5000µ qui est l'ordinateur qui nous suit depuis le début de ces articles.

    Un des avantages d'utiliser une machine de développement différente de la machine cible est de ne pas souffrir des erreurs, plantages et reboot provoquées par des erreurs. Imaginez, développer sur la machine que l'on programme elle-même, à une époque où le système d'exploitation ne protège rien du tout : une erreur, un reboot et si vous n'avez pas sauvé, il faut recommencer. Et si vous avez sauvé, les temps de chargements et de sauvegardes sont assez long, surtout sur une machine qui n'a pour mémoire externe qu'un magnétophone à cassettes !

    Bref, développer sur une machine annexe et envoyer sur la machine cible, c'est plus simple, cela permet de profiter d'outils modernes mais... ça reste lent dans la plupart des cas. En tout cas sur une machine comme le VG5000µ qui n'a pas eu de développement spécifique qui pourrait injecter du code depuis une autre machine (pour le moment tout du moins, car c'est possible et j'ai cru comprendre qu'une carte était à l'étude).

    Viens la solution de l'émulation. Un émulateur est un logiciel qui va reproduire le fonctionnement de la machine cible. Étant énormément plus lente que la machine hôte, la machine cible pourra être émulée de manière tout à fait satisfaisante. Un émulateur pourra aussi facilement et rapidement charger un programme depuis la machine hôte pour la mise au point, réduisant la fréquence d'essai sur machine véritable.

    Mais pour utiliser un émulateur, dans la majorité des cas, il faut fournir la ROM, c'est-à-dire le programme résident de la machine. Ce n'est pas nécessaire pour DCVG5K, l'émulateur développé par Daniel Coulom. Par contre, c'est nécessaire pour l'utilisation de MAME (plus exactement sa sous-partie MESS, qui émule les ordinateurs). De manière générale, vous êtes supposés avoir une copie de votre propre version de la ROM. Passons sur la partie un peu ridicule de cette restriction puisque le fichier que vous allez obtenir sera en tout point identique à celui obtenu par extraction depuis une autre machine...

    Toujours est-il qu'il est très simple de copier (dumper) le contenu de la ROM d'une machine de ce type, puisqu'elle est visible et complètement adressable par l'utilisateur.

    La méthode

    Le VG5000µ doit être branché, bien entendu, et relié à une carte d'acquisition audio. Cela peut être tout simplement l'entrée son de votre ordinateur, certains utilisent des enregistreurs séparés.

    L'idée est donc de sauver le contenu de la ROM, tel quel, dans un fichier. Rien de plus simple :

    CSAVEM"ROM",0,16384
    

    CSAVEM est la commande pour sauver un fichier depuis la Mémoire. Le nom du fichier est entre guillemets. 0 est l'adresse de départ et 16384 la taille en octets de la plage à sauvegarder. La ROM faisant 16 kio, la sauvegarde contiendra l'intégralité de la ROM.

    Avant d'appuyer sur la touche ENTRÉE du VG5000µ, il faudra démarrer l'enregistrement sur l'ordinateur. J'utilise Audacity pour cela. Un logiciel libre de manipulation audio.

    Assurez-vous au niveau du niveau d'entrée que le signal sature, cela sera plus facile pour le décodage. N'oublions pas qu'on est-ici dans un codage de signal numérique, pas dans de l'écoutable, ce qui est important, c'est que les signaux soient distinguables.

    L'opération est assez longue, environ 2 minutes 30.

    Signal audio d'un enregistrement sur K7

    Une fois le signal enregistré, il faut l'exporter en format WAV puis le décoder. Comment décoder un signal en sortie de VG5000µ sera l'objet d'un futur article ou je décrirai le programme que j'utilise (et que je publierai sur GitHub). En attendant, l'outil DCToolBox de Daniel Coulom fonctionne bien, et se lance tout à fait avec Wine sous Ubuntu si vous n'êtes pas sous Windows.

    Avec mon outil, le contenu binaire intéressant est extrait simplement.

    Avec DCToolBox, il vous faudra transformer le WAV en format K7 et en extraire les informations. Le format K7 est extrêmement simple, il contient l'ensemble des données encodées dans le signal numérique produit par la machine. Tout d'abord les 32 octets d'en-tête, qui ne nous intéressent pas ici, puis 10 octets d'amorce du contenu sauvé, puis le contenu lui-même. La taille, nous la connaissons, est de 16384 octets.

    Il faut donc aller chercher les 16384 octets à partir du 42ième, ce qui s'écrit très simplement dans un shell Unix :

    tail -c+43 dump.k7 | head -c 16384 > dump.rom
    

    dump.k7 étant le nom du fichier au format K7 et dump.rom le fichier résultat.

    Si vous n'avez pas accès à un shell Unix... je suis preneur d'une méthode simple pour l'ajouter à l'article.

    Et voilà !

    Vous avez à présent une extraction de la ROM d'une machine VG5000µ, utilisable par les émulateurs la nécessitant.

    Sauver la ROM sur K7


  • Joyeuses fêtes en haute résolution ()

    Puisque la fin de l'année approche et que les fêtes dites de fin d'années ainsi que le nouvel an sont d'actualités, j'ai ressorti mon convertisseur d'image vers le VG5000µ publié ici et décrit ici pour une image « haute résolution » sur la machine.

    L'astuce pour que la compression passe bien a été de positionner le maximum de motifs identiques sur une grille. Pour les dates et l'adresse du site, j'ai ajouté dans le programme BASIC à la main l'affichage en texte.

    91 J$="22001177--22001188"
    92 CURSORX15:CURSORY17:TX6,3:PRINTJ$
    93 CURSORX15:CURSORY18:TX6,3:PRINTJ$
    95 CURSORX23:CURSORY23:TX6,0:PRINT"TRICERAPROG.FR"
    

    On y voit que pour écrire en double hauteur, il faut doubler l'affichage sur la ligne suivante. Et pour écrire en largeur, il faut doubler les lettres à afficher. Le tout en précisant 3 en second paramètre de l'instruction TX.

    Le dithering qu'effectue la conversion malheureusement n'a pas été des plus heureux sur l'un des e, ce qui fait que la palette aurait pu être plus petite qu'elle ne l'est.

    Voici l'image tramée :

    L'image tramées

    Ainsi que la palette obtenue :

    La palette

    Avant de passer au résultat, un fichier zip est disponible contenant le programme en format .k7 ainsi qu'en .wav.

    Petit détail : sur un émulateur, l'écran reste noir pendant la construction de l'image, puis celle-ci apparaît lorsque dans la deuxième partie du programme, les caractères étendus sont construits.

    Par contre, sur une machine réelle, la mémoire du processeur graphique n'étant pas effacée au démarrage, on commence par voir s'afficher des bandes verticales mêlées à un peu de bruit, puis le message apparaît lorsque les caractères étendus sont construits.

    Dans les deux cas, après un redémarrage à chaud (le programme BASIC n'est pas effacé de la mémoire), l'affichage se fait progressivement, car les caractères étendus sont déjà construits.

    Le résultat


  • Les différents VG5000µ ()

    Depuis le début de la création de ce site, la majorité des articles a été consacré à du développement sur VG5000µ. Les programmes sont testés sur du matériel réel, même si je les mets au points sur un ordinateur moderne. Les captures d'écrans sont aussi faites sur un vrai VG5000µ, en sortie sur un moniteur récent grâce à un adaptateur Peritel vers HDMI.

    Le VG5000µ a cette particularité d'exister sous différentes marques : Philipps, Schneider et Radiola. Plus de détails peuvent se trouver sur des sites plus détaillés dans l'histoire de cette machine, comme je l'indiquais dans un billet en début d'année.

    En attendant la suite des articles sur les outils pour programmer cette machine en assembleur, voici une petite photo de famille.

    Photo de 4 VG5000µ


  • Des outils pour programmer en assembleur sur VG5000µ ()

    La dernière fois, j'avais évoqué le logiciel d'assemblage, ou assembleur comme étant le programme permettant de passer d'un programme sous sa forme source, c'est-à-dire écrite sous forme lisible par un humain, dans une forme binaire, qui sera plus exactement nommée forme objet. C'est cette forme qui pourra être exécutée par la machine.

    Pour programmer, quel que soit la forme que revêt cette programmation, on a besoin d'outils. Les outils primaires peuvent être une table de référence, des manuels, un stylo, des feuilles et beaucoup de patience. Rapidement, le besoin d'outils pour effectuer les tâches automatiques et répétitives qui forment la transformation d'un programme source en programme objet se fait sentir. Et quoi de mieux pour traier des tâches automatiques et répétitives de transformation qu'un... ordinateur.

    Le problème de la poule et de l'œuf n'est pas le sujet ici. Le principal est qu'à l'heure de l'écriture de cet article, il y a des outils utilisables sur un ordinateur actuel pour travailler plus facilement sur les ordinateurs plus anciens qui m'intéressent ici.

    Pour le processeur Z80, il y a le choix. Mais comme du travail a déjà été fourni pour le VG5000µ, autant s'en servir. Et c'est vers la suite d'outils z88dk que je vais me tourner. Cette suite contient bien plus qu'un assembleur Z80 et j'en ferai un petit tour par la suite. Mais pour le moment, ce qui m'intéresse, c'est l'assembleur.

    Outil de listing

    Pour voir en quoi un assembleur peut nous aider, commençons par un test simple. Tout d'abord, j'écris le programme de l'article précédent dans un fichier hello.asm. Pour rappel, ce programme affichait Bonjour ! à l'écran avec les commandes suivantes :

        ORG $7000         ; Spécification de l'adresse mémoire d'implentation
    
        PUSH AF           ; Sauvegarde des registres sur la pile
        PUSH BC
        PUSH DE
        PUSH HL
    
                          ; Le cœur du programme :
        LD HL, chaine     ; Chargement de l'adresse du texte dans le registre HL
        CALL $36AA        ; Puis appel de la routine d'affichage de chaîne de caractères.
    
        POP HL            ; Restauration des registres depuis la pile
        POP DE
        POP BC
        POP AF
    
        RET               ; Retour au programme appelant
    chaine:
        DEFB "Bonjour !", 0
    

    Dans un terminal, j'exécute la commande suivante : z80asm -l hello.asm et j'obtiens très rapidement un nouveau fichier, hello.lis avec le contenu suivant :

    1     0000                      ORG $7000
    2     0000              
    3     0000  F5                  PUSH AF
    4     0001  C5                  PUSH BC
    5     0002  D5                  PUSH DE
    6     0003  E5                  PUSH HL
    7     0004              
    8     0004  21 0F 00            LD HL, chaine
    9     0007  CD AA 36            CALL $36AA
    10    000A              
    11    000A  E1                  POP HL
    12    000B  D1                  POP DE
    13    000C  C1                  POP BC
    14    000D  F1                  POP AF
    15    000E              
    16    000E  C9                  RET
    17    000F                  chaine:
    18    000F  42 6F 6E 6A 6F 75 72 20 21 00 
                                    DEFB "Bonjour !", 0
    19    0019
    

    Ce fichier listing est constitué en première colonne d'un numéro de ligne, en seconde colonne d'une adresse mémoire relative au début du fichier, dans la colonne suivante de valeurs hexadécimales correspondant au résultat de l'assemblage, autrement dit au langage machine, puis enfin vient le contenu du programme source.

    C'est donc un mélange de code source et d'une représentation lisible du code objet. Pratique pour suivre le résultat de la compilation simplement. Mais pas pratique pour essayer de lancer le programme sur la machine cible. Ce format est fait pour être lisible par un humain.

    Création d'un binaire

    Pour être adapté à la machine, par exemple en utilisant le programme de chargement en BASIC utilisé précédemment, j'ai besoin d'une forme qui ne contient que les octets indiqués dans le listing, sans tous les commentaires. J'ai besoin d'une seconde chose : que le programme soit logé à l'adresse mémoire que j'ai indiqué avec ORG $7000.

    En effet, le listing ci-dessus a été produit avec des adresses commençant à l'adresse mémoire 0. Sur un VG5000µ, comme dans tous les ordinateurs à base de Z80, c'est un emplacement de ROM, une zone dans laquelle je ne pourrai pas écrire ce programme. J'avais donc indiqué une autre zone mémoire précise pour implenter le programme.

    Appartée : à cause des instructions que j'ai utilisé, c´est une indication obligatoire. L'instruction LD HL, chaine est une instruction qui prend une adresse de manière absolue. La chaîne de caractère doit donc se trouver à un endroit connu et absolu en mémoire. Mon programme n'est pas relogeable. Si je n'avais utilisé que des instructions adressant la mémoire de manière relative, c'est-à-dire toujours sous forme d'une distance à partir de l'instruction courante, alors le programme aurait été relogeable, et l'adresse d'implentation n'aurait pas été importante. Faire des programmes relogeables sur Z80 n'est pas si simple, et même si z80asm peut aider cela sort du cadre de l'article.

    Voyons ce que produit cette autre commande : z80asm -b hello.asm. Cette fois, c'est une fichier hello.bin que j'obtiens. Et si j'essaie de l'ouvrir comme un fichier texte, je n'obtiens rien de franchement lisible, à part la chaîne de caractères Bonjour ! à la fin.

    Ouverture du fichier binaire comme du texte

    Cependant, la taille du fichierest de 25 octets et c'est exactement le nombre de données hexadécimales indiqué dans le listing obtenu plus tôt. C'est aussi le nombre d'octets dans le chargeur en BASIC utilisé à l'article précédent.

    Si je regarde le contenu de ce fichier avec un outil qui permet d'afficher le contenu de fichier sous forme hexadécimale, j'obtiens bien la même chose.

    00000000  f5 c5 d5 e5 21 0f 70 cd  aa 36 e1 d1 c1 f1 c9 42  |....!.p..6.....B|
    00000010  6f 6e 6a 6f 75 72 20 21  00                       |onjour !.|
    

    Une utilisation possible est alors de transférer le contenu de ce fichier sous forme de DATA dans un chargeur en BASIC et voilà.

    Par exemple, avec un petit script écrit en Python 3, cela pourrait donner ça :

    basic = """10 S=&"7000"
    20 READ A$
    30 IF A$="FIN" THEN END
    40 A$="&"+CHR$(34)+A$+CHR$(34):A=VAL(A$)
    50 POKE S,A
    60 S=S+1
    70 GOTO 20
    300 DATA {0}
    400 DATA FIN"""
    
    with open('hello.bin', 'rb') as f:
        content = f.read()
    
    data = [hex(d)[2:].upper() for d in content]
    data = ",".join(data)
    
    print(basic.format(data))
    

    C'est un script assez limité, sans protection au niveau de la taille du programme, ce qui pourrait générer un trop grand nombre de DATA, mais cela peut être utile pour, par exemple... écrire des articles avec des petits bouts de programmes à copier/coller dans un émulateur facilement.

    Cependant, cela reste très manuel et ce n'est pas très satisfaisant. Nous verrons donc dans l'article suivant comment aller plus loin en utilisant les outils à disposition et se faciliter la vie.


« (précédent) Page 16 / 23 (suivant) »

Tous les tags

3d (14), 6809 (1), 8bits (1), Affichage (24), AgonLight (2), Altaïr (1), Amstrad CPC (1), Apple (1), Aquarius (2), ASM (30), Atari (1), Atari 800 (1), Atari ST (2), Automatisation (4), BASIC (31), BASIC-80 (4), C (3), Calculs (1), CDC (1), Clion (1), cmake (1), Commodore (1), Commodore PET (1), CPU (1), Debug (5), Dithering (2), Divers (1), EF9345 (1), Émulation (7), Famicom (1), Forth (3), Game Jam (1), Hector (3), Histoire (1), Hooks (4), i8008 (1), Image (16), Jeu (14), Jeu Vidéo (4), Livre (1), Logo (2), Machine virtuelle (2), Magazine (1), MAME (1), Matra Alice (3), MDLC (7), Micral (2), Motorola (1), MSX (1), Musée (2), Nintendo Switch (1), Nombres (3), Optimisation (1), Outils (3), Pascaline (1), Peertube (1), Photo (2), programmation (4), Python (1), ROM (15), RPUfOS (5), Salon (1), SC-3000 (1), Schéma (5), Synthèse (14), Tortue (1), Triceraprog (1), VG5000 (62), VIC-20 (1), Vidéo (1), Z80 (20), z88dk (1)

Les derniers articles

Family BASIC, le BASIC sur Famicom
Instance Peertube pour Triceraprog
Environnement de développement pour Picthorix
Un jeu en Forth pour Hector HRX : Picthorix
Yeno SC-3000 et condensateurs
Suite de tests pour VG5000µ
Un peu d'Atari ST
Le Forth sur Hector HRX
J'MSX 24 et un micro jeu
Récréation 3D, Matra Alice

Atom Feed

Réseaux