Спецификация библиотеки SwapSet v2.0
Общее описание
Библиотека для управления изолированными контекстами регистров на Z80.
Каждый контекст представляет собой 8-байтовый блок памяти.
Структура контекста (8 байт)
API ФУНКЦИИКод:Байт 0-1: AF (старший A, младший F) Байт 2-3: BC Байт 4-5: DE Байт 6-7: HL
Инициализация системы
Основное переключение контекстаКод:; Инициализирует систему SwapSet ; Использование: call InitSwapSet InitSwapSet: ld ix, RegSet0+8 ld (CurrentSet), ix ld ix, RegSet0 jp SwapSet
Быстрые обёртки для стандартных наборовКод:; Переключает контекст регистров ; Вход: IX = адрес нового набора ; Использование: ld ix, NewSet \ call SwapSet SwitchContext SwapSet: di ld (StoreSP), sp ; Сохраняем текущий контекст ld sp, (CurrentSet) push hl push de push bc push af ; Загружаем новый контекст ld sp, ix pop af pop bc pop de pop hl ld (CurrentSet), sp ld sp, (StoreSP) ei ret
Геттеры (чтение из контекста)Код:SwapSet0: ld ix, RegSet0 \ jr SwapSet SwapSet1: ld ix, RegSet1 \ jr SwapSet SwapSet2: ld ix, RegSet2 \ jr SwapSet SwapSet3: ld ix, RegSet3 \ jr SwapSet
Функции:
Макросы:Код:GetA: ld a, (ix+1) \ ret GetBC: ld c, (ix+2) \ ld b, (ix+3) \ ret GetDE: ld e, (ix+4) \ ld d, (ix+5) \ ret GetHL: ld l, (ix+6) \ ld h, (ix+7) \ ret
Сеттеры (запись в контекст)Код:MACRO Get_A: ld a, (ix+1) ENDM MACRO Get_B: ld b, (ix+3) ENDM MACRO Get_C: ld c, (ix+2) ENDM MACRO Get_D: ld d, (ix+5) ENDM MACRO Get_E: ld e, (ix+4) ENDM MACRO Get_H: ld h, (ix+7) ENDM MACRO Get_L: ld l, (ix+6) ENDM MACRO Get_BC: ld b, (ix+3) \ ld c, (ix+2) ENDM MACRO Get_DE: ld d, (ix+5) \ ld e, (ix+4) ENDM MACRO Get_HL: ld h, (ix+7) \ ld l, (ix+6) ENDM
Функции:
Макросы:Код:PutA: ld (ix+1), a \ ret PutBC: ld (ix+2), c \ ld (ix+3), b \ ret PutDE: ld (ix+4), e \ ld (ix+5), d \ ret PutHL: ld (ix+6), l \ ld (ix+7), h \ ret
Управление контекстамиКод:MACRO Put_A: ld (ix+1), a ENDM MACRO Put_B: ld (ix+3), b ENDM MACRO Put_C: ld (ix+2), c ENDM MACRO Put_D: ld (ix+5), d ENDM MACRO Put_E: ld (ix+4), e ENDM MACRO Put_H: ld (ix+7), h ENDM MACRO Put_L: ld (ix+6), l ENDM MACRO Put_BC: ld (ix+3), b \ ld (ix+2), c ENDM MACRO Put_DE: ld (ix+5), d \ ld (ix+4), e ENDM MACRO Put_HL: ld (ix+7), h \ ld (ix+6), l ENDM
Сохранение текущих регистров:
Загрузка без переключения:Код:SaveSet: ld (ix+0), 0 ; F (упрощённо) ld (ix+1), a ld (ix+2), c ld (ix+3), b ld (ix+4), e ld (ix+5), d ld (ix+6), l ld (ix+7), h ret
Архитектурные макросыКод:LoadSet2: ld a, (ix+1) ld c, (ix+2) ld b, (ix+3) ld e, (ix+4) ld d, (ix+5) ld l, (ix+6) ld h, (ix+7) ret
Системные переменныеКод:; Вызов функции в изолированном контексте MACRO CALL_ISOLATED function_name push ix ld ix, function_name##_Set call SwitchContext ENDM ; Возврат из изолированной функции MACRO RET_ISOLATED pop ix jp SwitchContext ENDM
Предопределённые контекстыКод:StoreSP: dw 0 CurrentSet: dw RegSet0+8
Примеры использованияКод:RegSet0: ds 8 RegSet1: ds 8 RegSet2: ds 8 RegSet3: ds 8
Изолированная функция:
Работа с объектом без переключения:Код:Physics_Set: ds 8 ld ix, Physics_Set call SwapSet ; ... код в изоляции ... ld ix, Main_Set call SwapSet
Быстрое переключение:Код:ld ix, Enemy_Set Get_A Get_BC
ТребованияКод:call SwapSet0 call SwapSet1 call SwapSet2
Память: 8 байт на контекст + код библиотеки
Инициализация: обязательный вызов InitSwapSet
Прерывания: автоматически блокируются внутри SwapSet
Код://// ExtSwapSet.asm // v.2.0 // 9/21/2025 // // Needs 8 bytes per structure: // // RegSet dw 0 //AF // dw 0 //BC // dw 0 //DE // dw 0 //HL // End // // The CurrentSet variable must be initialized // prior to first use for the mechanism to function correctly. // InitSwapSet ld ix,RegSet0+8 ld (CurrentSet),ix ld ix,RegSet0 //in ix- register set address SwitchContext SwapSet di ld (StoreSP),sp //SaveSet ld sp,(CurrentSet) // Current Set StackEnd push hl push de push bc push af //LoadSet ld sp,ix //Address New Set pop af pop bc pop de pop hl ld (CurrentSet),sp ld sp,(StoreSP) ei ret //------------------------------------------------ SwapSet0 ld ix,RegSet0 jr SwapSet SwapSet1 ld ix,RegSet1 jr SwapSet SwapSet2 ld ix,RegSet2 jr SwapSet SwapSet3 ld ix,RegSet3 jr SwapSet //------------------------------------------------ //Setters: PutA ld (ix+1),a ret PutBC ld (ix+2),c ld (ix+3),b ret PutDE ld (ix+4),e ld (ix+5),d ret PutHL ld (ix+6),l ld (ix+7),h ret //--------------------------------------- MACRO Put_A ld (ix+1),a ENDM MACRO Put_B ld (ix+3),b ENDM MACRO Put_C ld (ix+2),c ENDM MACRO Put_D ld (ix+5),d ENDM MACRO Put_E ld (ix+4),e ENDM MACRO Put_H ld (ix+7),h ENDM MACRO Put_L ld (ix+6),l ENDM MACRO Put_BC ld (ix+3),b ld (ix+2),c ENDM MACRO Put_DE ld (ix+5),d ld (ix+4),e ENDM MACRO Put_HL ld (ix+7),h ld (ix+6),l ENDM //--------------------------------------- //Getters: GetA ld a,(ix+1) ret GetBC ld c,(ix+2) ld b,(ix+3) ret GetDE ld e,(ix+4) ld d,(ix+5) ret GetHL ld l,(ix+6) ld h,(ix+7) ret //--------------------------------------- MACRO Get_A ld a,(ix+1) ENDM MACRO Get_B ld b,(ix+3) ENDM MACRO Get_C ld c,(ix+2) ENDM MACRO Get_D ld d,(ix+5) ENDM MACRO Get_E ld e,(ix+4) ENDM MACRO Get_H ld h,(ix+7) ENDM MACRO Get_L ld l,(ix+6) ENDM MACRO Get_BC ld b,(ix+3) ld c,(ix+2) ENDM MACRO Get_DE ld d,(ix+5) ld e,(ix+4) ENDM MACRO Get_HL ld h,(ix+7) ld l,(ix+6) ENDM //--------------------------------------- Init SaveSet ld (ix+0),0 ld (ix+1),a ld (ix+2),c ld (ix+3),b ld (ix+4),e ld (ix+5),d ld (ix+6),l ld (ix+7),h ret //--------------------------------------- Return LoadSet di ld (StoreSP),sp ld sp,ix pop af pop bc pop de pop hl ld sp,(StoreSP) ei ret Return2 LoadSet2 ld a,(ix+1) ld c,(ix+2) ld b,(ix+3) ld e,(ix+4) ld d,(ix+5) ld l,(ix+6) ld h,(ix+7) ret StoreSP dw 0 CurrentSet dw RegSet0+8 //--------------------------------------- RegSet0 dw 0 //AF dw 0 //BC dw 0 //DE dw 0 //HL RegSet1 ds 8 RegSet2 ds 8 RegSet3 ds 8




Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 



