Difference between revisions of "Arrow, Throw stone, Reflect Model Loading"
Jump to navigation
Jump to search
(Created page with " 001ae340: 27bdfef0 addiu r29,r29,0xfef0 stack - 0x110 001ae344: afb400f8 sw r20,0x00f8(r29) 001ae348: 00a0a021 addu r20,r5,r0 001ae34c: afb60100 sw r22,0x0100(r29) 001ae...") |
m |
||
(6 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | Inputs: | ||
+ | *r4 = p1 | ||
+ | - pre-effect rotation matrix | ||
+ | *r5 = p2 | ||
+ | - pre-effect translation matrix | ||
+ | *r6 = p3 | ||
+ | - post-effect rotation matrix | ||
+ | *r7 = p4 | ||
+ | - scalar vector matrix (scales model size) | ||
+ | |||
+ | the preliminary calculation is done as follows: | ||
+ | {Rotation matrix(r4) x Vector matrix(Effect) + Translation matrix(r5)} x {1/4096 * [Rotation matrix(r6) x Vector Matrix(r7)]} x Rotation matrix(camera) + Translation matrix(camera) | ||
+ | {R4 x VE + T5} x {1/4096 * [R6 x V7]} x RC + TC | ||
+ | Produces a table of x y z vectors per model point. | ||
+ | Then assigns an RGB palette to every point and constructs the polygons for the model. | ||
+ | |||
001ae340: 27bdfef0 addiu r29,r29,0xfef0 stack - 0x110 | 001ae340: 27bdfef0 addiu r29,r29,0xfef0 stack - 0x110 | ||
001ae344: afb400f8 sw r20,0x00f8(r29) | 001ae344: afb400f8 sw r20,0x00f8(r29) | ||
− | 001ae348: 00a0a021 addu r20,r5,r0 | + | 001ae348: 00a0a021 addu r20,r5,r0 #stack pointer |
001ae34c: afb60100 sw r22,0x0100(r29) | 001ae34c: afb60100 sw r22,0x0100(r29) | ||
− | 001ae350: 00c0b021 addu r22,r6,r0 | + | 001ae350: 00c0b021 addu r22,r6,r0 #stack pointer |
001ae354: afb70104 sw r23,0x0104(r29) | 001ae354: afb70104 sw r23,0x0104(r29) | ||
− | 001ae358: 00e0b821 addu r23,r7,r0 | + | 001ae358: 00e0b821 addu r23,r7,r0 #stack pointer |
001ae35c: afb000e8 sw r16,0x00e8(r29) | 001ae35c: afb000e8 sw r16,0x00e8(r29) | ||
001ae360: 27b00088 addiu r16,r29,0x0088 | 001ae360: 27b00088 addiu r16,r29,0x0088 | ||
001ae364: afbe0108 sw r30,0x0108(r29) | 001ae364: afbe0108 sw r30,0x0108(r29) | ||
− | 001ae368: 8fbe0120 lw r30,0x0120(r29) load parsed argument (Particle byte BB) | + | 001ae368: 8fbe0120 lw r30,0x0120(r29) #load parsed argument (Particle byte BB) |
− | 001ae36c: 02002821 addu r5,r16,r0 | + | 001ae36c: 02002821 addu r5,r16,r0 #stack + 0x88 |
001ae370: afbf010c sw r31,0x010c(r29) | 001ae370: afbf010c sw r31,0x010c(r29) | ||
001ae374: afb500fc sw r21,0x00fc(r29) | 001ae374: afb500fc sw r21,0x00fc(r29) | ||
001ae378: afb300f4 sw r19,0x00f4(r29) | 001ae378: afb300f4 sw r19,0x00f4(r29) | ||
001ae37c: afb200f0 sw r18,0x00f0(r29) | 001ae37c: afb200f0 sw r18,0x00f0(r29) | ||
− | 001ae380: 0c007596 jal 0x0001d658 | + | 001ae380: 0c007596 jal 0x0001d658 #[[Set Rotation matrix elements]] - r4 is input for angles. stores rotation matrix R in stack + 0x88 |
001ae384: afb100ec sw r17,0x00ec(r29) | 001ae384: afb100ec sw r17,0x00ec(r29) | ||
− | 001ae388: 02002021 addu r4,r16,r0 | + | 001ae388: 02002021 addu r4,r16,r0 #stack + 0x88 |
001ae38c: afa000a4 sw r0,0x00a4(r29) | 001ae38c: afa000a4 sw r0,0x00a4(r29) | ||
001ae390: afa000a0 sw r0,0x00a0(r29) | 001ae390: afa000a0 sw r0,0x00a0(r29) | ||
− | 001ae394: 0c00742a jal 0x0001d0a8 | + | 001ae394: 0c00742a jal 0x0001d0a8 #[[Store Rotation matrix elements to GTE]] |
− | 001ae398: afa0009c sw r0,0x009c(r29) | + | 001ae398: afa0009c sw r0,0x009c(r29) #sets no translation vectors (ok.) |
− | 001ae39c: 0c00744e jal 0x0001d138 | + | 001ae39c: 0c00744e jal 0x0001d138 #[[Store Translation Vectors to GTE]] |
001ae3a0: 02002021 addu r4,r16,r0 | 001ae3a0: 02002021 addu r4,r16,r0 | ||
001ae3a4: 00008821 addu r17,r0,r0 | 001ae3a4: 00008821 addu r17,r0,r0 | ||
− | 001ae3a8: 33c200ff andi r2,r30,0x00ff move | + | 001ae3a8: 33c200ff andi r2,r30,0x00ff move Model ID to r2 |
− | 001ae3ac: 00021080 sll r2,r2,0x02 | + | 001ae3ac: 00021080 sll r2,r2,0x02 ID * 4 |
001ae3b0: 3c01801c lui r1,0x801c | 001ae3b0: 3c01801c lui r1,0x801c | ||
001ae3b4: 00220821 addu r1,r1,r2 | 001ae3b4: 00220821 addu r1,r1,r2 | ||
− | 001ae3b8: 8c358534 lw r21,-0x7acc(r1) 0x801b8534 + | + | 001ae3b8: 8c358534 lw r21,-0x7acc(r1) 0x801b8534 + ID * 4 (pointers to model data, 0x801b69dc - arrow, 0x801b6d00 - stone, 0x801b6f00 - reflect) |
001ae3bc: 3c121f80 lui r18,0x1f80 | 001ae3bc: 3c121f80 lui r18,0x1f80 | ||
− | 001ae3c0: 8ea2000c lw r2,0x000c(r21) pointer to | + | 001ae3c0: 8ea2000c lw r2,0x000c(r21) pointer to table of points |
− | 001ae3c4: 8eb30010 lw r19,0x0010(r21) | + | 001ae3c4: 8eb30010 lw r19,0x0010(r21) No. points |
001ae3c8: 2442000c addiu r2,r2,0x000c | 001ae3c8: 2442000c addiu r2,r2,0x000c | ||
− | 001ae3cc: 1a600017 blez r19,0x001ae42c | + | 001ae3cc: 1a600017 blez r19,0x001ae42c branch if 0 points |
− | 001ae3d0: 02a21021 addu r2,r21,r2 move | + | 001ae3d0: 02a21021 addu r2,r21,r2 move model pointer up by point pointer |
001ae3d4: 3c031f80 lui r3,0x1f80 | 001ae3d4: 3c031f80 lui r3,0x1f80 | ||
− | 001ae3d8: 00402021 addu r4,r2,r0 r4 = | + | 001ae3d8: 00402021 addu r4,r2,r0 r4 = model point pointer |
− | 001ae3dc: 00806021 addu r12,r4,r0 r12 = | + | 001ae3dc: 00806021 addu r12,r4,r0 r12 = model point pointer |
− | 001ae3e0: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) | + | 001ae3e0: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) xy vector |
− | 001ae3e4: c9810004 lwc2 gtedr01_vz0,0x0004(r12) | + | 001ae3e4: c9810004 lwc2 gtedr01_vz0,0x0004(r12) z0 vector |
001ae3e8: 00000000 nop | 001ae3e8: 00000000 nop | ||
001ae3ec: 00000000 nop | 001ae3ec: 00000000 nop | ||
− | 001ae3f0: 4a480012 mvmva | + | 001ae3f0: 4a480012 mvmva multiply loaded vectors by GTE |
− | 001ae3f4: 00606021 addu r12,r3,r0 | + | 001ae3f4: 00606021 addu r12,r3,r0 vector storage 0x1f800000 |
001ae3f8: e9990000 swc2 gtedr25_mac1,0x0000(r12) X, | 001ae3f8: e9990000 swc2 gtedr25_mac1,0x0000(r12) X, | ||
001ae3fc: e99a0004 swc2 gtedr26_mac2,0x0004(r12) Y, | 001ae3fc: e99a0004 swc2 gtedr26_mac2,0x0004(r12) Y, | ||
− | 001ae400: e99b0008 swc2 gtedr27_mac3,0x0008(r12) Z, | + | 001ae400: e99b0008 swc2 gtedr27_mac3,0x0008(r12) Z, vectors store into RAM |
001ae404: 2462000c addiu r2,r3,0x000c | 001ae404: 2462000c addiu r2,r3,0x000c | ||
− | 001ae408: 00406021 addu r12,r2,r0 | + | 001ae408: 00406021 addu r12,r2,r0 0x1f800000 + 0xc |
− | 001ae40c: 484df800 cfc2 r13,gtecr31_flag | + | 001ae40c: 484df800 cfc2 r13,gtecr31_flag "copy from coprocessor" undoubtedly someone will need that. moves gtecr31_flag into r31. |
001ae410: 00000000 nop | 001ae410: 00000000 nop | ||
− | 001ae414: ad8d0000 sw r13,0x0000(r12) | + | 001ae414: ad8d0000 sw r13,0x0000(r12) stores GTE CR flag to 0xc. |
− | 001ae418: 24630010 addiu r3,r3,0x0010 | + | 001ae418: 24630010 addiu r3,r3,0x0010 0x1f800000 + 0x10 * loop |
001ae41c: 26310001 addiu r17,r17,0x0001 | 001ae41c: 26310001 addiu r17,r17,0x0001 | ||
001ae420: 0233102a slt r2,r17,r19 | 001ae420: 0233102a slt r2,r17,r19 | ||
− | 001ae424: 1440ffed bne r2,r0,0x001ae3dc loop as many times as there are | + | 001ae424: 1440ffed bne r2,r0,0x001ae3dc loop as many times as there are vectors |
− | 001ae428: 24840008 addiu r4,r4,0x0008 | + | 001ae428: 24840008 addiu r4,r4,0x0008 vector pointer + 0x8 * loop |
− | 001ae42c: 02c02021 addu r4,r22,r0 | + | 001ae42c: 02c02021 addu r4,r22,r0 |
− | 001ae430: 27b00088 addiu r16,r29,0x0088 | + | 001ae430: 27b00088 addiu r16,r29,0x0088 |
− | 001ae434: 0c007596 jal 0x0001d658 | + | 001ae434: 0c007596 jal 0x0001d658 [[Set Rotation matrix elements]] |
− | 001ae438: 02002821 addu r5,r16,r0 | + | 001ae438: 02002821 addu r5,r16,r0 stack + 0x88 - destination for matrix, input r6 for angles |
− | 001ae43c: 02002021 addu r4,r16,r0 | + | 001ae43c: 02002021 addu r4,r16,r0 parse matrix stack address |
− | 001ae440: 0c007278 jal 0x0001c9e0 | + | 001ae440: 0c007278 jal 0x0001c9e0 [[Multiply Rotation Matrix r4 by Input Vector r5]] - obtain new rotation matrix, with input r5 as the maximum per cell instead of 4096. |
− | 001ae444: 02e02821 addu r5,r23,r0 | + | 001ae444: 02e02821 addu r5,r23,r0 |
− | 001ae448: 8e820000 lw r2,0x0000(r20) | + | 001ae448: 8e820000 lw r2,0x0000(r20) load translation x (inputs from mother routine.) |
001ae44c: 00000000 nop | 001ae44c: 00000000 nop | ||
− | 001ae450: afa2009c sw r2,0x009c(r29) | + | 001ae450: afa2009c sw r2,0x009c(r29) store translation x |
− | 001ae454: 8e820004 lw r2,0x0004(r20) | + | 001ae454: 8e820004 lw r2,0x0004(r20) load translation y |
− | 001ae458: 02002021 addu r4,r16,r0 | + | 001ae458: 02002021 addu r4,r16,r0 stack + 0x88 (rotation + translation matrix from input) |
− | 001ae45c: afa200a0 sw r2,0x00a0(r29) | + | 001ae45c: afa200a0 sw r2,0x00a0(r29) store translation y |
− | 001ae460: 8e820008 lw r2,0x0008(r20) | + | 001ae460: 8e820008 lw r2,0x0008(r20) load translation z |
001ae464: 00008821 addu r17,r0,r0 | 001ae464: 00008821 addu r17,r0,r0 | ||
− | 001ae468: 0c00742a jal 0x0001d0a8 | + | 001ae468: 0c00742a jal 0x0001d0a8 [[Store Rotation matrix elements to GTE]] |
− | 001ae46c: afa200a4 sw r2,0x00a4(r29) | + | 001ae46c: afa200a4 sw r2,0x00a4(r29) store translation z |
− | 001ae470: 0c00744e jal 0x0001d138 | + | 001ae470: 0c00744e jal 0x0001d138 [[Store Translation Vectors to GTE]] |
001ae474: 02002021 addu r4,r16,r0 | 001ae474: 02002021 addu r4,r16,r0 | ||
− | 001ae478: 1a60001e blez r19,0x001ae4f4 | + | 001ae478: 1a60001e blez r19,0x001ae4f4 branch if no polygons |
− | 001ae47c: 27a400a8 addiu r4,r29,0x00a8 | + | 001ae47c: 27a400a8 addiu r4,r29,0x00a8 stack + 0xa8 |
− | 001ae480: 02401821 addu r3,r18,r0 | + | 001ae480: 02401821 addu r3,r18,r0 was lui r3 0x1f80 too hard? |
− | 001ae484: 94620000 lhu r2,0x0000(r3) | + | 001ae484: 94620000 lhu r2,0x0000(r3) load polygon x vector |
001ae488: 00000000 nop | 001ae488: 00000000 nop | ||
− | 001ae48c: a7a200a8 sh r2,0x00a8(r29) | + | 001ae48c: a7a200a8 sh r2,0x00a8(r29) move to stack |
− | 001ae490: 94620004 lhu r2,0x0004(r3) | + | 001ae490: 94620004 lhu r2,0x0004(r3) load polygon y vector |
001ae494: 00000000 nop | 001ae494: 00000000 nop | ||
− | 001ae498: a7a200aa sh r2,0x00aa(r29) | + | 001ae498: a7a200aa sh r2,0x00aa(r29) move to stack |
− | 001ae49c: 94620008 lhu r2,0x0008(r3) | + | 001ae49c: 94620008 lhu r2,0x0008(r3) load polygon z vector |
001ae4a0: 00000000 nop | 001ae4a0: 00000000 nop | ||
− | 001ae4a4: a7a200ac sh r2,0x00ac(r29) | + | 001ae4a4: a7a200ac sh r2,0x00ac(r29) move to stack |
− | 001ae4a8: 00806021 addu r12,r4,r0 | + | 001ae4a8: 00806021 addu r12,r4,r0 r12 = pointer to stack |
− | 001ae4ac: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) | + | 001ae4ac: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) load vector xy from stack |
− | 001ae4b0: c9810004 lwc2 gtedr01_vz0,0x0004(r12) | + | 001ae4b0: c9810004 lwc2 gtedr01_vz0,0x0004(r12) load vector z0 from stack |
001ae4b4: 00000000 nop | 001ae4b4: 00000000 nop | ||
001ae4b8: 00000000 nop | 001ae4b8: 00000000 nop | ||
− | 001ae4bc: 4a480012 mvmva | + | 001ae4bc: 4a480012 mvmva multiply vectors by GTE |
001ae4c0: 00606021 addu r12,r3,r0 | 001ae4c0: 00606021 addu r12,r3,r0 | ||
001ae4c4: e9990000 swc2 gtedr25_mac1,0x0000(r12) | 001ae4c4: e9990000 swc2 gtedr25_mac1,0x0000(r12) | ||
001ae4c8: e99a0004 swc2 gtedr26_mac2,0x0004(r12) | 001ae4c8: e99a0004 swc2 gtedr26_mac2,0x0004(r12) | ||
− | 001ae4cc: e99b0008 swc2 gtedr27_mac3,0x0008(r12) | + | 001ae4cc: e99b0008 swc2 gtedr27_mac3,0x0008(r12) store vectors after multiplication |
001ae4d0: 2462000c addiu r2,r3,0x000c | 001ae4d0: 2462000c addiu r2,r3,0x000c | ||
001ae4d4: 00406021 addu r12,r2,r0 | 001ae4d4: 00406021 addu r12,r2,r0 | ||
− | 001ae4d8: 484df800 cfc2 r13,gtecr31_flag | + | 001ae4d8: 484df800 cfc2 r13,gtecr31_flag GTE CR flag? |
001ae4dc: 00000000 nop | 001ae4dc: 00000000 nop | ||
− | 001ae4e0: ad8d0000 sw r13,0x0000(r12) | + | 001ae4e0: ad8d0000 sw r13,0x0000(r12) store |
− | 001ae4e4: 26310001 addiu r17,r17,0x0001 | + | 001ae4e4: 26310001 addiu r17,r17,0x0001 |
001ae4e8: 0233102a slt r2,r17,r19 | 001ae4e8: 0233102a slt r2,r17,r19 | ||
− | 001ae4ec: 1440ffe5 bne r2,r0,0x001ae484 | + | 001ae4ec: 1440ffe5 bne r2,r0,0x001ae484 loop for all vectors |
− | 001ae4f0: 24630010 addiu r3,r3,0x0010 | + | 001ae4f0: 24630010 addiu r3,r3,0x0010 vector pointer + 0x10 |
001ae4f4: 3c10800a lui r16,0x800a | 001ae4f4: 3c10800a lui r16,0x800a | ||
001ae4f8: 26108a24 addiu r16,r16,0x8a24 | 001ae4f8: 26108a24 addiu r16,r16,0x8a24 | ||
− | 001ae4fc: 0c00742a jal 0x0001d0a8 | + | 001ae4fc: 0c00742a jal 0x0001d0a8 [[Store Rotation matrix elements to GTE]] - camera matrix |
− | 001ae500: 02002021 addu r4,r16,r0 | + | 001ae500: 02002021 addu r4,r16,r0 camera matrix |
− | 001ae504: 0c00744e jal 0x0001d138 | + | 001ae504: 0c00744e jal 0x0001d138 [[Store Translation Vectors to GTE]] - camera matrix |
001ae508: 02002021 addu r4,r16,r0 | 001ae508: 02002021 addu r4,r16,r0 | ||
− | 001ae50c: 1a60001f blez r19,0x001ae58c | + | 001ae50c: 1a60001f blez r19,0x001ae58c branch if no points |
− | 001ae510: 00008821 addu r17,r0,r0 | + | 001ae510: 00008821 addu r17,r0,r0 |
001ae514: 27a400a8 addiu r4,r29,0x00a8 | 001ae514: 27a400a8 addiu r4,r29,0x00a8 | ||
001ae518: 02401821 addu r3,r18,r0 | 001ae518: 02401821 addu r3,r18,r0 | ||
− | 001ae51c: 94620000 lhu r2,0x0000(r3) | + | 001ae51c: 94620000 lhu r2,0x0000(r3) load x vector |
001ae520: 00000000 nop | 001ae520: 00000000 nop | ||
− | 001ae524: a7a200a8 sh r2,0x00a8(r29) | + | 001ae524: a7a200a8 sh r2,0x00a8(r29) store in stack |
− | 001ae528: 94620004 lhu r2,0x0004(r3) | + | 001ae528: 94620004 lhu r2,0x0004(r3) load y vector |
001ae52c: 00000000 nop | 001ae52c: 00000000 nop | ||
− | 001ae530: a7a200aa sh r2,0x00aa(r29) | + | 001ae530: a7a200aa sh r2,0x00aa(r29) store in stack |
− | 001ae534: 94620008 lhu r2,0x0008(r3) | + | 001ae534: 94620008 lhu r2,0x0008(r3) load z vector |
001ae538: 00000000 nop | 001ae538: 00000000 nop | ||
− | 001ae53c: a7a200ac sh r2,0x00ac(r29) | + | 001ae53c: a7a200ac sh r2,0x00ac(r29) store in stack |
− | 001ae540: 00806021 addu r12,r4,r0 | + | 001ae540: 00806021 addu r12,r4,r0 vector matrix pointer |
001ae544: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) | 001ae544: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) | ||
001ae548: c9810004 lwc2 gtedr01_vz0,0x0004(r12) | 001ae548: c9810004 lwc2 gtedr01_vz0,0x0004(r12) | ||
Line 136: | Line 152: | ||
001ae55c: e9990000 swc2 gtedr25_mac1,0x0000(r12) | 001ae55c: e9990000 swc2 gtedr25_mac1,0x0000(r12) | ||
001ae560: e99a0004 swc2 gtedr26_mac2,0x0004(r12) | 001ae560: e99a0004 swc2 gtedr26_mac2,0x0004(r12) | ||
− | 001ae564: e99b0008 swc2 gtedr27_mac3,0x0008(r12) | + | 001ae564: e99b0008 swc2 gtedr27_mac3,0x0008(r12) load and store vectors precisely where they were loaded from. |
001ae568: 2462000c addiu r2,r3,0x000c | 001ae568: 2462000c addiu r2,r3,0x000c | ||
001ae56c: 00406021 addu r12,r2,r0 | 001ae56c: 00406021 addu r12,r2,r0 | ||
Line 144: | Line 160: | ||
001ae57c: 26310001 addiu r17,r17,0x0001 | 001ae57c: 26310001 addiu r17,r17,0x0001 | ||
001ae580: 0233102a slt r2,r17,r19 | 001ae580: 0233102a slt r2,r17,r19 | ||
− | 001ae584: 1440ffe5 bne r2,r0,0x001ae51c | + | 001ae584: 1440ffe5 bne r2,r0,0x001ae51c repeat for all polygons |
001ae588: 24630010 addiu r3,r3,0x0010 | 001ae588: 24630010 addiu r3,r3,0x0010 | ||
− | 001ae58c: 02a02021 addu r4,r21,r0 | + | 001ae58c: 02a02021 addu r4,r21,r0 parse BB associated data pointer |
− | 001ae590: 0c06a39f jal 0x001a8e7c | + | 001ae590: 0c06a39f jal 0x001a8e7c [[001a8e74 - 001a8f10]] don't mind the incorrect address, there's a jr r31 at the start. ignore it. moves data pointers to ram regarding effect data. returns No. polygons of model. |
− | 001ae594: 00002821 addu r5,r0,r0 | + | 001ae594: 00002821 addu r5,r0,r0 r5 = 0 (not important.) |
001ae598: 00008021 addu r16,r0,r0 | 001ae598: 00008021 addu r16,r0,r0 | ||
001ae59c: 0000a021 addu r20,r0,r0 | 001ae59c: 0000a021 addu r20,r0,r0 | ||
− | 001ae5a0: 0040a821 addu r21,r2,r0 | + | 001ae5a0: 0040a821 addu r21,r2,r0 No. Polygons in model |
− | 001ae5a4: 33c300ff andi r3,r30,0x00ff | + | 001ae5a4: 33c300ff andi r3,r30,0x00ff move model ID to r3 |
001ae5a8: 34020001 ori r2,r0,0x0001 | 001ae5a8: 34020001 ori r2,r0,0x0001 | ||
− | 001ae5ac: 10620127 beq r3,r2,0x001aea4c | + | 001ae5ac: 10620127 beq r3,r2,0x001aea4c branch if model is stone |
− | 001ae5b0: 00009821 addu r19,r0,r0 | + | 001ae5b0: 00009821 addu r19,r0,r0 r19 = 0 |
001ae5b4: 28620002 slti r2,r3,0x0002 | 001ae5b4: 28620002 slti r2,r3,0x0002 | ||
− | 001ae5b8: 10400005 beq r2,r0,0x001ae5d0 | + | 001ae5b8: 10400005 beq r2,r0,0x001ae5d0 branch if model is reflect |
001ae5bc: 00000000 nop | 001ae5bc: 00000000 nop | ||
− | 001ae5c0: 1060000a beq r3,r0,0x001ae5ec | + | 001ae5c0: 1060000a beq r3,r0,0x001ae5ec branch if model is arrow |
001ae5c4: 00000000 nop | 001ae5c4: 00000000 nop | ||
− | 001ae5c8: 0806bc35 j 0x001af0d4 | + | 001ae5c8: 0806bc35 j 0x001af0d4 if no model. |
001ae5cc: 00000000 nop | 001ae5cc: 00000000 nop | ||
001ae5d0: 34020002 ori r2,r0,0x0002 | 001ae5d0: 34020002 ori r2,r0,0x0002 | ||
− | 001ae5d4: 106201a4 beq r3,r2,0x001aec68 | + | 001ae5d4: 106201a4 beq r3,r2,0x001aec68 branch if reflect model |
001ae5d8: 34020003 ori r2,r0,0x0003 | 001ae5d8: 34020003 ori r2,r0,0x0003 | ||
− | 001ae5dc: 1062023a beq r3,r2,0x001aeec8 | + | 001ae5dc: 1062023a beq r3,r2,0x001aeec8 Branch if shuriken model |
001ae5e0: 00000000 nop | 001ae5e0: 00000000 nop | ||
− | 001ae5e4: 0806bc35 j 0x001af0d4 | + | 001ae5e4: 0806bc35 j 0x001af0d4 error |
001ae5e8: 00000000 nop | 001ae5e8: 00000000 nop | ||
+ | |||
+ | Model = arrow | ||
001ae5ec: 3c02801c lui r2,0x801c | 001ae5ec: 3c02801c lui r2,0x801c | ||
− | 001ae5f0: 8c42c098 lw r2,-0x3f68(r2) | + | 001ae5f0: 8c42c098 lw r2,-0x3f68(r2) loads effect target data |
001ae5f4: 00000000 nop | 001ae5f4: 00000000 nop | ||
− | 001ae5f8: 8c570050 lw r23,0x0050(r2) | + | 001ae5f8: 8c570050 lw r23,0x0050(r2) loads effect data RAM pointer |
− | 001ae5fc: 1aa002b5 blez r21,0x001af0d4 | + | 001ae5fc: 1aa002b5 blez r21,0x001af0d4 end if No. polygons <= 0 (error) |
− | 001ae600: 00008821 addu r17,r0,r0 | + | 001ae600: 00008821 addu r17,r0,r0 |
001ae604: 3c1000ff lui r16,0x00ff | 001ae604: 3c1000ff lui r16,0x00ff | ||
− | 001ae608: 3610ffff ori r16,r16,0xffff | + | 001ae608: 3610ffff ori r16,r16,0xffff 0x00ffffff |
− | 001ae60c: 3c16ff00 lui r22,0xff00 | + | 001ae60c: 3c16ff00 lui r22,0xff00 0xff000000 |
− | 001ae610: 0c06a3c5 jal 0x001a8f14 | + | 001ae610: 0c06a3c5 jal 0x001a8f14 [[001a8f14 - 001a90cc]] moves Polygon data to stack |
− | 001ae614: 27a40010 addiu r4,r29,0x0010 | + | 001ae614: 27a40010 addiu r4,r29,0x0010 stack + 0x10 |
001ae618: 93a30013 lbu r3,0x0013(r29) | 001ae618: 93a30013 lbu r3,0x0013(r29) | ||
001ae61c: 34020039 ori r2,r0,0x0039 | 001ae61c: 34020039 ori r2,r0,0x0039 | ||
− | 001ae620: 14620090 bne r3,r2,0x001ae864 | + | 001ae620: 14620090 bne r3,r2,0x001ae864 branch if polygon only has 3 points |
001ae624: 00000000 nop | 001ae624: 00000000 nop | ||
+ | |||
+ | Arrow quad Polygon | ||
001ae628: 3c03801c lui r3,0x801c | 001ae628: 3c03801c lui r3,0x801c | ||
− | 001ae62c: 8c63c090 lw r3,-0x3f70(r3) | + | 001ae62c: 8c63c090 lw r3,-0x3f70(r3) counter? |
− | 001ae630: 93a40014 lbu r4,0x0014(r29) | + | 001ae630: 93a40014 lbu r4,0x0014(r29) Palette byte |
001ae634: 000310c0 sll r2,r3,0x03 | 001ae634: 000310c0 sll r2,r3,0x03 | ||
001ae638: 00431023 subu r2,r2,r3 | 001ae638: 00431023 subu r2,r2,r3 | ||
Line 195: | Line 215: | ||
001ae648: 00431021 addu r2,r2,r3 | 001ae648: 00431021 addu r2,r2,r3 | ||
001ae64c: 00021080 sll r2,r2,0x02 | 001ae64c: 00021080 sll r2,r2,0x02 | ||
− | 001ae650: 244200e0 addiu r2,r2,0x00e0 | + | 001ae650: 244200e0 addiu r2,r2,0x00e0 counter? * 0x1d4 + 0xe0 |
− | 001ae654: 02e21021 addu r2,r23,r2 | + | 001ae654: 02e21021 addu r2,r23,r2 effect data pointer |
− | 001ae658: 001418c0 sll r3,r20,0x03 | + | 001ae658: 001418c0 sll r3,r20,0x03 r20 counter * 8 |
001ae65c: 00741821 addu r3,r3,r20 | 001ae65c: 00741821 addu r3,r3,r20 | ||
− | 001ae660: 00031880 sll r3,r3,0x02 | + | 001ae660: 00031880 sll r3,r3,0x02 r20 counter * 0x24 |
− | 001ae664: 00433021 addu r6,r2,r3 | + | 001ae664: 00433021 addu r6,r2,r3 Model data (table 0x1d4 and sub table 0x24; (decimal) 2 table entries, 13 sub table entries) |
− | 001ae668: a0c40004 sb r4,0x0004(r6) | + | 001ae668: a0c40004 sb r4,0x0004(r6) store palette byte in Model |
001ae66c: 93a20015 lbu r2,0x0015(r29) | 001ae66c: 93a20015 lbu r2,0x0015(r29) | ||
001ae670: 00000000 nop | 001ae670: 00000000 nop | ||
Line 214: | Line 234: | ||
001ae694: 00000000 nop | 001ae694: 00000000 nop | ||
001ae698: a0c2000d sb r2,0x000d(r6) | 001ae698: a0c2000d sb r2,0x000d(r6) | ||
− | 001ae69c: | + | 001ae69c: 93a2001a lbu r2,0x001a(r29) |
001ae6a0: 00000000 nop | 001ae6a0: 00000000 nop | ||
001ae6a4: a0c2000e sb r2,0x000e(r6) | 001ae6a4: a0c2000e sb r2,0x000e(r6) | ||
Line 234: | Line 254: | ||
001ae6e4: 93a20022 lbu r2,0x0022(r29) | 001ae6e4: 93a20022 lbu r2,0x0022(r29) | ||
001ae6e8: 00000000 nop | 001ae6e8: 00000000 nop | ||
− | 001ae6ec: a0c2001e sb r2,0x001e(r6) | + | 001ae6ec: a0c2001e sb r2,0x001e(r6) moves palette data 1 byte at a time. |
− | 001ae6f0: 97a20078 lhu r2,0x0078(r29) | + | 001ae6f0: 97a20078 lhu r2,0x0078(r29) first Point ID |
001ae6f4: 00000000 nop | 001ae6f4: 00000000 nop | ||
− | 001ae6f8: 00021100 sll r2,r2,0x04 | + | 001ae6f8: 00021100 sll r2,r2,0x04 |
− | 001ae6fc: 02421021 addu r2,r18,r2 | + | 001ae6fc: 02421021 addu r2,r18,r2 0x1f800000 + ptr*16 |
− | 001ae700: 94420000 lhu r2,0x0000(r2) | + | 001ae700: 94420000 lhu r2,0x0000(r2) load Point x |
001ae704: 00000000 nop | 001ae704: 00000000 nop | ||
− | 001ae708: a4c20008 sh r2,0x0008(r6) | + | 001ae708: a4c20008 sh r2,0x0008(r6) store vector X |
− | 001ae70c: 97a20078 lhu r2,0x0078(r29) | + | 001ae70c: 97a20078 lhu r2,0x0078(r29) First point ID |
001ae710: 00000000 nop | 001ae710: 00000000 nop | ||
001ae714: 00021100 sll r2,r2,0x04 | 001ae714: 00021100 sll r2,r2,0x04 | ||
001ae718: 02421021 addu r2,r18,r2 | 001ae718: 02421021 addu r2,r18,r2 | ||
− | 001ae71c: 94420004 lhu r2,0x0004(r2) | + | 001ae71c: 94420004 lhu r2,0x0004(r2) Point y |
001ae720: 00000000 nop | 001ae720: 00000000 nop | ||
− | 001ae724: a4c2000a sh r2,0x000a(r6) | + | 001ae724: a4c2000a sh r2,0x000a(r6) store more Point data |
− | 001ae728: 97a20078 lhu r2,0x0078(r29) | + | 001ae728: 97a20078 lhu r2,0x0078(r29) First point |
− | 001ae72c: 97a3007a lhu r3,0x007a(r29) | + | 001ae72c: 97a3007a lhu r3,0x007a(r29) Second point |
001ae730: 00021100 sll r2,r2,0x04 | 001ae730: 00021100 sll r2,r2,0x04 | ||
001ae734: 02421021 addu r2,r18,r2 | 001ae734: 02421021 addu r2,r18,r2 | ||
001ae738: 00031900 sll r3,r3,0x04 | 001ae738: 00031900 sll r3,r3,0x04 | ||
001ae73c: 02431821 addu r3,r18,r3 | 001ae73c: 02431821 addu r3,r18,r3 | ||
− | 001ae740: 8c450008 lw r5,0x0008(r2) | + | 001ae740: 8c450008 lw r5,0x0008(r2) first point Z0 |
− | 001ae744: 94620000 lhu r2,0x0000(r3) | + | 001ae744: 94620000 lhu r2,0x0000(r3) second point x |
001ae748: 00000000 nop | 001ae748: 00000000 nop | ||
001ae74c: a4c20010 sh r2,0x0010(r6) | 001ae74c: a4c20010 sh r2,0x0010(r6) | ||
− | 001ae750: 97a2007a lhu r2,0x007a(r29) | + | 001ae750: 97a2007a lhu r2,0x007a(r29) the other halfword from above (second to last word of table?) |
001ae754: 00000000 nop | 001ae754: 00000000 nop | ||
001ae758: 00021100 sll r2,r2,0x04 | 001ae758: 00021100 sll r2,r2,0x04 | ||
001ae75c: 02421021 addu r2,r18,r2 | 001ae75c: 02421021 addu r2,r18,r2 | ||
− | 001ae760: 94420004 lhu r2,0x0004(r2) | + | 001ae760: 94420004 lhu r2,0x0004(r2) 2nd point y |
001ae764: 00000000 nop | 001ae764: 00000000 nop | ||
− | 001ae768: a4c20012 sh r2,0x0012(r6) | + | 001ae768: a4c20012 sh r2,0x0012(r6) store |
− | 001ae76c: 97a3007a lhu r3,0x007a(r29) | + | 001ae76c: 97a3007a lhu r3,0x007a(r29) Second point ID |
− | 001ae770: 97a2007c lhu r2,0x007c(r29) | + | 001ae770: 97a2007c lhu r2,0x007c(r29) Third point ID |
001ae774: 00031900 sll r3,r3,0x04 | 001ae774: 00031900 sll r3,r3,0x04 | ||
001ae778: 02431821 addu r3,r18,r3 | 001ae778: 02431821 addu r3,r18,r3 | ||
001ae77c: 00021100 sll r2,r2,0x04 | 001ae77c: 00021100 sll r2,r2,0x04 | ||
001ae780: 02421021 addu r2,r18,r2 | 001ae780: 02421021 addu r2,r18,r2 | ||
− | 001ae784: 94420000 lhu r2,0x0000(r2) | + | 001ae784: 94420000 lhu r2,0x0000(r2) 3rd Point x |
− | 001ae788: 8c640008 lw r4,0x0008(r3) | + | 001ae788: 8c640008 lw r4,0x0008(r3) 2nd Point z0 |
− | 001ae78c: a4c20018 sh r2,0x0018(r6) | + | 001ae78c: a4c20018 sh r2,0x0018(r6) store |
− | 001ae790: 97a2007c lhu r2,0x007c(r29) | + | 001ae790: 97a2007c lhu r2,0x007c(r29) |
001ae794: 00000000 nop | 001ae794: 00000000 nop | ||
001ae798: 00021100 sll r2,r2,0x04 | 001ae798: 00021100 sll r2,r2,0x04 | ||
001ae79c: 02421021 addu r2,r18,r2 | 001ae79c: 02421021 addu r2,r18,r2 | ||
− | 001ae7a0: 94420004 lhu r2,0x0004(r2) | + | 001ae7a0: 94420004 lhu r2,0x0004(r2) 3rd point y |
001ae7a4: 00000000 nop | 001ae7a4: 00000000 nop | ||
001ae7a8: a4c2 001a sh r2,0x001a(r6) | 001ae7a8: a4c2 001a sh r2,0x001a(r6) | ||
001ae7ac: 97a3007c lhu r3,0x007c(r29) | 001ae7ac: 97a3007c lhu r3,0x007c(r29) | ||
− | 001ae7b0: 97a2007e lhu r2,0x007e(r29) | + | 001ae7b0: 97a2007e lhu r2,0x007e(r29) 4th point ID |
001ae7b4: 00031900 sll r3,r3,0x04 | 001ae7b4: 00031900 sll r3,r3,0x04 | ||
001ae7b8: 02431821 addu r3,r18,r3 | 001ae7b8: 02431821 addu r3,r18,r3 | ||
001ae7bc: 00021100 sll r2,r2,0x04 | 001ae7bc: 00021100 sll r2,r2,0x04 | ||
001ae7c0: 02421021 addu r2,r18,r2 | 001ae7c0: 02421021 addu r2,r18,r2 | ||
− | 001ae7c4: 94420000 lhu r2,0x0000(r2) | + | 001ae7c4: 94420000 lhu r2,0x0000(r2) 4th point x |
− | 001ae7c8: 8c630008 lw r3,0x0008(r3) | + | 001ae7c8: 8c630008 lw r3,0x0008(r3) 3rd point z0 |
001ae7cc: a4c20020 sh r2,0x0020(r6) | 001ae7cc: a4c20020 sh r2,0x0020(r6) | ||
001ae7d0: 97a2007e lhu r2,0x007e(r29) | 001ae7d0: 97a2007e lhu r2,0x007e(r29) | ||
Line 295: | Line 315: | ||
001ae7d8: 00021100 sll r2,r2,0x04 | 001ae7d8: 00021100 sll r2,r2,0x04 | ||
001ae7dc: 02421021 addu r2,r18,r2 | 001ae7dc: 02421021 addu r2,r18,r2 | ||
− | 001ae7e0: 94420004 lhu r2,0x0004(r2) | + | 001ae7e0: 94420004 lhu r2,0x0004(r2) 4th point y |
− | 001ae7e4: 26940001 addiu r20,r20,0x0001 | + | 001ae7e4: 26940001 addiu r20,r20,0x0001 sub table counter ++ |
001ae7e8: a4c20022 sh r2,0x0022(r6) | 001ae7e8: a4c20022 sh r2,0x0022(r6) | ||
− | 001ae7ec: 97a2007e lhu r2,0x007e(r29) | + | 001ae7ec: 97a2007e lhu r2,0x007e(r29) 4th point z0 |
− | 001ae7f0: 00a42821 addu r5,r5,r4 | + | 001ae7f0: 00a42821 addu r5,r5,r4 first z0 + second z0 |
001ae7f4: 00021100 sll r2,r2,0x04 | 001ae7f4: 00021100 sll r2,r2,0x04 | ||
001ae7f8: 02421021 addu r2,r18,r2 | 001ae7f8: 02421021 addu r2,r18,r2 | ||
− | 001ae7fc: 8c420008 lw r2,0x0008(r2) | + | 001ae7fc: 8c420008 lw r2,0x0008(r2) 4th point Z0 |
− | 001ae800: 00a32821 addu r5,r5,r3 | + | 001ae800: 00a32821 addu r5,r5,r3 1st Z0 + 2nd Z0 + 3rd Z0 |
− | 001ae804: 00a22821 addu r5,r5,r2 | + | 001ae804: 00a22821 addu r5,r5,r2 sum of all z0 vectors |
− | 001ae808: 04a10002 bgez r5,0x001ae814 | + | 001ae808: 04a10002 bgez r5,0x001ae814 branch if not negative |
− | 001ae80c: 00a01021 addu r2,r5,r0 | + | 001ae80c: 00a01021 addu r2,r5,r0 |
− | 001ae810: 24a2000f addiu r2,r5,0x000f | + | 001ae810: 24a2000f addiu r2,r5,0x000f |
− | 001ae814: 00022903 sra r5,r2,0x04 | + | 001ae814: 00022903 sra r5,r2,0x04 find average of z0 vectors / 4 |
001ae818: 24a2ffff addiu r2,r5,0xffff | 001ae818: 24a2ffff addiu r2,r5,0xffff | ||
− | 001ae81c: 2c42017e sltiu r2,r2,0x017e | + | 001ae81c: 2c42017e sltiu r2,r2,0x017e that seems, oddly specific? |
− | 001ae820: 1040000f beq r2,r0,0x001ae860 | + | 001ae820: 1040000f beq r2,r0,0x001ae860 branch if not the case |
− | 001ae824: 00052080 sll r4,r5,0x02 | + | 001ae824: 00052080 sll r4,r5,0x02 depth pointer |
001ae828: 3c02801c lui r2,0x801c | 001ae828: 3c02801c lui r2,0x801c | ||
− | 001ae82c: 8c42c0cc lw r2,-0x3f34(r2) | + | 001ae82c: 8c42c0cc lw r2,-0x3f34(r2) VRAM Model depth table |
− | 001ae830: 8cc30000 lw r3,0x0000(r6) | + | 001ae830: 8cc30000 lw r3,0x0000(r6) address to r6 pointer |
− | 001ae834: 00822021 addu r4,r4,r2 | + | 001ae834: 00822021 addu r4,r4,r2 depth data |
− | 001ae838: 8c820000 lw r2,0x0000(r4) | + | 001ae838: 8c820000 lw r2,0x0000(r4) pointer to polygon at that current depth? |
− | 001ae83c: 00761824 and r3,r3,r22 | + | 001ae83c: 00761824 and r3,r3,r22 0x00*(r6) AND address marker type? (0x80 implies SRAM?) |
− | 001ae840: 00501024 and r2,r2,r16 | + | 001ae840: 00501024 and r2,r2,r16 0x00*(r4) AND Address? |
− | 001ae844: 00621825 or r3,r3,r2 | + | 001ae844: 00621825 or r3,r3,r2 Bit combine |
− | 001ae848: acc30000 sw r3,0x0000(r6) | + | 001ae848: acc30000 sw r3,0x0000(r6) store previous model address in r6 as SRAM pointer |
001ae84c: 8c820000 lw r2,0x0000(r4) | 001ae84c: 8c820000 lw r2,0x0000(r4) | ||
− | 001ae850: 00d01824 and r3,r6,r16 | + | 001ae850: 00d01824 and r3,r6,r16 old 0x00*(r6) AND Address |
− | 001ae854: 00561024 and r2,r2,r22 | + | 001ae854: 00561024 and r2,r2,r22 0x00*(r4) AND Address marker type? |
− | 001ae858: 00431025 or r2,r2,r3 | + | 001ae858: 00431025 or r2,r2,r3 bit combine |
− | 001ae85c: ac820000 sw r2,0x0000(r4) | + | 001ae85c: ac820000 sw r2,0x0000(r4) Store new model address into depth table as VRAM pointer? |
− | 001ae860: 93a30013 lbu r3,0x0013(r29) | + | 001ae860: 93a30013 lbu r3,0x0013(r29) load 4th byte of 1st table word entry |
001ae864: 34020031 ori r2,r0,0x0031 | 001ae864: 34020031 ori r2,r0,0x0031 | ||
− | 001ae868: 14620073 bne r3,r2,0x001aea38 | + | |
− | 001ae86c: 26310001 addiu r17,r17,0x0001 | + | Arrow Tri polygon |
+ | 001ae868: 14620073 bne r3,r2,0x001aea38 branch if polygon has 4 points | ||
+ | 001ae86c: 26310001 addiu r17,r17,0x0001 r17 counter ++ | ||
001ae870: 3c02801c lui r2,0x801c | 001ae870: 3c02801c lui r2,0x801c | ||
− | 001ae874: 8c42c090 lw r2,-0x3f70(r2) | + | 001ae874: 8c42c090 lw r2,-0x3f70(r2) counter? |
− | 001ae878: 93a40014 lbu r4,0x0014(r29) | + | 001ae878: 93a40014 lbu r4,0x0014(r29) 1st byte of second word, again |
001ae87c: 000218c0 sll r3,r2,0x03 | 001ae87c: 000218c0 sll r3,r2,0x03 | ||
001ae880: 00621823 subu r3,r3,r2 | 001ae880: 00621823 subu r3,r3,r2 | ||
− | 001ae884: 00031900 sll r3,r3,0x04 | + | 001ae884: 00031900 sll r3,r3,0x04 counter? * 0x70 |
− | 001ae888: 02e31821 addu r3,r23,r3 | + | 001ae888: 02e31821 addu r3,r23,r3 effect data pointer? |
001ae88c: 001310c0 sll r2,r19,0x03 | 001ae88c: 001310c0 sll r2,r19,0x03 | ||
001ae890: 00531023 subu r2,r2,r19 | 001ae890: 00531023 subu r2,r2,r19 | ||
− | 001ae894: 00021080 sll r2,r2,0x02 | + | 001ae894: 00021080 sll r2,r2,0x02 r19 counter * 0x1c |
− | 001ae898: 00623021 addu r6,r3,r2 | + | 001ae898: 00623021 addu r6,r3,r2 r6 = 2 0x70 table entries with 4 0x1c sub-table entries per |
001ae89c: a0c40004 sb r4,0x0004(r6) | 001ae89c: a0c40004 sb r4,0x0004(r6) | ||
001ae8a0: 93a20015 lbu r2,0x0015(r29) | 001ae8a0: 93a20015 lbu r2,0x0015(r29) | ||
Line 355: | Line 377: | ||
001ae8c8: 00000000 nop | 001ae8c8: 00000000 nop | ||
001ae8cc: a0c2000d sb r2,0x000d(r6) | 001ae8cc: a0c2000d sb r2,0x000d(r6) | ||
− | 001ae8d0: | + | 001ae8d0: 93a2001a lbu r2,0x001a(r29) |
001ae8d4: 00000000 nop | 001ae8d4: 00000000 nop | ||
001ae8d8: a0c2000e sb r2,0x000e(r6) | 001ae8d8: a0c2000e sb r2,0x000e(r6) | ||
Line 366: | Line 388: | ||
001ae8f4: 93a2001e lbu r2,0x001e(r29) | 001ae8f4: 93a2001e lbu r2,0x001e(r29) | ||
001ae8f8: 00000000 nop | 001ae8f8: 00000000 nop | ||
− | 001ae8fc: a0c20016 sb r2,0x0016(r6) | + | 001ae8fc: a0c20016 sb r2,0x0016(r6) load and move bytes 1 at a time |
001ae900: 97a20078 lhu r2,0x0078(r29) | 001ae900: 97a20078 lhu r2,0x0078(r29) | ||
001ae904: 00000000 nop | 001ae904: 00000000 nop | ||
001ae908: 00021100 sll r2,r2,0x04 | 001ae908: 00021100 sll r2,r2,0x04 | ||
001ae90c: 02421021 addu r2,r18,r2 | 001ae90c: 02421021 addu r2,r18,r2 | ||
− | 001ae910: 94420000 lhu r2,0x0000(r2) | + | 001ae910: 94420000 lhu r2,0x0000(r2) 1st point X |
001ae914: 00000000 nop | 001ae914: 00000000 nop | ||
001ae918: a4c20008 sh r2,0x0008(r6) | 001ae918: a4c20008 sh r2,0x0008(r6) | ||
Line 378: | Line 400: | ||
001ae924: 00021100 sll r2,r2,0x04 | 001ae924: 00021100 sll r2,r2,0x04 | ||
001ae928: 02421021 addu r2,r18,r2 | 001ae928: 02421021 addu r2,r18,r2 | ||
− | 001ae92c: 94420004 lhu r2,0x0004(r2) | + | 001ae92c: 94420004 lhu r2,0x0004(r2) 1st point Y |
001ae930: 00000000 nop | 001ae930: 00000000 nop | ||
001ae934: a4c2000a sh r2,0x000a(r6) | 001ae934: a4c2000a sh r2,0x000a(r6) | ||
Line 387: | Line 409: | ||
001ae948: 00031900 sll r3,r3,0x04 | 001ae948: 00031900 sll r3,r3,0x04 | ||
001ae94c: 02431821 addu r3,r18,r3 | 001ae94c: 02431821 addu r3,r18,r3 | ||
− | 001ae950: 8c450008 lw r5,0x0008(r2) | + | 001ae950: 8c450008 lw r5,0x0008(r2) 1st point Z0 |
− | 001ae954: 94620000 lhu r2,0x0000(r3) | + | 001ae954: 94620000 lhu r2,0x0000(r3) 2nd point X |
001ae958: 00000000 nop | 001ae958: 00000000 nop | ||
001ae95c: a4c20010 sh r2,0x0010(r6) | 001ae95c: a4c20010 sh r2,0x0010(r6) | ||
Line 395: | Line 417: | ||
001ae968: 00021100 sll r2,r2,0x04 | 001ae968: 00021100 sll r2,r2,0x04 | ||
001ae96c: 02421021 addu r2,r18,r2 | 001ae96c: 02421021 addu r2,r18,r2 | ||
− | 001ae970: 94420004 lhu r2,0x0004(r2) | + | 001ae970: 94420004 lhu r2,0x0004(r2) 2nd point Y |
001ae974: 00000000 nop | 001ae974: 00000000 nop | ||
001ae978: a4c20012 sh r2,0x0012(r6) | 001ae978: a4c20012 sh r2,0x0012(r6) | ||
Line 404: | Line 426: | ||
001ae98c: 00021100 sll r2,r2,0x04 | 001ae98c: 00021100 sll r2,r2,0x04 | ||
001ae990: 02421021 addu r2,r18,r2 | 001ae990: 02421021 addu r2,r18,r2 | ||
− | 001ae994: 94420000 lhu r2,0x0000(r2) | + | 001ae994: 94420000 lhu r2,0x0000(r2) 3rd point X |
− | 001ae998: 8c640008 lw r4,0x0008(r3) | + | 001ae998: 8c640008 lw r4,0x0008(r3) 2nd point Z0 |
001ae99c: a4c20018 sh r2,0x0018(r6) | 001ae99c: a4c20018 sh r2,0x0018(r6) | ||
001ae9a0: 97a2007c lhu r2,0x007c(r29) | 001ae9a0: 97a2007c lhu r2,0x007c(r29) | ||
Line 411: | Line 433: | ||
001ae9a8: 00021100 sll r2,r2,0x04 | 001ae9a8: 00021100 sll r2,r2,0x04 | ||
001ae9ac: 02421021 addu r2,r18,r2 | 001ae9ac: 02421021 addu r2,r18,r2 | ||
− | 001ae9b0: 94420004 lhu r2,0x0004(r2) | + | 001ae9b0: 94420004 lhu r2,0x0004(r2) 3rd point Y |
001ae9b4: 3c032aaa lui r3,0x2aaa | 001ae9b4: 3c032aaa lui r3,0x2aaa | ||
− | 001ae9b8: | + | 001ae9b8: a4c2001a sh r2,0x001a(r6) |
001ae9bc: 97a2007c lhu r2,0x007c(r29) | 001ae9bc: 97a2007c lhu r2,0x007c(r29) | ||
− | 001ae9c0: 3463aaab ori r3,r3,0xaaab | + | 001ae9c0: 3463aaab ori r3,r3,0xaaab r3 = 1/6th |
001ae9c4: 00021100 sll r2,r2,0x04 | 001ae9c4: 00021100 sll r2,r2,0x04 | ||
001ae9c8: 02421021 addu r2,r18,r2 | 001ae9c8: 02421021 addu r2,r18,r2 | ||
− | 001ae9cc: 8c420008 lw r2,0x0008(r2) | + | 001ae9cc: 8c420008 lw r2,0x0008(r2) z0 vector? |
− | 001ae9d0: 00a42821 addu r5,r5,r4 | + | 001ae9d0: 00a42821 addu r5,r5,r4 |
− | 001ae9d4: 00a22821 addu r5,r5,r2 | + | 001ae9d4: 00a22821 addu r5,r5,r2 add all 3 z0? vectors? |
− | 001ae9d8: 00a30018 mult r5,r3 | + | 001ae9d8: 00a30018 mult r5,r3 find average of all z0 vectors / 2 |
001ae9dc: 00051fc3 sra r3,r5,0x1f | 001ae9dc: 00051fc3 sra r3,r5,0x1f | ||
001ae9e0: 00001010 mfhi r2 | 001ae9e0: 00001010 mfhi r2 | ||
− | 001ae9e4: 00021043 sra r2,r2,0x01 | + | 001ae9e4: 00021043 sra r2,r2,0x01 average of all z0 vectors / 4 |
− | 001ae9e8: 00432823 subu r5,r2,r3 | + | 001ae9e8: 00432823 subu r5,r2,r3 rounding for negatives |
001ae9ec: 24a2ffff addiu r2,r5,0xffff | 001ae9ec: 24a2ffff addiu r2,r5,0xffff | ||
− | 001ae9f0: 2c42017e sltiu r2,r2,0x017e | + | 001ae9f0: 2c42017e sltiu r2,r2,0x017e |
− | 001ae9f4: 10400010 beq r2,r0,0x001aea38 | + | 001ae9f4: 10400010 beq r2,r0,0x001aea38 branch if further than render distance (?) |
− | 001ae9f8: 26730001 addiu r19,r19,0x0001 | + | 001ae9f8: 26730001 addiu r19,r19,0x0001 r19 counter ++ |
− | 001ae9fc: 00052080 sll r4,r5,0x02 | + | 001ae9fc: 00052080 sll r4,r5,0x02 depth table index |
001aea00: 3c02801c lui r2,0x801c | 001aea00: 3c02801c lui r2,0x801c | ||
− | 001aea04: 8c42c0cc lw r2,-0x3f34(r2) | + | 001aea04: 8c42c0cc lw r2,-0x3f34(r2) Model Depth table pointer |
− | 001aea08: 8cc30000 lw r3,0x0000(r6) | + | 001aea08: 8cc30000 lw r3,0x0000(r6) |
− | 001aea0c: 00822021 addu r4,r4,r2 | + | 001aea0c: 00822021 addu r4,r4,r2 pointer to polygon pointer occupied by current z0 depth |
− | 001aea10: 8c820000 lw r2,0x0000(r4) | + | 001aea10: 8c820000 lw r2,0x0000(r4) pointer to polygon occupied by new polygon's depth |
− | 001aea14: 00761824 and r3,r3,r22 | + | 001aea14: 00761824 and r3,r3,r22 new polygon address type? |
− | 001aea18: 00501024 and r2,r2,r16 | + | 001aea18: 00501024 and r2,r2,r16 old polygon address? |
− | 001aea1c: 00621825 or r3,r3,r2 | + | 001aea1c: 00621825 or r3,r3,r2 |
− | 001aea20: acc30000 sw r3,0x0000(r6) | + | 001aea20: acc30000 sw r3,0x0000(r6) store old pointer into r6 as SRAM pointer? |
− | 001aea24: 8c820000 lw r2,0x0000(r4) | + | 001aea24: 8c820000 lw r2,0x0000(r4) pointer to polygon occupied by new polygon's depth |
− | 001aea28: 00d01824 and r3,r6,r16 | + | 001aea28: 00d01824 and r3,r6,r16 pointer to new model's polygon data |
− | 001aea2c: 00561024 and r2,r2,r22 | + | 001aea2c: 00561024 and r2,r2,r22 Address type of old polygon? |
− | 001aea30: 00431025 or r2,r2,r3 | + | 001aea30: 00431025 or r2,r2,r3 |
− | 001aea34: ac820000 sw r2,0x0000(r4) | + | 001aea34: ac820000 sw r2,0x0000(r4) store new polygon's data pointer as VRAM pointer? |
001aea38: 0235102a slt r2,r17,r21 | 001aea38: 0235102a slt r2,r17,r21 | ||
− | 001aea3c: | + | 001aea3c: 104001a5 beq r2,r0,0x001af0d4 |
001aea40: 00000000 nop | 001aea40: 00000000 nop | ||
− | 001aea44: 0806b984 j 0x001ae610 | + | 001aea44: 0806b984 j 0x001ae610 do for all polygons in model |
001aea48: 00000000 nop | 001aea48: 00000000 nop | ||
+ | |||
+ | Model = stone | ||
001aea4c: 3c02801c lui r2,0x801c | 001aea4c: 3c02801c lui r2,0x801c | ||
− | 001aea50: 8c42c098 lw r2,-0x3f68(r2) | + | 001aea50: 8c42c098 lw r2,-0x3f68(r2) load effect target data |
001aea54: 00000000 nop | 001aea54: 00000000 nop | ||
− | 001aea58: 8c560050 lw r22,0x0050(r2) | + | 001aea58: 8c560050 lw r22,0x0050(r2) effect LBA ram pointer |
− | 001aea5c: 1aa0019d blez r21,0x001af0d4 | + | 001aea5c: 1aa0019d blez r21,0x001af0d4 branch if no table sections here. |
001aea60: 00008821 addu r17,r0,r0 | 001aea60: 00008821 addu r17,r0,r0 | ||
001aea64: 3c1300ff lui r19,0x00ff | 001aea64: 3c1300ff lui r19,0x00ff | ||
001aea68: 3673ffff ori r19,r19,0xffff | 001aea68: 3673ffff ori r19,r19,0xffff | ||
− | 001aea6c: 3c14ff00 lui r20,0xff00 | + | 001aea6c: 3c14ff00 lui r20,0xff00 0xff00000000 and 0x00ffffffff |
001aea70: 00008021 addu r16,r0,r0 | 001aea70: 00008021 addu r16,r0,r0 | ||
− | 001aea74: 0c06a3c5 jal 0x001a8f14 | + | 001aea74: 0c06a3c5 jal 0x001a8f14 [[001a8f14 - 001a90cc]] - moves some data into the stack from secondary effect data table |
001aea78: 27a40010 addiu r4,r29,0x0010 | 001aea78: 27a40010 addiu r4,r29,0x0010 | ||
− | 001aea7c: 93a30013 lbu r3,0x0013(r29) | + | 001aea7c: 93a30013 lbu r3,0x0013(r29) 4th byte first word |
001aea80: 34020031 ori r2,r0,0x0031 | 001aea80: 34020031 ori r2,r0,0x0031 | ||
− | 001aea84: 14620073 bne r3,r2,0x001aec54 | + | 001aea84: 14620073 bne r3,r2,0x001aec54 branch if not 0x31 |
001aea88: 26310001 addiu r17,r17,0x0001 | 001aea88: 26310001 addiu r17,r17,0x0001 | ||
001aea8c: 3c03801c lui r3,0x801c | 001aea8c: 3c03801c lui r3,0x801c | ||
− | 001aea90: 8c63c090 lw r3,-0x3f70(r3) | + | 001aea90: 8c63c090 lw r3,-0x3f70(r3) counter? |
001aea94: 00000000 nop | 001aea94: 00000000 nop | ||
001aea98: 00031080 sll r2,r3,0x02 | 001aea98: 00031080 sll r2,r3,0x02 | ||
Line 473: | Line 497: | ||
001aeaa0: 00021080 sll r2,r2,0x02 | 001aeaa0: 00021080 sll r2,r2,0x02 | ||
001aeaa4: 00431021 addu r2,r2,r3 | 001aeaa4: 00431021 addu r2,r2,r3 | ||
− | 001aeaa8: 00021100 sll r2,r2,0x04 | + | 001aeaa8: 00021100 sll r2,r2,0x04 |
− | 001aeaac: 02c21021 addu r2,r22,r2 | + | 001aeaac: 02c21021 addu r2,r22,r2 counter * 0x150 (?) + effect data pointer |
001aeab0: 93a30014 lbu r3,0x0014(r29) | 001aeab0: 93a30014 lbu r3,0x0014(r29) | ||
− | 001aeab4: 00503021 addu r6,r2,r16 | + | 001aeab4: 00503021 addu r6,r2,r16 effect data + r16 pointer (0x1c; 0xc sub table entries) |
001aeab8: a0c30004 sb r3,0x0004(r6) | 001aeab8: a0c30004 sb r3,0x0004(r6) | ||
001aeabc: 93a20015 lbu r2,0x0015(r29) | 001aeabc: 93a20015 lbu r2,0x0015(r29) | ||
Line 490: | Line 514: | ||
001aeae4: 00000000 nop | 001aeae4: 00000000 nop | ||
001aeae8: a0c2000d sb r2,0x000d(r6) | 001aeae8: a0c2000d sb r2,0x000d(r6) | ||
− | 001aeaec: | + | 001aeaec: 93a2001a lbu r2,0x001a(r29) |
001aeaf0: 00000000 nop | 001aeaf0: 00000000 nop | ||
001aeaf4: a0c2000e sb r2,0x000e(r6) | 001aeaf4: a0c2000e sb r2,0x000e(r6) | ||
Line 501: | Line 525: | ||
001aeb10: 93a2001e lbu r2,0x001e(r29) | 001aeb10: 93a2001e lbu r2,0x001e(r29) | ||
001aeb14: 00000000 nop | 001aeb14: 00000000 nop | ||
− | 001aeb18: a0c20016 sb r2,0x0016(r6) | + | 001aeb18: a0c20016 sb r2,0x0016(r6) move data here to there 1 byte at a time |
001aeb1c: 97a20078 lhu r2,0x0078(r29) | 001aeb1c: 97a20078 lhu r2,0x0078(r29) | ||
001aeb20: 00000000 nop | 001aeb20: 00000000 nop | ||
001aeb24: 00021100 sll r2,r2,0x04 | 001aeb24: 00021100 sll r2,r2,0x04 | ||
001aeb28: 02421021 addu r2,r18,r2 | 001aeb28: 02421021 addu r2,r18,r2 | ||
− | 001aeb2c: 94420000 lhu r2,0x0000(r2) | + | 001aeb2c: 94420000 lhu r2,0x0000(r2) x vector? |
001aeb30: 00000000 nop | 001aeb30: 00000000 nop | ||
001aeb34: a4c20008 sh r2,0x0008(r6) | 001aeb34: a4c20008 sh r2,0x0008(r6) | ||
Line 513: | Line 537: | ||
001aeb40: 00021100 sll r2,r2,0x04 | 001aeb40: 00021100 sll r2,r2,0x04 | ||
001aeb44: 02421021 addu r2,r18,r2 | 001aeb44: 02421021 addu r2,r18,r2 | ||
− | 001aeb48: 94420004 lhu r2,0x0004(r2) | + | 001aeb48: 94420004 lhu r2,0x0004(r2) y vector? |
001aeb4c: 00000000 nop | 001aeb4c: 00000000 nop | ||
001aeb50: a4c2000a sh r2,0x000a(r6) | 001aeb50: a4c2000a sh r2,0x000a(r6) | ||
Line 522: | Line 546: | ||
001aeb64: 00031900 sll r3,r3,0x04 | 001aeb64: 00031900 sll r3,r3,0x04 | ||
001aeb68: 02431821 addu r3,r18,r3 | 001aeb68: 02431821 addu r3,r18,r3 | ||
− | 001aeb6c: 8c450008 lw r5,0x0008(r2) | + | 001aeb6c: 8c450008 lw r5,0x0008(r2) Z0 vector? |
− | 001aeb70: 94620000 lhu r2,0x0000(r3) | + | 001aeb70: 94620000 lhu r2,0x0000(r3) x vector? |
001aeb74: 00000000 nop | 001aeb74: 00000000 nop | ||
001aeb78: a4c20010 sh r2,0x0010(r6) | 001aeb78: a4c20010 sh r2,0x0010(r6) | ||
Line 530: | Line 554: | ||
001aeb84: 00021100 sll r2,r2,0x04 | 001aeb84: 00021100 sll r2,r2,0x04 | ||
001aeb88: 02421021 addu r2,r18,r2 | 001aeb88: 02421021 addu r2,r18,r2 | ||
− | 001aeb8c: 94420004 lhu r2,0x0004(r2) | + | 001aeb8c: 94420004 lhu r2,0x0004(r2) y vector? |
001aeb90: 00000000 nop | 001aeb90: 00000000 nop | ||
001aeb94: a4c20012 sh r2,0x0012(r6) | 001aeb94: a4c20012 sh r2,0x0012(r6) | ||
Line 539: | Line 563: | ||
001aeba8: 00021100 sll r2,r2,0x04 | 001aeba8: 00021100 sll r2,r2,0x04 | ||
001aebac: 02421021 addu r2,r18,r2 | 001aebac: 02421021 addu r2,r18,r2 | ||
− | 001aebb0: 94420000 lhu r2,0x0000(r2) | + | 001aebb0: 94420000 lhu r2,0x0000(r2) x vector? |
− | 001aebb4: 8c640008 lw r4,0x0008(r3) | + | 001aebb4: 8c640008 lw r4,0x0008(r3) Z0 vector? |
001aebb8: a4c20018 sh r2,0x0018(r6) | 001aebb8: a4c20018 sh r2,0x0018(r6) | ||
001aebbc: 97a2007c lhu r2,0x007c(r29) | 001aebbc: 97a2007c lhu r2,0x007c(r29) | ||
Line 546: | Line 570: | ||
001aebc4: 00021100 sll r2,r2,0x04 | 001aebc4: 00021100 sll r2,r2,0x04 | ||
001aebc8: 02421021 addu r2,r18,r2 | 001aebc8: 02421021 addu r2,r18,r2 | ||
− | 001aebcc: 94420004 lhu r2,0x0004(r2) | + | 001aebcc: 94420004 lhu r2,0x0004(r2) y vector? |
001aebd0: 3c032aaa lui r3,0x2aaa | 001aebd0: 3c032aaa lui r3,0x2aaa | ||
− | 001aebd4: | + | 001aebd4: a4c2001a sh r2,0x001a(r6) |
001aebd8: 97a2007c lhu r2,0x007c(r29) | 001aebd8: 97a2007c lhu r2,0x007c(r29) | ||
− | 001aebdc: 3463aaab ori r3,r3,0xaaab | + | 001aebdc: 3463aaab ori r3,r3,0xaaab r3 = 1/6 |
001aebe0: 00021100 sll r2,r2,0x04 | 001aebe0: 00021100 sll r2,r2,0x04 | ||
001aebe4: 02421021 addu r2,r18,r2 | 001aebe4: 02421021 addu r2,r18,r2 | ||
− | 001aebe8: 8c420008 lw r2,0x0008(r2) | + | 001aebe8: 8c420008 lw r2,0x0008(r2) Z0 vector |
001aebec: 00a42821 addu r5,r5,r4 | 001aebec: 00a42821 addu r5,r5,r4 | ||
− | 001aebf0: 00a22821 addu r5,r5,r2 | + | 001aebf0: 00a22821 addu r5,r5,r2 sum all z0 vectors |
001aebf4: 00a30018 mult r5,r3 | 001aebf4: 00a30018 mult r5,r3 | ||
001aebf8: 00051fc3 sra r3,r5,0x1f | 001aebf8: 00051fc3 sra r3,r5,0x1f | ||
001aebfc: 00001010 mfhi r2 | 001aebfc: 00001010 mfhi r2 | ||
001aec00: 00021043 sra r2,r2,0x01 | 001aec00: 00021043 sra r2,r2,0x01 | ||
− | 001aec04: 00432823 subu r5,r2,r3 | + | 001aec04: 00432823 subu r5,r2,r3 round Sum of Z0 vectors / 0xc |
001aec08: 24a2ffff addiu r2,r5,0xffff | 001aec08: 24a2ffff addiu r2,r5,0xffff | ||
001aec0c: 2c42017e sltiu r2,r2,0x017e | 001aec0c: 2c42017e sltiu r2,r2,0x017e | ||
001aec10: 10400010 beq r2,r0,0x001aec54 | 001aec10: 10400010 beq r2,r0,0x001aec54 | ||
− | 001aec14: 2610001c addiu r16,r16,0x001c | + | 001aec14: 2610001c addiu r16,r16,0x001c r16 effect counter + 0x1c |
001aec18: 00052080 sll r4,r5,0x02 | 001aec18: 00052080 sll r4,r5,0x02 | ||
001aec1c: 3c02801c lui r2,0x801c | 001aec1c: 3c02801c lui r2,0x801c | ||
− | 001aec20: 8c42c0cc lw r2,-0x3f34(r2) | + | 001aec20: 8c42c0cc lw r2,-0x3f34(r2) Just read the same shit for triangle polygons on arrows, it's easier to find and completely identical. |
− | 001aec24: 8cc30000 lw r3,0x0000(r6) | + | 001aec24: 8cc30000 lw r3,0x0000(r6) |
− | 001aec28: 00822021 addu r4,r4,r2 | + | 001aec28: 00822021 addu r4,r4,r2 |
− | 001aec2c: 8c820000 lw r2,0x0000(r4) | + | 001aec2c: 8c820000 lw r2,0x0000(r4) |
− | 001aec30: 00741824 and r3,r3,r20 | + | 001aec30: 00741824 and r3,r3,r20 |
001aec34: 00531024 and r2,r2,r19 | 001aec34: 00531024 and r2,r2,r19 | ||
001aec38: 00621825 or r3,r3,r2 | 001aec38: 00621825 or r3,r3,r2 | ||
− | 001aec3c: acc30000 sw r3,0x0000(r6) | + | 001aec3c: acc30000 sw r3,0x0000(r6) |
001aec40: 8c820000 lw r2,0x0000(r4) | 001aec40: 8c820000 lw r2,0x0000(r4) | ||
001aec44: 00d31824 and r3,r6,r19 | 001aec44: 00d31824 and r3,r6,r19 | ||
− | 001aec48: 00541024 and r2,r2,r20 | + | 001aec48: 00541024 and r2,r2,r20 |
001aec4c: 00431025 or r2,r2,r3 | 001aec4c: 00431025 or r2,r2,r3 | ||
− | 001aec50: ac820000 sw r2,0x0000(r4) | + | 001aec50: ac820000 sw r2,0x0000(r4) |
001aec54: 0235102a slt r2,r17,r21 | 001aec54: 0235102a slt r2,r17,r21 | ||
001aec58: 1040011e beq r2,r0,0x001af0d4 | 001aec58: 1040011e beq r2,r0,0x001af0d4 | ||
001aec5c: 00000000 nop | 001aec5c: 00000000 nop | ||
− | 001aec60: 0806ba9d j 0x001aea74 | + | 001aec60: 0806ba9d j 0x001aea74 loop for all polygons |
001aec64: 00000000 nop | 001aec64: 00000000 nop | ||
+ | |||
+ | Model = reflect | ||
001aec68: 3c04801c lui r4,0x801c | 001aec68: 3c04801c lui r4,0x801c | ||
− | 001aec6c: 8c84c098 lw r4,-0x3f68(r4) | + | 001aec6c: 8c84c098 lw r4,-0x3f68(r4) loads effect target data |
001aec70: 00000000 nop | 001aec70: 00000000 nop | ||
− | 001aec74: 8483000c lh r3,0x000c(r4) | + | 001aec74: 8483000c lh r3,0x000c(r4) interesting. but unsure |
− | 001aec78: 8c960050 lw r22,0x0050(r4) | + | 001aec78: 8c960050 lw r22,0x0050(r4) load LBA ram effect data pointer |
− | 001aec7c: 00031040 sll r2,r3,0x01 | + | 001aec7c: 00031040 sll r2,r3,0x01 0xc * 2 |
− | 001aec80: 0043a021 addu r20,r2,r3 | + | 001aec80: 0043a021 addu r20,r2,r3 0xc* * 3 |
− | 001aec84: 02b4102a slt r2,r21,r20 | + | 001aec84: 02b4102a slt r2,r21,r20 set if 0x20*(BB) < 0xc* * 3 |
− | 001aec88: 10400002 beq r2,r0,0x001aec94 | + | 001aec88: 10400002 beq r2,r0,0x001aec94 branch if 0xc* * 3 is greater |
001aec8c: 00008821 addu r17,r0,r0 | 001aec8c: 00008821 addu r17,r0,r0 | ||
− | 001aec90: 02a0a021 addu r20,r21,r0 | + | 001aec90: 02a0a021 addu r20,r21,r0 r20 = min(0x20*(BB), 0xc* * 3) |
− | 001aec94: 1a80010f blez r20,0x001af0d4 | + | 001aec94: 1a80010f blez r20,0x001af0d4 branch if less than 0 |
001aec98: 3c1300ff lui r19,0x00ff | 001aec98: 3c1300ff lui r19,0x00ff | ||
001aec9c: 3673ffff ori r19,r19,0xffff | 001aec9c: 3673ffff ori r19,r19,0xffff | ||
001aeca0: 3c15ff00 lui r21,0xff00 | 001aeca0: 3c15ff00 lui r21,0xff00 | ||
− | 001aeca4: 0c06a3c5 jal 0x001a8f14 | + | 001aeca4: 0c06a3c5 jal 0x001a8f14 [[001a8f14 - 001a90cc]] |
001aeca8: 27a40010 addiu r4,r29,0x0010 | 001aeca8: 27a40010 addiu r4,r29,0x0010 | ||
001aecac: 93a30013 lbu r3,0x0013(r29) | 001aecac: 93a30013 lbu r3,0x0013(r29) | ||
001aecb0: 34020037 ori r2,r0,0x0037 | 001aecb0: 34020037 ori r2,r0,0x0037 | ||
− | 001aecb4: 1462007f bne r3,r2,0x001aeeb4 | + | 001aecb4: 1462007f bne r3,r2,0x001aeeb4 branch if 4th byte 1st word isn't 0x37 |
− | 001aecb8: 26310001 addiu r17,r17,0x0001 | + | 001aecb8: 26310001 addiu r17,r17,0x0001 r17 counter ++ |
001aecbc: 3c02801c lui r2,0x801c | 001aecbc: 3c02801c lui r2,0x801c | ||
− | 001aecc0: 8c42c090 lw r2,-0x3f70(r2) | + | 001aecc0: 8c42c090 lw r2,-0x3f70(r2) counter? |
001aecc4: 00000000 nop | 001aecc4: 00000000 nop | ||
001aecc8: 00021900 sll r3,r2,0x04 | 001aecc8: 00021900 sll r3,r2,0x04 | ||
001aeccc: 00621823 subu r3,r3,r2 | 001aeccc: 00621823 subu r3,r3,r2 | ||
001aecd0: 00031980 sll r3,r3,0x06 | 001aecd0: 00031980 sll r3,r3,0x06 | ||
− | 001aecd4: 24630018 addiu r3,r3,0x0018 | + | 001aecd4: 24630018 addiu r3,r3,0x0018 counter * 0x3c0 + 0x18 |
− | 001aecd8: 02c31821 addu r3,r22,r3 | + | 001aecd8: 02c31821 addu r3,r22,r3 effect data table, 0x3c0 bytes long per entry |
001aecdc: 00101080 sll r2,r16,0x02 | 001aecdc: 00101080 sll r2,r16,0x02 | ||
001aece0: 00501021 addu r2,r2,r16 | 001aece0: 00501021 addu r2,r2,r16 | ||
− | 001aece4: 000210c0 sll r2,r2,0x03 | + | 001aece4: 000210c0 sll r2,r2,0x03 sub table, 0x28 bytes pr entry |
− | 001aece8: 00623021 addu r6,r3,r2 | + | 001aece8: 00623021 addu r6,r3,r2 effect data table, 0x3c0 long table entries + 0x28 long table sub-entries (0x18 subtables per.) |
001aecec: 3c03801c lui r3,0x801c | 001aecec: 3c03801c lui r3,0x801c | ||
− | 001aecf0: 8c63c098 lw r3,-0x3f68(r3) | + | 001aecf0: 8c63c098 lw r3,-0x3f68(r3) effect target data |
001aecf4: 3402003f ori r2,r0,0x003f | 001aecf4: 3402003f ori r2,r0,0x003f | ||
− | 001aecf8: | + | 001aecf8: a4c2001a sh r2,0x001a(r6) store 0x3f in 0x1a*(r6) |
− | 001aecfc: 90620002 lbu r2,0x0002(r3) | + | 001aecfc: 90620002 lbu r2,0x0002(r3) load current effect target ID |
001aed00: 00000000 nop | 001aed00: 00000000 nop | ||
− | 001aed04: 24427eff addiu r2,r2,0x7eff | + | 001aed04: 24427eff addiu r2,r2,0x7eff current effect target ID + 0x7eff? |
− | 001aed08: a4c2000e sh r2,0x000e(r6) | + | 001aed08: a4c2000e sh r2,0x000e(r6) each unit has a slightly different palette for reflect? |
001aed0c: 93a20014 lbu r2,0x0014(r29) | 001aed0c: 93a20014 lbu r2,0x0014(r29) | ||
001aed10: 00000000 nop | 001aed10: 00000000 nop | ||
Line 659: | Line 685: | ||
001aed88: 00000000 nop | 001aed88: 00000000 nop | ||
001aed8c: a4c20018 sh r2,0x0018(r6) | 001aed8c: a4c20018 sh r2,0x0018(r6) | ||
− | 001aed90: 97a2002c lhu r2,0x002c(r29) | + | 001aed90: 97a2002c lhu r2,0x002c(r29) move palette data into r6 |
001aed94: 00000000 nop | 001aed94: 00000000 nop | ||
001aed98: a4c20024 sh r2,0x0024(r6) | 001aed98: a4c20024 sh r2,0x0024(r6) | ||
− | 001aed9c: 97a20078 lhu r2,0x0078(r29) | + | 001aed9c: 97a20078 lhu r2,0x0078(r29) Load first point |
001aeda0: 00000000 nop | 001aeda0: 00000000 nop | ||
001aeda4: 00021100 sll r2,r2,0x04 | 001aeda4: 00021100 sll r2,r2,0x04 | ||
001aeda8: 02421021 addu r2,r18,r2 | 001aeda8: 02421021 addu r2,r18,r2 | ||
− | 001aedac: 94420000 lhu r2,0x0000(r2) | + | 001aedac: 94420000 lhu r2,0x0000(r2) 1st point X |
001aedb0: 00000000 nop | 001aedb0: 00000000 nop | ||
001aedb4: a4c20008 sh r2,0x0008(r6) | 001aedb4: a4c20008 sh r2,0x0008(r6) | ||
− | 001aedb8: 97a20078 lhu r2,0x0078(r29) | + | 001aedb8: 97a20078 lhu r2,0x0078(r29) 1st point |
001aedbc: 00000000 nop | 001aedbc: 00000000 nop | ||
001aedc0: 00021100 sll r2,r2,0x04 | 001aedc0: 00021100 sll r2,r2,0x04 | ||
001aedc4: 02421021 addu r2,r18,r2 | 001aedc4: 02421021 addu r2,r18,r2 | ||
− | 001aedc8: 94420004 lhu r2,0x0004(r2) | + | 001aedc8: 94420004 lhu r2,0x0004(r2) 1st point Y |
001aedcc: 00000000 nop | 001aedcc: 00000000 nop | ||
001aedd0: a4c2000a sh r2,0x000a(r6) | 001aedd0: a4c2000a sh r2,0x000a(r6) | ||
− | 001aedd4: 97a2007a lhu r2,0x007a(r29) | + | 001aedd4: 97a2007a lhu r2,0x007a(r29) 2nd point |
001aedd8: 00000000 nop | 001aedd8: 00000000 nop | ||
001aeddc: 00021100 sll r2,r2,0x04 | 001aeddc: 00021100 sll r2,r2,0x04 | ||
001aede0: 02421021 addu r2,r18,r2 | 001aede0: 02421021 addu r2,r18,r2 | ||
− | 001aede4: 94420000 lhu r2,0x0000(r2) | + | 001aede4: 94420000 lhu r2,0x0000(r2) 2nd point X |
001aede8: 00000000 nop | 001aede8: 00000000 nop | ||
001aedec: a4c20014 sh r2,0x0014(r6) | 001aedec: a4c20014 sh r2,0x0014(r6) | ||
− | 001aedf0: 97a2007a lhu r2,0x007a(r29) | + | 001aedf0: 97a2007a lhu r2,0x007a(r29) 2nd point |
001aedf4: 00000000 nop | 001aedf4: 00000000 nop | ||
001aedf8: 00021100 sll r2,r2,0x04 | 001aedf8: 00021100 sll r2,r2,0x04 | ||
001aedfc: 02421021 addu r2,r18,r2 | 001aedfc: 02421021 addu r2,r18,r2 | ||
− | 001aee00: 94420004 lhu r2,0x0004(r2) | + | 001aee00: 94420004 lhu r2,0x0004(r2) 2nd point Y |
001aee04: 00000000 nop | 001aee04: 00000000 nop | ||
001aee08: a4c20016 sh r2,0x0016(r6) | 001aee08: a4c20016 sh r2,0x0016(r6) | ||
− | 001aee0c: 97a2007c lhu r2,0x007c(r29) | + | 001aee0c: 97a2007c lhu r2,0x007c(r29) 3rd point |
001aee10: 00000000 nop | 001aee10: 00000000 nop | ||
001aee14: 00021100 sll r2,r2,0x04 | 001aee14: 00021100 sll r2,r2,0x04 | ||
001aee18: 02421021 addu r2,r18,r2 | 001aee18: 02421021 addu r2,r18,r2 | ||
− | 001aee1c: 94420000 lhu r2,0x0000(r2) | + | 001aee1c: 94420000 lhu r2,0x0000(r2) 3rd point X |
001aee20: 00000000 nop | 001aee20: 00000000 nop | ||
001aee24: a4c20020 sh r2,0x0020(r6) | 001aee24: a4c20020 sh r2,0x0020(r6) | ||
Line 701: | Line 727: | ||
001aee30: 00021100 sll r2,r2,0x04 | 001aee30: 00021100 sll r2,r2,0x04 | ||
001aee34: 02421021 addu r2,r18,r2 | 001aee34: 02421021 addu r2,r18,r2 | ||
− | 001aee38: 94420004 lhu r2,0x0004(r2) | + | 001aee38: 94420004 lhu r2,0x0004(r2) 3rd point Y |
001aee3c: 00000000 nop | 001aee3c: 00000000 nop | ||
001aee40: a4c20022 sh r2,0x0022(r6) | 001aee40: a4c20022 sh r2,0x0022(r6) | ||
− | 001aee44: 97a2007c lhu r2,0x007c(r29) | + | 001aee44: 97a2007c lhu r2,0x007c(r29) 3rd point |
001aee48: 3c032aaa lui r3,0x2aaa | 001aee48: 3c032aaa lui r3,0x2aaa | ||
001aee4c: 00021100 sll r2,r2,0x04 | 001aee4c: 00021100 sll r2,r2,0x04 | ||
001aee50: 02421021 addu r2,r18,r2 | 001aee50: 02421021 addu r2,r18,r2 | ||
− | 001aee54: 8c450008 lw r5,0x0008(r2) | + | 001aee54: 8c450008 lw r5,0x0008(r2) 3rd point's Z0 |
001aee58: 3463aaab ori r3,r3,0xaaab | 001aee58: 3463aaab ori r3,r3,0xaaab | ||
− | 001aee5c: 00a30018 mult r5,r3 | + | 001aee5c: 00a30018 mult r5,r3 Z0 point / 6 |
001aee60: 00051fc3 sra r3,r5,0x1f | 001aee60: 00051fc3 sra r3,r5,0x1f | ||
001aee64: 00001010 mfhi r2 | 001aee64: 00001010 mfhi r2 | ||
− | 001aee68: 00021043 sra r2,r2,0x01 | + | 001aee68: 00021043 sra r2,r2,0x01 Z0 point / c |
001aee6c: 00432823 subu r5,r2,r3 | 001aee6c: 00432823 subu r5,r2,r3 | ||
− | 001aee70: 24a2ffff addiu r2,r5,0xffff | + | 001aee70: 24a2ffff addiu r2,r5,0xffff rounding |
001aee74: 2c42017e sltiu r2,r2,0x017e | 001aee74: 2c42017e sltiu r2,r2,0x017e | ||
− | 001aee78: 1040000e beq r2,r0,0x001aeeb4 | + | 001aee78: 1040000e beq r2,r0,0x001aeeb4 branch if greater than render distance (literally how could this ever happen.) |
− | 001aee7c: 26100001 addiu r16,r16,0x0001 | + | 001aee7c: 26100001 addiu r16,r16,0x0001 r16 counter ++ |
001aee80: 3c04801c lui r4,0x801c | 001aee80: 3c04801c lui r4,0x801c | ||
− | 001aee84: 8c84c0cc lw r4,-0x3f34(r4) | + | 001aee84: 8c84c0cc lw r4,-0x3f34(r4) polygon pointers by depth table pointer |
001aee88: 8cc30000 lw r3,0x0000(r6) | 001aee88: 8cc30000 lw r3,0x0000(r6) | ||
001aee8c: 8c820000 lw r2,0x0000(r4) | 001aee8c: 8c820000 lw r2,0x0000(r4) | ||
Line 731: | Line 757: | ||
001aeea8: 00551024 and r2,r2,r21 | 001aeea8: 00551024 and r2,r2,r21 | ||
001aeeac: 00431025 or r2,r2,r3 | 001aeeac: 00431025 or r2,r2,r3 | ||
− | 001aeeb0: ac820000 sw r2,0x0000(r4) | + | 001aeeb0: ac820000 sw r2,0x0000(r4) swap SRAM and VRAM address types of new and old polygons at depth table; store one another's polygon addresses. |
001aeeb4: 0234102a slt r2,r17,r20 | 001aeeb4: 0234102a slt r2,r17,r20 | ||
001aeeb8: 10400086 beq r2,r0,0x001af0d4 | 001aeeb8: 10400086 beq r2,r0,0x001af0d4 | ||
001aeebc: 00000000 nop | 001aeebc: 00000000 nop | ||
− | 001aeec0: 0806bb29 j 0x001aeca4 | + | 001aeec0: 0806bb29 j 0x001aeca4 loop for every polygon entry or every 0xc*(effect target data) * 3, whichever is smaller |
001aeec4: 00000000 nop | 001aeec4: 00000000 nop | ||
+ | |||
+ | Shuriken. basically same notes as throw stone. | ||
001aeec8: 3c02801c lui r2,0x801c | 001aeec8: 3c02801c lui r2,0x801c | ||
001aeecc: 8c42c098 lw r2,-0x3f68(r2) | 001aeecc: 8c42c098 lw r2,-0x3f68(r2) | ||
Line 775: | Line 803: | ||
001aef58: 00000000 nop | 001aef58: 00000000 nop | ||
001aef5c: a0c2000d sb r2,0x000d(r6) | 001aef5c: a0c2000d sb r2,0x000d(r6) | ||
− | 001aef60: | + | 001aef60: 93a2001a lbu r2,0x001a(r29) |
001aef64: 00000000 nop | 001aef64: 00000000 nop | ||
001aef68: a0c2000e sb r2,0x000e(r6) | 001aef68: a0c2000e sb r2,0x000e(r6) | ||
Line 868: | Line 896: | ||
001af0cc: 1440ff88 bne r2,r0,0x001aeef0 | 001af0cc: 1440ff88 bne r2,r0,0x001aeef0 | ||
001af0d0: 00000000 nop | 001af0d0: 00000000 nop | ||
+ | |||
+ | All Return: | ||
001af0d4: 8fbf010c lw r31,0x010c(r29) | 001af0d4: 8fbf010c lw r31,0x010c(r29) | ||
001af0d8: 8fbe0108 lw r30,0x0108(r29) | 001af0d8: 8fbe0108 lw r30,0x0108(r29) |
Latest revision as of 05:15, 22 March 2023
Inputs:
- r4 = p1
- pre-effect rotation matrix
- r5 = p2
- pre-effect translation matrix
- r6 = p3
- post-effect rotation matrix
- r7 = p4
- scalar vector matrix (scales model size)
the preliminary calculation is done as follows: {Rotation matrix(r4) x Vector matrix(Effect) + Translation matrix(r5)} x {1/4096 * [Rotation matrix(r6) x Vector Matrix(r7)]} x Rotation matrix(camera) + Translation matrix(camera) {R4 x VE + T5} x {1/4096 * [R6 x V7]} x RC + TC Produces a table of x y z vectors per model point. Then assigns an RGB palette to every point and constructs the polygons for the model. 001ae340: 27bdfef0 addiu r29,r29,0xfef0 stack - 0x110 001ae344: afb400f8 sw r20,0x00f8(r29) 001ae348: 00a0a021 addu r20,r5,r0 #stack pointer 001ae34c: afb60100 sw r22,0x0100(r29) 001ae350: 00c0b021 addu r22,r6,r0 #stack pointer 001ae354: afb70104 sw r23,0x0104(r29) 001ae358: 00e0b821 addu r23,r7,r0 #stack pointer 001ae35c: afb000e8 sw r16,0x00e8(r29) 001ae360: 27b00088 addiu r16,r29,0x0088 001ae364: afbe0108 sw r30,0x0108(r29) 001ae368: 8fbe0120 lw r30,0x0120(r29) #load parsed argument (Particle byte BB) 001ae36c: 02002821 addu r5,r16,r0 #stack + 0x88 001ae370: afbf010c sw r31,0x010c(r29) 001ae374: afb500fc sw r21,0x00fc(r29) 001ae378: afb300f4 sw r19,0x00f4(r29) 001ae37c: afb200f0 sw r18,0x00f0(r29) 001ae380: 0c007596 jal 0x0001d658 #Set Rotation matrix elements - r4 is input for angles. stores rotation matrix R in stack + 0x88 001ae384: afb100ec sw r17,0x00ec(r29) 001ae388: 02002021 addu r4,r16,r0 #stack + 0x88 001ae38c: afa000a4 sw r0,0x00a4(r29) 001ae390: afa000a0 sw r0,0x00a0(r29) 001ae394: 0c00742a jal 0x0001d0a8 #Store Rotation matrix elements to GTE 001ae398: afa0009c sw r0,0x009c(r29) #sets no translation vectors (ok.) 001ae39c: 0c00744e jal 0x0001d138 #Store Translation Vectors to GTE 001ae3a0: 02002021 addu r4,r16,r0 001ae3a4: 00008821 addu r17,r0,r0 001ae3a8: 33c200ff andi r2,r30,0x00ff move Model ID to r2 001ae3ac: 00021080 sll r2,r2,0x02 ID * 4 001ae3b0: 3c01801c lui r1,0x801c 001ae3b4: 00220821 addu r1,r1,r2 001ae3b8: 8c358534 lw r21,-0x7acc(r1) 0x801b8534 + ID * 4 (pointers to model data, 0x801b69dc - arrow, 0x801b6d00 - stone, 0x801b6f00 - reflect) 001ae3bc: 3c121f80 lui r18,0x1f80 001ae3c0: 8ea2000c lw r2,0x000c(r21) pointer to table of points 001ae3c4: 8eb30010 lw r19,0x0010(r21) No. points 001ae3c8: 2442000c addiu r2,r2,0x000c 001ae3cc: 1a600017 blez r19,0x001ae42c branch if 0 points 001ae3d0: 02a21021 addu r2,r21,r2 move model pointer up by point pointer 001ae3d4: 3c031f80 lui r3,0x1f80 001ae3d8: 00402021 addu r4,r2,r0 r4 = model point pointer 001ae3dc: 00806021 addu r12,r4,r0 r12 = model point pointer 001ae3e0: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) xy vector 001ae3e4: c9810004 lwc2 gtedr01_vz0,0x0004(r12) z0 vector 001ae3e8: 00000000 nop 001ae3ec: 00000000 nop 001ae3f0: 4a480012 mvmva multiply loaded vectors by GTE 001ae3f4: 00606021 addu r12,r3,r0 vector storage 0x1f800000 001ae3f8: e9990000 swc2 gtedr25_mac1,0x0000(r12) X, 001ae3fc: e99a0004 swc2 gtedr26_mac2,0x0004(r12) Y, 001ae400: e99b0008 swc2 gtedr27_mac3,0x0008(r12) Z, vectors store into RAM 001ae404: 2462000c addiu r2,r3,0x000c 001ae408: 00406021 addu r12,r2,r0 0x1f800000 + 0xc 001ae40c: 484df800 cfc2 r13,gtecr31_flag "copy from coprocessor" undoubtedly someone will need that. moves gtecr31_flag into r31. 001ae410: 00000000 nop 001ae414: ad8d0000 sw r13,0x0000(r12) stores GTE CR flag to 0xc. 001ae418: 24630010 addiu r3,r3,0x0010 0x1f800000 + 0x10 * loop 001ae41c: 26310001 addiu r17,r17,0x0001 001ae420: 0233102a slt r2,r17,r19 001ae424: 1440ffed bne r2,r0,0x001ae3dc loop as many times as there are vectors 001ae428: 24840008 addiu r4,r4,0x0008 vector pointer + 0x8 * loop 001ae42c: 02c02021 addu r4,r22,r0 001ae430: 27b00088 addiu r16,r29,0x0088 001ae434: 0c007596 jal 0x0001d658 Set Rotation matrix elements 001ae438: 02002821 addu r5,r16,r0 stack + 0x88 - destination for matrix, input r6 for angles 001ae43c: 02002021 addu r4,r16,r0 parse matrix stack address 001ae440: 0c007278 jal 0x0001c9e0 Multiply Rotation Matrix r4 by Input Vector r5 - obtain new rotation matrix, with input r5 as the maximum per cell instead of 4096. 001ae444: 02e02821 addu r5,r23,r0 001ae448: 8e820000 lw r2,0x0000(r20) load translation x (inputs from mother routine.) 001ae44c: 00000000 nop 001ae450: afa2009c sw r2,0x009c(r29) store translation x 001ae454: 8e820004 lw r2,0x0004(r20) load translation y 001ae458: 02002021 addu r4,r16,r0 stack + 0x88 (rotation + translation matrix from input) 001ae45c: afa200a0 sw r2,0x00a0(r29) store translation y 001ae460: 8e820008 lw r2,0x0008(r20) load translation z 001ae464: 00008821 addu r17,r0,r0 001ae468: 0c00742a jal 0x0001d0a8 Store Rotation matrix elements to GTE 001ae46c: afa200a4 sw r2,0x00a4(r29) store translation z 001ae470: 0c00744e jal 0x0001d138 Store Translation Vectors to GTE 001ae474: 02002021 addu r4,r16,r0 001ae478: 1a60001e blez r19,0x001ae4f4 branch if no polygons 001ae47c: 27a400a8 addiu r4,r29,0x00a8 stack + 0xa8 001ae480: 02401821 addu r3,r18,r0 was lui r3 0x1f80 too hard? 001ae484: 94620000 lhu r2,0x0000(r3) load polygon x vector 001ae488: 00000000 nop 001ae48c: a7a200a8 sh r2,0x00a8(r29) move to stack 001ae490: 94620004 lhu r2,0x0004(r3) load polygon y vector 001ae494: 00000000 nop 001ae498: a7a200aa sh r2,0x00aa(r29) move to stack 001ae49c: 94620008 lhu r2,0x0008(r3) load polygon z vector 001ae4a0: 00000000 nop 001ae4a4: a7a200ac sh r2,0x00ac(r29) move to stack 001ae4a8: 00806021 addu r12,r4,r0 r12 = pointer to stack 001ae4ac: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) load vector xy from stack 001ae4b0: c9810004 lwc2 gtedr01_vz0,0x0004(r12) load vector z0 from stack 001ae4b4: 00000000 nop 001ae4b8: 00000000 nop 001ae4bc: 4a480012 mvmva multiply vectors by GTE 001ae4c0: 00606021 addu r12,r3,r0 001ae4c4: e9990000 swc2 gtedr25_mac1,0x0000(r12) 001ae4c8: e99a0004 swc2 gtedr26_mac2,0x0004(r12) 001ae4cc: e99b0008 swc2 gtedr27_mac3,0x0008(r12) store vectors after multiplication 001ae4d0: 2462000c addiu r2,r3,0x000c 001ae4d4: 00406021 addu r12,r2,r0 001ae4d8: 484df800 cfc2 r13,gtecr31_flag GTE CR flag? 001ae4dc: 00000000 nop 001ae4e0: ad8d0000 sw r13,0x0000(r12) store 001ae4e4: 26310001 addiu r17,r17,0x0001 001ae4e8: 0233102a slt r2,r17,r19 001ae4ec: 1440ffe5 bne r2,r0,0x001ae484 loop for all vectors 001ae4f0: 24630010 addiu r3,r3,0x0010 vector pointer + 0x10 001ae4f4: 3c10800a lui r16,0x800a 001ae4f8: 26108a24 addiu r16,r16,0x8a24 001ae4fc: 0c00742a jal 0x0001d0a8 Store Rotation matrix elements to GTE - camera matrix 001ae500: 02002021 addu r4,r16,r0 camera matrix 001ae504: 0c00744e jal 0x0001d138 Store Translation Vectors to GTE - camera matrix 001ae508: 02002021 addu r4,r16,r0 001ae50c: 1a60001f blez r19,0x001ae58c branch if no points 001ae510: 00008821 addu r17,r0,r0 001ae514: 27a400a8 addiu r4,r29,0x00a8 001ae518: 02401821 addu r3,r18,r0 001ae51c: 94620000 lhu r2,0x0000(r3) load x vector 001ae520: 00000000 nop 001ae524: a7a200a8 sh r2,0x00a8(r29) store in stack 001ae528: 94620004 lhu r2,0x0004(r3) load y vector 001ae52c: 00000000 nop 001ae530: a7a200aa sh r2,0x00aa(r29) store in stack 001ae534: 94620008 lhu r2,0x0008(r3) load z vector 001ae538: 00000000 nop 001ae53c: a7a200ac sh r2,0x00ac(r29) store in stack 001ae540: 00806021 addu r12,r4,r0 vector matrix pointer 001ae544: c9800000 lwc2 gtedr00_vxy0,0x0000(r12) 001ae548: c9810004 lwc2 gtedr01_vz0,0x0004(r12) 001ae54c: 00000000 nop 001ae550: 00000000 nop 001ae554: 4a480012 mvmva 001ae558: 00606021 addu r12,r3,r0 001ae55c: e9990000 swc2 gtedr25_mac1,0x0000(r12) 001ae560: e99a0004 swc2 gtedr26_mac2,0x0004(r12) 001ae564: e99b0008 swc2 gtedr27_mac3,0x0008(r12) load and store vectors precisely where they were loaded from. 001ae568: 2462000c addiu r2,r3,0x000c 001ae56c: 00406021 addu r12,r2,r0 001ae570: 484df800 cfc2 r13,gtecr31_flag 001ae574: 00000000 nop 001ae578: ad8d0000 sw r13,0x0000(r12) 001ae57c: 26310001 addiu r17,r17,0x0001 001ae580: 0233102a slt r2,r17,r19 001ae584: 1440ffe5 bne r2,r0,0x001ae51c repeat for all polygons 001ae588: 24630010 addiu r3,r3,0x0010 001ae58c: 02a02021 addu r4,r21,r0 parse BB associated data pointer 001ae590: 0c06a39f jal 0x001a8e7c 001a8e74 - 001a8f10 don't mind the incorrect address, there's a jr r31 at the start. ignore it. moves data pointers to ram regarding effect data. returns No. polygons of model. 001ae594: 00002821 addu r5,r0,r0 r5 = 0 (not important.) 001ae598: 00008021 addu r16,r0,r0 001ae59c: 0000a021 addu r20,r0,r0 001ae5a0: 0040a821 addu r21,r2,r0 No. Polygons in model 001ae5a4: 33c300ff andi r3,r30,0x00ff move model ID to r3 001ae5a8: 34020001 ori r2,r0,0x0001 001ae5ac: 10620127 beq r3,r2,0x001aea4c branch if model is stone 001ae5b0: 00009821 addu r19,r0,r0 r19 = 0 001ae5b4: 28620002 slti r2,r3,0x0002 001ae5b8: 10400005 beq r2,r0,0x001ae5d0 branch if model is reflect 001ae5bc: 00000000 nop 001ae5c0: 1060000a beq r3,r0,0x001ae5ec branch if model is arrow 001ae5c4: 00000000 nop 001ae5c8: 0806bc35 j 0x001af0d4 if no model. 001ae5cc: 00000000 nop 001ae5d0: 34020002 ori r2,r0,0x0002 001ae5d4: 106201a4 beq r3,r2,0x001aec68 branch if reflect model 001ae5d8: 34020003 ori r2,r0,0x0003 001ae5dc: 1062023a beq r3,r2,0x001aeec8 Branch if shuriken model 001ae5e0: 00000000 nop 001ae5e4: 0806bc35 j 0x001af0d4 error 001ae5e8: 00000000 nop
Model = arrow 001ae5ec: 3c02801c lui r2,0x801c 001ae5f0: 8c42c098 lw r2,-0x3f68(r2) loads effect target data 001ae5f4: 00000000 nop 001ae5f8: 8c570050 lw r23,0x0050(r2) loads effect data RAM pointer 001ae5fc: 1aa002b5 blez r21,0x001af0d4 end if No. polygons <= 0 (error) 001ae600: 00008821 addu r17,r0,r0 001ae604: 3c1000ff lui r16,0x00ff 001ae608: 3610ffff ori r16,r16,0xffff 0x00ffffff 001ae60c: 3c16ff00 lui r22,0xff00 0xff000000 001ae610: 0c06a3c5 jal 0x001a8f14 001a8f14 - 001a90cc moves Polygon data to stack 001ae614: 27a40010 addiu r4,r29,0x0010 stack + 0x10 001ae618: 93a30013 lbu r3,0x0013(r29) 001ae61c: 34020039 ori r2,r0,0x0039 001ae620: 14620090 bne r3,r2,0x001ae864 branch if polygon only has 3 points 001ae624: 00000000 nop
Arrow quad Polygon 001ae628: 3c03801c lui r3,0x801c 001ae62c: 8c63c090 lw r3,-0x3f70(r3) counter? 001ae630: 93a40014 lbu r4,0x0014(r29) Palette byte 001ae634: 000310c0 sll r2,r3,0x03 001ae638: 00431023 subu r2,r2,r3 001ae63c: 00021080 sll r2,r2,0x02 001ae640: 00431021 addu r2,r2,r3 001ae644: 00021080 sll r2,r2,0x02 001ae648: 00431021 addu r2,r2,r3 001ae64c: 00021080 sll r2,r2,0x02 001ae650: 244200e0 addiu r2,r2,0x00e0 counter? * 0x1d4 + 0xe0 001ae654: 02e21021 addu r2,r23,r2 effect data pointer 001ae658: 001418c0 sll r3,r20,0x03 r20 counter * 8 001ae65c: 00741821 addu r3,r3,r20 001ae660: 00031880 sll r3,r3,0x02 r20 counter * 0x24 001ae664: 00433021 addu r6,r2,r3 Model data (table 0x1d4 and sub table 0x24; (decimal) 2 table entries, 13 sub table entries) 001ae668: a0c40004 sb r4,0x0004(r6) store palette byte in Model 001ae66c: 93a20015 lbu r2,0x0015(r29) 001ae670: 00000000 nop 001ae674: a0c20005 sb r2,0x0005(r6) 001ae678: 93a20016 lbu r2,0x0016(r29) 001ae67c: 00000000 nop 001ae680: a0c20006 sb r2,0x0006(r6) 001ae684: 93a20018 lbu r2,0x0018(r29) 001ae688: 00000000 nop 001ae68c: a0c2000c sb r2,0x000c(r6) 001ae690: 93a20019 lbu r2,0x0019(r29) 001ae694: 00000000 nop 001ae698: a0c2000d sb r2,0x000d(r6) 001ae69c: 93a2001a lbu r2,0x001a(r29) 001ae6a0: 00000000 nop 001ae6a4: a0c2000e sb r2,0x000e(r6) 001ae6a8: 93a2001c lbu r2,0x001c(r29) 001ae6ac: 00000000 nop 001ae6b0: a0c20014 sb r2,0x0014(r6) 001ae6b4: 93a2001d lbu r2,0x001d(r29) 001ae6b8: 00000000 nop 001ae6bc: a0c20015 sb r2,0x0015(r6) 001ae6c0: 93a2001e lbu r2,0x001e(r29) 001ae6c4: 00000000 nop 001ae6c8: a0c20016 sb r2,0x0016(r6) 001ae6cc: 93a20020 lbu r2,0x0020(r29) 001ae6d0: 00000000 nop 001ae6d4: a0c2001c sb r2,0x001c(r6) 001ae6d8: 93a20021 lbu r2,0x0021(r29) 001ae6dc: 00000000 nop 001ae6e0: a0c2001d sb r2,0x001d(r6) 001ae6e4: 93a20022 lbu r2,0x0022(r29) 001ae6e8: 00000000 nop 001ae6ec: a0c2001e sb r2,0x001e(r6) moves palette data 1 byte at a time. 001ae6f0: 97a20078 lhu r2,0x0078(r29) first Point ID 001ae6f4: 00000000 nop 001ae6f8: 00021100 sll r2,r2,0x04 001ae6fc: 02421021 addu r2,r18,r2 0x1f800000 + ptr*16 001ae700: 94420000 lhu r2,0x0000(r2) load Point x 001ae704: 00000000 nop 001ae708: a4c20008 sh r2,0x0008(r6) store vector X 001ae70c: 97a20078 lhu r2,0x0078(r29) First point ID 001ae710: 00000000 nop 001ae714: 00021100 sll r2,r2,0x04 001ae718: 02421021 addu r2,r18,r2 001ae71c: 94420004 lhu r2,0x0004(r2) Point y 001ae720: 00000000 nop 001ae724: a4c2000a sh r2,0x000a(r6) store more Point data 001ae728: 97a20078 lhu r2,0x0078(r29) First point 001ae72c: 97a3007a lhu r3,0x007a(r29) Second point 001ae730: 00021100 sll r2,r2,0x04 001ae734: 02421021 addu r2,r18,r2 001ae738: 00031900 sll r3,r3,0x04 001ae73c: 02431821 addu r3,r18,r3 001ae740: 8c450008 lw r5,0x0008(r2) first point Z0 001ae744: 94620000 lhu r2,0x0000(r3) second point x 001ae748: 00000000 nop 001ae74c: a4c20010 sh r2,0x0010(r6) 001ae750: 97a2007a lhu r2,0x007a(r29) the other halfword from above (second to last word of table?) 001ae754: 00000000 nop 001ae758: 00021100 sll r2,r2,0x04 001ae75c: 02421021 addu r2,r18,r2 001ae760: 94420004 lhu r2,0x0004(r2) 2nd point y 001ae764: 00000000 nop 001ae768: a4c20012 sh r2,0x0012(r6) store 001ae76c: 97a3007a lhu r3,0x007a(r29) Second point ID 001ae770: 97a2007c lhu r2,0x007c(r29) Third point ID 001ae774: 00031900 sll r3,r3,0x04 001ae778: 02431821 addu r3,r18,r3 001ae77c: 00021100 sll r2,r2,0x04 001ae780: 02421021 addu r2,r18,r2 001ae784: 94420000 lhu r2,0x0000(r2) 3rd Point x 001ae788: 8c640008 lw r4,0x0008(r3) 2nd Point z0 001ae78c: a4c20018 sh r2,0x0018(r6) store 001ae790: 97a2007c lhu r2,0x007c(r29) 001ae794: 00000000 nop 001ae798: 00021100 sll r2,r2,0x04 001ae79c: 02421021 addu r2,r18,r2 001ae7a0: 94420004 lhu r2,0x0004(r2) 3rd point y 001ae7a4: 00000000 nop 001ae7a8: a4c2 001a sh r2,0x001a(r6) 001ae7ac: 97a3007c lhu r3,0x007c(r29) 001ae7b0: 97a2007e lhu r2,0x007e(r29) 4th point ID 001ae7b4: 00031900 sll r3,r3,0x04 001ae7b8: 02431821 addu r3,r18,r3 001ae7bc: 00021100 sll r2,r2,0x04 001ae7c0: 02421021 addu r2,r18,r2 001ae7c4: 94420000 lhu r2,0x0000(r2) 4th point x 001ae7c8: 8c630008 lw r3,0x0008(r3) 3rd point z0 001ae7cc: a4c20020 sh r2,0x0020(r6) 001ae7d0: 97a2007e lhu r2,0x007e(r29) 001ae7d4: 00000000 nop 001ae7d8: 00021100 sll r2,r2,0x04 001ae7dc: 02421021 addu r2,r18,r2 001ae7e0: 94420004 lhu r2,0x0004(r2) 4th point y 001ae7e4: 26940001 addiu r20,r20,0x0001 sub table counter ++ 001ae7e8: a4c20022 sh r2,0x0022(r6) 001ae7ec: 97a2007e lhu r2,0x007e(r29) 4th point z0 001ae7f0: 00a42821 addu r5,r5,r4 first z0 + second z0 001ae7f4: 00021100 sll r2,r2,0x04 001ae7f8: 02421021 addu r2,r18,r2 001ae7fc: 8c420008 lw r2,0x0008(r2) 4th point Z0 001ae800: 00a32821 addu r5,r5,r3 1st Z0 + 2nd Z0 + 3rd Z0 001ae804: 00a22821 addu r5,r5,r2 sum of all z0 vectors 001ae808: 04a10002 bgez r5,0x001ae814 branch if not negative 001ae80c: 00a01021 addu r2,r5,r0 001ae810: 24a2000f addiu r2,r5,0x000f 001ae814: 00022903 sra r5,r2,0x04 find average of z0 vectors / 4 001ae818: 24a2ffff addiu r2,r5,0xffff 001ae81c: 2c42017e sltiu r2,r2,0x017e that seems, oddly specific? 001ae820: 1040000f beq r2,r0,0x001ae860 branch if not the case 001ae824: 00052080 sll r4,r5,0x02 depth pointer 001ae828: 3c02801c lui r2,0x801c 001ae82c: 8c42c0cc lw r2,-0x3f34(r2) VRAM Model depth table 001ae830: 8cc30000 lw r3,0x0000(r6) address to r6 pointer 001ae834: 00822021 addu r4,r4,r2 depth data 001ae838: 8c820000 lw r2,0x0000(r4) pointer to polygon at that current depth? 001ae83c: 00761824 and r3,r3,r22 0x00*(r6) AND address marker type? (0x80 implies SRAM?) 001ae840: 00501024 and r2,r2,r16 0x00*(r4) AND Address? 001ae844: 00621825 or r3,r3,r2 Bit combine 001ae848: acc30000 sw r3,0x0000(r6) store previous model address in r6 as SRAM pointer 001ae84c: 8c820000 lw r2,0x0000(r4) 001ae850: 00d01824 and r3,r6,r16 old 0x00*(r6) AND Address 001ae854: 00561024 and r2,r2,r22 0x00*(r4) AND Address marker type? 001ae858: 00431025 or r2,r2,r3 bit combine 001ae85c: ac820000 sw r2,0x0000(r4) Store new model address into depth table as VRAM pointer? 001ae860: 93a30013 lbu r3,0x0013(r29) load 4th byte of 1st table word entry 001ae864: 34020031 ori r2,r0,0x0031
Arrow Tri polygon 001ae868: 14620073 bne r3,r2,0x001aea38 branch if polygon has 4 points 001ae86c: 26310001 addiu r17,r17,0x0001 r17 counter ++ 001ae870: 3c02801c lui r2,0x801c 001ae874: 8c42c090 lw r2,-0x3f70(r2) counter? 001ae878: 93a40014 lbu r4,0x0014(r29) 1st byte of second word, again 001ae87c: 000218c0 sll r3,r2,0x03 001ae880: 00621823 subu r3,r3,r2 001ae884: 00031900 sll r3,r3,0x04 counter? * 0x70 001ae888: 02e31821 addu r3,r23,r3 effect data pointer? 001ae88c: 001310c0 sll r2,r19,0x03 001ae890: 00531023 subu r2,r2,r19 001ae894: 00021080 sll r2,r2,0x02 r19 counter * 0x1c 001ae898: 00623021 addu r6,r3,r2 r6 = 2 0x70 table entries with 4 0x1c sub-table entries per 001ae89c: a0c40004 sb r4,0x0004(r6) 001ae8a0: 93a20015 lbu r2,0x0015(r29) 001ae8a4: 00000000 nop 001ae8a8: a0c20005 sb r2,0x0005(r6) 001ae8ac: 93a20016 lbu r2,0x0016(r29) 001ae8b0: 00000000 nop 001ae8b4: a0c20006 sb r2,0x0006(r6) 001ae8b8: 93a20018 lbu r2,0x0018(r29) 001ae8bc: 00000000 nop 001ae8c0: a0c2000c sb r2,0x000c(r6) 001ae8c4: 93a20019 lbu r2,0x0019(r29) 001ae8c8: 00000000 nop 001ae8cc: a0c2000d sb r2,0x000d(r6) 001ae8d0: 93a2001a lbu r2,0x001a(r29) 001ae8d4: 00000000 nop 001ae8d8: a0c2000e sb r2,0x000e(r6) 001ae8dc: 93a2001c lbu r2,0x001c(r29) 001ae8e0: 00000000 nop 001ae8e4: a0c20014 sb r2,0x0014(r6) 001ae8e8: 93a2001d lbu r2,0x001d(r29) 001ae8ec: 00000000 nop 001ae8f0: a0c20015 sb r2,0x0015(r6) 001ae8f4: 93a2001e lbu r2,0x001e(r29) 001ae8f8: 00000000 nop 001ae8fc: a0c20016 sb r2,0x0016(r6) load and move bytes 1 at a time 001ae900: 97a20078 lhu r2,0x0078(r29) 001ae904: 00000000 nop 001ae908: 00021100 sll r2,r2,0x04 001ae90c: 02421021 addu r2,r18,r2 001ae910: 94420000 lhu r2,0x0000(r2) 1st point X 001ae914: 00000000 nop 001ae918: a4c20008 sh r2,0x0008(r6) 001ae91c: 97a20078 lhu r2,0x0078(r29) 001ae920: 00000000 nop 001ae924: 00021100 sll r2,r2,0x04 001ae928: 02421021 addu r2,r18,r2 001ae92c: 94420004 lhu r2,0x0004(r2) 1st point Y 001ae930: 00000000 nop 001ae934: a4c2000a sh r2,0x000a(r6) 001ae938: 97a20078 lhu r2,0x0078(r29) 001ae93c: 97a3007a lhu r3,0x007a(r29) 001ae940: 00021100 sll r2,r2,0x04 001ae944: 02421021 addu r2,r18,r2 001ae948: 00031900 sll r3,r3,0x04 001ae94c: 02431821 addu r3,r18,r3 001ae950: 8c450008 lw r5,0x0008(r2) 1st point Z0 001ae954: 94620000 lhu r2,0x0000(r3) 2nd point X 001ae958: 00000000 nop 001ae95c: a4c20010 sh r2,0x0010(r6) 001ae960: 97a2007a lhu r2,0x007a(r29) 001ae964: 00000000 nop 001ae968: 00021100 sll r2,r2,0x04 001ae96c: 02421021 addu r2,r18,r2 001ae970: 94420004 lhu r2,0x0004(r2) 2nd point Y 001ae974: 00000000 nop 001ae978: a4c20012 sh r2,0x0012(r6) 001ae97c: 97a3007a lhu r3,0x007a(r29) 001ae980: 97a2007c lhu r2,0x007c(r29) 001ae984: 00031900 sll r3,r3,0x04 001ae988: 02431821 addu r3,r18,r3 001ae98c: 00021100 sll r2,r2,0x04 001ae990: 02421021 addu r2,r18,r2 001ae994: 94420000 lhu r2,0x0000(r2) 3rd point X 001ae998: 8c640008 lw r4,0x0008(r3) 2nd point Z0 001ae99c: a4c20018 sh r2,0x0018(r6) 001ae9a0: 97a2007c lhu r2,0x007c(r29) 001ae9a4: 00000000 nop 001ae9a8: 00021100 sll r2,r2,0x04 001ae9ac: 02421021 addu r2,r18,r2 001ae9b0: 94420004 lhu r2,0x0004(r2) 3rd point Y 001ae9b4: 3c032aaa lui r3,0x2aaa 001ae9b8: a4c2001a sh r2,0x001a(r6) 001ae9bc: 97a2007c lhu r2,0x007c(r29) 001ae9c0: 3463aaab ori r3,r3,0xaaab r3 = 1/6th 001ae9c4: 00021100 sll r2,r2,0x04 001ae9c8: 02421021 addu r2,r18,r2 001ae9cc: 8c420008 lw r2,0x0008(r2) z0 vector? 001ae9d0: 00a42821 addu r5,r5,r4 001ae9d4: 00a22821 addu r5,r5,r2 add all 3 z0? vectors? 001ae9d8: 00a30018 mult r5,r3 find average of all z0 vectors / 2 001ae9dc: 00051fc3 sra r3,r5,0x1f 001ae9e0: 00001010 mfhi r2 001ae9e4: 00021043 sra r2,r2,0x01 average of all z0 vectors / 4 001ae9e8: 00432823 subu r5,r2,r3 rounding for negatives 001ae9ec: 24a2ffff addiu r2,r5,0xffff 001ae9f0: 2c42017e sltiu r2,r2,0x017e 001ae9f4: 10400010 beq r2,r0,0x001aea38 branch if further than render distance (?) 001ae9f8: 26730001 addiu r19,r19,0x0001 r19 counter ++ 001ae9fc: 00052080 sll r4,r5,0x02 depth table index 001aea00: 3c02801c lui r2,0x801c 001aea04: 8c42c0cc lw r2,-0x3f34(r2) Model Depth table pointer 001aea08: 8cc30000 lw r3,0x0000(r6) 001aea0c: 00822021 addu r4,r4,r2 pointer to polygon pointer occupied by current z0 depth 001aea10: 8c820000 lw r2,0x0000(r4) pointer to polygon occupied by new polygon's depth 001aea14: 00761824 and r3,r3,r22 new polygon address type? 001aea18: 00501024 and r2,r2,r16 old polygon address? 001aea1c: 00621825 or r3,r3,r2 001aea20: acc30000 sw r3,0x0000(r6) store old pointer into r6 as SRAM pointer? 001aea24: 8c820000 lw r2,0x0000(r4) pointer to polygon occupied by new polygon's depth 001aea28: 00d01824 and r3,r6,r16 pointer to new model's polygon data 001aea2c: 00561024 and r2,r2,r22 Address type of old polygon? 001aea30: 00431025 or r2,r2,r3 001aea34: ac820000 sw r2,0x0000(r4) store new polygon's data pointer as VRAM pointer? 001aea38: 0235102a slt r2,r17,r21 001aea3c: 104001a5 beq r2,r0,0x001af0d4 001aea40: 00000000 nop 001aea44: 0806b984 j 0x001ae610 do for all polygons in model 001aea48: 00000000 nop
Model = stone 001aea4c: 3c02801c lui r2,0x801c 001aea50: 8c42c098 lw r2,-0x3f68(r2) load effect target data 001aea54: 00000000 nop 001aea58: 8c560050 lw r22,0x0050(r2) effect LBA ram pointer 001aea5c: 1aa0019d blez r21,0x001af0d4 branch if no table sections here. 001aea60: 00008821 addu r17,r0,r0 001aea64: 3c1300ff lui r19,0x00ff 001aea68: 3673ffff ori r19,r19,0xffff 001aea6c: 3c14ff00 lui r20,0xff00 0xff00000000 and 0x00ffffffff 001aea70: 00008021 addu r16,r0,r0 001aea74: 0c06a3c5 jal 0x001a8f14 001a8f14 - 001a90cc - moves some data into the stack from secondary effect data table 001aea78: 27a40010 addiu r4,r29,0x0010 001aea7c: 93a30013 lbu r3,0x0013(r29) 4th byte first word 001aea80: 34020031 ori r2,r0,0x0031 001aea84: 14620073 bne r3,r2,0x001aec54 branch if not 0x31 001aea88: 26310001 addiu r17,r17,0x0001 001aea8c: 3c03801c lui r3,0x801c 001aea90: 8c63c090 lw r3,-0x3f70(r3) counter? 001aea94: 00000000 nop 001aea98: 00031080 sll r2,r3,0x02 001aea9c: 00431021 addu r2,r2,r3 001aeaa0: 00021080 sll r2,r2,0x02 001aeaa4: 00431021 addu r2,r2,r3 001aeaa8: 00021100 sll r2,r2,0x04 001aeaac: 02c21021 addu r2,r22,r2 counter * 0x150 (?) + effect data pointer 001aeab0: 93a30014 lbu r3,0x0014(r29) 001aeab4: 00503021 addu r6,r2,r16 effect data + r16 pointer (0x1c; 0xc sub table entries) 001aeab8: a0c30004 sb r3,0x0004(r6) 001aeabc: 93a20015 lbu r2,0x0015(r29) 001aeac0: 00000000 nop 001aeac4: a0c20005 sb r2,0x0005(r6) 001aeac8: 93a20016 lbu r2,0x0016(r29) 001aeacc: 00000000 nop 001aead0: a0c20006 sb r2,0x0006(r6) 001aead4: 93a20018 lbu r2,0x0018(r29) 001aead8: 00000000 nop 001aeadc: a0c2000c sb r2,0x000c(r6) 001aeae0: 93a20019 lbu r2,0x0019(r29) 001aeae4: 00000000 nop 001aeae8: a0c2000d sb r2,0x000d(r6) 001aeaec: 93a2001a lbu r2,0x001a(r29) 001aeaf0: 00000000 nop 001aeaf4: a0c2000e sb r2,0x000e(r6) 001aeaf8: 93a2001c lbu r2,0x001c(r29) 001aeafc: 00000000 nop 001aeb00: a0c20014 sb r2,0x0014(r6) 001aeb04: 93a2001d lbu r2,0x001d(r29) 001aeb08: 00000000 nop 001aeb0c: a0c20015 sb r2,0x0015(r6) 001aeb10: 93a2001e lbu r2,0x001e(r29) 001aeb14: 00000000 nop 001aeb18: a0c20016 sb r2,0x0016(r6) move data here to there 1 byte at a time 001aeb1c: 97a20078 lhu r2,0x0078(r29) 001aeb20: 00000000 nop 001aeb24: 00021100 sll r2,r2,0x04 001aeb28: 02421021 addu r2,r18,r2 001aeb2c: 94420000 lhu r2,0x0000(r2) x vector? 001aeb30: 00000000 nop 001aeb34: a4c20008 sh r2,0x0008(r6) 001aeb38: 97a20078 lhu r2,0x0078(r29) 001aeb3c: 00000000 nop 001aeb40: 00021100 sll r2,r2,0x04 001aeb44: 02421021 addu r2,r18,r2 001aeb48: 94420004 lhu r2,0x0004(r2) y vector? 001aeb4c: 00000000 nop 001aeb50: a4c2000a sh r2,0x000a(r6) 001aeb54: 97a20078 lhu r2,0x0078(r29) 001aeb58: 97a3007a lhu r3,0x007a(r29) 001aeb5c: 00021100 sll r2,r2,0x04 001aeb60: 02421021 addu r2,r18,r2 001aeb64: 00031900 sll r3,r3,0x04 001aeb68: 02431821 addu r3,r18,r3 001aeb6c: 8c450008 lw r5,0x0008(r2) Z0 vector? 001aeb70: 94620000 lhu r2,0x0000(r3) x vector? 001aeb74: 00000000 nop 001aeb78: a4c20010 sh r2,0x0010(r6) 001aeb7c: 97a2007a lhu r2,0x007a(r29) 001aeb80: 00000000 nop 001aeb84: 00021100 sll r2,r2,0x04 001aeb88: 02421021 addu r2,r18,r2 001aeb8c: 94420004 lhu r2,0x0004(r2) y vector? 001aeb90: 00000000 nop 001aeb94: a4c20012 sh r2,0x0012(r6) 001aeb98: 97a3007a lhu r3,0x007a(r29) 001aeb9c: 97a2007c lhu r2,0x007c(r29) 001aeba0: 00031900 sll r3,r3,0x04 001aeba4: 02431821 addu r3,r18,r3 001aeba8: 00021100 sll r2,r2,0x04 001aebac: 02421021 addu r2,r18,r2 001aebb0: 94420000 lhu r2,0x0000(r2) x vector? 001aebb4: 8c640008 lw r4,0x0008(r3) Z0 vector? 001aebb8: a4c20018 sh r2,0x0018(r6) 001aebbc: 97a2007c lhu r2,0x007c(r29) 001aebc0: 00000000 nop 001aebc4: 00021100 sll r2,r2,0x04 001aebc8: 02421021 addu r2,r18,r2 001aebcc: 94420004 lhu r2,0x0004(r2) y vector? 001aebd0: 3c032aaa lui r3,0x2aaa 001aebd4: a4c2001a sh r2,0x001a(r6) 001aebd8: 97a2007c lhu r2,0x007c(r29) 001aebdc: 3463aaab ori r3,r3,0xaaab r3 = 1/6 001aebe0: 00021100 sll r2,r2,0x04 001aebe4: 02421021 addu r2,r18,r2 001aebe8: 8c420008 lw r2,0x0008(r2) Z0 vector 001aebec: 00a42821 addu r5,r5,r4 001aebf0: 00a22821 addu r5,r5,r2 sum all z0 vectors 001aebf4: 00a30018 mult r5,r3 001aebf8: 00051fc3 sra r3,r5,0x1f 001aebfc: 00001010 mfhi r2 001aec00: 00021043 sra r2,r2,0x01 001aec04: 00432823 subu r5,r2,r3 round Sum of Z0 vectors / 0xc 001aec08: 24a2ffff addiu r2,r5,0xffff 001aec0c: 2c42017e sltiu r2,r2,0x017e 001aec10: 10400010 beq r2,r0,0x001aec54 001aec14: 2610001c addiu r16,r16,0x001c r16 effect counter + 0x1c 001aec18: 00052080 sll r4,r5,0x02 001aec1c: 3c02801c lui r2,0x801c 001aec20: 8c42c0cc lw r2,-0x3f34(r2) Just read the same shit for triangle polygons on arrows, it's easier to find and completely identical. 001aec24: 8cc30000 lw r3,0x0000(r6) 001aec28: 00822021 addu r4,r4,r2 001aec2c: 8c820000 lw r2,0x0000(r4) 001aec30: 00741824 and r3,r3,r20 001aec34: 00531024 and r2,r2,r19 001aec38: 00621825 or r3,r3,r2 001aec3c: acc30000 sw r3,0x0000(r6) 001aec40: 8c820000 lw r2,0x0000(r4) 001aec44: 00d31824 and r3,r6,r19 001aec48: 00541024 and r2,r2,r20 001aec4c: 00431025 or r2,r2,r3 001aec50: ac820000 sw r2,0x0000(r4) 001aec54: 0235102a slt r2,r17,r21 001aec58: 1040011e beq r2,r0,0x001af0d4 001aec5c: 00000000 nop 001aec60: 0806ba9d j 0x001aea74 loop for all polygons 001aec64: 00000000 nop
Model = reflect 001aec68: 3c04801c lui r4,0x801c 001aec6c: 8c84c098 lw r4,-0x3f68(r4) loads effect target data 001aec70: 00000000 nop 001aec74: 8483000c lh r3,0x000c(r4) interesting. but unsure 001aec78: 8c960050 lw r22,0x0050(r4) load LBA ram effect data pointer 001aec7c: 00031040 sll r2,r3,0x01 0xc * 2 001aec80: 0043a021 addu r20,r2,r3 0xc* * 3 001aec84: 02b4102a slt r2,r21,r20 set if 0x20*(BB) < 0xc* * 3 001aec88: 10400002 beq r2,r0,0x001aec94 branch if 0xc* * 3 is greater 001aec8c: 00008821 addu r17,r0,r0 001aec90: 02a0a021 addu r20,r21,r0 r20 = min(0x20*(BB), 0xc* * 3) 001aec94: 1a80010f blez r20,0x001af0d4 branch if less than 0 001aec98: 3c1300ff lui r19,0x00ff 001aec9c: 3673ffff ori r19,r19,0xffff 001aeca0: 3c15ff00 lui r21,0xff00 001aeca4: 0c06a3c5 jal 0x001a8f14 001a8f14 - 001a90cc 001aeca8: 27a40010 addiu r4,r29,0x0010 001aecac: 93a30013 lbu r3,0x0013(r29) 001aecb0: 34020037 ori r2,r0,0x0037 001aecb4: 1462007f bne r3,r2,0x001aeeb4 branch if 4th byte 1st word isn't 0x37 001aecb8: 26310001 addiu r17,r17,0x0001 r17 counter ++ 001aecbc: 3c02801c lui r2,0x801c 001aecc0: 8c42c090 lw r2,-0x3f70(r2) counter? 001aecc4: 00000000 nop 001aecc8: 00021900 sll r3,r2,0x04 001aeccc: 00621823 subu r3,r3,r2 001aecd0: 00031980 sll r3,r3,0x06 001aecd4: 24630018 addiu r3,r3,0x0018 counter * 0x3c0 + 0x18 001aecd8: 02c31821 addu r3,r22,r3 effect data table, 0x3c0 bytes long per entry 001aecdc: 00101080 sll r2,r16,0x02 001aece0: 00501021 addu r2,r2,r16 001aece4: 000210c0 sll r2,r2,0x03 sub table, 0x28 bytes pr entry 001aece8: 00623021 addu r6,r3,r2 effect data table, 0x3c0 long table entries + 0x28 long table sub-entries (0x18 subtables per.) 001aecec: 3c03801c lui r3,0x801c 001aecf0: 8c63c098 lw r3,-0x3f68(r3) effect target data 001aecf4: 3402003f ori r2,r0,0x003f 001aecf8: a4c2001a sh r2,0x001a(r6) store 0x3f in 0x1a*(r6) 001aecfc: 90620002 lbu r2,0x0002(r3) load current effect target ID 001aed00: 00000000 nop 001aed04: 24427eff addiu r2,r2,0x7eff current effect target ID + 0x7eff? 001aed08: a4c2000e sh r2,0x000e(r6) each unit has a slightly different palette for reflect? 001aed0c: 93a20014 lbu r2,0x0014(r29) 001aed10: 00000000 nop 001aed14: a0c20004 sb r2,0x0004(r6) 001aed18: 93a20015 lbu r2,0x0015(r29) 001aed1c: 00000000 nop 001aed20: a0c20005 sb r2,0x0005(r6) 001aed24: 93a20016 lbu r2,0x0016(r29) 001aed28: 00000000 nop 001aed2c: a0c20006 sb r2,0x0006(r6) 001aed30: 93a20018 lbu r2,0x0018(r29) 001aed34: 00000000 nop 001aed38: a0c20010 sb r2,0x0010(r6) 001aed3c: 93a20019 lbu r2,0x0019(r29) 001aed40: 00000000 nop 001aed44: a0c20011 sb r2,0x0011(r6) 001aed48: 93a2 001a lbu r2,0x001a(r29) 001aed4c: 00000000 nop 001aed50: a0c20012 sb r2,0x0012(r6) 001aed54: 93a2001c lbu r2,0x001c(r29) 001aed58: 00000000 nop 001aed5c: a0c2001c sb r2,0x001c(r6) 001aed60: 93a2001d lbu r2,0x001d(r29) 001aed64: 00000000 nop 001aed68: a0c2001d sb r2,0x001d(r6) 001aed6c: 93a2001e lbu r2,0x001e(r29) 001aed70: 00000000 nop 001aed74: a0c2001e sb r2,0x001e(r6) 001aed78: 97a20028 lhu r2,0x0028(r29) 001aed7c: 00000000 nop 001aed80: a4c2000c sh r2,0x000c(r6) 001aed84: 97a2002a lhu r2,0x002a(r29) 001aed88: 00000000 nop 001aed8c: a4c20018 sh r2,0x0018(r6) 001aed90: 97a2002c lhu r2,0x002c(r29) move palette data into r6 001aed94: 00000000 nop 001aed98: a4c20024 sh r2,0x0024(r6) 001aed9c: 97a20078 lhu r2,0x0078(r29) Load first point 001aeda0: 00000000 nop 001aeda4: 00021100 sll r2,r2,0x04 001aeda8: 02421021 addu r2,r18,r2 001aedac: 94420000 lhu r2,0x0000(r2) 1st point X 001aedb0: 00000000 nop 001aedb4: a4c20008 sh r2,0x0008(r6) 001aedb8: 97a20078 lhu r2,0x0078(r29) 1st point 001aedbc: 00000000 nop 001aedc0: 00021100 sll r2,r2,0x04 001aedc4: 02421021 addu r2,r18,r2 001aedc8: 94420004 lhu r2,0x0004(r2) 1st point Y 001aedcc: 00000000 nop 001aedd0: a4c2000a sh r2,0x000a(r6) 001aedd4: 97a2007a lhu r2,0x007a(r29) 2nd point 001aedd8: 00000000 nop 001aeddc: 00021100 sll r2,r2,0x04 001aede0: 02421021 addu r2,r18,r2 001aede4: 94420000 lhu r2,0x0000(r2) 2nd point X 001aede8: 00000000 nop 001aedec: a4c20014 sh r2,0x0014(r6) 001aedf0: 97a2007a lhu r2,0x007a(r29) 2nd point 001aedf4: 00000000 nop 001aedf8: 00021100 sll r2,r2,0x04 001aedfc: 02421021 addu r2,r18,r2 001aee00: 94420004 lhu r2,0x0004(r2) 2nd point Y 001aee04: 00000000 nop 001aee08: a4c20016 sh r2,0x0016(r6) 001aee0c: 97a2007c lhu r2,0x007c(r29) 3rd point 001aee10: 00000000 nop 001aee14: 00021100 sll r2,r2,0x04 001aee18: 02421021 addu r2,r18,r2 001aee1c: 94420000 lhu r2,0x0000(r2) 3rd point X 001aee20: 00000000 nop 001aee24: a4c20020 sh r2,0x0020(r6) 001aee28: 97a2007c lhu r2,0x007c(r29) 001aee2c: 00000000 nop 001aee30: 00021100 sll r2,r2,0x04 001aee34: 02421021 addu r2,r18,r2 001aee38: 94420004 lhu r2,0x0004(r2) 3rd point Y 001aee3c: 00000000 nop 001aee40: a4c20022 sh r2,0x0022(r6) 001aee44: 97a2007c lhu r2,0x007c(r29) 3rd point 001aee48: 3c032aaa lui r3,0x2aaa 001aee4c: 00021100 sll r2,r2,0x04 001aee50: 02421021 addu r2,r18,r2 001aee54: 8c450008 lw r5,0x0008(r2) 3rd point's Z0 001aee58: 3463aaab ori r3,r3,0xaaab 001aee5c: 00a30018 mult r5,r3 Z0 point / 6 001aee60: 00051fc3 sra r3,r5,0x1f 001aee64: 00001010 mfhi r2 001aee68: 00021043 sra r2,r2,0x01 Z0 point / c 001aee6c: 00432823 subu r5,r2,r3 001aee70: 24a2ffff addiu r2,r5,0xffff rounding 001aee74: 2c42017e sltiu r2,r2,0x017e 001aee78: 1040000e beq r2,r0,0x001aeeb4 branch if greater than render distance (literally how could this ever happen.) 001aee7c: 26100001 addiu r16,r16,0x0001 r16 counter ++ 001aee80: 3c04801c lui r4,0x801c 001aee84: 8c84c0cc lw r4,-0x3f34(r4) polygon pointers by depth table pointer 001aee88: 8cc30000 lw r3,0x0000(r6) 001aee8c: 8c820000 lw r2,0x0000(r4) 001aee90: 00751824 and r3,r3,r21 001aee94: 00531024 and r2,r2,r19 001aee98: 00621825 or r3,r3,r2 001aee9c: acc30000 sw r3,0x0000(r6) 001aeea0: 8c820000 lw r2,0x0000(r4) 001aeea4: 00d31824 and r3,r6,r19 001aeea8: 00551024 and r2,r2,r21 001aeeac: 00431025 or r2,r2,r3 001aeeb0: ac820000 sw r2,0x0000(r4) swap SRAM and VRAM address types of new and old polygons at depth table; store one another's polygon addresses. 001aeeb4: 0234102a slt r2,r17,r20 001aeeb8: 10400086 beq r2,r0,0x001af0d4 001aeebc: 00000000 nop 001aeec0: 0806bb29 j 0x001aeca4 loop for every polygon entry or every 0xc*(effect target data) * 3, whichever is smaller 001aeec4: 00000000 nop
Shuriken. basically same notes as throw stone. 001aeec8: 3c02801c lui r2,0x801c 001aeecc: 8c42c098 lw r2,-0x3f68(r2) 001aeed0: 00000000 nop 001aeed4: 8c560050 lw r22,0x0050(r2) 001aeed8: 1aa0007e blez r21,0x001af0d4 001aeedc: 00008821 addu r17,r0,r0 001aeee0: 3c1300ff lui r19,0x00ff 001aeee4: 3673ffff ori r19,r19,0xffff 001aeee8: 3c14ff00 lui r20,0xff00 001aeeec: 00008021 addu r16,r0,r0 001aeef0: 0c06a3c5 jal 0x001a8f14 001aeef4: 27a40010 addiu r4,r29,0x0010 001aeef8: 93a30013 lbu r3,0x0013(r29) 001aeefc: 34020031 ori r2,r0,0x0031 001aef00: 14620071 bne r3,r2,0x001af0c8 001aef04: 26310001 addiu r17,r17,0x0001 001aef08: 3c03801c lui r3,0x801c 001aef0c: 8c63c090 lw r3,-0x3f70(r3) 001aef10: 00000000 nop 001aef14: 000310c0 sll r2,r3,0x03 001aef18: 00431023 subu r2,r2,r3 001aef1c: 00021180 sll r2,r2,0x06 001aef20: 02c21021 addu r2,r22,r2 001aef24: 93a30014 lbu r3,0x0014(r29) 001aef28: 00503021 addu r6,r2,r16 001aef2c: a0c30004 sb r3,0x0004(r6) 001aef30: 93a20015 lbu r2,0x0015(r29) 001aef34: 00000000 nop 001aef38: a0c20005 sb r2,0x0005(r6) 001aef3c: 93a20016 lbu r2,0x0016(r29) 001aef40: 00000000 nop 001aef44: a0c20006 sb r2,0x0006(r6) 001aef48: 93a20018 lbu r2,0x0018(r29) 001aef4c: 00000000 nop 001aef50: a0c2000c sb r2,0x000c(r6) 001aef54: 93a20019 lbu r2,0x0019(r29) 001aef58: 00000000 nop 001aef5c: a0c2000d sb r2,0x000d(r6) 001aef60: 93a2001a lbu r2,0x001a(r29) 001aef64: 00000000 nop 001aef68: a0c2000e sb r2,0x000e(r6) 001aef6c: 93a2001c lbu r2,0x001c(r29) 001aef70: 00000000 nop 001aef74: a0c20014 sb r2,0x0014(r6) 001aef78: 93a2001d lbu r2,0x001d(r29) 001aef7c: 00000000 nop 001aef80: a0c20015 sb r2,0x0015(r6) 001aef84: 93a2001e lbu r2,0x001e(r29) 001aef88: 00000000 nop 001aef8c: a0c20016 sb r2,0x0016(r6) 001aef90: 97a20078 lhu r2,0x0078(r29) 001aef94: 00000000 nop 001aef98: 00021100 sll r2,r2,0x04 001aef9c: 02421021 addu r2,r18,r2 001aefa0: 94420000 lhu r2,0x0000(r2) 001aefa4: 00000000 nop 001aefa8: a4c20008 sh r2,0x0008(r6) 001aefac: 97a20078 lhu r2,0x0078(r29) 001aefb0: 00000000 nop 001aefb4: 00021100 sll r2,r2,0x04 001aefb8: 02421021 addu r2,r18,r2 001aefbc: 94420004 lhu r2,0x0004(r2) 001aefc0: 00000000 nop 001aefc4: a4c2000a sh r2,0x000a(r6) 001aefc8: 97a20078 lhu r2,0x0078(r29) 001aefcc: 97a3007a lhu r3,0x007a(r29) 001aefd0: 00021100 sll r2,r2,0x04 001aefd4: 02421021 addu r2,r18,r2 001aefd8: 00031900 sll r3,r3,0x04 001aefdc: 02431821 addu r3,r18,r3 001aefe0: 8c450008 lw r5,0x0008(r2) 001aefe4: 94620000 lhu r2,0x0000(r3) 001aefe8: 00000000 nop 001aefec: a4c20010 sh r2,0x0010(r6) 001aeff0: 97a2007a lhu r2,0x007a(r29) 001aeff4: 00000000 nop 001aeff8: 00021100 sll r2,r2,0x04 001aeffc: 02421021 addu r2,r18,r2 001af000: 94420004 lhu r2,0x0004(r2) 001af004: 00000000 nop 001af008: a4c20012 sh r2,0x0012(r6) 001af00c: 97a3007a lhu r3,0x007a(r29) 001af010: 97a2007c lhu r2,0x007c(r29) 001af014: 00031900 sll r3,r3,0x04 001af018: 02431821 addu r3,r18,r3 001af01c: 00021100 sll r2,r2,0x04 001af020: 02421021 addu r2,r18,r2 001af024: 94420000 lhu r2,0x0000(r2) 001af028: 8c640008 lw r4,0x0008(r3) 001af02c: a4c20018 sh r2,0x0018(r6) 001af030: 97a2007c lhu r2,0x007c(r29) 001af034: 00000000 nop 001af038: 00021100 sll r2,r2,0x04 001af03c: 02421021 addu r2,r18,r2 001af040: 94420004 lhu r2,0x0004(r2) 001af044: 3c032aaa lui r3,0x2aaa 001af048: a4c2 001a sh r2,0x001a(r6) 001af04c: 97a2007c lhu r2,0x007c(r29) 001af050: 3463aaab ori r3,r3,0xaaab 001af054: 00021100 sll r2,r2,0x04 001af058: 02421021 addu r2,r18,r2 001af05c: 8c420008 lw r2,0x0008(r2) 001af060: 00a42821 addu r5,r5,r4 001af064: 00a22821 addu r5,r5,r2 001af068: 00a30018 mult r5,r3 001af06c: 00051fc3 sra r3,r5,0x1f 001af070: 00001010 mfhi r2 001af074: 00021043 sra r2,r2,0x01 001af078: 00432823 subu r5,r2,r3 001af07c: 24a2ffff addiu r2,r5,0xffff 001af080: 2c42017e sltiu r2,r2,0x017e 001af084: 10400010 beq r2,r0,0x001af0c8 001af088: 2610001c addiu r16,r16,0x001c 001af08c: 00052080 sll r4,r5,0x02 001af090: 3c02801c lui r2,0x801c 001af094: 8c42c0cc lw r2,-0x3f34(r2) 001af098: 8cc30000 lw r3,0x0000(r6) 001af09c: 00822021 addu r4,r4,r2 001af0a0: 8c820000 lw r2,0x0000(r4) 001af0a4: 00741824 and r3,r3,r20 001af0a8: 00531024 and r2,r2,r19 001af0ac: 00621825 or r3,r3,r2 001af0b0: acc30000 sw r3,0x0000(r6) 001af0b4: 8c820000 lw r2,0x0000(r4) 001af0b8: 00d31824 and r3,r6,r19 001af0bc: 00541024 and r2,r2,r20 001af0c0: 00431025 or r2,r2,r3 001af0c4: ac820000 sw r2,0x0000(r4) 001af0c8: 0235102a slt r2,r17,r21 001af0cc: 1440ff88 bne r2,r0,0x001aeef0 001af0d0: 00000000 nop
All Return: 001af0d4: 8fbf010c lw r31,0x010c(r29) 001af0d8: 8fbe0108 lw r30,0x0108(r29) 001af0dc: 8fb70104 lw r23,0x0104(r29) 001af0e0: 8fb60100 lw r22,0x0100(r29) 001af0e4: 8fb500fc lw r21,0x00fc(r29) 001af0e8: 8fb400f8 lw r20,0x00f8(r29) 001af0ec: 8fb300f4 lw r19,0x00f4(r29) 001af0f0: 8fb200f0 lw r18,0x00f0(r29) 001af0f4: 8fb100ec lw r17,0x00ec(r29) 001af0f8: 8fb000e8 lw r16,0x00e8(r29) 001af0fc: 27bd0110 addiu r29,r29,0x0110 001af100: 03e00008 jr r31 001af104: 00000000 nop