Changes
Jump to navigation
Jump to search
no edit summary
* Opcode: '''0x14'''
* Short name: '''IFUB'''
* Long name: If (Unsigned Byte)
==== Memory layout ====
{| border="1" cellspacing="1" cellpadding="3" style="border: 1px solid black; border-collapse: collapse;"
! width="40" | 0x14
! width="40" | ''B''
! width="40" | ''A''
! width="40" | ''V''
! width="40" | ''C''
! width="40" | ''E''
|}
==== Arguments ====
* '''const UByte''' ''B'': Memory bank to access.
* '''const UByte''' ''A'': Address of the value to retrieve.
* '''const UByte''' ''V'': Unsigned value to compare the retrieved value to.
* '''const UByte''' ''C'': Type of comparison to perform.
* '''const UByte''' ''E'': Amount to jump if the comparison does not hold.
==== Description ====
Performs a comparison between a retrieved value from memory (Bank and Address), and the unsigned byte Value given in the argument list. The type of comparison used is shown in the table below. If the comparison fails, the script pointer jumps forward by the amount specified in the final argument; the starting offset for this jump is just before the jump value argument itself. This is used to implement if/else functionality in scripts, as demonstrated below.
If the content of the 'if' block following the IFUB line is longer than 0xFF, the 'else' argument will also need to be longer than 0xFF, and hence you should use [[FF7/Field/Script/Opcodes/15 IFUBL|IFUBL]] instead. If the value or address is larger than 0xFF, you should use the [[FF7/Field/Script/Opcodes/18 IFUW|IFUW]]/[[FF7/Field/Script/Opcodes/19 IFUWL|IFUWL]] variants. If the value you are comparing is negative, you should use the [[FF7/Field/Script/Opcodes/16 IFSW|IFSW]]/[[FF7/Field/Script/Opcodes/17 IFSWL|IFSWL]] variants.
==== Comparison Types ====
{| border="1" cellspacing="1" cellpadding="3" style="border: 1px solid black; border-collapse: collapse;"
! style="background:rgb(204,204,204)" width="40" | ID
! style="background:rgb(204,204,204)" width="100" | Comparison Performed
|-
| align="center" | 0
| A == B
|-
| align="center" | 1
| A != B
|-
| align="center" | 2
| A > B
|-
| align="center" | 3
| A < B
|-
| align="center" | 4
| A >= B
|-
| align="center" | 5
| A <= B
|-
| align="center" | 6
| A & B
|-
| align="center" | 7
| A ^ B
|-
| align="center" | 8
| A | B
|-
| align="center" | 9
| A & (1<<B)
|-
| align="center" | A
| !((A & (1<<B)))
|-
|}
==== If/Else Example ====
In this example, if the value found is greater than 0x30, the script halts for a shorter period of time; otherwise, the script halts for a long period of time.
<pre>
IFUB (10,20,30,02,06)
WAIT (00,01)
JMPF (04)
WAIT (00,04)
RET ()
</pre>
<cpp>
if(<10>[20] > 30)
{
WAIT(100);
}
else
{
WAIT(400);
}
return;
</cpp>
* Short name: '''IFUB'''
* Long name: If (Unsigned Byte)
==== Memory layout ====
{| border="1" cellspacing="1" cellpadding="3" style="border: 1px solid black; border-collapse: collapse;"
! width="40" | 0x14
! width="40" | ''B''
! width="40" | ''A''
! width="40" | ''V''
! width="40" | ''C''
! width="40" | ''E''
|}
==== Arguments ====
* '''const UByte''' ''B'': Memory bank to access.
* '''const UByte''' ''A'': Address of the value to retrieve.
* '''const UByte''' ''V'': Unsigned value to compare the retrieved value to.
* '''const UByte''' ''C'': Type of comparison to perform.
* '''const UByte''' ''E'': Amount to jump if the comparison does not hold.
==== Description ====
Performs a comparison between a retrieved value from memory (Bank and Address), and the unsigned byte Value given in the argument list. The type of comparison used is shown in the table below. If the comparison fails, the script pointer jumps forward by the amount specified in the final argument; the starting offset for this jump is just before the jump value argument itself. This is used to implement if/else functionality in scripts, as demonstrated below.
If the content of the 'if' block following the IFUB line is longer than 0xFF, the 'else' argument will also need to be longer than 0xFF, and hence you should use [[FF7/Field/Script/Opcodes/15 IFUBL|IFUBL]] instead. If the value or address is larger than 0xFF, you should use the [[FF7/Field/Script/Opcodes/18 IFUW|IFUW]]/[[FF7/Field/Script/Opcodes/19 IFUWL|IFUWL]] variants. If the value you are comparing is negative, you should use the [[FF7/Field/Script/Opcodes/16 IFSW|IFSW]]/[[FF7/Field/Script/Opcodes/17 IFSWL|IFSWL]] variants.
==== Comparison Types ====
{| border="1" cellspacing="1" cellpadding="3" style="border: 1px solid black; border-collapse: collapse;"
! style="background:rgb(204,204,204)" width="40" | ID
! style="background:rgb(204,204,204)" width="100" | Comparison Performed
|-
| align="center" | 0
| A == B
|-
| align="center" | 1
| A != B
|-
| align="center" | 2
| A > B
|-
| align="center" | 3
| A < B
|-
| align="center" | 4
| A >= B
|-
| align="center" | 5
| A <= B
|-
| align="center" | 6
| A & B
|-
| align="center" | 7
| A ^ B
|-
| align="center" | 8
| A | B
|-
| align="center" | 9
| A & (1<<B)
|-
| align="center" | A
| !((A & (1<<B)))
|-
|}
==== If/Else Example ====
In this example, if the value found is greater than 0x30, the script halts for a shorter period of time; otherwise, the script halts for a long period of time.
<pre>
IFUB (10,20,30,02,06)
WAIT (00,01)
JMPF (04)
WAIT (00,04)
RET ()
</pre>
<cpp>
if(<10>[20] > 30)
{
WAIT(100);
}
else
{
WAIT(400);
}
return;
</cpp>