Autor Tópico: Firmware do LG DV397H  (Lida 302020 vezes)

0 Membros e 5 Visitantes estão vendo este tópico.

Offline allanzin

  • Novato
  • *
  • Mensagens: 33
  • Aprovação: +4/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #240 Online: Abril 10, 2009, 08:47:22 pm »
Fiz um vídeo para ver como ficou... Estou mandando para o seu e-mail ( aquele o qual me manda os firmwares ).

E eles ficam todos alinhadinhos sim ! Vendo vai ser melhor !  ;D

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #241 Online: Abril 10, 2009, 09:06:41 pm »
Posta o vídeo aqui, para todos verem!  ;)

Acho que é muito grande.  :(

Isso vai dar um trabalho...  :laugh:
Tem como você fazer videos do alfa 2 e do alfa 3?
« Última modificação: Abril 10, 2009, 09:15:12 pm por rictad »

FORUM.RYAN.COM.BR

Re: Firmware do LG DV397H
« Responder #241 Online: Abril 10, 2009, 09:06:41 pm »

Offline allanzin

  • Novato
  • *
  • Mensagens: 33
  • Aprovação: +4/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #242 Online: Abril 10, 2009, 09:23:24 pm »
Posta o vídeo aqui, para todos verem!  ;)

Acho que é muito grande.  :(

Isso vai dar um trabalho...  :laugh:
Tem como você fazer videos do alfa 2 e do alfa 3?

Sim dá ! Aguarde um pouquinho que vou lhe mandar os 2 de uma vez. (gmail suporta 20MB de anexo)

;)

Offline allanzin

  • Novato
  • *
  • Mensagens: 33
  • Aprovação: +4/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #243 Online: Abril 11, 2009, 02:52:08 am »
Tá enviado, olha lá, mandei o 2 e o 3, já que tens o 4.

O 2 acho que é o melhor, aparentemente !

Vê aí o que acha !

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #244 Online: Abril 11, 2009, 05:59:29 am »
Firmware Rictad Versão 2.4 para DV397H com chip MT1389S

ATENÇÃO, usuários do modelo DV397H com chip MT1389M não devem atualizar com essa versão!

* Modificação/correção no alinhamento vertical das legendas DivX: agora as opções são verdadeiramente "superior" e "inferior", sendo que esta última dá um aspecto mais profissional às legendas.
* Fonte para legendas original LG trocada por Helvetica Bold 22.
* Fonte para legendas Courier New Bold 21 trocada por Comic Sans MS 19.
* Todas as fontes agora possuem contorno 2, melhorando a visibilidade.
* Corrigido "bug" no ARM que fazia com que nem todos os caracteres da fonte 13 (a antiga fonte dobrada, atualmente Comic Sans) pudessem ser exibidos corretamente.


« Última modificação: Abril 11, 2009, 06:15:44 am por rictad »

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #245 Online: Abril 11, 2009, 06:07:13 am »
Tá enviado, olha lá, mandei o 2 e o 3, já que tens o 4.

O 2 acho que é o melhor, aparentemente !

Vê aí o que acha !

Certo allanzin. Aqui está o alfa 5. O bug no menu Others foi erro meu. Tem que ter sumido agora. Também tentei liberar a navegação acima. Vamos ver como vai ficar. O submenu "2" foi renomeado para Progressive Scan. A idéia é deixá-lo visível, mas travado. Essa modificação é mais fácil para ser feita, acredite. Se ele saltar esse menu, acho que vai ficar quase no ponto. Senão, terei que ajustar mais coisa. Testa aí.

ATENÇÃO, usuários do modelo DV397H com chip MT1389S não devem atualizar com essa versão!
« Última modificação: Abril 11, 2009, 02:04:41 pm por rictad »

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #246 Online: Abril 11, 2009, 08:20:59 pm »
* Modificação/correção no alinhamento vertical das legendas DivX: agora as opções são verdadeiramente "superior" e "inferior", sendo que esta última dá um aspecto mais profissional às legendas.
...
...
...
* Corrigido "bug" no ARM que fazia com que nem todos os caracteres da fonte 13 (a antiga fonte dobrada, atualmente Comic Sans) pudessem ser exibidos corretamente.


Interessantes essas modificações! Rictad, quando você tiver tempo, e se não for muito trabalhoso, gostaria de saber como você fez (principalmente a primeira modificação). Não sei se vou poder aproveitar para o LG DV256K, já que aquela rotina do ARM que processa as legendas é bem diferente. Por outro lado, talvez o LG DV397H com MT1389M tenha a rotina mais parecida com a do DV256K, e se você conseguir modificar também para o MT1389M, talvez a correspondência seja mais fácil. Obrigado!

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #247 Online: Abril 11, 2009, 11:12:26 pm »
Correção nos caracteres no filebrowser e nas tags ID3:

O grande problema dos caracteres é que eles parecem ser lidos no padrão Unicode, enquanto as fontes são CP Windows. Então daí a ideia daquela tabela. Resumindo de forma grosseira:

