Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.

Yu-Gi-Oh! Ultimate Masters: World Championship Tournament 2006/ROM map

From Data Crystal
Jump to navigation Jump to search

Chip tiny.png The following article is a ROM map for Yu-Gi-Oh! Ultimate Masters: World Championship Tournament 2006.

Banlist Password

Enter character

080143F0 B570     push    r4-r6,r14                               ;
080143F2 1C04     mov     r4,r0                                   ;
080143F4 1C0B     mov     r3,r1                                   ;
080143F6 1C16     mov     r6,r2                                   ;
080143F8 490D     ldr     r1,=2000000h                            ;
080143FA 480E     ldr     r0,=6C2Ch                               ;
080143FC 1809     add     r1,r1,r0                                ;
080143FE 2007     mov     r0,7h                                   ;
08014400 7809     ldrb    r1,[r1]                                 ;
08014402 4008     and     r0,r1                                   ;
08014404 2800     cmp     r0,0h                                   ;
08014406 D003     beq     8014410h                                ;
08014408 480B     ldr     r0,=202348Ch                            ;
0801440A 7800     ldrb    r0,[r0]                                 ;
0801440C 2800     cmp     r0,0h                                   ;
0801440E D023     beq     8014458h                                ;
08014410 7821     ldrb    r1,[r4]                                 ;
08014412 2900     cmp     r1,0h                                   ;
08014414 D025     beq     8014462h                                ;
08014416 2A00     cmp     r2,0h                                   ;
08014418 D023     beq     8014462h                                ;
0801441A 2580     mov     r5,80h                                  ;
0801441C 1C28     mov     r0,r5                                   ;
0801441E 4008     and     r0,r1                                   ;
08014420 2800     cmp     r0,0h                                   ;
08014422 D00B     beq     801443Ch                                ;
08014424 7019     strb    r1,[r3]                                 ;Store charset
08014426 3401     add     r4,1h                                   ;
08014428 3301     add     r3,1h                                   ;
0801442A 7820     ldrb    r0,[r4]                                 ;Load character_id in r0
0801442C 7018     strb    r0,[r3]                                 ;Store character_id
0801442E E006     b       801443Eh                                ;

Retrieve CPU opponent's name

080242AE 0000     lsl     r0,r0,0h                                ;
080242B0 943C     str     r4,[sp,0F0h]                            ;
080242B2 09DC     lsr     r4,r3,7h                                ;
080242B4 6C2C     ldr     r4,[r5,40h]                             ;
080242B6 0000     lsl     r0,r0,0h                                ;
080242B8 6E5C     ldr     r4,[r3,64h]                             ;
080242BA 0000     lsl     r0,r0,0h                                ;
080242BC 3360     add     r3,60h                                  ;
080242BE 0202     lsl     r2,r0,8h                                ;
080242C0 6E48     ldr     r0,[r1,64h]                             ;
080242C2 0000     lsl     r0,r0,0h                                ;
080242C4 6E57     ldr     r7,[r2,64h]                             ;
080242C6 0000     lsl     r0,r0,0h                                ;
080242C8 485B     ldr     r0,=9E58D0Ch                            ;
080242CA 0DA1     lsr     r1,r4,16h                               ;
080242CC 1809     add     r1,r1,r0                                ;
080242CE 8848     ldrh    r0,[r1,2h]                              ;r0 = internal_card_id
080242D0 F0CAFC94 bl      80EEBFCh                                ;

Check if internal_card_id is valid, and convert it to card_id

