- Proyecto personal de homenaje que implementa en hardware FPGA, sin una CPU estándar, la VM, el blitter y el rasterizer de Another World / Out of This World
- El diseño central consiste en convertir la VM en un procesador personalizado real, y en un SoC que integra el blitter encargado de copiar y rellenar entre framebuffers, el rasterizer que dibuja polígonos y la actualización de pantalla
- Los 128 KB de SPRAM del Lattice UP5K encajan con 4 framebuffers de 320x200 a 4 bits, y cada bloque SPRAM de 32 KB corresponde a un framebuffer dentro de esta distribución de memoria
- Los datos del juego no están incluidos en el almacenamiento; hay que copiar
BANK01~BANK0DyMEMLIST.BINa la carpetaGAMEDATApara poder usar el paquete de datos y el bitstream - El modo de ejecución contempla tanto simulación como placa real
- La simulación puede ejecutar la intro con
make simul1después de instalar Silice - El hardware soportado incluye icebreaker + VGA PMOD, mch2022 badge y ULX3S HDMI
- Se incluyen bitstreams precompilados, pero los datos del juego se requieren por separado
- La simulación puede ejecutar la intro con
- La ejecución de la VM obtiene instrucciones y operandos desde la memoria SPI, y para reducir la latencia primero lee 64 bytes en una pequeña caché BRAM
- La ruta gráfica usa 4 framebuffers, double buffering, restricción de acceso durante el intervalo
vblanky arbitraje de acceso al framebuffer entre el blitter y el rasterizer - El rasterizer dibuja los polígonos convexos de Another World como spans horizontales, y para efectos de transparencia puede leer y modificar el valor del píxel existente o copiar píxeles desde otro framebuffer de origen
- El renderizado de texto y algunos fondos de la parte 6 se resuelven guardando en ROM buffers de píxeles prerenderizados y copiándolos por la ruta
op_drawString, debido al presupuesto de LUT restante - Las limitaciones y tareas pendientes indicadas incluyen ausencia de sonido y música, necesidad de bitstream y paquete de datos separados por parte, validación incompleta del juego completo, ajuste de tiempos más rápido que el original y exploración de cómo conectar las partes
- La licencia es MIT License para el diseño en Silice, CC BY-NC-SA 4.0 para la documentación, el port de C++ modificado mantiene la GPL original y los datos del juego están protegidos por copyright
1 comentarios
Comentarios de Hacker News
Fue la primera vez que vi cinemáticas tan completamente animadas en Sega y me parecieron increíbles. Obviamente los gráficos sí mejoraron después, pero siento que Another World todavía se sostiene perfectamente en lo artístico. Tiene un estilo muy marcado y, cuando lo volví a jugar hace como un año, seguía siendo impresionante.
Muchos de los acertijos se sienten más como prueba y error, y el juego es extremadamente corto, pero aun así no hay nada que quisiera cambiar. Si eres fan de Another World, también recomiendo Flashback: The Quest for Identity. Tiene una atmósfera cinematográfica parecida; al principio no me gustó mucho, pero en los últimos 10 años me ha ido gustando cada vez más
Aun así, Another World es una obra de arte. El póster del juego parece una pintura al óleo y es realmente hermoso [1]
[1] http://www.anotherworld.fr/download/AnotherWorld_Poster.jpg
Ingeniería inversa y port a JavaScript de Infernal Runner para Amstrad CPC por cyxx. Es una obra del creador de Another World y ambos usan una arquitectura de máquina virtual: https://github.com/cyxx/infernal_js
Presentación de Norbert Kehrer, The Virtual Machine Architecture of Infernal Runner. La charla es en alemán con diapositivas en inglés: https://media.ccc.de/v/vcfb20_-146-en-202010111400-_th...
The Story of Another World on the Amiga | MVG: https://www.youtube.com/watch?v=0iz9PJbs5rE
Port de Another World para Nintendo 64: https://github.com/jnmartin84/aw64
Port de Another World para PlayStation 1: https://github.com/fgsfdsfgs/rawpsx
Incluye un compilador que compila a Verilog, y el resultado puede integrarse en un flujo de diseño existente
Que desde la primera acción tuvieras que escapar nadando, seguido por huir de una criatura parecida a un león, fue una de las experiencias de juego más brutales de todos los tiempos. Basta jugar este juego un minuto para recordarlo toda la vida
Para la época, los efectos de cámara dramáticos de este juego realmente se sentían, tal como dice el título, como de otro mundo
La ilustración de la portada también es excelente
konanaka beetzai! motsuubo! /wave
https://www.youtube.com/watch?v=JFaOYYSxSEA
Si no recuerdo mal, también muestra parte de sus herramientas de desarrollo, incluyendo cómo editaba directamente la animación línea por línea en el bytecode de la máquina virtual y la ejecutaba paso a paso
Hoy en día hay menos plataformas que en la etapa de crecimiento explosivo de los 80. Incluso ahora, podría decirse que la mayor parte del “software” es JavaScript interpretado por el navegador web. En los 80 también existía el problema de la portabilidad, y de hecho era más difícil porque había que crear el intérprete uno mismo.
Muchos, quizá la mayoría, de los videojuegos antes de Doom o de los gráficos 3D de alto rendimiento parecen haber sido escritos sobre máquinas virtuales. Los juegos de consola probablemente estaban en C o ensamblador por cuestiones de rendimiento
En esa época, los juegos de “computadora” eran de antes de que la IBM PC se volviera el estándar, o al menos de antes de que la PC ganara y Microsoft dominara. Con Amiga, PC-98, IBM PC, Mac y otras, en una situación donde no se sabía cuál iba a imponerse, tenía sentido crear una máquina virtual, y SCUMM viene de inmediato a la mente.
La portabilidad importaba, pero en esa época, cuando la ley de Moore avanzaba a toda velocidad y la vida útil de las plataformas era efímera, una máquina virtual también daba un efecto de compresión. Un binario completamente compilado podía consumir demasiado espacio en disco o cinta, y también demasiada RAM.
En cambio, una máquina virtual muy pequeña podía definir un lenguaje personalizado para interpretar al vuelo, y eso reducía mucho el uso de espacio en una época en la que había que ahorrar cada kilobyte. Basta pensar en la diferencia de tamaño entre
print "Hello world!"y un binario compilado básico. No importaba qué tan rápido fuera un juego de aventura de texto si no cabía dentro de X KB.Tenían mucho texto y muchos recursos gráficos, y el cálculo era relativamente simple. Las restricciones de autoría solo se conectaban con el hardware en términos de entrada/salida y compresión de datos, y el código que ejecutaba el intérprete normalmente era inicialización de escenas que se corría una sola vez y algunos temporizadores de animación.
La idea opuesta se ve mejor en los juegos arcade, y después en cosas como Doom y Quake. Lo que el juego simulaba estaba mucho más ligado al hardware, y la definición de la escena se parecía más a datos de mapa —“poner un monstruo aquí y un ítem de vida allá”— que a lógica de scripts.
Claro, estas dos últimas usaban algunas primitivas gráficas nativas.
Con bitplanes no hace falta volver a leer la memoria de video. Basta asumir que el bit más alto está dedicado al efecto de transparencia y volcar el span tal cual.
Las otras dos ventajas son que se pueden mover los planos entre sí para crear vistosos efectos moiré, y que la eficiencia de memoria y de ancho de banda del bus es buena en profundidades de color incómodas que no encajan exacto en bytes o nibbles, como 8 colores (3 bits por píxel) o 32 colores (5 bits por píxel).