Todos esses padrões de codificação de caracteres, sejam eles ISO 8859, UTF/Unicode ou CP Windows, têm em comum, ao menos, o núcleo do antigo ASCII, que são os caracteres de #20 a #7F. Os caracteres Unicode são muito mais que 255. O padrão CP Windows pega esses caracteres Unicode extras e os distribui entre o pequeno espaço dos caracteres de controle que existe no meio do ISO 8859. Assim, criam-se vários CPs (1250, 1251, 1252...) com partes do Unicode misturadas ao ISO.

O que aquela rotina faz é verificar se o caracter lido no nome do arquivo ou nas tags ID3 é maior que 255 (ou seja, Unicode) para então modificar o seu valor com base na tabela Unicode -> CP1252, caso ele exista na CP1252. Se for um caracter Unicode que estiver na CP1253, por exemplo, nada acontecerá. Assim, a tabela vai depender da fonte utilizada no firmware. Não basta copiar a rotina no ARM. Se for o caso, deve-se também adaptar a tabela. Além disso, há uma limitação que faz com que os caracteres a partir de 250 não sejam exibidos. Isso é uma limitação de firmware, não de hardware. A solução dada no texto do mt13x9 Group é modificar a fonte de exibição, colocando os caracteres 250 a 255 no lugar dos caracteres 0 a 5, e incluir isso na tabela de conversão. 250-0, 251-1, e assim por diante.

