User Tag List

Страница 8 из 8 ПерваяПервая ... 45678
Показано с 71 по 75 из 75

Тема: SwapSet

  1. #71

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

    По умолчанию

    Цитата Сообщение от jim Посмотреть сообщение
    Мы все здесь потому, что любим Spectrum за его свободу — так давайте не будем ограничивать друг друга в том, как мы эту свободу используем.
    И как же вас ограничивают ? Вам что кто-то запретил использовать ваш SwapSet чтоли ?
    А то что на ваши посты практически нет положительных откликов, так уж извиняйте тут не хвалилка, отвечают то что думают о ваших рассуждениях и высказываниях - свобода-сЪ однако !

    Цитата Сообщение от jim Посмотреть сообщение
    Конечно может. Но SwapSet(SwitchContext) имеет HumanityOverhead > 0. А в наивном коде HO == 0
    Забавные вы батенька аргументы приводите.
    "HumanityOverhead" - на запрос Яндекс отвечает "ничего не нашли", Google цинично отправляет на ваш же пост.
    Онлайн переводчик от Яндекса выдаёт "Главенствующее положение человечества", от Гугла вообще не переводит, а если разорвать на слова, то "Humanity Overhead" - "Накладные расходы человечества" а "Humanity Over head" - "Человечество над головой". Думаю в данном случае Гугл правильно перевёл вторым случаем - "Накладные расходы человечества" > 0

    На самом деле не обманывайте ни себя, ни других. Да, конечно метод програмного обмена регистров использовать в ряде случаев может быть оправдано и удобно, но именно что особых где это действительно может быть оправдано, а не пихать его во все щели куда надо и не надо. Так же как использование других процедур и методов оправдано там где это необходимо и удобно.
    Ваш SwapSet это самая обычная ассемблерная процедура не больше и не меньше. Улучшение читабельности программы он несёт не более чем и другие методы ассемблера, а иногда и менее. Оборачивание вызовов этого метода в макросы принципиально ничем не выделяется по сравнению с оборачиванием в макросы других методов и способов программирования на ассемблере.

    Я не в курсе кто программирует ныне в наивном коде, и какое такое но==0, но если говорить о нативном коде, то думается цифровыми мнемониками уже давно практически никто не пользуется.
    А утверждать о преимуществе SwapSet по сравнению с кодом ассемблера глупо, поскольку он сам такой же код ассемблера. Ассемблер он и есть ассемблер, хотите не ассемблерный метод - используйте языки более высокого уровня. А, макросы, да они могут повысить уровень ассемблера, если грамотно написаны, но повторюсь макросы можно писать для очень многих решений ассемблерного кода, а учитывая наличие в SjASMplus встроенного lua, теоретически можно даже сделать чтото вроде зачатка яву (хотя скорее ясу). Так что SwapSet тут преимуществ никаких не имеет.

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

    jim(24.09.2025)

  2. #72

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

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    "HumanityOverhead" - на запрос Яндекс отвечает "ничего не нашли", Google цинично отправляет на ваш же пост.
    Онлайн переводчик от Яндекса выдаёт "Главенствующее положение человечества", от Гугла вообще не переводит, а если разорвать на слова, то "Humanity Overhead" - "Накладные расходы человечества" а "Humanity Over head" - "Человечество над головой". Думаю в данном случае Гугл правильно перевёл вторым случаем - "Накладные расходы человечества" > 0
    HO, а точнее "Overhead On Humanity" — это не про "накладные расходы человечества", а про:
    "Накладные расходы НА человечность" — плата за код, удобный для людей, а не для процессоров.


    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Я не в курсе кто программирует ныне в наивном коде, и какое такое но==0, но если говорить о нативном коде, то думается цифровыми мнемониками уже давно практически никто не пользуется.
    речь именно о "наивной" прямолинейной реализации кода, понятной процессору и не перегруженной чем либо, чтобы быть понятнее программисту.


    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Да, конечно метод програмного обмена регистров использовать в ряде случаев может быть оправдано и удобно
    BRAVO!

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    А утверждать о преимуществе SwapSet по сравнению с кодом ассемблера глупо, поскольку он сам такой же код ассемблера.
    А я и не утверждал того что мой метод прыгнул выше головы, и о каких то его преимуществах перед обычным ассемблером. Да это ассемблер, но это еще и API для расширенных операций, отсутствующих в стандартной архитектуре z80.

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Ваш SwapSet это самая обычная ассемблерная процедура не больше и не меньше.
    Вы абсолютно правы — SwapSet действительно просто ещё один инструмент, а не панацея.
    Я исследую, может ли такой подход упростить разработку больших проектов на Z80.
    Если у вас есть идеи, как его улучшить или где он мог бы быть действительно полезен — буду благодарен за советы!
    Спасибо за конструктивную критику!

    Вот несколько сценариев применения, которые вижу я:

    1. Изолированные функции
    Каждая функция получает свой собственный контекст.
    Это как «песочница» — туда кладём аргументы через сеттеры, переключаемся SwitchContext, выполняем код, возвращаемся, забираем результат через геттеры.
    никаких push/pop, чистый вызов
    функция не портит caller

    2. Многозадачность
    Если в сет добавить ещё PC и SP, он превращается в полноценный TCB (Task Control Block).
    Тогда SwitchContext становится ядром планировщика.
    можно реализовать кооперативную или вытесняющую многозадачность
    любая задача живёт в своём сете

    3. Объекты и структуры
    Сет можно рассматривать как объект, где есть «поля» (ячейки под регистры) и «методы» (геттеры/сеттеры, макросы).
    геттеры/сеттеры заменяют push/pop и позволяют адресовать регистры произвольно а не LIFO.
    Тут необязательно даже переключаться в контекст. Можно работать с чужим объектом напрямую,
    считывать и записывать значения другого сета.
    Последний раз редактировалось jim; 24.09.2025 в 23:31.
    Like a bright light on the ХORIZON
    Shining so bright, he'll get you flying

  3. #73

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

    По умолчанию

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


    Цитата Сообщение от jim Посмотреть сообщение
    А я и не утверждал того что мой метод прыгнул выше головы, и о каких то его преимуществах перед обычным ассемблером. Да это ассемблер, но это еще и API для расширенных операций, отсутствующих в стандартной архитектуре z80.
    API для расширенных операций звучит конечно гордо, но по факту это будет обычный вызов подпрограммы либо встраивание куска кода через макрос. Необходимость менять весь сет регистров здесь прослеживается скорее почти никогда, да и подстановка push/pop макросом тоже вполне себе работает.


    Цитата Сообщение от jim Посмотреть сообщение
    Я исследую, может ли такой подход упростить разработку больших проектов на Z80.
    Если у вас есть идеи, как его улучшить или где он мог бы быть действительно полезен — буду благодарен за советы!
    Ну х.з. единственное что приходит голову это стратегическая игра, где у каждого юнита имеется своё состояние, на которое он переключается при передаче управления. Но опять же далеко не факт, что переключение сета регистров окажется эффективней прямого чтения с памяти.


    Цитата Сообщение от jim Посмотреть сообщение
    1. Изолированные функции
    Каждая функция получает свой собственный контекст.
    Это как «песочница» — туда кладём аргументы через сеттеры, переключаемся SwitchContext, выполняем код, возвращаемся, забираем результат через геттеры.
    никаких push/pop, чистый вызов
    функция не портит caller
    Вытягивать все процедуры ассемблера в песочницу нерационально, падение производительности на вызовах колоссальное, плюс лишняя забивка памяти сетами и оболочками вызовов . Максимум несколько действительно нужных функций со своими наборами регистров, и даже в них будут появляться промежуточные результаты которые придётся либо кидать на стек, либо на ячейки памяти. Кроме того при работе с включенными прерываниями нужно следить чтоб свапинг не словил прерывание. Проще всего это делать, если вызывать свапинг после халта, либо использовать иные методы тайминга, например как Alone предлагал. А без прерываний... счас если что и пишется, то игрушки или изредка демки, где без AY совсем грустно ))


    Цитата Сообщение от jim Посмотреть сообщение
    2. Многозадачность
    Если в сет добавить ещё PC и SP, он превращается в полноценный TCB (Task Control Block).
    Тогда SwitchContext становится ядром планировщика.
    можно реализовать кооперативную или вытесняющую многозадачность
    любая задача живёт в своём сете
    Подвижки в принципе возможны, но тут первый вопрос а что многозадачить ? Когда на него отвечаем, то второй опять с обработкой прерываний. ))


    Цитата Сообщение от jim Посмотреть сообщение
    3. Объекты и структуры
    Сет можно рассматривать как объект, где есть «поля» (ячейки под регистры) и «методы» (геттеры/сеттеры, макросы).
    геттеры/сеттеры заменяют push/pop и позволяют адресовать регистры произвольно а не LIFO.
    Тут необязательно даже переключаться в контекст. Можно работать с чужим объектом напрямую,
    считывать и записывать значения другого сета.
    Правильнее сказать что адресация по структуре данных объекта через (ix+n) позволяет адресоваться к ячейкам памяти произвольно, а уж как работает с ними объект- загружает как сет регистров или вытягивает по одной как переменную (и далеко не факт что сетом регистров эффективнее будет), это вопрос уже конкретных условий реализации.

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

    jim(25.09.2025)

  4. #74

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

    По умолчанию

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

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

    Цитата Сообщение от jim Посмотреть сообщение
    1. Изолированные функции
    Каждая функция получает свой собственный контекст.
    Это как «песочница» — туда кладём аргументы через сеттеры, переключаемся SwitchContext, выполняем код, возвращаемся, забираем результат через геттеры.
    никаких push/pop, чистый вызов
    функция не портит caller
    нда, а ведь именно об этом была картинка
    в таком случае, зачем же останавливаться на полпути?
    геттеры, сеттеры - это недостаточно абстрактно и нестандартно!
    пускай функции общаются пересылкой текстовых сообщений, чтоб всё по-взрослому!!
    Прихожу без разрешения, сею смерть и разрушение...

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

    cafedead(01.10.2025)

  5. #75

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

    По умолчанию

    Описание имеющихся наработок:


    Спецификация библиотеки 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
    Примечание
    Алиасы:
    SwapSet == SwitchContext
    SaveSet == Init
    LoadSet == Return
    Последний раз редактировалось jim; 25.09.2025 в 22:34.
    Like a bright light on the ХORIZON
    Shining so bright, he'll get you flying

Страница 8 из 8 ПерваяПервая ... 45678

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

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

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

Ваши права

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