SERIE KITAQ • EDICIÓN DE REFERENCIA
VERIFICACIÓN
Captura de la ejecución
Código fuente recopilado: 14 de septiembre de 2026 · Edición inglesa: 14 de septiembre de 2026
Verificación del compilador nativo
Las compilaciones nativas y comprobaciones de ejecución finalizaron correctamente en Windows, Linux, macOS ARM y macOS Intel. KITAQGB superó 48 pruebas y 395 comprobaciones de herramientas por entorno; KITAQFC, 55 y 401. También se probó Rust 1.85. PUBLIC_DISTRIBUTION.json registra los hashes de los binarios instalados y el origen de la validación. Los flujos públicos de GitHub Actions compilan y prueban estas fuentes de forma independiente.
Las salidas de referencia guardadas comprueban bytes de ROM, diagnósticos y formatos de las herramientas. Las anteriores pruebas de emulación C# son registros históricos vinculados a sus fuentes originales. No demuestran automáticamente todas las API Rust, el hardware real ni el arranque completo de juegos mediante el BIOS FDS. El script PNG original no está disponible y se reconstruyó a partir de su especificación; no puede afirmarse igualdad de bytes con él.
Cambios y verificación de la biblioteca local, 2026-10-03
Las fuentes de C:/kitaqgb_project/lib se compararon con la revisión pública 2de7f4b. Las fechas por sí solas no determinan qué versión es más reciente. La versión local añade funciones; la pública contiene otras adiciones y correcciones. Esta sección describe las fuentes locales guardadas por separado de las pruebas existentes de la API pública.
physics2d.c conserva la API de contacto y añade implementaciones con caché de contacto y límite de velocidad mediante KQ2D_CACHE_SURFACE. Reserve el banco ROM 13 al activarlo. Definir KQ2D_EXTERNAL_SCALE_Q8, KQ2D_EXTERNAL_REST_COMPONENT o KQ2D_EXTERNAL_SURFACE exige proporcionar la implementación correspondiente. Los 8.872 casos siguientes usan la ruta predeterminada sin estas definiciones.
KQ3D_BODY_SPHERE=0x04 selecciona contactos esfera–caja. El radio es half_x. kq3d_overlap_sphere_aabb(sphere, box) incluye la tangencia y devuelve 0 para punteros NULL o radios no positivos. No existe un solucionador específico esfera–esfera. Mantenga diferencias, productos y sumas de cuadrados dentro de sus rangos de 16 bits.
Un body activo con KQ3D_BODY_KINEMATIC=0x02 actualiza velocidad y posición X/Y en kq3d_step incluso con masa inversa cero. La posición y velocidad Z no cambian. Los contactos no desplazan un body de masa inversa cero. kq3d_integrate_body sigue omitiendo los bodies estáticos. break_speed y KQ3D_BODY_BROKEN no provocan destrucción automática.
El bank_switch local escribe kq_bank_current y la dirección 0x2000. A diferencia de la ruta pública __bankswitch, no actualiza el seguimiento de banco del compilador. Cambie desde el banco fijo; use __bankswitch si también debe mantener el estado de restauración.
Los cgb_bg_color/cgb_obj_color locales y sus envoltorios RGB de un color no activan el incremento automático del índice. La ejecución CGB confirmó que el byte bajo de 0x1234 se sobrescribe con 0x12. Use la corrección pública o una API colors con matrices. En DMG no se escribe.
El metasprite_draw local amplía el contador a first_id+count solo al terminar. Un retorno anticipado en el límite de 40 sprites no lo actualiza. Con first_id=39 y count=2, devuelve 1, la ranura 39 está activa y el contador vale 0. La versión pública actualiza el contador al procesar cada ranura.
La versión local ofrece vram_get_queue_used y vram_get_queue_free, pero carece del vram_get_queue_capacity público. La capacidad es VRAM_QUEUE_MAX, 32 de forma predeterminada. Un comando produce used=1 y free=31.
wire3d_dmg.h declara DrawRect2D solo en el perfil de 96 líneas. DrawBoxEdges2D se declara en ambos perfiles; DrawIndexedEdges solo en el de 120 líneas. Seleccione una fuente acorde con el perfil. El dibujo de estas funciones no se volvió a verificar aquí. No se encontró implementación de DrawRect2D ni DrawBoxEdges2D en las fuentes lib guardadas. Son solo declaraciones; llamarlas requiere una implementación aparte.
El audio_vblank local no incluye los AudioVBlank_QueueReset/QueueRefill/QueuePlay públicos ni audio_vblank_queue.inc. ZX0 también es exclusivo de la versión pública. Estas adiciones no forman parte de las funciones locales declaradas verificadas.
kq3d_overlap_sphere_aabb
u8 kq3d_overlap_sphere_aabb(const KQBody3D* sphere, const KQBody3D* box);KQ3D_BODY_SPHERE=0x04 selecciona contactos esfera–caja. El radio es half_x. kq3d_overlap_sphere_aabb(sphere, box) incluye la tangencia y devuelve 0 para punteros NULL o radios no positivos. No existe un solucionador específico esfera–esfera. Mantenga diferencias, productos y sumas de cuadrados dentro de sus rangos de 16 bits.
Verificación ejecutada
Ruta 2D predeterminada: 8.872 casos superados con la API C de KOKURA y selección automática de hardware. Se comprobaron límite de velocidad, contactos, multiplicación Q8 con signo e instante de impacto. No fueron ejecuciones separadas con DMG/CGB explícitos.
Límites físicos: 19 casos en DMG y CGB, 38 ejecuciones superadas. Las pruebas separadas de extensión 3D y reproducción de sprites/VRAM/paleta coincidieron con lo esperado en ambos modos. Paleta y sprites reproducen defectos; no confirman un funcionamiento correcto.
Son pruebas de emulador de ROM generadas por el compilador C#. No demuestran equivalencia Rust, hardware físico, audio, dibujo ni corrección de todas las API. Las imágenes y pruebas existentes siguen siendo resultados históricos ligados a sus huellas de fuentes.
Huellas de fuentes, entradas, valores esperados y observados, pasos de reproducción · evidence.tar.gz · verify_rom_cases.py · verify_surface.py
Capturas de pantalla
Las capturas del emulador aparecen junto a las explicaciones de los ejemplos. Compare la salida con el resultado esperado; una imagen por sí sola no verifica el sonido, la entrada del mando, los periféricos ni el hardware real.
Mostrar el juego de caracteres incluido gb_font
Objetivo: Muestra qué letras, dígitos y signos de puntuación contiene la fuente original incluida y cómo dibujarlos.
Funcionamiento: m_init prepara la pantalla y la fuente. m_text dibuja cada línea; m_put dibuja las comillas dobles mediante el código de carácter 34.
Controles y resultado esperado: Busque 26 letras mayúsculas, 26 minúsculas, 10 dígitos y 30 signos de puntuación. Compruebe que todos los glifos sean legibles. No se requiere ninguna entrada.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Su primer texto en pantalla gb_hello
Objetivo: Muestra la secuencia básica para iniciar una ROM y dibujar texto y un número en el fondo.
Funcionamiento: Después de m_init, m_text dibuja el saludo y m_number da formato a 42. El bucle final espera fotogramas y mantiene la pantalla visible.
Controles y resultado esperado: La pantalla muestra HELLO WORLD y 042. El cero inicial corresponde al formato decimal de tres dígitos.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Calcular con un valor intermedio más amplio gb_arithmetic
Objetivo: Muestra cómo conservar un resultado intermedio que no cabe en ocho bits.
Funcionamiento: (u16)200 + 100 produce 300. El programa divide el resultado entre 10 y luego lo convierte a u8 para mostrarlo. Observa que la conversión al tipo más amplio ocurre antes de la suma.
Controles y resultado esperado: 030 representa el resultado calculado, 30.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Bifurcaciones y bucles gb_control
Objetivo: Prueba for, continue, while, do/while y switch en un cálculo sencillo.
Funcionamiento: Sumar de 0 a 7 omitiendo 3 da 25. El bucle while avanza hasta 30, do/while hasta 32 y switch selecciona case 32 para asignar 42.
Controles y resultado esperado: 042 es el resultado final de estos bucles y bifurcaciones.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Funciones, arrays, estructuras y punteros gb_aggregate
Objetivo: Muestra cómo agrupar valores y acceder a ellos mediante funciones y punteros.
Funcionamiento: El programa copia un Point que contiene (10,20) y después escribe de 1 a 4 en un array mediante un puntero. Suma el resultado de la función, 30, a los valores del array 1, 2 y 4 y a la constante 5.
Controles y resultado esperado: La suma se muestra como 042. Siga la copia de la estructura, las escrituras en ptr[i] y el valor devuelto por la función.
![Funciones, arrays, estructuras y punteros: La suma se muestra como 042. Siga la copia de la estructura, las escrituras en ptr[i] y el valor devuelto por la función.](../verification/gb_aggregate.png)
Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Banderas de bits y copia de búfer gb_bits_memory
Objetivo: Agrupa banderas en un byte y copia un búfer en un área de almacenamiento independiente.
Funcionamiento: __memset borra cuatro bytes. El programa activa el bit 3, invierte el bit 1 y después copia los cuatro bytes con __memcpy.
Controles y resultado esperado: el primer byte de destino se muestra como 010; el bit 3 aporta 8 y el bit 1 aporta 2.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Contar nuevas pulsaciones de un botón gb_input
Objetivo: Distingue una nueva pulsación de un botón que sigue pulsado.
Funcionamiento: Cada fotograma llama a input_update. El contador solo avanza cuando input_pressed(BTN_A) es verdadero.
Controles y resultado esperado: el contador comienza en 000. Pulse A para obtener 001; mantenerlo pulsado no añade más. Suéltelo y vuelva a pulsarlo para obtener 002. El contador de un byte vuelve a 000 después de 255.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Multiplicar valores de punto fijo Q8.8 gb_fixed
Objetivo: Muestra la conversión de entero a Q8.8, la multiplicación y la conversión de vuelta a entero.
Funcionamiento: fix_from_int convierte 3 y 4 a Q8.8. fix_mul los multiplica y fix_to_int convierte el producto de vuelta a entero.
Controles y resultado esperado: 012 significa 3 × 4 = 12. Es el entero convertido, no el valor interno escalado por 256.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Asignar desde un pool fijo de objetos gb_entity
Objetivo: Crea un objeto a partir de un conjunto fijo de posiciones, sin asignación dinámica de memoria.
Funcionamiento: entity_init reinicia el pool. entity_create crea el tipo 1 en (20,30); el programa comprueba el ID de fallo 0xFF antes de establecer vx en 2.
Controles y resultado esperado: 001 es la cantidad de objetos activos, no un ID ni una coordenada. Este ejemplo no actualiza ni dibuja el objeto, por lo que no aparece ningún personaje en movimiento.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Registrar un valor de diagnóstico en RAM gb_debug
Objetivo: Conserva un valor del juego con nombre en un búfer de diagnóstico, separado de la visualización en pantalla.
Funcionamiento: El programa inicializa la depuración, establece la etiqueta de fotograma en 1 y registra el valor 42 con el nombre HP.
Controles y resultado esperado: 001 es la cantidad de entradas de traza. HP=42 se guarda en el búfer de diagnóstico; la pantalla por sí sola no muestra ni verifica ese contenido.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Guardar un historial de posiciones gb_chain
Objetivo: Muestra cómo guardar un historial de posiciones en un búfer circular.
Funcionamiento: chain_init asocia un array con espacio para cuatro puntos. Después, chain_push_head registra (20,30).
Controles y resultado esperado: 042 es un marcador fijo de finalización, no una coordenada ni una cantidad. Inspecciona trail y points para comprobar el historial guardado. Este programa no dibuja un cuerpo que siga al protagonista.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Leer el contador de fotogramas de la biblioteca gb_system
Objetivo: Muestra cómo las esperas contadas en fotogramas afectan al contador de fotogramas de la biblioteca.
Funcionamiento: Después de system_init, el programa llama dos veces a system_wait_vblank y muestra system_get_frame8.
Controles y resultado esperado: El resultado es 002. El bucle de espera utiliza la función auxiliar m_wait del manual, por lo que el valor mostrado no sigue aumentando.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Seleccionar el ID de la escena actual gb_scene
Objetivo: Muestra cómo seleccionar un ID para distinguir escenas, como la pantalla de título y la partida.
Funcionamiento: El programa registra dos entradas SceneDef inicializadas a cero y selecciona el ID 1 mediante scene_change.
Controles y resultado esperado: 001 es el ID actual devuelto por scene_get_current. El ejemplo no registra callbacks de escena ni dibujo de transiciones.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Mostrar el juego de caracteres incluido fc_font
Objetivo: Muestra qué letras, dígitos y signos de puntuación contiene la fuente original incluida y cómo dibujarlos.
Funcionamiento: m_init prepara la pantalla y la fuente. m_text dibuja cada línea; m_put dibuja las comillas dobles mediante el código de carácter 34.
Controles y resultado esperado: Busque 26 letras mayúsculas, 26 minúsculas, 10 dígitos y 30 signos de puntuación. Compruebe que todos los glifos sean legibles. No se requiere ninguna entrada.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Su primer texto en pantalla fc_hello
Objetivo: Muestra la secuencia básica para iniciar una ROM y dibujar texto y un número en el fondo.
Funcionamiento: Después de m_init, m_text dibuja el saludo y m_number da formato a 42. El bucle final espera fotogramas y mantiene la pantalla visible.
Controles y resultado esperado: La pantalla muestra HELLO WORLD y 042. El cero inicial corresponde al formato decimal de tres dígitos.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Calcular con un valor intermedio más amplio fc_arithmetic
Objetivo: Muestra cómo conservar un resultado intermedio que no cabe en ocho bits.
Funcionamiento: (u16)200 + 100 produce 300. El programa divide el resultado entre 10 y luego lo convierte a u8 para mostrarlo. Observa que la conversión al tipo más amplio ocurre antes de la suma.
Controles y resultado esperado: 030 representa el resultado calculado, 30.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Bifurcaciones y bucles fc_control
Objetivo: Prueba for, continue, while e if/else en un cálculo sencillo.
Funcionamiento: El bucle for suma de 0 a 7 saltándose el 3 y obtiene 25. El bucle while avanza hasta 32; el if siguiente asigna 42 cuando el valor coincide.
Controles y resultado esperado: 042 es el resultado final. El programa usa una bifurcación if/else.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Funciones, arrays, estructuras y punteros fc_aggregate
Objetivo: Muestra cómo agrupar valores y acceder a ellos mediante funciones y punteros.
Funcionamiento: El programa copia un Point que contiene (10,20) y después escribe de 1 a 4 en un array mediante un puntero. Suma el resultado de la función, 30, a los valores del array 1, 2 y 4 y a la constante 5.
Controles y resultado esperado: La suma se muestra como 042. Siga la copia de la estructura, las escrituras en ptr[i] y el valor devuelto por la función.
![Funciones, arrays, estructuras y punteros: La suma se muestra como 042. Siga la copia de la estructura, las escrituras en ptr[i] y el valor devuelto por la función.](../verification/fc_aggregate.png)
Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Banderas de bits y copia de búfer fc_bits_memory
Objetivo: Agrupa banderas en un byte y copia un búfer en un área de almacenamiento independiente.
Funcionamiento: __memset borra cuatro bytes. El programa activa el bit 3, invierte el bit 1 y después copia los cuatro bytes con __memcpy.
Controles y resultado esperado: el primer byte de destino se muestra como 010; el bit 3 aporta 8 y el bit 1 aporta 2.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Contar nuevas pulsaciones de un botón fc_input
Objetivo: Distingue una nueva pulsación de un botón que sigue pulsado.
Funcionamiento: Cada fotograma llama a input_update. El contador solo avanza cuando input_pressed(BTN_A) es verdadero.
Controles y resultado esperado: el contador comienza en 000. Pulse A para obtener 001; mantenerlo pulsado no añade más. Suéltelo y vuelva a pulsarlo para obtener 002. El contador de un byte vuelve a 000 después de 255.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Multiplicar valores de punto fijo Q8.8 fc_fixed
Objetivo: Muestra la conversión de entero a Q8.8, la multiplicación y la conversión de vuelta a entero.
Funcionamiento: fix_from_int convierte 3 y 4 a Q8.8. fix_mul los multiplica y fix_to_int convierte el producto de vuelta a entero.
Controles y resultado esperado: 012 significa 3 × 4 = 12. Es el entero convertido, no el valor interno escalado por 256.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Asignar desde un pool fijo de objetos fc_entity
Objetivo: Crea un objeto a partir de un conjunto fijo de posiciones, sin asignación dinámica de memoria.
Funcionamiento: entity_init reinicia el pool. entity_create crea el tipo 1 en (20,30); el programa comprueba el ID de fallo 0xFF antes de establecer vx en 2.
Controles y resultado esperado: 001 es la cantidad de objetos activos, no un ID ni una coordenada. Este ejemplo no actualiza ni dibuja el objeto, por lo que no aparece ningún personaje en movimiento.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Registrar un valor de diagnóstico en RAM fc_debug
Objetivo: Conserva un valor del juego con nombre en un búfer de diagnóstico, separado de la visualización en pantalla.
Funcionamiento: El programa inicializa la depuración, establece la etiqueta de fotograma en 1 y registra el valor 42 con el nombre HP.
Controles y resultado esperado: 001 es la cantidad de entradas de traza. HP=42 se guarda en el búfer de diagnóstico; la pantalla por sí sola no muestra ni verifica ese contenido.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Guardar un historial de posiciones fc_chain
Objetivo: Muestra cómo guardar un historial de posiciones en un búfer circular.
Funcionamiento: chain_init asocia un array con espacio para cuatro puntos. Después, chain_push_head registra (20,30).
Controles y resultado esperado: 042 es un marcador fijo de finalización, no una coordenada ni una cantidad. Inspecciona trail y points para comprobar el historial guardado. Este programa no dibuja un cuerpo que siga al protagonista.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Leer el contador de fotogramas de la biblioteca fc_system
Objetivo: Muestra cómo las esperas contadas en fotogramas afectan al contador de fotogramas de la biblioteca.
Funcionamiento: Después de system_init, el programa llama dos veces a system_wait_vblank y muestra system_get_frame8.
Controles y resultado esperado: El resultado es 002. El bucle de espera utiliza la función auxiliar m_wait del manual, por lo que el valor mostrado no sigue aumentando.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Seleccionar el ID de la escena actual fc_scene
Objetivo: Muestra cómo seleccionar un ID para distinguir escenas, como la pantalla de título y la partida.
Funcionamiento: El programa registra dos entradas SceneDef inicializadas a cero y selecciona el ID 1 mediante scene_change.
Controles y resultado esperado: 001 es el ID actual devuelto por scene_get_current. El ejemplo no registra callbacks de escena ni dibujo de transiciones.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Convertir coordenadas del mundo en coordenadas de pantalla gb_camera
Objetivo: Resta la posición de la cámara para obtener la posición en pantalla de un punto del mundo.
Funcionamiento: Camera_Set recibe el valor Q8.8 2560, equivalente a X=10 píxeles. Después, Camera_WorldToScreenX convierte la coordenada del mundo X=52.
Controles y resultado esperado: 052 menos 010 da el 042 mostrado. Es un cálculo de coordenadas; no desplaza el fondo.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Descomprimir datos RLE en RAM gb_rle
Objetivo: Prueba una representación compacta de bytes repetidos mediante pares de cantidad y valor.
Funcionamiento: Los bytes comprimidos {3,42,0} representan tres copias de 42 seguidas de un terminador con cantidad cero. rle_decode escribe en un destino de tres bytes.
Controles y resultado esperado: el último byte, out[2], se muestra como 042. Los tres bytes descomprimidos deben contener 42.
![Descomprimir datos RLE en RAM: el último byte, out[2], se muestra como 042. Los tres bytes descomprimidos deben contener 42.](../verification/gb_rle.png)
Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Leer y escribir una casilla del tablero gb_board
Objetivo: Muestra cómo se corresponden las coordenadas de una cuadrícula con el almacenamiento de un juego de tablero.
Funcionamiento: Un array de 16 bytes almacena un tablero de 4×4. El programa lo borra, escribe 42 en la celda (2,1) y vuelve a leer esa misma celda.
Controles y resultado esperado: 042 es el valor leído de nuevo. El programa no dibuja el tablero de 4×4.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Avanzar una caja un paso de física gb_physics
Objetivo: Inicializa un mundo y un cuerpo rectangular, y después actualiza la posición a partir de la velocidad.
Funcionamiento: El cuerpo empieza en (40,40), con velocidad (2,0) y gravedad cero. El programa llama a kq2d_step una vez.
Controles y resultado esperado: 042 es la coordenada X resultante, medida en píxeles enteros en este ejemplo. No se dibuja una caja ni una animación continua.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Gestionar la finalización y el tiempo de espera de una transferencia serie gb_link
Objetivo: Distingue una transferencia completada de otra que no termina dentro del límite de espera.
Funcionamiento: El maestro envía 42 y espera con Link_WaitByte. Al finalizar, muestra el byte recibido; si vence el tiempo de espera, cancela la transferencia y muestra cero.
Controles y resultado esperado: Una transferencia completada sin conexión puede devolver 255. Si vence el tiempo de espera, muestra 000; con un par conectado, muestra el byte recibido. El resultado no siempre es 042.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Leer datos de ROM con un argumento de banco gb_bank
Objetivo: Muestra los argumentos necesarios para copiar datos de ROM a RAM.
Funcionamiento: far_data_read copia los dos bytes 7 y 42 en copied, con el argumento de banco 0 y longitud 2.
Controles y resultado esperado: El segundo byte de destino se muestra como 042. Este ejemplo lee ROM fija; no demuestra una transferencia entre distintos bancos conmutables.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Cargar datos por ID de recurso gb_asset
Objetivo: Registra la ubicación y la longitud de un recurso y después recupera sus bytes por ID.
Funcionamiento: El recurso 0 tiene tipo RAW, banco 0, un puntero a {7,42} y longitud 2. asset_load_raw lo copia a un búfer RAM de dos bytes.
Controles y resultado esperado: El segundo byte se muestra como 042. Esto demuestra la búsqueda y copia de recursos, no el renderizado de imágenes.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Asignar un proyectil gb_danmaku
Objetivo: Inicializa el pool de proyectiles y comprueba su ocupación tras crear uno.
Funcionamiento: Después de danmaku_reset, el programa llama a danmaku_spawn(40,40,16,0) y muestra dm_count.
Controles y resultado esperado: 001 es la cantidad de proyectiles asignados. Aquí no hay un bucle de actualización de proyectiles ni un compositor de fondo, así que no se dibuja ningún proyectil en movimiento.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Acumular movimiento fraccionario Q5.3 fc_subpixel
Objetivo: Conserva el movimiento subpíxel como resto y suma la parte de píxeles enteros a la posición.
Funcionamiento: Partiendo de X=40, el bucle suma 2/8 de píxel ocho veces. Un desplazamiento a la derecha extrae los píxeles enteros; una máscara conserva el resto.
Controles y resultado esperado: el movimiento total es de dos píxeles, así que X=42 se muestra como 042. Este ejemplo de integración manual maneja movimiento positivo; el negativo necesita una lógica equivalente de préstamo.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Configurar una paleta de fondo de CGB gb_cgb_palette
Objetivo: Elige los colores del fondo y del texto mediante los componentes RGB de Game Boy Color.
Funcionamiento: El programa desactiva el LCD durante VBlank, configura el color 0 de la paleta 0 como blanco (31,31,31) y el color 3 como violeta (12,0,22), y después activa la pantalla.
Controles y resultado esperado: Ejecútelo en modo CGB para ver texto violeta y 042 sobre blanco. La salida monocroma de DMG no permite comprobar estos colores.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Desplazar el fondo horizontalmente gb_scroll
Objetivo: Mueve el punto de vista sin volver a dibujar el contenido del fondo.
Funcionamiento: Cada fotograma incrementa phase y lo pasa a Scroll_SetBg. La posición de ocho bits vuelve a cero después de 255.
Controles y resultado esperado: La palabra SCROLL se mueve hacia la izquierda. Observe su posición a lo largo del tiempo; una sola captura no puede mostrar el movimiento.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Encolar una actualización de tile gb_vram_queue
Objetivo: Separa una solicitud de dibujo de la transferencia a VRAM que la aplica.
Funcionamiento: vram_queue_bg_tile encola el tile 52 en la coordenada (3,8) y vram_flush lo transfiere. En la fuente incluida, el tile 52 es el dígito 4.
Controles y resultado esperado: Busque un único 4 en la coordenada de tile del fondo (3,8). Es una actualización de tile, no un contador numérico.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Mostrar un sprite mediante DMA de OAM gb_sprite
Objetivo: Asigna y muestra un sprite de forma independiente del fondo.
Funcionamiento: El pool recién inicializado proporciona la posición 0. El programa selecciona el tile 65, establece la posición (70,80), activa la visualización OBJ y transfiere la OAM espejo en cada fotograma.
Controles y resultado esperado: Aparece una letra A inmóvil en la posición de sprite indicada. En un juego, comprueba si falló la asignación antes de usar el ID devuelto.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Generar un valor aleatorio reproducible gb_rng
Objetivo: Utiliza una semilla para reproducir una secuencia pseudoaleatoria.
Funcionamiento: rng_seed(1234) inicializa el generador y después se llama una vez a rng_range(10). El límite superior, 10, queda excluido.
Controles y resultado esperado: La pantalla muestra un valor entre 000 y 009. Reiniciar el mismo programa con la misma semilla reproduce ese valor; no cambia en cada fotograma.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Guardar una bandera de estado del juego gb_flags
Objetivo: Representa un estado booleano, como si un evento ha terminado, mediante un número de bandera.
Funcionamiento: El programa borra la bandera 12, la activa y la vuelve a leer con flag_get.
Controles y resultado esperado: 001 significa que el indicador 12 es verdadero. El ejemplo opera sobre indicadores en RAM y no los conserva al apagar y encender.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Avanzar un círculo un paso de física gb_circle
Objetivo: Configura un cuerpo circular y actualiza su posición a partir de la velocidad.
Funcionamiento: El círculo activo tiene radio 4, posición (40,40) y velocidad (2,0). La gravedad es cero y linear_damping_q8 vale 255; kq2dc_step se ejecuta una vez.
Controles y resultado esperado: 042 es la coordenada X entera resultante. El ejemplo no dibuja un contorno circular ni una animación de colisión.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Desplazar el fondo de NES fc_scroll
Objetivo: Mueve el fondo actualizando la posición de desplazamiento de PPU.
Funcionamiento: Partiendo de __scroll_set(0,0), el programa incrementa phase una vez por fotograma y lo utiliza como posición horizontal.
Controles y resultado esperado: La palabra SCROLL cambia de posición horizontal. phase vuelve de 255 a 0. No es un ejemplo de un mapa ancho que abarque varias tablas de nombres.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Aplicar una actualización de tile mediante NMI fc_vram_queue
Objetivo: Envía una actualización de PPU desde el programa principal para que la aplique el procesamiento de NMI.
Funcionamiento: __vramq_put encola el tile 52 en la dirección de tabla de nombres 0x2103 y __vramq_commit lo envía. Esa dirección corresponde a la coordenada de tile (3,8).
Controles y resultado esperado: Aparece un único 4 en la coordenada del fondo (3,8). El tile 52 es el dígito 4 en la fuente incluida.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Mostrar un sprite de OAM de NES fc_sprite
Objetivo: Prepara los colores de los sprites y los datos de OAM para dibujar una imagen de forma independiente del fondo.
Funcionamiento: El programa carga la paleta de sprites, configura la entrada 0 con posición (70,80), tile 65 y atributos 0, activa el renderizado y repite el DMA de OAM.
Controles y resultado esperado: Aparece una letra A inmóvil como sprite. El ejemplo muestra la configuración y la transferencia OAM, no una animación.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Reproducir un tono de pulso de APU fc_sound
Objetivo: Configura los valores de control, temporizador y longitud del canal de pulso integrado de NES.
Funcionamiento: Después de nes_apu_init, el programa llama a nes_sfx_square1(0xBF,400,20). El control 0xBF selecciona volumen constante y detiene el contador de longitud, por lo que el tono se mantiene. 20 es un índice de la tabla de longitudes, no 20 fotogramas.
Controles y resultado esperado: Suena un tono de pulso sostenido mientras se muestra 042. Llama a nes_apu_silence_all para detenerlo. El marcador en pantalla no verifica por sí solo la salida de sonido.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas
Procesar un efecto de sonido en cada fotograma gb_sound
Objetivo: Inicia un flujo de efectos de sonido y lo hace avanzar mediante actualizaciones regulares por fotograma.
Funcionamiento: Después de Audio_Init, Audio_PlaySFX inicia tone en el canal de ID 1. El bucle principal llama a Audio_Update una vez por fotograma.
Controles y resultado esperado: Suena un efecto de pulso corto mientras se mantiene visible 042. El número es un marcador fijo, no el volumen ni la posición de reproducción. Evalúa el sonido mediante la salida de audio o una grabación.

Volver al ejemplo del manual del compilador / Volver al ejemplo del manual de bibliotecas