Программы для БК!

КЛУБ БК0010.01

Спрайты для БК.
Спрайты для БК Из журнала информатика и образование февраль 1990 г.

программы


Цвет
Насыщенность
Размер



Спрайты для БК


Для программного вывода на экран небольших
изображений в стандарте Бейсика MSX
имеется оператор SPRITE$, который позволяет
задать до 256 картинок (спрайтов) размером
8Х8 или 64 спрайта 16Х16. С его помощью
можно создавать и плавно перемещать спрайты
по экрану. Безусловно, такой оператор очень
полезен, но в БК его нет. Что делать?

Ниже приведено несколько программ для БК,
позволяющих получить на экране спрайты
размером 8Х10 или 16Х20 точек. Координаты
вывода и размеры спрайтов не меняются при
переключении размеров курсора (32/64).

При использовании программ надо будет
в начале основной программы поместить опе-
ратор PRINT CHR$(140);CHR$(140), да и в
самой программе нельзя "сдвигать" экран
вверх; самой верзней точке экрана с коорди-
натами (0,0) должен постоянно соответствовать
адрес &O42000.

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


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

	Вариант на Бейсике.
Приведенные ниже программы выводят на экран спрайт
в соответствии со следующими параметрами.

N - номер спрайта (0-...);
X - координата X(0-31);
Y - координата Y(0-229).

Программы используют файл, содержащий коды
изображений спрайтов. Он записывается в память
с адреса:
	&O27774 - если перед кодами изображений
спрайтов идут 4 байта, содержащие данные о ширине
и высоте столбца спрайтов (результат работы
редактора GRED0);
	&O30000 - если коды начинаются сразу.



10 'Программа SPRITE 8*10
20 NN=N*&O24
30 XX=X+X
40 YY=Y*&O100
50 XY=XX+YY+&O42000
60 FOR I=&O30000+NN TO &O30023+NN STEP &O2
70 POKE XY,PEEK(I)
80 XY=XY+&O100
90 NEXT I

СКАЧАТЬ ПРИМЕР SPRITE 8X10


10 'Программа SPRITE 16*20
20 NN=N*&O120
30 XX=X+X
40 YY=Y*&O100
50 XY=XX+YY+&O42000
60 FOR I=&O30000+NN TO &O30116+NN STEP &O4
70 POKE XY,PEEK(I)
80 POKE XY+2,PEEK(I+2)
90 XY=XY+&O100
100 NEXT I


СКАЧАТЬ ПРИМЕР SPRITE 16X20


Пример использования программы SPRITE 8*10



5 PRINT CHR$(148)CHR$(158)CHR$(140)CHR$(140)CHR$(146);
10 ' Программа SPRITE 8*10
20 NN=N*&O24
30 XX=X+X
40 YY=Y*&O100
50 XY=XX+YY+&O42000
60 FOR I=&O30000+NN TO &O30023+NN STEP &O2
70 POKE XY,PEEK(I)
80 XY=XY+&O100
90 NEXT I
100 LOCATE 10,2
105 REM Человечек
120 POKE &O30000,&O1640
130 POKE &O30002,&O1700
140 POKE &O30004,&O140300
150 POKE &O30006,&O37774
160 POKE &O30010,&O1703
170 POKE &O30012,&O1700
180 POKE &O30014,&O1700
190 POKE &O30016,&O6060
200 POKE &O30020,&O6060
210 POKE &O30022,&O36074



Пример использования программы SPRITE 16*20
 



