LFSR (Генератор случайных чисел)
Входы (Inputs)
| Пин | Тип | Описание |
|---|---|---|
| Clock | bit | Сдвиг регистра по фронту (0→1 генерирует новое число) |
| DevAddr | bus8 | Адрес устройства: 0x1A = порт 0xFA |
| IO_SEL | bit | Выбор I/O (1 = устройство активно) |
Выходы (Outputs)
| Пин | Тип | Описание |
|---|---|---|
| Data | bus8 | Текущее псевдослучайное число (0–255) |
Логика работы
LFSR (Linear Feedback Shift Register) — 8-битный регистр сдвига с линейной обратной связью. Реализует полином:
x⁸ + x⁶ + x⁵ + x⁴ + 1
На каждом фронте Clock (переход 0→1) происходит сдвиг регистра влево. Новый младший бит вычисляется как XOR четырёх битов текущего состояния:
новый_бит = state[7] ⊕ state[5] ⊕ state[4] ⊕ state[3]
Начальное значение (seed) — 0x9C (156 в десятичной системе). Последовательность чисел полностью детерминирована: при одном и том же seed LFSR всегда выдаёт одну и ту же последовательность. При чтении через порт 0xFA (IO_SEL = 1, DevAddr = 0x1A) на выход Data выдаётся текущее состояние регистра.
Длина периода последовательности — 255 (все значения кроме 0x00). Состояние 0x00 является «тупиковым» — LFSR застревает в нём навсегда, поэтому seed никогда не должен быть нулевым.
Применение
Используется на уровнях 26, 29. Применяется для генерации псевдослучайных событий:
- Бросок кубика:
LDA 250(порт 0xFA), затемAND 7; ADD 1для получения значения 1–6. - Случайная позиция еды в игре «Змейка» (уровень 29): координаты X и Y берутся из LFSR и обрезаются до диапазона 0–15.
Поскольку последовательность детерминирована, для большей «случайности» LFSR обычно тактируется непрерывно (каждый такт Clock), а чтение происходит только в нужный момент.