Firmwares Philips: Controle das SetasUm mês atrás eu identifiquei as rotinas que exibem as setas do browser e
expliquei aqui como movê-las. Mas ficaram faltando respostas para alguns problemas, que espero ter solucionado agora.
Neste post eu vou introduzir três novas rotinas, temporariamente batizadas por mim por não conhecer nenhum trabalho anterior a respeito no grupo MT13x9:
- ShowIcon - Espera coordenadas X e Y, janela e ícone a ser exibido;
- ClearRect2 - Muito parecida com ClearRect, mas recebe os parâmetros de forma diferente. Enquanto ClearRect espera pelas coordenadas do ponto superior esquerdo do retângulo mais sua largura e altura, ClearRect2 recebe as coordenadas do ponto superior esquerdo e do ponto inferior direito. São duas formas de se fazer a mesma coisa. Deve haver alguma diferença para o firmware optar por usar uma ou outra, mas não captei ainda (exceto a troca dos registradores por endereços XRAM).
- Arrows_Control - A rotina que explico adiante.
Arrows_ControlEsta rotina é responsável pela exibição das setas e é dividida em quatro sub-rotinas:
- Arrows_ShowBoth - Exibe as duas setas;
- Arrows_ShowUp - Exibe apenas a seta superior
- Arrows_ShowDown - Exibe apenas a seta inferior
- Arrows_Clear - Apaga as duas setas;
Arrows_Clear é a principal novidade deste post em relação ao meu post anterior sobre o assunto. Este procedimento desenha um retângulo acima e um retângulo abaixo da lista de arquivos, com o propósito de apagar as setas. O rpoblema é que quando mudamos as coordenadas das setas precisamos mudar as coordenadas desses retângulos também, senão as setas nunca vão ser apagadas quando você chegar no topo ou no fundo da lista de arquivos.
A montagem abaixo mostra meu software MTK Patcher exibindo os dois retângulos criados por Arrows_Clear:
Para encontrar Arrows_Control na maioria dos firmwares Philips (exceto PET725), procure por
02 ? ? 14 70 03 02 ? ? 14 60 03 02. O método que ensinei no post anterior, que requeria saber os números dos ícones com as setas, não é mais necessário.
Eu comentei o código abaixo (DVP5960/37) de forma a ser auto-explicativo:
B1:9E44 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:9E44
B1:9E44
B1:9E44 Arrows_Control: ; CODE XREF: B1_89A3+5Dp
B1:9E44 ; B1_89A3+117p
B1:9E44 EF mov A, R7 ; Esta rotina recebe um valor de 1 a 4 em R7, que determina o que será feito
B1:9E45 54 03 anl A, #3
B1:9E47 FF mov R7, A
B1:9E48 60 44 jz Arrows_Clear ; Se R7 tinha #4
B1:9E4A 14 dec A
B1:9E4B 70 03 jnz B1_9E50
B1:9E4D 02 9E E1 ljmp Arrows_ShowUP ; Se R7 tinha #1
B1:9E50 ; ---------------------------------------------------------------------------
B1:9E50
B1:9E50 B1_9E50: ; CODE XREF: Arrows_Control+7j
B1:9E50 14 dec A
B1:9E51 70 03 jnz B1_9E56
B1:9E53 02 9E FA ljmp Arrows_ShowDown ; Se R7 tinha #2
B1:9E56 ; ---------------------------------------------------------------------------
B1:9E56
B1:9E56 B1_9E56: ; CODE XREF: Arrows_Control+Dj
B1:9E56 14 dec A
B1:9E57 60 03 jz Arrows_ShowBoth ; Se R7 tinha #3
B1:9E59 02 9F 13 ljmp FunctionRET
B1:9E5C ; ---------------------------------------------------------------------------
B1:9E5C
B1:9E5C Arrows_ShowBoth: ; CODE XREF: Arrows_Control+13j
B1:9E5C 90 FC 76 mov DPTR, #XRAM_FC76 ; CoordX1.hiByte
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 ; CoordY1.HiByte
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 ShowIconB1BS
B1:9E75 90 FC 76 mov DPTR, #XRAM_FC76 ; CoordX1.hiByte
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 ; CoordY1.HiByte
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 ShowIconB1BS
B1:9E8E ; ---------------------------------------------------------------------------
B1:9E8E
B1:9E8E Arrows_Clear: ; CODE XREF: Arrows_Control+4j
B1:9E8E 90 FC 76 mov DPTR, #XRAM_FC76 ; CoordX1.hiByte
B1:9E91 E4 clr A
B1:9E92 F0 movx @DPTR, A
B1:9E93 A3 inc DPTR
B1:9E94 74 1E mov A, #0x1E
B1:9E96 F0 movx @DPTR, A
B1:9E97 90 FC 79 mov DPTR, #XRAM_FC79 ; CoordY1.HiByte
B1:9E9A E4 clr A
B1:9E9B F0 movx @DPTR, A
B1:9E9C A3 inc DPTR
B1:9E9D 74 3E mov A, #0x3E ; '>'
B1:9E9F F0 movx @DPTR, A ; Canto Superior Esquerdo= 30,62
B1:9EA0 90 FC 7C mov DPTR, #XRAM_FC7C ; CoordX2.HiByte
B1:9EA3 74 01 mov A, #1
B1:9EA5 F0 movx @DPTR, A
B1:9EA6 A3 inc DPTR
B1:9EA7 74 4A mov A, #0x4A ; 'J'
B1:9EA9 F0 movx @DPTR, A
B1:9EAA 90 FC 80 mov DPTR, #XRAM_FC80 ; CoordY2.HiByte
B1:9EAD E4 clr A
B1:9EAE F0 movx @DPTR, A
B1:9EAF A3 inc DPTR
B1:9EB0 74 5C mov A, #0x5C ; '\'
B1:9EB2 F0 movx @DPTR, A ; Canto Inferior Direito: 330x92
B1:9EB3 D2 75 setb RAM_2E.5
B1:9EB5 E4 clr A
B1:9EB6 90 FB FD mov DPTR, #XRAM_FBFD
B1:9EB9 F0 movx @DPTR, A
B1:9EBA FB mov R3, A
B1:9EBB FD mov R5, A
B1:9EBC 7F 0F mov R7, #0xF
B1:9EBE 12 1D 52 lcall ClearRect2_B1BS ; Apaga a seta superior, desenhando um retângulo em sua posição
B1:9EC1 90 FC 79 mov DPTR, #XRAM_FC79 ; CoordY1.HiByte
B1:9EC4 E4 clr A
B1:9EC5 F0 movx @DPTR, A
B1:9EC6 A3 inc DPTR
B1:9EC7 74 DE mov A, #0xDE ; 'Ì'
B1:9EC9 F0 movx @DPTR, A ; Canto Superior Esquerdo agora é = 30,222
B1:9ECA 90 FC 80 mov DPTR, #XRAM_FC80 ; CoordY2.HiByte
B1:9ECD E4 clr A
B1:9ECE F0 movx @DPTR, A
B1:9ECF A3 inc DPTR
B1:9ED0 74 FC mov A, #0xFC ; '³'
B1:9ED2 F0 movx @DPTR, A ; Canto Inferior Direito agora é: 330x252
B1:9ED3 D2 75 setb RAM_2E.5
B1:9ED5 E4 clr A
B1:9ED6 90 FB FD mov DPTR, #XRAM_FBFD
B1:9ED9 F0 movx @DPTR, A
B1:9EDA FB mov R3, A
B1:9EDB FD mov R5, A
B1:9EDC 7F 0F mov R7, #0xF
B1:9EDE 02 1D 52 ljmp ClearRect2_B1BS ; Apaga a seta inferior
B1:9EE1 ; ---------------------------------------------------------------------------
B1:9EE1
B1:9EE1 Arrows_ShowUP: ; CODE XREF: Arrows_Control+9j
B1:9EE1 90 FC 76 mov DPTR, #XRAM_FC76 ; CoordX1.hiByte
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 ; CoordY1.HiByte
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 ShowIconB1BS
B1:9EFA ; ---------------------------------------------------------------------------
B1:9EFA
B1:9EFA Arrows_ShowDown: ; CODE XREF: Arrows_Control+Fj
B1:9EFA 90 FC 76 mov DPTR, #XRAM_FC76 ; CoordX1.hiByte
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 ; CoordY1.HiByte
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 ShowIconB1BS
B1:9F13
B1:9F13 FunctionRET: ; CODE XREF: Arrows_Control+15j
B1:9F13 22 ret
B1:9F13 ; End of function Arrows_Control
Eu descobri o funcionamento da rotina enquanto implementava a movimentação das setas no MTK Patcher. Eu já fiz isso, mas resta um problema: Por causa da forma como as rotinas são chamadas não é possível colocar as setas em qualquer lugar da tela por enquanto (talvez em um versão futura).
Problema 1: X1, da forma como está escrita a rotina, não pode ser maior que 255, embora X2 possa. Então se eu quiser colocar os ícones no canto direito da tela, tenho que desenhar um retângulo começando na coordenada 255 até eles. Se X1 pudesse ser maior que 255 eu poderia desenha um retângulo da largura exata do ícone.
Problema 2: Nem Y1 nem Y2 podem ser maiores que 255. Assim os ícones precisam ficar mais ou menos nos três quartos superiores da tela.
Os dois problemas podem ser resolvidos através de patches. O Problema 1 é bem simples, mas o Problema 2 requer acréscimo de código.
Como se livrar das setasIsso é o mais simples. No início de Arrows_Control, substitua a instrução
mov por uma
ret, assim:
B1:9E44 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:9E44
B1:9E44
B1:9E44 Arrows_Control: ; CODE XREF: B1_89A3+5Dp
B1:9E44 ; B1_89A3+117p
B1:9E44 22 ret
B1:9E45 54 03 anl A, #3
B1:9E47 FF mov R7, A
B1:9E48 60 44 jz Arrows_Clear ; Se R7 tinha #4
B1:9E4A 14 dec A
B1:9E4B 70 03 jnz B1_9E50
B1:9E4D 02 9E E1 ljmp Arrows_ShowUP ; Se R7 tinha #1
E nada do código será executado. Mas aí é recomendável que você
ative a exibição da scrollbar no firmware, como eu já expliquei.
Isso tudo já foi implementado na próxima versão 0.12 do MTK Patcher.