5 PRINT CHR$(148)CHR$(158)CHR$(140)CHR$(140)CHR$(146);
8 RESTORE 120
9 GOSUB 120
10 ' Программа вывода SPRITE 16*20
20 NN=N*&O120
30 XX=X+X
40 YY=Y*&O100
50 XY=XX+YY+&O42000
60 FOR I=&O30000+NN TO &O30076+NN STEP &O4
70 POKE XY,PEEK(I)
80 POKE XY+2,PEEK(I+2)
90 XY=XY+&O100
100 NEXT I
105 LOCATE 2,2
106 GOTO 1000
107 ' размещаем бобика по адресу 30000.
120 DATA &O114000,&O231
130 DATA &O63100,&O25146
140 DATA &O134400,&O1673
150 DATA &O167200,&O2756
160 DATA &O135640,&O14533
161 DATA &O167340,&O12536
162 DATA &O135610,&O134573
163 DATA &O167340,&O127356
164 DATA &O135610,&O1673
165 DATA &O167350,&O5302
166 DATA &O135660,&O13
167 DATA &O167340,&O5356
168 DATA &O135200,&O1273
169 DATA &O164000,&O56,&O40000,&O5,&O140000,&O377
170 FOR A%=&O30000 TO &O30000+&O76 STEP 2%
180 READ D%
190 POKE A%,D%
200 NEXT A%
210 RETURN 
1000 REM конец программы



Вариант в кодах. Следующие программы выводят на экран спрайт,
параметры которого заданы в следующих ячейках:
&O37770 - содержит в себе номер спрайта (0 - ...);
&O37772 - содержит в себе координату X (0-31);
&O37774 - содержит в себе координату Y (0-229).

Файл спрайтов записывается с адреса:
&O30174 - если коды изображения идут не сразу;
&O30200 - если коды изображения идут сразу.



10 ' Программа SPRITE 8*10
20 DATA 5572,16376,4865,5568,20,2563,2562,3009
30 DATA 777,1539,2817,26050,1,24579,32322,3010
40 DATA 769,2819,4293,5572,16380,4865,5568,64
50 DATA 2563,2562,3009,777,1539,2817,26050,1
60 DATA 24579,32322,3010,769,2819,5568,16378,4612
70 DATA 3268,24772,26052,17408,5571,12416,24899,4290
80 DATA 26050,19,5324,26052,64,8386,2043,2560
90 DATA 2561,2562,2563,2564,2565,135,0,0
100 DATA -1,0,-1,0
110 FOR A%=&O30000 TO &O30200 STEP &O02
120 READ K%
130 POKE A%,K%
140 NEXT A%
150 END



Дизассемблер программы SPRITE 8*10




030000) MOV #37770,R4
030004) MOV (R4),R1
030006) MOV #24,R0
030012) CLR R3
030014) CLR R2
030016) TST R1
030020) BEQ 30044
030022) BGT 30032
030024) NEG R1
030026) ADD #1,R2
030032) ADD R0,R3
030034) SOB R1,30032
030036) TST R2
030040) BEQ 30044
030042) NEG R3
030044) MOV R3,R5
030046) MOV #37774,R4
030052) MOV (R4),R1
030054) MOV #100,R0
030060) CLR R3
030062) CLR R2
030064) TST R1
030066) BEQ 30112
030070) BGT 30100
030072) NEG R1
030074) ADD #1,R2
030100) ADD R0,R3
030102) SOB R1,30100
030104) TST R2
030106) BEQ 30112
030110) NEG R3
030112) MOV #37772,R0
030116) MOV (R0),R4
030120) ASL R4
030122) ADD R3,R4
030124) ADD #42000,R4
030130) MOV #30200,R3
030134) ADD R5,R3
030136) MOV R3,R2
030140) ADD #23,R2
030144) MOV (R3)+,(R4)
030146) ADD #100,R4
030152) CMP R3,R2
030154) BLE 30144
030156) CLR R0	 ;2560
030160) CLR R1	 ;2561
030162) CLR R2	 ;2562
030164) CLR R3	 ;2563
030166) CLR R4	 ;2564
030170) CLR R5	 ;2565
030172) RET
030174) HALT
030176) HALT
030200) NOP



Теперь давайте откомпилируем ассемблерный
код программы SPRITE 8*10 с помощью
Кроссассемблера -
BK-10/11 Assembler v1.00 by AO SW Co., 1996.
чтобы нам было понятно что где находится,
и в который мы будем добавлять спрайты.
скачать CrossAsm вместе с программой
SPRITE 8*10 можно здесь.


СКАЧАТЬ ПРИМЕР SPRITE 8X10.ASM


ГРАФИЧЕСКИЙ РЕДАКТОР GRED0 . 
март 1987.ОЛЕГ ТУЙКИН
 

