Difference between revisions of "Load Data From Disc (0x11bf4)"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
m
m
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
  #  ROUTINE: LOAD DATA FROM DISC (0x11bf4)
 
  #  ROUTINE: LOAD DATA FROM DISC (0x11bf4)
 
  #      Parameters:
 
  #      Parameters:
  #          r4          = (ptr1) Pointer (Sometimes 0x8004eaf4)
+
  #          r4          = (ptr1) ptr to file to be opened data (often 8004eaf4)
 
  #          r5          = (lba) LBA Sector of data
 
  #          r5          = (lba) LBA Sector of data
 
  #          r6          = (numSectors) Number of sectors to load
 
  #          r6          = (numSectors) Number of sectors to load
 
  #          r7          = (locationPtr) Location to load the data into RAM
 
  #          r7          = (locationPtr) Location to load the data into RAM
  #          *(sp + 10)  = (p5) Sometimes -1
+
  #          *(sp + 10)  = (p5) Sometimes -1 (whether to display "now loading")
 
  #      Returns:
 
  #      Returns:
 
  #          r2          = (0, if load was successful; 1, otherwise) ?
 
  #          r2          = (0, if load was successful; 1, otherwise) ?
 +
 +
#additional notes: seems to do some prep work for loading files, such as finding its CDlLOC but nothing I can see explicitly determines that it requests the DMA to actually load any files.
 
   
 
   
 
  80011bf4: 27bdffb8 addiu r29,r29,-0x0048
 
  80011bf4: 27bdffb8 addiu r29,r29,-0x0048
Line 26: Line 28:
 
  80011c30: 10400003 beq r2,r0,0x80011c40
 
  80011c30: 10400003 beq r2,r0,0x80011c40
 
  80011c34: 00e0b021 addu r22,r7,r0                  #  locationPtr
 
  80011c34: 00e0b021 addu r22,r7,r0                  #  locationPtr
                                                     #  if (*(ptr1 + 4) != 0) {
+
                                                     #  if (*(ptr1 + 4) != 0) { // if file already queued to open, fail
 
  80011c38: 0800476a j 0x80011da8                    #      return 1;
 
  80011c38: 0800476a j 0x80011da8                    #      return 1;
 
  80011c3c: 34020001 ori r2,r0,0x0001
 
  80011c3c: 34020001 ori r2,r0,0x0001
 
                                                     #  }
 
                                                     #  }
 
  80011c40: 34170001 ori r23,r0,0x0001                #  1
 
  80011c40: 34170001 ori r23,r0,0x0001                #  1
  80011c44: 10770003 beq r3,r23,0x80011c54            #  if (p5 != 1) {
+
  80011c44: 10770003 beq r3,r23,0x80011c54            #  if (p5 != 1) {         //
 
  80011c48: 00000000 nop
 
  80011c48: 00000000 nop
 
  80011c4c: 3c018003 lui r1,0x8003
 
  80011c4c: 3c018003 lui r1,0x8003
 
  80011c50: ac238b08 sw r3,-0x74f8(r1)                #      *0x80028b08 = p5
 
  80011c50: ac238b08 sw r3,-0x74f8(r1)                #      *0x80028b08 = p5
 
                                                     #  }
 
                                                     #  }
  80011c54: 14600049 bne r3,r0,0x80011d7c            #  if (p5 == 0) {
+
  80011c54: 14600049 bne r3,r0,0x80011d7c            #  if (p5 == 0) {         // if displaying now loading,
 
  80011c58: 00000000 nop
 
  80011c58: 00000000 nop
  80011c5c: 0c00918e jal 0x80024638
+
  80011c5c: 0c00918e jal 0x80024638                   [[SYS SetDispMask]]        // don't draw screen mask
  80011c60: 00002021 addu r4,r0,r0
+
  80011c60: 00002021 addu r4,r0,r0                   mask = 0
  80011c64: 34040001 ori r4,r0,0x0001
+
  80011c64: 34040001 ori r4,r0,0x0001                 display
 
  80011c68: 00002821 addu r5,r0,r0
 
  80011c68: 00002821 addu r5,r0,r0
  80011c6c: 0c0102f6 jal 0x80040bd8
+
  80011c6c: 0c0102f6 jal 0x80040bd8                   [[Build Image Data for Now Loading message]]
  80011c70: 00003021 addu r6,r0,r0
