Deja Vu #0A
30 сентября 2000

__________________________________________

(C) Natan/Woodland Studio
__________________________________________

              Здравствуйте!

   Пишет  вам  Natan aka Андрей А.Тимофеев
из WoodlandStudio, что  в  славном  городе
Лесосибирске  на  берегу великой реки Ени-
сей. Хочу  предложить вашему вниманию свою
первую (надеюсь, что не последнюю) неболь-
шую заметку.
   Итак,начнем. Ни для кого не секрет, что
самый быстрый вывод на экран осуществляет-
ся  через стек. Я рассмотрю только быструю
печать спрайтов.

  Вот типичный пример:

в SP - адрес данных спрайта,
в HL - адрес в экране,
       ld sp,SpriteAddress
       ld hl,ScreenAddress

       pop de    ; сняли данные в формате МАСКА, ДАННЫЕ
       ld a,(hl) ; взяли байт с экране
       and d     ; наложили маску
       or e      ; и данные
       ld (hl),a ; поместили на экран

       и так далее.

   Может вы  вспомните  что-то  еще. Обще-
признанным недостатком таких процедур  яв-
ляется  невозможность их работы при разре-
шенных прерываниях. Объясню почему - пото-
му  что кончается на "у". А если серьезно,
то  происходит следующее. В момент прихода
прерываний  процессор помещает на стек ад-
рес  возврата  из  ISR  (Interrup  Service
Routine), а стек в данный момент указывает
на данные спрайта, как результат последние
разрушаются,  спрайту каюк. Обычно в таких
случаях  прерывания  просто  запрещают. Но
что делать если, к примеру, на прерываниях
висит проигрыватель  музыки. В ZX-Format'e
8, в статье "эпопея" приводятся  два реше-
ния данной проблемы:

   1. Держать  в памяти по 2 копии каждого
спрайта  или создавать копию спрайта перед
его  печатью  через стек. Как вы понимаете
этот  способ  не  рационален  ни  в  плане
скорости, ни в плане быстродействия.

   2. Автор  этого  приема  В. Медноногов.
Применил   он  данный  прием  в  крутой  и
рулезной игрухе "Черный  Ворон"  (там  все
спрайты  печатаются  через  стек). Так как
сам   автор   (по  моим  данным)  разрешил
свободное  распространение и использование
игры, то,  как  говорится,  получите. Ниже
приведено   начало   процедуры   обработки
прерываний  из  игры  ЧВ. Для  того, чтобы
использовать  этот код вы должны учитывать
следующие моменты:
  а) процедура обработки прерывания должна
иметь собственный стек - StackIM2;
  б) читать  данные  со стека можно только
регистровой парой DE.

   Ну, вот и  все  на  сегодня,  смотрите,
разбирайтесь. Бог  в  помощь  и Spectrum в
руки...

ISR     ex de,hl          ; начало процедуры обр-ки прерываний
                          ; именно этот адрес помещайте в
                          ; вектор прерываний
        ex (sp),hl        ; восстановим поврежденные данные
        ld (SaveRET+1),hl ; сохраним адрес возврата из ISR
        ex de,hl
        pop de
        ld (SaveSP+1),sp  ; сохраним стек программы
        ld sp,StackIM2    ; переустановим стек
        call mainISR      ; вызов основного обработчика IM2
SaveSP  ld sp,0
        ei                ; разрешим прерывания так,как они были
                          ; автоматически запрещены
SaveRET jp 0

mainISR push все регистры
        ...
        pop все регистры
        ret

       Хочу поделиться с вами одной полез-
ной процедурой. Одно время, занимаясь про-
граммированием   ВГ-93,   я  столкнулся  с
проблемой чтения регистра состояния (#1f).
В результате поиска обнаружил аж три реше-
ния этой задачи (у Ларченко и Родионова, в
ZX-Ревю  -  при помощи прерываний, у Рощи-
на),  но ни одно из них меня не удовлетво-
рило. Тогда я занялся подробным исследова-
нием ПЗУ ТР-ДОС. В результате вот, что по-
лучилось:

; чтение регистра состояния ВГ-93
; входные данные отсутствуют
; выход: a - содержимое регистра состояния
; прерывания на выходе разрешены,
; но можно и запретить
in_1f
      di
      ld a,(Trk)
      ld d,a
      ld a,(#5cc2)
      ld (_5cc2),a
      ld a,(#5ccd)
      ld (_5ccd),a
      ld hl,(#5cc3)
      ld (_5cc3),hl
      ld hl,(#5d02)
      ld (_5d02),hl
      ld hl,(#5d04)
      ld (_5d04),hl
      ld hl,#2740
      jp dos
ret
      pop hl
      pop hl
      pop hl
      pop hl
      pop hl
      pop hl
      ld a,(#5ccd)
      push af
      ld a,(_5cc2)
      ld (#5cc2),a
      ld a,(_5ccd)
      ld (#5ccd),a
      ld hl,(_5cc3)
      ld (#5cc3),hl
      ld hl,(_5d02)
      ld (#5d02),hl
      ld hl,(_5d04)
      ld (#5d04),hl
      pop af
      ei
      ret
dos
      push hl
      jp #3d2f
_5ccd db 0
_5cc2 db 0
_5cc3 dw 0
_5d02 dw 0
_5d04 dw 0

Trk   db 0 ; текущая дорожка

   А теперь, для лучшего понимания вышена-
писанного, приведу фрагмент из ПЗУ ТР-ДОС:

#2740
      in a,(#1f)
      ld (#5ccd),a
      ld e,d
      push de
      ld a,e
      out (#7f),a
      ld a,#18
      call #3d9a
      . . . . . .
#3d9a
      out (#1f),a
      push hl
      rst #20
      dw #1f54
      . . . . . .
#0020
      jp #2f72
      . . . . . .
#2f72
      ld (#5d02),hl
      ld (#5d04),de
      pop hl
      ld e,(hl)
      inc hl
      ld d,(hl)
      inc hl
      push hl
      ld hl,#3d2f
      push hl
      push de
      ld hl,#5cc2
      push hl
      ld hl,(#5d02)
      ld de,(#5d04)
      ret

   Для  предотвращения недоразумений сооб-
щаю, что  у  меня ZS-Scorpion 256 Turbo+ с
ПрофПЗУ версии 3 с чем-то.

Андрей А. Тимофеев aka Natan from Woodland
Studio
mailto: ws_mason@mail.ru
------------------------------------------



Other articles:


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

Similar articles:
BBS - list of stations BBS ZXNet.
Demomaking - demomeykinga history and its traditions.

В этот день...   3 December