Compare commits

...

3 Commits

Author SHA1 Message Date
Hugo Carvalho 10b41dfef0
Update Portuguese translation (#2412) 2024-03-07 21:13:58 +10:30
zilmar 98b1bddc64 Core: Get COP1_D_ADD, COP1_D_SUB, COP1_D_DIV, COP1_D_ABS, COP1_D_SQRT 2024-03-07 21:12:57 +10:30
zilmar 97ec1f533b Core: Make sure precision is set to 53bit 2024-03-07 20:52:24 +10:30
3 changed files with 293 additions and 164 deletions

View File

@ -1,19 +1,19 @@
// Meta information // Meta information
#1 # "Português" // Language ID #1 # "Português (Portugal)" // Language ID
#2 # "Hugo Carvalho" // Author #2 # "Hugo Carvalho" // Author
#3 # "3.0" // Version #3 # "3.0.1" // Version
#4 # "Novembro, 2022" // Date #4 # "06 de março de 2024" // Date
/*** Menu ***/ /*** Menu ***/
// File menu // File menu
#100# "&Ficheiro" #100# "&Ficheiro"
#101# "&Abrir a ROM" #101# "&Abrir ROM"
#102# "Informação &da ROM..." #102# "Informação &da ROM..."
#103# "Iniciar a emulação" #103# "Iniciar emulação"
#104# "&Terminar a emulação" #104# "&Encerrar emulação"
#105# "Escolher o directório das ROMs..." #105# "Escolher o directório das ROMs..."
#106# "Actualizar a lista das ROMs" #106# "Actualizar lista das ROMs"
#107# "ROMs recentes" #107# "ROMs recentes"
#108# "Directórios das ROMs recentes" #108# "Directórios das ROMs recentes"
#109# "S&air" #109# "S&air"
@ -22,19 +22,19 @@
// System menu // System menu
#120# "&Sistema" #120# "&Sistema"
#121# "&Reiniciar" #121# "&Reiniciar"
#122# "&Colocar em pausa" #122# "&Pausa"
#123# "Captura de ecrã" #123# "Captura de ecrã"
#124# "Limitar o FPS" #124# "Limitar FPS"
#125# "&Gravar" #125# "&Gravar"
#126# "Gravar como..." #126# "Gravar como..."
#127# "&Carregar o estado" #127# "&Carregar estado"
#128# "Carregar..." #128# "Carregar..."
#129# "Gravar o estado a&tual" #129# "Gravar estado ac&tual"
#130# "&Batotas..." #130# "&Batotas..."
#131# "Botão GS" #131# "Botão GS"
#132# "R&etomar" #132# "R&etomar"
#133# "&Reiniciar leve" #133# "&Reinício leve"
#134# "&Reiniciar forçado" #134# "&Reinício forçado"
#135# "Trocar &disco" #135# "Trocar &disco"
#136# "&Melhorias..." #136# "&Melhorias..."
@ -42,9 +42,9 @@
#140# "&Opções" #140# "&Opções"
#141# "&Ecrã inteiro" #141# "&Ecrã inteiro"
#142# "Sempre na &frente" #142# "Sempre na &frente"
#143# "&Definições dos Gráficos" #143# "&Definições dos gráficos"
#144# "&Definições do Áudio" #144# "&Definições do áudio"
#145# "&Definições do Controlador" #145# "&Definições do controlador"
#146# "&Definições do RSP" #146# "&Definições do RSP"
#147# "Mostrar as estatísticas da &CPU" #147# "Mostrar as estatísticas da &CPU"
#148# "Defini&ções..." #148# "Defini&ções..."
@ -58,7 +58,7 @@
// Help menu // Help menu
#180# "&Ajuda" #180# "&Ajuda"
#182# "&Acerca do Project 64" #182# "&Acerca do Project 64"
#184# "&Site da Web" #184# "&Página da Web"
#185# "&Apoiar o Project64" #185# "&Apoiar o Project64"
#186# "&Discord" #186# "&Discord"
@ -74,14 +74,14 @@
#198# "Compartimento 8" #198# "Compartimento 8"
#199# "Compartimento 9" #199# "Compartimento 9"
#200# "Compartimento 10" #200# "Compartimento 10"
#201# "Compartimento de gravação (%ws) seleccionado" #201# "Compartimento (%ws) seleccionado"
// Pop-up menu // Pop-up menu
#210# "Jogar o jogo" #210# "Jogar o jogo"
#211# "Informação da ROM" #211# "Informações da ROM"
#212# "Editar as definições do jogo" #212# "Editar definições do jogo"
#213# "Editar as batotas..." #213# "Editar batotas..."
#214# "Plugin dos Gráficos" #214# "Plugin de gráficos"
#215# "Jogar o jogo com o disco" #215# "Jogar o jogo com o disco"
#216# "Escolher melhorias..." #216# "Escolher melhorias..."
@ -100,18 +100,18 @@
// Menu descriptions // Menu descriptions
#250# "Abrir uma imagem ROM do N64" #250# "Abrir uma imagem ROM do N64"
#251# "Mostrar informação sobre a imagem carregada" #251# "Mostrar informações sobre a imagem carregada"
#252# "Iniciar a emulação da imagem ROM carregada" #252# "Iniciar emulação da imagem ROM carregada"
#253# "Parar a emulação da imagem ROM carregada" #253# "Parar emulação da imagem ROM carregada"
#254# "Seleccionar o directório das ROMs" #254# "Seleccionar o directório das ROMs"
#255# "Actualizar a lista das ROMs actuais no explorador de ROMs" #255# "Actualizar a lista actual das ROMs no explorador de ROMs"
#256# "Sair desta aplicação" #256# "Sair da aplicação"
#257# "Reiniciar a imagem ROM actual (recarregar quaisquer alterações nas definições)" #257# "Reiniciar imagem da ROM actual (recarregar quaisquer alterações nas definições)"
#258# "Interromper/retomar a emulação da ROM actual em execução" #258# "Interromper/retomar a emulação da ROM actual em execução"
#259# "Gerar uma imagem bitmap do ecrã actual" #259# "Gerar uma imagem bitmap do ecrã actual"
#260# "Limitar o FPS para a velocidade correta do N64" #260# "Limitar o FPS para a velocidade correta do N64"
#261# "Gravar o estado do sistema actual" #261# "Gravar o estado actual do sistema"
#262# "Gravar o estado do sistema actual num local seleccionado para o ficheiro" #262# "Gravar o estado actual do sistema num local seleccionado para o ficheiro"
#263# "Carregar o estado gravado do sistema" #263# "Carregar o estado gravado do sistema"
#264# "Escolher um ficheiro do estado gravado do sistema para carregar" #264# "Escolher um ficheiro do estado gravado do sistema para carregar"
#265# "Activar/Desactivar as batotas do Gameshark" #265# "Activar/Desactivar as batotas do Gameshark"
@ -125,15 +125,15 @@
#273# "Mostrar a utilização da CPU pelo emulador dividida sobre recursos diferentes" #273# "Mostrar a utilização da CPU pelo emulador dividida sobre recursos diferentes"
#274# "Visualizar/Alterar as definições para esta aplicação" #274# "Visualizar/Alterar as definições para esta aplicação"
#275# "Visualizar o manual da aplicação" #275# "Visualizar o manual da aplicação"
#276# "Visualizar as FAQ da aplicação" #276# "Visualizar as perguntas frequentes da aplicação"
#278# "Acerca da aplicação e autores" #278# "Acerca da aplicação e dos autores"
#277# "Acerca dos autores dos ficheiros de suporte" #277# "Acerca dos autores dos ficheiros de suporte"
#279# "Abrir esta imagem ROM previamente aberta" #279# "Abrir esta imagem ROM previamente aberta"
#280# "Escolher este directório como directório das ROMs" #280# "Escolher este directório como directório das ROMs"
#281# "Alterar a aplicação para usar este idioma" #281# "Alterar a aplicação para usar este idioma"
#282# "Escolha este local de gravação para o estado gravado" #282# "Escolha este local de gravação para o estado gravado"
#283# "Jogar o jogo seleccionado" #283# "Jogar o jogo seleccionado"
#284# "Informação sobre o jogo seleccionado" #284# "Informações sobre o jogo seleccionado"
#285# "Editar as definições do jogo seleccionado" #285# "Editar as definições do jogo seleccionado"
#286# "Editar as batotas do jogo seleccionado" #286# "Editar as batotas do jogo seleccionado"
@ -145,7 +145,7 @@
#302# "Boa reputação" #302# "Boa reputação"
#303# "Estado" #303# "Estado"
#304# "Tamanho da ROM" #304# "Tamanho da ROM"
#305# "Notas (core)" #305# "Notas (núcleo)"
#306# "Notas (plugins predefinidos)" #306# "Notas (plugins predefinidos)"
#307# "Notas (utilizador)" #307# "Notas (utilizador)"
#308# "ID do cartucho" #308# "ID do cartucho"
@ -158,7 +158,7 @@
#315# "Data de lançamento" #315# "Data de lançamento"
#316# "Género" #316# "Género"
#317# "Jogadores" #317# "Jogadores"
#318# "Forçar o Feedback" #318# "Forçar Feedback"
#319# "Formato do ficheiro" #319# "Formato do ficheiro"
#321# "Nome" #321# "Nome"
@ -166,7 +166,7 @@
#320# "Seleccionar o directório actual das ROMs" #320# "Seleccionar o directório actual das ROMs"
// Messages // Messages
#340# "Má ROM? Usar o GoodN64 e verificar se a RDB está actualizada" #340# "ROM corrompida? Use o GoodN64 e verifique se o RDB está actualizado"
/*** Options ***/ /*** Options ***/
@ -184,19 +184,19 @@
#409# "Teclas de atalho" #409# "Teclas de atalho"
#410# "Estado" #410# "Estado"
#411# "Recompilador" #411# "Recompilador"
#412# "Padrões" #412# "Predefinições"
#413# "64DD" #413# "64DD"
#414# "64DD" #414# "64DD"
// Plugin dialog // Plugin dialog
#420# "Acerca" #420# "Acerca"
#421# " Plugin RSP (Processador do Sinal da Realidade): " #421# " Plugin RSP (Processador do Sinal da Realidade): "
#422# " Plugin de Vídeo (gráficos): " #422# " Plugin de vídeo (gráficos): "
#423# " Plugin de Áudio (som): " #423# " Plugin de áudio (som): "
#424# " Plugin do Controlador (controlador): " #424# " Plugin de entrada (controlador): "
#425# "Gráficos HLE" #425# "Gráficos HLE"
#426# "Áudio HLE" #426# "Áudio HLE"
#427# "** Usar o Plugin do Sistema **" #427# "** Usar plugin do sistema **"
// Directory dialog // Directory dialog
#440# " Directório dos plugins: " #440# " Directório dos plugins: "
@ -216,26 +216,26 @@
// Options (general) tab // Options (general) tab
#460# "Interromper a emulação quando a janela não está activa" #460# "Interromper a emulação quando a janela não está activa"
#461# "Entrar no modo de ecrã inteiro quando carregar uma ROM" #461# "Entrar no modo de ecrã inteiro quando carregar uma ROM"
#462# "Ocultar as definições avançadas" #462# "Ocultar definições avançadas"
#463# "Memorizar as batotas seleccionadas" #463# "Memorizar batotas seleccionadas"
#464# "Desactivar a protecção de ecrã quando executar uma ROM" #464# "Desactivar protecção de ecrã quando executar uma ROM"
#465# "Mostrar a velocidade" #465# "Mostrar velocidade"
#466# "Visor da velocidade:" #466# "Velocidade do ecrã:"
#467# "Verificar se o Project64 já está em execução" #467# "Verificar se o Project64 já está em execução"
#468# "Armazenar gravações do jogo em pastas separadas" #468# "Armazenar gravações do jogo em pastas separadas"
#469# "Local da ROM 64DD IPL de retalho Japão:" #469# "Localização da ROM 64DD IPL de retalho Japão:"
#470# "Local da ROM 64DD IPL de retalho América:" #470# "Localização da ROM 64DD IPL de retalho América:"
#471# "Local da ROM 64DD IPL de desenvolvimento:" #471# "Localização da ROM 64DD IPL de desenvolvimento:"
#472# "Tipo de gravação:" #472# "Tipo de gravação no disco:"
#473# "Activar melhorias" #473# "Activar melhorias"
#474# "Mostrar barra de estado" #474# "Mostrar barra de estado"
#475# "Sair do ecrã inteiro ao perder o foco" #475# "Sair do ecrã inteiro ao perder o foco"
#476# "Activar Discord Rich Presence" #476# "Activar Rich Presence do Discord"
// ROM browser tab // ROM browser tab
#480# "Máx. # de ROMs memorizadas (0-10):" #480# "Nº máximo # de ROMs memorizadas (0-10):"
#481# "ROMs" #481# "ROMs"
#482# "Máx. # de dirs ROMs memorizados (0-10):" #482# "Nº máximo # de directórios de ROMs memorizados (0-10):"
#483# "Directórios" #483# "Directórios"
#484# "Usar explorador de ROMs" #484# "Usar explorador de ROMs"
#485# "Usar repetição de directório" #485# "Usar repetição de directório"
@ -243,21 +243,21 @@
#487# "Ordem dos campos:" #487# "Ordem dos campos:"
#488# "Adicionar ->" #488# "Adicionar ->"
#489# "<- Remover" #489# "<- Remover"
#490# "Acima" #490# "P/ cima"
#491# "Abaixo" #491# "P/ baixo"
#492# "Recarregar o explorador automaticamente" #492# "Recarregar o explorador automaticamente"
#493# "Mostrar extensão dos ficheiros" #493# "Mostrar extensão dos ficheiros"
// Advanced options // Advanced options
#500# "A maioria destas alterações não terão efeito até que uma nova ROM seja aberta ou que a ROM actual seja reposta." #500# "A maioria destas alterações não terão efeito até que uma nova ROM seja aberta ou que a ROM actual seja reposta."
#501# "Padrões do core" #501# "Predefinições do núcleo"
#502# "Estilo do core da CPU:" #502# "Estilo do núcleo da CPU:"
#503# "Métodos de auto-modificação" #503# "Métodos de modificação automática"
#504# "Tamanho predefinido da memória:" #504# "Tamanho predefinido da memória:"
#505# "Ligação avançada de blocos" #505# "Ligação avançada dos blocos"
#506# "Iniciar a emulação quando a ROM está aberta" #506# "Iniciar a emulação quando a ROM for aberta"
#507# "Substituir sempre as definições predefinidas com as do RDB" #507# "Substituir sempre as definições predefinidas com as do RDB"
#508# "Comprimir automaticamente os estados gravados" #508# "Comprimir os estados gravados automaticamente"
#509# "Activar depurador" #509# "Activar depurador"
#510# "Cache" #510# "Cache"
#511# "DMA do PI" #511# "DMA do PI"
@ -272,11 +272,11 @@
#522# "Tamanho da memória:" #522# "Tamanho da memória:"
#523# "Ligação avançada dos blocos" #523# "Ligação avançada dos blocos"
#524# "Tipo da gravação predefinida:" #524# "Tipo da gravação predefinida:"
#525# "Contra fator:" #525# "Contrafator:"
#526# "Buffer de compilação maior" #526# "Buffer de compilação maior"
#528# "Caching de registo" #528# "Registar armazenamento em cache"
#529# "Atrasar a interrupção do SI" #529# "Atrasar a interrupção do SI"
#530# "SP Rápido" #530# "SP rápido"
#531# "Predefinido" #531# "Predefinido"
#532# "Sinal de áudio do RSP" #532# "Sinal de áudio do RSP"
#533# "Temporização do áudio fixo" #533# "Temporização do áudio fixo"
@ -284,14 +284,17 @@
#535# "Método de auto-modificação personalizado" #535# "Método de auto-modificação personalizado"
#536# "Sincronizar usando o áudio" #536# "Sincronizar usando o áudio"
#537# "Contagem de AIs por byte:" #537# "Contagem de AIs por byte:"
#538# "Engine de 32 bits" #538# "Mecanismo de 32 bits"
#539# "Atrasar a interrupção do DP" #539# "Atrasar a interrupção do DP"
#5400# "Modificador overclock:" #5400# "Modificador de overclock:"
#5410# "DMA desalinhado" #5410# "DMA desalinhado"
#5420# "Aleatorizar as interrupções SI/PI" #5420# "Aleatorizar as interrupções SI/PI"
#5440# "Tempo de busca em disco:" #5440# "Tempo de busca no disco:"
#5441# "Turbo" #5441# "Turbo"
#5442# "Lento" #5442# "Lento"
#5443# "Tamanho da memória (conhecido):"
#5444# "Tamanho da memória (desconhecido):"
#5445# "Cache do registo do FPU"
// Core styles // Core styles
#540# "Interpretador" #540# "Interpretador"
@ -301,11 +304,11 @@
// Self-mod methods // Self-mod methods
#560# "Nenhum" #560# "Nenhum"
#561# "Cache" #561# "Cache"
#562# "Proteger a memória" #562# "Proteger memória"
#563# "Verificar a memória e cache" #563# "Verificar memória e cache"
#564# "Alterar a memória e cache" #564# "Alterar memória e cache"
#565# "Verificar o avanço da memória" #565# "Verificar avanço da memória"
#566# "Limpar o código no cache" #566# "Limpar código no cache"
// Function lookup method // Function lookup method
#570# "Tabela de procura física" #570# "Tabela de procura física"
@ -313,8 +316,8 @@
#572# "Alterar memória" #572# "Alterar memória"
// RDRAM size // RDRAM size
#580# "4 MBs" #580# "4 MB"
#581# "8 MBs" #581# "8 MB"
// Advanced block linking // Advanced block linking
#600# "Ligado" #600# "Ligado"
@ -338,7 +341,7 @@
#682# "Teclas actuais:" #682# "Teclas actuais:"
#683# "Seleccionar nova tecla de atalho:" #683# "Seleccionar nova tecla de atalho:"
#684# "Actualmente atribuído a:" #684# "Actualmente atribuído a:"
#685# "Designar" #685# "Atribuir"
#686# "Remover" #686# "Remover"
#687# "Repor tudo" #687# "Repor tudo"
#688# "O jogo não está em execução" #688# "O jogo não está em execução"
@ -369,7 +372,7 @@
/*** ROM information ***/ /*** ROM information ***/
// ROM info title // ROM info title
#800# "Informação da ROM" #800# "Informações da ROM"
// ROM info text // ROM info text
#801# "Nome da ROM:" #801# "Nome da ROM:"
@ -410,7 +413,7 @@
// Digital value // Digital value
#1016# "Dígito da quantidade" #1016# "Dígito da quantidade"
#1017# "Escolha um valor pra:" #1017# "Escolha um valor para:"
#1018# "&Valor" #1018# "&Valor"
#1019# "de" #1019# "de"
#1020# "até" #1020# "até"
@ -422,9 +425,9 @@
#1026# "<valor> <rótulo>" #1026# "<valor> <rótulo>"
// Edit cheat // Edit cheat
#1027# "Editar a batota" #1027# "Editar batota"
#1028# "Actualizar a batota" #1028# "Actualizar batota"
#1029# "A batota foi alterada.\n\nDeseja actualizar?" #1029# "A batota foi alterada.\n\nPretende actualizar?"
#1030# "Batota actualizada" #1030# "Batota actualizada"
// Cheat pop-up menu // Cheat pop-up menu
@ -443,7 +446,7 @@
/*** Support window ***/ /*** Support window ***/
#1200# "Apoiar o Project64" #1200# "Apoiar o Project64"
#1201# "O Project64 é um emulador de Nintendo64 gratuito e de código aberto.\n\nEste permite-lhe reproduzir o software N64 da mesma forma que o seria na consola original.\n\nLamento o incómodo deste aviso mas pede-se-lhe que aguarde alguns segundos para poder desfrutar do resultado de centenas de horas de trabalho.\n\nSe pode e gostaria de apoiar o Project64 ou se obteve algum valor com ele, apoie o Project64 como um agradecimento ou como o seu desejo de remover este aviso.\n\nSe apoiou o Project64:" #1201# "O Project64 é um emulador de Nintendo 64 gratuito e de código aberto.\n\nEste permite-lhe reproduzir o software N64 da mesma forma que o seria na consola original.\n\nLamento o incómodo deste aviso mas pede-se-lhe que aguarde alguns segundos para poder desfrutar do resultado de centenas de horas de trabalho.\n\nSe pode e gostaria de apoiar o Project64 ou se obteve algum valor com ele, apoie o Project64 como um agradecimento ou como o seu desejo de remover este aviso.\n\nSe apoiou o Project64:"
#1202# "Inserir/Requisitar o código de notificação" #1202# "Inserir/Requisitar o código de notificação"
#1203# "Apoiar o Project64" #1203# "Apoiar o Project64"
#1204# "Continuar" #1204# "Continuar"
@ -451,12 +454,12 @@
#1206# "Falha ao validar o código\n\nCertifique-se de que o código no e-mail corresponde com base no seu dispositivo" #1206# "Falha ao validar o código\n\nCertifique-se de que o código no e-mail corresponde com base no seu dispositivo"
#1207# "Obrigado" #1207# "Obrigado"
#1208# "Insira o código de apoio" #1208# "Insira o código de apoio"
#1209# "Insira o código que recebeu no e-mail.\n\nEste e-mail será enviado para o endereço de e-mail usado para apoiar o Project64.\n\nNote-se que o código só funcionará para um único dispositivo. A identificação deste dispositivo é:" #1209# "Insira o código recebido por e-mail.\n\nEste e-mail será enviado para o endereço de e-mail usado para apoiar o Project64.\n\nNote que o código só funcionará para um único dispositivo. A identificação deste dispositivo é:"
#1210# "Aceitar" #1210# "Aceitar"
#1211# "Cancelar" #1211# "Cancelar"
#1212# "Requisitar código" #1212# "Solicitar código"
#1213# "O código foi enviado para o seu e-mail" #1213# "O código foi enviado para o seu e-mail"
#1214# "Falha no envio do código, certifique-se de que é o e-mail com o qual apoiou" #1214# "Falha ao enviar o código. Certifique-se de que o e-mail está correcto"
/*** Enhancements ***/ /*** Enhancements ***/
@ -466,8 +469,8 @@
#2000# "*** CPU EM PAUSA ***" #2000# "*** CPU EM PAUSA ***"
#2001# "CPU retomada" #2001# "CPU retomada"
#2002# "Num ciclo permanente do qual não se pode sair.\nA emulação vai agora parar.\n\nVerifique a ROM e as suas definições." #2002# "Num ciclo permanente do qual não se pode sair.\nA emulação será interrompida agora.\n\nVerifique a ROM e as suas definições."
#2003# "Falha na atribuição de memória" #2003# "Falha ao atribuir a memória"
#2004# "O plugin de vídeo predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin de vídeo (gráficos).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins." #2004# "O plugin de vídeo predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin de vídeo (gráficos).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins."
#2005# "O plugin de áudio predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin de áudio (som).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins." #2005# "O plugin de áudio predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin de áudio (som).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins."
#2006# "O plugin RSP predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin RSP (Processador do Sinal de Realidade).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins." #2006# "O plugin RSP predefinido ou seleccionado está em falta ou é inválido.\n\nTem de ir a Definições e seleccionar um plugin RSP (Processador do Sinal de Realidade).\nVerifique se tem pelo menos um ficheiro de plugin compatível na sua pasta de plugins."
@ -476,7 +479,7 @@
#2009# "Falha ao carregar a palavra.\n\Verifique a ROM e as suas definições." #2009# "Falha ao carregar a palavra.\n\Verifique a ROM e as suas definições."
#2010# "Falha ao abrir o ficheiro gravado" #2010# "Falha ao abrir o ficheiro gravado"
#2011# "Falha ao abrir o EEPROM" #2011# "Falha ao abrir o EEPROM"
#2012# "Falha ao abrir a flash RAM" #2012# "Falha ao abrir a RAM do flash"
#2013# "Falha ao abrir o mempak" #2013# "Falha ao abrir o mempak"
#2014# "Falha ao tentar abrir o ficheiro zip.\n\nProvavelmente um ficheiro zip corrompido - tente descomprimir a ROM manualmente." #2014# "Falha ao tentar abrir o ficheiro zip.\n\nProvavelmente um ficheiro zip corrompido - tente descomprimir a ROM manualmente."
#2015# "Falha ao tentar abrir o ficheiro." #2015# "Falha ao tentar abrir o ficheiro."
@ -492,13 +495,13 @@
#2025# "Erro" #2025# "Erro"
#2026# "Sequência de direitos de autor não encontrada no LUT. O jogo deixará de funcionar." #2026# "Sequência de direitos de autor não encontrada no LUT. O jogo deixará de funcionar."
#2027# "Falha na protecção contra cópia" #2027# "Falha na protecção contra cópia"
#2028# "Mudar um plugin requer que o Project64 reinicie uma ROM em execução.\nSe não quer perder o local responda Não e grave primeiro o estado actual.\n\nMudar os plugins e reiniciar a ROM agora?" #2028# "Alterar um plugin requer que o Project64 reinicie uma ROM em execução.\nSe não quer perder o local responda Não e grave primeiro o estado actual.\n\nMudar os plugins e reiniciar a ROM agora?"
#2029# "Mudar os plugins" #2029# "Alterar plugins"
#2030# "Emulação terminada" #2030# "Emulação encerrada"
#2031# "Emulação iniciada" #2031# "Emulação iniciada"
#2032# "Não foi possível carregar o estado" #2032# "Não foi possível carregar o estado"
#2033# "Estado carregado" #2033# "Estado carregado"
#2034# "Gravou o estado actual em" #2034# "Estado actual gravado em"
#2035# "Compartimento do estado" #2035# "Compartimento do estado"
#2036# "Imagem da troca dos bytes" #2036# "Imagem da troca dos bytes"
#2037# "A escolher a imagem do N64" #2037# "A escolher a imagem do N64"
@ -508,67 +511,71 @@
#2041# "Eliminar isto?" #2041# "Eliminar isto?"
#2042# "Eliminar batota" #2042# "Eliminar batota"
#2043# "O nome da batota já está em utilização." #2043# "O nome da batota já está em utilização."
#2044# "Alcançou a quantia máxima de batotas para esta ROM." #2044# "Alcançou o número máximo de batotas para esta ROM."
#2045# "Plugin a iniciar" #2045# "Plugin a iniciar"
#2046# "Não seleccionou uma tecla virtual para designar ao item do menu." #2046# "Não seleccionou uma tecla virtual para designar ao item do menu."
#2047# "É necessário seleccionar um item do menu para atribuir a esta tecla" #2047# "É necessário seleccionar um item do menu para atribuir a esta tecla"
#2048# "O atalho foi designado a outro item do menu." #2048# "O atalho foi designado a outro item do menu."
#2049# "Nenhum atalho foi seleccionado para ser removido." #2049# "Nenhum atalho foi seleccionado para ser removido."
#2050# "ROM carregada. À espera que a emulação inicie." #2050# "ROM carregada. A aguardar que a emulação inicie."
#2051# "As versões beta do Project64 são só pra membros.\n\nSe tem uma conta em www.pj64-emu.com não deveria estar a ver este erro!!\nContacte-nos no site." #2051# "As versões beta do Project64 são só para membros.\n\nSe tem uma conta em www.pj64-emu.com não deveria estar a ver este erro!!\nContacte-nos no site."
#2052# "Erro do programa" #2052# "Erro do programa"
#2053# "Falha ao localizar o nome do ficheiro no ficheiro 7z" #2053# "Falha ao localizar o nome do ficheiro no ficheiro 7z"
#2054# "Emulação gráfica de baixo nível" #2054# "Emulação gráfica de baixo nível"
#2055# "Os Gráficos LLE não são para o uso geral!!!\nÉ aconselhável que só o utilize para testes e não para jogar jogos.\n\nMudar pra gráficos LLE?" #2055# "Os Gráficos LLE não são para o uso geral!!!\nÉ aconselhável que só o utilize para testes e não para jogar jogos.\n\nAlterar para gráficos LLE?"
#2056# "Emulação áudio de alto nível" #2056# "Emulação áudio de alto nível"
#2057# "O Áudio HLE requer um plugin de terceiros!!!\nSe não tem um plugin de áudio de terceiros que suporta HLE não irá ouvir o som.\n\nMudar para áudio HLE?" #2057# "O Áudio HLE requer um plugin de terceiros!!!\nSe não tem um plugin de áudio de terceiros que suporta HLE não irá ouvir o som.\n\nAlterar para áudio HLE?"
#2058# "O ficheiro carregado não parece ser uma ROM IPL válida do 64DD.\n\nVerifique as ROMs com o GoodN64." #2058# "O ficheiro carregado não parece ser uma ROM IPL válida do 64DD.\n\nVerifique as ROMs com o GoodN64."
#2059# "Nintendo 64DD ROM IPL Japonesa de retalho não encontrada.\nÉ requerido para jogar imagens de disco da região japonesa do 64DD.\n\nSeleccione a ROM requerida nas Definições." #2059# "Nintendo 64DD ROM IPL Japonesa de retalho não localizada.\nÉ necessário para jogar imagens de disco da região japonesa do 64DD.\n\nSeleccione a ROM requerida nas Definições."
#2061# "Nintendo 64DD ROM IPL Americana de retalho não encontrada.\nÉ requerido para jogar imagens de disco da região americana do 64DD.\n\nSeleccione a ROM requerida nas Definições." #2061# "Nintendo 64DD ROM IPL Americana de retalho não localizada.\nÉ necessário para jogar imagens de disco da região americana do 64DD.\n\nSeleccione a ROM exigida nas Definições."
#2062# "Nintendo 64DD ROM IPL De desenvolvimento não encontrada.\nÉ requerido jogar imagens de disco do 64DD de desenvolvimento.\n\nSeleccione a ROM requerida nas Definições." #2062# "Nintendo 64DD ROM IPL De desenvolvimento não localizada.\nÉ necessário para jogar imagens de disco do 64DD de desenvolvimento.\n\nSeleccione a ROM exigida nas Definições."
#2063# "Falha ao actualizar a batota, é inválida" #2063# "Falha ao actualizar a batota, a mesma é inválida"
#2064# "Batota inválida" #2064# "Batota inválida"
#2065# "Não foi possível ler os bytes de identificação"
#2066# "O ficheiro de imagem é inválido"
#2067# "Não foi possível atribuir espaço para a ROM"
#2068# "Não foi possível abrir a ROM"
/*** Android ***/ /*** Android ***/
#3000# "Definições" #3000# "Definições"
#3001# "Ajuda/Fórum" #3001# "Ajuda/Fórum"
#3002# "Relatar problema" #3002# "Comunicar problema"
#3003# "Acerca" #3003# "Acerca"
#3004# "Jogou recentemente" #3004# "Jogou recentemente"
#3005# "Jogos" #3005# "Jogos"
#3006# "Directório do jogo" #3006# "Directório do jogo"
#3007# "Seleccione uma pasta para analisar" #3007# "Seleccione uma pasta para examinar"
#3008# "Incluir sub-directórios" #3008# "Incluir sub-directórios"
#3009# "Pasta principal" #3009# "Pasta principal"
#3010# "Directórios" #3010# "Directórios"
#3011# "Memória interna" #3011# "Memória interna"
#3012# "A analisar..." #3012# "A examinar..."
#3013# "Aceitar" #3013# "Aceitar"
#3014# "Cancelar" #3014# "Cancelar"
#3015# "Informação" #3015# "Informação"
#3016# "Project64 do Android" #3016# "Project64 para Android"
#3017# "Licença" #3017# "Licença"
#3018# "Revisão" #3018# "Revisão"
#3019# "O Project64 do Android\u2122 é um transporte da versão do windows do Project64. A versão do Android\u2122 consegue executar a maioria dos jogos do N64." #3019# "O Project64 para Android\u2122 é uma portabilidade da versão para Windows do Project64. A versão para Android\u2122 pode executar a maioria dos jogos do N64."
#3020# "Autores do Project64." #3020# "Autores do Project64."
#3021# "Discord" #3021# "Discord"
// In-game menu // In-game menu
#3100# "Definições" #3100# "Definições"
#3101# "Gravar o estado" #3101# "Gravar estado"
#3102# "Carregar o estado" #3102# "Carregar estado"
#3103# "Terminar a emulação" #3103# "Encerrar emulação"
#3104# "Colocar em pausa" #3104# "Pausa"
#3105# "Retomar" #3105# "Retomar"
#3106# "Velocidade do jogo" #3106# "Velocidade do jogo"
#3107# "Gravar o estado actual..." #3107# "Estado da gravação actual..."
#3108# "Automático" #3108# "Automático"
#3109# "Compartimento" #3109# "Compartimento"
#3110# "Repor" #3110# "Repor"
#3111# "Opções de depuração" #3111# "Opções de depuração"
#3112# "Repor os tempos da função" #3112# "Repor tempos da função"
#3113# "Esvaziar os tempos da função" #3113# "Esvaziar tempos da função"
// Video plugin // Video plugin
#3200# "Nativo" #3200# "Nativo"

View File

@ -8297,20 +8297,46 @@ void CX86RecompilerOps::COP1_D_ADD()
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs; uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft; uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
CompileCop1Test(); if (FpuExceptionInRecompiler())
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
{ {
m_Assembler.fadd(asmjit::x86::st0, m_RegWorkingSet.StackPosition(Reg2)); CompileInitFpuOperation(CRegInfo::RoundDefault);
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
m_Assembler.fadd(asmjit::x86::qword_ptr(TempReg));
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
} }
else else
{ {
m_RegWorkingSet.UnMap_FPR(Reg2, true); CompileCop1Test();
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[Reg2], stdstr_f("_FPR_D[%d]", Reg2).c_str()); m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fd, CRegInfo::FPU_Double); if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
m_Assembler.fadd(asmjit::x86::qword_ptr(TempReg)); {
m_Assembler.fadd(asmjit::x86::st0, m_RegWorkingSet.StackPosition(Reg2));
}
else
{
m_RegWorkingSet.UnMap_FPR(Reg2, true);
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[Reg2], stdstr_f("_FPR_D[%d]", Reg2).c_str());
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fd, CRegInfo::FPU_Double);
m_Assembler.fadd(asmjit::x86::qword_ptr(TempReg));
}
} }
} }
@ -8319,31 +8345,57 @@ void CX86RecompilerOps::COP1_D_SUB()
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs; uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft; uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
CompileCop1Test(); if (FpuExceptionInRecompiler())
if (m_Opcode.fd == m_Opcode.ft)
{ {
m_RegWorkingSet.UnMap_FPR(m_Opcode.fd, true); CompileInitFpuOperation(CRegInfo::RoundDefault);
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false); if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[m_Opcode.ft], stdstr_f("_FPR_D[%d]", m_Opcode.ft).c_str()); m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double); m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg)); m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg));
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
} }
else else
{ {
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double); CompileCop1Test();
if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
if (m_Opcode.fd == m_Opcode.ft)
{ {
m_Assembler.fsub(asmjit::x86::st0, m_RegWorkingSet.StackPosition(Reg2)); m_RegWorkingSet.UnMap_FPR(m_Opcode.fd, true);
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[m_Opcode.ft], stdstr_f("_FPR_D[%d]", m_Opcode.ft).c_str());
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg));
} }
else else
{ {
m_RegWorkingSet.UnMap_FPR(Reg2, true); m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
{
m_Assembler.fsub(asmjit::x86::st0, m_RegWorkingSet.StackPosition(Reg2));
}
else
{
m_RegWorkingSet.UnMap_FPR(Reg2, true);
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false); asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[Reg2], stdstr_f("_FPR_D[%d]", Reg2).c_str()); m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[Reg2], stdstr_f("_FPR_D[%d]", Reg2).c_str());
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fd, CRegInfo::FPU_Double); m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fd, CRegInfo::FPU_Double);
m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg)); m_Assembler.fsub(asmjit::x86::qword_ptr(TempReg));
}
} }
} }
} }
@ -8402,39 +8454,86 @@ void CX86RecompilerOps::COP1_D_DIV()
uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs; uint32_t Reg1 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.ft : m_Opcode.fs;
uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft; uint32_t Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
CompileCop1Test(); if (FpuExceptionInRecompiler())
if (m_Opcode.fd == m_Opcode.ft)
{ {
m_RegWorkingSet.UnMap_FPR(m_Opcode.fd, true); CompileInitFpuOperation(CRegInfo::RoundDefault);
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false); if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[m_Opcode.ft], stdstr_f("_FPR_D[%d]", m_Opcode.ft).c_str()); m_RegWorkingSet.RegInStack(m_Opcode.ft, CRegInfo::FPU_Any) ||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double); m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(Reg1, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
TempReg = m_RegWorkingSet.FPRValuePointer(Reg2, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg)); m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg));
m_RegWorkingSet.SetX86Protected(GetIndexFromX86Reg(TempReg), false);
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
} }
else else
{ {
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double); CompileCop1Test();
if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
if (m_Opcode.fd == m_Opcode.ft)
{ {
m_Assembler.fdiv(asmjit::x86::st0, m_RegWorkingSet.StackPosition(Reg2)); m_RegWorkingSet.UnMap_FPR(m_Opcode.fd, true);
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[m_Opcode.ft], stdstr_f("_FPR_D[%d]", m_Opcode.ft).c_str());
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg));
} }
else else
{ {
m_RegWorkingSet.UnMap_FPR(Reg2, true); m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false); if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[Reg2], stdstr_f("_FPR_D[%d]").c_str()); {
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fd, CRegInfo::FPU_Double); m_Assembler.fdiv(asmjit::x86::st0, m_RegWorkingSet.StackPosition(Reg2));
m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg)); }
else
{
m_RegWorkingSet.UnMap_FPR(Reg2, true);
asmjit::x86::Gp TempReg = m_RegWorkingSet.Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.MoveVariableToX86reg(TempReg, (uint8_t *)&m_Reg.m_FPR_D[Reg2], stdstr_f("_FPR_D[%d]").c_str());
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fd, CRegInfo::FPU_Double);
m_Assembler.fdiv(asmjit::x86::qword_ptr(TempReg));
}
} }
} }
} }
void CX86RecompilerOps::COP1_D_ABS() void CX86RecompilerOps::COP1_D_ABS()
{ {
CompileCop1Test(); if (FpuExceptionInRecompiler())
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double); {
m_Assembler.fabs(); CompileInitFpuOperation(CRegInfo::RoundDefault);
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(m_Opcode.fs, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fabs();
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
}
else
{
CompileCop1Test();
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fabs();
}
} }
void CX86RecompilerOps::COP1_D_NEG() void CX86RecompilerOps::COP1_D_NEG()
@ -8446,9 +8545,30 @@ void CX86RecompilerOps::COP1_D_NEG()
void CX86RecompilerOps::COP1_D_SQRT() void CX86RecompilerOps::COP1_D_SQRT()
{ {
CompileCop1Test(); if (FpuExceptionInRecompiler())
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double); {
m_Assembler.fsqrt(); CompileInitFpuOperation(CRegInfo::RoundDefault);
if (m_RegWorkingSet.RegInStack(m_Opcode.fs, CRegInfo::FPU_Any) ||
m_RegWorkingSet.RegInStack(m_Opcode.fd, CRegInfo::FPU_Any))
{
g_Notify->BreakPoint(__FILE__, __LINE__);
return;
}
asmjit::x86::Gp TempReg = m_RegWorkingSet.FPRValuePointer(m_Opcode.fs, CRegInfo::FPU_Double);
CompileCheckFPUInput(TempReg, FpuOpSize_64bit);
m_RegWorkingSet.PrepareFPTopToBe(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fsqrt();
m_Assembler.mov(TempReg, (uint64_t)&m_TempValue64);
m_Assembler.fpuStoreQwordFromX86Reg(m_RegWorkingSet.StackTopPos(), TempReg, false);
CompileCheckFPUResult64(TempReg);
m_RegWorkingSet.SetFPTopAs(m_Opcode.fd);
}
else
{
CompileCop1Test();
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
m_Assembler.fsqrt();
}
} }
void CX86RecompilerOps::COP1_D_MOV() void CX86RecompilerOps::COP1_D_MOV()

