Polígonos Outro Mundo: Amiga 500

Este artigo é parte de uma série sobre os portos do jogo Another World. Ele vai falar sobre truques ao trabalhar com o Amiga 500 . É recomendável que você leia o artigo anterior primeiro .


A história de Amiga começa em meados de 1982 com uma ligação de Larry Kaplan para Jay Miner. Ambos trabalharam na Atari nos anos 70. Ambos decidiram deixar a empresa. Kaplan devido à falta de reconhecimento e Miner devido à proibição de liderança no uso do cool, mas caro, processador Motorola 68000.


Saindo da Atari, Kaplan fundou a Activision. Depois que os investidores pediram que ele desenvolvesse uma nova plataforma de jogos, ele contatou as pessoas mais brilhantes que conhecia. Miner assumiu o hardware do problema na recém-criada empresa Hi-Toro. O sistema recebeu o nome de código "Lorena".


No final de 1983, um protótipo foi montado. O dispositivo impressionou os visitantes do Consumer Electronics Show (CES) em janeiro de 1984, graças à demonstração Boing Ball, na qual sprites enormes se moviam com uma taxa de quadros de 60 quadros por segundo. O dispositivo foi anunciado em 1985 sob o nome "Amiga from Commodore", mais tarde renomeado para Amiga 1000.




Nota: O Amiga 1000 não pôde inicializar sozinho, o dispositivo não tinha uma ROM. O carregador de inicialização estava em um disquete, e seria melhor se você o armazenasse como a menina dos seus olhos!


Série de artigos


  1. Polígonos Outro Mundo .
  2. Polígonos Outro Mundo: Amiga 500.
  3. Polígonos Outro Mundo: Atari ST .

A500


Em 1985, após uma série de erros, o Commodore estava em uma situação alarmante à beira da falência. Thomas Rattigan, então COO, fez uma mudança radical. Além de um plano ambicioso que abrange quase todas as divisões da empresa, ele dividiu o Amiga 1000 em dois produtos: uma nova versão de ponta projetada para o mercado criativo chamada Amiga 2000 e uma versão barata para o Commodore 64 chamada Amiga 500.


O Amiga 500, também conhecido como A500, foi lançado em 1987. Sob o capô do Motorola 68000, o dispositivo funcionava em 7,16 MHz e tinha 512 KB de RAM. O dispositivo se tornou extremamente bem-sucedido, ganhou popularidade entre jogadores, programadores, em particular, pessoas da cena demo. Foi o produto mais vendido da Commodore (aproximadamente 6 milhões de unidades foram vendidas de 1987 a 1991 [1] ).



O A500 tinha uma ROM, mas havia apenas memória suficiente para acomodar um gerenciador de inicialização chamado Kickstart. Após inicializar o equipamento, o Kickstart solicita que o usuário insira um disquete contendo um programa ou o SO do Workbench. O disquete deve permanecer na unidade enquanto a máquina estiver ligada. Modelos posteriores, como o A1200 (também conhecido como a maior máquina já fabricada), tinham espaço para um disco rígido de 2,5 polegadas e foram liberados do uso de disquetes.


Arquitetura


Desde que a tecnologia foi criada originalmente para jogos [2] [3] , o Amiga não foi construído em um processador "de ferro" com capacidade de áudio e vídeo, como a maioria dos computadores da época. O 68000 de 32/16 bits trabalha em conjunto com o chipset, que abriga três chips poderosos: Paula (áudio), Denise (vídeo) e Agnus (manipulação e sincronização de dados).



Um design semelhante com um sistema de memória que fornece não apenas endereços simples, mas também a RAM comum disponível para o processador e o chipset, contribuiu muito para a popularidade do Amiga entre os desenvolvedores. Para comparação, nem a Sega Genesis nem a Nintendo SNES, dois poderosos sistemas lançados anos depois (respectivamente, em janeiro de 1989 e novembro de 1990), não tinham memória comum.


O barramento de chipset possui um sistema de prioridades complexo, no qual 68.000 não estão ativos em ciclos uniformes. O chipset DMA (acesso direto à memória) tenta usar apenas ciclos ímpares para multiplexar gradualmente o acesso ao barramento sem afetar o processador. Mas nem tudo sempre foi bom. Agnus, em particular, lidou bem onde 68.000 estavam morrendo de fome [4] .


Para resolver esse problema, os clientes podiam comprar a extensão "Fast RAM" com um "barramento de CPU" dedicado para 68000. Com as instruções, 68000 [5] a CPU não passou fome quando o canal DMA do blitter [15] estava ativo. Isso dobrou a velocidade de execução de 68.000.