+
  80011c70: 00003021 addu r6,r0,r0                   x=0, y=0
 
  80011c74: 27a40018 addiu r4,r29,0x0018
 
  80011c74: 27a40018 addiu r4,r29,0x0018
 
  80011c78: 00002821 addu r5,r0,r0
 
  80011c78: 00002821 addu r5,r0,r0
Line 53: Line 55:
 
  80011c90: a7a00018 sh r0,0x0018(r29)
 
  80011c90: a7a00018 sh r0,0x0018(r29)
 
  80011c94: a7a0001a sh r0,0x001a(r29)
 
  80011c94: a7a0001a sh r0,0x001a(r29)
  80011c98: 0c00921a jal 0x80024868
+
  80011c98: 0c00921a jal 0x80024868                     [[SYS ClearImage]]
 
  80011c9c: a7a2001e sh r2,0x001e(r29)
 
  80011c9c: a7a2001e sh r2,0x001e(r29)
  80011ca0: 0c0091b5 jal 0x800246d4
+
  80011ca0: 0c0091b5 jal 0x800246d4                     [[SYS DrawSync]]
 
  80011ca4: 00002021 addu r4,r0,r0
 
  80011ca4: 00002021 addu r4,r0,r0
 
  80011ca8: 3c118005 lui r17,0x8005
 
  80011ca8: 3c118005 lui r17,0x8005
  80011cac: 2631ea14 addiu r17,r17,-0x15ec
+
  80011cac: 2631ea14 addiu r17,r17,-0x15ec             'now loading' draw environment
  80011cb0: 02202021 addu r4,r17,r0
+
  80011cb0: 02202021 addu r4,r17,r0                    
  80011cb4: 00002821 addu r5,r0,r0
+
  80011cb4: 00002821 addu r5,r0,r0                     x = 0
  80011cb8: 00003021 addu r6,r0,r0
+
  80011cb8: 00003021 addu r6,r0,r0                     y = 0
  80011cbc: 34070100 ori r7,r0,0x0100
+
  80011cbc: 34070100 ori r7,r0,0x0100                   w = 0x100
  80011cc0: 341000f0 ori r16,r0,0x00f0
+
  80011cc0: 341000f0 ori r16,r0,0x00f0                 h = 0xf0
  80011cc4: 0c008b78 jal 0x80022de0
+
  80011cc4: 0c008b78 jal 0x80022de0                     [[E03 SetDefDrawEnv]] - define the draw environment for now loading (top screen)
 
  80011cc8: afb00010 sw r16,0x0010(r29)
 
  80011cc8: afb00010 sw r16,0x0010(r29)
 
  80011ccc: 3c128005 lui r18,0x8005
 
  80011ccc: 3c128005 lui r18,0x8005
  80011cd0: 2652eacc addiu r18,r18,-0x1534
+
  80011cd0: 2652eacc addiu r18,r18,-0x1534             'now loading' display environment
  80011cd4: 02402021 addu r4,r18,r0
+
  80011cd4: 02402021 addu r4,r18,r0                    
  80011cd8: 00002821 addu r5,r0,r0
+
  80011cd8: 00002821 addu r5,r0,r0                     x = 0
  80011cdc: 340600f0 ori r6,r0,0x00f0
+
  80011cdc: 340600f0 ori r6,r0,0x00f0                   y = 0xf0
  80011ce0: 34070100 ori r7,r0,0x0100
+
  80011ce0: 34070100 ori r7,r0,0x0100                   w = 0x100
  80011ce4: 0c008bac jal 0x80022eb0
+
  80011ce4: 0c008bac jal 0x80022eb0                     [[E04 SetDefDispEnv]] - define the display environment for now loading (bottom screen)
  80011ce8: afb00010 sw r16,0x0010(r29)
+
  80011ce8: afb00010 sw r16,0x0010(r29)                 h = 0xf0
 
  80011cec: 2631005c addiu r17,r17,0x005c
 
  80011cec: 2631005c addiu r17,r17,0x005c
 
  80011cf0: 02202021 addu r4,r17,r0
 
  80011cf0: 02202021 addu r4,r17,r0
