Konami's Mahjong

Treinta y dos kilobytes en los que el hilo principal no hace nada: arranca, engancha la interrupción y se queda en un salto a sí mismo para siempre. Y el rival, que juega bien, tampoco piensa: su mano se construye a una ficha de completarse, y lo que echa al río es una ficha sorteada del muro con un filtro que la hace parecer humana.

Konami · © Konami 1984 · Cartucho RC-707, 32 KB · MSX1 · páginas 1 y 2 · Volcado 24cb5bda…

Todas las imágenes de aquí son capturas del cartucho. Y ninguna se ha hecho a mano: un guion arranca la ROM en openMSX sin pintar nada, vuelca la memoria de vídeo en unos instantes fijos y el PNG se monta desde el volcado. La primera pasada no pulsa una sola tecla, porque el demo se juega solo. El listado y las cifras salen del binario y se reproducen con make.

El juego en cifras

100 %del binario explicado
340rutinas identificadas
38jugadas con nombre
15.432bytes de código
17.336bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

El rival juega bien y no piensa ni una vez

Declara riichi, canta pon y chi, se defiende cuando va perdiendo y gana manos caras. Pero no evalúa su mano en ningún momento, y las dos piezas que lo sostienen son igual de descaradas.

La primera: su mano no se roba, se construye. Antes de repartir nada, 0x78CE arma catorce fichas a medida —un palo, unos cuantos tríos, escaleras o parejas, y una pareja al final— y luego quita una. La máquina empieza cada mano a una sola ficha de completarla, y las copias que gasta se descuentan de los contadores para que al jugador no le salgan después.

La segunda: no descarta de su mano. Sus trece fichas no se mueven; lo que va a su río es una ficha sorteada del muro (0x583C) y pasada por un filtro: los cuatro primeros descartes son honores, los cuatro siguientes unos, doses, ochos y nueves, nunca una de sus propias esperas y nunca del palo al que va. O sea el orden en que descarta una persona, obtenido sin mirar la mano.

El hueco vacío de su mano es teatro

Al pintar la mano del rival boca abajo, una de las fichas se dibuja como hueco, y parece que dice de dónde acaba de robar. La mitad de las veces no es verdad: 0x553C elige ese hueco al azar o el de la robada según el bit 0 de la semilla, y solo se vuelve honesto cuando la máquina está en riichi.

Tres instrucciones que no corren desde 1984

Junto al filtro de descartes hay una comprobación para no soltar terminales, y está mal escrita. Compara el número de la ficha con el 1 y, si no lo es, se vuelve; y si lo es, compara ese mismo 1 con el 9, que tampoco cuadra, y se vuelve igual.

5961:  cp 1
5963:  jr nz,5987      ; no es un 1 -> se acepta
5965:  cp 9            ; A vale 1: nunca es 9
5967:  jr nz,5987      ; -> se acepta igual
5969:  call ...        ; devolver al monton y sortear otra:
596C:  call ...        ; TRES instrucciones que no corren nunca

El sorteo que hay debajo está perfectamente formado y no se ejecuta jamás.

Los marcadores no suman 60.000, y es a propósito

Con tsumo, el pago sale de las tablas de «al robar», que son lo que pagaría un solo jugador en una mesa de cuatro. Pero 0x5B85 carga la misma cifra en los dos pendientes y luego solo rebaja el del que paga, no el del que cobra: el perdedor paga la parte de uno y el ganador cobra la cifra entera del ron.

Se crean puntos de la nada, y la pantalla del recuento lo imprime sin disimulo, con ハライ (lo pagado) y トクテン (lo cobrado) en dos líneas distintas. En el demo se pagan 6.000 y se cobran 18.000, y los dos marcadores acaban en 23.000 y 48.000.

El mismo 8 es un estado y una dificultad

Al arrancar el demo, el cartucho escribe un 8 en el byte del estado. Ese 8 no llega a despacharse nunca —la instrucción siguiente hace inc, así que el estado que corre es el 9—, y sin embargo se escribe:

418C:  ld a,008h
418E:  ld (0E000h),a   ; el estado... que se convertira en 9
418F:  rra             ; el mismo 8, rotado: sale un 4
4190:  ld (0E040h),a   ; y ese 4 es LA DIFICULTAD

De rebote, el demo juega en la dificultad de en medio: 0xE040 vale 4 durante todo el ciclo, y la barra de arriba lo rotula セミプロ, mientras que una partida empezada con la tecla 1 pone アマ en el mismo sitio.

El texto de la mesa vive en el hueco de las fichas

Cada ficha se dibuja con seis tiles, dos de ancho por tres de alto, y las hileras caen siempre a caballo de dos tercios de pantalla. En el tercio de en medio solo se ve la fila de abajo de las fichas de arriba y la de arriba de las de abajo: la fila del medio de cada ficha no se dibuja nunca ahí.

