-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata_types.py
More file actions
92 lines (64 loc) · 1.62 KB
/
data_types.py
File metadata and controls
92 lines (64 loc) · 1.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from dataclasses import dataclass
from typing import Union, Protocol
from base.Register import Register
type Byte = int
# Registers
type RegisterCode = Byte
type RegisterSet = dict[RegisterCode, Register]
# Instructions
type Operand = Union[Register, int, None]
type Operands = list[Operand]
class Instruction_ZeroOperands(Protocol):
def __call__(self) -> None:
pass
class Instruction_OneOperand(Protocol):
def __call__(self, first_operand: Operand) -> None:
pass
class Instruction_TwoOperands(Protocol):
def __call__(self, first_operand: Operand, second_operand: Operand) -> None:
pass
class Instruction_ThreeOperands(Protocol):
def __call__(
self, first_operand: Operand, second_operand: Operand, third_operand: Operand
) -> None:
pass
type InstructionMethod = Union[
Instruction_ZeroOperands,
Instruction_OneOperand,
Instruction_TwoOperands,
Instruction_ThreeOperands,
]
@dataclass
class MetaInstruction:
mnemonic: str
method: InstructionMethod
number_of_operands: int
@dataclass
class Instruction:
method: InstructionMethod
operands: Operands
type Opcode = Byte
type InstructionSet = dict[Opcode, MetaInstruction]
# Operand types
@dataclass
class OperandType:
name: str
operand_size_byte: int
type OperandTypeCode = Byte
type OperandTypeSet = dict[OperandTypeCode, OperandType]
# Interrupts
@dataclass
class Interrupt:
interrupt_command: Byte
memory_address: Byte
arguments: bytearray
# CPU context
@dataclass
class CPUContext:
R0: int
R1: int
R2: int
R3: int
R4: int
R5: int
R6: int