Line 79: Line 81:
 
  80011cf8: 340600f0 ori r6,r0,0x00f0
 
  80011cf8: 340600f0 ori r6,r0,0x00f0
 
  80011cfc: 34070100 ori r7,r0,0x0100
 
  80011cfc: 34070100 ori r7,r0,0x0100
  80011d00: 0c008b78 jal 0x80022de0
+
  80011d00: 0c008b78 jal 0x80022de0                     [[E03 SetDefDrawEnv]] (DRAWENV * 8004EA70, 0, 240, 256, 240) (bottom screen)
 
  80011d04: afb00010 sw r16,0x0010(r29)
 
  80011d04: afb00010 sw r16,0x0010(r29)
 
  80011d08: 26520014 addiu r18,r18,0x0014
 
  80011d08: 26520014 addiu r18,r18,0x0014
Line 86: Line 88:
 
  80011d14: 00003021 addu r6,r0,r0
 
  80011d14: 00003021 addu r6,r0,r0
 
  80011d18: 34070100 ori r7,r0,0x0100
 
  80011d18: 34070100 ori r7,r0,0x0100
  80011d1c: 0c008bac jal 0x80022eb0
+
  80011d1c: 0c008bac jal 0x80022eb0                     [[E04 SetDefDispEnv]] (DISPENV * 8004EAE0, 0, 0, 256, 240) (top screen)
 
  80011d20: afb00010 sw r16,0x0010(r29)
 
  80011d20: afb00010 sw r16,0x0010(r29)
  80011d24: 340200f0 ori r2,r0,0x00f0
+
  80011d24: 340200f0 ori r2,r0,0x00f0                   update draw environment:
 
  80011d28: 3c018005 lui r1,0x8005
 
  80011d28: 3c018005 lui r1,0x8005
  80011d2c: a422ea7a sh r2,-0x1586(r1)
+
  80011d2c: a422ea7a sh r2,-0x1586(r1)                 DRAWENV2.ofs[1] == 0xf0
 
  80011d30: 34020001 ori r2,r0,0x0001
 
  80011d30: 34020001 ori r2,r0,0x0001
 
  80011d34: 3c018005 lui r1,0x8005
 
  80011d34: 3c018005 lui r1,0x8005
  80011d38: a420ea78 sh r0,-0x1588(r1)
+
  80011d38: a420ea78 sh r0,-0x1588(r1)                 DRAWENV2.ofs[0] == 0x00
 
  80011d3c: 3c018005 lui r1,0x8005
 
  80011d3c: 3c018005 lui r1,0x8005
  80011d40: a420ea1e sh r0,-0x15e2(r1)
+
  80011d40: a420ea1e sh r0,-0x15e2(r1)                 DRAWENV1.ofs[1] == 0x00
 
  80011d44: 3c018005 lui r1,0x8005
 
  80011d44: 3c018005 lui r1,0x8005
  80011d48: a420ea1c sh r0,-0x15e4(r1)
+
  80011d48: a420ea1c sh r0,-0x15e4(r1)                 DRAWENV1.ofs[0] == 0x00
 
  80011d4c: 3c018005 lui r1,0x8005
 
  80011d4c: 3c018005 lui r1,0x8005
  80011d50: a022ea87 sb r2,-0x1579(r1)
+
  80011d50: a022ea87 sb r2,-0x1579(r1)                  DRAWENV2.dfe == TRUE (enable drawing in this region.)
 
  80011d54: 3c018005 lui r1,0x8005
 
  80011d54: 3c018005 lui r1,0x8005
  80011d58: a022ea88 sb r2,-0x1578(r1)
+
  80011d58: a022ea88 sb r2,-0x1578(r1)                 DRAWENV2.isbg == TRUE
 
  80011d5c: 3c018005 lui r1,0x8005
 
  80011d5c: 3c018005 lui r1,0x8005
  80011d60: a022ea2b sb r2,-0x15d5(r1)
+
  80011d60: a022ea2b sb r2,-0x15d5(r1)                 DRAWENV1.dfe == TRUE
 
  80011d64: 3c018005 lui r1,0x8005
 
  80011d64: 3c018005 lui r1,0x8005
  80011d68: a022ea2c sb r2,-0x15d4(r1)
+
  80011d68: a022ea2c sb r2,-0x15d4(r1)                 DRAWENV1.isbg == TRUE
  80011d6c: 0c00932b jal 0x80024cac
