Difference between revisions of "ATTACK.OUT Prepare Formation Sprites"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
m
m (Nyzer moved page ATTACK.OUT Find Formation Palette Index to ATTACK.OUT Prepare Formation Sprites: Better/more consistent title)
 
(11 intermediate revisions by 3 users not shown)
Line 17: Line 17:
 
  001c85c4: 94635fda lhu r3,0x5fda(r3)                    # r3 = Load ???
 
  001c85c4: 94635fda lhu r3,0x5fda(r3)                    # r3 = Load ???
 
  001c85c8: 00000000 nop
 
  001c85c8: 00000000 nop
  001c85cc: 10600012 beq r3,r0,0x001c8618
+
  001c85cc: 10600012 beq r3,r0,0x001c8618                 # branch if UNIT.BIN already open?
  001c85d0: 00409021 addu r18,r2,r0
+
  001c85d0: 00409021 addu r18,r2,r0                       # address of RAM allocated
 
  001c85d4: 34020002 ori r2,r0,0x0002
 
  001c85d4: 34020002 ori r2,r0,0x0002
  001c85d8: 14620006 bne r3,r2,0x001c85f4
+
  001c85d8: 14620006 bne r3,r2,0x001c85f4                 # branch if yet to open unit.bin?
  001c85dc: 3404166b ori r4,r0,0x166b
+
  001c85dc: 3404166b ori r4,r0,0x166b                     # UNIT.BIN LBA
  001c85e0: 3c050001 lui r5,0x0001
+
  001c85e0: 3c050001 lui r5,0x0001                         # If currently opening a file still:
  001c85e4: 0c072009 jal 0x001c8024                        # [[001c8024 - 001c80cc]]
+
  001c85e4: 0c072009 jal 0x001c8024                        # [[ATTACK.OUT Enqueue Open File]] <-- holds cpu until that's done
 
  001c85e8: 02403021 addu r6,r18,r0
 
  001c85e8: 02403021 addu r6,r18,r0
 
  001c85ec: 08072191 j 0x001c8644
 
  001c85ec: 08072191 j 0x001c8644
 
  001c85f0: 00000000 nop
 
  001c85f0: 00000000 nop
  001c85f4: 3c028004 lui r2,0x8004
+
 
  001c85f8: 24424954 addiu r2,r2,0x4954
+
  001c85f4: 3c028004 lui r2,0x8004                         # if able to open unit.bin immediately
 +
  001c85f8: 24424954 addiu r2,r2,0x4954                   # [[Get DAT as WD]]
 
  001c85fc: 3c018017 lui r1,0x8017
 
  001c85fc: 3c018017 lui r1,0x8017
  001c8600: ac223ca8 sw r2,0x3ca8(r1)                      # Save 0x80044954, [[Get DAT as WD]], to address for [[Call Inner Subroutine]]
+
  001c8600: ac223ca8 sw r2,0x3ca8(r1)                      #  
  001c8604: 3c050001 lui r5,0x0001
+
  001c8604: 3c050001 lui r5,0x0001                         # unit.bin filesize
  001c8608: 0c0533ad jal 0x0014ceb4                        # [[Call Inner Subroutine]]
+
  001c8608: 0c0533ad jal 0x0014ceb4                        # [[Call Inner Subroutine]] --> [[Get DAT as WD]] (UNIT.BIN -> LBA, UNIT.BIN -> Size, -> FileLocation)
  001c860c: 02403021 addu r6,r18,r0
+
  001c860c: 02403021 addu r6,r18,r0                       # allocated ram address
 
  001c8610: 08072191 j 0x001c8644
 
  001c8610: 08072191 j 0x001c8644
 
  001c8614: 00000000 nop
 
  001c8614: 00000000 nop
  001c8618: 3c04801d lui r4,0x801d
+
 
  001c861c: 24845db8 addiu r4,r4,0x5db8
+
  001c8618: 3c04801d lui r4,0x801d                         # if unit.bin is already open
 +
  001c861c: 24845db8 addiu r4,r4,0x5db8                   # (0x0100, 0x0000) (0x40 * 0x0100) <- the entire first tpage region unit.bin is on.
 
  001c8620: 0c009258 jal 0x00024960                        # [[SYS StoreImage]]
 
  001c8620: 0c009258 jal 0x00024960                        # [[SYS StoreImage]]
  001c8624: 02402821 addu r5,r18,r0
+
  001c8624: 02402821 addu r5,r18,r0                       # unit.bin's location in memory?
 
  001c8628: 3c04801d lui r4,0x801d
 
  001c8628: 3c04801d lui r4,0x801d
  001c862c: 24845dc0 addiu r4,r4,0x5dc0
+
  001c862c: 24845dc0 addiu r4,r4,0x5dc0                   # (0x0140, 0x0000) (0x40 * 0x0100) <- the entire second tpage region unit,bin is on.
 
  001c8630: 34058000 ori r5,r0,0x8000
 
  001c8630: 34058000 ori r5,r0,0x8000
 
  001c8634: 0c009258 jal 0x00024960                        # [[SYS StoreImage]]
 
  001c8634: 0c009258 jal 0x00024960                        # [[SYS StoreImage]]
  001c8638: 02452821 addu r5,r18,r5
+
  001c8638: 02452821 addu r5,r18,r5                       # unit.bin + 0x8000
 
  001c863c: 0c0091b5 jal 0x000246d4                        # [[SYS DrawSync]]
 
  001c863c: 0c0091b5 jal 0x000246d4                        # [[SYS DrawSync]]
  001c8640: 00002021 addu r4,r0,r0
+
  001c8640: 00002021 addu r4,r0,r0                         # wait for image moving to complete
 +
 
 
  001c8644: 3c04801d lui r4,0x801d
 
  001c8644: 3c04801d lui r4,0x801d
  001c8648: 24845db8 addiu r4,r4,0x5db8
+
  001c8648: 24845db8 addiu r4,r4,0x5db8                   # destination rect as above; (0x0100, 0x0000) (0x40 * 0x0100)
 
  001c864c: 34058000 ori r5,r0,0x8000
 
  001c864c: 34058000 ori r5,r0,0x8000
 
  001c8650: 0c00923f jal 0x000248fc                        # [[SYS LoadImage]]
 
  001c8650: 0c00923f jal 0x000248fc                        # [[SYS LoadImage]]
  001c8654: 02452821 addu r5,r18,r5
+
  001c8654: 02452821 addu r5,r18,r5                       # unit.bin in ram + 0x8000 (this seems offset weirdly)
 
  001c8658: 3c038016 lui r3,0x8016
 
  001c8658: 3c038016 lui r3,0x8016
  001c865c: 94635fda lhu r3,0x5fda(r3)
+
  001c865c: 94635fda lhu r3,0x5fda(r3)                     #
 
  001c8660: 34020002 ori r2,r0,0x0002
 
  001c8660: 34020002 ori r2,r0,0x0002
  001c8664: 14620005 bne r3,r2,0x001c867c
+
  001c8664: 14620005 bne r3,r2,0x001c867c                 # branch if yet to open unit.bin/unit.bin is open
 
  001c8668: 00000000 nop
 
  001c8668: 00000000 nop
 
  001c866c: 0c0532a0 jal 0x0014ca80                        # [[Switch To Next Thread]]
 
  001c866c: 0c0532a0 jal 0x0014ca80                        # [[Switch To Next Thread]]
Line 61: Line 64:
 
  001c8674: 080721a3 j 0x001c868c
 
  001c8674: 080721a3 j 0x001c868c
 
  001c8678: 3c146666 lui r20,0x6666
 
  001c8678: 3c146666 lui r20,0x6666
  001c867c: 0c0091b5 jal 0x000246d4                        # [[SYS DrawSync]]
+
 
 +
# Get the UNIT.BIN index used by this unit.
 +
  001c867c: 0c0091b5 jal 0x000246d4                        # [[SYS DrawSync]] wait for image moving
 
  001c8680: 00002021 addu r4,r0,r0
 
  001c8680: 00002021 addu r4,r0,r0
  001c8684: 00008821 addu r17,r0,r0
+
  001c8684: 00008821 addu r17,r0,r0                       # party index = 0
 
  001c8688: 3c146666 lui r20,0x6666
 
  001c8688: 3c146666 lui r20,0x6666
  001c868c: 36946667 ori r20,r20,0x6667
+
  001c868c: 36946667 ori r20,r20,0x6667                   # r20 = 2/5
 
  001c8690: 3c13801e lui r19,0x801e
 
  001c8690: 3c13801e lui r19,0x801e
  001c8694: 2673d2d4 addiu r19,r19,0xd2d4
+
  001c8694: 2673d2d4 addiu r19,r19,0xd2d4                 # r19 = 0x801dd2d4
 
  001c8698: 3c15801e lui r21,0x801e
 
  001c8698: 3c15801e lui r21,0x801e
  001c869c: 26b5d5e4 addiu r21,r21,0xd5e4
+
  001c869c: 26b5d5e4 addiu r21,r21,0xd5e4                 # r21 = 0x801dd5e4
 
  001c86a0: 0c0166bc jal 0x00059af0                        # [[Get Party Data Pointer]]
 
  001c86a0: 0c0166bc jal 0x00059af0                        # [[Get Party Data Pointer]]
  001c86a4: 02202021 addu r4,r17,r0
+
  001c86a4: 02202021 addu r4,r17,r0                       #
 
  001c86a8: 00408021 addu r16,r2,r0
 
  001c86a8: 00408021 addu r16,r2,r0
 
  001c86ac: 92030000 lbu r3,0x0000(r16)                    # r3 = Sprite Set
 
  001c86ac: 92030000 lbu r3,0x0000(r16)                    # r3 = Sprite Set
Line 141: Line 146:
 
  001c87b4: 14400006 bne r2,r0,0x001c87d0                  # Branch if index is 0x3E or lower (not a generic monster)
 
  001c87b4: 14400006 bne r2,r0,0x001c87d0                  # Branch if index is 0x3E or lower (not a generic monster)
 
  001c87b8: 00000000 nop
 
  001c87b8: 00000000 nop
  001c87bc: 3c01801d lui r1,0x801d
+
  001c87bc: 3c01801d lui r1,0x801d                         # Load the table for generic monsters' true UNIT indexes. (I don't know why it needs a second table for this.)
 
  001c87c0: 00250821 addu r1,r1,r5
 
  001c87c0: 00250821 addu r1,r1,r5
  001c87c4: 90255d65 lbu r5,0x5d65(r1)                    # Load... some kind of list of pointers for generic monsters, according to the order of their Monster Type, starting at entry 0x3F. Entries before 0x3F look mostly like random junk data?
+
  001c87c4: 90255d65 lbu r5,0x5d65(r1)                    # Actual start location for this table is 0x801D5DA4, but subtracting 0x3E would have been hard I guess. ¬_¬
 
  001c87c8: 080721fb j 0x001c87ec
 
  001c87c8: 080721fb j 0x001c87ec
 
  001c87cc: 00a08021 addu r16,r5,r0                        # r16 = true UNIT index for generic monsters & special generic monsters
 
  001c87cc: 00a08021 addu r16,r5,r0                        # r16 = true UNIT index for generic monsters & special generic monsters
