-
Para não entulhar meu blog com informação bruta e que de qualquer forma a maioria dos meus leitores não vai entender, mas que pode interessar muito quem modifica firmwares Mediatek, eu vou de vez em quando colocar neste tópico informações sobre trechos de código encontrados nos firmwares que estou estudando e o resultado de outras experiências.
Para entender as listagens você precisa ter alguma noção de assembly 8051. Consulte este site (http://www.8052.com/tutorial.phtml).
Todas as listagens são geradas pelo disassembler belga/russo IDA Pro (http://www.hex-rays.com/idapro/) (geralmente referido nos textos apenas como "IDA"). Para apenas aplicar os conceitos que vou explicar aqui você só precisa de um editor hexadecimal, mas se você deseja avançar a ponto de criar seus próprios hacks, precisa conseguir uma cópia funcional desse programa, que em conjunto com os scripts apropriados deixam o código bem mais fácil de acompanhar.
Para quem tem noções de assembly, lógico.
Eu não sou programador Assembly. Meus hacks estão saindo por pura teimosia, com a ajuda do fato de que eu tenho algum conhecimento em eletrônica e programação.
Eu quero registrar aqui meu respeito e agradecimento aos mestres do grupo MT13x9 (http://tech.groups.yahoo.com/group/mt13x9/) . Sem as informações publicadas no grupo, os documentos que eles escreveram e os programas que eles criaram, eu jamais teria chegado ao ponto de fazer meus próprios hacks, como estou fazendo hoje.
Respect.:clapping:
Outra importante referência é o grupo MEDIATEK1389 (http://tech.groups.yahoo.com/group/MEDIATEK1389/), do Cachirulo, que parece redundante mas contém muita informação que não existe no MT13x9 ou que foi porcamente (Babelfish) traduzida lá (Cachirulo é espanhol). Vários documentos do MT13x9 difíceis de decifrar pelo inglês ruim podem ser encontrados no original espanhol apenas no grupo de Cachirulo.
Se você tem experiência com C/C++, o grupo MT13x9 tem cópias reais de códigos-fonte genéricos da Mediatek encontrados em um fórum chinês, que embora não sejam suficientes para se compilar um firmware completo podem ser usados por alguém que entenda a linguagem para assimilar como a coisa funciona sem precisar entender o resultado em Assembly.
Como abrir o firmware no IDA:
* Instale o IDA. Não é necessário fazer nenhuma configuração especial;
* Extraia do firmware o bloco 8032 inteiro com o MtkRemaker;
* Abra com o IDA;
* Processor Type: 8051;
* YES;
* ROM Size: 0x00080000;
* Device Name: C517;
* Rode os scripts MT1389_8032_FULL.idc e MT1389_MISC.idc (um de cada vez e nesta ordem) disponíveis no grupo MT13x9. Se der qualquer erro, você fez algo errado.
* Espere alguns minutos enquanto o script formata o código.
Como regra geral (e excetuando menção em contrário nos posts), não espere que as informações mostradas aqui se apliquem a firmwares Pioneer e LG sem grandes adaptações (se é que se aplicarão). Philips, LG e Pioneer personalizam bastante seus aparelhos, mas LG e Pioneer fazem as personalizações mais drásticas, que se desviam muito do firmware padrão MT13x9
Outros textos do meu site relacionados:
- Como conectar um player baseado em Mediatek ao PC (http://ryan.com.br/mtk_porta_serial.htm), via porta serial;
- Como alterar a tela de background (http://ryan.com.br/mtk_mtkremaker.htm) dos players baseados em Mediatek;
- Como criar suas próprias fontes (http://ryan.com.br/mtk_fontes.htm)
- Como se livrar do ícone do ZOOM (http://ryan.com.br/mtk_hack_zoom.htm)
- Escolhendo cores (http://ryan.com.br/mtk_hack_palette.htm)
- Tabelas de Controle Remoto (http://ryan.com.br/mtk_remote.htm)
Alguns softwares úteis:
- Ultra Compare (http://www.ultraedit.com/index.php?name=Content&pa=showpage&pid=34) - Trial (30 a 45 dias). O melhor sofware que conheço para comparação de arquivos binários. Mostra os arquivos lado a lado destacando os bytes diferentes;
- Treediff (http://chdsoftware.free.fr/products.htm)- Shareware, mas não expira. Compara de uma só vez, rapidamente, enormes estruturas de arquivos, mostrando quais são diferentes ou foram movidos;
- MagicIso (http://www.magiciso.com/) - Shareware, mas não expira. Usado para criar e editar arquivos ISO nos poucos casos em que isso é realmente necessário. A versão não registrada tem limitações mas estas não afetam o trabalho com arquivos ISO do tamanho usado em firmwares.
- XVI32 (http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm) - Freeware. Editor hexadecimal com suporte a busca por joker/wildcard;
- Hex Workshop (http://www.bpsoft.com/)- Trial. Tem muitos pontos positivos e recursos que o XVI32 não tem, mas é instável no meu PC e muitas vezes não funciona exatamente como esperado. Só costumo usar nos casos em análises mais complicadas, basicamente por sua capacidade de destacar trechos idênticos de código;
-
Rotina Sub_Style do DVP5965K/93 (DVP5965K/55)
Primária
É esta rotina a chave para se ter fontes e cores de fontes selecionáveis por menus.
B1:D2B6 SUB_Style: ; CODE XREF: B1_8883+5Cp
B1:D2B6 EF mov A, R7
B1:D2B7 24 FE add A, #0xFE ; '¦'
B1:D2B9 60 5B jz B1_D316
B1:D2BB 14 dec A
B1:D2BC 60 58 jz B1_D316
B1:D2BE 14 dec A
B1:D2BF 60 61 jz B1_D322
B1:D2C1 24 03 add A, #3
B1:D2C3 70 60 jnz B1_D325
B1:D2C5 E4 clr A ; Para tornar a fonte do browser independente da fonte de legendas e/ou fazer fontes selecionáveis,
B1:D2C5 ; é preciso mexer aqui. No caso, a fonte da legenda é a zero (clr A)
B1:D2C6 FF mov R7, A
B1:D2C7 12 1E D8 lcall B1_BS_240_B3_E9FE
B1:D2CA D2 75 setb RAM_2E.5
B1:D2CC 7F 12 mov R7, #0x12
B1:D2CE 12 1D 58 lcall B1_BS_176_B3_4CF4
B1:D2D1 7F 12 mov R7, #0x12
B1:D2D3 12 1D 5E lcall B1_BS_177_B3_72CE
B1:D2D6 E4 clr A ; Aqui a cor de contorno da legenda é definida como transparente (zero).
B1:D2D6 ; É preciso mudar isso, principalmente se você desligar o background
B1:D2D7 90 FC 1F mov DPTR, #XRAM_FC1F ; OSD_Colors
B1:D2DA F0 movx @DPTR, A
B1:D2DB A3 inc DPTR
B1:D2DC 74 02 mov A, #2 ; Cor do preenchimento
B1:D2DE F0 movx @DPTR, A
B1:D2DF 7B 03 mov R3, #3 ; Define a cor de background. Coloque zero para livrar-se dela
B1:D2E1 E4 clr A
B1:D2E2 FD mov R5, A
B1:D2E3 7F 12 mov R7, #0x12
B1:D2E5 12 1D 64 lcall OSD_TextColor_B1_BS_178_B3_C399
B1:D2E8 E4 clr A
B1:D2E9 FD mov R5, A
B1:D2EA 7F 12 mov R7, #0x12
B1:D2EC 12 1F 3E lcall B1_BS_257_B3_E4D7
B1:D2EF 7F 12 mov R7, #0x12
B1:D2F1 12 1D 6A lcall B1_BS_179_B3_58BA
B1:D2F4 7F 12 mov R7, #0x12
B1:D2F6 12 1D 70 lcall B1_BS_180_B3_E9AF
B1:D2F9 12 E0 FC lcall B1_E0FC
B1:D2FC 7F 19 mov R7, #0x19
B1:D2FE 7E 00 mov R6, #0
B1:D300 12 1B BA lcall B1_BS_107_B3_B645
B1:D303 74 FF mov A, #0xFF
B1:D305 90 FD 77 mov DPTR, #XRAM_FD77
B1:D308 F0 movx @DPTR, A
B1:D309 A3 inc DPTR
B1:D30A F0 movx @DPTR, A
B1:D30B 90 FD 7E mov DPTR, #XRAM_FD7E
B1:D30E F0 movx @DPTR, A
B1:D30F A3 inc DPTR
B1:D310 F0 movx @DPTR, A
B1:D311 C2 74 clr RAM_2E.4
B1:D313 02 1D 1C ljmp B1_BS_166_B4_ABBB
B1:D316 ; ---------------------------------------------------------------------------
B1:D316
B1:D316 B1_D316: ; CODE XREF: SUB_Style+3j
B1:D316 ; SUB_Style+6j
B1:D316 7F 05 mov R7, #5
B1:D318 12 1E 36 lcall B1_BS_213_B6_6CEB
B1:D31B 50 08 jnc B1_D325
B1:D31D 7F 01 mov R7, #1
B1:D31F 02 1E 54 ljmp B1_BS_218_B4_2D0C
B1:D322 ; ---------------------------------------------------------------------------
B1:D322
B1:D322 B1_D322: ; CODE XREF: SUB_Style+9j
B1:D322 12 E0 FC lcall B1_E0FC
B1:D325
B1:D325 B1_D325: ; CODE XREF: SUB_Style+Dj
B1:D325 ; SUB_Style+65j
B1:D325 22 ret
B1:D325 ; End of function SUB_Style
Provavelmente esta é a Sub_Style secundária
Eu não tenho como testar porque não tenho um DVP5965. Acredito que é esta por causa da semelhança com a do DVP5960
B3:5B87 Sub_Style_Sec: ; DATA XREF: BankSw_179_B3_58BA+6Bo
B3:5B87 90 FC 1A mov DPTR, #XRAM_FC1A
B3:5B8A E0 movx A, @DPTR
B3:5B8B FF mov R7, A
B3:5B8C D2 75 setb RAM_2E.5
B3:5B8E 12 4C F4 lcall BankSw_176_B3_4CF4
B3:5B91 90 FC 1A mov DPTR, #XRAM_FC1A
B3:5B94 E0 movx A, @DPTR
B3:5B95 FF mov R7, A
B3:5B96 12 72 CE lcall BankSw_177_B3_72CE
B3:5B99 90 FC 1A mov DPTR, #XRAM_FC1A
B3:5B9C E0 movx A, @DPTR
B3:5B9D FF mov R7, A
B3:5B9E E4 clr A
B3:5B9F 90 FC 1F mov DPTR, #XRAM_FC1F ; OSD_Colors
B3:5BA2 F0 movx @DPTR, A
B3:5BA3 A3 inc DPTR
B3:5BA4 74 02 mov A, #2
B3:5BA6 F0 movx @DPTR, A
B3:5BA7 7B 03 mov R3, #3 ; Cor do background
B3:5BA9 E4 clr A
B3:5BAA FD mov R5, A
B3:5BAB 12 C3 99 lcall OSD_textColor_BS ; OSD_TExtcolor
B3:5BAE 90 FC 1A mov DPTR, #XRAM_FC1A
B3:5BB1 E0 movx A, @DPTR
B3:5BB2 FF mov R7, A
B3:5BB3 E4 clr A
B3:5BB4 FD mov R5, A
B3:5BB5 02 E4 D7 ljmp BankSw_257_B3_E4D7
-
Sub_Style do Lenoxx DV-406
B1:A49A ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:A49A
B1:A49A
B1:A49A Sub_Style_B1_A49A: ; CODE XREF: B1_E1B5+4Ap
B1:A49A EF mov A, R7
B1:A49B 24 FE add A, #0xFE ; '¦'
B1:A49D 70 03 jnz B1_A4A2
B1:A49F 02 A5 35 ljmp B1_A535
B1:A4A2 ; ---------------------------------------------------------------------------
B1:A4A2
B1:A4A2 B1_A4A2: ; CODE XREF: Sub_Style_B1_A49A+3j
B1:A4A2 14 dec A
B1:A4A3 70 03 jnz B1_A4A8
B1:A4A5 02 A5 35 ljmp B1_A535
B1:A4A8 ; ---------------------------------------------------------------------------
B1:A4A8
B1:A4A8 B1_A4A8: ; CODE XREF: Sub_Style_B1_A49A+9j
B1:A4A8 24 02 add A, #2
B1:A4AA 60 03 jz B1_A4AF
B1:A4AC 02 A5 41 ljmp B1_A541
B1:A4AF ; ---------------------------------------------------------------------------
B1:A4AF
B1:A4AF B1_A4AF: ; CODE XREF: Sub_Style_B1_A49A+10j
B1:A4AF 7F C9 mov R7, #0xC9 ; '+'
B1:A4B1 7E 00 mov R6, #0
B1:A4B3 12 04 63 lcall B1_BS_63_B0_EA45
B1:A4B6 EF mov A, R7
B1:A4B7 60 3F jz B1_A4F8
B1:A4B9 90 FC 25 mov DPTR, #XRAM_FC25
B1:A4BC E0 movx A, @DPTR
B1:A4BD 70 06 jnz B1_A4C5
B1:A4BF FF mov R7, A
B1:A4C0 12 06 F7 lcall Set_Font_B1_BS
B1:A4C3 80 05 sjmp B1_A4CA
B1:A4C5 ; ---------------------------------------------------------------------------
B1:A4C5
B1:A4C5 B1_A4C5: ; CODE XREF: Sub_Style_B1_A49A+23j
B1:A4C5 7F 06 mov R7, #6 ; ;Número da fonte da legenda DivX
B1:A4C7 12 06 F7 lcall Set_Font_B1_BS
B1:A4CA
B1:A4CA B1_A4CA: ; CODE XREF: Sub_Style_B1_A49A+29j
B1:A4CA D2 44 setb RAM_28.4
B1:A4CC 7F 12 mov R7, #0x12
B1:A4CE 12 04 DB lcall B1_BS_83_B3_4717
B1:A4D1 7F 12 mov R7, #0x12
B1:A4D3 12 04 E1 lcall B1_BS_84_B3_70DD
B1:A4D6 90 FB DC mov DPTR, #XRAM_FBDC
B1:A4D9 74 03 mov A, #3
B1:A4DB F0 movx @DPTR, A
B1:A4DC A3 inc DPTR
B1:A4DD 14 dec A
B1:A4DE F0 movx @DPTR, A
B1:A4DF E4 clr A
B1:A4E0 FB mov R3, A
B1:A4E1 FD mov R5, A
B1:A4E2 7F 12 mov R7, #0x12
B1:A4E4 12 04 AB lcall OSD_TextColor_B1_BS
B1:A4E7 E4 clr A
B1:A4E8 FD mov R5, A
B1:A4E9 7F 12 mov R7, #0x12
B1:A4EB 12 07 45 lcall B1_BS_186_B3_EDE8
B1:A4EE 7F 12 mov R7, #0x12
B1:A4F0 12 04 ED lcall B1_BS_86_B3_5810
B1:A4F3 7F 12 mov R7, #0x12
B1:A4F5 12 04 F3 lcall B1_BS_87_B3_F0C0
B1:A4F8
B1:A4F8 B1_A4F8: ; CODE XREF: Sub_Style_B1_A49A+1Dj
B1:A4F8 74 FF mov A, #0xFF
B1:A4FA 90 FC E8 mov DPTR, #XRAM_FCE8
B1:A4FD F0 movx @DPTR, A
B1:A4FE A3 inc DPTR
B1:A4FF F0 movx @DPTR, A
B1:A500 90 FC ED mov DPTR, #XRAM_FCED
B1:A503 F0 movx @DPTR, A
B1:A504 A3 inc DPTR
B1:A505 F0 movx @DPTR, A
B1:A506 7D 6B mov R5, #0x6B ; 'k'
B1:A508 7F CB mov R7, #0xCB ; '-'
B1:A50A 7E 00 mov R6, #0
B1:A50C 12 04 5D lcall B1_BS_62_B0_ED81
B1:A50F 7D 6F mov R5, #0x6F ; 'o'
B1:A511 7F CC mov R7, #0xCC ; '¦'
B1:A513 7E 00 mov R6, #0
B1:A515 12 04 5D lcall B1_BS_62_B0_ED81
B1:A518 E4 clr A
B1:A519 90 FB 48 mov DPTR, #XRAM_FB48
B1:A51C F0 movx @DPTR, A
B1:A51D
B1:A51D B1_A51D: ; CODE XREF: Sub_Style_B1_A49A+94j
B1:A51D 7F CB mov R7, #0xCB ; '-'
B1:A51F 7E 00 mov R6, #0
B1:A521 12 04 63 lcall B1_BS_63_B0_EA45
B1:A524 90 FB 48 mov DPTR, #XRAM_FB48
B1:A527 E0 movx A, @DPTR
B1:A528 04 inc A
B1:A529 F0 movx @DPTR, A
B1:A52A E0 movx A, @DPTR
B1:A52B C3 clr C
B1:A52C 94 03 subb A, #3
B1:A52E 40 ED jc B1_A51D
B1:A530 C2 43 clr RAM_28.3
B1:A532 02 A8 6E ljmp B1_A86E
B1:A535 ; ---------------------------------------------------------------------------
B1:A535
B1:A535 B1_A535: ; CODE XREF: Sub_Style_B1_A49A+5j
B1:A535 ; Sub_Style_B1_A49A+Bj
B1:A535 7F 05 mov R7, #5
B1:A537 12 F5 50 lcall B1_F550
B1:A53A 50 05 jnc B1_A541
B1:A53C 7F 01 mov R7, #1
B1:A53E 12 C9 C6 lcall B1_C9C6
B1:A541
B1:A541 B1_A541: ; CODE XREF: Sub_Style_B1_A49A+12j
B1:A541 ; Sub_Style_B1_A49A+A0j
B1:A541 22 ret
B1:A541 ; End of function Sub_Style_B1_A49A
B1:A541
-
Sub_Style do DVP5960/37
Primária
B1:D2BC ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:D2BC
B1:D2BC
B1:D2BC Sub_Style: ; CODE XREF: B1_8883+5Cp
B1:D2BC EF mov A, R7
B1:D2BD 24 FE add A, #0xFE ; '¦'
B1:D2BF 60 5B jz B1_D31C
B1:D2C1 14 dec A
B1:D2C2 60 58 jz B1_D31C
B1:D2C4 14 dec A
B1:D2C5 60 61 jz B1_D328
B1:D2C7 24 03 add A, #3
B1:D2C9 70 60 jnz B1_D32B
B1:D2CB E4 clr A ; Número da fonte = 0
B1:D2CC FF mov R7, A
B1:D2CD 12 1E EA lcall OSD_SetFont_B1_BS
B1:D2D0 D2 75 setb RAM_2E.5
B1:D2D2 7F 12 mov R7, #0x12
B1:D2D4 12 1D 6A lcall B1_BS_179_B3_4CF4
B1:D2D7 7F 12 mov R7, #0x12
B1:D2D9 12 1D 70 lcall B1_BS_180_B3_72CE
B1:D2DC E4 clr A
B1:D2DD 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B1:D2E0 F0 movx @DPTR, A
B1:D2E1 A3 inc DPTR
B1:D2E2 74 02 mov A, #2
B1:D2E4 F0 movx @DPTR, A
B1:D2E5 7B 03 mov R3, #3
B1:D2E7 E4 clr A
B1:D2E8 FD mov R5, A
B1:D2E9 7F 12 mov R7, #0x12
B1:D2EB 12 1D 76 lcall OSD_TextColor_B1_BS
B1:D2EE E4 clr A
B1:D2EF FD mov R5, A
B1:D2F0 7F 12 mov R7, #0x12
B1:D2F2 12 1F 50 lcall B1_BS_260_B3_E41D
B1:D2F5 7F 12 mov R7, #0x12
B1:D2F7 12 1D 7C lcall B1_BS_182_B3_58BA
B1:D2FA 7F 12 mov R7, #0x12
B1:D2FC 12 1D 82 lcall B1_BS_183_B3_E8F5
B1:D2FF 12 E0 A4 lcall B1_E0A4
B1:D302 7F 19 mov R7, #0x19
B1:D304 7E 00 mov R6, #0
B1:D306 12 1B CC lcall B1_BS_110_B3_B6D8
B1:D309 74 FF mov A, #0xFF
B1:D30B 90 FD 74 mov DPTR, #XRAM_FD74
B1:D30E F0 movx @DPTR, A
B1:D30F A3 inc DPTR
B1:D310 F0 movx @DPTR, A
B1:D311 90 FD 7B mov DPTR, #XRAM_FD7B
B1:D314 F0 movx @DPTR, A
B1:D315 A3 inc DPTR
B1:D316 F0 movx @DPTR, A
B1:D317 C2 74 clr RAM_2E.4
B1:D319 02 1D 2E ljmp B1_BS_169_B4_AB59
B1:D31C ; ---------------------------------------------------------------------------
B1:D31C
B1:D31C B1_D31C: ; CODE XREF: Sub_Style+3j
B1:D31C ; Sub_Style+6j
B1:D31C 7F 05 mov R7, #5
B1:D31E 12 1E 48 lcall B1_BS_216_B6_6C4E
B1:D321 50 08 jnc B1_D32B
B1:D323 7F 01 mov R7, #1
B1:D325 02 1E 66 ljmp B1_BS_221_B4_A8C0
B1:D328 ; ---------------------------------------------------------------------------
B1:D328
B1:D328 B1_D328: ; CODE XREF: Sub_Style+9j
B1:D328 12 E0 A4 lcall B1_E0A4
B1:D32B
B1:D32B B1_D32B: ; CODE XREF: Sub_Style+Dj
B1:D32B ; Sub_Style+65j
B1:D32B 22 ret
B1:D32B ; End of function Sub_Style
SECUNDÁRIA (Chamada quando você sai do Setup)
B3:5B87
B3:5B87 Sub_Style_Sec: ; DATA XREF: BankSw_182_B3_58BA+6Bo
B3:5B87 90 FC 19 mov DPTR, #XRAM_FC19 ; Sub_style secundária
B3:5B8A E0 movx A, @DPTR
B3:5B8B FF mov R7, A
B3:5B8C D2 75 setb RAM_2E.5
B3:5B8E 12 4C F4 lcall BankSw_179_B3_4CF4
B3:5B91 90 FC 19 mov DPTR, #XRAM_FC19
B3:5B94 E0 movx A, @DPTR
B3:5B95 FF mov R7, A
B3:5B96 12 72 CE lcall BankSw_180_B3_72CE
B3:5B99 90 FC 19 mov DPTR, #XRAM_FC19 ; o número da janela 0x12 foi guardado aqui ao entrar no setup
B3:5B9C E0 movx A, @DPTR
B3:5B9D FF mov R7, A
B3:5B9E E4 clr A
B3:5B9F 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B3:5BA2 F0 movx @DPTR, A
B3:5BA3 A3 inc DPTR
B3:5BA4 74 02 mov A, #2
B3:5BA6 F0 movx @DPTR, A
B3:5BA7 7B 03 mov R3, #3 ; A cor do background
B3:5BA9 E4 clr A
B3:5BAA FD mov R5, A
B3:5BAB 12 C3 50 lcall BankSw_181_B3_C350
B3:5BAE 90 FC 19 mov DPTR, #XRAM_FC19
B3:5BB1 E0 movx A, @DPTR
B3:5BB2 FF mov R7, A
B3:5BB3 E4 clr A
B3:5BB4 FD mov R5, A
B3:5BB5 02 E4 1D ljmp BankSw_260_B3_E41D
-
Sub_Style secundária
Este é um nome inventado por mim, porque descobri a existência dessas rotinas na marra, investigando um problema com o DVP-858. Eu não tinha ainda visto nenhuma referência a elas no grupo MT13x9.
Alguns firmwares tem uma segunda rotina sub_style que é chamada quando você sai do setup e também precisa ser modificada, junto com a principal. A existência dessa rotina secundária pode ser vantajosa, porque pode permitir que mudanças na escolha de fontes feitas no setup sejam ativadas imediatamente, sem que seja necessário parar o filme e começar de novo, já que a Sub_Style principal só é executada uma vez, logo ao carregar o filme.
O sintoma da existência de uma sub_style secundária é apenas que qualquer alteração que você faça na principal é revertida quando você entra e sai do setup.
Também tenha em mente que a Sub_Style secundária não faz necessáriamente tudo o que a primária faz. Mas como ela é chamada quando você sai do Setup, você pode alterá-la para chamar um código colocado em outra parte do firmware que faça tudo o que você quer.
Firmwares que sabidamente tem uma Sub_Style secundária:
- Proview DVP-858
- Philips DVP5960/37
- Philips DVP5100K/78
-
Philips DVP5960/37
A variável XRAM_FC19 pode conter o número da última janela desenhada
0x0A é a janela do Setup;
0x05 é a janela onde é exibida a mensagem "Press Play Key To Continue" do Resume DivX
-
Uma coisa inédita para mim no firmware do DVP5960/37:
Inicialmente, a fonte usada por tudo é a 1, mas depois que você sai do Setup a fonte das legendas passa a ser a 7!
Isso me deu um nó aqui. Um hack que eu estou elaborando não parecia surtir efeito na rotina sub_style secundária, até eu me dar conta de que a fonte estava revertendo para a original!
-
Como fazer com que o firmware Philips use fontes com cores normais.
É sabido que nos firmwares da Philips é preciso fazer uma "gambiarra" com as cores para poder desativar o background.
Eu descobri como fazer com que o firmware aceite fontes "normais".
Substitua:
E4 clr A
90 xx xx mov DPTR, #XRAM_OSD_Colors ; OSD_colors
F0 movx @DPTR, A
A3 inc DPTR
74 02 mov A, #2
F0 movx @DPTR, A
7B 03 mov R3, #3 ; Cor de fundo. Zero para desabilitar o fundo.
E4 clr A
por:
90 xx xx mov DPTR, #XRAM_OSD_Colors ; OSD_colors
74 03 mov A, #3
F0 movx @DPTR, A
A3 inc DPTR
74 02 mov A, #2
F0 movx @DPTR, A
E4 clr A
FB mov R3, A ; Cor de fundo=zero, desabilita o fundo
Exemplo do DVP5960
Sub_Style primária
B1:D2BC Sub_Style: ; CODE XREF: B1_8883+5Cp
B1:D2BC EF mov A, R7
B1:D2BD 24 FE add A, #0xFE ; '¦'
B1:D2BF 60 5B jz B1_D31C
B1:D2C1 14 dec A
B1:D2C2 60 58 jz B1_D31C
B1:D2C4 14 dec A
B1:D2C5 60 61 jz B1_D328
B1:D2C7 24 03 add A, #3
B1:D2C9 70 60 jnz B1_D32B
B1:D2CB E4 clr A ; Número da fonte = 0
B1:D2CC FF mov R7, A
B1:D2CD 12 1E EA lcall OSD_SetFont_B1_BS
B1:D2D0 D2 75 setb RAM_2E.5
B1:D2D2 7F 12 mov R7, #0x12
B1:D2D4 12 1D 6A lcall OSD_Text_Params_ARM_B1BS
B1:D2D7 7F 12 mov R7, #0x12
B1:D2D9 12 1D 70 lcall OSD_Text_Params_B1BS
B1:D2DC E4 clr A
B1:D2DD 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B1:D2E0 F0 movx @DPTR, A
B1:D2E1 A3 inc DPTR
B1:D2E2 74 02 mov A, #2
B1:D2E4 F0 movx @DPTR, A
B1:D2E5 7B 03 mov R3, #3 ; Cor de fundo. Zero para desabilitar o fundo.
B1:D2E7 E4 clr A
B1:D2E8 FD mov R5, A
B1:D2E9 7F 12 mov R7, #0x12
B1:D2EB 12 1D 76 lcall OSD_TextColor_B1_BS
Substitua:
B1:D2DC - E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 7F 12 12
por:
B1:D2DC - 90 FC 1E 74 03 F0 A3 74 02 F0 E4 FB FD 7F 12 12
Sub_Style secundária
B3:5B87 Sub_Style_Sec: ; DATA XREF: OSD_Text_Init?+6Bo
B3:5B87 90 FC 19 mov DPTR, #XRAM_FC19 ; Sub_style secundária
B3:5B8A E0 movx A, @DPTR
B3:5B8B FF mov R7, A
B3:5B8C D2 75 setb RAM_2E.5
B3:5B8E 12 4C F4 lcall OSD_Text_Params_ARM
B3:5B91 90 FC 19 mov DPTR, #XRAM_FC19 ; Número da Janela (OSD_TextInit)?
B3:5B94 E0 movx A, @DPTR
B3:5B95 FF mov R7, A
B3:5B96 12 72 CE lcall OSD_Text_Params
B3:5B99 90 FC 19 mov DPTR, #XRAM_FC19 ; Número da Janela (OSD_TextInit)?
B3:5B9C E0 movx A, @DPTR
B3:5B9D FF mov R7, A
B3:5B9E E4 clr A
B3:5B9F 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B3:5BA2 F0 movx @DPTR, A
B3:5BA3 A3 inc DPTR
B3:5BA4 74 02 mov A, #2
B3:5BA6 F0 movx @DPTR, A
B3:5BA7 7B 03 mov R3, #3 ; A cor do background
B3:5BA9 E4 clr A
B3:5BAA FD mov R5, A
B3:5BAB 12 C3 50 lcall OSD_Text_Color
B3:5BAE 90 FC 19 mov DPTR, #XRAM_FC19 ; Número da Janela (OSD_TextInit)?
B3:5BB1 E0 movx A, @DPTR
B3:5BB2 FF mov R7, A
B3:5BB3 E4 clr A
B3:5BB4 FD mov R5, A
B3:5BB5 02 E4 1D ljmp OSD_Textinit_END
Substitua:
B3:5B9E - E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 12 C3 50
por:
B3:5B9E - 90 FC 1E 74 03 F0 A3 74 02 F0 E4 FB FD 12 C3 50
Com o mtkWindows, coloque Blend=3 na janela 0x12
Com o mtkRemaker coloque fontes "normais" com contorno
É isso. Nada mais de precisar inverter as cores da fonte para uso no firmware Philips :)
O que meu patch faz é desligar a definição de uma cor de background e ao mesmo tempo definir uma cor sólida para o contorno.
-
Como tornar a fonte de legendas independente da fonte do browser.
Este texto ja foi publicado por mim no htforum e estou repetindo aqui, porque está dose encontrar alguma coisa lá. :)
Tomando como exemplo o Proview DVP-858 (firmware original):
Em B1:DC89 substitua
E4 FF
por
7F xx
onde xx é o número da fonte que você quer usar para as legendas.
Como funciona:
Eu já sabia que a escolha da fonte possivelmente era feita em sub_style, mas não havia conseguido achar o código baseado nos exemplos que havia visto. Hoje fiz uma nova pesquisa de outra forma e descobri por outros exemplos que a coisa estava na cara:
B1:DC91 Sub_Style: ; CODE XREF: B1_998C+5Cp
B1:DC91 EF mov A, R7
B1:DC92 24 FE add A, #0xFE ; '¦'
B1:DC94 60 53 jz B1_DCE9
B1:DC96 14 dec A
B1:DC97 60 50 jz B1_DCE9
B1:DC99 14 dec A
B1:DC9A 60 59 jz B1_DCF5
B1:DC9C 24 03 add A, #3
B1:DC9E 70 58 jnz B1_DCF8
B1:DCA0 E4 clr A ; Determina a fonte (0x0)
B1:DCA1 FF mov R7, A
B1:DCA2 12 1E 70 lcall OSD_SetFont_B1_BS
O código original carrega R7 com o valor zero (o número da fonte no Proview), do jeito implícito típico do assembly, e chama a rotina que carrega a fonte. O meu patch permite carregar R7 explicitamente com o número de outra fonte.
Preste atenção ao fato de que você deve usar o número que aparece entre parênteses no mtkRemaker e não o número sequencial da fonte
Preste atenção às listagens que eu publicar de Sub_Style que eu devo sinalizar onde é feita essa mudança em cada firmware.
-
Sub_Style do Proview DVP-858 - Versão 20.07
Existe uma pequena diferença para a versão 20.06, que é devida à correção do bug da ausência de contorno de legendas pela Proview
Primária
B1:DC91 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:DC91
B1:DC91
B1:DC91 Sub_Style: ; CODE XREF: B1_998C+5Cp
B1:DC91 EF mov A, R7
B1:DC92 24 FE add A, #0xFE ; '¦'
B1:DC94 60 53 jz B1_DCE9
B1:DC96 14 dec A
B1:DC97 60 50 jz B1_DCE9
B1:DC99 14 dec A
B1:DC9A 60 59 jz B1_DCF5
B1:DC9C 24 03 add A, #3
B1:DC9E 70 58 jnz B1_DCF8
B1:DCA0 E4 clr A ; Determina a fonte (0x0)
B1:DCA1 FF mov R7, A
B1:DCA2 12 1E 70 lcall OSD_SetFont_B1_BS
B1:DCA5 D2 46 setb RAM_28.6 ; Não sei para que serve. Zerei mas nada pareceu mudar
B1:DCA7 7F 13 mov R7, #0x13
B1:DCA9 12 1D D4 lcall B1_BS_190_B5_13E8
B1:DCAC 7F 13 mov R7, #0x13
B1:DCAE 12 1D DA lcall B1_BS_191_B5_A4B2
B1:DCB1 90 FC 07 mov DPTR, #XRAM_FC07 ; OSD_Colors
B1:DCB4 74 03 mov A, #3 ; Em FC07 vai a cor do contorno e em FC08 a cor de preenchimento
B1:DCB6 F0 movx @DPTR, A
B1:DCB7 A3 inc DPTR
B1:DCB8 14 dec A
B1:DCB9 F0 movx @DPTR, A
B1:DCBA E4 clr A
B1:DCBB FB mov R3, A
B1:DCBC FD mov R5, A
B1:DCBD 7F 13 mov R7, #0x13
B1:DCBF 12 1D E0 lcall OSD_TextColor_B1_BS
B1:DCC2 E4 clr A
B1:DCC3 FD mov R5, A
B1:DCC4 7F 13 mov R7, #0x13
B1:DCC6 12 1E B2 lcall B1_BS_227_B5_E5A1
B1:DCC9 7F 13 mov R7, #0x13
B1:DCCB 12 1D EC lcall B1_BS_194_B3_6222
B1:DCCE 7F 13 mov R7, #0x13
B1:DCD0 12 1D F2 lcall B1_BS_195_B5_E98B
B1:DCD3 12 E2 45 lcall B1_E245
B1:DCD6 74 FF mov A, #0xFF
B1:DCD8 90 FD 49 mov DPTR, #XRAM_FD49
B1:DCDB F0 movx @DPTR, A
B1:DCDC A3 inc DPTR
B1:DCDD F0 movx @DPTR, A
B1:DCDE 90 FD 4E mov DPTR, #XRAM_FD4E
B1:DCE1 F0 movx @DPTR, A
B1:DCE2 A3 inc DPTR
B1:DCE3 F0 movx @DPTR, A
B1:DCE4 C2 45 clr RAM_28.5
B1:DCE6 02 1E 52 ljmp B1_BS_211_B3_B567
Secundária
B1:E9EF ; START OF FUNCTION CHUNK FOR BankSw_338_B1_F916
B1:E9EF
B1:E9EF Sub_StyleSec: ; CODE XREF: BankSw_338_B1_F916:B1_F930j
B1:E9EF 7F E2 mov R7, #0xE2 ; 'Ô'
B1:E9F1 7E 07 mov R6, #7
B1:E9F3 12 19 C6 lcall B1_BS_17_B0_E87A
B1:E9F6 BF 01 05 cjne R7, #1, B1_E9FE
B1:E9F9 D2 45 setb RAM_28.5
B1:E9FB 12 1E 52 lcall B1_BS_211_B3_B567
B1:E9FE
B1:E9FE B1_E9FE: ; CODE XREF: BankSw_338_B1_F916-F20j
B1:E9FE 90 FC AB mov DPTR, #XRAM_FCAB
B1:EA01 E0 movx A, @DPTR
B1:EA02 64 03 xrl A, #3
B1:EA04 70 35 jnz B1_EA3B
B1:EA06 7F 06 mov R7, #6
B1:EA08 12 A9 48 lcall BankSw_241_B1_A948
B1:EA0B 50 2E jnc B1_EA3B
B1:EA0D D2 46 setb RAM_28.6
B1:EA0F 7F 13 mov R7, #0x13
B1:EA11 12 1D D4 lcall B1_BS_190_B5_13E8
B1:EA14 7F 13 mov R7, #0x13
B1:EA16 12 1D DA lcall B1_BS_191_B5_A4B2
B1:EA19 90 FC 07 mov DPTR, #XRAM_FC07 ; OSD_Colors
B1:EA1C 74 03 mov A, #3
B1:EA1E F0 movx @DPTR, A
B1:EA1F A3 inc DPTR
B1:EA20 14 dec A
B1:EA21 F0 movx @DPTR, A
B1:EA22 E4 clr A
B1:EA23 FB mov R3, A
B1:EA24 FD mov R5, A
B1:EA25 7F 13 mov R7, #0x13
B1:EA27 12 1D E0 lcall OSD_TextColor_B1_BS
B1:EA2A E4 clr A
B1:EA2B FD mov R5, A
B1:EA2C 7F 13 mov R7, #0x13
B1:EA2E 12 1E B2 lcall B1_BS_227_B5_E5A1
B1:EA31 7F 13 mov R7, #0x13
B1:EA33 12 1D EC lcall B1_BS_194_B3_6222
B1:EA36 7F 13 mov R7, #0x13
B1:EA38 12 1D F2 lcall B1_BS_195_B5_E98B
B1:EA3B
B1:EA3B B1_EA3B: ; CODE XREF: BankSw_338_B1_F916-F12j
B1:EA3B ; BankSw_338_B1_F916-F0Bj
B1:EA3B 22 ret
-
Sub_Style do Proview DVP-858 - Versão 20.06
Primária
B1:DC7A Sub_Style: ; CODE XREF: B1_998C+5Cp
B1:DC7A mov A, R7
B1:DC7B add A, #0xFE ; '¦'
B1:DC7D jz B1_DCD2
B1:DC7F dec A
B1:DC80 jz B1_DCD2
B1:DC82 dec A
B1:DC83 jz B1_DCDE
B1:DC85 add A, #3
B1:DC87 jnz B1_DCE1
B1:DC89 clr A
B1:DC8A mov R7, A
B1:DC8B lcall SetFont_B1_BS_216_B5_E9E0
B1:DC8E setb RAM_28.6
B1:DC90 mov R7, #0x13
B1:DC92 lcall B1_BS_190_B5_13F0
B1:DC95 mov R7, #0x13
B1:DC97 lcall B1_BS_191_B5_A4B2
B1:DC9A clr A
B1:DC9B mov DPTR, #XRAM_FC07 ; OSD_Colors
B1:DC9E movx @DPTR, A
B1:DC9F inc DPTR
B1:DCA0 mov A, #2
B1:DCA2 movx @DPTR, A
B1:DCA3 clr A
B1:DCA4 mov R3, A
B1:DCA5 mov R5, A
B1:DCA6 mov R7, #0x13
B1:DCA8 lcall OSD_TextColor_B1_BS_192_B5_D5F7 ; OSD_TextColor
B1:DCAB clr A
B1:DCAC mov R5, A
B1:DCAD mov R7, #0x13
B1:DCAF lcall B1_BS_227_B5_E5A7
B1:DCB2 mov R7, #0x13
B1:DCB4 lcall B1_BS_194_B3_6223
B1:DCB7 mov R7, #0x13
B1:DCB9 lcall B1_BS_195_B5_E991
B1:DCBC lcall B1_E22E
B1:DCBF mov A, #0xFF
B1:DCC1 mov DPTR, #XRAM_FD49
B1:DCC4 movx @DPTR, A
B1:DCC5 inc DPTR
B1:DCC6 movx @DPTR, A
B1:DCC7 mov DPTR, #XRAM_FD4E
B1:DCCA movx @DPTR, A
B1:DCCB inc DPTR
B1:DCCC movx @DPTR, A
B1:DCCD clr RAM_28.5
B1:DCCF ljmp B1_BS_211_B3_B6E3
Secundária
B1:E9D8 Sub_StyleSec: ; CODE XREF: BankSw_338_B1_F907:B1_F921j
B1:E9D8 mov R7, #0xE2 ; 'Ô'
B1:E9DA mov R6, #7
B1:E9DC lcall ARM_GETCHAR_B1_BS_17_B0_E87D
B1:E9DF cjne R7, #1, B1_E9E7
B1:E9E2 setb RAM_28.5
B1:E9E4 lcall B1_BS_211_B3_B6E3
B1:E9E7
B1:E9E7 B1_E9E7: ; CODE XREF: BankSw_338_B1_F907-F28j
B1:E9E7 mov DPTR, #XRAM_FCAB ; TipoMidia
B1:E9EA movx A, @DPTR
B1:E9EB xrl A, #3
B1:E9ED jnz B1_EA24
B1:E9EF mov R7, #6
B1:E9F1 lcall BankSw_241_B1_A87D
B1:E9F4 jnc B1_EA24
B1:E9F6 setb RAM_28.6
B1:E9F8 mov R7, #0x13
B1:E9FA lcall B1_BS_190_B5_13F0
B1:E9FD mov R7, #0x13
B1:E9FF lcall B1_BS_191_B5_A4B2
B1:EA02 clr A
B1:EA03 mov DPTR, #XRAM_FC07 ; OSD_Colors
B1:EA06 movx @DPTR, A
B1:EA07 inc DPTR
B1:EA08 mov A, #2
B1:EA0A movx @DPTR, A
B1:EA0B clr A
B1:EA0C mov R3, A
B1:EA0D mov R5, A
B1:EA0E mov R7, #0x13
B1:EA10 lcall OSD_TextColor_B1_BS_192_B5_D5F7 ; OSD_TextColor
B1:EA13 clr A
B1:EA14 mov R5, A
B1:EA15 mov R7, #0x13
B1:EA17 lcall B1_BS_227_B5_E5A7
B1:EA1A mov R7, #0x13
B1:EA1C lcall B1_BS_194_B3_6223
B1:EA1F mov R7, #0x13
B1:EA21 lcall B1_BS_195_B5_E991
B1:EA24
B1:EA24 B1_EA24: ; CODE XREF: BankSw_338_B1_F907-F1Aj
B1:EA24 ; BankSw_338_B1_F907-F13j
B1:EA24 ret
-
Sub_Style Philips DVP5100K/78 - Versão 0E.0A
Primária
Veja o post de JMARAUJO mais adiante
Secundária (já testado no meu DVP5100)
B3:545E Sub_StyleSec: ; DATA XREF: BankSw_223_B3_519C+63o
B3:545E 90 FB 8D mov DPTR, #XRAM_FB8D ; Window_ID?
B3:5461 E0 movx A, @DPTR
B3:5462 FF mov R7, A
B3:5463 D2 75 setb RAM_2E.5
B3:5465 12 28 F1 lcall BankSw_217_B3_28F1
B3:5468 90 FB 8D mov DPTR, #XRAM_FB8D ; Window_ID?
B3:546B E0 movx A, @DPTR
B3:546C FF mov R7, A
B3:546D 12 68 22 lcall BankSw_218_B3_6822
B3:5470 90 FB 8D mov DPTR, #XRAM_FB8D ; Window_ID?
B3:5473 E0 movx A, @DPTR
B3:5474 FF mov R7, A
B3:5475 E4 clr A
B3:5476 90 FB A4 mov DPTR, #XRAM_FBA4 ; OSD_TextColor
B3:5479 F0 movx @DPTR, A
B3:547A A3 inc DPTR
B3:547B 74 02 mov A, #2
B3:547D F0 movx @DPTR, A
B3:547E 7B 03 mov R3, #3 ; Define a cor do background
B3:5480 E4 clr A
B3:5481 FD mov R5, A
B3:5482 12 D4 73 lcall OSD_TextColorB1BS
B3:5485 90 FB 8D mov DPTR, #XRAM_FB8D ; Window_ID?
B3:5488 E0 movx A, @DPTR
B3:5489 FF mov R7, A
B3:548A E4 clr A
B3:548B FD mov R5, A
B3:548C 02 EF D7 ljmp BankSw_484_B3_EFD7
-
Como identificar a janela que é usada pelo bargraph no firmware
O bargraph a que me refiro não é o que aparece para MP3. É este, que existe no DVP-858, mas não pode ser exibido porque não existe comando no remoto para ele:
(http://ryan.com.br/imagens/dvp858/proview_dvp858_bargraph_50.jpg)
Saber em que janela é exibido é util caso você precise movê-lo para uma posição melhor.
Abra o firmware com o mtkWindows e procure por uma janela com uma palette parecida com esta:
(http://ryan.com.br/imagens/mediatek/mtkwindows_palette_bargraph_50.jpg)
Note que "Used by" mostra que esta palette é usada por uma janela apenas.
No Proview DVP-858, no Lenoxx DV-406 e nos Philips DVP3040, DVP5100, DVP5960 e DVP5965 é a janela 0x08
Atenção: Nem todo firmware tem bargraph ativo. No proview DVP-858 basta enviar o mtkCommand "4A" usando o Expert Mode do mtkTool para que ele apareça, mas isso não funciona com o DVP5960.
-
A busca pela RC_TAB do Proview
publicado originalmente no tópico do HTFORUM
Todo firmware MT13x9 tem uma ou mais tabelas (os Philips sabidamente tem duas) onde é feita a correspondência entre o código recebido do controle remoto e o código que será repassado para as rotinas. Os hackers do MT13x9 chamam esse último de "mtkCommand".
Para que cada fabricante de DVD player possa usar a codificação de controle remoto que achar mais apropriada, geralmente para encaixar em sua linha produtos, essa correspondência é inevitável. Depois que o firmware passa por essa tabela, chamada de RC_TAB, o firmware passa a trabalhar só com os mtkCommands e fica independente do remoto usado. Isso facilita bastante a programação.
Localizando essa tabela é possível mudar globalmente um comando do remoto. É possível por exemplo fazer com que ao apertar o botão PLAY do remoto seja repassado para todas as funções do firmware o mtkCommand IR_PLAY_PAUSE e não o IR_PLAY.
O problema é achar uma tabela de uns 256 bytes em um bloco de dados com mais de 400 mil, sem saber exatamente como ela se parece.
Baseado em algumas horas de chutes, eu achei uma com os seguintes botões (endereços da versão 20.06):
* DISPLAY (B4:31E3)
* BOOKMARK (B4:31E7)
* GOTO (B4:31FB)
* STOP (B4:31FF)
* USB (B4:3227)
* HDMI (B4:322B)
* P/N (B4:322F)
* VIDEO (B4:3233)
E já posso "transformar" qualquer desses botões no mtkCommand que eu quiser (basta mudar o valor no offset entre parênteses). Mas a tabela com o botão PLAY está muito difícil de achar.
-
Olá, Jefferson!
Infelizmente, eu não sei configurar o disassemblador para mostrar os códigos hexa ao lado dos mnemônicos, nem tenho tempo para fazer isso manualmente.
Tente em:
Options -> General -> Disassembly -> Number of opcode bytes -> 4
Saudações!
-
Caramba!
MUITO OBRIGADO!
-
Como fazer sumir o guia de Pan & Scan (modo ZOOM)
Testado com sucesso no Proview DVP-858
O guia de Pan&Scan é a caixa que se vê na imagem abaixo
(http://ryan.com.br/imagens/dvp858/proview_dvp858_zoomicon_50.jpg)
Descubra em que janela ele é exibido (oriente-se pela posição onde ele aparece na tela e compare com o mtkWindows).
Basta reduzir o tamanho da janela para 1x1 pixels que ele vai continuar sendo exibido, mas não será visível.
No Proview DVP-858, o guia é exibido na janela 0x1C.
-
Sub_Style Philips DVP5100K/78 - Versão 0E.0A
Estou com dificuldade para achar a primária
Secundária (ainda não foi testado)
B3:545E Sub_StyleSec: ; DATA XREF: BankSw_223_B3_519C+63o
B3:545E mov DPTR, #XRAM_FB8D ; Window_ID?
B3:5461 movx A, @DPTR
...
Seguindo as xrefs achei esta função ao qual estou 80% certo de ser a Sub_Style. Se puder confirmar isso ficarei muito grato...
No banco 1:
=========
ROM:CF79 ROM_CF79:
ROM:CF79 90 FB 60 mov DPTR, #0xFB60
ROM:CF7C EE mov A, R6
ROM:CF7D F0 movx @DPTR, A
ROM:CF7E A3 inc DPTR
ROM:CF7F EF mov A, R7
ROM:CF80 F0 movx @DPTR, A
ROM:CF81 7F 03 mov R7, #3
ROM:CF83 12 07 21 lcall BS:180_B3:11FC
ROM:CF83
ROM:CF86 7F 01 mov R7, #1
ROM:CF88 12 07 21 lcall BS:180_B3:11FC
ROM:CF88
ROM:CF8B 7F 03 mov R7, #3
ROM:CF8D 12 F1 84 lcall ROM_F184
ROM:CF8D
ROM:CF90 7B FF mov R3, #0xFF
ROM:CF92 7D EB mov R5, #0xEB ; 'Ù'
ROM:CF94 7C 01 mov R4, #1
ROM:CF96 74 01 mov A, #1
ROM:CF98 FF mov R7, A
ROM:CF99 FE mov R6, A
ROM:CF9A 12 06 5B lcall OSD_DispMsg2
ROM:CF9A
ROM:CF9D 7F 0E mov R7, #0xE
ROM:CF9F 12 06 FD lcall BS:174_B4:E80B
ROM:CF9F
ROM:CFA2 7F 59 mov R7, #0x59 ; 'Y' <-- 59 = Valor EEPROM mudança fonte divx
ROM:CFA4 7E 00 mov R6, #0
ROM:CFA6 12 05 D7 lcall PREF_GetChar
ROM:CFA6
ROM:CFA9 BF 01 07 cjne R7, #1, ROM_CFB3
ROM:CFA9
ROM:CFAC 7F 0F mov R7, #0xF <-- Fonte 0F (fonte 2)
ROM:CFAE 12 08 59 lcall SUB_SetFont
ROM:CFAE
ROM:CFB1 80 27 sjmp ROM_CFDA
ROM:CFB1
ROM:CFB3 ; ---------------------------------------------------------------------------
ROM:CFB3
ROM:CFB3 ROM_CFB3:
ROM:CFB3 7F 59 mov R7, #0x59 ; 'Y' <-- EEPROM mudança fonte
ROM:CFB5 7E 00 mov R6, #0
ROM:CFB7 12 05 D7 lcall PREF_GetChar
ROM:CFB7
ROM:CFBA EF mov A, R7
ROM:CFBB 70 07 jnz ROM_CFC4
ROM:CFBB
ROM:CFBD 7F 0D mov R7, #0xD <-- Fonte 0D (fonte 1)
ROM:CFBF 12 08 59 lcall SUB_SetFont
ROM:CFBF
ROM:CFC2 80 16 sjmp ROM_CFDA
ROM:CFC2
ROM:CFC4 ; ---------------------------------------------------------------------------
ROM:CFC4
ROM:CFC4 ROM_CFC4:
ROM:CFC4 7F 59 mov R7, #0x59 ; 'Y'
ROM:CFC6 7E 00 mov R6, #0
ROM:CFC8 12 05 D7 lcall PREF_GetChar
ROM:CFC8
ROM:CFCB BF 02 07 cjne R7, #2, ROM_CFD5
ROM:CFCB
ROM:CFCE 7F 11 mov R7, #0x11 <-- Fonte 11 (não existente no fw orig)
ROM:CFD0 12 08 59 lcall SUB_SetFont
ROM:CFD0
ROM:CFD3 80 05 sjmp ROM_CFDA
ROM:CFD3
ROM:CFD5 ; ---------------------------------------------------------------------------
ROM:CFD5
ROM:CFD5 ROM_CFD5:
ROM:CFD5 7F 0D mov R7, #0xD
ROM:CFD7 12 08 59 lcall SUB_SetFont
ROM:CFD7
ROM:CFDA
ROM:CFDA ROM_CFDA:
ROM:CFDA 7F 11 mov R7, #0x11 <-- ID Janela legendas mpeg4
ROM:CFDC 12 08 23 lcall OSD_TextInit
ROM:CFDC
ROM:CFDF 7F 11 mov R7, #0x11
ROM:CFE1 12 08 29 lcall PS_A_0x04
ROM:CFE1
ROM:CFE4 22 ret
EDIT: Atualizada rotina e comentarios adicionados.
-
Já testei. É esta mesmo!
Obrigado!
-
Como usar o "Expert Mode" do mtkTool
Publicado originalmente no tópico do DVP-858 no HTFORUM, corrigido e ampliado
Embora para leitura da flash o mtktool funcione mesmo com o aparelho só ligado na tomada e até mesmo travado depois de uma leitura anterior, para que as outras funções do "Expert Mode" funcionem o aparelho precisa estar em operação normal.
Ou seja, para usar o "Expert Mode":
* Ligue o aparelho;
* Inicie o mtktool com o comando "mtktool prassi";
* Não use a janela "flash upgrade" para nada!
Exemplo de uso:
* Abra a janela "Memory Dump"
* Em "type" selecione "DRAM (BYTE)"
* Em "Address" coloque o endereço 376e599
* Desmarque "Double Word" se existir essa opção na sua versão
* Clique em Start
O resultado na tela será teóricamente o conteúdo da memória eeprom do aparelho.
Notas:
O endereço do conteúdo da eeprom não é fixo. É o endereço da Shared Memory (armAddressInfo) + 0x1999
http://tech.groups.yahoo.com/group/mt13x9/message/4339
Eu não estou certo de que 376e599 seja mesmo o endereço base da cópia da eeprom na Shared Memory. Os dados não batem com os exemplos que encontrei no MT13x9 e, embora os valores mudem quando eu mexo no setup, não estão mudando de forma consistente.
Outro exemplo de uso:
* Ligue o aparelho e coloque um filme para rodar;
* Habilite o Expert Mode;
* Abra a janela R/W Register;
* Em "type" selecione 8032 XDATA;
* Em "Addr" coloque "FB00"
* Em "Data" coloque "13"
* Clique em "Write"
O aparelho vai entrar em pausa!
Explicação:
A janela R/W Register lê e escreve diretamente em endereços de memória do MT1389, um endereço por vez.
* 8032 XDATA é a memória externa do controlador 8032 embutido no chip;
* FB00 é o endereço nessa memória externa onde é colocado o código ("mtkCommmand") dos comandos decodificados do controle remoto;
* 13 é o mtkCommand da tecla pause
A tabela completa de mtkCommands está no arquivo IR.CFG que vem com o mtktool 2.42. Existe outra ligeiramente diferente no arquivo keydef.h do código fonte. Eu tenho a tabela completa do proview, que descobri por tentativa e erro mesmo, porque não tinha achado esses arquivos ainda.
A tabela em keydef.h "bate" melhor com os aparelhos que já testei.
Então com esse simples recurso podemos testar o aparelho procurando por funções ocultas que não foram implementadas no DVP-858 (ou qualquer aparelho, porque o endereço FB00 parece ser comum a todos) por não existirem botões suficientes no remoto.
Algumas funções ocultas do Proview:
* STEP Rewind;
* STEP Forward;
* SLOW Rewind;
* ZOOM OUT (um comando que faz só ZOOM OUT sem entrar no ZOOM IN primeiro);
* Duas funções para digitar a senha do disco;
* Alternar entre Normal/PS, Normal/LB e Widescreen
Existem outras funções ocultas que poderiam ser acessadas com o remoto adequado (ou a gambiarra adequada):
* 0x46: Alterna entre modos de reverberação
* 0x58: escurece um pouco a iluminação (leds azuis)
* 0x59: Iluminação normal (brilho máximo)
E outras coisas, incluindo algumas sem utilidade alguma nesse aparelho, como funções de Karaokê.
-
Janelas já identificadas do Proview DVP-858
- 0x13 - A janela onde são exibidas as legendas .avi/.mpg
- 0x1F - A janela de exibição do volume. Você pode comprovar isso se colocar LEFT=200. Mas se mover a janela verticalmente, vai ser difícil encontrar uma posição onde ela possa aparecer.
- 0x00 - A janela onde são exibidas as mensagens, "Abrir", "fechar" e "carregando" e de avanço ou retrocesso
- 0x0F - A janela do bowser onde é exibida a duração de MP3, o indicador de volume, o bargraph e a numeração de arquivos
- 0x02 - A janela onde é exibido o tempo decorrido, a mensagem de Repeat e a de Zoom
- 0x06 - A janela onde é exibida que legenda ou faixa de áudio em DivX está selecionada
- 0x10 - é a principal do browser. Se você mexer nela pode travar o aparelho logo ao exibir o browser, com artefatos estranhos por toda a tela;
- 0x08 - Onde seria exibido o bargraph, se houvesse uma tecla no remoto para ativá-lo
- 0x1C - Onde é exibido o guia de Pan&Scan
- 0x14 - Onde é desenhado o logo "DVD-Video" do screen saver
-
Como identificar que janela é usada pelo screensaver.
Em todos os firmwares que olhei, ela fica nesta posição:
(http://ryan.com.br/imagens/mediatek/mtkwindows_janela_screensaver_50.jpg)
Geralmente é a única janela a ficar encostada na borda da tela.
-
Aprender assembler é que nem aprender a dirigir carro, mesmo que aprenda com um celta, fusca ou coisa parecida, se consegue dirigir muitos outros tipos de veículos. O meu aprendizado de assembler foi com o 6502, Z80 e 8088 ( e derivados ) bem antes de existir internet para nos ajudar ( para nós pobres mortais aqui no 4º Mundo ). Com o 8051 eu me sinto em casa, e consigo entender 99% das instruções do 8051 ( se não me falha a memória é um dos filhos do bom e velho Z80 ) mesmo tendo parado de mexer com assembler a mais de 10 anos ( só não sei o que faz um lcall, um movx e um ljump que tenho curiosidade de saber o que fazem exatamente ).
Muito bom este seu trabalho Jefferson, pena que eu não tenho mais a sua coragem, e nem tenho o seu conhecimento de eletrônica ( só arranho um pouco ), porque se não eu poderia meter as caras no firmware do RJTech 2100 . Mas infelizmente para mim não tem mais jeito, não tenho mais coragem nem de programar Pascal ou Delphi ( e olha que eu gostava muito de escrever em Pascal ), depois de trabalhar mais de 10 anos em informática ( em programação ) eu saturei de tal forma que não tenho mais saco de programar nada.
Obs. este link http://www.8052.com/tutorial.phtml do tutorial não está abrindo.
-
Obs. este link http://www.8052.com/tutorial.phtml do tutorial não está abrindo.
Aqui está abrindo.
# LCALL: Long Call
# LJMP: Long Jump
# MOVX: Move Extended Memory
-
Agora resolveu abrir.
-
Eu testei o LG DK194g com firmwares das séries 8xxx e 9xxx. Não dá o menor sinal de vida.
-
Como fazer com que o firmware Philips use fontes com cores normais.
É sabido que nos firmwares da Philips é preciso fazer uma "gambiarra" com as cores para poder desativar o background.
Eu descobri como fazer com que o firmware aceite fontes "normais".
Exemplo do DVP5960
Sub_Style primária. Substitua:
B1:D2DC - E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 7F 12 12
por:
B1:D2DC - 90 FC 1E 74 03 F0 A3 74 02 F0 E4 FB FD 7F 12 12
Sub_Style secundária. Substitua:
B3:5B9E - E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 12 C3 50
por:
B3:5B9E - 90 FC 1E 74 03 F0 A3 74 02 F0 E4 FB FD 12 C3 50
Com o mtkWindows, coloque Blend=3 na janela 0x12
Com o mtkReplacer coloque fontes "normais" com contorno
É isso. Nada mais de precisar inverter as cores da fonte para uso no firmware Philips :)
O que meu patch faz é desligar a definição de uma cor de background e ao mesmo tempo definir uma cor sólida para o contorno.
Ryan.
olha só que eu encontrei:
[B1:D2DC] E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 7F 12 12 [DVP5960]
[B1:D2DC] E4 90 FC 1F F0 A3 74 02 F0 7B 03 E4 FD 7F 12 12 [DVP5965]
[B3:5B9E] E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 12 C3 50 [DVP5960]
[B3:5B9E] E4 90 FC 1F F0 A3 74 02 F0 7B 03 E4 FD 12 C3 99 [DVP5965]
Como seria as alteraçoes para que o DVP5965 use fontes com cores normais?
-
[B1:D2DC] E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 7F 12 12 [DVP5960]
[B1:D2DC] E4 90 FC 1F F0 A3 74 02 F0 7B 03 E4 FD 7F 12 12 [DVP5965]
[B3:5B9E] E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 12 C3 50 [DVP5960]
[B3:5B9E] E4 90 FC 1F F0 A3 74 02 F0 7B 03 E4 FD 12 C3 99 [DVP5965]
Como seria as alteraçoes para que o DVP5965 use fontes com cores normais?
Parece simples. No meu patch:
onde tiver FC 1E coloque FC 1F (nas duas rotinas)
onde tiver C3 50 coloque C3 99
Porque só é preciso adaptar as diferenças de endereços entre os dois modelos. As rotinas são essencialmente iguais.
-
[B1:D2DC] E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 7F 12 12 [DVP5960]
[B1:D2DC] E4 90 FC 1F F0 A3 74 02 F0 7B 03 E4 FD 7F 12 12 [DVP5965]
[B3:5B9E] E4 90 FC 1E F0 A3 74 02 F0 7B 03 E4 FD 12 C3 50 [DVP5960]
[B3:5B9E] E4 90 FC 1F F0 A3 74 02 F0 7B 03 E4 FD 12 C3 99 [DVP5965]
Como seria as alteraçoes para que o DVP5965 use fontes com cores normais?
Parece simples. No meu patch:
onde tiver FC 1E coloque FC 1F (nas duas rotinas)
onde tiver C3 50 coloque C3 99
Porque só é preciso adaptar as diferenças de endereços entre os dois modelos. As rotinas são essencialmente iguais.
Caro Ryan.
Apliquei os Dois patches no FVP5965 conforme sua orientção.
resultado: Ao entrar e sair do Setup a legenda desaparece.
-
Apliquei os Dois patches no FVP5965 conforme sua orientção.
resultado: Ao entrar e sair do Setup a legenda desaparece.
Você sabe dizer se o DVP5965 tem o mesmo bug do DVP5960 de usar uma fonte diferente ao sair do setup? Se tiver e a segunda fonte for ruim de ler pode "parecer" que a legenda sumiu.
Isso aí não deveria acontecer. Funcionou comigo e as rotinas parecem idênticas.
Não posso ajudar nisso agora porque estou concentrado em outro problema.
-
Apliquei os Dois patches no FVP5965 conforme sua orientção.
resultado: Ao entrar e sair do Setup a legenda desaparece.
Você sabe dizer se o DVP5965 tem o mesmo bug do DVP5960 de usar uma fonte diferente ao sair do setup? Se tiver e a segunda fonte for ruim de ler pode "parecer" que a legenda sumiu.
Isso aí não deveria acontecer. Funcionou comigo e as rotinas parecem idênticas.
Não posso ajudar nisso agora porque estou concentrado em outro problema.
Vou testar sobre o 'bug' e depois reporto aqui.
-
Caro Ryan.
Apliquei os Dois patches no FVP5965 conforme sua orientção.
resultado: Ao entrar e sair do Setup a legenda desaparece.
Se bem entendir, vc você diz que a legenda aparece normal, so que ao entrar no Setup e sair, a legenda some, se for isso, é um bug do firmware do 5965K desde o original Philips.
-
Então talvez o DVP5965 também esteja usando as fontes 1 e 7 para legendas. A fonte 1 antes de entrar no setup e a fonte 7 após sair.
Se você mudar só a primeira fonte 1 e não mudar a fonte 7, pode parecer que ela sumiu.
-
Eu estava até agora escrevendo patches "na munheca" porque não conhecia um programa onde eu pudesse escrever em mnemônicos do 8051. Eu tinha que consultar o guia de referência o tempo todo, por não lembrar dos códigos para as instruções.
Mas não é que o NewAge tem um programa para isso há muito tempo?
O RunTime Assembler for Intel8051 v0.1.2.0 (http://newage.mpeg4-players.info/mt1389/tools/RTA8051_0.1.2.0.rar) permite que você escreva o patch usando os mnemônicos e salve como listagem (.lst), como uma lista de códigos hexa pronta para fazer um paste em um editor hexadecimal (*.hex) e como um arquivo binário (*.bin).
Mas atenção: o programa só salva as linhas que você tiver selecionado do lado direito!
Isso é incomum para o New Age, mas este programa ele liberou com o código fonte em Delphi 7 (http://newage.mpeg4-players.info/mt1389/opensource/RTA8051_v0.1.2.0_Delphi7_Source.rar).
-
Menus Mediatek - Textos
Não espere entender muito do que vou mostrar abaixo. É parte de um projeto maior que só vai fazer sentido mesmo quando estiver pronto.
Você pode ver (mas não pode editar) a estrutura dos menus de um firmware no mtkRemaker:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_mtkremaker_50.jpg)
Cada página de menu tem dois textos associados
(http://ryan.com.br/imagens/mediatek/mediatek_menu_pagetext_50.jpg)
No mtkRemaker:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_mtkremaker_pagetext_50.jpg)
Cada código hexadecimal destacado é o respectivo código do texto, como você pode ver no próprio mtkRemaker ou no mtkLangEditor. Se você mudar esse código, muda o texto exibido (mas eu não vou explicar como isso é feito agora).
Cada item de menu tem dois textos associados
(http://ryan.com.br/imagens/mediatek/mediatek_menu_itemtext_50.jpg)
No mtkRemaker:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_mtkremaker_itemtext_50.jpg)
Cada opção tem três textos associados
(http://ryan.com.br/imagens/mediatek/mediatek_menu_optiontext_50.jpg)
No mtkRemaker:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_mtkremaker_optiontext_50.jpg)
Eu estou mostrando textos em inglês porque esta costuma ser a linguagem default Mediatek. Os códigos dos textos são sempre os mesmos, não importando que linguagem você escolheu no Setup. Isso torna a adição e a alteração de textos algo relativamente simples.
-
Menus Mediatek - Tipos de Itens
Item tipo 0008
Este tipo é o que exibe uma lista de opções:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_item0008_50.jpg)
No mtkRemaker:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_mtkremaker_item0008_50.jpg)
1 (0008) - Tipo de Item
2 (FFFF) - Ícone associado ao item. "FFFF" significa "sem ícone" ("No Pic." no mtkRemaker)
3 (0092) - Primeiro Texto
4 (009A) - Segundo texto
5 (000D) - Endereço da EEPROM onde o valor é armazenado
6 (002B) - Endereço na shared memory onde o valor é armazenado
7 (0003) - É igual ao número de opções a exibir, menos um
8 (0000) - Valor default
9 (FF32B1) - Offset da lista de ponteiros para as opções (32B1) no mesmo banco
10 (1FD2) - Offset da rotina, no mesmo banco, que é chamada quando se seleciona qualquer das opções;
Item tipo 0003
Este tipo não exibe opção alguma. Selecioná-lo abre uma outra página de itens. Seis dos sete itens do menu Audio do Proview DVP-858 são do tipo 0003:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_item0003_50.jpg)
No mtkRemaker:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_mtkremaker_item0003_50.jpg)
1 (0008) - Tipo de Item
2 (FFFF) - Ícone associado ao item. "FFFF" significa "sem ícone" ("No Pic." no mtkRemaker)
3 (008B) - Primeiro Texto
4 (00E4) - Segundo texto
5 (0002) - Número da página que será aberta quando este item for selecionado Nota: todos os documentos sobre menus do grupo MT13x9 dizem que aqui também tem um endereço EEPROM. Meus testes mostram que nisso os hackers do MT13x9 se enganaram ou não atualizaram os documentos.
6 (0000) - Aparentemente não é usado, mas sempre tem zeros
7 (0000) - Aparentemente não é usado, mas sempre tem zeros
8 (0000) - Aparentemente não é usado, mas sempre tem zeros
9 (000000) - Aparentemente não é usado, mas sempre tem zeros
10 (0000) - Aparentemente não é usado, mas sempre tem zeros
Item tipo 000D
Este tipo tem opções, mas elas são exibidas graficamente e não em forma de lista. Eu não tenho mais exemplos desse tipo por isso é difícil tirar conclusões. Mas parece que é usado exclusivamente para o ajuste Channel Delay.
(http://ryan.com.br/imagens/mediatek/mediatek_menu_item000D_50.jpg)
(http://ryan.com.br/imagens/mediatek/)
Existem outros tipos de itens, mas falarei deles quando for oportuno.
-
Menus Mediatek - Ícones
(http://ryan.com.br/imagens/mediatek/mediatek_menu_icones_50.jpg)
(http://ryan.com.br/imagens/mediatek/mediatek_menu_mtkremaker_icones_50.jpg)
Perceba que existe uma pequena inconsistência no mtkRemaker. No mapa do menu ele chama o ícone 0019 de "Pic 25", porque 19 é 25 em hexadecimal. Até aí tudo normal. Mas na lista de ícones, como ele começa a contagem em "1", mas o primeiro ícone é o '00", a numeração decimal da lista não corresponde à hexadecimal entre colchetes. Fique atento a isso porque o código correto do item é o entre colchetes. É por esse número que ele é identificado em qualquer parte do firmware.
"FFFF" significa "sem ícone" ("No Pic." no mtkRemaker)
-
Menus Mediatek - Números de página
Como eu disse anteriormente, itens do tipo 0003 não tem opções. Eles apontam para uma outra página. Você precisa converter para decimal e adicionar um:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_numpaginas1_50.jpg)
Com esse número você pode localizar a página no mtkRemaker:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_numpaginas_50.jpg)
O firmware tem uma tabela de offsets com o endereço da definição de cada página. Sabendo onde está essa tabela, pelo número você encontra a localização da definição de qualquer página no firmware.
No firmware do Proview DVP-858, versão 20.07, a tabela começa no endereço 0x24473:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_numpaginas_tabela_50.jpg)
"FF" é uma espécie de "cabeçalho de ponteiro". Simplesmente ignore, porque apenas os próximos dois bytes são relevantes. Os destaques em vermelho são apenas para ajudar a demarcar os ponteiros visualmente. Não tem nenhum significado especial.
Na imagem eu estou destacando o offset para a definição da página 14 (password setup). Se você mudar esse offset poderá exibir uma outra página no lugar da página de senhas. Tanto uma página já existente no firmware quanto uma página criada por você, desde que esteja no mesmo banco (no caso, banco 2).
Por exemplo, o Proview DVP-858 tem uma página de escolha de região facilmente localizável com o mtkRemaker:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_mtkremaker_regioncode_50.jpg)
Mas que ninguém sabe ainda qual é a senha de acesso. Com um pequeno truque, você pode substituir a página Password (se você não tem filhos pequenos essa página não deve servir para nada) pela página de escolha de região.
O número da página é 27. Procure pelo 27o offset na tabela de offsets:
(http://ryan.com.br/imagens/mediatek/mediatek_menu_numpaginas_tabela1_50.jpg)
E troque o offset da posição 14 por esse. Ou seja: FF3140 => FF445D
Com isso, ao entrar no menu "Password", o que vai abrir é a página de escolha de região.
(http://ryan.com.br/imagens/mediatek/proview_dvp858_teste_regioncode_50.jpg)
-
Endereços EEPROM usados no Proview DVP-858
Obtidos no mtkRemaker, nos items do tipo 0008:
0004 | Component | Component
0005 | TV Mode | Set P-SCAN On/Off
0006 | Country Region | PG Country Region Code
0007 | Screen Saver | Screen Saver
0008 | Parental | Set Parental Control
0009 | Disc Menu | Preferred Menu Language
000A | Audio | Preferred Audio Language
000B | Subtitle | Preferred Subtitle Language
000C | TV Type | Set TV Standard
000D | TV Display | Set TV Display Mode
000E | OSD Lang | Set OSD Language
000F | Angle Mark | Set Angle Mark
0012 | PBC | Set PBC State
0013 | Last Memory | Set Last Memory State
0014 | Password Mode | Password Mode
0015 | Captions | Closed Caption
0016 | Region Code | Region Code
0022 | PanelŽlight | PanelŽlight
002A | SPDIF Output | Setup SPDIF
0030 | Downmix | Set Downmix Mode
0031 | Front Speaker | Setup Front Speaker
0032 | Center Speaker | SetupCenterŽSpeaker
0033 | Rear Speaker | Setup Rear Surround Speaker
0034 | Subwoofer | Setup Subwoofer
0037 | Test Tone | Test Tone
0038 | Post DRC | Post DRC
0039 | LPCM Out | Set LPCM SPDIF Output RATE
003D | EQ Type | Select Equalizer Type
0049 | MIC | MIC
0067 | PRO Logic II | PRO Logic II
006A | Reverb Mode | Reverb Mode
006E | Mode | Select PRO Logic II Mode
006F | Panorama | Set PRO Logic II Panorama Control
0070 | Center Width | Set PRO Logic II Center Width
0071 | Dimension | Set PRO Logic II Dimension Size
0072 | Bass Boost | Bass Boost
0073 | Super Bass | Super Bass
0074 | Treble Boost | Treble Boost
007A | Sharpness | Sharpness
007E | Gamma | Gamma
0080 | Luma Delay | Luma Delay
0087 | HDMI | HDMI
0088 | Resolution | Resolution
008F | Dual Mono | Dual Mono (1 + 1) Setup
0092 | Filter | Filter
00C8 | HD Mode | HD Mode
Dos itens acima, um deles talvez possa ser usado. "0049" é usado pelo Setup do Microfone, mas o Proview não pega microfone!
Outros endereços, obtidos pela análise da listagem feita pelo IDA, coletando chamadas a Pref_Getchar e excluindo os endereços já conhecidos:
0x17
0x18
0x19
0x1A
0x1B
0x1C
0x23
0x3A
0x4C
0x80
0x85
Podem existir outros endereços, que são usados indiretamente. Eu só compilei os que são usados carregando R7 explicitamente pouco antes de chamar Pref_Getchar. Existem umas 42 chamadas indiretas, precedidas por algo do tipo: "MOV R7,A", que podem se referir a endereços já da lista ou a outros. Eu vou tentar localizar Pref_Putchar para tentar determinar outros endereços antes de começar a chutar...
-
Como eu disse anteriormente, o item do tipo 0008 já inclui a definição do endereço de memória EEPROM usado. Esse endereço é usado imediatamente quando o item é exibido da tela sem que você precise escrever uma linha de código sequer. Se você criar um item do tipo 0008, no momento em que ele é exibido na tela o conteúdo do respectivo endereço EEPROM é lido. Se você mudar uma opção, o novo valor é imediatamente gravado. Não é necessário fazer nada em assembly.
Você pode ver o efeito disso se criar um item de menu que use o mesmo endereço de EEPROM usado por um outro item. Ao mudar em um e ir para a página onde está o outro, a mudança já estará lá, sem nem ser necessário sair e entrar no SETUP.
O endereço que existe no final da definição do tipo 0008 serve para quando você precisa que a mudança que você fez entre em vigor imediatamente (que ela seja interpretada imediatamente. Note que gravar e interpretar são dois passos distintos)
-
Rotina SetMpeg4SubtitleParams do DVP-858;
Esta rotina é a chave do ajuste da posição da janela de legendas pelo setup;
B1:F4DD SetMPeg4SubtitleParams: ; CODE XREF: BankSw_263_B1_E1E7+10p
B1:F4DD E4 clr A
B1:F4DE 90 FC 44 mov DPTR, #XRAM_FC44 ; wX1.high
B1:F4E1 F0 movx @DPTR, A
B1:F4E2 A3 inc DPTR
B1:F4E3 F0 movx @DPTR, A
B1:F4E4 90 FC 46 mov DPTR, #XRAM_FC46 ; wY1.high
B1:F4E7 F0 movx @DPTR, A
B1:F4E8 A3 inc DPTR
B1:F4E9 F0 movx @DPTR, A
B1:F4EA 90 FC 49 mov DPTR, #XRAM_FC49 ; wX2.high
B1:F4ED 74 02 mov A, #2
B1:F4EF F0 movx @DPTR, A
B1:F4F0 A3 inc DPTR
B1:F4F1 74 30 mov A, #0x30 ; '0' ; 0x230 = 560
B1:F4F3 F0 movx @DPTR, A
B1:F4F4 90 FC 4D mov DPTR, #XRAM_FC4D ; wY2.high (define a altura)
B1:F4F7 E4 clr A
B1:F4F8 F0 movx @DPTR, A
B1:F4F9 A3 inc DPTR
B1:F4FA 74 5A mov A, #0x5A ; 'Z'
B1:F4FC F0 movx @DPTR, A
B1:F4FD E4 clr A
B1:F4FE 90 FB 8E mov DPTR, #XRAM_FB8E ; Espaço entre linhas
B1:F501 F0 movx @DPTR, A
B1:F502 7B 08 mov R3, #8 ; Ansi Codepage = 0x08 (all chars)
B1:F504 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro), 0x02 (Direita)
B1:F506 7F 13 mov R7, #0x13 ; Janela da legenda
B1:F508 12 1E B8 lcall PSB_Set_Param_B1_BS
B1:F50B D3 setb C
B1:F50C 22 ret
B1:F50C ; End of function SetMPeg4SubtitleParams
-
Proview DVP-858 : Como consertar a inversão de cores entre browser e legendas.
Publicado por mim originalmente no HTFORUM. Estou trazendo meus textos para cá.
Com isso, é possível ter fontes com contorno preto no browser, em vez dos contornos amarelo ou branco (dependendo da cor de preenchimento das legendas).
No firmware 20.07
B1:A506 02 => 03
B1:A509 04 => 14
Isso vai fazer com que o browser use as mesmas cores da legenda, na mesma ordem.
Para entender como isso funciona e também como separar as cores do browser das cores da legenda, leiam meu tutorial. (http://ryan.com.br/mtk_hack_palette.htm)
-
O básico sobre "bank switching"
O microcontrolador 8032 embutido na CPU Mediatek só pode endereçar um programa de 64K. Para que o DVD player possa usar programas bem maiores, o firmware é dividido em bancos/páginas de 64K e usa-se uma técnica em que toda vez que é preciso acessar uma rotina que está em outro banco, esse banco é ativado (provavelmente é apenas um ponteiro apontando para o início dele), a rotina é executada e saindo dela o banco anterior é ativado de novo, continuando o programa. Por sorte, isso tudo ocorre bem rápido.
Rotinas que podem ser acessadas de qualquer lugar do programa tem seus "pontos de entrada" em uma tabela que existe no início de todos os bancos (a tabela é igual em todos), chamada Bank Transfer Table (BTT). Assim, se você acessa uma rotina que esteja na BTT usando a instrução LCALL 19E4, esse é o modo de acesso de qualquer lugar do firmware. É como se a rotina estivesse presente em todos os bancos, mas fisicamente pode estar em qualquer um deles. Se você seguir as instruções na BTT irá descobrir onde realmente está a rotina.
Se você quiser de um certo banco saltar para uma rotina que está em outro mas que não está na BTT, pode ser mais fácil fazer uma cópia dela no banco onde você quer usá-la.
O exemplo abaixo é de quatro entradas nas BTTs em dois bancos diferentes. Perceba que são idênticas em tudo, exceto o banco onde estão. Os rótulos que você vê são os dados pelo script MT13x9 no IDA. A primeira está nomeada "Pref_Getchar" porque eu dei o nome depois que a localizei no firmware. As outras três eu não sei para que servem por isso estão com os nomes "genéricos" dados pelo script.
B1:19E4 90 F2 2B mov DPTR, #Pref_Getchar
B1:19E7 02 19 17 ljmp B1_Bank_5
B1:19EA 90 C9 4B mov DPTR, #BankSw_23_B4_C94B
B1:19ED 02 18 FF ljmp B1_Bank_4
B1:19F0 90 B0 0C mov DPTR, #BankSw_24_B1_B00C
B1:19F3 02 18 B7 ljmp B1_Bank_1
B1:19F6 90 B1 7E mov DPTR, #BankSw_25_B1_B17E
B1:19F9 02 18 B7 ljmp B1_Bank_1
B2:19E4 90 F2 2B mov DPTR, #Pref_Getchar
B2:19E7 02 19 17 ljmp B2_Bank_5
B2:19EA 90 C9 4B mov DPTR, #BankSw_23_B4_C94B
B2:19ED 02 18 FF ljmp B2_Bank_4
B2:19F0 90 B0 0C mov DPTR, #BankSw_24_B1_B00C
B2:19F3 02 18 B7 ljmp B2_Bank_1
B2:19F6 90 B1 7E mov DPTR, #BankSw_25_B1_B17E
B2:19F9 02 18 B7 ljmp B2_Bank_1
Como você pode ver, estando em qualquer banco, se você der um LCALL 19E4 (Pref_Getchar, no Proview DVP-858), DPTR é carregado com F22B (o endereço real da rotina no banco destino) e a rotina que ativa o banco destino é chamada (LJMP 1917). Note que as duas últimas entradas são para o banco 1, por isso os dois saltos são para a mesma rotina (18B7), apenas mudando o valor carregado em DPTR.
Parece fácil, mas ainda não testei se dá para criar um salto próprio.
É importante que você entenda isso para que não se surpreenda com o fato de que todas as rotinas são chamadas com endereços de apenas 16 bits, quando o tamanho do firmware ultrapassa isso. E porque o firmware é dividido em bancos, claro.
Atenção: tenha em mente que uma chamada à rotina feita do próprio banco onde ela está será feita com o endereço real, sem passar pelo mecanismo de Bank Switch. Fique atento a isso, porque senão você poderá não identificar essas chamadas.
-
Como o firmware lê preferências do usuário
hardware
Todas as preferências são armazenadas no pequeno chip de memória EEPROM, que costuma ter de de 256 bytes (24C02) a 2000 bytes (24C16)
Lenoxx DV-406: 24C04 - 512 bytes
Philips DVP5100K: 24C08 - 1000 bytes
Philips DVP3040K: 24C08 - 1000 bytes
Os aparelhos com HDMI como o Philips DVP5965K e o Proview DVP-858 tem dois chips: um 24C08 (1000bytes) e um 24C16(2000 bytes). Pressupõe-se que o 24C16 seja destinado ao uso pelo chip HDMI.
software
O firmware tem rotinas específicas para escrever e ler na eeprom, um byte por vez. Os hackers do MT13x9 chamam essas rotinas de Pref_GetChar (ler) e Pref_PutChar (escrever). Para usar essas rotinas você só precisa carregar os registradores R6 e R7 com o endereço do byte que você quer acessar e, no caso de Pref_GetChar, receber o valor lido em R7.
O primeiro passo, claro, é descobrir em que endereço estão as rotinas no seu firmware. Isso não é padronizado. Como esta rotina específica costuma ser acessada por todos os bancos do firmware, ela é uma das rotinas na tabela "Bank Switch".
No caso do Proview DVP-858, para ler do endereço 0x87 da EEPROM e colocar o resultado no acumulador, basta fazer algo assim:
B2:7E49 7F 87 mov R7, #0x87 ; 'ç'
B2:7E4B 7E 00 mov R6, #0
B2:7E4D 12 19 E4 lcall Pref_GetChar_B2_BS?
B2:7E50 EF mov A, R7
Daí você faz o que quiser. Nem é necessário usar o acumulador, porque você pode até chamar logo em seguida uma rotina que receba diretamente um de seus parâmetros por R7.
Em teoria, R6 é usado para compor o endereço e é maior que zero se o endereço a acessar for maior que 255. Mas nenhum dos endereços acima de 255 (e até alguns abaixo) funcionou nos meus testes.
A compreensão de Pref_GetChar é essencial para qualquer trabalho com menus Mediatek. Como os valores são gravados diretamente pelo próprio mecanismo de menus (como expliquei anteriomente), saber onde está Pref_Putchar (gravar) não é necessário na maioria dos casos.
-
Como é feita a escolha de cores e fontes no meu firmware DVP-858
Primeira parte: o menu
Nota: Os menus podem ser quase que inteiramente testados sem uma única linha de assembly do firmware ser alterada (passo 2). Ao terminar este passo os itens precisam ser visíveis e você deve poder escolher opções normalmente.
(http://ryan.com.br/imagens/mediatek/proview_dvp858_expA_fontes(50).jpg)
(http://ryan.com.br/imagens/mediatek/proview_dvp858_expA_color(50).jpg)
(http://ryan.com.br/imagens/mediatek/proview_dvp858_explA_regioncode(50).jpg)
Criação de menus é uma das coisas mais complexas e tediosas que estudei no firmware Mediatek. Os próprios documentos publicados pelo grupo MT13x9 são confusos demais, tralvez por estarem em um inglês capenga porque essa não é a língua de nenhum dos hackers principais do grupo. Eu já comecei a arranhar o assunto em posts anteriores neste tópico, mas ainda não é o suficiente para saber como criar um do zero.
Como eu não estou preparado (nem com saco) para explicar como a criação de menus funciona, vou mostrar pelo menos como enxertar no firmware Proview DVP-858 20.07 o menu que criei para o meu firmware experimental, já com as opções de mudança de cor, 8 fontes, versão e escolha de região:
No endereço 2EC00, insira a seguinte string hexa:
05 0D 05 0D 03 03 00 05 0E 05 0E 03 04 04 05 0F 05 0F 03 05 06 05 10 05 10 03 06 08 05 11 05 11 03 07 0A 05 12 05 12 03 08 0C 05 13 05 13 03 09 0E 05 14 05 14 03 0A 10 FF EC 00 FF EC 07 FF EC 0E FF EC 15 FF EC 1C FF EC 23 FF EC 2A FF EC 31 00 08 FF FF 05 0C 05 0C 00 06 00 00 00 07 00 00 FF EC 38 00 00 05 16 05 16 05 18 0F 05 17 05 17 05 19 02 FF EC 65 FF EC 6C 00 08 FF FF 05 15 05 15 00 71 00 00 00 01 00 0F FF EC 73 00 00 05 17 05 17 03 03 00 FF EC 8E 00 03 FF FF 01 A1 01 A1 00 15 00 00 00 00 00 00 FF EC 95 00 00 02 BF 02 BF 02 BF 00 02 C0 02 C0 02 C0 01 02 C1 02 C1 02 C1 02 02 C2 02 C2 02 C2 03 02 C3 02 C3 02 C3 04 02 C4 02 C4 02 C4 05 02 C5 02 C5 02 C5 06 FF EC AD FF EC B4 FF EC BB FF EC C2 FF EC C9 FF EC D0 FF EC D7 00 08 FF FF 01 EB 01 EB 00 16 00 3F 00 06 00 00 FF EC DE 00 00 01 78 01 78 04 F1 00 01 79 01 79 04 F2 01 FF ED 08 FF ED 0F 00 08 FF FF 00 D3 00 D3 00 14 00 00 00 01 00 00 FF ED 16 1F BA 01 2F 02 97 00 00 00 FF ED 31 00 08 FF FF 01 30 02 97 FF FF 00 00 00 00 00 00 FF ED 38 1F C0 FF EC 50 FF EC 79 FF EC 98 FF EC F3 FF ED 1C FF ED 3B 03 00 CF 00 00 06 FF ED 50 00 00
Tudo aí em cima é a estrutura do menu. Não há uma única instrução de assembly aí.
Em negrito, os endereços EEPROM usados pelo meu firmware experimental. basta mudar esses números e as rotinas correspondentes (veja meu post seguinte) para experimentar com outros endereços de EEPROM.
Inserir o menu não basta. Falta ainda inserir o ponteiro para ele no meu principal.
No endereço 2449B
31 40 => ED 62
E o menu será exibido
No meu firmware, verifique que strings foram adicionadas por mim no final de Language 00 e coloque as versões em português em Language 01. Isso deve bastar para que você tenha escolha de cor e fontes no setup.
E, claro, coloque mais 5 fontes..
-
Segunda parte: mudanças no código assembly
Nota: não serve para nada sem a criação dos menus
A rotina abaixo é a sub_style primária, mostrando os dois pontos que modifiquei para chamar as minhas rotinas
B1:DC91 Sub_Style: ; CODE XREF: B1_998C+5Cp
B1:DC91 EF mov A, R7
B1:DC92 24 FE add A, #0xFE ; '¦'
B1:DC94 60 53 jz B1_DCE9
B1:DC96 14 dec A
B1:DC97 60 50 jz B1_DCE9
B1:DC99 14 dec A
B1:DC9A 60 59 jz B1_DCF5
B1:DC9C 24 03 add A, #3
B1:DC9E 70 58 jnz B1_DCF8
B1:DCA0 12 FF 00 lcall B1_FF00 ; Chama a rotina que escolhe a fonte
B1:DCA3 00 nop
B1:DCA4 00 nop
B1:DCA5 D2 46 setb RAM_28.6
B1:DCA7 7F 13 mov R7, #0x13
B1:DCA9 12 1D D4 lcall B1_BS_190_B5_13E8
B1:DCAC 7F 13 mov R7, #0x13
B1:DCAE 12 1D DA lcall B1_BS_191_B5_A4B2
B1:DCB1 12 FF 40 lcall B1_FF40 ; Chama a rotina que define a cor da legenda
B1:DCB4 00 nop
B1:DCB5 00 nop
B1:DCB6 00 nop
B1:DCB7 00 nop
B1:DCB8 00 nop
B1:DCB9 00 nop
B1:DCBA 00 nop
B1:DCBB 00 nop
B1:DCBC 00 nop
B1:DCBD 00 nop
B1:DCBE 00 nop
B1:DCBF 12 1D E0 lcall B1_BS_192_B5_D53E
B1:DCC2 E4 clr A
B1:DCC3 FD mov R5, A
B1:DCC4 7F 13 mov R7, #0x13
B1:DCC6 12 1E B2 lcall B1_BS_227_B5_E5A1
Abaixo, trecho da Sub_Style secundária, mostrando o ponto de modificação
B1:E9FE 90 FC AB mov DPTR, #XRAM_FCAB
B1:EA01 E0 movx A, @DPTR
B1:EA02 64 03 xrl A, #3
B1:EA04 70 35 jnz B1_EA3B
B1:EA06 7F 06 mov R7, #6
B1:EA08 12 A9 48 lcall BankSw_241_B1_A948
B1:EA0B 50 2E jnc B1_EA3B
B1:EA0D D2 46 setb RAM_28.6
B1:EA0F 7F 13 mov R7, #0x13
B1:EA11 12 1D D4 lcall B1_BS_190_B5_13E8
B1:EA14 7F 13 mov R7, #0x13
B1:EA16 12 1D DA lcall B1_BS_191_B5_A4B2
B1:EA19 12 FF 00 lcall B1_FF00 ; Aqui eu chamo minha rotina que escolhe a fonte
B1:EA1C 12 FF 40 lcall B1_FF40 ; E aqui a que escolhe a cor
B1:EA1F 00 nop
B1:EA20 00 nop
B1:EA21 00 nop
B1:EA22 00 nop
B1:EA23 00 nop
B1:EA24 00 nop
B1:EA25 00 nop
B1:EA26 00 nop
B1:EA27 12 1D E0 lcall B1_BS_192_B5_D53E
Note que as duas Sub_style chamam as mesmas rotinas que eu criei. Não é preciso criar versões separadas.
Agora, as rotinas:
Escolha de fonte
B1:FF00 7F 06 mov R7, #6 ; Endereço 0x06 da eeprom
B1:FF02 7E 00 mov R6, #0
B1:FF04 12 19 E4 lcall Pref_Getchar_B1BS
B1:FF07 12 1E 70 lcall OSD_SetFont_B1BS
B1:FF0A 22 ret
Escolha da cor
É importante que você note que esta rotina é basicamente o que foi apagado da Sub_style, com o acréscimo inicial das instruções que pegam o valor na EEPROM e mínimas adaptações.
B1:FF40 7F 71 mov R7, #0x71 ; 'q' ; Endereço 0x71 da eeprom
B1:FF42 7E 00 mov R6, #0
B1:FF44 12 19 E4 lcall Pref_Getchar_B1BS
B1:FF47 EF mov A, R7
B1:FF48 FD mov R5, A
B1:FF49 90 FC 07 mov DPTR, #XRAM_FC07
B1:FF4C 74 03 mov A, #3
B1:FF4E F0 movx @DPTR, A
B1:FF4F A3 inc DPTR
B1:FF50 ED mov A, R5
B1:FF51 F0 movx @DPTR, A
B1:FF52 E4 clr A
B1:FF53 FB mov R3, A
B1:FF54 FD mov R5, A
B1:FF55 7F 13 mov R7, #0x13
B1:FF57 22 ret
Nota 1: os endereços EEPROM que estou usando ainda são experimentais. Eles estão sendo usados por outras opções do menu, mas funcionam.
Nota 2: as duas rotinas estão bem espaçadas no espaço livre do banco 1. Isso é apenas para facilitar a identificação e o debug e os espaços devem ser removidos em uma versão final do firmware.
-
Como definir que fonte é usada por cada string gravada no firmware
Talvez você tenha reparado dois posts atrás que na minha imagem das opções de fonte do meu firmware cada uma delas é mostrada com a respectiva fonte.
(http://ryan.com.br/imagens/mediatek/proview_dvp858_expA_fontes(50).jpg)
Quando eu vi isso pela primeira vez em um firmware do DVP5100 achei que fosse algo complexo de fazer, mas é ridiculamente simples, com as ferramentas existentes.
Use o mtkLangEditor (http://personal.inet.fi/cool/mediatek/programs/mtklangeditor.html):
(http://ryan.com.br/imagens/mediatek/mediatek_mtklangeditor_font(50).jpg)
Na coluna indicada, cada número corresponde à fonte que você deseja usar, conforme você pode ver no mtkRemaker. A numeração não é seqüencial como você pode ver. Confira no mtkRemaker.
Depois que você tiver salvo a modificação e abrir de novo o Language Code, verá algo estranho:
(http://ryan.com.br/imagens/mediatek/mediatek_mtklangeditor_font1(50).jpg)
Isso é normal. As palavras foram apenas substituídas por uma representação numérica do texto considerando a ordem na respectiva fonte. O motivo disso eu não conheço. Nota: a numeração é hexadecimal e começa em zero, enquanto a vista no mtkremaker é decimal e começa em um.
-
Configuração do IDA - i51.cfg
Apesar de não ser indispensável, existe um passo na instalação do IDA que pode ajudar no reconhecimento do código.
Numa instalação padrão do IDA, quando você escolhe o processador 8051 se depara com esta tela:
(http://ryan.com.br/imagens/mediatek/mediatek_ida_devicename_c517(50).jpg)
Onde você simplesmente dá OK para prosseguir. O procedimento a seguir vai mudar isso para que você possa escolher esta opção:
(http://ryan.com.br/imagens/mediatek/mediatek_ida_devicename_mt1389(50).jpg)
Dentro de alguns ZIPs com os scripts de parse (*.idc), você vai encontrar um arquivo i51.cfg. O conteúdo desse arquivo deve ser mesclado ao conteúdo do mesmo arquivo já existente na pasta CFG do IDA.
Por exemplo, este é o conteúdo que precisa ser mesclado. Eu dividi as duas seções do arquivo com cores diferentes:
.default MT1389
.MT1389
; Mediatek 1389
; MEMORY MAP
area DATA RAM 0x00000:0x00080
area DATA FSR 0x00080:0x00100
area XTRN XRAM 0x0F800:0x0FF00
area CODE ROM 0x00000:0x10000
;area CODE ROM1 0x10000:0x20000
;area CODE ROM2 0x20000:0x30000
;area CODE ROM3 0x30000:0x40000
;area CODE ROM4 0x40000:0x50000
;area CODE ROM5 0x50000:0x60000
;area CODE ROM6 0x60000:0x70000
;area CODE ROM7 0x70000:0x80000
; Interrupt and reset vector assignments
interrupt Reset 0x0000 RESET
interrupt ExtInt0 0x0003 External interrupt 0
interrupt TimInt0 0x000B Timer 0 overflow
;interrupt IE1 0x0013 External interrupt 1
;interrupt TF1 0x001B Timer 1 overflow
;interrupt RI0_TI0 0x0023 Serial channel 0
interrupt TimInt2 0x002B Timer 2 overflow/ext. reload
;interrupt IADC 0x0043 A/D converter
;interrupt IEX2 0x004B External interrupt 2
;interrupt IEX3 0x0053 External interrupt 3
;interrupt IEX4 0x005B External interrupt 4
;interrupt IEX5 0x0063 External interrupt 5
;interrupt IEX6 0x006B External interrupt 6
;interrupt RI1_TI1 0x0083 Serial channel 1
;interrupt CTF 0x009B Compare timer overflow
; INPUT/OUTPUT PORTS
P0 0x0080 Port 0
P0.P0.7 7
P0.P0.6 6
P0.P0.5 5
P0.P0.4 4
P0.P0.3 3
P0.P0.2 2
P0.P0.1 1
P0.P0.0 0
SP 0x0081 Stack Pointer
DPL 0x0082 Data Pointer, Low Byte
DPH 0x0083 Data Pointer, High Byte
;RES84 0x0084 RESERVED
;RES85 0x0085 RESERVED
WDTREL 0x0086 Watchdog Timer Reload Reg.
PCON 0x0087 Power Control Register
TCON 0x0088 Timer Control Register
TMOD 0x0089 Timer Mode Register
TL0 0x008A Timer 0, Low Byte
TL1 0x008B Timer 1, Low Byte
TH0 0x008C Timer 0, High Byte
TH1 0x008D Timer 1, High Byte
;RESERVED008E 0x008E RESERVED
;RESERVED008F 0x008F RESERVED
P1 0x0090 Port 1
P1.SDA 7 SDA data EEPROM
P1.SCL 6 SCL clock EEPROM
P1.DATA_PIN 5 VFD DATA PIN
P1.STROBE_PIN 4 VFD STROBE PIN
P1.CLK_PIN 3 VFD CLK PIN
P1.P1.A18 2 A18
P1.P1.A17 1 A17
P1.T2 0 T2
;RESERVED0091 0x0091 RESERVED
DPSEL 0x0092 Data Pointer Select Register
;RESERVED0093 0x0093 RESERVED
;RESERVED0094 0x0094 RESERVED
ASCL 0x0095
ADAT 0x0096
ACON 0x0097
SCON 0x0098 Serial Channel 0 Control Reg.
SBUF 0x0099 Serial Channel 0 Buffer Reg.
IEN2 0x009A Interrupt Enable Register 2
SCON2 0x009B Serial Channel 1 Control Reg.
SBUF2 0x009C Serial Channel 1 Buffer Reg.,
SREL2 0x009D Serial Channel 1 Reload Reg., low byte
;RESERVED009E 0x009E RESERVED
;RESERVED009F 0x009F RESERVED
P2 0x00A0 Port 2
P2.P2.7 7
P2.P2.6 6
P2.P2.5 5
P2.P2.4 4
P2.P2.3 3
P2.P2.2 2
P2.P2.1 1
P2.P2.0 0
IEN0 0x00A8 Interrupt Enable Register 0
IEN0.EA 7
IEN0.6 6
IEN0.5 5
IEN0.4 4
IEN0.3 3
IEN0.2 2
IEN0.1 1
IEN0.0 0
IP0 0x00A9 Interrupt Priority Register 0
;S0RELL 0x00AA Serial Channel 0, Reload Reg., low byte
PWM4P 0x00AA
PWM4W 0x00AB
;RESERVED00AC 0x00AC RESERVED
;RESERVED00AD 0x00AD RESERVED
WMKEY 0x00AE
;RESERVED00AF 0x00AF RESERVED
P3 0x00B0 Port 3
P3.P3.7 7
P3.P3.6 6
P3.T1 5
P3.T0 4
P3.P3.3 3
P3.P3.2 2 Select Flash
P3.P3.1 1
P3.P3.0 0
PSCL0L 0x00B1
PSCL0H 0x00B2 RESERVED
PSCL1L 0x00B3 RESERVED
PSCL1H 0x00B4 RESERVED
;RESERVED00B5 0x00B5 RESERVED
;RESERVED00B6 0x00B6 RESERVED
IPA 0x00B7 RESERVED
;IEN1 0x00B8 Interrupt Enable Register 1
IP 0x00B8
IP1 0x00B9 Interrupt Priority Register 1
S0RELH 0x00BA Serial Channel 0, Reload Reg., high byte
S1RELH 0x00BB Serial Channel 1, Reload Reg.,high byte
;RESERVED00BC 0x00BC RESERVED
;RESERVED00BD 0x00BD RESERVED
;RESERVED00BE 0x00BE RESERVED
;RESERVED00BF 0x00BF RESERVED
;IRCON 0x00C0 Interrupt Request Control Register
P4 0x00C0 Interrupt Request Control Register
CCEN 0x00C1 Comp./Capture Enable Reg.
CCL1 0x00C2 Comp./Capture Reg. 1, Low Byte
CCH1 0x00C3 Comp./Capture Reg. 1, High Byte
CCL2 0x00C4 Comp./Capture Reg. 2, Low Byte
CCH2 0x00C5 Comp./Capture Reg. 2, High Byte
CCL3 0x00C6 Comp./Capture Reg. 3, Low Byte
CCH3 0x00C7 Comp./Capture Reg. 3, High Byte
T2CON 0x00C8 Timer 2 Control Register
;CC4EN 0x00C9 Comp./Capture Enable 4 Reg.
T2MOD 0x00C9 Comp./Capture Enable 4 Reg.
RCAP2L 0x00CA Com./Rel./Capt. Reg. Low Byte
RCAP2H 0x00CB Com./Rel./Capt. Reg. High Byte
TL2 0x00CC Timer 2, Low Byte
TH2 0x00CD Timer 2, High Byte
CCL4 0x00CE Comp./Capture Reg. 4, Low Byte
CCH4 0x00CF Comp./Capture Reg. 4, High Byte
PSW 0x00D0 Program Status Word Register
S1SETUP 0x00D1
S2SETUP 0x00D2
RAMBUF 0x00D4
DDCDAT 0x00D5
DDCADR 0x00D6
DDCCON 0x00D7
S1CON 0x00D8
S1STA 0x00D9
S1DAT 0x00DA
S1ADR 0x00DB
S2CON 0x00DC
S2STA 0x00DD
S2DAT 0x00DE
S2ADR 0x00DF
;CML0 0x00D2 Compare Register 0, Low Byte
;CMH0 0x00D3 Compare Register 0, High Byte
;CML1 0x00D4 Compare Register 1, Low Byte
;CMH1 0x00D5 Compare Register 1, High Byte
;CML2 0x00D6 Compare Register 2, Low Byte
;CMH2 0x00D7 Compare Register 2, High Byte
;ADCON0 0x00D8 A/D Converter Control Register 0
;ADDAT 0x00D9 A/D Converter Data Register
;DAPR 0x00DA D/AConverter Program Register
;P7 0x00DB Port 7, Analog/Digital Input
;ADCON1 0x00DC A/D Converter Control Register 1
;P8 0x00DD Port 8, Analog/Digital Input, 4-bit 0DD
;CTRELL 0x00DE Com. Timer Rel. Reg., Low Byte
;CTRELH 0x00DF Com. Timer Rel. Reg., High Byte
ACC 0x00E0 Accumulator
;CTCON 0x00E1 Com. Timer Control Register
USCL 0x00E1
CML3 0x00E2 Compare Register 3, Low Byte
CMH3 0x00E3 Compare Register 3, High Byte
CML4 0x00E4 Compare Register 4, Low Byte
CMH4 0x00E5 Compare Register 4, High Byte
UDT1 0x00E6
UDT0 0x00E7
UISTA 0x00E8
UIEN 0x00E9
UCON0 0x00EA
UCON1 0x00EB
UCON2 0x00EC
USTA 0x00ED
UADR 0x00EE
UDR0 0x00EF
;CML5 0x00E6 Compare Register 5, Low Byte
;CMH5 0x00E7 Compare Register 5, High Byte
;P4 0x00E8 Port 4
;MD0 0x00E9 Multiplication/Division Register 0
;MD1 0x00EA Multiplication/Division Register 1
;MD2 0x00EB Multiplication/Division Register 2
;MD3 0x00EC Multiplication/Division Register 3
;MD4 0x00ED Multiplication/Division Register 4
;MD5 0x00EE Multiplication/Division Register 5
;ARCON 0x00EF Arithmetic Control Register
B 0x00F0 B-Register
;RESERVED00F1 0x00F1 RESERVED
CML6 0x00F2 Compare Register 6, Low Byte
CMH6 0x00F3 Compare Register 6, High Byte
CML7 0x00F4 Compare Register 7, Low Byte
CMH7 0x00F5 Compare Register 7, High Byte
CMEN 0x00F6 Compare Enable Register
CMSEL 0x00F7 Compare Input Select
P5 0x00F8 Port 5
;RESERVED00F9 0x00F9 RESERVED
P6 0x00FA Port 6
;RESERVED00FB 0x00FB RESERVED
;RESERVED00FC 0x00FC RESERVED
;RESERVED00FD 0x00FD RESERVED
;RESERVED00FE 0x00FE RESERVED
;RESERVED00FF 0x00FF RESERVED
A primeira linha é uma diretiva completa:
.default MT1389
Ela informa que a seção MT1389 (a seguinte inteira) é a seção default quando se escolhe o tipo de processador i51.
Você precisa substituir a diretiva .default já existente no arquivo pela diretiva acima. Normalmente, a diretiva que é instalada pelo IDA é esta:
.default C517
Veja na primeira figura deste texto como isso pré-seleciona "C517".
O restante, toda a seção .MT1389, precisa ser acrescentado ao arquivo i51.cfg.
Lembre-se: este procedimento não é indispensável. Dá para trabalhar perfeitamente no código usando as opções padrão do IDA. Os scripts não vão dar erro algum pela falta desta configuração. E eu não consegui perceber qualquer diferença entre usar ou não isto. Mas não estaria nos arquivos se não fosse para ajudar.
-
Configuração do IDA - IDA.CFG
Além do i51.cfg, os ZIPs do MT13x9 vem com outro arquivo de configuração: IDA.CFG. Eu vou explicar para que ele serve e como mesclar seu conteúdo com o IDA.CFG já criado na instalação.
Abaixo, o IDA.CFG do jeito que vem do grupo MT13x9, com separação de seções por cor (vermelho, preto e azul) dada por mim:
[size=07pt]DEFAULT_PROCESSOR = {
/* Extension Processor */
"com" : "" // IDA will try the specified
"exe" : "" // extensions if no extension is
"dll" : "" // given.
"drv" : ""
"sys" : ""
// "bin" : "" // Empty processor means the default processor
"bin" : "8051" // i8051 for MTK 1389
"ovl" : ""
"ovr" : ""
"ov?" : ""
"nlm" : ""
"lan" : ""
"dsk" : ""
"obj" : ""
"prc" : "68000" // PalmPilot programs
"axf" : "arm710a"
"h68" : "68000" // MC68000 for *.H68 files
"i51" : "8051" // i8051 for *.I51 files
"sav" : "pdp11" // PDP-11 for *.SAV files
"rom" : "z80" // Z80 for *.ROM files
"cla*": "java"
"s19": "6811"
"o": ""
"*": "" // Default processor
}
//-------------------------------------------------------------------------
#ifdef __ARM__
//
// 17.07.98: I reenable the final analysis pass because
// it makes the disassembly better.
// The only case when it makes the disassembly worse
// is for AIF/AOF file formats because they contain
// many text ascii strings in the code segment and
// IDA converts them to instructions.
// But the final analysis pass does a good job
// in other cases.
// ANALYSIS = 0x7FFF // Disable final analysis pass
//
//NameChars =
// "_0123456789"
// "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// "abcdefghijklmnopqrstuvwxyz";
ARM_SIMPLIFY = YES // Simplify instructions and replace them
// by pseudo-instructions
ARM_NO_PTR_DEREF = NO // Disable using of =label notation
// This notation makes disassembly cleaner
ARM_USE_MACROS = YES // Use macro-instructions like MOVL
ARM_ARCHITECTURE_5 = YES // Disassemble for ARM architecture 5 or higher
ARM_NO_ARM_THUMB_SWITCH = NO // No automatic ARM-THUMB switch
SHOW_BORDERS = YES
SHOW_SEGMENT_BORDERS = YES
SHOW_BASIC_BLOCKS = YES
OPCODE_BYTES = 8
SHOW_SP = YES
#endif // __ARM__
//-------------------------------------------------------------------------
#ifdef __I51__ // Intel 8051, 80251 processors
DUMMY_NAMES_TYPE = NM_SHORT
SHOW_BORDERS = YES
SHOW_SEGMENT_BORDERS = YES
OPCODE_BYTES = 4
INDENTION = 10
SHOW_BASIC_BLOCKS = YES
#endif // __I51__
[/size]
São três seções e todas elas já existem no IDA.CFG original. Você vai alterá-las.
Na seção DEFAULT_PROCESSOR, a única diferença para o original é esta aqui:
// "bin" : "" // Empty processor means the default processor
"bin" : "8051" // i8051 for MTK 1389
Esta mudança fará com que toda vez que você abrir um arquivo com extensão .bin o processador 8051 já esteja pré-selecionado. Não sei quanto a você, mas me enche o saco ter que escolher todas as vezes o processador na lista, por isso achei isso útil.
No caso das seções __ARM__ e __I51__, eu estou simplesmente substituindo o conteúdo original às cegas, sem me importar com o que fazem todas as opções. Mas esta aqui é óbvia:
OPCODE_BYTES = 4 // Mostra automaticamente os opcodes à direita das instruções
o default do IDA é você ter que ir sempre em Options - General e colocar o número de opcodes que quer exibir. Com essa mudança na configuração todo firmware que você abrir já vai mostrando quatro opcodes (i51) ou oito (ARM)
INDENTION = 10 // Ajusta a distância das instruções para a margem esquerda da tela
Equivale à opção Instructions Indention em Options - General.
Mesmo sem entender exatamente (ainda) o que todas essas configurações fazem, meu palpite é que apenas automatizam algumas configurações do IDA. Você não vai deixar de localizar rotinas por não fazer as configurações.
-
Olá Ryan.
Dei uma procurada la no grupo do yahoo, a procura de informação sobre como dar suporte a arquivos acentuados no browser mas nao tive muito sucesso, eu encontrei alguns documentos do newage e do borus, mas so que o unico que cheguei perto foi (Patching_HU3899_from_A_to_Z) onde mostra apenas o endereço no player HU3899, muito vago a explicação. Você tem alguma ideia de como pode ser feito isso?
PS: Se aqui não for o local certo pra esta postagem pode apagar ou mover sem problema. Postei aqui pois como é um topico de descobertas achei mais apropriado.
Obrigado!
-
Eneris,
Eu ainda não procurei essa informação, porque ainda não precisei trabalhar com nenhum firmware sem suporte a acentuação no browser. O único de que me lembro agora é o do DVP642, que nem é Mediatek.
Que aparelho está com esse problema?
-
O Philips 5965K tem este problema.
-
Tem razão!
Eu tenho até um item a respeito na Tabela Comparativa: "Suporta Acentuação em nomes de pastas" e tinha me esquecido dele.
Vou colocar isso na lista de coisas para descobrir.
-
Proview DVP-858 v20.07
- Como definir a fonte usada na linha de diretório
- Como definir a fonte usada no browser
- Como aumentar o número de caracteres exibíveis na linha de diretório
Esta é a rotina que o grupo MT13x9 chama de Dir_DispDirline:
B1:78FB ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:78FB
B1:78FB
B1:78FB Dir_Disp_Dirline: ; CODE XREF: B1_A481+70p
B1:78FB ; B1_A481+77p ...
B1:78FB
B1:78FB 20 45 03 jb RAM_28.5, B1_7901
B1:78FE 02 7A 26 ljmp B1_7A26
B1:7901 ; ---------------------------------------------------------------------------
B1:7901
B1:7901 B1_7901: ; CODE XREF: Dir_Disp_Dirlinej
B1:7901 7F 2B mov R7, #0x2B ; '+'
B1:7903 7E 02 mov R6, #2
B1:7905 12 1E 16 lcall B1_BS_201_B3_DBEF
B1:7908 90 FB 9B mov DPTR, #XRAM_FB9B
B1:790B 12 0A 38 lcall B1_?C?LSTXDATA
B1:790E 90 FB 9B mov DPTR, #XRAM_FB9B
B1:7911 E0 movx A, @DPTR
B1:7912 FC mov R4, A
B1:7913 A3 inc DPTR
B1:7914 E0 movx A, @DPTR
B1:7915 FD mov R5, A
B1:7916 A3 inc DPTR
B1:7917 E0 movx A, @DPTR
B1:7918 FE mov R6, A
B1:7919 A3 inc DPTR
B1:791A E0 movx A, @DPTR
B1:791B 24 02 add A, #2
B1:791D FF mov R7, A
B1:791E E4 clr A
B1:791F 3E addc A, R6
B1:7920 FE mov R6, A
B1:7921 E4 clr A
B1:7922 3D addc A, R5
B1:7923 FD mov R5, A
B1:7924 E4 clr A
B1:7925 3C addc A, R4
B1:7926 FC mov R4, A
B1:7927 90 FB 9B mov DPTR, #XRAM_FB9B
B1:792A 12 0A 38 lcall B1_?C?LSTXDATA
B1:792D 90 FB 9C mov DPTR, #XRAM_FB9C
B1:7930 E0 movx A, @DPTR
B1:7931 FF mov R7, A
B1:7932 A3 inc DPTR
B1:7933 E0 movx A, @DPTR
B1:7934 FC mov R4, A
B1:7935 A3 inc DPTR
B1:7936 E0 movx A, @DPTR
B1:7937 FD mov R5, A
B1:7938 12 1E 1C lcall B1_BS_202_B0_E77B
B1:793B 90 FB 99 mov DPTR, #XRAM_FB99
B1:793E EF mov A, R7
B1:793F F0 movx @DPTR, A
B1:7940 90 FC 44 mov DPTR, #XRAM_FC44 ; Coordenada horizontal (HI)
B1:7943 E4 clr A
B1:7944 F0 movx @DPTR, A
B1:7945 A3 inc DPTR
B1:7946 74 22 mov A, #0x22 ; '"'
B1:7948 F0 movx @DPTR, A
B1:7949 90 FC 46 mov DPTR, #XRAM_FC46 ; Coordenada vertical (HI)
B1:794C E4 clr A
B1:794D F0 movx @DPTR, A
B1:794E A3 inc DPTR
B1:794F 74 06 mov A, #6
B1:7951 F0 movx @DPTR, A
B1:7952 7D 07 mov R5, #7
B1:7954 7F 10 mov R7, #0x10
B1:7956 12 1E 22 lcall B1_BS_203_B5_CE44
B1:7959 90 FC 46 mov DPTR, #XRAM_FC46 ; Coordenada vertical (HI)
B1:795C E4 clr A
B1:795D F0 movx @DPTR, A
B1:795E A3 inc DPTR
B1:795F 74 04 mov A, #4
B1:7961 F0 movx @DPTR, A
B1:7962 90 FC 45 mov DPTR, #XRAM_FC45 ; Coordenada horizontal (LO)
B1:7965 E0 movx A, @DPTR
B1:7966 24 32 add A, #0x32 ; '2'
B1:7968 F0 movx @DPTR, A
B1:7969 90 FC 44 mov DPTR, #XRAM_FC44 ; Coordenada horizontal (HI)
B1:796C E0 movx A, @DPTR
B1:796D 34 00 addc A, #0
B1:796F F0 movx @DPTR, A
B1:7970 74 04 mov A, #4
B1:7972 24 1E add A, #0x1E
B1:7974 90 FC 4E mov DPTR, #XRAM_FC4E
B1:7977 F0 movx @DPTR, A
B1:7978 E4 clr A
B1:7979 33 rlc A
B1:797A 90 FC 4D mov DPTR, #XRAM_FC4D
B1:797D F0 movx @DPTR, A
B1:797E 90 FC 49 mov DPTR, #XRAM_FC49
B1:7981 74 02 mov A, #2
B1:7983 F0 movx @DPTR, A
B1:7984 A3 inc DPTR
B1:7985 74 56 mov A, #0x56 ; 'V'
B1:7987 F0 movx @DPTR, A
B1:7988 D2 46 setb RAM_28.6
B1:798A E4 clr A
B1:798B 90 FB EA mov DPTR, #XRAM_FBEA
B1:798E F0 movx @DPTR, A
B1:798F FB mov R3, A
B1:7990 FD mov R5, A
B1:7991 7F 10 mov R7, #0x10
B1:7993 12 1E 46 lcall B1_BS_209_B5_CF3D
B1:7996 E4 clr A ; Define a fonte usada na linha de diretório (0x0)
B1:7997 FF mov R7, A
B1:7998 12 1E 70 lcall OSD_SetFont_B1_BS
B1:799B 90 FC 07 mov DPTR, #XRAM_FC07 ; OSD_Colors
B1:799E 74 03 mov A, #3
B1:79A0 F0 movx @DPTR, A
B1:79A1 A3 inc DPTR
B1:79A2 14 dec A
B1:79A3 F0 movx @DPTR, A
B1:79A4 E4 clr A
B1:79A5 FB mov R3, A
B1:79A6 FD mov R5, A
B1:79A7 7F 10 mov R7, #0x10
B1:79A9 12 1D E0 lcall OSD_TextColor_B1_BS
B1:79AC 90 FB 99 mov DPTR, #XRAM_FB99
B1:79AF E0 movx A, @DPTR
B1:79B0 FF mov R7, A
B1:79B1 D3 setb C
B1:79B2 94 36 subb A, #0x36 ; '6' ; 1o ponto a mudar para aumentar o número
B1:79B2 ; de caracteres na linha de diretório
B1:79B4 40 31 jc B1_79E7
B1:79B6 90 FB 9B mov DPTR, #XRAM_FB9B
B1:79B9 E0 movx A, @DPTR
B1:79BA F8 mov R0, A
B1:79BB A3 inc DPTR
B1:79BC E0 movx A, @DPTR
B1:79BD F9 mov R1, A
B1:79BE A3 inc DPTR
B1:79BF E0 movx A, @DPTR
B1:79C0 FA mov R2, A
B1:79C1 A3 inc DPTR
B1:79C2 E0 movx A, @DPTR
B1:79C3 FB mov R3, A
B1:79C4 EF mov A, R7
B1:79C5 24 CA add A, #0xCA ; '-'
B1:79C7 FF mov R7, A
B1:79C8 E4 clr A
B1:79C9 34 FF addc A, #0xFF
B1:79CB FE mov R6, A
B1:79CC E4 clr A
B1:79CD FC mov R4, A
B1:79CE FD mov R5, A
B1:79CF EB mov A, R3
B1:79D0 2F add A, R7
B1:79D1 FF mov R7, A
B1:79D2 EA mov A, R2
B1:79D3 3E addc A, R6
B1:79D4 FE mov R6, A
B1:79D5 ED mov A, R5
B1:79D6 39 addc A, R1
B1:79D7 FD mov R5, A
B1:79D8 EC mov A, R4
B1:79D9 38 addc A, R0
B1:79DA FC mov R4, A
B1:79DB 90 FB 9B mov DPTR, #XRAM_FB9B
B1:79DE 12 0A 38 lcall B1_?C?LSTXDATA
B1:79E1 90 FB 99 mov DPTR, #XRAM_FB99
B1:79E4 74 36 mov A, #0x36 ; '6' ; 2o ponto a mudar para aumentar o número
B1:79E4 ; de caracteres na linha de diretório
B1:79E6 F0 movx @DPTR, A
B1:79E7
B1:79E7 B1_79E7: ; CODE XREF: Dir_Disp_Dirline+B9j
B1:79E7 7F 28 mov R7, #0x28 ; '('
B1:79E9 7E 02 mov R6, #2
B1:79EB 12 19 C6 lcall B1_BS_17_B0_E87A
B1:79EE 90 FB B1 mov DPTR, #XRAM_FBB1
B1:79F1 EF mov A, R7
B1:79F2 F0 movx @DPTR, A
B1:79F3 90 FB 9B mov DPTR, #XRAM_FB9B
B1:79F6 E0 movx A, @DPTR
B1:79F7 FC mov R4, A
B1:79F8 A3 inc DPTR
B1:79F9 E0 movx A, @DPTR
B1:79FA FD mov R5, A
B1:79FB A3 inc DPTR
B1:79FC E0 movx A, @DPTR
B1:79FD FE mov R6, A
B1:79FE A3 inc DPTR
B1:79FF E0 movx A, @DPTR
B1:7A00 24 01 add A, #1
B1:7A02 FF mov R7, A
B1:7A03 E4 clr A
B1:7A04 3E addc A, R6
B1:7A05 FE mov R6, A
B1:7A06 E4 clr A
B1:7A07 3D addc A, R5
B1:7A08 FD mov R5, A
B1:7A09 E4 clr A
B1:7A0A 3C addc A, R4
B1:7A0B FC mov R4, A
B1:7A0C 90 FB AC mov DPTR, #XRAM_FBAC
B1:7A0F 12 0A 38 lcall B1_?C?LSTXDATA
B1:7A12 E4 clr A
B1:7A13 90 FB B0 mov DPTR, #XRAM_FBB0
B1:7A16 F0 movx @DPTR, A
B1:7A17 90 FB 99 mov DPTR, #XRAM_FB99
B1:7A1A E0 movx A, @DPTR
B1:7A1B FD mov R5, A
B1:7A1C 7F 10 mov R7, #0x10
B1:7A1E 12 1E 2E lcall B1_BS_205_B3_9509
B1:7A21 E4 clr A ; Define a fonte usada no filebrowser (0x0)
B1:7A22 FF mov R7, A
B1:7A23 02 1E 70 ljmp OSD_SetFont_B1_BS
B1:7A26 ; ---------------------------------------------------------------------------
B1:7A26
B1:7A26 B1_7A26: ; CODE XREF: Dir_Disp_Dirline+3j
B1:7A26 90 FC 44 mov DPTR, #XRAM_FC44
B1:7A29 E4 clr A
B1:7A2A F0 movx @DPTR, A
B1:7A2B A3 inc DPTR
B1:7A2C 74 22 mov A, #0x22 ; '"'
B1:7A2E F0 movx @DPTR, A
B1:7A2F 90 FC 46 mov DPTR, #XRAM_FC46
B1:7A32 E4 clr A
B1:7A33 F0 movx @DPTR, A
B1:7A34 A3 inc DPTR
B1:7A35 74 06 mov A, #6
B1:7A37 F0 movx @DPTR, A
B1:7A38 7B 1E mov R3, #0x1E
B1:7A3A 7A 00 mov R2, #0
B1:7A3C 7D 68 mov R5, #0x68 ; 'h'
B1:7A3E 7C 02 mov R4, #2
B1:7A40 7F 10 mov R7, #0x10
B1:7A42 12 1E 58 lcall B1_BS_212_B5_BF1A
B1:7A45 22 ret
B1:7A45 ; End of function Dir_Disp_Dirline
Fontes:
Em vermelho eu destaquei os pontos para a troca de fontes. O modo "básico" de definir fontes específicas é trocar:
E4 CLR A
FF MOV R7,A
por
7F xx MOV R7,xx
Onde xx é o número da fonte que você quer usar
Nota: Tenha em mente que isso só funciona sem efeitos colaterais porque o valor de R7 não é diretamente reutilizado em seguida.
A utilidade principal disso é poder "desamarrar" a fonte do diretório da fonte do resto do browser. Mas você pode usar as mesmas técnicas que expliquei para selecionar fontes de legendas pelo setup para também selecionar fontes de browser pelo setup.
Número de caracteres na linha de diretório:
mov A, #0x36
Se você contar o número de caracteres que o firmware original exibe, verá que são apenas 27. Mas 27 em hexadecimal é "0x1B" e não "0x36". O detalhe importante é lembrar que a seção ARM do Proview passa os nomes de diretório em Unicode, com dois bytes por caractere.
0x36 = 54d
54/2 = 27
Faz sentido agora, não é?
O número máximo real de caracteres depende da fonte escolhida (e é variável, porque a largura dos caracteres não é fixa). Com a fonte Impact que usei no meu firmware experimental cabem cerca de 40 caracteres. Multiplicando por dois, temos 80d = 0x50
Então, basta mudar as duas linhas para:
mov A, #0x50
Com a modificação:
(http://ryan.com.br/imagens/dvp858/proview_dvp858_dispdirline_impact_40ch(50).jpg)
Com a limitação do firmware oficial:
(http://ryan.com.br/imagens/dvp858/proview_dvp858_dispdirline_impact_27ch(50).jpg)
Referência: Grupo MT13x9 (http://tech.groups.yahoo.com/group/mt13x9/message/7278)
-
Philips DVP5960/37
Philips DVP5965/55
Philips DVP5965/93
Punktal PK-DV246
- Como definir a fonte usada na linha de diretório
- Como definir a fonte usada no browser
- Como aumentar o número de caracteres exibíveis na linha de diretório
O exemplo abaixo foi copiado da minha listagem do DVP5960, mas eu conferi os endereços com o DVP5965 e excetuado os endereços XRAM e de rotinas, tudo é exatamente igual. O caso do Punktal é quase idêntico.
A teoria é a mesma dada na explicação anterior, para o Proview, com uma única diferença, que vou explicar adiante:
B1:7EED Dir_DispDirline: ; CODE XREF: B1_89A3+84p
B1:7EED ; B1_89A3+8Bp
B1:7EED 20 74 03 jb RAM_2E.4, B1_7EF3
B1:7EF0 02 80 0D ljmp B1_800D
B1:7EF3 ; ---------------------------------------------------------------------------
B1:7EF3
B1:7EF3 B1_7EF3: ; CODE XREF: Dir_DispDirlinej
B1:7EF3 7F 2B mov R7, #0x2B ; '+'
B1:7EF5 7E 02 mov R6, #2
B1:7EF7 12 1E B4 lcall B1_BS_234_B4_CAD9
B1:7EFA 90 FB B1 mov DPTR, #XRAM_FBB1
B1:7EFD 12 08 F5 lcall B1_?C?LSTXDATA
B1:7F00 90 FB B1 mov DPTR, #XRAM_FBB1
B1:7F03 E0 movx A, @DPTR
B1:7F04 FC mov R4, A
B1:7F05 A3 inc DPTR
B1:7F06 E0 movx A, @DPTR
B1:7F07 FD mov R5, A
B1:7F08 A3 inc DPTR
B1:7F09 E0 movx A, @DPTR
B1:7F0A FE mov R6, A
B1:7F0B A3 inc DPTR
B1:7F0C E0 movx A, @DPTR
B1:7F0D 24 02 add A, #2
B1:7F0F FF mov R7, A
B1:7F10 E4 clr A
B1:7F11 3E addc A, R6
B1:7F12 FE mov R6, A
B1:7F13 E4 clr A
B1:7F14 3D addc A, R5
B1:7F15 FD mov R5, A
B1:7F16 E4 clr A
B1:7F17 3C addc A, R4
B1:7F18 FC mov R4, A
B1:7F19 90 FB B1 mov DPTR, #XRAM_FBB1
B1:7F1C 12 08 F5 lcall B1_?C?LSTXDATA
B1:7F1F 90 FB B2 mov DPTR, #XRAM_FBB2
B1:7F22 E0 movx A, @DPTR
B1:7F23 FF mov R7, A
B1:7F24 A3 inc DPTR
B1:7F25 E0 movx A, @DPTR
B1:7F26 FC mov R4, A
B1:7F27 A3 inc DPTR
B1:7F28 E0 movx A, @DPTR
B1:7F29 FD mov R5, A
B1:7F2A 12 1E A8 lcall B1_BS_232_B0_E599
B1:7F2D 90 FB AF mov DPTR, #XRAM_FBAF
B1:7F30 EF mov A, R7
B1:7F31 F0 movx @DPTR, A
B1:7F32 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:7F35 E4 clr A
B1:7F36 F0 movx @DPTR, A
B1:7F37 A3 inc DPTR
B1:7F38 74 22 mov A, #0x22 ; '"'
B1:7F3A F0 movx @DPTR, A
B1:7F3B 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:7F3E E4 clr A
B1:7F3F F0 movx @DPTR, A
B1:7F40 A3 inc DPTR
B1:7F41 74 06 mov A, #6
B1:7F43 F0 movx @DPTR, A
B1:7F44 7D 08 mov R5, #8
B1:7F46 7F 0F mov R7, #0xF
B1:7F48 12 1E BA lcall B1_BS_235_B3_2D12
B1:7F4B 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:7F4E E4 clr A
B1:7F4F F0 movx @DPTR, A
B1:7F50 A3 inc DPTR
B1:7F51 74 04 mov A, #4
B1:7F53 F0 movx @DPTR, A
B1:7F54 90 FC 77 mov DPTR, #XRAM_FC77 ; Coordenada horizontal (LO)
B1:7F57 E0 movx A, @DPTR
B1:7F58 24 32 add A, #0x32 ; '2'
B1:7F5A F0 movx @DPTR, A
B1:7F5B 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:7F5E E0 movx A, @DPTR
B1:7F5F 34 00 addc A, #0
B1:7F61 F0 movx @DPTR, A
B1:7F62 74 04 mov A, #4
B1:7F64 24 1E add A, #0x1E
B1:7F66 90 FC 81 mov DPTR, #XRAM_FC81
B1:7F69 F0 movx @DPTR, A
B1:7F6A E4 clr A
B1:7F6B 33 rlc A
B1:7F6C 90 FC 80 mov DPTR, #XRAM_FC80
B1:7F6F F0 movx @DPTR, A
B1:7F70 90 FC 7C mov DPTR, #XRAM_FC7C
B1:7F73 74 02 mov A, #2
B1:7F75 F0 movx @DPTR, A
B1:7F76 A3 inc DPTR
B1:7F77 74 56 mov A, #0x56 ; 'V'
B1:7F79 F0 movx @DPTR, A
B1:7F7A D2 75 setb RAM_2E.5
B1:7F7C E4 clr A
B1:7F7D 90 FB FD mov DPTR, #XRAM_FBFD
B1:7F80 F0 movx @DPTR, A
B1:7F81 FB mov R3, A
B1:7F82 FD mov R5, A
B1:7F83 7F 0F mov R7, #0xF
B1:7F85 12 1D 52 lcall B1_BS_175_B3_B8B4
B1:7F88 E4 clr A ; Define a fonte usada na linha de diretório (0x0)
B1:7F89 FF mov R7, A
B1:7F8A 12 1E EA lcall OSD_SetFont_B1_BS
B1:7F8D 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B1:7F90 74 02 mov A, #2 ; Cor de contorno = 2
B1:7F92 F0 movx @DPTR, A
B1:7F93 A3 inc DPTR
B1:7F94 04 inc A ; Cor de preenchimento = 3
B1:7F95 F0 movx @DPTR, A
B1:7F96 E4 clr A
B1:7F97 FB mov R3, A
B1:7F98 FD mov R5, A
B1:7F99 7F 0F mov R7, #0xF
B1:7F9B 12 1D 76 lcall OSD_TextColor_B1_BS
B1:7F9E 90 FB AF mov DPTR, #XRAM_FBAF
B1:7FA1 E0 movx A, @DPTR
B1:7FA2 FF mov R7, A
B1:7FA3 D3 setb C
B1:7FA4 94 1E subb A, #0x1E ; 1o ponto a mudar para aumentar o número
B1:7FA4 ; de caracteres na linha de diretório
B1:7FA6 40 31 jc B1_7FD9
B1:7FA8 90 FB B1 mov DPTR, #XRAM_FBB1
B1:7FAB E0 movx A, @DPTR
B1:7FAC F8 mov R0, A
B1:7FAD A3 inc DPTR
B1:7FAE E0 movx A, @DPTR
B1:7FAF F9 mov R1, A
B1:7FB0 A3 inc DPTR
B1:7FB1 E0 movx A, @DPTR
B1:7FB2 FA mov R2, A
B1:7FB3 A3 inc DPTR
B1:7FB4 E0 movx A, @DPTR
B1:7FB5 FB mov R3, A
B1:7FB6 EF mov A, R7
B1:7FB7 24 E2 add A, #0xE2 ; 'Ô' ; 0x100-(número de caracteres a exibir)
B1:7FB7 ; No caso: 0x100-0x1E = 0xE2
B1:7FB9 FF mov R7, A
B1:7FBA E4 clr A
B1:7FBB 34 FF addc A, #0xFF
B1:7FBD FE mov R6, A
B1:7FBE E4 clr A
B1:7FBF FC mov R4, A
B1:7FC0 FD mov R5, A
B1:7FC1 EB mov A, R3
B1:7FC2 2F add A, R7
B1:7FC3 FF mov R7, A
B1:7FC4 EA mov A, R2
B1:7FC5 3E addc A, R6
B1:7FC6 FE mov R6, A
B1:7FC7 ED mov A, R5
B1:7FC8 39 addc A, R1
B1:7FC9 FD mov R5, A
B1:7FCA EC mov A, R4
B1:7FCB 38 addc A, R0
B1:7FCC FC mov R4, A
B1:7FCD 90 FB B1 mov DPTR, #XRAM_FBB1
B1:7FD0 12 08 F5 lcall B1_?C?LSTXDATA
B1:7FD3 90 FB AF mov DPTR, #XRAM_FBAF
B1:7FD6 74 1E mov A, #0x1E ; 2o ponto a mudar para aumentar o número
B1:7FD6 ; de caracteres na linha de diretório
B1:7FD8 F0 movx @DPTR, A
B1:7FD9
B1:7FD9 B1_7FD9: ; CODE XREF: Dir_DispDirline+B9j
B1:7FD9 90 FB B1 mov DPTR, #XRAM_FBB1
B1:7FDC E0 movx A, @DPTR
B1:7FDD FC mov R4, A
B1:7FDE A3 inc DPTR
B1:7FDF E0 movx A, @DPTR
B1:7FE0 FD mov R5, A
B1:7FE1 A3 inc DPTR
B1:7FE2 E0 movx A, @DPTR
B1:7FE3 FE mov R6, A
B1:7FE4 A3 inc DPTR
B1:7FE5 E0 movx A, @DPTR
B1:7FE6 24 01 add A, #1
B1:7FE8 FF mov R7, A
B1:7FE9 E4 clr A
B1:7FEA 3E addc A, R6
B1:7FEB FE mov R6, A
B1:7FEC E4 clr A
B1:7FED 3D addc A, R5
B1:7FEE FD mov R5, A
B1:7FEF E4 clr A
B1:7FF0 3C addc A, R4
B1:7FF1 FC mov R4, A
B1:7FF2 90 FB C2 mov DPTR, #XRAM_FBC2
B1:7FF5 12 08 F5 lcall B1_?C?LSTXDATA
B1:7FF8 90 FB C6 mov DPTR, #XRAM_FBC6 ; Posição do último "."
B1:7FFB 74 5F mov A, #0x5F ; '_'
B1:7FFD F0 movx @DPTR, A
B1:7FFE 90 FB AF mov DPTR, #XRAM_FBAF
B1:8001 E0 movx A, @DPTR
B1:8002 FD mov R5, A
B1:8003 7F 0F mov R7, #0xF
B1:8005 12 1E C6 lcall B1_BS_237_B4_8A43
B1:8008 E4 clr A ; Define a fonte do browser (0x0)
B1:8009 FF mov R7, A
B1:800A 02 1E EA ljmp OSD_SetFont_B1_BS
B1:800D ; ---------------------------------------------------------------------------
B1:800D
B1:800D B1_800D: ; CODE XREF: Dir_DispDirline+3j
B1:800D 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:8010 E4 clr A
B1:8011 F0 movx @DPTR, A
B1:8012 A3 inc DPTR
B1:8013 74 22 mov A, #0x22 ; '"'
B1:8015 F0 movx @DPTR, A
B1:8016 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:8019 E4 clr A
B1:801A F0 movx @DPTR, A
B1:801B A3 inc DPTR
B1:801C 74 06 mov A, #6
B1:801E F0 movx @DPTR, A
B1:801F 7B 1E mov R3, #0x1E
B1:8021 7A 00 mov R2, #0
B1:8023 7D 68 mov R5, #0x68 ; 'h'
B1:8025 7C 02 mov R4, #2
B1:8027 7F 0F mov R7, #0xF
B1:8029 12 1E 54 lcall ClearRect?
B1:802C 22 ret
B1:802C ; End of function Dir_DispDirline
B1:802C
O DVP5960 tem um ponto a mais que precisa ser mudado:
B1:7FB7 24 E2 add A, #0xE2 ; 'Ô'
Exemplo: se você quiser aumentar o número de caracteres para 40 caracteres (0x28), esta linha intermediária precisa ser mudada para: 0x100 - 0x28 = 0xD8
B1:7FB7 24 D8 add A, #0xD8
Note que o DVP5960, não tem o "problema" com unicode, assim não é preciso nem dobrar nem dividir ao fazer as contas.
-
Como localizar a rotina Disp_DirLine no seu firmware
Conte exatamente quantos caracteres no máximo aparecem na linha de diretório, converta para hexa e substitua aqui:
FF D3 94 xx
onde xx é o número que você conseguiu
Esta sequencia de bytes só aparece uma vez no código 8032, na rotina Disp_dirLine.
Se não funcionar, o seu firmware pode usar Unicode, então dobre o valor e procure de novo.
Por exemplo, se você contar 30 caracteres, vai procurar pela seguinte seqüência:
FF D3 94 1E
e se não funcionar, pela seguinte:
FF D3 94 3C
Tendo localizado Dir_DispDirline, como essa rotina chama tanto OSD_SetFont quanto OSD_textColors, se você não tiver ainda localizado essas rotinas vai poder achá-las. Além da utilidade óbvia de se localizar e identificar rotinas, lembre-se de que Sub_textStyle, que é bem difiícil de achar, também chama essas rotinas, logo você fica um pouco mais perto de encontrá-la.
-
Philips DVP5960/37
Philips DVP5965/55
Philips DVP5965/93
TAGS MP3
Isto foi testado em um DVP5960, mas deve funcionar em um DVP5965 com mínimas alterações
- Como definir uma fonte separada da usada no browser
- Como aumentar o número de caracteres exibidos de 14 para 30
- Como mover o local de exibição para a parte inferior da tela
Quase 100% das mudanças no assembly são feitas dentro da rotina MP3_tagDisplay, que é uma rotina bem longa que transcrevo na íntegra no próximo post. Eu só localizei esta rotina graças a este post (http://tech.groups.yahoo.com/group/mt13x9/message/9008) do Vladimir Boroda. A partir daí, tudo saiu por investigação própria. Eu ainda não decifrei todos os segredos da rotina, mas já tenho o suficiente para fazer muita coisa interessante.
Abaixo, como é no firmware original. Perceba o limite de 14 caracteres para cada tag.
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_original(50).jpg)
A primeira mudança é na fonte. A fonte original do browser do DVP5960 além de desnecessariamente grande para isso, tem serifa, o que torna o espaço requerido entre linhas grande demais. Eu criei uma fonte nova com o mtkFontCreator, inseri no firmware como fonte 02 e fiz a seguinte modificação:
B1:56C0 74 02 mov A, 02 ; Fonte 0x02
B1:56C2 12 1E EA lcall OSD_setFont ;Faço uma chamada à rotina que seta a fonte
B1:56C5 12 FA 32 lcall rotina_movida ;Chamo a rotina antiga
B1:56C8 00 nop
B1:56C9 00 nop
B1:56CA 00 nop
B1:56CB 00 nop
B1:56CC 00 nop
B1:56CD 00 nop
Atenção: A rotina OSD_SetFont do DVP5965 fica em 1ED8
Depois acrescentei a partir de 1FA32 o que eu precisei mover para liberar espaço:
B1:FA32 74 00 mov A, 0 ; Cor de Outine
B1:FA34 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B1:FA37 F0 movx @DPTR, A
B1:FA38 A3 inc DPTR
B1:FA39 74 0E mov A, #0xE ; Cor de Preenchimento
B1:FA3B F0 movx @DPTR, A
B1:FA3C E4 clr A
B1:FA3D FB mov R3, A
B1:FA3E FD mov R5, A
B1:FA3F 7F 0F mov R7, #0xF
B1:FA41 22 ret
Note que eu aproveitei para fazer uma pequena modificação que me permite mudar a cor do contorno, se necessário.
O resultado imediato foi este:
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_mod_1(50).jpg)
Agora temos espaço sobrando, mas faltam caracteres. A limitação de 14 caracteres por tag é artificial, porque a seção ARM entrega 30. Então vamos aumentar isso.
Três bytes precisam ser mudados, em dois pontos diferentes:
B1:5785 94 FF subb A, #0xFF
B1:5787 40 03 jc B1_578C
B1:5789 74 FF mov A, #0xFF
e
B1:57CA 94 FF subb A, #0xFF ; Número máximo de caracteres a exibir por TAG
Eu poderia ter colocado apenas 30 e não 255, mas pode ser que algum firmware passe mais que 30 caracteres, por isso é melhor não impormos nossa própria limitação.
O resultado é esse. Note que os caracteres que não cabem aparecem do lado esquerdo da tela:
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_mod_2(50).jpg)
O espaço entre linhas é grande demais. Por sorte, isso é definido por um único byte na rotina:
B1:57A1 75 F0 14 mov B, #0x14 ; Altura presumida de cada linha
O resultado é esse. Note que eu também movi ligeiramente as tags para a esquerda, mas só explico como isso é efeito mais adiante:
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_mod_4(50).jpg)
Agora sim, vamos mover as tags. São três bytes que determinam a coordenada do canto superior esquerdo do retângulo onde as tags começam a ser impressas:
B1:5796 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:5799 74 00 mov A, #0
B1:579B F0 movx @DPTR, A
B1:579C A3 inc DPTR
B1:579D 74 25 mov A, #0x25 ;
B1:579F F0 movx @DPTR, A ; FC76 e FC77 = 0x25
B1:579F ; offset horizontal. Quanto menor, mais à esquerda a linha começa.
B1:57A0 EF mov A, R7 ; R7 contém o número da TAG (linha) sendo exibida?
B1:57A1 75 F0 14 mov B, #0x14 ; Altura presumida de cada linha
B1:57A1 ; 0x10 fará com que cada linha cubra a metade da anterior
B1:57A1 ; 0x16 funciona OK com a fonte original
B1:57A4 A4 mul AB
B1:57A5 AE F0 mov R6, B ; R6 contém agora a coordenada vertical de impressão da linha?
B1:57A7 24 F0 add A, #0xF0 ;
Abaixo, o resultado com um novo background que fiz rapidamente só para testar como fica. Está bem mal-feito, mas serve para ter uma idéia. Também é preciso aumentar o tamanho da janela 0xF no mtkWindows.
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_mod_5(50).jpg)
É possível colocar as tags lado a lado em duas linhas, mas isso requer uma mudança mais drástica na rotina.
Nota: Neste texto eu ainda não explico como fazer para apagar o retângulo de exibição das tags, porque isso é feito em outro ponto do firmware. Depois eu explico, porque estou cansado agora.
E ainda é preciso fazer um ajuste, porque são cinco as tags que o DVP5960 pode exibir e o meu exemplo só previu quatro.
MP3_TagDisplay - ClearRect inicial
Logo no início de MP3_TagDisplay existe um procedimento ClearRect cuja função é remover as tags deixadas por uma música anterior. O procedimento, claro, é chamado antes das tags serem impressas.
B1:56A0 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:56A3 74 01 mov A, #1
B1:56A5 F0 movx @DPTR, A
B1:56A6 A3 inc DPTR
B1:56A7 74 79 mov A, #0x79 ; 'y' ; Coordenada Horizontal: 0x179
B1:56A9 F0 movx @DPTR, A
B1:56AA 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:56AD E4 clr A
B1:56AE F0 movx @DPTR, A
B1:56AF A3 inc DPTR
B1:56B0 74 37 mov A, #0x37 ; '7' ; Coordenada Vertical: 0x37
B1:56B2 F0 movx @DPTR, A
B1:56B3 7B DC mov R3, #0xDC ; '_' ; 0xDC = altura
B1:56B5 7A 00 mov R2, #0
B1:56B7 7D DC mov R5, #0xDC ; '_' ; 0xDC = Largura
B1:56B9 7C 00 mov R4, #0
B1:56BB 7F 0F mov R7, #0xF
B1:56BD 12 1E 54 lcall ClearRect ; Limpa o retângulo
Como nós movemos o local de exibição das tags, é preciso mover e redimensionar o retângulo criado por essa rotina que já corrigida fica assim:
B1:56A0 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:56A3 74 00 mov A, #0
B1:56A5 F0 movx @DPTR, A
B1:56A6 A3 inc DPTR
B1:56A7 74 25 mov A, #0x25 ; 'y' ; Coordenada Horizontal: 0x25
B1:56A9 F0 movx @DPTR, A
B1:56AA 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:56AD E4 clr A
B1:56AE F0 movx @DPTR, A
B1:56AF A3 inc DPTR
B1:56B0 74 EF mov A, #0xEF ; ; Coordenada Vertical: 0xEF
B1:56B2 F0 movx @DPTR, A
B1:56B3 7B 6C mov R3, #0x6C ; 0x6C = altura
B1:56B5 7A 00 mov R2, #0
B1:56B7 7D 50 mov R5, #0x50 ; 0x150 = Largura
B1:56B9 7C 01 mov R4, #0x1
B1:56BB 7F 0F mov R7, #0xF
B1:56BD 12 1E 54 lcall ClearRect ; Limpa o retângulo
-
DVP5960/37 - MP3_TagDisplay
Esta rotina é a mesma para o DVP5965/55 e DVP5965/93. Mudam apenas endereços XRAM e de subrotinas, mas o resto é idêntico.
Para localizar no seu firmware, procure por "EF F0 7F 4B". Só ocorre no topo de MP3_TagDisplay e todo o firmware onde eu não achei isso não tinha mesmo suporte a tags.
Esta rotina está em um post separado porque estoura o limite de 20000 caracteres por post.
[size=08pt]
B1:565C ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:565C
B1:565C
B1:565C MP3_TagDisplay: ; CODE XREF: B1_6AC0:B1_6BF4j
B1:565C ; B1_AB8D+B1p
B1:565C ; DATA XREF: ...
B1:565C E4 clr A
B1:565D 90 FB B3 mov DPTR, #XRAM_FBB3
B1:5660 F0 movx @DPTR, A
B1:5661 90 FB AC mov DPTR, #XRAM_FBAC
B1:5664 74 06 mov A, #6 ; Mudei para 0x5 mas nada pareceu mudar
B1:5666 F0 movx @DPTR, A
B1:5667 7D 02 mov R5, #2
B1:5669 7C 00 mov R4, #0
B1:566B 7F 01 mov R7, #1
B1:566D 12 1D 04 lcall B1_BS_162_B3_BE2E
B1:5670 7F 4A mov R7, #0x4A ; 'J' ; As quatro chamadas a ARM_Getchar seguintes obtem o endereço
B1:5670 ; inicial do bloco de tags (4 bytes) na shared memory
B1:5672 7E 02 mov R6, #2
B1:5674 12 1B 96 lcall ARM_GetChar_B1_BS
B1:5677 90 FB A3 mov DPTR, #XRAM_FBA3
B1:567A EF mov A, R7
B1:567B F0 movx @DPTR, A
B1:567C 7F 4B mov R7, #0x4B ; 'K'
B1:567E 7E 02 mov R6, #2
B1:5680 12 1B 96 lcall ARM_GetChar_B1_BS
B1:5683 90 FB A2 mov DPTR, #XRAM_FBA2
B1:5686 EF mov A, R7
B1:5687 F0 movx @DPTR, A
B1:5688 7F 4C mov R7, #0x4C ; 'L'
B1:568A 7E 02 mov R6, #2
B1:568C 12 1B 96 lcall ARM_GetChar_B1_BS
B1:568F 90 FB A1 mov DPTR, #XRAM_FBA1
B1:5692 EF mov A, R7
B1:5693 F0 movx @DPTR, A
B1:5694 7F 4D mov R7, #0x4D ; 'M'
B1:5696 7E 02 mov R6, #2
B1:5698 12 1B 96 lcall ARM_GetChar_B1_BS
B1:569B 90 FB A0 mov DPTR, #XRAM_FBA0
B1:569E EF mov A, R7
B1:569F F0 movx @DPTR, A
B1:56A0 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:56A3 74 01 mov A, #1
B1:56A5 F0 movx @DPTR, A
B1:56A6 A3 inc DPTR
B1:56A7 74 79 mov A, #0x79 ; 'y' ; Coordenada Horizontal: 0x179
B1:56A9 F0 movx @DPTR, A
B1:56AA 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:56AD E4 clr A
B1:56AE F0 movx @DPTR, A
B1:56AF A3 inc DPTR
B1:56B0 74 37 mov A, #0x37 ; '7' ; Coordenada Vertical: 0x37
B1:56B2 F0 movx @DPTR, A
B1:56B3 7B DC mov R3, #0xDC ; '_' ; R2R3 = altura
B1:56B5 7A 00 mov R2, #0
B1:56B7 7D DC mov R5, #0xDC ; '_' ; R4R5 = Largura
B1:56B9 7C 00 mov R4, #0
B1:56BB 7F 0F mov R7, #0xF
B1:56BD 12 1E 54 lcall ClearRect ; Limpa o retângulo
B1:56C0 E4 clr A ; Cor de Outine (0x0)
B1:56C1 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B1:56C4 F0 movx @DPTR, A
B1:56C5 A3 inc DPTR
B1:56C6 74 0E mov A, #0xE ; Cor de Preenchimento
B1:56C8 F0 movx @DPTR, A
B1:56C9 E4 clr A
B1:56CA FB mov R3, A
B1:56CB FD mov R5, A
B1:56CC 7F 0F mov R7, #0xF
B1:56CE 12 1D 76 lcall OSD_TextColor_B1_BS
B1:56D1 74 FF mov A, #0xFF
B1:56D3 FF mov R7, A
B1:56D4 FE mov R6, A
B1:56D5 FD mov R5, A
B1:56D6 FC mov R4, A
B1:56D7 90 FB A0 mov DPTR, #XRAM_FBA0
B1:56DA E0 movx A, @DPTR
B1:56DB F8 mov R0, A
B1:56DC A3 inc DPTR
B1:56DD E0 movx A, @DPTR
B1:56DE F9 mov R1, A
B1:56DF A3 inc DPTR
B1:56E0 E0 movx A, @DPTR
B1:56E1 FA mov R2, A
B1:56E2 A3 inc DPTR
B1:56E3 E0 movx A, @DPTR
B1:56E4 FB mov R3, A
B1:56E5 C3 clr C
B1:56E6 12 08 59 lcall B1_?C?ULCMP
B1:56E9 70 03 jnz B1_56EE
B1:56EB 02 58 AA ljmp B1_58AA
B1:56EE ; ---------------------------------------------------------------------------
B1:56EE
B1:56EE B1_56EE: ; CODE XREF: MP3_TagDisplay+8Dj
B1:56EE E4 clr A
B1:56EF 90 FB A8 mov DPTR, #XRAM_FBA8 ; Número sequencial da TAG?
B1:56F2 F0 movx @DPTR, A
B1:56F3
B1:56F3 B1_56F3: ; CODE XREF: MP3_TagDisplay+24Bj
B1:56F3 90 FB A0 mov DPTR, #XRAM_FBA0
B1:56F6 E0 movx A, @DPTR
B1:56F7 FC mov R4, A
B1:56F8 A3 inc DPTR
B1:56F9 E0 movx A, @DPTR
B1:56FA FD mov R5, A
B1:56FB A3 inc DPTR
B1:56FC E0 movx A, @DPTR
B1:56FD FE mov R6, A
B1:56FE A3 inc DPTR
B1:56FF E0 movx A, @DPTR
B1:5700 FF mov R7, A
B1:5701 A3 inc DPTR
B1:5702 12 08 F5 lcall B1_?C?LSTXDATA
B1:5705 E4 clr A
B1:5706 90 FB A9 mov DPTR, #XRAM_FBA9
B1:5709 F0 movx @DPTR, A
B1:570A
B1:570A B1_570A: ; CODE XREF: MP3_TagDisplay+122j
B1:570A 90 FB A8 mov DPTR, #XRAM_FBA8 ; Número sequencial da TAG?
B1:570D E0 movx A, @DPTR
B1:570E 90 2F DB mov DPTR, #B1_2FDB
B1:5711 93 movc A, @A+DPTR
B1:5712 FF mov R7, A
B1:5713 90 FB A9 mov DPTR, #XRAM_FBA9
B1:5716 E0 movx A, @DPTR
B1:5717 C3 clr C
B1:5718 9F subb A, R7
B1:5719 50 65 jnc B1_5780
B1:571B 90 FB A5 mov DPTR, #XRAM_FBA5
B1:571E E0 movx A, @DPTR
B1:571F FF mov R7, A
B1:5720 A3 inc DPTR
B1:5721 E0 movx A, @DPTR
B1:5722 FC mov R4, A
B1:5723 A3 inc DPTR
B1:5724 E0 movx A, @DPTR
B1:5725 FD mov R5, A
B1:5726 12 1E A8 lcall B1_BS_232_B0_E599
B1:5729 90 FB A8 mov DPTR, #XRAM_FBA8 ; Número sequencial da TAG?
B1:572C E0 movx A, @DPTR
B1:572D FE mov R6, A
B1:572E 70 0C jnz B1_573C
B1:5730 A3 inc DPTR
B1:5731 E0 movx A, @DPTR
B1:5732 90 2F D8 mov DPTR, #B1_2FD8
B1:5735 93 movc A, @A+DPTR
B1:5736 6F xrl A, R7
B1:5737 60 03 jz B1_573C
B1:5739 02 58 AA ljmp B1_58AA
B1:573C ; ---------------------------------------------------------------------------
B1:573C
B1:573C B1_573C: ; CODE XREF: MP3_TagDisplay+D2j
B1:573C ; MP3_TagDisplay+DBj
B1:573C EF mov A, R7
B1:573D 70 08 jnz B1_5747
B1:573F 90 FB A9 mov DPTR, #XRAM_FBA9
B1:5742 E0 movx A, @DPTR
B1:5743 A3 inc DPTR
B1:5744 F0 movx @DPTR, A
B1:5745 80 39 sjmp B1_5780
B1:5747 ; ---------------------------------------------------------------------------
B1:5747
B1:5747 B1_5747: ; CODE XREF: MP3_TagDisplay+E1j
B1:5747 EE mov A, R6
B1:5748 90 2F DB mov DPTR, #B1_2FDB
B1:574B 93 movc A, @A+DPTR
B1:574C FF mov R7, A
B1:574D 14 dec A
B1:574E FE mov R6, A
B1:574F 90 FB A9 mov DPTR, #XRAM_FBA9
B1:5752 E0 movx A, @DPTR
B1:5753 6E xrl A, R6
B1:5754 70 03 jnz B1_5759
B1:5756 A3 inc DPTR
B1:5757 EF mov A, R7
B1:5758 F0 movx @DPTR, A
B1:5759
B1:5759 B1_5759: ; CODE XREF: MP3_TagDisplay+F8j
B1:5759 90 FB A4 mov DPTR, #XRAM_FBA4
B1:575C E0 movx A, @DPTR
B1:575D FC mov R4, A
B1:575E A3 inc DPTR
B1:575F E0 movx A, @DPTR
B1:5760 FD mov R5, A
B1:5761 A3 inc DPTR
B1:5762 E0 movx A, @DPTR
B1:5763 FE mov R6, A
B1:5764 A3 inc DPTR
B1:5765 E0 movx A, @DPTR
B1:5766 24 01 add A, #1
B1:5768 FF mov R7, A
B1:5769 E4 clr A
B1:576A 3E addc A, R6
B1:576B FE mov R6, A
B1:576C E4 clr A
B1:576D 3D addc A, R5
B1:576E FD mov R5, A
B1:576F E4 clr A
B1:5770 3C addc A, R4
B1:5771 FC mov R4, A
B1:5772 90 FB A4 mov DPTR, #XRAM_FBA4
B1:5775 12 08 F5 lcall B1_?C?LSTXDATA
B1:5778 90 FB A9 mov DPTR, #XRAM_FBA9
B1:577B E0 movx A, @DPTR
B1:577C 04 inc A
B1:577D F0 movx @DPTR, A
B1:577E 80 8A sjmp B1_570A
B1:5780 ; ---------------------------------------------------------------------------
B1:5780
B1:5780 B1_5780: ; CODE XREF: MP3_TagDisplay+BDj
B1:5780 ; MP3_TagDisplay+E9j
B1:5780 90 FB AA mov DPTR, #XRAM_FBAA ; Número de caracteres na TAG ID3?
B1:5783 E0 movx A, @DPTR
B1:5784 C3 clr C
B1:5785 94 0E subb A, #0xE ; Se o número de caracteres for 14 ou menos, continua
B1:5787 40 03 jc B1_578C
B1:5789 74 0E mov A, #0xE ; Se for maior que 14, limitar a 14
B1:578B F0 movx @DPTR, A
B1:578C
B1:578C B1_578C: ; CODE XREF: MP3_TagDisplay+12Bj
B1:578C 90 FB A8 mov DPTR, #XRAM_FBA8 ; Número sequencial da TAG?
B1:578F E0 movx A, @DPTR
B1:5790 FF mov R7, A
B1:5791 70 03 jnz B1_5796
B1:5793 02 58 6E ljmp B1_586E
B1:5796 ; ---------------------------------------------------------------------------
B1:5796
B1:5796 B1_5796: ; CODE XREF: MP3_TagDisplay+135j
B1:5796 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:5799 74 01 mov A, #1
B1:579B F0 movx @DPTR, A
B1:579C A3 inc DPTR
B1:579D 74 79 mov A, #0x79 ; 'y'
B1:579F F0 movx @DPTR, A ; FC76 e FC77 = 0x179
B1:579F ; offset horizontal. Quanto menor, mais à esquerda a linha começa.
B1:57A0 EF mov A, R7 ; R7 contém o número da TAG (linha) sendo exibida?
B1:57A1 75 F0 1E mov B, #0x1E ; Altura presumida de cada linha
B1:57A1 ; 0x10 fará com que cada linha cubra a metade da anterior
B1:57A1 ; 0x16 funciona OK com a fonte original
B1:57A4 A4 mul AB
B1:57A5 AE F0 mov R6, B ; R6 contém agora a coordenada vertical de impressão da linha?
B1:57A7 24 37 add A, #0x37 ; '7' ; Offset vertical. Quanto menor, mais próxima do topo da janela
B1:57A7 ; a primeira linha das TAGs vai ser impressa.
B1:57A9 90 FC 7A mov DPTR, #XRAM_FC7A ; Coordenada vertical (LO)
B1:57AC F0 movx @DPTR, A
B1:57AD E4 clr A
B1:57AE 3E addc A, R6
B1:57AF 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:57B2 F0 movx @DPTR, A
B1:57B3 90 FB A0 mov DPTR, #XRAM_FBA0
B1:57B6 E0 movx A, @DPTR
B1:57B7 FC mov R4, A
B1:57B8 A3 inc DPTR
B1:57B9 E0 movx A, @DPTR
B1:57BA FD mov R5, A
B1:57BB A3 inc DPTR
B1:57BC E0 movx A, @DPTR
B1:57BD FE mov R6, A
B1:57BE A3 inc DPTR
B1:57BF E0 movx A, @DPTR
B1:57C0 FF mov R7, A
B1:57C1 A3 inc DPTR
B1:57C2 12 08 F5 lcall B1_?C?LSTXDATA
B1:57C5 90 FB AA mov DPTR, #XRAM_FBAA ; Número de caracteres na TAG ID3?
B1:57C8 E0 movx A, @DPTR
B1:57C9 D3 setb C
B1:57CA 94 10 subb A, #0x10 ; Número máximo de caracteres a exibir por TAG
B1:57CC 40 6B jc B1_5839
B1:57CE 90 FB B3 mov DPTR, #XRAM_FBB3
B1:57D1 E0 movx A, @DPTR
B1:57D2 94 07 subb A, #7
B1:57D4 50 1B jnc B1_57F1
B1:57D6 90 FB A4 mov DPTR, #XRAM_FBA4
B1:57D9 E0 movx A, @DPTR
B1:57DA FC mov R4, A
B1:57DB A3 inc DPTR
B1:57DC E0 movx A, @DPTR
B1:57DD FD mov R5, A
B1:57DE A3 inc DPTR
B1:57DF E0 movx A, @DPTR
B1:57E0 FE mov R6, A
B1:57E1 A3 inc DPTR
B1:57E2 E0 movx A, @DPTR
B1:57E3 FF mov R7, A
B1:57E4 90 FB B6 mov DPTR, #XRAM_FBB6
B1:57E7 12 08 F5 lcall B1_?C?LSTXDATA
B1:57EA 7D 10 mov R5, #0x10
B1:57EC 7F 0F mov R7, #0xF
B1:57EE 12 1E AE lcall B1_BS_233_B3_A227
B1:57F1
B1:57F1 B1_57F1: ; CODE XREF: MP3_TagDisplay+178j
B1:57F1 90 FB B3 mov DPTR, #XRAM_FBB3
B1:57F4 E0 movx A, @DPTR
B1:57F5 04 inc A
B1:57F6 F0 movx @DPTR, A
B1:57F7 90 FB A4 mov DPTR, #XRAM_FBA4
B1:57FA E0 movx A, @DPTR
B1:57FB FC mov R4, A
B1:57FC A3 inc DPTR
B1:57FD E0 movx A, @DPTR
B1:57FE FD mov R5, A
B1:57FF A3 inc DPTR
B1:5800 E0 movx A, @DPTR
B1:5801 FE mov R6, A
B1:5802 A3 inc DPTR
B1:5803 E0 movx A, @DPTR
B1:5804 24 10 add A, #0x10
B1:5806 FF mov R7, A
B1:5807 E4 clr A
B1:5808 3E addc A, R6
B1:5809 FE mov R6, A
B1:580A E4 clr A
B1:580B 3D addc A, R5
B1:580C FD mov R5, A
B1:580D E4 clr A
B1:580E 3C addc A, R4
B1:580F FC mov R4, A
B1:5810 90 FB A4 mov DPTR, #XRAM_FBA4
B1:5813 12 08 F5 lcall B1_?C?LSTXDATA
B1:5816 90 FB AA mov DPTR, #XRAM_FBAA ; Número de caracteres na TAG ID3?
B1:5819 E0 movx A, @DPTR
B1:581A 24 F0 add A, #0xF0 ; ''
B1:581C F0 movx @DPTR, A
B1:581D 90 FC 7A mov DPTR, #XRAM_FC7A ; Coordenada vertical (LO)
B1:5820 E0 movx A, @DPTR
B1:5821 24 1A add A, #0x1A
B1:5823 F0 movx @DPTR, A
B1:5824 90 FC 79 mov DPTR, #XRAM_FC79 ; Coordenada vertical (HI)
B1:5827 E0 movx A, @DPTR
B1:5828 34 00 addc A, #0
B1:582A F0 movx @DPTR, A
B1:582B 90 FC 77 mov DPTR, #XRAM_FC77 ; Coordenada horizontal (LO)
B1:582E E0 movx A, @DPTR
B1:582F 24 0A add A, #0xA
B1:5831 F0 movx @DPTR, A
B1:5832 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:5835 E0 movx A, @DPTR
B1:5836 34 00 addc A, #0
B1:5838 F0 movx @DPTR, A
B1:5839
B1:5839 B1_5839: ; CODE XREF: MP3_TagDisplay+170j
B1:5839 90 FB AA mov DPTR, #XRAM_FBAA ; Número de caracteres na TAG ID3?
B1:583C E0 movx A, @DPTR
B1:583D FD mov R5, A
B1:583E 60 2E jz B1_586E
B1:5840 90 FB B3 mov DPTR, #XRAM_FBB3
B1:5843 E0 movx A, @DPTR
B1:5844 C3 clr C
B1:5845 94 07 subb A, #7
B1:5847 50 1F jnc B1_5868
B1:5849 ED mov A, R5
B1:584A C0 E0 push ACC ; Accumulator
B1:584C 90 FB A4 mov DPTR, #XRAM_FBA4
B1:584F E0 movx A, @DPTR
B1:5850 FC mov R4, A
B1:5851 A3 inc DPTR
B1:5852 E0 movx A, @DPTR
B1:5853 FD mov R5, A
B1:5854 A3 inc DPTR
B1:5855 E0 movx A, @DPTR
B1:5856 FE mov R6, A
B1:5857 A3 inc DPTR
B1:5858 E0 movx A, @DPTR
B1:5859 FF mov R7, A
B1:585A 90 FB B6 mov DPTR, #XRAM_FBB6
B1:585D 12 08 F5 lcall B1_?C?LSTXDATA
B1:5860 D0 E0 pop ACC ; Accumulator
B1:5862 FD mov R5, A
B1:5863 7F 0F mov R7, #0xF
B1:5865 12 1E AE lcall B1_BS_233_B3_A227
B1:5868
B1:5868 B1_5868: ; CODE XREF: MP3_TagDisplay+1EBj
B1:5868 90 FB B3 mov DPTR, #XRAM_FBB3
B1:586B E0 movx A, @DPTR
B1:586C 04 inc A
B1:586D F0 movx @DPTR, A
B1:586E
B1:586E B1_586E: ; CODE XREF: MP3_TagDisplay+137j
B1:586E ; MP3_TagDisplay+1E2j
B1:586E 90 FB A0 mov DPTR, #XRAM_FBA0
B1:5871 E0 movx A, @DPTR
B1:5872 F8 mov R0, A
B1:5873 A3 inc DPTR
B1:5874 E0 movx A, @DPTR
B1:5875 F9 mov R1, A
B1:5876 A3 inc DPTR
B1:5877 E0 movx A, @DPTR
B1:5878 FA mov R2, A
B1:5879 A3 inc DPTR
B1:587A E0 movx A, @DPTR
B1:587B FB mov R3, A
B1:587C 90 FB A8 mov DPTR, #XRAM_FBA8 ; Número sequencial da TAG?
B1:587F E0 movx A, @DPTR
B1:5880 90 2F DB mov DPTR, #B1_2FDB
B1:5883 93 movc A, @A+DPTR
B1:5884 FF mov R7, A
B1:5885 E4 clr A
B1:5886 FC mov R4, A
B1:5887 FD mov R5, A
B1:5888 FE mov R6, A
B1:5889 EB mov A, R3
B1:588A 2F add A, R7
B1:588B FF mov R7, A
B1:588C EE mov A, R6
B1:588D 3A addc A, R2
B1:588E FE mov R6, A
B1:588F ED mov A, R5
B1:5890 39 addc A, R1
B1:5891 FD mov R5, A
B1:5892 EC mov A, R4
B1:5893 38 addc A, R0
B1:5894 FC mov R4, A
B1:5895 90 FB A0 mov DPTR, #XRAM_FBA0
B1:5898 12 08 F5 lcall B1_?C?LSTXDATA
B1:589B 90 FB A8 mov DPTR, #XRAM_FBA8 ; Número sequencial da TAG?
B1:589E E0 movx A, @DPTR
B1:589F 04 inc A
B1:58A0 F0 movx @DPTR, A
B1:58A1 E0 movx A, @DPTR
B1:58A2 C3 clr C
B1:58A3 94 06 subb A, #6
B1:58A5 50 03 jnc B1_58AA
B1:58A7 02 56 F3 ljmp B1_56F3
B1:58AA ; ---------------------------------------------------------------------------
B1:58AA
B1:58AA B1_58AA: ; CODE XREF: MP3_TagDisplay+8Fj
B1:58AA ; MP3_TagDisplay+DDj ...
B1:58AA 22 ret
B1:58AA ; End of function MP3_TagDisplay
[/size]
-
Eu fiz a mudança seguindo o tutorial do Vladmir mas sempre a TAG descia pra parte de baixo da tela e overscan acabava "comendo" pois eu nao estava conseguindo fazer que o caractere ficassem mais proximo, mas graças a seu tutorial acima agora ficou perfeito.
Valeu Ryan.
PS. Como fazer modificação diretamente usando o IDA? Tem como? Eu uso aqui uma versão de teste e nao conseguir, nao sei se é por ser TRIAL ou porque ele nao faz mesmo, como por exemplo inserir novas linhas como você fez acima.
-
Não tem como modificar usando o IDA, infelizmente. Isso pouparia um trabalho danado.
As linhas modificadas acima foram redigidas manualmente por mim, para ajudar na compreensão do texto
-
O Vladimir fez um tutorial explicando como fazer isso?
Eu só vi aquele post onde ele ainda não sabia como fazer.
Raios... se eu tivesse pesquisado mais não teria passado horas analisando e testando valores. :dashhead1:
Você tem o link fácil aí?
-
O Vladimir fez um tutorial explicando como fazer isso?
Eu só vi aquele post onde ele ainda não sabia como fazer.
Raios... se eu tivesse pesquisado mais não teria passado horas analisando e testando valores. :dashhead1:
Você tem o link fácil aí?
Então provavelmente o documento que eu tenho que mostra as rotinas das TAG MP3 não é de autoria do Vladimir, eu econtrei no DreaMule um pacote zipado com o nome de (MTK_DOC_Vladimir-Boroda) dentro tem varios documentos bem interessante, a maioria é de autoria do NewAge, pois estão presente no grupo do yahoo.
Se você quizer dar uma olhada posso fazer um UP.
-
Se você quizer dar uma olhada posso fazer um UP.
Desculpe me entrometer, mas se puder fazer o upload ficarei muito grato... ;)
-
Olá Jmaraujo, tudo beleza?
O documento das TAG MP3 é bem pratico, tem apenas duas paginas, estou usando ele como base tambem para implementar MP3 TAG no Proview 858, fiz o UP apenas dele, os outros documentos tem 7MB, se interessar posso fazer o UP.
http://www.4shared.com/file/20785704/b56dcdf/Rout_-_MP3_TAGS.html
-
Muito obrigado!!! ;D
os outros documentos tem 7MB, se interessar posso fazer o UP.
Interessa sim, se não for muito incomodo...
-
Nenhum incômodo, compactei em .RAR pra diminuir um pouco o tamanho.
Download (4MB)
http://www.4shared.com/file/20787715/cf431583/Documentos_MTK.html
-
Muito obrigado, Eneris.
-
O documento das TAG MP3 é bem pratico, tem apenas duas paginas,
http://www.4shared.com/file/20785704/b56dcdf/Rout_-_MP3_TAGS.html
Tem certeza de que foi esse o documento que você usou para mover as tags? Tudo o que eu consegui obter dele (não entendo C ainda) foram as pistas necessárias para encontrar a rotina MP3_tagDisplay em qualquer firmware.
Mesmo assim, ajudou bastante!
Editado: Esse é o mesmo documento Info - MP3 tags.rtf (http://tech.groups.yahoo.com/group/mt13x9/files/Documents/Info - MP3 tags.rtf)escrito por lisatv_ e disponível no MT13x9, mas que eu não havia lido ainda.
-
Nenhum encomodo, compactei em .RAR pra diminuir um pouco o tamanho.
Download (4MB)
http://www.4shared.com/file/20787715/cf431583/Documentos_MTK.html
A maior parte dos documentos pode ser garimpada no grupo MT13x9, mas existem algumas novidades.
De qualquer forma, é bom poder encontrar todos esses documentos em um só pacote. Baixar um por um no MT13x9 é um saco!
Obrigado!
-
MT1389_MISC.idc
Eu perdi a conta de quantas horas perdi procurando pela rotina RC_DECODE e pelas rotinas PREF/SET_Char nos firmwares. Tudo por não saber que o script MT1389_MISC.idc encontra essas e várias outras rotinas automaticamente.
Eu achava que o script MT1389_8032_FULL.idc englobava tudo o que já havia sido descoberto pelo grupo MT13x9, mas quebrei a cara. Também é preciso rodar MT1389_MISC.idc e possivelmente existem outros scripts úteis.
-
O documento das TAG MP3 é bem pratico, tem apenas duas paginas,
http://www.4shared.com/file/20785704/b56dcdf/Rout_-_MP3_TAGS.html
Tem certeza de que foi esse o documento que você usou para mover as tags? Tudo o que eu consegui obter dele (não entendo C ainda) foram as pistas necessárias para encontrar a rotina MP3_tagDisplay em qualquer firmware.
Mesmo assim, ajudou bastante!
Editado: Esse é o mesmo documento Info - MP3 tags.rtf (http://tech.groups.yahoo.com/group/mt13x9/files/Documents/Info - MP3 tags.rtf)escrito por lisatv_ e disponível no MT13x9, mas que eu não havia lido ainda.
Como eu disse no post anterior ao jmaraujo, estou usando ele tambem pra implementar MP3 TAG ao Proview 858, mas no estou encontrando algumas rotinas, se nao me engano este documento estar incompleto.
PS. Ryan existe alguma maneira de dar autoload nas legendas no 5965 sem dar pane nos menu DivX Ultra? Eu usei um documento presente no grupo do yahoo e a legenda até autocarrega mas em compensação dar pane nos filmes como menu DivX Ultra, deste jeito nao acho interessante coloca a função de autoload nas legendas, pois eu tenho muito filme com menu DivX Ultra.
-
PS. Ryan existe alguma maneira de dar autoload nas legendas no 5965 sem dar pane nos menu DivX Ultra? Eu usei um documento presente no grupo do yahoo e a legenda até autocarrega mas em compensação dar pane nos filmes como menu DivX Ultra, deste jeito nao acho interessante coloca a função de autoload nas legendas, pois eu tenho muito filme com menu DivX Ultra.
Eu nunca tentei fazer o autoload, mas eu dei uma olhada por alto no documento "Smart loading of text subtitles in DMF RISC’s" do HEJ e não deveria haver qualquer efeito colateral.
Outra hora eu darei uma olhada nisso. Neste momento eu estou estudando outra coisa.
-
Eneris:
No grupo MT13x9 do Yahoo! tem um velho post meu (Jan 13, 2007) onde está explicado como eu fiz o "autoload" de legendas (é preciso ser usuario de Y! para acessar o grupo):
http://tech.groups.yahoo.com/group/mt13x9/message/8340 (http://tech.groups.yahoo.com/group/mt13x9/message/8340)
(Aclaração: Naquele momento eu não notei que deixei um par de comentarios em espanhol... por tanto "botón" = tecla)
Os endereços no meu post são do DVP5100. Voçê pode pegar o firmware jmaraujo 1.1 e o original 0E.0A (do fórum do DVP5100, ou do site do Ryan) para comparar. Também é preciso trocar o "12" (avi) nos ArmCodes, para "9" (mpeg).
Um abraço.
-
Primeiro gostaría de parabenizar o Ryan pelas descobertas... :clapping:
Se voçês precisarem fazer espaço para botar os tags mp3 na parte de abaixo da tela, é possivel apertar a parte dos nomes de arquivo no filebrowser, mexendo nas coordenadas.
Primeiro é preciso achar a função "DIR_Disp_Filelist":
ROM:593C DIR_Disp_Filelist:
ROM:593C 90 FB 6C mov DPTR, #0xFB6C
ROM:593F EF mov A, R7
ROM:5940 F0 movx @DPTR, A
ROM:5941 D2 74 setb RAM_2E.4
ROM:5943 E0 movx A, @DPTR
ROM:5944 75 F0 10 mov B, #0x10 ; B-Register
ROM:5947 A4 mul AB
ROM:5948 24 E0 add A, #0xE0 ; 'Ó'
ROM:594A FF mov R7, A
ROM:594B E5 F0 mov A, B ; B-Register
ROM:594D 34 08 addc A, #8
... (cont)
Seguindo a rotina "DIR_Disp_Filelist", mais abaixo há o seguinte código:
ROM:5A1A ROM_5A1A:
ROM:5A1A 90 FB 6C mov DPTR, #0xFB6C
ROM:5A1D E0 movx A, @DPTR
ROM:5A1E FF mov R7, A
ROM:5A1F 75 F0 08 mov B, #8 ; B-Register
ROM:5A22 A4 mul AB
ROM:5A23 24 B3 add A, #0xB3 ; '¦' ; Pointer a tabla de coordenadas
ROM:5A25 F5 82 mov DPL, A ; Data Pointer, Low Byte
ROM:5A27 E4 clr A
ROM:5A28 34 22 addc A, #0x22 ; '"' ; Pointer a tabla de coordenadas
ROM:5A2A F5 83 mov DPH, A ; Data Pointer, High Byte
ROM:5A2C E4 clr A
... (cont)
Ahí está o pointer para a tabela de coordenadas do filebrowser. No caso do DVP5100: 0x22B3
Tabela de coordenadas do filebrowser:
ROM:22B3 DIR_CoordTable
ROM:22B3 00 1E Archivo_1:.word 0x1E ; X1 = 30
ROM:22B5 00 5E .word 0x5E ; Y1 = 94
ROM:22B7 02 4A .word 0x24A ; X2 = 586
ROM:22B9 00 7C .word 0x7C ; Y2 = 124
ROM:22BB 00 1E Archivo_2:.word 0x1E ; X1 = 30
ROM:22BD 00 7E .word 0x7E ; Y1 = 126
ROM:22BF 02 4A .word 0x24A ; X2 = 586
ROM:22C1 00 9C .word 0x9C ; Y2 = 156
ROM:22C3 00 1E Archivo_3:.word 0x1E ; X1 = 30
ROM:22C5 00 9E .word 0x9E ; Y1 = 158
ROM:22C7 02 4A .word 0x24A ; X2 = 586
ROM:22C9 00 BC .word 0xBC ; Y2 = 188
ROM:22CB 00 1E Archivo_4:.word 0x1E ; X1 = 30
ROM:22CD 00 BE .word 0xBE ; Y1 = 190
ROM:22CF 02 4A .word 0x24A ; X2 = 586
ROM:22D1 00 DC .word 0xDC ; Y2 = 220
X1-Y1 é a coordenada do canto superior esquerdo. X2-Y2 é a coordenada do canto inferior direito. Ajustando os valores de Y1 e Y2 é possivel apertar um pouco a visualização dos arquivos no filebrowser.
Un abraço.
-
Eu não tentei isso ainda, mas acho que não dá para ganhar muita coisa sem ter que mudar os ícones.
Se você ignorar os ícones ou conseguir ícones menores, aí já dá para ganhar bastante espaço.
-
Não tinha pensado em isso...
Em teoría sería possivel apertar um pixel por linha, assim como levantar todas as quatro linhas em conjunto mais perto da seta (sem ter que mexer na janela). Isso liberaría um bom espaço na parte de baixo.
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)
(http://www.ryan.com.br/imagens/dvp5100/dvp5100_mp3_w.jpg)
-
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:
(http://ryan.com.br/imagens/mediatek/mediatek_ida_occurrences_binary26(50).jpg)
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:
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_mod_6(50).jpg)
Problemas pendentes
1) Ao selecionar um MP3 qualquer, a seta inferior está sumindo:
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_mod_7(50).jpg)
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:
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_mod_8(50).jpg)
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:
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_mod_9(50).jpg)
É 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 firmware
Eu 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 yy
Onde 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 7F
Isso vai retornar mais resultados, mas rapidamente você descartará os errados, porque ocorrem em outros bancos.
-
Muito bom Ryan, Parabens! :clapping:
So nao captei a parte que troca 4 bytes.
EDITADO: Ryan, ao inves de mover as setas nao teria como apagar elas, e deixar como no Proview que as setas estao na imagem do background? O ruim é que nao iriamos saber se ainda tem mais arquivos abaixo ou acima, no Proview existe a barra de rolagem.
-
Não é quatro bytes. É quatro lugares :)
Se ainda não estiver claro, me avise.
E para apagar as setas, basta mandar ver NOPs em todas as rotinas. Mas eu não acho que isso seja uma boa idéia
-
Agora captei. :dashhead1:
Obrigado!
-
BUG!
Eu implantei do zero todas as modificações em um firmware limpo e acabei me deparando com um bug:
Esta é a exibição normal de thumbnails do DVP5960:
(http://ryan.com.br/imagens/dvp5960/dvp5960_thumbnail(50).jpg)
E como ficou com as minhas modificações:
(http://ryan.com.br/imagens/dvp5960/dvp5960_id3_bug_1(50).jpg)
Eu ainda não sei o que provocou isso. Além da definição de fonte própria para as tags, a mudança na posição das mesmas e a posição das setas eu também passei o firmware no mtkModToolbox para corrigir o browser
Não estou com tempo agora para testar uma coisa de cada vez e localizar o que provocou o problema, porque já me ocupei com outra coisa, mas depois eu verei isso.
[01/09/07] Eu ainda não descobri o que aconteceu, mas os patches feitos pelo meu programa MTK Patcher não estão provocando o problema. Eu ainda tenho curiosidade de saber o que ocorreu, porque ninguém sabe como mudar a posição de exibição do preview.
-
Eu ainda não sei o que provocou isso. Além da definicção de fonte própria para as tags, a mudança na posição das mesmas e a posição das setas eu também passei o firmware no mtkModToolbox para corrigir o browser
Eu lembro ter lido -faz um tempão já- um post no grupo MT13x9 (acho que o post era do NA), onde dizia que a posição de algumas janelas é relativa, enquanto as de outras janelas é absoluta.
Quem sabe esse é o caso... Se voçê ampliou a janela do filebrowser, é possivel que isso possa ter alterado a posição da miniatura jpeg... ;)
-
Não é isso. Reduzi a janela e nada mudou.
-
Realmente, testei aqui no 5965 e o bug acontece identico. :(
Mas a exibição JPEG pra mim nao tem importancia, pois eu ja desativei por definitivo, ;D
PS: Ryan ou Jmaraujo, tem alguma maneira de encontrar o ARM_getChar e arm_putChar usando o proprio IDA? Pois seria bem mais pratico, eu dei uma caçada no grupo do yahoo e nao achei nada a respeito.
-
Eneris:
Eles aparecem no MTK Remaker, no Banco 0. Pegue a direçao que o MTK Remaker mostra e busque:
"90 ? ? 02 02 28", onde ? ? é o endereço no Banco 0.
Por exemplo, olhando o firmware do DVP5100 no MTK Remaker, Arm_GetChar está no ROM:F2EC (do Banco 0).
Busque "90 F2 EC 02 02 28" em qualquer banco e voçê vai achar o endereço:
ROM:047B Arm_GetChar:
ROM:047B 90 F2 EC mov DPTR, #0xF2EC
ROM:047E 02 02 28 ljmp B_BANK0
No caso do meu exemplo: Arm_GetChar = 047B
Faça o mesmo procedimento para achar Arm_PutChar, Arm_GetDram e Arm_PutDram.
Saudações!
EDIT:
Ou busque a seqüencia "D3 10 AF 01 C3 C0 D0 8E ? 8F ? 90 F8 60" para achar Arm_GetChar e Arm_GetChar1C no banco 0.
Acho mais fácil o método do MTK Remaker... ;)
-
Valeu jmaraujo,
O primeiro metodo eu ja conhecia, o segundo nao, vou testar o segundo aqui.
Edit: O segundo metodo aqui nao funcionou, é encontrado um endereço diferente.
Edit 2: O primeiro metodo nem sempre funciona, pois nao sao todos os firmware que mostra no Banco 0 arm_getChar e arm_PutChar.
-
Agora temos espaço sobrando, mas faltam caracteres. A limitação de 14 caracteres por tag é artificial, porque a seção ARM entrega 30. Então vamos aumentar isso.
Três bytes precisam ser mudados, em dois pontos diferentes:
B1:5785 94 FF subb A, #0xFF
B1:5787 40 03 jc B1_578C
B1:5789 74 FF mov A, #0xFF
e
B1:57CA 94 FF subb A, #0xFF ; Número máximo de caracteres a exibir por TAG
Jefferson, não estou conseguindo achar o último local a alterar. É a última coisa que me está faltando trocar...
Ponto 1 e 2 no firwmare do DVP5100:
ROM:48E4 94 1E subb A, #0x1E ; límite de caracteres en mp3 tags
ROM:48E6 40 03 jc ROM_48EB
ROM:48E8 74 1E mov A, #0x1E ; límite de caracteres en mp3 tags
Ponto 3???
¿Será que voçê podería me ajudar?
Obrigado! ;)
-
DVP5100 0E.0A
B1:4929 94 10 subb A, #0x10
-
Muito obrigado!!! :yahoo!: 8)
-
Não é dificil achar. Você provavelmente estava procurando po "0E". Mas se olhasse no exemplo, perceberia que nesta linha é "10".
-
Finalmente já está tomando forma o filebrowser após as minhas mudanças... Mudei a posição das setas, não só horizontalmente, mas verticalemente também. Subí as coordenadas dos arquivos, e deixei a área das coordenadas levemente menos larga para não interferir com as setas.
A área dos tags mp3s ainda pode ser movida um pouco para cima. A área a direita dos tags pode ser utilizado para colocar a miniatura .jpg naquele espaço.
Terei que criar um background novo, mas não acho que seja problema.
Jefferson, ¿cómo voçê fez as mudanças do seu background? ¿Foi "a olho" mesmo, ou voçê calculou as coordenadas?
-
Jefferson, ¿cómo voçê fez as mudanças do seu background? ¿Foi "a olho" mesmo, ou voçê calculou as coordenadas?
Foi a olho. Eu fiz umas 4 imagens até posicionar corretamente.
-
A próposito... Eu troquei as coordenadas da área de limpeza dos em tres lugares, do jeito que voçê escreveu no post "MP3_TagDisplay - ClearRect inicial". Até agora tudo funcionou normalmente...
No DVP5100: Nas rotinas "ROM:480B", "ROM:5FD5" e a partir de "ROM:BD11" (todas no banco 1).
-
Jmaraujo, você sabe como exibir caracteres acentuados no browser?
PS: Como encontro o getChar e putChar quando o remaker nao exibe as informações no banco 0?
help...
-
SENHAS
E um pouco sobre menus ocultos
Como descobrir os procedimentos de exibição da tela de versão e de escolha de regiões, incluindo senhas, da maioria dos aparelhos baseado em MT13x9 por análise do seu firmware.
O procedimento funcionou nos seguintes firmwares
- Proview DVP-858
- Philips DVP5100
- Philips DVP3040K
- Philips DVP5965
- Philips DVP5980
- Philips DVP5140
- Lenoxx DV-406
Não funcionou nos seguintes
- Pioneer 575 (possivelmente nenhum Pioneer)
- possivelmente, nenhum LG)
Também funciona com o Philips PET725, mas as strings de busca são diferentes
Eu tomei como ponto de partida o documento MenusOcultos.rtf (http://tech.groups.yahoo.com/group/MEDIATEK1389/files/DOCUMENTOS/8032Info-Oct2004.rar) de Cachirulo :clapping:. Somente lendo o documento eu não entendi nada, por isso baixei o firmware em que ele se baseia (http://tech.groups.yahoo.com/group/MEDIATEK1389/files/FIRMWARE/NEVIR%202046-47/mtt1389.zip) e depois de abri-lo no IDA e rodar os scripts de análise, tudo ficou claro. O documento não fornece strings de busca, nem explica como localizar as rotinas em seu firmware. Eu vou preencher estas lacunas neste post.
Como exemplo, vou usar o firmware do Proview DVP-858, v20.07, cujas senhas eram um mistério até eu descobrir esse procedimento.
Tela de Versão
(http://ryan.com.br/imagens/dvp858/proview_dvp858_menu_teste_version_50.jpg)
Procure por:
90 ? ? E0 64 ? 70 ? 90 ? ? E0 FF 54 0F FE 64 0F 60 ? EE C3 94 ? 50 ? EE 90 ? ? 93 FE 90 FB 00
Esta string só ocorre uma vez, na rotina que o Cachirulo batizou de CheckVersPass, mas que eu vou chamar aqui de CheckVersionPass (não faz diferença).
B2:D849 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B2:D849
B2:D849
B2:D849 CheckVersionPass: ; CODE XREF: BankSw_593_B2_5195+16p
B2:D849 90 FD 74 mov DPTR, #XRAM_FD74 ; Número do menu corrente
B2:D84C E0 movx A, @DPTR
B2:D84D 64 01 xrl A, #1 ; Estamos no menu 1 (General)?
B2:D84F 70 5E jnz B2_D8AF
B2:D851 90 FC B7 mov DPTR, #XRAM_FCB7
B2:D854 E0 movx A, @DPTR
B2:D855 FF mov R7, A
B2:D856 54 0F anl A, #0xF
B2:D858 FE mov R6, A
B2:D859 64 0F xrl A, #0xF
B2:D85B 60 52 jz B2_D8AF
B2:D85D EE mov A, R6
B2:D85E C3 clr C
B2:D85F 94 04 subb A, #4 ; Número de dígitos da senha
B2:D861 50 1C jnc B2_D87F
B2:D863 EE mov A, R6
B2:D864 90 44 F4 mov DPTR, #VersionPass
B2:D867 93 movc A, @A+DPTR
B2:D868 FE mov R6, A
B2:D869 90 FB 00 mov DPTR, #XRAM_FB00 ; Buffer_Remoto
B2:D86C E0 movx A, @DPTR
B2:D86D 6E xrl A, R6
B2:D86E 70 0F jnz B2_D87F
B2:D870 EF mov A, R7
B2:D871 54 F0 anl A, #0xF0
B2:D873 FE mov R6, A
B2:D874 EF mov A, R7
B2:D875 04 inc A
B2:D876 54 0F anl A, #0xF
B2:D878 4E orl A, R6
B2:D879 90 FC B7 mov DPTR, #XRAM_FCB7
B2:D87C F0 movx @DPTR, A
B2:D87D 80 07 sjmp B2_D886
B2:D87F ; ---------------------------------------------------------------------------
B2:D87F
B2:D87F B2_D87F: ; CODE XREF: CheckVersionPass+18j
B2:D87F ; CheckVersionPass+25j
B2:D87F EF mov A, R7
B2:D880 54 F0 anl A, #0xF0
B2:D882 90 FC B7 mov DPTR, #XRAM_FCB7
B2:D885 F0 movx @DPTR, A
B2:D886
B2:D886 B2_D886: ; CODE XREF: CheckVersionPass+34j
B2:D886 90 FC B7 mov DPTR, #XRAM_FCB7
B2:D889 E0 movx A, @DPTR
B2:D88A FF mov R7, A
B2:D88B 54 0F anl A, #0xF
B2:D88D FE mov R6, A
B2:D88E BE 04 1E cjne R6, #4, B2_D8AF
B2:D891 EF mov A, R7
B2:D892 44 0F orl A, #0xF
B2:D894 F0 movx @DPTR, A
B2:D895 90 FD 69 mov DPTR, #XRAM_FD69
B2:D898 74 0A mov A, #0xA
B2:D89A F0 movx @DPTR, A
B2:D89B 90 FC C8 mov DPTR, #XRAM_FCC8
B2:D89E E0 movx A, @DPTR
B2:D89F 54 80 anl A, #0x80
B2:D8A1 44 07 orl A, #7
B2:D8A3 F0 movx @DPTR, A
B2:D8A4 90 FD 74 mov DPTR, #XRAM_FD74 ; Número do menu corrente
B2:D8A7 74 15 mov A, #0x15 ; Carrega com o novo menu (versão)
B2:D8A9 F0 movx @DPTR, A
B2:D8AA 7F 01 mov R7, #1
B2:D8AC 12 E6 DC lcall B2_E6DC
B2:D8AF
B2:D8AF B2_D8AF: ; CODE XREF: CheckVersionPass+6j
B2:D8AF ; CheckVersionPass+12j ...
B2:D8AF 22 ret
B2:D8AF ; End of function CheckVersionPass
O menu onde é preciso estar para que a senha seja válida está destacado em verde. Você precisa conferir os números dos menus no mtkRemaker, mas esse é um problema menor, porque sabendo a senha basta entrar em cada um dos menus principais e digitar a senha, até achar o menu correto. Normalmente, são os menus General e Preferences.
O endereço do offset no mesmo banco onde está a senha está destacado em azul (0x44F4) e o número de bytes está destacado em vermelho (4);
Olhando então no offset 0x44F4 do mesmo banco encontramos a senha:
B2:44F4 09 VersionPass:.byte 9 ; DATA XREF: CheckVersionPass+1Bo
B2:44F5 05 .byte 5
B2:44F6 09 .byte 9
B2:44F7 06 .byte 6
B2:44F8 01 .byte 1
B2:44F9 02 .byte 2
B2:44FA 03 .byte 3
B2:44FB 04 .byte 4
B2:44FC 0E .byte 0xE
B2:44FD 0E .byte 0xE
B2:44FE 0E .byte 0xE
B2:44FF 0F .byte 0xF
A senha é 9596
O offset está com o nome "VersionPass" porque eu dei esse nome a ele. No seu IDA ele vai aparecer com o número do endereço mesmo.
Tela de escolha de Região
(http://ryan.com.br/imagens/dvp858/proview_dvp858_menu_teste_region_50.jpg)
Procure por:
90 ? ? E0 FF 64 ? 70 ? 90 ? ? E0 FE 54 0F FD 64 0F 60 ? ED C3 94 ? 50 ? ED 90 ? ? 93 FD 90 FB 00
Esta string só ocorre uma vez, na rotina que o Cachirulo batizou de CheckMenuPass, mas que eu vou chamar aqui de CheckRegionPass porque me parece bem mais descritivo.
B2:D1E2 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B2:D1E2
B2:D1E2
B2:D1E2 CheckRegionPass: ; CODE XREF: BankSw_593_B2_5195+13p
B2:D1E2 90 FD 74 mov DPTR, #XRAM_FD74 ; Número do menu corrente
B2:D1E5 E0 movx A, @DPTR
B2:D1E6 FF mov R7, A
B2:D1E7 64 06 xrl A, #6 ; Página de Preferências
B2:D1E9 70 35 jnz B2_D220
B2:D1EB 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D1EE E0 movx A, @DPTR
B2:D1EF FE mov R6, A
B2:D1F0 54 0F anl A, #0xF
B2:D1F2 FD mov R5, A
B2:D1F3 64 0F xrl A, #0xF
B2:D1F5 60 29 jz B2_D220
B2:D1F7 ED mov A, R5
B2:D1F8 C3 clr C
B2:D1F9 94 04 subb A, #4 ; Número de dígitos da senha
B2:D1FB 50 1C jnc B2_D219
B2:D1FD ED mov A, R5
B2:D1FE 90 44 F0 mov DPTR, #RegionPass
B2:D201 93 movc A, @A+DPTR
B2:D202 FD mov R5, A
B2:D203 90 FB 00 mov DPTR, #XRAM_FB00 ; Buffer_Remoto
B2:D206 E0 movx A, @DPTR
B2:D207 6D xrl A, R5
B2:D208 70 0F jnz B2_D219
B2:D20A EE mov A, R6
B2:D20B 54 F0 anl A, #0xF0
B2:D20D FD mov R5, A
B2:D20E EE mov A, R6
B2:D20F 04 inc A
B2:D210 54 0F anl A, #0xF
B2:D212 4D orl A, R5
B2:D213 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D216 F0 movx @DPTR, A
B2:D217 80 07 sjmp B2_D220
B2:D219 ; ---------------------------------------------------------------------------
B2:D219
B2:D219 B2_D219: ; CODE XREF: CheckRegionPass+19j
B2:D219 ; CheckRegionPass+26j
B2:D219 EE mov A, R6
B2:D21A 54 F0 anl A, #0xF0
B2:D21C 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D21F F0 movx @DPTR, A
B2:D220
B2:D220 B2_D220: ; CODE XREF: CheckRegionPass+7j
B2:D220 ; CheckRegionPass+13j ...
B2:D220 EF mov A, R7
B2:D221 64 06 xrl A, #6
B2:D223 70 3D jnz B2_D262
B2:D225 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D228 E0 movx A, @DPTR
B2:D229 54 0F anl A, #0xF
B2:D22B 64 04 xrl A, #4
B2:D22D 70 33 jnz B2_D262
B2:D22F FD mov R5, A
B2:D230 7F 0A mov R7, #0xA
B2:D232 12 1B 82 lcall B2_BS_91_B5_E422
B2:D235 90 FD 73 mov DPTR, #XRAM_FD73
B2:D238 74 01 mov A, #1
B2:D23A F0 movx @DPTR, A
B2:D23B 90 FC B6 mov DPTR, #XRAM_FCB6
B2:D23E E0 movx A, @DPTR
B2:D23F 44 0F orl A, #0xF
B2:D241 F0 movx @DPTR, A
B2:D242 90 FD 69 mov DPTR, #XRAM_FD69
B2:D245 74 0B mov A, #0xB
B2:D247 F0 movx @DPTR, A
B2:D248 90 FC C8 mov DPTR, #XRAM_FCC8
B2:D24B E0 movx A, @DPTR
B2:D24C 54 80 anl A, #0x80
B2:D24E 44 04 orl A, #4
B2:D250 F0 movx @DPTR, A
B2:D251 90 FD 74 mov DPTR, #XRAM_FD74 ; Número do menu corrente
B2:D254 74 1A mov A, #0x1A ; Número do menu a exibir (Excolha de Região)
B2:D256 F0 movx @DPTR, A
B2:D257 7F 01 mov R7, #1
B2:D259 12 E6 DC lcall B2_E6DC
B2:D25C 90 FD 7B mov DPTR, #XRAM_FD7B
B2:D25F 74 06 mov A, #6
B2:D261 F0 movx @DPTR, A
B2:D262
B2:D262 B2_D262: ; CODE XREF: CheckRegionPass+41j
B2:D262 ; CheckRegionPass+4Bj
B2:D262 22 ret
B2:D262 ; End of function CheckRegionPass
Daqui, o procedimento para achar a senha é o mesmo. E temos:
B2:44F0 08 RegionPass:.byte 8 ; DATA XREF: CheckRegionPass+1Co
B2:44F1 03 .byte 3
B2:44F2 04 .byte 4
B2:44F3 03 .byte 3
B2:44F4 09 VersionPass:.byte 9 ; DATA XREF: CheckVersionPass+1Bo
B2:44F5 05 .byte 5
B2:44F6 09 .byte 9
B2:44F7 06 .byte 6
B2:44F8 01 .byte 1
B2:44F9 02 .byte 2
B2:44FA 03 .byte 3
B2:44FB 04 .byte 4
B2:44FC 0E .byte 0xE
B2:44FD 0E .byte 0xE
B2:44FE 0E .byte 0xE
B2:44FF 0F .byte 0xF
A senha é 8343
Aqui você também pode ver que as duas senhas ficam bem próximas. Foi a mesma coisa em todos os firmwares que eu verifiquei. Se você encontrar uma, basta olhar nas proximidades para encontrar a outra.
Notas:
1) Apesar do Lenoxx DV-406 ter uma rotina de escolha de região, ela é orfã (nenhuma rotina a chama). Mesmo sabendo o procedimento você não vai conseguir entrar na tela de escolha. Para isso será necessário uma correção no firmware.
2) Para o Philips PET 725 as strings são:
Versão
90 ? ? E0 64 ? 70 ? 90 ? ? E0 54 0F FF 64 0F 60 ? EF C3 94 ? 50 ? EF 90 ? ? 93 FF 90 FB 00
Região
90 ? ? E0 FC 64 ? 70 ? 90 ? ? E0 54 0F FE 64 0F 60 ? EE C3 94 ? 50 ? EE 90 ? ? 93 FE 90 FB 00
3) Você não precisa do IDA. Se você souber usar qualquer editor hexadecimal que faça buscas de strings hexa você pode localizar as senhas adaptando as strings que vou fornecer para a sintaxe do editor. No XVI32, por exemplo, basta susbstituir todos os "?" das strings por "2E" para fazer a busca.
-
Exhibir caracteres acentuados é uma das novas características do meu novo firmware (jmaraujo 1.2). Básicamente o que voçê tem que fazer é adicionar nos ArmCodes uma rotina (Unicode to CP) para converter os caracteres 250-255 nos caracteres 0-5. (É preciso modificar as fontes, também)
No grupo MT13x9 o Mabreaker explicou que por limitação técnica (agora não me lembro bem a explicação que ele deu), o firmware somente lé as fontes até o caracter 250.
Se me der um par de horas (ainda não fui dormir :(), mas tarde eu posto aquí como foi que eu fiz.
Igualmente, se tiver um pouco de pressa, a explicação está postada no grupo MT13x9 (busque Unicode to CP125x) e no documento "Patching... from A to Z" do Borusss.
Saudações!
PS: Para Arm_GetChar eu já expliquei no post anterior (busque a seqüencia "D3 10 AF 01 C3 C0 D0 8E ? 8F ? 90 F8 60"). Para Arm_PutChar, um método simples e alternativo e buscar a seqüencia "ED F0 D0 D0 92 AF 22" no banco 0. O principio de essa função e Arm_PutChar.
Depois com os endereços certos é so buscar os bank jumps.
-
Menu Handler
A partir da identificação de qualquer das rotinas CheckVersionPass ou CheckRegionPass, basta procurar quem as chama para encontrar uma rotina muito interessante que vou chamar de MenuHandler
B2:5195 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B2:5195
B2:5195
B2:5195 MenuHandler: ; DATA XREF: B0:B0_BS_593_B2_5195o
B2:5195 ; B1:B1_BS_593_B2_5195o ...
B2:5195 78 7E mov R0, #0x7E ; '~'
B2:5197 7C FB mov R4, #0xFB ; '¹'
B2:5199 7D 01 mov R5, #1
B2:519B 7B FF mov R3, #0xFF
B2:519D 7A 45 mov R2, #0x45 ; 'E'
B2:519F 79 0E mov R1, #0xE
B2:51A1 7E 00 mov R6, #0
B2:51A3 7F 02 mov R7, #2
B2:51A5 12 06 22 lcall B2_?C?COPY
B2:51A8 12 D1 E2 lcall CheckRegionPass
B2:51AB 12 D8 49 lcall CheckVersionPass
B2:51AE 90 FB 00 mov DPTR, #XRAM_FB00 ; Buffer_Remoto
B2:51B1 E0 movx A, @DPTR
B2:51B2 B4 FF 02 cjne A, #0xFF, B2_51B7 ; Se o buffer do remoto tiver um comando válido, salta para 51B7
B2:51B5 D3 setb C
B2:51B6 22 ret
B2:51B7 ; ---------------------------------------------------------------------------
B2:51B7
Como você pode ver, as duas rotinas de checagem de senha são chamadas a partir daqui. Eu não testei, mas acho que não seria difícil incluir nossa própria rotina de checagem de senha em algum lugar e inserir uma chamada para ela aqui (para dar acesso a outras opções criadas por nós). Esta rotina é chamada quando você está no SETUP toda vez que uma tecla qualquer do controle remoto é apertada, por isso podem aparecer outras utilidades.
Para achar MenuHandler sem ter achado as outras rotinas antes, procure por:
78 ? 7C ? 7D ? 7B ? 7A ? 79 ? 7E ? 7F ? 12 ? ? 12
Esta seqüência aparece várias vezes no firmware, mas o MenuHandler é a única rotina onde você pode encontrar a uma curta distância:
90 FB 00 mov DPTR, #XRAM_FB00
-
Rotina de conversão Unicode to CP125x
Eneris: Busque os seguintes dois pontos nos ArmCodes:
Lugar 1:
ROM:00025132 loc_25132
ROM:00025132 02 98 LDR R0, [SP,#0x30+var_28]
ROM:00025134 01 99 LDR R1, [SP,#0x30+var_2C]
ROM:00025136 80 19 ADD R0, R0, R6
ROM:00025138 41 18 ADD R1, R0, R1
ROM:0002513A 10 39 SUB R1, #0x10
ROM:0002513C C9 7B LDRB R1, [R1,#0xF]
Lugar 2:
ROM:00025166 loc_25166
ROM:00025166 A8 19 ADD R0, R5, R6
ROM:00025168 01 99 LDR R1, [SP,#0x30+var_2C]
ROM:0002516A 05 06 LSL R5, R0, #0x18
ROM:0002516C 41 18 ADD R1, R0, R1
ROM:0002516E 10 39 SUB R1, #0x10
ROM:00025170 C9 7B LDRB R1, [R1,#0xF]
Modificações:
Lugar a modificar 1:
ROM:00025132 loc_25132
ROM:00025132 02 98 LDR R0, [SP,#0x30+var_28]
ROM:00025134 01 99 LDR R1, [SP,#0x30+var_2C]
ROM:00025136 80 19 ADD R0, R0, R6
ROM:00025138 41 18 ADD R1, R0, R1
ROM:0002513A 50 F0 F9 F8 BL CP_conversion_routine
Lugar a modificar 2:
ROM:00025166 loc_25166
ROM:00025166 A8 19 ADD R0, R5, R6
ROM:00025168 01 99 LDR R1, [SP,#0x30+var_2C]
ROM:0002516A 05 06 LSL R5, R0, #0x18
ROM:0002516C 41 18 ADD R1, R0, R1
ROM:0002516E 50 F0 DF F8 BL CP_conversion_routine
Nova rotina: (exemplo com o firmware jmaraujo 1.x - RISC do Philips DVP5140)
ROM:00075330 CP_conversion_routine
ROM:00075330 10 39 SUB R1, #0x10
ROM:00075332 02 B4 PUSH {R1}
ROM:00075334 89 7B LDRB R1, [R1,#0xE]
ROM:00075336 01 29 CMP R1, #1
ROM:00075338 02 BC POP {R1}
ROM:0007533A C9 7B LDRB R1, [R1,#0xF]
ROM:0007533C 03 D1 BNE loc_75346
ROM:0007533E 01 B4 PUSH {R0}
ROM:00075340 08 48 LDR R0, =unk_75368
ROM:00075342 41 5C LDRB R1, [R0,R1]
ROM:00075344 01 BC POP {R0}
ROM:00075346
ROM:00075346 loc_75346
ROM:00075346 C0 46 NOP
ROM:00075348 F9 29 CMP R1, #0xF9 ; '¨'
ROM:0007534A 00 D9 BLS locret_7534E
ROM:0007534C FA 39 SUB R1, #0xFA ; '·'
ROM:0007534E
ROM:0007534E locret_7534E
ROM:0007534E 70 47 BX LR
A nova rotina pode ser escrita por cima das mensagems de erros de C+, ou como no meu caso, após ampliar o RISC.
Para calcular os saltos BL, use o utilitario BCalc do grupo MT13x9.
-
A nova rotina pode ser escrita por cima das mensagems de erros de C+, ou como no meu caso, após ampliar o RISC.
Acho que não ficou bem explicado o que eu quis dizer...
No final dos ArmCodes geralmente (ou sempre?) não há espaço livre como nos bancos do 8032, por tanto para adicionar novas rotinas voçe pode:
1) Ou bem sobreescrever a rotina de erros C+ (busque cadeias de texto com o IDA, como "Invalid Operation", "Divide By Zero", "Overflow", "Underflow", "Inexact Result", "Heap memory corrupted", "Unknown signal", etcétera...)
ou
2) Ampliar o espaço dos ArmCodes ("resize") para criar espaço livre no final.
-
Escolha da cor
B1:FF40 7F 71 mov R7, #0x71 ; 'q' ; Endereço 0x71 da eeprom
B1:FF42 7E 00 mov R6, #0
B1:FF44 12 19 E4 lcall Pref_Getchar_B1BS
B1:FF47 EF mov A, R7
B1:FF48 FD mov R5, A
B1:FF49 90 FC 07 mov DPTR, #XRAM_FC07
B1:FF4C 74 03 mov A, #3
B1:FF4E F0 movx @DPTR, A
B1:FF4F A3 inc DPTR
B1:FF50 ED mov A, R5
B1:FF51 F0 movx @DPTR, A
B1:FF52 E4 clr A
B1:FF53 FB mov R3, A
B1:FF54 FD mov R5, A
B1:FF55 7F 13 mov R7, #0x13
B1:FF57 22 ret
Jefferson, ¿podería me dizer cómo ficaría o patch este no DVP5100? :-[
-
É só um chute:
7F 71 mov R7, #0x71 ; 'q' ; Endereço 0x71 da eeprom
7E 00 mov R6, #0
12 19 E4 lcall Pref_Getchar_B1BS
Você tem que colocar aqui a chamada correta para Pref_Getchar no banco escolhido. Eu não sei qual é
EF mov A, R7
FD mov R5, A
90 FB A4 mov DPTR, #XRAM_FBA4
Acima, eu já corrigi o endereço XRAM para o usado no DVP5100
74 02 mov A, #2
F0 movx @DPTR, A
A3 inc DPTR
ED mov A, R5
F0 movx @DPTR, A
Cor de preenchimento default do DVP5100
E4 clr A
7B 03 mov R3, #3
FD mov R5, A
No DVP5100, R3 é carregado com uma cor diferente de zero
E o ID da janela precisa ser recuperado :
90 FB 8D mov DPTR, #XRAM_FB8D ; Window_ID?
E0 movx A, @DPTR
FF mov R7, A
22 ret
Uma chamada na rotina subStyleSec ficaria assim:
B3:545E Sub_StyleSec: ; DATA XREF: BankSw_223_B3_519C+63o
B3:545E 90 FB 8D mov DPTR, #XRAM_FB8D ; Window_ID?
B3:5461 E0 movx A, @DPTR
B3:5462 FF mov R7, A
B3:5463 D2 75 setb RAM_2E.5
B3:5465 12 28 F1 lcall BankSw_217_B3_28F1
B3:5468 90 FB 8D mov DPTR, #XRAM_FB8D ; Window_ID?
B3:546B E0 movx A, @DPTR
B3:546C FF mov R7, A
B3:546D 12 68 22 lcall BankSw_218_B3_6822
B3:5470 12 xx xx lcall Endereço_da_rotina
B3:5473 nop
B3:5474 nop
B3:5475 nop
B3:5476 nop
B3:5479 nop
B3:547A nop
B3:547B nop
B3:547D nop
B3:547E nop
B3:5480 nop
B3:5481 nop
B3:5482 12 D4 73 lcall OSD_TextColorB1BS
Como a rotina SubStyle Primária fica em outro banco, você vai ter que fazer outro patch lá.
Editado: O caso da SubStyle Primária parece ser mais complicado. Ela não parece chamar em lugar nenhum OSD_TextColor, mas certamente o banco 1 tem um ponto de entrada para ela na BTT. Talvez seja possível contruir uma rotina para isso, mas já está chegando a minha hora de ir dormir e o raciocínio está mais lento.
-
Muito obrigado!!! :yahoo!: Vou testar hoje a noite, e posto aquí o resultado. 8)
-
Muito obrigado jmaraujo pelo patch pro browser.
PS: Ryan, o 5965 estar com um bug no visor ao aplicar o primeiro patch, apenas a primeira parte (B1:56C0 e B1:FA32), o bug: no visor fica aparcendo varios caracteres piscando, some e volta.
OBS: (B1:56C0 e B1:FA32) ao inves de mostrar (mov A,) aqui estar aparecendo (mov R7,) isto é normal?
-
OBS: (B1:56C0 e B1:FA32) ao inves de mostrar (mov A,) aqui estar aparecendo (mov R7,) isto é normal?
Não é a primeira vez que eu misturo as instruções 7F e 74 :dashhead1:
Eu já corrigi o post
-
Boa tarde a todos!
Venho acompanhando este tópico há alguns dias, e hoje resolvi me cadastrar para compartilhar uma experiência com o firmware do Proview DVP-858.
Acho que este seria o tópico apropriado, embora não seja o assunto em discussão no momento. Espero não estar atrapalhando!
Vocês já devem ter encontrado vários DVDs que proíbem o usuário de alterar o áudio ou a legenda pelo controle remoto. Nesses discos, é obrigatório usar o menu do disco. Isso é bastante comum em títulos da Disney, ou da Barbie. Para quem tem filhos em idade pré-escolar, é especialmente irritante quando você põe o desenho animado e tem que voltar ao menu para assistir em português.
Eu achei um documento escrito pelo Lee (aka mosarella) que ensina a desativar essa proibição para o DVP-720: DVP720_ RC_audio_ selection_&_prohibit_functions.rtf
Seguindo as explicações do documento a partir da tabela do controle remoto do DVP-858, encontrei diversas funções no código 8032:
B4:505B MtkCmd_Parser
B4:D665 MtkCmd_Audio
B1:A382 MtkCmd_IncAudioTrack
B0:E87A ARM_GetChar
e (talvez) B3:DCC3 SetOperationMode
Mas o interessante mesmo é a função no código ARM que cuida das proibições de operações do usuário. Não foi possível encontrar do jeito descrito pelo mosarella, mas após investigar um pouquinho, descobri que ela fica no endereço 0x8798C.
No meio da função, temos esta linha:
ROM:000879DA E2 4A LDR R2, =0xFFFDFFF8 ; Prohibit Filter Mask
ROM:000879DA ; bit22=angle, bit21=subtitle
ROM:000879DA ; bit20=audio
ROM:000879DA ; bit='0': prohibit disable
ROM:000879DA ; bit='1': prohibit enable
Para alterar o comportamento da função, basta trocar essa máscara (que fica na área de dados da rotina). Zerando os bits 20 e 21, o usuário já pode trocar o áudio e as legendas em muitos DVDs. Na área de dados, a máscara fica assim:
ROM:00087D64 F8 FF CD FF dword_87D64 DCD 0xFFCDFFF8
Segundo o mosarella, alguns DVDs precisariam de um patch adicional. No DVP-858, a chamada dele na função principal seria assim:
ROM:0008799E CA F7 0F F9 BL PATCH_ProhibitFilter
E o patch seria este:
ROM:00051BC0 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
ROM:00051BC0
ROM:00051BC0
ROM:00051BC0 PATCH_ProhibitFilter ; CODE XREF: sub_8798C+12_p
ROM:00051BC0 41 7A LDRB R1, [R0,#9]
ROM:00051BC2 02 4A LDR R2, =0xFFFFFFCF
ROM:00051BC4 11 40 AND R1, R2
ROM:00051BC6 A1 76 STRB R1, [R4,#0x1A]
ROM:00051BC8 70 47 BX LR
ROM:00051BC8 ; End of function PATCH_ProhibitFilter
ROM:00051BC8
ROM:00051BC8 ; ----------------------------------------------
ROM:00051BCA FF DCB 0xFF
ROM:00051BCB FF DCB 0xFF
ROM:00051BCC CF FF FF FF dword_51BCC DCD 0xFFFFFFCF ; DATA XREF: PATCH_ProhibitFilter+2_r
Infelizmente, eu não consegui fazer o patch funcionar. Além do endereço 0x51BC0 acima, tentei 0x503C8, 0x4FF30, e outros, todos em áreas de mensagens de erro no código ARM. Em todos os casos, o aparelho travou ao inserir um DVD-Vídeo. Então eu deixei só o patch da nova máscara, na linha 0x879DA.
O título escolhido para o teste foi "A Era do Gelo", que é muito apropriado para o tempo infernal (ou melhor, glacial) dos últimos dias. Adeus proibições de troca de legenda e áudio! Mas infelizmente, isso não é suficiente para os DVDs da Barbie, que continuam a testar a paciência dos pais.
Eu poderia tentar um resize, como o jmaraujo sugere num post logo acima. Porém o MTKArmResizer não funciona em ARM de 3 códigos, como é o caso do DVP-858. E fazer um resize manual está fora de questão para mim. Então fiquei restrito à nova máscara. Se alguém tiver alguma sugestão, fico grato.
-
Muito obrigado Ryan, agora sim, o bug sumiu. :yahoo!: :clapping:
PS: Jmaraujo gostei da ideia de mover a imagem JPEG, vou procurar as rotinas agora.
-
Então fiquei restrito à nova máscara. Se alguém tiver alguma sugestão, fico grato.
Parabéns pelo mod :yahoo!:
Quanto à ajuda, eu acho que quem está mais perto de ajudar você nisso é jmaraujo. Eu não sei lhufas de ARM ainda, porque estou me concentrando 100% em compreender o código 8032.
-
No firmware jmaraujo 1.1 (http://www.ryan.com.br/prod_dvp5100_jmaraujo.htm) eu somente usei o patch do foncreator para remover os UOPs (estou anexando o documento).
Infelizmente ese patch não funciona em todos os casos, mas permite pular trailers, warnings, etcétera, onde anteriormente não era possivel.
O patch do Lee (mosarella) ainda não testei, mas parece mais completo que o do foncreator, porém com objetivos diferentes. (O do Lee está focado nos UOPs de audio e legenda, o do foncreator a mais tipos de UOPs)
Se o MtkArmResizer não permitir ampliar os ARMs com tres ArmCodes, faça com eu expliquei mais acima: Sobreescreva a seção de erros C+.
-
jmaraujo, quais os valores que você usou na nova posição das cordenadas das Tag Mp3? Achei a posição muito boa. 8)
-
Olá, eneris! Sorte que eu guardei as mudanças em um arquivo de texto... ;)
Arquivos no Filebrowser:
Primeiro que nada é preciso levantar os arquivos do filebrowser*.
Archivo_1
ROM:22B5 00 3E .word 0x3E ; Y1 = 62
ROM:22B7 02 22 .word 0x0222 ; X2 = 546
ROM:22B9 00 7C .word 0x7C ; Y2 = 92
Archivo_2
ROM:22BD 00 5E .word 0x5E ; Y1 = 94
ROM:22BF 02 22 .word 0x0222 ; X2 = 546
ROM:22C1 00 7C .word 0x7C ; Y2 = 124
Archivo_3
ROM:22C5 00 7E .word 0x7E ; Y1 = 126
ROM:22C7 02 22 .word 0x0222 ; X2 = 546
ROM:22C9 00 9C .word 0x9C ; Y2 = 156
Archivo_4
ROM:22CD 00 9E .word 0x9E ; Y1 = 158
ROM:22CF 02 22 .word 0x0222 ; X2 = 546
ROM:22D1 00 BC .word 0xBC ; Y2 = 188
Note que não foi necesario mexer em X1, que continúa sendo o mesmo para os quatro arquivos: X=0x1E (x=30). Não foi o caso do X2, que eu moví para a esquerda para não interferir com a nova posição das setas.
Posição das setas:
Seta de cima:
X1 = 0x0224 -> 548
Y1 = 0x003E -> 62
Seta de baixo:
X1 = 0x0224 -> 548
Y1 = 0x009E -> 158
Aquí, além de trocar as coordenadas horizontais, mexí nas coordenadas verticais das setas (principalmente a de baixo) para fazer lugar para os tags mp3s. Note que a posição vertical de cada seta é a mesma que as do 1º e 4º arquivo do filebrowser (3E, 9E).
Posição dos ID3 tags:
X1 = 0x1E (30)
Y1 (offset) = 0xBE (190)
Área de limpeza:
X1= 0x1E, Y1=0xBE, largura: 0x0242, altura (o sugerido por Jefferson, acho que era 6C)
* Voçê pode comparar com o meu post anterior com as coordenadas originais (acho que na página 2 de este tópico).
Saudações! ;)
-
Valeu Jmaraujo, :yahoo!:
-
Jefferson, ¿voçê tem este documento que estou anexando? Pode ser que ele resulte útil na hora de olhar as modificações no Sub_Style do DVP5100...
Saudações!
EDIT: Links relacionados - Patch do Sidekick:
http://tech.groups.yahoo.com/group/mt13x9/message/8098 (http://tech.groups.yahoo.com/group/mt13x9/message/8098)
http://tech.groups.yahoo.com/group/mt13x9/message/8102 (http://tech.groups.yahoo.com/group/mt13x9/message/8102)
PS: Antes de abrir renomeie e extensão do arquivo para rtf. (Update: Acho que não é preciso. O MS Word reconhece o arquivo mesmo com a extensão trocada).
PS2: Anexo imagen do exemplo do patch do Sidekick.
-
Primeiramente gostaria de parabenizar ao Ryan pelo fórum (achei pelo Google e estou gostando demais) e pelas novas descobertas. :clapping: Acompanho tambem o forum do jmaraujo e as novidades do site do eneris.
Estou fazendo um mod no meu Philips 5960/12 seguindo o tópico do Ryan estou tentando alterar a posição da idTag como foi postado abaixo.
Agora sim, vamos mover as tags. São três bytes que determinam a coordenada do canto superior esquerdo do retângulo onde as tags começam a ser impressas:
B1:5796 90 FC 76 mov DPTR, #XRAM_FC76 ; Coordenada horizontal (HI)
B1:5799 74 00 mov A, #0
B1:579B F0 movx @DPTR, A
B1:579C A3 inc DPTR
B1:579D 74 25 mov A, #0x25 ;
B1:579F F0 movx @DPTR, A ; FC76 e FC77 = 0x25
B1:579F ; offset horizontal. Quanto menor, mais à esquerda a linha começa.
B1:57A0 EF mov A, R7 ; R7 contém o número da TAG (linha) sendo exibida?
B1:57A1 75 F0 14 mov B, #0x14 ; Altura presumida de cada linha
B1:57A1 ; 0x10 fará com que cada linha cubra a metade da anterior
B1:57A1 ; 0x16 funciona OK com a fonte original
B1:57A4 A4 mul AB
B1:57A5 AE F0 mov R6, B ; R6 contém agora a coordenada vertical de impressão da linha?
B1:57A7 24 F0 add A, #0xF0 ;
Não compreendi onde deve ser modificado na rotina acima (os 3 bytes) e por qual valor.
-
Baixei o doc jmaraujo, chegar em casa vou testar ele. Acho que este doc eu nao tinha.
-
Seja bem ao forum ramos80. As trocas são feitas onde estão os #
B1:5799 74 00 mov A, #0 (0)
B1:579D 74 25 mov A, #0x25 ; (25)
B1:57A7 24 F0 add A, #0xF0 ; (F0)
Abra o banco 8032 em um editor hexadecimal, procure pelos endereços e substitua pelos novos valores.
-
jmaraujo, muito obrigado!
Esse documento sobre UOPs foi muito útil. Eu não achava nada no grupo mt13x9 porque procurava "PUOs", que é como esse (inconveniente) 'feature' era chamado no site Doom9. Mas a Wikipedia menciona UOP, mesmo.
Não consegui achar a função Set_UOP, mesmo examinando todas as referências a "UOP_Bytes" no firmware (são muitas). Porém a função ReadNStore_UOP é a mesma que eu já tinha achado antes, só lhe faltava um nome. Então apliquei os patches apenas nessa função. Funcionou para "A Era do Gelo" (que eu já tinha testado com o patch da troca de máscara) e funcionou com o DVD da Barbie "As 12 Princesas Bailarinas", que tem uma quantidade infindável de menus e avisos com todo tipo de proibição. O DVD da Barbie era resistente à simples troca de máscara.
Ah, e tudo isso funcionou com a máscara original, mesmo sem a troca sugerida pelo mosarella.
Infelizmente ese patch não funciona em todos os casos, mas permite pular trailers, warnings, etcétera, onde anteriormente não era possivel.
Funcionou para o DVD da Barbie, então já fiquei feliz!
Aqui estão as modificações para o Proview DVP-858 (incluindo a troca da máscara):
Original:
ROM:0008799A 01 7A LDRB R1, [R0,#8] ; R1 = Prohibit Byte 3
...
ROM:0008799E 41 7A LDRB R1, [R0,#9] ; R1 = Prohibit Byte 2
...
ROM:000879A2 81 7A LDRB R1, [R0,#0xA] ; R1 = Prohibit Byte 1
...
ROM:000879A6 C0 7A LDRB R0, [R0,#0xB] ; R1 = Prohibit Byte 0
...
ROM:000879CC 08 43 ORR R0, R1
...
ROM:000879F4 08 43 ORR R0, R1
...
ROM:00087D64 F8 FF FD FF dword_87D64 DCD 0xFFFDFFF8
Alterado:
ROM:0008799A 00 21 MOV R1, #0
...
ROM:0008799E 00 21 MOV R1, #0
...
ROM:000879A2 00 21 MOV R1, #0
...
ROM:000879A6 00 21 MOV R1, #0
...
ROM:000879CC 00 21 MOV R1, #0
...
ROM:000879F4 00 21 MOV R1, #0
...
ROM:00087D64 F8 FF CD FF dword_87D64 DCD 0xFFCDFFF8
-
vPlayerShowLogo
Esta rotina é responsável pela exibição das imagens de background.
Minha investigação teve como ponto de partida este post de teo_abs (http://tech.groups.yahoo.com/group/mt13x9/message/8884). A seqüência indicada por ele não funcionou comigo, mas foi fácil adaptá-la.
Exemplo do DVP5960/37:
Nota: analisar esta rotina não é realmente importante. Estou transcrevendo-a aqui para que se possa tentar localizá-la por comparação, se minha seqüência de busca não funcionar em algum firmware específico.
[size=08pt]B3:BE2E ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B3:BE2E
B3:BE2E
B3:BE2E vPlayerShowLogo: ; DATA XREF: B0:B0_BS_162_B3_BE2Eo
B3:BE2E ; vPlayerShowLogoB1_BSo ...
B3:BE2E 90 FB B4 mov DPTR, #XRAM_FBB4
B3:BE31 EF mov A, R7
B3:BE32 F0 movx @DPTR, A
B3:BE33 A3 inc DPTR
B3:BE34 EC mov A, R4
B3:BE35 F0 movx @DPTR, A
B3:BE36 A3 inc DPTR
B3:BE37 ED mov A, R5
B3:BE38 F0 movx @DPTR, A
B3:BE39 90 FB B4 mov DPTR, #XRAM_FBB4
B3:BE3C E0 movx A, @DPTR
B3:BE3D FF mov R7, A
B3:BE3E 64 04 xrl A, #4
B3:BE40 70 03 jnz B3_BE45
B3:BE42 02 BE F1 ljmp B3_BEF1
B3:BE45 ; ---------------------------------------------------------------------------
B3:BE45
B3:BE45 B3_BE45: ; CODE XREF: vPlayerShowLogo+12j
B3:BE45 EF mov A, R7
B3:BE46 64 03 xrl A, #3
B3:BE48 60 03 jz B3_BE4D
B3:BE4A 02 BE DD ljmp B3_BEDD
B3:BE4D ; ---------------------------------------------------------------------------
B3:BE4D
B3:BE4D B3_BE4D: ; CODE XREF: vPlayerShowLogo+1Aj
B3:BE4D 90 FB B6 mov DPTR, #XRAM_FBB6
B3:BE50 E0 movx A, @DPTR
B3:BE51 54 0F anl A, #0xF
B3:BE53 C4 swap A
B3:BE54 F8 mov R0, A
B3:BE55 54 0F anl A, #0xF
B3:BE57 C8 xch A, R0
B3:BE58 68 xrl A, R0
B3:BE59 FF mov R7, A
B3:BE5A E4 clr A
B3:BE5B C4 swap A
B3:BE5C 54 F0 anl A, #0xF0
B3:BE5E 48 orl A, R0
B3:BE5F A3 inc DPTR
B3:BE60 EF mov A, R7
B3:BE61 F0 movx @DPTR, A
B3:BE62 FD mov R5, A
B3:BE63 7F 50 mov R7, #0x50 ; 'P'
B3:BE65 7E 00 mov R6, #0
B3:BE67 12 1B A8 lcall B3_BS_104_B0_E9CC
B3:BE6A 90 FB B5 mov DPTR, #XRAM_FBB5
B3:BE6D E0 movx A, @DPTR
B3:BE6E C4 swap A
B3:BE6F F8 mov R0, A
B3:BE70 54 F0 anl A, #0xF0
B3:BE72 C8 xch A, R0
B3:BE73 68 xrl A, R0
B3:BE74 FE mov R6, A
B3:BE75 A3 inc DPTR
B3:BE76 E0 movx A, @DPTR
B3:BE77 C4 swap A
B3:BE78 54 0F anl A, #0xF
B3:BE7A 48 orl A, R0
B3:BE7B FF mov R7, A
B3:BE7C 90 FB B5 mov DPTR, #XRAM_FBB5
B3:BE7F EE mov A, R6
B3:BE80 F0 movx @DPTR, A
B3:BE81 A3 inc DPTR
B3:BE82 EF mov A, R7
B3:BE83 F0 movx @DPTR, A
B3:BE84 54 0F anl A, #0xF
B3:BE86 C4 swap A
B3:BE87 F8 mov R0, A
B3:BE88 54 0F anl A, #0xF
B3:BE8A C8 xch A, R0
B3:BE8B 68 xrl A, R0
B3:BE8C FF mov R7, A
B3:BE8D E4 clr A
B3:BE8E C4 swap A
B3:BE8F 54 F0 anl A, #0xF0
B3:BE91 48 orl A, R0
B3:BE92 A3 inc DPTR
B3:BE93 EF mov A, R7
B3:BE94 F0 movx @DPTR, A
B3:BE95 FD mov R5, A
B3:BE96 7F 51 mov R7, #0x51 ; 'Q'
B3:BE98 7E 00 mov R6, #0
B3:BE9A 12 1B A8 lcall B3_BS_104_B0_E9CC
B3:BE9D 90 FB B5 mov DPTR, #XRAM_FBB5
B3:BEA0 E0 movx A, @DPTR
B3:BEA1 C4 swap A
B3:BEA2 F8 mov R0, A
B3:BEA3 54 F0 anl A, #0xF0
B3:BEA5 C8 xch A, R0
B3:BEA6 68 xrl A, R0
B3:BEA7 FE mov R6, A
B3:BEA8 A3 inc DPTR
B3:BEA9 E0 movx A, @DPTR
B3:BEAA C4 swap A
B3:BEAB 54 0F anl A, #0xF
B3:BEAD 48 orl A, R0
B3:BEAE FF mov R7, A
B3:BEAF 90 FB B5 mov DPTR, #XRAM_FBB5
B3:BEB2 EE mov A, R6
B3:BEB3 F0 movx @DPTR, A
B3:BEB4 A3 inc DPTR
B3:BEB5 EF mov A, R7
B3:BEB6 F0 movx @DPTR, A
B3:BEB7 54 0F anl A, #0xF
B3:BEB9 C4 swap A
B3:BEBA F8 mov R0, A
B3:BEBB 54 0F anl A, #0xF
B3:BEBD C8 xch A, R0
B3:BEBE 68 xrl A, R0
B3:BEBF FF mov R7, A
B3:BEC0 E4 clr A
B3:BEC1 C4 swap A
B3:BEC2 54 F0 anl A, #0xF0
B3:BEC4 48 orl A, R0
B3:BEC5 A3 inc DPTR
B3:BEC6 EF mov A, R7
B3:BEC7 F0 movx @DPTR, A
B3:BEC8 FD mov R5, A
B3:BEC9 7F 52 mov R7, #0x52 ; 'R'
B3:BECB 7E 00 mov R6, #0
B3:BECD 12 1B A8 lcall B3_BS_104_B0_E9CC
B3:BED0 E4 clr A
B3:BED1 90 FB F5 mov DPTR, #XRAM_FBF5
B3:BED4 F0 movx @DPTR, A
B3:BED5 FB mov R3, A
B3:BED6 7D 03 mov R5, #3
B3:BED8 7F 30 mov R7, #0x30 ; '0'
B3:BEDA 02 DE 81 ljmp BankSw_102_B3_DE81
B3:BEDD ; ---------------------------------------------------------------------------
B3:BEDD
B3:BEDD B3_BEDD: ; CODE XREF: vPlayerShowLogo+1Cj
B3:BEDD 90 FB B4 mov DPTR, #XRAM_FBB4
B3:BEE0 E0 movx A, @DPTR
B3:BEE1 FD mov R5, A
B3:BEE2 90 FB B6 mov DPTR, #XRAM_FBB6
B3:BEE5 E0 movx A, @DPTR
B3:BEE6 FB mov R3, A
B3:BEE7 E4 clr A
B3:BEE8 90 FB F5 mov DPTR, #XRAM_FBF5
B3:BEEB F0 movx @DPTR, A
B3:BEEC 7F 30 mov R7, #0x30 ; '0'
B3:BEEE 12 DE 81 lcall BankSw_102_B3_DE81
B3:BEF1
B3:BEF1 B3_BEF1: ; CODE XREF: vPlayerShowLogo+14j
B3:BEF1 22 ret
B3:BEF1 ; End of function vPlayerShowLogo
[/size]
Para encontrá-la, procure por:
90 ? ? EF F0 A3 EC F0 A3 ED F0 90 ? ? E0 FF 64 04 70 03 02 ? ? EF
Esta seqüência aparece uma vez em todos os firmwares que testei, no topo da rotina vPlayerShowLogo
Testado com:
- Philips DVP3040K/55
- Philips DVP5100K/78
- Philips DVP5960/37
- Philips DVP5965K/55
- Philips DVP5980/12
- Philips DVP5140/37
- Proview DVP-858
- Lenoxx DV-406
Não funcionou com:
Para exibir o background à sua escolha entre os existentes no firmware, basta chamar a rotina assim:
B1:5667 7D 02 mov R5, #2 //02 é o número do background (veja no mtkRemaker)
B1:5669 7C 00 mov R4, #0
B1:566B 7F 01 mov R7, #1
B1:566D 12 1D 04 lcall vPlayerShowLogoB1_BS
-
Como definir uma imagem de background só para MP3/WMA
Em vários firmwares, isso é facílimo. Já existe uma chamada para vPlayerShowLogo no início de MP3_TagDisplay. Você só precisa inserir no firmware um background extra e mudar o valor carregado em R5 para que aponte para ele.
Por exemplo, no DVP5960/37, MP3_TagDisplay começa assim:
B1:565C MP3_TagDisplay: ; CODE XREF: B1_6AC0:B1_6BF4j
B1:565C ; B1_AB8D+B1p
B1:565C ; DATA XREF: ...
B1:565C E4 clr A ; Rotina de exibiþÒo das TAGS ID3
B1:565D 90 FB B3 mov DPTR, #XRAM_FBB3
B1:5660 F0 movx @DPTR, A
B1:5661 90 FB AC mov DPTR, #XRAM_FBAC
B1:5664 74 06 mov A, #6
B1:5666 F0 movx @DPTR, A
B1:5667 7D 02 mov R5, #2
B1:5669 7C 00 mov R4, #0
B1:566B 7F 01 mov R7, #1
B1:566D 12 1D 04 lcall vPlayerShowLogoB1_BS
Eu usei o mtkremaker para inserir um novo background como MPEG1 (esta posição existe, mas é vazia no firmware) e fiz a simples modificação:
B1:5667 7D 01 mov R5, #1
E agora ao selecionar um MP3 qualquer o meu background específico é carregado.
Isso deve abrir muitas possibilidades estéticas para nós, criadores de firmware. No espaço "morto" que vai ficar quando redimensionarmos o browser para reposicionar as tags MP3, podemos fazer uma decoração ou colocar outras informações.
Agora resta saber como acrescentar mais backgrounds além do limite de 3 da maioria dos firmwares. Isso permitiria ter um background específico para imagens.
-
Para inserir varios background usando o remaker, eu substituo o parte SKIN toda com outra que possui varias imagens MPEG.
-
A do DVP720, por exemplo, que tem 5 lugares...
-
Não compreendi onde deve ser modificado na rotina acima (os 3 bytes) e por qual valor.
No seu monitor/browser você não consegue enxergar o destaque em negrito que dei aos 3 bytes?
-
Para inserir varios background usando o remaker, eu substituo o parte SKIN toda com outra que possui varias imagens MPEG.
Ótimo!
Desde que haja espaço no firmware, deve dar para fazer uns experimentos bem interessantes :)
-
O firmware que tem mais imagens MPEG que eu ja vir, é o LG_DK194g , que possui 18 imagens MPEG. 8)
-
Ryan, você conseguiu que a altura da legenda ficasse selecionavel via menu no Proview?
-
O firmware que tem mais imagens MPEG que eu ja vir, é o LG_DK194g , que possui 18 imagens MPEG. 8)
Isso mesmo!
Apenas 17 imagens desse firmware são válidas e dá um total de 581KB, que não vai caber no espaço livre da maioria dos aparelhos (o LG DK194G tem uma flash de 4MB), mas basta trocar algumas dessas posições por imagens "zeradas" para podermos colocar quantas imagens quisermos, até esbarrar nos limites de espaço.
-
Ryan, você conseguiu que a altura da legenda ficasse selecionavel via menu no Proview?
Eu me aborreci com os resultados que estava tendo e parei completamente os testes. Vou voltar a esse problema outro dia.
-
Primeiramente, obrigado eneris, testei e funcionou aqui. :yahoo!:
Ryan, eu utilizo o Firefox 2.0.0.6 e o texto aparece todo igual (sem negrito), testei tambem em outro computador com o Internet Explorer 7, e tambem nao é exibido o negrito nos 3 bytes.
Eu uso o Firefox 2.0.0.4
Com ele, no meu PC principal, o negrito é visível, mesmo numa resolução de 1600x1440 (a que eu uso diariamente). A 1280x1024 (meu monitor secundário) fica ainda mais claro.
Já no IE7, realmente não dá para distinguir nada!
Eu vou ter que analisar cada página no IE7 um outro dia. Agora estou ocupado com outra(s) coisa(s).
-
Alguns Scripts IDA
Uma coisa que me aborrece terrivelmente é que depois de localizar rotinas em um determinado firmware, é preciso fazer todas as identificações em todos os outros fimrwares compatíveis, incluindo outras versões do mesmo firmware, por isso decidi aprender a fazer alguns scripts do IDA para automatizar as tarefas, assim toda vez que eu abrir um firmware posso rapidamente incluir nele uma parte do que já aprendi com outros.
Eu ainda não domino a criação de scripts, mas já dá para fazer alguns que funcionam:
MP3_TagDisplay
// *************************************************************
// Find MP3_TagDisplay Function usually on Bank 1
static findMP3_TagDisplay()
{
auto ea,ps,po ;
ea = FindBinary (0, SEARCH_DOWN,"7F 4A 7E ? 12 ? ? 90 ? ? EF F0 7F 4B 7E ? 12 ? ? 90 ? ? EF F0 7F 4C 7E ? 12 ? ? 90 ? ? EF F0 7F 4D 7E ? 12 ? ? 90 ? ? ");
if (ea != -1)
{
ps = PrevFunction (ea+0);
Message(" MP3_TagDisplay function at %x \n",ps );
MakeComm (ea, "As quatro chamadas a ARM_Getchar seguintes obtem o endereco inicial do bloco de tags (4 bytes) na shared memory");
MakeCode(ps);
MakeFunction(ps,BADADDR);
Wait ();
MakeName(ps,"MP3_TagDisplay");
MakeRptCmt (ps,"Rotina de exibicao das TAGS ID3");
po = FindFuncEnd (ps);
if (po != -1)
{
ea = FindBinary (ea, SEARCH_DOWN,"7B ? 7A ? 7D ? 7C ? 7F ? 12");
if (ea != -1) // string localizada?
{
if (ea < po) // a string está dentro da função?
{
Message(" Clearrect em Mp3_tagDisplay at %x \n",ps );
MakeComm (ea, "R2R3 = altura");
MakeComm (ea+4, "R4R5 = Largura");
MakeComm (ea+10, "Chama ClearRect para limpar o retangulo");
} //if (ea < po)
} // if (ea != -1)
} //if (po != -1)
po = FindFuncEnd (ps);
if (po != -1)
{
ea = FindBinary (ea, SEARCH_DOWN,"94 0E 40 03 74 0E");
if (ea != -1) // string localizada?
{
if (ea < po) // a string está dentro da função?
{
Message("Encontrada limitação de exibição para 14 caracteres em Mp3_tagDisplay at %x \n",ps );
MakeComm (ea, "Se o numero de caracteres for 14 ou menos, continua");
MakeComm (ea+4, "Se for maior que 14, limitar a 14");
} //if (ea < po)
} // if (ea != -1)
} //if (po != -1)
po = FindFuncEnd (ps);
if (po != -1)
{
ea = FindBinary (ea, SEARCH_DOWN,"74 ? F0 EF 75 F0 ? A4 AE F0 24 ?");
if (ea != -1) // string localizada?
{
if (ea < po) // a string está dentro da função?
{
Message("Encontrada a definição de coordenadas de exibicao das tags em Mp3_tagDisplay at %x \n",ps );
MakeComm (ea+2, "offset horizontal. Quanto menor, mais à esquerda a linha começa.");
MakeComm (ea+3, "R7 contem o numero da TAG (linha) sendo exibida? ");
MakeComm (ea+4, "Altura presumida de cada linha ");
MakeComm (ea+8, "R6 contem agora a coordenada vertical de impressao da linha? ");
MakeComm (ea+10, "Offset vertical. Quanto menor, mais proximas do topo da janela");
} //if (ea < po)
} // if (ea != -1)
} //if (po != -1)
po = FindFuncEnd (ps);
if (po != -1)
{
ea = FindBinary (ea, SEARCH_DOWN,"D3 94 10 ?");
if (ea != -1) // string localizada?
{
if (ea < po) // a string está dentro da função?
{
Message("Encontrado o limitador de caracteres em Mp3_tagDisplay at %x \n",ps );
MakeComm (ea+1, "Numero máximo de caracteres a exibir por TAG");
} //if (ea < po)
} // if (ea != -1)
} //if (po != -1)
}
}
CheckVersionPass
// *************************************************************
// Find CheckVersionPass Function usually on Bank 2
static findCheckVersionPass()
{
auto ea,ps ;
ea = FindBinary (0, SEARCH_DOWN,"90 ? ? E0 64 ? 70 ? 90 ? ? E0 FF 54 0F FE 64 0F 60 ? EE C3 94 ? 50 ? EE 90 ? ? 93 FE 90 FB 00");
if (ea != -1)
{
ps = PrevFunction (ea+01);
Message(" CheckVersionPass function at %x \n",ps );
MakeComm (ea+05, "Este e´ o menu esperado"+ltoa(Byte(ea+06),4));
MakeCode(ps);
MakeFunction(ps,BADADDR);
Wait ();
MakeName(ps,"CheckVersionPass");
MakeRptCmt (ps,"Rotina que verifica a senha para a tela de versao");
}
}
CheckRegionPass
// *************************************************************
// Find CheckRegionPass Function usually on Bank 2
static findCheckRegionPass()
{
auto ea,ps ;
ea = FindBinary (0, SEARCH_DOWN,"90 ? ? E0 FF 64 ? 70 ? 90 ? ? E0 FE 54 0F FD 64 0F 60 ? ED C3 94 ? 50 ? ED 90 ? ? 93 FD 90 FB 00");
if (ea != -1)
{
ps = PrevFunction (ea+01);
Message(" CheckRegionPass function at %x \n",ps );
MakeComm (ea+05, "Este e´ o menu esperado");
MakeCode(ps);
MakeFunction(ps,BADADDR);
Wait ();
MakeName(ps,"CheckRegionPass");
MakeRptCmt (ps,"Rotina que verifica a senha para a tela de regiao");
}
}
vPlayerShowLogo
// *************************************************************
// Find vPlayerShowLogo Function
static findvPlayerShowLogo()
{
auto ea,ps ;
ea = FindBinary (0, SEARCH_DOWN,"90 ? ? EF F0 A3 EC F0 A3 ED F0 90 ? ? E0 FF 64 04 70 03 02 ? ? EF");
if (ea != -1)
{
ps = PrevFunction (ea+01);
Message(" vPlayerShowLogo function at %x \n",ps );
MakeCode(ps);
MakeFunction(ps,BADADDR);
Wait ();
MakeName(ps,"vPlayerShowLogo");
MakeRptCmt (ps,"Rotina que exibe as imagens de background ");
}
}
Estes scripts estão todos relacionados a textos já publicados aqui, por isso dentro de alguns dias eles serão movidos para os respectivos posts.
-
Jefferson, ¿cómo voçê fez as mudanças do seu background? ¿Foi "a olho" mesmo, ou voçê calculou as coordenadas?
Foi a olho. Eu fiz umas 4 imagens até posicionar corretamente.
Acabo de perceber que no mtkModToolbox tem uma seção ("Dedução de coordenadas com auxílio de screenshot") que resulta muito útil para este tipo de tarefas...
Com essa ajuda fica bem mais fácil. :yahoo!:
-
Acabo de perceber que no mtkModToolbox tem uma seção ("Dedução de coordenadas com auxílio de screenshot") que resulta muito útil para este tipo de tarefas...
Com essa ajuda fica bem mais fácil. :yahoo!:
Aquela seção era só um experimento. Se você achou úitl então vai babar com o que eu estou preparando, neste exato momento ;D
-
Aquela seção era só um experimento. Se você achou úitl então vai babar com o que eu estou preparando, neste exato momento ;D
Excelente noticia! :yahoo!: Se planejar tradução, novamente me ofereço como voluntario para traduzir ao espanhol...
-
Excelente noticia! :yahoo!: Se planejar tradução, novamente me ofereço como voluntario para traduzir ao espanhol...
Eu estou tentando manter isso em mente enquanto desenvolvo, mas a primeira versão vai precisar sair exclusivamente em Português. Depois que a funcionalidade estiver OK, vou trabalhar na Localização.
Foi algo que comecei na semana passada, só para me ajudar com a compreensão daquela rotina ClearRect das tags MP3, mas que acabou evoluindo para algo muito mais complexo e útil.
-
Scrollbar para firmwares Philips
- Philips DVP5960
- Philips DVP5100
- Philips DVP5965
- Philips DVP5980
Sempre achei estranho que, apesar dos firmwares Philips não terem uma scrollbar, a rotina de exibição é detectada neles, inclusive pelo meu mtkModToolbox. Mas até bem pouco tempo eu não tinha o conhecimento necessário para tentar entender isso e sempre "deixei prá lá".
Hoje eu estava justamente aperfeiçoando a rotina de detecção da scrollbar no mtkModToolbox quando decidi parar um pouco para estudar essa esquisitice no IDA. Seguindo o caminho até a rotina chamada DirDispScrollbar no DVP5960 descobri que ela começava em uma rotina órfã:
B4:83A2
B4:83A2 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B4:83A2
B4:83A2
B4:83A2 BankSw_240_B4_83A2: ; DATA XREF: B0:B0_BS_240_B4_83A2o
B4:83A2 ; B1_BS_240_B4_83A2o ...
B4:83A2 90 FB A0 mov DPTR, #XRAM_FBA0
B4:83A5 EC mov A, R4
B4:83A6 F0 movx @DPTR, A
B4:83A7 A3 inc DPTR
B4:83A8 ED mov A, R5
B4:83A9 F0 movx @DPTR, A
B4:83AA CB xch A, R3
B4:83AB EF mov A, R7
B4:83AC CB xch A, R3
B4:83AD CA xch A, R2
B4:83AE EE mov A, R6
B4:83AF CA xch A, R2
B4:83B0 22 ret
B4:83B0 ; End of function BankSw_240_B4_83A2
B4:83B0
B4:83B1 ; ---------------------------------------------------------------------------
B4:83B1 90 FB A0 mov DPTR, #XRAM_FBA0 ; Função orfã!!!!!!!!!!!!!
B4:83B4 E0 movx A, @DPTR
B4:83B5 FC mov R4, A
B4:83B6 A3 inc DPTR
B4:83B7 E0 movx A, @DPTR
B4:83B8 FD mov R5, A
B4:83B9 64 01 xrl A, #1
B4:83BB 4C orl A, R4
B4:83BC 70 12 jnz B4_83D0
B4:83BE 90 FB A4 mov DPTR, #XRAM_FBA4
B4:83C1 F0 movx @DPTR, A
B4:83C2 A3 inc DPTR
B4:83C3 74 B6 mov A, #0xB6 ; 'Â'
B4:83C5 F0 movx @DPTR, A
B4:83C6 E4 clr A
B4:83C7 90 FB A2 mov DPTR, #XRAM_FBA2
B4:83CA F0 movx @DPTR, A
B4:83CB A3 inc DPTR
B4:83CC F0 movx @DPTR, A
B4:83CD 02 84 8A ljmp DIR_DispScrollBar
Eu passei algum tempo tentando imaginar um jeito de chamar essa rotina de dentro da rotina principal do FileBrowser para ver o que aconteceria, mas depois decidi dar uma olhada em um firmware com scrollbar ativa para ver se aparecia alguma pista. O que encontrei me surpreendeu.
Este é o mesmo trecho de código, no firmware do Proview DVP-858
B4:6602 ; ---------------------------------------------------------------------------
B4:6602 ; START OF FUNCTION CHUNK FOR BankSw_210_B4_DD71
B4:6602
B4:6602 BankSw_214_B4_6602: ; CODE XREF: BankSw_210_B4_DD71+2j
B4:6602 ; DATA XREF: B0:B0_BS_214_B4_6602o ...
B4:6602 90 FB 9D mov DPTR, #XRAM_FB9D
B4:6605 EC mov A, R4
B4:6606 F0 movx @DPTR, A
B4:6607 A3 inc DPTR
B4:6608 ED mov A, R5
B4:6609 F0 movx @DPTR, A
B4:660A CB xch A, R3
B4:660B EF mov A, R7
B4:660C CB xch A, R3
B4:660D CA xch A, R2
B4:660E EE mov A, R6
B4:660F CA xch A, R2
B4:6610 90 FB 9D mov DPTR, #XRAM_FB9D
B4:6613 E0 movx A, @DPTR
B4:6614 FE mov R6, A
B4:6615 A3 inc DPTR
B4:6616 E0 movx A, @DPTR
B4:6617 FF mov R7, A
B4:6618 4E orl A, R6
B4:6619 70 03 jnz B4_661E
B4:661B 02 67 7D ljmp B4_677D
B4:661E ; ---------------------------------------------------------------------------
B4:661E
B4:661E B4_661E: ; CODE XREF: BankSw_210_B4_DD71-7758j
B4:661E C3 clr C
B4:661F EF mov A, R7
B4:6620 9B subb A, R3
B4:6621 EE mov A, R6
B4:6622 9A subb A, R2
B4:6623 50 03 jnc B4_6628
B4:6625 02 67 7D ljmp B4_677D
B4:6628 ; ---------------------------------------------------------------------------
B4:6628
B4:6628 B4_6628: ; CODE XREF: BankSw_210_B4_DD71-774Ej
B4:6628 90 FB 9D mov DPTR, #XRAM_FB9D
B4:662B E0 movx A, @DPTR
B4:662C FC mov R4, A
B4:662D A3 inc DPTR
B4:662E E0 movx A, @DPTR
B4:662F FD mov R5, A
B4:6630 64 01 xrl A, #1
B4:6632 4C orl A, R4
B4:6633 70 12 jnz B4_6647
B4:6635 90 FB A1 mov DPTR, #XRAM_FBA1
B4:6638 F0 movx @DPTR, A
B4:6639 A3 inc DPTR
B4:663A 74 B6 mov A, #0xB6 ; 'Â'
B4:663C F0 movx @DPTR, A
B4:663D E4 clr A
B4:663E 90 FB 9F mov DPTR, #XRAM_FB9F
B4:6641 F0 movx @DPTR, A
B4:6642 A3 inc DPTR
B4:6643 F0 movx @DPTR, A
B4:6644 02 67 01 ljmp Dir_DispScrollBar
B4:6647 ; ---------------------------------------------------------------------------
B4:6647
A rotina do DVP-858 é um pouco mais longa, mas foi o início que me chamou a atenção. Parecia que a mesma rotina "órfã" do DVP5960 tinha sido emendada com a anterior, com o "ret" removido. Eu destaquei em vermelho.
Eu pensei: nãooooooooo... não pode ser tão fácil! Mas já que era simples, experimentei substituir o "22" por "00" para re-unir as duas rotinas e ver o que aconteceria.
Honestamente, eu não pensei mesmo que fosse tão fácil.
Philips DVP5960, firmware original modificado:
(http://ryan.com.br/imagens/mediatek/mediatek_exp_scrollbar_dvp5960(50).jpg)
Note que por pouco a scrollbar não aparece na posição certinha :)
Philips DVP5100, firmware Jmaraujo 1.04b modificado:
(http://ryan.com.br/imagens/mediatek/mediatek_exp_scrollbar_dvp5100(50).jpg)
um mísero byte!!!
A capacidade de ativar a scrollbar e desativar as setas idiotas dos firmwares Philips vai ser, claro, incorporada à versão do mtkModToolbox que estou preparando.
Para localizar o ponto de modificação no seu firmware, procure por:
CB EF CB CA EE CA 22
Funcionou com:
- DVP5965
- DVP5960
- DVP5980
- DVP5100
Não funcionou com:
- PET 725 (acho que neste a rotina realmente não existe)
- DVP3040 (acho que neste a rotina realmente não existe)
- DVP5140
-
Ryan, estar faltando alguma coisa na explicação de como colocar o menu de seleção de legenda e cor no Proview, pois com a explicação da pagina 2, o DVD nem liga. O primeiro erro que encontrei comparando seu post e o seu segundo firmware experimental foi na parte abaixo.
No seu firmware experimental tem toda linha hexadecimal abaixo.
05 0D 05 0D 03 03 00 05 0E 05 0E 03 04 04 05 0F 05 0F 03 05 06 05 10 05 10 03 06 08 05 11 05 11 03 07 0A 05 12 05 12 03 08 0C 05 13 05 13 03 09 0E 05 14 05 14 03 0A 10 FF EC 00 FF EC 07 FF EC 0E FF EC 15 FF EC 1C FF EC 23 FF EC 2A FF EC 31 00 08 FF FF 05 0C 05 0C 00 06 00 00 00 07 00 00 FF EC 38 00 00 05 16 05 16 05 18 0F 05 17 05 17 05 19 02 FF EC 65 FF EC 6C 00 08 FF FF 05 15 05 15 00 71 00 00 00 01 00 0F FF EC 73 00 00 05 17 05 17 03 03 00 FF EC 8E 00 03 FF FF 01 A1 01 A1 00 15 00 00 00 00 00 00 FF EC 95 00 00 02 BF 02 BF 02 BF 00 02 C0 02 C0 02 C0 01 02 C1 02 C1 02 C1 02 02 C2 02 C2 02 C2 03 02 C3 02 C3 02 C3 04 02 C4 02 C4 02 C4 05 02 C5 02 C5 02 C5 06 FF EC AD FF EC B4 FF EC BB FF EC C2 FF EC C9 FF EC D0 FF EC D7 00 08 FF FF 01 EB 01 EB 00 16 00 3F 00 06 00 00 FF EC DE 00 00 01 78 01 78 04 F1 00 01 79 01 79 04 F2 01 FF ED 08 FF ED 0F 00 08 FF FF 00 D3 00 D3 00 14 00 00 00 01 00 00 FF ED 16 1F BA 01 2F 02 97 00 00 00 FF ED 31 00 08 FF FF 01 30 02 97 FF FF 00 00 00 00 00 00 FF ED 38 1F C0 FF EC 50 FF EC 79 FF EC 98 FF EC F3 FF ED 1C FF ED 3B 03 00 CF 00 00 06 FF ED 50 00 00 00 CF 00 00 06 FF ED 5A 00 00 17 05 19 02 FF ED 6D FF ED 74 00 08 FF FF 05 15 05 15 00 71 00 00 00 01 00 0F FF ED 7B 00 00 FF EC 50 FF EC 79 FF EC 98 FF EC F3 FF ED 58 FF ED 81 03 00 CF 00 00 06 FF ED 96 00 00
Ja no seu post mostrando como fazer, so tem a parte abaixo.
05 0D 05 0D 03 03 00 05 0E 05 0E 03 04 04 05 0F 05 0F 03 05 06 05 10 05 10 03 06 08 05 11 05 11 03 07 0A 05 12 05 12 03 08 0C 05 13 05 13 03 09 0E 05 14 05 14 03 0A 10 FF EC 00 FF EC 07 FF EC 0E FF EC 15 FF EC 1C FF EC 23 FF EC 2A FF EC 31 00 08 FF FF 05 0C 05 0C 00 06 00 00 00 07 00 00 FF EC 38 00 00 05 16 05 16 05 18 0F 05 17 05 17 05 19 02 FF EC 65 FF EC 6C 00 08 FF FF 05 15 05 15 00 71 00 00 00 01 00 0F FF EC 73 00 00 05 17 05 17 03 03 00 FF EC 8E 00 03 FF FF 01 A1 01 A1 00 15 00 00 00 00 00 00 FF EC 95 00 00 02 BF 02 BF 02 BF 00 02 C0 02 C0 02 C0 01 02 C1 02 C1 02 C1 02 02 C2 02 C2 02 C2 03 02 C3 02 C3 02 C3 04 02 C4 02 C4 02 C4 05 02 C5 02 C5 02 C5 06 FF EC AD FF EC B4 FF EC BB FF EC C2 FF EC C9 FF EC D0 FF EC D7 00 08 FF FF 01 EB 01 EB 00 16 00 3F 00 06 00 00 FF EC DE 00 00 01 78 01 78 04 F1 00 01 79 01 79 04 F2 01 FF ED 08 FF ED 0F 00 08 FF FF 00 D3 00 D3 00 14 00 00 00 01 00 00 FF ED 16 1F BA 01 2F 02 97 00 00 00 FF ED 31 00 08 FF FF 01 30 02 97 FF FF 00 00 00 00 00 00 FF ED 38 1F C0 FF EC 50 FF EC 79 FF EC 98 FF EC F3 FF ED 1C FF ED 3B 03 00 CF 00 00 06 FF ED 50 00 00
Os codigos estão diferentes.
-
Em quase 100% dos casos, quando o DVD nem liga é porque você fez alguma bobagem ao inserir os dados e em vez de sobreescrever exatamente, inseriu ou deletou algo.
Basta deletar (reduzindo o tamanho do firmware) um único byte do código 8032 por engano no bloco 2 para o DVD nem ligar. Eu sei, porque eu fiz isso umas cinco vezes num único dia ;)
Já quanto à diferença, o meu firmware experimental é uma "gambiarra" e o código que está sobrando é o resto de um menu maior que eu testei antes e não apaguei. Se quiser conferir, simplesmente copie o código inteiro do meu firmware experimental, mas isso só vai ocupar espaço sem necessidade.
Depois eu vou testar minhas instruções para ver se há algum erro, mas de antemão eu acho que se o aparelho nem liga, não é por causa dos menus, mas de algum deslize no uso do editor hexadecimal.
Certifique-se de que ao dar o "paste" no editor hexadecimal você realmente está sobreescrevendo. O XVI32 insere por default.
-
Olá, Jefferson. Duas consultas:
Ainda continúo mexendo no filebrowser e hoje me deparei com um problema que não tinha percebido. O meu firmware está limitando o nome dos arquivos em 40 caracteres (sem importar o largo ou tamanho da fonte utilizada).
Como ja disse, anteriormente não tinha percebido esse comportamento porque o máximo do firmware era 42 (não fazía muita diferença). Agora que ampliei o número de caracteres para 50 o problema ficou evidente... ¿Voçê tem ideia de quál possa ser esse problema?
A minha outra dúvida é relativa a "selection bar": Agora que os arquivos ficam um pouco mais acima no filebrowser, estou tendo um comportamento estranho da "selection bar" do filebrowser:
- 1) Quando o primer "lugar" do filebrowser é um diretório, a primeira linha não é visualizada (é visualizada mas logo apagada). O problema não acontece quando o primer lugar for um arquivo.
- 2) O primeiro arquivo fica seleccionado em cor laranja, mas o segundo arquivo também fica laranja (como se estivese seleccionado). Esse comportamente somente ocorre quando o primer arquivo for seleccionado. Ao seleccionar o segundo, tercer e quarto arquivos o comportamento do filebrowser é normal (somente o arquivo seleccionado fica laranja, os restantes ficam com a cor normal).
Se precisar do meu firmware para dar uma olhada é so avisar.
Obrigado pela ajuda!
-
Como ja disse, anteriormente não tinha percebido esse comportamento porque o máximo do firmware era 42 (não fazía muita diferença). Agora que ampliei o número de caracteres para 50 o problema ficou evidente... ¿Voçê tem ideia de quál possa ser esse problema?
É só um palpite, mas eu me lembro de que você falou algo sobre o seu firmware e suporte a Unicode. Se o ARM do seu firmware está trabalhando com Unicode, o browser só vai receber metade dos caracteres que poderia, se estivesse usando uma codepage comum.
Experimente expandir o número máximo de caracteres para 100 no mtkModToolbox.
A minha outra dúvida é relativa a "selection bar": Agora que os arquivos ficam um pouco mais acima no filebrowser, estou tendo um comportamento estranho da "selection bar" do filebrowser:
Eu nunca tentei mover as linhas do browser, por isso no momento não saberia nem por onde começar. E estou ocupado com outro problema. Se eu pensar em algo, aviso.
E meus testes estão limitados, porque o meu único DVP5100 que está funcionando não lê nem CD-RW nem DVDs. Além disso, por algum estranho motivo não exibe mais pastas, não importa que firmware eu coloque nele. Todos os arquivos ficam misturados na raiz.
-
Agora foi, você tinha razão, o Xvi32 estava inserindo ao invés de sobrescrever, o cabecinha a minha :dashhead1:
Valeu!
Ryan, a string hexa pode ser inserida apenas em 2EC00 se sim, qual a razão? Caso eu possa inserir onde eu quiser no banco 2 a string hexa, preciso fazer alguma alteração em outro lugar?
help :-[
-
Não tem problema. O límite dos 40 caracteres não acho que seja o problema do Unicode. Hoje, olhando o seu review do firmware jmaraujo 1.04b, percebí que os arquivos naquele firmware também tinham 40 caracteres.
O problema 1 acho que é alguma rotina de limpeza... (ligada a exhibição de diretorios?) O 2 problema pode ser um problema de coordenadas... Em realidade, não tenho idéia. Nunca tinha olhado na parte do "selection bar" do DVP5100.
E meus testes estão limitados, porque o meu único DVP5100 que está funcionando não lê nem CD-RW nem DVDs. Além disso, por algum estranho motivo não exibe mais pastas, não importa que firmware eu coloque nele. Todos os arquivos ficam misturados na raiz.
¿Tem certeza que não é na configuração, na opção "Nav mp3/jpeg"? (PÁG. PREFERÊNCIAS -> Nav MP3/JPEG).
Sem menu: Selecione esta função para exibir todos os arquivos contidos no CD.
Com menu: Selecione esta função para exibir somente o menu de pastas do CD.
-
¿Tem certeza que não é na configuração, na opção "Nav mp3/jpeg"? (PÁG. PREFERÊNCIAS -> Nav MP3/JPEG).
ERA!
:dashhead1:
-
Ryan, a string hexa pode ser inserida apenas em 2EC00 se sim, qual a razão? Caso eu possa inserir onde eu quiser no banco 2 a string hexa, preciso fazer alguma alteração em outro lugar?
help :-[
Somente no endereço indicado. Você não faz idéia do quanto precisa ser recalculado naquela string se você mover um byte sequer. Quase um terço daquilo lá são endereços.
-
Uma dúvida: Movendo a rotina FF00 para outro endereço é necessário alguma mudança na string hexa?
-
Uma dúvida: Movendo a rotina FF00 para outro endereço é necessário alguma mudança na string hexa?
Não. Tirando os endereços de EEPROM, a string do menu é completamente independente da modificação no assembly.
-
Uma dúvida: Movendo a rotina FF00 para outro endereço é necessário alguma mudança na string hexa?
Não. Tirando os endereços de EEPROM, a string do menu é completamente independente da modificação no assembly.
OK, muitissimo obrigado Ryan, :yahoo!:
PS: Alterei 2 bytes no ARM e agora conseguir que legendas SRT sejam exibidas no browser, só ainda não encontrei uma funcionalidade pra isso. :o
A alteração é super simples.
Salva o ARM code descompactado usando o Remaker. Depois abre o ARM usando um editor hexadecimal, procura pelo texto: DST, depois é só substituir:
44 => 53
53 => 52
-
PS: Alterei 3 bytes no ARM e agora conseguir que legendas SRT sejam exibidas no browser, só ainda não encontrei uma funcionalidade pra isso. :o
Aquela da mudança DST=>SRT?
A única utilidade é você poder ver que as legendas estão lá.
-
Firmwares Philips: Improvisando uma mensagem de versão
Como todos vocês que tem um aparelho da Philips devem saber, ao apertar EJECT + 55 é exibido na tela o nome do arquivo que o aparelho espera encontrar no CD de upgrade. Até esta semana, eu achava que o nome exibido vinha da mesma string usada para fazer a conferência, mas não vem!
(http://ryan.com.br/imagens/mediatek/mediatek_philips_eject55_dvp5960(50).jpg)
Na verdade, todos os firmwares Philips tem diversas strings em lugares diferentes, mas eu localizei a string exata que é usada ao apertar EJECT + 55.
Procure pela seguinte seqüência:
4F 46 46
Isto é o código ASCII para a string "OFF"
Após encontrar essa string (que ainda não sei quando é exibida) menos de 100 bytes antes você encontrará a string com o nome do arquivo.
Busca funciona com:
- DVP3040
- DVP5965
- DVP5960
- DVP5100
Busca não funciona com:
- DVP5980 (no lugar existe a string "CLEAR MODE TYPE")
- DVP3040
Você pode susbstituí-la pelo que você quiser, observando duas regras:
- No máximo, 20 caracteres;
- Não use espaços
(http://ryan.com.br/imagens/mediatek/mediatek_philips_eject55_mod(50).jpg)
A utilidade disso? O usuário fica livre para escolher o background que quiser, sem perder o rastro de que versão do firmware modificado está realmente instalada no aparelho. E o desenvolvedor pode usar um background só, sem precisar escrever pelo menos um texto diferente em cada tela inicial.
Eu tentei de vários modos descobrir que rotina exibe essa mensagem, porque isso seria a chave para poder exibir mensagens personalizadas, do tamanho que quisessemos, mas depois de analisar vários firmwares Philips eu não consegui encontrar nenhum padrão. Não faço a menor idéia no momento.
No DVP5960 existe uma XREF bem próxima que eu não sei o que lê, mas no DVP5100 e no DVP3040 a XREF mais próxima já é a usada para coletar a senha de CheckVersionPass.
A única pista que tenho é que a mensagem é exibida em uma janela. No caso do DVP5100 é na janela 01.
-
Alguém sabe onde são usadas essas strings?
Em todos os firmwares que abri (e não apenas nos Philips), a string "OFF" pode ser encontrada uma vez (e apenas uma). Não apenas ela,, mas pelo menos esta seqüência:
B2:3D8A 46 .byte 0x46 ; F
B2:3D8B 55 .byte 0x55 ; U
B2:3D8C 4C .byte 0x4C ; L
B2:3D8D 4C .byte 0x4C ; L
B2:3D8E 03 B2_3D8E:.byte 3 ; DATA XREF: BankSw_223_B2_2949:B2_2B0Fo
B2:3D8E ; BankSw_223_B2_2949+1D6o
B2:3D8F 33 .byte 0x33 ; 3
B2:3D90 2F .byte 0x2F ; /
B2:3D91 34 .byte 0x34 ; 4
B2:3D92 03 B2_3D92:.byte 3 ; DATA XREF: BankSw_223_B2_2949:B2_2B58o
B2:3D92 ; BankSw_223_B2_2949+21Fo
B2:3D93 31 .byte 0x31 ; 1
B2:3D94 2F .byte 0x2F ; /
B2:3D95 32 .byte 0x32 ; 2
B2:3D96 03 B2_3D96:.byte 3 ; DATA XREF: BankSw_223_B2_2949:B2_2BA1o
B2:3D96 ; BankSw_223_B2_2949+268o
B2:3D97 31 .byte 0x31 ; 1
B2:3D98 2F .byte 0x2F ; /
B2:3D99 34 .byte 0x34 ; 4
B2:3D9A 03 B2_3D9A:.byte 3 ; DATA XREF: BankSw_223_B2_2949:B2_2C5Do
B2:3D9A ; BankSw_223_B2_2949+324o
B2:3D9B 4F .byte 0x4F ; O
B2:3D9C 46 .byte 0x46 ; F
B2:3D9D 46 .byte 0x46 ; F
FULL, 3/4, 1/2, 1/4 e OFF
Como o ZOOM tira as suas mensagens dos Language Codes, eu não entendo quando essas strings são exibidas, se é que são. Se você prestar atenção, verá que antes de cada string existe um byte que é igual ao número de caracteres na mesma e que esse ponto é acessado por uma rotina. Pode ser possível manipular isso para escrever nossas mensagens, mas é preciso primeiro saber se essas mensagens são realmente exibidas, e quando.
-
Achei!
São strings do Dolby Digital Setup
Veja a palavra FULL nas duas imagens:
(http://ryan.com.br/imagens/dvp858/proview_dvp858_setup_dolby_digital_320(50).jpg)
(http://ryan.com.br/imagens/mediatek/mediatek_setup_dolby_digital_text_320(50).jpg)
Estudando como a exibição funciona eu aprendi coisas que eu não sabia sobre a rotina OSD_DispMSG/OSD_DispMSG2. Mais tarde (ou outro dia) eu vou relatar aqui o que aprendi.
-
"MT1369 RESETDISC UPGRADE"
Essa string pode ser concontrada em todo firmware MT13x9. Confirmado com:
- Proview DVP-858
- Philips DVP5100
- Philips DVP5960
- Philips DVP5965
- Philips DVP5140
- Philips DVP5980
- Philips DVP3040
- Philips PET725
- LG DK194G
- LG série 8xxx
- LG série 9xxx
- Pioneer 575
- JTEC MTK7000
Tanto que vou passar a usá-la no mtkModToolbox para reconhecer se um firmware é válido.
Ao contrário do que parece, é a junção das strings:
MT1369 RESET
DISC UPGRADE
Minha investigação sobre o propósito dessas strings foi interessante. Existe uma rotina no Bloco 0 que verifica se uma dessas strings está na memória, a apaga e toma uma ação dependendo de qual das duas foi encontrada.
Eu suponho que "MT1369 RESET" seja a condição normal, que acontece toda vez que o aparelho é ligado e que "DISC UPGRADE", logicamente, só aconteça num upgrade. É possível que o firmware use isso para determinar, ao ligar, se vai ser preciso fazer alguma inicialização extra. Talvez carregar novos valores default na EEPROM. Se for este o caso, talvez até exista uma diferença funcional entre instalar um firmware por cabo e por CD.
Rotinas do Proview DVP-858 20.07
B0:E568 Esta rotina retorna "2" se encontrar "DISC UPGRADE" na memória
B0:E568 "1" se encontrar "MT1369 RESET" e "0" se não encontrar nada.
B0:E568
B0:E568 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B0:E568
B0:E568
B0:E568 B0_E568: ; CODE XREF: B0_E26Bp
B0:E568 E4 clr A ; Verifica se "MT1369 RESET" está na memória
B0:E569 F5 35 mov RAM_35, A ; RAM_35 conta as interações pelo loop
B0:E56B
B0:E56B B0_E56B: ; CODE XREF: B0_E568+1Ej
B0:E56B E5 35 mov A, RAM_35
B0:E56D 24 97 add A, #0x97 ; 'ù'
B0:E56F FF mov R7, A ; Primeira passagem: R7=97
B0:E570 E4 clr A
B0:E571 33 rlc A ; Neste ponto A sempre tem "1"
B0:E572 FE mov R6, A
B0:E573 12 F3 20 lcall BankSw_1_B0_F320 ; Lê a XRAM, 0xC bytes desde F997, com retorno em R7
B0:E576 E5 35 mov A, RAM_35
B0:E578 90 18 5B mov DPTR, #B0_185B
B0:E57B 93 movc A, @A+DPTR
B0:E57C 6F xrl A, R7
B0:E57D 70 09 jnz B0_E588 ; Salta se não corresponde
B0:E57F 05 35 inc RAM_35
B0:E581 E5 35 mov A, RAM_35
B0:E583 C3 clr C
B0:E584 94 0C subb A, #0xC ; "RESET MT13x9" tem 0xC caracteres
B0:E586 40 E3 jc B0_E56B
B0:E588
B0:E588 B0_E588: ; CODE XREF: B0_E568+15j
B0:E588 E5 35 mov A, RAM_35
B0:E58A B4 0C 08 cjne A, #0xC, Disc_Upgrade? ; Verifica se o loop chegou a ser completado
B0:E58A ; (todos os caracteres encontrados). Se negativo salta para a próxima.
B0:E58A ; Se positivo, encerra.
B0:E58D C2 34 clr RAM_26.4 ; Determina o apagamento da string
B0:E58F 12 AE 60 lcall B0_AE60 ; Grava (ou apaga) "MT1369 RESET" de XRAM_F897 a XRAM_F8A2
B0:E592 7F 01 mov R7, #1 ; 1 = "MT1369 RESET"
B0:E594 22 ret
B0:E595 ; ---------------------------------------------------------------------------
B0:E595
B0:E595 Disc_Upgrade?: ; CODE XREF: B0_E568+22j
B0:E595 E4 clr A ; verifica se a string "DISC UPGRADE" está na memória
B0:E596 F5 35 mov RAM_35, A ; RAM_35 conta as interações pelo loop
B0:E598
B0:E598 B0_E598: ; CODE XREF: B0_E568+4Bj
B0:E598 E5 35 mov A, RAM_35
B0:E59A 24 97 add A, #0x97 ; 'ù'
B0:E59C FF mov R7, A ; Primeira passagem: R7=97
B0:E59D E4 clr A
B0:E59E 33 rlc A ; Neste ponto A sempre tem "1"
B0:E59F FE mov R6, A
B0:E5A0 12 F3 20 lcall BankSw_1_B0_F320 ; Lê a XRAM, 0xC bytes desde F997, com retorno em R7
B0:E5A3 E5 35 mov A, RAM_35
B0:E5A5 90 18 67 mov DPTR, #DISC_UPGRADE
B0:E5A8 93 movc A, @A+DPTR
B0:E5A9 6F xrl A, R7
B0:E5AA 70 09 jnz B0_E5B5 ; Salta se não corresponde
B0:E5AC 05 35 inc RAM_35
B0:E5AE E5 35 mov A, RAM_35
B0:E5B0 C3 clr C
B0:E5B1 94 0C subb A, #0xC ; "DISC UPGRADE" tem 0xC caracteres
B0:E5B3 40 E3 jc B0_E598
B0:E5B5
B0:E5B5 B0_E5B5: ; CODE XREF: B0_E568+42j
B0:E5B5 E5 35 mov A, RAM_35
B0:E5B7 B4 0C 08 cjne A, #0xC, B0_E5C2 ; Verifica se o loop chegou a ser completado (todos os caracteres encontrados)
B0:E5BA C2 34 clr RAM_26.4 ; Determina o apagamento da string
B0:E5BC 12 AE 60 lcall B0_AE60 ; Grava (ou apaga) "MT1369 RESET" de XRAM_F897 a XRAM_F8A2
B0:E5BF 7F 02 mov R7, #2 ; 2= "DISC UPGRADE" estava na memória
B0:E5C1 22 ret
B0:E5C2 ; ---------------------------------------------------------------------------
B0:E5C2
B0:E5C2 B0_E5C2: ; CODE XREF: B0_E568+4Fj
B0:E5C2 7F 00 mov R7, #0
B0:E5C4 22 ret
B0:E5C4 ; End of function B0_E568
Esta é uma das rotinas que escreve ou apaga:
B0:AE60 Se esta rotina for chamada com bit RAM_26.4 setado, a
B0:AE60 string será escrita. Se o bit estiver estiver resetado,
B0:AE60 os 0xC bytes serão zerados.
B0:AE60
B0:AE60 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B0:AE60
B0:AE60 ; Grava (ou apaga) "MT1369 RESET" de XRAM_F897 a XRAM_F8A2
B0:AE60
B0:AE60 B0_AE60: ; CODE XREF: B0_8F1D+E2p
B0:AE60 ; B0_8F1D+189j ...
B0:AE60 20 34 03 jb RAM_26.4, B0_AE66 ; "1", escreve, "0", apaga.
B0:AE63 02 AF 02 ljmp B0_AF02 ; Zera a memória de XRAM_F897 a XRAM_F8A2
B0:AE66 ; ---------------------------------------------------------------------------
B0:AE66
B0:AE66 B0_AE66: ; CODE XREF: B0_AE60j
B0:AE66 90 18 5B mov DPTR, #B0_185B ; M
B0:AE69 E4 clr A
B0:AE6A 93 movc A, @A+DPTR
B0:AE6B FD mov R5, A
B0:AE6C 7F 97 mov R7, #0x97 ; 'ù'
B0:AE6E 7E 00 mov R6, #0
B0:AE70 12 F3 2C lcall BankSw_3_B0_F32C
B0:AE73 90 18 5C mov DPTR, #B0_185C ; T
B0:AE76 E4 clr A
B0:AE77 93 movc A, @A+DPTR
B0:AE78 FD mov R5, A
B0:AE79 7F 98 mov R7, #0x98 ; 'ÿ'
B0:AE7B 7E 00 mov R6, #0
B0:AE7D 12 F3 2C lcall BankSw_3_B0_F32C
B0:AE80 90 18 5D mov DPTR, #B0_185D ; 1
B0:AE83 E4 clr A
B0:AE84 93 movc A, @A+DPTR
B0:AE85 FD mov R5, A
B0:AE86 7F 99 mov R7, #0x99 ; 'Ö'
B0:AE88 7E 00 mov R6, #0
B0:AE8A 12 F3 2C lcall BankSw_3_B0_F32C
B0:AE8D 90 18 5E mov DPTR, #B0_185E ; 3
B0:AE90 E4 clr A
B0:AE91 93 movc A, @A+DPTR
B0:AE92 FD mov R5, A
B0:AE93 7F 9A mov R7, #0x9A ; 'Ü'
B0:AE95 7E 00 mov R6, #0
B0:AE97 12 F3 2C lcall BankSw_3_B0_F32C
B0:AE9A 90 18 5F mov DPTR, #B0_185F ; 6
B0:AE9D E4 clr A
B0:AE9E 93 movc A, @A+DPTR
B0:AE9F FD mov R5, A
B0:AEA0 7F 9B mov R7, #0x9B ; 'ø'
B0:AEA2 7E 00 mov R6, #0
B0:AEA4 12 F3 2C lcall BankSw_3_B0_F32C
B0:AEA7 90 18 60 mov DPTR, #B0_1860 ; 9
B0:AEAA E4 clr A
B0:AEAB 93 movc A, @A+DPTR
B0:AEAC FD mov R5, A
B0:AEAD 7F 9C mov R7, #0x9C ; '£'
B0:AEAF 7E 00 mov R6, #0
B0:AEB1 12 F3 2C lcall BankSw_3_B0_F32C
B0:AEB4 90 18 61 mov DPTR, #B0_1861 ; " "
B0:AEB7 E4 clr A
B0:AEB8 93 movc A, @A+DPTR
B0:AEB9 FD mov R5, A
B0:AEBA 7F 9D mov R7, #0x9D ; 'Ø'
B0:AEBC 7E 00 mov R6, #0
B0:AEBE 12 F3 2C lcall BankSw_3_B0_F32C
B0:AEC1 90 18 62 mov DPTR, #B0_1862 ; R
B0:AEC4 E4 clr A
B0:AEC5 93 movc A, @A+DPTR
B0:AEC6 FD mov R5, A
B0:AEC7 7F 9E mov R7, #0x9E ; '×'
B0:AEC9 7E 00 mov R6, #0
B0:AECB 12 F3 2C lcall BankSw_3_B0_F32C
B0:AECE 90 18 63 mov DPTR, #B0_1863 ; E
B0:AED1 E4 clr A
B0:AED2 93 movc A, @A+DPTR
B0:AED3 FD mov R5, A
B0:AED4 7F 9F mov R7, #0x9F ; 'ƒ'
B0:AED6 7E 00 mov R6, #0
B0:AED8 12 F3 2C lcall BankSw_3_B0_F32C
B0:AEDB 90 18 64 mov DPTR, #B0_1864 ; S
B0:AEDE E4 clr A
B0:AEDF 93 movc A, @A+DPTR
B0:AEE0 FD mov R5, A
B0:AEE1 7F A0 mov R7, #0xA0 ; 'á'
B0:AEE3 7E 00 mov R6, #0
B0:AEE5 12 F3 2C lcall BankSw_3_B0_F32C
B0:AEE8 90 18 65 mov DPTR, #B0_1865 ; E
B0:AEEB E4 clr A
B0:AEEC 93 movc A, @A+DPTR
B0:AEED FD mov R5, A
B0:AEEE 7F A1 mov R7, #0xA1 ; 'í'
B0:AEF0 7E 00 mov R6, #0
B0:AEF2 12 F3 2C lcall BankSw_3_B0_F32C
B0:AEF5 90 18 66 mov DPTR, #B0_1866 ; T
B0:AEF8 E4 clr A
B0:AEF9 93 movc A, @A+DPTR
B0:AEFA FD mov R5, A
B0:AEFB 7F A2 mov R7, #0xA2 ; 'ó'
B0:AEFD 7E 00 mov R6, #0
B0:AEFF 02 F3 2C ljmp BankSw_3_B0_F32C ; Neste ponto os registradores tem a string "MT1369 RESET"
B0:AEFF ; Atente para o fato de que aqui a instrução é "ljmp" e não "lcall"
B0:AEFF ; Por isso o RET não é necessário (já existe um na rotina)
B0:AF02 ; ---------------------------------------------------------------------------
B0:AF02
B0:AF02 B0_AF02: ; CODE XREF: B0_AE60+3j
B0:AF02 E4 clr A ; Zera a memória de XRAM_F897 a XRAM_F8A2
B0:AF03 FD mov R5, A
B0:AF04 7F 97 mov R7, #0x97 ; 'ù'
B0:AF06 FE mov R6, A
B0:AF07 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF0A E4 clr A
B0:AF0B FD mov R5, A
B0:AF0C 7F 98 mov R7, #0x98 ; 'ÿ'
B0:AF0E FE mov R6, A
B0:AF0F 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF12 E4 clr A
B0:AF13 FD mov R5, A
B0:AF14 7F 99 mov R7, #0x99 ; 'Ö'
B0:AF16 FE mov R6, A
B0:AF17 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF1A E4 clr A
B0:AF1B FD mov R5, A
B0:AF1C 7F 9A mov R7, #0x9A ; 'Ü'
B0:AF1E FE mov R6, A
B0:AF1F 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF22 E4 clr A
B0:AF23 FD mov R5, A
B0:AF24 7F 9B mov R7, #0x9B ; 'ø'
B0:AF26 FE mov R6, A
B0:AF27 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF2A E4 clr A
B0:AF2B FD mov R5, A
B0:AF2C 7F 9C mov R7, #0x9C ; '£'
B0:AF2E FE mov R6, A
B0:AF2F 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF32 E4 clr A
B0:AF33 FD mov R5, A
B0:AF34 7F 9D mov R7, #0x9D ; 'Ø'
B0:AF36 FE mov R6, A
B0:AF37 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF3A E4 clr A
B0:AF3B FD mov R5, A
B0:AF3C 7F 9E mov R7, #0x9E ; '×'
B0:AF3E FE mov R6, A
B0:AF3F 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF42 E4 clr A
B0:AF43 FD mov R5, A
B0:AF44 7F 9F mov R7, #0x9F ; 'ƒ'
B0:AF46 FE mov R6, A
B0:AF47 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF4A E4 clr A
B0:AF4B FD mov R5, A
B0:AF4C 7F A0 mov R7, #0xA0 ; 'á'
B0:AF4E FE mov R6, A
B0:AF4F 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF52 E4 clr A
B0:AF53 FD mov R5, A
B0:AF54 7F A1 mov R7, #0xA1 ; 'í'
B0:AF56 FE mov R6, A
B0:AF57 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF5A E4 clr A
B0:AF5B FD mov R5, A
B0:AF5C 7F A2 mov R7, #0xA2 ; 'ó'
B0:AF5E FE mov R6, A
B0:AF5F 12 F3 2C lcall BankSw_3_B0_F32C
B0:AF62 22 ret
B0:AF62 ; End of function B0_AE60
E esta outra rotina decide qual das rotinas escrever. Ela faz isso de um modo bem mais elegante.
B0:EAAA ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B0:EAAA
B0:EAAA
B0:EAAA B0_EAAA: ; CODE XREF: B0_B617+B0p
B0:EAAA ; B0_B617+DDp ...
B0:EAAA EF mov A, R7
B0:EAAB 24 FE add A, #0xFE ; '¦'
B0:EAAD 60 22 jz B0_EAD1 ; Grava "DISC UPGRADE" em XRAM_F997
B0:EAAF 04 inc A
B0:EAB0 70 3E jnz B0_EAF0 ; Apaga os registradores de XRAM_F897 a XRAM_F8A2
B0:EAB2 E4 clr A ; Grava "MT1369 RESET" em XRAM_F997
B0:EAB3 F5 40 mov RAM_40, A
B0:EAB5
B0:EAB5 B0_EAB5: ; CODE XREF: B0_EAAA+24j
B0:EAB5 E5 40 mov A, RAM_40
B0:EAB7 24 97 add A, #0x97 ; 'ù'
B0:EAB9 FF mov R7, A
B0:EABA E4 clr A
B0:EABB 33 rlc A
B0:EABC FE mov R6, A
B0:EABD E5 40 mov A, RAM_40
B0:EABF 90 18 5B mov DPTR, #B0_185B
B0:EAC2 93 movc A, @A+DPTR
B0:EAC3 FD mov R5, A
B0:EAC4 12 F3 2C lcall BankSw_3_B0_F32C
B0:EAC7 05 40 inc RAM_40
B0:EAC9 E5 40 mov A, RAM_40
B0:EACB C3 clr C
B0:EACC 94 0C subb A, #0xC
B0:EACE 40 E5 jc B0_EAB5
B0:EAD0 22 ret
B0:EAD1 ; ---------------------------------------------------------------------------
B0:EAD1
B0:EAD1 B0_EAD1: ; CODE XREF: B0_EAAA+3j
B0:EAD1 E4 clr A ; Grava "DISC UPGRADE" em XRAM_F997
B0:EAD2 F5 40 mov RAM_40, A
B0:EAD4
B0:EAD4 B0_EAD4: ; CODE XREF: B0_EAAA+43j
B0:EAD4 E5 40 mov A, RAM_40
B0:EAD6 24 97 add A, #0x97 ; 'ù'
B0:EAD8 FF mov R7, A
B0:EAD9 E4 clr A
B0:EADA 33 rlc A
B0:EADB FE mov R6, A
B0:EADC E5 40 mov A, RAM_40
B0:EADE 90 18 67 mov DPTR, #DISC_UPGRADE
B0:EAE1 93 movc A, @A+DPTR
B0:EAE2 FD mov R5, A
B0:EAE3 12 F3 2C lcall BankSw_3_B0_F32C
B0:EAE6 05 40 inc RAM_40
B0:EAE8 E5 40 mov A, RAM_40
B0:EAEA C3 clr C
B0:EAEB 94 0C subb A, #0xC
B0:EAED 40 E5 jc B0_EAD4
B0:EAEF 22 ret
B0:EAF0 ; ---------------------------------------------------------------------------
B0:EAF0
B0:EAF0 B0_EAF0: ; CODE XREF: B0_EAAA+6j
B0:EAF0 C2 34 clr RAM_26.4 ; Apaga os registradores de XRAM_F897 a XRAM_F8A2
B0:EAF2 12 AE 60 lcall B0_AE60 ; Grava (ou apaga) "MT1369 RESET" de XRAM_F897 a XRAM_F8A2
B0:EAF5 22 ret
B0:EAF5 ; End of function B0_EAAA
Para compreender essas rotinas só está me faltando entender qual o valor de "A" na linha destacada em vermelho acima. Só pode ser ou "0" ou "1". Se for "1" bagunça a lógica de endereçamento, porque uma rotina vai estar escrevendo a partir de XRAM_F897 enquanto a outra vai estar escrevendo a partir de XRAM_F997. Se for "0" o endereçamento "bate", mas a presença da instrução "rlc A" deixa de ter qualquer propósito.
Nota: para compreender as rotinas é preciso olhar o código no IDA e seguir algumas "lcall" para ver o que é feito nelas. Só olhar as listagens acima não basta.
-
Legendas MPEG4 do Proview DVP-858
- Como eliminar o limite de tamanho da fonte
- Como eliminar o limite de três linhas nas legendas
Publicado originalmente por mim neste post do htfoum (http://www.htforum.com/vb/showpost.php?p=744316&postcount=2892). Estou trazendo para cá para a informação não se perder.
Como já foi explicado pelo eneris, o firmware oficial Proview aceita qualquer tamanho de fonte, mas fontes maiores que "x" (não lembro agora) fazem com que a linha seguinte seja suprimida. E de jeito nenhum é possível fazer com que mais de três linhas de legenda apareçam, não importando o tamanho da fonte ou o tamanho da janela. Este hack elimina estas limitações.
A modificação é feita na rotina SetMPeg4SubtitleParams que citei anteriormente neste tópico.
B1:F4DD ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:F4DD
B1:F4DD
B1:F4DD SetMPeg4SubtitleParams: ; CODE XREF: BankSw_263_B1_E1E7+10p
B1:F4DD E4 clr A
B1:F4DE 90 FC 44 mov DPTR, #XRAM_FC44 ; wX1.high
B1:F4E1 F0 movx @DPTR, A
B1:F4E2 A3 inc DPTR
B1:F4E3 F0 movx @DPTR, A
B1:F4E4 90 FC 46 mov DPTR, #XRAM_FC46 ; wY1.high
B1:F4E7 F0 movx @DPTR, A
B1:F4E8 A3 inc DPTR
B1:F4E9 F0 movx @DPTR, A
B1:F4EA 90 FC 49 mov DPTR, #XRAM_FC49 ; wX2.high
B1:F4ED 74 02 mov A, #2
B1:F4EF F0 movx @DPTR, A
B1:F4F0 A3 inc DPTR
B1:F4F1 74 30 mov A, #0x30 ; '0' ; 0x230 = 560
B1:F4F3 F0 movx @DPTR, A
B1:F4F4 90 FC 4D mov DPTR, #XRAM_FC4D ; wY2.high
B1:F4F7 E4 clr A
B1:F4F8 F0 movx @DPTR, A
B1:F4F9 A3 inc DPTR
B1:F4FA 74 5A mov A, #0x5A ; 'Z'
B1:F4FC F0 movx @DPTR, A
B1:F4FD E4 clr A
B1:F4FE 90 FB 8E mov DPTR, #XRAM_FB8E ; Espaço entre linhas
B1:F501 F0 movx @DPTR, A
B1:F502 7B 08 mov R3, #8 ; Ansi Codepage = 0x08 (all chars)
B1:F504 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro)
B1:F506 7F 13 mov R7, #0x13 ; Janela da legenda
B1:F508 12 1E B8 lcall PSB_Set_Param_B1_BS
B1:F50B D3 setb C
B1:F50C 22 ret
B1:F50C ; End of function SetMPeg4SubtitleParams
Coloque a janela 0x13 na altura original: 328
Aumente sua altura para 144 (0x90)
Modifique a linha destacada em vermelho:
[B1:F4FB] 5A => 90
Pronto!
Como funciona
O firmware escreve a legenda em uma janela dentro da janela 0x13. Esta janela no firmware original está com uma altura fixa em 90 pontos (0x5A), exatamente a mesma altura definida para a janela 0x13. Por isso aumentar a janela 0x13 no mtkWindows não estava adiantando nada. A janela dentro dela continuava pequena.
Colocando com uma altura de 144 cabem 3 linhas da fonte 8 do meu firmware experimental (a maior de todas, exagerada) e quatro linhas da fonte 7.
-
:dashhead1:
Agora esse tópico pra mim parece grego >:D
Porque eu fugi das aulas de programação e lógica no colegial ? :dashhead1: :dashhead1: :rtfm:
Bom que tal mudar isso pra Patching MediaTek FirmWare From A to Z !
Quer saber qual vai ser a "surpresa" do suposto engenheiro da Proview ?? Um emprego pro Ryan pra trabalhar com FirmWare de DivX >:D ::) :P
-
Porque eu fugi das aulas de programação e lógica no colegial ? :dashhead1: :dashhead1: :rtfm:
Não é tãoooo difícil. Já vi gente muito boa dizer no MT13x9 (acho que foi até o New Age) que nunca havia mexido com Assembly até querer hacker seu DivX player. E acabou se tornando fera!
Eu nunca tive aulas de programação. Levo uma certa vantagem por ser autodidata em eletrônica (assembly usa muitos conceitos difíceis para quem não entende eletrônica) e em Delphi (que uso para tornar mais fáceis certas contas, verificações e manipulações tediosas).
Bom que tal mudar isso pra Patching MediaTek FirmWare From A to Z !
No futuro, a informação aqui poderá ser condensada em documentos no meu site. Este tópico funciona como um diário onde eu vou colocando informação, mesmo que não tenha utilidade prática imediata.
Quer saber qual vai ser a "surpresa" do suposto engenheiro da Proview ?? Um emprego pro Ryan pra trabalhar com FirmWare de DivX >:D ::) :P
Eu não acho que seja nada "para mim" e sim para a "comunidade". Pode ser inclusive a queda do preço do Proview que aconteceu ontem, para R$109.
Se fosse algo para mim teria sido falado em particular, por e-mail.
-
É como disse Ryan no post acima, eu tambem quando via este enorme quantidade de numero e letras achava que era pior que grego (inclusive eu disse isso em um topico neste mesmo forum), mas foi quando eu comprei o Philips 5965 e revirei a internet inteira procurando um firmware pra ele pela mesma razão de todos: as legendas divx, como nao encontrei nenhum firmware eu mesmo comecei a pesquisar sobre firmware mediatek, dai encontrei o forum do nosso amigo Jmaraujo, o site do Ryan e do grupo mtk do yahoo, montei meu cabo de dados (pra mim foi mais facil pois ja conserto aparelhos eletronicos) e entrei no mundo dos firmware mediatek, e continuo aprendendo, e eu tambem nao entendia uma linha de assembly.
-
Como localizar Sub_Style
Este método é experimental.
Existem duas maneiras. Uma relativamente rápida, fácil de implementar em um script (já implementei na nova versão do mtk ModTooolbox) e outra tortuosa, que ainda requer julgamento humano.
Método 1
Para este método, precisamos de duas coisas:
- O número da janela de exibição das legendas (verifique no mtkWindows)
- O offset de OSD_textColor na BTT
Se você não sabe o offset de OSD_textColor, procure a seguinte string:
EF 70 ? D2 ? 12
Esta string ocorre uma vez e leva a um código semelhante a este:
(o propósito original desta string é localizar Dir_DispDirline)
B1:A4EC EF mov A, R7
B1:A4ED 70 07 jnz DIR_FB_HasParent?
B1:A4EF D2 45 setb RAM_28.5
B1:A4F1 12 78 FB lcall Dir_Disp_Dirline
B1:A4F4 80 05 sjmp DIR_FB_SetColor
B1:A4F6 ; ---------------------------------------------------------------------------
B1:A4F6
B1:A4F6 DIR_FB_HasParent?: ; CODE XREF: DIR_FileBrowser+6Cj
B1:A4F6 C2 45 clr RAM_28.5
B1:A4F8 12 78 FB lcall Dir_Disp_Dirline
B1:A4FB
B1:A4FB DIR_FB_SetColor: ; CODE XREF: DIR_FileBrowser+55j
B1:A4FB ; DIR_FileBrowser+73j
B1:A4FB 90 FD 86 mov DPTR, #XRAM_FD86
B1:A4FE E0 movx A, @DPTR
B1:A4FF 54 F7 anl A, #0xF7
B1:A501 F0 movx @DPTR, A
B1:A502 90 FC 07 mov DPTR, #XRAM_FC07 ; OSD_Colors
B1:A505 74 02 mov A, #2
B1:A507 F0 movx @DPTR, A
B1:A508 A3 inc DPTR
B1:A509 04 inc A
B1:A50A F0 movx @DPTR, A
B1:A50B E4 clr A
B1:A50C FB mov R3, A
B1:A50D FD mov R5, A
B1:A50E 7F 10 mov R7, #0x10
B1:A510 12 1D E0 lcall OSD_TextColor_B1BS
B1:A513 E4 clr A
B1:A514 90 FB 98 mov DPTR, #XRAM_FB98
B1:A517 F0 movx @DPTR, A
O endereço destacado em vermelho é o que queremos.
Agora procure por:
'7F' + <Número da janela de legenda> + '12' +<offset OSD_textColor>
Se o número da janela de legendas for 12 e o offset for '1D E0' teremos a seguinte string:
7F 12 12 1D E0
Que equivale a:
mov R7, #0x12
lcall OSD_TextColor
As ocorrências desta string no firmware estão nas rotinas SubStyle primária e secundária apenas.
Este método localiza a SubStyle de
Proview DVP-858 (ambas)
Lenoxx DV-406
Philips DVP5960 (apenas primária)
Philips DVP5965 (apenas primária)
Mas não funciona com
Philips DVP5980
Philips DVP5100
Philips DVP5140
Philips DVP3040
Problema: Alguns firmwares Philips não chamam OSD_TextColor carregando R7 com o número da janela de legendas explicitamente. O número é carregado, mas indiretamente, vindo de um endereço XRAM.
Existe um método tortuoso, que envolve localizar a rotina OSD_textInit, mas falarei sobre isso depois
-
Alguns Scripts IDA
Uma coisa que me aborrece terrivelmente é que depois de localizar rotinas em um determinado firmware, é preciso fazer todas as identificações em todos os outros fimrwares compatíveis, incluindo outras versões do mesmo firmware, por isso decidi aprender a fazer alguns scripts do IDA para automatizar as tarefas, assim toda vez que eu abrir um firmware posso rapidamente incluir nele uma parte do que já aprendi com outros.
Não sei se fiz alguma coisa errada mas estou recebendo uma mensagem "Variable 'SEARCH_DOWN' is undefined" por parte do IDA (tanto no 4.8 como no 5.0)
-
Jmaraujo você tentou com a nova versão do IDA? Eu vinha recebendo esta mensagem na versão 5.0, dai baixei a nova versão ontem, e testei, e o problema se foi.
Tente aí com a versão 5.1 e veja se o problema não é sanado.
-
Jmaraujo você tentou com a nova versão do IDA? Eu vinha recebendo esta mensagem na versão 5.0, dai baixei a nova versão ontem, e testei, e o problema se foi.
Tente aí com a versão 5.1 e veja se o problema não é sanado.
Obrigado pela dica, Eneris. Vou testar sim.
Eu até que intentei adicionar "#define SEARCH_DOWN 0x01 // search forward" e "#include "idc.idc"" mas não funcionou.
-
Jmaraujo você tentou com a nova versão do IDA? Eu vinha recebendo esta mensagem na versão 5.0, dai baixei a nova versão ontem, e testei, e o problema se foi.
Tente aí com a versão 5.1 e veja se o problema não é sanado.
Eu uso a 5.0.
Eu não sei se faz alguma diferença, mas meus scripts foram baseados e incluídos no MT1389_misc.idc do Farox.
Editado:
Se insistir em não funcionar, substitua toda ocorrência de SEARCH_DOWN por 0x01. SEARCH_DOWN é apenas uma constante com função de mnenônico, para você não ter que lembrar que procurar adiante é "1".
-
Localizando SHOW_ZOOM_MSG
O método que utilizei até agora no mtk ModToolbox foi explicado por mim aqui. (http://ryan.com.br/mtk_hack_zoom.htm) Mas esse método é completamente dependente de análise humana e tedioso demais, por isso eu desenvolvi um novo, muito simples, que já foi implantado na próxima versão do mtk ModToolbox.
Basta procurar por:
D3 94 00 40 ? 90 ?? e0 b4 03 1b 90 ?? 74 01
Que encontrará algo assim:
B2:C31B Show_ZOOM_MSG: ; CODE XREF: BankSw_485_B2_C2AA+2Dj
B2:C31B 90 FB 8A mov DPTR, #XRAM_FB8A
B2:C31E E0 movx A, @DPTR
B2:C31F D3 setb C
B2:C320 94 00 subb A, #0
B2:C322 40 3D jc B2_C361
B2:C324 90 FC AB mov DPTR, #XRAM_FCAB ; Tipo de mídia em execução 3=ISO
B2:C327 E0 movx A, @DPTR
B2:C328 B4 03 1B cjne A, #3, Show_ZOOM_MSG_DVD
B2:C32B 90 FB FC mov DPTR, #XRAM_FBFC ; Aqui é exibida a mensagem do ZOOM para ISO
B2:C32E 74 01 mov A, #1
B2:C330 F0 movx @DPTR, A
B2:C331 A3 inc DPTR
B2:C332 74 FB mov A, #0xFB ; '¹'
B2:C334 F0 movx @DPTR, A
B2:C335 A3 inc DPTR
B2:C336 74 8A mov A, #0x8A ; 'è'
B2:C338 F0 movx @DPTR, A
B2:C339 7B FF mov R3, #0xFF ; Tempo de exibição. "FF": permanente
B2:C33B 7D 29 mov R5, #0x29 ; ')' ; 0x0229 é o código da mensagem de ZOOM. Depende do Language Code.
B2:C33D 7C 02 mov R4, #2
B2:C33F 7F 15 mov R7, #0x15 ; Os valores em R6 e R7 determinam onde a mensagem será exibida
B2:C33F ; Consulte a aba "OSD Messages Positions" do mtkWindows
B2:C341 7E 00 mov R6, #0
B2:C343 02 1E 40 ljmp OSD_DispMsg2_B2_BS
B2:C346 ; ---------------------------------------------------------------------------
B2:C346
B2:C346 Show_ZOOM_MSG_DVD: ; CODE XREF: BankSw_485_B2_C2AA+7Ej
B2:C346 90 FB FC mov DPTR, #XRAM_FBFC ; Aqui é exibida a mensagem do ZOOM para DVD-Video
B2:C349 74 01 mov A, #1
B2:C34B F0 movx @DPTR, A
B2:C34C A3 inc DPTR
B2:C34D 74 FB mov A, #0xFB ; '¹'
B2:C34F F0 movx @DPTR, A
B2:C350 A3 inc DPTR
B2:C351 74 8A mov A, #0x8A ; 'è'
B2:C353 F0 movx @DPTR, A
B2:C354 7B FF mov R3, #0xFF
B2:C356 7D 29 mov R5, #0x29 ; ')'
B2:C358 7C 02 mov R4, #2
B2:C35A 7F 08 mov R7, #8
B2:C35C 7E 00 mov R6, #0
B2:C35E 12 1E 40 lcall OSD_DispMsg2_B2_BS
B2:C361
B2:C361 B2_C361: ; CODE XREF: BankSw_485_B2_C2AA+78j
B2:C361 22 ret
Com esse método, não é necessário saber o número da mensagem de ZOOM.
Funciona com:
- Philips DVP5980
- Philips DVP5100
- Philips DVP3040K
- Philips DVP5960
- Philips DVP5965
- Philips DVP5140
- Lenoxx DV406
- Proview DVP-858
Não funciona com:
- Philips PET 725
- JTEC MTK7000
Mas é incerto se mesmo o método antigo funciona com esses últimos.
-
Proview DVP-858 - Volume/MUTE em DivX
Isto foi publicado por mim originalmente no HTFORUM em 17/06/07
Quando você muda o tamanho ou a posição da janela de exibição de legendas (0x13), pode provocar o sumiço do controle do volume em DivX (0x1F). Isso é provocado por sobreposição das janelas.
Encontrar uma posição favorável para a janela 0x1F pode ser complicado. Eu não consegui encontrar uma outra posição vertical onde ela ficasse visível, mesmo trocando de lugar com a janela 0x13.
Porém eu encontrei uma alternativa: redirecionar a mensagem de volume/mute para outra janela. Testei com sucesso as janelas 0x00 e 0x06. Baseado no documento "Patching_HU3899_from_A_to_Z.txt" do Borus.
A 0x00 é a janela usada para exibir as mensagens "Carregando", "abrir", "fechar", etc.
(http://ryan.com.br/imagens/dvp858/proview_dvp858_volume_janela0x00_50.jpg)
A janela 0x06 é a usada para exibir que legenda ou trilha de áudio está sendo usada:
(http://ryan.com.br/imagens/dvp858/proview_dvp858_volume_janela0x06_50.jpg)
Note que a mensagem de volume assume os atributos de cor da janela onde é exibida.
Como fazer a mudança:
Com um editor hexadecimal, procure pelo padrão:
02 30 00 00 06 00 00 00 00 02 30 00 00 1F
E mude "1F" para a janela onde você quer colocar a mensagem de volume.
Por exemplo, para as janelas 0x00 e 0x06, respectivamente:
02 30 00 00 06 00 00 00 00 02 30 00 00 00
02 30 00 00 06 00 00 00 00 02 30 00 00 06
Essa mudança redireciona TUDO o que seria exibido na janela 0x1F para a janela de sua escolha.
Você também pode redirecionar para a janela 0x04 (transparente), que fica logo acima da 0x06 e ainda não sei para que é usada no firmware. A 0x02 é onde é exibido o tempo decorrido.
-
Eu reuni a maioria dos firmwares usados por mim em minhas análises em um ZIP e deixei disponível aqui (http://ryan.com.br/smf/index.php?action=tpmod;dl=item62).
-
O correto funcionamento da Sub_Style do Philips DVP-5100
Há semanas eu mostrei a vocês o que eu chamei de "sub_style secundária" do DVP5100, seguido pela contribuição de jmaraujo, que indicou a Sub_Style primária. Aquela informação não está correta e vou precisar fazer edições naqueles posts um outro dia.
Embora muitos firmwares tenham uma rotina "Sub_style" que só é chamada após sair do Setup, não é o caso do DVP5100. Aquela rotina que eu concluí ser a Sub_Style secundária faz parte da rotina que eu conheço como OSD_text_Init. E essa rotina é chamada pela sub_style primária do DVP5100.
Embora esse trecho de código possa eventualmente ser chamado sozinho, não dá para dizer que ele seja "secundário" porque ele complementa a rotina principal. Nos outros firmwares, mudanças feitas na sub_style secundária só tem efeito quando você entra e sai do setup. No DVP5100 elas tem efeito também ao executar o filme.
Na falta de um nome melhor, vou chamar temporariamente essa rotina de "Sub_Style_2"
Entender isso é importante para a aplicação do próximo hack.
-
Fontes "normais" no Philips DVP-5100
Este post é o primeiro de dois, onde explico como fazer cores de legenda selecionáveis pelo menu, no Philips DVP5100, atendendo ao pedido feito por jmaraujo logo depois que implementei isso no Proview.
Semanas atrás eu expliquei como mudar o firmware dos aparelhos Philips para ser possível remover aquela transparência e poder usar fontes "normais" sem a necessidade daquela conversão inconveniente de cores. Eu usei como exemplo o Philips DVP5960. Neste post, mostro como é aplicado no DVP-5100.
Além de eliminar o fundo (possibilitando a remoção da transparência com o mtkWindows) este hack permitirá que o contorno das fontes seja exibido.
O alvo é a Sub_Style2, porque é aqui que as cores são definidas:
B3:545E Sub_Style_2: ; DATA XREF: OSD_Text_Init+63o
B3:545E 90 FB 8D mov DPTR, #XRAM_FB8D ; Guarda número da janela (OSD_TextInit)?
B3:5461 E0 movx A, @DPTR
B3:5462 FF mov R7, A
B3:5463 D2 75 setb RAM_2E.5
B3:5465 12 28 F1 lcall OSD_Text_Params_ARM
B3:5468 90 FB 8D mov DPTR, #XRAM_FB8D ; Guarda número da janela (OSD_TextInit)?
B3:546B E0 movx A, @DPTR
B3:546C FF mov R7, A
B3:546D 12 68 22 lcall OSD_Text_Params
B3:5470 90 FB 8D mov DPTR, #XRAM_FB8D ; Guarda número da janela (OSD_TextInit)?
B3:5473 E0 movx A, @DPTR
B3:5474 FF mov R7, A
B3:5475 E4 clr A
B3:5476 90 FB A4 mov DPTR, #XRAM_FBA4 ; OSD_Colors
B3:5479 F0 movx @DPTR, A
B3:547A A3 inc DPTR
B3:547B 74 02 mov A, #2
B3:547D F0 movx @DPTR, A ; Cor de contorno=0; cor de preenchimento = 2
B3:547E 7B 03 mov R3, #3 ; Cor de background
B3:5480 E4 clr A
B3:5481 FD mov R5, A
B3:5482 12 D4 73 lcall OSD_Text_Color
B3:5485 90 FB 8D mov DPTR, #XRAM_FB8D ; Guarda número da janela (OSD_TextInit)?
B3:5488 E0 movx A, @DPTR
B3:5489 FF mov R7, A
B3:548A E4 clr A
B3:548B FD mov R5, A
B3:548C 02 EF D7 ljmp OSD_Text_Init_End
B3:548F ; ---------------------------------------------------------------------------
Nós vamos mudar o trecho destacado em vermelho. As mudanças são sutis, mas todo o trecho precisa ser deslocado. O que é diferente mesmo está destacado em azul. O resto é o mesmo código, deslocado um byte para a frente.
B3:5475 74 03 mov A, #3
B3:5477 90 FB A4 mov DPTR, #XRAM_FBA4 ; OSD_Colors
B3:547A F0 movx @DPTR, A
B3:547B A3 inc DPTR
B3:547C 74 02 mov A, #2
B3:547E F0 movx @DPTR, A ; Cor de contorno=3; cor de preenchimento = 2
B3:547F E4 clr A
B3:5480 FB mov R3, A ; Cor de background=0
Depois disso, use o mtkWindows para desligar a transparência da janela 0x11 (blend=3) e troque as fontes 0xD e 0xF por fontes "normais" com contorno, como as usadas no Proview DVP-858 e no Lenoxx DV-406.
-
Cor de legenda selecionável para DVP5100
Eu não vou explicar aqui como é feita a parte do menu, porque eu não estou fazendo mods para DVP5100 e jmaraujo já sabe como fazer. Neste post eu explicarei apenas a mudança necessária no código assembly.
Note que tudo o que eu expliquei no post anterior vai ser descartado e refeito. A explicação anterior ajuda a entender o que é feito aqui, mas não é necessário fazer nada daquilo antes.
Os firmwares Philips tem um modo diferente de chamar a rotina OSD_TextColor. Enquanto a maioria dos firmwares coloca o número da janela explícitamente em R7, nos firmwares Philips isso é sempre indireto. No caso do Philips DVP5100 o número da janela fica guardado na variável XRAM_FB8D e o valor dessa variável é copiado para R7 sempre que queremos usar o número da janela.
No caso:
B3:545E 90 FB 8D mov DPTR, #XRAM_FB8D
B3:5461 E0 movx A, @DPTR
B3:5462 FF mov R7, A
Na Sub_Style_2 equivale a:
B3:545E 7F 11 Mov R7, #0x11
No meu entendimento não é necessário fazer esse rodeio todo e podemos ganhar vários bytes fazendo uma referência explicita ao número da janela, como esse rodeio é feito 4 vezes na rotina Sub_Style_2, podemos ganhar um monte de bytes:
B3:545E Sub_Style_2: ; DATA XREF: OSD_Text_Init+63o
B3:545E 90 FB 8D mov DPTR, #XRAM_FB8D ; Guarda número da janela (OSD_TextInit)?
B3:5461 E0 movx A, @DPTR
B3:5462 FF mov R7, A
B3:5463 D2 75 setb RAM_2E.5
B3:5465 12 28 F1 lcall OSD_Text_Params_ARM
B3:5468 90 FB 8D mov DPTR, #XRAM_FB8D ; Guarda número da janela (OSD_TextInit)?
B3:546B E0 movx A, @DPTR
B3:546C FF mov R7, A
B3:546D 12 68 22 lcall OSD_Text_Params
B3:5470 90 FB 8D mov DPTR, #XRAM_FB8D ; Guarda número da janela (OSD_TextInit)?
B3:5473 E0 movx A, @DPTR
B3:5474 FF mov R7, A
B3:5475 E4 clr A
B3:5476 90 FB A4 mov DPTR, #XRAM_FBA4 ; OSD_Colors
B3:5479 F0 movx @DPTR, A
B3:547A A3 inc DPTR
B3:547B 74 02 mov A, #2
B3:547D F0 movx @DPTR, A ; Cor de contorno=0; cor de preenchimento = 2
B3:547E 7B 03 mov R3, #3 ; Cor de background
B3:5480 E4 clr A
B3:5481 FD mov R5, A
B3:5482 12 D4 73 lcall OSD_Text_Color
B3:5485 90 FB 8D mov DPTR, #XRAM_FB8D ; Guarda número da janela (OSD_TextInit)?
B3:5488 E0 movx A, @DPTR
B3:5489 FF mov R7, A
B3:548A E4 clr A
B3:548B FD mov R5, A
B3:548C 02 EF D7 ljmp OSD_Text_Init_End
B3:548F ; ---------------------------------------------------------------------------
O ganho é suficiente para implementar a rotina que lê o valor da eeprom, sem precisar inserir código no firmware. E ainda sobra espaço!
Nota: Esse desperdício ocorre 50 vezes dentro do CASE de OSD_Text_Init. Dá para ganhar um total de 150 bytes nessa rotina, se um dia for necessário.
B3:545E Sub_Style_2: ; DATA XREF: OSD_Text_Init+63o
B3:545E 7F 11 mov R7, #0x11
B3:5460 D2 75 setb RAM_2E.5
B3:5462 12 28 F1 lcall OSD_Text_Params_ARM
B3:5462
B3:5465 7F 11 mov R7, #0x11
B3:5467 12 68 22 lcall OSD_Text_Params
B3:5467
B3:546A 00 nop
B3:546B 00 nop
B3:546C 00 nop
B3:546D 00 nop
B3:546E 00 nop
B3:546F 7F 06 mov R7, #6 ; Cor de Preenchimento=6 (azul)
B3:5471 90 FB A4 mov DPTR, #XRAM_FBA4 ; OSD_Colors
B3:5474 74 03 mov A, #3 ; Cor de Contorno=3 (preto)
B3:5476 F0 movx @DPTR, A
B3:5477 A3 inc DPTR
B3:5478 EF mov A, R7
B3:5479 F0 movx @DPTR, A
B3:547A E4 clr A
B3:547B FB mov R3, A
B3:547C FD mov R5, A
B3:547D 7F 11 mov R7, #0x11
B3:547F 12 D4 73 lcall OSD_Text_Color
B3:547F
B3:5482 7F 11 mov R7, #0x11
B3:5484 E4 clr A
B3:5485 FD mov R5, A
B3:5486 00 nop
B3:5487 00 nop
B3:5488 00 nop
B3:5489 00 nop
B3:548A 00 nop
B3:548B 00 nop
B3:548C 02 EF D7 ljmp OSD_Text_Init_End
B3:548C
B3:548F ; ---------------------------------------------------------------------------
Perceba o trecho destacado em vermelho. Nele eu estou definindo explicitamente a cor azul para as legendas, para facilitar os testes apenas (fica na cara que está funcionando). Quando você estiver certo de que está funcionando e já tiver o endereço de memória eeprom para usar, você vai substituir o trecho em vermelho por:
7F xx mov R7, #xx ;onde "xx" é o endereço de eeprom
7E 00 mov R6, #0
12 05 D7 lcall Pref_GetChar
Para inserir rapidamente minha modificação, em B3:545E, substitua:
90 FB 8D E0 FF D2 75 12 28 F1 90 FB 8D E0 FF 12 68 22 90 FB 8D E0 FF E4
90 FB A4 F0 A3 74 02 F0 7B 03 E4 FD 12 D4 73 90 FB 8D E0 FF E4 FD 02 EF D7
por:
7F 11 D2 75 12 28 F1 7F 11 12 68 22 00 00 00 00 00 7F 06 90 FB A4 74 03
F0 A3 EF F0 E4 FB FD 7F 11 12 D4 73 7F 11 E4 FD 00 00 00 00 00 00 02 EF D7
Tenha em mente que neste mod eu desligo o fundo e ativo a exibição do contorno, por isso desligue a transparência da janela 0x11 com o mtkWindows e substitua as fontes 0xD e 0xF por fontes "normais" com contorno.
-
Muito obrigado, Jefferson. :yahoo!: Ficou tudo muito claro. 8)
Vou testar e comentar aquí. ;)
-
Como criar seu próprio salto para outro banco
Um mês atrás, quando eu expliquei o básico sobre Bank Switching (http://ryan.com.br/smf/index.php?topic=179.msg9172043#msg9172043), ficou em aberto se seria possível criar nossos próprios saltos. Hoje eu consegui com sucesso fazer um.
Primeiro, você precisa descobrir qual a rotina que faz o "switch" para o banco que você deseja. Com a ajuda do IDA isso não é difícil. Por exemplo, se queremos saltar para uma rotina no banco 3 (exemplo do Philips DVP5960):
B0:2958 ; ---------------------------------------------------------------------------
B0:2958
B0:2958 B0_BS_688_B3_F49A:
B0:2958 90 F4 9A mov DPTR, #BankSw_688_B3_F49A
B0:295B 02 18 BF ljmp B0_Bank_3
B0:295E ; ---------------------------------------------------------------------------
B0:295E
B0:295E B0_BS_689_B3_AEB8:
B0:295E 90 AE B8 mov DPTR, #set_Volume_2
B0:2961 02 18 BF ljmp B0_Bank_3
B0:2964 ; ---------------------------------------------------------------------------
Então, se quisermos saltar para uma rotina no offset 5B99 do banco 3:
90 5B 99 mov DPTR, #5B99
02 18 BF ljmp B0_Bank_3
Essa rotina para onde você vai saltar precisa terminar com uma instrução RET
Em um outro post eu vou dar um exemplo de aplicação disto.
-
Cor de legenda selecionável para DVP5960
Para entender a teoria básica, leia o que já postei hoje sobre o DVP5100.
No caso do DVP5960 existe uma pequena diferença: Como existem duas rotinas Sub_Style as duas precisam ser modificadas.
Primeiro, Sub_Style_Sec:
B3:5B87 Sub_Style_Sec: ; DATA XREF: OSD_Text_Init+6Bo
B3:5B87 7F 12 mov R7, #0x12
B3:5B89 D2 75 setb RAM_2E.5
B3:5B8B 12 4C F4 lcall OSD_Text_Params_ARM
B3:5B8B
B3:5B8E 7F 12 mov R7, #0x12
B3:5B90 12 72 CE lcall OSD_Text_Params
B3:5B90
B3:5B93 12 5B 98 lcall B3_5B98
B3:5B93
B3:5B96 80 19 sjmp B3_5BB1
B3:5B96
B3:5B98 ; ---------------------------------------------------------------------------
B3:5B98
B3:5B98 B3_5B98: ; CODE XREF: OSD_Text_Init+2D9p
B3:5B98 00 nop
B3:5B99 00 nop
B3:5B9A 00 nop
B3:5B9B 00 nop
B3:5B9C 00 nop
B3:5B9D 7F 02 mov R7, #2 ; Preenchimento
B3:5B9F 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_Colors
B3:5BA2 74 03 mov A, #3 ; Contorno
B3:5BA4 F0 movx @DPTR, A
B3:5BA5 A3 inc DPTR
B3:5BA6 EF mov A, R7
B3:5BA7 F0 movx @DPTR, A ; Preenchimento=2, contorno=3
B3:5BA8 E4 clr A
B3:5BA9 FB mov R3, A
B3:5BAA FD mov R5, A
B3:5BAB 7F 12 mov R7, #0x12
B3:5BAD 12 C3 50 lcall OSD_Text_Color
B3:5BAD
B3:5BB0 22 ret
B3:5BB0
B3:5BB1 ; ---------------------------------------------------------------------------
B3:5BB1
B3:5BB1 B3_5BB1: ; CODE XREF: OSD_Text_Init+2DCj
B3:5BB1 7F 12 mov R7, #0x12
B3:5BB3 E4 clr A
B3:5BB4 FD mov R5, A
B3:5BB5 02 E4 1D ljmp OSD_Text_Init_End
B3:5BB5
B3:5BB8 ; ---------------------------------------------------------------------------
B3:5BB8
A string hexa, para poupar a digitação:
7F 12 D2 75 12 4C F4 7F 12 12 72 CE 12 5B 98 80 19 00 00 00 00 00 7F 02
90 FC 1E 74 03 F0 A3 EF F0 E4 FB FD 7F 12 12 C3 50 22 7F 12 E4 FD 02 E4 1D
Essa rotina segue o mesmo princípio da feita para o DVP5100, mas duas outras modificações foram necessárias para que eu possa aproveitá-la outra vez.
Agora, Sub_Style:
B1:D2BC Sub_Style: ; CODE XREF: B1_8883+5Cp
B1:D2BC EF mov A, R7
B1:D2BD 24 FE add A, #0xFE ; '¦'
B1:D2BF 60 5B jz B1_D31C
B1:D2BF
B1:D2C1 14 dec A
B1:D2C2 60 58 jz B1_D31C
B1:D2C2
B1:D2C4 14 dec A
B1:D2C5 60 61 jz B1_D328
B1:D2C5
B1:D2C7 24 03 add A, #3
B1:D2C9 70 60 jnz B1_D32B
B1:D2C9
B1:D2CB E4 clr A
B1:D2CC FF mov R7, A
B1:D2CD 12 1E EA lcall OSD_SetFont_B1BS
B1:D2CD
B1:D2D0 D2 75 setb RAM_2E.5
B1:D2D2 7F 12 mov R7, #0x12
B1:D2D4 12 1D 6A lcall OSD_Text_Params_ARM_B1BS
B1:D2D4
B1:D2D7 7F 12 mov R7, #0x12
B1:D2D9 12 1D 70 lcall OSD_Text_Params_B1BS
B1:D2D9
B1:D2DC 90 5B 99 mov DPTR, #0x5B99
B1:D2DF 02 18 BF ljmp B1_Bank_3
B1:D2DF
B1:D2DF ; ---------------------------------------------------------------------------
B1:D2E2 00 .byte 0
B1:D2E3 00 .byte 0
B1:D2E4 00 .byte 0
B1:D2E5 00 .byte 0
B1:D2E6 00 .byte 0
B1:D2E7 00 .byte 0
B1:D2E8 00 .byte 0
B1:D2E9 00 .byte 0
B1:D2EA 00 .byte 0
B1:D2EB 00 .byte 0
B1:D2EC 00 .byte 0
B1:D2ED 00 .byte 0
B1:D2EE ; ---------------------------------------------------------------------------
B1:D2EE E4 clr A
B1:D2EF FD mov R5, A
B1:D2F0 7F 12 mov R7, #0x12
B1:D2F2 12 1F 50 lcall OSD_Text_Init_End_B1BS
Note que eu uso aqui o método explicado no post anterior de criar um salto particular para outro banco. Se eu não fizesse dessa forma, precisaria inserir código em algum lugar. Assim só precisei mudar código já existente, o que torna o patch mais fácil de aplicar, embora um pouco mias difícil de entender.
Eu testei no DVP5960 que está comigo, e funciona como esperado. Em tese dá para fazer a mesma coisa no DVP5965, apenas mudando alguns endereços.
-
A esquisita troca de fontes do DVP5960/DVP5965
Eu já havia descoberto em julho que o DVP5960 tem o estranho problema de começar executando um DivX com a fonte 1, mas ao entrar e sair do do setup passar a usar a fonte 7.
Acabei de descobrir onde isso ocorre.
Tanto no DVP5960 quanto no DVP5965 existe previsão em parte do assembly para se usar até 4 fontes diferentes para legendas DivX. Mas todas as opções foram travadas em uma fonte só: a sete.
Porém não há como ativar isso facilmente, porque estranhamente o menu desses aparelhos não permite a seleção: o item existe no menu, mas só existe uma opção.
(http://ryan.com.br/imagens/dvp5960/dvp5960_setup_divxsubtitle_320(50).jpg)
Tremenda "gambiarra" da Philips. Quiseram "matar" as opções de fonte, mas tiveram preguiça de remover o item no menu, que agora não serve para nada, provavelmente porque isso iria requerer mais modificações no programa para não ler nada da eeprom.
Esta é a rotina que lê o valor da eeprom e seleciona a fonte de acordo (somente ao sair do setup):
B1:E5B3 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:E5B3
B1:E5B3
B1:E5B3 BankSw_681_B1_E5B3: ; DATA XREF: B0:B0_BS_681_B1_E5B3o
B1:E5B3 ; B1:B1_BS_681_B1_E5B3o ...
B1:E5B3 7F E2 mov R7, #0xE2 ; 'Ô'
B1:E5B5 7E 07 mov R6, #7
B1:E5B7 12 1B 96 lcall ARM_GetChar_B1_BS
B1:E5BA BF 01 05 cjne R7, #1, B1_E5C2
B1:E5BD D2 74 setb RAM_2E.4
B1:E5BF 12 1D 2E lcall B1_BS_169_B4_AB59
B1:E5C2
B1:E5C2 B1_E5C2: ; CODE XREF: BankSw_681_B1_E5B3+7j
B1:E5C2 7F 44 mov R7, #0x44 ; 'D' ; Verifica o valor de "DivX Subtitle" na eeprom (sempre "0")
B1:E5C4 7E 00 mov R6, #0
B1:E5C6 12 1B A2 lcall Pref_GetChar_B1BS
B1:E5C9 BF 01 07 cjne R7, #1, B1_E5D3
B1:E5CC 7F 0B mov R7, #0xB ; Se for "1" (nunca é)
B1:E5CE 12 1E EA lcall OSD_SetFont_B1_BS
B1:E5D1 80 27 sjmp B1_E5FA
B1:E5D3 ; ---------------------------------------------------------------------------
B1:E5D3
B1:E5D3 B1_E5D3: ; CODE XREF: BankSw_681_B1_E5B3+16j
B1:E5D3 7F 44 mov R7, #0x44 ; 'D'
B1:E5D5 7E 00 mov R6, #0
B1:E5D7 12 1B A2 lcall Pref_GetChar_B1BS
B1:E5DA EF mov A, R7
B1:E5DB 70 07 jnz B1_E5E4
B1:E5DD 7F 0B mov R7, #0xB ; Se for "0" (sempre é)
B1:E5DF 12 1E EA lcall OSD_SetFont_B1_BS
B1:E5E2 80 16 sjmp B1_E5FA
B1:E5E4 ; ---------------------------------------------------------------------------
B1:E5E4
B1:E5E4 B1_E5E4: ; CODE XREF: BankSw_681_B1_E5B3+28j
B1:E5E4 7F 44 mov R7, #0x44 ; 'D'
B1:E5E6 7E 00 mov R6, #0
B1:E5E8 12 1B A2 lcall Pref_GetChar_B1BS
B1:E5EB BF 02 07 cjne R7, #2, B1_E5F5
B1:E5EE 7F 0B mov R7, #0xB ; Se for "2" (nunca é)
B1:E5F0 12 1E EA lcall OSD_SetFont_B1_BS
B1:E5F3 80 05 sjmp B1_E5FA
B1:E5F5 ; ---------------------------------------------------------------------------
B1:E5F5
B1:E5F5 B1_E5F5: ; CODE XREF: BankSw_681_B1_E5B3+38j
B1:E5F5 7F 0B mov R7, #0xB ; Se for qualquer valor maior que "2" (nunca é)
B1:E5F7 12 1E EA lcall OSD_SetFont_B1_BS
B1:E5FA
B1:E5FA B1_E5FA: ; CODE XREF: BankSw_681_B1_E5B3+1Ej
B1:E5FA ; BankSw_681_B1_E5B3+2Fj ...
B1:E5FA 7F 12 mov R7, #0x12
B1:E5FC 12 1D 7C lcall OSD_Text_Init_B1BS
B1:E5FF 7F 12 mov R7, #0x12
B1:E601 02 1D 82 ljmp B1_BS_183_B3_E8F5
B1:E601 ; End of function BankSw_681_B1_E5B3
Basta mudar a linha em vermelho para escolher a fonte que você quiser. Por exemplo, para usar a fonte 2:
B1:E5DD 7F 02 mov R7, #0x2
Note a forma tortuosa como é feita a seleção de fontes. Não seria necessário fazer tantas leituras no valor da eeprom se a Philips armazenasse lá diretamente o número da fonte, como eu fiz no meu firmware experimental para o Proview. Essas leituras e comparações só são necessárias porque a Philips quer armazenar na eeprom os valores 0, 1, 2... mesmo que as fontes não tenham esses números.
Essa forma tortuosa de escolher a fonte também é usada na Sub_Style do DVP5100, mas falarei mais sobre isso em outro post.
Modificando isto e fazendo uma modificação correspondente na sub_style você pode ter finalmente uma fonte exclusiva para legendas DivX no DVP5960/DVP6965
A rotina acima, no DVP5965:
B1:E60B ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:E60B
B1:E60B
B1:E60B BankSw_681_B1_E60B: ; DATA XREF: B0:B0_BS_681_B1_E60Bo
B1:E60B ; B1:B1_BS_681_B1_E60Bo ...
B1:E60B 7F E2 mov R7, #0xE2 ; 'Ô'
B1:E60D 7E 07 mov R6, #7
B1:E60F 12 1B 84 lcall ARM_GetChar_B1_BS
B1:E612 BF 01 05 cjne R7, #1, B1_E61A
B1:E615 D2 74 setb RAM_2E.4
B1:E617 12 1D 1C lcall B1_BS_166_B4_ABBB
B1:E61A
B1:E61A B1_E61A: ; CODE XREF: BankSw_681_B1_E60B+7j
B1:E61A 7F 44 mov R7, #0x44 ; 'D' ; Verifica o valor de "DivX Subtitle" na eeprom (sempre "0")
B1:E61C 7E 00 mov R6, #0
B1:E61E 12 1B 90 lcall Pref_GetChar_B1BS
B1:E621 BF 01 07 cjne R7, #1, B1_E62B
B1:E624 7F 0B mov R7, #0xB ; Se for "1" (nunca é)
B1:E626 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E629 80 27 sjmp B1_E652
B1:E62B ; ---------------------------------------------------------------------------
B1:E62B
B1:E62B B1_E62B: ; CODE XREF: BankSw_681_B1_E60B+16j
B1:E62B 7F 44 mov R7, #0x44 ; 'D' ; Verifica o valor de "DivX Subtitle" na eeprom (sempre "0")
B1:E62D 7E 00 mov R6, #0
B1:E62F 12 1B 90 lcall Pref_GetChar_B1BS
B1:E632 EF mov A, R7
B1:E633 70 07 jnz B1_E63C
B1:E635 7F 0B mov R7, #0xB ; Se for "0" (sempre é)
B1:E637 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E63A 80 16 sjmp B1_E652
B1:E63C ; ---------------------------------------------------------------------------
B1:E63C
B1:E63C B1_E63C: ; CODE XREF: BankSw_681_B1_E60B+28j
B1:E63C 7F 44 mov R7, #0x44 ; 'D' ; Verifica o valor de "DivX Subtitle" na eeprom (sempre "0")
B1:E63E 7E 00 mov R6, #0
B1:E640 12 1B 90 lcall Pref_GetChar_B1BS
B1:E643 BF 02 07 cjne R7, #2, B1_E64D
B1:E646 7F 0B mov R7, #0xB ; Se for "2" (nunca é)
B1:E648 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E64B 80 05 sjmp B1_E652
B1:E64D ; ---------------------------------------------------------------------------
B1:E64D
B1:E64D B1_E64D: ; CODE XREF: BankSw_681_B1_E60B+38j
B1:E64D 7F 0B mov R7, #0xB ; Se for qualquer valor maior que "2" (nunca é)
B1:E64F 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E652
B1:E652 B1_E652: ; CODE XREF: BankSw_681_B1_E60B+1Ej
B1:E652 ; BankSw_681_B1_E60B+2Fj ...
B1:E652 7F 12 mov R7, #0x12
B1:E654 12 1D 6A lcall OSD_Text_Init_B1BS
B1:E657 7F 12 mov R7, #0x12
B1:E659 02 1D 70 ljmp B1_BS_180_B3_E9AF
B1:E659 ; End of function BankSw_681_B1_E60B
-
Otimizando a Sub_Style do DVP5100
Neste post eu vou explicar parte do que é necessário para ultrapassar o limite de duas fontes selecionáveis pelo menu do DVP5100.
Sub_Style original
B1:CF79 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:CF79
B1:CF79
B1:CF79 SUB_Style: ; CODE XREF: B1_DBA6+3Ep
B1:CF79 90 FB 60 mov DPTR, #XRAM_FB60
B1:CF7C EE mov A, R6
B1:CF7D F0 movx @DPTR, A
B1:CF7E A3 inc DPTR
B1:CF7F EF mov A, R7
B1:CF80 F0 movx @DPTR, A
B1:CF81 7F 03 mov R7, #3
B1:CF83 12 07 21 lcall B1_BS_180_B3_11FC
B1:CF86 7F 01 mov R7, #1
B1:CF88 12 07 21 lcall B1_BS_180_B3_11FC
B1:CF8B 7F 03 mov R7, #3
B1:CF8D 12 F1 84 lcall B1_F184
B1:CF90 7B FF mov R3, #0xFF
B1:CF92 7D EB mov R5, #0xEB ; 'Ù'
B1:CF94 7C 01 mov R4, #1
B1:CF96 74 01 mov A, #1
B1:CF98 FF mov R7, A
B1:CF99 FE mov R6, A
B1:CF9A 12 06 5B lcall OSD_DispMSG2_B1BS
B1:CF9D 7F 0E mov R7, #0xE
B1:CF9F 12 06 FD lcall B1_BS_174_B4_E80B
B1:CFA2 7F 59 mov R7, #0x59 ; 'Y' ; Lê o valor de "DivX Subtitle" na eeprom
B1:CFA4 7E 00 mov R6, #0
B1:CFA6 12 05 D7 lcall Pref_Getchar_B1BS
B1:CFA9 BF 01 07 cjne R7, #1, B1_CFB3
B1:CFAC 7F 0F mov R7, #0xF ; Se for 1, uso a fonte 0xF
B1:CFAE 12 08 59 lcall Sub_SetFont_B1BS
B1:CFB1 80 27 sjmp B1_CFDA
B1:CFB3 ; ---------------------------------------------------------------------------
B1:CFB3
B1:CFB3 B1_CFB3: ; CODE XREF: SUB_Style+30j
B1:CFB3 7F 59 mov R7, #0x59 ; 'Y' ; Lê o valor de "DivX Subtitle" na eeprom
B1:CFB5 7E 00 mov R6, #0
B1:CFB7 12 05 D7 lcall Pref_Getchar_B1BS
B1:CFBA EF mov A, R7
B1:CFBB 70 07 jnz B1_CFC4
B1:CFBD 7F 0D mov R7, #0xD ; Se for 0, uso a fonte 0xD
B1:CFBF 12 08 59 lcall Sub_SetFont_B1BS
B1:CFC2 80 16 sjmp B1_CFDA
B1:CFC4 ; ---------------------------------------------------------------------------
B1:CFC4
B1:CFC4 B1_CFC4: ; CODE XREF: SUB_Style+42j
B1:CFC4 7F 59 mov R7, #0x59 ; 'Y' ; Lê o valor de "DivX Subtitle" na eeprom
B1:CFC6 7E 00 mov R6, #0
B1:CFC8 12 05 D7 lcall Pref_Getchar_B1BS
B1:CFCB BF 02 07 cjne R7, #2, B1_CFD5
B1:CFCE 7F 11 mov R7, #0x11 ; Se for 2, uso a fonte 0x11
B1:CFD0 12 08 59 lcall Sub_SetFont_B1BS
B1:CFD3 80 05 sjmp B1_CFDA
B1:CFD5 ; ---------------------------------------------------------------------------
B1:CFD5
B1:CFD5 B1_CFD5: ; CODE XREF: SUB_Style+52j
B1:CFD5 7F 0D mov R7, #0xD ; Se for maior que 2, uso a fonte 0xD
B1:CFD7 12 08 59 lcall Sub_SetFont_B1BS
B1:CFDA
B1:CFDA B1_CFDA: ; CODE XREF: SUB_Style+38j
B1:CFDA ; SUB_Style+49j ...
B1:CFDA 7F 11 mov R7, #0x11
B1:CFDC 12 08 23 lcall OSD_TextInit_B1BS
B1:CFDF 7F 11 mov R7, #0x11
B1:CFE1 12 08 29 lcall B1_BS_224_B3_F310
B1:CFE4 22 ret
B1:CFE4 ; End of function SUB_Style
No meu post anterior eu comentei o jeito tortuoso da Philips de fazer a seleção de fontes. Note que mais da metade da rotina acima é dedicada apenas a escolher uma entre 4 fontes possíveis, embora no menu do DVP5100 só existam duas opções.
(http://ryan.com.br/imagens/dvp5100/dvp5100_setup_divxsubtitle_320(50).jpg)
Primeiro mude o menu para que carregue na eeprom diretamente os números das fontes
Substitua:
04BE 04BE 0561 00 0507 0507 0561 01
por
04BE 04BE 0561 0D 0507 0507 0561 0F
Nota: Talvez as strings acima só existam no firmware original, que usa as palavras "standard" e "cyrilic". Os firmwares já modificados trocaram isso por algo como "font 1" e "font 2"
Na primeira vez que você usar o menu depois disso vai haver um comportamento estranho, mas funcionará.
Depois faça a alteração na Sub_Style:
B1:CF79 Sub_Style: ; CODE XREF: B1_DBA6+3Ep
B1:CF79 90 FB 60 mov DPTR, #XRAM_FB60
B1:CF7C EE mov A, R6
B1:CF7D F0 movx @DPTR, A
B1:CF7E A3 inc DPTR
B1:CF7F EF mov A, R7
B1:CF80 F0 movx @DPTR, A
B1:CF81 7F 03 mov R7, #3
B1:CF83 12 07 21 lcall B1_BS_180_B3_11FC
B1:CF83
B1:CF86 7F 01 mov R7, #1
B1:CF88 12 07 21 lcall B1_BS_180_B3_11FC
B1:CF88
B1:CF8B 7F 03 mov R7, #3
B1:CF8D 12 F1 84 lcall B1_F184
B1:CF8D
B1:CF90 7B FF mov R3, #0xFF
B1:CF92 7D EB mov R5, #0xEB ; 'Ù'
B1:CF94 7C 01 mov R4, #1
B1:CF96 74 01 mov A, #1
B1:CF98 FF mov R7, A
B1:CF99 FE mov R6, A
B1:CF9A 12 06 5B lcall OSD_DispMSG2_B1BS
B1:CF9A
B1:CF9D 7F 0E mov R7, #0xE
B1:CF9F 12 06 FD lcall B1_BS_174_B4_E80B
B1:CF9F
B1:CFA2 7F 59 mov R7, #0x59 ; 'Y' ; Lê o valor de "DivX Subtitle" na eeprom
B1:CFA4 7E 00 mov R6, #0
B1:CFA6 12 05 D7 lcall Pref_Getchar_B1BS
B1:CFA6
B1:CFA9 12 08 59 lcall Sub_SetFont_B1BS ; Uso diretamente o valor armazenado na eeprom
B1:CFA9 ; para definir a fonte. Lembre-se de que Pref_Getchar
B1:CFA9 ; devolve o valor em R7 e que Sub_SetFont recebe
B1:CFA9 ; o valor também em R7. Daí é possível cascatear
B1:CFA9 ; as rotinas.
B1:CFAC 00 nop
B1:CFAD 00 nop
B1:CFAE 00 nop
B1:CFAF 00 nop
B1:CFB0 00 nop
B1:CFB1 00 nop
B1:CFB2 00 nop
B1:CFB3 00 nop
B1:CFB4 00 nop
B1:CFB5 00 nop
B1:CFB6 00 nop
B1:CFB7 00 nop
B1:CFB8 00 nop
B1:CFB9 00 nop
B1:CFBA 00 nop
B1:CFBB 00 nop
B1:CFBC 00 nop
B1:CFBD 00 nop
B1:CFBE 00 nop
B1:CFBF 00 nop
B1:CFC0 00 nop
B1:CFC1 00 nop
B1:CFC2 00 nop
B1:CFC3 00 nop
B1:CFC4 00 nop
B1:CFC5 00 nop
B1:CFC6 00 nop
B1:CFC7 00 nop
B1:CFC8 00 nop
B1:CFC9 00 nop
B1:CFCA 00 nop
B1:CFCB 00 nop
B1:CFCC 00 nop
B1:CFCD 00 nop
B1:CFCE 00 nop
B1:CFCF 00 nop
B1:CFD0 00 nop
B1:CFD1 00 nop
B1:CFD2 00 nop
B1:CFD3 00 nop
B1:CFD4 00 nop
B1:CFD5 00 nop
B1:CFD6 00 nop
B1:CFD7 00 nop
B1:CFD8 00 nop
B1:CFD9 00 nop
B1:CFDA 7F 11 mov R7, #0x11
B1:CFDC 12 08 23 lcall OSD_TextInit_B1BS
B1:CFDC
B1:CFDF 7F 11 mov R7, #0x11
B1:CFE1 12 08 29 lcall B1_BS_224_B3_F310
B1:CFE1
B1:CFE4 22 ret
As únicas diferenças estão destacadas em vermelho.
Parece difícil de acreditar que funcione do mesmo jeito com tantas instruções a menos, mas funciona!
Para ter mais fontes no menu, tudo o que você precisa é criar um novo menu com as novas opções e adcionar mais fontes ao firmware (ou trocar aquelas em chinês, japonês ou sei lá o quê). Não é preciso mudar mais nada em Sub_Style para acomodar quantas fontes você quiser.
-
:yahoo!: Funcionou perfeitamente. Agora o firmware permite a troca das cores (14 cores) e fontes (8 fontes). Obrigadão mesmo!!! ;D
Mais tarde vou postear alguma fotografía e nos próximos días postearei o firmware (alternativo 2.3) aquí no fórum.
Um abraço,
jmaraujo
-
Olá, Jefferson. O menú de escolha de cores está funcionando perfeitamente... Já com as fontes estou tendo um comportamente meio esquisito: Se você trocar a fonte mais de duas vezes a fonte começa a ficar sempre a mesma (e algumas vezes o player trava produzindo um som bem agudo nos altofalantes).
Por agora estou usando 3 fontes (uma a mais que o firmware original) trocando o byte 11 por o valor de uma nova fonte inserida:
B1:CFC4 B1_CFC4: ; CODE XREF: SUB_Style+42j
B1:CFC4 7F 59 mov R7, #0x59 ; 'Y' ; Lê o valor de "DivX Subtitle" na eeprom
B1:CFC6 7E 00 mov R6, #0
B1:CFC8 12 05 D7 lcall Pref_Getchar_B1BS
B1:CFCB BF 02 07 cjne R7, #2, B1_CFD5
B1:CFCE 7F 11 mov R7, #0x11 ; Se for 2, uso a fonte 0x11
B1:CFD0 12 08 59 lcall Sub_SetFont_B1BS
B1:CFD3 80 05 sjmp B1_CFDA
Vou ver se hoje a noite adiciono algumas fontes mais, usando esse mesmo padrão.
Algumas fotografías do firmware:
(http://img228.imageshack.us/img228/8696/menucu7.jpg) (http://img168.imageshack.us/img168/4677/color1jt2.jpg)
(http://img168.imageshack.us/img168/8872/color2yq0.jpg) (http://img168.imageshack.us/img168/8397/color3jj8.jpg)
(http://img168.imageshack.us/img168/1781/color4ts7.jpg) (http://img168.imageshack.us/img168/6264/color5db8.jpg)
-
Anexe o firmware com o problema das fontes para que eu possa testar aqui.
-
Anexe o firmware com o problema das fontes para que eu possa testar aqui.
Já vou anexar (tenho que ver qual exatamente é o arquivo do problema), mas básicamente o que eu fiz foi:
* Fazer um call para Sub_SetFont e nopear parte da rutina substyle (de CFAC a CFD9).
* Adicionar fontes mantendo a estrutura (a fonte dos ícones continúa sendo 0x0C).
* Fontes: 00 (também usada pelo filebrowser), 02, 04, 06, 08, 0A, 0C (incambiada, ícones), 0D e 0F).
* Criar um menú para as fontes usando como opção os valores das fontes.
Novo menú:
1. No Pic. | Subtitle font | Set the subtitle font
0008 FFFF 056A 05B3 0059 0000 0007 000D FFF8E7 0000 - ROM:F8B4
=> 1. Font 1 | Font 1 | [00]
05A0 05A0 0561 0D - ROM:F8A0
2. Font 2 | Font 2 | [00]
05A1 05A1 0561 0F - ROM:F8A7
3. Font 3 | Font 3 | [00]
05B0 05B0 0561 02 - ROM:FBFC
4. Font 4 | Font 4 | [00]
05B1 05B1 0561 04 - ROM:FC03
5. Font 5 | Font 5 | [00]
05B4 05B4 0561 06 - ROM:FC0A
6. Font 6 | Font 6 | [00]
05B5 05B5 0561 08 - ROM:FC11
7. Font 7 | Font 7 | [00]
05B6 05B6 0561 0A - ROM:FC18
8. Font 8 | Font 8 | [00]
05B7 05B7 0561 00 - ROM:FC1F
Nos próximos minutos estarei anexando o firmware para analise.
Editado por Jefferson: Eu modifiquei seu post em vez de responder. Tive que refazer a partir de uma cópia.
-
jmaraujo,
Eu ainda não chequei o firmware que você me mandou por PM, mas eu acho que sei o que pode estar havendo.
Existe outra rotina no firmware DVP5100 que seleciona a fonte baseado no valor da eeprom:
B1:DFEA ; START OF FUNCTION CHUNK FOR BankSw_337_B1_F2FD
B1:DFEA
B1:DFEA B1_DFEA: ; CODE XREF: BankSw_337_B1_F2FD:B1_F317j
B1:DFEA 7F E2 mov R7, #0xE2 ; 'Ô'
B1:DFEC 7E 07 mov R6, #7
B1:DFEE 12 04 7B lcall ARM_Getchar_B1BS
B1:DFF1 BF 01 05 cjne R7, #1, B1_DFF9
B1:DFF4 D2 74 setb RAM_2E.4
B1:DFF6 12 A1 CD lcall BankSw_578_B1_A1CD
B1:DFF9
B1:DFF9 B1_DFF9: ; CODE XREF: BankSw_337_B1_F2FD-130Cj
B1:DFF9 7F 59 mov R7, #0x59 ; 'Y' ; Lê o valor de "DivX Subtitle" na eeprom
B1:DFFB 7E 00 mov R6, #0
B1:DFFD 12 05 D7 lcall Pref_Getchar_B1BS
B1:E000 BF 01 07 cjne R7, #1, B1_E00A
B1:E003 7F 0F mov R7, #0xF ; Se for 1, uso a fonte 0xF
B1:E005 12 08 59 lcall Sub_SetFont_B1BS
B1:E008 80 27 sjmp B1_E031
B1:E00A ; ---------------------------------------------------------------------------
B1:E00A
B1:E00A B1_E00A: ; CODE XREF: BankSw_337_B1_F2FD-12FDj
B1:E00A 7F 59 mov R7, #0x59 ; 'Y' ; Lê o valor de "DivX Subtitle" na eeprom
B1:E00C 7E 00 mov R6, #0
B1:E00E 12 05 D7 lcall Pref_Getchar_B1BS
B1:E011 EF mov A, R7
B1:E012 70 07 jnz B1_E01B
B1:E014 7F 0D mov R7, #0xD ; Se for 0, uso a fonte 0xD
B1:E016 12 08 59 lcall Sub_SetFont_B1BS
B1:E019 80 16 sjmp B1_E031
B1:E01B ; ---------------------------------------------------------------------------
B1:E01B
B1:E01B B1_E01B: ; CODE XREF: BankSw_337_B1_F2FD-12EBj
B1:E01B 7F 59 mov R7, #0x59 ; 'Y' ; Lê o valor de "DivX Subtitle" na eeprom
B1:E01D 7E 00 mov R6, #0
B1:E01F 12 05 D7 lcall Pref_Getchar_B1BS
B1:E022 BF 02 07 cjne R7, #2, B1_E02C
B1:E025 7F 11 mov R7, #0x11 ; Se for 2, uso a fonte 0x11
B1:E027 12 08 59 lcall Sub_SetFont_B1BS
B1:E02A 80 05 sjmp B1_E031
B1:E02C ; ---------------------------------------------------------------------------
B1:E02C
B1:E02C B1_E02C: ; CODE XREF: BankSw_337_B1_F2FD-12DBj
B1:E02C 7F 0D mov R7, #0xD ; Se for maior que 2, uso a fonte 0xD
B1:E02E 12 08 59 lcall Sub_SetFont_B1BS
B1:E031
B1:E031 B1_E031: ; CODE XREF: BankSw_337_B1_F2FD-12F5j
B1:E031 ; BankSw_337_B1_F2FD-12E4j ...
B1:E031 7F 11 mov R7, #0x11
B1:E033 12 08 23 lcall OSD_TextInit_B1BS
B1:E036 7F 11 mov R7, #0x11
B1:E038 02 08 29 ljmp B1_BS_224_B3_F310
B1:E038 ; END OF FUNCTION CHUNK FOR BankSw_337_B1_F2FD
A rotina acima é exatamente igual, byte por byte, à que existe em Sub_Style.
String hexa:
7F 59 7E 00 12 05 D7 BF 01 07 7F 0F 12 08 59 80 27 7F 59 7E 00 12 05 D7 EF 70 07 7F 0D 12 08 59 80 16 7F 59 7E 00 12 05 D7 BF 02 07 7F 11 12 08 59 80 05 7F 0D 12 08 59 7F 11 12 08 23 7F 11 02 08 29
Substitua por:
7F 59 7E 00 12 05 D7 12 08 59 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7F 11 12 08 23 7F 11 12 08 29
Se meu palpite estiver correto, é quando esta rotina é chamada que o firmware trava. E estudando as condições do travamento poderemos saber em que condições essa rotina é chamada..
E fazer o mesmo patch da Sub_Style aqui deve resolver o problema.
Essa duplicidade de rotinas também ocorre no DVP5960/DVP5965.
-
Está parecendo que esta segunda rotina é chamada quando entramos e saímos do setup apenas.
-
Confirmado. A rotina é mesmo executada quando você entra e sai do setup.
Eu fiz o patch aqui e parece estar OK. Se bem que mesmo antes de fazer o patch eu não consegui fazer travar nenhuma vez.
Mas como a rotina é chamada ao sair do setup e na modificação existiam valores maiores que 1 na eeprom, ao passar por essa rotina estavam sendo chamadas as fontes 0xD (inválida para legendas) e 0x11 (inexistente) dependendo da fonte escolhida no setup.
-
Finalmente, Sub_Style do DVP-3040K
B1:EDC3 Sub_Style: ; CODE XREF: B1_DD81+3Ep
B1:EDC3 90 FB 46 mov DPTR, #XRAM_FB46
B1:EDC6 EE mov A, R6
B1:EDC7 F0 movx @DPTR, A
B1:EDC8 A3 inc DPTR
B1:EDC9 EF mov A, R7
B1:EDCA F0 movx @DPTR, A
B1:EDCB 7F 03 mov R7, #3
B1:EDCD 12 07 15 lcall B1_BS_178_B3_4B4F
B1:EDD0 7F 01 mov R7, #1
B1:EDD2 12 07 15 lcall B1_BS_178_B3_4B4F
B1:EDD5 7F 03 mov R7, #3
B1:EDD7 12 F3 52 lcall B1_F352
B1:EDDA 7B FF mov R3, #0xFF
B1:EDDC 7D EB mov R5, #0xEB ; 'Ù'
B1:EDDE 7C 01 mov R4, #1
B1:EDE0 74 01 mov A, #1
B1:EDE2 FF mov R7, A
B1:EDE3 FE mov R6, A
B1:EDE4 12 06 5B lcall OSD_DISpMSG2_B1BS
B1:EDE7 7F 0E mov R7, #0xE
B1:EDE9 12 06 F1 lcall B1_BS_172_B4_EE0F
B1:EDEC 12 D4 17 lcall SetMeg4SubtitleParams
B1:EDEF 7F 11 mov R7, #0x11
B1:EDF1 12 08 17 lcall OSD_TextInit_B1BS
B1:EDF4 7F 11 mov R7, #0x11
B1:EDF6 12 08 1D lcall B1_BS_222_B3_EFBB
B1:EDF9 22 ret
B1:EDF9 ; End of function Sub_Style
Note a chamada para SetMeg4SubtitleParams.
Agora, o complemento (Sub_Style_2) em OSD_Text_Init:
B3:593C Sub_Style_2: ; DATA XREF: OSD_Text_Init+63o
B3:593C 90 FB 88 mov DPTR, #XRAM_FB88 ; FB88 sempre será 11 nesta rotina
B3:593F E0 movx A, @DPTR
B3:5940 FF mov R7, A
B3:5941 D2 45 setb RAM_28.5
B3:5943 12 28 40 lcall OSD_Text_Params_ARM
B3:5946 90 FB 88 mov DPTR, #XRAM_FB88 ; Armazena o número da janela (OSD_Text_Init)
B3:5949 E0 movx A, @DPTR
B3:594A FF mov R7, A
B3:594B 12 6C EF lcall OSD_Text_Params
B3:594E 90 FB 88 mov DPTR, #XRAM_FB88 ; Armazena o número da janela (OSD_Text_Init)
B3:5951 E0 movx A, @DPTR
B3:5952 FF mov R7, A
B3:5953 E4 clr A
B3:5954 90 FB A5 mov DPTR, #XRAM_FBA5 ; OSD_Colors
B3:5957 F0 movx @DPTR, A
B3:5958 A3 inc DPTR
B3:5959 74 02 mov A, #2
B3:595B F0 movx @DPTR, A
B3:595C 7B 03 mov R3, #3
B3:595E E4 clr A
B3:595F FD mov R5, A
B3:5960 12 D1 B9 lcall OSD_Text_Color
B3:5963 90 FB 88 mov DPTR, #XRAM_FB88 ; Armazena o número da janela (OSD_Text_Init)
B3:5966 E0 movx A, @DPTR
B3:5967 FF mov R7, A
B3:5968 E4 clr A
B3:5969 FD mov R5, A
B3:596A 02 EC 82 ljmp OSD_TextInit_END
Note que é a mesma rotina encontrada no DVP5100. Eu já testei o suporte ao patch para a mudança de cor da fonte e funcionou como esperado. Mudando esta rotina podemos ter fontes normais também para o DVP_3040K.
Sub_Style chama uma versão estranha de SetMpeg4SubtitleParams, que é uma mistura da rotina que já conhecemos, com as rotinas de escolha de fontes da Philips:
B1:D417 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:D417
B1:D417
B1:D417 SetMeg4SubtitleParams: ; CODE XREF: Sub_Style+29p
B1:D417 ; BankSw_335_B1_F4CB:B1_F7D9p
B1:D417 E4 clr A
B1:D418 90 FB ED mov DPTR, #XRAM_FBED ; Coordenada Horizontal (HI)
B1:D41B F0 movx @DPTR, A
B1:D41C A3 inc DPTR
B1:D41D F0 movx @DPTR, A
B1:D41E 90 FB F0 mov DPTR, #XRAM_FBF0 ; Coordenada Vertical (HI)
B1:D421 F0 movx @DPTR, A
B1:D422 A3 inc DPTR
B1:D423 F0 movx @DPTR, A
B1:D424 90 FB F4 mov DPTR, #XRAM_FBF4 ; wX2.high
B1:D427 74 02 mov A, #2
B1:D429 F0 movx @DPTR, A
B1:D42A A3 inc DPTR
B1:D42B 74 30 mov A, #0x30 ; '0' ; 0x230=560
B1:D42D F0 movx @DPTR, A
B1:D42E 90 FB F8 mov DPTR, #XRAM_FBF8 ; wY2.high (define a altura)
B1:D431 E4 clr A
B1:D432 F0 movx @DPTR, A
B1:D433 A3 inc DPTR
B1:D434 74 60 mov A, #0x60 ; '`' ; Altura da janela
B1:D436 F0 movx @DPTR, A
B1:D437 E4 clr A
B1:D438 FD mov R5, A
B1:D439 7F 17 mov R7, #0x17
B1:D43B 7E 01 mov R6, #1
B1:D43D 12 05 F5 lcall ARM_PutChar_B1BS
B1:D440 7F 03 mov R7, #3 ; Este ponto define a fonte usada nas legendas
B1:D442 12 08 4D lcall OSD_SetFont?_B1BS
B1:D445 E4 clr A
B1:D446 90 FB 5F mov DPTR, #XRAM_FB5F ; Espaço entre linhas
B1:D449 F0 movx @DPTR, A
B1:D44A 7B 09 mov R3, #9 ; 9=Todos 256 caracteres + Bottom align
B1:D44C 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro), 0x02 (Direita)
B1:D44E 7F 11 mov R7, #0x11 ; Janela da legenda
B1:D450 12 92 42 lcall PSB_Set_Param
B1:D453 7F 59 mov R7, #0x59 ; 'Y' ; Verifica "DivX Subtitle" na eeprom
B1:D455 7E 00 mov R6, #0
B1:D457 12 04 E7 lcall Pref_Getchar_B1BS
B1:D45A EF mov A, R7 ; A sempre será zero
B1:D45B 24 FE add A, #0xFE ; '¦'
B1:D45D 60 11 jz B1_D470 ; Dependendo da fonte, faria uma outra escolha de parâmetros
B1:D45F 14 dec A
B1:D460 60 09 jz B1_D46B
B1:D462 24 02 add A, #2
B1:D464 70 18 jnz B1_D47E
B1:D466 7F 05 mov R7, #5
B1:D468 02 08 4D ljmp OSD_SetFont?_B1BS
B1:D46B ; ---------------------------------------------------------------------------
B1:D46B
B1:D46B B1_D46B: ; CODE XREF: SetMeg4SubtitleParams+49j
B1:D46B 7F 07 mov R7, #7
B1:D46D 02 08 4D ljmp OSD_SetFont?_B1BS
B1:D470 ; ---------------------------------------------------------------------------
B1:D470
B1:D470 B1_D470: ; CODE XREF: SetMeg4SubtitleParams+46j
B1:D470 E4 clr A ; Este trecho nunca é chamado, porque o número da fonte nunca coincide
B1:D471 90 FB 5F mov DPTR, #XRAM_FB5F ; Espaço entre linhas
B1:D474 F0 movx @DPTR, A
B1:D475 7B 01 mov R3, #1
B1:D477 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro)
B1:D479 7F 11 mov R7, #0x11 ; Janela da legenda
B1:D47B 12 92 42 lcall PSB_Set_Param
B1:D47E
B1:D47E B1_D47E: ; CODE XREF: SetMeg4SubtitleParams+4Dj
B1:D47E 22 ret
B1:D47E ; End of function SetMeg4SubtitleParams
Note o ponto destacado em vermelho. Mudando seu valor podemos escolher a fonte usada nas legendas Eu já testei selecionando duas fontes mas talvez não dê para selecionar muito mais que isso por causa da limitação no tamanho deste firmware, que só pode ter até 1MB.
A seleção de fontes, como no DVP5960 e no DVP5965, está completamente desativada porque o valor na eeprom é sempre zero. Apagando o código inoperante deve sobrar espaço suficiente em SetMeg4SubtitleParams para fazer o patch de escolha de altura. Por sorte, existe também bastante espaço livre no banco 2 que podemos usar para criar um menu de seleção de fontes e cores tão comlpeto quanto o que fiz para o Proview DVP-858. Faltam apenas os endereços de eeprom extras para armazenar a cor e a altura.
-
Como encontrar OSD_SetFont em aparelhos Philips
- DVP5100
- DVP5140
- DVP3040K
- PET725
C2 AF 30 ? 0A 90 F8 86 E0 30 E3 03 20 ? F6 90 F8 E0
E4 F0 A3 74 37 F0 A3 EF F0 30 ? 0D 90 F8 60 E0 20 E5 F9 90 F8 86 74 08 F0 D2 AF 22
A rotina é radicalmente diferente
E4 FD 7F E0 FE 12 19 ? 7D 37 7F E1 7E 00 12 19 ? 90 FB ? E0 FD 7F E2 7E 00
12 19 ? 30 ? 14 7F 60 7E 00 12 19 ? EF 20 E5 F5 7D 08 7F 86 7E 00 12 19 ? D2 AF 22
Exemplo do DVP3040K:
B3:F045 OSD_SetFont: ; CODE XREF: B3_9091+6Fp
B3:F045 ; DATA XREF: B0:OSD_SetFont?_B0BSo ...
B3:F045 C2 AF clr IEN0.7 ; Interrupt Enable Register 0
B3:F047 30 1C 0A jnb RAM_23.4, B3_F054
B3:F04A
B3:F04A B3_F04A: ; CODE XREF: OSD_SetFont+Cj
B3:F04A 90 F8 86 mov DPTR, #BIM_ASSI ; Assert RISC Interrupt Register
B3:F04D E0 movx A, @DPTR
B3:F04E 30 E3 03 jnb ACC.3, B3_F054 ; Accumulator
B3:F051 20 1C F6 jb RAM_23.4, B3_F04A
B3:F054
B3:F054 B3_F054: ; CODE XREF: OSD_SetFont+2j
B3:F054 ; OSD_SetFont+9j
B3:F054 90 F8 E0 mov DPTR, #BIM_GPR0 ; General Purpose Registers 0
B3:F057 E4 clr A
B3:F058 F0 movx @DPTR, A
B3:F059 A3 inc DPTR
B3:F05A 74 37 mov A, #0x37 ; '7'
B3:F05C F0 movx @DPTR, A
B3:F05D A3 inc DPTR
B3:F05E EF mov A, R7
B3:F05F F0 movx @DPTR, A
B3:F060 30 1C 0D jnb RAM_23.4, B3_F070
B3:F063
B3:F063 B3_F063: ; CODE XREF: OSD_SetFont+22j
B3:F063 90 F8 60 mov DPTR, #BIM_STAT
B3:F066 E0 movx A, @DPTR
B3:F067 20 E5 F9 jb ACC.5, B3_F063 ; Accumulator
B3:F06A 90 F8 86 mov DPTR, #BIM_ASSI ; Assert RISC Interrupt Register
B3:F06D 74 08 mov A, #8
B3:F06F F0 movx @DPTR, A
B3:F070
B3:F070 B3_F070: ; CODE XREF: OSD_SetFont+1Bj
B3:F070 D2 AF setb IEN0.7 ; Interrupt Enable Register 0
B3:F072 22 ret
B3:F072 ; End of function OSD_SetFont
Exemplo do DVP5965[/b]
B3:E9FE OSD_SetFont: ; CODE XREF: B3_99EC+F8p
B3:E9FE ; DATA XREF: B0:B0_BS_240_B3_E9FEo ...
B3:E9FE 90 FB B6 mov DPTR, #XRAM_FBB6
B3:EA01 EF mov A, R7
B3:EA02 F0 movx @DPTR, A
B3:EA03 C2 AF clr IEN0.7 ; Interrupt Enable Register 0
B3:EA05 30 1E 0E jnb RAM_23.6, B3_EA16
B3:EA08
B3:EA08 B3_EA08: ; CODE XREF: OSD_SetFont+15j
B3:EA08 7F 86 mov R7, #0x86 ; 'å'
B3:EA0A 7E 00 mov R6, #0
B3:EA0C 12 19 3E lcall B3_BS_1_B0_F320
B3:EA0F EF mov A, R7
B3:EA10 30 E3 03 jnb ACC.3, B3_EA16 ; Accumulator
B3:EA13 20 1E F2 jb RAM_23.6, B3_EA08
B3:EA16
B3:EA16 B3_EA16: ; CODE XREF: OSD_SetFont+7j
B3:EA16 ; OSD_SetFont+12j
B3:EA16 E4 clr A
B3:EA17 FD mov R5, A
B3:EA18 7F E0 mov R7, #0xE0 ; 'Ó'
B3:EA1A FE mov R6, A
B3:EA1B 12 19 50 lcall B3_BS_4_B0_F32C
B3:EA1E 7D 37 mov R5, #0x37 ; '7'
B3:EA20 7F E1 mov R7, #0xE1 ; 'ß'
B3:EA22 7E 00 mov R6, #0
B3:EA24 12 19 50 lcall B3_BS_4_B0_F32C
B3:EA27 90 FB B6 mov DPTR, #XRAM_FBB6
B3:EA2A E0 movx A, @DPTR
B3:EA2B FD mov R5, A
B3:EA2C 7F E2 mov R7, #0xE2 ; 'Ô'
B3:EA2E 7E 00 mov R6, #0
B3:EA30 12 19 50 lcall B3_BS_4_B0_F32C
B3:EA33 30 1E 14 jnb RAM_23.6, B3_EA4A
B3:EA36
B3:EA36 B3_EA36: ; CODE XREF: OSD_SetFont+40j
B3:EA36 7F 60 mov R7, #0x60 ; '`'
B3:EA38 7E 00 mov R6, #0
B3:EA3A 12 19 3E lcall B3_BS_1_B0_F320
B3:EA3D EF mov A, R7
B3:EA3E 20 E5 F5 jb ACC.5, B3_EA36 ; Accumulator
B3:EA41 7D 08 mov R5, #8
B3:EA43 7F 86 mov R7, #0x86 ; 'å'
B3:EA45 7E 00 mov R6, #0
B3:EA47 12 19 50 lcall B3_BS_4_B0_F32C
B3:EA4A
B3:EA4A B3_EA4A: ; CODE XREF: OSD_SetFont+35j
B3:EA4A D2 AF setb IEN0.7 ; Interrupt Enable Register 0
B3:EA4C 22 ret
B3:EA4C ; End of function OSD_SetFont
Localizar OSD_SetFont foi essencial para que eu pudesse localizar Sub_style no DVP3040K, no Pet725 e no DVP5140.
-
SUB_Style do Philips PET_725
B1:C16B Sub_Style: ; CODE XREF: B1_D2D5+31p
B1:C16B 90 FB AF mov DPTR, #XRAM_FBAF
B1:C16E EE mov A, R6
B1:C16F F0 movx @DPTR, A
B1:C170 A3 inc DPTR
B1:C171 EF mov A, R7
B1:C172 F0 movx @DPTR, A
B1:C173 7F 0F mov R7, #0xF
B1:C175 12 06 4F lcall B1_BS_145_B3_DE0F
B1:C175
B1:C178 7F 0E mov R7, #0xE
B1:C17A 12 06 4F lcall B1_BS_145_B3_DE0F
B1:C17A
B1:C17D 7F 01 mov R7, #1
B1:C17F 12 06 4F lcall B1_BS_145_B3_DE0F
B1:C17F
B1:C182 7F 04 mov R7, #4
B1:C184 12 05 0B lcall B1_BS_91_B3_2949
B1:C184
B1:C187 7F 02 mov R7, #2
B1:C189 12 05 FB lcall OSD_TextInit_B1BS
B1:C189
B1:C18C 7F 02 mov R7, #2
B1:C18E 12 06 01 lcall B1_BS_132_B3_E31B
B1:C18E
B1:C191 7F 03 mov R7, #3
B1:C193 12 DD 55 lcall B1_DD55
B1:C193
B1:C196 E4 clr A
B1:C197 FF mov R7, A
B1:C198 12 06 49 lcall OSD_SetFont_B1BS
B1:C198
B1:C19B D2 49 setb RAM_29.1
B1:C19D 7F 12 mov R7, #0x12
B1:C19F 12 05 DD lcall B1_BS_126_B3_400F
B1:C19F
B1:C1A2 7F 12 mov R7, #0x12
B1:C1A4 12 05 E3 lcall B1_BS_127_B3_5B71
B1:C1A4
B1:C1A7 90 FB F1 mov DPTR, #XRAM_FBF1 ; OSD_Colors
B1:C1AA 74 06 mov A, #6 ; Cor de contorno = 6
B1:C1AC F0 movx @DPTR, A
B1:C1AD A3 inc DPTR
B1:C1AE 74 02 mov A, #2 ; Cor do preenchimento = 2
B1:C1B0 F0 movx @DPTR, A
B1:C1B1 7B 06 mov R3, #6 ; Cor do background
B1:C1B3 E4 clr A
B1:C1B4 FD mov R5, A
B1:C1B5 7F 12 mov R7, #0x12 ; Janela
B1:C1B7 12 05 1D lcall OSD_TextColor_B1BS
B1:C1B7
B1:C1BA E4 clr A
B1:C1BB FD mov R5, A
B1:C1BC 7F 12 mov R7, #0x12
B1:C1BE 12 06 9D lcall B1_BS_158_B3_E074
B1:C1BE
B1:C1C1 7F 12 mov R7, #0x12
B1:C1C3 12 05 FB lcall OSD_TextInit_B1BS
B1:C1C3
B1:C1C6 7F 12 mov R7, #0x12
B1:C1C8 12 06 01 lcall B1_BS_132_B3_E31B
B1:C1C8
B1:C1CB 90 FC 71 mov DPTR, #XRAM_FC71
B1:C1CE E0 movx A, @DPTR
B1:C1CF 54 C7 anl A, #0xC7
B1:C1D1 F0 movx @DPTR, A
B1:C1D2 22 ret
B1:C1D2
B1:C1D2 ; End of function Sub_Style
Como o PET725 tem espaço sobrando, com essa informação já é possível eliminar o background (tornando as fontes "normais") e criar menus de escolha de fontes e cores.
Mesmo sem ter o trabalho de fazer menus já dá para separar a fonte das legendas da usada no browser e corrigir as cores da fonte.
Note que pode existir uma Sub_Style_Sec, que não encontrei ainda.
-
Philips DVP5140: Sub_style e SetMeg4SubtitleParams
O DVP5140 não é vendido no Brasil, mas faz parte dos meus testes porque tem caracterísiticas interessantes, não sendo igual a nenhum outro aparelho Philips que eu conheça. E quanto mais aparelhos distintos você analisar, mas fácil fica encontrar padrões.
Você poderá notar que o DVP5140 tem um código muito parecido com o do DVP3040
B1:F16C Sub_Style: ; CODE XREF: B1_E132+3Ep
B1:F16C 90 FB 46 mov DPTR, #XRAM_FB46
B1:F16F EE mov A, R6
B1:F170 F0 movx @DPTR, A
B1:F171 A3 inc DPTR
B1:F172 EF mov A, R7
B1:F173 F0 movx @DPTR, A
B1:F174 7F 03 mov R7, #3
B1:F176 12 07 1B lcall B1_BS_179_B3_4B4F
B1:F176
B1:F179 7F 01 mov R7, #1
B1:F17B 12 07 1B lcall B1_BS_179_B3_4B4F
B1:F17B
B1:F17E 7F 03 mov R7, #3
B1:F180 12 F6 C7 lcall B1_F6C7
B1:F180
B1:F183 7B FF mov R3, #0xFF
B1:F185 7D EB mov R5, #0xEB ; 'Ù'
B1:F187 7C 01 mov R4, #1
B1:F189 74 01 mov A, #1
B1:F18B FF mov R7, A
B1:F18C FE mov R6, A
B1:F18D 12 06 61 lcall OSD_DispMSG2_B1BS
B1:F18D
B1:F190 7F 0E mov R7, #0xE
B1:F192 12 06 F7 lcall B1_BS_173_B4_EE4A
B1:F192
B1:F195 12 D7 CA lcall SetMeg4SubtitleParams
B1:F195
B1:F198 7F 11 mov R7, #0x11
B1:F19A 12 08 1D lcall OSD_textInit_B1BS
B1:F19A
B1:F19D 7F 11 mov R7, #0x11
B1:F19F 12 08 23 lcall B1_BS_223_B3_F09F
B1:F19F
B1:F1A2 22 ret
B1:F1A2
B1:F1A2 ; End of function Sub_Style
B3:593C Sub_Style_Sec: ; DATA XREF: OSD_Text_Init+63o
B3:593C 90 FB 88 mov DPTR, #XRAM_FB88 ; Tem o número da janela (OSD_Text_Init)
B3:593F E0 movx A, @DPTR
B3:5940 FF mov R7, A
B3:5941 D2 45 setb RAM_28.5
B3:5943 12 28 67 lcall OSD_Text_Params_ARM
B3:5943
B3:5946 90 FB 88 mov DPTR, #XRAM_FB88 ; Tem o número da janela (OSD_Text_Init)
B3:5949 E0 movx A, @DPTR
B3:594A FF mov R7, A
B3:594B 12 6C EF lcall OSD_Text_Params
B3:594B
B3:594E 90 FB 88 mov DPTR, #XRAM_FB88 ; Tem o número da janela (OSD_Text_Init)
B3:5951 E0 movx A, @DPTR
B3:5952 FF mov R7, A
B3:5953 E4 clr A
B3:5954 90 FB A5 mov DPTR, #XRAM_FBA5 ; OSD Colors
B3:5957 F0 movx @DPTR, A
B3:5958 A3 inc DPTR
B3:5959 74 02 mov A, #2
B3:595B F0 movx @DPTR, A
B3:595C 7B 03 mov R3, #3
B3:595E E4 clr A
B3:595F FD mov R5, A
B3:5960 12 D2 9D lcall OSD_Text_Color
B3:5960
B3:5963 90 FB 88 mov DPTR, #XRAM_FB88 ; Tem o número da janela (OSD_Text_Init)
B3:5966 E0 movx A, @DPTR
B3:5967 FF mov R7, A
B3:5968 E4 clr A
B3:5969 FD mov R5, A
B3:596A 02 ED 66 ljmp OSD_Text_Init_End
B1:D7CA SetMeg4SubtitleParams: ; CODE XREF: Sub_Style+29p
B1:D7CA ; BankSw_336_B1_F860:B1_FB4Fp
B1:D7CA E4 clr A
B1:D7CB 90 FB ED mov DPTR, #XRAM_FBED ; wX1.high
B1:D7CE F0 movx @DPTR, A
B1:D7CF A3 inc DPTR
B1:D7D0 F0 movx @DPTR, A
B1:D7D1 90 FB F0 mov DPTR, #XRAM_FBF0 ; wY1.high
B1:D7D4 F0 movx @DPTR, A
B1:D7D5 A3 inc DPTR
B1:D7D6 F0 movx @DPTR, A
B1:D7D7 90 FB F4 mov DPTR, #XRAM_FBF4 ; wX2.high
B1:D7DA 74 02 mov A, #2
B1:D7DC F0 movx @DPTR, A
B1:D7DD A3 inc DPTR
B1:D7DE 74 30 mov A, #0x30 ; '0' ; 0x230 = 560
B1:D7E0 F0 movx @DPTR, A
B1:D7E1 90 FB F8 mov DPTR, #XRAM_FBF8 ; wY2.high (define a altura)
B1:D7E4 E4 clr A
B1:D7E5 F0 movx @DPTR, A
B1:D7E6 A3 inc DPTR
B1:D7E7 74 60 mov A, #0x60 ; '`' ; Altura da janela
B1:D7E9 F0 movx @DPTR, A
B1:D7EA E4 clr A
B1:D7EB FD mov R5, A
B1:D7EC 7F 17 mov R7, #0x17
B1:D7EE 7E 01 mov R6, #1
B1:D7F0 12 05 FB lcall Arm_PutChar_B1BS
B1:D7F0
B1:D7F3 7F 03 mov R7, #3 ; Determina a fonte usada nas legendas
B1:D7F5 12 08 53 lcall OSD_SetFont_B1BS
B1:D7F5
B1:D7F8 E4 clr A
B1:D7F9 90 FB 5F mov DPTR, #XRAM_FB5F ; Espaço entre linhas
B1:D7FC F0 movx @DPTR, A
B1:D7FD 7B 09 mov R3, #9 ; 9= todos 255 caracteres + alinhamento bottom
B1:D7FF 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro), 0x02 (Direita)
B1:D801 7F 11 mov R7, #0x11 ; Janela da legenda
B1:D803 12 94 46 lcall PSB_Set_Param
B1:D803
B1:D806 7F 59 mov R7, #0x59 ; 'Y' ; Pega o valor de "DivX Subtitle" na eeprom
B1:D808 7E 00 mov R6, #0
B1:D80A 12 04 ED lcall Pref_Getchar_B1BS
B1:D80A
B1:D80D EF mov A, R7
B1:D80E 24 FE add A, #0xFE ; '¦'
B1:D810 60 11 jz B1_D823
B1:D810
B1:D812 14 dec A
B1:D813 60 09 jz B1_D81E
B1:D813
B1:D815 24 02 add A, #2
B1:D817 70 18 jnz B1_D831
B1:D817
B1:D819 7F 05 mov R7, #5
B1:D81B 02 08 53 ljmp OSD_SetFont_B1BS
B1:D81B
B1:D81E ; ---------------------------------------------------------------------------
B1:D81E
B1:D81E B1_D81E: ; CODE XREF: SetMeg4SubtitleParams+49j
B1:D81E 7F 07 mov R7, #7
B1:D820 02 08 53 ljmp OSD_SetFont_B1BS
B1:D820
B1:D823 ; ---------------------------------------------------------------------------
B1:D823
B1:D823 B1_D823: ; CODE XREF: SetMeg4SubtitleParams+46j
B1:D823 E4 clr A
B1:D824 90 FB 5F mov DPTR, #XRAM_FB5F ; Espaço entre linhas
B1:D827 F0 movx @DPTR, A
B1:D828 7B 01 mov R3, #1 ; Alinhamento bottom. Apenas 127 chars
B1:D82A 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro), 0x02 (Direita)
B1:D82C 7F 11 mov R7, #0x11 ; Janela da legenda
B1:D82E 12 94 46 lcall PSB_Set_Param
B1:D82E
B1:D831
B1:D831 B1_D831: ; CODE XREF: SetMeg4SubtitleParams+4Dj
B1:D831 22 ret
B1:D831
B1:D831 ; End of function SetMeg4SubtitleParams
Uma surpresa: o DVP5140 tem uma segunda rotina SetMpeg4SubtitleParams:
B1:F366 SetMpeg4SubtitleParams2: ; CODE XREF: BankSw_250_B1_D832+10p
B1:F366 E4 clr A
B1:F367 90 FB ED mov DPTR, #XRAM_FBED ; wX1.high
B1:F36A F0 movx @DPTR, A
B1:F36B A3 inc DPTR
B1:F36C F0 movx @DPTR, A
B1:F36D 90 FB F0 mov DPTR, #XRAM_FBF0 ; wY1.high
B1:F370 F0 movx @DPTR, A
B1:F371 A3 inc DPTR
B1:F372 F0 movx @DPTR, A
B1:F373 90 FB F4 mov DPTR, #XRAM_FBF4 ; wX2.high
B1:F376 74 02 mov A, #2
B1:F378 F0 movx @DPTR, A
B1:F379 A3 inc DPTR
B1:F37A 74 30 mov A, #0x30 ; '0' ; 0x230 = 560
B1:F37C F0 movx @DPTR, A
B1:F37D 90 FB F8 mov DPTR, #XRAM_FBF8 ; wY2.high
B1:F380 E4 clr A
B1:F381 F0 movx @DPTR, A
B1:F382 A3 inc DPTR
B1:F383 74 60 mov A, #0x60 ; '`' ; Altura da janela
B1:F385 F0 movx @DPTR, A
B1:F386 E4 clr A
B1:F387 90 FB 5F mov DPTR, #XRAM_FB5F ; Espaço entre linhas
B1:F38A F0 movx @DPTR, A
B1:F38B 7B 09 mov R3, #9
B1:F38D 7D 01 mov R5, #1
B1:F38F 7F 11 mov R7, #0x11
B1:F391 12 94 46 lcall PSB_Set_Param
B1:F391
B1:F394 D3 setb C
B1:F395 22 ret
B1:F395
B1:F395 ; End of function SetMpeg4SubtitleParams2
-
SUB_Style e SetMPeg4SubtitleParams do Philips DVP5980
A Sub_Style Primária do DVP5980 se confunde com a rotina conhecida como Video_Play
B1:F6FE Sub_Style: ; DATA XREF: B0:B0_BS_689_B1_F6FEo
B1:F6FE ; B1:B1_BS_689_B1_F6FEo ...
B1:F6FE 90 FB D2 mov DPTR, #XRAM_FBD2
B1:F701 EE mov A, R6
B1:F702 F0 movx @DPTR, A
B1:F703 A3 inc DPTR
B1:F704 EF mov A, R7
B1:F705 F0 movx @DPTR, A
B1:F706 E4 clr A
B1:F707 FD mov R5, A ; Carrega o background zero
B1:F708 FC mov R4, A
B1:F709 7F 01 mov R7, #1
B1:F70B 12 1D 2A lcall vPlayerShowLogo_B1BS
B1:F70B
B1:F70E 7F 03 mov R7, #3
B1:F710 12 1D 30 lcall B1_BS_173_B3_4C8F
B1:F710
B1:F713 7F 01 mov R7, #1
B1:F715 12 1D 30 lcall B1_BS_173_B3_4C8F
B1:F715
B1:F718 7F 03 mov R7, #3
B1:F71A 12 1F 0A lcall B1_BS_252_B4_EA05
B1:F71A
B1:F71D 12 E2 25 lcall SetMPeg4SubtitleParams
B1:F71D
B1:F720 7F 12 mov R7, #0x12
B1:F722 12 1E 50 lcall OSD_TextInit_B1BS
B1:F722
B1:F725 7F 12 mov R7, #0x12
B1:F727 12 1E 56 lcall B1_BS_222_B3_CE38
B1:F727
B1:F72A 22 ret
Sub_Style Secundária
B3:16B7 Sub_Style_Sec: ; DATA XREF: OSD_Text_Init+6Bo
B3:16B7 90 FC 5B mov DPTR, #XRAM_FC5B ; Tem o número da janela (OSD_Text_Init)
B3:16BA E0 movx A, @DPTR
B3:16BB FF mov R7, A
B3:16BC D2 49 setb RAM_29.1
B3:16BE 12 51 4D lcall OSD_Text_Params_ARM
B3:16BE
B3:16C1 90 FC 5B mov DPTR, #XRAM_FC5B ; Tem o número da janela (OSD_Text_Init)
B3:16C4 E0 movx A, @DPTR
B3:16C5 FF mov R7, A
B3:16C6 12 73 23 lcall OSD_Text_Params
B3:16C6
B3:16C9 90 FC 5B mov DPTR, #XRAM_FC5B ; Tem o número da janela (OSD_Text_Init)
B3:16CC E0 movx A, @DPTR
B3:16CD FF mov R7, A
B3:16CE E4 clr A ; Cor de contorno = 0
B3:16CF 90 FC 60 mov DPTR, #XRAM_FC60 ; OSD_Colors
B3:16D2 F0 movx @DPTR, A
B3:16D3 A3 inc DPTR
B3:16D4 74 02 mov A, #2 ; Cor de Preenchimento = 2
B3:16D6 F0 movx @DPTR, A
B3:16D7 7B 03 mov R3, #3 ; Cor do fundo
B3:16D9 E4 clr A
B3:16DA FD mov R5, A
B3:16DB 12 AE CA lcall OSD_Text_Color
B3:16DB
B3:16DE 90 FC 5B mov DPTR, #XRAM_FC5B ; Tem o número da janela (OSD_Text_Init)
B3:16E1 E0 movx A, @DPTR
B3:16E2 FF mov R7, A
B3:16E3 E4 clr A
B3:16E4 FD mov R5, A
B3:16E5 02 C9 50 ljmp BankSw_268_B3_C950
B1:E225 SetMPeg4SubtitleParams: ; CODE XREF: BankSw_689_B1_F6FE+1Fp
B1:E225 ; BankSw_698_B1_FB93:B1_FBA2p
B1:E225 E4 clr A ; Rotina onde podem ser ajustada a posicao das legendas, altura das linhas, etc
B1:E226 90 FC BD mov DPTR, #XRAM_FCBD ; wX1.high
B1:E229 F0 movx @DPTR, A
B1:E22A A3 inc DPTR
B1:E22B F0 movx @DPTR, A
B1:E22C 90 FC C0 mov DPTR, #XRAM_FCC0 ; wY1.high
B1:E22F F0 movx @DPTR, A
B1:E230 A3 inc DPTR
B1:E231 F0 movx @DPTR, A
B1:E232 90 FC C3 mov DPTR, #XRAM_FCC3 ; wX2.high
B1:E235 74 02 mov A, #2
B1:E237 F0 movx @DPTR, A
B1:E238 A3 inc DPTR
B1:E239 74 30 mov A, #0x30 ; '0'
B1:E23B F0 movx @DPTR, A
B1:E23C 90 FC C7 mov DPTR, #XRAM_FCC7 ; wY2.high
B1:E23F E4 clr A
B1:E240 F0 movx @DPTR, A
B1:E241 A3 inc DPTR
B1:E242 74 60 mov A, #0x60 ; '`' ; Altura da janela. Aumente se linhas estiverem deixando de aparecer
B1:E244 F0 movx @DPTR, A
B1:E245 E4 clr A
B1:E246 FD mov R5, A
B1:E247 7F 1D mov R7, #0x1D
B1:E249 7E 01 mov R6, #1
B1:E24B 12 19 E8 lcall B1_BS_33_B6_B7A7
B1:E24B
B1:E24E 7F 0A mov R7, #0xA ; Fonte para as legendas DivX
B1:E250 12 1E BC lcall OSD_SetFont_B1BS
B1:E250
B1:E253 E4 clr A
B1:E254 90 FB E6 mov DPTR, #XRAM_FBE6 ; Espaço entre linhas
B1:E257 F0 movx @DPTR, A
B1:E258 7B 09 mov R3, #9 ; bit options
B1:E25A 7D 01 mov R5, #1
B1:E25C 7F 12 mov R7, #0x12
B1:E25E 12 1F 7C lcall PSB_Set_Param_B1BS
B1:E25E
B1:E261 7F 2C mov R7, #0x2C ; ','
B1:E263 7E 00 mov R6, #0
B1:E265 12 1B C8 lcall B1_BS_113_B5_DB60
B1:E265
B1:E268 EF mov A, R7
B1:E269 24 FE add A, #0xFE ; '¦'
B1:E26B 60 0C jz B1_E279
B1:E26B
B1:E26D 14 dec A
B1:E26E 60 0E jz B1_E27E
B1:E26E
B1:E270 24 02 add A, #2
B1:E272 70 18 jnz B1_E28C
B1:E272
B1:E274 7F 0E mov R7, #0xE
B1:E276 02 1E BC ljmp OSD_SetFont_B1BS
B1:E276
B1:E279 ; ---------------------------------------------------------------------------
B1:E279
B1:E279 B1_E279: ; CODE XREF: SetMPeg4SubtitleParams+46j
B1:E279 7F 0C mov R7, #0xC
B1:E27B 02 1E BC ljmp OSD_SetFont_B1BS
B1:E27B
B1:E27E ; ---------------------------------------------------------------------------
B1:E27E
B1:E27E B1_E27E: ; CODE XREF: SetMPeg4SubtitleParams+49j
B1:E27E E4 clr A
B1:E27F 90 FB E6 mov DPTR, #XRAM_FBE6 ; Espaço entre linhas
B1:E282 F0 movx @DPTR, A
B1:E283 7B 01 mov R3, #1 ; bit Options
B1:E285 7D 01 mov R5, #1
B1:E287 7F 12 mov R7, #0x12
B1:E289 12 1F 7C lcall PSB_Set_Param_B1BS
B1:E289
B1:E28C
B1:E28C B1_E28C: ; CODE XREF: SetMPeg4SubtitleParams+4Dj
B1:E28C 22 ret
B1:E28C
B1:E28C ; End of function SetMPeg4SubtitleParams
Assim como o DVP5140, o DVP5980 também tem uma segunda SetMPeg4SubtitleParams:
B1:F646 SetMPeg4SubtitleParams_2: ; DATA XREF: B0:B0_BS_682_B1_F646o
B1:F646 ; B1:B1_BS_682_B1_F646o ...
B1:F646 E4 clr A ; Rotina onde podem ser ajustada a posicao das legendas, altura das linhas, etc
B1:F647 90 FC BD mov DPTR, #XRAM_FCBD ; wX1.high
B1:F64A F0 movx @DPTR, A
B1:F64B A3 inc DPTR
B1:F64C F0 movx @DPTR, A
B1:F64D 90 FC C0 mov DPTR, #XRAM_FCC0 ; wY1.high
B1:F650 F0 movx @DPTR, A
B1:F651 A3 inc DPTR
B1:F652 F0 movx @DPTR, A
B1:F653 90 FC C3 mov DPTR, #XRAM_FCC3 ; wX2.high
B1:F656 74 02 mov A, #2
B1:F658 F0 movx @DPTR, A
B1:F659 A3 inc DPTR
B1:F65A 74 30 mov A, #0x30 ; '0'
B1:F65C F0 movx @DPTR, A
B1:F65D 90 FC C7 mov DPTR, #XRAM_FCC7 ; wY2.high
B1:F660 E4 clr A
B1:F661 F0 movx @DPTR, A
B1:F662 A3 inc DPTR
B1:F663 74 60 mov A, #0x60 ; '`' ; Altura da janela. Aumente se linhas estiverem deixando de aparecer
B1:F665 F0 movx @DPTR, A
B1:F666 E4 clr A
B1:F667 90 FB E6 mov DPTR, #XRAM_FBE6 ; Espaço entre linhas
B1:F66A F0 movx @DPTR, A
B1:F66B 7B 09 mov R3, #9 ; Bit Options
B1:F66D 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro)
B1:F66F 7F 12 mov R7, #0x12 ; Janela da legenda
B1:F671 12 1F 7C lcall PSB_Set_Param_B1BS
B1:F671
B1:F674 D3 setb C
B1:F675 22 ret
B1:F675
B1:F675 ; End of function SetMPeg4SubtitleParams_2
Com isso, temos os elementos necessários para criar menus com escolha de fontes, cor e posição para as legendas.
-
Dicas para localização de rotinas
Tenho que escrever essas coisas, antes que eu esqueça. Não espere entender muito do que está aqui, porque é um rascunho que posso usar para elaborar outro texto um outro dia :)
Se o firmware tiver uma SetMPeg4SubtitleParams mista (com leitura da eeprom), esta rotina é diretamente chamada por Sub_Style.
Para descobrir se o firmware tem rotinas de leituras de fontes na eeprom, mesmo que desativadas, procure pela string "DivX Subtitle" na estrutura de menus no mtkRemaker. Se o mtkRemaker não estiver achando os menus, vá no Language Code 00 e procure a string lá, pegue o seu código hexa e procure duas ocorrências seguidas dele com um editor hexadecimal. Alguns bytes à frente está o endereço eeprom usado pela fonte DivX.
Por exemplo, no DVP5980 o mtkRemaker não encontra os menus, mas o código hexa para o texto "DivX Subtitle" é 0503. Procurando "0503 0503" no firmware encontramos:
0008 FFFF 0503 0503 002C 0000 0000 0000 FF40 7000 00FF 402F FF40 36
E 0x2C é o endereço eeprom procurado (a maioria dos firmwares Philips usa o 0x59).
Sabendo o endereço eeprom onde está o número da fonte, procuramos por:
7F 2C 7E 00
Todas as ocorrências dessa string são pontos onde o número da fonte é lido. Teoricamente isso só vai ocorrer na rotina SubStyle ou em rotinas chamadas por ela, como a SetMPeg4SubtitleParams mista.
Sub_Style sempre tem pelo menos uma chamada do tipo:
B1:F720 7F 12 mov R7, #0x12 ; onde 12 é o número da janela de legendas
B1:F722 12 1E 50 lcall OSD_TextInit_B1BS
Sabendo onde está OSD_text_Init, olhe no seu CASE a chamada que usa o número de janela das legendas. Seguindo essa chamada você encontrará Sub_Style_Sec ou Sub_Style_2
Localizar OSD_SetFont pode ser essencial para achar Sub_Style direta ou indiretamente
-
DVP3040K/55 : 1MB sobrando na flash!
Eu não sei porque raios eu estive assumindo até agora que o DVP3040K tinha apenas 1MB de flash. Eu imagino que foi uma combinação de fatores:
- Todos os firmwares que vi até agora, mesmo modificados, não passavam de 1MB;
- Todas as modificações que vi até agora foram "tímidas"
- O mtkRemaker diz que a flash é de 1MB;
- Eu tenho certeza de que li mais de uma vez comentários de que o DVP3040K não podia ser melhor por causa da flash limitada;
Mas o fato é que a flash do meu tem 2MB!
Vai dar para fazer muuuita coisa com o bicho! :yahoo!:
-
Eu acabo de instalar o firmware do DVP5140 no DVP3040K e adivinhem...
Tá tudo funcionando!
Eu sou o feliz proprietário do primeiro DVP3040K do mundo com suporte a DivX Ultra! :yahoo!:
-
¡Quantas novidades em um so día! ;D
En quanto ao patch do DVP510, agora sim as fontes estão funcionando devidamente. Usei por 6-8 horas seguidas e não ouve nenhuma falha. :yahoo!:
-
[/b]Você não precisa do IDA. Se você souber usar qualquer editor hexadecimal que faça buscas de strings hexa você pode localizar as senhas adaptando as strings que vou fornecer para a sintaxe do editor. No XVI32, por exemplo, basta susbstituir todos os "?" das strings por "2E" para fazer a busca.
Interessante... ¿Você sabe qual é o wildcard '?' no UltraEdit?
Faz um tempão que estou buscando (já li a ajuda, busquei no Google e nada...) :-[
-
Hola Jmaraujo.... en Ultraedit, elije la opcion de "regular expressions" y luego utiliza "?" como wild card para
cada uno... por ejemplo... jm?raujo, encontrara jmaraujo, jmbraujo, etc...
Saludos,
FabianR
-
Eu acabo de instalar o firmware do DVP5140 no DVP3040K e adivinhem...
Tá tudo funcionando!
Eu sou o feliz proprietário do primeiro DVP3040K do mundo com suporte a DivX Ultra! :yahoo!:
Excelente Jefferson! Me encantaria tener Divx Ultra en mi 3040k.... :) :yahoo!:
Ahora una duda... estuve probando tu mtkModToolbox, informa que el tamaño del frimware 5140 y 3040,
es de 1MB... al menos los dos que estan en tu "pack de firmwares de referencia".
Como te diste cuenta que tu 3040k tiene 2MB?
Saludos,
FabianR
-
Hola Jmaraujo.... en Ultraedit, elije la opcion de "regular expressions" y luego utiliza "?" como wild card
O UltraEdit dix "Expresões regulares (ASCII somente)" e eu preciso poder usar um wildcard nas buscas hexadecimais.
El UltraEdit señala "Expresiones regulares (solamente ASCII)" y yo necesito el uso de un wildcard para las búsquedas hexadecimales.
-
Hola Jmaraujo.... en Ultraedit, elije la opcion de "regular expressions" y luego utiliza "?" como wild card
O UltraEdit dix "Expresões regulares (ASCII somente)" e eu preciso poder usar um wildcard nas buscas hexadecimais.
El UltraEdit señala "Expresiones regulares (solamente ASCII)" y yo necesito el uso de un wildcard para las búsquedas hexadecimales.
Hmmm... tenes razon... :( Yo prefiero utilizar el Hex Workshop para estas cosas... ;)
-
Ahora una duda... estuve probando tu mtkModToolbox, informa que el tamaño del frimware 5140 y 3040,
es de 1MB... al menos los dos que estan en tu "pack de firmwares de referencia".
Como te diste cuenta que tu 3040k tiene 2MB?
Porque eu abri e olhei o chip de memória flash. Não há jeito mais seguro que este.
Além disso, o mtktool reconhece como um chip de 2MB.
-
Interessante... ¿Você sabe qual é o wildcard '?' no UltraEdit?
Faz um tempão que estou buscando (já li a ajuda, busquei no Google e nada...) :-[
Desculpe. Eu estava tão acostumado com o XVI que achei que fosse algo "natural" em qualquer editor hexadecimal.
Até olhei agora o Hex Workshop e também não encontrei opção nem no software e nem no help para usar wildcards. :o
O danado é que me parece "absurdo", porque até o mtkModToolbox faz busca baseado em wildcards. Não é nenhum segredo o algoritmo para se fazer isso.
-
Firmwares Philips: Improvisando uma mensagem de versão
Como todos vocês que tem um aparelho da Philips devem saber, ao apertar EJECT + 55 é exibido na tela o nome do arquivo que o aparelho espera encontrar no CD de upgrade. Até esta semana, eu achava que o nome exibido vinha da mesma string usada para fazer a conferência, mas não vem!
O mosarella fez um patch similar onde adiciona os detalhes do firmware em outra linha:
> http://tech.groups.yahoo.com/group/mt13x9/message/3871 (http://tech.groups.yahoo.com/group/mt13x9/message/3871)
> http://tech.groups.yahoo.com/group/mt13x9/message/3878 (http://tech.groups.yahoo.com/group/mt13x9/message/3878)
-
mosarella fez um patch similar onde adiciona os detalhes do firmware em outra linha:
> http://tech.groups.yahoo.com/group/mt13x9/message/3871 (http://tech.groups.yahoo.com/group/mt13x9/message/3871)
> http://tech.groups.yahoo.com/group/mt13x9/message/3878 (http://tech.groups.yahoo.com/group/mt13x9/message/3878)
Eu já havia visto isso, mas achei complicado demais, para pouco ganho prático.
Se fosse só uma questão de copiar e colar, eu já teria feito. Mas há um monte de endereços XRAM e de sub-rotinas que precisam ser adaptados.
-
Eu acabo de instalar o firmware do DVP5140 no DVP3040K e adivinhem...
Tá tudo funcionando!
Eu sou o feliz proprietário do primeiro DVP3040K do mundo com suporte a DivX Ultra! :yahoo!:
Hola Jefferson, podrias por favor probar si es posible instalar el firmware del DVP5140 en el DVP3040 mediante CD (cambiándole el nombre al archivo DVP5140_37.BIN a DVP3040K_55.BIN (FW 5140 renombrado) y luego probar si se puede regresar al firmware del DVP3040, esta vez cambiándole de nombre al archivo DVP3040k_55.BIN a DVP5140_37.BIN (FW 3040 renombrado). Quiero confirmar si es un proceso seguro pues yo no tengo cable serial.
Tambien si podrias habilitar el parche GOTO para DVP5140 en el MTK MODToolbox. Gracias de antemano.
DVP3040K/55 : 1MB sobrando na flash!
Eu não sei porque raios eu estive assumindo até agora que o DVP3040K tinha apenas 1MB de flash.
(...)
Mas o fato é que a flash do meu tem 2MB!
Vai dar para fazer muuuita coisa com o bicho! :yahoo!:
¿Haz logrado instalar un firmware de mas de 1MB? Cuando yo lo hago (con CD) siempre me sale con errores, especialmente en el filebrowser. Quizas realmente el DVP3040K/55 tiene 2MB de flash de hardware, pero es el firmware mismo el que no permite actualizar correctamente más de 1 MB.
Saludos.
-
Hola Jefferson, podrias por favor probar si es posible instalar el firmware del DVP5140 en el DVP3040 mediante CD (cambiándole el nombre al archivo DVP5140_37.BIN a DVP3040K_55.BIN (FW 5140 renombrado) y luego probar si se puede regresar al firmware del DVP3040, esta vez cambiándole de nombre al archivo DVP3040k_55.BIN a DVP5140_37.BIN (FW 3040 renombrado). Quiero confirmar si es un proceso seguro pues yo no tengo cable serial.
Acabo de fazer o teste, usando os firmwares oficiais que estão no meu pacote de referência. O DVP3040K/55 se "transforma" em um DVP5140/37 e depois volta a ser um DVP3040K/55
Mas atenção:
- É preciso que seu aparelho seja especificamente um submodelo /55. Eu preciso testar antes os firmwares de outros submodelos para saber até onde vai a compatibilidade. O sub-modelo /51, como você sabe, não é compatível com o /55
- Use o arquivo que está no meu pacote de referência. O DVP5140/37 tem um outro firmware, chamado de DVP5140S_37.BIN que "mata" o DVP3040K/55. Não use.
Tambien si podrias habilitar el parche GOTO para DVP5140 en el MTK MODToolbox. Gracias de antemano.
Isso vai demorar um pouco. Eu abandonei o desenvolvimento de mtkModToolbox para me concentrar em seu sucessor, que não está pronto para uso ainda.
¿Haz logrado instalar un firmware de mas de 1MB? Cuando yo lo hago (con CD) siempre me sale con errores, especialmente en el filebrowser. Quizas realmente el DVP3040K/55 tiene 2MB de flash de hardware, pero es el firmware mismo el que no permite actualizar correctamente más de 1 MB.
Saludos.
Eu fiz um teste, colocando o bloco MPEG do LG DK194g no firmware do DVP3040K/55. O firmware ficou com 1,5MB. Instalei por cabo e por CD, sem problema aparente. Mas não leu mais nenhum DVD :-[
Curiosamente, CDs são lidos normalmente. Só não reconhece mais a mídia DVD.
Vou reinstalar o original e fazer mais testes. Talvez seja o tamnho exagerado do bloco MPEG que está criando problemas.
-
Já testei.
Instalado via cabo o firmware de 1.5MB funciona sem problema aparente. Instalado via CD dá vários problemas. É possível até que a rotina de upgrade por CD esteja lendo apenas 1MB, dos 1,5MB do arquivo.
Vou estudar uma maneira de resolver isso. Mas pode demorar.
-
Interessante... ¿Você sabe qual é o wildcard '?' no UltraEdit?
Faz um tempão que estou buscando (já li a ajuda, busquei no Google e nada...) :-[
Desculpe. Eu estava tão acostumado com o XVI que achei que fosse algo "natural" em qualquer editor hexadecimal.
Até olhei agora o Hex Workshop e também não encontrei opção nem no software e nem no help para usar wildcards. :o
O danado é que me parece "absurdo", porque até o mtkModToolbox faz busca baseado em wildcards. Não é nenhum segredo o algoritmo para se fazer isso.
El X-Ways Winhex o X-Ways Forensics tiene opcion de wildcards en modo hexa... :yahoo!:
-
Ryan, como ja sabemos o 5965 tem no menu a opção de selecionar legendas (so que não funciona :-[), teria como adicionar mais fontes neste menu, ou só apagando este menu e criando outro do zero? E a opção de seleção de cor via setup (branca e amarela) teria como você dar um help? Ainda não compreendir a parte de criação do menu.
Agradeço muito.
-
Já testei.
Instalado via cabo o firmware de 1.5MB funciona sem problema aparente. Instalado via CD dá vários problemas. É possível até que a rotina de upgrade por CD esteja lendo apenas 1MB, dos 1,5MB do arquivo.
Vou estudar uma maneira de resolver isso. Mas pode demorar.
Hmmm... pensando en voz alta... Si ya han encontrado la referencia al nombre del archivo de firmware, ahi debe estar la subrutina que carga el firmware..... y si hay una limitacion del tamaño que lee deberia estar ahi... :) Tengo que estudiar un poco del assembler de estos equipos....
-
Eneris,
Tem como dar isso tudo ao DVP5965, fazendo algumas modificações no menu original. Eu sei como trabalhar com menus, mas ensinar é muito complicado.
No caso dos Philips, que já tem menus "cheios", é mais prático criar um gancho para uma nova página (você pode ter até oito) e construi-la toda no espaço livre do mesmo banco. É quase a mesma coisa que fiz no Proview, mas como o Proview já tinha uma página quase vazia, a mudança no código original dos menus foi mínima. Para Philips é consideravelmente mais complicado, mas ainda é mais razoável do que tentar enxertar opções nos menus existentes.
Eu já tenho na fila os menus do DVP5960, DVP5980, DVP3040 e do Lenoxx DV-406. Posso fazer também do DVP5965, mas vai demorar.
Jefferson
-
Eneris,
Se entendí bem (não estou familiarizado com o firmware do DVP5965), para o menú de fontes já existe um menú de seleção, então não é preciso uma nova página. O mais fácil é aumentar o número de items do menú:
8. No Pic. | Divx Subtitle | Divx Subtitle
0008 FFFF 0505 0505 0059 0000 0001 0000 FF365A 0000 - ROM:3660
=> 1. Standard | Standard | [00]
04BE 04BE 0561 00 - ROM:364C
2. Cyrillic | Cyrillic | [00]
0507 0507 0561 01 - ROM:3653
01 = número de items-1 (ou seja se quiser 6 items, 6-1=5 então 01 -> 05
365A = Pointer a pointer dos ítems de menú.
A primeira coisa e trocar o número de ítems (em vermelho). A segunda coisa e mudar o endereço dos pointers de ítems (em azul).
No exemplo, em ROM:365A temos os seguintes datos: FF 36 4C FF 36 53 (ou seja dois pointers, apontando a ROM:364C e ROM:3653).
Mude o pointer FF365A para, por exemplo, FFFA00. Em ROM:FA00 coloque todos os pointers para os items de menú. Asumindo que vamos manter as opções 1 y 2 e adicionar 4 opções novas: FF 36 4C FF 36 53 FF aa aa FF bb bb FF cc cc FF dd dd, onde aaaa, bbbb, cccc e dddd são os pointers para as novas definiçoes de idioma e valor de escolha da opção do menú.
8. No Pic. | Divx Subtitle | Divx Subtitle
0008 FFFF 0505 0505 0059 0000 0005 0000 FFFA00 0000 - ROM:3660
=> 1. Standard | Standard | [00]
04BE 04BE 0561 00 - ROM:364C
2. Cyrillic | Cyrillic | [00]
0507 0507 0561 01 - ROM:3653
3. Opcão 3 | Opcão 3 | [00]
???? ???? 0561 ? - ROM:aaaa
4. Opcão 4 | Opcão 4 | [00]
???? ???? 0561 ? - ROM:bbbb
5. Opcão 5 | Opcão 5 | [00]
???? ???? 0561 ? - ROM:cccc
6. Opcão 6 | Opcão 6 | [00]
???? ???? 0561 ? - ROM:dddd
Espero que fique comprensivel... Jefferson tem razão, é mais fácil entender como funcionan os menús do que explicar.
Um abraço.
-
Eneris,
Assim fica a mudança em um editor hexadecimal:
8. No Pic. | Divx Subtitle | Divx Subtitle
0008 FFFF 0505 0505 0059 0000 0001 0000 FF365A 0000 - ROM:3660
Em ROM:3660 está contida a linha a modificar:
Modificar pointer e número de opções de menú:
Antes:
00003660h: 00 08 FF FF 05 05 05 05 00 59 00 00 00 01 00 00
00003670h: FF 36 5A 00 00 02 60 00 9F 02 60 00 02 5C 00 9E
Depois:
00003660h: 00 08 FF FF 05 05 05 05 00 59 00 00 00 05 00 00
00003670h: FF FA 00 00 00 02 60 00 9F 02 60 00 02 5C 00 9E
Pointer a novas opções de menú:
0000fa00h: FF 36 4C FF 36 53 FF aa aa FF bb bb FF cc cc FF
0000fa10h: dd dd FF FF FF FF FF FF FF FF FF FF FF FF FF FF
É preciso adicionar também (em ROM:aaaa, ROM:bbbb... etc.) os bytes das definições de idioma e escolha de opção.
Os endereços no seu firmware são diferentes mas o procedimento é o mesmo.
-
Ryan e Jmaraujo, obrigado pelas super dicas, vou tentar hoje a noite, qualquer coisa eu posto aqui.
-
Jmaraujo, quem são os bytes das definições de idioma e escolha de opção?
Este é o menu existente no 5965.
8. No Pic. | Divx Subtitle | Divx Subtitle
0008 FFFF 0447 0447 0044 0000 0000 0000 FF3EA6 0000 - ROM:3EA9
=> 1. Standard | Standard | [00]
0401 0401 051E 00 - ROM:3E91
Agradeço.
-
8. No Pic. | Divx Subtitle | Divx Subtitle
0008 FFFF 0447 0447 0044 0000 0000 0000 FF3EA6 0000 - ROM:3EA9
=> 1. Standard | Standard | [00]
0401 0401 051E 00 - ROM:3E91
Vermelho = Definição 1 (no seu caso: "Standard")
Azul = Definição 2 (no seu caso: "Standard")
Verde = Definição 3 (no seu cazo: vazío) - Os firmwares Philips geralmente não usam a def.3 na escolha de opções.
Laranja = Opção a escolher
Veja no MTK Remaker, na parte "Languages", que 0x0401=Standard.
Faça novas definições de idioma para as novas opções.
-
Como localizar Dir_Disp_DirLine
(também chamada de DirDispDirLine e DDDL)
Para refrescar a memória, essa rotina é responsável pela exibição da linha que mostra o diretório (pasta) onde você está:
(http://ryan.com.br/imagens/dvp858/proview_dvp858_dispdirline_impact_40ch(50).jpg)
Procure por:
EF 70 ? D2 ? 12 ? ? 80
Esta string não encontra a rotina, mas uma chamada para ela. Apenas um ponto será encontrado, parecido com este:
B1:9468 EF mov A, R7
B1:9469 70 07 jnz B1_9472
B1:9469
B1:946B D2 43 setb RAM_28.3
B1:946D 12 68 89 lcall DirDispDirline
Como você pode ver, a primeira lcall é para DDDL
Funciona com:
- Philips DVP5960
- Philips DVP5965
- Philips DVP5980
- Philips DVP5100
- Philips DVP3040
- Philips DVP5140
- Punktal PK-DV246
- Proview DVP-858
- Lenoxx DV-406
- JTEC MTK7000
Não funciona com
Para esse, use a string:
80 02 c2 ? 12 ? ? 90
DDDL é importante por algumas razões:
- É nela que você faz o patch que corrige o número de caracteres exibidos na linha de diretório, como explicado por mim váaarios posts atrás (http://ryan.com.br/smf/index.php?topic=179.msg9172079#msg9172079);
- Ela sempre tem tem duas chamadas a OSD_SetFont, uma chamada para OSD_TextColor e termina com uma chamada para ClearRect. De uma tacada só você descobre os endereços dessas rotinas e mais a janela usada pelo browser.
DDDL sempre inicia mais ou menos assim:
B1:6889 DirDispDirline: ; CODE XREF: B1_93FD+70p
B1:6889 ; B1_93FD+77p
B1:6889 20 43 03 jb RAM_28.3, B1_688F
B1:6889
B1:688C 02 69 B4 ljmp Dir_DirLineClear
Dir_DirLineClear sempre é emendada ao final de DDDL, assim você sempre saberá onde a rotina termina
Este conhecimento está sendo incorporado ao MTK Patcher (http://ryan.com.br/smf/index.php?topic=211), para que este no futuro possa permitir a escolha da fonte usada na DirLine e corrigir seus bugs.
-
O tamanho da flash do DVP3040
Eu pesquisei o assunto, mas a melhor informação que obtive (praticamente a única), foi este post de Lisa_tv (http://tech.groups.yahoo.com/group/mt13x9/message/2545).
First about flash size, U can read it in the firmware, 8032 part
block 0:
first 3 bytes is a jump to Startup1 label: (example from 6700 fw)
ROM:0000 start:
ROM:0000 02 22 7B ljmp Startup1
At this label:
ROM:227B Startup1:
ROM:227B mov DPTR, #0xF86C
ROM:227E movx A, @DPTR
ROM:227F anl A, #0xF0
This 0xF0 ends with 4 zeroes, so number of address bits for flash =
4 + 16 = 20 bits -> 1MB flash
In 6600 fw:
ROM:22B2 Startup1:
ROM:22B2 mov DPTR, #0xF86C
ROM:22B5 movx A, @DPTR
ROM:22B6 anl A, #0xE0
this is a 0xE0, has 5 zeroes at the end, flash address is 5 + 15 =
21 bits -> 2 MB flash
I think this is true for all mt1389 firmwares.
Mas isso só serviu para tornar a coisa ainda mais confusa, porque o ponto indicado no firmware do DVP3040 é este:
B0:2294 B0_Start_Handler: ; CODE XREF: FLASH_Reset:B0_Startj
B0:2294 90 F8 6C mov DPTR, #BIM_IODOM
B0:2297 E0 movx A, @DPTR
B0:2298 54 E0 anl A, #0xE0
B0:229A F0 movx @DPTR, A
B0:229B 90 F8 69 mov DPTR, #BIM_IOENM
B0:229E E0 movx A, @DPTR
B0:229F 44 1F orl A, #0x1F
B0:22A1 F0 movx @DPTR, A
B0:22A2 90 F8 66 mov DPTR, #BIM_PCTL1 ; Pin Control 1 Register
B0:22A5 E0 movx A, @DPTR
B0:22A6 44 30 orl A, #0x30
B0:22A8 F0 movx @DPTR, A
B0:22A9 C2 90 clr P1.0 ; Port 1
B0:22AB C2 91 clr P1.1 ; Port 1
B0:22AD C2 92 clr P1.2 ; Port 1
B0:22AF 90 F8 66 mov DPTR, #BIM_PCTL1 ; Pin Control 1 Register
B0:22B2 E0 movx A, @DPTR
B0:22B3 54 F8 anl A, #0xF8
B0:22B5 F0 movx @DPTR, A
B0:22B6 74 24 mov A, #0x24 ; '$'
B0:22B8 90 F8 25 mov DPTR, #AUD_IECCFG ; IEC958 Configuration
B0:22BB F0 movx @DPTR, A
B0:22BC 78 7F mov R0, #0x7F ; ''
B0:22BE E4 clr A
B0:22BF
B0:22BF B0_22BF: ; CODE XREF: FLASH_Reset-CD40j
B0:22BF F6 mov @R0, A
B0:22C0 D8 FD djnz R0, B0_22BF
B0:22C2 75 A0 F9 mov P2, #0xF9 ; '¨' ; Port 2
B0:22C5 75 81 AE mov SP, #WMKEY ; Stack Pointer
B0:22C8 02 23 06 ljmp B0_2306
B0:22C8 ; END OF FUNCTION CHUNK FOR FLASH_Reset
E0 = flash de 2MB
já no firmware do DVP5140...
B0:2294 B0_Start_Handler: ; CODE XREF: FLASH_Reset:B0_Startj
B0:2294 90 F8 6C mov DPTR, #BIM_IODOM
B0:2297 E0 movx A, @DPTR
B0:2298 54 F0 anl A, #0xF0
B0:229A F0 movx @DPTR, A
B0:229B 90 F8 69 mov DPTR, #BIM_IOENM
B0:229E E0 movx A, @DPTR
B0:229F 44 0F orl A, #0xF
B0:22A1 F0 movx @DPTR, A
B0:22A2 90 F8 66 mov DPTR, #BIM_PCTL1 ; Pin Control 1 Register
B0:22A5 E0 movx A, @DPTR
B0:22A6 44 10 orl A, #0x10
B0:22A8 54 DF anl A, #0xDF
B0:22AA F0 movx @DPTR, A
B0:22AB C2 90 clr T2 ; T2
B0:22AD C2 91 clr P1.A17 ; A17
B0:22AF C2 92 clr P1.A18 ; A18
B0:22B1 90 F8 66 mov DPTR, #BIM_PCTL1 ; Pin Control 1 Register
B0:22B4 E0 movx A, @DPTR
B0:22B5 54 F8 anl A, #0xF8
B0:22B7 F0 movx @DPTR, A
B0:22B8 74 24 mov A, #0x24 ; '$'
B0:22BA 90 F8 25 mov DPTR, #AUD_IECCFG ; IEC958 Configuration
B0:22BD F0 movx @DPTR, A
B0:22BE 78 7F mov R0, #0x7F ; ''
B0:22C0 E4 clr A
B0:22C0
B0:22C1
B0:22C1 B0_22C1: ; CODE XREF: FLASH_Reset-CD3Ej
B0:22C1 F6 mov @R0, A
B0:22C2 D8 FD djnz R0, B0_22C1
B0:22C2
B0:22C4 75 A0 F9 mov P2, #0xF9 ; '¨' ; Port 2
B0:22C7 75 81 AE mov SP, #WMKEY ; Stack Pointer
B0:22CA 02 23 08 ljmp B0_2308
B0:22CA
B0:22CA ; END OF FUNCTION CHUNK FOR FLASH_Reset
F0 = Flash de 1MB
E é bom lembrar que mtkRemaker diz que ambos são de aparelhos com 1MB. Logo o mtkRemaker olha em outro lugar.
-
Mais testes de flash no DVP3040K
Usando dois firmwares oficiais e dois propositalmente modificados (bloco MPEG) para ficarem com 1,5MB
Sempre instalando por CD (não usei o cabo)
Começando com firmware DVP5140 de 1,5MB instalado
Não lê mídia DVD
Instalei firmware DVP5140 oficial
Lê mídia DVD
Instalei firmware DVP3040K oficial
Continua lendo mídia DVD
Instalei firmware DVP3040K com 1,5MB
Continua lendo mídia DVD
Reinstalei firmware DVP5140 com 1,5MB
Não lê mais DVD
Com um editor hexa, modifiquei o byte (post anterior) que define o tamanho da flash para "E0" e instalei de novo.
Continua sem ler DVD
Conclusão até agora: Dá para ter DivX Ultra no DVP3040K, mas em um firmware pouco melhor que o oficial (respeitando o limite de 1MB do DVP5140), ou ter um firmware de DVP3040K bem incrementado :)
Note que eu estou usando a leitura de mídia DVD como teste porque foi o único efeito colateral que se manifestou até agora, mas podem existir outros problemas.
-
Problemas com o IDA
Eu não sei quanto ao resto de vocês, mas depois que eu instalei o IDA, meu Windows ficou ainda mais esquisito que o habitual.
Antes do IDA eu já tinha um problema sem solução: As hints/tooltips só aparecem quando querem. Mas surgiram outros.
Com o IDA aberto, dependendo da combinação de outros programas abertos, todo tipo de coisa esquisita acontece.
- Às vezes o Delphi dá uma grande variedade de erros sem sentido e entra em colapso;
- às vezes "Pesquisar" do Windows abre mas não exibe as opções;
- Às vezes as caixas de diálogo (abrir, salvar, etc) dos programas (qualquer um, aleatoriamente) não querem abrir;
- Etc, etc, etc.
A solução é sempre fechar alguns programas. Até parece o que acontece com o Windows 9X, quando os recursos do sistema são drenados e você tem que fechar algumas coisas para recuperá-los. Nunca soube de algo desse tipo ocorrendo com o Windows XP/2000, mas acontece na minha máquina por causa do IDA.
Eu tenho 1GB de RAM nesta máquina.
-
O tamanho da flash do DVP3040
Eu pesquisei o assunto, mas a melhor informação que obtive (praticamente a única), foi este post de Lisa_tv (http://tech.groups.yahoo.com/group/mt13x9/message/2545).
Hola Jefferson... mirando el fw del 3040k encontre el codigo tambien en los otros bancos:
B1:2294
B2:2294
B3:2294
B4:2294
No lo mire en el 5140 pero debe ser igual.... Cuando modficaste el byte F0 en el 5140 de 1.5MB lo hiciste
en todos los bancos?
Saludos,
FabianR
-
Hola Jefferson... mirando el fw del 3040k encontre el codigo tambien en los otros bancos:
B1:2294
B2:2294
B3:2294
B4:2294
No lo mire en el 5140 pero debe ser igual.... Cuando modficaste el byte F0 en el 5140 de 1.5MB lo hiciste
en todos los bancos?
Saludos,
FabianR
Não tinha. Nem sequer vi isso.
Eu fiz o teste agora e nada mudou.
-
Firmwares Philips: Controle das Setas
Um mês atrás eu identifiquei as rotinas que exibem as setas do browser e expliquei aqui como movê-las (http://ryan.com.br/smf/index.php?topic=179.msg9172116#msg9172116). 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_Control
Esta 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:
(http://ryan.com.br/imagens/mediatek/mediatek_philips_arrows_clear(50).jpg)
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 setas
Isso é 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 (http://ryan.com.br/smf/index.php?topic=179.msg9172229#msg9172229), como eu já expliquei.
Isso tudo já foi implementado na próxima versão 0.12 do MTK Patcher.
-
Felizmente eu consegui me livrar de dos problemas que estava tendo com o filebrowser...
http://ryan.com.br/smf/index.php?topic=179.msg9172233#msg9172233 (http://ryan.com.br/smf/index.php?topic=179.msg9172233#msg9172233)
1) Quando o primer "lugar" do filebrowser é um diretório, a primeira linha não é visualizada (é visualizada mas logo apagada). O problema não acontece quando o primer lugar for um arquivo.
O primeiro problema era essa rotina de limpeza maldita que custou achar... Eu buscava rotinas que chamassem PS_ClearRect!!!
Não sei se é a mesma que voçê achou porque não comparei. Eu so achei ela porque contei com a ajuda visual invaluable do MTK Patcher! ;D Sem ele não tería achado nunca... :P
No momento que inseri as coordenadas já sabía que o problema estava aí. O que eu fiz foi zerar as coordenadas:
ROM:988F ROM_988F: ; CODE XREF: ROM_9845+4j
ROM:988F 90 FB EC mov DPTR, #0xFBEC ; x1 High
ROM:9892 E4 clr A
ROM:9893 F0 movx @DPTR, A
ROM:9894 A3 inc DPTR
ROM:9895 74 00 mov A, #0 ; x1 = 0x001E
ROM:9897 F0 movx @DPTR, A
ROM:9898 90 FB EF mov DPTR, #0xFBEF ; y1 High
ROM:989B E4 clr A
ROM:989C F0 movx @DPTR, A
ROM:989D A3 inc DPTR
ROM:989E 74 00 mov A, #0 ; y1 = 0x003E
ROM:98A0 F0 movx @DPTR, A
ROM:98A1 90 FB F3 mov DPTR, #0xFBF3 ; x2 High
ROM:98A4 74 00 mov A, #0
ROM:98A6 F0 movx @DPTR, A
ROM:98A7 A3 inc DPTR
ROM:98A8 74 00 mov A, #0 ; x2 = 0x014A
ROM:98AA F0 movx @DPTR, A
ROM:98AB 90 FB F7 mov DPTR, #0xFBF7 ; y2 High
ROM:98AE E4 clr A
ROM:98AF F0 movx @DPTR, A
ROM:98B0 A3 inc DPTR
ROM:98B1 74 00 mov A, #0 ; y2 = 0x005C
ROM:98B3 F0 movx @DPTR, A
ROM:98B4 D2 75 setb RAM_2E.5
ROM:98B6 E4 clr A
ROM:98B7 90 FB A4 mov DPTR, #0xFBA4
ROM:98BA F0 movx @DPTR, A
ROM:98BB FB mov R3, A
ROM:98BC FD mov R5, A
ROM:98BD 7F 0E mov R7, #0xE
ROM:98BF 12 08 41 lcall PS_Rectangle
ROM:98BF
ROM:98C2 90 FB EF mov DPTR, #0xFBEF ; y1 High
ROM:98C5 E4 clr A
ROM:98C6 F0 movx @DPTR, A
ROM:98C7 A3 inc DPTR
ROM:98C8 74 00 mov A, #0 ; y1 = 0x00DE
ROM:98CA F0 movx @DPTR, A
ROM:98CB 90 FB F7 mov DPTR, #0xFBF7 ; y2 High
ROM:98CE E4 clr A
ROM:98CF F0 movx @DPTR, A
ROM:98D0 A3 inc DPTR
ROM:98D1 74 00 mov A, #0 ; y2 = 0x00FC
ROM:98D3 F0 movx @DPTR, A
ROM:98D4 D2 75 setb RAM_2E.5
ROM:98D6 E4 clr A
ROM:98D7 90 FB A4 mov DPTR, #0xFBA4
ROM:98DA F0 movx @DPTR, A
ROM:98DB FB mov R3, A
ROM:98DC FD mov R5, A
ROM:98DD 7F 0E mov R7, #0xE
ROM:98DF 02 08 41 ljmp PS_Rectangle
Porém no meu caso não tive nenhum problema em por as setas na parte direita da tela. Mais tarde vou postar uma fotografía.
2) O primeiro arquivo fica seleccionado em cor laranja, mas o segundo arquivo também fica laranja (como se estivese seleccionado). Esse comportamente somente ocorre quando o primer arquivo for seleccionado. Ao seleccionar o segundo, tercer e quarto arquivos o comportamento do filebrowser é normal (somente o arquivo seleccionado fica laranja, os restantes ficam com a cor normal).
O segundo problema era um erro nas coordenadas do primeiro arquivo do filelist. Como as coordenadas também controlam o "selection bar", a barra era mais grande do que devería.
So está faltando um pequeno detalhe: O browser se comporta normalmente, exceto quando estou navegando de baixo para cima (de uma página inferior para uma superior), quando o filelist atua como se fosse de quatro arquivos.
-
Não sei se é a mesma que voçê achou porque não comparei.
É a mesma coisa, mas no caso do DVP5100 existe uma estranha diferença.
No DVP5960, a rotina que batizei de "ClearRect2" (e você chama de "PS_Rectangle") parece ser completamente independente. Já no DVP5100, pelo menos na análise que fiz aqui, é a mesma rotina OSD_textColor!
O DVP5960 usa inclusive endereços XRAM distintos para as duas rotinas.
Isso me fez entender a razão de existirem duas rotinas. A rotina que chamei (erradamente) de "ClearRect2", na verdade não serve apenas para limpar um retângulo. Colocado as cores corretas nos respectivos endereços XRAM deve ser possível desenhar um retângulo de uma determinada cor. Eu vou renomear minha rotina para algo mais apropriado.
A propósito, você sabe o que raios significa esse prefixo "PS_" em "PS_Rectangle"? Eu vejo isso com frequencia sendo usado pelo MT13x9 mas não entendi ainda.
Eu so achei ela porque contei com a ajuda visual invaluable do MTK Patcher! ;D Sem ele não tería achado nunca... :P
Obrigado. É bom saber que ajuda mais alguém :)
Para quem faz um patch casual aquilo parece inútil. Mas para quem analisa o assembly, facilita muuuito mesmo. Foi dessa necessidade que nasceu o MTK Patcher :)
Porém no meu caso não tive nenhum problema em por as setas na parte direita da tela. Mais tarde vou postar uma fotografía.
Isso é muito estranho. Você anulou o retângulo e por isso as setas não teriam como ser apagadas. Outro dia eu vou analisar o firmware do DVP5100.
O segundo problema era um erro nas coordenadas do primeiro arquivo do filelist. Como as coordenadas também controlam o "selection bar", a barra era mais grande do que devería.
Verifique se a nova versão do MTK Patcher ajuda a fazer isso sem erros no DVP5100. Mas eu não implementei nenhuma redução na distância entre as linhas, nem na altura delas.
So está faltando um pequeno detalhe: O browser se comporta normalmente, exceto quando estou navegando de baixo para cima (de uma página inferior para uma superior), quando o filelist atua como se fosse de quatro arquivos.
Ahhhh... você está falando da sua nova versão com 6 arquivos..
-
Consultando o documento "PScalls.doc" de Lisatv, constatei que a rotina que eu havia nomeado "ClearRect2" é mesmo a "PS_Rectangle", como jmaraujo havia nomeado. Mais tarde eu farei as devidas correções no post.
Eu cheguei a "PSCalls.doc" fazendo uma busca de texto por "PS_Rectangle" em todo o meu diretório de documentos. Essa é uma rotina da qual se fala pouquissimo (só achei quatro posts no MT13x9).
-
Isso é muito estranho. Você anulou o retângulo e por isso as setas não teriam como ser apagadas. Outro dia eu vou analisar o firmware do DVP5100.
É, a rotina parece ser básicamente a mesma. No meu caso as setas sao limpas pela propia rotina de limpeza dos arquivos. Cada vez que voçê troca de página a rotina limpa a lista de arquivos, ¿certo?, e no meu caso a área é suficientemente larga para incluir as setas. Se for preciso, novas setas são desenhadas. Ao trocar de página o procedimento se repete. (So achei um "bug"... ao voltar do menú apareceu uma seta que não devia)
Estou postando as fotos que prometí. Não são de boa qualidade porque não sei tirar fotos da tv (acho que apagar todas as luzes não ajuda muito).
No DVP5960, a rotina que batizei de "ClearRect2" (e você chama de "PS_Rectangle") parece ser completamente independente. Já no DVP5100, pelo menos na análise que fiz aqui, é a mesma rotina OSD_textColor!
É possivel. Nos meus analises não achei nenhuma rotina chamada OSD_TextColor, achei OSD_SetColor (B3:D473), não é a mesma coisa, ¿certo? (Tenho PS_Rectangle em B3:C794 e PS_Rectangle2 em B3:E420)
Algums dos nomes eu tirei do documento PS_Calls.doc que estou anexando...
A propósito, você sabe o que raios significa esse prefixo "PS_" em "PS_Rectangle"? Eu vejo isso com frequencia sendo usado pelo MT13x9 mas não entendi ainda.
Eu sabía o significado exato de PS, mas agora não estou lembrando...
Update: Lembrei! PS = Packet Switching... Enquanto postava a mensagem vi que você achou o documento que anexei...
-
Achei um firmware original e modificado (para comparação) com a posição dos MP3 tags separados (movidos separadamente).
Ainda não verifiquei mas se funcionar, amanhã eu posto aquí como foi feito em esse firmware... Todo o procedimento é feito na rotina MP3_TagsDisplay que Jefferson identificou (ver páginas anteriores).
No final da rotina a um jump para novo código no final do banco, mas acho que a parte nova é somente para adicionar as etiquetas "Album", "Song", "Artist" etc. antes dos tags mp3.
-
É, a rotina parece ser básicamente a mesma. No meu caso as setas sao limpas pela propia rotina de limpeza dos arquivos. Cada vez que voçê troca de página a rotina limpa a lista de arquivos, ¿certo?, e no meu caso a área é suficientemente larga para incluir as setas.
Na verdade, pelo menos na maioria dos firmwares, Dir_DispFileList chama ClearRect desenhando um retângulo em cima de cada nome de arquivo, em um loop. É possível que no caso do DVP5100 o loop comece uma linha antes e termine uma linha depois. Isso resolveria o problema.
Isso está explicado no documento "Info - File Browser.rtf", do MaBreaker:
ROM:B663 7B 1E mov R3, #0x1E
ROM:B665 7A 00 mov R2, #0x00 ; R2R3 = Height = 0x001E = 30
ROM:B667 7D 1C mov R5, #0x1C
ROM:B669 7C 01 mov R4, #0x01 ; R4R5 = Width = 0x011C = 284
ROM:B669 ; 310 - 26
ROM:B66B 7F 0E mov R7, #0x0E ; Cleared area is
ROM:B66B ; from 1A to (1A+11C=136)
ROM:B66D 12 05 71 lcall OSD_Clear_DirLine
ROM:B670 90 FB 52 mov DPTR, #XRAM_FB52
ROM:B673 E0 movx A, @DPTR
ROM:B674 04 inc A
ROM:B675 F0 movx @DPTR, A
ROM:B676 E0 movx A, @DPTR
ROM:B677 C3 clr C
ROM:B678 94 06 subb A, #6
ROM:B67A 40 AB jc Loop_clear_6_lines
ROM:B67C 22 ret
Nota: Mabreaker chama a rotina de OSD_ClearLine ou OSD_ClearDirLine (ele faz uma confusão com os dois nomes no mesmo texto). Para completar, no documento "Info - File Browser (HowTo).rtf" ele chama a mesma rotina de OSD_Clear_Filename. Imagine a confusão que isso cria na cabeça de quem está aprendendo. Não é que MaBreaker não saiba o que está fazendo (ele sabe), mas seus documentos são muito antigos e desatualizados e se perde muito tempo com as inconsistências.
No DVP5960 é ClearRect que faz o serviço:
B1:E138 93 movc A, @A+DPTR
B1:E139 90 FC 79 mov DPTR, #XRAM_FC79 ; CoordY1.HiByte
B1:E13C CF xch A, R7 ; A coordenada não é fixa, porque esta rotina é chamada
B1:E13C ; uma vez para cada linha do browser
B1:E13D F0 movx @DPTR, A
B1:E13E A3 inc DPTR
B1:E13F EF mov A, R7
B1:E140 F0 movx @DPTR, A
B1:E141 7B 1E mov R3, #0x1E ; É aqui que o retângulo de cada linha da lista de arquivos é apagado
B1:E143 7A 00 mov R2, #0
B1:E145 7D 2C mov R5, #0x2C ; ',' ; R5 e R4 precisam ser mudados se aumentarmos o número de caracteres
B1:E147 7C 01 mov R4, #1
B1:E149 7F 0F mov R7, #0xF ; Janela 0xF
B1:E14B 12 1E 54 lcall ClearRectB1BS
B1:E14E 90 FB AF mov DPTR, #XRAM_FBAF
B1:E151 E0 movx A, @DPTR
B1:E152 04 inc A
B1:E153 F0 movx @DPTR, A
B1:E154 E0 movx A, @DPTR
B1:E155 C3 clr C
B1:E156 94 04 subb A, #4 ; São 4 linhas no DVP5960
B1:E158 40 AB jc B1_E105
B1:E15A 22 ret
No DVP5100 parece ser a mesma coisa, com quatro passagens pelo loop (seria preciso haver duas a mais). Daí não sei ainda como suas setas são apagadas.
B1:D9CA 7B 1E mov R3, #0x1E
B1:D9CC 7A 00 mov R2, #0
B1:D9CE 7D 2C mov R5, #0x2C ; ','
B1:D9D0 7C 01 mov R4, #1
B1:D9D2 7F 0E mov R7, #0xE
B1:D9D4 12 08 11 lcall ClearRectB1BS
B1:D9D7 90 FB 6C mov DPTR, #XRAM_FB6C
B1:D9DA E0 movx A, @DPTR
B1:D9DB 04 inc A
B1:D9DC F0 movx @DPTR, A
B1:D9DD E0 movx A, @DPTR
B1:D9DE C3 clr C
B1:D9DF 94 04 subb A, #4 ; Número de arquivos
B1:D9E1 40 AB jc B1_D98E
B1:D9E3 22 ret
Update: Lembrei! PS = Packet Switching...
Obrigado!
Mas não faz o menor sentido para mim. Acho que vou usar os nomes sem esse prefixo, quando não criar nenhuma ambiguidade.
-
É possivel. Nos meus analises não achei nenhuma rotina chamada OSD_TextColor, achei OSD_SetColor (B3:D473), não é a mesma coisa, ¿certo? (Tenho PS_Rectangle em B3:C794 e PS_Rectangle2 em B3:E420)
Não conheço "OSD_SetColor". Fiz uma busca de texto nos meus documentos e não achei nenhuma referência. Também não retorna nenhum resultado na pesquisa do grupo MT13x9.
Eu acho que o que você chama de "OSD_SetColor" é a rotina "OSD_TextColor". Veja que esse último apareçe no documento "Info - File Browser.doc".
-
Eu verifiquei todos os firmwares Philips que fazem parte da minha bateria de testes e o resultado foi este:
Rotina PS_Rectangle e OSD_textColor são uma só:
DVP5100
DVP3040
Rotinas distintas:
DVP5140
DVP5960
DVP5965
DVP5980
Não tenho como verificar o PET725 agora porque a única pista de PS_Rectangle que eu tenho é a rotina Arrows_Control, que aparentemente nem existe no PET725.
-
Eu acho que o que você chama de "OSD_SetColor" é a rotina "OSD_TextColor". Veja que esse último apareçe no documento "Info - File Browser.doc".
Já me deparei varias vezes com acabar encontrando uma rotina com nome distinto dado pelos modders.
Eu não sabía que nome usar é acabei usando a primeira referencia que achei: "OSD_SetColor" na verdade e chamado PS_SetColor (é a PS_B_0x09) no documento PS_Calls do LisaTV.
Aquí é mencionado um par de vezes...
http://tech.groups.yahoo.com/group/mt13x9/msearch?query=setcolor&submit=Search&charset=windows-1252 (http://tech.groups.yahoo.com/group/mt13x9/msearch?query=setcolor&submit=Search&charset=windows-1252)
-
So está faltando um pequeno detalhe: O browser se comporta normalmente, exceto quando estou navegando de baixo para cima (de uma página inferior para uma superior), quando o filelist atua como se fosse de quatro arquivos.
Eu implementei 6 linhas no firmware do DVP5960 e estou com o mesmo problema. :blink:
-
É, a rotina parece ser básicamente a mesma. No meu caso as setas sao limpas pela propia rotina de limpeza dos arquivos. Cada vez que voçê troca de página a rotina limpa a lista de arquivos, ¿certo?, e no meu caso a área é suficientemente larga para incluir as setas.
No DVP5100 parece ser a mesma coisa, com quatro passagens pelo loop (seria preciso haver duas a mais). Daí não sei ainda como suas setas são apagadas.
B1:D9CA 7B 1E mov R3, #0x1E
B1:D9CC 7A 00 mov R2, #0
B1:D9CE 7D 2C mov R5, #0x2C ; ','
B1:D9D0 7C 01 mov R4, #1
B1:D9D2 7F 0E mov R7, #0xE
B1:D9D4 12 08 11 lcall ClearRectB1BS
B1:D9D7 90 FB 6C mov DPTR, #XRAM_FB6C
B1:D9DA E0 movx A, @DPTR
B1:D9DB 04 inc A
B1:D9DC F0 movx @DPTR, A
B1:D9DD E0 movx A, @DPTR
B1:D9DE C3 clr C
B1:D9DF 94 04 subb A, #4 ; Número de arquivos
B1:D9E1 40 AB jc B1_D98E
B1:D9E3 22 ret
Exato, mas no meu caso as setas estam na mesma altura que os arquivos 1 e 6 da filelist... Estou anexando imagem (Nota: As setas e a segunda -sexta, na verdade- área de limpeza foram adicionadas com Photoshop).
Também é preciso mudar o "subb A, #4" (94 04) por "subb A, #6" (94 06).
ROM:D9CA Área de limpieza del filebrowser
ROM:D9CA 7B 1E mov R3, #0x1E
ROM:D9CC 7A 00 mov R2, #0
ROM:D9CE 7D 36 mov R5, #0x36 ; '6'
ROM:D9D0 7C 02 mov R4, #2
ROM:D9D2 7F 0E mov R7, #0xE
ROM:D9D4 12 08 11 lcall PS_ClearRect ; Limpia lista de archivos
ROM:D9D4
ROM:D9D7 90 FB 6C mov DPTR, #0xFB6C
ROM:D9DA E0 movx A, @DPTR
ROM:D9DB 04 inc A
ROM:D9DC F0 movx @DPTR, A
ROM:D9DD E0 movx A, @DPTR
ROM:D9DE C3 clr C
ROM:D9DF 94 06 subb A, #6
ROM:D9E1 40 AB jc Loop_clear_6_lines
ROM:D9E1
ROM:D9E3 22 ret
-
So está faltando um pequeno detalhe: O browser se comporta normalmente, exceto quando estou navegando de baixo para cima (de uma página inferior para uma superior), quando o filelist atua como se fosse de quatro arquivos.
Eu implementei 6 linhas no firmware do DVP5960 e estou com o mesmo problema. :blink:
Eu coloquei 8 linhas no Proview DVP-858 e além do problema que se manifesta no Philips, ganhei mais um: Ao selecionar o sétimo ou o oitavo arquivos da lista o browser pára de funcionar.
O player continua funcionando. Posso entrar no setup. Mas o browser não responde mais a não ser que eu desligue o aparelho.
As oito linhas:
(http://ryan.com.br/imagens/dvp858/proview_dvp858_browser_8linhas(50).jpg)
-
O problema não é exclusivo do Proview. Coloquei 8 linhas no DVP5960 e este também congela o browser se eu escolher o sétimo ou o oitavo arquivo da lista.
O DVP5960 com oito linhas (usando background do firmware eneris para DVP5965):
(http://ryan.com.br/imagens/dvp5960/dvp5960_browser_8linhas(50).jpg)
Estou sem pistas de onde olhar para corrigir o problema.
-
Exato, mas no meu caso as setas estam na mesma altura que os arquivos 1 e 6 da filelist... Estou anexando imagem (Nota: As setas e a segunda -sexta, na verdade- área de limpeza foram adicionadas com Photoshop).
Ahhhh... Certo. Isso explica como as setas são apagadas :)
-
O problema não é exclusivo do Proview. Coloquei 8 linhas no DVP5960 e este também congela o browser se eu escolher o sétimo ou o oitavo arquivo da lista.
O DVP5960 com oito linhas (usando background do firmware eneris para DVP5965):
(http://ryan.com.br/imagens/dvp5960/dvp5960_browser_8linhas(50).jpg)
Estou sem pistas de onde olhar para corrigir o problema.
Busque por "8 rows" no grupo do Yahoo! Há uma discussão ao respeito.
Update: A discussão começa com o assunto "Dirname mess & 8 rows" e termina como "8-rows filebrowser for Pio470/575 is almost ready"...
Off-topic: Mais tarde vou enviar por email o documento com o patch dos tags mp3. Não apliquei no firmware do DVP5100 porque achei algumas partes diferentes na rotina... O que sim consegui aplicar com éxito foi uma rotina de word wrap no RISC do DVP5140 (na minha opinião gostei mais do que o wordwrap do NA).
Um abraço.
-
Busque por "8 rows" no grupo do Yahoo! Há uma discussão ao respeito.
Ahhhh... "rows"...
Eu estava teimando com "lines" ;D
De qualquer forma, já achei a causa do problema. Mas vou ler os tópicos no Yahoo mais tarde para ver se aprendo mais alguma coisa.
Estou testando o browser do DVP5960 com oito linhas neste momento e parece OK, com exceção do problema do retorno para a quarta linha, que você tem com o DVP5100.
Mas pelo menos não congela mais...
-
Hola Jefferson:
Yo tengo un Pioneer 578 convertido a 575 con el Firmware Mod de Guffiak.
El File Browser soporta 8 renglones y funciona perfectamente.
Aunque los firmware de Pioneer tienen sus particularidades, a lo mejor te sirva analizar ese firmware.
Salu2.
Alvaro.
-
MtkWindows e palettes
Na semana passada eu entendi como se localiza as palettes no firmware. É muito simples, depois que você identifica as janelas, porque cada definição de janela tem um ponteiro para a palette que usa. Então eu tive a idéia adicionar ao MTK Patcher a capacidade de criar novas palettes para acabar com o velho problema que temos de alterar uma cor em uma janela e bagunçar outras. Cada palette apenas precisa de 32 bytes livres no código e assim como os menus pode ser colocada em qualquer lugar do mesmo banco.
O que surpreendentemente eu só descobri ontem é que o mtkWindows já faz isso! :dashhead1:
Por muito tempo eu usei o mtkWindows 0.8, que não cria novas palettes e nunca usei o recurso de abrir e salvar palettes, por isso ao passar para a versão 0.8.3 eu nunca me dei conta de que havia um minúsculo botão branco adicional que cria uma nova palette no firmware, para a janela selecionada.
(http://ryan.com.br/imagens/mediatek/mtkwindows_palette_50.jpg)
Usando esse simples recurso você pode ter uma palette exclusiva para a janela e não se preocupar mais com a propagação de mudanças por outras janelas.
Arghhhhh. Deveria ter notado isso há meses! :dashhead1:
-
Hola Jefferson:
Yo tengo un Pioneer 578 convertido a 575 con el Firmware Mod de Guffiak.
El File Browser soporta 8 renglones y funciona perfectamente.
Aunque los firmware de Pioneer tienen sus particularidades, a lo mejor te sirva analizar ese firmware.
Salu2.
Alvaro.
Alvaro,
Eu ainda nem comecei a tentar entender as particularidades dos firmwares LG e Pioneer. Mesmo entre os Philips já existem variações bem complicadas de se entender e sem ter dominado o funcionamento do browser nos firmwares que eu entendo melhor, tentar encontrar as respostas em firmwares que não entendo de jeito nenhum (nem os scripts entendem) só vai me complicar ;D
Eu preciso de um firmware com oito linhas que seja ou da Philips ou Mediatek "padrão".
Lembrando: meu único problema agora é o mesmo de jmaraujo: ao rolar o browser de baixo para cima a barra de selação começa no quarto arquivo e não no oitavo.
-
Tags MP3 no DVP5980
De todos os Philips, este é o que está dando mais trabalho. Embora os indicadores do tamanho das tags (após a keyword "TAG" no 8032) indiquem que este é o primeiro firmware Philips com suporte a tags com mais de 30 caracteres (diz suportar 60), não consigo nem chegar aos 30 que dei ao DVP5960. Existe algum limitador extra que não encontrei ainda.
Eu investiguei a memória do aparelho com o MTKDump e as tags aparecem com 30 caracteres cada. Logo não deve ser um problema no ARM.
-
Todo este trecho do firmware do Proview DVP-858 pode ser apagado para usar o espaço em outra coisa:
B1:A143 90 FC 44 mov DPTR, #XRAM_FC44 ; Coordenada horizontal (HI)
B1:A146 F0 movx @DPTR, A
B1:A147 A3 inc DPTR
B1:A148 74 D0 mov A, #0xD0 ; 'ð'
B1:A14A F0 movx @DPTR, A
B1:A14B 90 FC 46 mov DPTR, #XRAM_FC46 ; Coordenada vertical (HI)
B1:A14E E4 clr A
B1:A14F F0 movx @DPTR, A
B1:A150 A3 inc DPTR
B1:A151 74 04 mov A, #4
B1:A153 F0 movx @DPTR, A
B1:A154 7D 12 mov R5, #0x12 ; "Slide Show" em chinês
B1:A156 7F 11 mov R7, #0x11
B1:A158 12 1E 22 lcall ShowIconB1BS
B1:A15B 90 FC 44 mov DPTR, #XRAM_FC44 ; Coordenada horizontal (HI)
B1:A15E 74 01 mov A, #1
B1:A160 F0 movx @DPTR, A
B1:A161 A3 inc DPTR
B1:A162 74 38 mov A, #0x38 ; '8'
B1:A164 F0 movx @DPTR, A
B1:A165 90 FC 46 mov DPTR, #XRAM_FC46 ; Coordenada vertical (HI)
B1:A168 E4 clr A
B1:A169 F0 movx @DPTR, A
B1:A16A A3 inc DPTR
B1:A16B 74 04 mov A, #4
B1:A16D F0 movx @DPTR, A
B1:A16E 7D 13 mov R5, #0x13 ; "Menu" em chinês
B1:A170 7F 11 mov R7, #0x11
B1:A172 12 1E 22 lcall ShowIconB1BS
B1:A175 90 FC 44 mov DPTR, #XRAM_FC44 ; Coordenada horizontal (HI)
B1:A178 74 01 mov A, #1
B1:A17A F0 movx @DPTR, A
B1:A17B A3 inc DPTR
B1:A17C 74 84 mov A, #0x84 ; 'ä'
B1:A17E F0 movx @DPTR, A
B1:A17F 90 FC 46 mov DPTR, #XRAM_FC46 ; Coordenada vertical (HI)
B1:A182 E4 clr A
B1:A183 F0 movx @DPTR, A
B1:A184 A3 inc DPTR
B1:A185 74 04 mov A, #4
B1:A187 F0 movx @DPTR, A
B1:A188 7D 14 mov R5, #0x14 ; ícone "< PREV"em chinês
B1:A18A 7F 11 mov R7, #0x11
B1:A18C 12 1E 22 lcall ShowIconB1BS
B1:A18F 90 FC 44 mov DPTR, #XRAM_FC44 ; Coordenada horizontal (HI)
B1:A192 74 01 mov A, #1
B1:A194 F0 movx @DPTR, A
B1:A195 A3 inc DPTR
B1:A196 74 CC mov A, #0xCC ; '¦'
B1:A198 F0 movx @DPTR, A
B1:A199 90 FC 46 mov DPTR, #XRAM_FC46 ; Coordenada vertical (HI)
B1:A19C E4 clr A
B1:A19D F0 movx @DPTR, A
B1:A19E A3 inc DPTR
B1:A19F 74 04 mov A, #4
B1:A1A1 F0 movx @DPTR, A
B1:A1A2 7D 15 mov R5, #0x15 ; ícone "NEXT >"em chinês
B1:A1A4 7F 11 mov R7, #0x11
B1:A1A6 02 1E 22 ljmp ShowIconB1BS
Ele só é executado se o valor da EEPROM para "OSD Language" for "3". E o maior valor armazenado lá é "2".
De qualquer forma, quantos proprietários brasileiros iriam setar o player para chinês? ;)
-
SetMpeg4SubtitleParams e Janela de Legenda
Eu descobri um método alternativo para identificar ambos no firmware, de forma automática.
Procure por
7F xx 12 ? ? D3 22
Substituindo "xx" com 0x10 até 0x13 em um loop.
Mesmo tentando de 0x10 até 0x13 você vai encontrar uma e apenas uma ocorrência dessa string, em SetMpeg4SubtitleParams.
E quando encontrar um resultado, o número usado será a janela de legendas.
Eu já implementei esse novo método no MTK Patcher. O método que estava usando até agora ficava inutilizado se SetMpeg4SubtitleParams tivesse sido modificada (patch de ajuste de posição vertical pelo menu).
Funciona com:
- Punktal PK-DV246
- Proview DVP-858
- Lenoxx DV-406
- Philips DVP5965
- Philips DVP5960
- Philips DVP5980
- Philips DVP5140
- Philips DVP3040
- Philips DVP5100
- Philips PET725
- Philips DVP720
Não funciona com
JTEC MTK7000 (este não tem nada sequer parecido)
-
Como localizar de uma vez só:
- ARM_PutChar
- OSD_text_params
- OSD_text_params_ARM
- OSD_Text_Color (ou OSD_SetColor)
- O número da janela do browser;
- As cores usadas no texto do browser;
- O número da janela do cabeçalho;
- As cores usadas no texto do cabeçalho
Funciona para:
- Philips DVP5100
- Philips DVP5980
- Philips DVP3040
- Philips DVP5965
- Philips DVP5960
- Philips DVP5140
- Philips PET725
- Punktal PK-DV246
- Proview DVP-858
- Lenoxx DV406
- Pioneer 575
Não funciona para:
- LG DV8XXX
- LG DK194g
- JTEC MTK7000
Procure por:
7F ? 12 ? ? 7D ? 7F ? 7E 02 12 ? ? 7D ? 7F
Você vai ter uma, e apenas uma, resposta (exemplo do DVP5960/55):
B1:5233 7F 0E mov R7, #0xE
B1:5235 12 1D 6A lcall OSD_Text_Params_ARM_B1
B1:5238 7F 0E mov R7, #0xE
B1:523A 12 1D 70 lcall OSD_Text_Params_B1BS
B1:523D 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B1:5240 74 02 mov A, #2 ; Cor #2 para o contorno
B1:5242 F0 movx @DPTR, A
B1:5243 A3 inc DPTR
B1:5244 04 inc A ; Cor #3 para o preenchimento
B1:5245 F0 movx @DPTR, A
B1:5246 E4 clr A
B1:5247 FB mov R3, A
B1:5248 FD mov R5, A
B1:5249 7F 0E mov R7, #0xE
B1:524B 12 1D 76 lcall OSD_TextColor_B1_BS
B1:524E D2 75 setb RAM_2E.5
B1:5250 7F 0F mov R7, #0xF ; Janela do Browser
B1:5252 12 1D 6A lcall OSD_Text_Params_ARM_B1
B1:5255 7F 0F mov R7, #0xF ; Janela do Browser
B1:5257 12 1D 70 lcall OSD_Text_Params_B1BS
B1:525A E4 clr A ; Cor #0 (transparente) para o contorno
B1:525B 90 FC 1E mov DPTR, #XRAM_FC1E ; OSD_colors
B1:525E F0 movx @DPTR, A
B1:525F A3 inc DPTR
B1:5260 74 0E mov A, #0xE ; Cor #14 para o preenchimento
B1:5262 F0 movx @DPTR, A
B1:5263 E4 clr A
B1:5264 FB mov R3, A
B1:5265 FD mov R5, A
B1:5266 7F 0F mov R7, #0xF ; Janela do Browser
B1:5268 12 1D 76 lcall OSD_TextColor_B1_BS
B1:526B 7D 01 mov R5, #1
B1:526D 7F 9A mov R7, #0x9A ; 'Ü'
B1:526F 7E 02 mov R6, #2
B1:5271 12 1B A8 lcall Arm_PutCharB1BS
B1:5274 7D 6A mov R5, #0x6A ; 'j'
B1:5276 7F 9B mov R7, #0x9B ; 'ø'
B1:5278 7E 02 mov R6, #2
B1:527A 12 1B A8 lcall Arm_PutCharB1BS
B1:527D 7D 2C mov R5, #0x2C ; ','
B1:527F 7F 9C mov R7, #0x9C ; '£'
B1:5281 7E 02 mov R6, #2
B1:5283 12 1B A8 lcall Arm_PutCharB1BS
-
Ryan,
Estive lendo e relendo o tópico - quem sabe não aprendo algo :P ::)
Mas para efeito de curiosidade, algumas vezes percebi que você menciona o Jtec Mtk7000 - dizendo que não localizou determinadas rotinas na firmware...
O MTKRemaker 0.23 B5 / B6 - com a firmware modificada 1.0e 1.0f - habilita aquele curioso recurso de patch das cores da legenda. A curiosidade é que até onde me lembro nenhuma outra firmware que eu tenha aberto no MtkRemaker o recurso é habilitado - como DVP5100 modificadas pelo JmAraujo / Umbanda / Lennox / Proview / LG / e outros Philips.
Porque !? Algum tipo de rotina diferente das que vocês usam !?
Não seria o motivo das suas buscas não retornarem nenhum padrão proximo para essa firmware ? Achei curioso que o programa do MaBreaker consiga achar a rotina nessa firmware e em outras varias firmwares não.
(http://img209.imageshack.us/img209/2098/mtkremakermtekot6.jpg)
-
Eu acabo de instalar o firmware do DVP5140 no DVP3040K e adivinhem...
Tá tudo funcionando!
Eu sou o feliz proprietário do primeiro DVP3040K do mundo com suporte a DivX Ultra! :yahoo!:
Jefferson,
Una duda... el codigo perteneciente a las funiones de divx ultra.... es parte del codigo 8032 o del codigo ARM?
Saludos,
FabianR
-
O MTKRemaker 0.23 B5 / B6 - com a firmware modificada 1.0e 1.0f - habilita aquele curioso recurso de patch das cores da legenda. A curiosidade é que até onde me lembro nenhuma outra firmware que eu tenha aberto no MtkRemaker o recurso é habilitado - como DVP5100 modificadas pelo JmAraujo / Umbanda / Lennox / Proview / LG / e outros Philips.
Eu não havia notado isso. Depois de não encontrar o recurso habilitado em vários firmwares eu já nem olho mais aquele menu.
Mas eu testei agora e o firmware do Punktal PK-DV246 também habilita as opções.
Porque !? Algum tipo de rotina diferente das que vocês usam !?
Sim. Sempre é esse o problema.
Não seria o motivo das suas buscas não retornarem nenhum padrão proximo para essa firmware ? Achei curioso que o programa do MaBreaker consiga achar a rotina nessa firmware e em outras varias firmwares não.
Às vezes ligeiras diferenças no código impedem um "match" durante a busca. Quando você me vê dizendo para usar o padrão " xx ?? YY ?? ..." e dar uma lista de vários firmwares onde o padrão funciona, não imagine que eu cheguei a esse padrão na primeira tentativa. Eu começo com um padrão que parece identificar a rotina e testo em cada um dos firmwares. Se não funcionar com um, refaço o padrão e tento de novo. Se funcionar com o novo padrão, analiso porque não funcionou com o primeiro e se for viável retesto com todos os outros.
No caso do JTEC, se não funcionar na primeira tentativa eu simplesmente anoto que com ele não funciona. Trata-se de um aparelho pouco popular, que já saiu de linha e que eu não possuo. Não vale a pena para mim perder tempo ajustando padrões para ele.
Porém ele tem diversas semelhanças com o Punktal e vai acabar se beneficiando do meu esforço para identificar as rotinas do uruguaio.
O caso do menu do mtkRemaker é especialmente complicado. Aquele patch é feito em Sub_Style, que é especialmente difícil de achar automaticamente.
A propósito, os firmwares do Punktal e do JTEC também são os únicos que conheço a ativar o patch de SetMPEG4SubtitleParams no mtkWindows. Confira.
-
Una duda... el codigo perteneciente a las funiones de divx ultra.... es parte del codigo 8032 o del codigo ARM?
Pelo que eu sei, quase tudo está no ARM.
-
A tabela de tipos de mídia no ARM
Entender o conteúdo deste post será importante para entender meus próximos posts.
Todo firmware Mediatek 13x9 tem uma tabela no ARM CODE que define quais são as extensões de mídia conhecidas pelo aparelho e, em parte, como tratar cada uma delas.
Fatos:
- Se uma extensão não estiver na tabela, nem vai aparecer no browser;
- Mesmo que uma extensão esteja na tabela, não significa que o arquivo vai aparecer no browser ou se aparecer, que é suportado de alguma forma.
- É possível fazer com que um arquivo válido, mas com extensão desconhecida, seja reconhecido e executado pelo aparelho, editando essa tabela.
A estrutura de cada item na tabela é a seguinte:
- "Tipo" de arquivo - um byte - Define como o arquivo vai ser tratado;
- Tamanho da extensão - um byte
- Extensão - cinco bytes - A extensão em ASCII
Para encontrar a tabela no firmware, salve o ARM CODES descomprimido e faça uma busca pela string "MP3".
A tabela do Proview DVP-858.
Estou usando o DVP-858 como exemplo por ser um dos aparelhos com suporte mais abrangente.
A extensão textual à direita foi adicionada por mim (ASCII já decodificado) para identificar cada item.
00 03 41 43 33 00 00 AC3
01 03 4D 50 33 00 00 MP3
02 03 4D 50 32 00 00 MP2
03 03 4D 50 31 00 00 MP1
04 03 57 41 56 00 00 WAV
05 03 4A 50 47 00 00 JPG
06 03 4D 4C 50 00 00 MLP
07 03 57 4D 41 00 00 WMA
08 03 41 53 46 00 00 ASF
09 03 4D 50 47 00 00 MPG
0A 03 44 41 54 00 00 DAT
0B 03 56 4F 42 00 00 VOB
0D 03 44 53 44 00 00 DSD
09 03 4D 50 45 00 00 MPE
09 03 4D 31 56 00 00 M1V
09 03 4D 32 56 00 00 M2V
05 03 4A 50 45 00 00 JPE
0C 03 41 41 43 00 00 AAC
09 04 4D 50 45 47 00 MPEG
05 04 4A 50 45 47 00 JPEG
0E 03 50 4D 46 00 00 PMF
0F 03 43 44 41 00 00 CDA
12 03 41 56 49 00 00 AVI
12 03 56 49 44 00 00 VID
12 04 44 49 56 58 00 DIVX
14 03 4D 50 34 00 00 MP4
14 03 4D 34 41 00 00 M4A
15 03 33 47 50 00 00 3GP
16 03 4D 34 56 00 00 M4V
17 03 44 53 54 00 00 DST
18 03 4F 47 47 00 00 OGG
18 03 4F 47 4D 00 00 OGM
19 02 52 41 00 00 00 RA
19 02 52 4D 00 00 00 RM
19 03 52 41 4D 00 00 RAM
19 03 52 4D 4D 00 00 RMM
19 04 52 4D 56 42 00 RMVB
A tabela do Punktal PK-246 é idêntica, mas sem o registro para a extensão .M4A
A mesma tabela, ordenada por código:
Os asteriscos sinalizam extensões que eu já testei e aparecem
00 03 41 43 33 00 00 AC3 - nem aparece no browser
01 03 4D 50 33 00 00 *MP3
02 03 4D 50 32 00 00 MP2
03 03 4D 50 31 00 00 MP1
04 03 57 41 56 00 00 WAV
05 03 4A 50 47 00 00 *JPG
05 04 4A 50 45 47 00 JPEG
05 03 4A 50 45 00 00 JPE
06 03 4D 4C 50 00 00 MLP
07 03 57 4D 41 00 00 *WMA
08 03 41 53 46 00 00 ASF
09 03 4D 50 47 00 00 *MPG
09 03 4D 50 45 00 00 MPE
09 04 4D 50 45 47 00 MPEG
09 03 4D 31 56 00 00 M1V
09 03 4D 32 56 00 00 M2V
0A 03 44 41 54 00 00 DAT
0B 03 56 4F 42 00 00 VOB
0C 03 41 41 43 00 00 AAC
0D 03 44 53 44 00 00 DSD
0E 03 50 4D 46 00 00 PMF
0F 03 43 44 41 00 00 CDA
12 03 41 56 49 00 00 *AVI
12 03 56 49 44 00 00 VID
12 04 44 49 56 58 00 *DIVX
14 03 4D 50 34 00 00 *MP4
14 03 4D 34 41 00 00 *M4A
15 03 33 47 50 00 00 *3GP
16 03 4D 34 56 00 00 M4V
17 03 44 53 54 00 00 DST
18 03 4F 47 47 00 00 *OGG
18 03 4F 47 4D 00 00 *OGM
19 02 52 41 00 00 00 RA - nem aparece no browser
19 02 52 4D 00 00 00 RM - nem aparece no browser
19 03 52 41 4D 00 00 RAM - nem aparece no browser
19 03 52 4D 4D 00 00 RMM - nem aparece no browser
19 04 52 4D 56 42 00 RMVB - nem aparece no browser
Manipulando a tabela do Proview DVP-858 já verifiquei o seguinte:
- É possível fazer com que arquivos .aac sejam executados. Perceba que curiosamente consta um item para a extensão na tabela, mas nós já sabemos que arquivos .aac nem aparecem no browser (você precisa renomear para .m4a). Basta trocar o "0C" por "14" no tipo do item para corrigir isso.
- Podemos adicionar até cinco extensões novas facilmente, apenas editando os cinco últimos itens;
- Infelizmente, não dá para fazer com que AAC seja manipulado como se fosse MP3, dando a ele o código "01". Deve haver uma outra verificação mais adiante que rejeita o arquivo e volta para o browser;
- Não adianta atribuir os códigos "14" ou "12" para AC3. O arquivo aparece no browser, mas é rejeitado.
- Se você quiser que as legendas apareçam no browser, basta usar por exemplo os itens inúteis de RA a RMVB e atribuir um "tipo" que tenha visibilidade. É claro que selecionar as legendas não vai servir para nada e poderá até travar o aparelho.
-
DIR_SET_ICON (ou DIR_SetIcon)
Esta rotina determina que ícone vai ser exibido no browser para cada tipo de arquivo.
No documento "Info - File Browser.rtf", Mabreaker cita de passagem essa rotina, sem entrar em detalhes. Tão de passagem que eu passei várias vezes pelo parágrafo sem nunca entender do que ele estava falando.
Neste post eu explico em detalhes como a rotina funciona.
Para encontrar a rotina no seu firmware, procure por:
CE EF CE EE F4
Funciona com:
- Philips DVP5960
- Philips DVP5965
- Philips DVP5980
- Philips DVP5100
- Philips DVP3040
- Philips DVP5140
- JTEC MTK 7000
- Proview DVP-858
- Punktal PK-DV246
- Lenoxx DV-406
Não funciona com:
- Philips PET725 (use EF F4 60 06 ou 90 ? ? 93 FF 22)
- LG DK194g
- Pioneer 575
Você vai encontrar algo assim (Proview DVP-858 20.07):
B1:FBC5 DIR_Set_Icon: ; CODE XREF: Dir_Disp_FileList+11Fp
B1:FBC5 CE xch A, R6
B1:FBC6 EF mov A, R7
B1:FBC7 CE xch A, R6
B1:FBC8 EE mov A, R6
B1:FBC9 F4 cpl A
B1:FBCA 60 06 jz Retorna6 ; Se o tipo for 0xFF, retorna 6
B1:FBCC EE mov A, R6
B1:FBCD D3 setb C
B1:FBCE 94 1A subb A, #0x1A ; Só manipula tipos de 1A para baixo
B1:FBD0 40 03 jc IconLookup
B1:FBD2
B1:FBD2 Retorna6: ; CODE XREF: DIR_Set_Icon+5j
B1:FBD2 7F 06 mov R7, #6 ; Qualquer tipo acima de 1A exibirá o ícone 6 (unknown)
B1:FBD4 22 ret
B1:FBD5 ; ---------------------------------------------------------------------------
B1:FBD5
B1:FBD5 IconLookup: ; CODE XREF: DIR_Set_Icon+Bj
B1:FBD5 EE mov A, R6
B1:FBD6 90 33 B5 mov DPTR, #B1_33B5
B1:FBD9 93 movc A, @A+DPTR ; B1:33B5 + tipo = ícone a usar
B1:FBDA FF mov R7, A
B1:FBDB 22 ret
B1:FBDB ; End of function DIR_Set_Icon
Em resumo, a rotina pega o "tipo" atribuído no ARM para cada extensão (veja o meu post anterior) e consulta uma pequena tabela no firmware, que começa no endereço destacado em vermelho, para saber qual o ícone será exibido para aquele tipo.
Veja a tabela:
B1:33B5 06 B1_33B5:.byte 6 ; DATA XREF: DIR_Set_Icon+11o
B1:33B6 04 .byte 4
B1:33B7 0C .byte 0xC
B1:33B8 0B .byte 0xB
B1:33B9 06 .byte 6
B1:33BA 05 .byte 5
B1:33BB 06 .byte 6
B1:33BC 0D .byte 0xD
B1:33BD 0D .byte 0xD
B1:33BE 0A .byte 0xA
B1:33BF 0A .byte 0xA
B1:33C0 0A .byte 0xA
B1:33C1 06 .byte 6
B1:33C2 06 .byte 6
B1:33C3 06 .byte 6
B1:33C4 06 .byte 6
B1:33C5 07 .byte 7
B1:33C6 06 .byte 6
B1:33C7 2D .byte 0x2D ; -
B1:33C8 06 .byte 6
B1:33C9 2F .byte 0x2F ; /
B1:33CA 32 .byte 0x32 ; 2
B1:33CB 06 .byte 6
B1:33CC 06 .byte 6
B1:33CD 31 .byte 0x31 ; 1
B1:33CE 06 .byte 6
Olhando assim não fica nada claro, então eu fiz uma ilustração que ajuda (atenção: alguns ícones parecem idênticos, mas não são):
(http://ryan.com.br/imagens/mediatek/mediatek_dir_set_icon_proview(75).jpg)
Notas:
- Os tipos de arquivo não-exibíveis são filtrados antes de chegar a essa rotina. Se chegassem, exibiriam o ícone "unknown". Eu ainda não sei se a filtragem ocorre no ARM ou no 8032 (pode ser em DIR_FilenameFilter);
- Os números de ícone indicados podem variar de firmware para firmware, principalmente de 0xE em diante. Olhe no mtkRemaker qual a numeração correta do seu;
- Mabreaker diz que além deste tipo de rotina existe um que usa um CASE para determinar o ícone. Eu ainda não vi esse tipo (e ele não dá nenhum exemplo), mas é provável que seja o tipo usado por Pioneer e LG;
- Perceba que eu não coloquei descrição para os tipos 0x10, 0x11 e 0x13 porque eles não estão na tabela do ARM. Sabemos agora que 0x10 é "pasta" por causa de seu ícone, mas 0x11 e 0x13 eu ainda não sei o que são.
- Manipulando esta tabela você pode dar ícones diferentes a tipos diferentes que estão usando o mesmo ícone, como é o caso de MPG, DAT e VOB. Mas não é possível dar ícones diferentes para arquivos de um mesmo tipo, como é o caso de AVI e DIVX;
DIR_SET_ICON é chamada apenas de um lugar no firmware, em DIR_DISP_FILELIST:
B1:6792 90 FB A0 mov DPTR, #XRAM_FBA0 ; "Tipo" do arquivo
B1:6795 E0 movx A, @DPTR
B1:6796 FF mov R7, A
B1:6797 12 FB C5 lcall DIR_Set_Icon
B1:679A CD xch A, R5 ; DIR_SET_ICON devolve o ícone em R7, mas SHOWICON espera
B1:679A ; o ícone em R5, daí uma dança de bytes é necessária :)
B1:679B EF mov A, R7
B1:679C CD xch A, R5
B1:679D 7F 10 mov R7, #0x10
B1:679F 12 1E 22 lcall ShowIconB1
Nota: As instruções "xch" que você vê tanto aqui quanto na rotina DIR_SET_ICON me parecem desnecessárias e poderiam ser eliminadas reescrevendo DIR_SET_ICON, o que pouparia alguns bytes. Mas eu vou deixar para tentar provar essa teoria quando esses bytes livres forem úteis para alguma coisa :)
-
Ryan,
Não sei se neste ou talvez em um outro tópico, você saberia / poderia colocar do que se trata as demais extensões que parecem estranhas na sua lista.
Suponho que se estão em um DVD Player que pode reproduzir DVD's e DATA, se tratem todos de arquivos multimídia, mas não fui muito feliz no google em identificar o que são alguns menos conhecidos.
Ex:
.DSD
.DST
.VID
.PMF
.MLP ( Encontrei algo sobre DVD-Audio ) mas o formato tanto para encode quanto decode é restrito. Não tem nada aberto
Att
-
Não sei se neste ou talvez em um outro tópico, você saberia / poderia colocar do que se trata as demais extensões que parecem estranhas na sua lista.
Eu não faço a menor idéia do formato dos arquivos que usam essas extensões.
-
.MLP ( Encontrei algo sobre DVD-Audio ) mas o formato tanto para encode quanto decode é restrito. Não tem nada aberto
Att
Meridian Lossless Packing. Comprime áudio PCM sem perda de qualidade (assim como FLAC, SHN, APE e outros). Suporta áudio estéreo ou multicanal. Existe um programa para codificar e decodificar esse formato.
Eu já usei algumas vezes. Baixei alguns DVDs Áudio decodificados em WAV, transformei em MLP, e "autorei" em DVD-A, com um programa próprio para isso. O DVD-A usa aquele diretório chamado AUDIO_TS dentro do DVD. As músicas e o conteúdo visual ficam em arquivos com extensão "AOB" dentro de AUDIO_TS.
Por que o DVD-A usa MLP? Além da economia de espaço, faça as contas: arquivos PCM com 24 bits, 96 kHz, multiplicados por 6 canais, por exemplo, ultrapassam o bitrate máximo de 9.6 Mbps do DVD. Se esse áudio é comprimido, o bitrate baixa na leitura, e o DVD-A player consegue lê-lo. Em seguida, a descompressão de MLP para PCM é feita no aparelho.
Não é necessário comprimir áudio estéreo de 24 bits, 192 kHz. Esse não ultrapassa o bitrate máximo do DVD.
-
Interessante :) :clapping: :yahoo!:
Evb62 - muito obrigado.
-
Una duda... el codigo perteneciente a las funiones de divx ultra.... es parte del codigo 8032 o del codigo ARM?
Pelo que eu sei, quase tudo está no ARM.
Hmmm... y se pueden cambiar el codigo ARM del 3040K por el del 5140? De esta forma tendriamos divx ultra en el 3040K pero mantenrdiamos el codigo 8032 que por lo que entiendo de todos los analisis que he visto esta mas analizado y entendido que el del 5140, y sin mencionar que por tus descubrimientos podriamos utilizar 2MB en vez de 1MB...
Saludos,
FabianR
-
Hmmm... y se pueden cambiar el codigo ARM del 3040K por el del 5140? De esta forma tendriamos divx ultra en el 3040K pero mantenrdiamos el codigo 8032 que por lo que entiendo de todos los analisis que he visto esta mas analizado y entendido que el del 5140, y sin mencionar que por tus descubrimientos podriamos utilizar 2MB en vez de 1MB...
Eu testei e apresenta o mesmo problema que ocorre ao colocar o RISC do DVP5140 no DVP5100: os menus DivX Ultra aparecem, mas você não consegue selecionar nada.
-
Hmmm... y se pueden cambiar el codigo ARM del 3040K por el del 5140? De esta forma tendriamos divx ultra en el 3040K pero mantenrdiamos el codigo 8032 que por lo que entiendo de todos los analisis que he visto esta mas analizado y entendido que el del 5140, y sin mencionar que por tus descubrimientos podriamos utilizar 2MB en vez de 1MB...
Eu testei e apresenta o mesmo problema que ocorre ao colocar o RISC do DVP5140 no DVP5100: os menus DivX Ultra aparecem, mas você não consegue selecionar nada.
Isso mesmo. É preciso adicionar código no 8032 (veja o firmware jmaraujo 1.2beta1 que postei no fórum: as teclas Ok/Play -11- e Title e Return -22 e 23- foram adicionadas. Falta somente o código das setas).
-
Gracias al hecho de que ahora tengo un cable USB para conectar a la PC, he logrado comprobar algo que sospechaba desde hace tiempo: el FW del 3010/02 es compatible con el 3040K/55. En realidad este FW no tiene ventajas sobre el FW del 3040K (yo tenia la esperanza de que soportara multisesión) excepto una... permite actualizar FW de mas de 1MB mediante CD!!!! ;D ;D ;D
Lamentablemente no es 100% compatible, por ejemplo, el audio se escucha horrible y el lector hace unos sonidos raros al cargar un video con varios subtitulos asi que no se puede usar. :( :( :(
Lo bueno es que podemos usarlo como herramienta para cargar mods del 3040K y del 5140 que tengan más de 1MB, mediante el siguiente procedimiento:
- Reducimos el FW del 3010 (DVP3010_02.BIN) a menos de 1MB (quitando idiomas y fuentes) y lo renombramos como DVP3040K_55.BIN
- Lo cargamos en el 3040K. En este punto, si el TV no soporta PAL, la imagen no se va a ver bien, hay ir al menu y seleccionar NTSC, ademas en la opción "component" se tiene que cambiar de RGB a YUV (Todo esto es opcional, pues el siguiente paso bien se puede hacer con la imagen en movimiento).
- Cargamos nuestro mod de más de 1MB previamente renombrado a DVP3010_02.BIN para que sea reconocido.
Y asi es como logramos sobrepasar el limite de 1MB de los FWs del 3040 y 5140 (yo ya lo he probado) :yahoo!: :yahoo!: :yahoo!:
La verdad es que sólo Dios sabe porque Phillips pone 2MB de flash de hardware pero hace que el FW limite la actualización por CD a 1MB.
PD: Jefferson, por favor confirma que el procedimiento funciona.
-
Depois de descobrir que o RISC do DVP5160 tem suporte a multisessão em DVD-R, fiz algumas experiências (quase todas fracassadas) que vou resumir aqui:
Firmware DVP5160/12 no DVP5100K/78 - Nem liga
RISC DVP5160/12 no firmware DVP5100K/78 - trava exibindo "HELLO" no VFD
Firmware DVP5160/12 no DVP3040K/55 - Nem liga
RISC DVP5160/12 no firmware DVP5140, instalado no DVP3040K/55 - trava exibindo "PHILIPS" no VFD
O único sucesso foi que o RISC funciona no DVP5960 (e reportadamente no DVP5980)
Acheron: Depois eu farei o seu teste. Estou ocupado com outra experiência agora.
-
Acheron,
Eu parei hoje para seguir seu procedimento e estou com uma dúvida.
Por que você está usando o firmware do DVP3010 para poder instalar um firmware de DVP3040 de mais de 1MB?
No meu último teste, eu consegui instalar o firmware de DVP3040K de 1,5MB logo depois de instalar o firmware oficial, sem problemas aparentes.
Seguindo esse procedimento, o firmware de DVP5140 de 1,5MB lê DVDs?
Eu não cheguei nessa parte do teste ainda. Parei para estudar por que o sistema de vídeo do DVP3010 não é reconhecido pela minha placa de captura, nem pela entrada de video composto de minha TV, apesar de ambas suportarem PAL e NTSC.
-
Hola Jefferson,
Algunas aclaraciones sobre el tema:
Por que você está usando o firmware do DVP3010 para poder instalar um firmware de DVP3040 de mais de 1MB?
No meu último teste, eu consegui instalar o firmware de DVP3040K de 1,5MB logo depois de instalar o firmware oficial, sem problemas aparentes.
El procedimiento "FW 3040 oficial" --> "FW>1MB" no funciona. Me parece que el FW de 1,5MB que usaste en tus pruebas lo hiciste agregando el bloque MPEG de un LG, pero como el FW no usa los MPEGs extras, no se nota la diferencia.
Lo mejor para testear es usar el FW original pero reemplazando el Wallpaper y el Filebrowser por otros de mayor tamaño (unos 100KB cada uno). De esta forma te aseguras que el FW va a usar el espacio extra. Prueba de nuevo así y verás que no funciona (hay errores en el WP y FB).
Seguindo esse procedimento, o firmware de DVP5140 de 1,5MB lê DVDs?
Yo me equivoqué en este punto, lamentablemente mi procedimiento sólo sirve para el FW del 3040, no para el del 5140 :dashhead1:.
Depois de descobrir que o RISC do DVP5160 tem suporte a multisessão em DVD-R, fiz algumas experiências (quase todas fracassadas) que vou resumir aqui:
(...)
Firmware DVP5160/12 no DVP3040K/55 - Nem liga
RISC DVP5160/12 no firmware DVP5140, instalado no DVP3040K/55 - trava exibindo "PHILIPS" no VFD
Yo tengo entendido que para que funcione el soporte multisesión, tanto el RISC como el 8032 deben soportarlo. El problema del FW del 3040K es que su 8032 no soporta multisesión, por eso es que aunque se le ponga el RISC del 5140 (que si soporta multisesión) no se le puede hacer funcionar.
Respecto al FW del 3010, te aconsejo que no te dediques a entenderlo. No tiene ninguna ventaja sobre el FW del 3040 (excepto por el tema del flash de 2MB) y falla en varios otros aspectos al usarse en el DVP3040, como en el audio y la carga de subtitulos. Aunque si puedes reparar esas fallas entonces sí sería posible usarlo.
Pasando a otro tema, quisiera pedirte que cuando tengas tiempo me ayudes con el RISC del 5140 (para ser mas especifico, los ARM Codes), que por alguna razón sólo muestra un máximo de 40 caracteres (sin contar la extensión) de los nombres de archivos en el FB (no afecta a los nombres de directorios) sin importar a cuánto se le aumente el límite en el 8032.
Saludos.
-
Una pequeña contribución que creo que no ha sido mencionada todavía (si ya es conocida, borren este post). Revisando el FW del 5140 noté la existencia de una opción de menú para activar los closed captions de los DVDs, la cual también está presente, aunque sin usar, en el FW del 3040 (y supongo que en otros modelos).
Una vez que sabe que "existe" es fácil de encontrar. Yo la puse como sexta opción en el menu "Video Setup Page" (en el DVP5140 estaba ahí) quedando así:
6. No Pic. | Closed Captions | Closed Caption
0008 FFFF 009C 00BF 0019 0033 0001 0001 FF36E1 0A15 - ROM:36E7
1. On | Closed Caption On | On
0260 009F 0260 00 - ROM:36D3
=> 2. Off | Closed Caption Off | Off
025C 009E 025C 01 - ROM:36DA
En la Pag2 del 8032 del DVP3040 está en el ROM 36E7, para encontrarlo en otros modelos basta buscar la secuencia inicial "0008 FFFF 009C 00BF". Por ejemplo en el DVP5100 (si no me equivoco) está en el ROM 3689.
-
Descoberta muito interessante, Acheron. :)
No caso do DVP5100 não se trata somente de um menú oculto, mas sim de um menú que não estava nem "linkeado" sequer... Nenhuma das páginas do menú (usadas ou ocultas) fazem referencia ao "closed captions".
Parabéms pela descoberta. :clapping:
-
A tabela de tipos de mídia no ARM
Todo firmware Mediatek 13x9 tem uma tabela no ARM CODE que define quais são as extensões de mídia conhecidas pelo aparelho e, em parte, como tratar cada uma delas.
Bacana...
Como já devem saber, o Proview 858 não é compatível do DVD-VR (formato usado por gravadores de mesa em midia DVD-RW), porém consegue enchergar o disco
Como o arquivo de video do DVD-VR é a grosso um MPG2 com extensão VRO, daria p/ fazer o Proview 858 ler este VRO?
Pena q que sou totalmente ignorante nesta parte de assembler e ARM :dashhead1:
Legal...
LioZ
-
Olá a todos!!
Ryan, você irá publicar como é feito o ajuste de legendas no Proview?
(se ja foi mostrado, perdão e pode apagar este post)
-
Talvez esse não seja o lugar ideal para falar isso, mas não achei pertinente abrir um tópico só pra isso, e aqui tem um monte de gente que mexe com isso.
Então, Jefferson, se quiser pode deletar isso depois, pra manter o tópico organizado no propósito inicial.
Instalei o IDA 5.1 no meu PC, abri o código 8032 e executei os scripts. Não deu nenhum erro, mas a formatação do código na aba "IDA View-A" tá diferente da formatação que aparece nos códigos postados aqui.
Tirei um print screen da minha tela:
(http://lh5.google.com.br/librenz/Rx66ll6MN1I/AAAAAAAAAqA/X8OcfFDPX7Y/s144/ida_nao_vejo_o_codigo.png) (http://lh5.google.com.br/librenz/Rx66ll6MN1I/AAAAAAAAAqA/X8OcfFDPX7Y/s1024-h/ida_nao_vejo_o_codigo.png)
Como pode ser visto, o código (aquele que aparece no editor hexadecimal) não aparece. Mas ele funciona. Fiz uma procura por um trecho conhecido por mim e o IDA o encontrou, até levou o cursor até lá, apesar do código não aparecer.
O que pode estar errado?
-
Como pode ser visto, o código (aquele que aparece no editor hexadecimal) não aparece. Mas ele funciona. Fiz uma procura por um trecho conhecido por mim e o IDA o encontrou, até levou o cursor até lá, apesar do código não aparecer.
O que pode estar errado?
Tente com isto:
http://ryan.com.br/smf/index.php?topic=179.msg9171925;topicseen#msg9171925 (http://ryan.com.br/smf/index.php?topic=179.msg9171925;topicseen#msg9171925)
Saudações!
-
Tente com isto:
http://ryan.com.br/smf/index.php?topic=179.msg9171925;topicseen#msg9171925 (http://ryan.com.br/smf/index.php?topic=179.msg9171925;topicseen#msg9171925)
Saudações!
Valeu, jmaraujo!!!!! :yahoo!:
Desculpa por perguntar algo que já tinha sido perguntado! (http://www.kolobok.us/smiles/standart/blush.gif)
Eu até já tinha lido isso, mas faz tanto tempo que eu não lembrava mais. (http://www.kolobok.us/smiles/standart/punish2.gif)
Sem falar que quando li eu não entendi qual era a dúvida do Jefferson.
-
Acho que ainda tem alguma coisa errada com o meu IDA.
Na verdade está tudo meio confuso ainda, mas acho que isso aqui não está certo.
Não encontro a palavra "remote" procurando no código, por exemplo, e acho que eu deveria encontrar.
Aí fui olhar uma parte do código (do firmware que estou trabalhando, DVP5980) postada pelo Ryan neste tópico e estava assim:
B1:F6FE Sub_Style: ; DATA XREF: B0:B0_BS_689_B1_F6FEo
B1:F6FE ; B1:B1_BS_689_B1_F6FEo ...
B1:F6FE 90 FB D2 mov DPTR, #XRAM_FBD2
B1:F701 EE mov A, R6
Só que pra mim aparece assim:
B1:F6FE BankSw_689_B1_F6FE: ; DATA XREF: B0:B0_BS_689_B1_F6FEo
B1:F6FE ; B1:B1_BS_689_B1_F6FEo ...
B1:F6FE 90 FB D2 mov DPTR, #XRAM_FBD2
B1:F701 EE mov A, R6
Não deveria ser assim, não é mesmo?
Será que pode ser os scripts que rodei? Peguei ambos (MT1389_8032_FULL.idc e MT1389_Misc.idc) no grupo mt13x9 do Yahoo (http://tech.groups.yahoo.com/group/mt13x9/files/Disassembling/%21IDA%20Scripts/). Um é de 7 de fevereiro de 2007 e o outro é de 28 de Outubro de 2006, respectivamente.
Cheguei a desinstalar o IDA 5.1, colocar o 5.0 e processar o código todo novamente, mas não adiantou. :(
-
Nem todas as funções são identificadas pelos scripts. Você tem que fazer click sobre o nome da função (no seu caso "BankSw_689_B1_F6FE") e trocar o nome dela.
-
Nem todas as funções são identificadas pelos scripts. Você tem que fazer click sobre o nome da função (no seu caso "BankSw_689_B1_F6FE") e trocar o nome dela.
Creo que seria genial para los que somos nuevos en esto que Jefferson hiciera un dump a idc de sus bases de IDA
(idb) de los 8032/ARM codes de los diferentes modelos y los publicara. Es la forma que tiene IDA de poder "pasar el trabajo"
sin enviar el "ejecutable por temas legales" o incluir datos de usuario IDA, etc.
Estos idc comprimidos son bien pequeñitos... :)
Que opinan?
Han probado utilizar el Bindiff v2 de Sabre technologies para comparar firmwares? Es un plugin de IDA...
Saludos,
FabianR
PD el metodo es:
File-> Produce files -> Dump database to idc file
-
Nem todas as funções são identificadas pelos scripts. Você tem que fazer click sobre o nome da função (no seu caso "BankSw_689_B1_F6FE") e trocar o nome dela.
Ah bom... É que eu achei que ele reconheceria essa. Na verdade eu achei que ele não tinha reconhecido nenhuma, mas já encontrei algumas (poucas) que ele reconheceu. Uma delas é a Video_Play.
Valeu, Jmaraujo. Agora estou começando a compreender o IDA. Já me foi útil para trocar a função de uma tecla do controle remoto.
-
Olá a todos!!
Ryan, você irá publicar como é feito o ajuste de legendas no Proview?
(se ja foi mostrado, perdão e pode apagar este post)
Não eu não mostrei ainda.
Eu pretendo fazer isso, mas não estou encontrando tempo no momento.
Você pode tentar comparando o código 8032 das minhas duas últimas versões do firmware com o UltraCompare.
-
Como usar o "Expert Mode" do mtkTool
[...]
Exemplo de uso:
* Abra a janela "Memory Dump"
* Em "type" selecione "DRAM (BYTE)"
* Em "Address" coloque o endereço 376e599
* Desmarque "Double Word" se existir essa opção na sua versão
* Clique em Start
O resultado na tela será teóricamente o conteúdo da memória eeprom do aparelho.
Notas:
O endereço do conteúdo da eeprom não é fixo. É o endereço da Shared Memory (armAddressInfo) + 0x1999
http://tech.groups.yahoo.com/group/mt13x9/message/4339
Eu não estou certo de que 376e599 seja mesmo o endereço base da cópia da eeprom na Shared Memory. Os dados não batem com os exemplos que encontrei no MT13x9 e, embora os valores mudem quando eu mexo no setup, não estão mudando de forma consistente.
Testei isso aqui, com o DVP5980K/55.
Liguei o aparelho, deixei ele em uma pasta qualquer do disco que estava lendo, sem reproduzir nada.
Mandei o MtkTool ler 1024 bytes (é a capacidade do chip de memória eeprom que está na placa do DVD player) a partir do endereço 375E599 (como diz na mensagem de foncreator que o link indica e não 376E599 como disse o Jefferson, que provavelmente se enganou).
Salvei o conteúdo em um arquivo binário (eeprom01.bin).
Entrei no setup do aparelho e liguei o "Night Mode", em Audio Setup Page. Saí do Setup.
Li novamente o conteúdo da suposta eeprom e salvei novamente (eeprom02.bin).
Entrei no setup do aparelho e desliguei o "Night Mode". Saí do Setup.
Li novamente os 1024 bytes e salvei novamente (eeprom03.bin).
Deveria acontecer o seguinte, até onde eu sei:
Comparando eeprom01.bin com eeprom02.bin deveria haver um (ou alguns) bytes diferentes.
Comparando eeprom01.bin com eeprom03.bin deveria haver zero bytes diferentes. Os arquivos deveriam ser idênticos.
O que aconteceu:
Comparando eeprom01.bin com eeprom02.bin obtive um byte diferente: o primeiro. (obs.: outro dia fiz o mesmo teste mudando outra propriedade do setup, o Lip Sync, e o único byte que mudou também foi o primeiro!)
Comparando eeprom01.bin com eeprom03.bin obtive também um byte diferente: novamente o primeiro.
Comparando eeprom02.bin com eeprom03.bin obtive como resultado: os arquivos são idênticos.
Comparações feitas com o UltraCompare Professional 5.10.
Conclusão: Como disse o Jefferson, a maneira com que os bytes mudam é totalmente inconsistente. A teoria de que esse conteúdo é o da eeprom é, na minha opinião, uma inverdade. Hehe.
Talvez o furo do meu teste esteja no endereço da tal Shared Memory. Não sei o que é isso, e talvez isso mude de aparelho para aparelho, sei lá.
-
Una pequeña contribución que creo que no ha sido mencionada todavía (si ya es conocida, borren este post). Revisando el FW del 5140 noté la existencia de una opción de menú para activar los closed captions de los DVDs, la cual también está presente, aunque sin usar, en el FW del 3040 (y supongo que en otros modelos).
Após o "pequeno" susto que levei com o meu DVP5100, testei a descoberta do Acheron, e agora o DVP5100 tem -pela primeira vez- suporte a closed caption!!!
Obrigada, Acheron.
-
Jefferson você poderia me emviar os mpeg[2] desses topicos aqui:
http://ryan.com.br/smf/index.php?topic=179.msg9172124#msg9172124
http://ryan.com.br/smf/index.php?topic=179.msg9172087#msg9172087
se possivel tambem em formato bitmap o original pelo qual voce vez eles pois eu não consegui transformar o mpeg em bitmap.
para não vim aqui só para me aproveitar do forum e de voce, deicho minha sinjela ajuda, a maior pasta skin do firmware do lg dk194g com 18 espaços
-
Olá Ryan.
Eneris e eu estamos "suando" para fazer o menu de fontes do 5965k - que a Philips tentou matar - funcionar. Fizemos, onde tinha só Standard, aparecer 4 opções para fonte, porém, quando acionadas não fazem nenhuma modificação. Creio que tem mudar algo no código Assembly, e issoé que não sei fazer nada, a não ser que me digam os códigos que inserir.
Estive também tentando mudar os códigos sub_style e sec. para o menu de cores, com os pulos de banco (o que você mensionou numa página anterior), mas não ficou idêntica, mesmo colocando os códigos que são específicos do 5965k.
Mas voltando ao menu de fontes, ele ficou assim:
(http://farm3.static.flickr.com/2378/2048021670_4015a37db9.jpg?v=0)
[O Eneris testou e disse que o menu aparece como está acima, mas não modifica a fonte do filme quando selecionado qualquer uma delas].
(http://farm3.static.flickr.com/2075/2047232327_b61f7bc924.jpg?v=0)
[Aqui está os códigos hexadecimais que acrescentei: Os pointers, como o JMaraujo instruiu].
Se puder nos ajudar de alguma forma eu agradeceria. Estou entrando nesse mundo de firmware agora, mas já estou fascinado.
Grande abraço.
O que tentamos fazer está aqui:
http://www.4shared.com/file/29757260/9bab3442/DVP5965K_93mod_Naasom.html?dirPwdVerified=67cd922f (http://www.4shared.com/file/29757260/9bab3442/DVP5965K_93mod_Naasom.html?dirPwdVerified=67cd922f)
-
Olá Ryan.
Eneris e eu estamos "suando" para fazer o menu de fontes do 5965k - que a Philips tentou matar - funcionar. Fizemos, onde tinha só Standard, aparecer 4 opções para fonte, porém, quando acionadas não fazem nenhuma modificação. Creio que tem mudar algo no código Assembly, e issoé que não sei fazer nada, a não ser que me digam os códigos que inserir.
Estive também tentando mudar os códigos sub_style e sec. para o menu de cores, com os pulos de banco (o que você mensionou numa página anterior), mas não ficou idêntica, mesmo colocando os códigos que são específicos do 5965k.
Mas voltando ao menu de fontes, ele ficou assim:
(http://farm3.static.flickr.com/2378/2048021670_4015a37db9.jpg?v=0)
[O Eneris testou e disse que o menu aparece como está acima, mas não modifica a fonte do filme quando selecionado qualquer uma delas].
(http://farm3.static.flickr.com/2075/2047232327_b61f7bc924.jpg?v=0)
[Aqui está os códigos hexadecimais que acrescentei: Os pointers, como o JMaraujo instruiu].
Se puder nos ajudar de alguma forma eu agradeceria. Estou entrando nesse mundo de firmware agora, mas já estou fascinado.
Grande abraço.
O que tentamos fazer está aqui:
http://www.4shared.com/file/29757260/9bab3442/DVP5965K_93mod_Naasom.html?dirPwdVerified=67cd922f (http://www.4shared.com/file/29757260/9bab3442/DVP5965K_93mod_Naasom.html?dirPwdVerified=67cd922f)
Me corrijam se eu estiver errado, mas o que o naason fez foi apenas adicionar opções ao menu. O próximo passo seria adicionar os novos tipos de fontes (ou usar as que já existem) na área de dados e usar a rotina que altera o tipo de fonte no registrador correspondente.
Um detalhe importante é que este item de menu não parece estar chamando nehuma rotina, pois sua posição 10 está com 0000. Isto está correto? Não seria interessante ele chamar a Sub_Style?
Outro detalhe é que a Font 1 é referenciada por 00-01 (Font[00-01]), Font 2 por 02-04, (Font 2[02-04]), e assim por diante, no mtkRemaker. Não seria o caso de colocar estes valores: Font1=00, Font 2=02, Fonte 3=05, Font 4=07...
Abraço,
-
Senhores, tenho o prazer de anunciar que terminei o firmware do DVP5965K com fontes selecionáveis no Menu! Está 100% funcional. Estou melhorando as fontes e postarei aqui o que fiz para avaliação! (quando chegar em casa eu posto o firmware).
Considerações iniciais:
- É preciso alterar a subrotina que o Ryan colocou neste post (http://ryan.com.br/smf/index.php?topic=179.msg9172344;topicseen#msg9172344) para destravar a fonte 7 (e otimizá-la)
- É preciso alterar Sub_Style para que a fonte escolhida seja carregada no início (e não apenas quando entrar no setup)
- É preciso alterar o menu de legendas divx, adicionando as novas opções (podemos ter até 5). Cada item deve conter o valor da respectiva fonte, e não 1, 2, 3... como prefere a Philips ;) (Esta parte não vou mostrar aqui pois já foi bastante discutido no post)
As alterações:
Primeiro na rotina de seleção das fontes (a BankSw_681_B1_E60B)
B1:E60B ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:E60B
B1:E60B
B1:E60B BankSw_681_B1_E60B: ; DATA XREF: B0:B0_BS_681_B1_E60Bo
B1:E60B 7F E2 mov R7, #0xE2
B1:E60D 7E 07 mov R6, #7
B1:E60F 12 1B 84 lcall ARM_GetChar_B1_BS
B1:E612 BF 01 05 cjne R7, #1, B1_E61A
B1:E615 D2 74 setb RAM_2E.4
B1:E617 12 1D 1C lcall B1_BS_166_B4_ABBB
B1:E61A
B1:E61A B1_E61A: ; Aqui começa o SWITCH-CASE das fontes
B1:E61A 7F 44 mov R7, #0x44 ; 'D' ; Pega o valor da epprom selecionada no menu (que já existe)
B1:E61C 7E 00 mov R6, #0
B1:E61E 12 1B 90 lcall Pref_GetChar_B1BS
B1:E621 BF 01 07 cjne R7, #1, B1_E62B
B1:E624 7F 0B mov R7, #0xB ; Veja que aqui ele coloca, na marra, em R7 o valor da Fonte 7 (0xB)
B1:E626 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E629 80 27 sjmp B1_E652
B1:E62B ; ---------------------------------------------------------------------------
B1:E62B
B1:E62B B1_E62B: ; CODE XREF: BankSw_681_B1_E60B+16j
B1:E62B 7F 44 mov R7, #0x44 ; 'D' ; Verifica o valor de "DivX Subtitle" na eeprom (sempre "0")
B1:E62D 7E 00 mov R6, #0
B1:E62F 12 1B 90 lcall Pref_GetChar_B1BS
B1:E632 EF mov A, R7
B1:E633 70 07 jnz B1_E63C
B1:E635 7F 0B mov R7, #0xB ; Aqui de novo R7 = 0xB
B1:E637 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E63A 80 16 sjmp B1_E652
B1:E63C ; ---------------------------------------------------------------------------
B1:E63C
B1:E63C B1_E63C: ; CODE XREF: BankSw_681_B1_E60B+28j
B1:E63C 7F 44 mov R7, #0x44 ; 'D' ; Verifica o valor de "DivX Subtitle" na eeprom (sempre "0")
B1:E63E 7E 00 mov R6, #0
B1:E640 12 1B 90 lcall Pref_GetChar_B1BS
B1:E643 BF 02 07 cjne R7, #2, B1_E64D
B1:E646 7F 0B mov R7, #0xB ; Aqui de novo R7 = 0xB
B1:E648 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E64B 80 05 sjmp B1_E652
B1:E64D ; ---------------------------------------------------------------------------
B1:E64D
B1:E64D B1_E64D: ; CODE XREF: BankSw_681_B1_E60B+38j
B1:E64D 7F 0B mov R7, #0xB ; Aqui de novo R7 = 0xB - Enfim, numca será outra fonte diferente
B1:E64F 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E652
B1:E652 B1_E652: ; CODE XREF: BankSw_681_B1_E60B+1Ej
B1:E652 ; BankSw_681_B1_E60B+2Fj ...
B1:E652 7F 12 mov R7, #0x12
B1:E654 12 1D 6A lcall OSD_Text_Init_B1BS
B1:E657 7F 12 mov R7, #0x12
B1:E659 02 1D 70 ljmp B1_BS_180_B3_E9AF
B1:E659 ; End of function BankSw_681_B1_E60B
O que está em vermelho some da rotina (há uma redundancia desnecessária aqui). O que está destacado em verde exeplicita como a Philips fez pra travar na fonte 7 (0xB).
A nova versão da rotina fica assim:
B1:E60B ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:E60B
B1:E60B BankSw_681_B1_E60B:
B1:E60B 7F E2 mov R7, #0xE2
B1:E60D 7E 07 mov R6, #7
B1:E60F 12 1B 84 lcall ARM_GetChar_B1_BS
B1:E612 BF 01 05 cjne R7, #1, B1_E61A
B1:E615 D2 74 setb RAM_2E.4
B1:E617 12 1D 1C lcall B1_BS_166_B4_ABBB
B1:E61A B1_E61A:
B1:E61A 7F 44 mov R7, #0x44
B1:E61C 7E 00 mov R6, #0
B1:E61E 12 1B 90 lcall Pref_GetChar_B1BS
B1:E621 12 1E D8 lcall OSD_SetFont_B1_BS
B1:E624 7F 12 mov R7, #0x12
B1:E626 12 1D 6A lcall OSD_Text_Init_B1BS
B1:E629 7F 12 mov R7, #0x12
B1:E62B 02 1D 70 ljmp B1_BS_180_B3_E9AFB
B1:E62E ;-----------------------------------------------------------------------------------------------------------
B1:E62E 00 nop
B1:E62F 00 nop
B1:E630 00 nop
B1:E631 00 nop
B1:E632 00 nop
B1:E633 00 nop
B1:E634 00 nop
B1:E635 00 nop
B1:E636 00 nop
B1:E637 00 nop
B1:E638 00 nop
B1:E639 00 nop
B1:E63A 00 nop
B1:E63B 00 nop
B1:E63C 00 nop
B1:E63D 00 nop
B1:E63E 00 nop
B1:E63F 00 nop
B1:E640 00 nop
B1:E641 00 nop
B1:E642 00 nop
B1:E643 00 nop
B1:E644 00 nop
B1:E645 00 nop
B1:E646 00 nop
B1:E647 00 nop
B1:E648 00 nop
B1:E649 00 nop
B1:E64A 00 nop
B1:E64B 00 nop
B1:E64C 00 nop
B1:E64D 00 nop
B1:E64E 00 nop
B1:E64F 00 nop
B1:E650 00 nop
B1:E651 00 nop
B1:E652 00 nop
B1:E653 00 nop
B1:E654 00 nop
B1:E655 00 nop
B1:E656 00 nop
B1:E657 00 nop
B1:E658 00 nop
B1:E659 00 nop
B1:E659 ;-----------------------------------------------------------------------------------------------------------
A parte destacada em azul é a mais importante. Ela lê da EPPROM o valor selecionado no Menu e o considera como sendo o número real da fonte, passando em seguida para a rotina que faz o resto do trabalho (OSD_SetFont_B1_BS).
Agora vamos à Sub_Style:
B1:D2B6 SUB_Style: ; CODE XREF: B1_8883+5Cp
B1:D2B6 EF mov A, R7
B1:D2B7 24 FE add A, #0xFE ; '¦'
B1:D2B9 60 5B jz B1_D316
B1:D2BB 14 dec A
B1:D2BC 60 58 jz B1_D316
B1:D2BE 14 dec A
B1:D2BF 60 61 jz B1_D322
B1:D2C1 24 03 add A, #3
B1:D2C3 70 60 jnz B1_D325
B1:D2C5 E4 clr A
B1:D2C6 FF mov R7, A
B1:D2C7 12 1E D8 lcall B1_BS_240_B3_E9FE
B1:D2CA D2 75 setb RAM_2E.5
B1:D2CC 7F 12 mov R7, #0x12
B1:D2CE 12 1D 58 lcall B1_BS_176_B3_4CF4
B1:D2D1 7F 12 mov R7, #0x12
B1:D2D3 12 1D 5E lcall B1_BS_177_B3_72CE
B1:D2D6 E4 clr A
B1:D2D7 90 FC 1F mov DPTR, #XRAM_FC1F ; OSD_Colors
B1:D2DA F0 movx @DPTR, A
B1:D2DB A3 inc DPTR
B1:D2DC 74 02 mov A, #2 ; Cor do preenchimento
B1:D2DE F0 movx @DPTR, A
B1:D2DF 7B 03 mov R3, #0 ; Define a cor de background. Coloque zero para livrar-se dela
B1:D2E1 E4 clr A
B1:D2E2 FD mov R5, A
B1:D2E3 7F 12 mov R7, #0x12
B1:D2E5 12 1D 64 lcall OSD_TextColor_B1_BS_178_B3_C399
B1:D2E8 E4 clr A
B1:D2E9 FD mov R5, A
B1:D2EA 7F 12 mov R7, #0x12
B1:D2EC 12 1F 3E lcall B1_BS_257_B3_E4D7
B1:D2EF 7F 12 mov R7, #0x12
B1:D2F1 12 1D 6A lcall B1_BS_179_B3_58BA
B1:D2F4 7F 12 mov R7, #0x12
B1:D2F6 12 1D 70 lcall B1_BS_180_B3_E9AF
B1:D2F9 12 E0 FC lcall B1_E0FC
B1:D2FC 7F 19 mov R7, #0x19
B1:D2FE 7E 00 mov R6, #0
B1:D300 12 1B BA lcall B1_BS_107_B3_B645
B1:D303 74 FF mov A, #0xFF
B1:D305 90 FD 77 mov DPTR, #XRAM_FD77
B1:D308 F0 movx @DPTR, A
B1:D309 A3 inc DPTR
B1:D30A F0 movx @DPTR, A
B1:D30B 90 FD 7E mov DPTR, #XRAM_FD7E
B1:D30E F0 movx @DPTR, A
B1:D30F A3 inc DPTR
B1:D310 F0 movx @DPTR, A
B1:D311 C2 74 clr RAM_2E.4
B1:D313 02 1D 1C ljmp B1_BS_166_B4_ABBB
B1:D316 ; ---------------------------------------------------------------------------
B1:D316
B1:D316 B1_D316: ; CODE XREF: SUB_Style+3j
B1:D316 ; SUB_Style+6j
B1:D316 7F 05 mov R7, #5
B1:D318 12 1E 36 lcall B1_BS_213_B6_6CEB
B1:D31B 50 08 jnc B1_D325
B1:D31D 7F 01 mov R7, #1
B1:D31F 02 1E 54 ljmp B1_BS_218_B4_2D0C
B1:D322 ; ---------------------------------------------------------------------------
B1:D322
B1:D322 B1_D322: ; CODE XREF: SUB_Style+9j
B1:D322 12 E0 FC lcall B1_E0FC
B1:D325
B1:D325 B1_D325: ; CODE XREF: SUB_Style+Dj
B1:D325 ; SUB_Style+65j
B1:D325 22 ret
B1:D325 ; End of function SUB_Style
Como já é sabido por todos, é no código marcado em vermelho que o tipo da fonte (no caso 0x0) é determinado pela Sub_Style. Como também já foi dito pelo Ryan em outro post, alterando este código por 7F XX (mov R7 XX), onde XX é o tipo da fonte, é possível alterar a fonte da legenda na inicialização.
Pois bem, no caso, o que queremos é que o tipo da fonte seja pego na EEPROM, no endereço usado pelo menu de seleção. Acontece que não temos como adicionar o código necessário nesta rotina sem deslocá-la. Para tanto, o que fiz foi tirar uma parte do código (vermelho + verde) e criei uma sub-rotina (aproveitando para liberar o espaço para a chamada) que realiza o trabalho de pegar o valor na EPPROM e altera o tipo de fonte.
Segue a Sub_Style alterada:
B1:D2B6 SUB_Style:
B1:D2B6 EF mov A, R7
B1:D2B7 24 FE add A, #0xFE ; '¦'
B1:D2B9 60 5B jz B1_D316
B1:D2BB 14 dec A
B1:D2BC 60 58 jz B1_D316
B1:D2BE 14 dec A
B1:D2BF 60 61 jz B1_D322
B1:D2C1 24 03 add A, #3
B1:D2C3 70 60 jnz B1_D325
B1:D2C5 12 F8 DB lcall B1_F8DB
B1:D2C8 ;-----------------------------------------------------------------------------------------------------------
B1:D2C8 00 nop
B1:D2C9 00 nop
B1:D2CA 00 nop
B1:D2CB 00 nop
B1:D2CC 00 nop
B1:D2CD 00 nop
B1:D2CE 00 nop
B1:D2CF 00 nop
B1:D2D0 00 nop
B1:D2D1 00 nop
B1:D2D2 00 nop
B1:D2D3 00 nop
B1:D2D4 00 nop
B1:D2D5 00 nop
B1:D2D5 ;-----------------------------------------------------------------------------------------------------------
B1:D2D6 E4 clr A ; Aqui a cor de contorno da legenda é definida como transparente (zero).
B1:D2D6 ; É preciso mudar isso, principalmente se você desligar o background
B1:D2D7 90 FC 1F mov DPTR, #XRAM_FC1F ; OSD_Colors
B1:D2DA F0 movx @DPTR, A
B1:D2DB A3 inc DPTR
B1:D2DC 74 02 mov A, #2 ; Cor do preenchimento
B1:D2DE F0 movx @DPTR, A
B1:D2DF 7B 03 mov R3, #3 ; Define a cor de background. Coloque zero para livrar-se dela
B1:D2E1 E4 clr A
B1:D2E2 FD mov R5, A
B1:D2E3 7F 12 mov R7, #0x12
B1:D2E5 12 1D 64 lcall OSD_TextColor_B1_BS_178_B3_C399
B1:D2E8 E4 clr A
B1:D2E9 FD mov R5, A
B1:D2EA 7F 12 mov R7, #0x12
B1:D2EC 12 1F 3E lcall B1_BS_257_B3_E4D7
B1:D2EF 7F 12 mov R7, #0x12
B1:D2F1 12 1D 6A lcall B1_BS_179_B3_58BA
B1:D2F4 7F 12 mov R7, #0x12
B1:D2F6 12 1D 70 lcall B1_BS_180_B3_E9AF
B1:D2F9 12 E0 FC lcall B1_E0FC
B1:D2FC 7F 19 mov R7, #0x19
B1:D2FE 7E 00 mov R6, #0
B1:D300 12 1B BA lcall B1_BS_107_B3_B645
B1:D303 74 FF mov A, #0xFF
B1:D305 90 FD 77 mov DPTR, #XRAM_FD77
B1:D308 F0 movx @DPTR, A
B1:D309 A3 inc DPTR
B1:D30A F0 movx @DPTR, A
B1:D30B 90 FD 7E mov DPTR, #XRAM_FD7E
B1:D30E F0 movx @DPTR, A
B1:D30F A3 inc DPTR
B1:D310 F0 movx @DPTR, A
B1:D311 C2 74 clr RAM_2E.4
B1:D313 02 1D 1C ljmp B1_BS_166_B4_ABBB
B1:D316 ; ---------------------------------------------------------------------------
B1:D316
B1:D316 B1_D316:
B1:D316 7F 05 mov R7, #5
B1:D318 12 1E 36 lcall B1_BS_213_B6_6CEB
B1:D31B 50 08 jnc B1_D325
B1:D31D 7F 01 mov R7, #1
B1:D31F 02 1E 54 ljmp B1_BS_218_B4_2D0C
B1:D322 ; ---------------------------------------------------------------------------
B1:D322
B1:D322 B1_D322:
B1:D322 12 E0 FC lcall B1_E0FC
B1:D325
B1:D325 B1_D325:
B1:D325 22 ret
B1:D325 ; End of function SUB_Style
O que está em Azul é a chamada a sub-rotina que engloba a parte retirada do código e a parte que pega o valor na EPPROM.
Segue a sub-rotina:
B1:F8DB ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ NOVA S U B R O T I N A ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:F8DB 7F 44 mov R7, #0x44
B1:F8DD 7E 00 mov R6, #0
B1:F8DF 12 1B 90 lcall Pref_GetChar_B1BS
B1:F8E2 12 1E D8 lcall B1_BS_240_B3_E9FE
B1:F8E5 D2 75 setb RAM_2E.5
B1:F8E7 7F 12 mov R7, #0x12
B1:F8E9 12 1D 58 lcall B1_BS_176_B3_4CF4
B1:F8EC 7F 12 mov R7, #0x12
B1:F8EE 12 1D 5E lcall B1_BS_177_B3_72CE
B1:F8F1 22 ret
Percebam aqui de novo a parte em azul que pega na EPPROM o valor da fonte selecionada no menu. Com isto está pronto.
E é isso pessoal, espero a avaliação e os comentários de vocês. Mais tarde coloco o firmware pra download. Quero discutir um pouco das minhas descobertas sobre o bug do "div by 4" das legendas. 8)
Abraços,
-
ronison,
Torço para que você consiga postar logo este novo firmware.
Se me permite, uma pergunta:
Você usou base o firmware do naasom (feito com apoio do eneris), postado no HTFORUM sob o título "NOVO FIRMWARE 5965K COM GO-TO!!!" no htforum em 18-12-2007?
Todos,
Humilde sugestão: Sempre que possível, mantenham nos novos firmwares as funções dos firmwares imediatamente anteriores.
Estou estudando como agregar no Philips DVP-5965K/55...
A) Carregamento automático de legenda
How to - Detalhes a serem traduzidos e colocados no log de descobertas
(http://tech.groups.yahoo.com/group/mt13x9/message/8340)
B) Nomes longos de arquivos a partir da USB
Implentação bem sucedida no 5980/12
(http://board.softpedia.com/index.php?s=&showtopic=8736&view=findpost&p=30575)
Detalhes técnicos a serem traduzidos e colocados no log de descobertas
(http://tech.groups.yahoo.com/group/mt13x9/messages/8104?threaded=1&m=e&var=1&tidx=1)
(http://tech.groups.yahoo.com/group/mt13x9/messages/8225?threaded=1&m=e&var=1&tidx=1)
-
Gente,
Só estou vindo aqui agora porque recebi um e-mail de Ronison me pedindo para dar uma olhada neste tópico.
Infelizmente, estive "dando um tempo" com firmware porque preciso estudar coisas que são relacionadas com o meu ganha-pão. Talvez eu volte à ativa na próxima semana, mas isso ainda é incerto.
pauloturij,
Não faço a menor idéia agora de onde estão as imagens que você pediu. Lamento.
-
ronison,
Torço para que você consiga postar logo este novo firmware.
Infelizmente, não tive tempo de fazer isso ontem. De toda forma, estou tentando decifrar o enigma do "div by 4" antes de fechar. O que descobri é que, no firmware baixado do site da Philips esta regra não é atendida, como também não é atendida a regra de inversão das cores da fonte. Outro detalhe importante é que, a Fonte 01 do firmware original possui 279 caracteres, e não 256.
Se me permite, uma pergunta:
Você usou base o firmware do naasom (feito com apoio do eneris), postado no HTFORUM sob o título "NOVO FIRMWARE 5965K COM GO-TO!!!" no htforum em 18-12-2007?
Todos,
Humilde sugestão: Sempre que possível, mantenham nos novos firmwares as funções dos firmwares imediatamente anteriores.
Concordo. E sim, usei a versão do naason.
Estou estudando como agregar no Philips DVP-5965K/55...
A) Carregamento automático de legenda
How to - Detalhes a serem traduzidos e colocados no log de descobertas
(http://tech.groups.yahoo.com/group/mt13x9/message/8340)
B) Nomes longos de arquivos a partir da USB
Implentação bem sucedida no 5980/12
(http://board.softpedia.com/index.php?s=&showtopic=8736&view=findpost&p=30575)
Detalhes técnicos a serem traduzidos e colocados no log de descobertas
(http://tech.groups.yahoo.com/group/mt13x9/messages/8104?threaded=1&m=e&var=1&tidx=1)
(http://tech.groups.yahoo.com/group/mt13x9/messages/8225?threaded=1&m=e&var=1&tidx=1)
Pelo que eu já vi no assembly aqui não está tão difícil fazer o carregamento automático. Será a próxima empreitada. 8)
-
A tabela de tipos de mídia no ARM do Philips DVP5965K/55 possui todos os registros do Proview DVP-858, e também um registro específico para a extensão .DIV:
12 03 44 49 56 00 00 DIV
-
Detalhes técnicos a serem traduzidos e colocados no log de descobertas
(http://tech.groups.yahoo.com/group/mt13x9/messages/8104?threaded=1&m=e&var=1&tidx=1)
(http://tech.groups.yahoo.com/group/mt13x9/messages/8225?threaded=1&m=e&var=1&tidx=1)
Se com "traduzir" você quer dizer "explicar de uma maneira mais clara", então OK.
Meras traduções de idioma não devem ser colocadas neste tópico.
-
Detalhes técnicos a serem traduzidos e colocados no log de descobertas
(http://tech.groups.yahoo.com/group/mt13x9/messages/8104?threaded=1&m=e&var=1&tidx=1)
(http://tech.groups.yahoo.com/group/mt13x9/messages/8225?threaded=1&m=e&var=1&tidx=1)
Se com "traduzir" você quer dizer "explicar de uma maneira mais clara", então OK.
Meras traduções de idioma não devem ser colocadas neste tópico.
Jefferson,
Sim, a idéia é explicar de uma maneira mais clara. Quando conseguir atingir o objetivo "carregamento automático de legendas no DVP5965K/55" faço um passo-a-passo explicando claramente, para que outros colegas possam fazer o mesmo.
Mas antes, gostaria de usar este tópico para compartilhar o que estou descobrindo em termos de tabela de códigos ARM e funções ARM / 8032.
É aqui o local correto para postar isso?
Se sim, mantenha o texto; senão, indique um tópico para eu postar/criar, apague, ou ainda, envie para o lixão ok... Obrigado!
Ronison e pessoal,
Sobre Carregamento automático de legendas no DVP5965K/55
Se alguem já tentou fazer isso lendo...
- Smart Loading of text subtitles in DMF -> http://hej456.fasthoster.de/Smart.Loading.of.subs.in.DMF.zip
- mt13x9 Message Re Doc Autoload subtitles in DMF firmware -> http://tech.groups.yahoo.com/group/mt13x9/message/8340
Saiba que eu também já tentei, mas travei em um determinado ponto.
Bom, descobri onde está a Tabela de tipos de mídia no ARM Code – Philips DVP5965K/55...
ROM:0004A996 12 03 41 56 49 00 00 AVI
ROM:0004A99D 12 03 56 49 44 00 00 VID
ROM:0004A9A4 12 04 44 49 56 58 00 DIVX
ROM:0004A9AB 12 03 44 49 56 00 00 DIV
ROM:0004A9B2 14 03 4D 50 34 00 00 MP4
ROM:0004A9B9 14 03 4D 34 41 00 00 M4A
... a word que indica o endereço de chamada para rotina 8032 Remote_DivxPlayback, após pressionar a tecla subtitle (29) no DVP5965K/55...
B4:5FE8 61 8F .word B4_618F
B4:5FEA 29 .byte 0x29
... e por fim, a rotina 8032 Remote_DivxPlayback propriamente dita, que por sua vez chama a rotina 8032 Subtitle_loading (B4:2C28):
B4:618F Remote_DivxPlayback: ; DATA XREF: B4:5FE8 o
B4:618F
B4:618F ; FUNCTION CHUNK AT B4:6250 SIZE 00000003 BYTES
B4:618F
B4:618F 12 2C 28 lcall Subtitle_loading
B4:618F
B4:6192 EF mov A, R7
B4:6193 24 FF add A, #0xFF
B4:6195 92 6D mov RAM_2D.5, C
B4:6197 02 62 50 ljmp B4_6250
B4:6197
B4:6197 ; End of function DivX_Tecla_29
B4:6197
Se alguém me ajudar no que falta, podemos terminar, publicar o firmware, e testar. Daí, estando homologado, publico um passo-a-passo em português.
Lá vão as missões:
Missão 1: Achar a rotina 8032 GetFileType
Na documentação do hej456, logo após a rotina 8032 GetFileType, vem os ponteiros que indicam onde fazer as chamadas quando o tipo de mídia é MPG (byte 09) e quando é AVI (byte 12). Porém, no DVP5965K/55, "parece" que a rotina 8032 GetFileType fica num lugar e os ponteiros em outro.
Achei uma ***SUPOSTA*** GetFyleType, no endereço
B4:4D4D7
Missão 2: Achar os ponteiros (words de 2 bytes) que indicam onde fazer as chamadas quando o tipo de mídia é MPG (byte 09) e quando é AVI (byte 12).
Diante da suposição feita em "Missão 1", tenho três endereços ***SUSPEITOS***:
B3:58FE
B4:5F8B
B4:7AA5
Missão 3: Achar a rotina 8032 Video_play do DVP5965K/55
No DVP5965K/55, parece que a rotina 8032 Vídeo_play foi escrita um pouco diferente, então não dá para localizá-la usando a seqüência apontada por hej456 em
- Smart Loading of text subtitles in DMF -> http://hej456.fasthoster.de/Smart.Loading.of.subs.in.DMF.zip
Achei uma rotina ***SUSPEITA*** em B1:D2B6 através de uma busca fragmentada de padrões e de suposições; a seqüência de bytes utilizada foi “EF 75 F0 10 A4 24 E5 FF E5 F0 34 08 FE”. É bom olhar código abaixo (do DVP5965K) e CONFIRMAR SE DE FATO ELA É A TAL Vídeo_play...
*** SUPOSTA *** "Rotina Video_play"
B1:D2B6 *** SUPOSTA *** Video_Play: ; CODE XREF: B1_8883+5C p
B1:D2B6 EF mov A, R7
B1:D2B7 24 FE add A, #0xFE ; '¦'
B1:D2B9 60 5B jz B1_D316
B1:D2B9
B1:D2BB 14 dec A
B1:D2BC 60 58 jz B1_D316
B1:D2BC
B1:D2BE 14 dec A
B1:D2BF 60 61 jz B1_D322
B1:D2BF
B1:D2C1 24 03 add A, #3
B1:D2C3 70 60 jnz B1_D325
B1:D2C3
B1:D2C5 E4 clr A
B1:D2C6 FF mov R7, A
B1:D2C7 12 1E D8 lcall B1_BS_240_B3_E9FE
B1:D2C7
B1:D2CA D2 75 setb RAM_2E.5
B1:D2CC 7F 12 mov R7, #0x12
B1:D2CE 12 1D 58 lcall B1_BS_176_B3_4CF4
B1:D2CE
B1:D2D1 7F 12 mov R7, #0x12
B1:D2D3 12 1D 5E lcall B1_BS_177_B3_72CE
B1:D2D3
B1:D2D6 E4 clr A
B1:D2D7 90 FC 1F mov DPTR, #XRAM_FC1F
B1:D2DA F0 movx @DPTR, A
B1:D2DB A3 inc DPTR
B1:D2DC 74 02 mov A, #2
B1:D2DE F0 movx @DPTR, A
B1:D2DF 7B 03 mov R3, #3
B1:D2E1 E4 clr A
B1:D2E2 FD mov R5, A
B1:D2E3 7F 12 mov R7, #0x12
B1:D2E5 12 1D 64 lcall B1_BS_178_B3_C399
B1:D2E5
B1:D2E8 E4 clr A
B1:D2E9 FD mov R5, A
B1:D2EA 7F 12 mov R7, #0x12
B1:D2EC 12 1F 3E lcall B1_BS_257_B3_E4D7
B1:D2EC
B1:D2EF 7F 12 mov R7, #0x12
B1:D2F1 12 1D 6A lcall B1_BS_179_B3_58BA
B1:D2F1
B1:D2F4 7F 12 mov R7, #0x12
B1:D2F6 12 1D 70 lcall B1_BS_180_B3_E9AF
B1:D2F6
B1:D2F9 12 E0 FC lcall B1_E0FC
B1:D2F9
B1:D2FC 7F 19 mov R7, #0x19
B1:D2FE 7E 00 mov R6, #0
B1:D300 12 1B BA lcall B1_BS_107_B3_B645
B1:D300
B1:D303 74 FF mov A, #0xFF
B1:D305 90 FD 77 mov DPTR, #XRAM_FD77
B1:D308 F0 movx @DPTR, A
B1:D309 A3 inc DPTR
B1:D30A F0 movx @DPTR, A
B1:D30B 90 FD 7E mov DPTR, #XRAM_FD7E
B1:D30E F0 movx @DPTR, A
B1:D30F A3 inc DPTR
B1:D310 F0 movx @DPTR, A
B1:D311 C2 74 clr RAM_2E.4
B1:D313 02 1D 1C ljmp B1_BS_166_B4_ABBB
B1:D313
B1:D316 ; ---------------------------------------------------------------------------
B1:D316
B1:D316 B1_D316: ; CODE XREF: *** SUPOSTA *** Video_Play+3 j
B1:D316 ; *** SUPOSTA *** Video_Play+6 j
B1:D316 7F 05 mov R7, #5
B1:D318 12 1E 36 lcall B1_BS_213_B6_6CEB
B1:D318
B1:D31B 50 08 jnc B1_D325
B1:D31B
B1:D31D 7F 01 mov R7, #1
B1:D31F 02 1E 54 ljmp B1_BS_218_B4_2D0C
B1:D31F
B1:D322 ; ---------------------------------------------------------------------------
B1:D322
B1:D322 B1_D322: ; CODE XREF: *** SUPOSTA *** Video_Play+9 j
B1:D322 12 E0 FC lcall B1_E0FC
B1:D322
B1:D325
B1:D325 B1_D325: ; CODE XREF: *** SUPOSTA *** Video_Play+D j
B1:D325 ; *** SUPOSTA *** Video_Play+65 j
B1:D325 22 ret
B1:D325
B1:D325 ; End of function *** SUPOSTA *** Video_Play
-
estou tentando decifrar o enigma do "div by 4" antes de fechar. O que descobri é que, no firmware baixado do site da Philips esta regra não é atendida, como também não é atendida a regra de inversão das cores da fonte. Outro detalhe importante é que, a Fonte 01 do firmware original possui 279 caracteres, e não 256.
Ronison
Se eu entendi bem, você está amarrando o "bug" ao número de caracteres: Este tem que ser divisível por 4.
Mas pelo que li (posso estar equivocado), o "bug" está relacionado com largura dos caracteres: Isso sim tem que ser divísivel por 4.
Se meu entendimento está correto, então sugiro que não use o MTKReMaker para montar suas fontes, use o MTKFontCreator pois ele é específico para isso.
Neste link aqui (http://board.softpedia.com/lofiversion/index.php/t3474-50.html) juanma76 cita que fontes de 4 cores são ótimas com aparelhos Philips, mas alerta que você deve se assegurar de que a opção "Widths are div. by 4" está selecionada ou marcada, já que RISCs mais novos aceitam apenas fontes que são múltiplas de 4.
Esta opção, informa otuken, é nas configurações do utilitário "MTKFont Creator".
O MtkFontCreator v0.6.12 é encontrado no site do NA (http://newage.mpeg4-players.info/mt1389/tools/MtkFontCreator_0.6.12.rar)
E a opção está em
Font Creation -> Font Character Generation Options -> Widths are div. by 4.
O MTKFontCreator carregou automático como fonte inicial, a Arial Narrow (minha fonte predileta); note que:
- Com a opção desmarcada (é o valor default), a largura máxima é 22.
- Com a opção marcada, a largura máxima aumenta para 24 (número divisível por 4)!
É só olhar na última linha (linha de status), fique marcando e desmarcando a opção e confira.
Espero ter ajudado.
-
Para o problema dos RISC que requerem fontes com largura múltiplo de 4, sugiro que tente o seguinte patch, que apresenta uma solução ao problema, permitindo o uso de fontes de largura livre (bem melhores para legendas). Porém o patch não funciona em todos os RISCs (funcionou no meu do firmware "alternativo": RISC v05.00.05.07).
Funciona comprovadamente nos RISC v05.00.05.07, v05.00.05.09 e v05.00.06.00.
Vou explicar somento o problema mais comun ("tipo1").
Procedimento:
Tipo 1: Somente trocar algums bytes:
Busque:
04 93 01 23 09 9D 10 9A E8 18 40 08 40 06 06 0E 06 96 02 93
Troque por:
09 9D 04 93 E8 1C 80 08 80 06 06 0E 01 23 10 9A 02 93 06 96
O problema "tipo 2" apresentado en algums players (exemplo: Medion MD-80796) e mais complicado. Requer redimensionar os ArmCodes, adicionar código novo em espaço livre e fazer os saltos ao novo código...
Saudações!
Juan M. Araújo
PS: Aclaração...
Neste link aqui (http://board.softpedia.com/lofiversion/index.php/t3474-50.html) juanma76 cita que fontes de 4 cores são ótimas com aparelhos Philips, mas alerta que você deve se assegurar de que a opção "Widths are div. by 4" está selecionada ou marcada, já que RISCs mais novos aceitam apenas fontes que são múltiplas de 4.
O texto: "'Four color' fonts are fine with Philips players... Just be sure that you have the "Widths are div. by 4" selected (activated or marked)..." era em resposta a um usuario que indicava que tinha que se usar as fontes em "old-compatibility mode". Foi um mal entendido, eu achei que ele estava falando da primeira opção: fontes de duas cores. Daí a minha resposta (eu sou "juanma76" :P) que fontes de quatro cores funcionavam bem...
-
Olá Pessoal,
Pra falar a verdade jpa consegui fazer o player funcionar com fontes sem o "div by 4". Fiz vários tipos de testes. Em grande parte deles o que ocorreu foi que os textos do Setup simplesmente sumiram. Mas já estou contornando a situação. Consegui fazer com que tudo funcionasse a contento, e o player ficou com 5 fontes selecionáveis. Porém, fiz uma besteira no 8032 e o player faleceu. Agora tenho que ressussitá-lo para continuar com os testes e experimentos (estou a procura do conector de 4 pinos para a porta serial do aparelho).
-
jmaraujo,
Caso tenha disponibilidade, poderia me ajudar em alguma destas "missões" que postei acima?
Ficaria muito grato... Estou super empolgado tentando fazer o meu primeiro hack, mas confesso que está difícil... Até coloquei os códigos do firmware do hej546 e o do meu player (Firmware DVP5965K v2.2b by naasom -v.Packet Bitstream postado no htforum em 18.12.2007) lado a lado no Excel, mas não está adiantando. O código é diferente, não acho os padrões.
- Missão 1: Achar a rotina GetFileType do DVP5965K/55
- Missão 2: Achar os ponteiros (words de 2 bytes) que indicam onde fazer as chamadas quando o tipo de mídia é MPG (byte 09) e quando é AVI (byte 12) do DVP5965K/55
- Missão 3: Achar a rotina Video_play do DVP5965K/55
Grato
-
jmaraujo,
Caso tenha disponibilidade, poderia me ajudar em alguma destas "missões" que postei acima?
Ficaria muito grato... Estou super empolgado tentando fazer o meu primeiro hack, mas confesso que está difícil... Até coloquei os códigos do firmware do hej546 e o do meu player (Firmware DVP5965K v2.2b by naasom -v.Packet Bitstream postado no htforum em 18.12.2007) lado a lado no Excel, mas não está adiantando. O código é diferente, não acho os padrões.
- Missão 1: Achar a rotina GetFileType do DVP5965K/55
- Missão 2: Achar os ponteiros (words de 2 bytes) que indicam onde fazer as chamadas quando o tipo de mídia é MPG (byte 09) e quando é AVI (byte 12) do DVP5965K/55
- Missão 3: Achar a rotina Video_play do DVP5965K/55
Claro. Me passe o link para download do seu firmware para que eu possa dar uma olhada.
Você já viu o meu post (http://www.forodvp5100.com.ar/viewtopic.php?f=16&t=591) no fórum do DVP5100? (É mais completo que o que eu postei no MT13x9)
Mas para ir adiantando o assunto:
Para achar GetFileType, busque "EF 75 F0 10 A4 24 ? FF E5 F0 34 ? FE 12 ? ? EF 12"
Para achar Video_Play, busque "EF 24 FE 60 ? 14 60 ? 24 02 70 ? 74 FF 90 ? ? F0 A3 F0 90 ? ? F0 A3 F0 C2 ? 12"
ou
"EF 24 FE 60 ? 14 60 ? 24 02 70 ? 74 FF 90 ? ? F0 A3 F0 90 ? ? F0 A3 F0 C2 ? 02"
A única diferença entre as duas seqüencias para achar Video_Play e que uma faz um ljmp ("02") para a rotina "Start_Playback" e a outra faz um lcall ("12").
Saudações!
-
jmaraujo,
Caso tenha disponibilidade, poderia me ajudar em alguma destas "missões" que postei acima?
Ficaria muito grato... Estou super empolgado tentando fazer o meu primeiro hack, mas confesso que está difícil... Até coloquei os códigos do firmware do hej546 e o do meu player (Firmware DVP5965K v2.2b by naasom -v.Packet Bitstream postado no htforum em 18.12.2007) lado a lado no Excel, mas não está adiantando. O código é diferente, não acho os padrões.
- Missão 1: Achar a rotina GetFileType do DVP5965K/55
- Missão 2: Achar os ponteiros (words de 2 bytes) que indicam onde fazer as chamadas quando o tipo de mídia é MPG (byte 09) e quando é AVI (byte 12) do DVP5965K/55
- Missão 3: Achar a rotina Video_play do DVP5965K/55
Claro. Me passe o link para download do seu firmware para que eu possa dar uma olhada.
Você já viu o meu post (http://www.forodvp5100.com.ar/viewtopic.php?f=16&t=591) no fórum do DVP5100? (É mais completo que o que eu postei no MT13x9)
Mas para ir adiantando o assunto:
Para achar GetFileType, busque "EF 75 F0 10 A4 24 ? FF E5 F0 34 ? FE 12 ? ? EF 12"
Para achar Video_Play, busque "EF 24 FE 60 ? 14 60 ? 24 02 70 ? 74 FF 90 ? ? F0 A3 F0 90 ? ? F0 A3 F0 C2 ? 12"
ou
"EF 24 FE 60 ? 14 60 ? 24 02 70 ? 74 FF 90 ? ? F0 A3 F0 90 ? ? F0 A3 F0 C2 ? 02"
A única diferença entre as duas seqüencias para achar Video_Play e que uma faz um ljmp ("02") para a rotina "Start_Playback" e a outra faz um lcall ("12").
Saudações!
Mestre jmaraujo,
Acabei de ler e testar suas dicas daqui e do documento do forum DVP5100. Mesmo assim não consigo achar GetFileType e Video_Play com as sequências de busca informadas.
Nem no firmware modificado que estou usando...
(naasom, publicado no HT Forum em 18.12.2007, e baseado na v2.2 Packet Bitstream do Eneris
http://www.4shared.com/file/32413050/81d9a4b2/DVP5965K_93GOTO_PB.html?dirPwdVerified=67cd922f
...tampouco no firmware original da Philips...
https://www.p4c.philips.com/cgi-bin/dcbint/eula.pl?slg=BRP&link=https://www.p4c.philips.com/files/d/dvp5965k_55/dvp5965k_55_fus_eng.zip
:-( .......
Bom, os links de ambos firmwares estão funcionando. Se puder dar uma "olhadinha"...
-
Ryan,
O que prefere, quando eu terminar a documentação das explicações (semana que vem)? Posto aqui ou em separado?
JMAraujo,
Não precisa mais esquentar a cabeça sobre o assunto carregamento automático de legendas no 5965K/55: Mistério resolvido!
Já achei as rotinas, o que era o mais difícil (elas não são descobertas pelas sequências de busca convencionais, tem que analisar código 8032 mesmo)...
Peguei o seu guia, entitulado "Carga automática de subtítulos (feito em cima daquele do hej456, porém mais completo e recente)", postado em http://www.forodvp5100.com.ar/viewtopic.php?f=16&t=591&sid=bfc4e9bfe41c1738f3b36daa306162a7
...e adaptei com as informações abaixo.
Fiz um patch beta - só para testar mesmo - alterando 5 bytes e funcionou (avi's carregam legenda automática, o único problema em potencial já que não pude testar - só li a teoria e apliquei - é que os arquivos DMF i.e. divx Ultra ficariam sem opção de seleção de legenda no menu interno).
E agora há pouco fiz o patch definitivo (muito mais trabalhoso, para endereçar a questão DMF adequadamente e pelo fato da rotina FileGetType ser diferente dos outros aparelhos), fiz o teste, funcionou e compartilho aqui (veja detalhes das rotinas no rodapé desta mensagem):
PASSO-A-PASSO
(Obs.: Ninguém é obrigado a usar os utilitários informados aqui)
- Executar o MTK ReMaker 0.2 (8 )
- Abrir o firmware-base (7) e no extrair o código 8032 e o ARM Code 1 dele
(opção File -> Open e MT13X9 -> Code Part -> 8032 -> Botão Direito -> Save)
e Code Part -> RISC -> ARM Codes -> ARM Code 1 -> Botão Direito -> Save)
- Executar o XVI32 2.51 (9)
- Abrir o bloco 1 do código ARM
(opção File -> Open)
- Alterar um byte em B4:A996 (Está dentro da tabela de tipos de mídia do ARM Code)
(opção Address -> Go to -> $4A996)
De 12
Para 09
- Salvar o bloco 1 do código ARM alterado com outro nome
(opção File -> Save As)
- Fechar o bloco 1 do código ARM
(opção File -> Close)
- Abrir o código 8032
(opção File -> Open)
- Alterar 3 bytes em B4:D511 (Dentro da rotina GetFileType)
(opção Address -> Go to -> $4D511)
De 7F 04 mov R7, #4
22
Para 02 FB 2C ljmp DMF_or_AVI
- Alterar 4 bytes em B4:FB2C (Criar rotina DMF_or_AVI onde só havia FF)
(opção Address -> Go to -> $4FB2C)
De FF FF FF FF
Para 24 08 add A, #8
70 10 jnz B4_B1AVI_Counter
- Alterar 6 bytes em B4:FB30 (Criar rotina B4_B1DMF_Counter onde só havia FF)
(opção Address -> Go to -> $4FB30)
De FF FF FF FF FF FF
Para 90 FA F0 mov DPTR, #DMF_Counter
02 18 8F ljmp B4_Bank_1
- Alterar 6 bytes em B4:FB40 (Criar rotina B4_B1AVI_Counter onde só havia FF)
(opção Address -> Go to -> $4FB40)
De FF FF FF FF FF FF
Para 90 FB 00 mov DPTR, #AVI_Counter
02 18 8F ljmp B4_Bank_1
- Alterar 3 bytes em B1:D313 (Dentro da rotina Video_Play)
(opção Address -> Go to -> $1D313)
De 02 1D 1C ljmp B1_B4Playback_start
Para 02 FB 10 ljmp Autopress_subtitle
- Alterar 12 bytes em B1:FAF0 (Criar rotina DMF_Counter onde só havia FF)
(opção Address -> Go to -> $1FAF0)
De FF FF FF FF FF FF FF FF FF FF FF FF
Para 7F C4 mov R7, #0xC4 ; '-'
7E 13 mov R6, #0x13
7D 01 mov R5, #1
12 1B 96 lcall B1_B0Arm_PutChar
74 04 mov A, #4
22 ret
- Alterar 12 bytes em B1:FB00 (Criar rotina AVI_Counter onde só havia FF)
(opção Address -> Go to -> $1FB00)
De FF FF FF FF FF FF FF FF FF FF FF FF
Para 7F C4 mov R7, #0xC4 ; '-'
7E 13 mov R6, #0x13
7D 00 mov R5, #0
12 1B 96 lcall B1_B0Arm_PutChar
74 04 mov A, #4
22 ret
- Alterar 19 bytes em B1:FB10 (Criar rotina Autopress_subtitle onde só havia FF)
(opção Address -> Go to -> $1FB10)
De FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
Para 12 1D 1C lcall B1_B4Playback_start
7F C4 mov R7, #0xC4 ; '-'
7E 13 mov R6, #0x13
12 1B 84 lcall B1_B0Arm_PutChar
EF mov A, R7
64 01 xrl A, #1
60 03 jz B1_FB22
02 2C 28 ljmp B1_B1Subtitle_loading
22 ret
- Salvar o código 8032 alterado com outro nome
(opção File -> Save As)
- Fechar o código 8032
(opção File -> Close)
- Executar o MtkReplacer v0.5 (10)
- Criar uma nova versão de firmware a partir do firmware-base (7) (input firmware) e a alteração no código 8032 (8032 Block) que acaba de ser feita pelo XVI32
Proceder nesta ordem
1o. Input firmware -> informar o caminho e o nome do firmware-base (7)
2o. 8032 Block -> informar o caminho e nome do código 8032 que acaba de ser alterado
3o. ARM Code 1 (uncompressed) -> informar o caminho e nome do bloco 1 do código ARM que acaba de ser alterado
4o. Output firmware -> É sugerido um nome para o novo firmware, porém (importante!) informe nome DVP5965K_93.BIN e numa pasta em separado.
5o. Clicar em Replace
- Executar o DeepBurner Free Portable 1.8 (10), visando obter um CD de dados monosessão com um arquivo somente, nome em maiúsculas DVP5965K_93.BIN. Todas as letras em maíusculo, se não tiver este cuidado, ao inserir no DVD Player o CD não reconhecido(Aparecerá a mensagem "Disco Desconhecido"):
- Colocar uma mídia CD-R ou CD-RW virgem (e de qualidade) no gravador de CD
- Criar CD de dados monosessão
Select project type: -> Project type: -> Create data CD/DVD -> Next ->
New Project: -> Multisession: -> No Multissession -> Next ->
- Selecionar ícone CDRoot
- Teclar F2 (Change volume label) -> Informe DOCTORXYZ1.1 (para fins de controle de versão)
- Clicar no ícone Add files -> localizar e selecionar o novo firmware DVP5965K_93.BIN
(se não estiver com este nome, renomeio agora. Tudo deve estar em maiúsculas, inclusive a extensão)
- Clicar no item Burn Disk -> Speed -> Selecionar a menor velocidade possível
- Clicar em Burn
- Atualizar o firmware colocando o CD de dados no DVD Player, confirmar a atualização apertando a tecla Play, retirar o CD na hora informada e esperar alguns minutos. Durante a atualização do firmware, não mexer nem desligar o aparelho, senão você poderá ter problemas. Caso isso ocorra, você deverá providenciar um cabo de dados para recuperá-lo. (12)
-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-
Não fiz o upload do novo firmware por uma questão de tempo e saco, quem quiser fazê-lo fique à vontade, só não esqueça de citar o novato aqui ;-)
Ainda esta semana devo postar as instruções detalhadas de como cheguei até aqui.
Saudações!
doctorxyz
PS: Críticas ***construtivas*** sempre são bem-vindas!
-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-
Rotinas 8032(nome, localização e breve descrição) - Philips DVP5965K/55
Remote_DivXplayback B4:5F6D -> Chama a função correspondente ao botão pressionado
Tecla29 B4:5FE8 -> Trata-se de uma palavra (dois bytes) contendo o endereço da rotina DivX_Tecla29 (B4:618F) e um byte com o código do botão subtitle (0x29)
DivX_Tecla29 B4:618F -> Chama B4_B1Subtitle_loading
GetFileType B4:D4D7 -> Obtêm o código de tipo de mídia no ARM (13)
B4_B0Arm_GetChar B4:1B84 -> Chaveia o 8032 do bloco 4 para 0 e chama Arm_GetChar
B1_B0Arm_GetChar B1:1B84 -> Chaveia o 8032 do bloco 1 para 0 e chama Arm_GetChar
Arm_GetChar B0:E8BB -> Obtêm um caractere
B4_B0Arm_PutChar B4:1B96 -> Chaveia o 8032 do bloco 4 para 0 e chama Arm_PutChar
B1_B0Arm_PutChar B1:1B96 -> Chaveia o 8032 do bloco 1 para 0 e chama Arm_PutChar
Arm_PutChar B0:EBEF -> Armazena um caractere
Video_play B1:D2B6 -> No endereço B1:D313, executa lcall B1_B3Playback_start
B1_B4Playback_start B1:1D1C -> Chaveia o 8032 do bloco 1 para 4 e chama Playback_start
Playback_start B4:ABBB -> Inicia a reprodução
B4_B1Subtitle_loading B4:2C28 -> Chaveia o 8032 do bloco 4 para 1 e chama Subtitle_loading
B1_B1Subtitle_loading B1:2C28 -> Chaveia o 8032 do bloco 1 para 1 e chama Subtitle_loading (só não entendi porque chavear blocos, se não precisa!)
Subtitle_loading B1:C619 -> Produz o mesmo efeito do pressionamento da tecla subtitle
DMF_or_AVI B4:FB2C -> Decide qual contador (AVI ou DMF) utiliza em função do valor do acumulador que recebe de GetFileType
B4_B1DMF_Counter B4:FB30 -> Chaveia o 8032 do bloco 4 para 1 e chama DMF_Counter
B4_B1AVI_Counter B4:FB40 -> Chaveia o 8032 do bloco 4 para 1 e chama AVI_Counter
DMF_Counter B1:FAF0 -> Sinaliza num flag que o arquivo é DMF.
AVI_Counter B1:FB00 -> Sinaliza num flag que o arquivo é AVI.
Autopress_subtitle B1:FB10 -> Lê o flag (preenchido por DMF_Counter ou AVI_Counter). Se for arquivo AVI, carrega a legenda antes de reproduzí-lo.
Tabela de tipos de mídia no ARM Code – Philips DVP5965K/55
Começa em ARM Code 1, ROM:0004A8FC. Os tipos que interessam:
ROM:0004A93B 09 03 4D 50 47 00 00 MPG
...
ROM:0004A957 09 03 4D 50 45 00 00 MPE
ROM:0004A95E 09 03 4D 31 56 00 00 M1V
ROM:0004A965 09 03 4D 32 56 00 00 M2V
...
ROM:0004A97A 09 04 4D 50 45 47 00 MPEG
...
ROM:0004A996 12 03 41 56 49 00 00 AVI
ROM:0004A99D 12 03 56 49 44 00 00 VID
ROM:0004A9A4 12 04 44 49 56 58 00 DIVX
ROM:0004A9AB 12 03 44 49 56 00 00 DIV
ROM:0004A9B2 14 03 4D 50 34 00 00 MP4
ROM:0004A9B9 14 03 4D 34 41 00 00 M4A
-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-
Referências (algumas)
(1) Firmware MT13x9: Log de Descobertas
http://ryan.com.br/smf/index.php?topic=179.0
(2) Smart Loading of text subtitles in DMF (documento do hej456)
http://hej456.fasthoster.de/Smart.Loading.of.subs.in.DMF.zip
(3) Carga automática de subtítulos (documento do jmaraujo, feito em cima daquele do hej456, porém mais completo e recente)
http://www.forodvp5100.com.ar/viewtopic.php?f=16&t=591&sid=bfc4e9bfe41c1738f3b36daa306162a7
(4) Grupo MT13x9
http://tech.groups.yahoo.com/group/mt13x9/
(5) Grupo MEDIATEK1389 (do Cachirulo)
http://tech.groups.yahoo.com/group/MEDIATEK1389/
(6) Firmware Yamada 6700 Hej456.DSP.v5.0a (usado na explicação do documento do hej456)
http://www.hej456.com/forum/docs/Hej456.DSP.v5.0a.1252.zip
(7) Firmware DVP5965K by naasom -v.Packet Bitstream (18.12.2007)
(tem a função GO-TO e foi feito em cima do firmware do Eneris v2.2)
http://www.htforum.com/vb/showthread.php?t=60507&highlight=firmware
(8 ) MTK ReMaker 0.2
http://personal.inet.fi/cool/mediatek/programs/mtkremaker/MTKReMaker023b6.zip
(9) XVI32 2.51
http://www.chmaas.handshake.de
(10) MtkReplacer v0.5
http://newage.mpeg4-players.info/mt1389/tools/MtkReplacer_0.5.rar
(11) DeepBurner Free Portable 1.8
http://www.deepburner.com/
(12) “Ressuscitando” o Player pela Serial
http://ryan.com.br/mtk_porta_serial.htm
(13) Tabela de tipos de mídia no ARM Code
http://ryan.com.br/smf/index.php?PHPSESSID=d842fc529d9bac6e705db40ddd1e9733&topic=179.msg9172607#msg9172607
(14) Scripts IDA do Grupo MT13x9
http://tech.groups.yahoo.com/group/mt13x9/
(Files -> Disassembling -> !IDA Scripts -> MT1389_8032_ARM_IDA_SCRIPTS_2007.feb.7.RAR)
-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-
Agradecimentos
"Se fui mais longe, é porque me escorei no ombro de gigantes":
Ryan, hej456, JMAraujo, NA, MaBreaker, Eneris, Naasom, cachirulo, grupo MT13x9, grupo MEDIATEK1389.
-
Dois pontos:
1. A rotina Playback_start (B4:ABBB) é chamada em B1:D313, e não em B1:D2C7, conforme dito.
e
2.Tem uma coisa aqui que eu não entendi:
ROM:FAF0 7F C4 mov R7, #0xC4 ; '-'
ROM:FAF2 7E 13 mov R6, #0x13
ROM:FAF4 7D 01 mov R5, #1
ROM:FAF6 12 05 F5 lcall Arm_PutChar
Como é que se coloca algo no endereço 0x13C4...
ROM:FB13 7F 46 mov R7, #0x46 ; 'F'
ROM:FB15 7E 00 mov R6, #0x00
ROM:FB17 12 04 7B lcall Arm_GetChar
E depois lê do endereço 0x46? Alguem sabe explicar isso?
No mais, parabéns pelo trabalho doctorxyz.
-
Você está absolutamente certo, ronison.
Foi um error do Hej456 mesmo (eu nunca tinha percebido isso antes). Veja no documento do proprio Hej456:
ROM:0C13 play + press subtitle if avi:
ROM:0C13 12 A4 AD lcall ROM_A4AD ;the call that starts playback.
ROM:0C16 7F 46 mov R7, #0xC4 ; '-'
ROM:0C18 7E 00 mov R6, #13 ;get counter from shared memory
ROM:0C1A 12 F4 EF lcall ARM_GetChar
ROM:0C1A
ROM:0C1D EF mov A, R7
ROM:0C1E 64 01 xrl A, #1 ;if counter = 1 (divx)
ROM:0C20 60 03 jz ROM_C25 ;return
ROM:0C22 02 0B DD ljmp BS:382_B1:B753 ;else “press subtitle button”
ROM:0C25 ROM_C25:
ROM:0C25 22 ret
Não coincide o disassembly (em azul) com os opcodes (vermelho).
Eu cometí o mesmo erro no meu firmware. Vou consertar agora mesmo.
Saudações!
-
1. A rotina Playback_start (B4:ABBB) é chamada em B1:D313, e não em B1:D2C7, conforme dito.
Ronison,
Tem razão quanto ao endereço de chamada para Playback_start dentro da Video_Play
Já atualizei o texto no post principal (abaixo, colocos os detalhes a quem interessar possa):
Excluí a parte:
"- Alterar 2 bytes em B1:D2C8 (Dentro da rotina Video_Play)
(opção Address -> Go to -> $1D2C8)
De 1E D8
Para FB 10"
E coloquei em seu lugar:
"- Alterar 2 bytes em B1:D314 (Dentro da rotina Video_Play)
(opção Address -> Go to -> $1D314)
De 1D 1C
Para FB 10"
Excluí a parte:
"
- Alterar 19 bytes em B1:FB10 (Criar rotina Autopress_subtitle onde só havia FF)
(opção Address -> Go to -> $1FB10)
De FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
Para 12 1E D8
7F C4
7E 13
12 1B 84
EF
64 01
60 03
02 2C 28
22"
E coloquei em seu lugar:
"- Alterar 19 bytes em B1:FB10 (Criar rotina Autopress_subtitle onde só havia FF)
(opção Address -> Go to -> $1FB10)
De FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
Para 12 1D 1C
7F C4
7E 13
12 1B 84
EF
64 01
60 03
02 2C 28
22"
Excluí a parte:
"Video_play B1:D2B6 -> No endereço B1:D2C7, executa lcall B1_B3Playback_start
B1_B3Playback_start B1:1ED8 -> Chaveia o 8032 do bloco 1 para 3 e chama Playback_start
Playback_start B3:E9FE -> Inicia a reprodução
"
E coloquei em seu lugar:
"Video_play B1:D2B6 -> No endereço B1:D313, executa lcall B1_B3Playback_start
B1_B4Playback_start B1:1D1C -> Chaveia o 8032 do bloco 1 para 4 e chama Playback_start
Playback_start B4:ABBB -> Inicia a reprodução"
2.Tem uma coisa aqui que eu não entendi:
ROM:FAF0 7F C4 mov R7, #0xC4 ; '-'
ROM:FAF2 7E 13 mov R6, #0x13
ROM:FAF4 7D 01 mov R5, #1
ROM:FAF6 12 05 F5 lcall Arm_PutChar
Como é que se coloca algo no endereço 0x13C4...
ROM:FB13 7F 46 mov R7, #0x46 ; 'F'
ROM:FB15 7E 00 mov R6, #0x00
ROM:FB17 12 04 7B lcall Arm_GetChar
E depois lê do endereço 0x46? Alguem sabe explicar isso?
Você está absolutamente certo, ronison.
Foi um error do Hej456 mesmo (eu nunca tinha percebido isso antes). Veja no documento do proprio Hej456:
ROM:0C13 play + press subtitle if avi:
ROM:0C13 12 A4 AD lcall ROM_A4AD ;the call that starts playback.
ROM:0C16 7F 46 mov R7, #0xC4 ; '-'
ROM:0C18 7E 00 mov R6, #13 ;get counter from shared memory
ROM:0C1A 12 F4 EF lcall ARM_GetChar
ROM:0C1A
ROM:0C1D EF mov A, R7
ROM:0C1E 64 01 xrl A, #1 ;if counter = 1 (divx)
ROM:0C20 60 03 jz ROM_C25 ;return
ROM:0C22 02 0B DD ljmp BS:382_B1:B753 ;else “press subtitle button”
ROM:0C25 ROM_C25:
ROM:0C25 22 ret
Não coincide o disassembly (em azul) com os opcodes (vermelho).
Eu cometí o mesmo erro no meu firmware. Vou consertar agora mesmo.
ronison e jmaraujo,
Obrigado pelo toque. Já consertei o meu texto lá em cima, conforme indicado abaixo:
"- Alterar 19 bytes em B1:FB10 (Criar rotina Autopress_subtitle onde só havia FF)
(opção Address -> Go to -> $1FB10)
De FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
Para 12 1E D8
7F C4 <------------------------------------Consertado; antes, estava 46
7E 13 <------------------------------------Consertado; antes, estava 00
12 1B 84
EF
64 01
60 03
02 2C 28
22
(...)"
ronison,
Consertei um bug - Não tinha feito corretamente o teste de mesa na sequência de comparações 8032 que se iniciam na GetFileType (B4:D4D7) a partir de B4:D4E8 e terminam em B4:D509.
Agora está assim: GetFileType, em B4:D511 desvia para DMF_or_AVI (localizada em B4:FB2C). A rotina DMF_or_AVI decide para se vai desviar para AVI_counter (B4:FB40) ou para DMF_counter (B4:FB30), que está imediatamente no byte seguinte, em função do conteúdo do acumulador:
- quando o código de mídia é 0x9 (mpeg/avi) -> acumulador = 0xFD
- quando o código de mídia é 0x12 (DMF=.divx) -> acumulador = 0xF8
-
Temos algo estranho nesta função DMF_or_AVi:
24 08 ADD A, #0x08 ;Adiciona o valor 8 ao acumulador (qual seria o valor anterior?)
70 10 JNZ 10 ;Sempre salta para o endereço FB3E (FB2E + 0x10). O que tem neste endereço? Onde está a decisão de DMF ou AVI?
Abraço,
-
Temos algo estranho nesta função DMF_or_AVi:
24 08 ADD A, #0x08 ;Adiciona o valor 8 ao acumulador (qual seria o valor anterior?)
70 10 JNZ 10 ;Sempre salta para o endereço FB3E (FB2E + 0x10). O que tem neste endereço? Onde está a decisão de DMF ou AVI?
Abraço,
Os valores anteriores do acumulador que podem chegar neste trecho de código é um destes aqui:
Acumulador = 0xFD -> chega assim quando o código de mídia é 0x09 (mpeg/avi)
Acumulador = 0xF8 -> chega assim quando o código de mídia é 0x12 (DMF=.divx)
Mestre Ronison,
Conferi no IDA Pro!
Na rotina DMF_or_AVI, no endereço B4:FB2E, o op code correto para jnz B4_FB40 é 70 10 mesmo.
É um salto para B4_B1_AVI_counter (B4:FB40).
A decisão de DMF ou AVI, vem quando somamos 0x08 ao acumulador e ele retorna flag "Zero" ou "Not Zero".
Exemplo1: Se chegar 0xF8, o código de mídia é 0x12 (DMF=.divx). 0xF8 + 0x08 = 0x00, ativando flag "Zero" e "Carry"("vai um"). Neste caso a jnz (Jump Not Zero) é ignorada e passamos para o próximo endereço de execução onde está B4_B1DMF_counter(FB30).
Exemplo1: Se chegar 0xFC, o código de mídia é 0x09 (mpeg/avi). 0xFC + 0x08 = 0x04, ativando flag "Not Zero" e "Carry"("vai um"). Neste caso a jnz (Jump Not Zero) é executada e passamos para endereço de execução onde está B4_B1AVI_counter(FB40).
Esta correção fiz após o teste de mesa (planilha Excel aqui anexa, tem a macro GetFileType dentro para testar o valor de entrada que quiser nela) na sequência de comparações 8032 que se iniciam na GetFileType (B4:D4D7) a partir de B4:D4E8 e terminam em B4:D509.
Por isso agora está assim: GetFileType, em B4:D511 desvia para DMF_or_AVI (localizada em B4:FB2C). A rotina DMF_or_AVI decide para se vai desviar para AVI_counter (B4:FB40) ou para DMF_counter (B4:FB30), que está imediatamente no byte seguinte, em função do conteúdo do acumulador:
Se tiver mais dúvidas, é só perguntar.
Saudações!
-
Ronison,
Por uma questão de controle de versões (e desencargo de consciência) faça um favor:
Certifique-se que no endereço B4:D517 (Dentro da rotina GetFileType) estão os op codes 7F 00 22.
É que tinha dito numa versão anterior do meu post
"- Alterar 3 bytes em B4:D517 (Dentro da rotina GetFileType)
(opção Address -> Go to -> $4D517)
De 7F 00
22
Para 02 FB 30"
Pois é, esqueça disso... Reverta! Tem que permanecer inalterado, ou seja, em B4:D517 (Dentro da rotina GetFileType) devem permanecer op codes 7F 00 22.
Poderia confirmar que leu?
Para evitarmos problemas no nosso glorioso firmware.
Grato!
-
Olá doctorxyz,
Eu já tinha feito assim. ;)
Abraço,
-
Jefferson, para responder a sua pergunta no tópico de desenvolvimento do firmware do Proview DVP816, fui dar uma olhada nas minhas anotações e no firmware do DVP5100 e achei um tipo de menú bem interessante: 0014.
Nas minhas anotações ainda não tinha identificado este tipo de menú. Agora estou achando que é um tipo de link especial que permite chamar um (sub)menú desde as opções de escolha de um outro (sub)menú, em lugar de ser chamado desde um (sub)menú.
Por exemplo, no DVP5100, dentro do menú de ajustes de cores ha quatro opções de escolha: Standard, Bright, Soft e Personal (mas este último não é uma opção, mas um link)
(http://img219.imageshack.us/img219/9063/dvp51000628menvideoajusqv4.jpg)
4. No Pic. | Picture Setting | Picture Setting
0008 FFFF 04E9 04E9 005C 0000 0003 0000 FF3D05 0A7B - ROM:3D11
=> 1. Standard | Standard | [00]
04BE 04BE 0561 00 - ROM:3CE9
2. Bright | Bright | [00]
048F 048F 0561 01 - ROM:3CF0
3. Soft | Soft | [00]
04BF 04BF 0561 02 - ROM:3CF7
4. Personal | Go To Personal Page | [00]
04EB 0553 0561 03 - ROM:3CFE
Seguindo o link do "Personal" temos a página de configuração de brilho, contraste, etcétera.
23. [00] | Personal Picture Setup
02 0561 04EC 05 FF3525 0000 - ROM:3534
1. No Pic. | 0 | 0
0014 FFFF 0000 0000 FFFF 0000 0000 0000 000000 0000 - ROM:2D03
2. No Pic. | Brightness %f8%11d %f0%3d | Brightness
000A FFFF 0093 0092 0084 0078 0014 0000 000000 0A51 - ROM:34D1
3. No Pic. | Contrast %f8%11d %f0%3d | Contrast
000A FFFF 00CF 00CE 0085 0079 0010 0000 000000 0A51 - ROM:34E6
4. No Pic. | Saturation %f8%11d %f0%3d | Tint
000A FFFF 03DD 0181 0088 0043 0009 0000 000000 0A51 - ROM:34FB
5. No Pic. | Hue %f8%11d %f0%3d | Color
000A FFFF 0182 03DC 0087 007A 0009 0000 000000 0A51 - ROM:3510
O menú "Personal Picture Setup" tem cinco opções, más somente as quatro que começam com 000A aparecem na tela.
Estou quase certo que o primeiro funciona como link entre a opção "Personal" do menú "Picture Setting", e a página "Personal Picture Setup".
Ainda não conseguí achar uma relaçao entre eles.
A definiçao do menú 0014 está prácticamente vazía: "0014 FFFF 0000 0000 FFFF 0000 0000 0000 000000 0000" -> 0014 tipo de menú, FFFF sem ícone, o segundo FFFF ?????.
-
o MTKArmResizer não funciona em ARM de 3 códigos, como é o caso do DVP-858.
evb62,
Poderia confirmar e/ou completar esta afirmação?
O MTKArmResizer não funciona em nenhum firmware com três ARM Codes (ARM Code 1, ARM Code 2 e ARM Code 3), ou só não funcionou (empiricamente falando) no firmware do Proview DVP-858?
É que fiquei com a pulga atrás da orelha depois de ler a sua afirmação. O curioso é que no help do MKTArmResizer ele cita o código 3 desta forma:
"ARM Code 1 & 2 [&3]"
Grato
-
O MTKWindows (0.8.3.) não "suporta" janelas de 256 cores... Estou modificando o firmware (quero liberdade para escolher as cores do ícones) e o MTK Windows mostra isto (somente 20 cores):
(http://img221.imageshack.us/img221/6808/palettelj7.jpg)
Vou ter que por as cores individualmente, mas não entendo a lógica detrás da conversão bytes->cor. Até agora somente sei que Magenta é "FF FF".
Será possivel agrandar esa janela com um resource editor?
-
O MTKWindows (0.8.3.) não "suporta" janelas de 256 cores... Estou modificando o firmware (quero liberdade para escolher as cores do ícones) e o MTK Windows mostra isto (somente 20 cores):
Antes de comentar sobre esse assunto eu preciso perguntar: Como você chegou a essa janela com 20 células? :blink:
Vou ter que por as cores individualmente, mas não entendo a lógica detrás da conversão bytes->cor. Até agora somente sei que Magenta é "FF FF".
Se tudo o que você precisa é saber o valores, basta usar outro programa do New Age: MtkColorSpace.
Será possivel agrandar esa janela com um resource editor?
Aumentar o tamanho da janela, sim.
Colocar mais células, talvez.
Fazer com que o programa use essas células, não.
-
Doctorxyz,
Realmente, o arquivo help mais recente, datado de 19/05/2005, menciona ARM de 3 codes. Em minha opinião, a menção não é uma afirmação de que há suporte para isso.
Em 23/05/2005, o NewAge afirmou que o MtkArmResizer e o MtkReplacer ainda não eram compatíveis com arms de 3 codes:
http://tech.groups.yahoo.com/group/mt13x9/message/5675
Quanto ao DVP-858, eu acho que tentei aplicar o MtkArmResizer e não deu certo. Mas é possível que eu nem tenha tentado, porque não liguei o cabo serial no meu aparelho. Faz tempo e não lembro direito. Para dizer a verdade, eu tinha esquecido tudo isso, mas felizmente tenho a assinatura deste tópico para visitá-lo quando há novidades.
o MTKArmResizer não funciona em ARM de 3 códigos, como é o caso do DVP-858.
evb62,
Poderia confirmar e/ou completar esta afirmação?
...
Grato
-
o MTKArmResizer não funciona em ARM de 3 códigos, como é o caso do DVP-858.
evb62,
Poderia confirmar e/ou completar esta afirmação?
O MTKArmResizer não funciona em nenhum firmware com três ARM Codes (ARM Code 1, ARM Code 2 e ARM Code 3), ou só não funcionou (empiricamente falando) no firmware do Proview DVP-858?
É que fiquei com a pulga atrás da orelha depois de ler a sua afirmação. O curioso é que no help do MKTArmResizer ele cita o código 3 desta forma:
"ARM Code 1 & 2 [&3]"
Grato
Doctorxyz,
Estou usando a área de mensagens de erro para trabalhar códigos no ARM. Certamente você já deve saber, mas isto dispensa o Resizer.
Abraço,
-
Doctorxyz,
Estou usando a área de mensagens de erro para trabalhar códigos no ARM. Certamente você já deve saber, mas isto dispensa o Resizer.
Abraço,
[/quote]
Legal Ronison,
Que bom que você já está conseguindo se virar com esta área.
Desabafo: Como ARM é bem mais complicado que 8051 hein!
Será que a gente conseguiria neste espaço alocar (no Philips 5965K/55) nomes longos a partir da USB + Word Wrap (algoritmo Danny Moroz) sem perder nenhuma funcionalidade (principalmente o HDMI)?
Bom, vou seguir a minha pesquisa sobre MtkArmResizer em paralelo, pode ser útil em algum momento para nós (ou para alguém da comunidade).
Estou querendo contribuir e documentar o Word Wrap com algoritmo Danny Moroz para a comunidade.
Caso seu word wrap seja Danny Moroz, esteja pronto e você tenha tempo (e não seja um incômodo) poderia disponibilizar as dicas no tópico específico que abri para isso neste fórum, dentro da seção Philips 5965K/55?
Obrigado
-
Quanto ao DVP-858, eu acho que tentei aplicar o MtkArmResizer e não deu certo. Mas é possível que eu nem tenha tentado, porque não liguei o cabo serial no meu aparelho. Faz tempo e não lembro direito. Para dizer a verdade, eu tinha esquecido tudo isso, mas felizmente tenho a assinatura deste tópico para visitá-lo quando há novidades.
evb62,
Obrigado pelo seu pronto retorno. É, o NewAge deve ter feito uma versão melhorada depois disso.
Amigos,
Diante do exposto pelo colega evb62 e dos testes que acabei de fazer (abaixo), ao que tudo indica o MtkArmResizer "não gosta" - pelo menos parcialmente - dos firmwares do Proview DVP-858.
No MtkArmResizer, temos 4 opções de análise (o NA por algum motivo considera a opção 4 a mais indicada), são elas:
- Opção 1:32bit values
- Opção 2:code search
- Opção 3:code search + 32bit values
- Opção 4:code search + 32bit values at ARM1 end
Abrindo os binários dos "ARM Codes" no MtkArmResizer, notem o que constatei.
No Proview DVP-858 nos firmwares...
- Proview DVP-858 v20.06 (Original)
Version: 05.00.06.05
Block 1 Size: 0x000536F8
Block 2 Size: 0x00024AFC
Block 3 Size: 0x000228B4
Total Size: 0x0009AAA8
File Size: 0x0009AAA8
- Proview DVP-858 v20.07 (Original)
Version: 05.00.06.05
Block 1 Size: 0x00054F18
Block 2 Size: 0x0002574C
Block 3 Size: 0x000227D4
Total Size: 0x0009CE38
File Size: 0x0009CE38
- Proview DVP-858 v3.0 (Eneris)
Version: 05.00.06.05
Block 1 Size: 0x00054F18
Block 2 Size: 0x0002574C
Block 3 Size: 0x000227D4
Total Size: 0x0009CE38
File Size: 0x0009CE38
...as opções 1 e 3 não dão erro, já nas opções 2 e 4 aparece o erro "List index of bounds (0)".
No Philips DVP-5965K/55, nos firmwares...
- Philips DVP5965K/55 V.93.06.37.34 (Original)
Version: 05.00.06.05
Block 1 Size: 0x0004FDEC
Block 2 Size: 0x0001FD1C
Block 3 Size: 0x0001BD8C
Total Size: 0x0008B894
File Size: 0x0008B894
- Philips DVP5965K/55 v2.2 (eneris) v.PB
Version: 05.00.06.05
Block 1 Size: 0x0004FDD0
Block 2 Size: 0x0001FD6C
Block 3 Size: 0x0001BD8C
Total Size: 0x0008B8C8
File Size: 0x0008B8C8
- Philips DVP5965K/55 v2.2 (eneris) v.HDMI
Version: 05.00.06.05
Block 1 Size: 0x0004FDEC
Block 2 Size: 0x0001FD1C
Block 3 Size: 0x0001BD8C
Total Size: 0x0008B894
File Size: 0x0008B894
- Philips DVP5965K/55 v2.2b (naasom) v.PB
Version: 05.00.06.05
Block 1 Size: 0x0004FDD0
Block 2 Size: 0x0001FD6C
Block 3 Size: 0x0001BD8C
Total Size: 0x0008B8C8
File Size: 0x0008B8C8
- Philips DVP5965K/55 Beta 5 (ronison=NKVT)v.HDMI
Version: 05.00.06.05
Block 1 Size: 0x0004FDEC
Block 2 Size: 0x0001FD1C
Block 3 Size: 0x0001BD8C
Total Size: 0x0008B894
File Size: 0x0008B894
...todas as opções (1, 2, 3 e 4) funcionam.
A pergunta que fica é: Qual opção de análise no MtkArmResizer é - de fato - a melhor para o Philips DVP-5965K/55?
-
O MTKWindows (0.8.3.) não "suporta" janelas de 256 cores... Estou modificando o firmware (quero liberdade para escolher as cores do ícones) e o MTK Windows mostra isto (somente 20 cores):
Antes de comentar sobre esse assunto eu preciso perguntar: Como você chegou a essa janela com 20 células? :blink:
Antes que nada, esclareço que somente estou fazendo experimentos... Ainda há outras coisas a solucionar, como por exemplo: ¿Cómo faço um bitmap de 256 cores? ¿Um bitmap indexado de 256 cores serve? ¿Ou o bitmap, ao igual que os de 16 cores, é um tipo especial de arquivo?
Faz tempo (mais de um ano) que não tocava o tema das janelas no firmware... Bem, vamos ao que interessa:
Tenho lido e escutado sobre referencias no código fonte a 4/16/256/truecolor OSD bitmaps. (Aclaro que não chequei no código fonte).
No firmware do DVP5100, banco 3, temos a tabela (mais conhecida como OSD_AddrTable) das WB, ou White Boards, que é como as Windows IDs são chamadas no código fonte:
ROM:3BE7 OSD_AddrTable
ROM:3BE7 FF .byte 0xFF
ROM:3BE8 38 7A .word 0x387A ; Ventana 0x00
ROM:3BEA FF .byte 0xFF
ROM:3BEB 38 9C .word 0x389C ; Ventana 0x01
ROM:3BED FF .byte 0xFF
ROM:3BEE 38 8B .word 0x388B ; Ventana 0x02
...
ROM:3C11 FF .byte 0xFF
ROM:3C12 39 77 .word 0x3977 ; Ventana 0x0E <-- Link WB 0x0E
Seguindo o link da janela 0x0E:
ROM:3977 Ventana 0x0E
ROM:3977 00 34 .word 0x34 ; x1 = 52
ROM:3979 00 76 .word 0x76 ; y1 = 118
ROM:397B 02 A0 .word 0x2A0 ; x2 = 672
ROM:397D 01 AF .word 0x1AF ; y2 = 431
ROM:397F 00 30 .word 0x30 ; Pal DY (diferencia PAL-NTSC=DY)
ROM:3981 0E .byte 0xE ; Ventana 0x0E
ROM:3982 02 .byte 2 ; Cantidad de colores (1=4, 2=16)
ROM:3983 02 .byte 2 ; Transparencia
ROM:3984 00 .byte 0 ; ? ? ? ?
ROM:3985 FF .byte 0xFF ; Pointer byte
ROM:3986 39 44 .word 0x3944 ; Pointer a paleta de colores
Agora trocamos:
ROM:3982 02 .byte 2
por
ROM:3982 08 .byte 8
e...
ROM:3986 39 44 .word 0x3944
por
ROM:3986 FA C2 .word 0xFAC2
Abrindo o firmware com o MTK Windows obtem-se o resultado anteriomente descrito... Trocando as células visíveis e reanalizando o firmware com o IDA agora temos:
(http://img221.imageshack.us/img221/6808/palettelj7.jpg)
ROM:FAC2 Paleta de 256 colores - Ventana 0x0E
ROM:FAC2 5B D2 .word 0x5BD2 ; Color #00
ROM:FAC4 2E F1 .word 0x2EF1 ; Color #01
ROM:FAC6 8D D8 .word 0x8DD8 ; Color #02
ROM:FAC8 9C 49 .word 0x9C49 ; Color #03
ROM:FACA FF FF .word 0xFFFF ; Color #04 - FFFF=Magenta
ROM:FACC 85 F4 .word 0x85F4 ; Color #05
ROM:FACE E2 40 .word 0xE240 ; Color #06
ROM:FAD0 FF FF .word 0xFFFF ; Color #07 - FFFF=Magenta
ROM:FAD2 97 25 .word 0x9725 ; Color #08
ROM:FAD4 FF FF .word 0xFFFF ; Color #09 - FFFF=Magenta
ROM:FAD6 1D BF .word 0x1DBF ; Color #0A
ROM:FAD8 94 45 .word 0x9445 ; Color #0B
ROM:FADA 94 45 .word 0x9445 ; Color #0C
ROM:FADC 49 2A .word 0x492A ; Color #0D
ROM:FADE FF FF .word 0xFFFF ; Color #0F - FFFF=Magenta
ROM:FAE0 FF FF .word 0xFFFF ; Color #10 - FFFF=Magenta
ROM:FAE2 22 56 .word 0x2256 ; Color #11
ROM:FAE4 FF FF .word 0xFFFF ; Color #12 - FFFF=Magenta
ROM:FAE6 97 25 .word 0x9725 ; Color #13
ROM:FAE8 FF FF .word 0xFFFF ; Color #14 - FFFF=Magenta
ROM:FAEA FF FF .word 0xFFFF
ROM:FAEC FF FF .word 0xFFFF
ROM:FAEE FF FF .word 0xFFFF
ROM:FAF0 FF FF .word 0xFFFF
...
UPDATE: Se comparar as cores escritas no firmware pelo MTK Windows, com o MTKColorSpace que você sugeriu, vai ver que elas são exatamente as mesmas... ¡as 20 visíveis!
Se tudo o que você precisa é saber o valores, basta usar outro programa do New Age: MtkColorSpace.
Legal, vou tentar. UPDATE: Já testei, era exatamente o que eu procurava. Obrigado.
Aumentar o tamanho da janela, sim.
Colocar mais células, talvez.
Fazer com que o programa use essas células, não.
O programa usa as células... O problema é que eu somente posso modificar as células visíveis. Eu chequei o firmware após usar o programa e todas as 20 cores tinham sido corretamente trocadas...
Por outro lado, tentei agrandar a janela com os dois programas sugeridos no tópico do MTK Patcher (ResourceHacker e XNResourceEditor), mas nenhúm deles funciona corretamente com o arquivo executável do MTK Windows.
-
Legal Ronison,
Que bom que você já está conseguindo se virar com esta área.
Desabafo: Como ARM é bem mais complicado que 8051 hein!
Será que a gente conseguiria neste espaço alocar (no Philips 5965K/55) nomes longos a partir da USB + Word Wrap (algoritmo Danny Moroz) sem perder nenhuma funcionalidade (principalmente o HDMI)?
Bom, vou seguir a minha pesquisa sobre MtkArmResizer em paralelo, pode ser útil em algum momento para nós (ou para alguém da comunidade).
Estou querendo contribuir e documentar o Word Wrap com algoritmo Danny Moroz para a comunidade.
Temos, seguramente, 369 bytes de espaço nesta área. Existe uma área suspeita e o espaço pode aumentar para ~7,7K.
Não sei ainda o do USB, mas o algoritmo do wrodwrap usa 356 bytes.
Caso seu word wrap seja Danny Moroz, esteja pronto e você tenha tempo (e não seja um incômodo) poderia disponibilizar as dicas no tópico específico que abri para isso neste fórum, dentro da seção Philips 5965K/55?
Obrigado
Ainda não está ok. Assim que eu tiver um tempinho coloco aqui o estado atual.
Abraço,
-
O programa usa as células... O problema é que eu somente posso modificar as células visíveis. Eu chequei o firmware após usar o programa e todas as 20 cores tinham sido corretamente trocadas...
Ahhhhhhhhh...
Isso ocorre porque o NewAge programou a criação dinâmica das células em um loop baseado no número de cores. Ele não esperava por mais de 16 cores, mas o loop continua criando as células às cegas.
Por outro lado, tentei agrandar a janela com os dois programas sugeridos no tópico do MTK Patcher (ResourceHacker e XNResourceEditor), mas nenhúm deles funciona corretamente com o arquivo executável do MTK Windows.
O MTKWindows, assim como os meus programas, está comprimido com UPX. Antes de usar um resource editor qualquer você precisa descomprimir.
No caso, baixe o UPX (http://upx.sourceforge.net/) e use o comando upx.exe -d mtkwindows.exe
Só que você vai encontrar um pequeno problema com o mtkWindows: aumentar o tamanho da janela não adianta. NewAge decide o tamanho da janela por programação, todas as vezes em que selecionamos a aba "Windows" do programa.
Mas existe um modo de contornar isso.
Abra o programa já descomprimido no Resource Hacker (http://www.angusj.com/resourcehacker/)
(http://ryan.com.br/imagens/forum/resourcehacker_mtkwindows_50.jpg)
Mude a palavra bsToolWindow, destacada em verde, para bsSizeToolWin Editado: Não adianta procurar no Help do programa. Para saber o que precisa ser mudado e pelo que, você precisa estar familiarizado com a VCL da Borland (Delphi, C++ Builder, etc).
Não adianta mudar ClientHeight e ClientWidth (em vermelho). Adiantaria, se New Age não estivesse definindo as dimensões da janela por programação.
Clique em Compile Script e salve
Execute o mtkWindows. Aparentemente, nada mudou. Mas mova o mouse sobre a borda da janela de palette e você irá poder redimensioná-la temporariamente para o tamanho que quiser.
(http://ryan.com.br/imagens/forum/mtkwindows_palettehacked_50.jpg)
-
Quando um executável Windows qualquer não funcionar com um Resource Editor, analise-o com o ExeInfo PE (http://www.exeinfo.go.pl/). Esse programa é capaz de identificar vários tipos de compressão e dá dicas de como lidar com elas.
-
Obrigado. Agora ficou assim:
(http://img232.imageshack.us/img232/43/paletteek2.jpg)
Na verdade, não sei nem para que servem estas mudanças (se é que funcionam). Agora, apos ter feito as mudanças, não acho muita utilidade em ter uma janela de 256 cores que vai ocupar 512 bytes que poderíam fazer falta no futuro.
-
jmaraujo,
Lembro que você falou sobre o uso de caracteres acentuados no filebrowser a um tempo atrás. Pois bem, estou com este problema. Caracteres especiais estão sendo substituídos por "_". Já vi muita coisa aqui e fiquei com uma dúvida: o UnicodeToCP (ARM) descrito no documento "Patching_HU3899_from_A_to_Z.txt" resolve este problema nos philips? Complementando, não encontrei na rotina Dir_FileNameFilter, no 8052, qualquer definição de limites dos caracteres possíveis.
PS: Infelizmente estou sem ter como testar pois meu player está na assistência. :-[
Abraço,
-
Só para complementar, existe um modo, um tanto deselegante, de passar por cima da definição do tamanho da janela feita por New Age.
Mude os valores de ClientWidth e ClientHeight
Apague a linha OnShow = FormShow
Você verá que, antes de carregar qualquer firmware as duas novas dimensões são respeitadas, mas a altura é redefinida automaticamente quando é carregado um firmware. É possível que na sua versão experimental com mais células a altura acompanhe o número de células (eu acho difícil), mas isso é algo que você mesmo precisa testar.
-
Caracteres especiais estão sendo substituídos por "_". Já vi muita coisa aqui e fiquei com uma dúvida: o UnicodeToCP (ARM) descrito no documento "Patching_HU3899_from_A_to_Z.txt" resolve este problema nos philips?
O CP125x que eu estou usando é bem simplezinho, mas não é a solução ao seu problema. O meu patch o que faz e trocar os carateres 250-255 por 0-5 (Há uma explicação técnica (http://tech.groups.yahoo.com/group/mt13x9/message/649) do Mabreaker sobre o porqué os carateres 250-255 não são lidos, o que não vem ao caso).
O seu problema é o filtro dos caracteres, então o mais fácil é mudar esse filtro.
¿O que o tal filtro faz? Ele verifica se o caractere pasado ao Arm é menor do que '20' (espaço), ou maior do que '7E' (~). Se for menor do que 20, ou maior do que 7E, o caracter e sustituido por um '_'.
O que você tem que fazer e mudar o '20' por '00', e o '7E' por 'FF', desse jeito ele vai buscar por carateres menores que 00 ou maiores que FF, o que claro, não existem.
Procedimento: Busque no bloco ArmCode completo a seqüencia "7E 22 20 21". No meu firmware (os valores já foram trocados):
ROM:0000DCF4 FF 22 MOV R2, #0xFF
ROM:0000DCF6 00 21 MOV R1, #0
Isso é tudo.
Só para complementar, existe um modo, um tanto deselegante, de passar por cima da definição do tamanho da janela feita por New Age.
Mude os valores de ClientWidth e ClientHeight
Apague a linha OnShow = FormShow
Você verá que, antes de carregar qualquer firmware as duas novas dimensões são respeitadas, mas a altura é redefinida automaticamente quando é carregado um firmware. É possível que na sua versão experimental com mais células a altura acompanhe o número de células (eu acho difícil), mas isso é algo que você mesmo precisa testar.
Não, as células seguem na mesma posição. Mas não se preocupe, estou desistindo de experimentar as mudanças no player...
-
Caracteres especiais estão sendo substituídos por "_". Já vi muita coisa aqui e fiquei com uma dúvida: o UnicodeToCP (ARM) descrito no documento "Patching_HU3899_from_A_to_Z.txt" resolve este problema nos philips?
O CP125x que eu estou usando é bem simplezinho, mas não é a solução ao seu problema. O meu patch o que faz e trocar os carateres 250-255 por 0-5 (Há uma explicação técnica (http://tech.groups.yahoo.com/group/mt13x9/message/649) do Mabreaker sobre o porqué os carateres 250-255 não são lidos, o que não vem ao caso).
O seu problema é o filtro dos caracteres, então o mais fácil é mudar esse filtro.
¿O que o tal filtro faz? Ele verifica se o caractere pasado ao Arm é menor do que '20' (espaço), ou maior do que '7E' (~). Se for menor do que 20, ou maior do que 7E, o caracter e sustituido por um '_'.
O que você tem que fazer e mudar o '20' por '00', e o '7E' por 'FF', desse jeito ele vai buscar por carateres menores que 00 ou maiores que FF, o que claro, não existem.
Procedimento: Busque no bloco ArmCode completo a seqüencia "7E 22 20 21". No meu firmware (os valores já foram trocados):
ROM:0000DCF4 FF 22 MOV R2, #0xFF
ROM:0000DCF6 00 21 MOV R1, #0
Isso é tudo.
Isso tudo eu tinha entendido. Agora ficou meio confuso o que você falou. O filtro deve estar no 8052, certo? Pois bem, como eu falei não existe a definição dos limites (20 e 7E) neste código. Entretanto, você fala em buscar no ARM Code uma sequência? O filtro então estaria no ARM Code?
Abraço,
-
O filtro deve estar no 8052, certo? Pois bem, como eu falei não existe a definição dos limites (20 e 7E) neste código. Entretanto, você fala em buscar no ARM Code uma sequência? O filtro então estaria no ARM Code?
Não, você está confundindo. O filtro está no ArmCodes.
Os firmwares Philips não tem o filtro no 8032. Caso tivessem, voçê tería que fazer o patch nos dois lugares: ArmCode e 8032.
Se quiser estar seguro, busque no 8032 por "90 ? ? E0 FF 90 ? ? E0 FE C3 9F 50 05 C3 EF", mas -como eu disse- nos firmwares Philips não tem ese filtro.
Saudações!
PS: Se quiser checar o filtro nos meus ArmCodes, olhe no endereço ROM:DCF4.
-
O filtro está no ArmCodes.
Os firmwares Philips não tem o filtro no 8032.
Isso era tudo que eu precisava saber. ;D
Dei uma investigada profunda nas rotinas DIR_DispFileList e Dir_FileNameFilter tentando identificar o filtro porém só encontrei vestígios 8). Agora está tudo blz. :yahoo!:
Valeu mesmo.
-
LG DK194g
Como reduzir o bloco OSD1 para ganhar tempo nos testes.
O grande número de bitmaps no firmware do DK194G atrapalha bastante o trabalho de quem faz experiências com o firmware. No meu caso (Semprom 2300+), a mais banal das mudanças com o mtkRemaker faz o software ficar aparentemente travado por cerca de 27s. Trocar 6 fontes, que leva uns 20-30 segundos em firmwares não-LG, leva 3 minutos no LG DK194G.
Um firmware MTK genérico relativamente complexo como o do DVP-858 tem 61 bitmaps. Um bloco de ícones da LG normalmente tem entre 320 e 330. No DK194G, por causa da função "game", são 1009.
Mas nem mtkRemaker nem mtkReplacer permitem a substituição do bloco "ícones" apenas. É preciso substituir o bloco OSD1 (fontes e ícones) inteiro. Apagar os ícones extras apenas não é viável, porque você só pode fazer um por um, e são centenas.
Eu comecei substituindo pelo bloco OSD1 do LG DV256K. Não deu certo e as evidências são de que os ícones de 0 a 321 do DV256K não seguem a mesma ordem usada no DK194G, porque fica uma bagunça:
(http://ryan.com.br/imagens/mediatek/lg_dk194g_usando_osd1_dv256k_50.jpg)
Então eu tentei com o OSD1 do DK8321N e funcionou sem bagunça no browser. Mas como o 8321N tem menos fontes que o DK194G, a bagunça ficou na exibição das legendas. Isso é bem mais simples de resolver, porque bastou trocar manualmente as fontes do DK8321N pelas do DK194g. Como o excesso de bitmaps já tinha sido removido, trocar as fontes e acrescentar o que faltava levou bem menos tempo do que tentar fazer o mesmo com os ícones.
Como vantagem adicional, o bloco OSD1 é reduzido em tamanho de 834KB para 355KB. Uma redução de quase meio megabyte certamente faz diferença na hora de gravar o firmware.
O bloco criado por mim (ícones do DK8321N e fontes do DK194G) está anexo, para você não ter esse trabalho todo.
-
LG DK 194G
Como reduzir o firmware para acelerar os testes, pela redução do tempo de upgrade.
Aviso: Isso vai matar a função game completamente. Antes de distribuir o firmware você deve lembrar de restaurar tudo.
O tempo normal de upgrade por cabo do LG DK194G é de cerca de 8 minutos. Com esse procedimento o tempo cai para pouco menos de 4 minutos.
(http://ryan.com.br/imagens/mediatek/lg_dk194g_overhead_games_50.jpg)
- Substitua o bloco OSD1 inteiro usando o processo explicado no post anterior.
- Substitua o bloco SKIN inteiro pelo do LG DV256K. O Tamanho cai para 62KB;
- Substitua o item Unknown (1) pelo item Unknown (5) do mesmo firmware, que tem apenas 4 bytes;
Ao final dessa operação o tamanho do firmware terá caido de 4003KB para 1844KB e o tempo de gravação de 8 minutos para pouco menos de 4 minutos. Além disso, com a redução do número de figuras o firmware vai abrir bem mais rápido no mtkRemaker.
-
Firmwares LG
Como localizar o bloco de paletes
Este procedimento também encontra os blocos em firmwares não-LG, mas só é realmente necessário quando o mtkWindows não consegue localizar as paletes, como é o caso dos aparelhos LG.
O "truque" se baseia no fato de que o "preto" em uma palete MTK geralmente é gravado como "0x12 0x10" no firmware, que esta é uma combinação relativamente incomum em assembly 8032 e que o preto ocorre várias vezes nas paletes.
Usando o IDA, procure por todas as ocorrências da string hexa "12 10". O maior bloco dentro de um único banco identificado como "byte" são as paletes.
(http://ryan.com.br/imagens/mediatek/ida_paletes_50.jpg)
O mtkWindows não consegue achar as paletes porque o endereço de cada uma delas não está na definição de cada janela, como ocorre em outros firmwares. Os dois bytes reservados para cada endereço são sempre "00 00" nos firmwares LG que olhei.
Por conta disso, mesmo encontrando o bloco é um tanto complicado definir exatamente onde começa e termina cada palete. Em geral as paletes tem 32 bytes (16 células) mas aparentemente há pelo menos uma palete de 8 bytes (4 células) nos firmwares LG, porque o total de bytes no bloco nos três firmwares indicados na figura acima é 8 mais um múltiplo de 32.
Eu já descobri como localizar, por análise, o início da maioria das paletes. Mas o método ainda é muito confuso.
-
Firmwares LG
Como localizar as rotinas que carregam as paletes
As rotinas apontam para o início de cada palete.
Procure por:
90 ? ? E0 FD 25 E0 24 ? f5 82 e4 34 ? f5 83
O resultado são várias ocorrências parecidas com isto:
B7:C31C B7_C31C: ; CODE XREF: BankSw_455_B7_C2D8+1Aj
B7:C31C 90 FC 94 mov DPTR, #XRAM_FC94
B7:C31F E0 movx A, @DPTR
B7:C320 FD mov R5, A
B7:C321 25 E0 add A, ACC ; Accumulator
B7:C323 24 84 add A, #0x84 ; 'ä'
B7:C325 F5 82 mov DPL, A ; Data Pointer, Low Byte
B7:C327 E4 clr A
B7:C328 34 2B addc A, #0x2B ; '+'
B7:C32A F5 83 mov DPH, A ; Data Pointer, High Byte
Esta rotina carrega DPTR com o endereço base da palete, no mesmo banco. No caso acima, a palete começa em 0x2B84.
Nos meus testes, a string de busca só encontrou as rotinas realmente relacionadas com carga de paletes, mas não encontrou todas. Ainda existem paletes no bloco que ou não são usadas ou são carregadas de outra maneira.
E ainda falta descobrir como se faz a associação palete-janela.
-
Jefferson, você tem idéia de como e feito o "hold & press" (como NA chama a função que controla as teclas do controle remoto quando apretadas por um par de segundos)?
O DVP5100 não tem tal função... Mas o "stop" funciona como "eject" se apertado por dois segundos... Ainda não achei como e feito essa mudança de "14" para "7E".
Já fiz uma busca de texto por "0x14" ou "0x7E", mas sem resultados conclusivos...
-
Jefferson, você tem idéia de como e feito o "hold & press" (como NA chama a função que controla as teclas do controle remoto quando apretadas por um par de segundos)?
O DVP5100 não tem tal função... Mas o "stop" funciona como "eject" se apertado por dois segundos... Ainda não achei como e feito essa mudança de "14" para "7E".
Já fiz uma busca de texto por "0x14" ou "0x7E", mas sem resultados conclusivos...
Sei que parece óbvio, mas você já tentou rastrear o fluxo de execução da tecla Stop?
Abraço,
-
Sei que parece óbvio, mas você já tentou rastrear o fluxo de execução da tecla Stop?
Não. Como faço isso? :oops:
-
Firmwares LG
Como é feita a associação janela-palete
Procure pela seguinte string hexa:
B4 xx 00 40 03 02 ? ? 90 ? ? F8 28 28 73
Onde xx é o número da última janela do firmware, como visto no mtkWindows.
Em alguns casos você vai encontrar mais de uma ocorrência, mas apenas uma delas é a correta. O resultado é parecido com isto (LG DK194G):
B7:14B8 B7_14B8: ; CODE XREF: BankSw_64_B7_13FC+37j
B7:14B8 90 FC BC mov DPTR, #XRAM_FCBC ; NUM_Janela?
B7:14BB E0 movx A, @DPTR
B7:14BC 14 dec A
B7:14BD B4 12 00 cjne A, #0x12, B7_14C0
B7:14C0
B7:14C0 B7_14C0:
B7:14C0 40 03 jc EscolhePalete
B7:14C0
B7:14C2 02 19 E8 ljmp RET
B7:14C2
B7:14C5 ; ---------------------------------------------------------------------------
B7:14C5
B7:14C5 EscolhePalete: ; CODE XREF: BankSw_64_B7_13FC:B7_14C0j
B7:14C5 90 14 CC mov DPTR, #0x14CC
B7:14C8 F8 mov R0, A ; Aqui o conteúdo de A deve ser de 0 a 17 (0 a 0x11)
B7:14C9 28 add A, R0
B7:14CA 28 add A, R0 ; Ao chegar aqui, o conteúdo do acumulador foi multiplicado por três
B7:14CB 73 jmp @A+DPTR
B7:14CB
B7:14CC ; ---------------------------------------------------------------------------
B7:14CC 02 15 7A ljmp CarregaPalete02
B7:14CC
B7:14CF ; ---------------------------------------------------------------------------
B7:14CF 02 15 02 ljmp CarregaPalete01
B7:14CF
B7:14D2 ; ---------------------------------------------------------------------------
B7:14D2 02 15 E4 ljmp CarregaPalete03
B7:14D2
B7:14D5 ; ---------------------------------------------------------------------------
B7:14D5 02 17 22 ljmp CarregaPalete07
B7:14D5
B7:14D8 ; ---------------------------------------------------------------------------
B7:14D8 02 17 45 ljmp CarregaPalete08
B7:14D8
B7:14DB ; ---------------------------------------------------------------------------
B7:14DB 02 19 07 ljmp CarregaPalete19
B7:14DB
B7:14DE ; ---------------------------------------------------------------------------
B7:14DE 02 18 E4 ljmp CarregaPalete15
B7:14DE
B7:14E1 ; ---------------------------------------------------------------------------
B7:14E1 02 19 61 ljmp CarregaPalete04
B7:14E1
B7:14E4 ; ---------------------------------------------------------------------------
B7:14E4 02 18 7E ljmp CarregaPalete05_2
B7:14E4
B7:14E7 ; ---------------------------------------------------------------------------
B7:14E7 02 16 1B ljmp CarregaPalete05_1
B7:14E7
B7:14EA ; ---------------------------------------------------------------------------
B7:14EA 02 16 EB ljmp CarregaPalete06
B7:14EA
B7:14ED ; ---------------------------------------------------------------------------
B7:14ED 02 16 85 ljmp CarregaPalete05_3
B7:14ED
B7:14F0 ; ---------------------------------------------------------------------------
B7:14F0 02 17 AC ljmp CarregaPalete09
B7:14F0
B7:14F3 ; ---------------------------------------------------------------------------
B7:14F3 02 17 CF ljmp CarregaPalete12
B7:14F3
B7:14F6 ; ---------------------------------------------------------------------------
B7:14F6 02 17 F2 ljmp CarregaPalete11
B7:14F6
B7:14F9 ; ---------------------------------------------------------------------------
B7:14F9 02 18 15 ljmp CarregaPalete13
B7:14F9
B7:14FC ; ---------------------------------------------------------------------------
B7:14FC 02 18 38 ljmp CarregaPalete10
B7:14FC
B7:14FF ; ---------------------------------------------------------------------------
B7:14FF 02 18 5B ljmp CarregaPalete14
B7:14FF
B7:1502 ; ---------------------------------------------------------------------------
B7:1502
Os nomes CarregaPaleteXX foram atribuídos por mim por análise manual do firmware.
No exemplo acima, se a janela for 8, 9 ou 11 é a palete 5 que é usada, por meio de três rotinas diferentes, que não vou mostrar aqui por enquanto.
A numeração das paletes é minha, atribuída de acordo com a posição da palete no bloco.
-
Não. Como faço isso? :oops:
Seria seguir o fluxo de execução desde a decodificação da tecla Stop até a execução da rotina de tratamento. Fiz um ensaio e encontrei um local bem suspeito de ser o que você está procurando. Pelo fluxo que segui, chega um ponto onde ele decide se vai repassar o código 5 (P&H + 1) ou o código 15 (Stop + 1) para o tratamento. A decisão é tomada baseando-se num valor lido 3 vezes num único endereço (acredito que este valor seja o tempo de pressionamento da tecla).
O que fiz:
1. Fui numa tabela de tratamento de códigos do RC (aquela usada no Auto Load).
2. Peguei o código #14 (Stop) e segui o fluxo.
Depois eu posto o código aqui, caso haja interesse.
-
Sei que parece óbvio, mas você já tentou rastrear o fluxo de execução da tecla Stop?
Acho que agora entendí o que você quis dizer...
Em Remote_General não ha código de execução para "Stop".
Sim há em Remote_DVDPlayback e Remote_DivXPlayback, posso estar errado mas não quis olhar em essas rotinas porque o "press and hold" é feito sempre, e não somente em modo DVD ou ISO.
Agora vou dar uma olhada nas rotinas Remote_03 a Remote_08. (Remote_01 e Remote_02 nunca conseguí achar no meu firmware...)
Seria seguir o fluxo de execução desde a decodificação da tecla Stop até a execução da rotina de tratamento. Fiz um ensaio e encontrei um local bem suspeito de ser o que você está procurando. Pelo fluxo que segui, chega um ponto onde ele decide se vai repassar o código 5 (P&H + 1) ou o código 15 (Stop + 1) para o tratamento. A decisão é tomada baseando-se num valor lido 3 vezes num único endereço (acredito que este valor seja o tempo de pressionamento da tecla).
O que fiz:
1. Fui numa tabela de tratamento de códigos do RC (aquela usada no Auto Load).
2. Peguei o código #14 (Stop) e segui o fluxo.
Depois eu posto o código aqui, caso haja interesse.
Legal, obrigado ronison.
-
O que você tem que fazer e mudar o '20' por '00', e o '7E' por 'FF', desse jeito ele vai buscar por carateres menores que 00 ou maiores que FF, o que claro, não existem.
Procedimento: Busque no bloco ArmCode completo a seqüencia "7E 22 20 21". [...] Isso é tudo.
Jmaraujo! :)
Eu tinha lido isso que você tinha falado, mas por algum descuido acabei esquecendo. Só depois que você me perguntou se eu tinha tentado isso é que eu tentei.
Mudou alguma coisa, mas não deu muito certo.
Vou te contar tim tim por tim tim o que eu fiz.
1. Abri o firmware (JE+RL v0.32a) no MtkReMaker, cliquei no "+" do RISC, botão direito em "Arm Codes", "Save". Perguntou se eu queria descompactar e eu disse SIM;
2. Abri o arquivo BIN no editor hexadecimal (Xvi32), procurei por "7E 22 20 21" e encontrei. Procurei novamente para ver se tinha mais uma vez e NÃO TINHA;
3. Alterei 7E para FF e 20 para 00. Ficou "FF 22 00 21". Salvei;
4. Voltei ao MtkRemaker, botão direito em "ArmCodes", "Replace" e peguei o arquivo BIN modificado;
5. Salvei o firmware e instalei no player.
Não sei se eu fiz algo de errado, mas pelo que eu entendi era isso.
Fui testar no player. Coloquei um DVD.
O que era pra ser "Ação" ficou assim:
(http://lh3.google.com/librenz/R7LQ0KwcLCI/AAAAAAAABbY/FrHKggiCuV0/s400/5980_teste_acentos_acao.jpg)
"Invisível" ficou assim:
(http://lh4.google.com/librenz/R7LQ4awcLDI/AAAAAAAABbg/-NoT0fnH16w/s400/5980_teste_acentos_invisivel.jpg)
"Premonições" ficou assim.
(http://lh6.google.com/librenz/R7LQ66wcLEI/AAAAAAAABbo/V8ChI64_x0k/s400/5980_teste_acentos_premonicoes.jpg)
Testei também via USB. Criei uma pasta chamada "ÇÔÁÃóã" (lindo nome, não?) no meu pendrive e ela apareceu assim:
(http://lh3.google.com/librenz/R7LQ7KwcLFI/AAAAAAAABbw/sFpNszULpfE/s400/5980_teste_acentos_usb.jpg)
Vale lembrar que o firmware está usando a fonte número 10 para exibir os nomes de arquivos e pastas no browser. Talvez seja esse o problema.
P.S.: Não estou conseguindo entrar no forodvp5100.com.ar! O Firefox está me dizendo que "A conexão atingiu o tempo limite".
-
Mestre Jmaraujo!
Deu certo sim!
Era a fonte o problema. Aquela fonte não tinha acentos. Coloquei uma que eu fiz e deu certo!!!
Lendo um DVD:
(http://lh3.google.com/librenz/R7LrVKwcLGI/AAAAAAAABb4/SNvSzlBNUgE/s200/5980_teste_acentos_2_acao.jpg)
Mas lendo um USB não deu muito certo, apesar de estar melhor que antes.
Os nomes das pastas eram para ser: "ÇÔÁÃóã", "Ação" e "Visível" (tudo sem aspas, claro), e ficou assim:
(http://lh3.google.com/librenz/R7LrVKwcLHI/AAAAAAAABcA/Zwkn3pvokjw/s200/5980_teste_acentos_2_usb.jpg)
Agora vou tentar colocar contorno nessa fonte (não tem jeito do contorno aparecer, mas se eu não conseguir vou explicar bem o meu problema e pedir ajuda depois) e publicar uma nova versão do firmware.
-
Que bom que tenha funcionado, Rafa!
1) Com o problema do filtro "não funcionar" em USB, não posso ajudar pois o meu RISC não tem suporte a USB e por mais que eu tente achar as referencias a função do filtro, não vou achar nada porque "não ha nada para achar", he-he!...
2) Na fotografía estou vendo que o problema está no nome das pastas... Em algums firmwares existe um filtro no 8032 também.
Por exemplo, Ronison confirmou que no DVP5965 esse filtro não existe. Também não existe no DVP5100. Mas em players de outras marcas é comúm ver o filtro, e como a v43 do firmware do 5980 é um pouco diferente, quem sabe ela tenha o tal filtro...
-
Em algums firmwares existe um filtro no 8032 também. [...] e como a v43 do firmware do 5980 é um pouco diferente, quem sabe ela tenha o tal filtro...
Jmaraujo,
Com certeza o problema não é o tal filtro no 8032.
Peguei o firmware em que os acentos apareceram no browser lendo disco e substituí o RISC pelo RISC do firmware do DVP5160.
Este firmware é aquele que faz o player perder a saída HDMI, mas dá a capacidade de ler mais caracteres (em torno de 23) via USB.
E para minha surpresa, os caracteres acentuados apareceram perfeitamente via USB, inclusive a pasta "ÇÔÁÃóã".
Conclusão: O problema dos nomes USB deve estar no ARM mesmo.
Muito obrigado pela ajuda, Jmaraujo!
-
Ronison,
Caso sobre um tempo, dê uma olhadinha em
Nomes Longos a Partir da USB (Philips DVP5965K/55) -> http://ryan.com.br/smf/index.php?topic=319.0
Ao que parece, falta pouco!
Saudações,
doctorxyz
-
Entendendo como os textos são armazenados no bloco Languages.
Ontem eu apanhei pela segunda vez com isso, por isso vou deixar a parte confusa documentada aqui. O básico sobre como localizar os textos está explicado no documento !Primeros_pasos_MT1389_v0_3b.rtf de Cachirulo. (evite tradução porca para o inglês de Mabreaker: Info - MT1389 v0.3b English.rtf, porque traduzir "IDA Pro" como "GOING Pro" é dose...), mas o que vou explicar aqui não está lá. Você só entende isso depois de fuçar com o MTK Lang Creator, o MTK Lang Editor e o próprio MTK Remaker.
Vou usar o MTK Remaker para mostrar como funciona:
(http://ryan.com.br/imagens/mediatek/mediatek_OSD_language_50.jpg)
Note que "\2dX" tem apenas quatro caracteres, mas na imagem eu digo que são cinco. Repare que existe um espaço antes da barra, que é o quinto caractere.
A lógica 8032 deve entender essa string mais ou menos assim:
- Reserve um buffer de 6 caracteres;
- Selecione a fonte 09 e pegue o seguinte (um) caractere;
- Selecione a fonte 00 e pegue os seguintes (cinco) caracteres.
-
Como saber que células da palete corrente um determinado ícone usa.
Depois que você sabe como a coisa funciona, percebe que é isso que o MTK Remaker mostra, na aba MEMO:
(http://ryan.com.br/imagens/mediatek/mediatek_mtkremaker_icone_memo_50.jpg)
As letras que você vê compondo a imagem do ícone não são escolhidas ao acaso. Cada uma delas é o númro em hexadecimal da cor na palete, de 0 a F. Assim como você pode ver, o fundo do ícone está na cor 0x0 (que é geralmente tratada como transparente na exibição) e a maior parte do corpo do cadeado está na cor 0xE. Que cor realmente será essa depende da palete em vigor onde o ícone é exibido.
Toda a explicação necessária para entender como o "bitmap" do ícone é armazenado está no documento !Primeros_pasos_MT1389_v0_3b.rtf de Cachirulo. Com base nessas informações eu já consegui fazer rotinas em Delphi que desenham ícones Mediatek e pretendo usar isso em uma futura versão do MTK Patcher.
-
Como mover os tags mp3 e jpg preview para parte de baixo da tela:
Bem, a primeira parte (mover os tags mp3) Jefferson já explicou muito claramente como é que se faz.
Para mover o jpeg preview tem de se trocar as coordenadas absolutas (a diferença dos tags, que usam coordenadas relativas) da imagem...
Buscar a seqüencia "7D ? 7F 9A 7E 02 12 ? ? 7D ? 7F 9B 7E 02 12 ? ? 7D ? 7F 9C 7E 02 12 ? ? 7D ? 7F 9D 7E 02 12 ? ? 7D ? 7F 9E 7E 02 12 ? ? ", para achar uma parte onde ArmPutChar (WriteSInfo) é chamado cinco vezes com os valores 0x029A, 0x029B, 0x029C, 0x029D e 0x029E.
Deslize a rotina para cima até o começo e de nome a função: fgFlMnInit.
Voltem novamente até a parte da seqüencia achada. Se quiser podem colocar um nome local nesta parte da rotina. Aquí é definido o tamanho e posição da miniatura jpeg:
ROM:4FF8 fgFlMnInit:
(...)
ROM:50D4 Jpg_preview
ROM:50D4 7D 01 mov R5, #1 ; Mostrar jpg preview (1=Sim 0=não)
ROM:50D6 7F 9A mov R7, #0x9A ; 'Ü'
ROM:50D8 7E 02 mov R6, #2
ROM:50DA 12 05 F5 lcall WriteSInfo ; Arm_PutChar
ROM:50DA
ROM:50DD 7D 78 mov R5, #0x78 ; 'x' ; Preview JPG posX / 5 (coord. absoluta)
ROM:50DF 7F 9B mov R7, #0x9B ; 'ø'
ROM:50E1 7E 02 mov R6, #2
ROM:50E3 12 05 F5 lcall WriteSInfo ; Arm_PutChar
ROM:50E3
ROM:50E6 7D 4F mov R5, #0x4F ; 'O' ; Preview JPG posY / 4 (coord. absoluta)
ROM:50E8 7F 9C mov R7, #0x9C ; '£'
ROM:50EA 7E 02 mov R6, #2
ROM:50EC 12 05 F5 lcall WriteSInfo ; Arm_PutChar
ROM:50EC
ROM:50EF 7D 23 mov R5, #0x23 ; '#' ; Preview JPG Largura / 5
ROM:50F1 7F 9D mov R7, #0x9D ; 'Ø'
ROM:50F3 7E 02 mov R6, #2
ROM:50F5 12 05 F5 lcall WriteSInfo ; Arm_PutChar
ROM:50F5
ROM:50F8 7D 14 mov R5, #0x14 ; Preview JPG Altura / 4
ROM:50FA 7F 9E mov R7, #0x9E ; '×'
ROM:50FC 7E 02 mov R6, #2
ROM:50FE 12 05 F5 lcall WriteSInfo ; Arm_PutChar
Troque os valores em vermelho para mudar posição e tamanho do jpeg preview.
Notem que os valores a insertar tem que ser divididos entre 4 ou 5. Ou seja, se quiser uma largura de 200px, tem que fazer 200 / 5 = 40, é depois convertir o resultado de hexadecimal em decimal 40 => 28.
-
Como funciona o esquema de bancos nos novos firmwares
Isso é só um rascunho.
Recapitulando:
- A arquitetura 8051 só suporta 64K de memória;
- O truque que permite ao MT1389 usar um código 8032 maior que 64K, divide o código em segmentos de 64KB chamados de bancos e requer o uso de Bank Switch Tables (BSTs) idênticas em cada banco para que seja possível que um banco possa chamar rotinas que estão gravadas em outro.
O código 8032 é agora organizado das duas maneiras a seguir:
(http://ryan.com.br/imagens/mediatek/mt1389L_8032_75.jpg)
Eu não tenho certeza ainda, mas aparentemente no novo formato a BST tem um tamanho fixo de 12K e o espaço para o código de cada banco é fixo em 52K.
O esquema antigo produz um desperdício natural com a repetição da BST em cada banco. O novo esquema tem o objetivo de reclamar esse espaço desperdiçado, mas tenha em mente que nem um byte é ganho no espaço do código 8032 para patches. Um banco que só teria 100 bytes livres no esquema antigo continua com 100 bytes livres no esquema novo. Todo o espaço economizado com o novo esquema pode ser aproveitado basicamente com mais fontes e imagens.
E ainda é mais complicado do que parece:
A arquitetura 8051 requer que, pelo menos na memória RAM, o truque de bank switching seja implementado da forma tradicional: BST + banco 0 + BST + banco 1 + BST + banco 2, então apesar do chip MT1389L estar programado para carregar apenas uma BST, ele precisa gravar o código 8032 na memória da mesma forma que o chip tradicional MT1389. Todo o endereçamento das rotinas considera (e precisa ser dessa forma) que as BSTs estão lá, no início de cada banco. Por conta disso você não pode mais simplesmente carregar a parte 8032 do código no IDA ou num editor hexadecimal e fazer patches, porque não sendo no banco zero, vai dar tudo errado.
Para ter um bloco 8032 normal a partir de um bloco 8032 "L" de três bancos basta fazer o seguinte:
copy /b BST+bloco0+BST+bloco1+BST+bloco2 8032_normal.bin
Se você analisar com um comparador binário, é exatamente isso que New Age faz com o novo MtkExtract:
- 8032__normal.bin -> É o bloco 8032 do jeito que vai para a memória.
- 8032__flash.bin -> É o bloco 8032 do jeito que está no firmware.
Note que New Age chama de "common code" o que eu chamo de BST.
Então, para analisar no IDA PRO, você precisa usar 8032__normal.bin
Porém um problema permanece. Após a análise no IDA, você precisa fazer as edições tembém em 8032__normal.bin (não é mais possível editar diretamente o firmware, porque os endereços vistos no IDA só vão corresponder para o banco zero). Depois 8032__normal.bin precisa ser "recortado" e "remontado" como um novo 8032__flash.bin, para só então substituir no firmware.
Esse é mais um motivo para que as ferramentas existentes não tenham condição de lidar com os firmwares novos. Muita coisa precisa ser adaptada para lidar com as duas situações.
-
Como ter uma selection bar "colorida" nos firmwares Philips
Estas são as instruções (http://www.forodvp5100.com.ar/viewtopic.php?p=6119#p6119) que passei para o pauloturij em maio deste ano.
(http://img233.imageshack.us/img233/1162/selectionbarpq4.jpg)
Pessoalmente não gosto da barra de seleção desse jeito (também não gosto do scrollbar), por tanto não incluí -nem penso incluir- as mudanças no meu firmware. Mas acredito que muita gente prefira assim... por tanto aquí estão as mudanças:
ROM:50AA 02 -> 03
ROM:5AFC 7B -> E4
ROM:5AFD 03 -> FB
ROM:5F35 7B -> E4
ROM:5F36 03 -> FB
ROM:6178 7B -> E4
ROM:6179 03 -> FB
ROM:6EF7 7B -> E4
ROM:6EF8 03 -> FB
ROM:6FA1 7B -> E4
ROM:6FA2 03 -> FB
ROM:885C 7B -> E4
ROM:885D 03 -> E4
ROM:885E E4 -> FB
ROM:9E2A 02 -> 03
(Todos os endereços correspondem ao Banco 1 do firmware do DVP5100 v0E.0A)
-
Estamos manejando duas hipóteses:
- A sugerida por ele usa o mesmo método do patch Unicode.
Criase uma fonte extendida com carateres normais nas posições normais, e carateres em itálico nas posições extendidas. Quando o Arm detecta a apertura do tag, soma-se um valor X ao valor de cada caratere, coincidindo com o mesmo caracter em itálico. Quando o Arm detecta o fechamento do tag, usa-se os carateres normais.
Se entendí bem, o sugerido por ele é o mesmo que o sugerido por você.
- O que eu sugerí foi: Criar quatro fontes normais e as quatro correspondentes em itálico. E no menu por somente escolha de quatro fontes (as fontes "normais": 1, 3, 5 e 7).
Exemplo:
Fonte 1: Fonte 1 normal
Fonte 2: Fonte 1 itálico
Fonte 3: Fonte 2 normal
Fonte 4: Fonte 2 itálico
Fonte 5: Fonte 3 normal
Fonte 6: Fonte 3 itálico
Fonte 7: Fonte 4 normal
Fonte 8: Fonte 4 itálico
Quando o Arm detecta a apertura do tag, soma 1 ao valor da fonte em uso. Quando detecta o fechamento do tag, resta (sustraí?) 1 ao valor da fonte...
Por enqüanto é tudo em teoría...
Oi, jmaraujo. Alguma novidade na tentativa de implementação do suporte a <i> tag em legendas .srt?
-
Todo mundo que participou nesse tópico (http://www.forodvp5100.com.ar/viewtopic.php?f=14&t=653) sugeriu alguma coisa (sempre em hipótese), mas o Jor-El, que é programador, sumiu e o tópico ficou esquecido...
Na teoría foi um tópico muito interessante, mas na prática não sei se é possivel...
-
Como descobrir a Região do DVD dos Firmwares LGs, analisando os nomes dos arquivos de upgrade por CD
Descobri que a Região do DVD desses Firmwares fica a nossa disposição, nos nomes dos arquivos de upgrade por CD.
Na verdade, as regiões são representadas por letras e não por números (as letras de A a F correspondem as regiões de 1 a 6, enquanto que Region Free (0) é representada por 0 mesmo).
O local dessa letra pode variar um pouco, mas normalmente antecede imediatamente 3 letras como MIE, MIH, MIS, etc.
Vejam exemplos:
Região 4 ou D
DK8321N (extraído pelo Ryan): LV8B3220D.MIH
DK194g (extraído pelo Ryan): LVLV10B02207D.MIE
DV256K: LG_DV_LV070B222030DMIE.ROM
DV397H (Brasileiro, baseado na tela de versão relatada por 2 usuários): LG_DV_LV81F33B40DMSMIS.ROM
Região 2 ou B
LG9843 (Europeu): LV9E12203B.MIH
Região 0
DV397H (Firmware que enviei): LG_DV_LV81F33B400MSMIS.ROM
Destaquei em verde MS, pois foge um pouco dos nomes anteriores. Acho que tem haver com o Chipset MT1389S, já que o Firmware do DV383, que também é recente e tem Firmware MT1389L apresenta ML no lugar.
-
Philips DVP5980K/55 - O conteúdo da EEPROM
Eu arrumei disposição hoje para dessoldar o chip de um dos meus DVP5980 e ler no meu Willem.
Antes de dessoldar o chip eu dei um comando de RESET no setup do DVP5980 para carregar os valores default.
Depois de obtido o arquivo (anexo) eu dei uma olhada aleatória em alguns endereços e os valores armazenados correspondem ao default, por isso acredito que a leitura tenha sido um sucesso.
(http://ryan.com.br/imagens/dvp5980/PhilipsDVP5980K55_EEPROM%2824C08%29_default_75.jpg)
Notem o seguinte:
*Nenhum endereço a partir de 0x1F0 é usado.
*Todos os endereços com conteúdo FF são potencialmente endereços livres. E existe um monte deles mesmo na faixa de 0-255.
Próximo passo: descobrir qual byte é responsável pela identificação do sub-modelo.
-
Philips DVP5980 - Como é definido o sub-modelo
As posições de EEPROM que definem o sub-modelo são 0x04 e 0x05. A correspondência é esta:
00 FF = DVP5982_37
01 FE = DVP5980K_55 (default)
02 FD = DVP5980K_75
03 FC = DVP5986K_98
04 FB = DVP5986K_51
05 FA = DVP5986K_96
06 F9 = DVP5980K_78
Adicionalmente, qualquer outro par de valores faz o aparelho se identificar como DVP5980K_78. Isso faz algum sentido pois já que o DVP5980K_78 é o último da lista a rotina de identificação deve ser do tipo "se nenhuma opção confere, é o útimo".
É bom também tomar cuidado com as posições 0x01, 0x02 e 0x03. Mudar qualquer um dos valores nessas posições faz com que o aparelho execute uma espécie de RESET onde dezenas de bytes são alterados e as posições 0x04 e 0x05 recebem os valores correspondentes ao DVP5980K_78.
Em resumo, para configurar o sub-modelo é preciso alterar corretamente as posições de 0x01 a 0x05 da EEPROM.
Testes com firmware V43
Existem duas rotinas que lêem essas posições de EEPROM: B3:7CC7 e B5:A68E
Existe uma rotina que grava o sub-modelo em B4:A59C
É bom lembrar que o firmware tem uma função oculta que permite escolher o modelo. Isso é sugerido pela string "!PLS INPUT MODEL CODE:" (B3:39CC). Então não dá para saber se a rotina que grava o sub-modelo é chamada por esta rotina ou pela de RESET.
-
Philips DVP5980 - Experiências com o conteúdo da EEPROM
Eu coloquei um soquete no DVP5980 para permitir ficar mudando valores na EEPROM usando meu gravador Willem.
Se a EEPROM não estiver respondendo o aparelho trava exibindo "PHILIPS" no display.
Se você mudar todos os valores da EEPROM para zero, ao ligar pela primeira vez o conteúdo da EEPROM é refeito. Tudo fica de tal forma que o aparelho se identifica como um DVP5980K_55. A porta HDMI continua funcionando normalmente após isso, com um detalhe: se na primeira vez que o aparelho for ligado houver um disco dentro, a imagem pela HDMI fica bagunçada, mas basta apertar o botão HD UPSCALE para consertar imediatamente. Se não houver disco a imagem já aparece certa. Não entendi a razão.
Aparentemente o endereço 0xB7 guarda algum tipo de status do aparelho. O valor armazenado alterna entre 0x3E e 0x6E aparentemente dependendo de se a bandeja estava aberta ou fechada quando o aparelho perdeu a energia.
-
É bom também tomar cuidado com as posições 0x01, 0x02 e 0x03. Mudar qualquer um dos valores nessas posições faz com que o aparelho execute uma espécie de RESET onde dezenas de bytes são alterados e as posições 0x04 e 0x05 recebem os valores correspondentes ao DVP5980K_78.
A explicação para isso está em um documento de Cachirulo chamado "Eeprom-Info-1Nov2004". Os quatro primeiro bytes da EEPROM são um HEADER que o player verifica para validar seu conteúdo através da função "EPR_CheckHeader()". Segundo Cachirulo esses quatro primeiros bytes tem a string "MT37", mas isso deve ser coisa de versões antigas. Notem que os bytes 0x03 e 0x04 do DVP5980 formam a string "39".
Eu ainda estou tentando descobrir como se lê o conteúdo da EEPROM diretamente na shared memory. Até agora eu não consegui acertar a localização, pois os valores de offset como 0x1999 simplesmente não conferem.
http://ryan.com.br/smf/index.php?topic=179.msg9171930#msg9171930 (http://ryan.com.br/smf/index.php?topic=179.msg9171930#msg9171930)
-
Mais fontes de informação (não estão na lista do primeiro post):
Site de VB6ROCOD (não deixe de ver o fórum)
http://vb6rocod.euracks.com/ (http://vb6rocod.euracks.com/)
Site de HEJ456 (não deixe de ver o fórum)
http://hej456.com/ (http://hej456.com/)