N64 hardware monitor

Un buen desarrollador siempre verifica sus herramientas. Este programa comprueba la conexión física, la respuesta de los botones y la precisión del stick analógico de tu mando de Nintendo 64.

1️⃣ Configuración del Proyecto

Para mantener el orden, crea una carpeta específica para este diagnóstico:

Bash

mkdir -p ~/n64_monitor && cd ~/n64_monitor
# Inicializamos el entorno Libdragon (Mac M1/M2/M3)
export DOCKER_DEFAULT_PLATFORM=linux/amd64
libdragon init

2️⃣ El Fichero de Compilación (Makefile)

Crea el archivo Makefile en la raíz. Este archivo automatiza la creación de la ROM.

Makefile

PROG_NAME = monitor_mando
SRCDIR = src
BUILDDIR = build

N64_INST = /n64_toolchain
include $(N64_INST)/include/n64.mk

OBJS = $(BUILDDIR)/main.o
CFLAGS += -Iinclude -falign-functions=32

all: $(PROG_NAME).z64

$(PROG_NAME).elf: $(OBJS)

$(PROG_NAME).z64: N64_ROM_TITLE = "N64 Controller Test"

$(BUILDDIR)/%.o: $(SRCDIR)/%.c
	@mkdir -p $(dir $@)
	@echo "    [CC] $<"
	$(CC) $(CFLAGS) -c -o $@ $<

clean:
	rm -rf $(BUILDDIR) *.z64 *.elf
.PHONY: clean

3️⃣ El Código de Diagnóstico (src/main.c)

Crea la carpeta src y el archivo main.c. Este código lee los datos brutos del Joybus y los dibuja en pantalla.

C

#include <stdio.h>
#include <libdragon.h>

int main(void) {
    timer_init();
    display_init(RESOLUTION_320x240, DEPTH_16_BPP, 2, GAMMA_NONE, ANTIALIAS_RESAMPLE);
    joypad_init();

    while (1) {
        // Actualizar el estado de los periféricos
        joypad_poll();

        // Leer datos del puerto 1
        joypad_style_t estilo = joypad_get_style(JOYPAD_PORT_1);
        joypad_buttons_t btn = joypad_get_buttons_held(JOYPAD_PORT_1);
        joypad_inputs_t input = joypad_get_inputs(JOYPAD_PORT_1);

        surface_t *disp = display_get();
        graphics_fill_screen(disp, 0);

        graphics_draw_text(disp, 20, 20, "== DIAGNOSTICO DE MANDO N64 ==");

        // 1. Verificación de presencia física
        if (estilo == JOYPAD_STYLE_NONE) {
            graphics_draw_text(disp, 40, 60, "ESTADO: [ DESCONECTADO ]");
            graphics_draw_text(disp, 40, 75, "Conecte un mando al puerto 1...");
        } else {
            graphics_draw_text(disp, 40, 60, "ESTADO: [ CONECTADO ]");
            
            // 2. Registro de Botones (Digital)
            graphics_draw_text(disp, 40, 90, "BOTONES ACTIVOS:");
            if (btn.a) graphics_draw_text(disp, 50, 105, "- A");
            if (btn.b) graphics_draw_text(disp, 50, 115, "- B");
            if (btn.z) graphics_draw_text(disp, 50, 125, "- Z (Gatillo)");
            if (btn.start) graphics_draw_text(disp, 50, 135, "- START");

            // 3. Registro de Cruceta (D-Pad)
            if (btn.d_up)    graphics_draw_text(disp, 180, 105, "UP");
            if (btn.d_down)  graphics_draw_text(disp, 180, 115, "DOWN");
            if (btn.d_left)  graphics_draw_text(disp, 180, 125, "LEFT");
            if (btn.d_right) graphics_draw_text(disp, 180, 135, "RIGHT");

            // 4. Registro Analógico (Stick)
            char stick_info[32];
            sprintf(stick_info, "STICK X: %d  Y: %d", input.stick_x, input.stick_y);
            graphics_draw_text(disp, 40, 180, stick_info);

            // Dibujamos una línea vectorial que representa la inclinación del stick
            graphics_draw_line(disp, 160, 210, 160 + (input.stick_x / 2), 210 - (input.stick_y / 2), 0xFFFF);
            graphics_draw_text(disp, 135, 225, "Vector Stick");
        }

        display_show(disp);
    }
}

4️⃣ Compilación y Carga

Una vez que los archivos estén en su lugar, ejecuta los siguientes comandos en tu terminal de Mac:

Bash

# Limpiar compilaciones previas
libdragon make clean

# Compilar la ROM
libdragon make

Esto generará el archivo monitor_mando.z64.


💡 ¿Qué estamos probando realmente?

  1. Joypad Style: Comprobamos si el hardware detecta algo en el puerto. Si tienes un mando conectado pero sale DESCONECTADO, los pines están sucios o el mando falla.
  2. Stick Drift: Mira los valores de STICK X e Y sin tocar el mando. Si los números no son 0, 0, tu mando tiene «drift» (desgaste mecánico).
  3. Joypad Poll: Es el motor del programa. Sin esta función, la consola no «pregunta» al mando qué botones se están pulsando.