Sistema de vídeo


O sistema de vídeo é totalmente controlado por Denise, oferecendo um total de vinte modos gráficos [6] . A resolução mais popular foi 320x200 com uma proporção de 1,6, que não correspondia aos monitores da época (4/3 = 1,3). A proporção leva à distorção quando o buffer do quadro é transmitido ao monitor CRT.



O framebuffer não é armazenado continuamente, mas em áreas separadas da memória chamadas planos de bits. Podem ser alocados até cinco [7] planos de 8 KB, o que fornece 5 bits por pixel, permitindo obter 32 índices de cores. À primeira vista, essa abordagem parece bastante incômoda (especialmente para um desenvolvedor com experiência em PC), mas o Agnus e, especialmente, seu blitter como um todo, fornecem mais clareza.


A paleta é baseada no espaço de cores RGB de 4 bits por canal. 12 bits por cor permite identificar até 4096 cores diferentes, o que foi muito mais que o normal em computadores da mesma época.


Muitos truques nos permitiram exibir mais cores. Como o Copper, permitindo alterar a paleta para HSYNC.


As duas imagens a seguir representam dois lados opostos do espaço de cores RGB. Com preto nas coordenadas (0x0, 0x0, 0x0), vermelho em (0xF, 0x0, 0x0), verde em (0x0, 0xF, 0x0) azul em (0x0, 0x0, 0xF) e branco em (0x0, 0x0, 0xF) e branco em (0xF, 0xF) 0xF) . Essas imagens coloridas ilustram bem a liberdade criativa oferecida aos desenvolvedores gráficos.




Outro mundo em Amiga


Outro mundo em Amiga, de fato, não é um porto. Desde que o A500 foi usado para o desenvolvimento, esta é a versão original criada entre 1989 e 1991 por Eric Shayy, 21 anos, que trabalhava sozinho em seu quarto.



Duas razões fizeram da Amiga a máquina de desenvolvimento ideal. Primeiro, o GenLock permitiu rotoscopia. Em segundo lugar, e mais importante, Amiga Agnus facilitou muito a renderização de polígonos.


Blitter


A idéia de criar um jogo baseado apenas em polígonos surgiu por causa da suposição incorreta de que “Dragon's Lair, Escape from Singe's Castle” em Amiga os usava [8] . Eric teve que de alguma forma implementar isso com uma taxa de quadros razoável. Foi nessa fase de pesquisa e desenvolvimento que o Amiga blitter desempenhou um papel fundamental.


Desenho De Polígono


A documentação do blitter menciona um recurso chamado "Modo de preenchimento da área". Não estamos falando de projeção tridimensional ou texturização sofisticadas. O Blitter funciona no espaço da tela em cadeias de bits com a opção de "preencher o espaço em branco". O trabalho é baseado na digitalização da esquerda para a direita. Contanto que o blitter veja 0, nada acontece. Assim que o primeiro 1 for passado, o blitter preencherá a linha com unidades para o próximo 1. A figura da documentação ilustra bem o trabalho. Observe que mesmo um polígono côncavo pode ser exibido corretamente usando esse método.


      matriz de bits antes matriz de bits depois
   ______________________ ______________________
  |  |  |  |
  |  |  |  |
  |  |  |  |
  |  1 1 1 1 |  |  11111 11111 |
  |  1 1 1 1 |  |  1111 1111
  |  1 1 1 1 |  |  111 111 |
  |  11 11 |  |  11 11 |
  |  1 1 1 1 |  |  111 111 |
  |  1 1 1 1 |  |  1111 1111
  |  1 1 1 1 |  |  11111 11111 |
  |  |  |  |
  |  |  |  |
  | ______________________ |  | ______________________ |

    

Essa solução leva ao segundo problema - como desenhar as "bordas" do polígono. Se você observar atentamente a figura acima, verá que este é um algoritmo de Bresenham não padrão [9] , pois as linhas horizontais devem ser puladas. Felizmente, o designer Amigi apresentou o modo de desenho de linhas para blitter [10] .


Ainda não terminamos. Ainda existem problemas. Primeiro, “desenhar linhas e depois preencher a área” deve ser feito quatro vezes (uma vez para cada plano de bits), o que parece muito caro. Em segundo lugar, o mecanismo deve renderizar centenas de polígonos. O Blitter precisa de um buffer limpo, cheio de zeros e bons limites de unidade para trabalhar. Após vários polígonos, o buffer do quadro provavelmente parecerá uma sopa de bits. Por fim, o blitter gera apenas 1 ts, mas precisamos da capacidade de gerar 0 em alguns dos planos de quatro bits para gerar a cor correta de 4 bits.


