Prepare Valid Deployment Tiles

From Final Fantasy Hacktics Wiki
Revision as of 04:15, 1 May 2025 by Nyzer (talk | contribs) (commented the shit out of this page, I don't understand the final section at all though)
Jump to navigation Jump to search
NOTE: while the comments of this routine specify "row" and "column", these may not be exact. Can't be bothered to math it out at the moment, it's not what I need here today anyway. ~Nyzer

Parameters: r4 (Preset Value) - Deployment Screen and ATTACK.OUT 001c6748 - 001c67c8 both use 0x801DB650, but ATTACK.OUT 001c67cc - 001c7284, which currently is undocumented, does a lot more with the value before sending it here.

001c7288: 3c02801d lui r2,0x801d
001c728c: 8c42d080 lw r2,-0x2f80(r2)
001c7290: 00000000 nop
001c7294: 14400077 bne r2,r0,0x001c7474
001c7298: 34050001 ori r5,r0,0x0001            # r5 = 1 to start.
001c729c: 3c02801d lui r2,0x801d
001c72a0: 8c42d274 lw r2,-0x2d8c(r2)           # Pointer to Current Squad Data
001c72a4: 00000000 nop
001c72a8: 90420007 lbu r2,0x0007(r2)           # Load orientation byte
001c72ac: 00000000 nop
001c72b0: 3043000f andi r3,r2,0x000f           # Isolate orientation with bitmap rotated
001c72b4: 1460001b bne r3,r0,0x001c7324        # Branch if not 0 (not default, needs to be rotated?)
001c72b8: 00004021 addu r8,r0,r0               # r8 = Current Row = 0 by default

## ORIENTATION 0 ##
001c72bc: 34090001 ori r9,r0,0x0001            # r9 = 1
001c72c0: 3c06801e lui r6,0x801e
001c72c4: 24c6cbc8 addiu r6,r6,0xcbc8          # r6 = 0x801DCBC8:  Pointer to Valid Deployment Tiles
001c72c8: 00c01821 addu r3,r6,r0               # r3 = Valid Deployment Tiles 
001c72cc: 24c70005 addiu r7,r6,0x0005          # r7 = r6 + 5 (start of next row's Valid Deployment Tiles)
001c72d0: 3c02801d lui r2,0x801d
001c72d4: 8c42d274 lw r2,-0x2d8c(r2)           # Pointer to Current Squad Data
001c72d8: 00000000 nop
001c72dc: 8c420000 lw r2,0x0000(r2)            # Load 5x5 bitmap
001c72e0: 00000000 nop
001c72e4: 00a21024 and r2,r5,r2                # Check the current bit
001c72e8: 10400003 beq r2,r0,0x001c72f8        # Branch if not flagged - not a deployable tile
001c72ec: 00000000 nop
001c72f0: 08071cbf j 0x001c72fc                # If a deployable tile, jump ahead,
001c72f4: a0690000 sb r9,0x0000(r3)            # while flagging this Valid Deployment Tile as true
001c72f8: a0600000 sb r0,0x0000(r3)            # If not deployable, flag this Valid Deployment Tile as false
001c72fc: 24630001 addiu r3,r3,0x0001          # r3 ++: next tile
001c7300: 0067102a slt r2,r3,r7                # r2 = 0x01 if not on next row yet
001c7304: 1440fff2 bne r2,r0,0x001c72d0        # Branch back if not on next row yet
001c7308: 00052840 sll r5,r5,0x01              # r5 * 2, check next bit from bitmap to see if that tile is deployable
001c730c: 25080001 addiu r8,r8,0x0001          # Current Row ++
001c7310: 29020005 slti r2,r8,0x0005           # r2 = 0x01 if still rows 1-5
001c7314: 1440ffec bne r2,r0,0x001c72c8        # Branch back if still rows left to check
001c7318: 24c60005 addiu r6,r6,0x0005          # r6 + 5 = next row's data
001c731c: 08071d1e j 0x001c7478                # Jump past other orientations if done here
001c7320: 00006821 addu r13,r0,r0              # r13 = 0

## ORIENTATION NOT 0 ##
001c7324: 1465001c bne r3,r5,0x001c7398        # Branch if orientation isn't 1
001c7328: 34020002 ori r2,r0,0x0002            # r2 = 2

## ORIENTATION 1 ##
001c732c: 34060004 ori r6,r0,0x0004            # r6 = Columns Remaining = 4
001c7330: 3c09801e lui r9,0x801e
001c7334: 2529cbc8 addiu r9,r9,0xcbc8          # r9 = Valid Deployment Tiles
001c7338: 34070001 ori r7,r0,0x0001            # r7 = 1
001c733c: 00004021 addu r8,r0,r0               # r8 = Current Row = 0 by default
001c7340: 01201821 addu r3,r9,r0               # r3 = Pointer to Valid Deployment Tiles
001c7344: 3c02801d lui r2,0x801d
001c7348: 8c42d274 lw r2,-0x2d8c(r2)           # Pointer to Current Squad Data
001c734c: 00000000 nop
001c7350: 8c420000 lw r2,0x0000(r2)            # Load 5x5 bitmap for current squad data         
001c7354: 00000000 nop
001c7358: 00a21024 and r2,r5,r2                # Check current bit 
001c735c: 10400003 beq r2,r0,0x001c736c        # Branch if not flagged - not a deployable tile
001c7360: 00661021 addu r2,r3,r6               # r2 = Current Deployable Tile + Columns Remaining
001c7364: 08071cdc j 0x001c7370                # If a deployable tile, jump ahead,
001c7368: a0470000 sb r7,0x0000(r2)            # while flagging this Valid Deployment Tile as true
001c736c: a0400000 sb r0,0x0000(r2)            # If not deployable, flag this Valid Deployment Tile as false
001c7370: 00052840 sll r5,r5,0x01              # r5 * 2, check next bit from bitmap to see if that tile is deployable
001c7374: 25080001 addiu r8,r8,0x0001          # Current Row ++
001c7378: 29020005 slti r2,r8,0x0005           # r2 = 0x01 if still rows 1-5
001c737c: 1440fff1 bne r2,r0,0x001c7344        # Branch back if still rows left to check
001c7380: 24630005 addiu r3,r3,0x0005          # r3 + 5 = next row's Valid Deployment Tile
001c7384: 24c6ffff addiu r6,r6,0xffff          # Columns Remaining --
001c7388: 04c1ffed bgez r6,0x001c7340          # Branch back if there are still columns remaining
001c738c: 00004021 addu r8,r0,r0               # r8 = Current Row = reset to 0
001c7390: 08071d1f j 0x001c747c                # Jump past other orientations if done here
001c7394: 00006821 addu r13,r0,r0              # r13 = 0

## ORIENTATION NOT 0 OR 1 ##
001c7398: 1462001b bne r3,r2,0x001c7408        # Branch if orientation =/= 2
001c739c: 34020003 ori r2,r0,0x0003            # r2 = 3

## ORIENTATION 2 ##
001c73a0: 34080004 ori r8,r0,0x0004            # r8 = Rows Remaining = 4          
001c73a4: 34090001 ori r9,r0,0x0001            # r9 = 1
001c73a8: 3c07801e lui r7,0x801e
001c73ac: 24e7cbdc addiu r7,r7,0xcbdc          # r7 = Valid Deployment Tiles
001c73b0: 34060004 ori r6,r0,0x0004            # r6 = Columns Remaining = 4
001c73b4: 24e30004 addiu r3,r7,0x0004          # r3 = Valid Deployment Tiles pointer + 4
001c73b8: 3c02801d lui r2,0x801d
001c73bc: 8c42d274 lw r2,-0x2d8c(r2)           # Pointer to Current Squad Data
001c73c0: 00000000 nop
001c73c4: 8c420000 lw r2,0x0000(r2)            # Load 5x5 bitmap for current squad data
001c73c8: 00000000 nop
001c73cc: 00a21024 and r2,r5,r2                # Check current bit 
001c73d0: 10400003 beq r2,r0,0x001c73e0        # Branch if not flagged - not a deployable tile
001c73d4: 00000000 nop
001c73d8: 08071cf9 j 0x001c73e4                # If a deployable tile, jump ahead,
001c73dc: a0690000 sb r9,0x0000(r3)            # while flagging this Valid Deployment Tile as true
001c73e0: a0600000 sb r0,0x0000(r3)            # If not deployable, flag this Valid Deployment Tile as false
001c73e4: 00052840 sll r5,r5,0x01              # r5 * 2, check next bit from bitmap to see if that tile is deployable
001c73e8: 24c6ffff addiu r6,r6,0xffff          # Columns Remaining --
001c73ec: 04c1fff2 bgez r6,0x001c73b8          # Branch back if there are still columns remaining
001c73f0: 2463ffff addiu r3,r3,0xffff          # r3 - 1 = previous Valid Deployment Tile
001c73f4: 2508ffff addiu r8,r8,0xffff          # Rows Remaining --
001c73f8: 0501ffed bgez r8,0x001c73b0          # Branch back if there are still rows remaining
001c73fc: 24e7fffb addiu r7,r7,0xfffb          # Pointer to Valid Deployment Tiles - 5
001c7400: 08071d1e j 0x001c7478                # Jump past other orientations if done here
001c7404: 00006821 addu r13,r0,r0              # r13 = 0

## ORIENTATION NOT 0, 1, OR 2 ##
001c7408: 1462001b bne r3,r2,0x001c7478
001c740c: 00006821 addu r13,r0,r0

## ORIENTATION 3 ##
001c7410: 00003021 addu r6,r0,r0               # r6 = Current Column = 0
001c7414: 3c09801e lui r9,0x801e
001c7418: 2529cbc8 addiu r9,r9,0xcbc8          # r9 = Valid Deployment Tiles
001c741c: 34070001 ori r7,r0,0x0001            # r7 = 1
001c7420: 34080004 ori r8,r0,0x0004            # r8 = Rows Remaining = 4
001c7424: 25230014 addiu r3,r9,0x0014          # r3 = Valid Deployment Tiles + 20 (starting with the final row)
001c7428: 3c02801d lui r2,0x801d
001c742c: 8c42d274 lw r2,-0x2d8c(r2)           # Pointer to Current Squad Data
001c7430: 00000000 nop
001c7434: 8c420000 lw r2,0x0000(r2)            # Load 5x5 bitmap for current squad data
001c7438: 00000000 nop
001c743c: 00a21024 and r2,r5,r2                # Check current bit 
001c7440: 10400003 beq r2,r0,0x001c7450        # Branch if not flagged - not a deployable tile
001c7444: 00661021 addu r2,r3,r6               # r2 = Current Deployable Tile + Current Column
001c7448: 08071d15 j 0x001c7454                # If a deployable tile, jump ahead,
001c744c: a0470000 sb r7,0x0000(r2)            # while flagging this Valid Deployment Tile as true
001c7450: a0400000 sb r0,0x0000(r2)            # If not deployable, flag this Valid Deployment Tile as false
001c7454: 00052840 sll r5,r5,0x01              # r5 * 2, check next bit from bitmap to see if that tile is deployable
001c7458: 2508ffff addiu r8,r8,0xffff          # Rows Remaining --
001c745c: 0501fff2 bgez r8,0x001c7428          # Branch back if there are still rows remaining
001c7460: 2463fffb addiu r3,r3,0xfffb          # Pointer to Valid Deployment Tiles - 5
001c7464: 24c60001 addiu r6,r6,0x0001          # Current Column ++
001c7468: 28c20005 slti r2,r6,0x0005           # r2 = 0x01 if still columns 1-5
001c746c: 1440ffed bne r2,r0,0x001c7424        # Branch back if still columns left to check
001c7470: 34080004 ori r8,r0,0x0004            # r8 = Rows Remaining = 4
001c7474: 00006821 addu r13,r0,r0              # r13 = 0

## ORIENTATIONS FINISHED ##
001c7478: 00004021 addu r8,r0,r0               # r8 = 0
001c747c: 341900c0 ori r25,r0,0x00c0           # r25 = 0xC0
001c7480: 34180028 ori r24,r0,0x0028           # r24 = 0x28
001c7484: 00006021 addu r12,r0,r0              # r12 = 0
001c7488: 00007021 addu r14,r0,r0              # r14 = 0
001c748c: 3c0f801e lui r15,0x801e
001c7490: 25efcbc8 addiu r15,r15,0xcbc8        # r15 = Valid Deployment Tiles
001c7494: 00003021 addu r6,r0,r0               # r6 = 0
001c7498: 00004821 addu r9,r0,r0               # r9 = 0
001c749c: 240bff00 addiu r11,r0,0xff00         # r11 = 0xFF00
001c74a0: 01e05021 addu r10,r15,r0             # r10 = Valid Deployment Tiles
001c74a4: 000d1080 sll r2,r13,0x02             # r2 = r13 * 4
001c74a8: 004d1021 addu r2,r2,r13              # r2 = r13 * 5
001c74ac: 00021080 sll r2,r2,0x02              # r2 = r13 * 0x0A
001c74b0: 00442821 addu r5,r2,r4               # r5 = r13 * 0x0A + Preset Value
001c74b4: 91420000 lbu r2,0x0000(r10)          # r2 = value of current Valid Deployment Tile
001c74b8: 00000000 nop
001c74bc: 10400003 beq r2,r0,0x001c74cc        # Branch if flagged false
001c74c0: 2407fffc addiu r7,r0,0xfffc          # r7 = -4
001c74c4: 08071d35 j 0x001c74d4                # If a deployable tile, jump ahead,
001c74c8: a0b8000c sb r24,0x000c(r5)           # while saving a value of 0x28 to offset 0x0C in r5
001c74cc: 00003821 addu r7,r0,r0               # r7 = 0
001c74d0: a0a0000c sb r0,0x000c(r5)            # Save a value of 00 to offset 0x0C in r5
001c74d4: a0b9000d sb r25,0x000d(r5)           # Save a value of 0xC0 to offset 0x0D in r5
001c74d8: 3c03801d lui r3,0x801d
001c74dc: 8c63d080 lw r3,-0x2f80(r3)           # r3 = *0x801CD080
001c74e0: 01cb1023 subu r2,r14,r11             # r2 = r14 - r11
001c74e4: a4a20008 sh r2,0x0008(r5)            # Save result of r14 - r11 to offset 0x08 in r5 
001c74e8: 10600002 beq r3,r0,0x001c74f4        # Branch if *0x801CD080 had a value of 0
001c74ec: 340200c4 ori r2,r0,0x00c4            # r2 = 0xC4
001c74f0: 34020088 ori r2,r0,0x0088            # r2 = 0x88
001c74f4: 00491023 subu r2,r2,r9               # r2 = r2 - r9
001c74f8: 004c1023 subu r2,r2,r12              # r2 = r2 - r9 - r12
001c74fc: 00471021 addu r2,r2,r7               # r2 = r2 - r9 - r12 - r7
001c7500: a4a2000a sh r2,0x000a(r5)            # Save result to offset 0x0A in r5
001c7504: 25ad0001 addiu r13,r13,0x0001        # r13 + 1
001c7508: 2529000a addiu r9,r9,0x000a          # r9 + 0x0A
001c750c: 256b0014 addiu r11,r11,0x0014        # r11 + 0x14
001c7510: 254a0001 addiu r10,r10,0x0001        # r10 + 1
001c7514: 24c60001 addiu r6,r6,0x0001          # r6 + 1
001c7518: 94a20008 lhu r2,0x0008(r5)           # Load offset 0x08 from r5
001c751c: 3403001c ori r3,r0,0x001c            # r3 = 0x1C
001c7520: a4b80010 sh r24,0x0010(r5)           # Save a value of 0x0028 to offset 0x10 in r5
001c7524: a4a30012 sh r3,0x0012(r5)            # Save a value of 0x001C to offset 0x12 in r5
001c7528: 2442ffec addiu r2,r2,0xffec          # r2 - 0x0014
001c752c: a4a20008 sh r2,0x0008(r5)            # Save r2 - 0x0014 to offset 0x08 in r5
001c7530: 28c20005 slti r2,r6,0x0005           # r2 = 0x01 if r6 is less than 5
001c7534: 1440ffdf bne r2,r0,0x001c74b4        # Branch back r6 if less than 5
001c7538: 24a50014 addiu r5,r5,0x0014          # r5 + 0x14
001c753c: 258c000a addiu r12,r12,0x000a        # r12 + 0x0A
001c7540: 25ce0014 addiu r14,r14,0x0014        # r14 + 0x14
001c7544: 25080001 addiu r8,r8,0x0001          # r8 + 1
001c7548: 29020005 slti r2,r8,0x0005           # r2 = 0x01 if r8 is less than 5
001c754c: 1440ffd1 bne r2,r0,0x001c7494        # Branch back if r8 less than 5
001c7550: 25ef0005 addiu r15,r15,0x0005        # r15 + 5
001c7554: 03e00008 jr r31
001c7558: 00000000 nop

Return Locations

1C40A0: Deployment Screen
1C6798: ATTACK.OUT 001c6748 - 001c67c8
1C69DC: ATTACK.OUT 001c67cc - 001c7284
1C6C78: ATTACK.OUT 001c67cc - 001c7284