1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-11-11 03:39:59 +00:00

Scene Header Command 0x0B is now OK (#147)

* Scene Header Command 0x0B is now OK

* Delete func_8009899C.s

* Updates assert check on func_8009899C

Per Roman's suggestion of placing the __assert outside of the if (1)

* Updates func_8009899C to have array access rather than pointer math

* Removes deprecated comment in func_8009899C
This commit is contained in:
Kenix3 2020-05-27 10:10:03 -04:00 committed by GitHub
parent 235b0b8e0b
commit c350eaeda5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 171 deletions

View file

@ -1,140 +0,0 @@
.rdata
glabel D_8013F594
.asciz "scene_info->object_bank.num <= OBJECT_EXCHANGE_BANK_MAX"
.balign 4
glabel D_8013F5CC
.asciz "../z_scene.c"
.balign 4
.text
glabel func_8009899C
/* B0FB3C 8009899C 27BDFFC0 */ addiu $sp, $sp, -0x40
/* B0FB40 800989A0 AFBF003C */ sw $ra, 0x3c($sp)
/* B0FB44 800989A4 AFBE0038 */ sw $fp, 0x38($sp)
/* B0FB48 800989A8 AFB70034 */ sw $s7, 0x34($sp)
/* B0FB4C 800989AC AFB60030 */ sw $s6, 0x30($sp)
/* B0FB50 800989B0 AFB5002C */ sw $s5, 0x2c($sp)
/* B0FB54 800989B4 AFB40028 */ sw $s4, 0x28($sp)
/* B0FB58 800989B8 AFB30024 */ sw $s3, 0x24($sp)
/* B0FB5C 800989BC AFB20020 */ sw $s2, 0x20($sp)
/* B0FB60 800989C0 AFB1001C */ sw $s1, 0x1c($sp)
/* B0FB64 800989C4 AFB00018 */ sw $s0, 0x18($sp)
/* B0FB68 800989C8 8CA20004 */ lw $v0, 4($a1)
/* B0FB6C 800989CC 3C198016 */ lui $t9, %hi(gSegments)
/* B0FB70 800989D0 3C0100FF */ lui $at, (0x00FFFFFF >> 16) # lui $at, 0xff
/* B0FB74 800989D4 00027100 */ sll $t6, $v0, 4
/* B0FB78 800989D8 000E7F02 */ srl $t7, $t6, 0x1c
/* B0FB7C 800989DC 000FC080 */ sll $t8, $t7, 2
/* B0FB80 800989E0 0338C821 */ addu $t9, $t9, $t8
/* B0FB84 800989E4 8F396FA8 */ lw $t9, %lo(gSegments)($t9)
/* B0FB88 800989E8 3421FFFF */ ori $at, (0x00FFFFFF & 0xFFFF) # ori $at, $at, 0xffff
/* B0FB8C 800989EC 00414024 */ and $t0, $v0, $at
/* B0FB90 800989F0 3C018000 */ lui $at, 0x8000
/* B0FB94 800989F4 03289021 */ addu $s2, $t9, $t0
/* B0FB98 800989F8 02419021 */ addu $s2, $s2, $at
/* B0FB9C 800989FC 3C010001 */ lui $at, (0x000117B0 >> 16) # lui $at, 1
/* B0FBA0 80098A00 00818021 */ addu $s0, $a0, $at
/* B0FBA4 80098A04 921117AD */ lbu $s1, 0x17ad($s0)
/* B0FBA8 80098A08 920617AC */ lbu $a2, 0x17ac($s0)
/* B0FBAC 80098A0C 342117B0 */ ori $at, (0x000117B0 & 0xFFFF) # ori $at, $at, 0x17b0
/* B0FBB0 80098A10 0011B100 */ sll $s6, $s1, 4
/* B0FBB4 80098A14 02D1B021 */ addu $s6, $s6, $s1
/* B0FBB8 80098A18 0016B080 */ sll $s6, $s6, 2
/* B0FBBC 80098A1C 00969821 */ addu $s3, $a0, $s6
/* B0FBC0 80098A20 02619821 */ addu $s3, $s3, $at
/* B0FBC4 80098A24 0226082A */ slt $at, $s1, $a2
/* B0FBC8 80098A28 0080B825 */ move $s7, $a0
/* B0FBCC 80098A2C 00A0F025 */ move $fp, $a1
/* B0FBD0 80098A30 0000A825 */ move $s5, $zero
/* B0FBD4 80098A34 10200020 */ beqz $at, .L80098AB8
/* B0FBD8 80098A38 0260A025 */ move $s4, $s3
/* B0FBDC 80098A3C 86890000 */ lh $t1, ($s4)
.L80098A40:
/* B0FBE0 80098A40 864A0000 */ lh $t2, ($s2)
/* B0FBE4 80098A44 02601025 */ move $v0, $s3
/* B0FBE8 80098A48 02201825 */ move $v1, $s1
/* B0FBEC 80098A4C 112A0011 */ beq $t1, $t2, .L80098A94
/* B0FBF0 80098A50 0226082A */ slt $at, $s1, $a2
/* B0FBF4 80098A54 10200008 */ beqz $at, .L80098A78
/* B0FBF8 80098A58 26E51C24 */ addiu $a1, $s7, 0x1c24
/* B0FBFC 80098A5C A4400000 */ sh $zero, ($v0)
.L80098A60:
/* B0FC00 80098A60 920B17AC */ lbu $t3, 0x17ac($s0)
/* B0FC04 80098A64 24630001 */ addiu $v1, $v1, 1
/* B0FC08 80098A68 24420044 */ addiu $v0, $v0, 0x44
/* B0FC0C 80098A6C 006B082A */ slt $at, $v1, $t3
/* B0FC10 80098A70 5420FFFB */ bnezl $at, .L80098A60
/* B0FC14 80098A74 A4400000 */ sh $zero, ($v0)
.L80098A78:
/* B0FC18 80098A78 3C010001 */ lui $at, 1
/* B0FC1C 80098A7C 00370821 */ addu $at, $at, $s7
/* B0FC20 80098A80 A03117AC */ sb $s1, 0x17ac($at)
/* B0FC24 80098A84 0C00C68A */ jal func_80031A28
/* B0FC28 80098A88 02E02025 */ move $a0, $s7
/* B0FC2C 80098A8C 10000007 */ b .L80098AAC
/* B0FC30 80098A90 920617AC */ lbu $a2, 0x17ac($s0)
.L80098A94:
/* B0FC34 80098A94 26310001 */ addiu $s1, $s1, 1
/* B0FC38 80098A98 26D60044 */ addiu $s6, $s6, 0x44
/* B0FC3C 80098A9C 26730044 */ addiu $s3, $s3, 0x44
/* B0FC40 80098AA0 26B50001 */ addiu $s5, $s5, 1
/* B0FC44 80098AA4 26520002 */ addiu $s2, $s2, 2
/* B0FC48 80098AA8 26940044 */ addiu $s4, $s4, 0x44
.L80098AAC:
/* B0FC4C 80098AAC 0226082A */ slt $at, $s1, $a2
/* B0FC50 80098AB0 5420FFE3 */ bnezl $at, .L80098A40
/* B0FC54 80098AB4 86890000 */ lh $t1, ($s4)
.L80098AB8:
/* B0FC58 80098AB8 93C20001 */ lbu $v0, 1($fp)
/* B0FC5C 80098ABC 3C048014 */ lui $a0, %hi(D_8013F594) # $a0, 0x8014
/* B0FC60 80098AC0 2484F594 */ addiu $a0, %lo(D_8013F594) # addiu $a0, $a0, -0xa6c
/* B0FC64 80098AC4 28410014 */ slti $at, $v0, 0x14
/* B0FC68 80098AC8 14200005 */ bnez $at, .L80098AE0
/* B0FC6C 80098ACC 3C058014 */ lui $a1, %hi(D_8013F5CC) # $a1, 0x8014
/* B0FC70 80098AD0 24A5F5CC */ addiu $a1, %lo(D_8013F5CC) # addiu $a1, $a1, -0xa34
/* B0FC74 80098AD4 0C0007FC */ jal __assert
/* B0FC78 80098AD8 240602C1 */ li $a2, 705
/* B0FC7C 80098ADC 93C20001 */ lbu $v0, 1($fp)
.L80098AE0:
/* B0FC80 80098AE0 02A2082A */ slt $at, $s5, $v0
/* B0FC84 80098AE4 10200014 */ beqz $at, .L80098B38
/* B0FC88 80098AE8 3C010001 */ lui $at, (0x000117A4 >> 16) # lui $at, 1
/* B0FC8C 80098AEC 342117A4 */ ori $at, (0x000117A4 & 0xFFFF) # ori $at, $at, 0x17a4
/* B0FC90 80098AF0 02E18021 */ addu $s0, $s7, $at
.L80098AF4:
/* B0FC94 80098AF4 02002025 */ move $a0, $s0
/* B0FC98 80098AF8 02202825 */ move $a1, $s1
/* B0FC9C 80098AFC 0C0260BF */ jal func_800982FC
/* B0FCA0 80098B00 86460000 */ lh $a2, ($s2)
/* B0FCA4 80098B04 2A210012 */ slti $at, $s1, 0x12
/* B0FCA8 80098B08 10200005 */ beqz $at, .L80098B20
/* B0FCAC 80098B0C 26310001 */ addiu $s1, $s1, 1
/* B0FCB0 80098B10 02F66021 */ addu $t4, $s7, $s6
/* B0FCB4 80098B14 3C010001 */ lui $at, 1
/* B0FCB8 80098B18 002C0821 */ addu $at, $at, $t4
/* B0FCBC 80098B1C AC2217F8 */ sw $v0, 0x17f8($at)
.L80098B20:
/* B0FCC0 80098B20 93CD0001 */ lbu $t5, 1($fp)
/* B0FCC4 80098B24 26B50001 */ addiu $s5, $s5, 1
/* B0FCC8 80098B28 26D60044 */ addiu $s6, $s6, 0x44
/* B0FCCC 80098B2C 02AD082A */ slt $at, $s5, $t5
/* B0FCD0 80098B30 1420FFF0 */ bnez $at, .L80098AF4
/* B0FCD4 80098B34 26520002 */ addiu $s2, $s2, 2
.L80098B38:
/* B0FCD8 80098B38 3C010001 */ lui $at, 1
/* B0FCDC 80098B3C 00370821 */ addu $at, $at, $s7
/* B0FCE0 80098B40 A03117AC */ sb $s1, 0x17ac($at)
/* B0FCE4 80098B44 8FBF003C */ lw $ra, 0x3c($sp)
/* B0FCE8 80098B48 8FBE0038 */ lw $fp, 0x38($sp)
/* B0FCEC 80098B4C 8FB70034 */ lw $s7, 0x34($sp)
/* B0FCF0 80098B50 8FB60030 */ lw $s6, 0x30($sp)
/* B0FCF4 80098B54 8FB5002C */ lw $s5, 0x2c($sp)
/* B0FCF8 80098B58 8FB40028 */ lw $s4, 0x28($sp)
/* B0FCFC 80098B5C 8FB30024 */ lw $s3, 0x24($sp)
/* B0FD00 80098B60 8FB20020 */ lw $s2, 0x20($sp)
/* B0FD04 80098B64 8FB1001C */ lw $s1, 0x1c($sp)
/* B0FD08 80098B68 8FB00018 */ lw $s0, 0x18($sp)
/* B0FD0C 80098B6C 03E00008 */ jr $ra
/* B0FD10 80098B70 27BD0040 */ addiu $sp, $sp, 0x40

View file

@ -279,59 +279,57 @@ void func_80098958(GlobalContext* globalCtx, SceneCmd* cmd) {
} }
// Scene Command 0x0B: Object List // Scene Command 0x0B: Object List
#ifdef NON_MATCHING
// this function still needs some work but it should be functionally equivalent
void func_8009899C(GlobalContext* globalCtx, SceneCmd* cmd) { void func_8009899C(GlobalContext* globalCtx, SceneCmd* cmd) {
s32 i, j, k; s32 i, j, k;
s16* objectEntry;
ObjectStatus* status; ObjectStatus* status;
ObjectStatus* status2; ObjectStatus* status2;
ObjectStatus* status3; ObjectStatus* firstStatus;
s16* objectEntry;
void* nextPtr; void* nextPtr;
objectEntry = SEGMENTED_TO_VIRTUAL(cmd->objectList.segment); objectEntry = SEGMENTED_TO_VIRTUAL(cmd->objectList.segment);
status2 = &globalCtx->objectCtx.status[globalCtx->objectCtx.unk_09];
k = 0; k = 0;
status = status2;
i = globalCtx->objectCtx.unk_09; i = globalCtx->objectCtx.unk_09;
firstStatus = &globalCtx->objectCtx.status[0];
status = &globalCtx->objectCtx.status[i];
while (i < globalCtx->objectCtx.num) { while (i < globalCtx->objectCtx.num) {
if (status->id != *objectEntry) { if (status->id != *objectEntry) {
status3 = status2; status2 = &globalCtx->objectCtx.status[i];
for (j = i; j < globalCtx->objectCtx.num; j++) { for (j = i; j < globalCtx->objectCtx.num; j++) {
status3->id = 0; status2->id = 0;
status3++; status2++;
} }
globalCtx->objectCtx.num = i; globalCtx->objectCtx.num = i;
func_80031A28(globalCtx, &globalCtx->actorCtx); func_80031A28(globalCtx, &globalCtx->actorCtx);
} else {
continue;
}
i++; i++;
status++;
k++; k++;
objectEntry++; objectEntry++;
status2++; status++;
}
} }
if (cmd->objectList.num > OBJECT_EXCHANGE_BANK_MAX) { if (cmd->objectList.num > OBJECT_EXCHANGE_BANK_MAX) {
__assert("scene_info->object_bank.num <= OBJECT_EXCHANGE_BANK_MAX", "../z_scene.c", 705); __assert("scene_info->object_bank.num <= OBJECT_EXCHANGE_BANK_MAX", "../z_scene.c", 705);
} }
if (1) {}
while (k < cmd->objectList.num) { while (k < cmd->objectList.num) {
nextPtr = func_800982FC(&globalCtx->objectCtx, i, *objectEntry); nextPtr = func_800982FC(&globalCtx->objectCtx, i, *objectEntry);
if (i < OBJECT_EXCHANGE_BANK_MAX - 1) { if (i < OBJECT_EXCHANGE_BANK_MAX - 1) {
globalCtx->objectCtx.status[i + 1].segment = nextPtr; firstStatus[i + 1].segment = nextPtr;
} }
i++;
k++; k++;
objectEntry++; objectEntry++;
status++;
} }
globalCtx->objectCtx.num = k; globalCtx->objectCtx.num = i;
} }
#else
void func_8009899C(GlobalContext* globalCtx, SceneCmd* cmd);
#pragma GLOBAL_ASM("asm/non_matchings/code/z_scene/func_8009899C.s")
#endif
// Scene Command 0x0C: Light List // Scene Command 0x0C: Light List
void func_80098B74(GlobalContext* globalCtx, SceneCmd* cmd) { void func_80098B74(GlobalContext* globalCtx, SceneCmd* cmd) {