Construct Polygon Data For Effects
Jump to navigation
Jump to search
001a5394: 27bdffc0 addiu r29,r29,0xffc0 - 0x40 001a5398: afb50034 sw r21,0x0034(r29) 001a539c: 0080a821 addu r21,r4,r0 001a53a0: afb10024 sw r17,0x0024(r29) 001a53a4: 00a08821 addu r17,r5,r0 r5 = pointer to vector [x,y,z] in stack 001a53a8: afb00020 sw r16,0x0020(r29) 001a53ac: 00c08021 addu r16,r6,r0 r16 = Angle value 001a53b0: afb3002c sw r19,0x002c(r29) 001a53b4: 00e09821 addu r19,r7,r0 camera zoom pointer 001a53b8: afb40030 sw r20,0x0030(r29) 001a53bc: 8fb40050 lw r20,0x0050(r29) some Z related pointer 001a53c0: 34040001 ori r4,r0,0x0001 001a53c4: afbf003c sw r31,0x003c(r29) 001a53c8: afb60038 sw r22,0x0038(r29) 001a53cc: 0c0694cf jal 0x001a533c 001a533c - 001a5390 001a53d0: afb20028 sw r18,0x0028(r29) 001a53d4: 00409021 addu r18,r2,r0 r18 = primative pointer 001a53d8: 02402021 addu r4,r18,r0 *p = primative address 001a53dc: 34050001 ori r5,r0,0x0001 dfe = 1 001a53e0: 34060001 ori r6,r0,0x0001 dtd = 1 001a53e4: 34070001 ori r7,r0,0x0001 tpage = 1 001a53e8: 0c009533 jal 0x000254cc P41 SetDrawMode(DRAW_MODE *p, int dfe, int dtd, int tpage, RECT *tw) 001a53ec: afa00010 sw r0,0x0010(r29) *tw = <null> 001a53f0: 3c0400ff lui r4,0x00ff 001a53f4: 3484ffff ori r4,r4,0xffff 001a53f8: 3c05ff00 lui r5,0xff00 001a53fc: 00108400 sll r16,r16,0x10 001a5400: 8e430000 lw r3,0x0000(r18) 001a5404: 8e820000 lw r2,0x0000(r20) primative table 001a5408: 00651824 and r3,r3,r5 001a540c: 00441024 and r2,r2,r4 001a5410: 00621825 or r3,r3,r2 001a5414: ae430000 sw r3,0x0000(r18) 001a5418: 8e820000 lw r2,0x0000(r20) 001a541c: 02442024 and r4,r18,r4 001a5420: 00451024 and r2,r2,r5 001a5424: 00441025 or r2,r2,r4 001a5428: ae820000 sw r2,0x0000(r20) 001a542c: 86220000 lh r2,0x0000(r17) up to here. Load XX 001a5430: 00108403 sra r16,r16,0x10 001a5434: 3c01801c lui r1,0x801c 001a5438: ac22c0b0 sw r2,-0x3f50(r1) store vector XX in 0x801bc0b0 001a543c: 86220002 lh r2,0x0002(r17) load YY 001a5440: 3c01801c lui r1,0x801c 001a5444: ac22c0b4 sw r2,-0x3f4c(r1) store vector YY in 0x801bc0b4 001a5448: 0c006f0a jal 0x0001bc28 Cos call function calculates cosine of r4 001a544c: 02002021 addu r4,r16,r0 r4 = angle value 001a5450: 02002021 addu r4,r16,r0 r4 = angle value 001a5454: 0c006ed7 jal 0x0001bb5c Call Sin function calculates sin of r4 001a5458: 00408821 addu r17,r2,r0 Preserve Cos(θ) in r17 001a545c: 02208021 addu r16,r17,r0 001a5460: 00402021 addu r4,r2,r0 move sin(θ) to r4 001a5464: 12600022 beq r19,r0,0x001a54f0 If Camera zoom pointer is not Null // Else apply standard rotational matrix, with no magnification/shrinking 001a5468: 00801021 addu r2,r4,r0 put sin(θ) in r2 001a546c: 00111c00 sll r3,r17,0x10 001a5470: 8e620000 lw r2,0x0000(r19) Load camera zoom X 001a5474: 00031c03 sra r3,r3,0x10 cos(θ) 001a5478: 00620018 mult r3,r2 X-Zoom*cos(θ) 001a547c: 00001012 mflo r2 001a5480: 00021303 sra r2,r2,0x0c >> 0xc 001a5484: 3c01801c lui r1,0x801c 001a5488: a422c09c sh r2,-0x3f64(r1) Store X-Zoom*cos(θ) at Matrix element r_11 001a548c: 8e620004 lw r2,0x0004(r19) load Camera zoom Y 001a5490: 00000000 nop 001a5494: 00620018 mult r3,r2 001a5498: 00041c00 sll r3,r4,0x10 001a549c: 00031c03 sra r3,r3,0x10 sin(θ) 001a54a0: 00001012 mflo r2 001a54a4: 00021303 sra r2,r2,0x0c Y-Zoom * cos(θ) >> 0xc 001a54a8: 3c01801c lui r1,0x801c 001a54ac: a422c0a4 sh r2,-0x3f5c(r1) Store Y-zoom*cos(θ) at Matrix element r_22 001a54b0: 8e640004 lw r4,0x0004(r19) Load Y-Zoom 001a54b4: 00031023 subu r2,r0,r3 -sin(θ) 001a54b8: 00440018 mult r2,r4 001a54bc: 00001012 mflo r2 Y-Zoom * sin(θ) 001a54c0: 00021303 sra r2,r2,0x0c >> 0xc 001a54c4: 3c01801c lui r1,0x801c 001a54c8: a422c09e sh r2,-0x3f62(r1) Store Y-Zoom * sin(θ) at Matrix element r_21 001a54cc: 8e620000 lw r2,0x0000(r19) Load X-Zoom 001a54d0: 00000000 nop 001a54d4: 00620018 mult r3,r2 X-Zoom * -sin(θ) 001a54d8: 00001012 mflo r2 001a54dc: 00021303 sra r2,r2,0x0c >> 0xc 001a54e0: 3c01801c lui r1,0x801c 001a54e4: a422c0a2 sh r2,-0x3f5e(r1) Store X-Zoom* -sin(θ) at Matrix element r_12 001a54e8: 08069545 j 0x001a5514 okay do the rotation matrix now :) 001a54ec: 00000000 nop If null Z table pointer: 001a54f0: 3c01801c lui r1,0x801c 001a54f4: a422c0a2 sh r2,-0x3f5e(r1) store sin(θ) at Matrix element r_21 001a54f8: 00041023 subu r2,r0,r4 001a54fc: 3c01801c lui r1,0x801c 001a5500: a430c0a4 sh r16,-0x3f5c(r1) Store cos(θ) at Matrix element r_22 001a5504: 3c01801c lui r1,0x801c 001a5508: a430c09c sh r16,-0x3f64(r1) Store cos(θ) at Matrix element r_11 001a550c: 3c01801c lui r1,0x801c 001a5510: a422c09e sh r2,-0x3f62(r1) store -sin(θ) at Matrix element r_12 -- a standard rotation matrix. 001a5514: 3c10801c lui r16,0x801c 001a5518: 2610c09c addiu r16,r16,0xc09c 001a551c: 0c00742a jal 0x0001d0a8 Store Rotation matrix elements to GTE 001a5520: 02002021 addu r4,r16,r0 Rotational matrix pointer 001a5524: 0c00744e jal 0x0001d138 Store_Translation_Vectors_to_GTE 001a5528: 02002021 addu r4,r16,r0 the same thing. but vector translation is some amount after the matrix pointer. 001a552c: 92a20003 lbu r2,0x0003(r21) Load ? from SHP data (some VRAM flag check?) 001a5530: 00000000 nop 001a5534: 18400076 blez r2,0x001a5710 branch if <= 0 (if no flags?) 001a5538: 00008821 addu r17,r0,r0 counter = 0 001a553c: 3416002c ori r22,r0,0x002c r22 = 0x2c 001a5540: 3c1200ff lui r18,0x00ff 001a5544: 3652ffff ori r18,r18,0xffff r18 = 0x00ffffff 001a5548: 3c13ff00 lui r19,0xff00 r19 = 0xff000000 001a554c: 00111080 sll r2,r17,0x02 counter * 4 001a5550: 00551021 addu r2,r2,r21 counter * 4 001a5554: 8c500008 lw r16,0x0008(r2) load current frame's data address 001a5558: 00000000 nop 001a555c: 8e020008 lw r2,0x0008(r16) top left XX and YY 001a5560: 3c01801c lui r1,0x801c 001a5564: ac22bf40 sw r2,-0x40c0(r1) stores top left XX and YY to 0x801bbf40 001a5568: 8e02000c lw r2,0x000c(r16) load top right XX YY 001a556c: 3c01801c lui r1,0x801c 001a5570: ac22bf48 sw r2,-0x40b8(r1) store top right XX YY to 0x801bbf48 001a5574: 8e020010 lw r2,0x0010(r16) Bottom left XX YY 001a5578: 3c08801c lui r8,0x801c 001a557c: 2508bf40 addiu r8,r8,0xbf40 r8 = 0x801bbf40 001a5580: 3c01801c lui r1,0x801c 001a5584: ac22bf50 sw r2,-0x40b0(r1) store bottom left XX YY 0x801bbf50 001a5588: 01006021 addu r12,r8,r0 r12 = 0x801bbf40 001a558c: 3c08801c lui r8,0x801c 001a5590: 2508bf48 addiu r8,r8,0xbf48 r8 = 0x801bbf48 001a5594: 01006821 addu r13,r8,r0 r13 = 0x801bbf48 001a5598: 3c08801c lui r8,0x801c 001a559c: 2508bf50 addiu r8,r8,0xbf50 001a55a0: 01007021 addu r14,r8,r0 r14 = 0x801bbf50 001a55a4: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) 001a55a8: c9810004 lwc2 gtedr01_vz0,0x0004(r12) [x0,y0,z0] = top left corner of graphic 001a55ac: c9a20000 lwc2 gtedr02_vxy1,0x0000(r13) 001a55b0: c9a30004 lwc2 gtedr03_vz1,0x0004(r13) [x1,y1,z1] = top right corner of graphic 001a55b4: c9c40000 lwc2 gtedr04_vxy2,0x0000(r14) 001a55b8: c9c50004 lwc2 gtedr05_vz2,0x0004(r14) [x2,y2,z2] = bottom left corner of graphic (All when displayed on screen) 001a55bc: 00000000 nop 001a55c0: 00000000 nop 001a55c4: 4a280030 rtpt perspective transformation? maps the coordinates of the sprite sheet to the field? 001a55c8: 8e020014 lw r2,0x0014(r16) load bottom left XX YY 001a55cc: 3c01801c lui r1,0x801c 001a55d0: ac22bf58 sw r2,-0x40a8(r1) store bottom right XX and YY on screen at 0x801bbf58 001a55d4: 0c0694cf jal 0x001a533c 001a533c - 001a5390 returns primative pointer for actual effect sprite 001a55d8: 00002021 addu r4,r0,r0 r4 = 0 001a55dc: 00402021 addu r4,r2,r0 r4 = return pointer 001a55e0: 8ea30000 lw r3,0x0000(r21) load RBG from r21 pointer 001a55e4: 34020009 ori r2,r0,0x0009 001a55e8: a0820003 sb r2,0x0003(r4) store polyt4 is 9 words of data long 001a55ec: ac830004 sw r3,0x0004(r4) store effect RBG 001a55f0: a0960007 sb r22,0x0007(r4) store primative type as 0x2c (polyt4) 001a55f4: 96020000 lhu r2,0x0000(r16) load VRAM ID as calculated (some flags mixed in, not perfect Clut value anyway.) 001a55f8: 00000000 nop 001a55fc: 30420200 andi r2,r2,0x0200 check semi transparency flag 001a5600: 10400002 beq r2,r0,0x001a560c branch if not semi transparent 001a5604: 3402002e ori r2,r0,0x002e r2 = 0x2e 001a5608: a0820007 sb r2,0x0007(r4) store primative as 0x2e (polyt4 semi transparent) 001a560c: 24820008 addiu r2,r4,0x0008 001a5610: 00406021 addu r12,r2,r0 r12 = pointer + 0x8 001a5614: 24820010 addiu r2,r4,0x0010 001a5618: 00406821 addu r13,r2,r0 r13 = pointer + 0x10 001a561c: 24820018 addiu r2,r4,0x0018 001a5620: 00407021 addu r14,r2,r0 r14 = pointer + 0x18 001a5624: e98c0000 swc2 gtedr12_sxy0,0x0000(r12) store [x0, y0] to this pointer 001a5628: e9ad0000 swc2 gtedr13_sxy1,0x0000(r13) [x1, y1] 001a562c: e9ce0000 swc2 gtedr14_sxy2,0x0000(r14) [x2, y2] 001a5630: 3c08801c lui r8,0x801c 001a5634: 2508bf58 addiu r8,r8,0xbf58 0x801bbf58 001a5638: 01006021 addu r12,r8,r0 001a563c: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) load bottom right XX and YY 001a5640: c9810004 lwc2 gtedr01_vz0,0x0004(r12) also z but that's not important. I think just sets to 0 for math's sake. 001a5644: 00000000 nop 001a5648: 00000000 nop 001a564c: 4a180001 rtps maps the bottom right screen coordinate to the field 001a5650: 96020002 lhu r2,0x0002(r16) load VRAM Tpage ID 001a5654: 00000000 nop 001a5658: a4820016 sh r2,0x0016(r4) store in polygon's Tpage ID 001a565c: 96020000 lhu r2,0x0000(r16) VRAM palette + some 001a5660: 00000000 nop 001a5664: 3043000f andi r3,r2,0x000f obtain only values less than 0x10 001a5668: 30420010 andi r2,r2,0x0010 checks for flag 10? (second set of palettes?) 001a566c: 14400002 bne r2,r0,0x001a5678 branch if no 0x10 flag (VRAM palette ID? maybe? is 0x40 less?) 001a5670: 24627b40 addiu r2,r3,0x7b40 0xf + 0x7b40 001a5674: 24627b00 addiu r2,r3,0x7b00 0xf + 0x7b00 001a5678: a482000e sh r2,0x000e(r4) store Clut ID (+0x40 skips to the second set of palettes dedicated to the effect.) 001a567c: 92020004 lbu r2,0x0004(r16) Load graphic X location 001a5680: 00000000 nop 001a5684: a082001c sb r2,0x001c(r4) store top left corner X 001a5688: a082000c sb r2,0x000c(r4) store bottom left corner X 001a568c: 92030006 lbu r3,0x0006(r16) Load graphic width 001a5690: 00000000 nop 001a5694: 00431021 addu r2,r2,r3 add graphic X and width 001a5698: a0820024 sb r2,0x0024(r4) store bottom right corner X 001a569c: a0820014 sb r2,0x0014(r4) store top right graphic corner X 001a56a0: 92020005 lbu r2,0x0005(r16) load graphic Y 001a56a4: 00000000 nop 001a56a8: a0820015 sb r2,0x0015(r4) store top left corner Y 001a56ac: a082000d sb r2,0x000d(r4) stop top right corner Y 001a56b0: 92030007 lbu r3,0x0007(r16) Load graphic Height 001a56b4: 00000000 nop 001a56b8: 00431021 addu r2,r2,r3 graphic Y + Graphic height 001a56bc: a0820025 sb r2,0x0025(r4) store bottomr right corner Y 001a56c0: a082001d sb r2,0x001d(r4) store bottom left corner Y 001a56c4: 24820020 addiu r2,r4,0x0020 graphic temp SHP data pointer + 0x20 001a56c8: 00406021 addu r12,r2,r0 001a56cc: e98e0000 swc2 gtedr14_sxy2,0x0000(r12) Store bottom right corner in field here 001a56d0: 8c830000 lw r3,0x0000(r4) load next primative address 001a56d4: 8e820000 lw r2,0x0000(r20) load primative address to replace 001a56d8: 00731824 and r3,r3,r19 001a56dc: 00521024 and r2,r2,r18 001a56e0: 00621825 or r3,r3,r2 001a56e4: ac830000 sw r3,0x0000(r4) store redirect primative to current primative data 001a56e8: 8e820000 lw r2,0x0000(r20) 001a56ec: 00921824 and r3,r4,r18 001a56f0: 00531024 and r2,r2,r19 001a56f4: 00431025 or r2,r2,r3 001a56f8: ae820000 sw r2,0x0000(r20) store current primative to redirect GPU to, like, load this. 001a56fc: 92a20003 lbu r2,0x0003(r21) load byte from here 001a5700: 26310001 addiu r17,r17,0x0001 001a5704: 0222102a slt r2,r17,r2 set if byte is 0 001a5708: 1440ff91 bne r2,r0,0x001a5550 branch if it is 0 001a570c: 00111080 sll r2,r17,0x02 r2 = byte * 4 return if 0x03 flag = 0 001a5710: 0c0694cf jal 0x001a533c 001a533c - 001a5390 Update pointer? 001a5714: 34040001 ori r4,r0,0x0001 r4 = 1 001a5718: 00409021 addu r18,r2,r0 r18 = result 001a571c: 02402021 addu r4,r18,r0 *p = result 001a5720: 34050001 ori r5,r0,0x0001 dfe = 1 001a5724: 00003021 addu r6,r0,r0 dtd = 0 001a5728: 34070001 ori r7,r0,0x0001 tpage = 1 001a572c: 0c009533 jal 0x000254cc P41 SetDrawMode(DR_MODE *p, int dfe, int dtd, int tpage, RECT *tw) 001a5730: afa00010 sw r0,0x0010(r29) *tw = <null> 001a5734: 3c0400ff lui r4,0x00ff 001a5738: 3484ffff ori r4,r4,0xffff 001a573c: 3c05ff00 lui r5,0xff00 001a5740: 8e430000 lw r3,0x0000(r18) 001a5744: 8e820000 lw r2,0x0000(r20) 001a5748: 00651824 and r3,r3,r5 001a574c: 00441024 and r2,r2,r4 001a5750: 00621825 or r3,r3,r2 perform the same combining as above. 001a5754: ae430000 sw r3,0x0000(r18) 001a5758: 8e820000 lw r2,0x0000(r20) 001a575c: 02442024 and r4,r18,r4 001a5760: 00451024 and r2,r2,r5 001a5764: 00441025 or r2,r2,r4 " 001a5768: ae820000 sw r2,0x0000(r20) 001a576c: 8fbf003c lw r31,0x003c(r29) 001a5770: 8fb60038 lw r22,0x0038(r29) 001a5774: 8fb50034 lw r21,0x0034(r29) 001a5778: 8fb40030 lw r20,0x0030(r29) 001a577c: 8fb3002c lw r19,0x002c(r29) 001a5780: 8fb20028 lw r18,0x0028(r29) 001a5784: 8fb10024 lw r17,0x0024(r29) 001a5788: 8fb00020 lw r16,0x0020(r29) 001a578c: 27bd0040 addiu r29,r29,0x0040 001a5790: 03e00008 jr r31 001a5794: 00000000 nop