Идея и решение интересные, вот практическое применение, пока не знаю .., таких идей-задач никогда не возникало. Надо подумать как это пристроить к делу.
Идея и решение интересные, вот практическое применение, пока не знаю .., таких идей-задач никогда не возникало. Надо подумать как это пристроить к делу.
jim(11.09.2025)
ну это если проще нажатие Alt+Tab )) только в цикле программы.
Именно это и делает SwapSet более «высокоуровневым» подходом: программист концентрируется на логике задач, а не на механике push/pop и сохранении состояний. Основная идея кода становится центральной, а «чем занят цикл и как сохранить регистры» — детали, о которых заботится SwapSet.
По сути, это абстракция контекста: ты создаёшь несколько «виртуальных ролей» процессора и переключаешься между ними мгновенно, словно работаешь в отдельных окнах памяти, где каждый сет — своё пространство.
- - - Добавлено - - -
чисто технически все описано в коде библиотеки
- - - Добавлено - - -Код:// 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
Я сам активно ищу применение )) Но идея захватила. Есть определенное сходство с Окнами регистров в архитектуре SPARC, но там это бесплатно по тактам.
- - - Добавлено - - -
Пример с тремя копиями текстового редактора
Представим три экземпляра редактора: 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
нда, похоже, представление об устройстве и функционировании спека примерно такое же никакое, как и о работе alt-tab в винде
если программист способен логику задач на асме писать, вся подобная "механика" для него проблемой точно не будет
по сути это небольшой кусок типичного кода обработчика прерываний, непонятно зачем ухудшенный и непонятно как вызываемый
чисто технически вопрос ты опять не понял
ну вот, допустим, работает код любого экземпляра Edit1, Edit2, Edit3 - а теперь внимание, вопрос:
каким образом "независимо от места программы" происходит переход на нужный call SwapSetX - ?
...особенно "без организации прерываний"![]()
Прихожу без разрешения, сею смерть и разрушение...
Именно в этом и разница. Обработчик прерываний всегда запускается асинхронно и требует жёсткого сохранения/восстановления контекста, потому что точка входа задаётся внешним событием.
SwapSet работает иначе: это синхронный механизм переключения, инициируемый самой программой. Здесь не нужно улавливать внешний сигнал — программист сам решает, в какой момент «перепрыгнуть» на другой набор регистров.
Поэтому вопрос «как это возможно без прерываний» на самом деле снимается:
прерывания нужны для внезапного переключения;
SwapSet нужен для сознательного переключения.
Это разные сценарии, но решают одну задачу — быстрое сохранение/восстановление контекста.
Что даёт SwapSet «сверх обычного push/pop»:
минимальный и фиксированный по времени код (без ручного сохранения переменных);
простая абстракция «виртуальные роли процессора» — можно держать несколько экземпляров программы (например, редакторов) и переключаться между ними одной инструкцией;
никакой привязки к обработчику IRQ — разработчик сам ставит точку переключения.
Если коротко:
Прерывания = «Alt+Tab, когда ОС сама решает переключить».
SwapSet = «Alt+Tab, когда я сам жму комбинацию».
Оба механизма нужны, просто применяются в разных случаях.
- - - Добавлено - - -
берешь и пишешь в исходнике:
Код:; в любой точке программы ld ix, Edit3 call SwapSet ; и ты уже в Edit3, с восстановленными регистрами
Like a bright light on the ХORIZON
Shining so bright, he'll get you flying
с чем "синхронный", с логикой задачи? тогда так про любые переходы можно сказать
осталось понять, зачем делать это в наиболее неподходящие моменты на самом низком уровне (но при этом декларируя стремление к высокой абстракции) да еще и жертвовать регистрами ради этого
крайне неудачные аналогии, да и работает "alt-tab" посложнее, чем представляешь
ну да ладно, углубляться сейчас в это очень не хочется))
ну наконец-то... только это же как раз наоборот, получается ЗАВИСИМО "от места программы" - куда (не) впишут
внесли ясность, а теперь берём и возвращаемся к первоначальным вопросам:
ЗАЧЕМ вписывать выход из задачи в такие НЕУДОБНЫЕ точки, где нужно сохранять значения всех регистров?
почему не делать этого между законченными блоками расчётов после сохранения результатов в память?
особенно если хочется "высоких абстракций" (ведь даже отдельные переменные куда выше уровнем, чем регистры)
в наше время даже для дебага мелких процедурок это бессмысленно, эмули удобнее однозначно
Прихожу без разрешения, сею смерть и разрушение...
тут как бы дело в том что если кому то и понадобится данный функционал, его напишут за пару минут, тут нет ни хитростей ни обьема. это уровень очистки лдиром. Посвящать такой мелочи тему странно. Собственно она вся и состоит из объяснения что это нафиг не нужно.
Lethargeek(15.09.2025), null_device(16.09.2025)
Любой нестандартный подход рассматривается как ересь, людьми которые привыкли писать в своей парадигме.
Я не критикую классические стандартные подходы, я лишь попытался предложить поэкспериментировать, сломать косность и включить фантазию.
К сожалению с годами практики, все необычные решения начинают восприниматься в штыки, даже среди профессионалов.
Кроме аргументов, "что это нафиг никому нее нужно" и "можно сделать проще" не вижу никаких обоснований. Запретить, выставить на посмешище, указать на свое место, все, что я слышу в ответ на простое предложение попробовать и оценить в деле.
Я изначально не навязывал свое видение, но на протяжении обсуждения, зачем то вынужден оправдываться. Я пишу так как я хочу, если кто-то думает так, как я, значит кому то зашла идея. Раскритиковать можно что угодно, для этого нужно еще меньше усилий чем написать простой алгоритм.
К примеру: традиционный подход с прерываниями абсолютно неэкономично расходует ресурсы на сохранение/восстановление контекстов задач. С надобностью или без каждые 1/50 секунды сохраняется и восстанавливается задача работающая в фоне. Мой пример с переключением так же можно повесить на опрос клавиатуры и вызывать как подзадачу только если это действительно нужно. Да это привязка к прерываниям, но уже другая.
А если смотреть в целом, это именно свобода. У тебя появляется возможность работать с виртуальными наборами, не заморачиваясь на других реализациях. Да это очень простой код, но это не значит что он примитивный.
Если кому то нравится работать с макросами, никто не мешает оформить переключение в виде шаблона вместо вызовов call/ret.
Если вы категорически против, просто пройдите мимо.
Like a bright light on the ХORIZON
Shining so bright, he'll get you flying
Yuri80(13.09.2025)
не льсти себе - тут вопросы вовсе не к "нестандартности", а к твоему уровню знаний прежде всего, явно малому для такой самоуверенности
ведь "стандартные подходы" именно такие не просто так, они развивались и оттачивались годами, множеством людей, отбросивших множество вариантов
...и тут приходит некто весь в белом и, подёргав незапертую дверь не в ту сторону, предлагает "нестандартно" к форточке пристроить крыльцо
![]()
Прихожу без разрешения, сею смерть и разрушение...
Концепция 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.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)