Перейти к содержанию

Устройства

Раздел описывает периферийные устройства системы, их назначение и особенности работы.

Классы устройств

Каждое устройство относится к одному из классов:

Код Класс
00h Nome
01h Storage
02h Input
03h Timer
04h RTC
05h Video
06h RNG
07h FPU
08h Audio (PSG)
FFh Unknown

Производители

Код Производитель
00h None
01h System

Видеокарты

Видеокарта выбирается в GUI эмулятора или через параметр --vc командной строки.

Доступные варианты

Имя Описание
default Комбинированная текстовая/графическая карта, режим выбирается через VC_MODE
default-text Только текстовый режим 80x25, 16 цветов
default-mono Только монохромный текстовый режим 80x25 (зелёный фосфор)

Режимы видеокарты default

Режим задаётся через регистр VC_MODE (0x0002001Ah):

Код Описание
00h 80x25 текст, шрифт 8x16, 16-цветная палитра VGA (640x400)
01h 320x200 графический, 256 цветов (аналог Mode 13h)
10h 40x30 текст, шрифт 8x8, 16 цветов (320x240)
11h 80x60 текст, шрифт 8x8, 16 цветов (640x480)
12h 80x30 текст, шрифт 8x8 растянут до 8x16, 16 цветов (640x480)
20h 320x240 графический, 256 цветов
21h 640x480 графический, 256 цветов
22h 800x600 графический, 256 цветов

FPU (сопроцессор с плавающей точкой)

FPU работает с числами в формате IEEE 754 float32. Для выполнения операции нужно записать операнды в FPU_A и FPU_B, затем записать код операции в FPU_OP. Результат читается из FPU_RESULT.

Коды операций

Код Операция Описание
00h ADD Сложение
01h SUB Вычитание
02h MUL Умножение
03h DIV Деление
04h SQRT Квадратный корень
05h MIN Минимум
06h MAX Максимум
07h CMP Сравнение
10h ITOF int32 → float
11h FTOI float → int32 (биты в RESULT)
12h UTOF uint32 → float
13h FTOU float → uint32 (биты в RESULT)
20h SIN Синус
21h COS Косинус
22h TAN Тангенс
23h COT Котангенс
24h LOG Логарифм
25h EXP Экспонента

Флаги FPU

Регистр FPU_FLAGS содержит биты состояния:

Бит Имя Описание
0 ZERO Результат равен нулю
1 SIGN Отрицательный результат
2 DIV0 Деление на ноль
3 INVALID Некорректная операция
4 GT A > B (для CMP)
5 EQ A == B
6 LT A < B

PSG (звукогенератор)

Программируемый звукогенератор с тремя тональными каналами и каналом шума.

Параметры:

  • Частота дискретизации: 44100 Гц.
  • Моно, 16 бит.
  • Вывод через SDL2.

Расчёт тона

Период тона вычисляется по формуле:

period = sample_rate / (2 * desired_frequency)

Пример: для 440 Гц (нота A4) период ≈ 44100 / (2 * 440) ≈ 50.

Микшер

PSG_MIXER:

  • Биты 0–2 - включение тона для каналов 0–2.
  • Биты 3–5 - включение шума.

Огибающая

PSG_VOLn:

  • Биты 0–3 - громкость канала.
  • Бит 7 - заменить громкость уровнем огибающей.

PSG_ENV_SHAPE:

Значение Форма
0 Выключена
1 Attack (0 → 15)
2 Decay (15 → 0)
3 Triangle (0 → 15 → 0, циклически)
4 Sawtooth (0 → 15, циклически)

RNG (генератор случайных чисел)

  • Чтение RNG_RAND продвигает генератор и возвращает следующее значение.
  • Запись в RNG_SEED переинициализирует генератор (для воспроизводимых последовательностей).

Клавиатура

Работает через GUI эмулятора.

  • KBD_ASCII (0x0002000B) и KBD_SCANCODE (0x00020009) читают из одного и того же FIFO-слота, поэтому остаются синхронизированными. Чтение любого из них потребляет слот.
  • KBD_SCANCODE возвращает скан-код PC set-1 (Escape=0x01, цифры 1–9=0x02–0x0A, 0=0x0B, Enter=0x1C, пробел=0x39, стрелки=0x48/0x50/0x4B/0x4D, Delete=0x53 и т.д.).
  • Клавиши отображаются по физическому положению (фиксированная US-раскладка), поэтому каждая клавиша работает одинаково независимо от раскладки хост-ОС. Клавиша, которая на US-раскладке печатает <, всегда даёт , без Shift и < с Shift - даже если на хосте она помечена как Б.
  • KBD_ASCII учитывает Shift/Caps: SHIFT+4 → $, CAPS+буква → A, SHIFT+CAPS+буква → a.

Битовая маска KBD_MODIFIER:

Бит Модификатор
0 SHIFT
1 CTRL
2 ALT
3 CAPS (состояние Caps Lock)
4 TAB (удерживается)
5 WIN / Command / Super

Мышь

  • MOUSE_X/MOUSE_Y ограничены значениями TERM_RES_X/TERM_RES_Y (0x20060/0x20064). В графических режимах диапазон - размер в пикселях (640x480 → 0..639 / 0..479), в текстовых - сетка символов (80x25 → 0..79 / 0..24).
  • MOUSE_X/MOUSE_Y можно записывать: программа может переставить курсор (например, в центр экрана). Значения вне диапазона обрезаются до текущего разрешения.
  • MOUSE_DELTA_X/MOUSE_DELTA_Y и MOUSE_BTN тоже записываемые.
  • MOUSE_SENS (0x20054) - множитель чувствительности в формате fixed-point 1/256. 0x100 (=256) - это 1.0 (по умолчанию). 0x200 удваивает скорость, 0x80 уменьшает вдвое. Запись 0 сбрасывает в 1.0.

Дисковый контроллер (XPB1)

Дисковый контроллер подключён через шину XPB. Банк 0001h и XPB #01 всегда зарезервированы под него.

Образы дисков

Поддерживаются форматы:

  • .bin, .img - сырые образы секторов.
  • .hex - формат Logisim/simple hex.