Вернемся к сути:
SwapSet — изоляция регистров на Z80
Идея эксперимента: реализовать механизм изоляции регистров и создания виртуальных наборов регистров на Z80
Суть метода:
- Каждый набор регистров ("сет") хранится в памяти как блок из 8 байт (AF, BC, DE, HL).
- Команда сохраняет текущие значения регистров в активный блок и загружает значения из нового блока.
- Таким образом, вместо push/pop или обращения к стеку мы получаем мгновенную изоляцию контекстов.
Плюсы:
- Неограниченное количество наборов регистров (ограничение только по памяти).
- Простое переключение между контекстами по имени:
Код:
ld ix, SetName
call SwapSet
- Локальные регистры изолированы: функция работает в своём наборе, не трогая основной.
- Возможность прямой передачи аргументов в регистры нового сета без обращения к памяти:
Код:
ld ix, FunctionSet
call SwapSet
ld hl, arg1
ld de, arg2
call Function
Минусы:
- Медленнее по тактам, чем классический push/pop.
- Задействует индексный регистр IX.
- Увеличенный код вызова (
Код:
ld ix, ...; call SwapSet
).
Применимость:
- Эксперименты с архитектурой Z80.
- Альтернативное структурирование кода без жёсткой привязки к стеку.
- Потенциальная основа для байткод-машины с полной изоляцией контекстов.
Пример использования:
Код:
ld ix, MainSet
call SwapSet ; активируем основной набор
ld ix, FunctionSet
call SwapSet ; переключаемся на набор функции
ld hl, arg1
ld de, arg2
call Function ; вызов функции с аргументами в регистрах
ld ix, MainSet
call SwapSet ; возвращаемся к основному набору