+
  80011d6c: 0c00932b jal 0x80024cac                   [[SYS PutDrawEnv]] DRAWENV2
  80011d70: 02202021 addu r4,r17,r0
+
  80011d70: 02202021 addu r4,r17,r0                  
  80011d74: 0c0093a1 jal 0x80024e84
+
  80011d74: 0c0093a1 jal 0x80024e84                   [[SYS PutDispEnv]] DISPENV2
 
  80011d78: 02402021 addu r4,r18,r0
 
  80011d78: 02402021 addu r4,r18,r0
 
                                                     #  }
 
                                                     #  }
 
  80011d7c: 02802021 addu r4,r20,r0
 
  80011d7c: 02802021 addu r4,r20,r0
  80011d80: 2665001c addiu r5,r19,0x001c
+
  80011d80: 2665001c addiu r5,r19,0x001c             #
  80011d84: ae600000 sw r0,0x0000(r19)                #  *ptr1 = 0
+
  80011d84: ae600000 sw r0,0x0000(r19)                #  file.00 == 0
  80011d88: ae600018 sw r0,0x0018(r19)                #  *(ptr1 + 0x18) = 0
+
  80011d88: ae600018 sw r0,0x0018(r19)                #  file.18 == 0
  80011d8c: ae600008 sw r0,0x0008(r19)                #  *(ptr1 + 8) = 0
+
  80011d8c: ae600008 sw r0,0x0008(r19)                #  file.08 == 0
  80011d90: ae770004 sw r23,0x0004(r19)              #  *(ptr1 + 4) = 1
+
  80011d90: ae770004 sw r23,0x0004(r19)              #  file.occ == 1
  80011d94: 0c007bef jal 0x8001efbc                  #  [[S 002 CDIntToPos]] Convert LBA into CD time position on disc
+
  80011d94: 0c007bef jal 0x8001efbc                  #  [[S 002 CDIntToPos]] (LBA lba, CDlLoc * file.CDlLoc)
  80011d98: ae640014 sw r4,0x0014(r19)                #  *(ptr1 + 0x14) = lba
+
  80011d98: ae640014 sw r4,0x0014(r19)                #  file.lba = lba
 
  80011d9c: 00001021 addu r2,r0,r0                    #  result = 0
 
  80011d9c: 00001021 addu r2,r0,r0                    #  result = 0
  80011da0: ae750010 sw r21,0x0010(r19)              #  *(ptr1 + 0x10) = numSectors
+
  80011da0: ae750010 sw r21,0x0010(r19)              #  file.nosec = numSectors
  80011da4: ae760020 sw r22,0x0020(r19)              #  *(ptr1 + 0x20) = locationPtr
+
  80011da4: ae760020 sw r22,0x0020(r19)              #  file.dst = locationPtr
 
                                                     #  return result;
 
                                                     #  return result;
 
  80011da8: 8fbf0040 lw r31,0x0040(r29)               
 
  80011da8: 8fbf0040 lw r31,0x0040(r29)               

Latest revision as of 05:16, 7 June 2024

#   ROUTINE: LOAD DATA FROM DISC (0x11bf4)
#       Parameters:
#           r4          = (ptr1) ptr to file to be opened data (often 8004eaf4)
#           r5          = (lba) LBA Sector of data
#           r6          = (numSectors) Number of sectors to load
#           r7          = (locationPtr) Location to load the data into RAM
#           *(sp + 10)  = (p5) Sometimes -1 (whether to display "now loading")
#       Returns:
#           r2          = (0, if load was successful; 1, otherwise) ?

#additional notes: seems to do some prep work for loading files, such as finding its CDlLOC but nothing I can see explicitly determines that it requests the DMA to actually load any files.

80011bf4: 27bdffb8 addiu r29,r29,-0x0048
80011bf8: afb3002c sw r19,0x002c(r29)
80011bfc: 00809821 addu r19,r4,r0                   #   ptr1
80011c00: afb40030 sw r20,0x0030(r29)
80011c04: 00a0a021 addu r20,r5,r0                   #   lba
80011c08: afb50034 sw r21,0x0034(r29)
80011c0c: 00c0a821 addu r21,r6,r0                   #   numSectors
80011c10: afb60038 sw r22,0x0038(r29)
80011c14: afbf0040 sw r31,0x0040(r29)
80011c18: afb7003c sw r23,0x003c(r29)
80011c1c: afb20028 sw r18,0x0028(r29)
80011c20: afb10024 sw r17,0x0024(r29)
80011c24: afb00020 sw r16,0x0020(r29)
80011c28: 8e620004 lw r2,0x0004(r19)                #   *(ptr1 + 4)
80011c2c: 8fa30058 lw r3,0x0058(r29)                #   p5
80011c30: 10400003 beq r2,r0,0x80011c40
80011c34: 00e0b021 addu r22,r7,r0                   #   locationPtr
                                                    #   if (*(ptr1 + 4) != 0) { // if file already queued to open, fail
