Finalmente, Sub_Style do DVP-3040KB1:EDC3 Sub_Style: ; CODE XREF: B1_DD81+3Ep
B1:EDC3 90 FB 46 mov DPTR, #XRAM_FB46
B1:EDC6 EE mov A, R6
B1:EDC7 F0 movx @DPTR, A
B1:EDC8 A3 inc DPTR
B1:EDC9 EF mov A, R7
B1:EDCA F0 movx @DPTR, A
B1:EDCB 7F 03 mov R7, #3
B1:EDCD 12 07 15 lcall B1_BS_178_B3_4B4F
B1:EDD0 7F 01 mov R7, #1
B1:EDD2 12 07 15 lcall B1_BS_178_B3_4B4F
B1:EDD5 7F 03 mov R7, #3
B1:EDD7 12 F3 52 lcall B1_F352
B1:EDDA 7B FF mov R3, #0xFF
B1:EDDC 7D EB mov R5, #0xEB ; 'Ù'
B1:EDDE 7C 01 mov R4, #1
B1:EDE0 74 01 mov A, #1
B1:EDE2 FF mov R7, A
B1:EDE3 FE mov R6, A
B1:EDE4 12 06 5B lcall OSD_DISpMSG2_B1BS
B1:EDE7 7F 0E mov R7, #0xE
B1:EDE9 12 06 F1 lcall B1_BS_172_B4_EE0F
B1:EDEC 12 D4 17 lcall SetMeg4SubtitleParams
B1:EDEF 7F 11 mov R7, #0x11
B1:EDF1 12 08 17 lcall OSD_TextInit_B1BS
B1:EDF4 7F 11 mov R7, #0x11
B1:EDF6 12 08 1D lcall B1_BS_222_B3_EFBB
B1:EDF9 22 ret
B1:EDF9 ; End of function Sub_Style
Note a chamada para SetMeg4SubtitleParams.
Agora, o complemento (Sub_Style_2) em OSD_Text_Init:
B3:593C Sub_Style_2: ; DATA XREF: OSD_Text_Init+63o
B3:593C 90 FB 88 mov DPTR, #XRAM_FB88 ; FB88 sempre será 11 nesta rotina
B3:593F E0 movx A, @DPTR
B3:5940 FF mov R7, A
B3:5941 D2 45 setb RAM_28.5
B3:5943 12 28 40 lcall OSD_Text_Params_ARM
B3:5946 90 FB 88 mov DPTR, #XRAM_FB88 ; Armazena o número da janela (OSD_Text_Init)
B3:5949 E0 movx A, @DPTR
B3:594A FF mov R7, A
B3:594B 12 6C EF lcall OSD_Text_Params
B3:594E 90 FB 88 mov DPTR, #XRAM_FB88 ; Armazena o número da janela (OSD_Text_Init)
B3:5951 E0 movx A, @DPTR
B3:5952 FF mov R7, A
B3:5953 E4 clr A
B3:5954 90 FB A5 mov DPTR, #XRAM_FBA5 ; OSD_Colors
B3:5957 F0 movx @DPTR, A
B3:5958 A3 inc DPTR
B3:5959 74 02 mov A, #2
B3:595B F0 movx @DPTR, A
B3:595C 7B 03 mov R3, #3
B3:595E E4 clr A
B3:595F FD mov R5, A
B3:5960 12 D1 B9 lcall OSD_Text_Color
B3:5963 90 FB 88 mov DPTR, #XRAM_FB88 ; Armazena o número da janela (OSD_Text_Init)
B3:5966 E0 movx A, @DPTR
B3:5967 FF mov R7, A
B3:5968 E4 clr A
B3:5969 FD mov R5, A
B3:596A 02 EC 82 ljmp OSD_TextInit_END
Note que é a mesma rotina encontrada no DVP5100. Eu já testei o suporte ao patch para a mudança de cor da fonte e funcionou como esperado. Mudando esta rotina podemos ter fontes normais também para o DVP_3040K.
Sub_Style chama uma versão estranha de
SetMpeg4SubtitleParams, que é uma mistura da rotina que já conhecemos, com as rotinas de escolha de fontes da Philips:
B1:D417 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
B1:D417
B1:D417
B1:D417 SetMeg4SubtitleParams: ; CODE XREF: Sub_Style+29p
B1:D417 ; BankSw_335_B1_F4CB:B1_F7D9p
B1:D417 E4 clr A
B1:D418 90 FB ED mov DPTR, #XRAM_FBED ; Coordenada Horizontal (HI)
B1:D41B F0 movx @DPTR, A
B1:D41C A3 inc DPTR
B1:D41D F0 movx @DPTR, A
B1:D41E 90 FB F0 mov DPTR, #XRAM_FBF0 ; Coordenada Vertical (HI)
B1:D421 F0 movx @DPTR, A
B1:D422 A3 inc DPTR
B1:D423 F0 movx @DPTR, A
B1:D424 90 FB F4 mov DPTR, #XRAM_FBF4 ; wX2.high
B1:D427 74 02 mov A, #2
B1:D429 F0 movx @DPTR, A
B1:D42A A3 inc DPTR
B1:D42B 74 30 mov A, #0x30 ; '0' ; 0x230=560
B1:D42D F0 movx @DPTR, A
B1:D42E 90 FB F8 mov DPTR, #XRAM_FBF8 ; wY2.high (define a altura)
B1:D431 E4 clr A
B1:D432 F0 movx @DPTR, A
B1:D433 A3 inc DPTR
B1:D434 74 60 mov A, #0x60 ; '`' ; Altura da janela
B1:D436 F0 movx @DPTR, A
B1:D437 E4 clr A
B1:D438 FD mov R5, A
B1:D439 7F 17 mov R7, #0x17
B1:D43B 7E 01 mov R6, #1
B1:D43D 12 05 F5 lcall ARM_PutChar_B1BS
B1:D440 7F 03 mov R7, #3 ; Este ponto define a fonte usada nas legendas
B1:D442 12 08 4D lcall OSD_SetFont?_B1BS
B1:D445 E4 clr A
B1:D446 90 FB 5F mov DPTR, #XRAM_FB5F ; Espaço entre linhas
B1:D449 F0 movx @DPTR, A
B1:D44A 7B 09 mov R3, #9 ; 9=Todos 256 caracteres + Bottom align
B1:D44C 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro), 0x02 (Direita)
B1:D44E 7F 11 mov R7, #0x11 ; Janela da legenda
B1:D450 12 92 42 lcall PSB_Set_Param
B1:D453 7F 59 mov R7, #0x59 ; 'Y' ; Verifica "DivX Subtitle" na eeprom
B1:D455 7E 00 mov R6, #0
B1:D457 12 04 E7 lcall Pref_Getchar_B1BS
B1:D45A EF mov A, R7 ; A sempre será zero
B1:D45B 24 FE add A, #0xFE ; '¦'
B1:D45D 60 11 jz B1_D470 ; Dependendo da fonte, faria uma outra escolha de parâmetros
B1:D45F 14 dec A
B1:D460 60 09 jz B1_D46B
B1:D462 24 02 add A, #2
B1:D464 70 18 jnz B1_D47E
B1:D466 7F 05 mov R7, #5
B1:D468 02 08 4D ljmp OSD_SetFont?_B1BS
B1:D46B ; ---------------------------------------------------------------------------
B1:D46B
B1:D46B B1_D46B: ; CODE XREF: SetMeg4SubtitleParams+49j
B1:D46B 7F 07 mov R7, #7
B1:D46D 02 08 4D ljmp OSD_SetFont?_B1BS
B1:D470 ; ---------------------------------------------------------------------------
B1:D470
B1:D470 B1_D470: ; CODE XREF: SetMeg4SubtitleParams+46j
B1:D470 E4 clr A ; Este trecho nunca é chamado, porque o número da fonte nunca coincide
B1:D471 90 FB 5F mov DPTR, #XRAM_FB5F ; Espaço entre linhas
B1:D474 F0 movx @DPTR, A
B1:D475 7B 01 mov R3, #1
B1:D477 7D 01 mov R5, #1 ; alinhamento = 0x00 (esquerda), 0x01 (Centro)
B1:D479 7F 11 mov R7, #0x11 ; Janela da legenda
B1:D47B 12 92 42 lcall PSB_Set_Param
B1:D47E
B1:D47E B1_D47E: ; CODE XREF: SetMeg4SubtitleParams+4Dj
B1:D47E 22 ret
B1:D47E ; End of function SetMeg4SubtitleParams
Note o ponto destacado em vermelho. Mudando seu valor podemos escolher a fonte usada nas legendas Eu já testei selecionando duas fontes mas talvez não dê para selecionar muito mais que isso por causa da limitação no tamanho deste firmware, que só pode ter até 1MB.
A seleção de fontes, como no DVP5960 e no DVP5965, está completamente desativada porque o valor na eeprom é sempre zero. Apagando o código inoperante deve sobrar espaço suficiente em SetMeg4SubtitleParams para fazer o patch de escolha de altura. Por sorte, existe também bastante espaço livre no banco 2 que podemos usar para criar um menu de seleção de fontes e cores tão comlpeto quanto o que fiz para o Proview DVP-858. Faltam apenas os endereços de eeprom extras para armazenar a cor e a altura.