|
EMULATOR_PDP_11
STEPIC Учебный проект на 'С', эмулятор PDP_11 в стиле ООП
|
Проект реализует полноценный цикл работы процессора и периферии:
| Функция | Описание реализации | Акценты |
|---|---|---|
| 🧠 Эмуляция CPU | Полная поддержка системы команд архитектуры PDP-11. | MOV, ADD, SOB, BR |
| 📟 Регистровая модель | Реализация 8 регистров общего назначения (R0-R7). | SP, PC, PSW |
| 📂 Загрузчик (Loader) | Автоматическое чтение и выполнение программ. | Octal Format |
| 🔍 Трассировка | Интерактивный мониторинг состояния системы в реальном времени. | Flags, Registers |
Core** — Поддержка арифметических, логических операций и инструкций ветвления.Memory Management** — Реализация работы со стеком (SP) и счетчиком команд (PC).Binary Support** — Работа с классическим восьмеричным дампом памяти, характерным для ретро-компьютеров.Debugger** — Детальный вывод флагов состояния процессора (PSW) после каждой инструкции для глубокой отладки.Проект представляет собой высокоточный эмулятор архитектуры PDP-11, написанный на языке Си.
Ключевая особенность: Строгое соблюдение объектно-ориентированного подхода (OOD) в рамках процедурного языка.
Несмотря на использование чистого C, внутренняя логика проекта построена на трех столпах ООП:
| Принцип | Реализация в проекте |
|---|---|
| 🔒 Инкапсуляция | Состояние процессора, памяти и устройств ввода-вывода (I/O) инкапсулировано внутри специализированных структур struct. Прямой доступ к данным ограничен. |
| 🧩 Модульность | Система разделена на независимые "объекты": COMMAND, I/O, Memory. Каждый компонент можно тестировать и отлаживать отдельно. |
| 🎭 Полиморфизм | Гибкая обработка различных типов адресации и инструкций реализована через таблицы переходов и указатели на функции. |
C-89Developed with focus on clean code and architectural excellence.
Проект разделен на четкие логические блоки, каждый из которых отвечает за свою часть эмуляции:
Memory** — Объект памяти: хранение данных и строгая проверка границ доступа.IO** — Эмуляция периферийных устройств (терминал, ввод-вывод).REGISTER** — Быстрая память: регистры общего назначения R0-R7.LOGGER** — Многоуровневая система отладки и мониторинга.COMMAND** — Ядро процессора: декодирование и выполнение инструкций.Система построена на принципах объектно-ориентированного программирования в среде С:
Структуры хранят состояние (поля), а функции, принимающие указатель на структуру (
this), выступают в роли методов.
struct pdp_11_t — Центральный интерфейс управления.
| Метод | Описание |
|---|---|
pdp_load_data(...) | Загрузка образа программы в память. |
pdp_mem_dump(...) | Форматированный дамп области памяти. |
b_write / b_read | Запись и чтение байта по адресу. |
w_write / w_read | Запись и чтение слова по адресу. |
struct mem_t — Низкоуровневый интерфейс работы с ОЗУ.
byte_write / byte_read — Побайтовый доступ.word_write / word_read — Пословный доступ (2 байта).struct dev_io_t — Взаимодействие с внешним миром.
dev_io_load_data(...) — Загрузка образа программы через интерфейс устройства. Реализация 8 регистров общего назначения:
R0 - R5 — Регистры общего назначения.R6 (SP) — Указатель стека (Stack Pointer). Используются макросы для управления выводом:
PRINT_RESULT — Замена стандартному printf.ERROR — Критические ошибки.INFO — Общая информация.WARNING — Предупреждения о нештатных ситуациях.TRACE — Трассировка вызова функций.DEBUG — Подробные данные для разработки.🚧 В процессе разработки
Чтение и выполнение программ в восьмеричном (octal) формате.
Текущая задача: Реализация полного цикла Fetch-Decode-Execute.
| Мнемоника | Опкод | Описание | Тип |
|---|---|---|---|
| MOV | 1SSDD | Пересылка данных (Source → Destination) | Double Operand |
| ADD | 06SSDD | Сложение (Source + Destination → Destination) | Double Operand |
| SUB | 16SSDD | Вычитание (Dest - Source → Destination) | Double Operand |
| CLR | 0050DD | Очистка (0 → Destination) | Single Operand |
| INC | 0052DD | Инкремент (Dest + 1 → Destination) | Single Operand |
| BR | 0004XX | Безусловный переход | Branch |
| SOB | 077RXX | Вычесть 1 и перейти, если не ноль | Program Control |
| HALT | 000000 | Остановка процессора | Control |
🔍 Особенности реализации адресации Эмулятор поддерживает стандартные режимы адресации PDP-11 для каждого операнда:
| Режим (Mode) | Название | Синтаксис | Описание |
|---|---|---|---|
| 0 | Register | Rn | Прямая работа с регистрами R0-R7. |
| 1 | Register Deferred | @Rn или (Rn) | Косвенная адресация через регистр. |
| 2 | Autoincrement | (Rn)+ | Автоинкремент (также для немедленных значений #val через PC). |
| 4 | Autodecrement | -(Rn) | Автодекремент перед выполнением операции. |
┌──────────────────────────┐
│ Fetch │ 1. Чтение слова по адресу PC
│ (Чтение из памяти) │ PC = PC + 2
└────────────┬─────────────┘
▼
┌──────────────────────────┐
│ DECODE │ 2. Определение типа команды
│ (Парсинг опкода) │ Выделение Mode и Register
└────────────┬─────────────┘
▼
┌──────────────────────────┐
│ GET OPERANDS (Src/Dst)│ 3. Вычисление эффективных адресов
│ (Режимы адресации 0-7) │ Загрузка значений операндов
└────────────┬─────────────┘
▼
┌──────────────────────────┐
│ EXECUTE │ 4. Арифметико-логическая операция
│ (ALU / Регистры) │ Обновление флагов PSW (N, Z, V, C)
└────────────┬─────────────┘
└─────────────────── Повтор цикла ───►
🚩 Регистр состояния процессора (PSW)
Регистр PSW (адрес 177776) хранит текущий статус выполнения и приоритет процессора. Особое внимание в эмуляторе уделено флагам условий (Condition Codes):
| Бит | Флаг | Название | Описание |
|---|---|---|---|
| 3 | Н | Отрицательный | Устанавливается, если результат операции отрицательный. |
| 2 | С | Ноль | Устанавливается, если результат операции равен нулю. |
| 1 | В | Переполнение | Устанавливается при арифметическом переполнении. |
| 0 | С | Нести | Устанавливается при переносе из старшего разряда. |
Для сборки вам понадобится компилятор gcc или clang с поддержкой стандарта C89.
Для сборки проекта используется make:
Для сборки проекта Windows:
Используйте флаги командной строки для управления поведением эмулятора и уровнем детализации отчетов:
| 💠 Флаг | 🧊 Название | 🌐 Описание |
|---|---|---|
-t | Trace | Включает пошаговую трассировку: вывод состояния всех регистров и флагов PSW после каждой исполненной команды. |
-d | Debug/Tests | Запуск встроенного набора модульных тестов для верификации корректности работы памяти, регистров и системы команд. |
В проекте реализована наглядная система отладки для контроля за состоянием процессора:
🟩 [INFO] — Общая информация о загрузке дампа. 🟦 [DEBUG] — Состояние регистров
(R0-R7)после каждой инструкции. 🟥 [ERROR] — Ошибки обращения к памяти или неизвестные опкоды.
Автор: Vitaliy Kolesnikov Телефон: 8(938)165-83-47 Email: kolesnikovvitaliy@mail.ru
Проект находится в активной стадии разработки. Если у вас есть идеи или вы нашли баг — смело создавайте Issue или Pull Request!
Developed with ❤️ for Retro Computing