Описание имеющихся наработок:
Спецификация библиотеки SwapSet v2.0
Общее описание
Библиотека для управления изолированными контекстами регистров на Z80.
Каждый контекст представляет собой 8-байтовый блок памяти.
Структура контекста (8 байт)
Код:
Байт 0-1: AF (старший A, младший F)
Байт 2-3: BC
Байт 4-5: DE
Байт 6-7: HL
API ФУНКЦИИ
Инициализация системы
Код:
; Инициализирует систему 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
Примечание
Алиасы:
SwapSet == SwitchContext
SaveSet == Init
LoadSet == Return