Construct Polygon Data For Effects

From Final Fantasy Hacktics Wiki
(Redirected from 001a5394 - 001a5794)
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