NAME=avr DISasm: [0e940b10 => 0x00002016] (ANAL)
FILE=malloc://4096
EXPECT=<<EOF
0x00002016
EOF
CMDS=<<EOF
e asm.arch=avr
wx 0e940b10 @ 0x2d0
s 0x2d0
ao 1~^jump[1]
EOF
RUN

NAME=avr DISasm: [0e940b10 => call] - jump check
FILE=malloc://4096
EXPECT=<<EOF
jump: 0x00002016
EOF
CMDS=<<EOF
e asm.arch=avr
s 0x2d0
wx 0e940b10
ao 1~jump
EOF
RUN

NAME=avr DISasm: [sts] - jump check
FILE=malloc://4096
EXPECT=<<EOF
EOF
CMDS=<<EOF
e asm.arch=avr
s 0x2d0
wx 9093c007
ao 1~jump
EOF
RUN

NAME=avr DISasm: negative baddr
FILE=../../bins/elf/analysis/bugurtos-avr.elf
BROKEN=1
EXPECT=<<EOF
call 0x18CE
call 0x18CE
EOF
CMDS=<<EOF
s 0x506
pd 2~!1
s+2
pd 1
EOF
RUN

NAME=avr DISasm: opcode size
FILE=-
EXPECT=<<EOF
4
EOF
CMDS=<<EOF
e asm.arch=avr
wx 0e941122
ao~size[1]
EOF
RUN

NAME=avr DISasm: IO-Ports
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
1
EOF
CMDS=<<EOF
pd 1 @ 0x00000170~?IO
EOF
RUN

NAME=avr br - forward branch
FILE=malloc://1024
EXPECT=<<EOF
breq 0x150
0x00000150
EOF
CMDS=<<EOF
wx 61f0 @ 0x136
e asm.arch=avr
e asm.cpu=ATmega8
pi 1 @ 0x136
ao 1 @ 0x136 ~^jump[1]
EOF
RUN

NAME=avr br - backward branch
FILE=malloc://1024
EXPECT=<<EOF
0x00000144
EOF
CMDS=<<EOF
wx e1f7 @ 0x14a
e asm.arch=avr
e asm.cpu=ATmega8
ao 1 @ 0x14a ~^jump[1]
EOF
RUN

NAME=avr br - backward branch 2
FILE=malloc://1024
EXPECT=<<EOF
0x00000130
EOF
CMDS=<<EOF
wx f0cf @ 0x14e
e asm.arch=avr
e asm.cpu=ATmega8
s 0x14e
ao 1 @ 0x14e ~^jump[1]
EOF
RUN

NAME=avr jmp - absolute jump
FILE=malloc://1024
EXPECT=<<EOF
0x00006824
EOF
CMDS=<<EOF
wx 0c941234 @ 0x15e
e asm.arch=avr
e asm.cpu=ATmega8
ao 1 @ 0x15e~^jump[1]
EOF
RUN

NAME=avr rjmp - relative jump backward at 0x1000
FILE=malloc://8192
EXPECT=<<EOF
0x1000 2,pc,=
0x1002 6,pc,=
0x1004 258,pc,=
0x1006 262,pc,=
rjmp 0x2
rjmp 0x6
rjmp 0x102
rjmp 0x106
EOF
ARGS=-s 0x1000 -a avr
CMDS=<<EOF
e asm.cpu=ATmega1280
wx 00c8 01c8 7ec8 7fc8 80c8 81c8
aoe 4
pi 4
EOF
RUN

NAME=avr rjmp - relative jump backward - at 0
FILE=malloc://8192
EXPECT=<<EOF
0x0 61442,pc,=
0x2 61446,pc,=
0x4 61698,pc,=
0x6 61702,pc,=
rjmp 0xfffff002
rjmp 0xfffff006
rjmp 0xfffff102
rjmp 0xfffff106
EOF
ARGS=-a avr
CMDS=<<EOF
e asm.cpu=ATmega1280
wx 00c8 01c8 7ec8 7fc8 80c8 81c8
aoe 4
pi 4
EOF
RUN

