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:
Solitude - Kq: "There are several degrees of loneliness in the big cities. First seen on the streets clogged up to the limit, which is not what step to step without preparation it is impossible - there is even a sip of air to be on tiptoes pre-climb "...
Premiere - a great new music editor of "Pro Sound Maker" and the program "Visual Decompressor" for different effects of decompression display files.
Feedback - contact the publisher.

В этот день...   30 March