80011c38: 0800476a j 0x80011da8                     #       return 1;
80011c3c: 34020001 ori r2,r0,0x0001
                                                    #   }
80011c40: 34170001 ori r23,r0,0x0001                #   1
80011c44: 10770003 beq r3,r23,0x80011c54            #   if (p5 != 1) {         // 
80011c48: 00000000 nop
80011c4c: 3c018003 lui r1,0x8003
80011c50: ac238b08 sw r3,-0x74f8(r1)                #       *0x80028b08 = p5
                                                    #   }
80011c54: 14600049 bne r3,r0,0x80011d7c             #   if (p5 == 0) {         // if displaying now loading,
80011c58: 00000000 nop
80011c5c: 0c00918e jal 0x80024638                   SYS SetDispMask        // don't draw screen mask
80011c60: 00002021 addu r4,r0,r0                    mask = 0
80011c64: 34040001 ori r4,r0,0x0001                 display
80011c68: 00002821 addu r5,r0,r0
80011c6c: 0c0102f6 jal 0x80040bd8                   Build Image Data for Now Loading message
80011c70: 00003021 addu r6,r0,r0                    x=0, y=0
80011c74: 27a40018 addiu r4,r29,0x0018
80011c78: 00002821 addu r5,r0,r0
80011c7c: 00003021 addu r6,r0,r0
80011c80: 00003821 addu r7,r0,r0
80011c84: 34020100 ori r2,r0,0x0100
80011c88: a7a2001c sh r2,0x001c(r29)
80011c8c: 340201e0 ori r2,r0,0x01e0
80011c90: a7a00018 sh r0,0x0018(r29)
80011c94: a7a0001a sh r0,0x001a(r29)
80011c98: 0c00921a jal 0x80024868                     SYS ClearImage
80011c9c: a7a2001e sh r2,0x001e(r29)
80011ca0: 0c0091b5 jal 0x800246d4                     SYS DrawSync
80011ca4: 00002021 addu r4,r0,r0
80011ca8: 3c118005 lui r17,0x8005
80011cac: 2631ea14 addiu r17,r17,-0x15ec              'now loading' draw environment
80011cb0: 02202021 addu r4,r17,r0                     
80011cb4: 00002821 addu r5,r0,r0                      x = 0
80011cb8: 00003021 addu r6,r0,r0                      y = 0
80011cbc: 34070100 ori r7,r0,0x0100                   w = 0x100
80011cc0: 341000f0 ori r16,r0,0x00f0                  h = 0xf0
80011cc4: 0c008b78 jal 0x80022de0                     E03 SetDefDrawEnv - define the draw environment for now loading (top screen)
80011cc8: afb00010 sw r16,0x0010(r29)
80011ccc: 3c128005 lui r18,0x8005
80011cd0: 2652eacc addiu r18,r18,-0x1534              'now loading' display environment
80011cd4: 02402021 addu r4,r18,r0                     
80011cd8: 00002821 addu r5,r0,r0                      x = 0
80011cdc: 340600f0 ori r6,r0,0x00f0                   y = 0xf0
80011ce0: 34070100 ori r7,r0,0x0100                   w = 0x100
80011ce4: 0c008bac jal 0x80022eb0                     E04 SetDefDispEnv - define the display environment for now loading (bottom screen)
80011ce8: afb00010 sw r16,0x0010(r29)                 h = 0xf0
80011cec: 2631005c addiu r17,r17,0x005c
80011cf0: 02202021 addu r4,r17,r0
80011cf4: 00002821 addu r5,r0,r0
80011cf8: 340600f0 ori r6,r0,0x00f0
80011cfc: 34070100 ori r7,r0,0x0100
80011d00: 0c008b78 jal 0x80022de0                     E03 SetDefDrawEnv (DRAWENV * 8004EA70, 0, 240, 256, 240) (bottom screen)
80011d04: afb00010 sw r16,0x0010(r29)
80011d08: 26520014 addiu r18,r18,0x0014
80011d0c: 02402021 addu r4,r18,r0
80011d10: 00002821 addu r5,r0,r0
80011d14: 00003021 addu r6,r0,r0
80011d18: 34070100 ori r7,r0,0x0100
80011d1c: 0c008bac jal 0x80022eb0                     E04 SetDefDispEnv (DISPENV * 8004EAE0, 0, 0, 256, 240) (top screen)
80011d20: afb00010 sw r16,0x0010(r29)
80011d24: 340200f0 ori r2,r0,0x00f0                   update draw environment:
80011d28: 3c018005 lui r1,0x8005
80011d2c: a422ea7a sh r2,-0x1586(r1)                  DRAWENV2.ofs[1] == 0xf0
80011d30: 34020001 ori r2,r0,0x0001
80011d34: 3c018005 lui r1,0x8005
80011d38: a420ea78 sh r0,-0x1588(r1)                  DRAWENV2.ofs[0] == 0x00
80011d3c: 3c018005 lui r1,0x8005
80011d40: a420ea1e sh r0,-0x15e2(r1)                  DRAWENV1.ofs[1] == 0x00
80011d44: 3c018005 lui r1,0x8005
80011d48: a420ea1c sh r0,-0x15e4(r1)                  DRAWENV1.ofs[0] == 0x00
80011d4c: 3c018005 lui r1,0x8005
80011d50: a022ea87 sb r2,-0x1579(r1)                  DRAWENV2.dfe == TRUE (enable drawing in this region.)
80011d54: 3c018005 lui r1,0x8005
80011d58: a022ea88 sb r2,-0x1578(r1)                  DRAWENV2.isbg == TRUE
80011d5c: 3c018005 lui r1,0x8005
80011d60: a022ea2b sb r2,-0x15d5(r1)                  DRAWENV1.dfe == TRUE
80011d64: 3c018005 lui r1,0x8005
80011d68: a022ea2c sb r2,-0x15d4(r1)                  DRAWENV1.isbg == TRUE
80011d6c: 0c00932b jal 0x80024cac                   SYS PutDrawEnv DRAWENV2
80011d70: 02202021 addu r4,r17,r0                   
80011d74: 0c0093a1 jal 0x80024e84                   SYS PutDispEnv DISPENV2
80011d78: 02402021 addu r4,r18,r0
                                                    #   }
