
Сообщение от
Lethargeek
ну и зачем нужно "переключение контекстов программ" без "организации прерываний"?
если (под)программа не прерывалась, то она работу закончила и результаты из регистров сохранены
ну это если проще нажатие Alt+Tab )) только в цикле программы.

Сообщение от
Lethargeek
НИЗКОуровневый - ибо ну куда уж ниже простого асма-то
а вот чуть ВЫШЕ уровнем - будет макрос (это намёк))
переменные - также более высокий уровень, чем регистры
Именно это и делает SwapSet более «высокоуровневым» подходом: программист концентрируется на логике задач, а не на механике push/pop и сохранении состояний. Основная идея кода становится центральной, а «чем занят цикл и как сохранить регистры» — детали, о которых заботится SwapSet.
По сути, это абстракция контекста: ты создаёшь несколько «виртуальных ролей» процессора и переключаешься между ними мгновенно, словно работаешь в отдельных окнах памяти, где каждый сет — своё пространство.
- - - Добавлено - - -

Сообщение от
Lethargeek
вот чисто технически для начала - каким образом ты без прерываний (!) собрался запускать (а также возвращаться) с любого (!) места?
чисто технически все описано в коде библиотеки
Код:
// SwapSet.asm
// 9/6/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
call SwapSet
ret
//in ix- register set address
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
//------------------------------------------------
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
- - - Добавлено - - -

Сообщение от
Rubts0FF
Идея и решение интересные, вот практическое применение, пока не знаю .., таких идей-задач никогда не возникало. Надо подумать как это пристроить к делу.
Я сам активно ищу применение )) Но идея захватила. Есть определенное сходство с Окнами регистров в архитектуре SPARC, но там это бесплатно по тактам.
- - - Добавлено - - -

Сообщение от
Lethargeek
словоблудие бессмысленное какое-то приведи КОНКРЕТНЫЕ сценарии применения!
Пример с тремя копиями текстового редактора
Представим три экземпляра редактора: Edit1, Edit2, Edit3.
Классический подход:
Для переключения между редакторами нужно:
Сохранять все регистры и указатели.
Сохранять локальные переменные в память.
Загружать новое состояние для выбранного редактора.
Каждый раз, когда меняешь редактор, приходится делать много операций сохранения/восстановления.
SwapSet-подход:
Для каждой копии редактора создаётся свой SwapSet: SwapSet0, SwapSet1, SwapSet2.
Переключение делается одной инструкцией:
call SwapSet0 ; активировать Edit1
call SwapSet1 ; активировать Edit2
call SwapSet2 ; активировать Edit3
Все регистры и состояние уже сохранены внутри SwapSet.
Никакой повторной инициализации не требуется — редактор просто продолжает работу с тем же состоянием.