Você está na página 1de 16

A Emulação do Playstation 2:

Um Panorama pela Emotion


Engine
Marcus Vinícius Caruso Leite - 792200

Gustavo de Jesus Rodrigues Silva - 771021


Joatan da Silva Marques - 792186
Maurício Cândido de Souza - 792208

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 1


Introdução
Primeiramente, vamos entender os conceitos básicos: o que é uma emulação? Se
analisarmos o sentido literal da palavra, veremos que emulação se trata do
sentimento (ou ato) da tentativa de se igualar ou superar outrem. Apesar do
significado apenas dizer parcialmente (e de um jeito incorreto) o que a emulação
na área da computação faz, ela nos dá uma ideia do real propósito da emulação. A
emulação é o processo no qual um hardware ou software imita outro programa ou
plataforma, com o intuito de realizar funções que previamente não deveriam ser
possíveis.

Apesar de parecer algo simples, a emulação de um sistema - assim como vamos


ver neste trabalho - não é nada fácil, principalmente quando encontramos
conflitos na arquitetura entre o sistema que desejamos emular e o sistema que
possuímos. As dificuldades da emulação não param aí, quando emulamos um
sistema não podemos simplesmente construir algo que funciona de uma maneira
parecida, devemos emular o sistema inteiro, com todas suas funções.

Simulação ou Emulação?
Se você pensar, o conceito de emulação se assemelha um pouco com o de
simulação, onde algo é imitado por meio de outra coisa diferente, com o intuito de
alcançar o mesmo funcionamento. Então por exemplo: se desejo ver os resultados
de uma colisão de veículos em um programa, isso se trata de uma simulação, já
que eu utilizei um “sistema” diferente para alcançar o meu objetivo.

Essa então é a maior distinção entre a simulação e emulação: apesar de


possuírem um resultado igual ao original, a emulação não só possui o resultado
igual, mas sim o sistema inteiro. Isso permite que qualquer operação que era
capaz de ser realizada no sistema original seja também capaz de ser realizada no
sistema emulado - isso não é verdade para a simulação, já que caso mudássemos
alguns aspectos da colisão poderíamos não ter mais o resultado desejado, dado
que algumas variáveis podem ter sido ignoradas.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 2


Qual o propósito da emulação?
Atualmente a emulação é majoritariamente conhecida por entusiastas de vídeo-
game, pois ela permite que diversos jogos possam ser jogados em plataformas
que antes isso não deveria ser possível. O tema deste trabalho também aborda
essa perspectiva de jogos, entretanto, é importante dizer que esse não é o único
propósito da emulação, e muito menos foi onde ela começou.

A emulação (ou pelo menos uma forma dela) surgiu por volta de 1941, com o
intuito de decodificar textos escritos pela “Enigma Machine”, utilizada na Segunda
Guerra Mundial, essa ideia surgiu do governo Britânico, que tinha o intuito de
replicar a máquina para obter uma vantagem militar na época. Outro caso notável
de emulação na história veio da IBM, em 1965, desenvolvendo um emulador que
permitia que programas da versão antiga do IBM rodarem perfeitamente na versão
mais atual da época. Podemos ver que, apesar de hoje em dia associarmos
emulação comumente a jogos, sua origem é completamente diferente da que
muitos imaginariam, mas ainda assim seu propósito sempre foi o mesmo: obter
acesso a todas as funções de um dispositivo através de outro.

Figura 1 Imagem do Filme "O Jogo da Imitação", onde se passa no contexto da Segunda Guerra
Mundial com Alan Turning desenvolvendo sua máquina para decodificar a Enigma Machine

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 3


A Arquitetura do Playstation 2
O livro "How Multimedia Workloads Will Change Processor
Design.” de Keith Diefendorff e Pradeep K. Dubey antecede o
lançamento do Playstation 2, mas parece que não.

Isso porque dentro da teoria de Diefendorff, o modo como as CPU’s operam


