EMULATOR_PDP_11
STEPIC Учебный проект на 'С', эмулятор PDP_11 в стиле ООП
Loading...
Searching...
No Matches
📟 PDP-11 Emulator В РАЗРАБОТКЕ

<em>Учебный проект по реализации легендарной 16-битной вычислительной машины</em>

Документирвание проекта "https://kolesnikovvitaliy.github.io/EMULATOR_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) в рамках процедурного языка.

</blockquote>

🛠️ Архитектурные особенности

Несмотря на использование чистого C, внутренняя логика проекта построена на трех столпах ООП:

Принцип Реализация в проекте
🔒 Инкапсуляция Состояние процессора, памяти и устройств ввода-вывода (I/O) инкапсулировано внутри специализированных структур struct. Прямой доступ к данным ограничен.
🧩 Модульность Система разделена на независимые "объекты": COMMAND, I/O, Memory. Каждый компонент можно тестировать и отлаживать отдельно.
🎭 Полиморфизм Гибкая обработка различных типов адресации и инструкций реализована через таблицы переходов и указатели на функции.

🚀 Технологический стек

  • Language: C-89
  • Approach: Object-Oriented Design (OOD)
  • Architecture: DEC PDP-11 (16-bit)
  • Toolchain: GCC / Make

Developed with focus on clean code and architectural excellence.

🏗️ Архитектура системы

Проект разделен на четкие логические блоки, каждый из которых отвечает за свою часть эмуляции:

  • 💾 **Memory** — Объект памяти: хранение данных и строгая проверка границ доступа.
  • 🔌 **IO** — Эмуляция периферийных устройств (терминал, ввод-вывод).
  • 📟 **REGISTER** — Быстрая память: регистры общего назначения R0-R7.
  • 📜 **LOGGER** — Многоуровневая система отладки и мониторинга.
  • ⚙️ **COMMAND** — Ядро процессора: декодирование и выполнение инструкций.

🛠️ Реализация в стиле ООП

Система построена на принципах объектно-ориентированного программирования в среде С:

‍Структуры хранят состояние (поля), а функции, принимающие указатель на структуру (this), выступают в роли методов.

🎮 [PDP_11] Эмулятор

struct pdp_11_t — Центральный интерфейс управления.

Метод Описание
pdp_load_data(...) Загрузка образа программы в память.
pdp_mem_dump(...) Форматированный дамп области памяти.
b_write / b_read Запись и чтение байта по адресу.
w_write / w_read Запись и чтение слова по адресу.

💾 [Memory] Модуль памяти

struct mem_t — Низкоуровневый интерфейс работы с ОЗУ.

  • byte_write / byte_read — Побайтовый доступ.
  • word_write / word_read — Пословный доступ (2 байта).

🔌 [IO] Устройства Ввода-Вывода

struct dev_io_t — Взаимодействие с внешним миром.

  • dev_io_load_data(...) — Загрузка образа программы через интерфейс устройства.

- <tt>dev_io_mem_dump(...)</tt> — Визуализация состояния памяти устройства.

📟 [REGISTER] Регистры

Реализация 8 регистров общего назначения:

  • R0 - R5 — Регистры общего назначения.
  • R6 (SP) — Указатель стека (Stack Pointer).

* <tt>R7 (PC)</tt> — Счетчик команд (<em>Program Counter</em>).

📜 [LOGGER] Система логирования

Используются макросы для управления выводом:

  • PRINT_RESULT — Замена стандартному printf.
  • 🔴 ERROR — Критические ошибки.
  • 🟢 INFO — Общая информация.
  • 🟡 WARNING — Предупреждения о нештатных ситуациях.
  • 🔵 TRACE — Трассировка вызова функций.
  • 🟣 DEBUG — Подробные данные для разработки.

⚙️ [COMMAND] Исполнение команд

‍🚧 В процессе разработки

‍Чтение и выполнение программ в восьмеричном (octal) формате.

