mirror of https://github.com/arendst/Tasmota.git
75 lines
3.0 KiB
C
75 lines
3.0 KiB
C
/********************************************************************
|
|
** Copyright (c) 2018-2020 Guan Wenliang
|
|
** This file is part of the Berry default interpreter.
|
|
** skiars@qq.com, https://github.com/Skiars/berry
|
|
** See Copyright Notice in the LICENSE file or at
|
|
** https://github.com/Skiars/berry/blob/master/LICENSE
|
|
********************************************************************/
|
|
#ifndef BE_OPCODE_H
|
|
#define BE_OPCODE_H
|
|
|
|
#define NO_JUMP -1
|
|
|
|
/* define field's bit-width */
|
|
#define IOP_BITS 6u
|
|
#define IRA_BITS 8u
|
|
#define IRKB_BITS 9u
|
|
#define IRKC_BITS 9u
|
|
|
|
/* define field's bit-width and positions */
|
|
#define IRKC_POS 0u
|
|
#define IRKB_POS (IRKC_POS + IRKC_BITS)
|
|
#define IRA_POS (IRKB_POS + IRKB_BITS)
|
|
#define IOP_POS (IRA_POS + IRA_BITS)
|
|
#define IAx_BITS (IRA_BITS + IRKB_BITS + IRKC_BITS)
|
|
#define IBx_BITS (IRKC_BITS + IRKB_BITS)
|
|
|
|
/* basic field operation */
|
|
#define INS_MASK(pos, bits) ((binstruction)((1 << (bits)) - 1) << (pos))
|
|
#define INS_GETx(i, mask, pos) cast_int(((binstruction)(i) & (mask)) >> (pos))
|
|
#define INS_SETx(v, mask, pos) (((binstruction)(v) << (pos)) & (mask))
|
|
|
|
/* instruction operation */
|
|
#define isK(v) (((v) & (1 << (IRKB_BITS - 1))) != 0)
|
|
#define setK(v) ((v) | (1 << (IRKB_BITS - 1)))
|
|
#define KR2idx(v) ((v) & 0xFF)
|
|
#define isKB(v) (((v) & (1 << (IRA_POS - 1))) != 0)
|
|
#define isKC(v) (((v) & (1 << (IRKB_POS - 1))) != 0)
|
|
|
|
/* define masks and limit values */
|
|
#define IOP_MASK INS_MASK(IOP_POS, IOP_BITS)
|
|
#define IRA_MASK INS_MASK(IRA_POS, IRA_BITS)
|
|
#define IRKB_MASK INS_MASK(IRKB_POS, IRKB_BITS)
|
|
#define IRKC_MASK INS_MASK(IRKC_POS, IRKC_BITS)
|
|
#define IAx_MASK INS_MASK(0, IAx_BITS)
|
|
#define IBx_MASK INS_MASK(0, IBx_BITS)
|
|
#define IsBx_MAX cast_int(IBx_MASK >> 1)
|
|
#define IsBx_MIN cast_int(-IsBx_MAX - 1)
|
|
|
|
/* mask for K/R values */
|
|
#define KR_MASK ((1 << (IRKB_BITS-1)) - 1)
|
|
|
|
/* get field */
|
|
#define IGET_OP(i) cast(bopcode, INS_GETx(i, IOP_MASK, IOP_POS))
|
|
#define IGET_RA(i) INS_GETx(i, IRA_MASK, IRA_POS)
|
|
#define IGET_RKB(i) INS_GETx(i, IRKB_MASK, IRKB_POS)
|
|
#define IGET_RKC(i) INS_GETx(i, IRKC_MASK, IRKC_POS)
|
|
#define IGET_Bx(i) INS_GETx(i, IBx_MASK, 0)
|
|
#define IGET_sBx(i) (IGET_Bx(i) - IsBx_MAX)
|
|
|
|
/* set field */
|
|
#define ISET_OP(i) INS_SETx(i, IOP_MASK, IOP_POS)
|
|
#define ISET_RA(i) INS_SETx(i, IRA_MASK, IRA_POS)
|
|
#define ISET_RKB(i) INS_SETx(i, IRKB_MASK, IRKB_POS)
|
|
#define ISET_RKC(i) INS_SETx(i, IRKC_MASK, IRKC_POS)
|
|
#define ISET_Bx(i) INS_SETx(i, IBx_MASK, 0)
|
|
#define ISET_sBx(i) (ISET_Bx(cast_int(i) + IsBx_MAX))
|
|
|
|
typedef enum {
|
|
#define OPCODE(opc) OP_##opc
|
|
#include "be_opcodes.h"
|
|
#undef OPCODE
|
|
} bopcode;
|
|
|
|
#endif
|