No caso do DV397H, tive muito sorte, pois nada disso precisou ser feito! A fonte para nomes de arquivos é a de número 14. Inicialmente, essa fonte era muito limitada em termos de caracteres. Uma mistura de caracteres latinos com cirílicos, eu acho. Como não era CP1252 (e nem possuía qualquer acento) a tabela de conversão não serviria de nada. Quando a troquei pela fonte que está na posição 1, começaram a aparecer os caracteres acentuados nas ID3 tags imediatamente, mas não nos nomes de arquivos. Aí, como relatei num post anterior, modifiquei aquele filtro diferente no ARM (que limitava acima de #80, trocando por #FE = 254) e achei que tudo estava certo...

Até o allanzin relatar que o "ú" não aparecia. Verifiquei que nos nomes de arquivos, todos os caracteres a partir de 250 não eram exibidos. Mas nas tags ID3, somente o 250 não era (de 251 a 254 eram). A nova fonte 14 (igual a fonte 1), não é CP1252, mas é compatível com ISO 8859-1. No lugar dos caracteres de controle, foram repetidos alguns caracteres do próprio ISO. Além disso, possui caracteres acima de 255 (mas inúteis até agora).

Então fui verificar no ARM aquela rotina do filtro e vi que já havia uma tentativa mal sucedida de converter os caracteres Unicode e de exibir os acima de 250.

Código: [Selecionar]
ROM:0002C53E             ; processa nomes de arquivos no filebrowser
ROM:0002C53E
ROM:0002C53E             sub_2C53E                               ; CODE XREF: sub_297F0+38E_p
ROM:0002C53E                                                     ; sub_297F0+41C_p ...
ROM:0002C53E F8 B5                       PUSH    {R3-R7,LR}
ROM:0002C540 0C 1C                       ADDS    R4, R1, #0
ROM:0002C542 8D 49                       LDR     R1, =SHAREMEM_ADDR
ROM:0002C544 15 1C                       ADDS    R5, R2, #0
ROM:0002C546 5D 22                       MOVS    R2, #0x5D ; ']'
ROM:0002C548 09 68                       LDR     R1, [R1]
ROM:0002C54A 92 01                       LSLS    R2, R2, #6
(..............................)
(..............................)
(..............................)
ROM:0002C584
ROM:0002C584             loc_2C584                               ; CODE XREF: sub_2C53E+2C_j
ROM:0002C584                                                     ; sub_2C53E+38_j
ROM:0002C584 01 0A                       LSRS    R1, R0, #8
ROM:0002C586 03 D1                       BNE     loc_2C590
ROM:0002C588 80 28                       CMP     R0, #0x80 ; 'Ç' ; filtro caracteres acima de #80 (certeza)
ROM:0002C588                                                     ; trocar por #FF
ROM:0002C58A F7 D3                       BCC     loc_2C57C       ; alterar para BLS loc_2C59E (08 D9)
ROM:0002C58C 13 1C                       ADDS    R3, R2, #0
ROM:0002C58E 7C E0                       B       loc_2C68A
ROM:0002C590             ; ---------------------------------------------------------------------------
ROM:0002C590
ROM:0002C590             loc_2C590                               ; CODE XREF: sub_2C53E+48_j
ROM:0002C590 FC F7 98 FA                 BL      sub_28AC4
ROM:0002C594 00 04                       LSLS    R0, R0, #0x10
ROM:0002C596 00 0C                       LSRS    R0, R0, #0x10
ROM:0002C598 01 D1                       BNE     loc_2C59E
ROM:0002C59A 5F 20                       MOVS    R0, #0x5F ; '_'
ROM:0002C59C 01 E0                       B       loc_2C5A2
ROM:0002C59E             ; ---------------------------------------------------------------------------
ROM:0002C59E
ROM:0002C59E             loc_2C59E                               ; CODE XREF: sub_2C53E+5A_j
ROM:0002C59E FA 28                       CMP     R0, #0xFA ; '·'  Tratar caracteres a partir de 250
ROM:0002C5A0 03 D2                       BCS     loc_2C5AA
ROM:0002C5A2
ROM:0002C5A2             loc_2C5A2                               ; CODE XREF: sub_2C53E+5E_j
ROM:0002C5A2                                                     ; sub_2C53E+82_j
ROM:0002C5A2 33 78                       LDRB    R3, [R6]
(........................)
(........................)
(........................)

Em #2C59E, há um tratamento para caracteres a partir de 250 (ou seja, não é uma limitação de hardware, é erro de programação do firmware mesmo e aqui temos uma tentativa de correção feita de "fábrica"), mas essa chamada só era realizada em certas condições (outras fontes, outros CPs, não sei ao certo). Então eu desviei para esse tratamento a partir do filtro, em #2C588, caso o caracter seja igual ou menor que 255. Pronto! Funcionou. Como a nova fonte 14, até a posição 255, é compatível com o ISO 8859-1 (e não CP1252), alguns poucos caracteres esquisitos ficaram de fora, mas nada que atrapalhe a acentuação em português ou espanhol. Ainda tentei deixar passar todos os caracteres para ver se eram mostrados, mas nada é exibido, apesar da fonte ter mais que 255 caracteres. Isso poderia ser feito, se entendêssemos mais a parte do ARM que manipula as fontes, o que seria útil para implementar o itálico (como o ARM tem 32 bits, o conteúdo de seus registradores não são bytes, mas palavras de 4 bytes; um caracter Unicode tem seu código carregado normalmente em R0 no trecho #2C588; é possível fazer, por exemplo, CMP  R0, #0x3000).

Com as tags ID3, foi ainda mais fácil. Já estava funcionando quase 100%. Só o "ú" não era mostrado. Além disso, os caracteres Uncode presentes no CP1252 eram convertidos, conforme as convenções usuais, segundo a Wikipedia. Por exemplo, o raro caracter francês "Œ" é usualmente convertido para "OE" quando se trabalha com 8859-1. Mas e o "ú"? O "ú" não era exibido por causa de um bug na rotina responsável pela exibição das ID3 tags (e também dos nomes no filebrowser, já que ela chama a rotina anterior).

Código: [Selecionar]
ROM:0003D7C6             ; exibe nome de arquivos filebrowser e ID3 tags
ROM:0003D7C6
ROM:0003D7C6             sub_3D7C6                               ; CODE XREF: sub_29CE2+302_p
ROM:0003D7C6
ROM:0003D7C6             var_38          = -0x38
ROM:0003D7C6             var_34          = -0x34
ROM:0003D7C6             var_30          = -0x30
ROM:0003D7C6             var_2C          = -0x2C
ROM:0003D7C6             var_28          = -0x28
ROM:0003D7C6             var_24          = -0x24
ROM:0003D7C6             var_20          = -0x20
ROM:0003D7C6             var_1C          = -0x1C
ROM:0003D7C6             var_18          = -0x18
ROM:0003D7C6
ROM:0003D7C6 F0 B5                       PUSH    {R4-R7,LR}
ROM:0003D7C8 81 78                       LDRB    R1, [R0,#2]
ROM:0003D7CA 89 B0                       SUB     SP, SP, #0x24
ROM:0003D7CC 00 AB                       ADD     R3, SP, #0x38+var_38
ROM:0003D7CE 46 78                       LDRB    R6, [R0,#1]
ROM:0003D7D0 19 76                       STRB    R1, [R3,#0x38+var_20]
ROM:0003D7D2 C1 78                       LDRB    R1, [R0,#3]
ROM:0003D7D4 59 76                       STRB    R1, [R3,#0x38+var_20+1]
ROM:0003D7D6 01 79                       LDRB    R1, [R0,#4]
ROM:0003D7D8 99 76                       STRB    R1, [R3,#0x38+var_20+2]
ROM:0003D7DA 41 79                       LDRB    R1, [R0,#5]
ROM:0003D7DC D9 76                       STRB    R1, [R3,#0x38+var_20+3]
(..................)
(..................)
(..................)
ROM:0003D86E
ROM:0003D86E             loc_3D86E                               ; CODE XREF: sub_3D7C6+96_j
ROM:0003D86E                                                     ; sub_3D7C6+A0_j
ROM:0003D86E 20 78                       LDRB    R0, [R4]
ROM:0003D870 FA 28                       CMP     R0, #0xFA ; '·' ; pequeno bug na exibicao de caracteres
ROM:0003D870                                                     ; nas id3 tags, que impede mostrar "ú"
ROM:0003D870                                                     ; deve ser #F9 e nao #FA!
ROM:0003D872 06 D9                       BLS     loc_3D882
ROM:0003D874 1C 49                       LDR     R1, =unk_9AE61
ROM:0003D876 FA 38                       SUBS    R0, #0xFA ; '·'
ROM:0003D878 0B 78                       LDRB    R3, [R1]
ROM:0003D87A 00 04                       LSLS    R0, R0, #0x10
ROM:0003D87C 00 0C                       LSRS    R0, R0, #0x10
(...................)
(...................)
(...................)

Oras, em #3D870, só se fazia o tratamento dos caracteres se não fossem menores ou iguais a #FA (250) = "ú". Assim, o "ú" não entrava. Ou tinha que ser menor que #FA ou menor e igual a #F9!

Essas rotinas são idênticas nos dois modelos de DV397H. Assim, a exibição dos caracteres no filebrowser e nas tags ID3 foi melhorada nos dois.

Correções no alinhamento

Eu ainda não verifiquei as rotinas do DV397H com chip MT1389M, e acho que são diferentes. Mas talvez, nessa parte, sejam semelhantes em alguma coisa.

Bom, o DV397H MT1389S já é capaz de exibir, originalmente, até 4 linhas de legenda. Mas isso é feito por uma rotina que é capaz de exibir 1 ou 2 linhas de legendas e mais 2 remendos que adicionam a terceira e a quarta linha. Sim, "remendos", porque tudo indica que, inicialmente, só eram exibidas até 2 linhas e, aí, remendaram de "fábrica", e 2 vezes! O resultado foi que, em cada uma dessas partes, o alinhamento era calculado com um argumento diferente. E ainda, na parte principal, no núcleo, digamos assim, a posição da primeira linha variava conforme tivéssemos 1 ou 2 linhas. Ou seja, era um carnaval de linhas dançantes para cima e para baixo, fazendo alinhamentos meio esquisitos. Podíamos classificar o alinhamento apenas como mais ou menos inferior e mais ou menos superior. Nem mesmo middle-top e middle-bottom serviam para classificá-lo corretamente, pois com 4 linhas as coisas mudavam.

Código: [Selecionar]
ROM:00040348             ; =============== S U B R O U T I N E =======================================
ROM:00040348
ROM:00040348             ;exibe legendas
ROM:00040348
ROM:00040348             sub_40348                               ; CODE XREF: sub_408FC:loc_4092E_p
ROM:00040348
ROM:00040348             var_68          = -0x68
ROM:00040348             var_64          = -0x64
ROM:00040348             var_60          = -0x60
ROM:00040348             var_5C          = -0x5C
ROM:00040348             var_58          = -0x58
ROM:00040348             var_54          = -0x54
ROM:00040348             var_4C          = -0x4C
ROM:00040348             var_48          = -0x48
ROM:00040348             var_44          = -0x44
ROM:00040348             var_42          = -0x42
ROM:00040348             var_40          = -0x40
ROM:00040348             var_3C          = -0x3C
ROM:00040348             var_38          = -0x38
ROM:00040348             var_34          = -0x34
ROM:00040348             var_30          = -0x30
ROM:00040348             var_2C          = -0x2C
ROM:00040348             var_28          = -0x28
ROM:00040348             var_24          = -0x24
ROM:00040348             var_20          = -0x20
ROM:00040348             var_1C          = -0x1C
ROM:00040348             var_18          = -0x18
ROM:00040348
ROM:00040348 35 48                       LDR     R0, =unk_9AE62
ROM:0004034A F0 B5                       PUSH    {R4-R7,LR}
ROM:0004034C 03 78                       LDRB    R3, [R0]
ROM:0004034E 95 B0                       SUB     SP, SP, #0x54
ROM:00040350 34 49                       LDR     R1, =SHAREMEM_ADDR
ROM:00040352 02 93                       STR     R3, [SP,#0x68+var_60]
ROM:00040354 08 68                       LDR     R0, [R1]
ROM:00040356 BB 22 52 01                 MOVLS   R2, 0x1760
ROM:0004035A 82 18                       ADDS    R2, R0, R2
ROM:0004035C 12 78                       LDRB    R2, [R2]
ROM:0004035E 00 2A                       CMP     R2, #0
ROM:00040360 01 D1                       BNE     loc_40366
ROM:00040362 04 22                       MOVS    R2, #4
ROM:00040364 00 E0                       B       loc_40368
(......................)
(......................)
(......................)
ROM:000404F0
ROM:000404F0             loc_404F0                               ; CODE XREF: sub_40348+12C_j
ROM:000404F0                                                     ; sub_40348+136_j
ROM:000404F0 00 2E                       CMP     R6, #0          ; alterando para 01 2E, última linha fica deslocada
ROM:000404F0                                                     ; (igual outros LGs?)
ROM:000404F2 3E D0                       BEQ     loc_40572
(.............................)
(.............................)
(.............................)
ROM:0004067A
ROM:0004067A             loc_4067A                               ; CODE XREF: sub_40348+304_j
ROM:0004067A 73 4D                       LDR     R5, =unk_9EB88
ROM:0004067C 00 AB                       ADD     R3, SP, #0x68+var_68
ROM:0004067E 28 88                       LDRH    R0, [R5]
ROM:00040680 03 99                       LDR     R1, [SP,#0x68+var_5C]
ROM:00040682 75 4E                       LDR     R6, =unk_9E614
ROM:00040684 40 18                       ADDS    R0, R0, R1
ROM:00040686 98 84                       STRH    R0, [R3,#0x68+var_44]
ROM:00040688 F0 78                       LDRB    R0, [R6,#3]
ROM:0004068A 01 28                       CMP     R0, #1          ; 2 linhas?
ROM:0004068C 0E D8                       BHI     loc_406AC       ; se maior
ROM:0004068E 73 48                       LDR     R0, =SHAREMEM_ADDR
ROM:00040690 BB 21                       MOVS    R1, #0xBB ; '+'
ROM:00040692 00 68                       LDR     R0, [R0]
ROM:00040694 49 01                       LSLS    R1, R1, #5
ROM:00040696 40 18                       ADDS    R0, R0, R1
ROM:00040698 00 78                       LDRB    R0, [R0]
ROM:0004069A 01 28                       CMP     R0, #1
ROM:0004069C 02 D1                       BNE     loc_406A4
ROM:0004069E D8 8C                       LDRH    R0, [R3,#0x68+var_42]
ROM:000406A0 38 30                       ADDS    R0, #0x38 ; '8' ; deslocamento legenda 1 e 2 linhas
ROM:000406A2 14 E0                       B       loc_406CE
ROM:000406A4             ; ---------------------------------------------------------------------------
ROM:000406A4
ROM:000406A4             loc_406A4                               ; CODE XREF: sub_40348+354_j
ROM:000406A4 00 AB                       ADD     R3, SP, #0x68+var_68
ROM:000406A6 D8 8C                       LDRH    R0, [R3,#0x68+var_42]
ROM:000406A8 30 30                       ADDS    R0, #0x30 ; '0'
ROM:000406AA 10 E0                       B       loc_406CE
ROM:000406AC             ; ---------------------------------------------------------------------------
ROM:000406AC
ROM:000406AC             loc_406AC                               ; CODE XREF: sub_40348+344_j
ROM:000406AC 02 28                       CMP     R0, #2          ; 3 linhas?
ROM:000406AE 10 D1                       BNE     loc_406D2       ; se não
ROM:000406B0 6A 48                       LDR     R0, =SHAREMEM_ADDR
ROM:000406B2 BB 21                       MOVS    R1, #0xBB ; '+'
ROM:000406B4 00 68                       LDR     R0, [R0]
ROM:000406B6 49 01                       LSLS    R1, R1, #5
ROM:000406B8 40 18                       ADDS    R0, R0, R1
ROM:000406BA 00 78                       LDRB    R0, [R0]
ROM:000406BC 01 28                       CMP     R0, #1
ROM:000406BE 03 D1                       BNE     loc_406C8
ROM:000406C0 00 AB                       ADD     R3, SP, #0x68+var_68
ROM:000406C2 D8 8C                       LDRH    R0, [R3,#0x68+var_42]
ROM:000406C4 1C 30                       ADDS    R0, #0x1C       ; deslocamento legenda 3 linhas
ROM:000406C6 02 E0                       B       loc_406CE
ROM:000406C8             ; ---------------------------------------------------------------------------
ROM:000406C8
ROM:000406C8             loc_406C8                               ; CODE XREF: sub_40348+376_j
ROM:000406C8 00 AB                       ADD     R3, SP, #0x68+var_68
ROM:000406CA D8 8C                       LDRH    R0, [R3,#0x68+var_42]
ROM:000406CC 18 30                       ADDS    R0, #0x18
ROM:000406CE
ROM:000406CE             loc_406CE                               ; CODE XREF: sub_40348+35A_j
ROM:000406CE                                                     ; sub_40348+362_j ...
ROM:000406CE 00 AB                       ADD     R3, SP, #0x68+var_68
ROM:000406D0 D8 84                       STRH    R0, [R3,#0x68+var_42]
ROM:000406D2
ROM:000406D2             loc_406D2                               ; CODE XREF: sub_40348+366_j
ROM:000406D2 20 1C                       ADDS    R0, R4, #0
ROM:000406D4 FF 30                       ADDS    R0, #0xFF
ROM:000406D6 04 9A                       LDR     R2, [SP,#0x68+var_58]
ROM:000406D8 00 06                       LSLS    R0, R0, #0x18
ROM:000406DA 00 0E                       LSRS    R0, R0, #0x18
ROM:000406DC 02 9B                       LDR     R3, [SP,#0x68+var_60]
ROM:000406DE 1E 32                       ADDS    R2, #0x1E       ; distancia entre linhas
ROM:000406E0 00 25                       MOVS    R5, #0
ROM:000406E2 5F 49                       LDR     R1, =unk_9E868
ROM:000406E4 01 33                       ADDS    R3, #1
ROM:000406E6 0F 93                       STR     R3, [SP,#0x68+var_2C]
ROM:000406E8 11 92                       STR     R2, [SP,#0x68+var_24]
ROM:000406EA 10 90                       STR     R0, [SP,#0x68+var_28]
ROM:000406EC 0E 91                       STR     R1, [SP,#0x68+var_30]
ROM:000406EE C1 E0                       B       loc_40874
ROM:000406F0             ; ---------------------------------------------------------------------------
ROM:000406F0
ROM:000406F0             loc_406F0                               ; CODE XREF: sub_40348+5AA_j
ROM:000406F0 59 48                       LDR     R0, =unk_9E614
ROM:000406F2 59 4A                       LDR     R2, =unk_9E614
ROM:000406F4 00 79                       LDRB    R0, [R0,#4]
ROM:000406F6 0C 32                       ADDS    R2, #0xC
ROM:000406F8 11 5C                       LDRB    R1, [R2,R0]
ROM:000406FA A9 42                       CMP     R1, R5
ROM:000406FC 4F D1                       BNE     loc_4079E
ROM:000406FE 0E 99                       LDR     R1, [SP,#0x68+var_30]
ROM:00040700 00 AB                       ADD     R3, SP, #0x68+var_68
ROM:00040702 49 78                       LDRB    R1, [R1,#1]
ROM:00040704 50 4E                       LDR     R6, =unk_9EB88
ROM:00040706 D9 8C                       LDRH    R1, [R3,#0x68+var_42] ; posicao linha anterior
ROM:00040708 11 9A                       LDR     R2, [SP,#0x68+var_24] ; distancia entre linhas
ROM:0004070A 89 18                       ADDS    R1, R1, R2      ; atualiza posicao
ROM:0004070C D9 84                       STRH    R1, [R3,#0x68+var_42]
ROM:0004070E D9 8C                       LDRH    R1, [R3,#0x68+var_42]
ROM:00040710 F2 88                       LDRH    R2, [R6,#6]
ROM:00040712 1D 31                       ADDS    R1, #0x1D
ROM:00040714 91 42                       CMP     R1, R2
ROM:00040716 71 DC                       BGT     loc_407FC
ROM:00040718 71 7A                       LDRB    R1, [R6,#9]
ROM:0004071A C9 07                       LSLS    R1, R1, #0x1F
ROM:0004071C 35 D5                       BPL     loc_4078A
ROM:0004071E 4E 4E                       LDR     R6, =unk_9E614
ROM:00040720 F1 78                       LDRB    R1, [R6,#3]
ROM:00040722 01 39                       SUBS    R1, #1
ROM:00040724 88 42                       CMP     R0, R1
ROM:00040726 15 DA                       BGE     loc_40754
(.........................)
(.........................)
(.........................)

Primeiro, ressalto que deixei aparecendo um trecho em que alterei o valor do CMP e as linhas da legenda ficaram horizontalmente deslocadas, como acontece na maioria dos LGs. De repente, naqueles modelos podemos ter um bug desse tipo que precisa ser corrigido. Verifiquem.

Em #4068A, é verificado se a legenda tem mais de duas linhas (CMP  R0, #1). Se não tiver, impõe-se um deslocamento de #38 (#406A0 ADDS  R0, #0x38) ou #30 (#406A8 ADDS  R0, #0x30), devido a uma condição ainda obscura (na verdade, depois de vários testes, aparentemente o lado do deslocamento de #30 nunca é executado). Caso contrário, se for mais de 2 linhas, calculam-se deslocamentos diferentes, dependendo de ter ou não mais de 3 linhas, o que é verificado em #406AC.

Vai ser um pouco difícil de explicar agora. A melhor forma de entender é seguir no IDA as modificações que eu fiz no código ARM. Tentei ir acertando os valores (se forem iguais, não resolve) dos casos em que temos 1 linha e em que temos 3 linhas, até visualmente ficarem alinhados ao caso com 4 linhas (eu alinhei a exibição de 1 linha com a exibição de 4 linhas e depois a exibição de 3 linhas com a exibição de 4 linhas também, deixando tudo alinhado, primeiro superiormente). Fiz vários testes até conseguir. Além disso, tem que se ter deslocamentos diferentes para quando o alinhamento é inferior e para quando é superior. Então, depois tive que fazer novamente o acerto do deslocamento, mas para o alinhamento inferior. Anotei os valores de ambos, pois iria precisar fazer um condicional para cada tipo de alinhamento.

Para resolver isso, cavei espaço dentro do próprio código da rotina. Usando a condição obscura relatada anteriormente. Por exemplo, para até 2 linhas, tínhamos o seguinte:

Código: [Selecionar]
ROM:0004069A 01 28                       CMP     R0, #1  ; condicao nao identificada
ROM:0004069C 02 D1                       BNE     loc_406A4
ROM:0004069E D8 8C                       LDRH    R0, [R3,#0x68+var_42]
ROM:000406A0 38 30                       ADDS    R0, #0x38 ; '8' ; deslocamento legenda 1 e 2 linhas
ROM:000406A2 14 E0                       B       loc_406CE
ROM:000406A4             ; ---------------------------------------------------------------------------
ROM:000406A4
ROM:000406A4             loc_406A4                               ; CODE XREF: sub_40348+354_j
ROM:000406A4 00 AB                       ADD     R3, SP, #0x68+var_68
ROM:000406A6 D8 8C                       LDRH    R0, [R3,#0x68+var_42]
ROM:000406A8 30 30                       ADDS    R0, #0x30 ; '0'
ROM:000406AA 10 E0                       B       loc_406CE

Assim, aproveitei essa parte para modificá-la e fazer a condição do alinhamento: se for inferior, segue um lado, se for superior, segue o outro (verificar no IDA como ficou o novo código). E depois de fazer a mesma modificação na parte que trata a legenda com 3 linhas, ficou quase tudo certo. Só restava um pequeno problema no alinhamento inferior, para os casos em que tínhamos 1 linha ou 2 linhas (no alinhamento superior ficava tudo certo, mas no inferior, somente quando havia 2 linhas, desalinhava um pouco, apesar de 1 linha ficar alinhada). A parte responsável por dividir a legenda em 1 ou 2 linhas é outra, como disse antes. Ela está na rotina que identifiquei como sendo a SUB_CalcStartPosY relatada nos documentos do mt13x9 Group e fazia um deslocamento estranho quando tínhamos o alinhamento inferior. Quando havia 2 linhas, deslocava a posição da primeira linha em meia linha acima, dando um ar de centralizado (quando tínhamos apenas uma linha, esta era exibida exatamente no centro de quando tínhamos 2 linhas). Identifiquei o trecho responsável por esse pequeno deslocamento e o eliminei:

Código: [Selecionar]
ROM:0003FDA4             SUB_CalcStartPosY__sub_3FDA4            ; CODE XREF: sub_40348+23E_p
ROM:0003FDA4 F8 B5                       PUSH    {R3-R7,LR}
ROM:0003FDA6 AD 49                       LDR     R1, =unk_9EB88
ROM:0003FDA8 4E 88                       LDRH    R6, [R1,#2]
ROM:0003FDAA 89 7A                       LDRB    R1, [R1,#0xA]   ; opcao de alinhamento
ROM:0003FDAC C9 07                       LSLS    R1, R1, #0x1F
ROM:0003FDAE 44 D5                       BPL     loc_3FE3A
ROM:0003FDB0 04 1C                       ADDS    R4, R0, #0
ROM:0003FDB2 01 25                       MOVS    R5, #1
ROM:0003FDB4 A8 4F                       LDR     R7, =unk_A4E70
ROM:0003FDB6 16 E0                       B       loc_3FDE6
(......................)
(......................)
(......................)
ROM:0003FE1C 47 88                       LDRH    R7, [R0,#2]
ROM:0003FE1E C0 7A                       LDRB    R0, [R0,#0xB]   ; alterar para valor fixo que seja suficiente,
ROM:0003FE1E                                                     ; exemplo, MOV R0, #0x1A (posicao primeira linha alinhamento inferior)
ROM:0003FE20 C9 1B                       SUBS    R1, R1, R7
ROM:0003FE22 00 19                       ADDS    R0, R0, R4
ROM:0003FE24 11 F0 62 FD                 BL      sdiv
ROM:0003FE28 00 06                       LSLS    R0, R0, #0x18
ROM:0003FE2A 00 0E                       LSRS    R0, R0, #0x18
ROM:0003FE2C A8 42                       CMP     R0, R5
ROM:0003FE2E 04 D9                       BLS     loc_3FE3A
ROM:0003FE30 40 1B                       SUBS    R0, R0, R5      ; deslocamento incorreto
ROM:0003FE30                                                     ; alinhamento inferior: substituir por 00 00 (NOP)
ROM:0003FE32 60 43                       MULS    R0, R4

Eu cheguei a falar, em posts anteriores, do bug que impedia a seleção do alinhamento inferior. Como a distância entre linhas não era repassada pelo 8032, então o valor da posição inicial (primeira linha) estava bugado. É isso o que está comentado em #3FE1E. Além disso, a rotina só é executada no caso da opção de alinhamento ser inferior, devido ao salto em #3FDAE, no início da rotina, que é executado se o alinhamento for superior. Seguindo a rotina, o bug do deslocamento no alinhamento inferior está em #3FE30.

E, para fechar, o bug da fonte 13.

A fonte 13 é a fonte que ficava duplicada anteriormente, pois as duas últimas escolhas de código de caracteres compartilhavam a mesma fonte. No 8032, eu eliminei a última escolha. Mas essa fonte deveria receber um tratamento diferente, dependendo do código de caracteres escolhido. Olhando no ARM, descobri onde isso é feito. Depois, ao testar a legenda, verifiquei que nem todos os caracteres realmente estavem sendo exibidos na fonte que deixei. Zeurt, verifica isso também, pois pode acontecer o mesmo no DV256K.

Código: [Selecionar]
ROM:0003FB56             ; le caracteres da legenda (jah processados)
ROM:0003FB56
ROM:0003FB56             sub_3FB56                               ; CODE XREF: sub_3FB7A+20_p
ROM:0003FB56                                                     ; sub_3FB7A+36_p ...
ROM:0003FB56 42 49                       LDR     R1, =unk_9AE62
ROM:0003FB58 09 78                       LDRB    R1, [R1]
ROM:0003FB5A 14 29                       CMP     R1, #0x14       ; se fonte 13, tratamento especial
ROM:0003FB5C 09 D1                       BNE     loc_3FB72    ; trocar por 09 E0 (B)
ROM:0003FB5E 41 49                       LDR     R1, =SHAREMEM_ADDR
ROM:0003FB60 41 4A                       LDR     R2, =loc_1770
ROM:0003FB62 09 68                       LDR     R1, [R1]
ROM:0003FB64 89 18                       ADDS    R1, R1, R2
ROM:0003FB66 89 7B                       LDRB    R1, [R1,#0xE]
ROM:0003FB68 01 29                       CMP     R1, #1
ROM:0003FB6A 02 D1                       BNE     loc_3FB72
ROM:0003FB6C 3F 49                       LDR     R1, =unk_9E624
ROM:0003FB6E 08 5C                       LDRB    R0, [R1,R0]
ROM:0003FB70 70 47                       BX      LR
ROM:0003FB72             ; ---------------------------------------------------------------------------
(................)
(................)
(................)

É só trocar #09 #D1 por #09 #E0 em #3FB5C (trocar o BNE por B normal) que tudo se resolve. Essa é a rotina que lê o buffer onde estão guardados os caracteres do trecho atual da legenda. Eu cheguei nela pois estou procurando uma forma de exibir os itálicos. Esse buffer, aparentemente, já está com as tags itálicas cortadas. Isso quer dizer que outra rotina é que processa isso antes. Mas ainda não consegui achar nada que preencha esse buffer ainda.

Usando esse endereço de memória que guarda o valor da fonte, cheguei a fazer um trecho que alterava o espaçamento entre linhas de acordo com a fonte escolhida. Assim, pude diminuir o espaçamento da legenda original para o seu valor default. Porém, depois que encontrei os trechos responsáveis pelos alinhamentos das linhas, vi que iria precisar fazer mais uma condição para acertar cada alinhamento (dependendo não só do tipo de alinhamento, mas também da fonte, os deslocamentos seriam outros). Aí, preferi eliminar de vez a fonte original. :laugh:

E em pensar que tudo isso foi fruto da busca pelo itálico....  ;D
« Última modificação: Abril 12, 2009, 11:12:30 pm por rictad »

Offline leonardofrazao

  • Novato
  • *
  • Mensagens: 6
  • Aprovação: +1/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #248 Online: Abril 12, 2009, 03:50:39 pm »
Parabéns pelo firmware!! Ficou excelente mesmo! Eu só não gostei muito da fonte Comic Sans. Talvez, como sugestão, pudesse substituí-la pela Trebuchet MS.

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #249 Online: Abril 14, 2009, 02:38:25 am »
Rictad,

Muito interessante o último capítulo da sua "Enciclopédia em construção".  ;D

Fiz umas buscas iniciais no DV256K ,tentando encontrar as correspondências para:
- Correção dos caracteres 200-255: não achei, já que não havia achado nem o filtro do ARM que você já tinha descrito antes.
- Correção da primeira linha deslocada a esquerda: não achei o trecho que você descreveu; não procurei tanto, mas como a rotina do ARM é bem diferente, talvez seja difícil mesmo...
- Correção da fonte 13: não encontrei trecho semelhante (novamente deve ser devido a diferença na rotina do ARM).
Pretendo procurar tudo de novo com mais atenção.

De qualquer modo, você forneceu tantas informações, que após um bom e calmo estudo, podem ajudar muito aos interessados no assunto. Fiquei até meio "tonto"  :-[ com tanta coisa nova...
Obrigado novamente!

FORUM.RYAN.COM.BR

Re: Firmware do LG DV397H
« Responder #249 Online: Abril 14, 2009, 02:38:25 am »