User Tag List

Страница 43 из 45 ПерваяПервая ... 39404142434445 ПоследняяПоследняя
Показано с 421 по 430 из 443

Тема: Пишу шедевр для «Вектора 06Ц»

  1. #421

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Нашел небольшую ошибку в программе KTSerg

    Два раза вызов процедуры для расчета адреса спрайта для последнего знака результата
    Код:
    	call	adr_tab
    	call	adr_tab	; вычисление адреса спрайта
    Корректный результат будет
    jerri's original
    137FH 4990 162%

    jerri's precalced, unrolled
    162FH 5678 184%

    Serg's original
    151EH 5404 175%

    Serg's precalced, unrolled
    15B8H 5552 180%

    ivagor's unrolled
    1707H 5895 191%

    metamorpho's unrolled
    0C0EH 3086 100%

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

    Можно сказать что ничего не поменялось, но для чистоты эксперимента примвел %)

  2. #421
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #422

    Регистрация
    22.02.2014
    Адрес
    г. Курган
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    318
    Поблагодарили
    222 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    ...
    команды dup и edup которые ты привел в своем коде из какого ассемблера?
    ...
    Они содержатся не в моём коде.
    Судя по переписке
    https://zx-pk.ru/threads/31954-pishu...=1#post1075237
    Я сам не знал что это такое, чтобы заменить чем-то соответствующим для Вектора.
    Мнемоника команд кода в котором они были, очень похожа на мнемонику для Z80.

    Поисковик дал такую ссылки:
    https://zx-pk.ru/threads/447-sjasmpl...l=1#post903843
    https://zx-pk.ru/threads/447-sjasmpl...l=1#post904360
    http://zxpress.ru/article.php?id=14690
    Последний раз редактировалось KTSerg; 02.07.2022 в 07:38.

  4. #423

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от KTSerg Посмотреть сообщение
    Не выдержала душа поэта... с утреца всё перелопатил.

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

    Скрытый текст

    Код:
    Jerri_c:
    	lxi	d,a_test_spr	; адрес спрайта на экране
    	lxi	b,tab_spr0	; адрес спрайта
    	push	h		 ; сохранить счетчик
    ;
    	call	drop24		; вывод спрайта
    ;
    	pop	h	 восстановить счетчик
    	inx	h	; увеличение счетчика выводов спрайта на экран
    ;
    	lda	StopFlag	 ; читаем флаг остановки
    	ora	a	; проверка флага
    	jnz	Jerri_c
    [свернуть]


    И результат немного поменялся:
    Оригинальный вариант алгоритма Jerri - 1380h
    Вариант Jerri, с заранее вычисленными адресами битпланов, и полностью развёрнутый (без циклов) - 1603h

    Мой оригинальный алгоритм - 151Eh
    Мой с заранее вычисленными адресами битпланов - 15B2h

    Алгоритм metamorpho, совсем не использующий стек - 0С0Сh
    Алгоритм metamorpho, совсем не использующий стек и с обычным прерыванием в которои нет защиты стека - 0С0Eh

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

    Код:
    StInt:
    	xthl		; обмен hl <-> ((sp))
    	shld	im_ret+1	; сохраним адрес возврата из прерывания
    	pop	h
    	shld	im_hl+1		; сохраним значение HL при выхове прерывания
    	push	psw
    	lxi	h,2	;\ вычисляем указатель стека
    	dad	sp	;/
    	shld	im_sp+1	; сохраним указатель стека
    	pop	psw
    	push	b	;восстановим данные испорченные стеком
    	
    	lxi	sp,im_stek	; временный указатель стека для прерываний
    	push	PSW
    	push	b
    	push	d
    кажется что тут избыточно порталкивание PSW в стек и обратно. Как мне кажется его можно убрать, и заодним убрать смешение SP на 2 в команде DAD

    Код:
    StInt:
    	xthl		; обмен hl <-> ((sp))
    	shld	im_ret+1	; сохраним адрес возврата из прерывания
    	pop	h
    	shld	im_hl+1		; сохраним значение HL при выхове прерывания
    	lxi	h,0	;\ вычисляем указатель стека
    	dad	sp	;/
    	shld	im_sp+1	; сохраним указатель стека
    	pop	psw
    	push	b	;восстановим данные испорченные стеком
    	
    	lxi	sp,im_stek	; временный указатель стека для прерываний
    	push	b
    	push	d
    Поправь меня пожалуйста если ошибаюсь

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

    Цитата Сообщение от KTSerg Посмотреть сообщение
    Они содержатся не в моём коде.
    Судя по переписке
    https://zx-pk.ru/threads/31954-pishu...=1#post1075237
    Я сам не знал что это такое, чтобы заменить чем-то соответствующим для Вектора.
    Мнемоника команд кода в котором они были, очень похожа на мнемонику для Z80.

    Поисковик дал такую ссылки:
    https://zx-pk.ru/threads/447-sjasmpl...l=1#post903843
    https://zx-pk.ru/threads/447-sjasmpl...l=1#post904360
    http://zxpress.ru/article.php?id=14690
    Действительно ошибся. Спасибо за ссылки.

  5. #424

    Регистрация
    22.02.2014
    Адрес
    г. Курган
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    318
    Поблагодарили
    222 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    Пытаяс понять как работает твоя реализация прерываний нашел один избыточный кусочек кода как мне кажется:

    Скрытый текст


    Код:
    StInt:
    	xthl		; обмен hl <-> ((sp))
    	shld	im_ret+1	; сохраним адрес возврата из прерывания
    	pop	h
    	shld	im_hl+1		; сохраним значение HL при выхове прерывания
    	push	psw
    	lxi	h,2	;\ вычисляем указатель стека
    	dad	sp	;/
    	shld	im_sp+1	; сохраним указатель стека
    	pop	psw
    	push	b	;восстановим данные испорченные стеком
    	
    	lxi	sp,im_stek	; временный указатель стека для прерываний
    	push	PSW
    	push	b
    	push	d
    [свернуть]

    кажется что тут избыточно порталкивание PSW в стек и обратно. Как мне кажется его можно убрать, и заодним убрать смешение SP на 2 в команде DAD
    ...
    Поправь меня пожалуйста если ошибаюсь
    ...
    По бумажкам, которые у меня есть, команда "DAD rp" влияет на флаг "CY".
    Возможно его пытался защитить от изменения на время выполнения операции "DAD SP".

  6. #425

    Регистрация
    22.02.2014
    Адрес
    г. Курган
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    318
    Поблагодарили
    222 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если в основной программе флаг CY ни где и ни как не используется, то видимо, скорее всего, его защиту в прерывании можно убрать.

  7. #426

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,388
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,366
    Поблагодарили
    1,316 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от KTSerg Посмотреть сообщение
    Если в основной программе флаг CY ни где и ни как не используется, то видимо, скорее всего, его защиту в прерывании можно убрать.
    Лучше не надо, вдруг проц будет не 8080 (ну мало ли) и тогда еще и другие флаги от dad пострадают.

  8. #427

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    О, точно. Не подумал об этом. Спасибо!

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

    Как думаете, рисовать спрайты лучше сверху вниз или наоборот? Где будет меньше теаринг? При условии что мы не укладываемся в прирывание.
    Последний раз редактировалось parallelno; 03.07.2022 в 11:07.

  9. #428

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

    Скопипастил у jerri описание и не поправил: D - не совсем X, это X+старшая половина адреса начальной плоскости.
    Спасибо за оптимизацию! Твой вариант самый быстрый.
    Я его совсем незначительно ускорил (только в инициализации). примерно на 1,2% и сделал его чуточку понятнее для хранения данных (на мой вкус), хотя и далеко от идеала.

    твой вариант
    Код:
    ;----------------------------------------------------------------
    ; draw a sprite (24x24 pixels)
    ; author ivagor
    ; method: zig-zag, unrolled
    
    ; in:
    ; BC	sprite data
    ; DE	screen address (x,y)
    
    			.macro DRAW_EVEN_LINE_IVAGOR()
    			POP B
    			MOV M,C
    			DCR H
    			MOV M,B
    			DCR H
    			POP B
    			MOV M,C
    			MOV H,E
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    			MOV h,a
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			DCR L
    			.endmacro
    
    			
    			.macro DRAW_ODD_LINE_IVAGOR()
    			MOV M,B
    			DCR H
    			POP B
    			MOV M,C
    			DCR H
    			MOV M,B
    			MOV H,E
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			MOV H,D
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    			DCR L
    			.endmacro
    
    			.function DS_ivagor
    DrawSprite_ivagor:
    			; store SP
    			LXI		H,0				; (12)
    			DAD		SP				; (12)
    			SHLD	@restoreSP+1	; (20)
    			; HL = BC
    			MOV		H, B			; (8)
    			MOV		L, C			; (8)
    			; BC = (HL), HL +=2
    			MOV		C, M			; (8)
    			INX		H				; (8)
    			MOV		B, M			; (8)
    			INX		H				; (8)
    			; SP = HL
    			SPHL					; (8)
    			
    			; HL = DE
    			XCHG					; (4)
    			; D = screen X
    			MOV		D, H			; (8)
    			; E = second screen X
    			MVI		A, $20			; (8)
    			ADD		D				; (4)
    			MOV		E, A			; (8)
    			; A = third screen X
    			MVI		A, $20			; (8)
    			ADD		E				; (4)
    			; X += 2
    			INR		H				; (8)
    			INR		H				; (8)
    									; (160)
    ; screen format
    ; DRAW_EVEN_LINE_IVAGOR
    ; 1st screen buff : 3 <- 2 <- (1)
    ; 2nd screen buff : (4) -> 5 -> 6
    ; 3rd screen buff : (7) -> 8 -> 9
    ; y--
    ; DRAW_ODD_LINE_IVAGOR
    ; 3nd screen buff : 12 <- 11 <- 10
    ; 2nd screen buff : (13) -> 14 -> 15
    ; 1st screen buff : (16) -> 17 -> 18
    ; y--
    ; repeat
    
    ; HL = screen address (X + 2, Y)
    ; SP = sprite data + 2
    ; D - 1st screen buff X
    ; E - 2nd screen buff X
    ; A - 3rd screen buff X
    
    			; first line
    			MOV M,C
    			DCR H
    			MOV M,B
    			DCR H
    			POP B
    			MOV M,C
    			MOV H,E
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    			MOV h,a
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			DCR L
    
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()	
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()	
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			DRAW_ODD_LINE_IVAGOR()
    			DRAW_EVEN_LINE_IVAGOR()
    			; 24th line
    			MOV M,B
    			DCR H
    			POP B
    			MOV M,C
    			DCR H
    			MOV M,B
    			MOV H,E
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			MOV H,D
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    
    @restoreSP:	LXI		SP, TEMP_ADDR	; restore SP (12)
    			RET
    			.endfunction
    Код:
    ;----------------------------------------------------------------
    ; draw a sprite (24x24 pixels)
    ; author: parallelno
    ; method: zig-zag
    ; in:
    ; BC	sprite data
    ; DE	screen address (x,y)
    			.macro DRAW_EVEN_LINE_PARALLELNO2(_moveOneLineDown = true)
    			POP B		; 1st screen space 
    			MOV M,C
    			INR H
    			MOV M,B
    			INR H
    			POP B
    			MOV M,C
    			MOV H,E		; 2nd screen space 
    			MOV M,B
    			DCR H
    			POP B
    			MOV M,C
    			DCR H
    			MOV M,B
    			MOV H,A		; 3rd screen space 
    			POP B
    			MOV M,C
    			DCR H
    			MOV M,B
    			DCR H
    			POP B
    			MOV M,C
    			.if _moveOneLineDown == true
    			DCR	L
    			.endif
    			.endmacro
    
    			.macro DRAW_ODD_LINE_PARALLELNO2(_moveOneLineDown = true)
    			MOV M,B		; 3rd screen space 
    			INR H
    			POP B
    			MOV M,C
    			INR H
    			MOV M,B
    			MOV H,E		; 2nd screen space 
    			POP B
    			MOV M,C
    			DCR H
    			MOV M,B
    			DCR H
    			POP B
    			MOV M,C
    			MOV H,D		; 1st screen space 
    			MOV M,B
    			DCR H
    			POP B
    			MOV M,C
    			DCR H
    			MOV M,B
    			.if _moveOneLineDown == true
    			DCR	L
    			.endif			
    			.endmacro
    
    			.function DS_parallelno2
    DrawSprite_parallelno2:
    			; store SP
    			LXI		H, 0			; (12)
    			DAD		SP				; (12)
    			SHLD	@restoreSP + 1	; (20)
    			; SP = BC
    			MOV		H, B			; (8)
    			MOV		L, C			; (8)
    			SPHL					; (8)
    			; D, E, A are initial X for 
    			; the 1st, the 2nd, the 3rd screen buffs
    			XCHG					; (4)
    			MVI		A, 2			; (8)
    			ADD 	H				; (4)
    			MOV 	D, A			; (8)
    			ADI     $20             ; (8)
    			MOV     E, A            ; (8)
    			ADI 	$20				; (8)
    									; (108) total
    ; screen format
    ; DRAW_EVEN_LINE_PARALLELNO2()
    ; 1st screen buff : 1 -> 2 -> 3
    ; 2nd screen buff : 4 <- 5 <- (6)
    ; 3rd screen buff : 7 <- 8 <- (9)
    ; y--
    ; DRAW_ODD_LINE_PARALLELNO2()
    ; 3nd screen buff : 12 -> 11 -> 10
    ; 2nd screen buff : 13 <- 14 <- (15)
    ; 1st screen buff : 18 <- 17 <- (16)
    ; y--
    ; repeat
    
    ; HL - 1st screen buff XY
    ; SP - sprite data
    ; D - 1st screen buff X + 2
    ; E - 2nd screen buff X + 2
    ; A - 3rd screen buff X + 2
    
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2()	
    			DRAW_EVEN_LINE_PARALLELNO2()	
    			DRAW_ODD_LINE_PARALLELNO2( false)
    
    @restoreSP:	LXI		SP, TEMP_ADDR	; restore SP (12)
    			RET
    			.endfunction

  10. #429

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    Как думаете, рисовать спрайты лучше сверху вниз или наоборот? Где будет меньше теаринг? При условии что мы не укладываемся в прирывание.
    По-моему тут нельзя дать однозначного ответа. Рвать будет независимо от направления отрисовки. Важнее спланировать момент рисования спрайта относительно положения луча. Можно наверное даже сортировать спрайты так, чтобы успевать их выводить в нужном порядке.
    Больше игр нет

  11. #430

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от svofski Посмотреть сообщение
    По-моему тут нельзя дать однозначного ответа. Рвать будет независимо от направления отрисовки. Важнее спланировать момент рисования спрайта относительно положения луча. Можно наверное даже сортировать спрайты так, чтобы успевать их выводить в нужном порядке.
    Какой эмулятор точнее все эмулирует обновление экрана? Нужно чтоб потестировать теаринг.

Страница 43 из 45 ПерваяПервая ... 39404142434445 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Бейсики для Вектора-06Ц и клонов
    от ivagor в разделе Вектор
    Ответов: 696
    Последнее: 25.10.2025, 02:34
  2. Картотека ПО для Вектора-06ц
    от svofski в разделе Вектор
    Ответов: 719
    Последнее: 04.04.2024, 11:13
  3. Восстановление Вектора-06ц
    от Daniil Chislov 86 в разделе Вектор
    Ответов: 100
    Последнее: 11.03.2021, 00:23
  4. Ответов: 198
    Последнее: 26.04.2020, 13:05
  5. Ответов: 58
    Последнее: 06.07.2019, 23:56

Ваши права

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