NAME=avr rjmp - relative jump forward
FILE=malloc://8192
EXPECT=<<EOF
0x0 2,pc,=
0x2 6,pc,=
0x4 10,pc,=
0x6 14,pc,=
0x8 262,pc,=
0xa 266,pc,=
0xc 270,pc,=
0xe 274,pc,=
0x10 526,pc,=
0x12 530,pc,=
0x14 534,pc,=
0x16 538,pc,=
0x18 790,pc,=
0x1a 794,pc,=
0x1c 798,pc,=
0x1e 802,pc,=
0x20 1054,pc,=
0x22 1058,pc,=
0x24 1062,pc,=
0x26 1066,pc,=
0x28 1318,pc,=
0x2a 1322,pc,=
0x2c 1326,pc,=
0x2e 1330,pc,=
0x30 1582,pc,=
0x32 1586,pc,=
0x34 1590,pc,=
0x36 1594,pc,=
0x38 1846,pc,=
0x3a 1850,pc,=
0x3c 1854,pc,=
0x3e 1858,pc,=
0x40 2110,pc,=
0x42 2114,pc,=
0x44 2118,pc,=
0x46 2122,pc,=
0x48 2374,pc,=
0x4a 2378,pc,=
0x4c 2382,pc,=
0x4e 2386,pc,=
0x50 2638,pc,=
0x52 2642,pc,=
0x54 2646,pc,=
0x56 2650,pc,=
0x58 2902,pc,=
0x5a 2906,pc,=
0x5c 2910,pc,=
0x5e 2914,pc,=
0x60 3166,pc,=
0x62 3170,pc,=
0x64 3174,pc,=
0x66 3178,pc,=
0x68 3430,pc,=
0x6a 3434,pc,=
0x6c 3438,pc,=
0x6e 3442,pc,=
0x70 3694,pc,=
0x72 3698,pc,=
0x74 3702,pc,=
0x76 3706,pc,=
0x78 3958,pc,=
0x7a 3962,pc,=
0x7c 3966,pc,=
0x7e 3970,pc,=
0x80 4222,pc,=
0x82 4226,pc,=
EOF
CMDS=<<EOF
wxs 00c0 01c0 02c0 03c0 7ec0 7fc0 80c0 81c0
wxs fec0 ffc0 00c1 01c1 7ec1 7fc1 80c1 81c1
wxs fec1 ffc1 00c2 01c2 7ec2 7fc2 80c2 81c2
wxs fec2 ffc2 00c3 01c3 7ec3 7fc3 80c3 81c3
wxs fec3 ffc3 00c4 01c4 7ec4 7fc4 80c4 81c4
wxs fec4 ffc4 00c5 01c5 7ec5 7fc5 80c5 81c5
wxs fec5 ffc5 00c6 01c6 7ec6 7fc6 80c6 81c6
wxs fec6 ffc6 00c7 01c7 7ec7 7fc7 80c7 81c7
wxs fec7 ffc7
e asm.arch=avr
e asm.cpu=ATmega640
aoe 66 @ 0
EOF
RUN

