User Tag List

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

Тема: SwapSet

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

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

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

    По умолчанию

    Цитата Сообщение от 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.

    Никакой повторной инициализации не требуется — редактор просто продолжает работу с тем же состоянием.
    Последний раз редактировалось jim; 12.09.2025 в 02:21.
    Like a bright light on the ХORIZON
    Shining so bright, he'll get you flying

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

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

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

Ваши права

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