Line 153: Line 158:
 
  001c87e4: 24a5ffff addiu r5,r5,0xffff                    # r5 = UNIT index - 1
 
  001c87e4: 24a5ffff addiu r5,r5,0xffff                    # r5 = UNIT index - 1
 
  001c87e8: 00a08021 addu r16,r5,r0                        # r16 = modified UNIT index
 
  001c87e8: 00a08021 addu r16,r5,r0                        # r16 = modified UNIT index
 +
 +
# Prepare coordinates and dimensions for this formation sprite.
 
  001c87ec: 3c028888 lui r2,0x8888
 
  001c87ec: 3c028888 lui r2,0x8888
 
  001c87f0: 34428889 ori r2,r2,0x8889
 
  001c87f0: 34428889 ori r2,r2,0x8889
  001c87f4: 00a20018 mult r5,r2
+
  001c87f4: 00a20018 mult r5,r2                           # index * -0.5333333
  001c87f8: 00051fc3 sra r3,r5,0x1f
+
  001c87f8: 00051fc3 sra r3,r5,0x1f                       # r3 = 0x01 if negative (never)
  001c87fc: 00001010 mfhi r2
+
  001c87fc: 00001010 mfhi r2                               # r2 = index * -0.53333333
  001c8800: 00451021 addu r2,r2,r5
+
  001c8800: 00451021 addu r2,r2,r5                         # r2 = index * 0.53333333 (index * 8/15)
  001c8804: 00021143 sra r2,r2,0x05
+
  001c8804: 00021143 sra r2,r2,0x05                       # r2 = index * 8/15/32 = index / 0x3C = 0x01 if index is 0x3C or higher
  001c8808: 00434023 subu r8,r2,r3
+
  001c8808: 00434023 subu r8,r2,r3                         # r8 = 0x01 if index is 0x3C or higher (second page's formation sprites)
  001c880c: 00081100 sll r2,r8,0x04
+
  001c880c: 00081100 sll r2,r8,0x04                       # r2 = r8 * 0x10
  001c8810: 00481023 subu r2,r2,r8
+
  001c8810: 00481023 subu r2,r2,r8                         # r2 = r8 * 0x0F
  001c8814: 00021080 sll r2,r2,0x02
+
  001c8814: 00021080 sll r2,r2,0x02                       # r2 = r8 * 0x3C
  001c8818: 1500000c bne r8,r0,0x001c884c
+
  001c8818: 1500000c bne r8,r0,0x001c884c                 # Branch if second page of formation sprites
  001c881c: 00a22823 subu r5,r5,r2
+
  001c881c: 00a22823 subu r5,r5,r2                         # r5 = modify index according to starting value for page (ignore if page 1, -0x3C if page 2)
  001c8820: 00b40018 mult r5,r20
+
 
  001c8824: 00051fc3 sra r3,r5,0x1f
+
# Get row and column for a formation sprite on the first page of UNIT.BIN.
  001c8828: 00001010 mfhi r2
+
  001c8820: 00b40018 mult r5,r20                           # index * 0x66666667
  001c882c: 00021083 sra r2,r2,0x02
+
  001c8824: 00051fc3 sra r3,r5,0x1f                       # r3 = 0x01 if negative (never)
  001c8830: 00433023 subu r6,r2,r3
+
  001c8828: 00001010 mfhi r2                               # index * 2 / 5
  001c8834: 00c01821 addu r3,r6,r0
+
  001c882c: 00021083 sra r2,r2,0x02                       # index / 10
  001c8838: 00031080 sll r2,r3,0x02
+
  001c8830: 00433023 subu r6,r2,r3                         # rounding
  001c883c: 00431021 addu r2,r2,r3
+
  001c8834: 00c01821 addu r3,r6,r0                         # row = index / 10
  001c8840: 00021040 sll r2,r2,0x01
+
  001c8838: 00031080 sll r2,r3,0x02                       # (index / 10) * 4
 +
  001c883c: 00431021 addu r2,r2,r3                         # (index / 10) * 5
 +
  001c8840: 00021040 sll r2,r2,0x01                       # (index / 10) * 10
 
  001c8844: 0807222a j 0x001c88a8
 
  001c8844: 0807222a j 0x001c88a8
  001c8848: 00a23023 subu r6,r5,r2
+
  001c8848: 00a23023 subu r6,r5,r2                         # col = index % 10 (modulo)
  001c884c: 28a20008 slti r2,r5,0x0008
+
 
  001c8850: 1040000b beq r2,r0,0x001c8880
+
# Get row and column for a formation sprite on the second page of UNIT.BIN.
  001c8854: 00b40018 mult r5,r20
+
# Branch out if this is one of the monster-sized formation sprites.
  001c8858: 00051fc3 sra r3,r5,0x1f
+
  001c884c: 28a20008 slti r2,r5,0x0008                     # r2 = 0x01 if first row of second page of formation sprites (human sized formation sprites)
  001c885c: 00001010 mfhi r2
+
  001c8850: 1040000b beq r2,r0,0x001c8880                 # Branch if monster sized formation sprites
  001c8860: 00021083 sra r2,r2,0x02
+
  001c8854: 00b40018 mult r5,r20                           # index * 0x66666667
 +
  001c8858: 00051fc3 sra r3,r5,0x1f                       # r3 = 0x01 if negative (never)
 +
  001c885c: 00001010 mfhi r2                               # index * 2 / 5
 +
  001c8860: 00021083 sra r2,r2,0x02                       # index / 10
 
  001c8864: 00433023 subu r6,r2,r3
 
  001c8864: 00433023 subu r6,r2,r3
  001c8868: 00c01821 addu r3,r6,r0
+
  001c8868: 00c01821 addu r3,r6,r0                         # row = index / 10
  001c886c: 00031080 sll r2,r3,0x02
+
  001c886c: 00031080 sll r2,r3,0x02                       # (index / 10) * 4
  001c8870: 00431021 addu r2,r2,r3
+
  001c8870: 00431021 addu r2,r2,r3                         # (index / 10) * 5
  001c8874: 00021040 sll r2,r2,0x01
+
  001c8874: 00021040 sll r2,r2,0x01                       # (index / 10) * 10
 
  001c8878: 0807222a j 0x001c88a8
 
  001c8878: 0807222a j 0x001c88a8
  001c887c: 00a23023 subu r6,r5,r2
+
  001c887c: 00a23023 subu r6,r5,r2                         # col = index % 10 (modulo)
  001c8880: 24a4fff8 addiu r4,r5,0xfff8
+
 
  001c8884: 00940018 mult r4,r20
+
# Get row and column for a monster-sized formation sprite.
  001c8888: 00041fc3 sra r3,r4,0x1f
+
  001c8880: 24a4fff8 addiu r4,r5,0xfff8                   # r4 = modified index - 8
  001c888c: 00001010 mfhi r2
+
  001c8884: 00940018 mult r4,r20                           # index * 0x66666667
  001c8890: 00021043 sra r2,r2,0x01
+
  001c8888: 00041fc3 sra r3,r4,0x1f                       # r3 = 0x01 if negative (never)
  001c8894: 00433023 subu r6,r2,r3
+
  001c888c: 00001010 mfhi r2                               # index * 2 / 5
  001c8898: 00c01821 addu r3,r6,r0
+
  001c8890: 00021043 sra r2,r2,0x01                       # index / 5
  001c889c: 00031080 sll r2,r3,0x02
+
  001c8894: 00433023 subu r6,r2,r3                        
  001c88a0: 00431021 addu r2,r2,r3
+
  001c8898: 00c01821 addu r3,r6,r0                         # row = index / 5
  001c88a4: 00823023 subu r6,r4,r2
+
  001c889c: 00031080 sll r2,r3,0x02                       # (index / 5) * 4
  001c88a8: 00603821 addu r7,r3,r0
+
  001c88a0: 00431021 addu r2,r2,r3                         # (index / 5) * 5
  001c88ac: 3404047f ori r4,r0,0x047f
+
  001c88a4: 00823023 subu r6,r4,r2                         # col = index % 5 (modulo)
 +
 
 +
  001c88a8: 00603821 addu r7,r3,r0                         # r7 = Row
 +
  001c88ac: 3404047f ori r4,r0,0x047f                      # r4 = 0x047f
 
  001c88b0: 3c02801e lui r2,0x801e
 
  001c88b0: 3c02801e lui r2,0x801e
  001c88b4: 2442da63 addiu r2,r2,0xda63
+
  001c88b4: 2442da63 addiu r2,r2,0xda63                   # r2 = 0x801dda63
  001c88b8: a0400000 sb r0,0x0000(r2)
+
  001c88b8: a0400000 sb r0,0x0000(r2)                     # Save 00 to 0x801dda63
 
  001c88bc: 2484ffff addiu r4,r4,0xffff
 
  001c88bc: 2484ffff addiu r4,r4,0xffff
  001c88c0: 0481fffd bgez r4,0x001c88b8
+
  001c88c0: 0481fffd bgez r4,0x001c88b8                   # 0x480 times
  001c88c4: 2442ffff addiu r2,r2,0xffff
+
  001c88c4: 2442ffff addiu r2,r2,0xffff                   # in reverse? odd choice but sure why not
 
  001c88c8: 34020001 ori r2,r0,0x0001
 
  001c88c8: 34020001 ori r2,r0,0x0001
  001c88cc: 15020043 bne r8,r2,0x001c89dc
+
  001c88cc: 15020043 bne r8,r2,0x001c89dc                 # Branch if first page of UNIT.BIN
 
  001c88d0: 28a20008 slti r2,r5,0x0008
 
  001c88d0: 28a20008 slti r2,r5,0x0008
  001c88d4: 14400042 bne r2,r0,0x001c89e0
+
  001c88d4: 14400042 bne r2,r0,0x001c89e0                 # Branch if human sized sprites on second page
  001c88d8: 000823c0 sll r4,r8,0x0f
+
  001c88d8: 000823c0 sll r4,r8,0x0f                       # r4 = 0x8000 (r8 must have a value of 1 at this point)
  001c88dc: 34048000 ori r4,r0,0x8000
+
 
  001c88e0: 00061840 sll r3,r6,0x01
+
# Monster-sized sprites: Get source and dimension coordinates and load each byte of image data
  001c88e4: 00661821 addu r3,r3,r6
+
  001c88dc: 34048000 ori r4,r0,0x8000              # r4 = 0x8000
  001c88e8: 00031900 sll r3,r3,0x04
+
  001c88e0: 00061840 sll r3,r6,0x01               # r3 = Column * 2
  001c88ec: 00071040 sll r2,r7,0x01
+
  001c88e4: 00661821 addu r3,r3,r6                 # r3 = Column * 3
  001c88f0: 00471021 addu r2,r2,r7
+
  001c88e8: 00031900 sll r3,r3,0x04               # r3 = Column * 48 (Height in pixels) = 0x0C
  001c88f4: 00021300 sll r2,r2,0x0c
