1 #include "Instructions.h"
3 #include "DecoderHelp.h"
7 #define reg(r) core->getR( (r) )
8 #define hexchar(a) std::hex << int(a) << std::dec
9 #define duoreg(Rh, Rl) core->getR(Rh) << ":" << core->getR(Rl)
11 static std::ostream
& operator <<(std::ostream
& ostr
, const avr::Register
& r
) {
20 int ADC::trace(Core
*core
, std::ostream
& ostr
) {
21 ostr
<< "ADC " << reg(reg(Rd
)) << ", " << reg(reg(Rr
));
25 int ADD::trace(Core
*core
, std::ostream
& ostr
) {
26 ostr
<< "ADD " << reg(Rd
) << ", " << reg(Rr
);
30 int ADIW::trace(Core
*core
, std::ostream
& ostr
) {
31 ostr
<< "ADIW " << duoreg(Rh
, Rl
) << ", " << hexchar(K
);
35 int AND::trace(Core
*core
, std::ostream
& ostr
) {
36 ostr
<< "AND R" << reg(Rd
) << ", R" << reg(Rr
);
40 int ANDI::trace(Core
*core
, std::ostream
& ostr
) {
41 ostr
<< "ANDI R" << reg(Rd
) << ", " << hexchar(K
);
45 int ASR::trace(Core
*core
, std::ostream
& ostr
) {
46 ostr
<< "ASR R" << reg(Rd
);
50 char *opcodes_bclr
[8]= {
61 int BCLR::trace(Core
*core
, std::ostream
& ostr
) {
63 for(i
= 0; i
< 8; ++i
)
67 ostr
<< opcodes_bclr
[i
];
71 int BLD::trace(Core
*core
, std::ostream
& ostr
) {
72 ostr
<< "BLD " << reg(Rd
) << ", " << hexchar(Kadd
);
76 char *branch_opcodes_clear
[8] = {
87 int BRBC::trace(Core
*core
, std::ostream
& ostr
) {
89 for(i
= 0; i
< 8; ++i
)
90 if( bitmask
== ~(1<<i
) )
93 ostr
<< branch_opcodes_clear
[i
] << " " << int(char(offset
) * 2);
95 string sym(core->Flash->GetSymbolAtAddress(core->PC+1+p2));
97 for (int len = sym.length(); len<30;len++) { ostr << " " ; }
102 char *branch_opcodes_set
[8] = {
113 int BRBS::trace(Core
*core
, std::ostream
& ostr
) {
115 for(i
= 0; i
< 8; ++i
)
116 if( bitmask
== (1<<i
) )
119 ostr
<< branch_opcodes_set
[i
] << " " << int(char(offset
)*2);
123 char *opcodes_bset
[8]= {
134 int BSET::trace(Core
*core
, std::ostream
& ostr
) {
136 for(i
= 0; i
< 8; ++i
)
140 ostr
<< opcodes_bset
[i
];
144 int BST::trace(Core
*core
, std::ostream
& ostr
) {
145 ostr
<< "BST " << reg(Rd
) << ", " << hexchar(K
);
149 int CALL::trace(Core
*core
, std::ostream
& ostr
) {
150 ostr
<< "CALL " << hexchar(KH
);
151 return core
->pcBytes() + 2;
154 int CBI::trace(Core
*core
, std::ostream
& ostr
) {
155 ostr
<< "CBI " << core
->getIoreg(ioreg
) << ", " << hexchar(K
);
159 int COM::trace(Core
*core
, std::ostream
& ostr
) {
160 ostr
<< "COM " << reg(Rd
);
164 int CP::trace(Core
*core
, std::ostream
& ostr
) {
165 ostr
<< "CP " << reg(Rd
) << ", " << reg(Rr
);
169 int CPC::trace(Core
*core
, std::ostream
& ostr
) {
170 ostr
<< "CPC " << reg(Rd
) << ", " << reg(Rr
);
174 int CPI::trace(Core
*core
, std::ostream
& ostr
) {
175 ostr
<< "CPI " << reg(Rd
) << ", " << hexchar(K
);
179 int CPSE::trace(Core
*core
, std::ostream
& ostr
) {
180 ostr
<< "CPSE " << reg(Rd
) << ", " << reg(Rr
);
184 int DEC::trace(Core
*core
, std::ostream
& ostr
) {
185 ostr
<< "DEC " << reg(Rd
);
189 int EICALL::trace(Core
*core
, std::ostream
& ostr
) {
194 int EIJMP::trace(Core
*core
, std::ostream
& ostr
) {
199 int ELPM_Z::trace(Core
*core
, std::ostream
& ostr
) {
200 ostr
<< "ELPM " << reg(Rd
) << ", Z";
202 unsigned int Z = ((core->GetRampz() & 0x3f) << 16) +
203 (((*(core->R))[31]) << 8) +
206 unsigned int flash_addr = Z;// / 2;
208 ostr << " Flash[0x"<<hex<< (unsigned int) flash_addr<<"] ";
213 int ELPM_Z_incr::trace(Core
*core
, std::ostream
& ostr
) {
214 ostr
<< "ELPM " << reg(Rd
) << ", Z+";
216 /* unsigned int Z = ((core->GetRampz() & 0x3f) << 16) +
217 (((*(core->R))[31]) << 8) +
220 unsigned int flash_addr = Z; // / 2;
222 ostr << " Flash[0x"<<hex<< (unsigned int) flash_addr<<"] ";
228 int ELPM::trace(Core
*core
, std::ostream
& ostr
) {
231 /* unsigned int Z = ((core->GetRampz() & 0x3f) << 16) +
232 (((*(core->R))[31]) << 8) +
235 unsigned int flash_addr = Z; // / 2;
237 ostr << " Flash[0x"<<hex<< (unsigned int) flash_addr<<"] ";
242 int EOR::trace(Core
*core
, std::ostream
& ostr
) {
243 ostr
<< "EOR " << reg(Rd
) << ", " << reg(Rr
);
247 int ESPM::trace(Core
*core
, std::ostream
& ostr
) {
252 int FMUL::trace(Core
*core
, std::ostream
& ostr
) {
253 ostr
<< "FMUL " << reg(Rd
) << ", " << reg(Rr
);
257 int FMULS::trace(Core
*core
, std::ostream
& ostr
) {
258 ostr
<< "FMULS " << reg(Rd
) << ", " << reg(Rr
);
262 int FMULSU::trace(Core
*core
, std::ostream
& ostr
) {
263 ostr
<< "FMULSU " << reg(Rd
) << ", " << reg(Rr
);
267 int ICALL::trace(Core
*core
, std::ostream
& ostr
) {
269 return core
->pcBytes() + 1;
272 int IJMP::trace(Core
*core
, std::ostream
& ostr
) {
277 int IN::trace(Core
*core
, std::ostream
& ostr
) {
278 ostr
<< "IN " << reg(Rd
) << ", " << core
->getIoreg(ioreg
);
282 int INC::trace(Core
*core
, std::ostream
& ostr
) {
283 ostr
<< "INC " << reg(Rd
);
287 int JMP::trace(Core
*core
, std::ostream
& ostr
) {
292 int LDD_Y::trace(Core
*core
, std::ostream
& ostr
) {
293 ostr
<< "LD " << reg(Rd
) << ", Y+" << hexchar(K
);
297 int LDD_Z::trace(Core
*core
, std::ostream
& ostr
) {
298 ostr
<< "LDD " << reg(Rd
) << ", Z";
302 int LDI::trace(Core
*core
, std::ostream
& ostr
) {
303 ostr
<< "LDI " << reg(Rd
) << ", " << hexchar(K
);
307 int LDS::trace(Core
*core
, std::ostream
& ostr
) {
308 ostr
<< "LDS " << reg(Rd
);
309 //<< ", " << hex << "0x" << offset << dec << " ";
313 int LD_X::trace(Core
*core
, std::ostream
& ostr
) {
314 ostr
<< "LD " << reg(Rd
) << ", X ";
318 int LD_X_decr::trace(Core
*core
, std::ostream
& ostr
) {
319 ostr
<< "LD " << reg(Rd
) << ", -X";
323 int LD_X_incr::trace(Core
*core
, std::ostream
& ostr
) {
324 ostr
<< "LD " << reg(Rd
) << ", X+";
328 int LD_Y_decr::trace(Core
*core
, std::ostream
& ostr
) {
329 ostr
<< "LD " << reg(Rd
) << ", -Y";
333 int LD_Y_incr::trace(Core
*core
, std::ostream
& ostr
) {
334 ostr
<< "LD " << reg(Rd
) << ", Y+";
338 int LD_Z_incr::trace(Core
*core
, std::ostream
& ostr
) {
339 ostr
<< "LD " << reg(Rd
) << ", Z+";
343 int LD_Z_decr::trace(Core
*core
, std::ostream
& ostr
) {
344 ostr
<< "LD R" << reg(Rd
) << ", -Z";
348 int LPM_Z::trace(Core
*core
, std::ostream
& ostr
) {
349 ostr
<< "LPM " << reg(Rd
) << ", Z";
352 //int Z = ((*(core->R))[ 31] << 8) + (*(core->R))[ 30];
353 //string sym(core->Flash->GetSymbolAtAddressLpm(Z));
354 //string sym(core->Flash->GetSymbolAtAddress(Z));
355 //ostr << "FLASH[" << hex << Z << "," << sym << "] ";
360 int LPM::trace(Core
*core
, std::ostream
& ostr
) {
364 //int Z = ((*(core->R))[ 31] << 8) + (*(core->R))[ 30];
365 //string sym(core->Flash->GetSymbolAtAddressLpm(Z));
366 //string sym(core->Flash->GetSymbolAtAddress(Z));
367 //ostr << "FLASH[" << hex << Z << "," << sym << "] ";
372 int LPM_Z_incr::trace(Core
*core
, std::ostream
& ostr
) {
373 ostr
<< "LPM " << reg(Rd
) << ", Z+";
376 //int Z = ((*(core->R))[ 31] << 8) + (*(core->R))[ 30];
377 //string sym(core->Flash->GetSymbolAtAddressLpm(Z));
378 //string sym(core->Flash->GetSymbolAtAddress(Z));
379 //ostr << "FLASH[" << hex << Z << "," << sym << "] ";
384 int LSR::trace(Core
*core
, std::ostream
& ostr
) {
385 ostr
<< "LSR " << reg(Rd
);
389 int MOV::trace(Core
*core
, std::ostream
& ostr
) {
390 ostr
<< "MOV " << reg(Rd
) << ", " << reg(Rr
);
394 int MOVW::trace(Core
*core
, std::ostream
& ostr
) {
395 ostr
<< "MOVW " << duoreg(Rdh
,Rdl
) << ", " << duoreg(Rrh
,Rrl
);
399 int MUL::trace(Core
*core
, std::ostream
& ostr
) {
400 ostr
<< "MUL " << reg(Rd
) << ", " << reg(Rr
);
404 int MULS::trace(Core
*core
, std::ostream
& ostr
) {
405 ostr
<< "MULS " << reg(Rd
) << ", " << reg(Rr
);
409 int MULSU::trace(Core
*core
, std::ostream
& ostr
) {
410 ostr
<< "MULSU " << reg(Rd
) << ", " << reg(Rr
);
414 int NEG::trace(Core
*core
, std::ostream
& ostr
) {
415 ostr
<< "NEG " << reg(Rd
);
419 int NOP::trace(Core
*core
, std::ostream
& ostr
) {
424 int OR::trace(Core
*core
, std::ostream
& ostr
) {
425 ostr
<< "OR " << reg(Rd
) << ", " << reg(Rr
);
429 int ORI::trace(Core
*core
, std::ostream
& ostr
) {
430 ostr
<< "ORI " << reg(Rd
) << ", " << hexchar(K
);
434 int OUT::trace(Core
*core
, std::ostream
& ostr
) {
435 ostr
<< "OUT " << core
->getIoreg(ioreg
) << ", " << reg(Rd
);
439 int POP::trace(Core
*core
, std::ostream
& ostr
) {
440 ostr
<< "POP " << reg(Rd
);
444 int PUSH::trace(Core
*core
, std::ostream
& ostr
) {
445 ostr
<< "PUSH " << reg(Rd
);
449 int RCALL::trace(Core
*core
, std::ostream
& ostr
) {
450 ostr
<< "RCALL " << hexchar(K
);
454 int RET::trace(Core
*core
, std::ostream
& ostr
) {
459 int RETI::trace(Core
*core
, std::ostream
& ostr
) {
464 int RJMP::trace(Core
*core
, std::ostream
& ostr
) {
465 ostr
<< "RJMP " << int(char(K
))*2;
469 int ROR::trace(Core
*core
, std::ostream
& ostr
) {
470 ostr
<< "ROR " << reg(Rd
);
474 int SBC::trace(Core
*core
, std::ostream
& ostr
) {
475 ostr
<< "SBC " << reg(Rd
) << ", " << reg(Rr
);
479 int SBCI::trace(Core
*core
, std::ostream
& ostr
) {
480 ostr
<< "SBCI " << reg(Rd
) << ", " << hexchar(K
);
484 int SBI::trace(Core
*core
, std::ostream
& ostr
) {
485 ostr
<< "SBI " << core
->getIoreg(ioreg
) << ", " << hexchar(K
);
489 int SBIC::trace(Core
*core
, std::ostream
& ostr
) {
490 ostr
<< "SBIC " << core
->getIoreg(ioreg
) << ", " << hexchar(K
);
494 int SBIS::trace(Core
*core
, std::ostream
& ostr
) {
495 ostr
<< "SBIS " << core
->getIoreg(ioreg
) << ", " << hexchar(K
);
499 int SBIW::trace(Core
*core
, std::ostream
& ostr
) {
500 ostr
<< "SBIW " << duoreg(Rh
,Rl
) << ", " << hexchar(K
);
504 int SBRC::trace(Core
*core
, std::ostream
& ostr
) {
505 ostr
<< "SBRC " << reg(Rd
) << ", " << hexchar(K
);
509 int SBRS::trace(Core
*core
, std::ostream
& ostr
) {
510 ostr
<< "SBRS " << reg(Rd
) << ", " << hexchar(K
);
514 int SLEEP::trace(Core
*core
, std::ostream
& ostr
) {
519 int SPM::trace(Core
*core
, std::ostream
& ostr
) {
524 int STD_Y::trace(Core
*core
, std::ostream
& ostr
) {
525 ostr
<< "STD Y+"<< hexchar(K
) <<", " << reg(Rd
);
529 int STD_Z::trace(Core
*core
, std::ostream
& ostr
) {
530 ostr
<< "STD Z, " << reg(Rd
);
534 int STS::trace(Core
*core
, std::ostream
& ostr
) {
535 ostr
<< "STS " << reg(Rd
);
539 int ST_X::trace(Core
*core
, std::ostream
& ostr
) {
540 ostr
<< "ST X, " << reg(Rd
);
544 int ST_X_decr::trace(Core
*core
, std::ostream
& ostr
) {
545 ostr
<< "ST -X, " << reg(Rd
);
549 int ST_X_incr::trace(Core
*core
, std::ostream
& ostr
) {
550 ostr
<< "ST X+, " << reg(Rd
);
554 int ST_Y_decr::trace(Core
*core
, std::ostream
& ostr
) {
555 ostr
<< "ST -Y, " << reg(Rd
);
559 int ST_Y_incr::trace(Core
*core
, std::ostream
& ostr
) {
560 ostr
<< "ST Y+, " << reg(Rd
);
564 int ST_Z_decr::trace(Core
*core
, std::ostream
& ostr
) {
565 ostr
<< "ST -Z, " << reg(Rd
);
569 int ST_Z_incr::trace(Core
*core
, std::ostream
& ostr
) {
570 ostr
<< "ST Z+, " << reg(Rd
);
574 int SUB::trace(Core
*core
, std::ostream
& ostr
) {
575 ostr
<< "SUB " << reg(Rd
) << ", " << reg(Rr
);
579 int SUBI::trace(Core
*core
, std::ostream
& ostr
) {
580 ostr
<< "SUBI " << reg(Rd
) << ", " << hexchar(K
);
584 int SWAP::trace(Core
*core
, std::ostream
& ostr
) {
585 ostr
<< "SWAP " << reg(Rd
);
589 int WDR::trace(Core
*core
, std::ostream
& ostr
) {
594 int BREAK::trace(Core
*core
, std::ostream
& ostr
) {
599 int ILLEGAL::trace(Core
*core
, std::ostream
& ostr
) {