72 lines
1.9 KiB
Python
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)
|