PDA

Просмотр полной версии : Спрайты, ps/2 и куча утилит.



SfS
22.05.2014, 22:02
Несколько библиотек для спека.

Работа со спрайтами (стандартный спектрумовский экран)

Работа с PS/2 клавиатурой для Pentevo.

Куча PC-утилит самых разных в исходниках.

Если кого заинтересует буду продолжать потихоньку выкладывать. По мере ковыряния.

Прилагается хобета и тап, чтобы поглядеть на спеке спрайты и на пентеве - тест клавиатуры.

Добавил sdcc-misc-14.11.2014.tar.bz2.7z.

В нём содержится:

1. PT2-PT3 player.
2. Универсальный обработчик IM2.
3. Демо-программы ps2-test - работа с ps2 на пентево,
spr-test-0 - спрайты.
spr-test-1 - спрайты в динамике, музыка, IM2.

SfS
23.05.2014, 13:06
Да, забыл сказать, что все библиотеки имеют интерфейс к SDCC.

Oleg N. Cher
23.05.2014, 16:50
Спасибо, полезно.

Хотелось бы чуть покритиковать код вывода спрайта с атрибутами. Там сперва выводится массив пикселов, потом атрибуты. Если спрайт достаточно большой (как в приложенной демке), то возможен случай когда обновление экрана происходит примерно после вывода пикселов, но перед выводом атрибутов. Представим себе на миг - выводится большой красный спрайт на экран, заполненный белым. Юзер успевает заметить как контур спрайта мигнул белым и налился красным. Если уменьшить время между выводом знакоместа 8x8 и соответствующего ему атрибута, подобный эффект останется, но одно знакоместо - это ж отнюдь не 16x12 знакомест. Мигание беленького квадратика лучше, чем большого прямоугольника. Даже если такой вывод будет чуть медленнее данного.

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

Адаптировал libspr для ZXDev (http://zx.oberon2.ru/forum/viewtopic.php?f=10&t=198). Попутно замечу, что libspr заточена под старый SDCC. Под новый требуются косметические поправки: __asm, __endasm, __naked вместо _asm, _endasm, _naked. Есть возможность оставить компиляцию старым SDCC, но сделать её возможной и для нового SDCC. Примерно так:

#ifndef __SDCC
# define __asm _asm
# define __endasm _endasm
# define __naked _naked
#endifP.S. Ещё к коду не приложен требующийся хидер types.h, описывающий типы BYTE и WORD. Насколько я понял, в поставку SDCC он тоже не входит. Но это мелочи.

Alex Rider
23.05.2014, 17:23
Хотелось бы чуть покритиковать код вывода спрайта с атрибутами.Вот не удержусь: именно поэтому на низкопроизводительных платформах динамичесике вещи без "миганий" пишутся на асме, кастомным кодом под каждый случай (включая, например, несколько разных алгоритмов вывода спрайтов в одной игре). Кстати, при умении программировать на асме использования ЯВУ для нетребовательной к быстродействию логике в паре с кастомными (а не из стандартных библиотек среды) асмовыми процедурами шибко бы ускорили разработку, но... Сужу по себе - я не хочу использовать стандартный Basic из-за его ограничений и все-таки ничем не маскируемую тормознутость, а изучать компиляторы лениво - я ж на асме все умею! Ну и да, отлаживать скомпиленный из ЯВУ код на уровне сырцов на Спектруме все так же невозможно.

Oleg N. Cher
23.05.2014, 17:31
А зачем именно на Спектруме отлаживать?

Всё возможно, было бы желание. :) Есть листинги с прямым соответствием сишного исходника асмовскому коду. Бери и отлаживай пошагово в EmuZWin.

И несколько вариантов процедур с кастомным кодом под каждый случай - всё это возможно и на ЯВУ.

Можно иметь много-много библиотек. И иметь возможность дописывать свои. Главное - иметь стимулы для работы в данном направлении. Мне это просто интересно. :)

