Esse é o chamado "Subtitle Timing Bug"
Eis a explicação de como é feito, dada
no grupo MT13x9. Eu destaquei em vermelho o que é importante.
ROM:3370 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
ROM:3370
ROM:3370 ; R0 = string
ROM:3370 ; R1 = len of first value
ROM:3370 ; R2 = for pow(10)
ROM:3370
ROM:3370 get_time_from_string
ROM:3370
ROM:3370
ROM:3370 var_18 = -0x18
ROM:3370
ROM:3370 F8 B5 PUSH {R3-R7,LR}
ROM:3372 0E 1C ADD R6, R1, #0 ; R6 = R1 = len of
first value
ROM:3374 04 1C ADD R4, R0, #0 ; R4 = R0 = string
ROM:3376 15 1C ADD R5, R2, #0 ; R5 = R2 = pow
ROM:3378 31 1C ADD R1, R6, #0 ; R1 = len of first
value
ROM:337A 20 1C ADD R0, R4, #0 ; R0 = string
ROM:337C FF F7 E6 FF BL tonumber ; In:
ROM:337C ; R0 = Source
ROM:337C ; R1 = Len
ROM:337C ;
ROM:337C ; Out:
ROM:337C ; R0 = Number
ROM:337C
ROM:3380 00 90 STR R0, [SP,#0x18+var_18] ; sp+#x18+var18
= hour
ROM:3382 A4 19 ADD R4, R4, R6
ROM:3384 60 1C ADD R0, R4, #1 ; skip ':'
ROM:3386 02 21 MOV R1, #2 ; ??:XX:xx,???
ROM:3388 FF F7 E0 FF BL tonumber ; In:
ROM:3388 ; R0 = Source
ROM:3388 ; R1 = Len
ROM:3388 ;
ROM:3388 ; Out:
ROM:3388 ; R0 = Number
ROM:3388
ROM:338C 06 1C ADD R6, R0, #0 ; R6 = minutes
ROM:338E 20 1D ADD R0, R4, #4
ROM:3390 02 21 MOV R1, #2 ; ??:xx:XX,???
ROM:3392 FF F7 DB FF BL tonumber ; In:
ROM:3392 ; R0 = Source
ROM:3392 ; R1 = Len
ROM:3392 ;
ROM:3392 ; Out:
ROM:3392 ; R0 = Number
ROM:3392
ROM:3396 07 1C ADD R7, R0, #0 ; R7 = seconds
ROM:3398 E0 1D ADD R0, R4, #7 ; ??:xx:xx,XX
ROM:339A *******************
ROM:339A * Patch this with for fix timing bug
ROM:339A *
ROM:339A * Original: 02 21 MOV R1, #2
ROM:339A * New: 29 1C ADD R1, R5, #0
ROM:339A *******************
ROM:339A 02 21 MOV R1, #2 ; <<< BUG!!!
ROM:339C FF F7 D6 FF BL tonumber ; In:
ROM:339C ; R0 = Source
ROM:339C ; R1 = Len
ROM:339C ;
ROM:339C ; Out:
ROM:339C ; R0 = Number
ROM:339C
ROM:33A0 02 1C ADD R2, R0, #0 ; R3 = x/100 seconds
ROM:33A2 01 20 MOV R0, #1
ROM:33A4 00 21 MOV R1, #0
ROM:33A6 02 E0 B test_to_complete
ROM:33A6
ROM:33A8 ; -----------------------------------------------
----------------------------
ROM:33A8 ; R0 = pow( 10, R5 )
ROM:33A8
ROM:33A8 loop
ROM:33A8 0A 23 MOV R3, #0xA
ROM:33AA 58 43 MUL R0, R3
ROM:33AC 01 31 ADD R1, #1
ROM:33AE
ROM:33AE test_to_complete
ROM:33AE A9 42 CMP R1, R5
ROM:33B0 FA D3 BCC loop
ROM:33B0
ROM:33B2 E1 23 MOV R3, #0xE1 ; 'ß'
ROM:33B4 00 99 LDR R1, [SP,#0x18+var_18]
ROM:33B6 1B 01 LSL R3, R3, #4 ; 3600
ROM:33B8 59 43 MUL R1, R3 ; R1 = hours * 3600
ROM:33BA 3C 23 MOV R3, #0x3C ; '<' ; 60
ROM:33BC 73 43 MUL R3, R6 ; R3 = minutes * 60
ROM:33BE C9 18 ADD R1, R1, R3 ; R1 = ( hours *
3600 ) + ( minutes * 60 )
ROM:33C0 C9 19 ADD R1, R1, R7 ; R1 = ( hours *
3600 ) + ( minutes * 60 ) + seconds
ROM:33C2 41 43 MUL R1, R0 ; R1 = ( ( hours *
3600 ) + ( minutes * 60 ) + seconds ) * multipler
ROM:33C4 8C 18 ADD R4, R1, R2 ; R4 = "x/100"
seconds + ( ( ( hours * 3600 ) + ( minutes * 60 ) + seconds ) *
multipler )
ROM:33C6 B6 49 LDR R1, =loc_15F90
ROM:33C8 22 F0 94 F8 BL sub_254F4
ROM:33C8
ROM:33CC 60 43 MUL R0, R4
ROM:33CE F8 BC POP {R3-R7}
ROM:33D0 08 BC POP {R3}
ROM:33D2 18 47 BX R3
ROM:33D2
ROM:33D2 ; End of function get_time_from_string
ROM:33D2
Foi a explicação acima que eu segui, mas ficará mais fácil se você seguir a explicação que jmaraujo deu no meu blog, que está bem mais "amigável". Pena que chegou depois de eu ter ralado bastante para entender e aplicar a original:
Olá, Jefferson! Faça o seguinte (o resto do pessoal so faça isso se tiver um cabo serial/usb):
1) Abra o firmware com o Remaker.
2) Guarde o "ArmCodes".
3) Abra o arquivo .bin do ArmCodes com um editor hexadecimal.
4) Busque "F8 B5 0E 1C 04 1C 15 1C 31 1C 20 1C".
5) A partir de esse ponto busque "07 1C E0 1D 02 21 FF F7".
6) Troque "02 21" por "29 1C".
7) Guarde as mudanças.
8) Abra o MTK Remaker e carregue o ArmCodes modificado na seção correspondente do Remaker.
Agora é só guardar o firmware e carregar no aparelho.
Eu pretendo incluir isso no meu mtkmodtoolbox, mas ainda não fiz isso.
Editado: Me lembrei porque não fiz a inclusão no mtkModtoolbox. A alteração precisa ser feita na parte ARM do firmware, que é armazenada comprimida. Então fazer o patch é significativamente mais complicado, porque eu teria que extrair a seção ARM descompactando-a, fazer o patch e inserir de volta a seção recomprimindo-a. É fácil quando se sabe, mas eu não sei.
Uma alternativa é meu programa ter uma ajudinha dos programas MtkExtract e mtkReplacer do NewAge.