asm65816
Mega Man
- 23/5/09
- 3,320
- 4,851
1. Cần chuẩn bị
- Hex editor
- Text editor
- Snes debugger (Geiger hoặc Bsnes)
- yy-chr
- Tài liệu tham khảo đây và đây và đây.
Những thứ trên có thể Google dễ dàng.
2. Debug
1. Chạy game trong Snes debugger, tới khi xuất hiện text thì dump Vram.
Kiểm tra Vram bằng yy-chr, chọn chế độ view 2 bit per pixel sẽ thấy font chữ.
Có thể thấy font được "chứa" không như thông thường.
Tên "Đổng Trác" xuất hiện tại địa chỉ $C000 trong Vram.
Tương tự, dump Ram khi xuất hiện text. Kiểm tra Ram bằng yy-chr và chọn như trên.
Kết quả.
Có thể thấy text xuất hiện trong Ram tại $16000, tương đương với $7F6000 của Snes Ram.
Tới thời điểm này có thể nói cơ chế hoạt động của text trong game này như sau:
- Copy font từ Rom vào Ram
- Chuyển font từ Ram sang Vram
2. Đã biết font chữ được chứa trong Ram tại $7F6000. Đặt breakpoint on write tại địa chỉ này để biết cái gì được ghi vào đây, thời điểm nào. Ngay trước khi text xuất hiện thì debugger sẽ dừng. Ta thấy dòng sau ở cửa sổ debug.
Tại $001772 thực hiện lệnh chuyển khối dữ liệu từ bank $7E sang bank $7F, khối dữ liệu có kích thước $40 byte (giá trị của register A), địa chỉ nguồn là ($7E) F37A (giá trị của register X) và địa chỉ đích là ($7F) 6000 (giá trị của register Y).
Như vậy thì thấy trước khi dữ liệu font từ $7:F6000 chuyển sang Vram thì trước đó, nó đã được chuyển từ Ram $7E:F37A sang $7F:6000.
Giờ chạy lại game, log CPU khi text chuẩn bị xuất hiện. File log chứa toàn bộ lệnh thực thi khi game chạy. Tìm trong file log dòng code trên.
Đã biết $7E:F37A là địa chỉ Ram xuất chứa dữ liệu font chữ. Từ file log, tìm ngược lên trên với từ khóa "$7E:F37A" để xem cái gì được ghi vào địa chỉ này, vào khi nào.
Như vậy X được ghi từ $12. Tiếp tục tìm ngược lên trên file log với từ khóa $12 và thỏa mãn giá trị F37A. Kết quả:
Như vậy thì thấy có vẻ như game đọc font tại $C2:A2EC, thực hiện tính toán gì đó rồi ghi vào $7E:F37A.
Đây là game Hirom, địa chỉ $C2:A2EC tương đương với $02A2EC trong Rom khi mở bằng Hex editor.
Giờ thử kiểm chứng bằng cách thay đổi nội dung tại địa chỉ $02A2EC. Đây là kết quả.
Như vậy kết quả tìm ở trên là đúng. Tên "Đổng Trác" đã biến dạng sau khi thay đổi trong Rom.
Giờ thử mở Rom bằng yy-chr, tìm tới $02A2EC.
Như vậy, có thể thấy là bộ font chữ được chứa trong Rom quanh địa chỉ này nhưng với dạng nén hoặc một định dạng đặc thù nào đó. Ta sẽ tìm hiểu trong phần sau.
(Còn)
- Hex editor
- Text editor
- Snes debugger (Geiger hoặc Bsnes)
- yy-chr
- Tài liệu tham khảo đây và đây và đây.
Những thứ trên có thể Google dễ dàng.
2. Debug
1. Chạy game trong Snes debugger, tới khi xuất hiện text thì dump Vram.
Kiểm tra Vram bằng yy-chr, chọn chế độ view 2 bit per pixel sẽ thấy font chữ.
Có thể thấy font được "chứa" không như thông thường.
Tên "Đổng Trác" xuất hiện tại địa chỉ $C000 trong Vram.
Tương tự, dump Ram khi xuất hiện text. Kiểm tra Ram bằng yy-chr và chọn như trên.
Kết quả.
Có thể thấy text xuất hiện trong Ram tại $16000, tương đương với $7F6000 của Snes Ram.
Tới thời điểm này có thể nói cơ chế hoạt động của text trong game này như sau:
- Copy font từ Rom vào Ram
- Chuyển font từ Ram sang Vram
2. Đã biết font chữ được chứa trong Ram tại $7F6000. Đặt breakpoint on write tại địa chỉ này để biết cái gì được ghi vào đây, thời điểm nào. Ngay trước khi text xuất hiện thì debugger sẽ dừng. Ta thấy dòng sau ở cửa sổ debug.
Mã:
$00/1772 54 7F 7E MVN 7E 7F A:003F X:F37A Y:6000 D:0100 DB:00 S:0717 P:envmxdizC HC:1212 VC:016 FC:56 I:00
Tại $001772 thực hiện lệnh chuyển khối dữ liệu từ bank $7E sang bank $7F, khối dữ liệu có kích thước $40 byte (giá trị của register A), địa chỉ nguồn là ($7E) F37A (giá trị của register X) và địa chỉ đích là ($7F) 6000 (giá trị của register Y).
Như vậy thì thấy trước khi dữ liệu font từ $7:F6000 chuyển sang Vram thì trước đó, nó đã được chuyển từ Ram $7E:F37A sang $7F:6000.
Giờ chạy lại game, log CPU khi text chuẩn bị xuất hiện. File log chứa toàn bộ lệnh thực thi khi game chạy. Tìm trong file log dòng code trên.
Đã biết $7E:F37A là địa chỉ Ram xuất chứa dữ liệu font chữ. Từ file log, tìm ngược lên trên với từ khóa "$7E:F37A" để xem cái gì được ghi vào địa chỉ này, vào khi nào.
Mã:
$C0/1301 A6 12 LDX $12 [$00:0112] A:003F X:000A Y:0126 D:0100 DB:00 S:071A P:envmxdizC HC:1054 VC:016 FC:56 I:00
$C0/1303 A4 16 LDY $16 [$00:0116] A:003F X:F37A Y:0126 D:0100 DB:00 S:071A P:eNvmxdizC HC:1088 VC:016 FC:56 I:00
Như vậy X được ghi từ $12. Tiếp tục tìm ngược lên trên file log với từ khóa $12 và thỏa mãn giá trị F37A. Kết quả:
Như vậy thì thấy có vẻ như game đọc font tại $C2:A2EC, thực hiện tính toán gì đó rồi ghi vào $7E:F37A.
Đây là game Hirom, địa chỉ $C2:A2EC tương đương với $02A2EC trong Rom khi mở bằng Hex editor.
Giờ thử kiểm chứng bằng cách thay đổi nội dung tại địa chỉ $02A2EC. Đây là kết quả.
Như vậy kết quả tìm ở trên là đúng. Tên "Đổng Trác" đã biến dạng sau khi thay đổi trong Rom.
Giờ thử mở Rom bằng yy-chr, tìm tới $02A2EC.
Như vậy, có thể thấy là bộ font chữ được chứa trong Rom quanh địa chỉ này nhưng với dạng nén hoặc một định dạng đặc thù nào đó. Ta sẽ tìm hiểu trong phần sau.
(Còn)
