This patch (FE8, writes data to $E90130-18F and $E901F0-213) checks if AI byte 4 is 0x20:


Incidentally, if you wanted to be evil and restrict player units’ movement you can now also do this with a simple CHAI.
And source for anyone who wants to make an FE7 port:
###Map movement to 0
MOV_Map_Hook_Start: @paste to 0x801CB70
push {r4-r6,r14}
ldr r3, Jump_to
bl GOTO_R3
b End
GOTO_R3:
bx r3
.align
Jump_to:
.long 0x08E90131
End:
MOV_Map_Hack_Start: @paste to 0x08e90130
push {lr}
mov r6, r0
mov r4, #0x1
ldr r5, CharDataPointer
ldr r0, [r5]
mov r3, #0x41
ldrb r3, [r0,r3] @Check AI byte 4
cmp r3, #0x20 @Guard Tile?
beq NoMove
ldr r1, [r0,#0x4] @else continue as normal
ldrb r1, [r1,#0x12] @mov from class data
ldrb r2, [r0,#0x1D] @mov bonus (boots)
b End
NoMove:
mov r1, #0x0
mov r2, #0x0
End:
pop {r3}
bx r3
.align
CharDataPointer:
.long 0x03004e50
###Stat screen to –
MOV_Info_Hook_Start: @paste to 0x8087300
ldr r3, Jump_to
bl GOTO_R3
b End
GOTO_R3:
bx r3
.align
Jump_to:
.long 0x08E90161
End:
MOV_Info_Hack_Start: @paste to 0x8E90160
push {lr}
ldr r1, [r5,#0xC] @r1 = char data
mov r3, #0x41
ldrb r3, [r1,r3] @AI byte 4
cmp r3, #0x20
beq NoMove
ldr r0, [r1,#0x4]
mov r3, #0x12
ldsb r3, [r0,r3] @r3 is the return value
mov r0, #0x1D
ldsb r0, [r1,r0]
b End
NoMove:
ldr r3, DisplayNegative
mov r0, #0x0
End:
pop {r1} @saves some stack manipulation by popping first
add r0,r0,r3
str r0, [sp]
bx r1
DisplayNegative:
.long 0xFFFFFFFF
###Danger Zone compatibility
@paste to 801b898 - b8aa
ldr r0, Jump_To
bl GOTO_R0
b End
GOTO_R0:
bx r0
.align
Jump_To:
.long 0x8e901f1
nop
End:
@paste to e901f0
mov r3, #0x41 @check AI
ldrb r3, [r4,r3]
cmp r3, #0x20
beq NoMove
ldr r0,[r4,#0x4]
ldrb r1, [r0,#0x12] @mov from class data
ldrb r0, [r4,#0x1D] @mov bonus (boots)
add r1,r1,r0
b End
NoMove:
mov r1, #0x0
End:
lsl r1,r1,#0x18
asr r1,r1,#0x18
mov r0,r4
ldr r3, Function
bx r3
.align
Function:
.long 0x801a3cd