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. 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)
Graphic (bao gồm cả font) bao nhiêu bit/pixel phụ thuộc vào cách mà game đọc dữ liệu graphic chứa trong Rom, chứ không phụ thuộc vào cách nó lưu trữ trong Rom, sẽ đề cập ở phần sau. Game này dùng font 2bpp, như đã thấy ở phần trên. Định dạng trong Vram là định dạng cuối cùng và chuẩn nhất, còn cách nó lưu trong Rom không quan trọng.
Vâng em đồng ý với bác định dạng trong VRAM là 2bpp, nhưng bác bảo cách nó lưu trong Rom không quan trọng vậy thì font bác định sửa từ trong Rom kiểu gì,nếu cứ theo kiểu định dạng như trong VRAM?
Hoàn toàn có thể bỏ qua bộ font lưu trữ sẵn trong Rom để ép game đọc custom font của ta. Nói cách khác, dù trong Rom lưu là 1 bppp nhưng ta hoàn toàn có thể bắt game đọc dạng 2 bpp hay 4 bpp bằng cách can thiệp vào engine font. Nhiều game lưu ở dạng gần như không thể coi font ở dạng ảnh bằng tile editor như crystall tile, hoặc là nén/mã hoá. Lúc đó cách đơn giản nhất là ép game đọc theo định dạng font khác.
Em hiểu cách này của bác, nhưng có cần thiết phải đi đường vòng như vậy không khi font không bị nén hoặc mã hóa(sẽ rất mất time khi assembly)?
Không hẳn. Tùy tình huống, có khi chỉ thêm vài dòng là được nhưng kết quả tốt hơn cái font có sẵn rất nhiều. Asselmbly là cách trực tiếp chứ không phải lòng vòng.
Vâng đấy là có khi thôi bác, vì mỗi game mỗi khác bác cũng hiểu mà. Em chỉ góp ý vậy thôi. Mong sớm có ngày được chơi bản dịch game này của bác.
Like, tác giả bản dịch của Bringandine GE cũng theo cách này, dùng font riêng bằng cách can ttiệp sâu, tuy nhiên cách này đòi hỏi hiểu về lập trình mà những tay mơ chuyên dùng tool để dịch khó theo được. ASM hóng bản dịch của bác
Bản dịch này font thực ra là vẽ lại trên nền font gốc cộng với dùng MIPS để VWF (dòng playstation VWF đơn giản hơn mấy dòng máy của nintendo ngày xưa). Font game trong rom từ 1bpp vào game được người lập trình convert thành 4bpp+border. Giống với cái game Sangokushi này khác mỗi chỗ 1bpp->2bpp. Cái nào cần thiết thì mới assembly, chứ không phải lúc nào cũng đâm đầu vào nó. PS: Những người giỏi thì họ vẫn dùng tool, khác mỗi chỗ cách họ dùng.
Mình cùng Fox có may mắn làm việc với tác giả bản dịch Bringandine GE từ thời alpha chưa đưa ra public, tác giả rất kỹ tính, bản dịch có chỉnh để có được VWF, Font riêng nhé bạn. Tool thì ai chẳng dùng, tiện, tiết kiệm thời gian. Tác giả bản dịch Bringandine GE có viết thêm tool cho việc chèn text vào cho đúng pointer và tiết kiệm space