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

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

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #360 Online: Agosto 26, 2009, 01:43:41 pm »
Ricted, atualizei para a versão 2.4.

Pra mim aqui tá tudo funcionando beleza. Só um detalhe, quanto o firmware atualizou e desligou e ligou o DVD, ele travou, ficou
lendo o cd e não saiu mais do lugar, tive que desligar da tomada, e ligar novamente, e aí tudo funcionou.

Bom, acho que essa "travada" pode ter sido coincidência. Se puder, atualiza de novo para testar, tanto com a versão 2.3 como com a versão 2.4.

Abraços
« Última modificação: Setembro 18, 2009, 05:41:18 pm por rictad »

Offline leo-es

  • Novato
  • *
  • Mensagens: 8
  • Aprovação: +0/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #361 Online: Agosto 27, 2009, 12:11:47 pm »
Ricted, atualizei para a versão 2.4.

Pra mim aqui tá tudo funcionando beleza. Só um detalhe, quanto o firmware atualizou e desligou e ligou o DVD, ele travou, ficou
lendo o cd e não saiu mais do lugar, tive que desligar da tomada, e ligar novamente, e aí tudo funcionou.

Bom, acho que essa travada pode ter sido coincidência. Se puder, atualiza de novo para testar, tanto com a versão 2.3 como com a versão 2.4.

Abraços

Isto aconteceu comigo, quando atualizei com a versão 2.3

Como foi minha primeira vez, achei q que tinha estragado o aparelho. Mas foi só desligar da energia e ligar de novo, o bicho voltou supimpa.
« Última modificação: Agosto 27, 2009, 12:21:08 pm por Jefferson »

FORUM.RYAN.COM.BR

Re: Firmware do LG DV397H
« Responder #361 Online: Agosto 27, 2009, 12:11:47 pm »

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #362 Online: Setembro 13, 2009, 02:14:01 am »
Firmware Rictad Versão 3.2 para DV397H com chip MT1389S

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

* Corrigido pequeno bug que fazia aparecer o caractere "^" no final de algumas linhas de legenda.
* Corrigido pequeno bug que fazia aparecer 1 caractere adicional no final de algumas linhas.
* Corrigido bug que fazia com que todo o quadro ficasse em itálico se houvesse um trecho não fechado em itálico em uma linha inferior.

Nota 1: A versão 3.2a é a convencional. Possui 4 fontes (Arial Narrow Bold, Helvetica Bold, Impact e Verdana) todas em cp 1252.
Nota 2: A versão 3.2b possui apenas 1 fonte (Arial Narrow Bold), mas 4 codepages: cp 1250, cp 1251, cp 1252 e cp 1253. É ideal para quem quer ver filmes com legendas em russo ou grego.
Nota 3: Posteriormente posso incluir outras subversões com novos codepages.

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #363 Online: Setembro 13, 2009, 03:15:47 am »
Implementação do Itálico

PARTE 2


Faz um bom tempo, tive que lembrar muita coisa.  ;D
É melhor acompanharem no IDA as modificações e as novas rotinas.

Planejamento

