Contenidos
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?
- 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. - Stick Drift: Mira los valores de
STICK XeYsin tocar el mando. Si los números no son0, 0, tu mando tiene «drift» (desgaste mecánico). - Joypad Poll: Es el motor del programa. Sin esta función, la consola no «pregunta» al mando qué botones se están pulsando.

