Hacker
#06
08 января 1997 |
|
Программирование - Бегущая строка увеличивающаяся по вертикали. Программа для вставки музыки в Basic.
Кусочек ассемблера. .ПРОГРАММИРОВАНИЕ Как Вы уже наверно заметили, этот раздел будет посвящен ассемблеру и программированию в нем. И вести этот раздел, судя по всему, буду я, то есть ANDY Inc. В разделе будут представлены различные проЦедурки: гасилки, скроллеры, анализаторы и тому подобные прибамбасы, которые были написаны мной или дернуты из каких либо демок, INTR0... По возможности я буду расписывать их принЦипы работы. Каждая проЦедура будет находиться в приложении в виде файла TASM-4.XLD (самый удобный на мой взгляд ассемблер). Но учтите, этот ассемблер расчитан на 128К, поэтому владельЦам 48К можно попробовать проассемблировать проЦедурки и если не получится, то переписать (или перекодировать) текст в формат какого-нибудь 48К ассемблера. А лучше купить 128К-машину, и как можно быстрее. Итак, как я уже писал, все проЦедурки будут находиться в файлах TASM-4, а здесь я буду расписывать лишь наиболее хитрые части программ. Кстати, у меня дурная привычка: перемешивать системы счисления. Поэтому не пугайтесь, если один адрес будет десятичный, а соседний - шестнадЦатеричный. Начнем-с. Первая программа: LIN+А2 Бегущая строка с довольно интересными свойствами. А точнее - строку можно увеличивать по вертикали (или уменьшать) кнопками 8 (увеличивать) и 9 (соответственно, уменьшать). Кроме того, если у Вас подгружена и проигрывается музыка на АУ, то клавишами А,В,С Вы можете установить режим работы строки как анализатора соответствующих каналов. Зеленый Цвет на бордюре показывает, какую часть HALT-а занимает программа (читайте ZX Ревю за 199б год). Программа использует для буфера под строку память #FFOO-#FFFF и под буфер вывода 25000-25128. Теперь рассмотрим наиболее интересные участки программы. 1. DI ;запрещаем прерывания LD (DES+1),SP ;сохраняем стек LD SP,22528 ;устанавливаем стек на конеЦ экрана + 1 LD HL,0 ;в HL записываем 0 DEFS 1024,#E5 ;1024 байта по #E5 (PUSH HL) DES LD SP,0 ;восстанавливаем стек EI ;разрешаем прерывания Данная часть программы очень быстро (быстрее уже некуда) очищает нижнюю треть экрана. Для этого используется стек. Как известно, стек растет вниз: при комане PUSH HL (или DE,ВС...) указатель стека уменьшается на 2. Мы же ставим указатель стека на адрес начала экранных аттрибутов, т.е на конеЦ экрана + 1 байт, записываем в HL 0 и делаем 1024 раза PUSH HL (команда ассемблера DEFS Х,Y делает Х повторений числа Y). Тем самым мы заносим на стек 2048 значений 0 с адреса #4800 по #57FF, т.е. делаем ни что иное, как очистку экрана. Такой способ очистки - самый быстрый способ очистки непрерывних областей памяти. Но он занимает много памяти (более 1КБ), поэтому можно воспользоваться Циклом типа: LD HL,0 ;мы делаем то же самое, LD В,б4 ;но медленнее LX1 DEFS 1б,#E5 ;и занимает это гораздо меньше памяти DJNZ LX1 ; 2. LD HL,25000 ;в HL - начало буфера под стек LD DE,#5000 ;в DE - адрес в экране (крайний левый) LD В,б4 ;в В - высота используемой области экрана KLP1 LD (HL),E ;в (HL) младший байт адреса INC HL ;HL=HL+1 LD (HL),D ;в (HL) старший байт адреса INC HL ;HL=HL+1 CALL INCD ;расчет адреса следующей линии в экране DJNZ KLP1 ;Цикл на б4 линии RET INCD INC D ;это уже многим знакомая проЦедура расчета LD А,D ;следующего адреса в экране для DE. AND 7 ;(принЦип действия я расписал в HACKER-5) RET NZ LD А,E ADD А,32 LD E,А RET С LD А,Н SUB 8 LD Н,А RET Данная программка вызывается перед работой программы и создает б буфере (заданной области памяти; в данной программе:25000-25128) таблиЦу адресов левых краев экрана нижней трети. Там получается что-то типа: 25000 - #00 25004 - #00 ........... 25001 - #50 25005 - #52 ........... 25002 - #00 ........... 2512б - #E0 25003 - #51 ........... 25127 - #57 Т.е. получается таблиЦа адресов. Установливаем адрес указателя стека на 25000. После этого делаем POP HL. В результате получаем адрес линии в начале нижней трети экрана. Делаем еще один POP HL и теперь получаем в HL адрес следующей линии экрана. Т.е. этот буфер создавался для того, чтобы можно было очень быстро узнать адрес следующей линии в экране (гораздо быстрее, чем проЦедурой типа INCD). Такой способ используется почти во всех музыкалках,для быстрого вывода летающих спрайтов или синусоидальных строк. Для этого он и используется в программе. DI LD (STK+1),SP ;сохраняем стек LD HL,#FFOO ;адрес буфера бегущей строки LD SP,25000 ;стек на начало буфера LD В,8 ;Цикл на 8 линий (высота буквы) ХХХ1 POP DE ;берем со стека адрес в экрана LD С,#FF ;в С всегда 255, чтобы не изменялся В LDI ;32 раза LDI (32 LDI занимает 512 LDI ;тактов проЦессора, а LDIR на 32 бай- .... всего 32 раза ;та - более бб7! почувствуте разниЦу! DJNZ ХХХ1 ;В=В-1, если В=0 то STK LD SP,0 ;восстанавливаем стек EI Эта проЦедура не из файла, там она немного сложнее, т.к. приходится иногда повторять одну и ту же линию скролла несколько раз. Если Вы даже немного разбираетесь в ассемблере и читали мои статьи в HACKER-5, то в тексте этой бегущей строки вы легко найдете и головной блок, и расчет адреса символа, и сдвиг строки в буфере (я лишь только раскрыл Цикл, чтобы программа работала быстрее, правда ее можно еще немного убыстрить), и проЦедуру анализатора. Если Вы не читали те статьи, то советую их прочитать. Полезно, для общего развития. Метка SETT - вызывается проЦедура, считывает громкость с задан- ного канала АУ и записывает ее в метку C0PY+1. NEXXAX - вывод строки на экран. LINE - головной блок бегущей строки. Вторая программа: WATERSCR Эта проЦедура тоже является бегущей строкой, но бежит она уже вверх. Кроме того, при скроллировании вверх происходит попиксельный сдвиг строк то влево, то вправо: получается эффект воды. Данная программа занимает времени немного более HALT-а, т.к. при убыстрении она бежит гораздо быстрее и читать ее довольно сложно. Музыку в строку можно вставить, подвесив ее на IM 2. Перед началом работы программа создает таблиЦу адресов экрана, уже знакомую Вам по предыдущей программе. ПроЦедура скроллирования SCR0LL: LD SP,2б25б ;стек на начало таблиЦы адресов экрана LD А,б3 ;сдвигаем вверх б3 экранных строки: SC1 POP DE ;в DE - адрес линии в экране POP HL ;в HL - адрес следующей линии PUSH HL ;сохраняем HL для следующего Цикла LDI - 32 раза ;копируем нижнюю строку на верхнюю DEC А ; JP NZ,SC1 ; ПроЦедура сдвигов SUPPL: ............. LD SP,2525б ; LD В,1б ;Цикл на 1б*4 (=б4) строк SUP1 POP HL ;пропускаем строку POP HL ;в HL адрес начала линии в экране LD С,32 ; AND А ;сдвигаем ее вправо АА1 RR (HL) ; INC L ; DEC С ; JP NZ,АА1 ; POP HL ;пропускаем линию POP HL ; LD А,L ;устанавливаем в HL адрес последнего байта 0R 31 ;линии в экране LD L,А ; LD С,32 ; AND А ; АА2 RL (HL) ;сдвигаем линию влево DEC L ; DEC С ; JP NZ,АА2 ; DJNZ SUP1 ; .......... Конечно, программу можно значительно ускорить, раскрыв Циклы АА1 и АА2, но это не приведет к хорошим результатам. Если убрать строки, помеченные ";", то строка будет еще более "водянистая". Номер 3: IM2TEST Эта программа демонстрирует возможности режима IM 2. Она подгружает в память блок, содержащий 9 музонов (TEST.С). После того, как Вы проассемблируете программу, выходите в BASIC и набирайте RAND0MIZE USR б5000. Сразу заиграет музон. Переклю- чить музыку можно нажатием одновременно клавишь: SYMB0L SHIFT+ ENTER+ кнопка от 1 до 9. IM 2 работает и в TR DOS, но правда му- зыка притормаживает, когда идет обращение к диску (прерывания запрещаются). А в BASIC-е можно работать почти без проблем. Единственной проблемой является количество свободной памяти: где-то до 30000. Но это уже детали... Программа 4: SETMUL2 Ну а это просто маленький глюк. Точнее бордюрный глюк. Когда Вы запустите эту программку, то на экране и бордюре появятся полосы, которые, если у Вас PROFI+, должны совпадать полностью. Но этого может и не быть, т.к. программа настроена под мой C0MP, а на разных компьютерах количество тактов в HALT-е может быть различным. Кнопками "Q" и "А" можно попытаться подстроить полосы. Это может не получится, т.к. данная программа имеет точность подстройки 4 такта. Ну а в Целом эту программу можно считать примерчиком, показывающим, как можно подстроить эффекты на бордюре под компьютер. Кроме проЦедур в TASM-е, в приложении есть маленькая, очень хитрая программа: WIYЗ. Она может показать на одном экране два черно-белых без потерь пикселов. Программа работает только на 128К-машинах, т.к. для работы она использует два экрана: 48-й и 128-й. На 48К ее написать будет весьма проблематично: нужен жутко быстрый, занимающий менее HALT-а, алгоритм копирования блоков памяти по б144 байт. А такого я еще не видел... полосы. Это может не получится, т.к. данная программа имеет точность подстройки 4 такта. Ну а в Целом эту программу можно считать примерчиком, показывающим, как можно подстроить эффекты на бордюре под компьютер. Кроме проЦедур в TASM-е, в приложении есть маленькая, очень хитрая программа: WIYЗ. Она может показать на одном экране два черно-белых без потерь пикселов. Программа работает только на 128К-машинах, т.к. для работы она использует два экрана: 48-й и 128-й. На 48К ее написать будет весьма проблематично: нужен жутко быстрый, занимающий менее HALT-а, алгоритм копирования блоков памяти по б144 байт. А такого я еще не видел... На этом я закончу раздел и напишу, что я буду рассматривать в следующем номере: это будут различные эффекты из различных INTR0 (RST 7, M0RTAL COMBAT .....). Также в 7 номере будут тексты в TASM-е INTR0 к HACKER-ам 5 и б с соответствующими файлами. На этом я прощаюсь до следующего номера. Пока! ANDY Inc.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября