Como funciona o esquema de bancos nos novos firmwaresIsso é só um rascunho.
Recapitulando:- A arquitetura 8051 só suporta 64K de memória;
- O truque que permite ao MT1389 usar um código 8032 maior que 64K, divide o código em segmentos de 64KB chamados de bancos e requer o uso de Bank Switch Tables (BSTs) idênticas em cada banco para que seja possível que um banco possa chamar rotinas que estão gravadas em outro.
O código 8032 é agora organizado das duas maneiras a seguir:
Eu não tenho certeza ainda, mas aparentemente no novo formato a BST tem um tamanho fixo de 12K e o espaço para o código de cada banco é fixo em 52K.
O esquema antigo produz um desperdício natural com a repetição da BST em cada banco. O novo esquema tem o objetivo de reclamar esse espaço desperdiçado, mas tenha em mente que nem um byte é ganho no espaço do código 8032 para patches. Um banco que só teria 100 bytes livres no esquema antigo continua com 100 bytes livres no esquema novo. Todo o espaço economizado com o novo esquema pode ser aproveitado basicamente com mais fontes e imagens.
E ainda é mais complicado do que parece:
A arquitetura 8051
requer que, pelo menos na memória RAM, o truque de bank switching seja implementado da forma tradicional: BST + banco 0 + BST + banco 1 + BST + banco 2, então apesar do chip MT1389L estar programado para carregar apenas uma BST, ele precisa gravar o código 8032 na memória da mesma forma que o chip tradicional MT1389. Todo o endereçamento das rotinas considera (e precisa ser dessa forma) que as BSTs estão lá, no início de cada banco. Por conta disso você não pode mais simplesmente carregar a parte 8032 do código no IDA ou num editor hexadecimal e fazer patches, porque não sendo no banco zero, vai dar tudo errado.
Para ter um bloco 8032
normal a partir de um bloco 8032 "L" de três bancos basta fazer o seguinte:
copy /b
BST+bloco0+BST+bloco1+BST+bloco2 8032_normal.bin
Se você analisar com um comparador binário, é exatamente isso que New Age faz com o novo MtkExtract:
- 8032__normal.bin -> É o bloco 8032 do jeito que vai para a memória.
- 8032__flash.bin -> É o bloco 8032 do jeito que está no firmware.
Note que New Age chama de "common code" o que eu chamo de BST.
Então, para analisar no IDA PRO, você precisa usar 8032__normal.bin
Porém um problema permanece. Após a análise no IDA, você precisa fazer as edições tembém em 8032__normal.bin (não é mais possível editar diretamente o firmware, porque os endereços vistos no IDA só vão corresponder para o banco zero). Depois 8032__normal.bin precisa ser "recortado" e "remontado" como um novo 8032__flash.bin, para só então substituir no firmware.
Esse é mais um motivo para que as ferramentas existentes não tenham condição de lidar com os firmwares novos. Muita coisa precisa ser adaptada para lidar com as duas situações.