+
  001c88ec: 00071040 sll r2,r7,0x01               # r2 = Row * 2
  001c88f8: 00621821 addu r3,r3,r2
+
  001c88f0: 00471021 addu r2,r2,r7                 # r2 = Row * 3
  001c88fc: 02340018 mult r17,r20
+
  001c88f4: 00021300 sll r2,r2,0x0c               # r2 = Row * 4800 (0x3000)
  001c8900: 24632800 addiu r3,r3,0x2800
+
  001c88f8: 00621821 addu r3,r3,r2                 # r3 = [Row * 48][Column * 48] = 0xYYXX
  001c8904: 00031843 sra r3,r3,0x01
+
  001c88fc: 02340018 mult r17,r20                 # Party Index * 0x66666667 (2/5?)
  001c8908: 00641021 addu r2,r3,r4
+
  001c8900: 24632800 addiu r3,r3,0x2800           # Add 40 to the Y value (getting past page 2's row of human-sized sprites at 40px tall)
  001c890c: 00002821 addu r5,r0,r0
+
  001c8904: 00031843 sra r3,r3,0x01               # Divide the coordinates by 2
  001c8910: 02424821 addu r9,r18,r2
+
  001c8908: 00641021 addu r2,r3,r4                 # Add 128 to the Y value, to get to the second page
  001c8914: 00004021 addu r8,r0,r0
+
  001c890c: 00002821 addu r5,r0,r0                 # r5 (Source Y) = Starting at 0
  001c8918: 3402000c ori r2,r0,0x000c
+
  001c8910: 02424821 addu r9,r18,r2               # r9 = RAM address + coordinates = Sprite source location?
  001c891c: a6620004 sh r2,0x0004(r19)
+
  001c8914: 00004021 addu r8,r0,r0                 # r8 (Source top border) = Starting at 0
  001c8920: 34020030 ori r2,r0,0x0030
+
  001c8918: 3402000c ori r2,r0,0x000c             # r2 = 0x0C (12)
  001c8924: a6620006 sh r2,0x0006(r19)
+
  001c891c: a6620004 sh r2,0x0004(r19)             # Save 0x000C to 0x801DD2D8
  001c8928: 001117c3 sra r2,r17,0x1f
+
  001c8920: 34020030 ori r2,r0,0x0030             # r2 = 0x30 (48) Height and width? Unsure why the X is 1/4 the Y when it should only be half?
  001c892c: 00002010 mfhi r4
+
  001c8924: a6620006 sh r2,0x0006(r19)             # Save 0x0030 to 0x801DD2DA
  001c8930: 00042043 sra r4,r4,0x01
+
  001c8928: 001117c3 sra r2,r17,0x1f               # r2 = 0x01 if Party Index is negative
  001c8934: 00822023 subu r4,r4,r2
+
  001c892c: 00002010 mfhi r4                       # r4 = Party Index * 2/5
  001c8938: 00041880 sll r3,r4,0x02
+
  001c8930: 00042043 sra r4,r4,0x01               # r4 = Party Index / 5
  001c893c: 00641821 addu r3,r3,r4
+
  001c8934: 00822023 subu r4,r4,r2                 # r4 = +1 if Party Index was negative (rounding thing?)
  001c8940: 02231823 subu r3,r17,r3
+
  001c8938: 00041880 sll r3,r4,0x02               # r3 = Party Index / 5 * 4
  001c8944: 00031040 sll r2,r3,0x01
+
  001c893c: 00641821 addu r3,r3,r4                 # r3 = Party Index / 5 * 5
  001c8948: 00431021 addu r2,r2,r3
+
  001c8940: 02231823 subu r3,r17,r3               # r3 = Party Index - (Party Index / 5 * 5) = remainder of dividing by 5
  001c894c: 00021080 sll r2,r2,0x02
+
  001c8944: 00031040 sll r2,r3,0x01               # r2 = Remainder * 2
  001c8950: 24420180 addiu r2,r2,0x0180
+
  001c8948: 00431021 addu r2,r2,r3                 # r2 = Remainder * 3
  001c8954: a6620000 sh r2,0x0000(r19)
+
  001c894c: 00021080 sll r2,r2,0x02               # r2 = Remainder * 12 (0x0C)
  001c8958: 00041040 sll r2,r4,0x01
+
  001c8950: 24420180 addiu r2,r2,0x0180           # r2 = + 384 = starting coordinate? number of pixels for the top 8 rows of 48? why on monsters though
  001c895c: 00441021 addu r2,r2,r4
+
  001c8954: a6620000 sh r2,0x0000(r19)             # Save X coordinate to save to in VRAM to 0x801DD2D4
  001c8960: 00021100 sll r2,r2,0x04
+
  001c8958: 00041040 sll r2,r4,0x01               # r2 = Party Index / 5 * 2
  001c8964: a6620002 sh r2,0x0002(r19)
+
  001c895c: 00441021 addu r2,r2,r4                 # r2 = Party Index / 5 * 3
  001c8968: 00002021 addu r4,r0,r0
+
  001c8960: 00021100 sll r2,r2,0x04               # r2 = Party Index / 5 * 48 (0x30) = Y coordinate
  001c896c: 01003821 addu r7,r8,r0
+
  001c8964: a6620002 sh r2,0x0002(r19)             # Save Y coordinate to save the image to at 0x801DD2D6
  001c8970: 000531c0 sll r6,r5,0x07
+
  001c8968: 00002021 addu r4,r0,r0                 # r4 = Source X =  0
  001c8974: 00e41821 addu r3,r7,r4
+
  001c896c: 01003821 addu r7,r8,r0                 # r7 = Source top border
  001c8978: 01241021 addu r2,r9,r4
+
  001c8970: 000531c0 sll r6,r5,0x07               # r6 = Source Y * 128 (0x80) = Source Y Offset
  001c897c: 24840001 addiu r4,r4,0x0001
+
  001c8974: 00e41821 addu r3,r7,r4                 # r3 = Source top border + Source X
  001c8980: 00c21021 addu r2,r6,r2
+
  001c8978: 01241021 addu r2,r9,r4                 # r2 = VRAM Location + Source top + left borders
  001c8984: 90420000 lbu r2,0x0000(r2)
+
  001c897c: 24840001 addiu r4,r4,0x0001           # Source X ++
  001c8988: 00751821 addu r3,r3,r21
+
  001c8980: 00c21021 addu r2,r6,r2                 # r2 = Source Y Offset + Result
  001c898c: a0620000 sb r2,0x0000(r3)
+
  001c8984: 90420000 lbu r2,0x0000(r2)             # Load one byte of image data (data for 2 pixels?) from the source
  001c8990: 28820018 slti r2,r4,0x0018
+
  001c8988: 00751821 addu r3,r3,r21               # r3 = (r7 + r4) + 0x801dd5e4
  001c8994: 1440fff7 bne r2,r0,0x001c8974
+
  001c898c: a0620000 sb r2,0x0000(r3)             # Save pixel data to destination
  001c8998: 00000000 nop
+
  001c8990: 28820018 slti r2,r4,0x0018             # r2 = 0x01 if r4 is less than 0x18 (24 bytes - i.e. 48 pixels, the width of the image)
  001c899c: 24a50001 addiu r5,r5,0x0001
+
  001c8994: 1440fff7 bne r2,r0,0x001c8974         # Loop back if not done this row
  001c89a0: 28a20030 slti r2,r5,0x0030
+
  001c8998: 00000000 nop    
  001c89a4: 1440fff0 bne r2,r0,0x001c8968
+
  001c899c: 24a50001 addiu r5,r5,0x0001           # Source Y ++
  001c89a8: 25080018 addiu r8,r8,0x0018
+
  001c89a0: 28a20030 slti r2,r5,0x0030             # r2 = 0x01 if less than 0x30 (48 pixels, the length of the image)
  001c89ac: 3c04801e lui r4,0x801e
+
  001c89a4: 1440fff0 bne r2,r0,0x001c8968         # Loop back if there are still some rows left
  001c89b0: 2484d2d4 addiu r4,r4,0xd2d4
+
  001c89a8: 25080018 addiu r8,r8,0x0018           # r8 + 0x18 (24) = Next Row
  001c89b4: 3c05801e lui r5,0x801e
+
  001c89ac: 3c04801e lui r4,0x801e  
  001c89b8: 24a5d5e4 addiu r5,r5,0xd5e4
+
  001c89b0: 2484d2d4 addiu r4,r4,0xd2d4           # r4 = 0x801dd2d4
  001c89bc: 0c00923f jal 0x000248fc
+
  001c89b4: 3c05801e lui r5,0x801e  
  001c89c0: 00000000 nop
+
  001c89b8: 24a5d5e4 addiu r5,r5,0xd5e4           # r5 = 0x801dd5e4
  001c89c4: 34020001 ori r2,r0,0x0001
+
  001c89bc: 0c00923f jal 0x000248fc               # [[SYS LoadImage]]
  001c89c8: 3c01801d lui r1,0x801d
+
  001c89c0: 00000000 nop    
  001c89cc: 00310821 addu r1,r1,r17
+
  001c89c4: 34020001 ori r2,r0,0x0001             # r2 = 0x01
  001c89d0: a022d014 sb r2,-0x2fec(r1)
+
  001c89c8: 3c01801d lui r1,0x801d  
  001c89d4: 080722b4 j 0x001c8ad0
+
  001c89cc: 00310821 addu r1,r1,r17               # 0x801C(D014) + Party Index
  001c89d8: 02002821 addu r5,r16,r0
+
  001c89d0: a022d014 sb r2,-0x2fec(r1)             # Save 0x01 to this byte - mark this party member's image as prepared?
  001c89dc: 000823c0 sll r4,r8,0x0f
+
  001c89d4: 080722b4 j 0x001c8ad0  
  001c89e0: 00061840 sll r3,r6,0x01
+
  001c89d8: 02002821 addu r5,r16,r0               # r5 = UNIT index
  001c89e4: 00661821 addu r3,r3,r6
+
 
  001c89e8: 000318c0 sll r3,r3,0x03
+
# Human-sized sprites: Get source and dimension coordinates and load each byte of image data
  001c89ec: 00071080 sll r2,r7,0x02
+
  001c89dc: 000823c0 sll r4,r8,0x0f               # r4 = 0 (this line is only run if it was the first page of UNIT.BIN)
  001c89f0: 00471021 addu r2,r2,r7
+
  001c89e0: 00061840 sll r3,r6,0x01               # r3 = Column * 2
  001c89f4: 000212c0 sll r2,r2,0x0b
+
  001c89e4: 00661821 addu r3,r3,r6                 # r3 = Column * 3
  001c89f8: 02340018 mult r17,r20
+
  001c89e8: 000318c0 sll r3,r3,0x03               # r3 = Column * 24 (width of human sprite) = X coordinate
  001c89fc: 00621821 addu r3,r3,r2
+
  001c89ec: 00071080 sll r2,r7,0x02               # r2 = Row * 4
  001c8a00: 00031843 sra r3,r3,0x01