80011d7c: 02802021 addu r4,r20,r0
80011d80: 2665001c addiu r5,r19,0x001c              #
80011d84: ae600000 sw r0,0x0000(r19)                #   file.00 == 0
80011d88: ae600018 sw r0,0x0018(r19)                #   file.18 == 0
80011d8c: ae600008 sw r0,0x0008(r19)                #   file.08 == 0
80011d90: ae770004 sw r23,0x0004(r19)               #   file.occ == 1
80011d94: 0c007bef jal 0x8001efbc                   #   S 002 CDIntToPos (LBA lba, CDlLoc * file.CDlLoc)
80011d98: ae640014 sw r4,0x0014(r19)                #   file.lba = lba
80011d9c: 00001021 addu r2,r0,r0                    #   result = 0
80011da0: ae750010 sw r21,0x0010(r19)               #   file.nosec = numSectors
80011da4: ae760020 sw r22,0x0020(r19)               #   file.dst = locationPtr
                                                    #   return result;
80011da8: 8fbf0040 lw r31,0x0040(r29)               
80011dac: 8fb7003c lw r23,0x003c(r29)
80011db0: 8fb60038 lw r22,0x0038(r29)
80011db4: 8fb50034 lw r21,0x0034(r29)
80011db8: 8fb40030 lw r20,0x0030(r29)
80011dbc: 8fb3002c lw r19,0x002c(r29)
80011dc0: 8fb20028 lw r18,0x0028(r29)
80011dc4: 8fb10024 lw r17,0x0024(r29)
80011dc8: 8fb00020 lw r16,0x0020(r29)
80011dcc: 27bd0048 addiu r29,r29,0x0048
80011dd0: 03e00008 jr r31
80011dd4: 00000000 nop