A solução para esses problemas é configurar as entradas dos blitter A, B e C [11] . Esse processo é melhor explicado pelo Blogger Scali em seu blog [12] .


... existe uma solução para esse problema, e nem é tão difícil assim. O Blitter pode renderizar em qualquer lugar do chipmem, por isso é fácil definir um buffer limpo temporário, "scratchpad", e desenhar um polígono nele. Em seguida, copie-o para a área real da tela usando um pouco de luz na máscara [16] . Muitas vezes, essa operação também é chamada de corte de cookie. Essa é essencialmente a mesma operação que você usaria com imagens 2D quando gravar pixels somente quando eles estiverem definidos na imagem original e deixar os pixels de destino intactos (operação lógica OU). Isso combinará corretamente os polígonos na tela.


De fato, talvez agora seja a hora de explicar o cego com mais detalhes. O Blitter possui 3 entradas e 1 saída. Todos eles são processados ​​pelo DMA, para que ele possa funcionar completamente independentemente da CPU após o ajuste. 3 entradas podem ser combinadas usando operações lógicas. O resultado é então gravado no canal de saída. No caso de uma máscara de máscara, você geralmente executa a seguinte operação:


= ( ) ( )


- OpenBlog de Scali



Com base nos dados de entrada do blitter, agora temos uma imagem completa do que é necessário para renderizar cada polígono.


  1. Selecione um pedaço de buffer.
  2. Zero limpo com um blitter.
  3. Desenhe as bordas do polígono com unidades no modo de linha de desenho.
  4. Preencha a área de buffer com unidades no modo "preenchimento de área".
  5. Blitz um pedaço de buffer quatro vezes (uma vez para cada plano de bits).

Não foi tão divertido, mas o trabalho foi feito. O esforço valeu a pena, porque o programa podia processar até 50 polígonos (dependendo do tamanho) a uma velocidade de 20 quadros por segundo. O que nos leva ao segundo problema.


Copiar framebuffer


Não importava a rapidez com que o blitter conseguia desenhar os polígonos, ainda não era rápido o suficiente. Cada quadro consiste em milhares de polígonos. Alguns polígonos são tão pequenos (1x1, chamados pixigons) que não justificam a sobrecarga. Um dos primeiros antecedentes do jogo (quando Leicester sai da água) consiste em 981 polígonos.



A solução foi armazenar em cache o plano de fundo em um buffer BKGD especial com cópia simples. Esta foi uma tarefa especial para o blitter.


Blitter é um dos dois coprocessadores em Amiga. Como parte do chip Agnus, é usado para copiar blocos de memória retangulares e desenhar linhas. Ao copiar a memória, ela é duas vezes mais rápida que 68000 e pode mover quase quatro megabytes por segundo. Ele pode desenhar linhas a uma velocidade de quase um milhão de pixels por segundo.


- CD do desenvolvedor Amiga v2.1 (OS 3.5)



A uma velocidade de 4000 bytes em milissegundos, a mistura de um buffer BKGD no início de cada novo quadro requer "apenas" 8 ms.


Nota: apesar de Another World ser um jogo polido, algumas arestas permaneceram "ásperas". Se um jogador tentar ser esperto durante o teste de proteção contra cópia [13] e pressionar "c" para inserir o código para acessar a jogabilidade, a tela ficará verde e Amiga congela. A única saída é reiniciar o jogo.


Enchimento de framebuffer


Embora o processador 68000 possa gravar 16 bits de cada vez, o buffer de quadros também foi provavelmente limpo com um blitter. A documentação do Amiga contém um exemplo de código “clearmem” [14] que usa blitter para limpar 128 KB de RAM.


Referências


  1. Wikipedia: Amiga 500 .
  2. Comodoro: Os anos de Amiga .
  3. Comodoro: os anos finais .
  4. Amiga Chip RAM .
  5. Wikipedia: Amiga Hardware .
  6. Modos de tela Amiga .
  7. Amiga Gráficos 3D em tempo real .
  8. Jogo clássico Postmortem - Another World .
  9. Algoritmo de Bresenham .
  10. 6 Hardware Blitter / Modo de preenchimento da área .
  11. 6 Canal Blitter Hardware / DMA .
  12. Apenas mantendo-o real, parte 3 .
  13. Roda de código .
  14. Documentação Amiga, 'Exemplo: Clearmem' .
  15. Blitter .
  16. Um pouco covarde .

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


All Articles