СКАЧАТЬ ГРАФИЧЕСКИЙ РЕДАКТОР GRED0



Давайте для начала чтобы вывести спрайты 8*10
в кодах,разберем как пользоваться графическим
редактором GRED0.
для удобства редактирования спрайтов будем
использовать эмулятор Юрия Калмыкова v3.7
так как он полностью поддерживает или эмулирует
клавиатуру бк0010.01 и имеет ряд удобных функций.
Например сохранение состояния рабочей среды.
Загружаем в эмулятор графический редактор GRED0.
для начала помещаем GRED0.BIN в папку BIN
эмулятора BK_v3.7 для удобства его загрузки.
В конфигурации выбираем старт БК0010(01)
далее
MO - для выхода в монитор,
M - ВВОД.
ИМЯ? - ВВОД
В в появившемся окне выбираем GRED0.BIN
Запуск эмулятора с адреса 1000
набираем
S1000 - ВВОД.
Графический редактор загружен.
Чтобы не проделывать каждый раз эти манипуляции
сохраним состояние машины.
Вибираем Файл - сохранить состояние и дадим имя
GRED. У нас появится файл GRED.msf

РАБОТА С РЕДАКТОРОМ
сейчас мы нарисуем несколько изображений,
занесем изображение в буфер, вытащим изображение
из буфера,сохраним его спрайт на диске
и узнаем адрес спрайта. Если вы хотите порисовать
то нажмите клавишу "Home" - по этой клавише
осуществляется вход и выход из редактирования
изображения.

Но я приготовил для вас уже готовые 5 спрайтов,
из игры Fantast.bin давайте скачаем файл
GRED_SPR.msf и запустим его с помощью 
эмулятора.


СКАЧАТЬ ФАЙЛ GRED_SPR.msf

GRED0

 РИСУНОК 1


На рисунке 1 мы видим 5 спрайтов это
кирпич,клад,враг,непробиваемый кирпич,
человечек. Спрайты должны рисоваться
в столбик,для правильной их записи.
Давайте сейчас попробуем переместить
верхний красный кирпич в другое место.
Наводим курсор на красный кирпич и нажимаем
клавишу "B" у нас появились стрелка вправо
и стрелка вниз пока пропустим это и нажмем
два раза ВВОД. Изображение скопировалось в
буфер обмена. Теперь поставте курсор в любое
место на экране и нажмите клавишу "\"
в этом месте должен появиться красный кирпич.

Теперь давайте скопируем сразу 5 спрайтов в
буфер обмена поставте курсор в начало на красный
кирпич и нажмите клавишу "B" когда появились
стрелки вправо и влево опустите курсор до
человечка 5-го спрайта и нажмите ВВОД.
после того как появились стрелки влево и
вверх опять поставте курсор в начало на красный
кирпич и нажмите ВВОД. Все 5-ть спрайтов
скопировались в буфер обмена теперь поместите
курсор в другое место на экране и нажмите
клавишу "\". Скопировались сразу пять изображений.

Если вы хотите напечатать текст то нажмите клавишу
"P" - Печать символов. Выход из печати клавиша ВВод.

Теперь давайте сохраним сначало один спрайт,
потом сразу 5 спрайтов.
Поставте курсор в начало на красный кирпич
и нажмите клавишу "Z" - для записи файла
если нам надо записать только один кирпич то
нажмем 2 раза ВВОД пропуская стрелки. После
того как нам предложать ввести имя, назовем
наш спрайт SPR0.bin имейте ввиду что имя
не должно превышать 5-ти символов после которых
нужно еще дописать .bin
Чтобы записать сразу пять спрайтов поставте
курсор на начало на красный кирпич нажмите клавишу
"Z" после того как появятся стрелки вправо и вниз
опустите курсор до последнего спрайта человечка
и нажмите ВВОД появились стрелки влево и вверх.
снова возвращаемся к первому спрайту и нажимаем
ВВОД назовем все 5-ть спрайтов именем SPR5.bin

