|
Faultless
#09
24 мая 1998 |
|
ASM4KOFF - Запуск откомпилированных мелодий. Загрузчик на асме. Использование экранных файлов ArtStudio (вывод на экран). Максимальная скорость по выводу спрайтов. Максимально быстрый вывод точки. Самое быстрое копирование стеком.

Тема: Ассемблер для кофейников.
Автор: Rezonal/Ufo group
----------------------------------------
В данной статье будут рассмотрены:
1. Ответы на вопросы Парфенова Сергея из
Санкт-Петербурга.
а) запуск откомпилированных мелодий из-
под своих программ;
б) загрузчики на асме;
в) использование экранных файлов Art
Studio;
г) решения некоторых проблем.
2. Достижения максимальной скорости по
выводу спрайтов.
3. Теоретически максимально быстрый спо-
соб вывода точки.
4. Использование стека как самого быст-
рого способа по копированию из одной
области в другую.
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓Запуск откомпилированных мелодий.▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Не знаю, какие проблемы бы возникли у
Сергея, поэтому максимально точно опишу
в точности те действия, которые надо вы-
полнить, чтобы использовать музон из
программе. К сожалению, я не нашел PT
version 2.0, я использовал PT 2.1.
1) После загрузки PT, выбираем compile.
2) На вопрос include player отв. <Yes>.
3) Пусть, к примеру, выбираем адрес
50000.
4) Появляется табличка:
INIT: 50000
PLAY: 50006
DELAY: 52607
LEN: 6561
5) Записываете первые два числа.
6) В Basic'е тестируете:
а)загружаете откомпилированный файл;
б)пишете на (нервных просим нажать
41-ую клавишу) Basic'е:
10 RAND USR 15619:REM:LOAD "..."CO
DE
20 RAND USR первое_число (50000)
30 RAND USR второе_число (50006)
40 GOTO 30
Это для уверенности. Если музон заиг-
рал, то скорее пускайте TASM.
И пишите:
ORG 25000 ; К примеру
CALL первое_число (50000)
loop CALL второе_число (50006)
LD A,#7F
IN A,(254)
RRCA
JR C,loop ; Если SPACE не нажат
JP первое_число (стоп музона)
Только перед запуском не забудьте за-
грузить сам музон ;-).
Надеюсь, все заработает.
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓Загрузчики на асме.▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Сначала все просто:
1) Запускаем TASM;
2) Выходим в BASIC и пишем первой стро-
кой:
1 REM ******************************
Знаков "*" нужно поставить столько,
сколько байт занимает ваш загрузчик.
Для начала - побольше (пусть 64 байт)
3) Возвращаемся в TASM
4) И пишем:
ORG 23872
db 1,5
db количество_секторов_файла
;c=5
;b=длина_файла_в_секторах
LD DE,(23796)
LD HL,адрес_загрузки_файла
CALL 15635
JP адрес_запуска_файла
5) Компилируем, выходим в BASIC
6) Пишем на бейсике:
2 CLEAR стек: RAND USR 23872
7) Берем чистый диск и вставляем в диско
вод.
8) SAVE "имя_программы" LINE 1
9) Жмем RESET.
10) Копируем на уже не очень чистый диск
кодовый файл.
11) Записываем сумму BASIC и CODE частей
программы.
12) В каком-нибудь мониторе
на TR0, SEC0 со смещением #0D по-
мещаем число, которое мы последний
раз запомнили.
13) Жмем RESET.
14) Копируем BASIC-файл с диска.
15) Фух, работа совершена.
P.S. Долгий путь, но что ж поделаешь...
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓Использование экранных файлов ArtStd.▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Использование картинок ArtStudio уж оче
нь простое:
1) Запускаем TASM
2) пишем:
ORG 25000
LD HL,адрес_картинки
LD DE,16384
LD bc,6912
LDIR
RET
3) Не забыв, конечно, выйти в бейсик
и набрав RAND USR 15619:REM:LOAD "scr
n"CODE адрес_картинки
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓Решения некоторых проблем.▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Цитата из письма Парфенова Сергея:
"И у меня не получается совместимость,
например, бегущую строку,созданную в ас-
семблере, с мелодией, созданной в каком-
либо муз. редакторе. У меня либо играет
музыка, либо идет бегущая строка."
По поводу этой проблемы у меня есть
только одно соображение (эта проблема то
же когда-то меня касалась): почти все
плейеры музонов изменяют регистр IX. А
у вас в программе, возможно, регистр IX
используется под адрес текущего выводи-
мого символа. Поэтому попробуйте так:
...
main PUSH IX
CALL muzon
POP IX
CALL scroll
LD A,#7F
IN A,(254)
RRCA
JR C,main
...
К сожалению, я никогда не использовал
редакторы Sprite Editor и Sprite Land.
Я предпочитаю только Art Studio. Даже
для редактирования спрайтов он не хуже
выше названных.
Поэтому читайте следующую главу.
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓Макс. скорость по выводу спрайтов▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Для начала нужно задать формат спрайта.
Пусть, к примеру, спрайт у нас X*Y
знакомест. Тогда напишем на BASIC'е прог
рамму конвертированию обычного Art-Stu-
dio-файла 6912 байт в спрайт.
10 RAND USR 15619:REM:LOAD "scrn"CODE
16384
20 LET ADR=50000
30 FOR J=0 TO Y-1
40 FOR I=0 TO X-1
50 FOR K=0 TO 7
60 POKE ADR,PEEK
(16384+I+J*32+K*256)
70 LET ADR=ADR+1
80 NEXT K:NEXT I:NEXT J
90 PRINT "SAVE TO FILE XXX CODE ",
ADR,","ADR-50000
После выполнения программы следует запи
сать файл с адреса 50000 и длиной
ADR-50000.
Теперь в TASM'е:
Загрузив TASM, выходим в BASIC и загру-
жаем спрайт, к примеру, под адрес 50000.
ORG 25000
LD HL,50000
LD A,y
L2 PUSH DE
EX AF,AF'
LD C,x
L1 PUSH HL
PUSH DE
LD B,8
LP LD A,(HL)
LD (DE),A
INC HL
INC D
DJNZ LP
POP DE
POP HL
INC E
DEC C
JR NZ,L1
POP DE
LD A,E
ADD A,32
LD E,A
EX AF,AF'
DEC A
JR NZ,L2
Программа скорочена до предела, чтобы
можно было легко понять, как она работа-
ет. Ее недостатки: спрайт будет выводи-
ться неправильно, если он пересекает 1/3
часть экрана.
Входные параметры: регистр DE должен
указывать на начальную точку спрайта.
А теперь о максимальной скорости.
Для случая вывода спрайта из переменного
адреса спрайта в переменную область эк-
рана соображения следующие:
1. Если ширина спрайта кратна 2 пиксе-
лям (16 точкам), то самый быстрый способ
вывода спрайта следующий(фрагмент):
Вывод подспрайта 16*8 точек
Повторить от начала 4 раза
HL=адрес_спрайта
HL=адрес_вывода_спрайта_в_экр_обл-ти
LD A,(HL)
LD (DE),A
INC HL
INC E
LD A,(HL)
LD (DE),A
INC HL
INC D
LD A,(HL)
LD (DE),A
INC HL
DEC E
LD A,(HL)
LD (DE),A
INC D
;Конец
2. Замечание: попытайтесь сообразить,
почему использовалась в примере команда
не INC DE, а INC E.
3. Если вы хотите сделать вывод спрайта
с точностью до 1 пикселя, а не до 8, то
без буфера вам не обойтись: дело в том,
что во всех демках и почти во всех играх
используется буфер для спрайтов, равный
8 (или, как правило, больше) размерам
спрайта без буфера.
В буфере находится 8 спрайтов, сдви-
нутых на 0,1,2,3..7 пикселов.
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓Максимально быстрый вывод точки.▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Эта проблема меня интересовала долго.
Я потратил немало времени на ее разреше-
ние. Однако доказать вам, что следующая
процедура является ИДЕАЛЬНО БЫСТРОЙ, я,
к сожалению, не могу, т.к. в облом.
Итак,
┌──────────────────────────────────────┐
│ ИДЕАЛЬНО БЫСТРЫЙ СПОСОБ ВЫВОДА ТОЧКИ │
└──────────────────────────────────────┘
;!!!
LD H,TBL8880
LD D,(HL) ;старший видео-адрес
INC H
LD A,(HL) ;младший видео-адрес
INC H
LD L,C
ADD A,(HL) ;X/8
INC H
LD E,A
LD A,(DE)
OR (HL)
LD (DE),A
;!!!
Всего 69 тактов!!!
Перед входом в эту процедуру надо за-
грузить в регистр L Y-координату, а в
регистр C X-координату.
При этом TBL8880 - это старший байт
адреса таблички (например, если таблица
находится по адресу 25600, то TBL8880=
=25600/256=100), которую надо построить
сразу после запуска программы, т.е. мил-
ли-декранчинг. Вот ее текст:
LD DE,256*TBL8880
XOR A
lp PUSH AF
LD C,0
CALL 8880
EX DE,HL
LD (HL),D
INC H
LD (HL),E
DEC H
INC L
EX DE,HL
POP AF
INC A
CP 192
JR NZ,lp
LD DE,256*TBL8880+512
XOR A
l3 LD B,8
l2 LD (DE),a
INC DE
DJNZ l2
INC A
CP 32
JR NZ,l3
RET
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓Самое быстрое копирование стеком ▓▒
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Пусть, к примеру, нам требуется ско-
пировать 16 байт из одной области в дру-
гую. Тогда наиболее быстрым способом яв-
ляется (по-моему, идеальным, но я не
уверен) использование стека:
LD (TMP),SP
LD SP,FROM
POP HL
POP DE
POP BC
POP AF
EXX
EX AF,AF'
POP HL
POP DE
POP BC
POP AF
LD SP,TO+16
PUSH AF
PUSH BC
PUSH DE
PUSH HL
EX AF,AF'
EXX
PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD SP,(TMP)
Здесь используется регистр SP, поэто-
му перед запуском этой программы необхо-
димо отключить вызов прерываний (DI), и
перед выходом в BASIC не забыть вот что:
LD HL,10072
EXX
EI
Все на сегодня, жду новых вопросов и,
надеюсь, они будут интересны для рассмо-
трения широкому кругу читателей.
P.S. В программах возможны некоторые
неточности; попросту говоря, возможно,
что, запустив их, они неправильно будут
работать. А почему так? Да потому, что
переписать их из .ASM файла в текстовик
не очень уж прикольно. Я считаю, что в
примеры, которые даны тут, необходимо
вникать, а не набирать их вслепую на ко-
мпе. В целом, пока, guys, увидимся еще!
Другие статьи номера:
Похожие статьи:
В этот день... 19 ноября