NAME=avr rjmp - relative jump backward
FILE=malloc://8192
EXPECT=<<EOF
0x1000 2,pc,=
0x1002 6,pc,=
0x1004 258,pc,=
0x1006 262,pc,=
0x1008 266,pc,=
0x100a 270,pc,=
0x100c 522,pc,=
0x100e 526,pc,=
0x1010 530,pc,=
0x1012 534,pc,=
0x1014 786,pc,=
0x1016 790,pc,=
0x1018 794,pc,=
0x101a 798,pc,=
0x101c 1050,pc,=
0x101e 1054,pc,=
0x1020 1058,pc,=
0x1022 1062,pc,=
0x1024 1314,pc,=
0x1026 1318,pc,=
0x1028 1322,pc,=
0x102a 1326,pc,=
0x102c 1578,pc,=
0x102e 1582,pc,=
0x1030 1586,pc,=
0x1032 1590,pc,=
0x1034 1842,pc,=
0x1036 1846,pc,=
0x1038 1850,pc,=
0x103a 1854,pc,=
0x103c 2106,pc,=
0x103e 2110,pc,=
0x1040 2114,pc,=
0x1042 2118,pc,=
0x1044 2370,pc,=
0x1046 2374,pc,=
0x1048 2378,pc,=
0x104a 2382,pc,=
0x104c 2634,pc,=
0x104e 2638,pc,=
0x1050 2642,pc,=
0x1052 2646,pc,=
0x1054 2898,pc,=
0x1056 2902,pc,=
0x1058 2906,pc,=
0x105a 2910,pc,=
0x105c 3162,pc,=
0x105e 3166,pc,=
0x1060 3170,pc,=
0x1062 3174,pc,=
0x1064 3426,pc,=
0x1066 3430,pc,=
0x1068 3434,pc,=
0x106a 3438,pc,=
0x106c 3690,pc,=
0x106e 3694,pc,=
0x1070 3698,pc,=
0x1072 3702,pc,=
0x1074 3954,pc,=
0x1076 3958,pc,=
0x1078 3962,pc,=
0x107a 3966,pc,=
0x107c 4218,pc,=
0x107e 4222,pc,=
EOF
CMDS=<<EOF
wx 00c8 01c8 7ec8 7fc8 80c8 81c8 fec8 ffc8 @ 0x1000
wx 00c9 01c9 7ec9 7fc9 80c9 81c9 fec9 ffc9 @ 0x1010
wx 00ca 01ca 7eca 7fca 80ca 81ca feca ffca @ 0x1020
wx 00cb 01cb 7ecb 7fcb 80cb 81cb fecb ffcb @ 0x1030
wx 00cc 01cc 7ecc 7fcc 80cc 81cc fecc ffcc @ 0x1040
wx 00cd 01cd 7ecd 7fcd 80cd 81cd fecd ffcd @ 0x1050
wx 00ce 01ce 7ece 7fce 80ce 81ce fece ffce @ 0x1060
wx 00cf 01cf 7ecf 7fcf 80cf 81cf fecf ffcf @ 0x1070
e asm.arch=avr
e asm.cpu=ATmega640
aoe 64 @ 0x1000
EOF
RUN

NAME=avr functions 1
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
fcn.0000029e 0x328 [CODE] jmp 0x28a
EOF
CMDS=<<EOF
e asm.arch=avr
aaa
axt 0x28a
EOF
RUN

NAME=avr functions 2
FILE=-
EXPECT=<<EOF
priv
int
int.00000000
EOF
CMDS=<<EOF
e asm.arch=avr
wx 1895
ao 1~fam[1]
af
afi~type[1]
afi~name[1]
EOF
RUN

NAME=search asm commands with internal grep
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
0x00000276   # 2: ldi r22, 0x6d
EOF
ARGS=-a avr
CMDS=<<EOF
/ad ldi~0x6d
EOF
RUN

NAME=search asm commands with filter
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
0x00001672   # 2: ldi r24, 0x18
0x000019a4   # 2: ldi r18, 0x18
EOF
ARGS=-a avr
CMDS=<<EOF
/ad ldi ~ 0x18
EOF
RUN

NAME=search asm commands with filter and align = 2
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
0x00000282   # 2: in r24, 0x12
EOF
ARGS=-a avr
CMDS=<<EOF
e search.align=2
/ad in ~ 0x12
EOF
RUN

NAME=Search rop gadgets for in command
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
  0x00000280               7304  cpc r7, r3
  0x00000282               82b3  in r24, 0x12
  0x00000284               8058  subi r24, 0x80
  0x00000286               82bb  out 0x12, r24
  0x00000288               0895  ret

  0x00000294               7304  cpc r7, r3
  0x00000296               88b3  in r24, 0x18
  0x00000298               8058  subi r24, 0x80
  0x0000029a               88bb  out 0x18, r24
  0x0000029c               0895  ret

  0x000005c6               8fb5  in r24, 0x2f
  0x000005c8               8f77  andi r24, 0x7f
  0x000005ca               02c0  rjmp 0x5d0

  0x000005cc               8fb5  in r24, 0x2f
  0x000005ce               8f7d  andi r24, 0xdf
  0x000005d0               8fbd  out 0x2f, r24
  0x000005d2               0895  ret

  0x000005d4               85b5  in r24, 0x25
  0x000005d6               8f7d  andi r24, 0xdf
  0x000005d8               85bd  out 0x25, r24
  0x000005da               0895  ret

EOF
ARGS=-a avr
CMDS=<<EOF
e search.align=2
/R in r24
EOF
RUN

