Вступление
С началом учебного года в мой техникум пришла такая штука, как Код будущего. Я и пара моих приятелей решили записаться на курсы по программированию на Python, но этот процесс длился очень долго, к сожалению так ничего и не началось :( Из-за двух каких-то, извиняюсь за выражение, дебилов, которые что-то и где-то не успели вовремя заполнить и сдать, пришлось свернуть эту программу в моём техникуме. Я не особо расстроился, наоборот, это даже дало мне хороший толчок для изучения данного языка программирования самостоятельно дома, как я и делал со всеми предыдущими языками :) Изучив достаточно материала, я осмелился на написание эмулятора CPU, конкретно Intel 4004 (дедушку современных микропроцессоров) с очень урезанным функционалом.
Как всё писалось?
Перед началом я прочитал различные статьи, документации, смотрел видео на YouTube и тем самым получил необходимый минимум знаний о том, как работает CPU.
Начал я с реализации памяти, в которую будут записываться результаты программ:
memory = bytearray(256) # 256 байт памяти
Затем я создал класс I4004, в который стал добавлять функции. Первой стала функция инициализации:
def __init__(self, program, memory): self.program = program self.memory = memory self.acc = 0 # Аккумулятор self.pc = 0 # Счётчик команд
Имеется Аккумулятор (acc) — регистр процессора, в котором сохраняются результаты выполнения арифметических и логических команд, а также Счётчик команд (pc) - регистр процессора, который указывает, какую команду нужно выполнять следующей.
Следующей стала функция run, которая отвечала за запуск:
def run(self): while True: opcode = self.program[self.pc] if opcode == 0x00: # Остановка return elif opcode == 0xA2: # Загрузка числа в аккумулятор self.acc = self.program[self.pc + 1] self.pc += 2 elif opcode == 0xA4: # Загрузка числа в регистр 0 self.rr0 = self.program[self.pc + 1] self.pc += 2 elif opcode == 0x58: # Сложение self.acc += self.rr0 self.pc += 1 if self.acc > 15: self.acc = 15 print("Вы не можете получить число выше 15!") elif opcode == 0x29: # Вычитание self.acc -= self.rr0 self.pc += 1 if self.acc < 0: self.acc = 0 print("Вы не можете получить число ниже 0!") # и так далее... else: print("Неизвестная инструкция!") return
Для составления программ используется опкод — часть машинного языка, называемая инструкцией и определяющая операцию, которая должна быть выполнена. Вот таблица опкодов и соответствующая им операция:
Опкод | Операция |
0x00 | Остановка программы |
0xA2 | Загрузка числа в аккумулятор |
0xA4 | Загрузка числа в регистр 0 |
0x58 | Сложение |
0x29 | Вычитание |
0x16 | Логическая операция И |
0x08 | Логическая операция ИЛИ |
0xD0 | Сохранение результата в памяти |
Как составляется программа?
Программу надо составлять прямо в коде, а конкретно в program.py. Вот пример программы сложения чисел 5 и 3:
program = [ 0xA2, 0x05, 0xA4, 0x03, 0x58, 0xD0, 0x10, 0x00, ]

Заключение
Надеюсь, что кому-нибудь эта статья станет полезной, возможно она подтолкнёт кого-то на написание чего-то похожего.
Полный код можно посмотреть на моём GitHub.
С вами был Yura_FX. Спасибо, что дочитали данную статью до конца. Не забывайте делиться своим мнением в комментариях :)