Y ahí es donde está el texto. Cruzando la tabla de fichas con las tablas de nombres de 124 volcados de memoria de vídeo, de los 97 tiles que usa la barra central 56 son exactamente el par central de alguna ficha. El mismo número de tile es media ficha en un tercio y un kanji en otro.

El demo no piensa: lee ciento cuatro bytes

No hay un modo demo aparte. Cuando nadie toca nada, el cartucho recorre la misma máquina de estados que una partida, con las mismas rutinas; lo único que cambia es de dónde salen las pulsaciones. 0x416B engancha el bloque de 0x4AE8 —ciento cuatro bytes— en lugar del teclado, con las mismas máscaras de bits que arma el lector de verdad y un formato de longitud variable: el nibble bajo de cada entrada dice si ocupa uno o dos bytes.

Por eso sale igual cada vez: dos arranques en frío independientes dan la misma traza, instante a instante. Lo que no es constante es cuánto dura cada vuelta —se miden 163,53, 168,96 y 170,56 segundos entre pasadas por el estado 0—, porque la semilla del azar sale del registro R del refresco de memoria y con ella cambia la mano que se construye la máquina.

No lleva la marca oculta de Konami

Muchos cartuchos de Konami de esta época esconden al final de la ROM su número de catálogo RC-7xx y el título del juego en katakana; lo descubrió Manuel Pazos (@ManuelPazosMSX).

Este no. En los 32768 bytes no hay ni un RC-7 en ASCII, ni la palabra KONAMI: el contenido acaba en 0x9FE4, en la tabla de semitonos, y detrás solo hay 8.219 bytes de 0xFF. El RC-707 sale del catálogo, no del binario.

Lo que el cartucho dibuja

Debajo de cada imagen está el estado del juego en que se hizo la captura y qué se está viendo.

Estado 5 — el título, 麻雀道場, con el copyright escrito en la fuente del propio juego y las tres dificultades en romaji. La tecla que se pulse aquí acaba en 0xE040, y de ahí no cambia en toda la partida
Estado 5 — el título, 麻雀道場, con el copyright escrito en la fuente del propio juego y las tres dificultades en romaji. La tecla que se pulse aquí acaba en 0xE040, y de ahí no cambia en toda la partida
Estado 11, paso 1 — la mesa con el reparto empezando: los dos marcadores a 30.000, el viento y la mano (東一局), las dos fichas indicadoras, el contador de palos de riichi de la mesa a cero (0本) y el menú de llamadas en el panel cian
Estado 11, paso 1 — la mesa con el reparto empezando: los dos marcadores a 30.000, el viento y la mano (東一局), las dos fichas indicadoras, el contador de palos de riichi de la mesa a cero (0本) y el menú de llamadas en el panel cian
Estado 11, paso 2 — recién repartida. Trece fichas boca abajo arriba y catorce abajo, ordenadas: cinco caracteres, cuatro círculos, dos bambúes y tres honores, que son los códigos 02 06 08 08 09 · 11 13 15 17 · 22 22 · 31 31 33
Estado 11, paso 2 — recién repartida. Trece fichas boca abajo arriba y catorce abajo, ordenadas: cinco caracteres, cuatro círculos, dos bambúes y tres honores, que son los códigos 02 06 08 08 09 · 11 13 15 17 · 22 22 · 31 31 33
Estado 11, paso 2 — la mano avanzada, con los dos ríos llenos. El marcador de arriba ha bajado a 29.000 y la mesa tiene un palo: la máquina ha declarado riichi. En la caja cian, el aviso de カン o descarte
Estado 11, paso 2 — la mano avanzada, con los dos ríos llenos. El marcador de arriba ha bajado a 29.000 y la mesa tiene un palo: la máquina ha declarado riichi. En la caja cian, el aviso de カン o descarte
Estado 11, paso 7 — el recuento: 親 (gana el que reparte), 30 fu, 7 han, ハライ 6.000 y トクテン 18.000, la lista de jugadas a la derecha y la mano separada en figuras abajo, cada una con sus fu
Estado 11, paso 7 — el recuento: 親 (gana el que reparte), 30 fu, 7 han, ハライ 6.000 y トクテン 18.000, la lista de jugadas a la derecha y la mano separada en figuras abajo, cada una con sus fu
Estado 14 — 終局, fin de la partida, escrito sobre un muro de fichas que se monta ficha a ficha en el estado anterior
Estado 14 — 終局, fin de la partida, escrito sobre un muro de fichas que se monta ficha a ficha en el estado anterior
Estado 11 en una partida de verdad, empezada con la tecla 1. Es la misma pantalla que la del demo con una diferencia: donde el demo rotula セミプロ, aquí pone アマ
Estado 11 en una partida de verdad, empezada con la tecla 1. Es la misma pantalla que la del demo con una diferencia: donde el demo rotula セミプロ, aquí pone アマ