Теперь давайте узнаем адрес нашего спрайта
красного кирпича под название SPR0.BIN
который мы сохранили.
все файлы сохраняются в папку 
BK_V3.7/Release/Bin
Чтобы узнать адрес спрайта я пользуюсь
программой COPY4M.BIN
	'COPY'
Программа для копирования файлов
г.Николаев Баранов Д.Г.



СКАЧАТЬ ФАЙЛ COPY4M
   


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

Выбираем
1. Чтение файла.
И нажимаем ввод в появившемся окне вибираем наш
спрайт SPR0.BIN
Для удобства скопируйте COPY4M.BIN в туже директорию
где находится файл SPR0.BIN

Вот что должно получится на экране
Загружен файл..........
Адрес............004176 - это и будет адрес нашего спрайта SPR0.BIN
Длина............000030 - длинна спрайта

Теперь збрасываем состояние эмулятора
Конфигурация,старт БК0010(01)
MO
M
ИМЯ? SPR0.BIN
Файл загружен в память смотрим адрес 4176
нажимаем горячую клавишу F8- установка адреса отладки
вводим адрес 4176.


SPR0.BIN

 РИСУНОК 2



На рисунке 2 мы видим первые два байта 2,12
означают ширину и высоту(длинну) спрайта
далее идет код изображения нашего кирпича
который занимает 10 ячеек памяти.

давайте с помощю программы быстрого вывода
спрайта выведем этот кирпич на экран.



	.PSECT 1000

;Пример вывода спрайта на экран

;---- вывод изображения (спрайта) на экран ----
BEG:    MOV     #STONE,R0     ;адрес спрайта;
        MOV     ADR,R1      ;адрес ОЗУ, куда будем выводить;
        MOV     (R0)+,R2    ;ширина спрайта в байтах;
        MOV     (R0)+,R3    ;высота спрайта в точечных строках;
A:      MOV     R2,R4       ;начало цикла по строкам;
        MOV     R1,R5       ;запоминаем адрес начала строки;
B:      MOVB    (R0)+,(R1)+ ;цикл вывода одной строки
        SOB     R4,B          ;по байтам;
        MOV     R5,R1       ;восстанавливаем адрес начала строки;
        ADD     #100,R1     ;переходим к следующей строке;
        SOB     R3,A        ;конец цикла по строкам.
	EMT	6	    ;ожидание нажатия любой клавиши
	RTS PC
;-----------------------------------------------------
ADR:  
.word 56036       ;текущий адрес начала изображения


;---- таблица изображения (спрайта) ----
STONE: 
.word 2,12	; ШИРИНА И ВЫСОТА СПРАЙТА

;---- СПРАЙТ ----
;в слове .word можно записывать только 5 (пять) значений.



.WORD 177763,146363,31463,177763
.WORD 0,171777,171714
.WORD 31463,171777,0,0


СКАЧАТЬ ФАЙЛ SPR0.ASM


Теперь тоже самое проделайте со спрайтом SPR5.BIN
У вас получится.


SPR5.BIN

 РИСУНОК 3


На рисунке 3 мы видим что ширина спрайта равна 2
а высота спрайта равна 62 так как у нас 5 спрайтов
выведем их на экран с помощью программы
быстрого вывода спрайта.



	.PSECT 1000

;Пример вывода спрайта на экран

;---- вывод изображения (спрайта) на экран ----
BEG:    MOV     #SPR_ALL,R0     ;адрес спрайта;
        MOV     ADR,R1      ;адрес ОЗУ, куда будем выводить;
        MOV     (R0)+,R2    ;ширина спрайта в байтах;
        MOV     (R0)+,R3    ;высота спрайта в точечных строках;
A:      MOV     R2,R4       ;начало цикла по строкам;
        MOV     R1,R5       ;запоминаем адрес начала строки;
B:      MOVB    (R0)+,(R1)+ ;цикл вывода одной строки
        SOB     R4,B          ;по байтам;
        MOV     R5,R1       ;восстанавливаем адрес начала строки;
        ADD     #100,R1     ;переходим к следующей строке;
        SOB     R3,A        ;конец цикла по строкам.
	EMT	6	    ;ожидание нажатия любой клавиши
	RTS PC
