Тёмный

BUGS NO SNES E COMO UM ASSEMBLER FUNCIONA? 

Manual do Código
Подписаться 19 тыс.
Просмотров 1,1 тыс.
50% 1

Neste episódio mostro alguns bugs que podem acontecer quando programamos para Snes. Explico como acontece a geração de código no debugger Bass e a razão de alguns bugs acontecerem.
O Snes tem um desafio maior na hora de programar pois a Cpu possuem modos 8 bits e 16 bits, como já mostrei no episódio passado. Devido a esses modos da Cpu o assembler não tem como saber em que modo a Cpu estaria quando ele analisa as instruções.
Portanto ele pode gerar código errado caso a Cpu esteja em modo 8 bits e você colocar uma instrução que gera um código de 16 bits.
No vídeo explico o que fazer para evitar esses problemas.
Esse tipo de coisa não acontece no Mega Drive pois a Cpu do Mega, o Motorola 68000, não tem modos como o Snes. Na 68000 cada instrução é independente.
#assembler #bugs #programação

Наука

Опубликовано:

 

26 окт 2021

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 33   
2 года назад
Página do episódio: www.manualdocodigo.com.br/curso-assembly-snes-mega-parte45/
@hugo-garcia
@hugo-garcia 7 месяцев назад
Nossa veio, que conteúdo incrível, só vi conteúdo assim na gringa como o retro games mechanics. Seu canal é uma gema escondida
@programeaacao7110
@programeaacao7110 2 года назад
O seu conteúdo é fantástico. Não desanime com as poucas views!!!
2 года назад
Olá, obrigado pelo comentário. O RU-vid não divulga muito esses tipos de vídeos técnicos, mas aos poucos vai aumentando. Abraço......
@li82576
@li82576 2 года назад
teu conteúdo é muito foda! keep up the work!
2 года назад
Obrigado apocalipse, abraço......
@carloshenrique-ov5nk
@carloshenrique-ov5nk 2 года назад
incrível, tem um vídeo seu, que ali fiquei impressionado com seu talento. vc pegou um arquivo, e descompilou na unha, sem programa... (acho que diz "descompilar") sucesso amigo. obrigado por compartilhar conhecimento.
2 года назад
Olá Carlos, obrigado pelo comentário. Abraço.....
@itabiritomg
@itabiritomg Год назад
Teve um dia que eu vi um cara explicando um bug muito legal no Super Mário que acontece um negócio parecido. É logo na primeira fase do jogo, tem como fazer o Yoshi comer dois objetos ao mesmo tempo. Fazer isso provoca um buffer overflow que faz uma seção de dados ser interpretada como um opcode, daí, o jogo pula imediatamente para os créditos. É um caso muito legal.
@avisaogames
@avisaogames 2 года назад
Muito bom mano
2 года назад
Opa, obrigado por acompanhar.
@itabiritomg
@itabiritomg Год назад
Douglas, por que as ROMs guardam os dados fragmentados no meio das seções de código? tem um motivo para isso?
@joaovinicius8880
@joaovinicius8880 2 года назад
Valeu, Douglas ! Antes da explicação tentei inferir o que podia estar acontecendo, achei que o byte a esquerda como foi omitido, a CPU pegou "lixo". Cara, muito bom saber o porquê, valeu mesmo. Uma pergunta, usar lda.b, lda.w e etc têm algum custo a mais em relação a lda somente ou é exatamente o mesmo custo ? Abraço
2 года назад
No Snes os ".b" e ".w" é uma sintaxe incluida pelo Bass, e não é da Cpu, como acontece no Mega. Como eu disse no video, colocar .b ou .w só força adicionar parâmetros de 8bits ou 16bits, mas vc ainda vai ter que usar a opção correta de acordo com o modo da Cpu. Custo não tem, pois o assembly vai gerar um lda.
@joaovinicius8880
@joaovinicius8880 2 года назад
@ então, não sei se entendi. Após o assembler terminar a compilação, existirá concretamente somente lda, certo ?
2 года назад
@@joaovinicius8880 Sim, o assembler vai gerar o código do lda com o parâmetro, que pode ser 8bits ou 16bits, dependendo do tamanho que vc coloca na instrução ou se usar .b ou .w. No 65816 cada instrução é 1 byte do opcode mais 0 ou mais bytes para o parâmetro. O tamanho dos parâmetros para várias instruções varia com o modo atual da cpu. Se estiver em modo 8bits o parâmetro tem que ser 8 bits, e se tiver em modo 16 tem que ser 2 bytes. A maioria das instruções aceitam vários modos de endereçamento, então os parâmetros opcode mudam pra cada caso.
@joaovinicius8880
@joaovinicius8880 2 года назад
@ muito obrigado, Douglas ! Abraço
@joaovinicius8880
@joaovinicius8880 2 года назад
Oi Douglas, veja se consegue entender um teste meu por favor. Debuguei uma rom e queria tentar aos poucos pegar todos os trechos dela. Logo no começo dá erro e não entendi o porquê. O código é esse: arch snes.cpu output "rom.sfc", create fill $200000 macro seek(variable offset) { origin ((offset & $7F0000) >> 1) | (offset & $7FFF) base offset } include "header.asm" sei cld clc xce rep #$30 lda #$1fff tcs lda #$1800 tcd pea #$7e7e Dá esse erro aqui error: malformed expression: #$7e7e main.asm:23:1: pea #$7e7e bass: assembly failed Não entendi, achei que era por causa do modo 16 bit, mas mesmo testando rep e sep o erro é o mesmo. Depois mudei o "fill" para o tamanho exato da rom, mas o erro foi o mesmo. Se eu comentar essa linha, dá erro mais a frente na instrução MVN. Testei tanto no bass quanto no cc65 Abraço
2 года назад
O "pea" espera um número, e não pode ter o "#" na frente. A sintaxe é meio estranha, pois ela joga um imediato pra pilha mas não pode colocar o "#" na frente. A lógica pra isso é que a cpu vai empilhar um endereço efetivo que você vai passar como parâmetro, então a sintaxe é de endereço e não de imediado, mesmo se no fim das contas o que vc está empilhando não deixa de ser um imediato. No final confunde tudo, pois tb dá a impressão que a cpu vai pegar o dado lá no endereço passado, como acontece com um "lda $1234" por exemplo. Mas não, no "pea" a cpu empilha o número que está na frente. Analisando a tabela do Bass, temos a seguinte linha pro "pea": pea *16 ;$f4 =a Só tem essa linha, então dá pra ver que não pode ter o "#" na frente. Outros debuggers permitem a sintaxe com "#". Seria trivial colocar isso no Bass, onde é só copiar a linha acima, e colocar um "#" na frente do *. Não colocaram pois a sintaxe oficial é essa.
@joaovinicius8880
@joaovinicius8880 2 года назад
@ perfeito, Douglas ! O debugger do bsnes "deu mole" então ao fazer o disassembly assim. Vou remover o # para testar e te falo. Muito obrigado, Douglas, eu poderia ter testado isso, mas nem me liguei, estou ficando enferrujado 😕
@joaovinicius8880
@joaovinicius8880 2 года назад
​@ testei funcionou ! agora passou a dar erro na linha onde tem o mvn, rsrsrs lda #$0000 tax sta $7e0000 lda #$fffe txy iny mvn $7e,$7e Aqui já estava sem o "#", dai coinferi no bass e a definição é essa mvn *08=*08 ;$54 =a =b, então não coloquei "#" error: malformed expression: mvn $7e,$7e main.asm:138:1: mvn $7e,$7e bass: assembly failed O unico teste que fiz foi retirar a virgula e o segundo "$", ficando assim: mvn $7e7e. Mas enfim, só quis te dar um retorno, deixa que esse mvn vou tentar entender melhor o porquê de não funcionar Muito obrigado meu amigo Abraço
2 года назад
@@joaovinicius8880 Olhe a definição do Bass pra ver o que tem que colocar no lugar da vírgula. Vc tem que colocar dois números de 8 bits, sem o "#", e qual símbolo está entre os dois números? Lembrando que sempre que vc ver uma sintaxe nas tabelas do bass, a sintaxe é o que fica na esquerda do ";", e é tipo uma expressão regular. O que fica na direita do ";" já é algo diferente que tem a ver com a geração do binário. Esses detalhes mudam de assembler pra assembler. No caso da mvn alguns aceita a "," entre os números, mas no bass tem que ser esse símbolo aí que está na definição. Depois me fale se conseguiu.
@joaovinicius8880
@joaovinicius8880 2 года назад
@ funcionou ! Me senti na época de faculdade, hehehe Quem diria que depois de tanto tempo eu me empolgaria assim com programação. Valeu, Douglas !
@michaeljaques5712
@michaeljaques5712 5 месяцев назад
tô jogando bomberme e não consigo salva ! Tem como salva ? o bomberme do nes ?
@Giovani_Avelar_BR
@Giovani_Avelar_BR 2 года назад
Vc já ouviu falar de emulação com precisão de circuito ?
2 года назад
Olá, nunca vi esse termo. Uma implementação em Fpga acho que pode ser chamada de precisão de circuito né. Se for em emulação normal acho que a intenção deve ser pegar as nuances do hardware, como borda de subida e descida dos sinais, o que é interessante quando se quer emular alguns comportamentos de forma precisa. Se tiver algum lugar que tem mais detalhes me passa que eu dou uma olhada.
@Giovani_Avelar_BR
@Giovani_Avelar_BR 2 года назад
@ Ué, postei duas mensagens seguidas aqui, elas estavam visíveis até segundos atrás.
@Giovani_Avelar_BR
@Giovani_Avelar_BR 2 года назад
As mensagens com links estão sumindo, é vc que está removendo as postagens ?
@Giovani_Avelar_BR
@Giovani_Avelar_BR 2 года назад
@ Provavelmente vc deve ter configurado o seu canal para apagar qualquer link externo, eu tinha postado duas matérias que falavam do Gateboy e Metroboy, os dois se baseiam na emulação em nível de portas lógicas.
@Giovani_Avelar_BR
@Giovani_Avelar_BR 2 года назад
@ Caramba !!! Isso não é o uso de engenharia reversa em baixo nível, isso é um nível abissal kkk "Por que o GateBoy é tão lento? O GateBoy simula todas as portas lógicas do chip DMG, uma porta por vez. Adicionar dois valores de 8 bits não é simulado como "a = b + c;", é simulado como oito somadores de 1 bit e oito registradores de 1 bit e toda a lógica de controle que vem junto com ele. Em compilações de depuração, todas as portas também incluem um monte de verificação de erro para verificar se as portas não são lidas antes de serem atualizadas, se os barramentos não estão flutuando, se a simulação sempre se estabiliza e outras coisas assim. O GateBoy também simula todas as fases do clock , não apenas ciclos de clock individuais. Embora você possa ter lido que o Game Boy roda a 1 megahertz, isso não está totalmente correto. O cristal de relógio de 4,19 megahertz alimenta um conjunto de portas AFUR+ALEF+APUK+ADYKque produzem quatro relógios de 1 MHz que estão defasados ​​entre si. Esses relógios são então combinados por lógica adicional para criar sub-relógios de vários padrões e frequências cujas bordas podem estar nas bordas positivas ou negativas do relógio mestre de 4,19 MHz. Portanto, é mais correto dizer que o Game Boy tem um relógio de 8 fases e 1 megahertz. No GateBoy, damos a cada fase uma letra (A a H) e todos os sub-relógios têm um sufixo como este - BALY_xBCDEFGH- o que indica que o relógio gerado pelo portão BALY está alto nas fases B a H. Mesmo com a otimização heróica e toda a verificação de erros desligada no "modo rápido", ainda atingimos apenas 6 a 8 fps em um CPU moderno."
Далее
Modo Absoluto no ASSEMBLY de Snes.
14:01
Просмотров 1,2 тыс.
Os segredos dos cartuchos do SNES: LoRom e HiRom
27:53
Просмотров 2,4 тыс.
Um Modo pouco usado em PROGRAMAÇÃO de MEGA DRIVE.
12:56
Desvendando os segredos dos cartuchos HiROM de SNES
25:18
A Anatomia de um Cartucho: Mapeamento LoRom do SNES
13:35
Criando um projeto em RUST do Zero e explicando TUDO
30:56
Prices & Poco M4 Pro 5G
1:00
Просмотров 272 тыс.
Новодельный ноутбук Pocket386
1:16:17