Files
dp32-proto/src/optable.py

72 lines
1.9 KiB
Python

from dataclasses import dataclass
from enum import Flag, Enum, auto
class OpcodeFlags(Flag):
QUICK = auto()
# Форсирует чтение не более 1 слова
# в тех случаях, когда это не требуется
# по характеру действия
UNEXPANDED = auto()
OpF = OpcodeFlags
class OpcodeLayout(Enum):
MATH = auto()
BRANCH = auto()
MEM = auto()
OpL = OpcodeLayout
class OpcodeActions(Enum):
ADD = auto()
SUB = auto()
MUL = auto()
DIV = auto()
AND = auto()
OR = auto()
XOR = auto()
MASK = auto()
LOAD = auto()
STORE = auto()
BRANCH = auto()
IND_BRANCH = auto()
OpA = OpcodeActions
@dataclass(frozen=True)
class OpcodeDescription:
flags: OpcodeFlags
layout: OpcodeLayout
action: OpcodeActions
OpD = OpcodeDescription
OPCODES = {
# block 1
0x00: OpD(OpF(0), OpL.MATH, OpA.ADD),
0x10: OpD(OpF.QUICK, OpL.MATH, OpA.ADD),
0x01: OpD(OpF(0), OpL.MATH, OpA.SUB),
0x11: OpD(OpF.QUICK, OpL.MATH, OpA.SUB),
0x02: OpD(OpF(0), OpL.MATH, OpA.MUL),
0x12: OpD(OpF.QUICK, OpL.MATH, OpA.MUL),
0x03: OpD(OpF(0), OpL.MATH, OpA.DIV),
0x13: OpD(OpF.QUICK, OpL.MATH, OpA.DIV),
0x04: OpD(OpF.UNEXPANDED, OpL.MATH, OpA.AND),
0x05: OpD(OpF.UNEXPANDED, OpL.MATH, OpA.OR),
0x06: OpD(OpF.UNEXPANDED, OpL.MATH, OpA.XOR),
0x07: OpD(OpF.UNEXPANDED, OpL.MATH, OpA.MASK),
# block 2
0x20: OpD(OpF(0), OpL.MEM, OpA.LOAD),
0x30: OpD(OpF.QUICK, OpL.MEM, OpA.LOAD),
0x21: OpD(OpF(0), OpL.MEM, OpA.STORE),
0x31: OpD(OpF.QUICK, OpL.MEM, OpA.STORE),
# block 3
0x40: OpD(OpF(0), OpL.BRANCH, OpA.BRANCH),
0x50: OpD(OpF.QUICK, OpL.BRANCH, OpA.BRANCH),
0x51: OpD(OpF(0), OpL.BRANCH, OpA.MEM_BRANCH),
}
if __name__ == "__main__":
print(hex(12))
print(~12)