User Tag List

Показано с 1 по 10 из 75

Тема: SwapSet

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    31.03.2005
    Адрес
    Новосибирская область
    Сообщений
    128
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    8
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию SwapSet

    Спецификация библиотеки 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
    Последний раз редактировалось jim; 25.09.2025 в 21:36.

    Этот пользователь поблагодарил jim за это полезное сообщение:

    Rubts0FF(11.09.2025)

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •