Тема: Ассемблер для кофейников. Автор: 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, увидимся еще!