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

User Tag List

Страница 4 из 5 ПерваяПервая 12345 ПоследняяПоследняя
Показано с 31 по 40 из 49

Тема: Вывод тайлового бэкграунда

  1. #31
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,258
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    84
    Поблагодарили
    36 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от moroz1999 Посмотреть сообщение
    да я всю жизнь асм на коленке учил
    Почитай просто руководство к Alasm. Получишь примерное представление о возможностях современных (и не только) компиляторов.

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

  3. #32
    Member Аватар для crushers[4ePT]
    Регистрация
    06.04.2006
    Адрес
    Латвия, Рига
    Сообщений
    35
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В этой процедуре если и оптимизировать то оптимизировать по занимаемому месту под "генерилку".
    В самой процедуре прорисовки можно только если добавить сохранение стёка по другому.
    вывзов экранрефрешэра:
    ld (refresh1+1),sp
    jp refresh ;рефреш экрана
    refresh1 ld sp,#3131
    ret

    refresh ld sp,#c014
    pop hl,de,bc,af
    exx: exa
    pop hl,de,bc,af
    .... ну и так далее только в конце
    jp refresh1

    Проблема только в том что под одну экранстраницу будут передёргивания (луч перегонит рефрешер экрана).
    beLIVE!////

  4. #33
    Member Аватар для crushers[4ePT]
    Регистрация
    06.04.2006
    Адрес
    Латвия, Рига
    Сообщений
    35
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Неуверен что процедура генератора стала короче, но понятней немного должна стать
    По поводу сдвига советую пересмотреть тогда сам внутренний экран таким образом чтобы "передвигать" по оси y или x можно было путём увеличения указателя на экран на ширину или 1 байт. Идеальный вариант сделать ширину строки 32байта, тогда сдвиг вправо будет просто инкремент указателя на 1, влево соответственно декремент а вниз или вверх на 256.
    (inc/dec l - по оси x, inc/dec h - по оси y)
    но тогда надо при выводе либо следить за стёком чтобы неулетел за границу 256байт либо использовать ld a,(hl): ld (de),a: inc l: inc e
    Вложения Вложения
    • Тип файла: txt example.txt (974 байт, Просмотров: 196)
    beLIVE!////

  5. #34
    Member Аватар для ws_mason
    Регистрация
    12.04.2005
    Адрес
    Lesosibirsk
    Сообщений
    31
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Кстати, кидать данные через стек можно и с использованием прерываний. Я подсмотрел у Медноногова в исходниках Черного Ворона.
    Вот тут мои исходники http://zx.pk.ru/showpost.php?p=32815&postcount=60
    Последний раз редактировалось ws_mason; 17.04.2008 в 06:29.
    кАлючее жЫвотное

  6. #35
    Master
    Регистрация
    20.01.2005
    Адрес
    Россия, Вологда
    Сообщений
    957
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от moroz1999 Посмотреть сообщение
    и хранится именно в виде набора номеров этих кусочков,
    Мое замечание по слову "номеров". Скорость уже увеличится, если эти номера заменить реальным адресом тайла. Я так делал в Вере. Хотя сначала хранил именно номера, по которым потом высчитывался адрес - а это опять ведь тормоз... Хотя у меня тайлов было 512 и номера были двубайтовыми, потому замена их на адреса никак не сказалась на длине карты.
    axor/Perspective
    http://abzac.retropc.ru/

  7. #36
    Member
    Регистрация
    12.12.2015
    Адрес
    г. Москва
    Сообщений
    65
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ws_mason Посмотреть сообщение
    Кстати, кидать данные через стек можно и с использованием прерываний. Я подсмотрел у Медноногова в исходниках Черного Ворона.
    Вот тут мои исходники http://zx.pk.ru/showpost.php?p=32815&postcount=60
    А кто помнит в чём там трюк с восстановлением данных при вызове прерывания? Ведь графика по-любому затрется адресом возврата при поступлении прерывания... Если только каждый блок перед выводом где-то отмечать, а в обработчике прерывания заново переписывать из резервного хранилища...

  8. #37
    Guru
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    13,773
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    1,179
    Поблагодарили
    775 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    если данные забираются через стек допустим в DE, то когда будет переход по im2 первым делом на то место куда впечатался адрес возврата пишут то что в DE

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

    dimidus (08.11.2019)

  10. #38
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,552
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    272
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    181 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  11. #39
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    279
    Поблагодарили
    207 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от dimidus Посмотреть сообщение
    А кто помнит в чём там трюк с восстановлением данных при вызове прерывания? Ведь графика по-любому затрется адресом возврата при поступлении прерывания... Если только каждый блок перед выводом где-то отмечать, а в обработчике прерывания заново переписывать из резервного хранилища...
    Код:
    на прерваниях вот такая конструкция
    
    	ex	(sp),hl		;сохраняем содержимое HL и забираем адрес возврата
    	ld	(im_jmp0),hl	;сохраняем его для возврата из прерывания
    	pop	hl		;восстанавливаем содержимое HL
    	ld	(im_sp0),sp	;сохраняем содержимое стека для возврата
    	push	bc		;восстанавливаем поврежденную графику 
    				;все процедуры вывода спрайтов и графики
    				;оптимизированы для сохраниния данных таким способом
    
    	ld	sp,im_stek	;дальше работаем в стеке прерывания
    	push	hl,de,bc,af	;сохраняем основной набор регистров
    				;если потребуется сохранить остальные (требуется при
    				;проигрывании музыки), то их можно сохранить тут	
    
    
    
    	call	im_proc		
    
    	pop	af,bc,de,hl	;восстанавливаем регистры
    	ld	sp,$		;стек
    im_sp0	equ	$-2
    	ei			;статус прерываний
    	jp	$		;возвращаемся по раннее сохраненному адресу
    im_jmp0	equ	$-2
    Код:
    а на прерываниях например вот такая процедура вывода BG
    
    	ld	hl,-6
    	add	hl,sp
    	ld	(tile_sp0),hl
    	ld	hl,draw_buf
    	ld	de,#4058
    draw_bbuf1
    	xor	a
    draw_bbuf0		
    	or	(hl)
    	call	nz,draw_tile
    	inc	l
    	jp	nz,draw_bbuf0
    	inc	h
    	inc	e
    	ld	a,d
    	add	a,8
    	ld	d,a
    	cp	#58
    	jp	c,draw_bbuf1
    	ret	
    draw_tile
    	push	hl,de
    	dec	a
    	jp	nz,draw_modded
    	ld	(hl),a
    ;restore background
    	ld	bc,back_tls-draw_buf
    	add	hl,bc
    	ld	c,l
    	ld	l,(hl)
    	ld	b,e
    	ld	e,c	
    	ld	h,font_c/256
    	ld	a,(hl)
    	ld	(bc),a
    
    	ld	h,font_d/2048
    draw_tile0		
    	add	hl,hl
    	add	hl,hl
    	add	hl,hl
    	ld	c,(hl)
    	inc	l
    	ld	b,(hl)
    	inc	l
    	ld	sp,hl
    	ex	de,hl
    	dup	3
    	ld	(hl),c
    	inc	h
    	ld	(hl),b
    	inc	h
    	pop	bc
    	edup
    	ld	(hl),c
    	inc	h
    	ld	(hl),b
    
    	ld	sp,$
    tile_sp0	equ	$-2
    	pop	de,hl
    	xor	a
    	ret
    для спрайтов можно придумать похожее или например вот
    Код:
    	ld	c,(hl)
    	inc	hl
    	ld	b,(hl)
    	inc	hl
    	ld	(draw_sp0),sp
    	ld	sp,hl
    
    	dup	8
    	ld	a,(de)
    	or	c
    	xor	b
    	ld	(de),a
    	inc	de
    	pop	bc
    	edup
    самое главное это контролировать во время отрисовки регистр в котором забираешь спрайт
    С уважением,
    Jerri / Red Triangle.

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

    dimidus (08.11.2019)

  13. #40
    Member
    Регистрация
    12.12.2015
    Адрес
    г. Москва
    Сообщений
    65
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от axor Посмотреть сообщение
    Мое замечание по слову "номеров". Скорость уже увеличится, если эти номера заменить реальным адресом тайла. Я так делал в Вере.
    Отличная игра получилась! А расскажи, как выбирал эти адреса и выводил на экран? Использовал буфер или напрямую? Как я понял, 512 тайлов 2*16 занимают 16КБ. Располагал их в #8000 или в #c000? Где хранилась карта?
    Тут обсуждают по большей части вывод тайла, но имхо не хватат обсуждения полного цикла с выборкой из карты. Ибо все "быстрые" способы могут разбиться об накладные расходы на переключение sp. Нужен комплексный разбор.
    зы. Ничего что я на ты?

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

    Цитата Сообщение от jerri Посмотреть сообщение
    самое главное это контролировать во время отрисовки регистр в котором забираешь спрайт
    Спасибо за примеры!
    Решил пока вопрос восстановления данных отодвинуть на второй план. Сейчас думаю как побыстрее вывести фон на экран. Задача усложняется выводом со смещением. Возможно ли вывести тайловый экран со смещением по горизонтали на несколько пикселей хотя бы за 100 Килотактов (Кт)? Интересует полный цикл от выборки из карты до вывода на экран. У меня пока получается порядка 150Кт при размере тайла 3*16Б и средней заполненности экрана от 1 до 4-х одинаковых тайлов подряд. Графику читаю стеком, на экран вывожу по (hl)
    «змейкой». Если делаю чтение и запись стеком, то получается дольше из-за накладных расходов на переключение sp, плюс не хватает регистров. Но теоретически предел метода (sp)=>(hl) (pop rp; ld (hl),r;inc l = 5+7+4=16t/Б) больше чем (sp)=>(sp) (pop rp; push rp = 5 + 5.5 = 11.5t/Б).
    Последний раз редактировалось dimidus; 05.03.2020 в 16:50.

Страница 4 из 5 ПерваяПервая 12345 ПоследняяПоследняя

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

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

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

Похожие темы

  1. вывод символа 4*8
    от Dexus в разделе Программирование
    Ответов: 15
    Последнее: 14.04.2011, 14:14
  2. Вывод на HD мониторы
    от jimled в разделе Изображение
    Ответов: 1
    Последнее: 28.01.2008, 15:09
  3. Вывод в порт на С в MicroBlaze
    от black_ninja в разделе Разный софт
    Ответов: 2
    Последнее: 25.01.2008, 09:38
  4. Вывод изображения
    от Shnurkov в разделе Изображение
    Ответов: 5
    Последнее: 10.02.2007, 15:07
  5. вывод буковочек шириной точечек
    от fk0 в разделе Программирование
    Ответов: 15
    Последнее: 10.01.2006, 23:26

Ваши права

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