User Tag List

Страница 1 из 8 12345 ... ПоследняяПоследняя
Показано с 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
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Наверно стоит добавить что прерывания следует запретить, во избежание так сказать...
    Ну или жестко контролировать ))

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

    jim(13.09.2025)

  4. #3

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

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Наверно стоит добавить что прерывания следует запретить, во избежание так сказать...
    Ну или жестко контролировать ))
    ну естественно:
    di
    ...
    ei
    спасибо!)
    Цитата Сообщение от Lethargeek Посмотреть сообщение
    слишком громкое название для довольно очевидного этюда (да и то, здесь в "этюды" больше постят разные трюки)
    и область применения какова? игрушечная мини-многозадачность для самых маленьких?
    речь не о многозадачности. всего лишь структурирование кода меньше очевидных push/pop (код чище) и абстракция расширения основных наборов регистров, вызов функций использующих свой собственный контекст. общий стек для всех наборов виртуальных регистров позволяет пересылать данные между сетами.
    к примеру изменили регистры в сете, переключились на новый, про первый можно забыть и не держать регистры на стеке до вызова процедуры использующей эти регистры, вызвали сет в любом месте программы по надобности.

    Я не претендую на что-то новое. Но вот такая фишка пришла в голову.

    Простой пример:
    Код:
    	org	0x8000
    
    	jp	main
    
    	include	"conio32.asm"
    	include	"math.asm"
    	include	"SwapSet.asm"
    fnt	incbin	"slim.fnt"
    
    
    //---------------------------------------
    
    main	ld	hl,fnt
    	call	setfont
    	ld	a,0x07
    	call	setcolor
    	call	clrscr
    
    	call	InitSwapSet
    
    	call	SwapSet0
    	ld	hl,str0
    	call	SwapSet1
    	ld	hl,str1
    	call	SwapSet2
    	ld	hl,str2
    	call	SwapSet3
    	ld	hl,str3
    
    	ld	ix,DemoSet
    	call	SwapSet
    	ld	hl,DemoStr
    
    	call	SwapSet0
    	call	puts
    	call	SwapSet1
    	call	puts
    	call	SwapSet2
    	call	puts
    	call	SwapSet3
    	call	puts
    
    	ld	ix,DemoSet
    	call	SwapSet
    	call	puts
    
    	ret
    
    //------------------------------------------------
    DemoSet	ds	8
    DemoStr	dz	LF, LF, TAB, ATTR,04o,"AND ME!!!",LF
    
    str0	dz	ATTR,BLACK|RED, "Message from SwapSet0: Hello!",LF
    str1	dz	ATTR,BLACK|WHITE, "Message from SwapSet1: Hello!",LF
    str2	dz	ATTR,BLACK|CYAN, "Message from SwapSet2: Hello!",LF
    str3	dz	ATTR,BLACK|YELLOW, "Message from SwapSet3: Hello!",LF
    Последний раз редактировалось jim; 07.09.2025 в 13:59.

  5. #4

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,963
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    312
    Поблагодарили
    236 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jim Посмотреть сообщение
    речь не о многозадачности.
    а о чём же? вот ЗАЧЕМ еще такое может понадобиться, чего нельзя проще сделать другими способами?

    Цитата Сообщение от jim Посмотреть сообщение
    всего лишь структурирование кода меньше очевидных push/pop (код чище)
    с чего меньше? сохранение контекста почти всегда мб нужно только в обработчике прерывания, который обычно всего один
    с чего чище? лишний call (+ это кстати лишнее пространство на стеке)

    Цитата Сообщение от jim Посмотреть сообщение
    и абстракция расширения основных наборов регистров,
    полная бессмыслица, начиная с "расширения набора регистров" программным способом
    смысл регистра как раз в том, что это "сверхоперативная", то есть самая БЫСТРАЯ область памяти
    а тут медленное сохранение/восстановление всех подряд да еще ix пожертвовать предлагается
    то есть выйдет сокращение набора фактически

    Цитата Сообщение от jim Посмотреть сообщение
    вызов функций использующих свой собственный контекст. общий стек для всех наборов виртуальных регистров позволяет пересылать данные между сетами.
    к примеру изменили регистры в сете, переключились на новый, про первый можно забыть и не держать регистры на стеке до вызова процедуры использующей эти регистры, вызвали сет в любом месте программы по надобности.
    без многозадачности (реентрабельности) всегда проще сразу с переменными работать, а не со стеком
    да еще значительно эффективней - только с теми, которые действительно применяются
    Прихожу без разрешения, сею смерть и разрушение...

  6. #5

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

    По умолчанию

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    а о чём же? вот ЗАЧЕМ еще такое может понадобиться, чего нельзя проще сделать другими способами?
    Например сместить уровень абстракций от регистров к окнам контекстов функций.
    Это автоматически не означает многозадачность или параллельную обработку. Это гибкость кода. Для кого то возможно это великий грех.

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    с чего меньше? сохранение контекста почти всегда мб нужно только в обработчике прерывания, который обычно всего один
    с чего чище? лишний call (+ это кстати лишнее пространство на стеке)
    Не согласен что только в обработчике. В кооперативной многозадачности например.
    И я не отказываюсь от стека он доступен всем сетам как родной. Можно PUSH в одном сете и POP в другом или том же.

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    полная бессмыслица, начиная с "расширения набора регистров" программным способом
    смысл регистра как раз в том, что это "сверхоперативная", то есть самая БЫСТРАЯ область памяти
    а тут медленное сохранение/восстановление всех подряд да еще ix пожертвовать предлагается
    то есть выйдет сокращение набора фактически
    Смысл регистра в том что это быстрая ячейка памяти. Абстракция расширения медленная при переключении, дальше это те же самые быстрые регистры.

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    без многозадачности (реентрабельности) всегда проще сразу с переменными работать, а не со стеком
    да еще значительно эффективней - только с теми, которые действительно применяются
    Сохранение загрузка переменных это то же нетривиальная задача. Ты не работаешь с переменными напрямую в памяти, для начала они грузятся в регистры. Мой вариант с sp сокращает время операций и при этом это не полноценный стек push/pop (а сохранил, загрузил другой набор, поработал, вернулся к первому или можно вообще забыть о нем)

    - - - Добавлено - - -

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Ну х.з. состояние такого 'обьекта' должно уложиться в эти несчастные 7 регистров, иначе ещё и стек надо для каждого обьекта свой. Тогда и правда либо многозадачность вертеть, либо как сказал Lethargeek сохраняться в переменных.
    Ну тут свобода, никто не мешает хранить в регистрах сета указатель на структуры данных и работать с ними как с обычными переменными.
    Последний раз редактировалось jim; 07.09.2025 в 22:33.
    Like a bright light on the ХORIZON
    Shining so bright, he'll get you flying

  7. #6

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,963
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    312
    Поблагодарили
    236 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jim Посмотреть сообщение
    Например сместить уровень абстракций от регистров к окнам контекстов функций.
    переменные абстрактнее и удобнее
    и зачем нужны "контекстов" без реентрабельности?

    Цитата Сообщение от jim Посмотреть сообщение
    Это автоматически не означает многозадачность или параллельную обработку. Это гибкость кода.
    что такое "гибкость кода"? в чём измеряется?

    Цитата Сообщение от jim Посмотреть сообщение
    Не согласен что только в обработчике. В кооперативной многозадачности например.
    ...которая на спеке реализуется, ВНЕЗАПНО, через обработчик
    в чём новизна-то? в лишних call в теле обработчика?

    Цитата Сообщение от jim Посмотреть сообщение
    Смысл регистра в том что это быстрая ячейка памяти. Абстракция расширения медленная при переключении, дальше это те же самые быстрые регистры.
    то есть в сумме - медленное решение

    Цитата Сообщение от jim Посмотреть сообщение
    Сохранение загрузка переменных это то же нетривиальная задача.
    ШТА

    Цитата Сообщение от jim Посмотреть сообщение
    Ты не работаешь с переменными напрямую в памяти, для начала они грузятся в регистры
    да, и что? притом с теми лишь, которые мне нужны

    Цитата Сообщение от jim Посмотреть сообщение
    Мой вариант с sp сокращает время операций
    для начала - добавляет лишние операции (ибо функция необязательно использует все регистры) + замедляет их еще манипуляциями с sp

    Цитата Сообщение от jim Посмотреть сообщение
    и при этом это не полноценный стек push/pop (а сохранил, загрузил другой набор, поработал, вернулся к первому или можно вообще забыть о нем)
    то есть медленно, а результаты всё равно потом распихивать в переменные

    - - - Добавлено - - -

    Цитата Сообщение от jim Посмотреть сообщение
    Согласен со всеми пунктами.
    Короткий ответ, я так хочу )
    поздно
    Прихожу без разрешения, сею смерть и разрушение...

  8. #7

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,963
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    312
    Поблагодарили
    236 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jim Посмотреть сообщение
    хочу поделиться своей библиотекой
    слишком громкое название для довольно очевидного этюда (да и то, здесь в "этюды" больше постят разные трюки)
    и область применения какова? игрушечная мини-многозадачность для самых маленьких?
    Прихожу без разрешения, сею смерть и разрушение...

  9. #8

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если честно, тоже думаю что довольно таки редко-нужная вещь, но раз выбралось чуток ненужного времени, добавлю прожорливый по памяти и тактам вариант, который не ломает стек и соответственно не требует запрета прерываний и не занимает ix.

    Минус - много места на каждый слот (програмка) и для сохранения полного регистра AF тратит больше тактов, но если сохранять только A без флагов, то даже меньше чуть (если учитывать инициацию IX).

    Код:
     
    sl_end     jp .ret               ; 10
    .ret       ret             ; начальный переход на команду RET
                               ; нужен для первого запуска
    
     ; макросы создания слотов - каждый слот - программа
     
           MACRO reg_slotF   ; AF,HL,DE,BC
          
               call sl_end                 ; 17+10+103   
               ld hl,.sv                   ; 10
               ld (sl_end+1),hl            ; 16        
    1          ld hl,#0000        ; af     ; 10
               push hl                     ; 11     
    2          ld hl,#0000                 ; 10
    3          ld de,#0000                 ; 10
    4          ld bc,#0000                 ; 10
               pop af                      ; 10
              ret                          ; 10    / 227
      
    .sv        ld (2_B+1),hl               ; 16
               push af                     ; 11
               pop hl                      ; 10
               ld (1_B+1),hl      ; af     ; 16
               ld (3_B+1),de               ; 20
               ld (4_B+1),bc               ; 20
              ret                          ; 10    /103
              
           ENDM            ; 41 bytes for slot , 227 cycles
           
    
           MACRO reg_slot   ; A,HL,DE,BC
          
               call sl_end                 ; 17+10+79
               ld hl,.sv                   ; 10
               ld (sl_end+1),hl            ; 16                    
    1          ld a,#00                    ; 7
    2          ld hl,#0000                 ; 10
    3          ld de,#0000                 ; 10
    4          ld bc,#0000                 ; 10
              ret                          ; 10    / 179
      
    .sv        ld (1_B+1),a                ; 13
               ld (2_B+1),hl               ; 16
               ld (3_B+1),de               ; 20
               ld (4_B+1),bc               ; 20
              ret                          ; 10    /79
              
           ENDM            ; 36 bytes for slot , 179 cycles 
           
           
     ;; пример использования          
    
     ; создание слотов
    
    sl1  reg_slotF
    sl2  reg_slot
    sl3  reg_slot
    
      ; первичное заполнение (если нужно) - не переключает слот, портит hl для режима с AF
         ...
         call sl1.sv
         ...
         call sl2.sv
         ...
         call sl3.sv
         ...
      ; переключение на слот
      
         ...   
         call sl1        ; 17 + 227 = 244 cycles
         ...  
         call sl3        ; 17 + 179 = 196 cycles
         ...
    Проверять лень, могу и ошибаться.

    p.s. Да, при первичном заполнении HL портится ))

    p.s.2. Ага, обшибся таки !!! - вроде поправил, но это не точно )

    p.s.3. Точно неточно. Смещения попутал. Ещё раз поправил ))
    Последний раз редактировалось Dart Alver; 07.09.2025 в 20:30. Причина: опять поправил

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

    jim(07.09.2025)

  10. #9

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

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    добавлю прожорливый по памяти и тактам вариант, который не ломает стек и соответственно не требует запрета прерываний и не занимает ix.
    Классный подход с самомодификацией! )) Мне нравится.
    Я так понимаю слоты можно переиспользовать изменяя значения в регистрах?
    Последний раз редактировалось jim; 21.09.2025 в 12:43.

  11. #10

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jim Посмотреть сообщение
    Я так понимаю слоты можно переиспользовать изменяя значения в регистрах?
    Не очень понял. Вызов слота записывает текущие значения в программу текущего слота и вызывает значения из выбранного. Методом слот.sv можно записать текущие значения регистров в программу нужного слота не меняя текущего, но текущий hl - портится для варианта с сохранением флагов.
    Ну так должно работать если я опять не ошибся ))

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

    jim(23.09.2025)

Страница 1 из 8 12345 ... ПоследняяПоследняя

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

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

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

Ваши права

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