Difference between revisions of "Construct Polygon Data For Effects"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
(when you find the gpu moment. just handles camera matrices for effects, and copies data from here to there to be processed by the gpu)
m
 
(One intermediate revision by the same user not shown)
Line 18: Line 18:
 
  001a53d0: afb20028 sw r18,0x0028(r29)
 
  001a53d0: afb20028 sw r18,0x0028(r29)
 
  001a53d4: 00409021 addu r18,r2,r0 r18 = primative pointer
 
  001a53d4: 00409021 addu r18,r2,r0 r18 = primative pointer
  001a53d8: 02402021 addu r4,r18,r0 r4 = primative
+
  001a53d8: 02402021 addu r4,r18,r0 *p = primative address
  001a53dc: 34050001 ori r5,r0,0x0001 r5 = 1
+
  001a53dc: 34050001 ori r5,r0,0x0001 dfe = 1
  001a53e0: 34060001 ori r6,r0,0x0001 r6 = 1
+
  001a53e0: 34060001 ori r6,r0,0x0001 dtd = 1
  001a53e4: 34070001 ori r7,r0,0x0001 r7 = 1
+
  001a53e4: 34070001 ori r7,r0,0x0001 tpage = 1
  001a53e8: 0c009533 jal 0x000254cc [[000254cc - 00025520]] - prepares some primative before loading the effect graphic data, drawmode 401 no instruction?
+
  001a53e8: 0c009533 jal 0x000254cc [[P41 SetDrawMode]](DRAW_MODE *p, int dfe, int dtd, int tpage, RECT *tw)
  001a53ec: afa00010 sw r0,0x0010(r29) r0 = 0
+
  001a53ec: afa00010 sw r0,0x0010(r29) *tw = <null>
 
  001a53f0: 3c0400ff lui r4,0x00ff
 
  001a53f0: 3c0400ff lui r4,0x00ff
 
  001a53f4: 3484ffff ori r4,r4,0xffff
 
  001a53f4: 3484ffff ori r4,r4,0xffff
Line 231: Line 231:
 
  001a5714: 34040001 ori r4,r0,0x0001 r4 = 1  
 
  001a5714: 34040001 ori r4,r0,0x0001 r4 = 1  
 
  001a5718: 00409021 addu r18,r2,r0 r18 = result
 
  001a5718: 00409021 addu r18,r2,r0 r18 = result
  001a571c: 02402021 addu r4,r18,r0 r4 = result
+
  001a571c: 02402021 addu r4,r18,r0 *p = result
  001a5720: 34050001 ori r5,r0,0x0001 r5 = 1
+
  001a5720: 34050001 ori r5,r0,0x0001 dfe = 1
  001a5724: 00003021 addu r6,r0,r0 r6 = 0
+
  001a5724: 00003021 addu r6,r0,r0 dtd = 0
  001a5728: 34070001 ori r7,r0,0x0001 r7 = 1
+
  001a5728: 34070001 ori r7,r0,0x0001 tpage = 1
  001a572c: 0c009533 jal 0x000254cc [[? 0x254cc]] sets next primative to some erroneous value? gpu just lists it as... drawmode 601, but unknown extra data.
+
  001a572c: 0c009533 jal 0x000254cc [[P41 SetDrawMode]](DR_MODE *p, int dfe, int dtd, int tpage, RECT *tw)
  001a5730: afa00010 sw r0,0x0010(r29) stack 0x10 = 0
+
  001a5730: afa00010 sw r0,0x0010(r29) *tw = <null>
 
  001a5734: 3c0400ff lui r4,0x00ff
 
  001a5734: 3c0400ff lui r4,0x00ff
 
  001a5738: 3484ffff ori r4,r4,0xffff
 
  001a5738: 3484ffff ori r4,r4,0xffff

Latest revision as of 23:56, 8 July 2023

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