feat: какая-то минимальная система обработки опкодов
This commit is contained in:
71
src/optable.py
Normal file
71
src/optable.py
Normal file
@ -0,0 +1,71 @@
|
||||
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()
|
||||
MEM_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)
|
||||
Reference in New Issue
Block a user