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.UNEXPANDED, OpL.MATH, OpA.ADD), 0x10: OpD(OpF.QUICK, OpL.MATH, OpA.ADD), 0x01: OpD(OpF.UNEXPANDED, OpL.MATH, OpA.SUB), 0x11: OpD(OpF.QUICK, OpL.MATH, OpA.SUB), 0x02: OpD(OpF.UNEXPANDED, OpL.MATH, OpA.MUL), 0x12: OpD(OpF.QUICK, OpL.MATH, OpA.MUL), 0x03: OpD(OpF.UNEXPANDED, 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.IND_BRANCH), } if __name__ == "__main__": print(hex(12)) print(~12)