Este artículo es parte de una serie sobre los puertos del juego Another World. Hablará de trucos cuando trabaje con el Amiga 500 . Se recomienda que lea primero el artículo anterior .
La historia de Amiga comienza a mediados de 1982 con una llamada de Larry Kaplan a Jay Miner. Ambos trabajaron en Atari en los años 70. Ambos decidieron dejar la empresa. Kaplan debido a la falta de reconocimiento y Miner debido a la prohibición del liderazgo en el uso del procesador Motorola 68000, genial pero costoso.
Dejando a Atari, Kaplan fundó Activision. Después de que los inversores le pidieron que desarrollara una nueva plataforma de juegos, contactó a las personas más brillantes que conocía. Miner asumió el hardware del problema en la recién formada compañía Hi-Toro. El sistema recibió el nombre en clave "Lorraine".
A finales de 1983, se ensambló un prototipo. El dispositivo impresionó a los visitantes del Consumer Electronics Show (CES) en enero de 1984, gracias a la demostración Boing Ball, en la que se movían enormes sprites con una velocidad de cuadro de 60 cuadros por segundo. El dispositivo fue anunciado en 1985 bajo el nombre de "Amiga de Commodore", más tarde renombrado Amiga 1000.

Nota: Amiga 1000 no pudo arrancar solo, el dispositivo no tenía una ROM. El gestor de arranque estaba en un disquete, ¡y sería mejor si lo almacenaras como la niña de tus ojos!
Serie de artículos
- Polígonos de otro mundo .
- Polígonos de otro mundo: Amiga 500.
- Polígonos de otro mundo: Atari ST .
A500
En 1985, después de una serie de errores, Commodore se encontraba en una situación alarmante al borde de la bancarrota. Thomas Rattigan, entonces director de operaciones, hizo un cambio radical. Además de un ambicioso plan que abarca casi todas las divisiones de la compañía, dividió el Amiga 1000 en dos productos: una nueva versión de alta gama diseñada para el mercado creativo llamada Amiga 2000 y una versión económica para el Commodore 64 llamada Amiga 500.
El Amiga 500, también conocido como A500, se lanzó en 1987. Bajo el capó del Motorola 68000, el dispositivo funcionaba a 7,16 MHz y tenía 512 KB de RAM. El dispositivo se ha vuelto extremadamente exitoso, ha ganado popularidad entre jugadores, programadores, en particular, personas de la escena de demostración. Fue el producto más vendido de Commodore (se vendieron aproximadamente 6 millones de unidades de 1987 a 1991 [1] ).

El A500 tenía una ROM, pero solo había suficiente memoria para acomodar un cargador de arranque llamado Kickstart. Después de inicializar el equipo, Kickstart solicita al usuario que inserte un disquete que contenga un programa o un sistema operativo Workbench. El disquete debe permanecer en la unidad mientras la máquina está encendida. Los modelos posteriores, como el A1200 (también conocido como la máquina más grande jamás fabricada), tenían espacio para un disco duro de 2.5 pulgadas y se liberaron del uso de disquetes.
Arquitectura
Dado que la tecnología se creó originalmente con vistas a los juegos [2] [3] , Amiga no se creó en un procesador "de hierro" con capacidad de audio y video, como la mayoría de las computadoras de la época. El 68000 de 32/16 bits funciona junto con el conjunto de chips, que alberga tres potentes chips: Paula (audio), Denise (video) y Agnus (manipulación y sincronización de datos).

Un diseño similar con un sistema de memoria que proporciona no solo direccionamiento plano, sino también la RAM común disponible tanto para el procesador como para el conjunto de chips, contribuyó en gran medida a la popularidad de Amiga entre los desarrolladores. En comparación, ni Sega Genesis ni Nintendo SNES, dos potentes sistemas lanzados años después (respectivamente, en enero de 1989 y noviembre de 1990), no tenían memoria común.
El bus del conjunto de chips tiene un complejo sistema de prioridad en el que 68,000 no están activos en ciclos pares. El conjunto de chips DMA (acceso directo a memoria) intenta usar solo ciclos impares para multiplexar gradualmente el acceso al bus sin afectar el procesador. Pero no todo fue siempre suave. Agnus, en particular, se las arregló bien donde 68,000 estaban muriendo de hambre [4] .
Para resolver este problema, los clientes podrían comprar la extensión "Fast RAM" con un "bus de CPU" dedicado para 68000. Con las instrucciones allí, 68000 [5] la CPU no pasó hambre cuando el canal DMA del blitter [15] estaba activo. Esto duplicó la velocidad de ejecución de 68,000.
Sistema de video
El sistema de video está totalmente controlado por Denise, que ofrece un total de veinte modos gráficos [6] . La resolución más popular fue 320x200 con una relación de aspecto de 1.6, que no correspondía a los monitores de esa época (4/3 = 1.3). La relación de aspecto conduce a la distorsión cuando el búfer de trama se transmite al monitor CRT.