080EE76C 0400     lsl     r0,r0,10h                               ;start of the function
080EE76E 0C02     lsr     r2,r0,10h                               ;
080EE770 1C11     mov     r1,r2                                   ;
080EE772 4808     ldr     r0,=0FA6h                               ;
080EE774 4282     cmp     r2,r0                                   ;
080EE776 D917     bls     80EE7A8h                                ;if (r2 ≤ 4006), branch to 080EE7A8
080EE778 4807     ldr     r0,=1BA6h                               ;
080EE77A 4282     cmp     r2,r0                                   ;
080EE77C D814     bhi     80EE7A8h                                ;if (r2 ≤ 7078), branch to 080EE7A8
080EE77E 4807     ldr     r0,=95B7CCCh                            ;r0 = pointer_to_cards_ids_array
080EE780 4A07     ldr     r2,=0FFFFF059h                          ;
080EE782 1889     add     r1,r1,r2                                ;r1 -= 0xFA7 [4007; Blue-Eyes White Dragon]
080EE784 0049     lsl     r1,r1,1h                                ;r1 << 1
080EE786 1809     add     r1,r1,r0                                ;r1 = pointer_to_cards_ids_array + ((internal_card_id - 4007) << 1)
080EE788 8809     ldrh    r1,[r1]                                 ;r1 = card_id
080EE78A 4806     ldr     r0,=0FFFFh                              ;
080EE78C 4281     cmp     r1,r0                                   ;
080EE78E D00B     beq     80EE7A8h                                ;if (invalid_card_id), branch to 080EE7A8
080EE790 1C08     mov     r0,r1                                   ;r0 = card_id
080EE792 E00A     b       80EE7AAh                                ;branch to 080EE7AA
080EE794 0FA6     lsr     r6,r4,1Eh                               ;-
080EE796 0000     lsl     r0,r0,0h                                ;-
080EE798 1BA6     sub     r6,r4,r6                                ;-
080EE79A 0000     lsl     r0,r0,0h                                ;-
080EE79C 7CCC     ldrb    r4,[r1,13h]                             ;-
080EE79E 095B     lsr     r3,r3,5h                                ;-
080EE7A0 F059FFFF bl      81487A2h                                ;-
080EE7A4 FFFF     bl      lr+0FFEh                                ;-
080EE7A6 0000     lsl     r0,r0,0h                                ;-
080EE7A8 2000     mov     r0,0h                                   ;... if (not an internal_card_id), r0 = 0
080EE7AA 4770     bx      r14                                     ;go back right after the function call (0xEEC07 in the case of displaying CPU opponents' names)

Checks which charset to use (Japanese or International), then branch depending on a look-up table using card_id

080EE7AC 1C02     mov     r2,r0                                   ;r2 = card_id
080EE7AE 1C0B     mov     r3,r1                                   ;r3 = [0x2006C2C] & 7
080EE7B0 480B     ldr     r0,=80000AEh                            ;
080EE7B2 8800     ldrh    r0,[r0]                                 ;r0 = second_part_of_game_code
080EE7B4 0A00     lsr     r0,r0,8h                                ;
080EE7B6 284A     cmp     r0,4Ah                                  ;
080EE7B8 D100     bne     80EE7BCh                                ;if the game is not Japanese, branch to 080EE7BC
080EE7BA E0D5     b       80EE968h                                ;else branch to 080EE968
080EE7BC 2B00     cmp     r3,0h                                   ;... if the game is not Japanese
080EE7BE D000     beq     80EE7C2h                                ;if (r3 == 0), branch to 080EE7C2
080EE7C0 E0D2     b       80EE968h                                ;else branch to 080EE968
080EE7C2 4908     ldr     r1,=98169B8h                            ;r1 = 0x98169B8
080EE7C4 2016     mov     r0,16h                                  ;
080EE7C6 4350     mul     r0,r2                                   ;
080EE7C8 1840     add     r0,r0,r1                                ;r0 = 0x98169B8 + (card_id × 22)
080EE7CA 8801     ldrh    r1,[r0]                                 ;r1 = [0x98169B8 + (card_id × 22)]
080EE7CC 4806     ldr     r0,=1498h                               ;
080EE7CE 4281     cmp     r1,r0                                   ;
080EE7D0 D044     beq     80EE85Ch                                ;if ((0x98169B8 + (card_id × 22)) == 0x1498), branch to 080EE85C
080EE7D2 4281     cmp     r1,r0                                   ;
080EE7D4 DC0A     bgt     80EE7ECh                                ;else if ((0x98169B8 + (card_id × 22)) > 0x1498), branch to 080EE7EC
080EE7D6 3801     sub     r0,1h                                   ;
080EE7D8 4281     cmp     r1,r0                                   ;
080EE7DA D011     beq     80EE800h                                ;if ((0x98169B8 + (card_id × 22))) == 0x1497), branch to 080EE800
080EE7DC E0C4     b       80EE968h                                ;else branch to 080EE968
080EE7DE 0000     lsl     r0,r0,0h                                ;
080EE7E0 00AE     lsl     r6,r5,2h                                ;
080EE7E2 0800     lsr     r0,r0,20h                               ;
080EE7E4 69B8     ldr     r0,[r7,18h]                             ;
080EE7E6 0981     lsr     r1,r0,6h                                ;
080EE7E8 1498     asr     r0,r3,12h                               ;
080EE7EA 0000     lsl     r0,r0,0h                                ;
080EE7EC 4803     ldr     r0,=1499h                               ;
080EE7EE 4281     cmp     r1,r0                                   ;
080EE7F0 D062     beq     80EE8B8h                                ;if ((0x98169B8 + (card_id × 22)) == 0x1499), branch to 080EE8B8
080EE7F2 3001     add     r0,1h                                   ;
080EE7F4 4281     cmp     r1,r0                                   ;
080EE7F6 D100     bne     80EE7FAh                                ;else if ((0x98169B8 + (card_id × 22)) ≠ 0x149A), branch to 080EE7FA (branch to 080EE968)
080EE7F8 E08A     b       80EE910h                                ;else branch to 080EE910
080EE7FA E0B5     b       80EE968h                                ;branch to 080EE968

