Triceraprog
La programmation depuis le Crétacé

Scripter MAME pour explorer la machine ()

Puisque je suis actuellement dans l'utilisation de LUA pour scripter MAME, faisons un petit détour pour explorer quelques possibilités.

Les fonctions accessibles aux scripts LUA sont assez nombreuses. Je n'en connais pas de documentation complète si ce n'est dans les sources du programme lui-même à cet endroit : mame/src/frontend/mame/luaengine.cpp. Des groupes de commentaires indiquent les fonctions et leur usage. Reste à utiliser la console pour expérimenter un peu la façon de les appeler.

L'une des possibilités intéressantes est de pouvoir agir sur l'affichage de l'émulateur. Cela peut être assez pratique pour suivre certaines valeurs en mémoire, pour afficher des informations sur le comportement de la machine, voire d'ajouter des fonctionnalités interactives à l'émulateur facilement.

Affichage à l'écran

La première chose à faire pour afficher quelque chose à l'écran est de récupérer un objet permettant de le manipuler. Pour cela, en passant par l'objet manager, on récupère la machine, puis un écran qui dans notre cas se nomme :screen.

Grâce à cet objet, il est ensuite possible d'afficher du texte, de tracer des lignes et des boites. C'est limité, mais déjà pas mal.

Ce qui suit est un exemple d'utilisation dans lequel je vais chercher directement en mémoire les coordonnées X et Y du curseur du VG5000µ, qui sont situées aux emplacement mémoire fixes $4805 et $4806. Par un objet donnant accès à la mémoire et l'utilisation des fonctions read_u8 (comme lecture d'un entier non signé sur 8 bits), je récupère les valeurs et je les affiche.

Simple et efficace. Je peux à présent, si le script est dans un fichier nommé vgdisplay.lua, lancer la commande suivant pour suivre les évolutions des coordonnées du curseur.

mame64 vg5k -ramsize 48k -nomax -window -autoboot_delay 0 -autoboot_script vgdisplay.lua

Le script

-- Script for MAME that launches the vg5k emulator
-- and continuously displays the position of the cursor

-- Get the only screen of the VG-5000µ
local screen = manager:machine().screens[":screen"]

-- Get access to the memory
local cpu = manager:machine().devices[":maincpu"]
local memory = cpu.spaces["program"]

function draw_hud()
    local cursor_x = memory:read_u8(0x4805)
    local cursor_y = memory:read_u8(0x4806)
    screen:draw_text(300, 40, "X: " .. cursor_x, 0xffff0000);
    screen:draw_text(300, 50, "Y: " .. cursor_y, 0xffff0000);
end

emu.register_frame_done(draw_hud)

Le résultat

Affichage en surimpression dans MAME