+
  001c89f0: 00471021 addu r2,r2,r7                 # r2 = Row * 5
  001c8a04: 00831021 addu r2,r4,r3
+
  001c89f4: 000212c0 sll r2,r2,0x0b               # r2 = Row * 40 (height of human sprite) * 0x100 = Y coordinate (upper byte)
  001c8a08: 34050008 ori r5,r0,0x0008
+
  001c89f8: 02340018 mult r17,r20                 # Party Index * 0x66666667 (2/5?)
  001c8a0c: 02424821 addu r9,r18,r2
+
  001c89fc: 00621821 addu r3,r3,r2                 # r3 = UNIT.BIN coordinates of image (YYXX)
  001c8a10: 340800c0 ori r8,r0,0x00c0
+
  001c8a00: 00031843 sra r3,r3,0x01               # r3 = coordinates / 2
  001c8a14: 3402000c ori r2,r0,0x000c
+
  001c8a04: 00831021 addu r2,r4,r3                 # r2 = Coordinates + page offset
  001c8a18: a6620004 sh r2,0x0004(r19)
+
  001c8a08: 34050008 ori r5,r0,0x0008             # r5 = Source Y = starting at 8
  001c8a1c: 34020030 ori r2,r0,0x0030
+
  001c8a0c: 02424821 addu r9,r18,r2               # r9 = RAM address + coordinates = sprite VRAM location?
  001c8a20: a6620006 sh r2,0x0006(r19)
+
  001c8a10: 340800c0 ori r8,r0,0x00c0             # r8 (Source Top Border) = Starting at 0xC0.
  001c8a24: 001117c3 sra r2,r17,0x1f
+
# Note: 192 = 384/2 = 48 pixels * 8 lines - height of 40 vs monsters' 48, * 48 pixels per row
  001c8a28: 00002010 mfhi r4
+
  001c8a14: 3402000c ori r2,r0,0x000c             # r2 = 0x0C (12)
  001c8a2c: 00042043 sra r4,r4,0x01
+
  001c8a18: a6620004 sh r2,0x0004(r19)            # Save 12 to 0x801DD2D8 (1/4 of 48, is this width?)
  001c8a30: 00822023 subu r4,r4,r2
+
  001c8a1c: 34020030 ori r2,r0,0x0030             # r2 = 0x30 (48)
  001c8a34: 00041880 sll r3,r4,0x02
+
  001c8a20: a6620006 sh r2,0x0006(r19)            # Save 48 to 0x801DD2DA (height?)
  001c8a38: 00641821 addu r3,r3,r4
+
  001c8a24: 001117c3 sra r2,r17,0x1f               # r2 = 0x01 if Party Index is negative
  001c8a3c: 02231823 subu r3,r17,r3
+
  001c8a28: 00002010 mfhi r4                       # r4 = Party Index * 2/5
  001c8a40: 00031040 sll r2,r3,0x01
+
  001c8a2c: 00042043 sra r4,r4,0x01               # r4 = Party Index / 5
  001c8a44: 00431021 addu r2,r2,r3
+
  001c8a30: 00822023 subu r4,r4,r2                 # r4 = +1 if Party Index was negative (rounding thing?)
  001c8a48: 00021080 sll r2,r2,0x02
+
  001c8a34: 00041880 sll r3,r4,0x02               # r3 = Party Index / 5 * 4
  001c8a4c: 24420180 addiu r2,r2,0x0180
+
  001c8a38: 00641821 addu r3,r3,r4                 # r3 = Party Index / 5 * 5
  001c8a50: a6620000 sh r2,0x0000(r19)
+
  001c8a3c: 02231823 subu r3,r17,r3               # r3 = Party Index - (Party Index / 5 * 5) = remainder of dividing by 5
  001c8a54: 00041040 sll r2,r4,0x01
+
  001c8a40: 00031040 sll r2,r3,0x01               # r2 = Remainder * 2
  001c8a58: 00441021 addu r2,r2,r4
+
  001c8a44: 00431021 addu r2,r2,r3                 # r2 = Remainder * 3
  001c8a5c: 00021100 sll r2,r2,0x04
+
  001c8a48: 00021080 sll r2,r2,0x02               # r2 = Remainder * 12 (0x0C)
  001c8a60: a6620002 sh r2,0x0002(r19)
+
  001c8a4c: 24420180 addiu r2,r2,0x0180           # r2 = + 384 = starting X coordinate? number of pixels for the top 8 rows of 48?
  001c8a64: 34040006 ori r4,r0,0x0006
+
  001c8a50: a6620000 sh r2,0x0000(r19)             # Save X coordinate to save to in VRAM to 0x801DD2D4
  001c8a68: 01003821 addu r7,r8,r0
+
  001c8a54: 00041040 sll r2,r4,0x01               # r2 = Party Index / 5 * 2
  001c8a6c: 000531c0 sll r6,r5,0x07
+
  001c8a58: 00441021 addu r2,r2,r4                 # r2 = Party Index / 5 * 3
  001c8a70: 00e41821 addu r3,r7,r4
+
  001c8a5c: 00021100 sll r2,r2,0x04               # r2 = Party Index / 5 * 48 (0x30) = Y coordinate
  001c8a74: 00891021 addu r2,r4,r9
+
  001c8a60: a6620002 sh r2,0x0002(r19)             # Save Y coordinate to save the image to at 0x801DD2D6
  001c8a78: 24840001 addiu r4,r4,0x0001
+
  001c8a64: 34040006 ori r4,r0,0x0006             # r4 = 6
  001c8a7c: 00461021 addu r2,r2,r6
+
  001c8a68: 01003821 addu r7,r8,r0                 # r7 = r8 (set to 0xC0 above)
  001c8a80: 9042fbfa lbu r2,-0x0406(r2)
+
  001c8a6c: 000531c0 sll r6,r5,0x07               # r6 = Source Y * 128 (0x80) = Source Y Offset
  001c8a84: 00751821 addu r3,r3,r21
+
  001c8a70: 00e41821 addu r3,r7,r4                 # r3 = Source top border + Source X
  001c8a88: a0620000 sb r2,0x0000(r3)
+
  001c8a74: 00891021 addu r2,r4,r9                 # r2 = VRAM Location + Source top + left borders
  001c8a8c: 28820012 slti r2,r4,0x0012
+
  001c8a78: 24840001 addiu r4,r4,0x0001           # Source X ++
  001c8a90: 1440fff7 bne r2,r0,0x001c8a70
+
  001c8a7c: 00461021 addu r2,r2,r6                 # r2 = Source Y Offset + Result
  001c8a94: 00000000 nop
+
  001c8a80: 9042fbfa lbu r2,-0x0406(r2)           # Load one byte of image data (data for 2 pixels?) from the source.
  001c8a98: 24a50001 addiu r5,r5,0x0001
+
# Note: -0x0406 adjusts from assuming the source is 48x48 instead of 24x40: 8 rows of 128 bytes + 6 more bytes (12 pixels) = 1030 = 0x0406
  001c8a9c: 28a20030 slti r2,r5,0x0030
+
  001c8a84: 00751821 addu r3,r3,r21               # r3 = Destination X + 0x801dd5e4 = Destination
  001c8aa0: 1440fff0 bne r2,r0,0x001c8a64
+
  001c8a88: a0620000 sb r2,0x0000(r3)             # Save pixel data to destination
  001c8aa4: 25080018 addiu r8,r8,0x0018
+
  001c8a8c: 28820012 slti r2,r4,0x0012             # r2 = 0x01 if r4 is less than 0x12
  001c8aa8: 3c04801e lui r4,0x801e
+
# Note: 0x12 = 18 bytes = 36px: width of the image minus the ending offset of 12px. 6 bytes (12px) were added for the starting offset at 001c8a64 above.
  001c8aac: 2484d2d4 addiu r4,r4,0xd2d4
+
  001c8a90: 1440fff7 bne r2,r0,0x001c8a70         # Loop back if not done this row
  001c8ab0: 3c05801e lui r5,0x801e
+
  001c8a94: 00000000 nop    
  001c8ab4: 24a5d5e4 addiu r5,r5,0xd5e4
+
  001c8a98: 24a50001 addiu r5,r5,0x0001           # Source Y ++
  001c8ab8: 0c00923f jal 0x000248fc
+
  001c8a9c: 28a20030 slti r2,r5,0x0030             # r2 = 0x01 if less than 0x30 (48 pixels - after all, we start with 8 already, to cut off the top 8 pixels)
  001c8abc: 00000000 nop
+
  001c8aa0: 1440fff0 bne r2,r0,0x001c8a64         # Loop back if there are still some rows left
  001c8ac0: 3c01801d lui r1,0x801d
+
  001c8aa4: 25080018 addiu r8,r8,0x0018           # r8 + 0x18 (24) = Next Row
  001c8ac4: 00310821 addu r1,r1,r17
+
  001c8aa8: 3c04801e lui r4,0x801e  
  001c8ac8: a020d014 sb r0,-0x2fec(r1)
+
  001c8aac: 2484d2d4 addiu r4,r4,0xd2d4           # r4 = 0x801dd2d4 = Destination
  001c8acc: 02002821 addu r5,r16,r0
+
  001c8ab0: 3c05801e lui r5,0x801e  
 +
  001c8ab4: 24a5d5e4 addiu r5,r5,0xd5e4           # r5 = 0x801dd5e4 = Source
 +
  001c8ab8: 0c00923f jal 0x000248fc               # [[SYS LoadImage]]
 +
  001c8abc: 00000000 nop    
 +
  001c8ac0: 3c01801d lui r1,0x801d  
 +
  001c8ac4: 00310821 addu r1,r1,r17               # 0x801CD014 + Party Index
 +
  001c8ac8: a020d014 sb r0,-0x2fec(r1)             # Save 0x00 to this byte because... uh??? I don't even know?
 +
  001c8acc: 02002821 addu r5,r16,r0               # r5 = UNIT index
 +
 
 +
# Palette handling
 
  001c8ad0: 2402ffff addiu r2,r0,0xffff                # r2 = -1
 
  001c8ad0: 2402ffff addiu r2,r0,0xffff                # r2 = -1
 
  001c8ad4: 14a20003 bne r5,r2,0x001c8ae4              # Branch if not -1 (Dragon Reis' value)
 
  001c8ad4: 14a20003 bne r5,r2,0x001c8ae4              # Branch if not -1 (Dragon Reis' value)
Line 343: Line 367:
 
  001c8adc: 080722c3 j 0x001c8b0c
 
  001c8adc: 080722c3 j 0x001c8b0c
 
  001c8ae0: 3405007a ori r5,r0,0x007a                  # r5 = 0x7A: Palette 122 for Dragon Reis
 
  001c8ae0: 3405007a ori r5,r0,0x007a                  # r5 = 0x7A: Palette 122 for Dragon Reis
  001c8ae4: 28a2003e slti r2,r5,0x003e