sobre operações Multimedia precisaram entrar em adaptações extremas para não
causar uma velocidade de carregamento muito lenta ou baixa qualidade para ser
entregue ao usuário. Para isso, a Sony encarou o desafio com uma maneira muito
inovadora para a época, usando SIMD e um conceito diferente de
pipelining/paralelismo.

Sim para Paralelismo de Dados e Não para Paralelismo


de Instruções
Lembrando do conceito de pipelining usando a lavanderia, temos as diferentes
instruções operando de maneira segmentada, com as diferentes instruções em
diferentes fases operando paralelamente para gerar um desempenho melhor, ou
seja, menor tempo de resposta para as operações, podemos estendê-lo até a
arquitetura do PS2.

Mas com uma diferença interessante: e se usássemos dados invés de instruções?


Indo na mesma sintonia de analogias, a nossa de hoje é do Jon Stokes, entusiasta
da computação e criador da revista Ars Technica.

Imagine a situação: você tem 4 vacas, onde cada uma vai ter um balde com água
conectado por pipes (tubos) a um tanque com água infinita. Como cada vaca não
necessita de muita água para se sentir satisfeita, não necessitamos de muitos
pipes e baldes maiores do que os normais. Agora, imagine a mesma situação com
elefantes, os animais irão beber a quantidade normal de água tão rápido que
necessitaria de outras alternativas para a estrutura. Assim, uma das soluções
poderia ser aumentar os pipes ou aumentar drasticamente o volume de
capacidade dos baldes (memória?. Jon até sugeriu de você aumentar o volume

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 4


dos baldes e encher de água manualmente de manhã e deixar o tanque escorrer
água durante o dia, mas nós sabemos que isso é só enxugar o gelo, e se tivessem
filhotes bebendo mais água? E caso um elefante fique com muita sede e acabe
com o balde da mesma forma? E então temos a aproximação análoga da Sony:
aumente o tamanho dos pipes e deixe os elefantes gastarem a quantidade o
suficiente de água para ficarem satisfeitos.

Agora falando de computadores, essa analogia encaixa perfeitamente ao


funcionamento do método de produção SIMD adotado pela Sony: usar uma
quantidade de dados maiores enviados paralelamente para o processador e
colocar as instruções para irem sendo inseridas sequencialmente. Você pode até
se perguntar: mas como que um processador de jogos consegue ser eficiente
com instruções sendo sequencialmente executadas? A resposta está no jogo de
cintura que o Playstation 2 adquiriu na época: salvar microinstruções.

Figura 2 Método de Produção SIMD

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 5


E no Playstation 2?
Agora que sabemos como funciona o SIMD e sua representação na figura1,
chegamos a uma parte interessante: Co CPU’s ou, no dialeto da Sony e bonito,
Vector Processor Units VPU.

Uma VPU é classificada como um pequeno componente feito para operar em cima
de vetores, mais precisamente, vetores feitos de quatro floats.

As VPU’s carregam uma memória chamada VU mem, que armazena dados para
fazer comparações/instruções com valores anteriores e Vector Unit, o núcleo que
carrega algumas memórias de microprogramas com duas pequenas unidades,
onde uma executa soma e multiplicação de floats e outra divide floats Lembrando
que a subtração não é nada mais do que inverter o sinal do segundo operando e
somá-lo ao primeiro).

Na arquitetura do Playstation 2Emotion Engine), baseada no MIPS III, há 2 VPU’s,


que operam de maneiras diferentes usando instruções já existentes em
micromemórias:

VPU0: Unidade de processamento que complementa o CPU, que executa


microinstruções salvas da micromemória de microprogramas e serve como
facilitadora para os dev’s dedicarem de maneira estratégica os
processamentos à uma unidade em específico de processamento.

VPU1 Unidade de processamento que tem uma memória maior que a VPU0 e
faz uso da VU mem, que opera sempre em microinstruções de maneira muito
rápida e funções pré-definidas, principalmente as trigonométricas,
comumente usada em jogos 3D.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 6


