From 1b3f49fc3b4bc7dcce79ea6c96d1368f7ce8ed0c Mon Sep 17 00:00:00 2001 From: nikto_b Date: Thu, 7 May 2026 14:13:55 +0300 Subject: [PATCH] optim, try different dispatch strategies, add reset handler --- Makefile | 6 +- inc/addrs.h | 19 ++- inc/generated.h | 2 + inc/generated_AVRe.h | 370 ++++++++++++++++++++++++++++++++++++++++ inc/generated_AVRrc.h | 276 ++++++++++++++++++++++++++++++ inc/generated_AVRxm.h | 384 ++++++++++++++++++++++++++++++++++++++++++ inc/generated_AVRxt.h | 366 ++++++++++++++++++++++++++++++++++++++++ inc/mem.h | 1 + inc/mem_seg.h | 9 +- src/instr.c | 1 + src/runner.c | 16 ++ 11 files changed, 1438 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 53f63c2..955e6b9 100644 --- a/Makefile +++ b/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))) diff --git a/inc/addrs.h b/inc/addrs.h index 29278db..3df21b0 100644 --- a/inc/addrs.h +++ b/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 diff --git a/inc/generated.h b/inc/generated.h index 6056844..63b65dc 100644 --- a/inc/generated.h +++ b/inc/generated.h @@ -3,6 +3,8 @@ #include #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 diff --git a/inc/generated_AVRe.h b/inc/generated_AVRe.h index 414e4a2..f6613c3 100644 --- a/inc/generated_AVRe.h +++ b/inc/generated_AVRe.h @@ -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}, \ diff --git a/inc/generated_AVRrc.h b/inc/generated_AVRrc.h index 8ced1b3..762458a 100644 --- a/inc/generated_AVRrc.h +++ b/inc/generated_AVRrc.h @@ -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}, \ diff --git a/inc/generated_AVRxm.h b/inc/generated_AVRxm.h index 2b363c5..1e784d6 100644 --- a/inc/generated_AVRxm.h +++ b/inc/generated_AVRxm.h @@ -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}, \ diff --git a/inc/generated_AVRxt.h b/inc/generated_AVRxt.h index 3ba2988..4963462 100644 --- a/inc/generated_AVRxt.h +++ b/inc/generated_AVRxt.h @@ -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}, \ diff --git a/inc/mem.h b/inc/mem.h index f63e32e..4de0ad9 100644 --- a/inc/mem.h +++ b/inc/mem.h @@ -4,6 +4,7 @@ #include #include #include +#include #ifndef RAM_CELL_WORDS #define RAM_CELL_WORDS 1 diff --git a/inc/mem_seg.h b/inc/mem_seg.h index c6fd401..db30b2f 100644 --- a/inc/mem_seg.h +++ b/inc/mem_seg.h @@ -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__ \ No newline at end of file diff --git a/src/instr.c b/src/instr.c index 86d7dc1..c8c7710 100644 --- a/src/instr.c +++ b/src/instr.c @@ -2,6 +2,7 @@ #include "mem.h" #include +#include #include "addrs.h" diff --git a/src/runner.c b/src/runner.c index ff09947..fc1afc4 100644 --- a/src/runner.c +++ b/src/runner.c @@ -1,10 +1,26 @@ #include "runner.h" #include +#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); }