‍Текущая задача: Реализация полного цикла Fetch-Decode-Execute.

⚙️ Система команд (Instruction Set)

На текущем этапе реализованы (или находятся в процессе реализации) следующие основные инструкции:

Мнемоника Опкод Описание Тип
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

Примечание: SS — адрес источника, DD — адрес назначения, XX — смещение.

🔍 Особенности реализации адресации Эмулятор поддерживает стандартные режимы адресации 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 С Нести Устанавливается при переносе из старшего разряда.

Эти флаги критически важны для работы инструкций ветвления (например, BEQ, BNE, BMI).

🚀 Сборка и запуск

1. Требования

Для сборки вам понадобится компилятор gcc или clang с поддержкой стандарта C89.

Запуск

Для сборки проекта используется make:

git clone https://github.com/kolesnikovvitaliy/EMULATOR_PDP_11.git
cd EMULATOR_PDP_11
make

Для сборки проекта Windows:

git clone https://github.com/kolesnikovvitaliy/EMULATOR_PDP_11.git
cd EMULATOR_PDP_11
mingw32-gcc -O2 -g3 -Wall -Wextra -Wpedantic -std=c11 -Iinclude -o pdp.exe src/main.c src/pdp_11/utils/utils.c src/pdp_11/utils/logger/logger.c src/pdp_11/run.c src/pdp_11/memory/mem.c src/pdp_11/memory/buf_byte/buf_byte.c src/pdp_11/memory/buf_word/buf_word.c src/pdp_11/register/register.c src/pdp_11/size_buffer.c src/pdp_11/device_io/device_io.c src/pdp_11/device_io/terminal_io/dev_terminal_io.c src/pdp_11/device_io/files_io/dev_files_io.c src/pdp_11/pdp_11.c src/pdp_11/command/command.c test/test_pdp/test_io/test_io.c test/test_pdp/test_io/test_io_files/test_io_files.c test/test_pdp/test_io/test_io_terminal/test_io_terminal.c test/test_pdp/test_pdp.c test/test_pdp/test_memory/test_mem_word/test_word.c test/test_pdp/test_memory/test_mem_byte/test_byte.c test/test_pdp/test_memory/test_memory.c test/test.c

💎 Параметры запуска

Используйте флаги командной строки для управления поведением эмулятора и уровнем детализации отчетов:

💠 Флаг 🧊 Название 🌐 Описание
-t Trace Включает пошаговую трассировку: вывод состояния всех регистров и флагов PSW после каждой исполненной команды.
-d Debug/Tests Запуск встроенного набора модульных тестов для верификации корректности работы памяти, регистров и системы команд.

Запуск

./pdp.exe -t ./data/test.txt

Для запуска модульных тестов

./pdp.exe -t -d ./data/test.txt

📋 Описание проекта

🔍 Пример логирования

В проекте реализована наглядная система отладки для контроля за состоянием процессора:

‍🟩 [INFO] — Общая информация о загрузке дампа. 🟦 [DEBUG] — Состояние регистров (R0-R7) после каждой инструкции. 🟥 [ERROR] — Ошибки обращения к памяти или неизвестные опкоды.

</blockquote>

📈 План разработки (Roadmap)

  • [x] 🏗️ Этап 1: Базовая структура проекта и логгер.
  • [ ] ⚙️ Этап 2: Полная реализация системы команд (Instruction Set).
  • [ ] ⚡ Этап 3: Поддержка прерываний.
  • [ ] ⌨️ Этап 4: Эмуляция терминала и простейшего ввода/вывода.
  • [ ] 🧪 Этап 5: Запуск оригинальных тестов PDP-11.

🤝 Контакты

Автор: Vitaliy Kolesnikov Телефон: 8(938)165-83-47 Email: kolesnikovvitaliy@mail.ru

Проект находится в активной стадии разработки. Если у вас есть идеи или вы нашли баг — смело создавайте Issue или Pull Request!


Developed with ❤️ for Retro Computing