vanhiep89c51@yahoo.com Or vanhiep89c51@gmail.com |
| | Hướng dẫn Viết Patch cho SL45.... | |
| | Tác giả | Thông điệp |
---|
pth1008
Tổng số bài gửi : 13 Join date : 04/10/2008 Age : 115 Đến từ : co^?mo^.
| Tiêu đề: Hướng dẫn Viết Patch cho SL45.... Thu Oct 30, 2008 1:08 am | |
| Hướng dẫn Viết Patch cho SL45 ....
Đầu tiên mọi người nên hiểu về cách thức patch, các patch cho SL sửa các lệnh thực thi trong firmware tại một vị trí nào đó để trỏ đến patch của ta, thực hiện xong rồi quay lại thực hiện tiếp các lệnh tiếp theo. Việc tìm đúng vị trí này quả thực rất khó, cần có kiến thức về vi điều khiển, debug... nên các patch chủ yếu mình dựa vào các patch có sãn rồi sửa lại theo ý mình.
Datasheet IC của Infineon sử dụng trong SL: http://www.keil.com/dd/docs/datashts...on/c166ism.pdf Mọi người đọc qua để tìm hiểu về các tập lệnh. Các lệnh hay dùng là MOV, CMP, JMPR/JMPS, CALL...
ASM và DIS-ASM Các patch chủ yếu được viết bằng ngôn ngữ Assembler, thích C thì cần một cái Compiler hỗ trợ chíp trên (ko biết cái nào).
Với ASM, có 1 công cụ tuyệt vời của (master!) RizaPN sfe: Siemens Flash Explorer. Đọc file help của nó để biết cách sử dụng. Biên dịch: Code: sfe a src.asm sfe a src.asm p v56.bin > mypatch.vkp v56.bin là firmware gốc của v56 (hoặc firm bạn đang dùng), lệnh thứ 2 sẽ tạo 1 file VKP, với đủ dữ liệu cũ trên firmware và dữ liệu mới cập nhật theo địa chỉ. ví dụ: Code: 0x3BA188: 46F13E00 FAE0307C Khi disasm một patch, lưu ý là nên copy toàn bộ patch vào một dòng Ví dụ với patch Functions of Side keys (+/-) in SMS editor Code: 0x3A7BDC: 46FE2F00 FABF6070 0x1F7030: FFFF 46FE 0x1F7032: FF 0D ;"-" key 0x1F7033: FFFFFFFFFFFFFFFFFFFFFFFFFF 002D0446FE2F00FADAE07BE6FC 0x1F7040: FFFFFFFFFFFFFFFFFFFFFF E835E6FD0E00E6FEB400E0 0x1F704b: FF 5F ;5F:save SMS, 3F:send immediately 0x1F704C: FFFFFFFF DAC188AB 0x1F7050: FFFFFFFF FADA507C
0x1F7060: FFFF 46FE 0x1F7062: FF 0e ;"+"key 0x1F7063: FFFFFFFFFFFFFFFFFFFFFFFFFF 002D04FABF3070FADAE07BE6FC 0x1F7070: FFFFFFFFFFFFFFFFFFFFFF E835E6FD0E00E6FEB400E0 0x1F707b: FF 3F ;3F:send immediately (or 4F), 5F:save SMS 0x1F707c: FFFFFFFF DAC188AB 0x1F7080: FFFFFFFF FADA507C thì ta chỉ copy chuỗi từ 46FF...507C, kô có phần byte cũ (FF..FF) rồi disasm chuỗi đó. Do patch này có 2 phần nên ta sẽ chia làm 2 Code: > sfe d 46FE0D002D0446FE2F00FADAE07BE6FCE835E6FD0E00E6FEB400E05FDAC188ABFADA507C
000000: 46 FE 0D 00 : cmp r14, #0Dh 000004: 2D 04 : jmpr cc_Z, loc_00000E 000006: 46 FE 2F 00 : cmp r14, #2Fh 00000A: FA DA E0 7B : jmps 0DAh, loc_DA7BE0 ;------------------------------------------------------------ 00000E: E6 FC E8 35 : loc_00000E: 00000E: E6 FC E8 35 : mov r12, #35E8h 000012: E6 FD 0E 00 : mov r13, #0Eh 000016: E6 FE B4 00 : mov r14, #0B4h 00001A: E0 5F : mov r15, #5 00001C: DA C1 88 AB : calls 0C1h, loc_C1AB88 000020: FA DA 50 7C : jmps 0DAh, loc_DA7C50 ;------------------------------------------------------------
> sfe d 46FE0e002D04FABF3070FADAE07BE6FCE835E6FD0E00E6FEB400E03FDAC188ABFADA507C
000000: 46 FE 0E 00 : cmp r14, #0Eh 000004: 2D 04 : jmpr cc_Z, loc_00000E 000006: FA BF 30 70 : jmps 0BFh, loc_BF7030 ;------------------------------------------------------------ 00000A: FA DA E0 7B : jmps 0DAh, loc_DA7BE0 ;------------------------------------------------------------ 00000E: E6 FC E8 35 : loc_00000E: 00000E: E6 FC E8 35 : mov r12, #35E8h 000012: E6 FD 0E 00 : mov r13, #0Eh 000016: E6 FE B4 00 : mov r14, #0B4h 00001A: E0 3F : mov r15, #3 00001C: DA C1 88 AB : calls 0C1h, loc_C1AB88 000020: FA DA 50 7C : jmps 0DAh, loc_DA7C50 ;------------------------------------------------------------
Ta tìm hiểu chút về patch này. Ban đầu nó sửa: Code: 46 FE 2F 00 : cmp r14, #2Fh thành FA BF 60 70 : jmps 0BFh, loc_BF7060 Tức là thay vì dùng lệnh so sánh thanh ghi R14 với 2Fh, nó sẽ nhảy tới địa chỉ BF7060. Chính là địa chỉ 0x1F7060: FFFF 46FE. Trong firmware code thực hiện từ địa chỉ gốc 0A00000h nên BF7060 là 1F7060 khi patch vào firm, tương tự C, D, E tương ứng với 2, 3, 4... Và chú ý là có sự đảo byte của địa chỉ khi được disasm so với mã hexa trong firm FABF6070 (FA là jmps) Khi disasm bằng SFE, nó đề địa chỉ từ 000000 vì ta chưa khai báo base address cho nó (xem trong help) Tiếp tục, đọc patch ta tự hiểu r14 đang chứa giá trị của phím SL được nhấn. OE là "+", OD là "-" Nếu bằng sẽ nhảy tới loc_00000E (jmpr là nhảy tới vị trí tương đối so với vị trí hiện tại). Tại chỗ này, các lệnh mov sẽ đưa vào thanh ghi những giá trị thích hợp (!) rồi gọi chương trình con ở C1AB88, chạy xong sẽ nhảy lại vị trí đầu khi ta patch, DA7C50 tức 3A7C50. Còn hỏi tại sao lại là những giá trị và địa chỉ đó thì mình chịu, phải xem và hiểu phần code gốc của SL. Còn không bằng sẽ tiếp nhảy tới loc_BF7030, tức là phần trên của patch, phần patch này lại so sánh với 0Dh, nếu không bằng sẽ so sánh tiếp với #2Fh (lệnh mà ta đã sửa để nhảy tới patch của ta) sau đó nhảy về... Viết 1 patch cho SL Ta sẽ viết lại patch Side key trên để thêm chức năng cho nó Code: #define SMS_func 0C1AA30h ; Định nghĩa hàm (có từ patch ban đầu)
base 0A00000h ; Khai báo địa chỉ đầu
org 0DA7BDCh ; Địa chỉ để patch, cho nhảy tới label sidemain jmps sidemain
org 0E0C6E0h ; 1 Địa chỉ trống trong firm sidemain: cmp r14, #62h ; Phím Play jmpr cc_Z, sidekey_1 cmp r14, #0Dh ; Phím [-] jmpr cc_Z, sidekey_2 cmp r14, #0Eh ; Phím [+] jmpr cc_Z, sidekey_3 cmp r14, #8 ; Phím Record jmpr cc_Z, sidekey_4 cmp r14, #2Fh ; Không có những phím nào như trên được nhấn jmps 0DA7BE0h
sidekey_1: ; Play: gửi sms (có từ patch ban đầu) mov r12, #35E8h mov r13, #0Eh mov r14, #0B4h mov r15, #3 calls SMS_func jmps 0DA7C50h
sidekey_2: ;[-] -> chưa sử dụng (đang comment) ; calls xxxxxxxx jmps 0DA7C50h
sidekey_3: ;[+] -> chưa sử dụng (đang comment) ; calls xxxxxxxx jmps 0DA7C50h
sidekey_4: ;Record: nhớ sms mov r12, #35E8h mov r13, #0Eh mov r14, #0B4h mov r15, #5 calls SMS_func jmps 0DA7C50h Với lệnh ở sidekey_2, mình chưa sử dụng, ở đây ta sẽ calls một ch trinh con. Ví dụ để chuyển đảo trạng tái của đèn, ta thấy ở bảng sau là entrypoint DADC8046 DA chính là CALLS, do vậy hàm ta cần ở đây là Code: calls 0DC4680h Tuy nhiên không phải hàm nào cũng sử dụng được, rất nhiều cái bị conflict làm tắt máy. Để tìm địa chỉ trống trong firm, ta dùng Code: > sfe 0 56.bin
0x1B0120: free 0x041268 bytes ... 0x1B0120 tức 0BB0120h. Hoặc dùng địa chỉ của patch cũ.
Xong, compile và test Code: sfe a sidekey.asm p 56.bin > sidekey.vkp Một số entrypoint: Quote: DAD8B4E1 Java DAD8B8E1 Internet DAD8C4E1 Grajek MP3 DAD8CAE1 Karta MMC DAD8CEE1 Chronometer DAD8D6E1 Currency DAD8DAE1 Gry DADB3CEF Ks. Adresowa na MMC DADB46EF Ks. Adresowa na SIM DADB50EF Kalendarz DADB5CEF Przypomnienia DADB68EF Dyktafon DADB6CEF Answer-Message DADB70EF BussinessCard DADB7CEF Kalkulator DADB80EF VoiceControl DADB80F2 Call-Missed DADB84F2 Call-Received DADB88F2 Call-Dialed DADB8CF2 Alarm-Missed DADC1606 Compose-Melody DADC0479 Gra-SuperMind DADC1079 Gra-MoveTheBox DADC1479 Gra-Wacko DADC0879 Gra-HomeRun DADCFC78 Gra-Reversi DADC0079 Gra-Quattropoli DADC0C79 Gra-TheMaze DAD9620A Pisz nowego SMS'a DAD9EE0A Skrzynka Odbiorcza DAD9F80A Skrzynka Nadawcza DAD9020B Archiwum DADC1242 Kontast DAD55AF2 Jêzyk DAD56AF2 Pod¶wietlenie DAD582F2 T9-Jêzyk
DADBF886 - Mp3-player(autoplay) DADC8046 - Illumination(toggle) DAD414F3 - Dyktafon - Nagrywaj DAE6F8A9 - Voice Dial DADCE82B - AutoKeyLock(toggle) DADA169E - GSM-900 DADA269E - GSM-1800 DADA069E - AutoBand DADC5A52 - Erase Records(Menu/Setup/Status/...) DADCE846 - IrDA (toggle) DAA44A98 - Nie ma ¿adnego profilu ustawionego
DAC23A4F - w³±czanie telefonu DAC24A4F - wy³±czanie telefonu
DAE8DC2B - Auto Keylock Setup/Device/Keyboard DAC23A4F lub 6 znakowy C24F3A - restart telefonu
DAC00600 : Light on DAC00E00 : Light off Mã phím Quote: 5C : UPPER LEFT 05 : GREEN 01 : RED 03 : UPPER RIGHT
22 : RIGHT ARROW 20 : DOWN ARROW 21 : UP ARROW 23 : LEFT ARROW
13 : * 14 : # 15 : DIGIT 0-9 1F : LONG #
0E : LEFT SIDE + 0D : LEFT SIDE - 62 : LEFT SIDE PLAY SourceCode các patch của RizaPN: http://www.geocities.com/rizapn/ http://www.orbitfiles.com/download/id2686258942.html http://www.orbitfiles.com/download/id2686235268.html
Nên thảm khảo các bài viết trên http://www.gsmhosting.com/vbb/forumdisplay.php?f=341 | |
| | | pth1008
Tổng số bài gửi : 13 Join date : 04/10/2008 Age : 115 Đến từ : co^?mo^.
| Tiêu đề: Re: Hướng dẫn Viết Patch cho SL45.... Thu Oct 30, 2008 1:10 am | |
| Tạo selectable cho 1 patch Cần có patch APP. Application Menu v3a Corrected
Ví dụ patch: Code: ;*** NSM. No Softkeys on Mainscreen v0.4 *** (c) Seklth, abomin 0x20E018: DAC14C4A DAC7D0D2 0x27D2D0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D7503400F3F41B3E3D02DAC14C4ADB00
;Add: show buttons in dictafone etc ;Unistall MBT.Menu Button Text
0x20E424: DAE6F854 DAC760E9 0x27E960: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E7F4000046FCA0013D02E7F41000D740 0x27E970: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 3400F7F41B3EFAE6F854FFFFFFFFFFFF
;Small Pictures 20DD17: 02 05 20E04C: F2FD0EFE E6FD0000 20E034: EA90DEE0 CC00CC00
;Pictures 8x11 (...) Vì patch này patch nhiều địa chỉ, nên ta chỉ lấy ví dụ với phần đầu của patch: Code: >sfe d D7503400F3F41B3E3D02DAC14C4ADB00 27D2D0
27D2D0: D7 50 34 00 : extp #34h, #2 27D2D4: F3 F4 1B 3E : movb rl2, mem_D3E1B ; (0034:3E1B) 27D2D8: 3D 02 : jmpr cc_NZ, loc_27D2DE 27D2DA: DA C1 4C 4A : calls 0C1h, loc_C14A4C 27D2DE: DB 00 : loc_27D2DE: 27D2DE: DB 00 : rets ;------------------------------------------------------------ Ta bổ sung và sửa lại đoạn địa chỉ 0x27D2D0 như sau: Code: base 0A00000h
org 0C7D2D0h ;0x27D2D0 ; Địa chỉ patch mov [-r0], r12 ; Backup r12, có thể dùng thanh ghi khác extp #0Eh, #1 ; (000E:3A42): Profile1. mov r12, 3A42h ; Có thể dùng Profile2: thay #OEh bằng #36h, 34A2h bằng 096Ch ; Profile3: 36/096E jb r12.1, patch_start ; 1 là STT function (từ 0). Ở đây là Function 2 ; thay jb bằng jnb nếu muốn thực hiện khi Function không đc chọn ; (Hoặc có thể ngược lại, lâu quên mất) mov r12, [r0+] ; Trả giá trị r12 về giá trị ban đầu jmpr cc_UC, patch_end ; Nhảy không điều kiện ; Do patch ban đầu kết thúc là rets, có thể thay dùng rets luôn ở đây ; (Một số patch phải dùng Jmps nhưng đa số các patch đều là rets vì ban đầu dùng DA (calls))
patch_start: ; Patch ban đầu mov r12, [r0+] ; Thêm: Trả giá trị r12 về giá trị ban đầu ; Trong patch gốc nó ghi đè lên r12 nên ta có thể không cần dòng này. extp #34h, #2 movb rl2, 3E1Bh ; (0034:3E1B) jmpr cc_NZ, patch_end ; Địa chỉ tương đối (Địa chỉ kết thúc của Patch ban đầu) calls 0C14A4Ch ; Địa chỉ tuyệt đối patch_end: rets Compile rồi so sánh với patch đầu Code: 88C0D7400E00F2FC423A8AFC021098C00D0898C0D7503400F3F41B3E3D02DAC14C4ADB00 patch ban đầu: D7503400F3F41B3E3D02DAC14C4ADB00 Phần sau tương tự, nhưng nhớ bỏ phần FFFFF... khi disasm (E7F40...6F854)
Trên đây chỉ là cách áp dụng cho những patch đơn giản, với những patch phức tạp và dài, ta sửa dòng jmpr cc_UC, patch_end thành rets, compile và chú ý phần được thêm vào Code: 88C0D7400E00F2FC423A8AFC021098C0DB0098C0 Để ý: 0E 423A 8A và 1 0E: profile1 (profile2,3 là 36) 423A: profile1 (profile2: 6C09 profile3: 6E09) 8A: checked (9A - unchecked) 1: STT (0-F tương ứng Function 1 - 16)
Như vậy ta chỉ cần thêm đoạn trên vào patch ban đầu, sửa chút địa chỉ trong file VKP cho phù hợp khi thêm chuỗi trên (vì patch theo địa chỉ, nên ta phải tịnh tiến patch cũ lên bằng độ dài phần thêm vào). Phải nhắc lại là cách này không áp dụng cho tất cả các patch. Base of xxx patches Patch này tạo cho ta những slot để có thể thêm vào phần gọi tới patch của ta Code: ;***Base of mainscreen patches*** 0x3B3A1E: 46F8FFFF DAE090DB
40DB90: FFFFFFFF DAE020CC ;Switch battery in percent/voltage 40DB94: FFFFFFFF DAC790D6 ;Profile Logo 40DB98: FFFFFFFF CC00CC00 ; Đặt địa chỉ patch tại đây 40DB9C: FFFFFFFF CC00CC00 ;(ví dụ như 2 cái trên hoặc thêm mấy cái indicator nữa 40DBA0: FFFFFFFF CC00CC00 40DBA4: FFFFFFFF CC00CC00 40DBA8: FFFFFFFF CC00CC00 40DBAC: FFFFFFFF 46F8FFFF ; cần thiết trc khi trở về 40DBB0: FFFF DB00 ; return Hiện tại có Base of mainscreen patches và Base of mp3 patches.
Nếu ai đã đọc file sl45.inc của RizaPN, sẽ thấy rất nhiều hàm cũng như những địa chỉ rất hay trong bộ nhớ (như thông tin về nhiệt độ, volt pin, thời gian) Tuy nhiên để có thể khai thác hết được đối với mình rất khó, chỉ sử dụng được một số nhỏ trong đó, tiêu biểu là hàm hiện ảnh, hàm hiện chữ và vẽ hình cn | |
| | | pth1008
Tổng số bài gửi : 13 Join date : 04/10/2008 Age : 115 Đến từ : co^?mo^.
| Tiêu đề: Re: Hướng dẫn Viết Patch cho SL45.... Thu Oct 30, 2008 1:11 am | |
| DrawImageIdx Hàm có tác dụng hiện 1 ảnh trong firm (như khi sử dụng SPC, với giá trị index ảnh, tọa độ X, tọa độ Y là đầu vào) Code: #define drawImgIdx 0C122ECh Để biết cách sử dụng, ta xem ví dụ patch Battery in percent Code: 40CACE: 88 70 : mov [-r0], r7 ; Lưu lại giá trị r7 40CAD0: D7 40 0E 00 : extp #0Eh, #1 ; Trỏ tới vùng nhớ 40CAD4: F2 F7 E2 39 : mov r7, 3B9E2h ; Lấy giá trị tại địa chỉ wBattVoltage (0Eh:39E2h) cho vào r7 40CAD8: E6 FD 10 0E : mov r13, #0E10h ; r13 = 3600 (0E10h = 3600d) (thiết lập giá trị nhỏ nhất mV) 40CADC: 20 7D : sub r7, r13 ; r7 - r13 40CADE: 9D 03 : jmpr cc_NC, loc_40CAE6 ; nhảy tới 40CAE6 nếu không có cờ nhớ (tức r7 > r13)
40CAE0: E6 FE 01 02 : mov r14, #201h ; r14 = index ảnh đầu tiên (ảnh số 0) 40CAE4: 0D 28 : jmpr cc_UC, loc_40CB36 ; nhảy tới 40CB36 (chỉ vẽ từ số hàng đơn vị) ;------------------------------------------------------------ 40CAE6: E6 FC 3F 02 : loc_40CAE6: 40CAE6: E6 FC 3F 02 : mov r12, #23Fh ; r12 = 575 (đây là khoảng giá trị giữa Max và Min. 3600 + 575 = 4175 mV) 40CAEA: E6 FD 64 00 : mov r13, #64h ; r13 = 100 40CAEE: 1B 7D : mulu r7, r13 ; r7 * 100 40CAF0: 5B CC : divu r12 ; / 575 40CAF2: F2 F7 0E FE : mov r7, mem_FE0E ; 0FE0Eh chính là byte MDL (byte thấp lưu kết quả phép tính) 40CAF6: 46 F7 64 00 : cmp r7, #64h ; So sánh với 100 40CAFA: 8D 0A : jmpr cc_C, loc_40CB10 ; nhảy nếu nhỏ hơn (chỉ vẽ từ hàng chục)
40CAFC: 26 F7 64 00 : sub r7, #64h ; Trừ 100 40CB00: E6 FE 02 02 : mov r14, #202h ; *** r14 lưu giá trị Index ảnh (#514) *** 40CB04: E6 FC 4B 00 : mov r12, #4Bh ; *** r12 là tọa độ X (75 / 101) *** 40CB08: E6 FD 00 00 : mov r13, #0 ; *** r13: tọa độ Y (0 / 80) *** 40CB0C: DA C1 EC 22 : calls 0C1h, loc_C122EC ; *** Thực hiện vẽ ảnh DrawImageIdx #514 (1 - số hàng trăm) ***
40CB10: E0 0E : loc_40CB10: 40CB10: E0 0E : mov r14, #0 ; Tiếp tục vẽ hàng chục 40CB12: 26 F7 0A 00 : loc_40CB12: 40CB12: 26 F7 0A 00 : sub r7, #0Ah ; r7 -= 10 40CB16: 8D 02 : jmpr cc_C, loc_40CB1C ; Nếu phép trừ nhỏ hơn 0 thì nhảy tới 40CB1C 40CB18: 08 E1 : add r14, #1 ; r14++ 40CB1A: 0D FB : jmpr cc_UC, loc_40CB12 ; quay lại cho đến khi r14 bằng số hàng chục (chẳng hiểu sao tác giả dùng cách này) ;------------------------------------------------------------ 40CB1C: 06 F7 0A 00 : loc_40CB1C: 40CB1C: 06 F7 0A 00 : add r7, #0Ah ; r7 += 10
40CB20: 06 FE 01 02 : add r14, #201h ; r14 cộng với #201h ra index ảnh tương ứng 40CB24: E6 FC 51 00 : mov r12, #51h 40CB28: E6 FD 00 00 : mov r13, #0 40CB2C: DA C1 EC 22 : calls 0C1h, loc_C122EC ; Vẽ số hàng chục
40CB30: E6 FE 01 02 : mov r14, #201h ; r14 = #201h 40CB34: 00 E7 : add r14, r7 ; r14 += r7 40CB36: E6 FC 57 00 : loc_40CB36: 40CB36: E6 FC 57 00 : mov r12, #57h 40CB3A: E6 FD 00 00 : mov r13, #0 40CB3E: DA C1 EC 22 : calls 0C1h, loc_C122EC ; Vẽ số hàng đơn vị
40CB42: E6 FE 45 01 : mov r14, #145h 40CB46: E6 FC 5D 00 : mov r12, #5Dh 40CB4A: E6 FD 00 00 : mov r13, #0 40CB4E: DA C1 EC 22 : calls 0C1h, loc_C122EC ; ảnh "%"
40CB52: 98 70 : mov r7, [r0+] ; Trả giá trị r7 về giá trị trc khi thực hiện patch 40CB54: DB 00 : rets ; return từ lệnh calls ;------------------------------------------------------------ Ngoài ra còn nhiều hàm nữa, các thread về SL45 trên GSM hosting (đặc biệt là Patching: Technical Discussion) thực sự rất có ích. Ngoài ra mọi người chịu khó disasm các patch, cố gắng hiểu nó làm gì và bắt chước, mình cũng mất rất nhiều thời gian, nhưng chẳng có ai có thể hỏi đc nên cũng kô biết làm cách nào khác (và thực sự mình chưa hiểu sâu đc, rất nhiều thứ phải bó tay). Nếu biết tiếng Trung có thể tham gia vào 1 số diễn đàn của bọn TQ, http://bbs.0110.cn thì phải, chẳng nhớ nữa. Bọn nó toàn làm về v55, nhưng cũng gần giống
Để hiểu thêm về firmware SL, vào trang http://mamaich.uni.cc/ tìm phần SL45 có cái file Disasm toàn bộ firm và một số chú thích (chỉ một số!) và một số file khác. File fw5601.rar cởi nén rồi view bằng IDA 4.8 (bản 5.0 không đc) - Up mãi mới xong.. Nếu ai đã dùng Patch Battery in percent cùng với hình nền, chắc hẳn thấy cái ảnh của nó lấn vào phần nền (do chiều cao lớn) Không biết đã ai nói chưa, nhưng cách khắc phục của mình là dùng SPC3 (hoặc Smelter), tìm đến cái ảnh đó, ta sẽ thấy địa chỉ PIT Address Ví dụ #513 là 0x004BB4BE Kích cỡ ảnh được lưu trong firm như sau: 4BB4BE: 0609 -> chiều rộng 6 và chiều cao 9 (chú ý đơn vị trên hệ hexa) Như vậy ta có thể dùng VKlay chỉnh lại kích cỡ ảnh: Code: 4BB4BE: 0609 0607 ; Đặt chiều rộng là 6, chiều cao là 7 Khi chỉnh lại kích cỡ thì ảnh cũng bị thay đổi, do đó lại dùng SPC để đổi lại ảnh (mình dùng VKlay up patch vào file firm trên ổ cứng, rồi load sửa cái đấy bằng SPC. Như vậy với điện thoại chỉ cần up lần lượt patch có được vào máy)
dspMsgBox Code: #define dspMsgBoxV 0E6F138h #define dspMsgBoxI 0E6F198h Hàm có tác dụng hiện 1 thông báo có biểu tượng V hoặc I Với dòng chữ hiển thị là Index trong language. Ví dụ patch Insert "Timbre" Code: mov r13, #3FDh ; "Bass" mov r12, #1 calls dspMsgBoxV showMsgIcon2 #define showMsgIcon2 0E5DDCEh Hàm có chức năng hiển thị 1 bảng thông báo, xác nhận Yes/No, như trong patch Save and Exit from SMS Editor Patch này đã được mình decompile viết lại với mục đích có thể compile và hiểu được cách dùng hàm này: Code: #define showMsgIcon2 0E5DDCEh #define MsgFunc 0C1AA30h
base 0A00000h
org 0DA7C26h jmps Main ;orig: cmp r1, #3Eh ;46F13E00
org 0C7E030h Main: cmp r12, #1 jmpr cc_NZ, NoRed mov r12, #q(DlgData) ; offset of page value mov r13, #p(DlgData) ; page value mov r14, #q(DlgText) mov r15, #p(DlgText) ; Có thể cho r15 = r13 để tiết kiệm 1byte calls showMsgIcon2 jmps 0DA7C50h ; return NoRed: cmp r12, #5Ah jmps 0DA7C2Ah ; return with no changes
DlgHandler: mov r4, r14 cmp r14, #23h jmpr cc_NZ, NotYes mov r12, #35E8h ; YES mov r13, #0Eh mov r14, #0B4h mov r15, #5 ; save (3 -> send) calls MsgFunc jmpr cc_UC, Quit
NotYes: cmp r14, #24h jmpr cc_NZ, NotNo
Quit: mov r12, #35E8h ; NO mov r13, #0Eh mov r14, #0B4h mov r15, #0Fh ; exit calls MsgFunc
NotNo: rets
DlgText: dw 57Bh, 7FFFh ; #57Bh = "Save Message" ; 7FFFh là bắt buộc DlgData: dw 0, 0, 2, 0, 0, 7FFFh ; Để nguyên như vậy dw 0, 0, o(DlgHandler), s(DlgHandler) dw 0, 0, 2C5Ah, 2E2h, 4E26h, 2 Code phần DlgText có khác chút so với cách hướng dẫn trên GSMhosting (vì mình làm theo cách đấy không đc) Patch này vẫn đang bị lỗi là chưa thoát được khỏi SMS nếu chọn YES, mình cũng đã thử rất nhiều cách khác nhau mà vẫn chưa đc, hi vọng ai đó fix giúp. | |
| | | Sponsored content
| Tiêu đề: Re: Hướng dẫn Viết Patch cho SL45.... | |
| |
| | | | Hướng dẫn Viết Patch cho SL45.... | |
|
Trang 1 trong tổng số 1 trang | |
Similar topics | |
|
| Permissions in this forum: | Bạn không có quyền trả lời bài viết
| |
| |
| |
|