[SFC]Vọc Tsubasa III

Thảo luận trong 'Thảo luận chung' bắt đầu bởi asm65816, 24/3/16.

  1. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    Cũng phân vân giữa 2 khái niệm, đoạn ở trên thì đúng nghĩa là cheat, nhưng đó cũng chỉ là 1 phần giới thiệu chỉnh sửa giá trị trong Ram từ gamefaqs. Phần đó được sử dụng một ít vào sau này khi đi vào các phần chỉnh sửa trực tiếp trong file rom. Đến lúc đó cũng không rõ có xem như là hack chưa. :D
     
  2. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    - Một số bảng Value Rom :
    Từ tình huống như ở post trước. Giả sử muốn thêm skill Shoot nào đó mà không muốn chỉnh sửa tức thời trên các địa chỉ Ram. Ví dụ ở đây sử dụng Tsubasa (vì thông thường các địa chỉ hoặc giá trị liên quan tới Tsubasa hay được người làm game này đưa lên đầu tiên).
    Sử dụng Snes9x debugger. Save State tại thời điểm Tsubasa giữ bóng (trận 1 - Saopaulo).
    Như trên ta biết được 7E0471 là địa chỉ ram lưu thông tin các value của skill đầu tiên (shoot, pass, dribble). Với Tsubasa, skill shoot đầu tiên (dòng 2 của menu shoot) là Drive Shoot. Tra bảng value ram của Drive Shoot là 04 (web).
    Tại thời điểm Tsubasa đang giữ bóng. Đặt Breakpoint tại địa chỉ Ram 7E0471 với hành động Write.

    7.jpg
    Quay lại game, chọn Shoot để vào menu Shoot. Lúc này game sẽ dừng lại tại breakpoint đã đặt. Nghĩa là tại địa chỉ Ram 7E0471 lúc này đã có value mới được ghi vào nên breakpoint được kích hoạt và game tạm dừng. Quan sát trên khung console bên dưới ta thấy có dòng lệnh (opcode) như sau :
    $02/F1EA 9D 71 04 STA $0471,x[$04:0471] A:EE04 X:0000 Y:00AE D:1800
    Giải thích : thực hiện lưu trữ value trong thanh ghi A (hiện tại là 04) vào vùng nhớ tại địa chỉ $04:0471.
    8.jpg

    Với 04 là value ram của Drive Shoot. Để có thêm thông tin có thể sử dụng Lunar Address. Nhập vào địa chỉ 040471 chương trình sẽ trả về đó là địa chỉ 7E0471 (snes ram)
    9.jpg
    Tsubasa 3 là game LoRom - PC và không có header nên bỏ check dòng Include $200 copier header.
    Bây giờ muốn biết được game đã thực hiện những việc gì trước khi chạm tới BreakPoint để có được giá trị 04 (Driver Shot) nạp vào Ram (7E0471) thì phải thực hiện ghi log.
    Để ghi log, Load State lại thời điểm chuẩn bị chọn Shoot. Giữ nguyên BreakPoint đã đặt. Giữ nguyên các tùy chọn trên màn hình Debug Console giống như các hình trên. Click chọn BreakPoint lần nữa để áp lại giá trị BreakPoint vừa rồi (7E0471 - Write). Sau đó click chọn vào dòng "CPU" của phần "Logging"
    Trình giả lập sẽ thực hiện việc ghi log, chuyển sang cửa sổ game, chọn Shoot. Trình debugger sẽ dừng game lại như vừa rồi. Chọn tiếp Run để game chạy tiếp 1 đoạn. Tiếp theo chọn vào "CPU" lần nữa để dừng việc ghi log (bỏ check ).
    Mở folder của Snes9x debugger và vào thư mục Logs, ta có file log có dạng tenfilerom.log
    Open file này với Notepad++. Search chuỗi $04:0471 như trên để tìm dòng lệnh giống trên console
    Mã:
    $02/F1EA 9D 71 04  STA $0471,x[$04:0471]  A:EE04 X:0000 Y:00AE D:1800
    Từ vị trí này, di chuyển lên trên có 1 số xử lý trước đó. Ta có đoạn code như sau : (xem filelog.log)

    Mã:
    $02/F10B C2 30       REP #$30                A:357E X:0000 Y:0000 D:1800 DB:04
    $02/F10D A0 00 00    LDY #$0000              A:357E X:0000 Y:0000 D:1800 DB:04
    $02/F110 B7 C0       LDA [$C0],y[$7E:3520]   A:357E X:0000 Y:0000 D:1800 DB:04
    $02/F112 48          PHA                     A:0100 X:0000 Y:0000 D:1800 DB:04 
    Câu lệnh thực hiện nạp vào A (LDA) value tại vùng nhớ Ram 7E3520. Vùng nhớ này đang có value 00 01 . Nên sau đó giá trị của A:0100. Có thể kiểm tra lại bằng cách tại thời điểm game dừng ở BreakPoint. Chọn "Show Hex". Chọn Viewing : Ram và Set Range : 7E3520 - 7E3521.

    4.jpg
    Ở đây 7E3521 đang mang value : 01. Xem lại bảng value Ram từ web phần Players. Ta có vị trí số 10 của đội nhà :
    N10 7E3521-- với -- = 01 (Tsubasa).
    Đoạn code trên sẽ xác định vị trí số 10 của đội nhà là Tsubasa.

    Tiếp theo log :
    Mã:
    $02/F12E C2 20  REP #$20  A:0005 X:0002 Y:0000 D:1800 DB:05
    $02/F130 BD 00 FB  LDA $FB00,x[$05:FB02]  A:0005 X:0002 Y:0000 D:1800 DB:05
    $02/F133 85 19  STA $19  [$00:1819]  A:FBAC X:0002 Y:0000 D:1800 DB:05
    
    Nạp vào A giá trị tại 05 FB02. Giá trị sẽ bằng AC FB. Sử dụng Lunar Address để chuyển đổi 05FB02 ta có đây là vùng nhớ LoRom. Tương ứng với 02 FB02 trong PC File.

    (còn tiếp)
     

    Các file đính kèm:

    Chỉnh sửa cuối: 6/7/16
  3. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    5.jpg
    Sử dụng Hex Editor mở file Rom game lên (file .smc). Ctrl+G để Goto địa chỉ offset 2FB02. Ta có :
    6.jpg
    Vùng dữ liệu này bắt đầu từ Offset 0 2FB00. Đây là vùng lưu dữ liệu các Pointer "All Skills" của từng cầu thủ. Hình trên tương ứng với địa chỉ All Skill cho Tsubasa : offset 2FB02 với Pointer là FB AC.

    Quay trở lại file log. Đi tiếp xuống sẽ có đoạn xử lý sau :
    Mã:
    $02/ED4F C2 20  REP #$20  A:FB00 X:0002 Y:0000 D:1800 DB:04
    $02/ED51 B7 19  LDA [$19],y[$05:FBAC]  A:FB00 X:0002 Y:0000 D:1800 DB:04
    $02/ED53 D0 0B  BNE $0B  [$ED60]  A:FE80 X:0002 Y:0000 D:1800 DB:04
    $02/ED60 85 19  STA $19  [$00:1819]  A:FE80 X:0002 Y:0000 D:1800 DB:04
    $02/ED62 E2 20  SEP #$20  A:FE80 X:0002 Y:0000 D:1800 DB:04
    
    Có lệnh nạp vào A value tại LoRom 05 FBAC. Dùng Lunar Address chuyển 05 FBAC -> 02 FBAC (PC File). Và tại 2 FBAC có value là 80 FE.
    Để kiểm tra, ở trên ta có Pointer "FB AC". Trong cùng bank "2" (2 FB02) nên sẽ chỉ đến vùng dữ liệu tại Offset 2 FBAC. Mở lại Hex Editor và Goto 2 FBAC : tại đây sẽ có value FE 80.
    7.jpg

    "FE 80" tiếp tục là 1 Pointer. Trỏ đến vùng dữ liệu tại 2 FE80.
    Mở lại file log, ở các xử lý tiếp theo :
    Mã:
    $02/ED88 B7 19  LDA [$19],y[$05:FE80]  A:ED00 X:0000 Y:0000 D:1800 DB:04
    $02/ED8A 29 03  AND #$03  A:ED10 X:0000 Y:0000 D:1800 DB:04
    $02/ED8C 85 1E  STA $1E  [$00:181E]  A:ED00 X:0000 Y:0000 D:1800 DB:04
    $02/ED8E A4 1C  LDY $1C  [$00:181C]  A:ED00 X:0000 Y:0000 D:1800 DB:04
    $02/ED90 B7 19  LDA [$19],y[$05:FE80]  A:ED00 X:0000 Y:0000 D:1800 DB:04
    $02/ED92 4A  LSR A  A:ED10 X:0000 Y:0000 D:1800 DB:04
    $02/ED93 4A  LSR A  A:ED08 X:0000 Y:0000 D:1800 DB:04
    $02/ED94 85 1D  STA $1D  [$00:181D]  A:ED04 X:0000 Y:0000 D:1800 DB:04
    
    Vùng nhớ LoRom 05 FE80 có value : 10 sẽ được nạp vào A. Sau một số xử lý sẽ là nạp giá trị trong A (hiện tại là 04) vào vùng nhớ Ram 00 181D.
    Tiếp tục một số xử lý, ta đi được tới đoạn dừng của BreakPoint trước đó.
    Mã:
    $02/EE1A AD 04 06  LDA $0604  [$04:0604]  A:EE01 X:0001 Y:00AE D:1800 DB:04 S:1C29 P:envMXdIzC HC:0470 VC:045 FC:05 I:00
    $02/EE1D DF 2C EE 02 CMP $02EE2C,x[$02:EE2D] A:EE00 X:0001 Y:00AE D:1800 DB:04 S:1C29 P:envMXdIZC HC:0510 VC:045 FC:05 I:00
    $02/EE21 90 05  BCC $05  [$EE28]  A:EE00 X:0001 Y:00AE D:1800 DB:04 S:1C29 P:envMXdIZC HC:0598 VC:045 FC:05 I:00
    $02/EE23 A5 1D  LDA $1D  [$00:181D]  A:EE00 X:0001 Y:00AE D:1800 DB:04 S:1C29 P:envMXdIZC HC:0622 VC:045 FC:05 I:00
    $02/EE25 20 E4 F1  JSR $F1E4  [$02:F1E4]  A:EE04 X:0001 Y:00AE D:1800 DB:04 S:1C29 P:envMXdIzC HC:0654 VC:045 FC:05 I:00
    
    
    $02/F1E4 08  PHP  A:EE04 X:0001 Y:00AE D:1800 DB:04 S:1C27 P:envMXdIzC HC:0708 VC:045 FC:05 I:00
    $02/F1E5 E2 30  SEP #$30  A:EE04 X:0001 Y:00AE D:1800 DB:04 S:1C26 P:envMXdIzC HC:0738 VC:045 FC:05 I:00
    $02/F1E7 AE 70 04  LDX $0470  [$04:0470]  A:EE04 X:0001 Y:00AE D:1800 DB:04 S:1C26 P:envMXdIzC HC:0768 VC:045 FC:05 I:00
    $02/F1EA 9D 71 04  STA $0471,x[$04:0471]  A:EE04 X:0000 Y:00AE D:1800 DB:04 S:1C26 P:envMXdIZC HC:0816 VC:045 FC:05 I:00
    $02/F1ED EE 70 04  INC $0470  [$04:0470]  A:EE04 X:0000 Y:00AE D:1800 DB:04 S:1C26 P:envMXdIZC HC:0862 VC:045 FC:05 I:00
    $02/F1F0 28  PLP  A:EE04 X:0000 Y:00AE D:1800 DB:04 S:1C26 P:envMXdIzC HC:0916 VC:045 FC:05 I:00
    $02/F1F1 60  RTS  A:EE04 X:0000 Y:00AE D:1800 DB:04 S:1C27 P:envMXdIzC HC:0952 VC:045 FC:05 I:00
    
    A được nạp trở lại từ vùng nhớ Ram $1D (00181D) - value 04.
    Sau đó lưu trữ value 04 trong A vào vùng nhớ 04 0471 (7E0471).
    Với 04 là value Ram qui định Driver Shoot. Nên 10 ở trên (tại offset 2 FE80) là value qui định Driver Shoot trong Rom.
    Để kiểm tra, trong Hex Editor thực hiện Goto offset 2 FE80 :
    8.jpg
    Đây là dãy value qui định các Skill Sút của Tsubasa. Kết thúc bằng 03 (tương tự như ở Tsubasa 2).

    (còn tiếp)
     
    Chỉnh sửa cuối: 6/7/16
  4. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    Theo trên ta có Pointer chỉ đến All Skills cho Tsubasa : 2 FB02 ( FB AC). Áp dụng ghi log tương tự khi sử dụng Drive Pass, Heel Lift. Ta có được các value tiếp theo tại offset 2 FB AC.
    Mã:
    80 FE || FC FE || FF FE || 07 FF || 00 00 || 1D FF || 00 00 || 
    Các value trên là các Pointer trỏ tới các Offset của skill tương ứng. Value "00 00" cho biết tại đó không có skill.
    Ứng với các động tác :
    Mã:
    Shoot ||    Pass  ||  Dribble   ||Combi || Block || Tackle || PassCut|| 
    Thử áp dụng các địa chỉ Offset và Value đã biết để chỉnh sửa trên file rom game. Lưu ý luôn sao lưu lại file rom game để dự phòng.
    VD1: thay đổi All Skill của Schneider thành All Skill của Tsubasa.
    Chọn chế độ All Star (đầu game) và chọn Schnider giữ bóng để ghi log. Tương tự ta có :
    Pointer đến địa chỉ All Skill của Schnider : offset 2FB54 : FC B6
    Thay FC B6 bằng FB AC : Goto 2FB54 : đổi FC B6 thành FB AC.

    9.jpg
    10.jpg
    Reload game và load state vị trí của Schneider. Mặc định đầu game Schnider chỉ có Fire Shot và Overhead Kick.
    11.jpg
    Như hình trên, toàn bộ Skill của Schneider chuyển thành Skill của Tsubasa.
    Trả lại FB AC thành FC B6 tại 2FB54 như cũ.

    VD2: thay đổi/thêm mới 1 skill nào đó, không phải thay toàn bộ :
    VD.2.1 Theo trên ta có Offset All Skill của Schneider là : 2FB54 : FC B6. Theo pointer trên, tiếp tục Goto 2FCB6 ta có dãy value :
    Mã:
    C2FE || 0000 || 0000 || 0000 || 0000 || 0000 ||
    Chỉ có value C2FE chỉ đến địa chỉ chứa dãy value các skill Shoot của Schneider. (Goto 2 FEC2).
    Giả sử muốn thêm mới skill lừa Heel Lift của Tsubasa cho Schnider. Cặp value thứ 3 của dãy trên là Pointer trỏ đến skill Dribble. Hiện tại đang là 0000. So sánh với dãy value của Tsubasa ở trên ( 80 FE || FC FE || FF FE || 07 FF || 00 00 || 1D FF || 00 00 ) và thay giá trị pointer ở vị trí thứ 3 vào cho Schneider.
    Kết quả ở vị trí offset 2FCB6 :
    Mã:
    C2FE || 0000 || FF FE || 0000 || 0000 || 0000 ||
    Reload game và kiểm tra. Ta có :
    12.jpg
    Ngoài 2 skill ban đầu (Overhead và Fire Shot). Schneider đã có thêm Heel Lift.
    (còn tiếp)
     
    Chỉnh sửa cuối: 6/7/16
    traitim_virus thích bài này.
  5. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Bạn nắm được cơ bản rồi đó ozone. Học tiếp assembly để tiến cao hơn đi.
     
    traitim_virus thích bài này.
  6. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    Thanks bác. Tiếc là bây giờ lại không có nhiều thời gian để mày mò nữa. Mấy cái trên mày mò cách đây cũng 1-2 năm rồi. Nhân vừa rồi có bạn pm hỏi cách hack/chỉnh sửa game này nên lục lại. Sẵn tiện nhờ post ké topic của bác luôn. :D
     
  7. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    VD 2.2 Từ VD 2.1, tìm thêm về các skill Sút.
    Quay lại các post trên. Ta có Pointer đến Offset của dãy Skill Shoot của Tsubasa là FE 80. Thực hiện Goto offset 2 FE80 ta có dãy :
    Mã:
    10  0E  16  29  21  4C  4D  4E  58  59  5A  48  19
    Vào game, phần Meeting (Sao Paulo trận 1) - xem phần Level của Tsubasa ta có :
    1.jpg
    Thứ tự Skill cũng tương ứng với dãy value của Offset "All Skill" : Shoot - Pass - Dribble - Combi - Block - Tackle - Pass Cut.
    Shoot sẽ gồm : Drive Shoot - Overhead - Drive Overhead - Twin Shoot - Cyclone
    Pass : Drive Pass
    Dribble : Heel Lift
    Combi : Golden Combi
    Dãy Shoot này tương ứng với dãy value trong Rom ở trên như sau :
    -Drive Shoot (10)
    -Overhead (0E)
    -DriveOverhead (16)
    -Twin Shoot : 29 21 => ở đây 29 là value qui định Twin Shoot và 21 là value Ram của cầu thủ kết hợp trong Twin Shoot. Tra bảng value Ram của cầu thủ (web) ta có 21 là Misaki.
    -Cyclone : 4C 4D 4E : với 4C dùng với bóng ngoài vòng cấm - 4D dùng với bóng thấp trong vòng cấm - 4E dùng với bóng cao trong vòng cấm. Do Tsubasa có thể sút Cyclone từ 3 trường hợp : giữ bóng ngoài vòng cấm, banh thấp trong vòng cấm, banh cao trong vòng cấm.
    Lưu ý thay đổi các giá trị không theo qui định trong rom có thể làm crash game. Ví dụ tại vị trí 4D thay bằng 1 giá trị của 1 cú sút nào đó vốn chỉ được thực hiện ngoài vòng cấm (giả sử Fire Shot) thì khi trong game, lúc banh thấp chọn Fire Shot có thể làm crash game do dữ liệu sai lệch.
    -Tiếp theo là 58 59 5A, tương tự Cyclone, đây là 3 giá trị của Neo Cyclone tại : ngoài vòng cấm, banh thấp, banh cao. Lưu ý do điều kiện để Neo Cyclone xuất hiện thay thế Cyclone chỉ khi đã đá kick off gặp xong đội tuyển Pháp. Nên bảng skill hiện tại của Tsubasa sẽ không thể hiện Neo Cyclone.
    -Cuối cùng là 48 19 : với 48 là value của DriveTiger và 19 là value ram của cầu thủ kết hợp trong Drive Tiger, tra bảng ram từ web có 19 là Hyuga. Đây là skill sút ẩn, chỉ xuất hiện trong game khi đạt điều kiện do game qui định.
    Theo trên, ta có offset all skill của Schneider là 2FB54 : FC B6 -> thực hiện goto 2 FCB6 sẽ được dãy
    C2FE || 0000 || 0000 || 0000 || 0000 || 0000 ||
    Trong đó FEC2 là Pointer chỉ đến dãy value qui định skill shoot của Schneider.
    Goto 2 FEC2 ta có dãy :
    Mã:
    0E 74 98 C0 01 03
    Với 0E : Overhead - 74 : Fire Shoot - 98 : Neo Fire - C0 01 : FireDrive với C0 là value FireDrive và 01 là value Ram của cầu thủ kết hợp Tsubasa. Hiện tại Neo Fire còn bị ẩn đi do chưa đạt được điều kiện game là gặp đội Đức. Và FireDrive là skill ẩn trong game.
    Giả sử muốn thêm Fire Shot vào cho Tsubasa, đặt Fire Shot vào sau Drive Shot và trước Cyclone.
    Do không phải thay thế skill sút sẵn có mà là thêm vào skill sút mới. Nên sẽ dùng giải pháp tận dụng các vùng dữ liệu trống.
    Goto 2FE80 , ta thấy các vùng dữ liệu trước offset 2FE80 có giá trị là FF, thông thường các vùng dữ liệu liên tục có giá trị FF hoặc 00 là vùng dữ liệu trống.
    2.jpg Ta tận dụng các value FF ở khu vực phía trước offset 2FE80 để tránh đụng tới dữ liệu gốc. Sao chép toàn bộ 14 value tại 2 FE80 (kết thúc = 03, bắt buộc phải có 03 để game xử lý tới đây và dừng đoạn skill shoot).
    Ghi đè lên 14 value FF ngay trước đó, đồng thời chèn thêm value 74 (Fire Shoot)vào sau value 10 (Drive Shoot) như sau :
    3.jpg
    Do hiện tại game đang xử lý dữ liệu tại bank "2" nên ta sẽ thay các giá trị mới trong phạm vi dữ liệu của bank "2".
    Lúc này dãy skill shoot của Tsubasa bắt đầu từ địa chỉ Offset 2 FE71, không còn là 2 FE80.
    Để game hiểu được dãy value shoot mới đã được thay đổi, bắt đầu từ 2 FE71 thì ta thay đổi giá trị Pointer trỏ đến 2 FE80 thành trỏ đến 2 FE71.
    Goto 2 FBAC (Pointer trỏ đến vùng all skill) : thay value 80 FE thành 71 FE - thay value của pointer FE80 thành FE71.
    4.jpg
    Save lại nội dung rom game trong Hex Editor. Reload game và test lại Tsubasa : hiện có thêm skill Fire Shoot của Schnider.
    5.jpg
    Trên đây là gợi ý cách chỉnh sửa rom game để thay đổi skill , thêm skill cho các cầu thủ.

    (còn tiếp)
     
    Chỉnh sửa cuối: 7/7/16
  8. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Mình đang tìm kiếm người nào đó có khả năng để cùng hợp tác. Bạn có tố chất đó, nếu học thêm về phần cứng Snes và assembly của nó thì sẽ tiến rất nhiều.

    Mình không phải dân IT, không học hành lập trình gì cả. Nhưng nhờ đọc sách mà có hiểu biết, đang tự viết game Snes đây.

     
    ozone thích bài này.
  9. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    Cám ơn bác. Mình xin ghi nhận lời đề nghị này. Tương lai nếu sắp xếp thêm được thời gian để tìm hiểu sâu hơn các kiến thức này mình sẽ còn quay lại. Hiện cũng phải tận dụng thời gian mới vào đây post bài được :D
     
  10. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    Theo trên, ta có vùng dữ liệu chứa các Pointer trỏ đến các thông tin "All Skill" của các cầu thủ bắt đầu từ địa chỉ offset 2 FB00. Goto 2FB00 và quan sát ta thấy 2 FB02 là Pointer của Tsubasa (value : FB AC), còn 2 FB00 và 1 số địa chỉ sau đó có value là FB 9E. Tiếp tục goto theo Pointer này : 2 FB9E là vùng dữ liệu
    Mã:
    0000 | 0000 |0000 |0000 |0000 |0000 |
    Đây sẽ là vùng dữ liệu cho biết các cầu thủ nào có Pointer "All Skill" = FB 9E thì sẽ không có skill nào.
    1.jpg
    2.jpg

    VD2.3 : về các thủ môn : cũng áp dụng như trên để tìm dữ liệu Skill của các thủ môn. Thao tác cũng tương tự như trên : chọn đá All Star, chọn thủ môn có skill chụp vào đội mình (ở đây chọn Gertize của Brazil vì ở đầu game chỉ có thủ môn này có skill chụp (Dark Illusion). Ở màn hình chuẩn bị chọn Catch/Punch của Gertize ta set BreakPoint Write cho Ram 7E0471 như trên. Check vào CPU để ghi log và chọn Catch, game cũng dừng tại BreakPoint, chọn tiếp Run để vượt qua BreakPoint, chuyển sang menu Catch của Gertize và bỏ Check CPU để kết thúc ghi log.
    View Ram ở thời điểm hiện tại, ta có 7E0471 đang mang giá trị 01. Vậy 01 là giá trị ram qui định skill Dark Illusion.
    3.jpg
    Save State ở màn hình chọn Catch/Punch của Gertize. Apply Cheat cho vùng nhớ 7E0471 các giá trị khác (02, 03, 04). Ta có : 02 (Shadow Shield của Ramcane (Belgium)) ; 03 (Raizankyaku - kick - của Lu (China) ; 04 : Mano de oro của Hernandez (Italy) tuy nhiên sẽ làm treo game do thời điểm này Hernardez chưa có skill Catch này.
    Dùng Notepad++ mở file log vừa có được ở trên, Search chuỗi " :0471" cho nhanh và ta có :
    Mã:
    $02/F0AD C2 20  REP #$20  A:FE3E X:0084 Y:0000 D:1800 DB:04 S:1C2C P:envMXdIZC HC:0246 VC:001 FC:09 I:00
    $02/F0AF A0 00  LDY #$00  A:FE3E X:0084 Y:0000 D:1800 DB:04 S:1C2C P:envmXdIZC HC:0276 VC:001 FC:09 I:00
    $02/F0B1 B7 19  LDA [$19],y[$05:FE3E]  A:FE3E X:0084 Y:0000 D:1800 DB:04 S:1C2C P:envmXdIZC HC:0324 VC:001 FC:09 I:00
    $02/F0B3 D0 33  BNE $33  [$F0E8]  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2C P:envmXdIzC HC:0388 VC:001 FC:09 I:00
    $02/F0E8 E2 30  SEP #$30  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2C P:envmXdIzC HC:0418 VC:001 FC:09 I:00
    $02/F0EA C9 04  CMP #$04  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2C P:envMXdIzC HC:0448 VC:001 FC:09 I:00
    $02/F0EC D0 07  BNE $07  [$F0F5]  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:0472 VC:001 FC:09 I:00
    $02/F0F5 8D 71 04  STA $0471  [$04:0471]  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:0510 VC:001 FC:09 I:00
    $02/F0F8 A9 01  LDA #$01  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:0590 VC:001 FC:09 I:00
    $02/F0FA 8D 70 04  STA $0470  [$04:0470]  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2C P:envMXdIzc HC:0614 VC:001 FC:09 I:00
    $02/F0FD 28  PLP  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2C P:envMXdIzc HC:0654 VC:001 FC:09 I:00
    $02/F0FE 60  RTS  A:0001 X:0084 Y:0000 D:1800 DB:04 S:1C2D P:envMXdIZC HC:0690 VC:001 FC:09 I:00
    
    Địa chỉ Rom 05:FE3E mang value 01 sẽ nạp vào A, sau đó sẽ lưu trữ nội dung của A vào địa chỉ ram 04:0471 (7E0471). Dùng Lunar Address ta có 5 FE3E => 2 FE3E trong file rom game. và FE3E cũng là Pointer trỏ tới 2 FE3E. Lên tiếp 1 số dòng log ta có :
    Mã:
    $02/F130 BD 00 FB  LDA $FB00,x[$05:FB84]  A:0005 X:0084 Y:0000 D:1800 DB:05 S:1C28 P:envmXdIzc HC:1370 VC:000 FC:08 I:00
    $02/F133 85 19  STA $19  [$00:1819]  A:FE3E X:0084 Y:0000 D:1800 DB:05 S:1C28 P:eNvmXdIzc HC:0054 VC:001 FC:09 I:00
    
    Theo trên, vùng Rom 5FB84 => 2 FB84 (PC file) sẽ chứa Pointer FE3E.
    Hex Editor mở file rom game và goto 2 FB84 sẽ thấy chứa value Pointer FE3E.
    2FB84 cũng là offset "All Skill" cho Gertize.

    Bây giờ xem lại toàn bộ đoạn log phần xử lý truy cập vào menu Catch của Gertize, ta có

    Mã:
    $02/F10B C2 30  REP #$30  A:347E X:0000 Y:0000
    $02/F10D A0 00 00  LDY #$0000  A:347E X:0000 Y:0000
    $02/F110 B7 C0  LDA [$C0],y[$7E:3400]  A:347E X:0000 Y:0000
    $02/F112 48  PHA  A:4200 X:0000 Y:0000
    $02/F113 29 FF 00  AND #$00FF  A:4200 X:0000 Y:0000
    $02/F116 D0 08  BNE $08  [$F120]  A:0000 X:0000 Y:0000
    $02/F118 68  PLA  A:0000 X:0000 Y:0000
    $02/F119 EB  XBA  A:4200 X:0000 Y:0000
    $02/F11A E2 30  SEP #$30  A:0042 X:0000 Y:0000
    $02/F11C 0A  ASL A  A:0042 X:0000 Y:0000
    $02/F11D AA  TAX  A:0084 X:0000 Y:0000
    $02/F11E 80 05  BRA $05  [$F125]  A:0084 X:0084 Y:0000
    $02/F125 E2 20  SEP #$20  A:0084 X:0084 Y:0000
    $02/F127 8B  PHB  A:0084 X:0084 Y:0000
    $02/F128 A9 05  LDA #$05  A:0084 X:0084 Y:0000
    $02/F12A 48  PHA  A:0005 X:0084 Y:0000
    $02/F12B AB  PLB  A:0005 X:0084 Y:0000
    $02/F12C 85 1B  STA $1B  [$00:181B]  A:0005 X:0084 Y:0000
    $02/F12E C2 20  REP #$20  A:0005 X:0084 Y:0000
    $02/F130 BD 00 FB  LDA $FB00,x[$05:FB84]  A:0005 X:0084 Y:0000
    $02/F133 85 19  STA $19  [$00:1819]  A:FE3E X:0084 Y:0000
    $02/F135 E2 20  SEP #$20  A:FE3E X:0084 Y:0000
    $02/F137 AB  PLB  A:FE3E X:0084 Y:0000
    $02/F138 28  PLP  A:FE3E X:0084 Y:0000
    $02/F139 60  RTS  A:FE3E X:0084 Y:0000
    
    
    $02/F0AD C2 20  REP #$20  A:FE3E X:0084 Y:0000
    $02/F0AF A0 00  LDY #$00  A:FE3E X:0084 Y:0000
    $02/F0B1 B7 19  LDA [$19],y[$05:FE3E]  A:FE3E X:0084 Y:0000
    $02/F0B3 D0 33  BNE $33  [$F0E8]  A:0001 X:0084 Y:0000
    $02/F0E8 E2 30  SEP #$30  A:0001 X:0084 Y:0000
    $02/F0EA C9 04  CMP #$04  A:0001 X:0084 Y:0000
    $02/F0EC D0 07  BNE $07  [$F0F5]  A:0001 X:0084 Y:0000
    $02/F0F5 8D 71 04  STA $0471  [$04:0471]  A:0001 X:0084 Y:0000
    $02/F0F8 A9 01  LDA #$01  A:0001 X:0084 Y:0000
    $02/F0FA 8D 70 04  STA $0470  [$04:0470]  A:0001 X:0084 Y:0000
    $02/F0FD 28  PLP  A:0001 X:0084 Y:0000
    $02/F0FE 60  RTS  A:0001 X:0084 Y:0000
    

    Trước khi thực hiện xử lý tới địa chỉ 2 FB84 (LoRom 5 FB84), game thực hiện :
    Mã:
    $02/F110 B7 C0  LDA [$C0],y[$7E:3400]  A:347E X:0000 Y:0000
    $02/F112 48  PHA  A:4200 X:0000 Y:0000
    
    Load ram 7E3400 vào A. A sẽ chứa giá trị 00 42. Nghĩa là ở trong vùng nhớ Ram, 7E3400 mang giá trị 00 và 7E3401 mang giá trị 42.
    Tra lại web bảng giá trị Ram của Players, ta thấy 42 là giá trị qui định cho Gertize (Elzo)
    Tiếp theo là thực hiện x2 (hex) value này lên sẽ được 84 (hex).
    Xuống p hía dưới :
    Mã:
    $02/F130 BD 00 FB  LDA $FB00,x[$05:FB84]  A:0005 X:0084 Y:0000
    $02/F133 85 19  STA $19  [$00:1819]  A:FE3E X:0084 Y:0000
    
    Thực hiện cộng địa chỉ offset FB00 + X (X đang chứa value 84 hex ở trên) để có địa chỉ FB84 - là địa chỉ offset "All Skill" 2FB84.

    Tại đây có thể suy ra game sẽ lấy value ram qui định của mỗi cầu thủ, sau đó x2 (hex) và + với 2 FB 00 (hex) để được địa chỉ offset chứa Pointer "All Skill" của cầu thủ tương ứng đó.

    Để kiểm tra, thử với Genzo. Từ web có value Ram của Genzo là 20. 20x2 (hex) = 40 Hex. 2FB00 + 40 = 2FB40. Goto 2 FB40 , Pointer ở đây có giá trị : FB 9E. Giá trị này cho biết không có Skill đặc biệt.
    4.jpg
    So sánh với Gertize : 2FB84 : FE 3E. Tại 2FB40 sửa FB 9E thành FE3E 5.jpg

    Vào phần All Star, chọn Wakabayashi vào đội mình và test :
    6.jpg
    7.jpg

    -----------------------------------------------------------------------------------------------

    Trên đây là phần cơ bản về chỉnh sửa các giá trị trong Ram cũng như trong Rom game. Đến đây ta có thể chuyển đổi, thêm mới hầu hết các skill xuất hiện trong game cho các cầu thủ khác nhau.
     
    Chỉnh sửa cuối: 8/7/16
  11. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    1. Một số chỉnh sửa linh tinh - tạm gọi là hack rom cũng được
    1.1 Thủ môn angry (hú, hét, ....) :
    Ngày xưa lúc thời các game snes còn thịnh hành, có lưu truyền một bản rom game Tsubasa 3 các thủ môn chính "Angry" 100% khi chặn các cú sút. Dẫn đến sẽ khó hơn khi muốn ghi bàn.

    Ở một số trướng hợp, khi thực hiện Catch / Punch, các thủ môn (không phải tất cả) sẽ thực hiện một hành động tạm gọi là angry. Sau đó có thể nhận thấy khả năng chặn bóng của thủ môn tăng lên (chỉ tính trong lần sút đó). Đặc biệt khi "angry", Ken sẽ có khả năng thực hiện skill ẩn "Shuto" , là skill có khả năng phá được mọi cú sút.
    1.jpg

    Nhận xét là việc thực hiện "Angry" này diễn ra theo tỉ lệ. Đầu tiên thử tìm giá trị trong Ram qui định việc này. Để chuẩn bị, ta tận dụng khả năng save state nhiều slot của snes9x.
    Đầu tiên save vài slot state ở trạng thái chuẩn bị chọn Catch/Punch của một số thủ môn (chọn phần All Star cho đơn giản vì 5 thủ môn của All Star để có khả năng "Angry"). Tiếp đến cố gắng reload các save state này để các thủ môn đạt trạng thái kích hoạt "Angry" và Save các State này (trong tình trạng như hình bên trên). Ngoài ra là Save thêm một số State trong trường hợp không diễn ra "Angry" mà chuyển sang hình ảnh tiếp theo của trái bóng bay đi (save state cũng ngay thời điểm đó).
    Thực hiện tìm value ram (cheat) bằng cách bắt đầu với load state tại thời điểm "Angry" giống hình trên.
    Tiếp theo Alt+A để search all value. Quay lại game và thực hiện load 1 State khác và lại Alt+A để Search tiếp, tuỳ vào vừa rồi load state nào để chọn cách search cho phù hợp. Nếu state vừa load cũng là hình ảnh lúc "Angry" thì chọn : Comparison type : = (Equal To) ---- Compare To : Previous Value và chọn Search để Filter (lọc) bớt các vùng nhớ mang giá trị khác với trước đó. Nếu state vừa load là hình ảnh không có kích hoạt "Angry" mà chuyển sang hình ảnh bóng bay đi thì phần Comparison Type : =! (Not Equal To) và Search để Filter bớt các vùng nhớ không thoả điều kiện mang value khác với State trước đó.
    Tiếp tục load các State khác nhau và chọn kiểu Comparison Type cho phù hợp rồi Search để lọc hết các vùng nhớ không liên quan.
    Sau cùng, khi còn 1 vài vùng nhớ còn sót lại, ta có thể tiến hành "freeze" các vùng nhớ này rồi Load State về trạng thái chuẩn bị chọn Catch/Punch để thử nghiệm.
    Cuối cùng tìm được vùng nhớ Ram sau : 7E040A , tại thời điểm kích hoạt "Angry" , vùng nhớ này có giá trị 80.
    Thử giữ nguyên (freeze) vùng nhớ này với giá trị 80 và tiếp tục chơi. Sẽ có thêm hiệu ứng khác khi vùng nhớ 7E040A có giá trị 80 : Kyo Retsuna Tackle.
    2.jpg

    Quay trở lại với phần "Angry". Với vùng nhớ Ram 7E040A (lưu ý ở đây phải xóa hết các phần add cheat trước đó đi để không ảnh hưởng tới việc ghi log CPU) ta tiến hành ghi log.
    Trước hết load State về lại trạng thái một thủ môn nào đó đang chuẩn bị chọn Catch/Punch. Đặt 1 Break Point : 7E040A - Write. Sau đó check CPU (Logging) và thực hiện thao tác chọn Catch/Punch (giả sử ở đây đang sử dụng thủ môn Muller). Break Point sẽ được kích hoạt, có 2 trường hợp :
    - Không kích hoạt được trạng thái "Angry" - thường gặp, do tỉ lệ kích hoạt trạng thái này rất thấp. Khi đó sẽ có log :
    Mã:
    $01/D4E3 9C 0A 04  STZ $040A  [$01:040A]  A:0080 X:0000 Y:000B
    Chưa đủ thông tin cần thiết để có thể tìm trạng thái "Angry" trong Rom game. Có thể vào folder Logs trong folder Snes9x để xóa bớt các file .log không cần thiết.
    Tiếp tục reload và lặp lại thao tác này (ở đây cần sự kiên nhẫn 1 chút).

    Ở đây, bản snes9x debugger mình dùng có 1 số nhược điểm : mỗi lần load State phải check lại mục Break Point ; Mục Break Point không cho nhập thêm phần value của vùng nhớ Ram ; Mỗi khi ghi log thì tạo 1 file log mới, không phù hợp trong điều kiện ta cần ghi log khi phải reload state liên tục để trạng thái "Angry" kích hoạt.
    Các điểm trên nếu ai biết cách khắc phục hoặc biết phiên bản mới hơn của snes9x khắc phục được thì xin chỉ giúp :D

    Tạm thời mình chuyển sang dùng bsnes debugger. Đầu tiên là thiết lập các nút bấm, các phím tắt cho việc Save State, Load State được thuận tiện. Sau đó cũng Save State tại vị trí thủ môn chuẩn bị chọn Catch/Punch. Ở đây cũng chọn Muller làm ví dụ.
    Tiếp theo chọn Tools > Debugger. Trên cửa sổ Debugger tiếp tục chọn Tools > Break Point Editor và chọn như sau :
    3.jpg
    Có thể thấy ở đây cho phép tạo BreakPoint cho vùng nhớ 7E040A có giá trị 80 Write.
    Tiếp theo, quay lại cửa sổ và check vào "Trace S-CPU opcode" để bắt đầu ghi log. Quay lại cửa sổ game và cho Muller thực hiện Catch hoặc Punch. Nếu không kích hoạt trạng thái "Angry" thì bỏ check "Trace S-CPU opcode" để kết thúc ghi log. Sau đó reload state để tiếp tục lại. Trình bsnes debugger chỉ lưu lại thành 1 file trace.log duy nhấtrong folder của bsnes debugger.

    - Khi kích hoạt được trạng thái "Angry" : BreakPoint được kích hoạt và dừng game lại. Bỏ check Trace S-CPU opcode để kết thúc ghi log. Edit file trace.log trong folder của bsness debugger ta có : (file log của bsnes debugger trình bày không được rõ ràng như của snes9x nhưng nếu đã quen nhìn file log thì cũng phải là vấn đề lớn).
    Đi tới cuối file trace.log này , cuối cùng sẽ là dòng opcode nơi break point được kích hoạt (7E0471 có giá trị 80 hex) :
    Mã:
    02c6c2 sta $040a  [02040a] A:be80 X:0000 Y:0002
    Lệnh thực hiện lưu giá trị trong A (80) vào vùng nhớ 02040A (7E040A).
    Đi tiếp lên trên 1 chút trong file log là các xử lý sau :
    Mã:
    02c675 lda [$c0],y  [7e3401] A:3400 X:0018 Y:0001 S:1c34 D:0a00 DB:02 nvMXdIzc V:  8 H:1218
    02c677 cmp #$20  A:3448 X:0018 Y:0001 S:1c34 D:0a00 DB:02 nvMXdIzc V:  8 H:1266
    02c679 bne $c67f  [02c67f] A:3448 X:0018 Y:0001 S:1c34 D:0a00 DB:02 nvMXdIzC V:  8 H:1282
    02c67f lda $050f  [02050f] A:3448 X:0018 Y:0001 S:1c34 D:0a00 DB:02 nvMXdIzC V:  8 H:1304
    
    Lệnh trên thực hiện load vùng nhớ 7E3401 (vị trí thủ môn đội mình) sẽ được giá trị 48 hex (Muller). Tiếp theo là so sánh với 20 hex (Genzo), nếu không phải là Genzo thì nhảy tới vùng 02C67F để xử lý tiếp. Tại đây có thể suy ra có 2 phần xử lý "Angry": 1 cho Wakabayashi (Genzo) và 1 cho các thủ môn còn lại (không phải tất cả thủ môn).
    Di chuyển lên 1 chút nữa là phần xử lý Sub Routine. Lên trên nữa là 1 đoạn xử lý trước khi nhảy vào Sub Routine vừa rồi.
    Mã:
    02c661 sep #$30  A:1e00 X:0018 Y:0000 S:1c34 D:0a00 DB:02 nvmXdIZc V:  8 H: 390
    02c663 lda #$08  A:1e00 X:0018 Y:0000 S:1c34 D:0a00 DB:02 nvMXdIZc V:  8 H: 412
    02c665 sta $40  [000a40] A:1e08 X:0018 Y:0000 S:1c34 D:0a00 DB:02 nvMXdIzc V:  8 H: 428
    02c667 lda $0408  [020408] A:1e08 X:0018 Y:0000 S:1c34 D:0a00 DB:02 nvMXdIzc V:  8 H: 452
    02c66a jsl $00ff29  [00ff29] A:1e00 X:0018 Y:0000 S:1c34 D:0a00 DB:02 nvMXdIZc V:  8 H: 484
    
    Ở đây ta có dòng xử lý :
    Mã:
    02c663 lda #$08  A:1e00 X:0018 Y:0000
    Lệnh này thực hiện nạp giá trị 08 hex vào A. Đây là con số thể hiện tỉ lệ % để xuất hiện xử lý "Angry" của các thủ môn chủ yếu (ngoại trừ Genzo).
    Tỉ lệ này = 08 hex / FF hex (8 / 255) = 0.03 = 3%. Vậy tỉ lệ để xuất hiện đoạn xử lý "Angry" cho các thủ môn là 3% khi thực hiện chặn bóng (catch/punch).
    Để chỉnh tỉ lệ "Angry" này lên 100%. Đầu tiên chuyển địa chỉ LoRom 02C663 bằng Lunar Address ra địa chỉ Offset trong file rom là 1 4663.
    Mở rom game bằng Hex Editor và Goto offset 1 4663 ta có :
    4.jpg
    A9 08 trong đó A9 là lệnh LDA và 08 là giá trị hex (lda #08). Để chuyển thành tỉ lệ 100% thì thay 08 = FF (max 1 byte). Code trên trở thành A9 FF.
    Reload lại game và test lại với các thủ môn chính.

    Với Wakabayashi (Genzo). Cũng thực hiện lấy log tương tự như trên với bsnes debugger (có thể dùng snes9x debugger). Khi Genzo thực hiện "Angry" và ghi lại log, ta có nội dung log như sau (di chuyển tới cuối file log).
    Mã:
    02c6c0 ora #$80  A:be00 X:0000 Y:0001 S:1c34 D:0a00 DB:02 nvMXdIZc V:  9 H: 648
    02c6c2 sta $040a  [02040a] A:be80 X:0000 Y:0001 S:1c34 D:0a00 DB:02 NvMXdIzc V:  9 H: 664
    
    Lưu trữ giá trị 80 vào vùng nhớ 7E040A.
    Đi lên tiếp ta có đoạn code xử lý :
    Mã:
    02c675 lda [$c0],y  [7e3401] A:3400 X:000c Y:0001  // load giá trị từ 7E3401 để kiểm tra thủ môn đội mình
    02c677 cmp #$20  A:3420 X:000c Y:0001 // so sánh với 20 xem có phải là Genzo
    02c679 bne $c67f  [02c67f] A:3420 X:000c Y:0001 //nếu không phải Genzo thì nhảy tới xử lý ở 02C67F ở dưới
    02c67b lda #$10  A:3420 X:000c Y:0001 //nạp vào A giá trị tỉ lệ xuất hiện "Angry" của Genzo
    02c67d sta $40  [000a40] A:3410 X:000c Y:0001 // lưu giá trị này vào vùng nhớ 7E0A40
    02c67f lda $050f  [02050f] A:3410 X:000c Y:0001
    
    Ở đây ta có đoạn : 02C67B LDA #10 là đoạn nạp giá trị tỉ lệ ra "Angry" của Genzo. Cũng thực hiện như trên, Goto 1 467B (02C67B) : A9 10. Thay thành A9 FF. 10 hex = 16 , tỉ lệ của Genzo thực hiện "Angry" là 6% (16/255).
    Reload lại file rom game và kiểm tra lại xem Genzo có thực hiện "Angry" 100% ở các lần Catch/Punch.

    Kết luận : để chỉnh tỉ lệ "Angry" 100% cho các thủ môn thì thực hiện chỉnh trong filre rom game như sau :
    Goto 14663 : thay thành A9 FF.
    Goto 1467B : thay thành A9 FF.

    Một số thủ môn đã test được có thực hiện xử lý "Angry" : Renato (Sao Paulo), Morisaki, Wakashimazu, Wakabayashi, Gertize, Muller, Hernandez.
     
    Chỉnh sửa cuối: 12/7/16
  12. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Học Assembly đẻ hiểu ý nghĩa của các dòng lệnh trong log, từ đó hiểu được cấu tạo của game như thế nào. Nhờ vậy, ta có thể chỉnh sửa mọi thứ trong game, từ đơn giản cho tới ảo diệu. Tất cả mọi điều đều có thể làm được với asm, miễn là không vượt quá năng lực xử lý của phần cứng.
    Chẳng hạn, ta có thể chỉnh sửa sao cho khi địch đá vào lưới ta, tỷ số không tăng, hay giảm, hay tăng tỷ số cho ta...
    Nghe có vẻ vô lý, nhưng tất cả đều làm được với asm.
    Còn cheat thì chỉ làm được một số điều đơn giản như ấn định tỷ số giữa ta và địch, chứ nó không thể giúp ta tăng tỷ số khi ta bị thủng lưới.

    Ở đây là cách làm cụ thể cho ví dụ trên.

    1/ Dùng chức năng Search for new cheats hay phần mềm can thiệp RAM bên ngoài để tìm được địa chỉ quản lý tỷ số: $7E040D (tỷ số ta) và $7E040E (tỷ số địch).

    2/ Đặt write break point ở địa chỉ $7E040D (hoặc $7E040E), chơi game cho tới khi một trong hai bên ghi bàn. Lúc này game sẽ dừng lại theo đúng yêu cầu của ta: dừng khi có giá trị được ghi vào hai địa chỉ này. Giả sử bên ta ghi bàn.

    3/ Kiểm tra log, sẽ thấy được đoạn

    Mã:
    $02/9D23 FE 0D 04    INC $040D,x[$02:040D]   A:9C15 X:0000 Y:0021 D:0A00 DB:02 S:1C3D P:envMXdIZC HC:0516 VC:260 FC:14 I:00
    $02/9D26 86 00       STX $00    [$00:0A00]   A:9C15 X:0000 Y:0021 D:0A00 DB:02 S:1C3D P:envMXdIzC HC:0624 VC:260 FC:14 I:00
    Đoạn này cho thấy giá trị tại 040D (bản sao của 7E040D) được gia tăng một giá trị (INC).
    Tại đây, nếu ta sửa FE 0D 04 thành EA EA EA, tức

    NOP
    NOP
    NOP

    Thì game sẽ không làm gì cả, khi ta ghi bàn. Lúc này, nếu như ta hay địch có đá vào lưới nhau thì tỷ số vẫn không tăng.
    Trường hợp nếu muốn một bàn thắng của ta mang lại 3 tỷ số thì chỉ việc nhân 3 lần

    INC $040D,x (với x = 0 để địa chỉ đích là 040D)
    INC $040D,x
    INC $040D,x

    Trường hợp khi địch ghi bàn thì x=1, tức áp dụng vào địa chỉ đích 040D + 1 = 040E.
    Lúc này, nếu muốn tỷ số của ta tăng dù địch ghi bàn, thì làm:

    DEX (giảm x một đơn vị, từ 1 về 0)
    INC $040D,x

    Như vậy, tỷ số của ta được tăng dù địch có đá vào lưới ta.

    Trên đây là một ví dụ nho nhỏ cho thấy sức mạnh của ASM.
     
    ozone thích bài này.
  13. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
     
    traitim_virus thích bài này.
  14. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Cách chỉnh sửa vào Rom sao cho 7E040A luôn có giá trị cố định.

    Log nguyên thuỷ:
    $01/D4E3 FE 0A 04 INC $040A,x[$01:040A] A:0080 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIzC HC:1062 VC:259 FC:31 I:00
    $01/D4E6 A5 A5 LDA $A5 [$00:18A5] A:0080 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIzC HC:1122 VC:259 FC:31 I:00
    $01/D4E8 0A ASL A A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZC HC:1154 VC:259 FC:31 I:00
    $01/D4E9 AA TAX A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZc HC:1176 VC:259 FC:31 I:00
    $01/D4EA BD BD 04 LDA $04BD,x[$01:04BD] A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZc HC:1198 VC:259 FC:31 I:00

    Giờ ta viết lại:

    org $01D4E3 ;
    bắt đầu chỉnh sửa từ $001D4E3
    JML $2A9D00 ; nhảy tới $2A9D00, là chỗ trống trong Rom ($151D00 trong địa chỉ PC)
    org $2A9D00 ; bắt đầu chỉnh sửa từ $2A9D00

    LDA #$2A ;
    tải giá trị 2A vào register A
    PHA ; lưu giá trị của A ($2A) và stack
    PLB ; kéo giá trị của stack ($2A) vào Data bank. Lúc này DB là $2A
    LDA #$80 ; tải giá trị $80 vào A
    STA $040A ; chứa giá trị của A ($80) vào $040A, tức $7E040A
    LDA #$A5 ; tải giá trị $A5 vào A. Từ đâu trở đi là code cũ, không thay đổi
    ASL A ; nhân đôi A
    TAX ; chuyển A cho X
    LDA #$01 ; Lấy lại DB = 01 trước khi nhảy về vị trí code cũ
    PHA
    PLB
    JML $01D4EA ; trở về code cũ
     
    ozone thích bài này.
  15. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    Xin được hỏi một số điều chưa rõ trong đoạn code trên (xin lỗi bác trước nếu có hỏi những câu cơ bản hoặc quá gà :D) :
    - Việc thay đổi giá trị trong thanh ghi databank cho phù hợp với địa chỉ khi JML có phải là bắt buộc ? Nếu chỉ có JML không thì có gây lỗi game khi xử lý hay không?
    - "LDA #$A5 " : cái này có phải là gõ nhầm, phải là "LDA $A5" ?
    - LDA #$01 : ở đây nạp 01 vào A. Sau đó là quay trở về code cũ ở $01D4EA. Theo đoạn code gốc thì tại $01D4EA A đang mang giá trị 00. Vậy có gây ảnh hưởng gì tiếp theo hay không ?
    - Nếu có thể được thì bác hướng dẫn và góp ý thêm cho các phần post của mình sắp tới nhé :D
     
  16. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Q: Việc thay đổi giá trị trong thanh ghi databank cho phù hợp với địa chỉ khi JML có phải là bắt buộc ?
    A: bắt buộc. Bạn có thể thử không thay đổi và sẽ thấy đơ game. Dữ liệu gốc đang xử lý ở bạn 01, ta lái nó sang bank 2A hay đâu đó có chỗ trống thì phải chỉnh lại giá trị của DB. Tuy nhiên không thể tải trực tiếp giá trị vào DB, mà phải thông qua chức năng push và pull của stack.

    Q: Nếu chỉ có JML không thì có gây lỗi game khi xử lý hay không?
    A: JML nghĩa là Jump Long. Jump thì phải có địa chỉ phía sau, còn Jump đứng một mình nó không có ý nghĩa. Giống như bạn ra lệnh cho đầy tớ: đi! thì nó sẽ không hiểu. Nhưng nói: đi ra chợ! thì nó hiểu.

    Q: "LDA #$A5 " : cái này có phải là gõ nhầm, phải là "LDA $A5" ?
    A: đúng rồi, mình nhầm. Vừa kiểm lại log.

    Q: LDA #$01 : ở đây nạp 01 vào A. Sau đó là quay trở về code cũ ở $01D4EA. Theo đoạn code gốc thì tại $01D4EA A đang mang giá trị 00. Vậy có gây ảnh hưởng gì tiếp theo hay không ?
    A: nạp 01 vào A để quay trở lại bank 01. Tại $01/D4EA ta có:

    LDA $04BD,x

    Nghĩa là tải giá trị tại $04BD + x vào A, nghĩa là bất chấp lúc đó mang giá trị gì đi nữa thì nó vẫn chưa giá trị của $04BD + x.
    Giả sử X=2, tại $04BD + 2= $04BF có giá trị là FF thì A sẽ mang giá trị FF sau lệnh trên, bất kể trước đó A có là 00 hay 01.
    Tức là không gây ảnh hưởng gì cả.
     
    ozone thích bài này.
  17. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Code nguyên thủy và giải thích

    $01/D4E1 E2 20 SEP #$20 A:0080 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envmXdIzC HC:1032 VC:259 FC:31 I:00

    Set Process Register cho bit 5. Bit này điều khiển sức chứa của A. Set đưa A về 8 bit.

    $01/D4E3 9C 0A 04 STZ $040A [$01:040A] A:0080 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIzC HC:1062 VC:259 FC:31 I:00

    Store Zero to $040A: đưa giá trị tại $040A về 0.

    $01/D4E6 A5 A5 LDA $A5 [$00:18A5] A:0080 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIzC HC:1122 VC:259 FC:31 I:00

    Tải giá trị tại $A5 + D = $18A5 vào A.

    $01/D4E8 0A ASL A A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZC HC:1154 VC:259 FC:31 I:00

    Shift left A: nhân đôi giá trị của A

    $01/D4E9 AA TAX A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZc HC:1176 VC:259 FC:31 I:00

    Transfer A to X: chuyển giá trị của A cho X

    $01/D4EA BD BD 04 LDA $04BD,x[$01:04BD] A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZc HC:1198 VC:259 FC:31 I:00

    Tải giá trị của DB + $04BD + X vào A

    $01/D4ED 8D 09 04 STA $0409 [$01:0409] A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZc HC:1238 VC:259 FC:31 I:00

    Chứa giá trị trên vào DB + $0409

    $01/D4F0 C9 03 CMP #$03 A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZc HC:1278 VC:259 FC:31 I:00

    So sánh giá trị trên với 3

    $01/D4F2 D0 26 BNE $26 [$D51A] A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:eNvMXdIzc HC:1302 VC:259 FC:31 I:00

    Branch if Not Equal: phân nhánh tới 26 byte sau đó ($D51A) nếu giá trị kia không bằng 3

    $01/D51A E2 20 SEP #$20 A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:eNvMXdIzc HC:1332 VC:259 FC:31 I:00

    Đưa A về 8 bit

    $01/D51C C9 00 CMP #$00 A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:eNvMXdIzc HC:1362 VC:259 FC:31 I:00

    So sánh A với 00

    $01/D51E D0 2C BNE $2C [$D54C] A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZC HC:0022 VC:260 FC:31 I:00

    Nếu A khác 00, nhảy tới $D54C

    $01/D520 AD 08 04 LDA $0408 [$01:0408] A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZC HC:0046 VC:260 FC:31 I:00

    Tải giá trị của DB + $0408 vào A

    $01/D523 AE 09 04 LDX $0409 [$01:0409] A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZC HC:0086 VC:260 FC:31 I:00

    Tải giá trị của DB + $0409 vào X

    $01/D526 22 06 DC 02 JSL $02DC06[$02:DC06] A:0000 X:0000 Y:000B D:1800 DB:01 S:1C36 P:envMXdIZC HC:0126 VC:260 FC:31 I:00

    Nhảy tới subroutine $02DC06
     
    ozone thích bài này.
  18. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Từ đây bạn có thể viết tiếp để tất cả thủ môn đều có Angry như Muller với Genzo.
     
  19. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    1.2 Tsubasa Twin Tackle
    Ở chế độ đá All Stars, nếu đội bạn (CPU - không phải P2) có Tsubasa và Hyuga trong đội hình thì khi đối đầu, Tsubasa sẽ thực hiện skill ẩn Twin Tackle kết hợp với Hyuga. Twin Tackle có khả năng lấy bóng 100% (cái này không chắc lắm), và skill này là hàng độc quyền của riêng đội CPU.
    Vì skill này là skill ẩn, điều kiện sử dụng là đội CPU và thời điểm sử dụng phải có mặt Hyuga trong đội CPU (ngoài ra là cần ít nhất 200 guts nhưng đội CPU không tính phần Guts).
    insta.gif

    2 cách để làm :
    1. Chỉnh sửa giá trị trong Ram : tra web như ở phần đầu tiên để lấy giá trị Ram. Set : 7E04BE 08 mỗi khi Tsubasa đối đầu với cầu thủ đội bạn.
    1.jpg

    2. Chỉnh sửa file Rom :
    Đầu tiên nhận xét tại dãy offset "All Skill" của Tsubasa : 2 FB AC : phần value cho Tackle không phải 00 00 mà là FF 1D. Goto tới 2 FF1D là giá trị 08 19. Với "08" là giá trị hex của Twin Tackle và 19 là giá trị hex của Hyuga (người kết hợp trong skill Twin Tackle). Chứng tỏ Twin Tackle vẫn có nhưng không hiện ra khi trong đội của P1, P2.
    Tạo 2 Save State để kiểm tra : ở đây dùng snes9x debugger.
    - Tsubasa đội nhà đối đầu với cầu thủ đội bạn : ghi log CPU bắt đầu khi chuẩn bị chọn Tackle và kết thúc ghi log ở màn hình chuẩn bị cảnh Lừa / Tackle.
    Mở log này và tìm vùng offset 2 FF1D để xem game load giá trị này vào và xử lý. (Chuyển 2FF1D thành LoRom 5FF1D. Search chuỗi " :FF1D]". Ta có đoạn log :
    Mã:
    $02/F14F 08  PHP  A:F14E X:0002 Y:009F D:1800 DB:04 S:1C28 P:envMXdIZc HC:0654 VC:002 FC:51 I:00
    $02/F150 E2 30  SEP #$30  A:F14E X:0002 Y:009F D:1800 DB:04 S:1C27 P:envMXdIZc HC:0684 VC:002 FC:51 I:00
    $02/F152 A0 00  LDY #$00  A:F14E X:0002 Y:009F D:1800 DB:04 S:1C27 P:envMXdIZc HC:0714 VC:002 FC:51 I:00
    $02/F154 B7 19  LDA [$19],y[$05:FF1D]  A:F14E X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZc HC:0762 VC:002 FC:51 I:00
    $02/F156 C9 01  CMP #$01  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIzc HC:0818 VC:002 FC:51 I:00
    $02/F158 F0 25  BEQ $25  [$F17F]  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIzC HC:0842 VC:002 FC:51 I:00
    $02/F15A C9 07  CMP #$07  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIzC HC:0866 VC:002 FC:51 I:00
    $02/F15C D0 07  BNE $07  [$F165]  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIzC HC:0890 VC:002 FC:51 I:00
    $02/F165 C9 08  CMP #$08  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIzC HC:0920 VC:002 FC:51 I:00
    $02/F167 F0 05  BEQ $05  [$F16E]  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZC HC:0944 VC:002 FC:51 I:00
    $02/F16E AD 00 04  LDA $0400  [$04:0400]  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZC HC:0974 VC:002 FC:51 I:00
    $02/F171 C9 15  CMP #$15  A:F115 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIzC HC:1014 VC:002 FC:51 I:00
    $02/F173 90 0D  BCC $0D  [$F182]  A:F115 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZC HC:1038 VC:002 FC:51 I:00
    $02/F175 AD 08 18  LDA $1808  [$04:1808]  A:F115 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZC HC:1062 VC:002 FC:51 I:00
    $02/F178 F0 08  BEQ $08  [$F182]  A:F100 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZC HC:1102 VC:002 FC:51 I:00
    $02/F182 28  PLP  A:F100 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZC HC:1198 VC:002 FC:51 I:00
    $02/F183 60  RTS  A:F100 X:0002 Y:0000 D:1800 DB:04 S:1C28 P:envMXdIZc HC:1234 VC:002 FC:51 I:00
    Theo trên : nạp vùng địa chỉ 2 FF1D (5 FF1D), so sánh với 01 (SkyLab Tackle), nếu không phải thì so sánh với 07 (Eagle Tackle), nếu không phải thì so sánh với 08 (Twin Tackle), nếu bằng thì nhảy tới 2 F16E.
    Tại $2F16E, thực hiện nạp giá trị tại vùng nhớ 7E0400 (qui định trận đấu Kick Off - xem web), test xem có = 15 hex (số trận đấu kick off đi từ 00 -> 14 hex). Ở đây = 15 tức là đang ở chế độ đá All Stars.
    Tại vị trí hiện tại của Log, tìm chuỗi ":0471]" là vùng nhớ 7E0471 qui định dòng skill thứ 2 của Menu "Tackle" hiện tại của Tsubasa. Kết quả là không tìm thấy vì ở đây Tsubasa chỉ có mỗi Tackle thường như hình
    2.jpg

    - Tiếp theo sẽ so sánh với 1 Skill Tackle khác, chọn Kamisori Tackle (02) của Souda để không dính vào các trường hợp như log vừa rồi đã nêu (01, 07, 08).
    Thực hiện ghi log khi bắt đầu chọn vào Tackle của Souda, tiếp theo chọn Kamisori Tackle. Khi màn hình chuyển sang cảnh mới thì ngừng ghi log.
    Áp dụng nguyên tắc đã nói trên để tìm địa chỉ offset qui định Kamisori Tackle của Souda
    Value Ram của Souda là 1A, lấy 2Ax2 (hex) = 34 => Offset chứa con trỏ All Skill 2 FB34 = FC 0E => goto 2 FC0E là dãy giá trị All Skill => Tackle : FF 24 => 2 FF24 chứa giá trị của Kamisori Tackle => 2 FF24 = 02
    Ghi nhận địa chỉ offset 2 FF24 để tìm trong log vừa lấy được của kamisori tackle (search chuỗi ":FF24]". Ta có:
    Mã:
    $02/F14F 08  PHP  A:F14E X:0002 Y:009F D:1800 DB:04 S:1C2D P:envMXdIZc HC:0534 VC:002 FC:53 I:00
    $02/F150 E2 30  SEP #$30  A:F14E X:0002 Y:009F D:1800 DB:04 S:1C2C P:envMXdIZc HC:0604 VC:002 FC:53 I:00
    $02/F152 A0 00  LDY #$00  A:F14E X:0002 Y:009F D:1800 DB:04 S:1C2C P:envMXdIZc HC:0634 VC:002 FC:53 I:00
    $02/F154 B7 19  LDA [$19],y[$05:FF24]  A:F14E X:0002 Y:0000 D:1800 DB:04 S:1C2C P:envMXdIZc HC:0682 VC:002 FC:53 I:00
    $02/F156 C9 01  CMP #$01  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C2C P:envMXdIzc HC:0738 VC:002 FC:53 I:00
    $02/F158 F0 25  BEQ $25  [$F17F]  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C2C P:envMXdIzC HC:0762 VC:002 FC:53 I:00
    $02/F15A C9 07  CMP #$07  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C2C P:envMXdIzC HC:0786 VC:002 FC:53 I:00
    $02/F15C D0 07  BNE $07  [$F165]  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:0810 VC:002 FC:53 I:00
    $02/F165 C9 08  CMP #$08  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:0840 VC:002 FC:53 I:00
    $02/F167 F0 05  BEQ $05  [$F16E]  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:0864 VC:002 FC:53 I:00
    $02/F169 20 E4 F1  JSR $F1E4  [$02:F1E4]  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:0888 VC:002 FC:53 I:00
    
    
    $02/F1E4 08  PHP  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C2A P:eNvMXdIzc HC:0942 VC:002 FC:53 I:00
    $02/F1E5 E2 30  SEP #$30  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C29 P:eNvMXdIzc HC:0972 VC:002 FC:53 I:00
    $02/F1E7 AE 70 04  LDX $0470  [$04:0470]  A:F102 X:0002 Y:0000 D:1800 DB:04 S:1C29 P:eNvMXdIzc HC:1002 VC:002 FC:53 I:00
    $02/F1EA 9D 71 04  STA $0471,x[$04:0471]  A:F102 X:0000 Y:0000 D:1800 DB:04 S:1C29 P:envMXdIZc HC:1042 VC:002 FC:53 I:00
    $02/F1ED EE 70 04  INC $0470  [$04:0470]  A:F102 X:0000 Y:0000 D:1800 DB:04 S:1C29 P:envMXdIZc HC:1088 VC:002 FC:53 I:00
    $02/F1F0 28  PLP  A:F102 X:0000 Y:0000 D:1800 DB:04 S:1C29 P:envMXdIzc HC:1208 VC:002 FC:53 I:00
    $02/F1F1 60  RTS  A:F102 X:0000 Y:0000 D:1800 DB:04 S:1C2A P:eNvMXdIzc HC:1244 VC:002 FC:53 I:00
    
    Cũng tương tự như ở trên, game load giá trị tại offset 2 FF24 (5FF24) và so sánh với 3 giá trị tackle (skylab, eagle, twin). Tiếp sau đó không có đoạn code kiểm tra trận đấu thuộc Kick Off / All Stars mà chuyển sang nhảy vào sub routine xử lý nạp giá trị vào vùng nhớ 7E 0470 và 7E 0471 để thêm dòng skill vào menu tackle của Souda.

    Quay lại với phần log Tackle thường của Tsubasa :
    Mã:
    $02/F165 C9 08  CMP #$08  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIzC HC:0920 VC:002 FC:51 I:00
    $02/F167 F0 05  BEQ $05  [$F16E]  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZC HC:0944 VC:002 FC:51 I:00
    $02/F16E AD 00 04  LDA $0400  [$04:0400]  A:F108 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIZC HC:0974 VC:002 FC:51 I:00
    $02/F171 C9 15  CMP #$15  A:F115 X:0002 Y:0000 D:1800 DB:04 S:1C27 P:envMXdIzC HC:1014 VC:002 FC:51 I:00
    
    Vì giá trị so sánh = 08 nên nhảy tới 2F16E để xử lý. Muốn được xử lý tiếp các dòng code như ở log của Kamisori thì bỏ điều kiện này đi.

    Goto 17167 trong file rom (2F167 ) : thay F0 05 thành EA EA. Giá trị EA = nop để game không xử lý gì ở đây và xử lý tiếp ở 2F169 (17169) giống như Kamisori Tackle.

    Vào game chọn Tsubasa cho đội mình và test lại. Ở đây không cần phải có Hyuga chung đội hoặc đang ở trên sân.

    3.jpg

    insta.gif
    ========================
    Tìm thêm : trên đây đã chỉnh thành công để Tsubasa sử dụng được Twin Tackle như là 1 skill bình thường cho P1 và P2. Tiếp theo thử add Twin Tackle vào trong danh sách skill của Tsubasa. Hiện tại trong thi đấu đã có Twin Tackle, tuy nhiên trong Meeting > Level - Tsubasa vẫn không list ra Twin Tackle.
    Trường hợp Tsubasa thuộc đội P1. Chọn Tsubasa vào đội P1 (vs Computer). Vào Meeting > Level - chọn Tsubasa :
    4.jpg
    Thực hiện ghi log : bắt đầu ghi log từ bảng Stats của Tsubasa, nhấn A để vào bảng danh sách skill rồi dừng ghi log. Mở log lên và tìm chuỗi ":FF1D]" (địa chỉ 2 FF1D nơi lưu giá trị của Twin Tackle).
    Mã:
    $02/F355 08  PHP  A:F354 X:000A Y:000E D:1800 DB:04 S:1C20 P:envMXdIzc HC:1028 VC:027 FC:56 I:00
    $02/F356 E2 30  SEP #$30  A:F354 X:000A Y:000E D:1800 DB:04 S:1C1F P:envMXdIzc HC:1058 VC:027 FC:56 I:00
    $02/F358 A0 00  LDY #$00  A:F354 X:000A Y:000E D:1800 DB:04 S:1C1F P:envMXdIzc HC:1088 VC:027 FC:56 I:00
    $02/F35A B7 19  LDA [$19],y[$05:FF1D]  A:F354 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZc HC:1136 VC:027 FC:56 I:00
    $02/F35C C9 08  CMP #$08  A:F308 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzc HC:1258 VC:027 FC:56 I:00
    $02/F35E D0 14  BNE $14  [$F374]  A:F308 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1282 VC:027 FC:56 I:00
    $02/F360 AD 00 04  LDA $0400  [$04:0400]  A:F308 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1306 VC:027 FC:56 I:00
    $02/F363 C9 15  CMP #$15  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:1346 VC:027 FC:56 I:00
    $02/F365 90 1C  BCC $1C  [$F383]  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1370 VC:027 FC:56 I:00
    $02/F367 A5 17  LDA $17  [$00:1817]  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0030 VC:028 FC:56 I:00
    $02/F369 C9 0B  CMP #$0B  A:F309 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:0062 VC:028 FC:56 I:00
    $02/F36B 90 16  BCC $16  [$F383]  A:F309 X:000A Y:0000 D:1800 DB:04 S:1C1F P:eNvMXdIzc HC:0086 VC:028 FC:56 I:00
    $02/F383 A9 01  LDA #$01  A:F309 X:000A Y:0000 D:1800 DB:04 S:1C1F P:eNvMXdIzc HC:0116 VC:028 FC:56 I:00
    $02/F385 28  PLP  A:F301 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzc HC:0140 VC:028 FC:56 I:00
    $02/F386 60  RTS  A:F301 X:000A Y:0000 D:1800 DB:04 S:1C20 P:envMXdIzc HC:0176 VC:028 FC:56 I:00
    

    Quay trở lại menu chính, chuyển Tsubasa vào danh sách dự bị (bench) và chọn phần Level của Tsubasa lần nữa. Ta có :
    6.jpg
    Như hình trên, khi chuyển vị trí Tsubasa ra nhóm dự bị thì danh sách skill lại có Twin Tackle.
    Thực hiện ghi log tương tự như trên : bắt đầu ghi log từ bảng Stats của Tsubasa, nhấn A để vào bảng danh sách skill rồi dừng ghi log. Mở log lên và tìm chuỗi ":FF1D]" (địa chỉ 2 FF1D nơi lưu giá trị của Twin Tackle).
    Mã:
    $02/F355 08  PHP  A:F354 X:000A Y:000E D:1800 DB:04 S:1C20 P:envMXdIzc HC:1024 VC:027 FC:49 I:00
    $02/F356 E2 30  SEP #$30  A:F354 X:000A Y:000E D:1800 DB:04 S:1C1F P:envMXdIzc HC:1054 VC:027 FC:49 I:00
    $02/F358 A0 00  LDY #$00  A:F354 X:000A Y:000E D:1800 DB:04 S:1C1F P:envMXdIzc HC:1084 VC:027 FC:49 I:00
    $02/F35A B7 19  LDA [$19],y[$05:FF1D]  A:F354 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZc HC:1132 VC:027 FC:49 I:00
    $02/F35C C9 08  CMP #$08  A:F308 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzc HC:1254 VC:027 FC:49 I:00
    $02/F35E D0 14  BNE $14  [$F374]  A:F308 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1278 VC:027 FC:49 I:00
    $02/F360 AD 00 04  LDA $0400  [$04:0400]  A:F308 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1302 VC:027 FC:49 I:00
    $02/F363 C9 15  CMP #$15  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:1342 VC:027 FC:49 I:00
    $02/F365 90 1C  BCC $1C  [$F383]  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1366 VC:027 FC:49 I:00
    $02/F367 A5 17  LDA $17  [$00:1817]  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0026 VC:028 FC:49 I:00
    $02/F369 C9 0B  CMP #$0B  A:F317 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:0058 VC:028 FC:49 I:00
    $02/F36B 90 16  BCC $16  [$F383]  A:F317 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:0082 VC:028 FC:49 I:00
    $02/F36D AD C5 04  LDA $04C5  [$04:04C5]  A:F317 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:0106 VC:028 FC:49 I:00
    $02/F370 30 11  BMI $11  [$F383]  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0146 VC:028 FC:49 I:00
    $02/F372 80 0B  BRA $0B  [$F37F]  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0170 VC:028 FC:49 I:00
    $02/F37F A9 00  LDA #$00  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0200 VC:028 FC:49 I:00
    $02/F381 28  PLP  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0224 VC:028 FC:49 I:00
    $02/F382 60  RTS  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C20 P:envMXdIzc HC:0260 VC:028 FC:49 I:00
    

    So sánh 2 đoạn log ta thấy trường hợp Twin Tackle không được add vào danh sách skill (Tsubasa ở đội hình chính). Thì có đoạn
    Mã:
    $02/F360 AD 00 04  LDA $0400  [$04:0400]  A:F308 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1306 VC:027 FC:56 I:00
    $02/F363 C9 15  CMP #$15  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:1346 VC:027 FC:56 I:00
    $02/F365 90 1C  BCC $1C  [$F383]  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1370 VC:027 FC:56 I:00
    $02/F367 A5 17  LDA $17  [$00:1817]  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0030 VC:028 FC:56 I:00
    $02/F369 C9 0B  CMP #$0B  A:F309 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:0062 VC:028 FC:56 I:00
    $02/F36B 90 16  BCC $16  [$F383]  A:F309 X:000A Y:0000 D:1800 DB:04 S:1C1F P:eNvMXdIzc HC:0086 VC:028 FC:56 I:00
    $02/F383 A9 01  LDA #$01  A:F309 X:000A Y:0000 D:1800 DB:04 S:1C1F P:eNvMXdIzc HC:0116 VC:028 FC:56 I:00
    
    Ở đoạn $02/F36B : thực hiện so sánh value trong A (09) với 0B, nếu nhỏ hơn thì nhảy tới $02/F383. Trong khi ở trường hợp Tsubasa trong danh sách dự bị thì không bị nhảy tới đoạn code tại $02/F383.
    Cách giải quyết : bỏ đoạn BCC $16 , tức là thay 90 16 tại 1736b (2 F36B) thành EA EA.
    Ngoài ra, ở đoạn đầu của cả 2 đoạn log trích ra ở trên, đều có đoạn kiểm tra xem phải đang ở chế độ All Stars, nếu đang là Kick Off thì không thực hiện add vào danh sách skill (nhảy tới 2 F383).
    Mã:
    $02/F363 C9 15  CMP #$15  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:1346 VC:027 FC:56 I:00
    $02/F365 90 1C  BCC $1C  [$F383]  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:1370 VC:027 FC:56 I:00
    Cũng tương tự, ta bỏ lệnh nhảy tới 2 F383 bằng cách goto 17365 ($02/F365) : thay 90 1C thành EA EA.

    Vào game và kiểm tra lại phần Kick Off (trận 1). Phần All Stars (P1) : mục Level của Tsubasa trong danh sách skill đã được add thêm Twin Tackle.

    Cuối cùng, xét trường hợp Tsubasa đang thuộc đội bạn (P2). Cũng thực hiện ghi log tương tự như 2 log trên. Mở file log và tìm ":FF1D]". Tại đoạn xử lý này, lưu ý đoạn sau :
    Mã:
    $02/F36D AD C5 04  LDA $04C5  [$04:04C5]  A:F315 X:000A Y:0000 D:1800 DB:04 S:1C1C P:envMXdIzC HC:0110 VC:028 FC:00 I:00
    $02/F370 30 11  BMI $11  [$F383]  A:F380 X:000A Y:0000 D:1800 DB:04 S:1C1C P:eNvMXdIzC HC:0150 VC:028 FC:00 I:00
    $02/F383 A9 01  LDA #$01  A:F380 X:000A Y:0000 D:1800 DB:04 S:1C1C P:eNvMXdIzC HC:0180 VC:028 FC:00 I:00
    $02/F385 28  PLP  A:F301 X:000A Y:0000 D:1800 DB:04 S:1C1C P:envMXdIzC HC:0204 VC:028 FC:00 I:00
    $02/F386 60  RTS  A:F301 X:000A Y:0000 D:1800 DB:04 S:1C1D P:envMXdIzc HC:0240 VC:028 FC:00 I:00
    
    Trong khi trướng hợp ở P1 khi add vào thì đoạn này như sau :
    Mã:
    $02/F36D AD C5 04  LDA $04C5  [$04:04C5]  A:F317 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIzC HC:0106 VC:028 FC:49 I:00
    $02/F370 30 11  BMI $11  [$F383]  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0146 VC:028 FC:49 I:00
    $02/F372 80 0B  BRA $0B  [$F37F]  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0170 VC:028 FC:49 I:00
    $02/F37F A9 00  LDA #$00  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0200 VC:028 FC:49 I:00
    $02/F381 28  PLP  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C1F P:envMXdIZC HC:0224 VC:028 FC:49 I:00
    $02/F382 60  RTS  A:F300 X:000A Y:0000 D:1800 DB:04 S:1C20 P:envMXdIzc HC:0260 VC:028 FC:49 I:00
    
    Ta thấy cũng như ở trên, tại $02/F370 lệnh BMI đã thực hiện vì thỏa điều kiện và nhảy tới $02/F383. Để xử lý, goto 17370 (02F370) và thay 30 11 bằng EA EA.
    Vào game All Stars mode, chọn P1 vs P2, cho Tsubasa vào team của P2 và test.

    Kết luận phần Twin Tackle :
    - Thêm Twin Tackle vào danh sách skill của Tsubasa : Kick Off, All Stars P1, All Stars P2 :
    17365 => EA EA
    1736B => EA EA
    17370 => EA EA

    - Thêm Twin Tackle vào bảng menu Tackle của Tsubasa khi thi đấu (Kick Off, All Stars P1, All Stars P2) :
    17167 => EA EA
     
    Chỉnh sửa cuối: 12/7/16
  20. ozone

    ozone Donkey Kong Lão Làng GVN

    Tham gia ngày:
    4/4/05
    Bài viết:
    405
    Nơi ở:
    Recycle Bin
    1.3. DriveTiger và FireDrive (ở đây không trình bày lại cách dùng cheat engine thay đổi giá trị trong Ram để có 2 skill này vì quá đơn giản)
    1.3.1. DriveTiger
    :
    Điều kiện : Tsubasa và Hyuga chung 1 đội. Khi đồng đội hoặc chính Tsubasa sút skill 2 lần liên tiếp mà không vào thì có 1 tỉ lệ Tsubasa sẽ thực hiện Drive Tiger.
    Dấu hiệu cho biết :
    1.jpg
    Sau đó Drive Tiger được add vào bảng menu Shoot của Tsubasa. Nếu sau 3 phút (giờ game) hoặc bóng văng ra biên, hoặc hết giờ thì skill này sẽ được xóa khỏi menu Shoot.

    Đầu tiên lấy log ở trạng thái bình thường : ghi log CPU từ lúc Tsubasa giữ bóng, sau đó chọn Shoot để vào menu Shoot, khi hiện menu Shoot lên (gồm Shoot, Drive Shoot, Cyclone) thì kết thúc ghi log. Tạm gọi là Log1.

    Tiếp theo ghi log khi DriveTiger đã được add vào menu Shoot. Muốn có DriveTiger thì phải kích hoạt điều kiện xuất hiện Drive Tiger : cho 1 cầu thủ đội nhà sút skill và bị thủ môn chặn, sau đó ở lần kế tiếp đội nhà lấy được bóng, chuyền tiếp cho 1 cầu thủ có skill shoot, save sate khi cầu thủ này chuẩn bị shoot skill - đây sẽ là lần sút thứ 2 sau khi bị fail 1 lần. Sau đó kiểm tra khi thủ môn đội bạn chặn được bóng và đưa bóng trở lại sân, nếu đạt được tỉ lệ kích hoạt thì sẽ xuất hiện gương mặt của Tsubasa, nếu không thì load lại state và thực hiện lại sút skill. Sau cùng, khi đã kích hoạt được, thì trong 3 phút game cố gắng chuyền bóng cho Tsubasa. Lúc này Drive Tiger đã được thêm vào menu Shoot. Cũng lấy log từ lúc chọn Shoot cho tới lúc hiện menu Shoot (bao gồm : Shoot, Drive Shoot, Cyclone, Drive Tiger) rồi dừng log để save. Tạm gọi là Log2.

    Mở Log1 và Log2 trong Notepad++ và so sánh. Tìm đoạn xử lý của Drive Tiger. Theo các VD trên ta có dãy skill shoot của Tsubasa bắt đầu từ offset 2 FE80. Goto 2FE80 và tìm Drive Tiger : nằm ở 2 FE8B : 48 19. Dùng Lunar Adddress chuyển 2 FE8B thành 5FE8B (LoRom). Quay lại Notepad++ và search chuỗi 05:FE8B trên cả 2 log.
    Mã:
    $02/ED9C A4 1C  LDY $1C  [$00:181C]  A:EF00 X:0026 Y:00D2 D:1800 DB:04 S:1C2C P:envMXdIzC HC:0850 VC:043 FC:05 I:00
    $02/ED9E B7 19  LDA [$19],y[$05:FE8B]  A:EF00 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzC HC:0906 VC:043 FC:05 I:00
    $02/EDA0 29 03  AND #$03  A:EF48 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzC HC:0962 VC:043 FC:05 I:00
    $02/EDA2 C9 03  CMP #$03  A:EF00 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIZC HC:0986 VC:043 FC:05 I:00
    $02/EDA4 D0 E0  BNE $E0  [$ED86]  A:EF00 X:0026 Y:000B D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:1010 VC:043 FC:05 I:00
    $02/ED86 A4 1C  LDY $1C  [$00:181C]  A:EF00 X:0026 Y:000B D:1800 DB:04 S:1C2C P:eNvMXdIzc HC:1040 VC:043 FC:05 I:00
    $02/ED88 B7 19  LDA [$19],y[$05:FE8B]  A:EF00 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzc HC:1096 VC:043 FC:05 I:00
    $02/ED8A 29 03  AND #$03  A:EF48 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzc HC:1218 VC:043 FC:05 I:00
    $02/ED8C 85 1E  STA $1E  [$00:181E]  A:EF00 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIZc HC:1242 VC:043 FC:05 I:00
    $02/ED8E A4 1C  LDY $1C  [$00:181C]  A:EF00 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIZc HC:1274 VC:043 FC:05 I:00
    $02/ED90 B7 19  LDA [$19],y[$05:FE8B]  A:EF00 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzc HC:1330 VC:043 FC:05 I:00
    $02/ED92 4A  LSR A  A:EF48 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzc HC:0022 VC:044 FC:05 I:00
    $02/ED93 4A  LSR A  A:EF24 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzc HC:0044 VC:044 FC:05 I:00
    $02/ED94 85 1D  STA $1D  [$00:181D]  A:EF12 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzc HC:0066 VC:044 FC:05 I:00
    $02/ED96 38  SEC  A:EF12 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzc HC:0098 VC:044 FC:05 I:00
    $02/ED97 E9 03  SBC #$03  A:EF12 X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzC HC:0120 VC:044 FC:05 I:00
    $02/ED99 20 A8 ED  JSR $EDA8  [$02:EDA8]  A:EF0F X:0026 Y:000B D:1800 DB:04 S:1C2C P:envMXdIzC HC:0144 VC:044 FC:05 I:00
    
    2 trường hợp game đều xử lý như nhau ở đoạn này, di chuyển xuống tiếp một chút ở 2 Log cho tới khi có sự thay đổi giữa 2 Log như sau :
    Log1:
    Mã:
    $02/EEEE 08  PHP  A:EEED X:001E Y:00CA D:1800 DB:04 S:1C2A P:envMXdIzC HC:0072 VC:069 FC:23 I:00
    $02/EEEF E2 30  SEP #$30  A:EEED X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIzC HC:0102 VC:069 FC:23 I:00
    $02/EEF1 A5 1E  LDA $1E  [$00:181E]  A:EEED X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIzC HC:0132 VC:069 FC:23 I:00
    $02/EEF3 CD 17 04  CMP $0417  [$04:0417]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZC HC:0164 VC:069 FC:23 I:00
    $02/EEF6 D0 11  BNE $11  [$EF09]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZC HC:0204 VC:069 FC:23 I:00
    $02/EEF8 AD 6E 04  LDA $046E  [$04:046E]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZC HC:0228 VC:069 FC:23 I:00
    $02/EEFB C9 04  CMP #$04  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZC HC:0268 VC:069 FC:23 I:00
    $02/EEFD F0 0A  BEQ $0A  [$EF09]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:eNvMXdIzc HC:0292 VC:069 FC:23 I:00
    $02/EEFF AD 8A 04  LDA $048A  [$04:048A]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:eNvMXdIzc HC:0316 VC:069 FC:23 I:00
    $02/EF02 10 05  BPL $05  [$EF09]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZc HC:0356 VC:069 FC:23 I:00
    $02/EF09 E6 1C  INC $1C  [$00:181C]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZc HC:0386 VC:069 FC:23 I:00
    $02/EF0B E6 1C  INC $1C  [$00:181C]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIzc HC:0432 VC:069 FC:23 I:00
    $02/EF0D 28  PLP  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIzc HC:0478 VC:069 FC:23 I:00
    $02/EF0E 60  RTS  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C2A P:envMXdIzC HC:0514 VC:069 FC:23 I:00
    
    Log2
    Mã:
    $02/EEEE 08  PHP  A:EEED X:001E Y:00CA D:1800 DB:04 S:1C2A P:envMXdIzC HC:1054 VC:044 FC:05 I:00
    $02/EEEF E2 30  SEP #$30  A:EEED X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIzC HC:1084 VC:044 FC:05 I:00
    $02/EEF1 A5 1E  LDA $1E  [$00:181E]  A:EEED X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIzC HC:1180 VC:044 FC:05 I:00
    $02/EEF3 CD 17 04  CMP $0417  [$04:0417]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZC HC:1212 VC:044 FC:05 I:00
    $02/EEF6 D0 11  BNE $11  [$EF09]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZC HC:1252 VC:044 FC:05 I:00
    $02/EEF8 AD 6E 04  LDA $046E  [$04:046E]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZC HC:1276 VC:044 FC:05 I:00
    $02/EEFB C9 04  CMP #$04  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:envMXdIZC HC:1316 VC:044 FC:05 I:00
    $02/EEFD F0 0A  BEQ $0A  [$EF09]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:eNvMXdIzc HC:1340 VC:044 FC:05 I:00
    $02/EEFF AD 8A 04  LDA $048A  [$04:048A]  A:EE00 X:001E Y:00CA D:1800 DB:04 S:1C29 P:eNvMXdIzc HC:1364 VC:044 FC:05 I:00
    $02/EF02 10 05  BPL $05  [$EF09]  A:EE80 X:001E Y:00CA D:1800 DB:04 S:1C29 P:eNvMXdIzc HC:0040 VC:045 FC:05 I:00
    $02/EF04 20 5B EE  JSR $EE5B  [$02:EE5B]  A:EE80 X:001E Y:00CA D:1800 DB:04 S:1C29 P:eNvMXdIzc HC:0064 VC:045 FC:05 I:00
    
    Tại dòng "$2/EF02 10 05 BPL $05 [$EF09]" : Log1 thỏa điều kiện và nhảy tới $2/EF09. Còn Log2 xử lý tiếp.
    Cho nên muốn Log1 (không add DriveTiger) xử lý như Log2 (Add DriveTiger) thì bỏ dòng xử lý ở 2/EF02 đi. Chuyển 2EF02 thành 16F02 (PC File Address). Mở file rom game và Goto 16F02. Tại đây thay 10 05 thành EA EA.
    Vào game, chọn Tsubasa và Hyuga chung đội. Chuyền cho Tsubasa để kiểm tra. Hiện có thể sử dụng Drive Tiger như 1 skill shoot bình thường.
    2.jpg
    Điều kiện 2 lần liên tiếp sút failed và đạt tỉ lệ % vẫn còn trong game, nhưng không ảnh hưởng vì ở đây đã chỉnh cho game xử lý luôn add Drive Tiger vào như 1 skill Shoot vốn có của Tsubasa.
    Ngoài ra, còn phần xử lý kiểm tra xem Hyuga có đang ở chung đội tại cùng thời điểm hay không. Phần này có thể bỏ qua.

    Tìm hiểu thêm về đoạn xử lý để đạt điều kiện có Driver Tiger mặc định của game. (không quá cần thiết)
    Trả về giá trị 10 05 tại 16F02 như cũ.
    Theo Log1 và Log2 ở trên, ta có trước khi thực hiện kiểm tra để nhảy tới 2 EF09 thì có thao tác nạp vùng nhớ 7E 048A (LDA $048A [$04:048A] )
    Trường hợp khi đã kích hoạt điều kiện Drive Tiger, vùng nhớ này có giá trị 80 (xem phần Log2).
    Show Hex - Viewing : Ram và set Range : 7E048A - 7E048A để theo dõi sự thay đổi giá trị tại vùng nhớ này như sau :
    00 : giá trị ban đầu hoặc khi reset điều kiện.
    01 : khi đã sút skill fail 1 lần, thủ môn chặn được
    C0 : khi đã sút skill fail lần 2, thủ môn chặn được
    80 : sau khi sút fail lần 2, bóng quay trở lại sân và có cầu thủ khống chế bóng, lúc này sẽ hiện hình gương mặt của Tsubasa, kích hoạt xong, skill Drive Tiger được add vào.
    C0 và 80 là trạng thái khi sút fail lần 2 thủ môn phá bóng.

    Tận dụng Save State đã chuẩn bị ở trên (lúc đã sút fail 1 lần). Set BreakPoint Write cho 7E048A. Cho cầu thủ đội mình sút tiếp lần 2 và ghi log lúc bóng bay đi cho tới lúc kích hoạt Breakpoint chuyển thành value C0. Tìm ";048A]" trong log này :
    Mã:
    $02/BD5E AD 8A 04  LDA $048A  [$02:048A]  A:2A0D X:000D Y:0000 D:0A00 DB:02
    $02/BD61 29 E0  AND #$E0  A:2A01 X:000D Y:0000 D:0A00 DB:02
    $02/BD63 F0 15  BEQ $15  [$BD7A]  A:2A00 X:000D Y:0000 D:0A00 DB:02
    $02/BD7A 80 10  BRA $10  [$BD8C]  A:2A00 X:000D Y:0000 D:0A00 DB:02
    $02/BD8C EE 8A 04  INC $048A  [$02:048A]  A:2A00 X:000D Y:0000 D:0A00 DB:02
    $02/BD8F AD 8A 04  LDA $048A  [$02:048A]  A:2A00 X:000D Y:0000 D:0A00 DB:02
    $02/BD92 C9 02  CMP #$02  A:2A02 X:000D Y:0000 D:0A00 DB:02
    $02/BD94 90 28  BCC $28  [$BDBE]  A:2A02 X:000D Y:0000 D:0A00 DB:02
    $02/BD96 AD 49 04  LDA $0449  [$02:0449]  A:2A02 X:000D Y:0000 D:0A00 DB:02
    $02/BD99 C9 10  CMP #$10  A:2A07 X:000D Y:0000 D:0A00 DB:02
    $02/BD9B 90 06  BCC $06  [$BDA3]  A:2A07 X:000D Y:0000 D:0A00 DB:02
    $02/BDA3 AD 4A 04  LDA $044A  [$02:044A]  A:2A07 X:000D Y:0000 D:0A00 DB:02
    $02/BDA6 C9 10  CMP #$10  A:2A2F X:000D Y:0000 D:0A00 DB:02
    $02/BDA8 90 06  BCC $06  [$BDB0]  A:2A2F X:000D Y:0000 D:0A00 DB:02
    $02/BDAA A5 04  LDA $04  [$00:0A04]  A:2A2F X:000D Y:0000 D:0A00 DB:02
    $02/BDAC 29 C0  AND #$C0  A:2AE0 X:000D Y:0000 D:0A00 DB:02
    $02/BDAE 85 04  STA $04  [$00:0A04]  A:2AC0 X:000D Y:0000 D:0A00 DB:02
    $02/BDB0 A2 1E  LDX #$1E  A:2AC0 X:000D Y:0000 D:0A00 DB:02
    $02/BDB2 A5 04  LDA $04  [$00:0A04]  A:2AC0 X:001E Y:0000 D:0A00 DB:02
    $02/BDB4 D0 02  BNE $02  [$BDB8]  A:2AC0 X:001E Y:0000 D:0A00 DB:02
    $02/BDB8 8D 8A 04  STA $048A  [$02:048A]  A:2AC0 X:001E Y:0000 D:0A00 DB:02
    $02/BDBB 8E 8B 04  STX $048B  [$02:048B]  A:2AC0 X:001E Y:0000 D:0A00 DB:02
    $02/BDBE 28  PLP  A:2AC0 X:001E Y:0000 D:0A00 DB:02
    $02/BDBF 60  RTS  A:2AC0 X:001E Y:0000 D:0A00 DB:02
    
    Đầu tiên thực hiện nạp từ 7E048A , lúc này đang là 01, sau đó vài xử lý lại tiếp tục nạp từ 7E048A, lúc này đang mang giá trị 02, đem so sánh với 02 tại $02/BD92. Tiếp tục là xử lý tới cuối cùng là nạp C0 vào 7E048A (STA $048A [$02:048A] A:2AC0)

    Để ý dòng "$02/BD92 C9 02 CMP #$02" : đây là nơi thực hiện so sánh tổng số cú sút fail = 2 để kích hoạt điều kiện. $02/BD92 -> 13D92 : C9 02.

    Tiếp theo là :
    Mã:
    $02/BD96 AD 49 04  LDA $0449  [$02:0449]  A:2A02 X:000D Y:0000 D:0A00 DB:02
    $02/BD99 C9 10  CMP #$10  A:2A07 X:000D Y:0000 D:0A00 DB:02
    
    Đây là đoạn so sánh để tìm tỉ lệ kích hoạt Drive Tiger. Go to 13D99 ($02/BD99) thay C9 10 thành C9 FF thì tỉ lệ kích hoạt Drive Tiger là 100% sau khi đá fail liên tiếp 2 skill.

    Sau cùng là cảnh thủ môn phá bóng, bóng văng ra và có 1 cầu thủ nào đó khống chế banh, lúc này chuyển sang hình ảnh gương mặt Tsubasa và giá trị tại 7E048A sẽ đổi thành 80.

    Kết luận :
    13D92 : C9 02 : qui định số cú sút fail liên tiếp. Ở đây có thể chỉnh thành 01 : tính tỉ lệ kích hoạt Drive Tiger sau 1 cú sút skill fail. (không chỉnh thành 00 được)
    13D99 : C9 10 : qui định tỉ lệ xuất hiện Drive Tiger (10 hex = 6%). Max = FF.

    Để kiểm tra, chỉnh 13D92 : C9 01 và 13D99 : C9 FF. Reload game, cho Tsubasa và Hyuga vào chung team, cho 1 cầu thủ trong team sút fail 1 shoot skill.

    Tổng kết : thêm Drive Tiger vào cho Tsubasa (điều kiện là có Hyuga chung team cùng thời điểm) :
    16F02 : 10 05 => EA EA

    (còn tiếp)
     
    Chỉnh sửa cuối: 13/7/16
    SpctrmXD and dark_knight_1408 like this.

Chia sẻ trang này