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

User Tag List

Страница 73 из 110 ПерваяПервая ... 697071727374757677 ... ПоследняяПоследняя
Показано с 721 по 730 из 1094

Тема: ЭТЮДЫ

  1. #721
    Activist
    Регистрация
    23.03.2005
    Адрес
    г. Чернигов, Украина
    Сообщений
    477
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    Destr красава, особенно полезно для 8 бит результата плюс остаток.
    Небольшой макрос для вычисления адреса в пиксельном экрана познакоместно. Раньше мучался, сейчас использую постоянно.
    Код:
    			macro	at x,y
    			db	(y&0x07)*0x20+x
    			db	(y&0x18)+0x40
    			endm
    Вот, кстати, нашлись подобные макросы в Alasm:

    alasm:

    Вычисление экранного адреса.

    getS метка,3,4*8 (4пикселя и *8 для знакомест)

    \0 - Имя создаваемой переменной
    \1 - X coord (в знакоместах)
    \2 - Y coord (в пикселях)

    MACRO getS ; label,X,Y ($-SCR)
    \0 EQU Ss
    \0=\0+((\2)&192*32)+((\2)&7*256)+((\2)&56*4)+((\1) &31)

    ENDM



    Вычисление адреса в атрибутах.

    get@ метка,X,Y

    \0 - Имя создаваемой переменной
    \1 - X координата (в знакоместах)
    \2 - Y координата (в знакоместах)

    MACRO get@ ; label,Xat,Yat (@-ATTR)
    \0 EQU As
    \0=\0+((\2)*32)+((\1)&#1F)

    ENDM

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

  3. #722
    Activist
    Регистрация
    23.03.2005
    Адрес
    г. Чернигов, Украина
    Сообщений
    477
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    коллеги, а никто не желает запостить этюдик поворот спрайта на 90 градусов? Простой - кратный знакоместу. Хватит для 8х8 точек и 16х16 точек
    Последний раз редактировалось Знахарь; 08.05.2018 в 21:04.

  4. #723
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    навскидку, будет что-то такое:

    Код:
    symrot:
    	ld	b,#08
    lp_rot1:
    	push	hl
            ld	a,#80
    lp_rot2:
    	rlc	(hl)
    	inc	hl
    	rra
    	jr	nc,lp_rot2
    
    	pop	hl
    	ld	(de),a
    	inc	de
    	djnz	lp_rot1
    
    	ret
    для 2*2, можно дописать сверху:

    Код:
    symrot4:
    	call	symrot2
            ld      c,#08
            add    hl,bc
    
    symrot2:
            push  hl
    	ld	bc,#0010
    	add	hl,bc
    	call	symrot
            pop   hl
    не проверялось, возможно где-то что-то просмотрел
    Последний раз редактировалось char; 09.05.2018 в 10:49.

  5. #724
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если рассматривать вариант отражения спрайта 8x8 относительно диагонали (поворот на 90* получается при записи строк в обратном порядке, но с диагональю проще объяснять), то нужно выполнить следующие операции:
    1) разделить блок 8x8 на 4 части, два блока на диагонали оставить на месте, два других переставить.
    2) разделить каждый блок 4x4 на 4 части, два блока на диагонали оставить на месте, два других переставить.
    3) разделить каждый блок 2x2 на 4 точки, две точки на диагонали оставить на месте, две другие переставить.
    При желании данные шаги можно выполнять и в другом порядке.

    Для выполнения 1 шага нужно загрузить первые 4 строки в BCDE, далее используя команду RLD и регистр A обменять младшие половины загруженныx строк со старшими половинами строк лежащих в памяти(два блока в памяти при этом будут переставлены, но это можно исправить сдвинув каждую строку 4 командами RLC или RRC, когда дело дойдёт до второй половины спрайта).

    Для выполнения 2 шага нужно провести следующие вычисления:
    A=(B^(D>>2))&0x33;
    B^=A;
    D^=A<<2;
    и аналогично для строк C и E

    Третий шаг выглядит аналогично, только сдвиг будет не на 2, а на 1, и маска будет 0x55 вместо 0x33.
    Теперь первая половина спрайта готова и нужно загрузить и выполнить 2 и 3 шаг для второй половины спрайта.

  6. #725
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,167
    Записей в дневнике
    39
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    39
    Поблагодарили
    26 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    с 16х16 вышло так
    Вложения Вложения
    • Тип файла: zip rots.zip (1.6 Кб, Просмотров: 78)

  7. #726
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    если 16*16 графика идет не посимвольно, а 2 байта * 16 строк, то тогда можно вот так, без ix/iy
    Код:
    rot16:
    	call	rot16a
    	inc	hl
    
    rot16a:
    	ld	bc,#0880
    lp_r161:
    	push	hl
            ld	a,c
    lp_r162:
    	rlc	(hl)
    	inc	hl
    	inc	hl
    	rra
    	jr	nc,lp_r162
    
    	ex	af,af'
    
            ld	a,c
    lp_r163:
    	rlc	(hl)
    	inc	hl
    	inc	hl
    	rra
    	jr	nc,lp_r163
    
    	ld	(de),a
    	inc	de
    	ex	af,af'
    	ld	(de),a
    	inc	de
    
    	pop	hl
    	djnz	lp_r161
    
    	ret

  8. #727
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,167
    Записей в дневнике
    39
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    39
    Поблагодарили
    26 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от char Посмотреть сообщение
    если 16*16 графика идет не посимвольно, а 2 байта * 16 строк, то тогда можно вот так, без ix/iy
    это зеркальное отражение по вертикали.

  9. #728
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Шынни Посмотреть сообщение
    это зеркальное отражение по вертикали.
    где? ...сходил, проверил, все нормально сработало, даже без ошибок

    вставь к себе

    ld hl,spr
    ld de,spr+32
    push de
    call rot16
    pop hl
    push de
    call rot16
    pop hl
    push de
    call rot16
    pop hl

  10. #729
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,167
    Записей в дневнике
    39
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    39
    Поблагодарили
    26 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    мда. не увидеть такого простого решения

    стареем.

  11. #730
    Master
    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    715
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    43
    Поблагодарили
    32 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Просто 2 на 2 вращать не очень интересно поэтому от меня произвольного размера

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

    Код:
    ;in hl - original
    ;   de - destination
    ;   bc - height weight
    sprRotate
    			ld	a, e
    			add	a, b
    			ld	e, a
    			jr	nc, $+3
    			inc	d
    			dec	de
    			ld	a, c
    .l3			; цикл по строкам
    			push	af
    			ld	a, 0x08
    .l2			; цикл по линиям
    			push	af
    			push	hl
    			push	bc
    			ld	a, b
    .l1			; цикл по байтам в линии
    			push	af
    			ld	b, 0
    			ld	a, 0x80
    .l0			; цикл по байтам
    			rlc	(hl)
    			rra
    			jr	c, .s1
    			add	hl,bc
    			jr	.l0
    .s1
    			add	hl,bc
    			ld	(de), a
    			dec	de
    			pop	af
    			dec	a
    			jr	nz, .l1
    			pop	bc
    			push	bc
    			ex	de, hl
    			ld	c, b
    			ld	b, a
    			add	hl, bc
    			add	hl, bc
    			ex	de, hl
    			pop	bc			
    			pop	hl
    			pop	af
    			dec	a
    			jr	nz, .l2
    			inc	hl
    			pop	af
    			dec	a
    			jr	nz, .l3
    			ret
    [свернуть]

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

Страница 73 из 110 ПерваяПервая ... 697071727374757677 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 00:43
  2. Ответов: 0
    Последнее: 18.08.2006, 22:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 05:21

Метки этой темы

Ваши права

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