User Tag List

Показано с 1 по 10 из 50

Тема: Быстрый вывод картинки 88*88

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #31

    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,869
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    110
    Поблагодарили
    66 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Лови процедуру масштабирования спрайта в 4 раза. Выводит сразу на экран без всяких промежуточных буферов и таблиц, чтобы максимально сэкономить память. Проверок на выход за пределы экрана нет, так что координаты знакомест в спрайте должны иметь значения: вертикальная = 0..5, горизонтальная = 0..7.
    Код:
    		; тестовая программа
    		ORG	60000
    		LD	HL,SPRITE
    		LD	D,0
    		LD	E,0
    		CALL	ZOOM
    		RET
    
    
    ; подпрограмма масштабирования в 4 раза спрайта
    ; входные параметры: HL=адрес спрайта, DE=координаты знакоместа для вывода на экране (D-вертик., E-гориз.)
    
    ZOOM		LD	A,(HL)				; HL = адрес нахождения в спрайте
    		AND	A
    		RET	Z				; выход, если пустой спрайт
    
    		LD	B,A
    ZOOML1		PUSH	BC				; B = количество знакомест в спрайте
    		PUSH	DE				; DE = координаты знакоместа для вывода
    
    		INC	HL
    		LD	A,(HL)
    		RLCA
    		RLCA
    		ADD	A,D
    		LD	B,A
    		INC	HL
    		LD	A,(HL)
    		RLCA
    		RLCA
    		ADD	A,E
    		LD	C,A				; BC = реальные координаты левого верхнего знакоместа на экране
    
    		INC	HL
    		EX	DE,HL				; DE = адрес нахождения в спрайте, HL = свободно
    
    		LD	(TMP_BC),BC			; запоминаем BC
    
                    LD	A,B				; расчет адреса атрибутов знакоместа в HL
                    RRCA
                    RRCA
                    RRCA
                    LD	L,A
                    AND	31
                    OR	88
                    LD	H,A
                    LD	A,L
                    AND	252
                    OR	C
                    LD	L,A				; HL = адрес атрибутов левого верхнего знакоместа
    
    
    		; заполняем квадрат 4х4 знакоместа змейкой байтом атрибутов
    		LD	BC,32
    		LD      A,(DE)                          ; читаем байт атрибутов знакоместа в спрайте
                    LD      (HL),A                          ; заносим атрибуты знакоместа на экран
    		INC	HL
    		LD	(HL),A
    		INC	HL
    		LD	(HL),A
    		INC	HL
    		LD	(HL),A
    		ADD	HL,BC
                    LD      (HL),A
    		DEC	HL
    		LD	(HL),A
    		DEC	HL
    		LD	(HL),A
    		DEC	HL
    		LD	(HL),A
    		ADD	HL,BC
                    LD      (HL),A
    		INC	HL
    		LD	(HL),A
    		INC	HL
    		LD	(HL),A
    		INC	HL
    		LD	(HL),A
    		ADD	HL,BC
                    LD      (HL),A
    		DEC	HL
    		LD	(HL),A
    		DEC	HL
    		LD	(HL),A
    		DEC	HL
    		LD	(HL),A
    
    
    		; масштабируем по паре байтов знакоместа (4 пары), заполняем прямоугольник 4х1 знакоместа
    		LD	B,4
    ZOOML2		PUSH	BC				; B = номер пары байтов изображения
    
    		LD	BC,(TMP_BC)			; BC = реальные координаты левого верхнего знакоместа для пары
    		INC	B
    		LD	(TMP_BC),BC			; сразу запоминаем BC для следующей пары байтов
    		DEC	B
    
    		INC	DE				; DE = адрес нахождения в спрайте
    
                    LD      A,B				; расчет адреса первого байта знакоместа в HL
                    LD      H,A
                    RRCA
                    RRCA
                    RRCA
                    AND	A,224
    		ADD	A,C
                    LD	L,A
                    LD	A,H
                    AND	24
                    OR	64
                    LD	H,A				; HL = адрес вывода знакоместа на экране, DE = адрес изображения в спрайте
    
    		PUSH	DE
    		CALL	ZBYTES				; выводим масштабированный первый байт пары
    		POP	DE
    
    		INC	DE
    		PUSH	DE
    		INC	H				; следующая строка в знакоместе
    		CALL	ZBYTES				; выводим масштабированный второй байт пары
    		POP	DE
    
    		POP	BC
    		DJNZ	ZOOML2				; на следующую пару	
    
    		EX	DE,HL				; HL = адрес нахождения в спрайте, DE = свободно
    
    		POP	DE				; DE = координаты спрайта на экране
    		POP	BC				; B = цикл по количеству знакомест в спрайте
    		DJNZ	ZOOML1
    		RET
    
    
    		; масштабирование байта изображения
    		; DE = адрес в спрайте, HL = адрес первого байта знакоместа на экране
    ZBYTES		LD	A,(DE)
    		LD	B,A				; B = байт изображения
    		XOR	A
    		LD	C,A
    		LD	D,A
    		LD	E,A				; в регистры C,D,E,A будем кидать масштабированные по горизонтали биты по два
    
    ZOOM7           RL      B				; загоняем во флаг CY 7-й бит байта изображения
    		JP	NC,ZOOM6			; если CY=0, переходим на следующий
    		OR	#F0				; устанавливаем %1111 для бита
    
    ZOOM6		RL	B
    		JP	NC,ZOOM5
    		OR	#0F
    
    ZOOM5		LD	C,A
    		XOR	A
    		RL	B
    		JP	NC,ZOOM4
    		OR	#F0
    
    ZOOM4		RL	B
    		JP	NC,ZOOM3
    		OR	#0F
    
    ZOOM3		LD	D,A
    		XOR	A
    		RL	B
    		JP	NC,ZOOM2
    		OR	#F0
    
    ZOOM2		RL	B
    		JP	NC,ZOOM1
    		OR	#0F
    
    ZOOM1		LD	E,A
    		XOR	A
    		RL	B
    		JP	NC,ZOOM0
    		OR	#F0
    
    ZOOM0		RL	B
    		JP	NC,ZOOM8
    		OR	#0F
    
    		; выводим на экран содержимое регистров C,D,E,A змейкой в прямоугольник 4х0.5 знакоместа
    ZOOM8		LD	(HL),C
    		INC	HL
    		LD	(HL),D
    		INC	HL
    		LD	(HL),E
    		INC	HL
    		LD	(HL),A
    
    		INC	H
    		LD	(HL),A
    		DEC	HL
    		LD	(HL),E
    		DEC	HL
    		LD	(HL),D
    		DEC	HL
    		LD	(HL),C
    
    		INC	H
    		LD	(HL),C
    		INC	HL
    		LD	(HL),D
    		INC	HL
    		LD	(HL),E
    		INC	HL
    		LD	(HL),A
    
    		INC	H
    		LD	(HL),A
    		DEC	HL
    		LD	(HL),E
    		DEC	HL
    		LD	(HL),D
    		DEC	HL
    		LD	(HL),C
    
    		RET
    
    
    TMP_BC		DEFW	0				; буфер для хранения значений в BC
    
    SPRITE							; тестовый спрайт
    DEFB 16
    DEFB 0,0,33, 128,0,0,24,24,0,8,255
    DEFB 1,0,34, 192,48,192,48,192,48,192,48
    DEFB 1,1,33, 12,3,12,3,12,3,12,3
    DEFB 1,2,33, 0,0,0,0,128,192,64,192
    DEFB 2,0,2, 254,159,129,224,254,31,24,248
    DEFB 2,1,2, 7,230,254,223,193,240,255,15
    DEFB 2,2,2, 192,64,64,192,192,64,64,192
    DEFB 3,0,2, 255,159,128,224,255,31,24,248
    DEFB 3,1,2, 6,254,255,195,192,254,63,6
    DEFB 3,2,2, 64,64,192,192,64,64,192,192
    DEFB 4,0,3, 255,143,128,224,255,31,24,248
    DEFB 4,1,3, 230,255,207,192,248,255,6,6
    DEFB 4,2,3, 64,192,192,64,64,192,192,64
    DEFB 5,0,3, 255,131,128,224,255,24,24,248
    DEFB 5,1,3, 255,255,192,192,255,31,6,6
    DEFB 5,2,3, 192,192,64,64,192,192,64,64
    Последний раз редактировалось Andrew771; 30.03.2011 в 12:39.

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

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

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

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

Похожие темы

  1. Быстрый проигрыватель AY-музыки (980-1300t)
    от TmK в разделе Программирование
    Ответов: 45
    Последнее: 20.08.2016, 14:31
  2. Вывод картинки на экран
    от Alex Clap в разделе Для начинающих
    Ответов: 17
    Последнее: 22.08.2010, 15:46
  3. Нужен быстрый поиск аналога отечественной логики
    от CodeMaster в разделе Для начинающих
    Ответов: 11
    Последнее: 21.07.2010, 17:58
  4. Куплю проц Z84C0006PEC или более быстрый.
    от Evgeny Muchkin в разделе Барахолка (архив)
    Ответов: 6
    Последнее: 19.09.2006, 11:24

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

Ваши права

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