+
  001c8ae4: 28a2003e slti r2,r5,0x003e                 # r2 = 0x01 if UNIT index is below 0x3E
  001c8ae8: 14400008 bne r2,r0,0x001c8b0c
+
  001c8ae8: 14400008 bne r2,r0,0x001c8b0c             # Branch if so (special unit or generic human)
  001c8aec: 24a4ffc2 addiu r4,r5,0xffc2
+
  001c8aec: 24a4ffc2 addiu r4,r5,0xffc2               # r4 = UNIT index - 0x3E
 
  001c8af0: 3c02801e lui r2,0x801e
 
  001c8af0: 3c02801e lui r2,0x801e
  001c8af4: 8c42caa8 lw r2,-0x3558(r2)
+
  001c8af4: 8c42caa8 lw r2,-0x3558(r2)                 # Load saved Job Data Pointer
  001c8af8: 00041840 sll r3,r4,0x01
+
  001c8af8: 00041840 sll r3,r4,0x01                   # r3 = (UNIT index - 0x3E) * 2
  001c8afc: 9042002e lbu r2,0x002e(r2)
+
  001c8afc: 9042002e lbu r2,0x002e(r2)                 # r2 = Monster Palette
  001c8b00: 00641821 addu r3,r3,r4
+
  001c8b00: 00641821 addu r3,r3,r4                     # r3 = (UNIT index - 0x3E) * 3
  001c8b04: 2442003e addiu r2,r2,0x003e
+
  001c8b04: 2442003e addiu r2,r2,0x003e               # r2 = Monster Palette - 0x3E
  001c8b08: 00622821 addu r5,r3,r2
+
  001c8b08: 00622821 addu r5,r3,r2                     # r5 = (Unit index - 0x3E) * 3 + Monster Palette - 0x3E
  001c8b0c: 04a10002 bgez r5,0x001c8b18
+
  001c8b0c: 04a10002 bgez r5,0x001c8b18               # Branch if result GTE zero
 
  001c8b10: 00a01021 addu r2,r5,r0
 
  001c8b10: 00a01021 addu r2,r5,r0
 
  001c8b14: 24a20003 addiu r2,r5,0x0003
 
  001c8b14: 24a20003 addiu r2,r5,0x0003
Line 367: Line 391:
 
  001c8b3c: 3403f000 ori r3,r0,0xf000
 
  001c8b3c: 3403f000 ori r3,r0,0xf000
 
  001c8b40: 3c04801e lui r4,0x801e
 
  001c8b40: 3c04801e lui r4,0x801e
  001c8b44: 2484d2dc addiu r4,r4,0xd2dc
+
  001c8b44: 2484d2dc addiu r4,r4,0xd2dc           # constructed RECT data
 
  001c8b48: 06210002 bgez r17,0x001c8b54
 
  001c8b48: 06210002 bgez r17,0x001c8b54
 
  001c8b4c: 00431021 addu r2,r2,r3
 
  001c8b4c: 00431021 addu r2,r2,r3
 
  001c8b50: 26270003 addiu r7,r17,0x0003
 
  001c8b50: 26270003 addiu r7,r17,0x0003
  001c8b54: 02422821 addu r5,r18,r2
+
  001c8b54: 02422821 addu r5,r18,r2               # open.bin + ?
 
  001c8b58: 00071883 sra r3,r7,0x02
 
  001c8b58: 00071883 sra r3,r7,0x02
 
  001c8b5c: 00031080 sll r2,r3,0x02
 
  001c8b5c: 00031080 sll r2,r3,0x02
Line 387: Line 411:
 
  001c8b8c: 3c01801e lui r1,0x801e
 
  001c8b8c: 3c01801e lui r1,0x801e
 
  001c8b90: a422d2e2 sh r2,-0x2d1e(r1)
 
  001c8b90: a422d2e2 sh r2,-0x2d1e(r1)
  001c8b94: 0c00923f jal 0x000248fc
+
  001c8b94: 0c00923f jal 0x000248fc                 # [[SYS LoadImage]]
 
  001c8b98: 00000000 nop
 
  001c8b98: 00000000 nop
 
  001c8b9c: 3c038016 lui r3,0x8016
 
  001c8b9c: 3c038016 lui r3,0x8016
 
  001c8ba0: 94635fda lhu r3,0x5fda(r3)
 
  001c8ba0: 94635fda lhu r3,0x5fda(r3)
 
  001c8ba4: 34020002 ori r2,r0,0x0002
 
  001c8ba4: 34020002 ori r2,r0,0x0002
  001c8ba8: 14620005 bne r3,r2,0x001c8bc0
+
  001c8ba8: 14620005 bne r3,r2,0x001c8bc0           # branch if unit.bin was opened immediately/already opened?
 
  001c8bac: 00000000 nop
 
  001c8bac: 00000000 nop
  001c8bb0: 0c0532a0 jal 0x0014ca80
+
  001c8bb0: 0c0532a0 jal 0x0014ca80                 # [[Switch To Next Thread]]
 
  001c8bb4: 26310001 addiu r17,r17,0x0001
 
  001c8bb4: 26310001 addiu r17,r17,0x0001
 
  001c8bb8: 080722f4 j 0x001c8bd0
 
  001c8bb8: 080722f4 j 0x001c8bd0
  001c8bbc: 2a220010 slti r2,r17,0x0010
+
  001c8bbc: 2a220010 slti r2,r17,0x0010             # do for all 0x10 non-Guest party members
  001c8bc0: 0c0091b5 jal 0x000246d4
+
  001c8bc0: 0c0091b5 jal 0x000246d4                 # [[SYS DrawSync]]
 
  001c8bc4: 00002021 addu r4,r0,r0
 
  001c8bc4: 00002021 addu r4,r0,r0
 
  001c8bc8: 26310001 addiu r17,r17,0x0001
 
  001c8bc8: 26310001 addiu r17,r17,0x0001
  001c8bcc: 2a220010 slti r2,r17,0x0010
+
  001c8bcc: 2a220010 slti r2,r17,0x0010             # do for all 0x10 non-Guest party members
 
  001c8bd0: 1440feb3 bne r2,r0,0x001c86a0
 
  001c8bd0: 1440feb3 bne r2,r0,0x001c86a0
 
  001c8bd4: 00000000 nop
 
  001c8bd4: 00000000 nop
  001c8bd8: 0c011273 jal 0x000449cc
+
 
 +
# END
 +
  001c8bd8: 0c011273 jal 0x000449cc                 # [[SCUS Call Free]]
 
  001c8bdc: 02402021 addu r4,r18,r0
 
  001c8bdc: 02402021 addu r4,r18,r0
 
  001c8be0: 8fbf0040 lw r31,0x0040(r29)
 
  001c8be0: 8fbf0040 lw r31,0x0040(r29)

Latest revision as of 04:05, 15 June 2025

< ATTACK.OUT Routines