Relembrando rapidamente, com o documento "MPEG4 Subtitle Display in ARM" (do NewAge), foi possível achar a rotina sub_3FB1A com o endereço base em que ficam gravadas as opções de legenda (#9EB88), a rotina responsável por exibir as legendas (que começa em #40348), a rotina responsável por ler os caracteres da legenda (que começa em #3FB56) e outras. Na rotina que lê os caracteres da legenda, é possível identificar o endereço base do buffer do quadro atual da legenda. Apenas 1 quadro é carregado no buffer por vez e seus caracteres são lidos um a um. O endereço base é #A4E70, sendo que na posição #A4E70+1 temos o total de caracteres do quadro e em #A4E70+2 temos o primeiro caractere do quadro.

Bom, como disse na PARTE 1, o primeiro passo foi adicionar um offset aos valores lidos desse buffer para ver se uma fonte com mais de 256 caracteres podia ser usada para colocar os caracteres itálicos. Essa foi uma das opções sugeridas no fórum do jmaraujo e também pelo zeurt. Como funcionou, passou a ser a idéia central do itálico.

O maior problema era que o modelo de chip S desse player originalmente não exibe as tags srt na legenda, e o buffer #A4E70 (por enquanto vou chamá-lo assim) já é preenchido sem as tags. Como eu disse antes, teria que haver alguma parte no ARM que carregasse o buffer eliminando as tags. Procurei várias vezes no código por rotinas que fizessem uso do endereço #A4E70 e que tivessem operações de comparação (CMP, SUB etc) com os bytes #3C ("<") e #3E (">"). Mas não conseguia achar. Porém, mexendo mais no IDA, descobri que havia certas regiões que os scripts do mt13x9 group não consideravam como que fossem código, mas que são código. Isso tem a ver com os ARM codes, dos quais vou falar um pouco mais a frente. Então, selecionei algumas partes e forcei o IDA a considerar como código. E pronto, lá estava a rotina que inibe as tags! Começa em #8CD44. Ela lê um outro buffer, que tem base em #9A610 (o qual vou chamar de buffer primário), e preenche o buffer #A4E70 (o qual passo a chamar de buffer secundário), com tudo que não estiver entre "<" e ">". O buffer primário, ao contrário do secundário, é pequeno. Cabe no máximo #20 (32) caracteres. Então ele é lido de 32 em 32 caracteres, os quais são transferidos para o buffer secundário, até que o fim do quadro seja encontrado. Cabe ressaltar que o buffer primário já está carregado apenas com os caracteres de texto da legendas. As posições de tempo já estão cortadas. Assim, ainda deve existir um pré-buffer que seleciona e corta as posições de tempo que estão no arquivo de legenda.

Agora, tinha que dar um jeito de repassar as opções das tags para o ARM. Eu pensei em usar a mesma opção de alinhamento horizontal (que chega ao ARM na posição #9EB88+9). Por quê? Porque ao fazer testes quando estava criando as opções do alinhamento da legenda, percebi que apenas o bit menos significativo era o que importava. Se repassamos o valor XXXXXXX1, o alinhamento é centralizado. Se for XXXXXXX0, o alinhamento é à esquerda. Assim, os outros bits podem ser usados para armazenar outras informações e teremos que usar operações lógicas tanto no 8032, para juntar as opções do alinhamento horizontal com as opções das tags srt, quanto no ARM, para separar essas mesmas informações. Usei o seguinte esquema para o byte do alinhamento horizontal:

ITTTXXXA,

em que I é a flag usada para indicar se o texto está em itálico, TTT são os 3 bits usados para as opções de tags (são 5 opções, precisamos de pelo menos 3 bits), XXX não interessa e A é o bit com a opção de alinhamento horizontal.

Houve um outro complicador nesse processo. Vou explicar para quem for verificar o código 8032 não ficar confuso. Como estava sem espaço no menu OTHERS para as opções de tags, eu juntei as opções de alinhamento horizontal e vertical numa única opção. Assim, quem olhar no 8032, verá que eu primeiro leio a EEPROM com a nova opção de alinhamento geral, separo-a nas opções de alinhamento vertical e horizontal, envio a opção de alinhamento vertical (que chega ao ARM em #9EB88+5), leio a EEPROM com a opção de exibição das tags, junto-a com a opção de alinhamento horizontal e envio ao ARM (que chega em #9EB88+9).

Para fazer as modificações no ARM, precisei de espaço no código. Tentei usar o famoso espaço das mensagens de erro, mas travava quando fazia a chamada lá dos endereços da rotina de inibição das tags. Era como se ela estivesse desconectada do restante do código. Então, percebi que o ARM também possui bancos, páginas separadas: os ARM codes. A rotina que exibe a legenda fica no ARM code 1, mesmo lugar das mensagens de erro. Já a rotina que inibe as tags e monta o buffer secundário fica no ARM code 5! Ainda não pesquisei como isso funciona, mas já deve ter sido revelado em algum documento do mtk group ou daqui do fórum. Não sei se há formas de pular de uma página a outra, se são independentes mesmo, pensando numa possível multitarefa, ou ainda se são carregados em outra ordem. De qualquer forma, para criar espaço, extraí o ARM code 5 com o MTK Remaker, acrescentei bytes ao final do código com um editor hexadecimal e o reinseri com o MTK Remaker. Assim, pude modificar a rotina que começa em #8CD44 e acrescentar a rotina sub_8E99C. Já para algumas modificações que fiz na rotina que lê o buffer secundário, pude utilizar tranquilamente o espaço das mensagens de erro, pois fica tudo no ARM code 1.

Explicando as Modificações

Primeiro, no ARM code 5, o itálico ainda não é acionado. Apenas é feita a codificação das opções de tags. Em sub_8E99C, verifica-se qual a opção de tag o usuário escolheu para que se possa montar o buffer secundário da forma correta. Como a tabela de palavras que começa em #8CECC não possui o endereço #9EB88, criei uma tabela em #8EB84 apenas para fazer essa referência (o código ARM é realmente estranho para quem está acostumado com CISC). Assim, podemos ler o endereço #9EB88+9 e, com as instruções lógicas, decifrar as opções (o que está em TTT no byte ITTTXXXA). Por exemplo, se for "mostrar todas as tags" (#20=#B00100000), o controle é devolvido para a outra rotina, que preenche o buffer secundário sem fazer qualquer restrição. Se for "esconder todas", o controle é devolvido e tudo passa a ser executado como antes. Já nas demais opções, é feita uma coisa importante. Temos que verificar se o atual caractere é "<", se o próximo é "i" e se o seguinte é ">", ou se atual caractere é "<", o próximo é "/", o seguinte é "i" e, finalmente, o da posição atual + 3 é ">". Para o caso de "substituir por aspas", simplesmente trocamos o atual caractere por ", e o contador da posição do buffer primário é atualizado com o valor de R4. Assim, o buffer secundário é montado com as tags itálicas sendo substituídas por aspas. Quando a opção for "habilitar itálicos", é feita uma codificação que será interpretada apenas pela rotina que lê os caracteres do buffer secundário, no ARM code 1. Se a tag <i> for encontrada, será substituída pelo código #03. Se for a </i>, será substituída por #04.

Ao trabalhar com esse buffer primário, de no máximo 32 caracteres, temos um problema. Se a tag começar antes do caractere 32 e terminar depois, não há como detectá-la. Por exemplo, se um texto no formato <i>456789012345678901234567890</i> for lido, quando a rotina encontrar o caractere "<" da tag final, que está na posição 30 (começa em 0), vai tentar achar os demais. Mas não vai encontrar o "i", que está na posição 30+2=32, fora do buffer. Assim, não irá substituir essa tag nem por " e nem por #04. Por isso, dependendo de onde estiver a tag, muitas vezes o itálico permanecerá ligado. Quando o buffer primário acabava, tínhamos o registro da posição (#20) em #8CDC4 antes de chamar uma rotina em #39356 (essa rotina não é a mesma loc_39356 que o IDA mostra erradamente, pois ele está mostrando a rotina do ARM code 1, mas essa posição, no momento em que é chamada, fica em outro ARM code, e muito provavelmente está envolvida com o pré-buffer que falei anteriormente, pois é ela que "enche" o buffer primário a partir de uma posição repassada). A solução foi modificar essa posição para que seja igual ao atual contador (em R4). Se for encontrada uma tag, por exemplo, que começa na posição 31, ela não será identificada, pois ficará "quebrada". Mas, ao acabar o buffer, na posição 32, será repassada a posição 31 (início da tag), para a rotina #39356. Sim, vai haver um salto para trás e o novo preenchimento do buffer vai começar no que seria a posição 31 do preenchimento anterior (a posição 31 será lida novamente). Esse artifício só ocorre se uma tag for "quebrada" no final do buffer primário.

Bom, agora vamos às modificações na parte que exibe a legenda, no ARM code 1. A rotina que lê o buffer secundário da legenda é a sub_3FB56. Essa rotina é chamada várias vezes pela rotina de exibição de legendas (sub_40348) para poder verificar quantas linhas serão necessárias, para calcular alinhamento vertical de 1 ou 2 linhas, o alinhamento vertical de 3 linhas, 4 linhas, a centralização etc. Assim, se mudarmos diretamente a rotina, iremos adicionar novas operações que serão executadas várias e várias vezes. O melhor foi alterar onde exatamente é repassado o caractere para exibição. Isto é feito em #407AA. Como eliminei o "bug" da fonte repetida anteriormente, a rotina sub_3FB56 foi bastante reduzida, sobrando espaço para criar uma nova rotina, a sub_3FB5E. Daí, em #407AA chamamos essa nova rotina que vai carregar a opção de tag e chamar uma rotina criada na área de mensagens de erro: sub_58A38. Ela verifica se o atual código de caractere é 03 (início itálico). Se for, ela vai setar o bit 7 da posição #9EB88+9 (o bit I de ITTTXXXA). Se o atual código de caractere é 04, ela reseta o bit 7. Mais à frente, se o caractere não for nem 03 e nem 04, for maior que #20, se o bit 7 estiver setado e se, somente se, a opção atual de tags for "habilitar itálicos", ao caractere lido será adicionado um offset de #DF (223, pois não há itálicos abaixo de #20 e o total de caracteres das fontes é 256+223).

Isso foi o suficiente para começarem a aparecer os itálicos, porém tive ainda 2 problemas. O alinhamento horizontal centralizado e as legendas em que a tag de fechamento </i> não é usada. Para resolver o problema do não uso da tag </i>, tive que incluir na rotina de exibição dois trechos que cancelam o itálico no início da exibição de um novo quadro de legenda. Dois trechos, pois a rotina tem duas partes independentes: uma para quando o quadro tem 1 ou 2 linhas e outra para quando tem mais de 3 linhas. Um dos desvios para cancelar o itálico é feito em #40642 e o outro é feito em #406D2. Tentei fazer apenas um único desvio no início da rotina, mas nem sempre funcionava.

Já a rotina que calcula a centralização é a sub_3FB7A (deveria ser a que os scripts identificaram como SUB_CalcTextLineWidth__sub_3FC98, mas essa não tem uso e é muito parecida com a anterior; suspeito que seja utilizada para alinhar a legenda à direita, no caso de línguas com esse tipo de alinhamento, como o árabe). Os caracteres itálicos ficaram com largura um pouco maior, devido à angulação (na verdade, o espaço vazio aumentou, pois a área do caractere continua sendo um retângulo). Assim, uma linha em itálico será ligeiramente maior que uma linha normal, com os mesmos caracteres. Quando o texto está alinhado à esquerda, não há problemas. As linhas começam sempre na esquerda, sendo que as itálicas ficam maiores. Porém, se tivermos usando a opção de centralização, as palavras em itálico serão centralizadas como se não estivessem em itálico (pois a rotina sub_3FB7A chama a antiga rotina de leitura de caracteres e não a nova, que habilita os itálicos). Assim, como a linha com itálico é maior, ele fica deslocada um pouco mais à direita (por ser maior do que foi considerada pelo cálculo de centralização). A primeira solução que usei foi também chamar a nova rotina sub_3FB5E de dentro da rotina de centralização. A princípio funcionou, mas tinha o inconveniente de que toda vez que a centralização era chamada (a centralização é chamada 1 vez para quando temos 1 ou 2 linhas, 3 vezes para 3 linhas e 5 vezes para 4 linhas), a legenda era percorrida de verdade, fazendo com que o itálico fosse ativado antes da hora. Por exemplo, vejamos o seguinte quadro:

Código: [Selecionar]
Primeira linha de teste.
Segunda linha de teste.
Terceira <i>linha de teste.
Quarta linha de teste.

O itálico deveria ser ligado após a tag e ficar assim até o fim do quadro. Porém, todo quadro estava ficando em itálico, pois a centralização da terceira linha (que ocorre antes da exibição de fato) liga o itálico e o mantém ligado (pois não encontra a tag </i>) antes de o quadro ser exibido.
A solução final foi modificar a rotina de centralização para que faça uma cópia da opção em #9EB88+9 antes de calcular a posição horizontal e, ao final, restaure a opção. Ou seja, se entramos na rotina com itálico desligado, saímos dela com o itálico desligado. Fazendo uma busca pelo código, não achei nenhuma referência à posição #9EB88+#0F. Assim, usei essa posição para guardar uma cópia de #9EB88+9 na rotina de centralização, que pode ser vista no IDA.

Bom, acho que é só isso que faltava ;D.

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #364 Online: Setembro 13, 2009, 06:03:03 pm »
Rictad,
Parabéns e Obrigado por mais essa contribuição!  :clapping:
Eu tenho a intenção de implementar o itálico no LG DV256K, com o auxílio das suas descobertas e explicações, porém da forma mais simples possível (sem as várias opções do menu, etc.), e mesmo assim não sei se consiguirei, e também não sei quando iniciarei essa tentativa...  :-\
De qualquer modo, já tenho uma dúvida genérica inicial: você fez as modificações no ARM (novos trechos do código) "na mão", ou você usou algum Assembler para ARM? Pergunto isso pois, para fazer as modificações no 8032, eu uso o RunTimeAssembler do NewAge, e fica muito mais tranquilo. Ainda não encontrei um Assembler para ARM, compatível com Windows, gratuito, e sem muitas complicações. Como você usa Linux, provavelmente você deve conhecer algo para Linux apenas, não é? Posso até começar a me aventurar no Linux só pra fazer isso (caso essa seja a única opção disponível)...  :)

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #365 Online: Setembro 14, 2009, 03:42:36 am »
Olá Zeurt!

Ainda que você não use muitas opções, deve deixar ao menos a opção de ligar ou não o itálico. Assim, precisará de pelo menos 1 bit de informação que deverá ser repassado ao ARM. E no ARM, você terá que ter pelo menos mais uma flag para indicar que o texto está em itálico ou não. São, ao menos, 2 bits de informação. Um endereço de memória já usado pelo ARM, mas que não faz uso de todos os bits do byte, como os normalmente usados para os alinhamentos vertical e horizontal são os candidatos ideiais para você mesclar esses bits.

Com relação às modificações, sempre fiz na mão. Infelizmente, grande parte dos Assemblers são comerciais. Assim, é mais fácil achar para Windows do que para Linux, principalmente para os processadores ARM (se fosse x86 seria mais fácil). (Esqueçam que eu disse isso. O zeurt, no post abaixo, mostra um assembler livre para o ARM, voltado para o projeto KMD, e que tem como principal plataforma alvo o Linux.) No caso do 8052, o código é fácil de entender e a documentação é vasta. Mas no caso do ARM, ainda que encontremos uma certa documentação, fica um pouco difícil "decifrar" o código correto das instruções, porque eles aparecem como esquemas de bits nos manuais. Lembrando que temos que considerar apenas o modo Thumb, em que as intruções têm 16 bits.

No entanto, a maior parte do código das instruções eu achei fazendo busca por strings no IDA mesmo. Algumas você pode deduzir. Se temos:

Código: [Selecionar]
02 70                       STRB    R2, [R0]
42 70                       STRB    R2, [R0,#1]
82 70                       STRB    R2, [R0,#2]

Podemos supor que STRB    R2, [R0,#3] tenha código C2 70 (mais #40). E se tivermos:

Código: [Selecionar]
4A 70                       STRB    R2, [R1,#1]
Com ajuda dos códigos anteriores, podemos supor que STRB    R2, [R1,#2] tenha código 8A 70. E se LDRB    R2, [R1,#1] tem código 4A 78, então LDRB    R2, [R1,#0] deve ter código 0A 78.
Veja que temos apenas 1 bit alguns bits variando de instrução para instrução. A posição desse bit desses bits é que muda dependendo de estarmos variando o registrador de carregamento (ou salvamento), o registrador objeto, a instrução (carregar ou salvar) ou o offset. Daí a importância de entender as tabelas de instruções / bits que aparecem nos manuais do ARM.

No geral, as instrução são similares às do 8052. Mas atentar para a instrução BX, para o registrador LR e para o carregamento indireto. O instrução BX "registrador" faz um salto para a posição de memória guardada no "registrador". O registrador LR guarda sempre o endereço de retorno da última rotina que originou a chamada. Assim, BX LR faz um retorno à rotina original. No entanto, se você fizer duas chamadas seguidas, a primeira será perdida. Por isso é comum vermos no código do firmware que antes de um segundo salto o valor de LR é guardado na pilha com um PUSH LR (ou LR mais outros registradores, se você quiser guardar o seu valor) e depois, no final da rotina, usa-se um POP R3 (R3 é o mais usado para isso nesses firmwares, mas pode-se usar qualquer outro), seguido de um BX R3.

Um carregamente indireto, como o seguinte

Código: [Selecionar]
ROM:00040830 05 49                       LDR     R1, =loc_9EB88
significa que você está carregando em R1 a palavra apontada pelo offset 05. Vejamos o trecho inteiro:

Código: [Selecionar]
ROM:00040830 05 49                       LDR     R1, =loc_9EB88
ROM:00040832 01 38                       SUBS    R0, #1
ROM:00040834 C9 88                       LDRH    R1, [R1,#6]
ROM:00040836 88 42                       CMP     R0, R1
ROM:00040838 5C DC                       BGT     loc_408F4
ROM:0004083A
ROM:0004083A             loc_4083A                               ; CODE XREF: sub_40348+4C6_j
ROM:0004083A FA 2E                       CMP     R6, #0xFA ; '·'
ROM:0004083C 12 D2                       BCS     loc_40864
ROM:0004083E 09 AA                       ADD     R2, SP, #0x68+var_44
ROM:00040840 30 1C                       ADDS    R0, R6, #0
ROM:00040842 0A 99                       LDR     R1, [SP,#0x68+var_40]
ROM:00040844 02 9B                       LDR     R3, [SP,#0x68+var_60]
ROM:00040846 13 E0                       B       loc_40870
ROM:00040846             ; ---------------------------------------------------------------------------
ROM:00040848 88 EB 09 00 off_40848       DCD loc_9EB88           ; DATA XREF: sub_40348+122_r
ROM:00040848                                                     ; sub_40348+232_r ...
ROM:0004084C 18 C2 09 00 off_4084C       DCD loc_9C218           ; DATA XREF: sub_40348:loc_40480_r
ROM:0004084C                                                     ; sub_40348+49C_r
ROM:00040850 14 C2 09 00 off_40850       DCD loc_9C212+2         ; DATA XREF: sub_40348+13A_r
ROM:00040850                                                     ; sub_40348+4A4_r
ROM:00040854 70 4E 0A 00 off_40854       DCD unk_A4E70           ; DATA XREF: sub_40348+1BE_r
ROM:00040854                                                     ; sub_40348+1E2_r ...
ROM:00040858 14 E6 09 00 off_40858       DCD loc_9E614           ; DATA XREF: sub_40348+246_r
ROM:00040858                                                     ; sub_40348+24C_r ...
ROM:0004085C 1C A9 05 00 off_4085C       DCD SHAREMEM_ADDR       ; DATA XREF: sub_40348+346_r
ROM:0004085C                                                     ; sub_40348+368_r ...
ROM:0004085C                                                     ; Pointer to ARM & 8032 Shared Mmemory
ROM:00040860 68 E8 09 00 off_40860       DCD loc_9E868           ; DATA XREF: sub_40348+39A_r

O offset 05 em #40830 significa que carregamos a palavra de 4 bytes que está a 4 + 4 x 5 = 24 endereços a abaixo (a palavra é escrita de trás para frente: 88 EB 09 00 = 0009EB88). Se quiséssemos que fosse LDR     R0, =loc_9C218, o código seria 06 48. Para LDR     R2,= loc_9C214, o código seria 07 4A.

Com excessão dos códigos encontrados com uma busca por strings, você deve testar as modificações no IDA para ver se as instruções deduzidas estão corretas. Às vezes, você acha que alterou o offset, mas alterou o registrador.
« Última modificação: Setembro 18, 2009, 05:54:00 pm por rictad »

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #366 Online: Setembro 14, 2009, 02:43:43 pm »
Rictad, considerando que você fez todo o trabalho "na mão", devemos dar ainda mais valor a tudo o que você já fez!  :clapping:

Eu ainda não desisti de encontrar um Assembler para ARM. Achei esse aqui , mas ainda não consegui fazê-lo funcionar. É em C, e tem que compilá-lo para usar: http://intranet.cs.man.ac.uk/Study_subweb/Ugrad/coursenotes/komodo/assembler/
Há alguns meses atrás, cheguei a conclusão que para fazer modificações nas legendas como essas dos itálicos, eu teria que aprender Assembly para ARM. Então, procurei fontes de informação disponíveis. A melhor que encontrei, e mais didática foi essa: http://www.peter-cockerell.net/aalp/ . É necessário apenas um conhecimento razoável em alguma linguagem da alto nível (ex: Basic, que é a única que eu conhecia até então). É uma ótima introdução para Assembly em geral, e para ARM em especial.
Se for ter que fazer tudo na mão mesmo, essa documentação com todas as instruções (e respectivas codificações) deve ser útil: http://netwinder.osuosl.org/pub/netwinder/docs/arm/ARM7500FEvB_3.pdf

Obrigado mais uma vez!

« Última modificação: Setembro 14, 2009, 02:46:20 pm por zeurt »

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #367 Online: Setembro 14, 2009, 08:32:52 pm »
Acho que se você conhece o Assembly do 8052, não terá muitas dificuldades com o ARM. Como se trata de uma máquina RISC, seu conjunto de instruções é bem mais simples, há poucas (poucos tipos de) instruções. Há, no entanto, muitos opcodes, pois temos que considerar a quantidade de variações no que diz respeito a registradores e offsets.  Por exemplo, a instrução ADDS R0, R0, #1, que na maioria dos casos é escrita simplesmente como ADDS R0,#1, tem um código diferente de ADDS R0,#2. A primeira, adiciona #1 ao valor de R0 e guarda em R0. A segunda, adiciona #2. São a mesma instrução, mas possuem uma diferença de 1 bit 2 bits no opcode. Todas as instruções ADDS são a mesma e, ainda, podem ser consideradas como um tipo de instrução MOVS. Justamente pela pouca quantidade de instruções realmente diferentes, os algoritmos passam a ser mais complexos (com menos instruções, mais combinações você precisa fazer para atingir seu objetivo). A primeira documentação que você indicou é muito boa. Ainda não havia visto. Ela ajuda a entender essas características. Veja como as instruções são divididas em apenas um pequeno grupo.

A segunda documentação eu já conhecia. Ela também explica as instruções, mas não traz os opcodes diretamente. É o caso que eu falei antes: há uma tabela de bits para que decifremos os opcodes. E nessa página, temos a tabela para instruções de 32 bits. Mas os nossos firmwares possum instruções no modo Thumb de 16 bits que, na verdade, não passa de um subconjunto do outro. Então, usar tabelas de instruções de 16 bits fica mais fácil. Há algumas documentações com o chamado Thumb Instruction Set.

Com 16 bits podemos ter até 65536 variações de instruções (provavelmente alguns desses 65536 opcodes são ignorados pelo processador). Acho que talvez seja melhor criarmos um arquivo binário com instruções de 00 00 a FF FF e abrirmos no IDA. Aí teremos todos os opcodes e todas as intruções reconhecidas pelo IDA no modo Thumb.

Depois vou dar uma olhada no Assembler que você achou. Isso facilitaria as coisas. E como tem o fonte, ajuda na portabilidade.
« Última modificação: Outubro 02, 2009, 05:34:41 am por rictad »

Offline Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware do LG DV397H
« Responder #368 Online: Setembro 14, 2009, 09:27:20 pm »
Com 16 bits podemos ter até 65536 variações de instruções (provavelmente alguns desses 65536 opcodes são ignorados pelo processador). Acho que talvez seja melhor criarmos um arquivo binário com instruções de 00 00 a FF FF e abrirmos no IDA. Aí teremos todos os opcodes e todas as intruções reconhecidas pelo IDA no modo Thumb.


Sinto que é uma pergunta besta, mas aí vai:

Nenhuma instrução espera parâmetros? Com o instruction set do 8051 eu sei que não dá para fazer isso.
http://jefferson-ryan.blogspot.com
http://ryan.com.br

Se o que você escreve não merece sua atenção, vai merecer a atenção de quem?!

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #369 Online: Setembro 15, 2009, 02:23:06 am »
Com 16 bits podemos ter até 65536 variações de instruções (provavelmente alguns desses 65536 opcodes são ignorados pelo processador). Acho que talvez seja melhor criarmos um arquivo binário com instruções de 00 00 a FF FF e abrirmos no IDA. Aí teremos todos os opcodes e todas as intruções reconhecidas pelo IDA no modo Thumb.


Sinto que é uma pergunta besta, mas aí vai:

Nenhuma instrução espera parâmetros? Com o instruction set do 8051 eu sei que não dá para fazer isso.

Pelo que entendi do ARM Assembly, os parâmetros ficam embutidos nas instruções. Naquela primeira referência que enviei, isso é explicado de maneira bem didática.

FORUM.RYAN.COM.BR

Re: Firmware do LG DV397H
« Responder #369 Online: Setembro 15, 2009, 02:23:06 am »