Obrigado, pessoal!
Bom, consegui fazer com que as mudanças de alinhamento sejam aplicadas em tempo real, adicionei opção para o alinhamento horizontal também (esquerda e centro) e estou a um passo de adicionar uma opção para posicionamento vertical da legenda. Mas estou esbarrando no problema dos menus ocultos. Antes de mostrar o que está acontecendo, vamos às explicações técnicas do que eu já fiz até agora:
MenusO menu Outros no firmware original era assim (visto com o MTKRemaker, dentro de "code 8032", "page 2"):
5. OTHERS
010B 03 FF2D2A - ROM:2D36
1. PBC
00 0075 0023 003D 01 00 00 FF2CAF 0C3D - ROM:2CB5
=> 1. On
0040 00 - ROM:2CA9
2. Off
0041 01 - ROM:2CAC
2. B.L.E.
00 00D1 0010 0000 01 00 01 FF2CCA 0C6D - ROM:2CD0
1. On
0040 00 - ROM:2CC4
=> 2. Off
0041 01 - ROM:2CC7
3. DivX(R)@VOD
01 0187 0000 0000 00 00 00 000000 0000 - ROM:2D1B
4. Score
00 01C0 0055 0000 01 00 00 FF2BEF 0A39 - ROM:2BF5
=> 1. On
0040 00 - ROM:2BE9
2. Off
0041 01 - ROM:2BEC
A estrutura de menus está no banco 2. Esses menus são cansativos para trabalhar e a estrutura é basicamente a já explicada pelo
Ryan no tópico log de descobertas MT13x9, mas com algumas peculiaridades (acho que de vários LGs). Na segunda linha, temos:
010B 03 FF
2D2A - ROM:
2D36 - isso quer dizer que no offset
#2D36 (#2
2D36) temos o seguinte código:
01 0B 03 FF
2D 2A, sendo que
010B é o código hexa da string "OTHERS", que pode ser visto em Languages (ou com o MTKLangEditor),
03 é a quantidade de submenus, começando em 0 (então serão aguardados 4 submenus) e FF
2D 2A é o ponteiro dos ponteiros dos submenus.
Como são 4 submenus, então teremos quatro ponteiros em #2
2D2A: FF
2C B5 FF 2C D0 FF 2D 1B FF 2B F5. Eles apontam os endereços para ler as configurações de cada submenu. Destaquei o primeiro, FF
2C B5, pois vou pegá-lo como exemplo. Como podemos ver pelo próprio MTKRemaker, em #2
2CB5
teremos:
00
0075 0023 003D
01 00
00 FF
2CAF 0C3D
O primeiro byte ainda não sei o que representa, mas nos submenus normais é sempre 00 (01 no especial DviX Vod e 02 nos travados de senha e código de área).
0075 novamente é o código hexa da string que será o "nome" do submenu, no caso PBC,
0023 é o endereço da EEPROM que guardará valor de retorno da opção escolhida (vai de #0000 a #007F),
01 é a quantidade de opções do submenu, começando em 0 (no caso, temos 2 opções),
00 é o valor padrão que será carregado na EEPROM (corresponde ao valor retornado por uma das opções, então é o que indica a opção padrão) e FF
2CAF é o ponteiro para os ponteiros (acredite, ainda tem mais!) das opções finais. Pelas opções mostradas no texto do MTKRemaker, teremos em #2
2CAF dois ponteiros (são duas opções, como esperado):
FF
2C A9 FF 2C AC
e em #2
2CA9, por exemplo, teremos 0040 00, no que 0040 é o código hexa da string "nome" da opção ("On"), e 00 é valor repassado ao endereço 23 da EEPROM se a opção for escolhida. Como esse valor é o padrão, essa é a opção padrão.
Para fazer as modificações, usei um pouco do espaço que havia no final da estrutura de menus e, principalmente, o espaço no final do bloco 2. O menu Outros ficou assim:
5. OTHERS
010B 07 FF2E3E - ROM:2D36
1. MPEG Subtitle Color
00 01D7 0013 0000 09 00 05 FFFEF1 0C3D - ROM:2E56
1. White
01D9 0C - ROM:FED3
2. Light Gray
01DA 01 - ROM:FED6
3. Gray
01DB 02 - ROM:FED9
=> 4. Yellow
01DC 05 - ROM:FEDC
5. Gold
01DD 08 - ROM:FEDF
6. Sandy Brown
01DE 09 - ROM:FEE2
7. Light Cyan
01DF 0D - ROM:FEE5
8. Sky Blue
01E0 0E - ROM:FEE8
9. Teal
01E1 0F - ROM:FEEB
10. Inverse White
01E2 0B - ROM:FEEE
2. MPEG Subtitle BGR
00 01D8 0012 0000 01 00 00 FFFF15 0C3D - ROM:FF1B
1. On
0040 06 - ROM:FF0F
=> 2. Off
0041 00 - ROM:FF12
3. DivX(R)@VOD
01 0187 0000 0000 00 00 00 000000 0000 - ROM:2D1B
4. MPEG Subtitle V-Alg
00 01E3 0011 0000 01 00 09 FFFF30 0C3D - ROM:FF36
1. Middle-top
01E4 08 - ROM:FF2A
=> 2. Bottom
01E5 09 - ROM:FF2D
5. MPEG Subtitle H-Alg
00 01E6 001B 0000 01 00 81 FFFF4E 0C3D - ROM:FF57
1. Left
01E7 82 - ROM:FF45
=> 2. Center
01E8 81 - ROM:FF48
6. PBC
00 0075 0023 003D 01 00 00 FF2CAF 0C3D - ROM:2CB5
=> 1. On
0040 00 - ROM:2CA9
2. Off
0041 01 - ROM:2CAC
7. B.L.E.
00 00D1 0010 0000 01 00 01 FF2CCA 0C6D - ROM:2CD0
1. On
0040 00 - ROM:2CC4
=> 2. Off
0041 01 - ROM:2CC7
8. Score
00 01C0 0055 0000 01 00 00 FF2BEF 0A39 - ROM:2BF5
=> 1. On
0040 00 - ROM:2BE9
2. Off
0041 01 - ROM:2BEC
A principal mudança na estrutura antiga é indicar a nova quantidade de submenus (07, indicando 8 submenus) e um novo local (#22E3E, final da estrutura de menus) para os ponteiros dos submenus (como aumentaram de 4 para 8, necessitei de um espaço maior para a nova cadeia de ponteiros). Desses 8 ponteiros, 4 continuaram apontando para os endereços anteriores, pois não mudei a estrutura antiga, e 4 passam apontar para novos submenus criados no final do bloco 2, como o das cores das legendas (#2FEF1). E aí vem a trabalheira de criar os próprios submenus, criar novas strings com o MTKLangEditor etc
.
RotinasAgora vejamos as rotinas modificadas. Como o
zeurt ensinou, existem 5 rotinas SubStyle, sendo que a primeira, e somente a primeira, é uma mistura com um tipo de SetMepg4SubtitleParams. O motivo de várias SubStyle o
Ryan já explicou em outro tópico. É devido ao fato de que o estilo das legendas é aplicado não só quando se inicia o filme, mas também quando damos um stop e depois continuamos o filme de onde parou ou quando entramos no setup e voltamos ao filme. Em cada caso, uma rotina SubStyle diferente será chamada. Isso só teria uso se quiséssemos aplicar estilos diferentes em cada caso. Mas, no geral, é um desperdício de código. Bastava uma única rotina e mais 4 chamadas para ela (caso a chamada fosse em outro banco, seria só usar o Bank Switching ensinado pelo
Ryan). Já a parte modificada de SetMepg4SubtitleParams, como está somente na primeira SubStyle, só é executada uma vez. Por isso quando alterávamos o alinhamento vertical no setup do firmware modificado, a alteração só era aplicada caso reiniciássemos o filme. Mas isso não acontece mais. Eu coloquei um Call Bank Switch no final de cada SubStyle para a SetMepg4SubtitleParams modificada, o que faz com que o alinhamento vertical (bem como as futuras opções alinhamento horizontal e ṕosição das legendas, que pretendo incluir no próximo firmware) seja aplicado imediatamente!
.
Assim ficou a primeira SubStyle (que é misturada com SetMepg4SubtitleParams):
...............
...............
...............
B2:DA42 B2_DA42: ; CODE XREF: BankSw_481_B2_DA33+9_j
B2:DA42 7F 02 mov R7, #2
B2:DA44 12 05 AD lcall B2_BS_118_B5_B085
B2:DA47 D2 73 setb RAM_2E.3
B2:DA49 7F 09 mov R7, #9
B2:DA4B 12 05 C5 lcall B2_BS_122_B5_5E3E
B2:DA4E 7F 09 mov R7, #9
B2:DA50 12 05 CB lcall B2_BS_123_B5_49DF
B2:DA53 12 FF 2A lcall apply_subtitle_color_and_background
B2:DA56 00 nop
B2:DA57 00 nop
B2:DA58 00 nop
B2:DA59 00 nop
B2:DA5A 00 nop
B2:DA5B 00 nop
B2:DA5C 00 nop
B2:DA5D 00 nop
B2:DA5E 00 nop
B2:DA5F FD mov R5, A
B2:DA60 7F 09 mov R7, #9
B2:DA62 12 05 E9 lcall B2_BS_128_B5_B84C
B2:DA65 E4 clr A ; inicio SetMepg4SubtitleParams
B2:DA66 90 FB 43 mov DPTR, #XRAM_FB43
B2:DA69 F0 movx @DPTR, A
B2:DA6A A3 inc DPTR
B2:DA6B F0 movx @DPTR, A
B2:DA6C 90 FB 45 mov DPTR, #XRAM_FB45
B2:DA6F F0 movx @DPTR, A
B2:DA70 A3 inc DPTR
B2:DA71 F0 movx @DPTR, A
B2:DA72 90 FB 49 mov DPTR, #XRAM_FB49
B2:DA75 74 02 mov A, #2
B2:DA77 F0 movx @DPTR, A
B2:DA78 A3 inc DPTR
B2:DA79 74 BB mov A, #0xBB ; '¬'
B2:DA7B F0 movx @DPTR, A
B2:DA7C 90 FB 4D mov DPTR, #XRAM_FB4D
B2:DA7F E4 clr A
B2:DA80 F0 movx @DPTR, A
B2:DA81 A3 inc DPTR
B2:DA82 74 AF mov A, #0xAF ; '»'
B2:DA84 F0 movx @DPTR, A
B2:DA85 D2 78 setb RAM_2F.0
B2:DA87 E4 clr A
B2:DA88 90 FC 03 mov DPTR, #XRAM_FC03
B2:DA8B F0 movx @DPTR, A
B2:DA8C FB mov R3, A
B2:DA8D FD mov R5, A
B2:DA8E 7F 09 mov R7, #9
B2:DA90 12 05 D7 lcall B2_BS_125_B5_B94D
B2:DA93 E4 clr A
B2:DA94 FD mov R5, A
B2:DA95 7F 09 mov R7, #9
B2:DA97 12 05 D1 lcall B2_BS_124_B5_CF6B
B2:DA9A 7F 09 mov R7, #9
B2:DA9C 12 05 DD lcall B2_BS_126_B5_C2C6
B2:DA9F 90 FB 43 mov DPTR, #XRAM_FB43
B2:DAA2 E4 clr A
B2:DAA3 F0 movx @DPTR, A
B2:DAA4 A3 inc DPTR
B2:DAA5 74 32 mov A, #0x32 ; '2'
B2:DAA7 F0 movx @DPTR, A
B2:DAA8 90 FB 45 mov DPTR, #XRAM_FB45
B2:DAAB E4 clr A
B2:DAAC F0 movx @DPTR, A
B2:DAAD A3 inc DPTR
B2:DAAE 74 04 mov A, #4
B2:DAB0 F0 movx @DPTR, A
B2:DAB1 90 FB 49 mov DPTR, #XRAM_FB49
B2:DAB4 74 02 mov A, #2
B2:DAB6 F0 movx @DPTR, A
B2:DAB7 A3 inc DPTR
B2:DAB8 74 A8 mov A, #0xA8 ; '¿'
B2:DABA F0 movx @DPTR, A
B2:DABB 90 FB 4D mov DPTR, #XRAM_FB4D
B2:DABE E4 clr A
B2:DABF F0 movx @DPTR, A
B2:DAC0 A3 inc DPTR
B2:DAC1 74 B0 mov A, #0xB0 ; '?'
B2:DAC3 F0 movx @DPTR, A
B2:DAC4 12 FF 69 lcall apply_subtitle_alignment
B2:DAC7 00 nop
B2:DAC8 7F 09 mov R7, #9
B2:DACA 12 0D 45 lcall B2_BS_442_B3_C274
...................
...................
...................
Rotinas apply_subtitle_color_and_background e apply_subtitle_alignment criadas por mim. Elas usam a técnica ensinada pelo
Ryan para ler o conteúdo da EEPROM (que guarda as opções do menu). Vejam que quando se seleciona cor preta para a fonte, o outline é alterado para branco (daí eu ter chamado a cor de branco inverso):
B2:FF66 ; =============== S U B R O U T I N E =======================================
B2:FF66
B2:FF66
B2:FF66 apply_subtitle_color_and_background: ; CODE XREF: BankSw_481_B2_DA33+20_p
B2:FF66 7F 13 mov R7, #0x13
B2:FF68 7E 00 mov R6, #0
B2:FF6A 12 04 03 lcall B2_BS_47_B1_F213 ; le endereco #13 (cor da fonte) da eeprom
B2:FF6D EF mov A, R7
B2:FF6E 64 0B xrl A, #0xB ; é cor preta?
B2:FF70 70 04 jnz black_outline ; se nao, va para contorno preto
B2:FF72 74 0C mov A, #0xC ; se sim, aplica contorno branco
B2:FF74 80 02 sjmp apply_colors ; contorno em #XRAM_FC03
B2:FF76 ; ---------------------------------------------------------------------------
B2:FF76
B2:FF76 black_outline: ; CODE XREF: apply_subtitle_color_and_background+A_j
B2:FF76 74 0B mov A, #0xB
B2:FF78
B2:FF78 apply_colors: ; CODE XREF: apply_subtitle_color_and_background+E_j
B2:FF78 90 FC 03 mov DPTR, #XRAM_FC03 ; contorno em #XRAM_FC03
B2:FF7B F0 movx @DPTR, A
B2:FF7C A3 inc DPTR
B2:FF7D EF mov A, R7
B2:FF7E F0 movx @DPTR, A ; ; cor da fonte em XRAM_FC04
B2:FF7F 7F 12 mov R7, #0x12 ; le endereco #12 (background da legenda) da eeprom
B2:FF81 7E 00 mov R6, #0
B2:FF83 12 04 03 lcall B2_BS_47_B1_F213
B2:FF86 EF mov A, R7
B2:FF87 FB mov R3, A ; Background em R3
B2:FF88 E4 clr A
B2:FF89 22 ret
B2:FF89 ; End of function apply_subtitle_color_and_background
B2:FF89
B2:FF8A
B2:FF8A ; =============== S U B R O U T I N E =======================================
B2:FF8A
B2:FF8A
B2:FF8A apply_subtitle_alignment: ; CODE XREF: BankSw_481_B2_DA33+91_p
B2:FF8A 7F 11 mov R7, #0x11
B2:FF8C 7E 00 mov R6, #0
B2:FF8E 12 04 03 lcall B2_BS_47_B1_F213 ; le endereco #11 (alinhamento vertical) da eeprom
B2:FF91 8F F0 mov B, R7 ; guarda em B para que nao seja alterado
B2:FF93 7F 1B mov R7, #0x1B
B2:FF95 7E 00 mov R6, #0
B2:FF97 12 04 03 lcall B2_BS_47_B1_F213 ; le endereco #1B (alinhamento horizontal) da eeprom
B2:FF9A EF mov A, R7
B2:FF9B FD mov R5, A ; horizontal em R5
B2:FF9C AB F0 mov R3, B ; vertical em R3
B2:FF9E 22 ret
B2:FF9E ; End of function apply_subtitle_alignment
E aqui a modificação básica feita em todas as demais SubStyle:
B4:3ABE 7F 09 mov R7, #9
B4:3AC0 12 05 CB lcall B4_BS_123_B5_49DF
B4:3AC3 90 FF 66 mov DPTR, #0xFF66 ; chama apply_subtitle_color_and_background
B4:3AC6 12 02 58 lcall B4_Bank_2 ; no banco 2
B4:3AC9 FD mov R5, A
B4:3ACA 7F 09 mov R7, #9
B4:3ACC 12 05 E9 lcall B4_BS_128_B5_B84C
B4:3ACF E4 clr A
B4:3AD0 FD mov R5, A
B4:3AD1 7F 09 mov R7, #9
B4:3AD3 12 05 D1 lcall B4_BS_124_B5_CF6B
B4:3AD6 7F 09 mov R7, #9
B4:3AD8 12 05 DD lcall B4_BS_126_B5_C2C6
B4:3ADB 90 DA 65 mov DPTR, #0xDA65 ; chama a SetMepg4SubtitleParams
B4:3ADE 12 02 58 lcall B4_Bank_2 ; no banco 2
B4:3AE1
B4:3AE1 B4_3AE1: ; CODE XREF: B4_39CC:B4_3A85_j
B4:3AE1 ; B4_39CC+D0_j ...
B4:3AE1 00 nop
B4:3AE2 22 ret
A chamada no final ao endereço #2DA65 permite que o alinhamento seja aplicado imediatamente, bem como abre a possibilidade para deslocarmos a legenda para cima.
Mas agora o problema: O menu Outros já está cheio. Para evitar o trabalho de modificar as dimensões das janelas do menu, preferi transferir os submenus PBC e P.L.E. para o menu Display (foi isso que o Br0max fez). Bom, ao fazer isso, tenho o seguinte no MTKRemaker:
2. DISPLAY
00EA 05 FF29B8 - ROM:29CA
1. TV@Aspect
00 00E8 0014 0000 01 00 01 FF294C 0C3D - ROM:2952
1. 4@:@3
00E5 00 - ROM:2946
=> 2. 16@:@9
00E6 01 - ROM:2949
2. Display@Mode
00 0064 0015 002B 01 00 00 FF2967 0C3D - ROM:296D
1. Letterbox
010E 01 - ROM:2964
=> 2. Panscan
010C 00 - ROM:2961
3. Progressive@Scan
00 0072 0047 02C1 03 00 01 FF2988 0C43 - ROM:2994
1. On
0040 00 - ROM:297C
2. YPbPr
017E 02 - ROM:297F
3. VGA
019B 03 - ROM:2982
=> 4. Off
0041 01 - ROM:2985
4. TV@Output@Select
00 0145 0046 02C0 01 00 2D FF2D2A 0C43 - ROM:29A9
1. RGB
0148 6D - ROM:29A3
=> 2. YPbPr
0147 2D - ROM:29A6
5. PBC
00 0075 0023 003D 01 00 00 FF2CAF 0C3D - ROM:2CB5
=> 1. On
0040 00 - ROM:2CA9
2. Off
0041 01 - ROM:2CAC
6. B.L.E.
00 00D1 0010 0000 01 00 01 FF2CCA 0C6D - ROM:2CD0
1. On
0040 00 - ROM:2CC4
=> 2. Off
0041 01 - ROM:2CC7
Tudo funcionaria corretamente, se não fosse o caso de que os submenus 3 e 4 deste menu são ocultos. Por causa disso, a navegação só ficou permitida aos submenus 1 e 2. Do jeito que está aí, o player exibe os submenus 1, 2, 5 e 6 (3 e 4 são ocultos) mas só posso navegar nos 2 primeiros. Caso troque a ordem, por exemplo, jogue PBC e BLE para 3 e 4, eles passam a ficar ocultos, Progressive Scan e TV Output Select passam a ser exibidos, mas a navegação continua só nos 2 primeiros. Seja como for, a navegação está travada nos 2 primeiros itens, o 3º e o 4º itens são ocultos e os demais ficam aparecendo inutilmente. Já li as informações do
Ryan sobre menus ocultos e li as informações do Grupo MT13x89, mas não estou encontrando a rotina que manipula os menus. Acho que só achando essa rotina é que poderemos resolver o problema.
zeurt, você sabe como funcionam esses menus ocultos no DV256K?