User Tag List

Страница 9 из 14 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя
Показано с 81 по 90 из 140

Тема: Реконструкция CGLIB для использования из OMSI Pascal

  1. #81

    Регистрация
    22.03.2018
    Адрес
    г. Усть-Каменогорск, Казахстан
    Сообщений
    1,410
    Спасибо Благодарностей отдано 
    91
    Спасибо Благодарностей получено 
    178
    Поблагодарили
    138 сообщений
    Mentioned
    21 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от S_V_B Посмотреть сообщение
    Не нужно читать планы, просто нужна маска (в PutSpr сдвиговая маска уже есть- ее можно использовать), зачем в дебри лезть.
    Выше я пытался сказать, что нужно сделать что-то типа такого:

    Код:
    ; так сделано у меня, потому что я стираю предыдущий спрайт, у себя можешь использовать 
    значения после вызова XYTOSC
    	MOV	(R2)+,@#176640; адрес
            MOV	(R2)+,R1    ;ширина
    	MOV	(R2)+,3$+2  ;высота
    	MOV	(R2)+,R3  ;Сдвиг
    ;-----------------------------	
    	ADD	R3,R3
    	ADD	#MASK,R3
    	MOV	(R3),R0
    ;------------------------------
    111$:
    	MOV	R1,-(SP)
    	MOV	@#176640,-(SP)
    
    2$:
    	COM	R0
            BIC	R0, @#176642
    	INC	@#176640
    	COM	R0
            BIC	R0, @#176642
    	SOB	R1,2$
     
     
    	MOV	(SP)+,@#176640
    	MOV	(SP)+,R1
    4$:
    
    	ADD	#80.,@#176640
    3$:	DEC	#0
    	BNE	111$
    ;---------------------------------
    ; Маска есть уже в PUTSPR
    
    MASK:  
    	.WORD	^B0000000000000000
    	.WORD	^B0000000100000001
    	.WORD	^B0000001100000011
    	.WORD	^B0000011100000111
    	.WORD	^B0000111100001111
    	.WORD	^B0001111100011111
    	.WORD	^B0011111100111111
    	.WORD	^B0111111101111111
    	.WORD	^B1111111111111111
    Можно вынести в отдельную процедуру или
    Код:
            COM	R0
            BIC	R0, @#176642
    	.........
            .........
    	COM	R0
            BIC	R0, @#176642
    Вставить в PUTSPR перед записью в планы
    БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO

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

    Oleg N. Cher(19.03.2020)

  2. #82

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,717
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    [XXXXXXXX] [XXXXXXXX] [XXXXOOOO] - где биты O, допустим, не используются. Вот такую процедуру надо, много где пригодится.

    BlaireCas обнадёжил, вот с нетерпением жду, чего накодит. :-)

  3. #83

    Регистрация
    25.08.2012
    Адрес
    г. Красноярск
    Сообщений
    1,245
    Спасибо Благодарностей отдано 
    343
    Спасибо Благодарностей получено 
    369
    Поблагодарили
    261 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Хобот, кратность восьми по ширине логична, потому что данные спрайтов задаются в байтах. Но нам нужна универсальная процедура вывода некратных по ширине восьми спрайтов, тогда справа просто будут незначащие биты:
    [XXXXXXXX] [XXXXXXXX] [XXXXOOOO] - где биты O, допустим, не используются. Вот такую процедуру надо, много где пригодится.
    BlaireCas обнадёжил, вот с нетерпением жду, чего накодит. :-)
    совет - не делать универсальную
    делать набор процедур оптимизированных под разную ширину
    те на байт - одна
    на два байта - другая
    и с некратной шириной другая
    ибо у универсальной
    - объем кода вырастает
    - скорость падает
    Все о БК ДВК УКНЦ VAX Alpha

    Архив ПО для ретрокомпьютеров

    предоставляю бесплатный хостинг на PDP-11.RU для проектов о ретрокомпьютерах

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

    Oleg N. Cher(20.03.2020)

  4. #84

    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    485
    Спасибо Благодарностей отдано 
    140
    Спасибо Благодарностей получено 
    392
    Поблагодарили
    147 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Накодил:
    Код:
    PROCEDURE PutSpr (x, y: INTEGER; PROCEDURE spr);
    BEGIN /*$C
            .TITLE  CG008
            MOV     R2, -(SP)
            MOV     R3, -(SP)
            MOV     R4, -(SP)
            MOV     R5, -(SP)
            MOV     16(SP), R4              ; X
            MOV     14(SP), R3              ; Y
            MOV     10(SP), R5              ; R5 - pointer to sprite
    	mov	(R5), -(SP)		; DX
    	mov	(R5)+, -(SP)		; DX
    	mov	(R5)+, -(SP)		; DY
    	mov	R5, -(SP)		; spraddr w/o dx, dy
    	tst	-(SP)			; reserving for vaddr
    ;----------------------------------------------
    	
    	mov	R3, R1			; R0 = DY*80
    	ash	#3, R1			; ^_^
    	mov	R1, R0			; change to mul
    	mov	R3, R1			; it's just for fun
    	ash	#1, R1			; dunno will it be faster
    	add	R1, R0			;
    	ash	#3, R0			;
    	
    	mov	R4, R1			;
    	ash	#-3, R1			; 
    	add	R1, R0			; R0 += DX/8
    	add	#^O100000, R0
    	mov	R0, @#^O176640		; vaddr
    	mov	R0, (SP)		; vaddr -> (SP)
    	
    	mov	R4, R0			; shift value
    	bic	#^B1111111111111000, R0	; if it = 0 - use simple sprite out
    	bne	10$
    
    ; // sprite out with X aligned to 8 pix //
    
    	mov	#^O176642, R0
    	mov	#^O176640, R1
    	mov	#80., R3
    	sub	6(SP), R3
    2$:	mov	6(SP), R2		; DX
    4$:	mov	(R5)+, (R0)
    	inc	(R1)
    	sob	R2, 4$			; cycle by DX
    	add	R3, (R1)
    	dec	4(SP)			; cycle by DY
    	bne	2$
    
    	jmp	99$
    	
    ; // sprite out with arbitrary X //
    
    10$:	mov	R0, R3			; R3 = shift value
    	asl	R0			;
    	mov	MASK(R0), R4		; R4 = mask value
    
    	asl	6(SP)			; DX = DX * 2
    20$:
    	; // draw first DY part //
    	
    	mov	(SP), @#^O176640	; vaddr
            mov     2(SP), R5		; spraddr
    	mov	4(SP), R2		; DY
    30$:	mov	(R5), R1
    	ash	R3, R1
    	bic	R4, R1
    	com	R4
    	mov	@#^O176642, R0
    	bic	R4, R0
    	com	R4
    	bis	R1, R0
    	mov	R0, @#^O176642
    	add	#80, @#^O176640
    	add	6(SP), R5		; R5 = R5+DX2 
    	sob	R2, 30$
    
    	inc	(SP)			; inc vaddr
    	
    	; // draw second DY part //
    	
    	mov	(SP), @#^O176640	; vaddr
            mov     2(SP), R5		; spraddr
    	mov	4(SP), R2		; DY
    	com	R4			; invert mask
    40$:	mov	(R5), R1
    	swab	R1
    	movb	R1, R0
    	ashc	R3, R0			; R0:R1 << R3
    	bic	R4, R0			; apply mask
    	com	R4
    	mov	@#^O176642, R1
    	bic	R4, R1
    	com	R4
    	bis	R0, R1
    	mov	R1, @#^O176642
    	add	#80, @#^O176640
    	add	6(SP), R5
    	sob	R2, 40$
    
    	com	R4			; invert mask
    	add	#2, 2(SP)		; spraddr += 2
    	
    	dec	8(SP)			; cycle by DX
    	bne	20$
    
    ;----------------------------------------------
    99$:	tst	(SP)+
    	tst	(SP)+
    	tst	(SP)+
    	tst	(SP)+
    	tst	(SP)+
            MOV     (SP)+, R5
            MOV     (SP)+, R4
            MOV     (SP)+, R3
            MOV     (SP)+, R2
    */
    END {PutSpr};


    Сделано НУ ОЧЕНЬ неоптимально и тормозно. Я не пытался ничего оптимизировать. Просто как заготовка - дальше можно самому там оптимальности добавлять.
    Что поменял - размеры спрайта не в байтах, а в словах в дата для спрайта (ну это легко подправить, я просто не любитель байтов)

    Также вывод как видите без маски - то-есть если нужно делать скажем круглую картинку (скругленные края и т.д.) - нужно будет еще и маску в спрайте держать, как-то не хочется.

    Исходники и .sav : uknc_pas.zip
    Последний раз редактировалось BlaireCas; 20.03.2020 в 11:46.

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

    Oleg N. Cher(20.03.2020)

  5. #85

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,717
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    BlaireCas, скорость очень хорошая. В идеале очень бы хотелось добавить в этот вывод некратность спрайтов восьми (чтобы ширина задавалась в пикселях). Не настаиваю, попробую сам закодить. Хотя не знаю, как пойдёт...

    Процедуру S_V_B тоже оставим в библиотеке и переименуем в PutOr.

  6. #86

    Регистрация
    22.03.2018
    Адрес
    г. Усть-Каменогорск, Казахстан
    Сообщений
    1,410
    Спасибо Благодарностей отдано 
    91
    Спасибо Благодарностей получено 
    178
    Поблагодарили
    138 сообщений
    Mentioned
    21 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Процедуру S_V_B тоже оставим в библиотеке и переименуем в PutOr.
    Добавь то о чем я распинался выше (стирание прямоугольника с любой точки), пригодится для PutOR.
    БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO

  7. #87

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,717
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Извини, я не очень разобрался как это работает. Опишешь подробнее?

    А то вроде PutOr и так работает нормально и ожидаемо.

  8. #88

    Регистрация
    22.03.2018
    Адрес
    г. Усть-Каменогорск, Казахстан
    Сообщений
    1,410
    Спасибо Благодарностей отдано 
    91
    Спасибо Благодарностей получено 
    178
    Поблагодарили
    138 сообщений
    Mentioned
    21 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Работает точно так же как PutOr только проще. Должна предшествовать PutOr, после вызова XYTOSC если ты хочешь стереть область под спрайтом.
    Присмотрись к маске.. получив сдвиг ты выбираешь нужное слово для двух планов, стираешь точки для первого байта и соответственно инвертируя стираешь точки для второго байта. (надеюсь ты понимаешь, что если ты байт сдвинул то он всенепременно вылезет в следующий байт)..

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

    Или несколькими строчками вставить в PutOr, но тогда ты лишишься чистого OR и получишь "вожделенную" универсальную процедуру.

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

    Это максимум, что можно сделать для универсальной процедуры, дальше уже идет специфика.. т.е. нужно думать, что и как ты хочешь вывести.. если однотипные тайлы то нужно писать спец. процедуру под них, которая будет в разы быстрее.
    БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO

  9. #89

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,717
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    S_V_B, ок. То есть, ты предлагаешь модификацию процедуры Put так, что она будет чистить прямоугольник нужного нам размера (кратного по ширине восьми, насколько я понимаю). И можно будет использовать её чтобы чистить место перед выводом спрайта по OR. Нормальное решение. Хотя идея чистить и выводить каждую линию сразу кажется мне более интересной. Но норм.

    Не будет ли большой наглостью с моей стороны попросить готовый протестированный код? У меня сейчас такое восприятие асма: на уровне отдельных команд вроде всё понятно, а целиком - теряюсь. Вроде бы понял как обращаться к экранной памяти, а всё равно гляжу в ваш с BlaireCas код и теряюсь.

    Спасибо заранее.

  10. #90

    Регистрация
    22.03.2018
    Адрес
    г. Усть-Каменогорск, Казахстан
    Сообщений
    1,410
    Спасибо Благодарностей отдано 
    91
    Спасибо Благодарностей получено 
    178
    Поблагодарили
    138 сообщений
    Mentioned
    21 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот ты вроде продвинутый.. шестнадцатиричные числа читать умеешь, а простых вещей понять не можешь.., а говоришь, что паскаль - вершина языков программирования.. (понятная для всех неофитов).
    Как грустно созерцать что случилось с мечтами идеалистов..(в белых халатах на лету читающих перфоленты)..Интернет.. для "мгновенного общения" ученых (обмен результатами акспереминтов).. результат - запись задниц в 8K, вместить в 2к программу "Апалон"...в итоге языки для "ДОМОХОЗЯЕК"... +БОЛЬШЕ ПОКУПАЕШЬ - МЕНЬШЕ ТРАТИШЬ...(но сцука законы природы не обмануть - сколько вложил - столько плучил)
    БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO

Страница 9 из 14 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Turbo Pascal для msx/msx2
    от Оззя в разделе MSX
    Ответов: 4
    Последнее: 23.02.2020, 23:59
  2. Ответов: 7
    Последнее: 12.12.2019, 04:12
  3. Turbo Pascal 4 и CP/M 3 для Корвета
    от litwr в разделе Корвет
    Ответов: 10
    Последнее: 26.11.2019, 04:19
  4. Язык PL/M. Возможность использования.
    от James DiGreze в разделе Программирование
    Ответов: 18
    Последнее: 15.01.2006, 12:19

Ваши права

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