optim, try different dispatch strategies, add reset handler

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

View File

@@ -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)))

View File

@@ -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

View File

@@ -3,6 +3,8 @@
#include <stdio.h>
#include "addrs.h"
// static inline uint8_t _dispatchInstruction(const opcode_t op, prog_counter_t* programCounter, device_mem_t* devMem);
#if ARCH == AVRe
#include "generated_AVRe.h"
#endif

View File

@@ -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}, \

View File

@@ -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}, \

View File

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

View File

@@ -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}, \

View File

@@ -4,6 +4,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <libhmmmm/device.h>
#include <libhmmmm/mem.h>
#ifndef RAM_CELL_WORDS
#define RAM_CELL_WORDS 1

View File

@@ -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__

View File

@@ -2,6 +2,7 @@
#include "mem.h"
#include <stdio.h>
#include <stdlib.h>
#include "addrs.h"

View File

@@ -1,10 +1,26 @@
#include "runner.h"
#include <stdio.h>
#include "generated.h"
static const instruction_metadata_t metadataArray[] = HANDLER_REGISTERS;
uint8_t makeTick(prog_counter_t* programCounter, instr_h_func* funcarr, device_mem_t* devMem)
{
opcode_t op = extractOpcode(devMem, *programCounter);
// return _dispatchInstruction(op, programCounter, devMem);
// for(size_t i = 0; i < sizeof(metadataArray) / sizeof(instruction_metadata_t); i++)
// {
// const instruction_metadata_t metadata = metadataArray[i];
// if((op & (~metadata.argsMask)) == metadata.base)
// {
// return metadata.h(programCounter, devMem);
// }
// }
// return 0;
instr_h_func func = funcarr[op];
return func(programCounter, devMem);
}