O problema é que ainda não achei a parte onde mover as setas. Uma boa alternativa sería acomodar as setas na parte direita
da tela (como se fosse parte da barra de rolagem)
É mais fácil do que parece
Philips DVP5960/37
Philips DVP5965K/55
Philips DVP5965/93
Philips DVP5980/12
Philips DVP3040/55
Philips DVP5100- Como localizar as rotinas que exibem as setas no browser
- Como exibir as setas em outro lugar
Isto foi testado em um DVP5960/37 e as rotinas exibidas tem endereços desse aparelho, mas eu chequei os firmwares de todos os outros aparelhos indicados acima e as rotinas são exatamente iguais, em lugares diferentes, com janelas e números de ícones diferentes. Mas as idéias expostas aqui servem facilmente para todos eles.
Encontrar as rotinas é muito fácil, depois que você sabe como as setas são exibidas. Eu vou começar mostrando o jeito mais difícil, que foi o que usei por começar completamente no escuro.
Eu já sabia que as setas eram apenas ícones sendo exibidos (não são desenhadas). Então eu abri o firmware no mtkremaker e procurei pelos números dos respectivos ícones.
- Seta superior: 0x26
- Seta inferior: 0x25
E daí eu parti pro chute: No IDA, pedi para encontrar todas as ocorrências do byte 0x26 no firmware.
A princípio, parece coisa de doido. Eu sabia que teria uma quantidade enorme de respostas, mas eu esperava poder aplicar algum método extra para eliminar as possibilidades, e realmente pude.
Eu já sabia de antemão que as rotinas do browser no DVP5960 estão no banco 1, então eu supus que as rotinas de exibição das setas teriam que estar no mesmo banco. Isso já eliminou um monte de possibilidades, mas ainda assim sobrou muita coisa:
Das 305 ocorrências apenas 40 estavam no banco 1 (destacado em verde).
Eu estava disposto a testar todas as 40, mas não era preciso. Na maioria delas, "26" era parte de uma instrução mais complexa. Em apenas 4 pontos o byte significava mesmo "26" (destacado em vermelho) e destes apenas 3 estavam sendo usado em instruções MOV
Então em todas as três ocorrências com instruções MOV mudei "26" por "25" e, tcham! a seta inferior passou a aparecer também no lugar da superior!
Em mais cinco minutos eu já sabia quais eram os trechos corretos a mudar.
Este bloco é o responsável pela exibição das setas enquanto você se move pelo browser:
B1:9E5C
B1:9E5C Exibe_Setas: ; CODE XREF: B1_9E44+13j
B1:9E5C 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:9E5F E4 clr A
B1:9E60 F0 movx @DPTR, A
B1:9E61 A3 inc DPTR
B1:9E62 74 B4 mov A, #0xB4 ; '¦'
B1:9E64 F0 movx @DPTR, A
B1:9E65 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:9E68 E4 clr A
B1:9E69 F0 movx @DPTR, A
B1:9E6A A3 inc DPTR
B1:9E6B 74 E8 mov A, #0xE8 ; 'Þ'
B1:9E6D F0 movx @DPTR, A
B1:9E6E 7D 25 mov R5, #0x25 ; '%' ; Seta inferior (ver no mtkremaker)
B1:9E70 7F 0F mov R7, #0xF
B1:9E72 12 1E BA lcall B1_BS_235_B3_2D12
B1:9E75 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:9E78 E4 clr A
B1:9E79 F0 movx @DPTR, A
B1:9E7A A3 inc DPTR
B1:9E7B 74 B4 mov A, #0xB4 ; '¦'
B1:9E7D F0 movx @DPTR, A
B1:9E7E 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:9E81 E4 clr A
B1:9E82 F0 movx @DPTR, A
B1:9E83 A3 inc DPTR
B1:9E84 74 36 mov A, #0x36 ; '6'
B1:9E86 F0 movx @DPTR, A
B1:9E87 7D 26 mov R5, #0x26 ; '&' ; Seta superior (ver no mtkremaker)
B1:9E89 7F 0F mov R7, #0xF ; janela
B1:9E8B 02 1E BA ljmp B1_BS_235_B3_2D12
E este bloco é responsável pela exibição inicial das setas
B1:9EE1
B1:9EE1 Config_SetaInferior: ; CODE XREF: B1_9E44+9j
B1:9EE1 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:9EE4 E4 clr A
B1:9EE5 F0 movx @DPTR, A
B1:9EE6 A3 inc DPTR ; XRAM_FC77
B1:9EE7 74 B4 mov A, #0xB4 ; '¦'
B1:9EE9 F0 movx @DPTR, A
B1:9EEA 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:9EED E4 clr A
B1:9EEE F0 movx @DPTR, A
B1:9EEF A3 inc DPTR
B1:9EF0 74 36 mov A, #0x36 ; '6'
B1:9EF2 F0 movx @DPTR, A
B1:9EF3 7D 26 mov R5, #0x26 ; '&' ; Seta inferior
B1:9EF5 7F 0F mov R7, #0xF
B1:9EF7 02 1E BA ljmp B1_BS_235_B3_2D12
B1:9EFA ; ---------------------------------------------------------------------------
B1:9EFA
B1:9EFA Config_SetaSuperior: ; CODE XREF: B1_9E44+Fj
B1:9EFA 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:9EFD E4 clr A
B1:9EFE F0 movx @DPTR, A
B1:9EFF A3 inc DPTR
B1:9F00 74 B4 mov A, #0xB4 ; '¦'
B1:9F02 F0 movx @DPTR, A
B1:9F03 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:9F06 E4 clr A
B1:9F07 F0 movx @DPTR, A
B1:9F08 A3 inc DPTR
B1:9F09 74 E8 mov A, #0xE8 ; 'Þ'
B1:9F0B F0 movx @DPTR, A
B1:9F0C 7D 25 mov R5, #0x25 ; '%' ; Seta superior
B1:9F0E 7F 0F mov R7, #0xF
B1:9F10 12 1E BA lcall B1_BS_235_B3_2D12
B1:9F13
B1:9F13 B1_9F13: ; CODE XREF: B1_9E44+15j
B1:9F13 22 ret
B1:9F13 ; End of function B1_9E44
Para poder deslocar as setas para a direita sem precisar escrever novas rotinas eu usei um pequeno truque.
Basta mudar em quatro lugares (os destacados em vermelho):
E4 clr A
F0 movx @DPTR, A
A3 inc DPTR
74 B4 mov A, #0xB4 ; '¦'
F0 movx @DPTR, A
90 FC 79 mov DPTR, #XRAM_FC79
por
74 02 mov A, #0x2
F0 movx @DPTR, A
A3 inc DPTR
74 10 mov A, #0x10
F0 movx @DPTR, A
A3 inc DPTR
A3 inc DPTR
Isto ocupa a mesma quantidade de bytes. O truque só é possível porque o próximo endereço XRAM carregado na rotina fica a apenas dois endereços de distância, daí fica mais "econômico" carregá-lo com duas instruções INC DPTR (dois bytes) do que uma instrução mov DPTR, # (três bytes).
O resultado foi esse:
Problemas pendentes1) Ao selecionar um MP3 qualquer, a seta inferior está sumindo:
Resolvido! Tinha sido um erro meu ao inserir uma das modificações.
2) Ao mover a seleção para um arquivo diferente do que está tocando, uma faixa das tags é apagada e um grande retângulo à direita do browser também, o que apaga inclusive as duas setas:
O retângulo só é cortado no momento que você se move do arquivo que está tocando para outro ou quando o aparelho salta automaticamente para outra música. Esse problema do retângulo deve ser conhecido e simples de resolver e não tem nada a ver com a movimentação das tags e das setas. Eu estou trabalhando em um firmware "quase" original, daí os problemas.
Resolvido (o retângulo) ! Procure por isso no firmware:
B1:C77D 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:C780 74 01 mov A, #1
B1:C782 F0 movx @DPTR, A
B1:C783 A3 inc DPTR
B1:C784 74 6F mov A, #0x6F ; 'o'
B1:C786 F0 movx @DPTR, A
B1:C787 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:C78A E4 clr A
B1:C78B F0 movx @DPTR, A
B1:C78C A3 inc DPTR
B1:C78D 74 37 mov A, #0x37 ; '7'
B1:C78F F0 movx @DPTR, A
B1:C790 7B B4 mov R3, #0xB4 ; '¦' ; 0xB4: largura
B1:C792 7A 00 mov R2, #0
B1:C794 7D DC mov R5, #0xDC ; '_' ; 0xDC: altura
B1:C796 7C 00 mov R4, #0
B1:C798 7F 0F mov R7, #0xF
B1:C79A 12 1E 54 lcall ClearRect
Para eliminar o apagamento, mude nas linhas em azul:
B4 => 00
DC => 00
Para fazer com que o apagamento seja feito em outras coordenadas (no lugar onde estão as tags, por exemplo), mude as coordenadas nas linhas em vermelho.
3) Ao paginar, o browser é refeito, mas outro pedaço das tags é cortado:
É importante notar que isso só é um problema porque eu estou tentando mudar o comportamento normal do aparelho. O normal é as tags serem completamente apagadas quando não é o arquivo que está tocando que é selecionado. Eu estou tentando manter na tela as tags da música em execução, daí o problema.
Se você ficar satisfeito com o comportamento normal, é só dar um jeito de apagar todas as tags ao mover a barra de seleção. Existe uma rotina que faz isso.
Como localizar as rotinas no seu firmwareEu expliquei o modo difícil, que acabou se tornando um modo bem fácil, mas que requer intuição humana para funcionar. comparando todas as rotinas que olhei, encontrei um modo mais "técnico", que pode ser usado em um patch automático. Procure por:
7D xx 7F yyOnde xx é o número do ícone e yy é o número da janela onde o browser é desenhado. Em todos os firmwares testados, isso leva direto e apenas às rotinas certas.
Se você não souber ainda o número da janela, procure por
7D xx 7FIsso vai retornar mais resultados, mas rapidamente você descartará os errados, porque ocorrem em outros bancos.