Compare commits
6 Commits
da1ce99ff6
...
efe5000296
Author | SHA1 | Date |
---|---|---|
Daniel Simpkins | efe5000296 | |
Hugo Carvalho | 10b41dfef0 | |
zilmar | 98b1bddc64 | |
zilmar | 97ec1f533b | |
Daniel Simpkins | a1c465baaf | |
Daniel Simpkins | a2c356f16e |
|
@ -1,19 +1,19 @@
|
|||
// Meta information
|
||||
#1 # "Português" // Language ID
|
||||
#2 # "Hugo Carvalho" // Author
|
||||
#3 # "3.0" // Version
|
||||
#4 # "Novembro, 2022" // Date
|
||||
#1 # "Português (Portugal)" // Language ID
|
||||
#2 # "Hugo Carvalho" // Author
|
||||
#3 # "3.0.1" // Version
|
||||
#4 # "06 de março de 2024" // Date
|
||||
|
||||
/*** Menu ***/
|
||||
|
||||
// File menu
|
||||
#100# "&Ficheiro"
|
||||
#101# "&Abrir a ROM"
|
||||
#101# "&Abrir ROM"
|
||||
#102# "Informação &da ROM..."
|
||||
#103# "Iniciar a emulação"
|
||||
#104# "&Terminar a emulação"
|
||||
#103# "Iniciar emulação"
|
||||
#104# "&Encerrar emulação"
|
||||
#105# "Escolher o directório das ROMs..."
|
||||
#106# "Actualizar a lista das ROMs"
|
||||
#106# "Actualizar lista das ROMs"
|
||||
#107# "ROMs recentes"
|
||||
#108# "Directórios das ROMs recentes"
|
||||
#109# "S&air"
|
||||
|
@ -22,19 +22,19 @@
|
|||
// System menu
|
||||
#120# "&Sistema"
|
||||
#121# "&Reiniciar"
|
||||
#122# "&Colocar em pausa"
|
||||
#122# "&Pausa"
|
||||
#123# "Captura de ecrã"
|
||||
#124# "Limitar o FPS"
|
||||
#124# "Limitar FPS"
|
||||
#125# "&Gravar"
|
||||
#126# "Gravar como..."
|
||||
#127# "&Carregar o estado"
|
||||
#127# "&Carregar estado"
|
||||
#128# "Carregar..."
|
||||
#129# "Gravar o estado a&tual"
|
||||
#129# "Gravar estado ac&tual"
|
||||
#130# "&Batotas..."
|
||||
#131# "Botão GS"
|
||||
#132# "R&etomar"
|
||||
#133# "&Reiniciar leve"
|
||||
#134# "&Reiniciar forçado"
|
||||
#133# "&Reinício leve"
|
||||
#134# "&Reinício forçado"
|
||||
#135# "Trocar &disco"
|
||||
#136# "&Melhorias..."
|
||||
|
||||
|
@ -42,9 +42,9 @@
|
|||
#140# "&Opções"
|
||||
#141# "&Ecrã inteiro"
|
||||
#142# "Sempre na &frente"
|
||||
#143# "&Definições dos Gráficos"
|
||||
#144# "&Definições do Áudio"
|
||||
#145# "&Definições do Controlador"
|
||||
#143# "&Definições dos gráficos"
|
||||
#144# "&Definições do áudio"
|
||||
#145# "&Definições do controlador"
|
||||
#146# "&Definições do RSP"
|
||||
#147# "Mostrar as estatísticas da &CPU"
|
||||
#148# "Defini&ções..."
|
||||
|
@ -58,7 +58,7 @@
|
|||
// Help menu
|
||||
#180# "&Ajuda"
|
||||
#182# "&Acerca do Project 64"
|
||||
#184# "&Site da Web"
|
||||
#184# "&Página da Web"
|
||||
#185# "&Apoiar o Project64"
|
||||
#186# "&Discord"
|
||||
|
||||
|
@ -74,14 +74,14 @@
|
|||
#198# "Compartimento 8"
|
||||
#199# "Compartimento 9"
|
||||
#200# "Compartimento 10"
|
||||
#201# "Compartimento de gravação (%ws) seleccionado"
|
||||
#201# "Compartimento (%ws) seleccionado"
|
||||
|
||||
// Pop-up menu
|
||||
#210# "Jogar o jogo"
|
||||
#211# "Informação da ROM"
|
||||
#212# "Editar as definições do jogo"
|
||||
#213# "Editar as batotas..."
|
||||
#214# "Plugin dos Gráficos"
|
||||
#211# "Informações da ROM"
|
||||
#212# "Editar definições do jogo"
|
||||
#213# "Editar batotas..."
|
||||
#214# "Plugin de gráficos"
|
||||
#215# "Jogar o jogo com o disco"
|
||||
#216# "Escolher melhorias..."
|
||||
|
||||
|
@ -100,18 +100,18 @@
|
|||
|
||||
// Menu descriptions
|
||||
#250# "Abrir uma imagem ROM do N64"
|
||||
#251# "Mostrar informação sobre a imagem carregada"
|
||||
#252# "Iniciar a emulação da imagem ROM carregada"
|
||||
#253# "Parar a emulação da imagem ROM carregada"
|
||||
#251# "Mostrar informações sobre a imagem carregada"
|
||||
#252# "Iniciar emulação da imagem ROM carregada"
|
||||
#253# "Parar emulação da imagem ROM carregada"
|
||||
#254# "Seleccionar o directório das ROMs"
|
||||
#255# "Actualizar a lista das ROMs actuais no explorador de ROMs"
|
||||
#256# "Sair desta aplicação"
|
||||
#257# "Reiniciar a imagem ROM actual (recarregar quaisquer alterações nas definições)"
|
||||
#255# "Actualizar a lista actual das ROMs no explorador de ROMs"
|
||||
#256# "Sair da aplicação"
|
||||
#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"
|
||||
#259# "Gerar uma imagem bitmap do ecrã actual"
|
||||
#260# "Limitar o FPS para a velocidade correta do N64"
|
||||
#261# "Gravar o estado do sistema actual"
|
||||
#262# "Gravar o estado do sistema actual num local seleccionado para o ficheiro"
|
||||
#261# "Gravar o estado actual do sistema"
|
||||
#262# "Gravar o estado actual do sistema num local seleccionado para o ficheiro"
|
||||
#263# "Carregar o estado gravado do sistema"
|
||||
#264# "Escolher um ficheiro do estado gravado do sistema para carregar"
|
||||
#265# "Activar/Desactivar as batotas do Gameshark"
|
||||
|
@ -125,15 +125,15 @@
|
|||
#273# "Mostrar a utilização da CPU pelo emulador dividida sobre recursos diferentes"
|
||||
#274# "Visualizar/Alterar as definições para esta aplicação"
|
||||
#275# "Visualizar o manual da aplicação"
|
||||
#276# "Visualizar as FAQ da aplicação"
|
||||
#278# "Acerca da aplicação e autores"
|
||||
#276# "Visualizar as perguntas frequentes da aplicação"
|
||||
#278# "Acerca da aplicação e dos autores"
|
||||
#277# "Acerca dos autores dos ficheiros de suporte"
|
||||
#279# "Abrir esta imagem ROM previamente aberta"
|
||||
#280# "Escolher este directório como directório das ROMs"
|
||||
#281# "Alterar a aplicação para usar este idioma"
|
||||
#282# "Escolha este local de gravação para o estado gravado"
|
||||
#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"
|
||||
#286# "Editar as batotas do jogo seleccionado"
|
||||
|
||||
|
@ -145,7 +145,7 @@
|
|||
#302# "Boa reputação"
|
||||
#303# "Estado"
|
||||
#304# "Tamanho da ROM"
|
||||
#305# "Notas (core)"
|
||||
#305# "Notas (núcleo)"
|
||||
#306# "Notas (plugins predefinidos)"
|
||||
#307# "Notas (utilizador)"
|
||||
#308# "ID do cartucho"
|
||||
|
@ -158,7 +158,7 @@
|
|||
#315# "Data de lançamento"
|
||||
#316# "Género"
|
||||
#317# "Jogadores"
|
||||
#318# "Forçar o Feedback"
|
||||
#318# "Forçar Feedback"
|
||||
#319# "Formato do ficheiro"
|
||||
#321# "Nome"
|
||||
|
||||
|
@ -166,7 +166,7 @@
|
|||
#320# "Seleccionar o directório actual das ROMs"
|
||||
|
||||
// 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 ***/
|
||||
|
||||
|
@ -184,19 +184,19 @@
|
|||
#409# "Teclas de atalho"
|
||||
#410# "Estado"
|
||||
#411# "Recompilador"
|
||||
#412# "Padrões"
|
||||
#412# "Predefinições"
|
||||
#413# "64DD"
|
||||
#414# "64DD"
|
||||
|
||||
// Plugin dialog
|
||||
#420# "Acerca"
|
||||
#421# " Plugin RSP (Processador do Sinal da Realidade): "
|
||||
#422# " Plugin de Vídeo (gráficos): "
|
||||
#423# " Plugin de Áudio (som): "
|
||||
#424# " Plugin do Controlador (controlador): "
|
||||
#422# " Plugin de vídeo (gráficos): "
|
||||
#423# " Plugin de áudio (som): "
|
||||
#424# " Plugin de entrada (controlador): "
|
||||
#425# "Gráficos HLE"
|
||||
#426# "Áudio HLE"
|
||||
#427# "** Usar o Plugin do Sistema **"
|
||||
#427# "** Usar plugin do sistema **"
|
||||
|
||||
// Directory dialog
|
||||
#440# " Directório dos plugins: "
|
||||
|
@ -216,26 +216,26 @@
|
|||
// Options (general) tab
|
||||
#460# "Interromper a emulação quando a janela não está activa"
|
||||
#461# "Entrar no modo de ecrã inteiro quando carregar uma ROM"
|
||||
#462# "Ocultar as definições avançadas"
|
||||
#463# "Memorizar as batotas seleccionadas"
|
||||
#464# "Desactivar a protecção de ecrã quando executar uma ROM"
|
||||
#465# "Mostrar a velocidade"
|
||||
#466# "Visor da velocidade:"
|
||||
#462# "Ocultar definições avançadas"
|
||||
#463# "Memorizar batotas seleccionadas"
|
||||
#464# "Desactivar protecção de ecrã quando executar uma ROM"
|
||||
#465# "Mostrar velocidade"
|
||||
#466# "Velocidade do ecrã:"
|
||||
#467# "Verificar se o Project64 já está em execução"
|
||||
#468# "Armazenar gravações do jogo em pastas separadas"
|
||||
#469# "Local da ROM 64DD IPL de retalho Japão:"
|
||||
#470# "Local da ROM 64DD IPL de retalho América:"
|
||||
#471# "Local da ROM 64DD IPL de desenvolvimento:"
|
||||
#472# "Tipo de gravação:"
|
||||
#469# "Localização da ROM 64DD IPL de retalho Japão:"
|
||||
#470# "Localização da ROM 64DD IPL de retalho América:"
|
||||
#471# "Localização da ROM 64DD IPL de desenvolvimento:"
|
||||
#472# "Tipo de gravação no disco:"
|
||||
#473# "Activar melhorias"
|
||||
#474# "Mostrar barra de estado"
|
||||
#475# "Sair do ecrã inteiro ao perder o foco"
|
||||
#476# "Activar Discord Rich Presence"
|
||||
#476# "Activar Rich Presence do Discord"
|
||||
|
||||
// ROM browser tab
|
||||
#480# "Máx. # de ROMs memorizadas (0-10):"
|
||||
#480# "Nº máximo # de ROMs memorizadas (0-10):"
|
||||
#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"
|
||||
#484# "Usar explorador de ROMs"
|
||||
#485# "Usar repetição de directório"
|
||||
|
@ -243,21 +243,21 @@
|
|||
#487# "Ordem dos campos:"
|
||||
#488# "Adicionar ->"
|
||||
#489# "<- Remover"
|
||||
#490# "Acima"
|
||||
#491# "Abaixo"
|
||||
#490# "P/ cima"
|
||||
#491# "P/ baixo"
|
||||
#492# "Recarregar o explorador automaticamente"
|
||||
#493# "Mostrar extensão dos ficheiros"
|
||||
|
||||
// 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."
|
||||
#501# "Padrões do core"
|
||||
#502# "Estilo do core da CPU:"
|
||||
#503# "Métodos de auto-modificação"
|
||||
#501# "Predefinições do núcleo"
|
||||
#502# "Estilo do núcleo da CPU:"
|
||||
#503# "Métodos de modificação automática"
|
||||
#504# "Tamanho predefinido da memória:"
|
||||
#505# "Ligação avançada de blocos"
|
||||
#506# "Iniciar a emulação quando a ROM está aberta"
|
||||
#505# "Ligação avançada dos blocos"
|
||||
#506# "Iniciar a emulação quando a ROM for aberta"
|
||||
#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"
|
||||
#510# "Cache"
|
||||
#511# "DMA do PI"
|
||||
|
@ -272,11 +272,11 @@
|
|||
#522# "Tamanho da memória:"
|
||||
#523# "Ligação avançada dos blocos"
|
||||
#524# "Tipo da gravação predefinida:"
|
||||
#525# "Contra fator:"
|
||||
#525# "Contrafator:"
|
||||
#526# "Buffer de compilação maior"
|
||||
#528# "Caching de registo"
|
||||
#528# "Registar armazenamento em cache"
|
||||
#529# "Atrasar a interrupção do SI"
|
||||
#530# "SP Rápido"
|
||||
#530# "SP rápido"
|
||||
#531# "Predefinido"
|
||||
#532# "Sinal de áudio do RSP"
|
||||
#533# "Temporização do áudio fixo"
|
||||
|
@ -284,14 +284,17 @@
|
|||
#535# "Método de auto-modificação personalizado"
|
||||
#536# "Sincronizar usando o áudio"
|
||||
#537# "Contagem de AIs por byte:"
|
||||
#538# "Engine de 32 bits"
|
||||
#538# "Mecanismo de 32 bits"
|
||||
#539# "Atrasar a interrupção do DP"
|
||||
#5400# "Modificador overclock:"
|
||||
#5400# "Modificador de overclock:"
|
||||
#5410# "DMA desalinhado"
|
||||
#5420# "Aleatorizar as interrupções SI/PI"
|
||||
#5440# "Tempo de busca em disco:"
|
||||
#5440# "Tempo de busca no disco:"
|
||||
#5441# "Turbo"
|
||||
#5442# "Lento"
|
||||
#5443# "Tamanho da memória (conhecido):"
|
||||
#5444# "Tamanho da memória (desconhecido):"
|
||||
#5445# "Cache do registo do FPU"
|
||||
|
||||
// Core styles
|
||||
#540# "Interpretador"
|
||||
|
@ -301,11 +304,11 @@
|
|||
// Self-mod methods
|
||||
#560# "Nenhum"
|
||||
#561# "Cache"
|
||||
#562# "Proteger a memória"
|
||||
#563# "Verificar a memória e cache"
|
||||
#564# "Alterar a memória e cache"
|
||||
#565# "Verificar o avanço da memória"
|
||||
#566# "Limpar o código no cache"
|
||||
#562# "Proteger memória"
|
||||
#563# "Verificar memória e cache"
|
||||
#564# "Alterar memória e cache"
|
||||
#565# "Verificar avanço da memória"
|
||||
#566# "Limpar código no cache"
|
||||
|
||||
// Function lookup method
|
||||
#570# "Tabela de procura física"
|
||||
|
@ -313,8 +316,8 @@
|
|||
#572# "Alterar memória"
|
||||
|
||||
// RDRAM size
|
||||
#580# "4 MBs"
|
||||
#581# "8 MBs"
|
||||
#580# "4 MB"
|
||||
#581# "8 MB"
|
||||
|
||||
// Advanced block linking
|
||||
#600# "Ligado"
|
||||
|
@ -338,7 +341,7 @@
|
|||
#682# "Teclas actuais:"
|
||||
#683# "Seleccionar nova tecla de atalho:"
|
||||
#684# "Actualmente atribuído a:"
|
||||
#685# "Designar"
|
||||
#685# "Atribuir"
|
||||
#686# "Remover"
|
||||
#687# "Repor tudo"
|
||||
#688# "O jogo não está em execução"
|
||||
|
@ -369,7 +372,7 @@
|
|||
/*** ROM information ***/
|
||||
|
||||
// ROM info title
|
||||
#800# "Informação da ROM"
|
||||
#800# "Informações da ROM"
|
||||
|
||||
// ROM info text
|
||||
#801# "Nome da ROM:"
|
||||
|
@ -410,7 +413,7 @@
|
|||
|
||||
// Digital value
|
||||
#1016# "Dígito da quantidade"
|
||||
#1017# "Escolha um valor pra:"
|
||||
#1017# "Escolha um valor para:"
|
||||
#1018# "&Valor"
|
||||
#1019# "de"
|
||||
#1020# "até"
|
||||
|
@ -422,9 +425,9 @@
|
|||
#1026# "<valor> <rótulo>"
|
||||
|
||||
// Edit cheat
|
||||
#1027# "Editar a batota"
|
||||
#1028# "Actualizar a batota"
|
||||
#1029# "A batota foi alterada.\n\nDeseja actualizar?"
|
||||
#1027# "Editar batota"
|
||||
#1028# "Actualizar batota"
|
||||
#1029# "A batota foi alterada.\n\nPretende actualizar?"
|
||||
#1030# "Batota actualizada"
|
||||
|
||||
// Cheat pop-up menu
|
||||
|
@ -443,7 +446,7 @@
|
|||
/*** Support window ***/
|
||||
|
||||
#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"
|
||||
#1203# "Apoiar o Project64"
|
||||
#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"
|
||||
#1207# "Obrigado"
|
||||
#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"
|
||||
#1211# "Cancelar"
|
||||
#1212# "Requisitar código"
|
||||
#1212# "Solicitar código"
|
||||
#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 ***/
|
||||
|
||||
|
@ -466,8 +469,8 @@
|
|||
|
||||
#2000# "*** CPU EM PAUSA ***"
|
||||
#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."
|
||||
#2003# "Falha na atribuição de memória"
|
||||
#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 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."
|
||||
#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."
|
||||
|
@ -476,7 +479,7 @@
|
|||
#2009# "Falha ao carregar a palavra.\n\Verifique a ROM e as suas definições."
|
||||
#2010# "Falha ao abrir o ficheiro gravado"
|
||||
#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"
|
||||
#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."
|
||||
|
@ -492,13 +495,13 @@
|
|||
#2025# "Erro"
|
||||
#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"
|
||||
#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?"
|
||||
#2029# "Mudar os plugins"
|
||||
#2030# "Emulação terminada"
|
||||
#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# "Alterar plugins"
|
||||
#2030# "Emulação encerrada"
|
||||
#2031# "Emulação iniciada"
|
||||
#2032# "Não foi possível carregar o estado"
|
||||
#2033# "Estado carregado"
|
||||
#2034# "Gravou o estado actual em"
|
||||
#2034# "Estado actual gravado em"
|
||||
#2035# "Compartimento do estado"
|
||||
#2036# "Imagem da troca dos bytes"
|
||||
#2037# "A escolher a imagem do N64"
|
||||
|
@ -508,67 +511,71 @@
|
|||
#2041# "Eliminar isto?"
|
||||
#2042# "Eliminar batota"
|
||||
#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"
|
||||
#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"
|
||||
#2048# "O atalho foi designado a outro item do menu."
|
||||
#2049# "Nenhum atalho foi seleccionado para ser removido."
|
||||
#2050# "ROM carregada. À espera 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."
|
||||
#2050# "ROM carregada. A aguardar que a emulação inicie."
|
||||
#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"
|
||||
#2053# "Falha ao localizar o nome do ficheiro no ficheiro 7z"
|
||||
#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"
|
||||
#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."
|
||||
#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."
|
||||
#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."
|
||||
#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."
|
||||
#2063# "Falha ao actualizar a batota, é inválida"
|
||||
#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 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 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, a mesma é 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 ***/
|
||||
|
||||
#3000# "Definições"
|
||||
#3001# "Ajuda/Fórum"
|
||||
#3002# "Relatar problema"
|
||||
#3002# "Comunicar problema"
|
||||
#3003# "Acerca"
|
||||
#3004# "Jogou recentemente"
|
||||
#3005# "Jogos"
|
||||
#3006# "Directório do jogo"
|
||||
#3007# "Seleccione uma pasta para analisar"
|
||||
#3007# "Seleccione uma pasta para examinar"
|
||||
#3008# "Incluir sub-directórios"
|
||||
#3009# "Pasta principal"
|
||||
#3010# "Directórios"
|
||||
#3011# "Memória interna"
|
||||
#3012# "A analisar..."
|
||||
#3012# "A examinar..."
|
||||
#3013# "Aceitar"
|
||||
#3014# "Cancelar"
|
||||
#3015# "Informação"
|
||||
#3016# "Project64 do Android"
|
||||
#3016# "Project64 para Android"
|
||||
#3017# "Licença"
|
||||
#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."
|
||||
#3021# "Discord"
|
||||
|
||||
// In-game menu
|
||||
#3100# "Definições"
|
||||
#3101# "Gravar o estado"
|
||||
#3102# "Carregar o estado"
|
||||
#3103# "Terminar a emulação"
|
||||
#3104# "Colocar em pausa"
|
||||
#3101# "Gravar estado"
|
||||
#3102# "Carregar estado"
|
||||
#3103# "Encerrar emulação"
|
||||
#3104# "Pausa"
|
||||
#3105# "Retomar"
|
||||
#3106# "Velocidade do jogo"
|
||||
#3107# "Gravar o estado actual..."
|
||||
#3107# "Estado da gravação actual..."
|
||||
#3108# "Automático"
|
||||
#3109# "Compartimento"
|
||||
#3110# "Repor"
|
||||
#3111# "Opções de depuração"
|
||||
#3112# "Repor os tempos da função"
|
||||
#3113# "Esvaziar os tempos da função"
|
||||
#3112# "Repor tempos da função"
|
||||
#3113# "Esvaziar tempos da função"
|
||||
|
||||
// Video plugin
|
||||
#3200# "Nativo"
|
||||
|
|
|
@ -195,6 +195,7 @@ enum LanguageStringID
|
|||
RB_FORCE_FEEDBACK = 318,
|
||||
RB_FILE_FORMAT = 319,
|
||||
RB_NAME = 321,
|
||||
RB_PLAYTIME = 3114,
|
||||
|
||||
// Select ROM
|
||||
SELECT_ROM_DIR = 320,
|
||||
|
|
|
@ -145,6 +145,7 @@ void CLanguage::LoadDefaultStrings(void)
|
|||
DEF_STR(RB_FORCE_FEEDBACK, "Force Feedback");
|
||||
DEF_STR(RB_FILE_FORMAT, "File Format");
|
||||
DEF_STR(RB_NAME, "Name");
|
||||
DEF_STR(RB_PLAYTIME, "Playtime");
|
||||
|
||||
// Select ROM
|
||||
DEF_STR(SELECT_ROM_DIR, "Select current ROM directory");
|
||||
|
|
|
@ -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 Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
||||
|
||||
CompileCop1Test();
|
||||
|
||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
||||
if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
|
||||
if (FpuExceptionInRecompiler())
|
||||
{
|
||||
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
|
||||
{
|
||||
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));
|
||||
CompileCop1Test();
|
||||
|
||||
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));
|
||||
}
|
||||
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 Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
||||
|
||||
CompileCop1Test();
|
||||
|
||||
if (m_Opcode.fd == m_Opcode.ft)
|
||||
if (FpuExceptionInRecompiler())
|
||||
{
|
||||
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);
|
||||
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.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
|
||||
{
|
||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
||||
if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
|
||||
CompileCop1Test();
|
||||
|
||||
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
|
||||
{
|
||||
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);
|
||||
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.fsub(asmjit::x86::qword_ptr(TempReg));
|
||||
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.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 Reg2 = m_Opcode.ft == m_Opcode.fd ? m_Opcode.fs : m_Opcode.ft;
|
||||
|
||||
CompileCop1Test();
|
||||
|
||||
if (m_Opcode.fd == m_Opcode.ft)
|
||||
if (FpuExceptionInRecompiler())
|
||||
{
|
||||
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);
|
||||
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.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
|
||||
{
|
||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
||||
if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
|
||||
CompileCop1Test();
|
||||
|
||||
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
|
||||
{
|
||||
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));
|
||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, Reg1, CRegInfo::FPU_Double);
|
||||
if (m_RegWorkingSet.RegInStack(Reg2, CRegInfo::FPU_Double))
|
||||
{
|
||||
m_Assembler.fdiv(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]").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()
|
||||
{
|
||||
CompileCop1Test();
|
||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
|
||||
m_Assembler.fabs();
|
||||
if (FpuExceptionInRecompiler())
|
||||
{
|
||||
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()
|
||||
|
@ -8446,9 +8545,30 @@ void CX86RecompilerOps::COP1_D_NEG()
|
|||
|
||||
void CX86RecompilerOps::COP1_D_SQRT()
|
||||
{
|
||||
CompileCop1Test();
|
||||
m_RegWorkingSet.Load_FPR_ToTop(m_Opcode.fd, m_Opcode.fs, CRegInfo::FPU_Double);
|
||||
m_Assembler.fsqrt();
|
||||
if (FpuExceptionInRecompiler())
|
||||
{
|
||||
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()
|
||||
|
|
|
@ -287,22 +287,24 @@ void CX86RegInfo::FixRoundModel(FPU_ROUND RoundMethod)
|
|||
m_Assembler.fpuStoreControl(&m_fpuControl, "m_fpuControl");
|
||||
asmjit::x86::Gp reg = Map_TempReg(x86Reg_Unknown, -1, false, false);
|
||||
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)
|
||||
{
|
||||
asmjit::x86::Gp RoundReg = Map_TempReg(x86Reg_Unknown, -1, false, false);
|
||||
m_Assembler.OrVariableToX86Reg(reg, &CX86RecompilerOps::m_RoundingModeValue, "m_RoundingModeValue");
|
||||
m_Assembler.or_(reg, Precision);
|
||||
SetX86Protected(GetIndexFromX86Reg(RoundReg), false);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (RoundMethod)
|
||||
{
|
||||
case RoundTruncate: m_Assembler.or_(reg, 0x0C00); break;
|
||||
case RoundNearest: m_Assembler.or_(reg, 0x0000); break;
|
||||
case RoundDown: m_Assembler.or_(reg, 0x0400); break;
|
||||
case RoundUp: m_Assembler.or_(reg, 0x0800); break;
|
||||
case RoundTruncate: m_Assembler.or_(reg, 0x0C00 | Precision); break;
|
||||
case RoundNearest: m_Assembler.or_(reg, 0x0000 | Precision); break;
|
||||
case RoundDown: m_Assembler.or_(reg, 0x0400 | Precision); break;
|
||||
case RoundUp: m_Assembler.or_(reg, 0x0800 | Precision); break;
|
||||
default:
|
||||
g_Notify->DisplayError("Unknown rounding model");
|
||||
}
|
||||
|
|
|
@ -44,6 +44,7 @@ CRomList::CRomList() :
|
|||
m_NotesIniFile = new CIniFile(g_Settings->LoadStringVal(SupportFile_Notes).c_str());
|
||||
m_ExtIniFile = new CIniFile(g_Settings->LoadStringVal(SupportFile_ExtInfo).c_str());
|
||||
m_RomIniFile = new CIniFile(g_Settings->LoadStringVal(SupportFile_RomDatabase).c_str());
|
||||
m_PlaytimeFile = std::make_unique<CIniFile>(g_Settings->LoadStringVal(SupportFile_Playtime).c_str());
|
||||
#ifdef _WIN32
|
||||
m_ZipIniFile = new CIniFile(g_Settings->LoadStringVal(RomList_7zipCache).c_str());
|
||||
#endif
|
||||
|
@ -89,6 +90,20 @@ CRomList::~CRomList()
|
|||
WriteTrace(TraceRomList, TraceVerbose, "Done");
|
||||
}
|
||||
|
||||
uint32_t CRomList::LoadPlaytime(const std::string & RomIniKey)
|
||||
{
|
||||
return m_PlaytimeFile->GetNumber(RomIniKey.c_str(), "Playtime", 0);
|
||||
}
|
||||
|
||||
void CRomList::SavePlaytime(uint32_t ElapsedPlaytime)
|
||||
{
|
||||
auto RomIniKey = g_Settings->LoadStringVal(Game_IniKey);
|
||||
auto CurrentPlaytime = LoadPlaytime(RomIniKey);
|
||||
auto RomGoodName = g_Settings->LoadStringVal(Rdb_GoodName);
|
||||
m_PlaytimeFile->SaveString(RomIniKey.c_str(), "Name", RomGoodName.c_str());
|
||||
m_PlaytimeFile->SaveNumber(RomIniKey.c_str(), "Playtime", CurrentPlaytime + ElapsedPlaytime);
|
||||
}
|
||||
|
||||
void CRomList::RefreshRomList(void)
|
||||
{
|
||||
if (m_RefreshThread.isRunning())
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
#pragma once
|
||||
|
||||
#include <Common/IniFile.h>
|
||||
#include <Common/StdString.h>
|
||||
#include <Common/Thread.h>
|
||||
#include <Common/md5.h>
|
||||
#include <Common/path.h>
|
||||
#include <Project64-core/N64System/N64Types.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class CRomList
|
||||
{
|
||||
|
@ -51,6 +54,9 @@ public:
|
|||
void RefreshRomList(void);
|
||||
void LoadRomList(void);
|
||||
|
||||
uint32_t LoadPlaytime(const std::string & RomIniKey);
|
||||
void SavePlaytime(uint32_t ElapsedPlaytime);
|
||||
|
||||
protected:
|
||||
typedef std::vector<ROM_INFO> ROMINFO_LIST;
|
||||
|
||||
|
@ -87,6 +93,7 @@ private:
|
|||
CIniFile * m_NotesIniFile;
|
||||
CIniFile * m_ExtIniFile;
|
||||
CIniFile * m_RomIniFile;
|
||||
std::unique_ptr<CIniFile> m_PlaytimeFile;
|
||||
#ifdef _WIN32
|
||||
CIniFile * m_ZipIniFile;
|
||||
#endif
|
||||
|
|
|
@ -80,6 +80,8 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory)
|
|||
AddHandler(Cmd_ComboDiskFile, new CSettingTypeTempString(""));
|
||||
|
||||
// Support files
|
||||
AddHandler(SupportFile_Playtime, new CSettingTypeApplicationPath("Settings", "Playtime", SupportFile_PlaytimeDefault));
|
||||
AddHandler(SupportFile_PlaytimeDefault, new CSettingTypeRelativePath("Config", "Playtime.rdn"));
|
||||
AddHandler(SupportFile_SettingsDirectory, new CSettingTypeTempString(""));
|
||||
AddHandler(SupportFile_Settings, new CSettingTypeApplicationPath("Settings", "ConfigFile", SupportFile_SettingsDefault));
|
||||
AddHandler(SupportFile_SettingsDefault, new CSettingTypeRelativePath("Config", "Project64.cfg"));
|
||||
|
|
|
@ -18,6 +18,8 @@ enum SettingID
|
|||
Cmd_ShowHelp,
|
||||
|
||||
// Support files
|
||||
SupportFile_Playtime,
|
||||
SupportFile_PlaytimeDefault,
|
||||
SupportFile_SettingsDirectory,
|
||||
SupportFile_Settings,
|
||||
SupportFile_SettingsDefault,
|
||||
|
|
|
@ -227,10 +227,22 @@ void CMainGui::GamePaused(CMainGui * Gui)
|
|||
Gui->RefreshMenu();
|
||||
}
|
||||
|
||||
void CMainGui::SavePlaytime()
|
||||
{
|
||||
if (m_CurrentPlaytime.second)
|
||||
{
|
||||
auto Now = std::chrono::steady_clock::now();
|
||||
auto ElapsedPlaytime = std::chrono::duration_cast<std::chrono::seconds>(Now - m_CurrentPlaytime.first).count();
|
||||
CRomList::SavePlaytime(static_cast<uint32_t>(ElapsedPlaytime));
|
||||
m_CurrentPlaytime.second = false;
|
||||
}
|
||||
}
|
||||
|
||||
void CMainGui::GameCpuRunning(CMainGui * Gui)
|
||||
{
|
||||
if (g_Settings->LoadBool(GameRunning_CPU_Running))
|
||||
{
|
||||
Gui->m_CurrentPlaytime = {std::chrono::steady_clock::now(), true};
|
||||
Gui->MakeWindowOnTop(UISettingsLoadBool(UserInterface_AlwaysOnTop));
|
||||
Gui->HideRomList();
|
||||
if (UISettingsLoadBool(Setting_AutoFullscreen))
|
||||
|
@ -251,6 +263,7 @@ void CMainGui::GameCpuRunning(CMainGui * Gui)
|
|||
}
|
||||
else
|
||||
{
|
||||
Gui->SavePlaytime();
|
||||
if (Gui->m_CheatsUI.m_hWnd != nullptr)
|
||||
{
|
||||
Gui->m_CheatsUI.SendMessage(WM_COMMAND, MAKELONG(IDCANCEL, 0));
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <Project64/UserInterface/EnhancementUI.h>
|
||||
#include <Project64/UserInterface/ProjectSupport.h>
|
||||
#include <Project64/UserInterface/RomBrowser.h>
|
||||
#include <chrono>
|
||||
|
||||
class CGfxPlugin; // Plugin that controls the rendering
|
||||
class CAudioPlugin; // Plugin for audio, need the hwnd
|
||||
|
@ -119,6 +120,7 @@ private:
|
|||
void AddRecentRom(const char * ImagePath);
|
||||
void SetWindowCaption(const wchar_t * Caption);
|
||||
void ShowRomBrowser(void);
|
||||
void SavePlaytime(void);
|
||||
|
||||
static LRESULT CALLBACK MainGui_Proc(HWND, DWORD, WPARAM, LPARAM);
|
||||
|
||||
|
@ -156,4 +158,6 @@ private:
|
|||
bool m_SaveRomBrowserPos;
|
||||
LONG m_SaveRomBrowserTop;
|
||||
LONG m_SaveRomBrowserLeft;
|
||||
|
||||
std::pair<std::chrono::steady_clock::time_point, bool> m_CurrentPlaytime;
|
||||
};
|
||||
|
|
|
@ -59,6 +59,7 @@ void CRomBrowser::GetFieldInfo(ROMBROWSER_FIELDS_LIST & Fields, bool UseDefault
|
|||
AddField(Fields, "Players", -1, RB_Players, 100, RB_PLAYERS, UseDefault);
|
||||
AddField(Fields, "Force Feedback", -1, RB_ForceFeedback, 100, RB_FORCE_FEEDBACK, UseDefault);
|
||||
AddField(Fields, "File Format", -1, RB_FileFormat, 100, RB_FILE_FORMAT, UseDefault);
|
||||
AddField(Fields, "Playtime", -1, RB_Playtime, 200, RB_PLAYTIME, UseDefault);
|
||||
}
|
||||
|
||||
int32_t CRomBrowser::CalcSortPosition(uint32_t lParam)
|
||||
|
@ -845,6 +846,13 @@ void CRomBrowser::RomList_GetDispInfo(LPARAM pnmh)
|
|||
default: swprintf(lpdi->item.pszText, lpdi->item.cchTextMax / sizeof(wchar_t), L"Unknown (%X)", pRomInfo->FileFormat); break;
|
||||
}
|
||||
break;
|
||||
case RB_Playtime:
|
||||
{
|
||||
auto RomIdent = stdstr_f("%08X-%08X-C:%X", pRomInfo->CRC1, pRomInfo->CRC2, pRomInfo->Country);
|
||||
auto Playtime = LoadPlaytime(RomIdent);
|
||||
swprintf(lpdi->item.pszText, lpdi->item.cchTextMax / sizeof(wchar_t), L"%02d:%02d:%02d", Playtime / 3600, (Playtime / 60) % 60, Playtime % 60);
|
||||
break;
|
||||
}
|
||||
default: wcsncpy(lpdi->item.pszText, L" ", lpdi->item.cchTextMax);
|
||||
}
|
||||
if (lpdi->item.pszText == nullptr || wcslen(lpdi->item.pszText) == 0)
|
||||
|
|
|
@ -146,6 +146,7 @@ private:
|
|||
RB_Players = 18,
|
||||
RB_ForceFeedback = 19,
|
||||
RB_FileFormat = 20,
|
||||
RB_Playtime = 21,
|
||||
};
|
||||
|
||||
enum
|
||||
|
|
Loading…
Reference in New Issue