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, увидимся еще!



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

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

CCLFSTM - All disk copier 128/512К.

CCLFSTM - Альбом "Backstreet Boys"

CCLFSTM - Новости от Spark group

CCLFSTM - Описание системных программ: Power Code Decrusher v6.2

Demo Design - Об истории демомейкинга.

Demo Design - Полезные алгоритмы и интересные решения (реализация фонга).

Flash - О расширении цветовой палитры ZX-Spectrum'а.

GFK Fraktiuit - Тайны графического стандарта GX1.

LZW and GIF - Описание графических форматов .LZW и .GIF.

MUSICNEWS1 - Музыкальный калейдоскоп попсы...

MUSICNEWS2 - METALL NEWS.

NEWS of Picon - Проект будущего ПЗУ. Подпрограммы BASIC 48.

OPERATEXT - Из истории создания демо Oper'ы.

PRICE - Прайс лист на продукцию фирмы Скорпион.

RUSH - О тусовке в городе Чернигове в апреле 1998 года.

SPECCY A.F. - Бессмертный Speccy.

А знаете ли вы - Пароли, вечное время и бомбы в игре Last Courier. Пароли к игре: X-Reversy; и музыкалкам: Branch of Mind demo, Diesirae demo. Скрытые части в Faultless 2, 3, 4, 5, 8 (пароли)...

Введение - О достоинствах и недостатках номера.

Медем - История создания Запорожского модема.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Сказки чОрного кота - Проблемы эволюционной классификации.
Несколько слов - "многие из вас, наверняка, думают, что этот номер - тот самый обещанный номер 4"...
Металлургия - Как настроить модем на поднятие трубки телефона.

В этот день...   31 мая