Индексный регистр (IndexRegister)
Входы (Inputs)
| Пин | Тип | Описание |
|---|---|---|
| Data | bus8 | Входные данные (адрес) |
| Clock | bit | Тактовый сигнал |
| WE | bit | Загрузить Data |
| Inc | bit | Увеличить на 1 |
Выходы (Outputs)
| Пин | Тип | Описание |
|---|---|---|
| Q | bus8 | Текущее значение |
Логика работы
Представь закладку в книге: она отмечает страницу, с которой ты сейчас читаешь. Индексный регистр IX — такая же закладка, только для памяти: в нём лежит адрес ячейки RAM, к которой программа обращается в данный момент. Закладку можно передвинуть на страницу вперёд (Inc) или сразу перескочить на конкретную (загрузка через WE и Data).
Главное свойство — косвенная адресация: команда берёт адрес не из себя, а из IX. Пример: LDX 16 кладёт в IX число 16; LDAX читает RAM[16] в аккумулятор; INX сдвигает закладку на 17; ещё один LDAX — уже читает RAM[17]. Один и тот же код при этом обрабатывает массив любой длины.
Нюанс: приоритет Inc выше, чем WE. Если на одном фронте оба сигнала равны 1, регистр увеличится на единицу, а загрузка Data будет проигнорирована. Поэтому LDX и INX никогда не совмещают в одном такте.
Примеры (последовательность тактов)
| Такт | Команда | WE | Inc | IX после фронта |
|---|---|---|---|---|
| 1 | LDX 16 | 1 | 0 | 16 — закладка на начало массива |
| 2 | INX | 0 | 1 | 17 — сдвиг к следующему элементу |
| 3 | LDAX | 0 | 0 | 17 — не меняется, читается RAM[17] |
| 4 | LDX 200 | 1 | 0 | 200 — резкий прыжок на новый адрес |
Такт 3 показывает, что команды косвенного чтения пользуются закладкой, но не двигают её.
Применение
Уровень 21 «Указатели» вводит IX, и дальше (уровни 21–29) без него не обходится ни одна работа с массивами: очередь точек в Змейке, буферы данных, обход таблиц. Инструкции LDX, INX, LDAX и STAX — весь словарь общения с индексным регистром.
Конкретное применение — цикл по массиву: LDX ставит закладку на первый элемент, в теле цикла LDAX или STAX читает и пишет данные по адресу IX, INX сдвигает закладку, а условный переход возвращает к началу, пока не обработан последний элемент.
Смежные компоненты
Статьи по теме
Частые вопросы
Зачем нужен индексный регистр?
Для косвенной адресации: адрес берётся из регистра, а не из команды — так работают циклы по массивам.
Чем IX отличается от аккумулятора?
Аккумулятор хранит данные, над которыми идёт работа, а IX — адрес, где эти данные лежат. Команда LDAX связывает их: читает в аккумулятор то, на что указывает IX.
Что произойдёт, если подать WE = 1 и Inc = 1 одновременно?
Сработает только инкремент: у Inc приоритет выше, и значение Data будет проигнорировано.