# WORLD.BIN: Find Formation Palette Index
# REQUIRE.OUT: Find Formation Palette Index (REQUIRE.OUT)
001c8598: 27bdffb8 addiu r29,r29,0xffb8
001c859c: 3c040001 lui r4,0x0001
001c85a0: afbf0040 sw r31,0x0040(r29)
001c85a4: afb5003c sw r21,0x003c(r29)
001c85a8: afb40038 sw r20,0x0038(r29)
001c85ac: afb30034 sw r19,0x0034(r29)
001c85b0: afb20030 sw r18,0x0030(r29)
001c85b4: afb1002c sw r17,0x002c(r29)
001c85b8: 0c011105 jal 0x00044414                        # C51 Malloc < Allocate memory
001c85bc: afb00028 sw r16,0x0028(r29)
001c85c0: 3c038016 lui r3,0x8016
001c85c4: 94635fda lhu r3,0x5fda(r3)                     # r3 = Load ???
001c85c8: 00000000 nop
001c85cc: 10600012 beq r3,r0,0x001c8618                  # branch if UNIT.BIN already open?
001c85d0: 00409021 addu r18,r2,r0                        # address of RAM allocated
001c85d4: 34020002 ori r2,r0,0x0002
001c85d8: 14620006 bne r3,r2,0x001c85f4                  # branch if yet to open unit.bin?
001c85dc: 3404166b ori r4,r0,0x166b                      # UNIT.BIN LBA
001c85e0: 3c050001 lui r5,0x0001                         # If currently opening a file still:
001c85e4: 0c072009 jal 0x001c8024                        # ATTACK.OUT Enqueue Open File <-- holds cpu until that's done
001c85e8: 02403021 addu r6,r18,r0
001c85ec: 08072191 j 0x001c8644
001c85f0: 00000000 nop
001c85f4: 3c028004 lui r2,0x8004                         # if able to open unit.bin immediately
001c85f8: 24424954 addiu r2,r2,0x4954                    # Get DAT as WD
001c85fc: 3c018017 lui r1,0x8017
001c8600: ac223ca8 sw r2,0x3ca8(r1)                      # 
001c8604: 3c050001 lui r5,0x0001                         # unit.bin filesize
001c8608: 0c0533ad jal 0x0014ceb4                        # Call Inner Subroutine --> Get DAT as WD (UNIT.BIN -> LBA, UNIT.BIN -> Size, -> FileLocation)
001c860c: 02403021 addu r6,r18,r0                        # allocated ram address
001c8610: 08072191 j 0x001c8644
001c8614: 00000000 nop
001c8618: 3c04801d lui r4,0x801d                         # if unit.bin is already open
001c861c: 24845db8 addiu r4,r4,0x5db8                    # (0x0100, 0x0000) (0x40 * 0x0100) <- the entire first tpage region unit.bin is on.
001c8620: 0c009258 jal 0x00024960                        # SYS StoreImage
001c8624: 02402821 addu r5,r18,r0                        # unit.bin's location in memory?
001c8628: 3c04801d lui r4,0x801d
001c862c: 24845dc0 addiu r4,r4,0x5dc0                    # (0x0140, 0x0000) (0x40 * 0x0100) <- the entire second tpage region unit,bin is on.
001c8630: 34058000 ori r5,r0,0x8000
001c8634: 0c009258 jal 0x00024960                        # SYS StoreImage
001c8638: 02452821 addu r5,r18,r5                        # unit.bin + 0x8000
001c863c: 0c0091b5 jal 0x000246d4                        # SYS DrawSync
001c8640: 00002021 addu r4,r0,r0                         # wait for image moving to complete
001c8644: 3c04801d lui r4,0x801d
001c8648: 24845db8 addiu r4,r4,0x5db8                    # destination rect as above; (0x0100, 0x0000) (0x40 * 0x0100) 
001c864c: 34058000 ori r5,r0,0x8000
001c8650: 0c00923f jal 0x000248fc                        # SYS LoadImage
001c8654: 02452821 addu r5,r18,r5                        # unit.bin in ram + 0x8000 (this seems offset weirdly)
001c8658: 3c038016 lui r3,0x8016
001c865c: 94635fda lhu r3,0x5fda(r3)                     # 
001c8660: 34020002 ori r2,r0,0x0002
001c8664: 14620005 bne r3,r2,0x001c867c                  # branch if yet to open unit.bin/unit.bin is open
001c8668: 00000000 nop
001c866c: 0c0532a0 jal 0x0014ca80                        # Switch To Next Thread
001c8670: 00008821 addu r17,r0,r0
001c8674: 080721a3 j 0x001c868c
001c8678: 3c146666 lui r20,0x6666
# Get the UNIT.BIN index used by this unit.
001c867c: 0c0091b5 jal 0x000246d4                        # SYS DrawSync wait for image moving
001c8680: 00002021 addu r4,r0,r0
001c8684: 00008821 addu r17,r0,r0                        # party index = 0
001c8688: 3c146666 lui r20,0x6666
001c868c: 36946667 ori r20,r20,0x6667                    # r20 = 2/5
001c8690: 3c13801e lui r19,0x801e
001c8694: 2673d2d4 addiu r19,r19,0xd2d4                  # r19 = 0x801dd2d4
001c8698: 3c15801e lui r21,0x801e
001c869c: 26b5d5e4 addiu r21,r21,0xd5e4                  # r21 = 0x801dd5e4
001c86a0: 0c0166bc jal 0x00059af0                        # Get Party Data Pointer
001c86a4: 02202021 addu r4,r17,r0                        # 
001c86a8: 00408021 addu r16,r2,r0
001c86ac: 92030000 lbu r3,0x0000(r16)                    # r3 = Sprite Set
001c86b0: 00000000 nop
001c86b4: 2c620080 sltiu r2,r3,0x0080                  
001c86b8: 14400026 bne r2,r0,0x001c8754                  # Branch if not a generic sprite
001c86bc: 00602821 addu r5,r3,r0
001c86c0: 34020080 ori r2,r0,0x0080
001c86c4: 1462000a bne r3,r2,0x001c86f0                  # Branch if not a Generic Male
001c86c8: 34020081 ori r2,r0,0x0081
001c86cc: 92020002 lbu r2,0x0002(r16)                    # r2 = Current Job
001c86d0: 00000000 nop
001c86d4: 2443ffb6 addiu r3,r2,0xffb6                    # r3 = Current Job - 4A (Squire)
001c86d8: 00032040 sll r4,r3,0x01                        # r4 = (Current Job - 4A) * 2 = generic job offset
001c86dc: 3403005d ori r3,r0,0x005d                      # r3 = 0x5D (Mime)
001c86e0: 14430014 bne r2,r3,0x001c8734                  # Branch if not Mime
001c86e4: 24850060 addiu r5,r4,0x0060                    # r5 + Generic job offset + 0x60
001c86e8: 080721cd j 0x001c8734
001c86ec: 2485005e addiu r5,r4,0x005e                    # r5 = Generic job offset + 0x5e (because Bard and Dancer only add 1 each instead of the usual 2)
001c86f0: 1462000a bne r3,r2,0x001c871c                  # Branch if not a Generic Female
001c86f4: 00000000 nop
001c86f8: 92020002 lbu r2,0x0002(r16)                    # r2 = Current Job
001c86fc: 00000000 nop
001c8700: 2443ffb6 addiu r3,r2,0xffb6                    # r3 = Current Job - 4A (Squire)
001c8704: 00032040 sll r4,r3,0x01                        # r4 = (Current Job - 4A) * 2 = generic job offset
001c8708: 3403005d ori r3,r0,0x005d                      # r3 = 0x5D (Mime)
001c870c: 14430009 bne r2,r3,0x001c8734                  # Branch if not Mime
001c8710: 24850061 addiu r5,r4,0x0061                    # r5 + Generic job offset + 0x61
001c8714: 080721cd j 0x001c8734
001c8718: 2485005f addiu r5,r4,0x005f                    # r5 = Generic job offset + 0x5f (because Bard and Dancer only add 1 each instead of the usual 2)
001c871c: 92040002 lbu r4,0x0002(r16)                    # r4 = Current Job
001c8720: 0c016a29 jal 0x0005a8a4                        # Get Job Data Pointer
001c8724: 00000000 nop
001c8728: 3c01801e lui r1,0x801e
001c872c: ac22caa8 sw r2,-0x3558(r1)                     # Save Job Data Pointer to 0x801DCAA8
001c8730: 9045002d lbu r5,0x002d(r2)                     # r5 = Monster Portrait
001c8734: 92030002 lbu r3,0x0002(r16)                    # r3 = Current Job
001c8738: 3402005b ori r2,r0,0x005b                      # r2 = 0x5B (Bard)
001c873c: 14620002 bne r3,r2,0x001c8748                  # Branch if not Bard
001c8740: 3402005c ori r2,r0,0x005c                      # r2 = 0x5C (Dancer)
001c8744: 34050082 ori r5,r0,0x0082                      # r5 = 0x82 (Bard value)
001c8748: 14620003 bne r3,r2,0x001c8758                  # Branch if not Dancer
001c874c: 00051040 sll r2,r5,0x01                        # r2 = r5 * 2
001c8750: 34050083 ori r5,r0,0x0083                      # r5 = 0x83 (Dancer value)
001c8754: 00051040 sll r2,r5,0x01                        # r2 = r5 * 2
001c8758: 92030000 lbu r3,0x0000(r16)                    # r3 = Sprite Set
001c875c: 3c01801d lui r1,0x801d
001c8760: 00220821 addu r1,r1,r2
001c8764: 94255bb0 lhu r5,0x5bb0(r1)                     # Load the index for the UNIT.BIN sprite.
001c8768: 14600002 bne r3,r0,0x001c8774                  # Branch if no Sprite Set
001c876c: 34020082 ori r2,r0,0x0082                      # r2 = 0x82 (Generic Monster)
001c8770: 00002821 addu r5,r0,r0                         # r5 = no UNIT index if no Sprite Set
001c8774: 14620008 bne r3,r2,0x001c8798                  # -- Branch if not Generic Monster
001c8778: 00000000 nop                                   # -- NOTE: these lines of code are totally wasted because of the line at 0x001C8798
001c877c: 3c02801e lui r2,0x801e
001c8780: 8c42caa8 lw r2,-0x3558(r2)                     # -- r2 = Load saved Job Data Pointer
001c8784: 00000000 nop
001c8788: 9042002e lbu r2,0x002e(r2)                     # -- r2 = Monster Palette
001c878c: 00000000 nop
001c8790: 00021280 sll r2,r2,0x0a                        # -- r2 = Monster Palette * 0x400
001c8794: 00a22825 or r5,r5,r2                           # -- r5 = Monster Palette * 0x400 + UNIT index
001c8798: 30a500ff andi r5,r5,0x00ff                     # -- r5 = AND out the Monster Palette immediately after adding it - what a waste of time
001c879c: 34020018 ori r2,r0,0x0018                      # r2 = 0x18 (Reis' Holy Dragon index)
001c87a0: 14a20004 bne r5,r2,0x001c87b4                  # Branch if not Reis' Holy Dragon index
001c87a4: 28a2003f slti r2,r5,0x003f                     # r2 = 0x01 if index is 0x3E or lower
001c87a8: 2410ffff addiu r16,r0,0xffff                   # r16 = -1 (Dragon Reis value)
001c87ac: 080721fb j 0x001c87ec
001c87b0: 3405004c ori r5,r0,0x004c                      # r5 = 0x4C (Dragon Reis' true UNIT index; uses 0x4C Dragon)
001c87b4: 14400006 bne r2,r0,0x001c87d0                  # Branch if index is 0x3E or lower (not a generic monster)
001c87b8: 00000000 nop
001c87bc: 3c01801d lui r1,0x801d                         # Load the table for generic monsters' true UNIT indexes. (I don't know why it needs a second table for this.)
001c87c0: 00250821 addu r1,r1,r5
001c87c4: 90255d65 lbu r5,0x5d65(r1)                     # Actual start location for this table is 0x801D5DA4, but subtracting 0x3E would have been hard I guess. ¬_¬
001c87c8: 080721fb j 0x001c87ec
001c87cc: 00a08021 addu r16,r5,r0                        # r16 = true UNIT index for generic monsters & special generic monsters
001c87d0: 92020000 lbu r2,0x0000(r16)                    # r2 = Sprite Set
001c87d4: 00000000 nop
001c87d8: 30420080 andi r2,r2,0x0080               
001c87dc: 10400003 beq r2,r0,0x001c87ec                  # Branch if not a generic sprite
001c87e0: 00a08021 addu r16,r5,r0                        # r16 = UNIT index
001c87e4: 24a5ffff addiu r5,r5,0xffff                    # r5 = UNIT index - 1
001c87e8: 00a08021 addu r16,r5,r0                        # r16 = modified UNIT index
# Prepare coordinates and dimensions for this formation sprite.
001c87ec: 3c028888 lui r2,0x8888
001c87f0: 34428889 ori r2,r2,0x8889
001c87f4: 00a20018 mult r5,r2                            # index * -0.5333333
001c87f8: 00051fc3 sra r3,r5,0x1f                        # r3 = 0x01 if negative (never)
001c87fc: 00001010 mfhi r2                               # r2 = index * -0.53333333
001c8800: 00451021 addu r2,r2,r5                         # r2 = index * 0.53333333 (index * 8/15)
001c8804: 00021143 sra r2,r2,0x05                        # r2 = index * 8/15/32 = index / 0x3C = 0x01 if index is 0x3C or higher
001c8808: 00434023 subu r8,r2,r3                         # r8 = 0x01 if index is 0x3C or higher (second page's formation sprites)
001c880c: 00081100 sll r2,r8,0x04                        # r2 = r8 * 0x10
001c8810: 00481023 subu r2,r2,r8                         # r2 = r8 * 0x0F
001c8814: 00021080 sll r2,r2,0x02                        # r2 = r8 * 0x3C
001c8818: 1500000c bne r8,r0,0x001c884c                  # Branch if second page of formation sprites
001c881c: 00a22823 subu r5,r5,r2                         # r5 = modify index according to starting value for page (ignore if page 1, -0x3C if page 2)
# Get row and column for a formation sprite on the first page of UNIT.BIN.
001c8820: 00b40018 mult r5,r20                           # index * 0x66666667
001c8824: 00051fc3 sra r3,r5,0x1f                        # r3 = 0x01 if negative (never)
001c8828: 00001010 mfhi r2                               # index * 2 / 5
001c882c: 00021083 sra r2,r2,0x02                        # index / 10
001c8830: 00433023 subu r6,r2,r3                         # rounding
001c8834: 00c01821 addu r3,r6,r0                         # row = index / 10
001c8838: 00031080 sll r2,r3,0x02                        # (index / 10) * 4
001c883c: 00431021 addu r2,r2,r3                         # (index / 10) * 5
001c8840: 00021040 sll r2,r2,0x01                        # (index / 10) * 10
001c8844: 0807222a j 0x001c88a8
001c8848: 00a23023 subu r6,r5,r2                         # col = index % 10 (modulo)
# Get row and column for a formation sprite on the second page of UNIT.BIN.
# Branch out if this is one of the monster-sized formation sprites.
001c884c: 28a20008 slti r2,r5,0x0008                     # r2 = 0x01 if first row of second page of formation sprites (human sized formation sprites)
001c8850: 1040000b beq r2,r0,0x001c8880                  # Branch if monster sized formation sprites
001c8854: 00b40018 mult r5,r20                           # index * 0x66666667
001c8858: 00051fc3 sra r3,r5,0x1f                        # r3 = 0x01 if negative (never)
001c885c: 00001010 mfhi r2                               # index * 2 / 5
001c8860: 00021083 sra r2,r2,0x02                        # index / 10
001c8864: 00433023 subu r6,r2,r3
001c8868: 00c01821 addu r3,r6,r0                         # row = index / 10
001c886c: 00031080 sll r2,r3,0x02                        # (index / 10) * 4
001c8870: 00431021 addu r2,r2,r3                         # (index / 10) * 5
001c8874: 00021040 sll r2,r2,0x01                        # (index / 10) * 10
001c8878: 0807222a j 0x001c88a8
001c887c: 00a23023 subu r6,r5,r2                         # col = index % 10 (modulo)
# Get row and column for a monster-sized formation sprite.
001c8880: 24a4fff8 addiu r4,r5,0xfff8                    # r4 = modified index - 8
001c8884: 00940018 mult r4,r20                           # index * 0x66666667
001c8888: 00041fc3 sra r3,r4,0x1f                        # r3 = 0x01 if negative (never)
001c888c: 00001010 mfhi r2                               # index * 2 / 5
001c8890: 00021043 sra r2,r2,0x01                        # index / 5
001c8894: 00433023 subu r6,r2,r3                         
001c8898: 00c01821 addu r3,r6,r0                         # row = index / 5
001c889c: 00031080 sll r2,r3,0x02                        # (index / 5) * 4
001c88a0: 00431021 addu r2,r2,r3                         # (index / 5) * 5
001c88a4: 00823023 subu r6,r4,r2                         # col = index % 5 (modulo)
001c88a8: 00603821 addu r7,r3,r0                         # r7 = Row
001c88ac: 3404047f ori r4,r0,0x047f                      # r4 = 0x047f
001c88b0: 3c02801e lui r2,0x801e
001c88b4: 2442da63 addiu r2,r2,0xda63                    # r2 = 0x801dda63
001c88b8: a0400000 sb r0,0x0000(r2)                      # Save 00 to 0x801dda63
001c88bc: 2484ffff addiu r4,r4,0xffff
001c88c0: 0481fffd bgez r4,0x001c88b8                    # 0x480 times
001c88c4: 2442ffff addiu r2,r2,0xffff                    # in reverse? odd choice but sure why not
001c88c8: 34020001 ori r2,r0,0x0001
001c88cc: 15020043 bne r8,r2,0x001c89dc                  # Branch if first page of UNIT.BIN
001c88d0: 28a20008 slti r2,r5,0x0008
001c88d4: 14400042 bne r2,r0,0x001c89e0                  # Branch if human sized sprites on second page
001c88d8: 000823c0 sll r4,r8,0x0f                        # r4 = 0x8000 (r8 must have a value of 1 at this point)
# Monster-sized sprites: Get source and dimension coordinates and load each byte of image data
001c88dc: 34048000 ori r4,r0,0x8000              # r4 = 0x8000
001c88e0: 00061840 sll r3,r6,0x01                # r3 = Column * 2
001c88e4: 00661821 addu r3,r3,r6                 # r3 = Column * 3
001c88e8: 00031900 sll r3,r3,0x04                # r3 = Column * 48 (Height in pixels) = 0x0C
001c88ec: 00071040 sll r2,r7,0x01                # r2 = Row * 2
001c88f0: 00471021 addu r2,r2,r7                 # r2 = Row * 3
001c88f4: 00021300 sll r2,r2,0x0c                # r2 = Row * 4800 (0x3000)
001c88f8: 00621821 addu r3,r3,r2                 # r3 = [Row * 48][Column * 48] = 0xYYXX
001c88fc: 02340018 mult r17,r20                  # Party Index * 0x66666667 (2/5?)
001c8900: 24632800 addiu r3,r3,0x2800            # Add 40 to the Y value (getting past page 2's row of human-sized sprites at 40px tall)
001c8904: 00031843 sra r3,r3,0x01                # Divide the coordinates by 2
001c8908: 00641021 addu r2,r3,r4                 # Add 128 to the Y value, to get to the second page
001c890c: 00002821 addu r5,r0,r0                 # r5 (Source Y) = Starting at 0
001c8910: 02424821 addu r9,r18,r2                # r9 = RAM address + coordinates = Sprite source location?
001c8914: 00004021 addu r8,r0,r0                 # r8 (Source top border) = Starting at 0
001c8918: 3402000c ori r2,r0,0x000c              # r2 = 0x0C (12)
001c891c: a6620004 sh r2,0x0004(r19)             # Save 0x000C to 0x801DD2D8
001c8920: 34020030 ori r2,r0,0x0030              # r2 = 0x30 (48) Height and width? Unsure why the X is 1/4 the Y when it should only be half?
001c8924: a6620006 sh r2,0x0006(r19)             # Save 0x0030 to 0x801DD2DA
001c8928: 001117c3 sra r2,r17,0x1f               # r2 = 0x01 if Party Index is negative
001c892c: 00002010 mfhi r4                       # r4 = Party Index * 2/5
001c8930: 00042043 sra r4,r4,0x01                # r4 = Party Index / 5
001c8934: 00822023 subu r4,r4,r2                 # r4 = +1 if Party Index was negative (rounding thing?)
001c8938: 00041880 sll r3,r4,0x02                # r3 = Party Index / 5 * 4
001c893c: 00641821 addu r3,r3,r4                 # r3 = Party Index / 5 * 5
001c8940: 02231823 subu r3,r17,r3                # r3 = Party Index - (Party Index / 5 * 5) = remainder of dividing by 5
001c8944: 00031040 sll r2,r3,0x01                # r2 = Remainder * 2
001c8948: 00431021 addu r2,r2,r3                 # r2 = Remainder * 3
001c894c: 00021080 sll r2,r2,0x02                # r2 = Remainder * 12 (0x0C)
001c8950: 24420180 addiu r2,r2,0x0180            # r2 = + 384 = starting coordinate? number of pixels for the top 8 rows of 48? why on monsters though
001c8954: a6620000 sh r2,0x0000(r19)             # Save X coordinate to save to in VRAM to 0x801DD2D4
001c8958: 00041040 sll r2,r4,0x01                # r2 = Party Index / 5 * 2
001c895c: 00441021 addu r2,r2,r4                 # r2 = Party Index / 5 * 3
001c8960: 00021100 sll r2,r2,0x04                # r2 = Party Index / 5 * 48 (0x30) = Y coordinate
001c8964: a6620002 sh r2,0x0002(r19)             # Save Y coordinate to save the image to at 0x801DD2D6
001c8968: 00002021 addu r4,r0,r0                 # r4 = Source X =  0
001c896c: 01003821 addu r7,r8,r0                 # r7 = Source top border
001c8970: 000531c0 sll r6,r5,0x07                # r6 = Source Y * 128 (0x80) = Source Y Offset
001c8974: 00e41821 addu r3,r7,r4                 # r3 = Source top border + Source X
001c8978: 01241021 addu r2,r9,r4                 # r2 = VRAM Location + Source top + left borders
001c897c: 24840001 addiu r4,r4,0x0001            # Source X ++
001c8980: 00c21021 addu r2,r6,r2                 # r2 = Source Y Offset + Result
001c8984: 90420000 lbu r2,0x0000(r2)             # Load one byte of image data (data for 2 pixels?) from the source
001c8988: 00751821 addu r3,r3,r21                # r3 = (r7 + r4) + 0x801dd5e4
001c898c: a0620000 sb r2,0x0000(r3)              # Save pixel data to destination
001c8990: 28820018 slti r2,r4,0x0018             # r2 = 0x01 if r4 is less than 0x18 (24 bytes - i.e. 48 pixels, the width of the image)
001c8994: 1440fff7 bne r2,r0,0x001c8974          # Loop back if not done this row
001c8998: 00000000 nop     
001c899c: 24a50001 addiu r5,r5,0x0001            # Source Y ++
001c89a0: 28a20030 slti r2,r5,0x0030             # r2 = 0x01 if less than 0x30 (48 pixels, the length of the image)
001c89a4: 1440fff0 bne r2,r0,0x001c8968          # Loop back if there are still some rows left
001c89a8: 25080018 addiu r8,r8,0x0018            # r8 + 0x18 (24) = Next Row
001c89ac: 3c04801e lui r4,0x801e    
001c89b0: 2484d2d4 addiu r4,r4,0xd2d4            # r4 = 0x801dd2d4
001c89b4: 3c05801e lui r5,0x801e    
001c89b8: 24a5d5e4 addiu r5,r5,0xd5e4            # r5 = 0x801dd5e4
001c89bc: 0c00923f jal 0x000248fc                # SYS LoadImage
001c89c0: 00000000 nop     
001c89c4: 34020001 ori r2,r0,0x0001              # r2 = 0x01
001c89c8: 3c01801d lui r1,0x801d    
001c89cc: 00310821 addu r1,r1,r17                # 0x801C(D014) + Party Index
001c89d0: a022d014 sb r2,-0x2fec(r1)             # Save 0x01 to this byte - mark this party member's image as prepared?
001c89d4: 080722b4 j 0x001c8ad0    
001c89d8: 02002821 addu r5,r16,r0                # r5 = UNIT index
# Human-sized sprites: Get source and dimension coordinates and load each byte of image data
001c89dc: 000823c0 sll r4,r8,0x0f                # r4 = 0 (this line is only run if it was the first page of UNIT.BIN)
001c89e0: 00061840 sll r3,r6,0x01                # r3 = Column * 2
001c89e4: 00661821 addu r3,r3,r6                 # r3 = Column * 3
001c89e8: 000318c0 sll r3,r3,0x03                # r3 = Column * 24 (width of human sprite) = X coordinate
001c89ec: 00071080 sll r2,r7,0x02                # r2 = Row * 4
001c89f0: 00471021 addu r2,r2,r7                 # r2 = Row * 5
001c89f4: 000212c0 sll r2,r2,0x0b                # r2 = Row * 40 (height of human sprite) * 0x100 = Y coordinate (upper byte)
001c89f8: 02340018 mult r17,r20                  # Party Index * 0x66666667 (2/5?)
001c89fc: 00621821 addu r3,r3,r2                 # r3 = UNIT.BIN coordinates of image (YYXX)
001c8a00: 00031843 sra r3,r3,0x01                # r3 = coordinates / 2
001c8a04: 00831021 addu r2,r4,r3                 # r2 = Coordinates + page offset
001c8a08: 34050008 ori r5,r0,0x0008              # r5 = Source Y = starting at 8
001c8a0c: 02424821 addu r9,r18,r2                # r9 = RAM address + coordinates = sprite VRAM location?
001c8a10: 340800c0 ori r8,r0,0x00c0              # r8 (Source Top Border) = Starting at 0xC0.
# Note: 192 = 384/2 = 48 pixels * 8 lines - height of 40 vs monsters' 48, * 48 pixels per row
001c8a14: 3402000c ori r2,r0,0x000c              # r2 = 0x0C (12)
001c8a18: a6620004 sh r2,0x0004(r19)             # Save 12 to 0x801DD2D8 (1/4 of 48, is this width?)
001c8a1c: 34020030 ori r2,r0,0x0030              # r2 = 0x30 (48)
001c8a20: a6620006 sh r2,0x0006(r19)             # Save 48 to 0x801DD2DA (height?)
001c8a24: 001117c3 sra r2,r17,0x1f               # r2 = 0x01 if Party Index is negative
001c8a28: 00002010 mfhi r4                       # r4 = Party Index * 2/5
001c8a2c: 00042043 sra r4,r4,0x01                # r4 = Party Index / 5
001c8a30: 00822023 subu r4,r4,r2                 # r4 = +1 if Party Index was negative (rounding thing?)
001c8a34: 00041880 sll r3,r4,0x02                # r3 = Party Index / 5 * 4
001c8a38: 00641821 addu r3,r3,r4                 # r3 = Party Index / 5 * 5
001c8a3c: 02231823 subu r3,r17,r3                # r3 = Party Index - (Party Index / 5 * 5) = remainder of dividing by 5
001c8a40: 00031040 sll r2,r3,0x01                # r2 = Remainder * 2
001c8a44: 00431021 addu r2,r2,r3                 # r2 = Remainder * 3
001c8a48: 00021080 sll r2,r2,0x02                # r2 = Remainder * 12 (0x0C)
001c8a4c: 24420180 addiu r2,r2,0x0180            # r2 = + 384 = starting X coordinate? number of pixels for the top 8 rows of 48? 
001c8a50: a6620000 sh r2,0x0000(r19)             # Save X coordinate to save to in VRAM to 0x801DD2D4
001c8a54: 00041040 sll r2,r4,0x01                # r2 = Party Index / 5 * 2
001c8a58: 00441021 addu r2,r2,r4                 # r2 = Party Index / 5 * 3
001c8a5c: 00021100 sll r2,r2,0x04                # r2 = Party Index / 5 * 48 (0x30) = Y coordinate
001c8a60: a6620002 sh r2,0x0002(r19)             # Save Y coordinate to save the image to at 0x801DD2D6
001c8a64: 34040006 ori r4,r0,0x0006              # r4 = 6
001c8a68: 01003821 addu r7,r8,r0                 # r7 = r8 (set to 0xC0 above)
001c8a6c: 000531c0 sll r6,r5,0x07                # r6 = Source Y * 128 (0x80) = Source Y Offset
001c8a70: 00e41821 addu r3,r7,r4                 # r3 = Source top border + Source X
001c8a74: 00891021 addu r2,r4,r9                 # r2 = VRAM Location + Source top + left borders
001c8a78: 24840001 addiu r4,r4,0x0001            # Source X ++
001c8a7c: 00461021 addu r2,r2,r6                 # r2 = Source Y Offset + Result
001c8a80: 9042fbfa lbu r2,-0x0406(r2)            # Load one byte of image data (data for 2 pixels?) from the source.
# Note: -0x0406 adjusts from assuming the source is 48x48 instead of 24x40: 8 rows of 128 bytes + 6 more bytes (12 pixels) = 1030 = 0x0406
001c8a84: 00751821 addu r3,r3,r21                # r3 = Destination X + 0x801dd5e4 = Destination
001c8a88: a0620000 sb r2,0x0000(r3)              # Save pixel data to destination
001c8a8c: 28820012 slti r2,r4,0x0012             # r2 = 0x01 if r4 is less than 0x12
# Note: 0x12 = 18 bytes = 36px: width of the image minus the ending offset of 12px. 6 bytes (12px) were added for the starting offset at 001c8a64 above. 
001c8a90: 1440fff7 bne r2,r0,0x001c8a70          # Loop back if not done this row
001c8a94: 00000000 nop     
001c8a98: 24a50001 addiu r5,r5,0x0001            # Source Y ++
001c8a9c: 28a20030 slti r2,r5,0x0030             # r2 = 0x01 if less than 0x30 (48 pixels - after all, we start with 8 already, to cut off the top 8 pixels) 
001c8aa0: 1440fff0 bne r2,r0,0x001c8a64          # Loop back if there are still some rows left
001c8aa4: 25080018 addiu r8,r8,0x0018            # r8 + 0x18 (24) = Next Row
001c8aa8: 3c04801e lui r4,0x801e    
001c8aac: 2484d2d4 addiu r4,r4,0xd2d4            # r4 = 0x801dd2d4 = Destination
001c8ab0: 3c05801e lui r5,0x801e    
001c8ab4: 24a5d5e4 addiu r5,r5,0xd5e4            # r5 = 0x801dd5e4 = Source
001c8ab8: 0c00923f jal 0x000248fc                # SYS LoadImage
001c8abc: 00000000 nop     
001c8ac0: 3c01801d lui r1,0x801d    
001c8ac4: 00310821 addu r1,r1,r17                # 0x801CD014 + Party Index
001c8ac8: a020d014 sb r0,-0x2fec(r1)             # Save 0x00 to this byte because... uh??? I don't even know?
001c8acc: 02002821 addu r5,r16,r0                # r5 = UNIT index
# Palette handling
001c8ad0: 2402ffff addiu r2,r0,0xffff                # r2 = -1
001c8ad4: 14a20003 bne r5,r2,0x001c8ae4              # Branch if not -1 (Dragon Reis' value)
001c8ad8: 00000000 nop
001c8adc: 080722c3 j 0x001c8b0c
001c8ae0: 3405007a ori r5,r0,0x007a                  # r5 = 0x7A: Palette 122 for Dragon Reis
001c8ae4: 28a2003e slti r2,r5,0x003e                 # r2 = 0x01 if UNIT index is below 0x3E
001c8ae8: 14400008 bne r2,r0,0x001c8b0c              # Branch if so (special unit or generic human)
001c8aec: 24a4ffc2 addiu r4,r5,0xffc2                # r4 = UNIT index - 0x3E
001c8af0: 3c02801e lui r2,0x801e
001c8af4: 8c42caa8 lw r2,-0x3558(r2)                 # Load saved Job Data Pointer
001c8af8: 00041840 sll r3,r4,0x01                    # r3 = (UNIT index - 0x3E) * 2 
001c8afc: 9042002e lbu r2,0x002e(r2)                 # r2 = Monster Palette
001c8b00: 00641821 addu r3,r3,r4                     # r3 = (UNIT index - 0x3E) * 3
001c8b04: 2442003e addiu r2,r2,0x003e                # r2 = Monster Palette - 0x3E
001c8b08: 00622821 addu r5,r3,r2                     # r5 = (Unit index - 0x3E) * 3 + Monster Palette - 0x3E
001c8b0c: 04a10002 bgez r5,0x001c8b18                # Branch if result GTE zero
001c8b10: 00a01021 addu r2,r5,r0
001c8b14: 24a20003 addiu r2,r5,0x0003
001c8b18: 00023083 sra r6,r2,0x02
001c8b1c: 00c01821 addu r3,r6,r0
001c8b20: 00031080 sll r2,r3,0x02
001c8b24: 00a23023 subu r6,r5,r2
001c8b28: 02203821 addu r7,r17,r0
001c8b2c: 00031200 sll r2,r3,0x08
001c8b30: 00061980 sll r3,r6,0x06
001c8b34: 00431021 addu r2,r2,r3
001c8b38: 00021043 sra r2,r2,0x01
001c8b3c: 3403f000 ori r3,r0,0xf000
001c8b40: 3c04801e lui r4,0x801e
001c8b44: 2484d2dc addiu r4,r4,0xd2dc            # constructed RECT data
001c8b48: 06210002 bgez r17,0x001c8b54
001c8b4c: 00431021 addu r2,r2,r3
001c8b50: 26270003 addiu r7,r17,0x0003
001c8b54: 02422821 addu r5,r18,r2                # open.bin + ?
001c8b58: 00071883 sra r3,r7,0x02
001c8b5c: 00031080 sll r2,r3,0x02
001c8b60: 02221023 subu r2,r17,r2
001c8b64: 00021100 sll r2,r2,0x04
001c8b68: 24420180 addiu r2,r2,0x0180
001c8b6c: 246300e0 addiu r3,r3,0x00e0
001c8b70: a4820000 sh r2,0x0000(r4)
001c8b74: 34020010 ori r2,r0,0x0010
001c8b78: 3c01801e lui r1,0x801e
001c8b7c: a422d2e0 sh r2,-0x2d20(r1)
001c8b80: 34020001 ori r2,r0,0x0001
001c8b84: 3c01801e lui r1,0x801e
001c8b88: a423d2de sh r3,-0x2d22(r1)
001c8b8c: 3c01801e lui r1,0x801e
001c8b90: a422d2e2 sh r2,-0x2d1e(r1)
001c8b94: 0c00923f jal 0x000248fc                 # SYS LoadImage 
001c8b98: 00000000 nop
001c8b9c: 3c038016 lui r3,0x8016
001c8ba0: 94635fda lhu r3,0x5fda(r3)
001c8ba4: 34020002 ori r2,r0,0x0002
001c8ba8: 14620005 bne r3,r2,0x001c8bc0           # branch if unit.bin was opened immediately/already opened?
001c8bac: 00000000 nop
001c8bb0: 0c0532a0 jal 0x0014ca80                 # Switch To Next Thread
001c8bb4: 26310001 addiu r17,r17,0x0001
001c8bb8: 080722f4 j 0x001c8bd0
001c8bbc: 2a220010 slti r2,r17,0x0010             # do for all 0x10 non-Guest party members
001c8bc0: 0c0091b5 jal 0x000246d4                 # SYS DrawSync
001c8bc4: 00002021 addu r4,r0,r0
001c8bc8: 26310001 addiu r17,r17,0x0001
001c8bcc: 2a220010 slti r2,r17,0x0010             # do for all 0x10 non-Guest party members
001c8bd0: 1440feb3 bne r2,r0,0x001c86a0
001c8bd4: 00000000 nop
# END
001c8bd8: 0c011273 jal 0x000449cc                 # SCUS Call Free
001c8bdc: 02402021 addu r4,r18,r0
001c8be0: 8fbf0040 lw r31,0x0040(r29)
001c8be4: 8fb5003c lw r21,0x003c(r29)
001c8be8: 8fb40038 lw r20,0x0038(r29)
001c8bec: 8fb30034 lw r19,0x0034(r29)
001c8bf0: 8fb20030 lw r18,0x0030(r29)
001c8bf4: 8fb1002c lw r17,0x002c(r29)
001c8bf8: 8fb00028 lw r16,0x0028(r29)
001c8bfc: 27bd0048 addiu r29,r29,0x0048
001c8c00: 03e00008 jr r31
001c8c04: 00000000 nop