;-----------------------------------------------------
ADR:  
.word 56036       ;текущий адрес начала изображения


;---- таблица изображения (спрайта) ----
SPR_ALL: 
.word 2,62	; ШИРИНА И ВЫСОТА СПРАЙТА

;STONE RED
	.WORD 177763,146363,31463,177763
	.WORD 0,171777,171714
	.WORD 31463,171777,0
;КЛАД

	.WORD 0,0,25240,125650,56724
	.WORD 127350,136370,136370,127750,125250
;ENEMY

	.WORD 0,2520,12764,52565
	.WORD 52525,52525,52525,12524,2520
	.WORD 0
;STONE GREEN

	.WORD 125212,125212,125212,125212
	.WORD 0
	.WORD 121252,121252,121252,121252
	.WORD 121252
;MAN

	.WORD 1200,1200,20010,20010
	.WORD 5240,1200,1200,4040,4040
	.WORD 24050



СКАЧАТЬ ФАЙЛ SPR5.ASM



Программа вывода спрайта SPR5.BIN вывела сразу
пять спрайтов за один раз, но давайте вернемся
к программе SPRITE 8X10.ASM
если вы её еще не забыли :-)
и напишем программу на бейсике которая будет
выводить наши пять спрайтов по номеру спрайта,
меняя свои координаты.
Напишем программу на бейсике.



10 ' Пример использования
20 '     подпрограммы
25 '     SPRITE 8X10
30 '----------------------
50 DEF USR=&O30000
60 INPUT "Номер";N
70 PRINT CHR$(140);CHR$(140)
80 POKE &O37770,N
90 FOR Y=0 TO 200 STEP 20
100 FOR X=0 TO 30 STEP 2
110 POKE &O37772,X
120 POKE &O37774,Y
130 A=USR(A)
140 NEXT X
150 NEXT Y
160 GOTO 50



Затем загрузим нашу программу SPR8X10.BIN
командой BLOAD"SPR8X10.BIN"


SPR_NUMER8X10.PNG

 
Теперь сохраним программу назвав ее SPR_NUMER8X10.BIN
запускаем программу RUN.Программа спросит нас
какой номер спрайта нужно набрать?
спрайты начинаются от (0-4) поэтому нажимаем 0.
на экране появится красный кирпич,1-клад,2-враг,
3-зеленый кирпич и 4-человечек.


СКАЧАТЬ ФАЙЛ SPR_NUMER8X10.BIN


Вывод спрайтов 16*20



Давайте возвратимся в редактор GRED и нарисуем
спрайты 16*20 два спрайта из игры PUTUP на
Yamaha MSX и кирпич,так как на Yamaha MSX высота и ширина
курсора 8*8 то мы просто будем рисовать PUTUP-а
снизу вверх и пусть у нас остануться две пустые
верхние линии а кирпич нарисуем 16*20.


PUTUP_001.PNG


Вспомним ещё раз как копировать спрайт в буфер,
Поставим курсор в левый нижний угол спрайта PUTUP
и нажмем клавишу "B" когда появятся стрелки влево
и вниз нажмем ввод, далее когда появятся стрелки
влево и вверх ставим курсор в верхний правый угол
и нажимаем ввод. спрайт скопировался в буфер обмена.
Извлечение из буфера обмена клавиша "\".

Запись спрайта PUTUP

ставим курсор в левый нижний угол спрайта PUTUP и
нажимаем клавишу "Z" когда появятся стрелки влево
и вниз нажимаем ввод, когда появятся стрелки вправо
и вверх ставим курсор в правый верхний угол и нажимаем
ввод.
Зададим имя спрайта PUTUP.BIN

Напишем программу пока полностью на ассемблере
SPRITE 16*20, и вставим туда спрайт PUTUP и STONE(кирпич)



Программа SPRITE 16*20



	.PSECT 30000

	MOV #40,@#37772	;содержит в себе координату X (0-31);
	MOV #10,@#37774 ;содержит в себе координату Y (0-229).
	MOV #00,@#37770	;содержит в себе номер спрайта (0 - ...);


	MOV #37770,R4	;содержит в себе номер спрайта (0 - ...);
	MOV (R4),R1
	MOV #120,R0	;SPRITE 8X16=OLD 24
	CLR R3
	CLR R2
	TST R1
	BEQ N1
	BGT N2
	NEG R1
	ADD #1,R2
N2:	ADD R0,R3
	SOB R1,N2
	TST R2
	BEQ N1
	NEG R3
N1:	MOV R3,R5
	MOV #37774,R4	;содержит в себе координату Y (0-229).
	MOV (R4),R1
	MOV #76,R0
	CLR R3
	CLR R2
	TST R1
	BEQ N3
	BGT B1
	NEG R1
	ADD #1,R2
B1:	ADD R0,R3
	SOB R1,B1
	TST R2
	BEQ N3
	NEG R3
N3:	MOV #37772,R0	;содержит в себе координату X (0-31);
	MOV (R0),R4
	ASL R4
	ADD R3,R4
	ADD #42000,R4
	MOV #PUTUP,R3	;адрес спрайта PUTUP
	ADD R5,R3
	MOV R3,R2
	ADD #116,R2	;SPRITE 8X10= #23  ДЛИННА ВЫСОТЫ СПРАЙТА ПО Y-ВЫСОТЕ
N4:	MOV (R3)+,(R4)+	
	MOV (R3)+,(R4)
	ADD #76,R4	;ШАГ СТОЛБЦОВ ДОЛЖЕН БЫТЬ #76 ДЛЯ SPRITE 16X20
	CMP R3,R2
	BLE N4
	CLR R0		;2560
	CLR R1		;2561
	CLR R2		;2562
	CLR R3		;2563
	CLR R4		;2564
	CLR R5		;2565
	EMT 6
	RET
; СПРАЙТ PUTUP СМОТРИТ ВПРАВО

PUTUP:	
	.WORD 0,0,0,0
	.WORD 0,0,0,0
	.WORD 170000,000017,176000,000377
	.WORD 176400,001777,177500,007777
	.WORD 177520,006363,177720,036363
	.WORD 177724,036363,177724,036363
	.WORD 177520,007777,052400,000525
	.WORD 176500,006777,173500,006777
	.WORD 173500,006577,152000,000525
	.WORD 172400,001737,172400,007577



;СПРАЙТ КИРПИЧ БЕЗ ВИШЕНКИ.

	.WORD 177774,37777,125257,165252
	.WORD 125253,165252,125253,165252
	.WORD 125253,165252,125253,165252
	.WORD 125253,165252,125253,165252
	.WORD 125253,165252,125253,175252
	.WORD 177774,37777,37777,177774
	.WORD 165252,125257,165252,125253
	.WORD 165252,125253,165252,125253
	.WORD 165252,125253,165252,125253
	.WORD 175252,125253,37777,177774



СКАЧАТЬ ФАЙЛ CrossAsm_ASM16X20.rar



Теперь после того как мы научились выводить спрайты 16*20,
давайте напишем программу SPRITE 16*20 и будем обращаться
к ней из бейсика и попробуем создать движение PUTUP-а
Скачаем программу SPRITE 16*20 без заданных заранее 
координат.


СКАЧАТЬ ФАЙЛ CrossAsm_SPR16X20.rar


Затем загрузим программу SPRITE16X20 таким способом
MO
M
ИМЯ?
в появившемся окне выберем программу SPRITE16X20
после того как она загрузиться и появится знак ?
нажмем клавишу B - для выхода в бейсик, сама
программа в кодах SPRITE16X20 осталась в памяти
теперь напишем небольшую програмку на бейсике.


PUTUP_BASIC.PNG





цвет 1 синий
 


цвет 2 красный



цвет 3 розовый
 


цвет 4 зелёный



цвет 5 голубой



цвет 6 желтый



цвет 7 белый








           *   *   *

        
          (с) Vladik Ermolin 2008-2013



Другие статьи номера:



BKBOOKS — Журналы, газеты и книги для BK0010.01
© 2008-2013 Ermolin Vladislav

Hosted by uCoz