Como Ficou?
Mundos Infinitos
Nesse aspecto, a VPU tem um papel muito importante dentro da geração de
novos terrenos em tempo real. Isso porque ela processa dados sobre funções
matemáticas e nada mais pertinente do que VPU’s na Emotion Engine servirão
para essa função, onde só necessita dos programadores criarem os jogos
enviando parâmetros para as funções salvas serem armazenarem na VUmem do
PS2. Então é só enviar as personalizações dos terrenos e objetos 3D para as
funções pré-definidas e deixar a VPU calcular rapidamente com outras funções
trigonométricas salvas, lembre-se: A Emotion Engine salva microinstruções.

Comparativo
Agora que você viu a forma do PS2 de tratar com cálculos de maneira paralela
para multimídia, vamos reunir: temos uma CPU que opera em cima de um MIPS III
Core e VPU’s, que trabalham usando funções já pré-estabelecidas em micro
memórias e permitem fazer cálculos trigonométricos eficientes para geração do
3D. Para a coordenação da transferência de dados, temos o componente
DMACDirect Memory Access Controller):

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 7


Figura 3 Direct Memory Access Controller

O DMAC tem uma eficiência ótima no quesito de transferência de dados (nice


pipes bro), ele tem uma frequência de 147mhz Metade do ciclo de clock do CPU
do PS1 e transfere 16 bytes 128 bits) por ciclo, significando que teoricamente o
console é capaz de transferir 2.4Gb/s. Saiba que ele não é um CPU propriamente,
mas sim um componente com papel de transferência de memória e receptor de
dados de periféricos, exigindo menos esforços da CPU, que vai operar com as
VPU’s e cálculos mais complexos e singulares.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 8


Quanto à própria CPU do PS2, fazendo uma comparação entre um Intel Pentium III
e o CPU do PS2, temos as tabelas:

Pentium III, 32MB TNT2 Ultra

Type Data

L1 cache 16K 4-way 16K 4-way


L2 cache 256K unified
Video Memory 32MB

Total 33.056k

Playstation 2

Type Data
L1 cache 16K 2-way instruction 8K 2-way data

SPRAM 16K
VU0 cache? (instruction + data) 32K
VU1 cache? (instruction + data) 32K

Video memory 4MB


Total 4.200K

💡 Note que os caches de VU VU mem) são divididos, enquanto temos um


L2 unificado no Pentium III, como também o PS2 tem 8 vezes menos de
memória de vídeo em relação ao PIII. Lembre-se da analogia: grandes
baldes e tubos pequenos vs. baldes normais e grandes tubos. Isso fez
com que os desenvolvedores parassem de dedicar operações para cada
necessidade e colocassem instruções pré-estabelecidas com uma
grande quantidade de dados, assim grandes cálculos 3D são feitos em
paralelo numa mesma intrução para uma otimização eficiente para jogos
de PS2.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 9


Veja:

Figura 4 Comparativo PS1(à esquerda) e PS2 (à direita)

Na imagem a esquerda, você pode ver o gráfico no PS1 com 732 triângulos e do
PS2 à direita com 2226 triângulos. Isso é permitido graças à arquitetura da
Emotion Engine, que usa VPU’s para fazer cálculos trigonométricos pré-
estabelecidos para renderizar os gráficos com os dados inseridos paralelamente e
poupar instruções e operações na CPU principal.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 10


Por que o hardware do ps2 é tão estranho e sua
emulação tão difícil?
O hardware do Playstation 2 fazia suas operações fora do padrão IEEE, tornando
ineficiente tentar rodar elas em processadores comuns, como os de
computadores. Um dos exemplos dessas operações fora do padrão é o ponto
flutuante: enquanto os CPUs de computadores convencionais seguem o padrão
de ponto flutuante IEEE, no ps2, cada valor de ponto flutuante precisa ser
verificado e tratado, devido a certas diferenças entre aritméticas negativas,
positivas e infinitas. Dessa maneira, fica muito difícil recriar o jeito com que o ps2
lida com os pontos flutuantes com precisão em hardware moderno numa
velocidade razoável, e por isso vários emuladores atuais frequentemente mudam
a maneira de como lidam as flutuações em cada jogo, tentando deixar o mais
próximo o possível da sua maneira original.

Outro ponto que torna mais difícil é a maneira como os desenvolvedores


conseguiram fazer com que as coisas funcionassem no sistema do playstation 2,
haviam implementações que nem mesmo os desenvolvedores achavam que eram
possíveis, mas os hacks e os truques que eles implementaram fizeram tudo que
conhecemos hoje no ps2 funcionar sem travar o sistema. Esses truques e hacks
criados dificultam o funcionamento adequado de emulações e, por causa disso,
ela até hoje não é 100% funcional. Ninguém conseguiu ainda fazer um emulador
capaz de emular todos os jogos perfeitamente, enquanto conseguem fazer os
jogos ‘A’, ‘B’ e ‘C’ funcionarem, os jogos ‘D’, ‘E’ e ‘F’ nem inicializam. Tornando
praticamente impossível fazer com que um emulador rode todos os jogos, pois
quando o emulador é organizado para conseguir com que o jogo ‘E’ seja emulado
corretamente, a emulação impossibilita o jogo ‘B’ de rodar.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 11


Criação de um Emulador
Já foi dito diversas vezes o quão difícil é fazer um emulador e também que até
hoje não existe um emulador que consiga emular todos os jogos, porém, isso não
quer dizer que não exista nenhum emulador funcional de playstation 2. O PCSX2 é
um exemplo disso. É seguro dizer que hoje ele é o emulador que apresenta os
melhores resultados e também é o que está a mais tempo sendo desenvolvido, e
hoje consegue emular grande parte dos jogos, em ultra HD, possuindo até
recursos para melhorar a jogabilidade.

Figura 5 Logo do PCSX2, o emulador para computador open-source, gratuito e mais popular do
Playstation 2

Entretanto, como esses emuladores são criados? Para a criação de um emulador,


é necessário, primeiramente entender o hardware do console que você deseja
emular, já falamos anteriormente sobre a CPU do PS2 e a complexidade da
Emotion Engine.
Aqui iremos mostrar alguns dos passos para a criação de um emulador. Para não
fugir muito do ponto principal, decidimos dar menos ênfase em algumas partes
relacionadas à linguagens de alto nível, por exemplo.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 12


A ideia de emular parece bastante simples quando pensamos em um âmbito geral.
Queremos basicamente replicar algo que já foi criado em uma máquina mais
simples para um computador mais potente e sofisticado. E é impensável emular
um videogame sem reproduzir a imagem do jogo na tela. Para isso, necessitamos
de um arquivo ELF que envia a imagem para a tela. Parece simples, certo?

Memória
Alguns podem pensar que deve-se começar com a CPU, porém não é possível
emular sem um código para ler e é impossível ler um código sem a memória. Com
isso, o mais prudente a se fazer é entender como funciona a memória do PS2.

Existem algumas complicações relacionadas à memória que devem ser resolvidas


antes de executar o arquivo ELF. Uma delas é o mapa de memória do PS2. A
Emotion Engine trabalha com um mapa de memória virtual. Portanto, devemos
traduzir esses endereços de memória virtuais para endereços físicos. Infelizmente
é extremamente difícil fazer isso sem perder performance. No PS2 esses
endereços virtuais são usados para separar as regiões que estão no cachê das
regiões que não estão.

Endereços virtuais também dispõem de 16 KB de “scratchpad RAM”. Esse tipo de


memória é muito mais rápida que a RAM comum e é muito útil para o
armazenamento de cálculos temporários. Jogos mais leves não utilizam esse tipo
de memória, porém devemos nos preocupar com ela caso queiramos rodar jogos
mais pesados.

Depois de lidar com esses problemas, podemos finalmente implementar nosso