Andrew771
23.05.2014, 17:34
Так что ищу процедуру для вывода спрайта познакоместно - знакоместо-атрибут, и т.д.
http://zx.pk.ru/showpost.php?p=366934&postcount=25

SfS
23.05.2014, 20:15
Вообщето я это всё писал, чтобы освоить технику и вспомнить как это делается:)

С критикой согласен, но мне больше нравится метод теневого экрана. Когда всё изображение формируется на невидимом экране, а потом экраны меняются местами (как в спек 128).

У меня SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.9.0 #5416 (Apr 23 2014) (UNIX). попробую обновить как-нибудь.



в комплекте утилит есть scr2spr и scr2sprn для нарезки стандартного экрана на спрайты указанного формата. полученный бинарный файл можно преобразовать в С-шный массив с помощью bin2c.

Пример:

Имеется экран test.scr. Необходимо вырезать из него спрайт, расположенный по координатам x=10 y=5 c размерами w=4 h=6 и создать из него С-шный массив.

Всё это сделает такая команда:

(спрайт с атрибутами) scr2spr 10 5 4 6 test.scr | bin2c mySprite0 -- > mySprite0.c

(спрайт без атрибутов) scr2sprn 10 5 4 6 test.scr | bin2c mySprite0 -- > mySprite0.c

Довольно просто и часто удобно.

Кстати, кто знает редактор спековских экранов под *NIX ?

Oleg N. Cher
01.06.2014, 14:16
SfS, в SDCC нужно обязательно сохранять IX и восстанавливать его значение при выходе из любой процедуры.


void spr0_out0(const Sprite0* adr, BYTE x, BYTE y)__naked{
__asm
ld ix,#2
add ix,sp
...
jp spr0_out0
__endasm;
}


void spr0_out0(const Sprite0* adr, BYTE x, BYTE y)__naked{
__asm
push ix
ld ix,#4
add ix,sp
...
call spr0_out0
pop ix
ret
__endasm;
}

Ведь SDCC адресует локальные переменные процедуры через IX. Так сделано по нескольким причинам, в частности для упрощения рекурсии.

У меня была такая редкая труднонаходимая ошибка, которую никто не нашёл, а может и не стал искать, кому же нужна чужая минидемо когда все заняты своими мегапрожектами. ;)

http://zx.pk.ru/showpost.php?p=480804&postcount=9
http://zx.pk.ru/showpost.php?p=555967&postcount=39


Исправлен глюк со сбросом примера на Laser Basic. Проблема будет интересна всем, кто юзает SDCC. Это даже не глюк, допущенный случайно. Дело в том, что я после извлечения параметров функций допускал изменение регистра IX. А делать оказывается этого нельзя, ибо SDCC иногда полагается на его значение после возвращения из функции. (Как написал Филипп: “IX is a calle-saves register”).

P.S. Можно ли добавить в библиотеку libspr возможность работы со спрайтом, выходящим за край экрана (и справа, и слева, и сверху, и снизу)? Т.е. я понимаю, что можно, но есть ли желание этим заняться? :)

SfS
14.11.2014, 21:23
Добавил sdcc-misc-14.11.2014.tar.bz2.7z (стартовое сообщение)

В нём содержится:

1. PT2-PT3 player.
2. Универсальный обработчик IM2.
3. Демо-программы ps2-test - работа с ps2 на пентево,
spr-test-0 - спрайты.
spr-test-1 - спрайты в динамике, музыка, IM2.

Музыкальный плеер конвертировал в sdcc-ассемблер из того, что был на сайте бульбы.

SfS
16.11.2014, 22:42
Переделал программки и библиотеки для SDCC-3.4. Там довольно много отличий
в инициализации (crt0.s) и макросах.
Как всегда - всё в первом сообщении

http://zx-pk.ru/attachment.php?attachmentid=49948&stc=1&d=1416163270