optim, try different dispatch strategies, add reset handler

This commit is contained in:
2026-05-07 14:13:55 +03:00
parent 5cd472c173
commit 1b3f49fc3b
11 changed files with 1438 additions and 12 deletions

View File

@@ -104,6 +104,390 @@ uint8_t _swap (prog_counter_t* pcounter, device_mem_t* devMem);
uint8_t _wdr (prog_counter_t* pcounter, device_mem_t* devMem);
uint8_t _xch (prog_counter_t* pcounter, device_mem_t* devMem);
static inline uint8_t _dispatchInstruction(const opcode_t op, prog_counter_t* programCounter, device_mem_t* devMem)
{
if((op & (~0b0000001111111111)) == 0b0001110000000000)
{
return _adc(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0000110000000000)
{
return _add(programCounter, devMem);
}
else if((op & (~0b0000000011111111)) == 0b1001011000000000)
{
return _adiw(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0010000000000000)
{
return _and(programCounter, devMem);
}
else if((op & (~0b0000111111111111)) == 0b0111000000000000)
{
return _andi(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001010000000101)
{
return _asr(programCounter, devMem);
}
else if((op & (~0b0000000001110000)) == 0b1001010010001000)
{
return _bclr(programCounter, devMem);
}
else if((op & (~0b0000000111110111)) == 0b1111100000000000)
{
return _bld(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b1111010000000000)
{
return _brbc(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b1111000000000000)
{
return _brbs(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010110011000)
{
return _break(programCounter, devMem);
}
else if((op & (~0b0000000001110000)) == 0b1001010000001000)
{
return _bset(programCounter, devMem);
}
else if((op & (~0b0000000111110111)) == 0b1111101000000000)
{
return _bst(programCounter, devMem);
}
else if((op & (~0b0000000111110001)) == 0b1001010000001110)
{
return _call(programCounter, devMem);
}
else if((op & (~0b0000000011111111)) == 0b1001100000000000)
{
return _cbi(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001010000000000)
{
return _com(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0001010000000000)
{
return _cp(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0000010000000000)
{
return _cpc(programCounter, devMem);
}
else if((op & (~0b0000111111111111)) == 0b0011000000000000)
{
return _cpi(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0001000000000000)
{
return _cpse(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001010000001010)
{
return _dec(programCounter, devMem);
}
else if((op & (~0b0000000011110000)) == 0b1001010000001011)
{
return _des(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010100011001)
{
return _eicall(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010000011001)
{
return _eijmp(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010111011000)
{
return _elpm1(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000000110)
{
return _elpm2(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000000111)
{
return _elpm3(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0010010000000000)
{
return _eor(programCounter, devMem);
}
else if((op & (~0b0000000001110111)) == 0b0000001100001000)
{
return _fmul(programCounter, devMem);
}
else if((op & (~0b0000000001110111)) == 0b0000001110000000)
{
return _fmuls(programCounter, devMem);
}
else if((op & (~0b0000000001110111)) == 0b0000001110001000)
{
return _fmulsu(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010100001001)
{
return _icall(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010000001001)
{
return _ijmp(programCounter, devMem);
}
else if((op & (~0b0000011111111111)) == 0b1011000000000000)
{
return _in(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001010000000011)
{
return _inc(programCounter, devMem);
}
else if((op & (~0b0000000111110001)) == 0b1001010000001100)
{
return _jmp(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000000110)
{
return _lac(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000000101)
{
return _las(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000000111)
{
return _lat(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000001100)
{
return _ld1(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000001101)
{
return _ld2(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000001110)
{
return _ld3(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000001001) {return
_ld_ldd2(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000001010) {return
_ld_ldd3(programCounter, devMem);
}
else if((op & (~0b0010110111110111)) == 0b1000000000001000) {return
_ld_ldd4(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000000001) {return
_ld_ldd_12(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000000010) {return
_ld_ldd_13(programCounter, devMem);
}
else if((op & (~0b0010110111110111)) == 0b1000000000000000) {return
_ld_ldd_14(programCounter, devMem);
}
else if((op & (~0b0000111111111111)) == 0b1110000000000000)
{
return _ldi(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000000000)
{
return _lds(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010111001000)
{
return _lpm1(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000000100)
{
return _lpm2(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000000101)
{
return _lpm3(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001010000000110)
{
return _lsr(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0010110000000000)
{
return _mov(programCounter, devMem);
}
else if((op & (~0b0000000011111111)) == 0b0000000100000000)
{
return _movw(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b1001110000000000)
{
return _mul(programCounter, devMem);
}
else if((op & (~0b0000000011111111)) == 0b0000001000000000)
{
return _muls(programCounter, devMem);
}
else if((op & (~0b0000000001110111)) == 0b0000001100000000)
{
return _mulsu(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001010000000001)
{
return _neg(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b0000000000000000)
{
return _nop(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0010100000000000)
{
return _or(programCounter, devMem);
}
else if((op & (~0b0000011111111111)) == 0b1011100000000000)
{
return _out(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001000000001111)
{
return _pop(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000001111)
{
return _push(programCounter, devMem);
}
else if((op & (~0b0000111111111111)) == 0b1101000000000000)
{
return _rcall(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010100001000)
{
return _ret(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010100011000)
{
return _reti(programCounter, devMem);
}
else if((op & (~0b0000111111111111)) == 0b1100000000000000)
{
return _rjmp(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001010000000111)
{
return _ror(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0000100000000000)
{
return _sbc(programCounter, devMem);
}
else if((op & (~0b0000111111111111)) == 0b0100000000000000)
{
return _sbci(programCounter, devMem);
}
else if((op & (~0b0000000011111111)) == 0b1001101000000000)
{
return _sbi(programCounter, devMem);
}
else if((op & (~0b0000000011111111)) == 0b1001100100000000)
{
return _sbic(programCounter, devMem);
}
else if((op & (~0b0000000011111111)) == 0b1001101100000000)
{
return _sbis(programCounter, devMem);
}
else if((op & (~0b0000000011111111)) == 0b1001011100000000)
{
return _sbiw(programCounter, devMem);
}
else if((op & (~0b0000111111111111)) == 0b0110000000000000)
{
return _sbr(programCounter, devMem);
}
else if((op & (~0b0000000111110111)) == 0b1111110000000000)
{
return _sbrc(programCounter, devMem);
}
else if((op & (~0b0000000111110111)) == 0b1111111000000000)
{
return _sbrs(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010110001000)
{
return _sleep(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000001100)
{
return _st1(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000001101)
{
return _st2(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000001110)
{
return _st3(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000001001) {return
_st_std2(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000001010) {return
_st_std3(programCounter, devMem);
}
else if((op & (~0b0010110111110111)) == 0b1000001000001000) {return
_st_std4(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000000001) {return
_st_std_12(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000000010) {return
_st_std_13(programCounter, devMem);
}
else if((op & (~0b0010110111110111)) == 0b1000001000000000) {return
_st_std_14(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000000000)
{
return _sts(programCounter, devMem);
}
else if((op & (~0b0000001111111111)) == 0b0001100000000000)
{
return _sub(programCounter, devMem);
}
else if((op & (~0b0000111111111111)) == 0b0101000000000000)
{
return _subi(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001010000000010)
{
return _swap(programCounter, devMem);
}
else if((op & (~0b0000000000000000)) == 0b1001010110101000)
{
return _wdr(programCounter, devMem);
}
else if((op & (~0b0000000111110000)) == 0b1001001000000100)
{
return _xch(programCounter, devMem);
}
return 0;
}
#define HANDLER_REGISTERS {\
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \