Attempt to decompile hudmsgCreate

This commit is contained in:
Ryan Dwyer 2020-03-18 17:10:09 +10:00
parent 29a6e491e2
commit 60956138be
12 changed files with 225 additions and 157 deletions

View File

@ -6953,7 +6953,7 @@ s32 g_ScreenSize = SCREENSIZE_FULL;
s32 g_ScreenRatio = SCREENRATIO_NORMAL;
u8 g_ScreenSplit = SCREENSPLIT_HORIZONTAL;
u32 var8007fabc = 0x00000000;
u32 var8007fac0 = 0x00000001;
s32 var8007fac0 = 0x00000001;
u32 var8007fac4 = 0x00000000;
u32 var8007fac8 = 0x00000000;
u32 var8007facc = 0x00000000;

View File

@ -12115,7 +12115,7 @@ void currentPlayerDieByShooter(u32 shooter, bool force)
func0f0f8120();
g_MpPlayerNum = prevplayernum;
hudmsgRemoveByPlayer(g_Vars.currentplayernum);
hudmsgRemoveForDeadPlayer(g_Vars.currentplayernum);
if (g_Vars.mplayerisrunning) {
func0f0b09f4(shooter, g_Vars.currentplayernum);

View File

@ -1068,8 +1068,8 @@ void func0f0ddd44(s32 value)
s32 i;
for (i = 0; i < g_NumHudMessages; i++) {
if (g_HudMessages[i].active && g_HudMessages[i].unk1b0 == value) {
g_HudMessages[i].flags |= HUDMSGFLAG_00000002;
if (g_HudMessages[i].state && g_HudMessages[i].unk1b0 == value) {
g_HudMessages[i].flags |= HUDMSGFLAG_2;
break;
}
}
@ -1083,10 +1083,10 @@ void hudmsgSystemInit(void)
g_HudMessages = malloc((sizeof(struct hudmessage) * g_NumHudMessages + 0x3f | 0x3f) ^ 0x3f, 4);
for (i = 0; i < g_NumHudMessages; i++) {
g_HudMessages[i].active = false;
g_HudMessages[i].state = HUDMSGSTATE_FREE;
}
var8009dea0 = 0;
g_NextHudMessageId = 0;
}
void hudmsgRemoveAll(void)
@ -1094,22 +1094,22 @@ void hudmsgRemoveAll(void)
s32 i;
for (i = 0; i < g_NumHudMessages; i++) {
g_HudMessages[i].active = false;
g_HudMessages[i].state = HUDMSGSTATE_FREE;
}
}
s32 func0f0ddeac(s32 arg0)
s32 hudmsgGetNext(s32 refid)
{
s32 bestvalue = -1;
s32 bestid = -1;
s32 bestindex = -1;
s32 i;
// Finding the smallest unk1b8 that is greater than arg0
// Finding the smallest ID that is greater than refid
for (i = 0; i < g_NumHudMessages; i++) {
if (g_HudMessages[i].active && g_HudMessages[i].unk1b8 > arg0) {
if (bestvalue < 0 || g_HudMessages[i].unk1b8 < bestvalue) {
if (g_HudMessages[i].state && g_HudMessages[i].id > refid) {
if (bestid < 0 || g_HudMessages[i].id < bestid) {
bestindex = i;
bestvalue = g_HudMessages[i].unk1b8;
bestid = g_HudMessages[i].id;
}
}
}
@ -2280,7 +2280,7 @@ glabel hudmsgCreate
.L0f0df03c:
/* f0df03c: 2404ffff */ addiu $a0,$zero,-1
.L0f0df040:
/* f0df040: 0fc377ab */ jal func0f0ddeac
/* f0df040: 0fc377ab */ jal hudmsgGetNext
/* f0df044: afa901ec */ sw $t1,0x1ec($sp)
/* f0df048: 8fa901ec */ lw $t1,0x1ec($sp)
/* f0df04c: 0440001d */ bltz $v0,.L0f0df0c4
@ -2310,7 +2310,7 @@ glabel hudmsgCreate
/* f0df0a4: 00007812 */ mflo $t7
/* f0df0a8: 00afc821 */ addu $t9,$a1,$t7
/* f0df0ac: 8f2401b8 */ lw $a0,0x1b8($t9)
/* f0df0b0: 0fc377ab */ jal func0f0ddeac
/* f0df0b0: 0fc377ab */ jal hudmsgGetNext
/* f0df0b4: afa901ec */ sw $t1,0x1ec($sp)
/* f0df0b8: 8fa901ec */ lw $t1,0x1ec($sp)
/* f0df0bc: 0441ffe7 */ bgez $v0,.L0f0df05c
@ -2409,17 +2409,17 @@ glabel hudmsgCreate
/* f0df21c: 8fa901ec */ lw $t1,0x1ec($sp)
.L0f0df220:
/* f0df220: 2406018f */ addiu $a2,$zero,0x18f
/* f0df224: 0c004c72 */ jal func000131c8
/* f0df224: 0c004c72 */ jal strncpy
/* f0df228: afa901ec */ sw $t1,0x1ec($sp)
/* f0df22c: 8fa901ec */ lw $t1,0x1ec($sp)
/* f0df230: a22001af */ sb $zero,0x1af($s1)
.L0f0df234:
/* f0df234: 8fae0230 */ lw $t6,0x230($sp)
/* f0df238: 3c18800a */ lui $t8,%hi(g_Vars+0x28c)
/* f0df23c: 3c02800a */ lui $v0,%hi(var8009dea0)
/* f0df23c: 3c02800a */ lui $v0,%hi(g_NextHudMessageId)
/* f0df240: ae2e01c4 */ sw $t6,0x1c4($s1)
/* f0df244: 8f18a24c */ lw $t8,%lo(g_Vars+0x28c)($t8)
/* f0df248: 2442dea0 */ addiu $v0,$v0,%lo(var8009dea0)
/* f0df248: 2442dea0 */ addiu $v0,$v0,%lo(g_NextHudMessageId)
/* f0df24c: 240c0001 */ addiu $t4,$zero,0x1
/* f0df250: ae3801c0 */ sw $t8,0x1c0($s1)
/* f0df254: 8faf01fc */ lw $t7,0x1fc($sp)
@ -2495,6 +2495,151 @@ glabel hudmsgCreate
/* f0df360: 27bd01f8 */ addiu $sp,$sp,0x1f8
);
// Mismatch due to regalloc in duplicate check near:
// g_HudMessages[index].playernum == g_Vars.currentplayernum
//void hudmsgCreate(char *text, s32 type, s32 conf00, s32 conf01, s32 conf02,
// struct hudmessagething *conf04, struct hudmessagething *conf08,
// u32 textcolour, u32 shadowcolour,
// u32 alignh, s32 conf16, u32 alignv, s32 conf18, s32 arg14, u32 flags)
//{
// char *pos;
// struct hudmessage *msg;
// s32 hash = 0;
// s32 i;
// s32 index;
// s32 uStack24;
// u32 uStack28;
// u32 uStack32;
// s32 iStack36;
// char stacktext[400];
// s32 writeindex;
//
// if (type == HUDMSGTYPE_SUBTITLE && !optionsGetInGameSubtitles()) {
// return;
// }
//
// pos = text;
//
// while (*pos) {
// hash = hash + *pos;
// pos++;
// }
//
// if ((flags & HUDMSGFLAG_ONLYIFALIVE) == 0 || !g_Vars.currentplayer->isdead) {
// if ((flags & HUDMSGFLAG_ALLOWDUPES) == 0) {
// // Check for duplicate messages
// s32 dupeofindex = -1;
//
// for (index = 0; index < g_NumHudMessages; index++) {
// if (g_HudMessages[index].state
// && g_HudMessages[index].state != HUDMSGSTATE_ONSCREEN
// && g_HudMessages[index].playernum == g_Vars.currentplayernum
// && g_HudMessages[index].hash == hash) {
// dupeofindex = index;
// }
// }
//
// if (dupeofindex >= 0) {
// return;
// }
// }
//
// var8007fac0 = var800706c8 == 1 ? 2 : 1;
//
// // Find an unused index for the new message
// for (index = 0; index < g_NumHudMessages; index++) {
// if (g_HudMessages[index].state == HUDMSGSTATE_FREE) {
// break;
// }
// }
//
// if (index >= g_NumHudMessages
// && (type == HUDMSGTYPE_OBJECTIVECOMPLETE
// || type == HUDMSGTYPE_OBJECTIVEFAILED
// || type == HUDMSGTYPE_SUBTITLE)) {
// // Out of space - Check if an existing message can be replaced
// index = hudmsgGetNext(-1);
//
// while (index >= 0) {
// if (g_HudMessages[index].state == HUDMSGSTATE_QUEUED) {
// if (g_HudMessages[index].type == HUDMSGTYPE_DEFAULT
// || g_HudMessages[index].type == HUDMSGTYPE_3
// || g_HudMessages[index].type == HUDMSGTYPE_4) {
// // Good to replace this one
// break;
// }
// }
//
// // Can't replace - try and find another
// index = hudmsgGetNext(g_HudMessages[index].id);
// }
// }
//
// if (index >= 0 && index < g_NumHudMessages) {
// uStack32 = 0;
// msg = &g_HudMessages[index];
// iStack36 = func0f0ddb1c(&uStack32, conf16);
// func0f1572f8(&uStack28, &uStack24, text, conf04->unk00, conf08->unk00, 0);
//
// if (iStack36 < uStack24) {
// i = 0;
// writeindex = 0;
//
// while (i < 400 && text[i] != '\0') {
// if (text[i] != '\n') {
// stacktext[writeindex++] = text[i];
// }
//
// i++;
// }
//
// stacktext[writeindex++] = '\n';
// stacktext[writeindex++] = '\0';
//
// func0f157520(iStack36, stacktext, msg->text, conf04->unk00, conf08->unk00);
// func0f1572f8(&uStack28, &uStack24, msg->text, conf04->unk00, conf08->unk00, 0);
// } else {
// strncpy(msg->text, text, 399);
// msg->text[399] = '\0';
// }
//
// msg->flags = flags;
// msg->playernum = g_Vars.currentplayernum;
// msg->type = type;
// msg->id = g_NextHudMessageId++;
// msg->state = HUDMSGSTATE_QUEUED;
// msg->unk006 = 0;
// msg->unk001 = conf00;
// msg->unk002 = conf01;
// msg->unk003 = conf02;
// msg->unk008 = conf04->unk00;
// msg->unk00c = conf08->unk00;
// msg->textcolour = textcolour;
// msg->shadowcolour = shadowcolour;
// msg->alignh = alignh;
// msg->alignv = alignv;
// msg->unk01c = uStack24;
// msg->unk01e = uStack28;
// msg->unk1cc = uStack32;
// msg->unk1d0 = conf16;
// msg->unk1d4 = conf18;
// msg->hash = hash;
//
// func0f0de7fc(msg);
//
// if (flags & HUDMSGFLAG_4) {
// msg->unk1bc = arg14;
// msg->unk1b0 = -1;
// } else {
// msg->unk1bc = g_HudMessageConfigs[type].duration;
// msg->unk1b0 = arg14;
// }
// }
//
// var8007fac0 = 1;
// }
//}
GLOBAL_ASM(
glabel func0f0df364
.late_rodata
@ -2606,7 +2751,7 @@ glabel var7f1aded8
/* f0df4b0: 24150004 */ addiu $s5,$zero,0x4
/* f0df4b4: 2414000b */ addiu $s4,$zero,0xb
.L0f0df4b8:
/* f0df4b8: 0fc377ab */ jal func0f0ddeac
/* f0df4b8: 0fc377ab */ jal hudmsgGetNext
/* f0df4bc: 00000000 */ sll $zero,$zero,0x0
/* f0df4c0: 0440014a */ bltz $v0,.L0f0df9ec
/* f0df4c4: 240a00ff */ addiu $t2,$zero,0xff
@ -2988,15 +3133,15 @@ void currentPlayerSetFlag(u32 flag)
g_Vars.currentplayer->flags |= flag;
}
void hudmsgRemoveByPlayer(s32 playernum)
void hudmsgRemoveForDeadPlayer(s32 playernum)
{
s32 i;
for (i = 0; i < g_NumHudMessages; i++) {
if (g_HudMessages[i].active
if (g_HudMessages[i].state
&& g_HudMessages[i].playernum == playernum
&& (g_HudMessages[i].flags & HUDMSGFLAG_00000001)) {
g_HudMessages[i].active = false;
&& (g_HudMessages[i].flags & HUDMSGFLAG_ONLYIFALIVE)) {
g_HudMessages[i].state = HUDMSGSTATE_FREE;
g_HudMessages[i].unk006 = 0;
}
}
@ -3865,6 +4010,6 @@ void hudmsgsReset(void)
s32 i;
for (i = 0; i < g_NumHudMessages; i++) {
g_HudMessages[i].active = false;
g_HudMessages[i].state = HUDMSGSTATE_FREE;
}
}

View File

@ -16104,7 +16104,7 @@ u32 var8009de90 = 0;
u32 var8009de94 = 0;
u32 var8009de98 = 0;
u32 var8009de9c = 0;
u32 var8009dea0 = 0;
u32 g_NextHudMessageId = 0;
u32 var8009dea4 = 0;
u32 var8009dea8 = 0;
u32 var8009deac = 0;

View File

@ -558,8 +558,21 @@
#define GAILIST_INIT_SEARCH 0x002c // unused
#define GAILIST_INVINCIBLE_AND_IDLE 0x002d
#define HUDMSGFLAG_00000001 0x00000001
#define HUDMSGFLAG_00000002 0x00000002
#define HUDMSGFLAG_ONLYIFALIVE 0x1
#define HUDMSGFLAG_2 0x2
#define HUDMSGFLAG_4 0x4
#define HUDMSGFLAG_ALLOWDUPES 0x8
#define HUDMSGSTATE_FREE 0
#define HUDMSGSTATE_QUEUED 1
#define HUDMSGSTATE_ONSCREEN 5
#define HUDMSGTYPE_DEFAULT 0
#define HUDMSGTYPE_OBJECTIVECOMPLETE 1
#define HUDMSGTYPE_OBJECTIVEFAILED 2
#define HUDMSGTYPE_3 3
#define HUDMSGTYPE_4 4
#define HUDMSGTYPE_SUBTITLE 6
#define IDLEACTION_STANDING 0x01
#define IDLEACTION_SITTING_TYPING 0x02

View File

@ -152,7 +152,7 @@ extern u8 g_CutsceneSubtitles;
extern s32 g_ScreenSize;
extern s32 g_ScreenRatio;
extern u8 g_ScreenSplit;
extern u32 var8007fac0;
extern s32 var8007fac0;
extern u32 var8007fac4;
extern u32 var8007facc;
extern u32 var8007fad0;

View File

@ -8,24 +8,25 @@ s32 func0f0dcdbc(void);
u32 func0f0dcef4(void);
u32 func0f0dd2ac(void);
u32 func0f0dd848(void);
u32 func0f0ddb1c(void);
s32 func0f0ddb1c(u32 *arg0, u32 arg1);
void func0f0ddd44(s32 value);
void hudmsgSystemInit(void);
void hudmsgRemoveAll(void);
s32 func0f0ddeac(s32 param_1);
void hudmsgCreateViaPreset(char *text, s32 confignum);
void func0f0ddfa4(char *text, s32 confignum, s32 arg2);
void hudmsgCreateViaPresetWithColour(char *text, s32 confignum, u8 colour);
void hudmsgCreateViaStruct(char *text, s32 confignum, struct hudmessageconfig *config, s32 arg3);
s32 hudmsgGetNext(s32 refid);
void hudmsgCreateViaPreset(char *text, s32 type);
void func0f0ddfa4(char *text, s32 type, s32 arg2);
void hudmsgCreateViaPresetWithColour(char *text, s32 type, u8 colour);
void hudmsgCreateViaStruct(char *text, s32 type, struct hudmessageconfig *config, s32 arg3);
u32 func0f0de160(void);
u32 func0f0de7fc(void);
u32 hudmsgCreate(char *text, s32 confignum, u8 conf00, u8 conf01, u8 conf02,
void *conf04, void *conf08, u32 colour, u32 conf10, u8 alignh, s16 conf16,
u8 alignv, s16 conf18, s32 arg14, s32 arg15);
void func0f0de7fc(struct hudmessage *msg);
void hudmsgCreate(char *text, s32 type, s32 conf00, s32 conf01, s32 conf02,
struct hudmessagething *conf04, struct hudmessagething *conf08,
u32 textcolour, u32 shadowcolour,
u32 alignh, s32 conf16, u32 alignv, s32 conf18, s32 arg14, u32 flags);
void func0f0df364(void);
void currentPlayerUnsetFlag(u32 flag);
void currentPlayerSetFlag(u32 flag);
void hudmsgRemoveByPlayer(s32 playernum);
void hudmsgRemoveForDeadPlayer(s32 playernum);
u32 func0f0dfad0(void);
void hudmsgsReset(void);

View File

@ -44,7 +44,7 @@ u32 func0f156790(void);
u32 func0f156a24(void);
u32 func0f156e48(void);
void func0f1572f8(u32 *arg0, s32 *arg1, char *label, u32 arg3, u32 arg4, u32 arg5);
u32 func0f157520(void);
void func0f157520(s32 arg0, char *arg1, char *arg2, u32 arg3, u32 arg4);
u32 func0f1577f0(void);
u32 func0f1578c8(void);
u32 func0f1579cc(void);

View File

@ -627,7 +627,7 @@ extern s32 g_NumSpawnPoints;
extern u32 var8009de78;
extern u32 var8009de98;
extern u32 var8009de9c;
extern u32 var8009dea0;
extern u32 g_NextHudMessageId;
extern u32 var8009deb0;
extern char g_CheatMarqueeString[];
extern u32 var8009dfbc;

View File

@ -4,7 +4,7 @@
#include "types.h"
char *strcpy(char *dest, char *src);
u32 func000131c8(void);
char *strncpy(char *dest, char *src, u32 len);
u32 strcat(char *dst, char *src);
u32 func00013274(void);
u32 func00013274(void);

View File

@ -5257,12 +5257,16 @@ struct mpteaminfo {
s32 score;
};
struct hudmessagething {
s32 unk00;
};
struct hudmessageconfig {
/*0x00*/ u8 unk00;
/*0x01*/ u8 unk01;
/*0x02*/ u8 unk02;
/*0x04*/ void *unk04;
/*0x08*/ void *unk08;
/*0x04*/ struct hudmessagething *unk04;
/*0x08*/ struct hudmessagething *unk08;
/*0x0c*/ u32 colour;
/*0x10*/ u32 unk10;
/*0x14*/ u8 alignh;
@ -5273,127 +5277,32 @@ struct hudmessageconfig {
};
struct hudmessage {
/*0x000*/ u8 active;
/*0x002*/ u16 unk002;
/*0x000*/ u8 state;
/*0x001*/ u8 unk001;
/*0x002*/ u8 unk002;
/*0x003*/ u8 unk003;
/*0x004*/ u16 unk004;
/*0x006*/ u16 unk006;
/*0x008*/ u32 unk008;
/*0x00c*/ u32 unk00c;
/*0x010*/ u32 unk010;
/*0x014*/ u32 unk014;
/*0x010*/ u32 textcolour;
/*0x014*/ u32 shadowcolour;
/*0x018*/ u32 unk018;
/*0x01c*/ u32 unk01c;
/*0x020*/ u32 unk020;
/*0x024*/ u32 unk024;
/*0x028*/ u32 unk028;
/*0x02c*/ u32 unk02c;
/*0x030*/ u32 unk030;
/*0x034*/ u32 unk034;
/*0x038*/ u32 unk038;
/*0x03c*/ u32 unk03c;
/*0x040*/ u32 unk040;
/*0x044*/ u32 unk044;
/*0x048*/ u32 unk048;
/*0x04c*/ u32 unk04c;
/*0x050*/ u32 unk050;
/*0x054*/ u32 unk054;
/*0x058*/ u32 unk058;
/*0x05c*/ u32 unk05c;
/*0x060*/ u32 unk060;
/*0x064*/ u32 unk064;
/*0x068*/ u32 unk068;
/*0x06c*/ u32 unk06c;
/*0x070*/ u32 unk070;
/*0x074*/ u32 unk074;
/*0x078*/ u32 unk078;
/*0x07c*/ u32 unk07c;
/*0x080*/ u32 unk080;
/*0x084*/ u32 unk084;
/*0x088*/ u32 unk088;
/*0x08c*/ u32 unk08c;
/*0x090*/ u32 unk090;
/*0x094*/ u32 unk094;
/*0x098*/ u32 unk098;
/*0x09c*/ u32 unk09c;
/*0x0a0*/ u32 unk0a0;
/*0x0a4*/ u32 unk0a4;
/*0x0a8*/ u32 unk0a8;
/*0x0ac*/ u32 unk0ac;
/*0x0b0*/ u32 unk0b0;
/*0x0b4*/ u32 unk0b4;
/*0x0b8*/ u32 unk0b8;
/*0x0bc*/ u32 unk0bc;
/*0x0c0*/ u32 unk0c0;
/*0x0c4*/ u32 unk0c4;
/*0x0c8*/ u32 unk0c8;
/*0x0cc*/ u32 unk0cc;
/*0x0d0*/ u32 unk0d0;
/*0x0d4*/ u32 unk0d4;
/*0x0d8*/ u32 unk0d8;
/*0x0dc*/ u32 unk0dc;
/*0x0e0*/ u32 unk0e0;
/*0x0e4*/ u32 unk0e4;
/*0x0e8*/ u32 unk0e8;
/*0x0ec*/ u32 unk0ec;
/*0x0f0*/ u32 unk0f0;
/*0x0f4*/ u32 unk0f4;
/*0x0f8*/ u32 unk0f8;
/*0x0fc*/ u32 unk0fc;
/*0x100*/ u32 unk100;
/*0x104*/ u32 unk104;
/*0x108*/ u32 unk108;
/*0x10c*/ u32 unk10c;
/*0x110*/ u32 unk110;
/*0x114*/ u32 unk114;
/*0x118*/ u32 unk118;
/*0x11c*/ u32 unk11c;
/*0x120*/ u32 unk120;
/*0x124*/ u32 unk124;
/*0x128*/ u32 unk128;
/*0x12c*/ u32 unk12c;
/*0x130*/ u32 unk130;
/*0x134*/ u32 unk134;
/*0x138*/ u32 unk138;
/*0x13c*/ u32 unk13c;
/*0x140*/ u32 unk140;
/*0x144*/ u32 unk144;
/*0x148*/ u32 unk148;
/*0x14c*/ u32 unk14c;
/*0x150*/ u32 unk150;
/*0x154*/ u32 unk154;
/*0x158*/ u32 unk158;
/*0x15c*/ u32 unk15c;
/*0x160*/ u32 unk160;
/*0x164*/ u32 unk164;
/*0x168*/ u32 unk168;
/*0x16c*/ u32 unk16c;
/*0x170*/ u32 unk170;
/*0x174*/ u32 unk174;
/*0x178*/ u32 unk178;
/*0x17c*/ u32 unk17c;
/*0x180*/ u32 unk180;
/*0x184*/ u32 unk184;
/*0x188*/ u32 unk188;
/*0x18c*/ u32 unk18c;
/*0x190*/ u32 unk190;
/*0x194*/ u32 unk194;
/*0x198*/ u32 unk198;
/*0x19c*/ u32 unk19c;
/*0x1a0*/ u32 unk1a0;
/*0x1a4*/ u32 unk1a4;
/*0x1a8*/ u32 unk1a8;
/*0x1ac*/ u32 unk1ac;
/*0x1b0*/ u32 unk1b0;
/*0x1b4*/ u32 unk1b4;
/*0x1b8*/ s32 unk1b8;
/*0x1bc*/ u32 unk1bc;
/*0x1c0*/ u32 playernum;
/*0x01c*/ u16 unk01c;
/*0x01e*/ u16 unk01e;
/*0x020*/ char text[400];
/*0x1b0*/ s32 unk1b0;
/*0x1b4*/ u32 type;
/*0x1b8*/ s32 id;
/*0x1bc*/ u32 unk1bc; // duration
/*0x1c0*/ s32 playernum;
/*0x1c4*/ u32 flags;
/*0x1c8*/ u32 unk1c8;
/*0x1c8*/ u8 alignh;
/*0x1c9*/ u8 alignv;
/*0x1cc*/ u32 unk1cc;
/*0x1d0*/ u32 unk1d0;
/*0x1d4*/ u32 unk1d4;
/*0x1d8*/ u32 unk1d8;
/*0x1d8*/ u32 hash;
};
#endif

View File

@ -67,7 +67,7 @@ glabel strcpy
);
GLOBAL_ASM(
glabel func000131c8
glabel strncpy
/* 131c8: 90a20000 */ lbu $v0,0x0($a1)
/* 131cc: 24830001 */ addiu $v1,$a0,0x1
/* 131d0: 24a50001 */ addiu $a1,$a1,0x1