El framebuffer no se almacena continuamente, sino en áreas separadas de la memoria llamadas planos de bits. Se pueden asignar hasta cinco [7] planos de 8 KB de 8 KB, lo que da 5 bits por píxel, lo que le permite obtener 32 índices de color. A primera vista, este enfoque parece bastante incómodo (especialmente para un desarrollador con experiencia en PC), pero Agnus y especialmente su blitter en su conjunto proporcionan más claridad.
La paleta se basa en un espacio de color RGB de 4 bits por canal. 12 bits por color le permite identificar hasta 4096 colores diferentes, lo que fue mucho más de lo habitual en computadoras de la misma época.
Muchos trucos nos permitieron mostrar más colores. Como Copper, que le permite cambiar la paleta a HSYNC.
Las siguientes dos imágenes representan dos lados opuestos del espacio de color RGB. Con negro en las coordenadas (0x0, 0x0, 0x0), rojo en (0xF, 0x0, 0x0), verde en (0x0, 0xF, 0x0) azul en (0x0, 0x0, 0xF) y blanco en (0xF, 0xF) 0xF) . Estas coloridas imágenes ilustran bien la libertad creativa brindada a los desarrolladores gráficos.

Otro mundo en Amiga
Otro mundo en Amiga, de hecho, no es un puerto. Dado que el A500 se utilizó para el desarrollo, esta es la versión original creada entre 1989 y 1991 por Eric Shayy, de 21 años, que trabajaba solo en su habitación.

Dos razones han hecho de Amiga la máquina de desarrollo ideal. Primero, GenLock permitió la rotoscopia. En segundo lugar, y lo más importante, Amiga Agnus ha facilitado enormemente la representación de polígonos.
Brillo
La idea de crear un juego basado únicamente en polígonos surgió debido a la suposición incorrecta de que "Dragon's Lair, Escape from Singe's Castle" en Amiga los usó [8] . Eric tuvo que implementar esto de alguna manera con una velocidad de cuadro razonable. Fue en esta etapa de investigación y desarrollo que Amiga blitter desempeñó un papel clave.
Dibujo poligonal
La documentación de blitter menciona una característica llamada "Modo de relleno de área". No estamos hablando de elegantes proyecciones tridimensionales o texturas. Blitter funciona en el espacio de la pantalla en cadenas de bits con la opción de "llenar el espacio en blanco". El trabajo se basa en el escaneo de izquierda a derecha. Mientras el blitter vea 0, no pasa nada. Tan pronto como se pase el primer 1, el blitter llenará la línea con unidades hasta el siguiente 1. La figura de la documentación ilustra bien el trabajo. Tenga en cuenta que incluso un polígono cóncavo se puede mostrar correctamente con este método.
matriz de bits antes matriz de bits después
______________________ ______________________
El | El | El | El |
El | El | El | El |
El | El | El | El |
El | 1 1 1 1 | El | 11111 11111 |
El | 1 1 1 1 | El | 1111 1111 |
El | 1 1 1 1 | El | 111 111 |
El | 11 11 | El | 11 11 |
El | 1 1 1 1 | El | 111 111 |
El | 1 1 1 1 | El | 1111 1111 |
El | 1 1 1 1 | El | 11111 11111 |
El | El | El | El |
El | El | El | El |
| ______________________ | | ______________________ |
Tal solución conduce al segundo problema: cómo dibujar los "bordes" del polígono. Si observa detenidamente la figura anterior, verá que este es un algoritmo de Bresenham no estándar [9] , ya que se deben omitir las líneas horizontales. Afortunadamente, el diseñador Amigi presentó el modo de dibujo de línea a blitter [10] .
Aún no hemos terminado. Todavía hay problemas. En primer lugar, "dibujar líneas y luego rellenar el área" debe hacerse cuatro veces (una vez para cada plano de bits), lo que parece muy costoso. En segundo lugar, el motor debe generar cientos de polígonos. Blitter necesita un búfer limpio lleno de ceros y buenos límites de unidad para trabajar. Después de varios polígonos, el búfer de cuadro probablemente se verá como una sopa de pedazos. Finalmente, blitter solo genera 1-ts, pero necesitamos la capacidad de generar 0 en algunos de los planos de cuatro bits para generar el color correcto de 4 bits.
La solución a estos problemas es configurar las entradas de blitter A, B y C [11] . Este proceso lo explica mejor Blogger Scali en su blog [12] .
... hay una solución a este problema, y ni siquiera es tan difícil. Blitter puede renderizar en cualquier lugar de chipmem, por lo que es fácil configurar un buffer temporal limpio, "scratchpad", y dibujar un polígono en él. Luego lo copia al área real de la pantalla usando un poco de luz en la máscara [16] . A menudo, esta operación también se denomina corte de cookie. Esta es esencialmente la misma operación que usaría con imágenes 2D cuando graba píxeles solo cuando están configurados en la imagen original, y deja los píxeles objetivo intactos de lo contrario (operación OR lógica). Esto combinará correctamente los polígonos en la pantalla.
De hecho, quizás ahora es el momento de explicar el blitter con más detalle. Blitter tiene 3 entradas y 1 salida. Todos ellos son procesados por DMA, por lo que puede funcionar de forma completamente independiente de la CPU después del ajuste. Se pueden combinar 3 entradas mediante operaciones lógicas. El resultado se escribe en el canal de salida. En el caso de un blit de máscara, generalmente realiza la siguiente operación:
= ( ) ( )
- OpenBlog de Scali
Según los datos de entrada del blitter, ahora tenemos una imagen completa de lo que se requiere para representar cada polígono.
- Seleccione un trozo de búfer.
- Cero limpieza con un blitter.
- Dibuje los bordes del polígono con unidades en el modo de línea de dibujo.
- Rellene el área del búfer con unidades en el modo "relleno de área".
- Blitz un trozo de búfer cuatro veces (una vez para cada plano de bits).
No fue muy divertido, pero el trabajo estaba hecho. El esfuerzo valió la pena, porque el programa podía procesar hasta 50 polígonos (dependiendo de su tamaño) a una velocidad de 20 cuadros por segundo. Lo que nos lleva al segundo problema.
Copiar framebuffer
No importa cuán rápido el blitter pueda dibujar los polígonos, todavía no fue lo suficientemente rápido. Cada cuadro consta de miles de polígonos. Algunos polígonos son tan pequeños (1x1, llamados pixigones) que no justifican la sobrecarga. Uno de los primeros fondos del juego (cuando Leicester deja el agua) consiste en 981 polígonos.

