Детектор нуля (BusZero)
Входы (Inputs)
| Пин | Тип | Описание |
|---|---|---|
| A | bus8 | Входная шина |
Выходы (Outputs)
| Пин | Тип | Описание |
|---|---|---|
| Q | bit | 1 если A=0, иначе 0 |
Логика работы
BusZero сжимает целый байт в один бит-вердикт: «шина пустая или нет?». Внутри это восьмивходовое ИЛИ-НЕ: сначала все биты собираются через ИЛИ, а итог инвертируется. Единица на выходе появляется только в одном случае — когда все восемь битов равны нулю. Хотя бы одна единица где угодно на шине — и вердикт уже 0: даже один битик в младшем разряде рушит проверку.
Главное свойство: BusZero проверяет равенство с нулём, не раскладывая байт на отдельные биты. Не нужно тянуть восемь проводов и строить каскад вентилей — один узел выдаёт готовый флаг. Ещё сильнее он раскрывается в паре с BusXOR: прогнав через детектор результат A XOR B, ты получаешь компаратор — единица на выходе означает A = B. Так процессор сравнивает два числа, не имея отдельного узла сравнения.
Тонкость: BusZero — комбинационный узел, он не запоминает результат. Сменилась шина — флаг пересчитался в тот же такт, старики схемы не хранят историю. И не жди от него лишнего: про знак или величину числа детектор ничего не знает, он отвечает ровно на один вопрос — все ли биты пусты.
Примеры (8 бит)
| A (bin) | A (dec) | Q |
|---|---|---|
| 00000000 | 0 | 1 |
| 00000001 | 1 | 0 |
| 10000000 | 128 | 0 |
| 11111111 | 255 | 0 |
Применение
Это и есть флаг нуля Z — один из главных регистров состояния процессора. После арифметики результат АЛУ прогоняется через детектор нуля, и флаг Z запоминает: «получился ноль». На нём строятся условные переходы JZ и JNZ и циклы «пока не ноль»: счётчик уменьшается на единицу за итерацию, и как только он обнулился, процессор выходит из цикла. Так работают задержки и подсчёт шагов.
Вторая роль — проверка значений без порчи данных: детектор подключается сбоку к шине и ничего на ней не изменяет. На уровне 25 «Проверка на минус» флаги помогают процессору ветвиться по состоянию числа. Равенство двух значений проверяется связкой BusXOR + BusZero: сначала XOR, затем проверка на ноль. Тот же флаг стоит за командами ассемблера: «если результат нулевой — прыгай», а если нет — продолжай по порядку.
Смежные компоненты
Статьи по теме
Частые вопросы
Как определить, что шина равна нулю?
BusZero выдаёт 1, только когда все 8 бит равны 0. Это удобно для условного перехода JZ.
Чем BusZero отличается от флага Zero у АЛУ8?
Встроенный флаг АЛУ8 проверяет только результат арифметики, а BusZero подключается к любой шине: данные из RAM, состояние геймпада, текущий счётчик. Он показывает ноль там, где тебе нужно, а не только там, где считает АЛУ.
Как с помощью BusZero сравнить два числа?
Сначала XOR: A XOR B даёт ноль только при равенстве. Результат — на вход BusZero: единица означает «числа равны», ноль — «различаются». Это и есть схема компаратора.