diff --git a/compiler/avr/aasmcpu.pas b/compiler/avr/aasmcpu.pas index 0c1dfee2a6..e0d9f97d77 100644 --- a/compiler/avr/aasmcpu.pas +++ b/compiler/avr/aasmcpu.pas @@ -508,33 +508,61 @@ implementation end; A_STS: begin - if current_settings.cputype=cpu_avr1 then - begin - remove_instruction; - result:=false; - end - else if current_settings.cputype=cpu_avrtiny then - with taicpu(curtai).oper[0]^ do - if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then - begin - taicpu(curtai).opcode:=A_OUT; - taicpu(curtai).loadconst(0,ref^.offset); - end; + { certain cpu types do not support some instructions, so replace them } + case current_settings.cputype of + cpu_avr1: + begin + with taicpu(curtai).oper[0]^ do + if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then + begin + taicpu(curtai).opcode:=A_OUT; + taicpu(curtai).loadconst(0,ref^.offset); + end + else + begin + remove_instruction; + result:=false; + end; + end; + cpu_avrtiny: + begin + with taicpu(curtai).oper[0]^ do + if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then + begin + taicpu(curtai).opcode:=A_OUT; + taicpu(curtai).loadconst(0,ref^.offset); + end; + end; + end; end; A_LDS: begin - if current_settings.cputype=cpu_avr1 then - begin - remove_instruction; - result:=false; - end - else if current_settings.cputype=cpu_avrtiny then - with taicpu(curtai).oper[1]^ do - if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then - begin - taicpu(curtai).opcode:=A_IN; - taicpu(curtai).loadconst(1,ref^.offset) - end; + { certain cpu types do not support some instructions, so replace them } + case current_settings.cputype of + cpu_avr1: + begin + with taicpu(curtai).oper[1]^ do + if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then + begin + taicpu(curtai).opcode:=A_IN; + taicpu(curtai).loadconst(1,ref^.offset) + end + else + begin + remove_instruction; + result:=false; + end; + end; + cpu_avrtiny: + begin + with taicpu(curtai).oper[1]^ do + if (ref^.base=NR_NO) and (ref^.index=NR_NO) and (ref^.symbol=nil) and (ref^.offset<$40) then + begin + taicpu(curtai).opcode:=A_IN; + taicpu(curtai).loadconst(1,ref^.offset) + end; + end; + end; end; A_SBIW, A_MULS, @@ -548,6 +576,7 @@ implementation A_POP, A_PUSH: begin + { certain cpu types do not support some instructions, so replace them } if current_settings.cputype=cpu_avr1 then begin remove_instruction;