A ideia é usar apenas a última versão do ZBT-601 para integrar todas as modificações feitas até agora (e talvez as futuras) e disponibilizar 3 versões intercambiáveis entre os 3 aparelhos. Mas para isso vou ter que descobrir se o SPDIF realmente continua funcionando nos ZBT-620/633 após a atualização com o firmware do 601.
Legal saber dessa compatibilidade. Faz algum tempo que eu estou pra te perguntar sobre isso... Na verdade eu estou precisando comprar um conversor pra minha mãe, e então pensei no ZBT-601, que está com um preço ótimo. Só faltava a confirmação que você deu agora sobre a compatibilidade com o ZBT-633, pois assim, além de comprar um conversor com ótimo custo-benefício, ainda poderei brincar um pouco com o desenvolvimento do firmware (tentar ajudar nem que seja um pouquinho
).
Outra coisa: eu abri recentemente um binário
zmw_base_zinwell que você enviou, no
IDA 5.5.0, e fiquei POSITIVAMENTE impressionado com a quantidade de "comentários" espalhados por todo o código. Esses "comentários" que na verdade são as mensagens enviadas para o console são realmente muito bem-vindos. Com eles, a gente não fica desesperadamente perdido no meio de tudo (é bem diferente dos firmwares Mediatek, em que não existia nada disso).
Como você ressaltou algumas vezes já neste tópico, os comentários servem pra nos mostrar que estamos no lugar certo... É claro que precisa decifrar as instruções da redondeza do comentário que interessa para se chegar a rotina definitiva que executa determinada função. De qualquer modo, me pareceu que ajuda bastante, já que cada comentário serve como uma pista, um ponto de partida, ou uma idéia para uma nova modificação...
Um exemplo: próximo de onde você colocou os NOPs pra acabar com o limite de 32G existe a string "# "Disk total size must be over 32G!!".
.text:004787E4 # ---------------------------------------------------------------------------
.text:004787E4
.text:004787E4 loc_4787E4: # CODE XREF: sub_4786EC+40j
.text:004787E4 9C 8C 99 8F la $t9, sub_4B2A98
.text:004787E8 09 F8 20 03 jalr $t9 ; sub_4B2A98
.text:004787EC 00 00 00 00 nop
.text:004787F0 00 00 00 00 nop
.text:004787F4 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:004787F8 D4 A0 99 8F la $t9, sub_459DF0
.text:004787FC 09 F8 20 03 jalr $t9 ; sub_459DF0
.text:00478800 00 00 00 00 nop
.text:00478804 06 00 40 14 bnez $v0, loc_478820
.text:00478808 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:0047880C F0 82 99 8F la $t9, sub_45B064
.text:00478810 09 F8 20 03 jalr $t9 ; sub_45B064
.text:00478814 00 00 00 00 nop
.text:00478818 1D 00 40 10 beqz $v0, loc_478890
.text:0047881C 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:00478820
.text:00478820 loc_478820: # CODE XREF: sub_4786EC+118j
.text:00478820 # sub_4786EC+1B0j
.text:00478820 24 80 84 8F la $a0, dword_680000
.text:00478824 30 8A 99 8F la $t9, sub_666260
.text:00478828 09 F8 20 03 jalr $t9 ; sub_666260
.text:0047882C B8 59 84 24 addiu $a0, (aWeHavePopWindo - 0x680000) # "We have POP window, so we can't let use"...
.text:00478830 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:00478834 D8 FF 00 10 b loc_478798
.text:00478838 01 00 03 24 li $v1, 1
.text:0047883C # ---------------------------------------------------------------------------
.text:0047883C 34 9C 99 8F la $t9, sub_45EBE0
.text:00478840 09 F8 20 03 jalr $t9 ; sub_45EBE0
.text:00478844 96 01 04 24 li $a0, 0x196
.text:00478848 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:0047884C 45 01 04 24 li $a0, 0x145
.text:00478850 34 9C 99 8F la $t9, sub_45EBE0
.text:00478854 09 F8 20 03 jalr $t9 ; sub_45EBE0
.text:00478858 21 80 40 00 move $s0, $v0
.text:0047885C 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:00478860 21 20 00 02 move $a0, $s0
.text:00478864 21 28 40 00 move $a1, $v0
.text:00478868 AC CA 99 8F la $t9, sub_459140
.text:0047886C 09 F8 20 03 jalr $t9 ; sub_459140
.text:00478870 C1 00 06 24 li $a2, 0xC1
.text:00478874 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:00478878 24 80 84 8F la $a0, dword_680000
.text:0047887C A0 88 99 8F la $t9, sub_6660D0
.text:00478880 09 F8 20 03 jalr $t9 ; sub_6660D0
.text:00478884 F8 59 84 24 addiu $a0, (aDiskTotalSizeM - 0x680000) # "Disk total size must be over 32G!!"
.text:00478888 B9 FF 00 10 b loc_478770
.text:0047888C 10 00 BC 8F lw $gp, 0x20+var_10($sp)
Última coisa: encontrei um belíssimo
tutorial sobre MIPS Assembly, criado por um professor da
Central Connecticut State University chamado
Bradley Kjell. Aqui está o link:
http://programmedlessons.org/AssemblyTutorial/Na verdade é um curso programado para ser ministrado em 1 semestre na citada universidade. Pelo que pude perceber, a intenção foi criar um curso introdutório sobre Assembly, sendo que o processador escolhido foi o MIPS.
Curiosidade: vejam o que os alunos desse professor tem a dizer sobre ele.
Link:
http://www.ratemyprofessors.com/ShowRatings.jsp?tid=385487Ele recomenda que se use o
simulador de MIPS chamado
SPIM, para que se possa acompanhar os programas exemplos ao longo do tutorial. Testei o SPIM e é super simples de entender, e muito legal. Link do SPIM:
http://pages.cs.wisc.edu/~larus/spim.htmlEu tambei testei recentemente o
MIPS Assembler MARS da
Missouri State University, que eu havia recomendado alguns posts atrás:
http://courses.missouristate.edu/KenVollmar/MARS/Achei muito interessante esse Assembler, que também é um simulador, e muito completo por sinal. Inclusive os programas do tutorial que recomendei acima podem ser executados no simulador do MARS (assim como no próprio SPIM, que é mais simples, e recomendado pelo autor).
Só pra finalizar, achei o
Assembler MARS muito bom:
a-) Tem o Syntax Highlighting, identificando instruções, labels, comentários, etc., cada um com uma cor.
b-) Tem aquela bem-vinda função de auto-preenchimento, ou seja, você começa a digitar um instrução, e o programa já oferece as várias opções para aquela(s) letra(s) incial(ais), inclusive dando uma rápida descrição de cada uma dessas instruções possíveis.
c-) Para salvar o binário (após o código-fonte ter sido montado), é só ir em Dump Memory, e escolher Binário: me parece que salva em Little Endian; é engraçado pois no próprio programa os 4 bytes das instruções aparecem da esquerda para direita, mas quando se faz o Dump Memory, o binário é salvo em Little Endian, da direita para esquerda (cada 4 bytes).
d-) É gratuito!
Parece que o MIPS oferece mais e melhores opções gratuitas que o ARM em termos de aprendizado e ferramentas...