NAME=Search rop gadgets for IN command with align=2
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
  0x00000280               7304  cpc r7, r3
  0x00000282               82b3  in r24, 0x12
  0x00000284               8058  subi r24, 0x80
  0x00000286               82bb  out 0x12, r24
  0x00000288               0895  ret

  0x00000294               7304  cpc r7, r3
  0x00000296               88b3  in r24, 0x18
  0x00000298               8058  subi r24, 0x80
  0x0000029a               88bb  out 0x18, r24
  0x0000029c               0895  ret

  0x000005c6               8fb5  in r24, 0x2f
  0x000005c8               8f77  andi r24, 0x7f
  0x000005ca               02c0  rjmp 0x5d0

  0x000005cc               8fb5  in r24, 0x2f
  0x000005ce               8f7d  andi r24, 0xdf
  0x000005d0               8fbd  out 0x2f, r24
  0x000005d2               0895  ret

  0x000005d4               85b5  in r24, 0x25
  0x000005d6               8f7d  andi r24, 0xdf
  0x000005d8               85bd  out 0x25, r24
  0x000005da               0895  ret

EOF
ARGS=-a avr
CMDS=<<EOF
e search.align=2
/R in r24
EOF
RUN

NAME=disasm code after search command IN
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
0x00000296   # 2: in r24, 0x18
        ,=< 0x00000000      0c94ac00       jmp entry0
       ,==< 0x00000004      0c94db00       jmp 0x1b6
      ,===< 0x00000008      0c94db00       jmp 0x1b6
     ,====< 0x0000000c      0c94db00       jmp 0x1b6
    ,=====< 0x00000010      0c94db00       jmp 0x1b6
EOF
ARGS=-a avr
CMDS=<<EOF
s 0
/ad in ~ 0x18
pd 5
EOF
RUN

NAME=entry point and bin format - arduino
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
0x158
avr
EOF
CMDS=<<EOF
?v $$
i~arch[1]
EOF
RUN

NAME=entry point and bin format - jumpy
FILE=../bins/firmware/jumpy.bin
EXPECT=<<EOF
0x8a
avr
EOF
CMDS=<<EOF
?v $$
i~arch[1]
EOF
RUN

NAME=avr search
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
0x000003e2   # 4: call fcn.000004ec
EOF
CMDS=<<EOF
e asm.arch=avr
aaa
/ad call 0x4ec
EOF
RUN

NAME=avr search - XXX dupped hit
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
0x000003e2   # 4: call fcn.000004ec
EOF
CMDS=<<EOF
e asm.arch=avr
aaa
/ad call 0x4ec
EOF
RUN

NAME=avr search 2
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
fcn.00000360 0x3e2 [CALL] call fcn.000004ec
EOF
CMDS=<<EOF
e asm.arch=avr
aac @ 0
axt 0x4ec
EOF
RUN

NAME=avr search 3
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
fcn.00000360 0x3e2 [CALL] call fcn.000004ec
EOF
CMDS=<<EOF
e asm.arch=avr
aaa
axt 0x4ec
EOF
RUN

NAME=detect false xrefs
FILE=../bins/firmware/arduino_avr.bin
EXPECT=<<EOF
0x00000004      0c94db00       jmp 0x1b6
0x00000008      0c94db00       jmp 0x1b6
0x0000000c      0c94db00       jmp 0x1b6
0x00000010      0c94db00       jmp 0x1b6
EOF
CMDS=<<EOF
e asm.arch=avr
e asm.lines=false
aar
pd 4 @ 4
EOF
RUN

NAME=bb generation for SBRx RJMP combo (radare2#12612)
FILE=../bins/elf/avr-sbrx-rjmp.elf
EXPECT=<<EOF
0x00000000 0x00000016 00:0000 22 j 0x00000018 f 0x00000016
0x00000016 0x00000018 00:0000 2 j 0x0000002e
0x00000018 0x0000001e 00:0000 6 j 0x00000020 f 0x0000001e
0x0000001e 0x00000020 00:0000 2 j 0x0000002a
0x00000020 0x0000002a 00:0000 10 j 0x00000032
0x0000002a 0x0000002e 00:0000 4 j 0x0000002e
0x0000002e 0x00000032 00:0000 4 j 0x00000032
0x00000032 0x00000040 00:0000 14
EOF
CMDS=<<EOF
af@sym.main;afb@sym.main
EOF
RUN
