Portar Lode Runner de BC a UKNC

En marzo-mayo de este año, pasé varias semanas (por las tardes y los fines de semana) transportando el juguete Lode Runner de BK-0010 al UKSC.
Captura de pantalla del menú portado:

Pantalla de juego de la versión portada:


BK-0010 es una computadora doméstica de finales de los 80 y principios de los 90, y en parte una computadora de la escuela (clases KUVT-86). UKSC es una computadora escolar de la década de 1990. BC y UKSC son parcialmente compatibles en arquitectura y sistema de comando: ambas computadoras se remontan a la familia PDP-11.

Selección de juego


Hasta este año, no escribí nada serio bajo el UKSC, pero tenía que entender el código de la máquina. Hubo un deseo de escribir algo, pero generalmente tengo grandes problemas con el tiempo libre, por lo que difícilmente funcionaría desde cero. Y para empezar, es mejor hacer la tarea más fácil. Al portar, la cantidad de trabajo suele ser mucho menor que cuando se escribe desde cero: se encuentran principalmente problemas de incompatibilidad entre los dos sistemas.

En el foro zx.pk.ru (uno de los lugares donde los fanáticos de la retrocomputación en general y las máquinas compatibles con PDP-11 en particular pasan el rato), el participante de Hobot elogió la implementación de Lode Runner en el BC : esta fue la razón, para empezar intenté "mirar" el código del juguete Bueno, me involucré.

Menú de versión original:

La pantalla del juego de la versión original (en el monitor a color):


Ingeniería inversa


Un par de semanas en las tardes y fines de semana pasé tiempo analizando y desarmando. En el emulador, BKBTL agregó la capacidad de recopilar una traza , es decir, cada instrucción se desmonta y se guarda en un archivo de texto.
Hago un recorrido por la sección que me interesa registrar la traza, luego colapso la traza (sort & uniq): obtengo fragmentos de la lógica. Agrego comentarios a esto, gradualmente obtengo un archivo común.

Suena simple, pero de hecho es un trabajo bastante complicado basado en conjeturas y su confirmación o refutación. Por ejemplo, consideramos que la dirección 001756 antes del comienzo del juego obtiene el valor 10, luego se disminuye, cuando llega a 0, el juego termina, aparentemente, este es el número de vidas. Encontramos confirmación de esto, colocamos comentarios en el texto donde aparece esta dirección. Este es un ejemplo bastante simple, en casos más complejos pasé mucho tiempo descubriendo lo que estaba sucediendo.

Cuando el volumen recibido se hizo lo suficientemente grande (más de 40 KB de texto, más de 1,500 líneas) y descubrí, al menos en términos generales, lo que estaba sucediendo, cómo se almacenaba y mostraba, comencé a pensar cómo traducirlo al UKSC.

Aquí puede ver el listado final resultante del desmontaje:
github.com/nzeemin/uknc-loderunner/blob/master/original/loderunner.lst

Laberinto


Cada laberinto tiene 20 líneas de 30 bloques, un total de 600 bloques.
El tipo de bloque está codificado por un número del 0 al 7: tres bits, triplete. Para una palabra de 16 bits, se obtienen 5 tripletes completos.
Cuando se trabaja con máquinas similares a PDP-11, se usa ampliamente un sistema de 8 decimales, por lo tanto, es bastante conveniente usar tripletas.
Como resultado, cada laberinto cabe en 240 bytes.

Tipos de bloque:
;	0 -- 
;	1 --  
;	2 --  
;	3 -- 
;	4 -- 
;	5 -- 
;	6 -- 
;	7 -- 

Los sprites de estos objetos están dispuestos en el orden de numeración de los tipos de bloque. Cuando se decodifica un laberinto, al mismo tiempo se crea una "imagen de laberinto" en la memoria (byte por bloque), y el estado inicial del laberinto se dibuja en la pantalla.

Organización de la pantalla


, , «framebuffer», — . — 256 , 64 . , , :
- , 512 / (1 , 8 ),
, 256 (2 , 4 ).

, . , «». , — 8 . — 640 × 288, 320 × 288, 160 × 288, , 288 , . () , . , .

320 × 288 — 320 80 . , — .


Comenzó a escribir ejemplos en ensamblador del UKSC y estaba un poco deprimido, porque el ciclo "compilado - vinculado - lanzado" es bastante lento. El problema está en las herramientas. Hay un ensamblador cruzado MACRO11, aunque es algo defectuoso. Pero no hay un reticulador. Pero afortunadamente, no hace mucho tiempo, Patron publicó la consola RT-11: zx-pk.ru/showthread.php?t=24755 ; de hecho, es un emulador de una máquina compatible con PDP11 que interactúa con la línea de comandos del sistema operativo como con un terminal. Por lo tanto, se hizo posible compilar y vincular los medios nativos de RT-11. Esto lo considero un gran avance, aceleró dramáticamente el trabajo.

, , , ( C#), . , , RT11- DUMP .

, . . .. --, . ( AI ), — .

, ( ) , .

Foto de un juego en funcionamiento en una máquina real (gracias hobot):


Referencias


Source: https://habr.com/ru/post/es383497/


All Articles