NAME=stm8 cc clobber and preserve register sets
FILE=malloc://16
ARGS=-e anal.arch=stm8 -e asm.bits=16
CMDS=<<EOF
k anal/cc/cc.stm8.clobber
k anal/cc/cc.stm8.preserve
EOF
EXPECT=<<EOF
a,x,y,cc
sp
EOF
RUN

NAME=stm8 pseudo repeats an operand longer than the scratch slack
FILE=malloc://16
ARGS=-a stm8
CMDS=<<EOF
wx 3610
e asm.pseudo=true
e asm.bytes=false
e asm.lines=false
e asm.comments=false
e asm.addr=false
e scr.color=0
pd 1
ahd rrc sym.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
pd 1
ahd neg sym.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
pd 1
?e done
EOF
EXPECT=<<EOF
     [0x10] = rotate_right([0x10], 1)
     rrc sym.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
     neg sym.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
done
EOF
RUN

NAME=stm8 register widths and independent accumulator and condition code
FILE=malloc://16
ARGS=-a stm8 -b 16
CMDS=<<EOF
aeim
aer a=0x56
aer cc=0xa5
aer x=0x1234
aer y=0x789a
aer sp=0x123456
aer pc=0x12345678
aer a
aer cc
aer xh
aer xl
aer yh
aer yl
aer sp
aer pc
aer xl=0xbc
aer xh=0xde
aer x
aer cc=0
aer a
EOF
EXPECT=<<EOF
0x00000056
0x000000a5
0x00000012
0x00000034
0x00000078
0x0000009a
0x00003456
0x00345678
0x0000debc
0x00000056
EOF
RUN

NAME=stm8 memory read write directions
FILE=malloc://32
ARGS=-a stm8 -b 16
CMDS=<<EOF
wx c65102c75102725f510272105102725c51027200510200
ao 6~direction
s 3
ao 1~jump
s 18
ao 1~ptr
s 0
wx c60000
ao 1~ptr
EOF
EXPECT=<<EOF
direction: read
direction: write
direction: write
direction: read,write
direction: read,write
direction: read
ptr: 0x00005102
ptr: 0x00000000
EOF
RUN

NAME=stm8 pseudo AND preserves logical operation
FILE=malloc://16
ARGS=-a stm8
CMDS=<<EOF
wx a403
e asm.pseudo=true
e asm.bytes=false
e asm.lines=false
e asm.comments=false
e asm.addr=false
e scr.color=0
pd 1
EOF
EXPECT=<<EOF
     a &= 0x03
EOF
RUN

NAME=stm8 distinguishes logical and arithmetic byte shifts
FILE=malloc://16
ARGS=-a stm8 -b 16
CMDS=<<EOF
pad 44
pad 47
pad 3412
pad 3712
pad 72541234
pad 72571234
pad 04aa
pad 07aa
pad 74
pad 77
pad 9064aa
pad 9067aa
pad 923412
pad 923712
wx 44
ao 1~type
wx 47
ao 1~type
EOF
EXPECT=<<EOF
srl a
sra a
srl [0x12]
sra [0x12]
srl [0x1234]
sra [0x1234]
srl [sp + 0xaa]
sra [sp + 0xaa]
srl [x]
sra [x]
srl [y + 0xaa]
sra [y + 0xaa]
srl [0x12]
sra [0x12]
type: shr
type: sar
EOF
RUN

NAME=stm8 multiply uses the low index byte and preserves accumulator and other flags
FILE=malloc://16
ARGS=-a stm8 -b 16
CMDS=<<EOF
wx 4290429b9a
aei
ar x=0xabff
ar y=0xcdfe
ar a=0xff
ar cc=0xff
ar pc=0
aes
ar x
ar y
ar a
ar cc
aes
ar x
ar y
ar a
ar cc
ar x=0xffff
ar a=0
ar cc=0x6a
ar pc=0
aes
ar x
ar cc
ar cc=0x87
ar pc=3
aes
ar cc
aes
ar cc
ao 1 @0~pseudo
ao 1 @1~pseudo
EOF
EXPECT=<<EOF
0x0000fe01
0x0000cdfe
0x000000ff
0x000000ee
0x0000fe01
0x0000fd02
0x000000ff
0x000000ee
0x00000000
0x0000006a
0x000000af
0x000000a7
pseudo: x = (x & 0xff) * a
pseudo: y = (y & 0xff) * a
EOF
RUN

NAME=stm8 interrupt return restores the full big endian stack frame
FILE=malloc://65536
ARGS=-a stm8 -b 16
CMDS=<<EOF
wx 80
wx c9561234abcd123456 @0x101
aei
ar sp=0x100
ar pc=0
ar a=0
ar x=0
ar y=0
ar cc=0
aes
ar cc
ar a
ar x
ar y
ar sp
ar pc
ao 1 @0~pseudo
wx 123456789abcdef0ab @0x201
ar sp=0x200
ar pc=0
aes
ar cc
ar a
ar x
ar y
ar sp
ar pc
wx 80 @0x100
wx ccaa1234 @0xfffc
wx 56789abcde @0
ar sp=0xfffb
ar pc=0x100
aes
ar cc
ar a
ar x
ar y
ar sp
ar pc
EOF
EXPECT=<<EOF
0x000000c9
0x00000056
0x00001234
0x0000abcd
0x00000109
0x00123456
pseudo: ireturn
0x00000012
0x00000034
0x00005678
0x00009abc
0x00000209
0x00def0ab
0x000000cc
0x000000aa
0x00001234
0x00005678
0x00000004
0x009abcde
EOF
RUN

NAME=stm8 pseudo instructions without operands
FILE=malloc://32
ARGS=-a stm8
CMDS=<<EOF
wx 9a9b81808e9d5f
e asm.pseudo=true
pi 7
EOF
EXPECT=<<EOF
rim
sim
return a
ireturn
halt
nop
x = 0
EOF
RUN