Load pointer_to_card_name

080EE968 4905     ldr     r1,=95F3A5Ch                            ;r1 = 0x95F3A5C
080EE96A 0050     lsl     r0,r2,1h                                ;
080EE96C 1880     add     r0,r0,r2                                ;
080EE96E 0040     lsl     r0,r0,1h                                ;
080EE970 18C0     add     r0,r0,r3                                ;
080EE972 0080     lsl     r0,r0,2h                                ;
080EE974 1840     add     r0,r0,r1                                ;
080EE976 6800     ldr     r0,[r0]                                 ;r0 = [0x95F3A5C + ((card_id × 6 + ([0x2006C2C] & 7)) << 2)]
080EE978 4902     ldr     r1,=95BB594h                            ;r1 = 0x95BB594
080EE97A 1840     add     r0,r0,r1                                ;r0 = 0x95BB594 + pointer_to_card_name_pointer
080EE97C 4770     bx      r14                                     ;return

Retrieve card_id from an internal_card_id, retrieve EWRAM 02006C2Cn and call 080EE7AC

080EEBF2 0000     lsl     r0,r0,0h                                ;
080EEBF4 A508     add     r5,=80EEC18h                            ;
080EEBF6 0980     lsr     r0,r0,6h                                ;
080EEBF8 FF0C     bl      lr+0E18h                                ;
080EEBFA 095F     lsr     r7,r3,5h                                ;
080EEBFC B500     push    r14                                     ;
080EEBFE 0400     lsl     r0,r0,10h                               ;
080EEC00 0C00     lsr     r0,r0,10h                               ;
080EEC02 F7FFFDB3 bl      80EE76Ch                                ;call [#Check_if_internal_card_id_is_valid.2C_and_convert_it_to_card_id|Check if internal_card_id is valid, and convert it to card_id]
080EEC06 0400     lsl     r0,r0,10h                               ;
080EEC08 0C00     lsr     r0,r0,10h                               ;r0 = card_id
080EEC0A 4905     ldr     r1,=2000000h                            ;
080EEC0C 4A05     ldr     r2,=6C2Ch                               ;
080EEC0E 1889     add     r1,r1,r2                                ;r1 = 0x2006C2C
080EEC10 7809     ldrb    r1,[r1]                                 ;r1 = [0x2006C2C]
080EEC12 0749     lsl     r1,r1,1Dh                               ;
080EEC14 0F49     lsr     r1,r1,1Dh                               ;r1 &= 7
080EEC16 F7FFFDC9 bl      80EE7ACh                                ;call 080EE7AC
080EEC1A BC02     pop     r1                                      ;
080EEC1C 4708     bx      r1                                      ;branch to r1

Cards IDs array

  • 0x157BCCC to 0x15B917B - Conversion table from internal_card_id to card_id