optim, try different dispatch strategies, add reset handler
This commit is contained in:
6
Makefile
6
Makefile
@@ -20,7 +20,7 @@ OBJDUMP=objdump
|
||||
LIBS=
|
||||
STANDART=c23
|
||||
|
||||
OPTIMIZE=-Og
|
||||
OPTIMIZE=-O3
|
||||
TARGET=device
|
||||
ifeq ($(ARCH),)
|
||||
ARCH := "template"
|
||||
@@ -39,8 +39,8 @@ PEDANTIC_FLAGS=-pedantic -pedantic-errors $(DISABLE_FLAGS) -Wall -Wcast-align -W
|
||||
ANALYZER_FLAGS=-fanalyzer
|
||||
LSECTIONS=-ffunction-sections -fdata-sections -Wl,--gc-sections
|
||||
CFLAGS=$(C_DEFS) -g $(C_INCLUDES) $(DEFINES) $(OPTIMIZE) --std=$(STANDART) $(PEDANTIC_FLAGS) $(ANALYZER_FLAGS) -fPIC
|
||||
LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -flto -fuse-linker-plugin $(LSECTIONS) -lm $(LIBS) -fPIC -shared
|
||||
MANIFEST_LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -flto -fuse-linker-plugin $(LSECTIONS) -lm $(LIBS) -fPIC
|
||||
LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -fuse-linker-plugin $(LSECTIONS) -lm $(LIBS) -fPIC -shared
|
||||
MANIFEST_LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -fuse-linker-plugin $(LSECTIONS) -lm $(LIBS) -fPIC
|
||||
|
||||
OBJECTS := $(addprefix $(BUILD_DIR)/,$(patsubst src/%.c,$(PREFIX)%.o,$(C_SOURCES)))
|
||||
|
||||
|
||||
19
inc/addrs.h
19
inc/addrs.h
@@ -2,11 +2,20 @@
|
||||
#define __ADDRS_H__
|
||||
#include "mem_seg.h"
|
||||
|
||||
#define IOREG_SREG_ADDR 0x5F
|
||||
#define IOREG_SPH_ADDR 0x5E
|
||||
#define IOREG_SPL_ADDR 0x5D
|
||||
#define IOREG_EIND_ADDR 0x5C
|
||||
#define IOREG_RAMPZ_ADDR 0x5B
|
||||
#define IOREG_SREG_ADDR 0x3F
|
||||
#define IOREG_SPH_ADDR 0x3E
|
||||
#define IOREG_SPL_ADDR 0x3D
|
||||
#define IOREG_EIND_ADDR 0x3C
|
||||
#define IOREG_RAMPZ_ADDR 0x3B
|
||||
|
||||
#define SREG_BIT_I 7
|
||||
#define SREG_BIT_T 6
|
||||
#define SREG_BIT_H 5
|
||||
#define SREG_BIT_S 4
|
||||
#define SREG_BIT_V 3
|
||||
#define SREG_BIT_N 2
|
||||
#define SREG_BIT_Z 1
|
||||
#define SREG_BIT_C 0
|
||||
|
||||
|
||||
#define GPREG_ZH_ADDR 31
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#include <stdio.h>
|
||||
#include "addrs.h"
|
||||
|
||||
// static inline uint8_t _dispatchInstruction(const opcode_t op, prog_counter_t* programCounter, device_mem_t* devMem);
|
||||
|
||||
#if ARCH == AVRe
|
||||
#include "generated_AVRe.h"
|
||||
#endif
|
||||
|
||||
@@ -105,6 +105,376 @@ 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) == 0b0000000000000000) {return _nop(programCounter, devMem);}
|
||||
if((op) == 0b1001010000001001) {return _ijmp(programCounter, devMem);}
|
||||
if((op) == 0b1001010000011001) {return _eijmp(programCounter, devMem);}
|
||||
if((op) == 0b1001010100001000) {return _ret(programCounter, devMem);}
|
||||
if((op) == 0b1001010100001001) {return _icall(programCounter, devMem);}
|
||||
if((op) == 0b1001010100011000) {return _reti(programCounter, devMem);}
|
||||
if((op) == 0b1001010100011001) {return _eicall(programCounter, devMem);}
|
||||
if((op) == 0b1001010110001000) {return _sleep(programCounter, devMem);}
|
||||
if((op) == 0b1001010110011000) {return _break(programCounter, devMem);}
|
||||
if((op) == 0b1001010110101000) {return _wdr(programCounter, devMem);}
|
||||
if((op) == 0b1001010111001000) {return _lpm1(programCounter, devMem);}
|
||||
if((op) == 0b1001010111011000) {return _elpm1(programCounter, devMem);}
|
||||
if((op) == 0b1001010111101000) {return _spm(programCounter, devMem);}
|
||||
if((op & (~0b0000000001110000)) == 0b1001010000001000) {return _bset(programCounter, devMem);}
|
||||
if((op & (~0b0000000001110000)) == 0b1001010010001000) {return _bclr(programCounter, devMem);}
|
||||
if((op & (~0b0000000001110111)) == 0b0000001100000000) {return _mulsu(programCounter, devMem);}
|
||||
if((op & (~0b0000000001110111)) == 0b0000001100001000) {return _fmul(programCounter, devMem);}
|
||||
if((op & (~0b0000000001110111)) == 0b0000001110000000) {return _fmuls(programCounter, devMem);}
|
||||
if((op & (~0b0000000001110111)) == 0b0000001110001000) {return _fmulsu(programCounter, devMem);}
|
||||
switch (op & (~0b0000000011111111))
|
||||
{
|
||||
case 0b0000000100000000:
|
||||
{
|
||||
return _movw(programCounter, devMem);
|
||||
}
|
||||
case 0b0000001000000000:
|
||||
{
|
||||
return _muls(programCounter, devMem);
|
||||
}
|
||||
case 0b1001011000000000:
|
||||
{
|
||||
return _adiw(programCounter, devMem);
|
||||
}
|
||||
case 0b1001011100000000:
|
||||
{
|
||||
return _sbiw(programCounter, devMem);
|
||||
}
|
||||
case 0b1001100000000000:
|
||||
{
|
||||
return _cbi(programCounter, devMem);
|
||||
}
|
||||
case 0b1001100100000000:
|
||||
{
|
||||
return _sbic(programCounter, devMem);
|
||||
}
|
||||
case 0b1001101000000000:
|
||||
{
|
||||
return _sbi(programCounter, devMem);
|
||||
}
|
||||
case 0b1001101100000000:
|
||||
{
|
||||
return _sbis(programCounter, devMem);
|
||||
}
|
||||
}
|
||||
// if((op & (~0b0000000011111111)) == 0b0000000100000000) {return _movw(programCounter, devMem);}
|
||||
// if((op & (~0b0000000011111111)) == 0b0000001000000000) {return _muls(programCounter, devMem);}
|
||||
// if((op & (~0b0000000011111111)) == 0b1001011000000000) {return _adiw(programCounter, devMem);}
|
||||
// if((op & (~0b0000000011111111)) == 0b1001011100000000) {return _sbiw(programCounter, devMem);}
|
||||
// if((op & (~0b0000000011111111)) == 0b1001100000000000) {return _cbi(programCounter, devMem);}
|
||||
// if((op & (~0b0000000011111111)) == 0b1001100100000000) {return _sbic(programCounter, devMem);}
|
||||
// if((op & (~0b0000000011111111)) == 0b1001101000000000) {return _sbi(programCounter, devMem);}
|
||||
// if((op & (~0b0000000011111111)) == 0b1001101100000000) {return _sbis(programCounter, devMem);}
|
||||
switch (op & (~0b0000000111110000))
|
||||
{
|
||||
|
||||
case 0b1001000000000000:
|
||||
{
|
||||
return _lds(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000000001:
|
||||
{
|
||||
return _ld_ldd_12(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000000010:
|
||||
{
|
||||
return _ld_ldd_13(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000000100:
|
||||
{
|
||||
return _lpm2(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000000101:
|
||||
{
|
||||
return _lpm3(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000000110:
|
||||
{
|
||||
return _elpm2(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000000111:
|
||||
{
|
||||
return _elpm3(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000001001:
|
||||
{
|
||||
return _ld_ldd2(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000001010:
|
||||
{
|
||||
return _ld_ldd3(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000001100:
|
||||
{
|
||||
return _ld1(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000001101:
|
||||
{
|
||||
return _ld2(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000001110:
|
||||
{
|
||||
return _ld3(programCounter, devMem);
|
||||
}
|
||||
case 0b1001000000001111:
|
||||
{
|
||||
return _pop(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000000000:
|
||||
{
|
||||
return _sts(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000000001:
|
||||
{
|
||||
return _st_std_12(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000000010:
|
||||
{
|
||||
return _st_std_13(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000001001:
|
||||
{
|
||||
return _st_std2(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000001010:
|
||||
{
|
||||
return _st_std3(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000001100:
|
||||
{
|
||||
return _st1(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000001101:
|
||||
{
|
||||
return _st2(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000001110:
|
||||
{
|
||||
return _st3(programCounter, devMem);
|
||||
}
|
||||
case 0b1001001000001111:
|
||||
{
|
||||
return _push(programCounter, devMem);
|
||||
}
|
||||
case 0b1001010000000000:
|
||||
{
|
||||
return _com(programCounter, devMem);
|
||||
}
|
||||
case 0b1001010000000001:
|
||||
{
|
||||
return _neg(programCounter, devMem);
|
||||
}
|
||||
case 0b1001010000000010:
|
||||
{
|
||||
return _swap(programCounter, devMem);
|
||||
}
|
||||
case 0b1001010000000011:
|
||||
{
|
||||
return _inc(programCounter, devMem);
|
||||
}
|
||||
case 0b1001010000000101:
|
||||
{
|
||||
return _asr(programCounter, devMem);
|
||||
}
|
||||
case 0b1001010000000110:
|
||||
{
|
||||
return _lsr(programCounter, devMem);
|
||||
}
|
||||
case 0b1001010000000111:
|
||||
{
|
||||
return _ror(programCounter, devMem);
|
||||
}
|
||||
case 0b1001010000001010:
|
||||
{
|
||||
return _dec(programCounter, devMem);
|
||||
}
|
||||
}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000000000) {return _lds(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000000001) {return _ld_ldd_12(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000000010) {return _ld_ldd_13(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000000100) {return _lpm2(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000000101) {return _lpm3(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000000110) {return _elpm2(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000000111) {return _elpm3(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000001001) {return _ld_ldd2(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000001010) {return _ld_ldd3(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000001100) {return _ld1(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000001101) {return _ld2(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000001110) {return _ld3(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001000000001111) {return _pop(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000000000) {return _sts(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000000001) {return _st_std_12(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000000010) {return _st_std_13(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000001001) {return _st_std2(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000001010) {return _st_std3(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000001100) {return _st1(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000001101) {return _st2(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000001110) {return _st3(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001001000001111) {return _push(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001010000000000) {return _com(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001010000000001) {return _neg(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001010000000010) {return _swap(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001010000000011) {return _inc(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001010000000101) {return _asr(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001010000000110) {return _lsr(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001010000000111) {return _ror(programCounter, devMem);}
|
||||
// if((op & (~0b0000000111110000)) == 0b1001010000001010) {return _dec(programCounter, devMem);}
|
||||
if((op & (~0b0000000111110001)) == 0b1001010000001100) {return _jmp(programCounter, devMem);}
|
||||
if((op & (~0b0000000111110001)) == 0b1001010000001110) {return _call(programCounter, devMem);}
|
||||
if((op & (~0b0000000111110111)) == 0b1111100000000000) {return _bld(programCounter, devMem);}
|
||||
if((op & (~0b0000000111110111)) == 0b1111101000000000) {return _bst(programCounter, devMem);}
|
||||
if((op & (~0b0000000111110111)) == 0b1111110000000000) {return _sbrc(programCounter, devMem);}
|
||||
if((op & (~0b0000000111110111)) == 0b1111111000000000) {return _sbrs(programCounter, devMem);}
|
||||
switch (op & (~0b0000001111111111))
|
||||
{
|
||||
case 0b0000010000000000:
|
||||
{
|
||||
return _cpc(programCounter, devMem);
|
||||
}
|
||||
case 0b0000100000000000:
|
||||
{
|
||||
return _sbc(programCounter, devMem);
|
||||
}
|
||||
case 0b0000110000000000:
|
||||
{
|
||||
return _add(programCounter, devMem);
|
||||
}
|
||||
case 0b0001000000000000:
|
||||
{
|
||||
return _cpse(programCounter, devMem);
|
||||
}
|
||||
case 0b0001010000000000:
|
||||
{
|
||||
return _cp(programCounter, devMem);
|
||||
}
|
||||
case 0b0001100000000000:
|
||||
{
|
||||
return _sub(programCounter, devMem);
|
||||
}
|
||||
case 0b0001110000000000:
|
||||
{
|
||||
return _adc(programCounter, devMem);
|
||||
}
|
||||
case 0b0010000000000000:
|
||||
{
|
||||
return _and(programCounter, devMem);
|
||||
}
|
||||
case 0b0010010000000000:
|
||||
{
|
||||
return _eor(programCounter, devMem);
|
||||
}
|
||||
case 0b0010100000000000:
|
||||
{
|
||||
return _or(programCounter, devMem);
|
||||
}
|
||||
case 0b0010110000000000:
|
||||
{
|
||||
return _mov(programCounter, devMem);
|
||||
}
|
||||
case 0b1001110000000000:
|
||||
{
|
||||
return _mul(programCounter, devMem);
|
||||
}
|
||||
case 0b1111000000000000:
|
||||
{
|
||||
return _brbs(programCounter, devMem);
|
||||
}
|
||||
case 0b1111010000000000:
|
||||
{
|
||||
return _brbc(programCounter, devMem);
|
||||
}
|
||||
}
|
||||
// if((op & (~0b0000001111111111)) == 0b0000010000000000) {return _cpc(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0000100000000000) {return _sbc(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0000110000000000) {return _add(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0001000000000000) {return _cpse(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0001010000000000) {return _cp(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0001100000000000) {return _sub(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0001110000000000) {return _adc(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0010000000000000) {return _and(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0010010000000000) {return _eor(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0010100000000000) {return _or(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b0010110000000000) {return _mov(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b1001110000000000) {return _mul(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b1111000000000000) {return _brbs(programCounter, devMem);}
|
||||
// if((op & (~0b0000001111111111)) == 0b1111010000000000) {return _brbc(programCounter, devMem);}
|
||||
if((op & (~0b0000011111111111)) == 0b1011000000000000) {return _in(programCounter, devMem);}
|
||||
if((op & (~0b0000011111111111)) == 0b1011100000000000) {return _out(programCounter, devMem);}
|
||||
switch (op & (~0b0000111111111111))
|
||||
{
|
||||
|
||||
case 0b0011000000000000:
|
||||
{
|
||||
return _cpi(programCounter, devMem);
|
||||
}
|
||||
case 0b0100000000000000:
|
||||
{
|
||||
return _sbci(programCounter, devMem);
|
||||
}
|
||||
case 0b0101000000000000:
|
||||
{
|
||||
return _subi(programCounter, devMem);
|
||||
}
|
||||
case 0b0110000000000000:
|
||||
{
|
||||
return _sbr(programCounter, devMem);
|
||||
}
|
||||
case 0b0111000000000000:
|
||||
{
|
||||
return _andi(programCounter, devMem);
|
||||
}
|
||||
case 0b1100000000000000:
|
||||
{
|
||||
return _rjmp(programCounter, devMem);
|
||||
}
|
||||
case 0b1101000000000000:
|
||||
{
|
||||
return _rcall(programCounter, devMem);
|
||||
}
|
||||
case 0b1110000000000000:
|
||||
{
|
||||
return _ldi(programCounter, devMem);
|
||||
}
|
||||
}
|
||||
// if((op & (~0b0000111111111111)) == 0b0011000000000000) {return _cpi(programCounter, devMem);}
|
||||
// if((op & (~0b0000111111111111)) == 0b0100000000000000) {return _sbci(programCounter, devMem);}
|
||||
// if((op & (~0b0000111111111111)) == 0b0101000000000000) {return _subi(programCounter, devMem);}
|
||||
// if((op & (~0b0000111111111111)) == 0b0110000000000000) {return _sbr(programCounter, devMem);}
|
||||
// if((op & (~0b0000111111111111)) == 0b0111000000000000) {return _andi(programCounter, devMem);}
|
||||
// if((op & (~0b0000111111111111)) == 0b1100000000000000) {return _rjmp(programCounter, devMem);}
|
||||
// if((op & (~0b0000111111111111)) == 0b1101000000000000) {return _rcall(programCounter, devMem);}
|
||||
// if((op & (~0b0000111111111111)) == 0b1110000000000000) {return _ldi(programCounter, devMem);}
|
||||
switch (op & (~0b0010110111110111))
|
||||
{
|
||||
case 0b1000000000000000:
|
||||
{
|
||||
return _ld_ldd_14(programCounter, devMem);
|
||||
}
|
||||
case 0b1000000000001000:
|
||||
{
|
||||
return _ld_ldd4(programCounter, devMem);
|
||||
}
|
||||
case 0b1000001000000000:
|
||||
{
|
||||
return _st_std_14(programCounter, devMem);
|
||||
}
|
||||
case 0b1000001000001000:
|
||||
{
|
||||
return _st_std4(programCounter, devMem);
|
||||
}
|
||||
}
|
||||
// if((op & (~0b0010110111110111)) == 0b1000000000000000) {return _ld_ldd_14(programCounter, devMem);}
|
||||
// if((op & (~0b0010110111110111)) == 0b1000000000001000) {return _ld_ldd4(programCounter, devMem);}
|
||||
// if((op & (~0b0010110111110111)) == 0b1000001000000000) {return _st_std_14(programCounter, devMem);}
|
||||
// if((op & (~0b0010110111110111)) == 0b1000001000001000) {return _st_std4(programCounter, devMem);}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define HANDLER_REGISTERS {\
|
||||
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
||||
{&_add, 0b0000110000000000, 0b0000001111111111, 2}, \
|
||||
|
||||
@@ -105,6 +105,282 @@ 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 & (~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 & (~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 & (~0b0000001111111111)) == 0b0010010000000000)
|
||||
{
|
||||
return _eor(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 & (~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 & (~0b0000000111110000)) == 0b1001000000000001)
|
||||
{
|
||||
return _ld_ldd_12(programCounter, devMem);
|
||||
}
|
||||
else if((op & (~0b0000000111110000)) == 0b1001000000000010)
|
||||
{
|
||||
return _ld_ldd_13(programCounter, devMem);
|
||||
}
|
||||
else if((op & (~0b0000111111111111)) == 0b1110000000000000)
|
||||
{
|
||||
return _ldi(programCounter, devMem);
|
||||
}
|
||||
else if((op & (~0b0000011111111111)) == 0b1010000000000000)
|
||||
{
|
||||
return _lds_avrrc(programCounter, devMem);
|
||||
}
|
||||
else if((op & (~0b0000000111110000)) == 0b1001010000000110)
|
||||
{
|
||||
return _lsr(programCounter, devMem);
|
||||
}
|
||||
else if((op & (~0b0000001111111111)) == 0b0010110000000000)
|
||||
{
|
||||
return _mov(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 & (~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 & (~0b0000000111110000)) == 0b1001001000000001)
|
||||
{
|
||||
return _st_std_12(programCounter, devMem);
|
||||
}
|
||||
else if((op & (~0b0000000111110000)) == 0b1001001000000010)
|
||||
{
|
||||
return _st_std_13(programCounter, devMem);
|
||||
}
|
||||
else if((op & (~0b0000011111111111)) == 0b1010100000000000)
|
||||
{
|
||||
return _sts_avrrc(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);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
#define HANDLER_REGISTERS {\
|
||||
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
||||
{&_add, 0b0000110000000000, 0b0000001111111111, 2}, \
|
||||
|
||||
@@ -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}, \
|
||||
|
||||
@@ -105,6 +105,372 @@ 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 & (~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)) == 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);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#define HANDLER_REGISTERS {\
|
||||
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
||||
{&_add, 0b0000110000000000, 0b0000001111111111, 2}, \
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <libhmmmm/device.h>
|
||||
#include <libhmmmm/mem.h>
|
||||
|
||||
#ifndef RAM_CELL_WORDS
|
||||
#define RAM_CELL_WORDS 1
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
|
||||
|
||||
|
||||
#define MEMDATA_GP_REGS 1
|
||||
#define MEMDATA_IO_REGS 2
|
||||
#define MEMDATA_DS 3
|
||||
#define MEMDATA_GP_REGS 2
|
||||
#define MEMDATA_IO_REGS 3
|
||||
#define MEMDATA_DS 4
|
||||
#define MEMDATA_OPSIZE 5
|
||||
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
{MEMSEG_PC_SEG_NUM, "PC", 2, 1, 0, 0}, \
|
||||
{MEMDATA_IO_REGS, "IO_REG", 1, 255, (1024 * 2) + 2, 0}, \
|
||||
{MEMDATA_GP_REGS, "GP_REG", 1, 32, (1024 * 2) + 2 + 255, 0}, \
|
||||
{MEMDATA_DS, "DS", 1, 65535, 2, 0} \
|
||||
{MEMDATA_DS, "DS", 1, 65535, 2, 0}, \
|
||||
{MEMDATA_OPSIZE, "OPSIZE", 1, 1, (1024 * 2) + 2 + 255 + 32, 0} \
|
||||
}
|
||||
|
||||
#endif //ifndef __MEM_SEG_H__
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "mem.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "addrs.h"
|
||||
|
||||
|
||||
16
src/runner.c
16
src/runner.c
@@ -1,10 +1,26 @@
|
||||
#include "runner.h"
|
||||
#include <stdio.h>
|
||||
#include "generated.h"
|
||||
|
||||
static const instruction_metadata_t metadataArray[] = HANDLER_REGISTERS;
|
||||
|
||||
uint8_t makeTick(prog_counter_t* programCounter, instr_h_func* funcarr, device_mem_t* devMem)
|
||||
{
|
||||
opcode_t op = extractOpcode(devMem, *programCounter);
|
||||
// return _dispatchInstruction(op, programCounter, devMem);
|
||||
|
||||
|
||||
// for(size_t i = 0; i < sizeof(metadataArray) / sizeof(instruction_metadata_t); i++)
|
||||
// {
|
||||
// const instruction_metadata_t metadata = metadataArray[i];
|
||||
// if((op & (~metadata.argsMask)) == metadata.base)
|
||||
// {
|
||||
// return metadata.h(programCounter, devMem);
|
||||
// }
|
||||
// }
|
||||
|
||||
// return 0;
|
||||
|
||||
instr_h_func func = funcarr[op];
|
||||
return func(programCounter, devMem);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user