arquivo ELF. Isso é bem simples, basta copiar os dados em seu devido lugar e
executá-lo.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 13


Emotion Engine
Já foi dito que a Emotion Engine é baseada no MIPS III, porém ela também tem
algumas pequenas customizações, como algumas extensões do MIPS IV e
também algumas instruções de multimídia especiais. Vale também ressaltar que a
Emotion Engine possui barramentos de 128 bits e também registradores de
propósito geral de mesmo tamanho.

Se você já é familiarizado com o MIPS não terá muitos problemas para


implementar as instruções da Emotion Engine. Existe apenas uma diferença entre
o MIPS e a Emotion Engine Nesse sentido: a instrução “mult”, a Emotion Engine
não utiliza dos registradores LO/HI. Os resultados das multiplicações de dois
registradores de 32 bits vão direto para os registradores de propósito geral.

É bem simples lidar com os registradores de 128 bits da Emotion Engine. O


PCSX2, por exemplo, utiliza unions.

/* Located in PCSX2/R5900.h */
union GPR_reg {
u128 UQ;
s128 SQ;
u64 UD[2];
s64 SD[2];
u32 UL[4];
s32 SL[4];
u16 US[8];
s16 SS[8];
u8 UC[16;
s8 SC[16];
};

Com esse método, é fácil de acessar basicamente qualquer registrador. A partir


daqui o processo começa a ficar cada vez mais distante do ponto principal, como
é o caso das syscalls.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 14


O PS2 realiza diversas syscalls em sua BIOS quando inicializado. Não podemos
ignorá-las, porém replicar a BIOS é um processo muito complicado que levaria
muito tempo. A solução encontrada foi implementar essas syscalls em uma
linguagem de alto nível, esse método consiste em implementar a BIOS do PS2
como uma série de funções em C, por exemplo. Porém é especialmente difícil
implementar o Processador de Input/Output utilizando apenas linguagens de alto
nível. Usando as linguagens de baixo nível é possível executar um código de MIPS
na BIOS para facilitar a implementação de certas funções.

No caso da placa de vídeo, a Emotion Engine só é capaz de acessar algumas


funcionalidades da placa de vídeo. As funcionalidades de renderização da placa
de vídeo, por exemplo, não podem ser acessadas. A VRAM também é separada do
mapa de memória da Emotion Engine e, portanto, é inacessível. Necessitando,
assim, de outro hardware para o acesso.

Com isso, é possível observar o quão complexo é emular o PS2, pois as diferentes
abordagens apresentam uma série de diferentes problemas, exigindo um bom
conhecimento tanto de linguagens de alto nível como C, quanto de linguagens
de baixo nível como o MIPS.
O principal objetivo de um emulador é simular o funcionamento de certa coisa,
porém vimos que o PS2 é tão único que torna quase impossível sua emulação
completa em um computador.

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 15


Fontes
Post no fórum do PCSX2 de Air, Desenvolvedor Oficial do emulador PCSX2.
(https://forums.pcsx2.net/Thread-blog-PS2-s-Programmable-DMA)

Documentação do PCSX2. (https://docs.libretro.com/library/pcsx2/)

Artigo do Jon Stokes: The Playstation2 vs. The PC.


(https://arstechnica.com/features/2000/04/ps2vspc/)

OBS.: Recomendamos o uso do wayback machine para ver as imagens.

Artigo do Rodrigo Copetti: Playstation 2 Architeture.


(https://www.copetti.org/writings/consoles/playstation-2/)

Página da Wikipédia sobre Emotion Engine.


(https://en.wikipedia.org/wiki/Emotion_Engine)

Apresentação sobre um Exemplo de Sistema Embarcado usando o PS2 do


Marcelo Schiavon Porto, UFRGS.
(http://www.inf.ufrgs.br/~flavio/ensino/cmp237/PlayStation2.pdf)

A Emulação do Playstation 2 Um Panorama pela Emotion Engine 16

Você também pode gostar