View File

@ -287,22 +287,24 @@ void CX86RegInfo::FixRoundModel(FPU_ROUND RoundMethod)
m_Assembler.fpuStoreControl(&m_fpuControl, "m_fpuControl"); m_Assembler.fpuStoreControl(&m_fpuControl, "m_fpuControl");
asmjit::x86::Gp reg = Map_TempReg(x86Reg_Unknown, -1, false, false); asmjit::x86::Gp reg = Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.MoveVariableToX86reg(reg, &m_fpuControl, "m_fpuControl"); m_Assembler.MoveVariableToX86reg(reg, &m_fpuControl, "m_fpuControl");
m_Assembler.and_(reg, 0xF3FF); m_Assembler.and_(reg, 0xF0FF);
uint16_t Precision = 0x200;
if (RoundMethod == RoundDefault) if (RoundMethod == RoundDefault)
{ {
asmjit::x86::Gp RoundReg = Map_TempReg(x86Reg_Unknown, -1, false, false); asmjit::x86::Gp RoundReg = Map_TempReg(x86Reg_Unknown, -1, false, false);
m_Assembler.OrVariableToX86Reg(reg, &CX86RecompilerOps::m_RoundingModeValue, "m_RoundingModeValue"); m_Assembler.OrVariableToX86Reg(reg, &CX86RecompilerOps::m_RoundingModeValue, "m_RoundingModeValue");
m_Assembler.or_(reg, Precision);
SetX86Protected(GetIndexFromX86Reg(RoundReg), false); SetX86Protected(GetIndexFromX86Reg(RoundReg), false);
} }
else else
{ {
switch (RoundMethod) switch (RoundMethod)
{ {
case RoundTruncate: m_Assembler.or_(reg, 0x0C00); break; case RoundTruncate: m_Assembler.or_(reg, 0x0C00 | Precision); break;
case RoundNearest: m_Assembler.or_(reg, 0x0000); break; case RoundNearest: m_Assembler.or_(reg, 0x0000 | Precision); break;
case RoundDown: m_Assembler.or_(reg, 0x0400); break; case RoundDown: m_Assembler.or_(reg, 0x0400 | Precision); break;
case RoundUp: m_Assembler.or_(reg, 0x0800); break; case RoundUp: m_Assembler.or_(reg, 0x0800 | Precision); break;
default: default:
g_Notify->DisplayError("Unknown rounding model"); g_Notify->DisplayError("Unknown rounding model");
} }