optim, try different dispatch strategies, add reset handler
This commit is contained in:
6
Makefile
6
Makefile
@@ -20,7 +20,7 @@ OBJDUMP=objdump
|
|||||||
LIBS=
|
LIBS=
|
||||||
STANDART=c23
|
STANDART=c23
|
||||||
|
|
||||||
OPTIMIZE=-Og
|
OPTIMIZE=-O3
|
||||||
TARGET=device
|
TARGET=device
|
||||||
ifeq ($(ARCH),)
|
ifeq ($(ARCH),)
|
||||||
ARCH := "template"
|
ARCH := "template"
|
||||||
@@ -39,8 +39,8 @@ PEDANTIC_FLAGS=-pedantic -pedantic-errors $(DISABLE_FLAGS) -Wall -Wcast-align -W
|
|||||||
ANALYZER_FLAGS=-fanalyzer
|
ANALYZER_FLAGS=-fanalyzer
|
||||||
LSECTIONS=-ffunction-sections -fdata-sections -Wl,--gc-sections
|
LSECTIONS=-ffunction-sections -fdata-sections -Wl,--gc-sections
|
||||||
CFLAGS=$(C_DEFS) -g $(C_INCLUDES) $(DEFINES) $(OPTIMIZE) --std=$(STANDART) $(PEDANTIC_FLAGS) $(ANALYZER_FLAGS) -fPIC
|
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
|
LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -fuse-linker-plugin $(LSECTIONS) -lm $(LIBS) -fPIC -shared
|
||||||
MANIFEST_LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -flto -fuse-linker-plugin $(LSECTIONS) -lm $(LIBS) -fPIC
|
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)))
|
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__
|
#define __ADDRS_H__
|
||||||
#include "mem_seg.h"
|
#include "mem_seg.h"
|
||||||
|
|
||||||
#define IOREG_SREG_ADDR 0x5F
|
#define IOREG_SREG_ADDR 0x3F
|
||||||
#define IOREG_SPH_ADDR 0x5E
|
#define IOREG_SPH_ADDR 0x3E
|
||||||
#define IOREG_SPL_ADDR 0x5D
|
#define IOREG_SPL_ADDR 0x3D
|
||||||
#define IOREG_EIND_ADDR 0x5C
|
#define IOREG_EIND_ADDR 0x3C
|
||||||
#define IOREG_RAMPZ_ADDR 0x5B
|
#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
|
#define GPREG_ZH_ADDR 31
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "addrs.h"
|
#include "addrs.h"
|
||||||
|
|
||||||
|
// static inline uint8_t _dispatchInstruction(const opcode_t op, prog_counter_t* programCounter, device_mem_t* devMem);
|
||||||
|
|
||||||
#if ARCH == AVRe
|
#if ARCH == AVRe
|
||||||
#include "generated_AVRe.h"
|
#include "generated_AVRe.h"
|
||||||
#endif
|
#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);
|
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 {\
|
#define HANDLER_REGISTERS {\
|
||||||
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
||||||
{&_add, 0b0000110000000000, 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);
|
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 {\
|
#define HANDLER_REGISTERS {\
|
||||||
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
||||||
{&_add, 0b0000110000000000, 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 _wdr (prog_counter_t* pcounter, device_mem_t* devMem);
|
||||||
uint8_t _xch (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 {\
|
#define HANDLER_REGISTERS {\
|
||||||
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
{&_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);
|
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 {\
|
#define HANDLER_REGISTERS {\
|
||||||
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
|
||||||
{&_add, 0b0000110000000000, 0b0000001111111111, 2}, \
|
{&_add, 0b0000110000000000, 0b0000001111111111, 2}, \
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <libhmmmm/device.h>
|
#include <libhmmmm/device.h>
|
||||||
|
#include <libhmmmm/mem.h>
|
||||||
|
|
||||||
#ifndef RAM_CELL_WORDS
|
#ifndef RAM_CELL_WORDS
|
||||||
#define RAM_CELL_WORDS 1
|
#define RAM_CELL_WORDS 1
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define MEMDATA_GP_REGS 1
|
#define MEMDATA_GP_REGS 2
|
||||||
#define MEMDATA_IO_REGS 2
|
#define MEMDATA_IO_REGS 3
|
||||||
#define MEMDATA_DS 3
|
#define MEMDATA_DS 4
|
||||||
#define MEMDATA_OPSIZE 5
|
#define MEMDATA_OPSIZE 5
|
||||||
|
|
||||||
|
|
||||||
@@ -27,7 +27,8 @@
|
|||||||
{MEMSEG_PC_SEG_NUM, "PC", 2, 1, 0, 0}, \
|
{MEMSEG_PC_SEG_NUM, "PC", 2, 1, 0, 0}, \
|
||||||
{MEMDATA_IO_REGS, "IO_REG", 1, 255, (1024 * 2) + 2, 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_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__
|
#endif //ifndef __MEM_SEG_H__
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "addrs.h"
|
#include "addrs.h"
|
||||||
|
|
||||||
|
|||||||
16
src/runner.c
16
src/runner.c
@@ -1,10 +1,26 @@
|
|||||||
#include "runner.h"
|
#include "runner.h"
|
||||||
#include <stdio.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)
|
uint8_t makeTick(prog_counter_t* programCounter, instr_h_func* funcarr, device_mem_t* devMem)
|
||||||
{
|
{
|
||||||
opcode_t op = extractOpcode(devMem, *programCounter);
|
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];
|
instr_h_func func = funcarr[op];
|
||||||
return func(programCounter, devMem);
|
return func(programCounter, devMem);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user