La solución fue almacenar en caché el fondo en un búfer BKGD especial con una copia simple. Esta fue una tarea especial para blitter.
Blitter es uno de los dos coprocesadores en Amiga. Como parte del chip Agnus, se usa para copiar bloques de memoria rectangulares y dibujar líneas. Al copiar memoria, es aproximadamente dos veces más rápido que 68000 y puede mover casi cuatro megabytes por segundo. Puede dibujar líneas a una velocidad de casi un millón de píxeles por segundo.
- Amiga Developer CD v2.1 (OS 3.5)
A una velocidad de 4000 bytes en milisegundos, eliminar un búfer BKGD al comienzo de cada nueva trama requiere "solo" 8 ms.
Nota: a pesar del hecho de que Another World era un juego pulido, algunos bordes permanecieron "difíciles". Si un jugador intenta ser inteligente durante la prueba de protección de copia [13] y presiona "c" para ingresar el código para ir al proceso del juego, la pantalla se vuelve verde y Amiga se congela. La única salida es reiniciar el juego.
Relleno de Framebuffer
Aunque el procesador 68000 puede grabar 16 bits a la vez, el framebuffer también probablemente se limpió con un blitter. La documentación de Amiga contiene un ejemplo de código "clearmem" [14] que utiliza blitter para limpiar 128 KB de RAM.
Referencias
- Wikipedia: Amiga 500 .
- Comodoro: Los años de Amiga .
- Comodoro: Los últimos años .
- Amiga Chip RAM .
- Wikipedia: Amiga Hardware .
- Modos de pantalla de Amiga .
- Gráficos 3D Amiga en tiempo real .
- Juego clásico postmortem: otro mundo .
- Algoritmo de Bresenham .
- 6 Hardware de brillo / Modo de relleno de área .
- 6 Blitter Hardware / canal DMA .
- Solo manteniéndolo real, parte 3 .
- Rueda de código .
- Documentación de Amiga, 'Ejemplo: Clearmem' .
- Brillo .
- Bit bitit .