Важная информация

User Tag List

Страница 3 из 8 ПерваяПервая 1234567 ... ПоследняяПоследняя
Показано с 21 по 30 из 75

Тема: SwapSet

  1. #21

    Регистрация
    23.02.2005
    Адрес
    Донецк
    Сообщений
    486
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    115
    Поблагодарили
    74 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Идея и решение интересные, вот практическое применение, пока не знаю .., таких идей-задач никогда не возникало. Надо подумать как это пристроить к делу.

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

    jim(11.09.2025)

  2. #22

    Регистрация
    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

  3. #23

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

    По умолчанию

    Цитата Сообщение от jim Посмотреть сообщение
    ну это если проще нажатие Alt+Tab )) только в цикле программы.
    нда, похоже, представление об устройстве и функционировании спека примерно такое же никакое, как и о работе alt-tab в винде

    Цитата Сообщение от jim Посмотреть сообщение
    Именно это и делает SwapSet более «высокоуровневым» подходом: программист концентрируется на логике задач, а не на механике push/pop и сохранении состояний. Основная идея кода становится центральной, а «чем занят цикл и как сохранить регистры» — детали, о которых заботится SwapSet.
    если программист способен логику задач на асме писать, вся подобная "механика" для него проблемой точно не будет

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

    Цитата Сообщение от jim Посмотреть сообщение
    чисто технически все описано в коде библиотеки
    чисто технически вопрос ты опять не понял

    Цитата Сообщение от jim Посмотреть сообщение
    Пример с тремя копиями текстового редактора

    Представим три экземпляра редактора: Edit1, Edit2, Edit3.

    Классический подход:

    Для переключения между редакторами нужно:

    Сохранять все регистры и указатели.

    Сохранять локальные переменные в память.

    Загружать новое состояние для выбранного редактора.

    Каждый раз, когда меняешь редактор, приходится делать много операций сохранения/восстановления.

    SwapSet-подход:

    Для каждой копии редактора создаётся свой SwapSet: SwapSet0, SwapSet1, SwapSet2.

    Переключение делается одной инструкцией:

    call SwapSet0 ; активировать Edit1
    call SwapSet1 ; активировать Edit2
    call SwapSet2 ; активировать Edit3


    Все регистры и состояние уже сохранены внутри SwapSet.

    Никакой повторной инициализации не требуется — редактор просто продолжает работу с тем же состоянием.

    ну вот, допустим, работает код любого экземпляра Edit1, Edit2, Edit3 - а теперь внимание, вопрос:
    каким образом "независимо от места программы" происходит переход на нужный call SwapSetX - ?
    ...особенно "без организации прерываний"
    Прихожу без разрешения, сею смерть и разрушение...

  4. #24

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

    По умолчанию

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    по сути это небольшой кусок типичного кода обработчика прерываний, непонятно зачем ухудшенный и непонятно как вызываемый
    Именно в этом и разница. Обработчик прерываний всегда запускается асинхронно и требует жёсткого сохранения/восстановления контекста, потому что точка входа задаётся внешним событием.

    SwapSet работает иначе: это синхронный механизм переключения, инициируемый самой программой. Здесь не нужно улавливать внешний сигнал — программист сам решает, в какой момент «перепрыгнуть» на другой набор регистров.
    Поэтому вопрос «как это возможно без прерываний» на самом деле снимается:
    прерывания нужны для внезапного переключения;
    SwapSet нужен для сознательного переключения.
    Это разные сценарии, но решают одну задачу — быстрое сохранение/восстановление контекста.
    Что даёт SwapSet «сверх обычного push/pop»:
    минимальный и фиксированный по времени код (без ручного сохранения переменных);
    простая абстракция «виртуальные роли процессора» — можно держать несколько экземпляров программы (например, редакторов) и переключаться между ними одной инструкцией;
    никакой привязки к обработчику IRQ — разработчик сам ставит точку переключения.

    Если коротко:
    Прерывания = «Alt+Tab, когда ОС сама решает переключить».
    SwapSet = «Alt+Tab, когда я сам жму комбинацию».

    Оба механизма нужны, просто применяются в разных случаях.

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

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    ну вот, допустим, работает код любого экземпляра Edit1, Edit2, Edit3 - а теперь внимание, вопрос:
    каким образом "независимо от места программы" происходит переход на нужный call SwapSetX - ?
    ...особенно "без организации прерываний"
    берешь и пишешь в исходнике:
    Код:
    ; в любой точке программы
    ld ix, Edit3
    call SwapSet
    ; и ты уже в Edit3, с восстановленными регистрами
    Like a bright light on the ХORIZON
    Shining so bright, he'll get you flying

  5. #25

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

    По умолчанию

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

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


    Цитата Сообщение от jim Посмотреть сообщение
    Если коротко:
    Прерывания = «Alt+Tab, когда ОС сама решает переключить».
    SwapSet = «Alt+Tab, когда я сам жму комбинацию».
    крайне неудачные аналогии, да и работает "alt-tab" посложнее, чем представляешь
    ну да ладно, углубляться сейчас в это очень не хочется))

    Цитата Сообщение от jim Посмотреть сообщение
    берешь и пишешь в исходнике:
    Код:
    ; в любой точке программы
    ld ix, Edit3
    call SwapSet
    ; и ты уже в Edit3, с восстановленными регистрами
    ну наконец-то... только это же как раз наоборот, получается ЗАВИСИМО "от места программы" - куда (не) впишут

    внесли ясность, а теперь берём и возвращаемся к первоначальным вопросам:
    ЗАЧЕМ вписывать выход из задачи в такие НЕУДОБНЫЕ точки, где нужно сохранять значения всех регистров?
    почему не делать этого между законченными блоками расчётов после сохранения результатов в память?

    особенно если хочется "высоких абстракций" (ведь даже отдельные переменные куда выше уровнем, чем регистры)

    в наше время даже для дебага мелких процедурок это бессмысленно, эмули удобнее однозначно
    Прихожу без разрешения, сею смерть и разрушение...

  6. #26

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Эти 2 пользователя(ей) поблагодарили krt17 за это полезное сообщение:

    Lethargeek(15.09.2025), null_device(16.09.2025)

  7. #27

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

    По умолчанию

    Любой нестандартный подход рассматривается как ересь, людьми которые привыкли писать в своей парадигме.
    Я не критикую классические стандартные подходы, я лишь попытался предложить поэкспериментировать, сломать косность и включить фантазию.
    К сожалению с годами практики, все необычные решения начинают восприниматься в штыки, даже среди профессионалов.
    Кроме аргументов, "что это нафиг никому нее нужно" и "можно сделать проще" не вижу никаких обоснований. Запретить, выставить на посмешище, указать на свое место, все, что я слышу в ответ на простое предложение попробовать и оценить в деле.
    Я изначально не навязывал свое видение, но на протяжении обсуждения, зачем то вынужден оправдываться. Я пишу так как я хочу, если кто-то думает так, как я, значит кому то зашла идея. Раскритиковать можно что угодно, для этого нужно еще меньше усилий чем написать простой алгоритм.
    К примеру: традиционный подход с прерываниями абсолютно неэкономично расходует ресурсы на сохранение/восстановление контекстов задач. С надобностью или без каждые 1/50 секунды сохраняется и восстанавливается задача работающая в фоне. Мой пример с переключением так же можно повесить на опрос клавиатуры и вызывать как подзадачу только если это действительно нужно. Да это привязка к прерываниям, но уже другая.
    А если смотреть в целом, это именно свобода. У тебя появляется возможность работать с виртуальными наборами, не заморачиваясь на других реализациях. Да это очень простой код, но это не значит что он примитивный.
    Если кому то нравится работать с макросами, никто не мешает оформить переключение в виде шаблона вместо вызовов call/ret.
    Если вы категорически против, просто пройдите мимо.
    Like a bright light on the ХORIZON
    Shining so bright, he'll get you flying

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

    Yuri80(13.09.2025)

  8. #28

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

    По умолчанию

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

    Цитата Сообщение от jim Посмотреть сообщение
    К примеру: традиционный подход с прерываниями абсолютно неэкономично расходует ресурсы на сохранение/восстановление контекстов задач. С надобностью или без каждые 1/50 секунды сохраняется и восстанавливается задача работающая в фоне. Мой пример с переключением так же можно повесить на опрос клавиатуры и вызывать как подзадачу только если это действительно нужно. Да это привязка к прерываниям, но уже другая.
    Прихожу без разрешения, сею смерть и разрушение...

  9. #29

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

    По умолчанию

    Концепция SwapSet vs регистровые окна SPARC

    SPARC

    • В архитектуре SPARC регистры организованы в окна: при вызове функции активируется новое окно.
    • Каждое окно делится на три области:
      • in — аргументы, полученные от вызывающей стороны
      • local — собственные локальные переменные функции
      • out — аргументы для следующего вызова
    • При переключении окна:
      • out-регистры вызывающей функции становятся in-регистрами вызываемой
      • локальные сохраняются внутри окна
      • стек используется только если регистров не хватает или при переполнении окон


    SwapSet

    • Реализация на Z80 через сохранение/восстановление фиксированных наборов регистров.
    • Каждый набор (set) изолирован: переключение через
      Код:
      call SwapSet
      скрывает все локальные регистры предыдущего набора.
    • Аргументы передаются не через память, а напрямую в регистрах нового набора после переключения:
      Код:
      ld ix, FunctionSet
      call SwapSet        ; открыть контекст функции
      ld hl, arg1
      ld de, arg2         ; сразу положили аргументы в "in"-регистры
      call Function
    • После возврата восстановление идёт простым переключением обратно:
      Код:
      ld ix, MainSet
      call SwapSet        ; вернулись в локальный набор вызывающего


    Сходство

    • Локальные регистры изолированы и не видны другой стороне.
    • Аргументы передаются напрямую через выделенную часть регистров, без копирования в память.
    • Вызов функции становится быстрым и компактным.


    Различие

    • У SPARC окна жёстко встроены в аппаратную модель, переключение мгновенное и без кода.
    • В SwapSet требуется программный вызов
      Код:
      call SwapSet
      , что добавляет оверхед.
    • В SPARC есть «скользящие» окна (out → in), а в SwapSet это нужно явно организовать договорённостью: какие регистры считать аргументами.


    Таким образом, SwapSet — это софтверная имитация механизма окон SPARC, где локальные регистры полностью изолированы, а аргументы задаются прямо в регистрах нового контекста.
    Последний раз редактировалось jim; 15.09.2025 в 23:08.

  10. #30

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jim Посмотреть сообщение
    Вызов функции становится быстрым и компактным.

Страница 3 из 8 ПерваяПервая 1234567 ... ПоследняяПоследняя

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

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

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

Ваши права

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