Continue, o mais fácil acabou! E agora para o mais difícil e interessante. Se você estiver com preguiça de ler, abaixo (mais perto do final do artigo), haverá um link para o vídeo, com o resultado e a explicação de tudo, incluindo o que está descrito na primeira parte. Se você estiver interessado, siga a seguir.
No modo de 6 botões, a leitura ocorre em 4 ciclos ou fases (se expresso no idioma do emulador). Ou seja, a cada 16 ms, há uma alteração cíclica (4 ciclos) no estado da saída Select, e a cada quarto ciclo na saída do controlador aparece o estado dos botões adicionais. Abaixo está um gráfico de leitura, para maior clareza, que deve ser repetido:

É bom que eu tenha um analisador lógico, com a ajuda do qual peguei um bug, que se manifestou no fato de que o ciclo não saiu da quarta fase.
Eu não vou dar a volta, vou dar imediatamente uma lista desta função:
static u32 read_pad_6btn(int i, u32 out_bits) { u32 pad = ~PicoIn.padInt[i];
Vamos analisar qualquer uma das condições, por exemplo:
if (i == 0 && phase == 1 && !(out_bits & 0x40))
Aqui, verifica-se que estamos lendo do primeiro gamepad
(i == 0) , da segunda
fase de leitura
(fase == 1) e da saída Select deve ser definida como 0
! (Out_bits & 0x40) . Para entender como isso funciona no emulador, compilei o código no Xubuntu e o Visual Studio Code, definindo vários pontos de interrupção, executou o código no modo de depuração. O resultado é uma imagem tão bonita:

Na verdade, o resultado do trabalho é:
Aqui devo dizer algumas palavras sobre o próprio emulador. Ou não descobri ou isso é um bug, mas o emulador é carregado inicialmente no modo de 3 botões, mesmo que o oposto seja indicado nas configurações globais. Para 99% dos jogos, isso é suficiente. Para entrar no modo de operação com um gamepad de 6 botões, você precisa entrar nas configurações e voltar ao jogo sem alterar nada.
Mas há um jogo que está fora desse contexto: Lost Vikings, os botões X, Z, MODE funcionam bem nele, sem dança.
PSMas você pode fazer isso ainda mais fácil, uma pessoa amável já escreveu um
driver para trabalhar com um gamepad e em um nível muito baixo. Eu ainda estou longe disso.
Obrigado pela atenção!