Autor Tópico: Firmware MT13x9: Log de Descobertas  (Lida 272666 vezes)

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

Offline Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #40 Online: Julho 15, 2007, 04:30:34 am »
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

« Última modificação: Julho 18, 2007, 04:39:26 am por Jefferson »
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 Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #41 Online: Julho 16, 2007, 02:33:42 am »
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.
« Última modificação: Julho 19, 2007, 12:55:47 am por Jefferson »
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?!

FORUM.RYAN.COM.BR

Re: Firmware: log de descobertas
« Responder #41 Online: Julho 16, 2007, 02:33:42 am »

Offline Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #42 Online: Julho 19, 2007, 12:06:06 am »
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.


Código: [Selecionar]
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


Código: [Selecionar]
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. 
« Última modificação: Julho 21, 2007, 10:27:21 pm por Jefferson »
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 Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #43 Online: Julho 19, 2007, 12:33:55 am »
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.




« Última modificação: Julho 19, 2007, 12:53:03 am por Jefferson »
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 Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #44 Online: Julho 19, 2007, 10:43:41 pm »
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.





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..
« Última modificação: Julho 21, 2007, 10:44:25 pm por Jefferson »
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 Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #45 Online: Julho 19, 2007, 11:42:47 pm »
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.
« Última modificação: Agosto 02, 2007, 12:09:41 pm por Jefferson »
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 Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #46 Online: Julho 20, 2007, 01:04:57 am »
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.



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:



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:



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.


« Última modificação: Julho 20, 2007, 04:37:23 am por Jefferson »
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 Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #47 Online: Julho 22, 2007, 05:54:09 pm »
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:



Onde você simplesmente dá OK para prosseguir. O procedimento a seguir vai mudar isso para que você possa escolher esta opção:



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.

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 Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware: log de descobertas
« Responder #48 Online: Julho 22, 2007, 06:17:22 pm »
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.
« Última modificação: Julho 22, 2007, 07:05:21 pm por Jefferson »
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 eneris

  • Novato Prolixo
  • **
  • Mensagens: 85
  • Aprovação: +2/-0
  • The Cranberries em Recife Outubro/2010 Eu Vou!
    • Ver Perfil
    • ENERIS Online :: No Need To Argue
Re: Firmware: log de descobertas
« Responder #49 Online: Julho 26, 2007, 12:10:45 am »
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!

The Cranberries - em Recife Outubro/2010
Estarei la colado! Ta perto.

FORUM.RYAN.COM.BR

Re: Firmware: log de descobertas
« Responder #49 Online: Julho 26, 2007, 12:10:45 am »