Deja Vu #05
31 мая 1998

CODING - Использование стека при разрешенных прерываниях.

<b>CODING</b> - Использование стека при разрешенных прерываниях.
SoundTrack: SECTOR/SERIOUS S.G.'97 (CMG98)
__________________________________________


(C) RLA/CRG
__________________________________________


           ИСПОЛЬЗОВАНИЕ СТЕКА
       ПРИ РАЗРЕШЕННЫХ ПРЕРЕЫВАНИЯХ


   Не секрет, что для быстрых  манипуляций
с графикой в играх и, особенно, в демонст-
рациях, широко используются команды работы
со стеком.  Именно с их помощью можно дос-
тичь наибольшей скорости работы  с  графи-
кой. Но, чем круче эффект, тем больше вре-
мени он занимает.  Возможны  случаи, когда
эффект не успевает отработать 69888 тактов
и  происходит  прерывание. Адрес  возврата
выкидывается на стек и безвозвратно портит
содержащуюся под ним информацию. Но не все
потеряно. Рассмотрим несколько случаев,как
можно сохранить эти данные  и работать  со
стеком с включенными  прерываниями второго
рода.

   1. Если происходит очистка или заполне-
ние экрана какими-либо данными, то это  не
так страшно,ибо при возврате из прерывания
продолжится цикл PUSH HL и адрес  возврата
будет затерт нужными данными.

   1.1 Возможно,что стек будет равен 4000h
и адрес возврата  будет  потерян, но  этот
случай можно проконтролировать, если знать
адреса тех точек, в которых это может слу-
читься и перейти туда не по RET'у,а JP AD-
DRESS.


Пример:
        LD     SP,#4020 ;чистим самую
        LD     HL,#0000 ;верхнюю линию
        PUSH   HL       ;в экране
        PUSH   HL
        PUSH   HL
        ...     *16 раз
        PUSH   HL
        PUSH   HL
ADR1    LD     SP,(SAVESP)
        RET


   Последний случай возможен, если  преры-
вание вклинится между командами PUSH HL  и
LD  SP,(SAVESP). Обработчик 2 (!) прерыва-
ний в таком случае будет выглядеть так :

        ORG     #BFBF
INT2    DI
        LD      (TOSP+1),SP
        LD      SP,INT2-1
        PUSH    HL
        PUSH    DE
        PUSH    BC
        PUSH    AF
        PUSH    IX
        EXX
        EX      AF,AF
        PUSH    HL
        PUSH    DE
        PUSH    BC
        PUSH    AF
        PUSH    IY


        LD      HL,(TOSP+1)
        LD      DE,-#4000
        ADD     HL,DE
        LD      A,#C9       ; RET
        JR      C,OK
        LD      A,#C3       ; JP
        LD      (TO_RET),A


        ...     обработка прерывания
        POP     IY
        POP     AF
        POP     BC
        POP     DE
        POP     HL
        EXX
        EX      AF,AF
        POP     IX
        POP     AF
        POP     BC
        POP     DE
        POP     HL
        EI
TOSP    LD      SP,0
TO_RET  DB      0
        DW      ADR1


   2. Есть еще один коварный случай, когда
данные при помощи стека не записываются, а
считываются. Чаще всего  это  употребляют,
когда  на  экране  двигается  большая  его
часть (TRASH DEMO, ART'98,всевозможные ин-
тро к играм). В  памяти  заранее создается
большой спрайт и выводится на  экран  при-
мерно такой цепочкой байтов :

       POP      HL
       LD       (#4000),HL
       POP      HL
       LD       (#4002),HL
       ...
       POP      HL
       LD       (#57FE),HL
       LD       SP,(SAVESP)
       RET


   В приведенных программах  часть  экрана
успевает переброситься за одно прерывание,
и  данная проблема не возникает, но бывали
случаи, когда работает один эффект,а потом
нужно сверху перекинуть окно с пожеланиями
или GTX'ами. Если произойдет прерывание,то
на стек опять же выкинется адрес  возврата
и спрайт  будет  "безвозвратно"  испорчен.
Именно  с таким случаем ко  мне  обратился
один мой знакомый кодер. Спустя  некоторое
время проблема была  решена.  Его  эффекты
работали  при  разрешенных  прерываниях, а
графика не портилась.

Обработчик:

        ORG     #BFBF
INT2    DI
        LD      (TOSP+1),SP
        LD      SP,INT2-1
        PUSH    HL
        PUSH    DE
        PUSH    BC
        PUSH    AF
        PUSH    IX
        EXX
        EX      AF,AF
        PUSH    HL
        PUSH    DE
        PUSH    BC
        PUSH    AF
        PUSH    IY
        LD      HL,(TOSP+1)
        LD      E,(HL)
        INC     HL
        LD      D,(HL)
        LD      (_JP+1),DE
        ...     обработка прерывания
        POP     IY
        POP     AF
        POP     BC
        POP     DE
        POP     HL
        EXX
        EX      AF,AF
        POP     IX
        POP     AF
        POP     BC
        POP     DE
        POP     HL
TOSP    LD      SP,0
        PUSH    HL   ;Запись
        POP     HL   ;Корректировка стека
        EI
_JP     JP      0


   Рассмотрим возможные случаи, когда  мо-
жет произойти прерывание :

   а) между командами POP HL и  LD (NN),HL
считываемые байты находятся в регистрах HL
и  перед возвратом будут записаны командой
PUSH HL.


   б) между командами LD (NN),HL и  POP HL
данные опять же находятся в HL и восстано-
вятся точно таким же способом.
   Стоит заметить,что возврат из этого об-
работчика всегда будет совершаться  прямым
переходом.
   Замечу,что в демонстрациях такие обход-
ные трюки со стеком я еще не встречал.
   Я надеюсь, что эта статья уменьшит  ра-
боту  некоторых ваших эффектов  на  лишние
10-20  тысяч  тактов,  которые  так мешали
сделать ваш эффект на инт быстрее.



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

Аперативчик - О новой оболочке журнала.

Аперативчик - Вступление и авторы.

Тема - DIGITAL звук, как он есть (проигрыватель .wav файлов).

Тема - Проект спасения и развития сцены.

Тема - Устав ассоциации AMAZING SOFT MAKING.

Тема - Теория журналостроения.

Капля припоя - GENERAL SOUND: PLUG & PLAY.

Капля припоя - Профессиональная обработка звука на PC.

SOFTWARE - О новинках из Самары: MAX SOFT SCREEN PACKER v1.4 , МИНЕР, FILE COMMANDER v4.04, SLIDE SHOW,WALKER demo,S-LIGHT BBS, S-TERMINAL v1.0, LOGO.SYS (для PC).

SOFTWARE - Описание проходилка игры "Операция Р.Р."

SOFTWARE - Новинки демосцены: HAPPY NEW 1998 YEAR, BURDENSOME, DREAM, CONDEMED, CONFUSION.

CODING - Процедуры: FULL SCREEN SCROLL UP, Сломанный телевизор.

CODING - Использование стека при разрешенных прерываниях.

CODING - О паковщике MS-PACK.

CODING - Кодить хочу - процедуры вывода спрайтов без атрибутов, быстрая и универсальная процедура вывода спрайтов, процедура умножения и вычисления квадратного корня.

ANOTHER WORLD - Мультимедия - синтез трех стихий.

ANOTHER WORLD - AMIGA vs PC.

Доска почета - Интервью с PROGRESS.

Доска почета - О группе ETERNITY INDUSTRY.

Доска почета - О международном фестивале ART COMP-98.

Доска почета - Опpеделения принятые на демосцене и спектруме.

Доска почета - использование мышки в журналах и другом софте (о криворуких кодерах).

Доска почета - о способе конверсии триколорных картинок для спектрума.

Доска почета - такой ли рулез Amiga? Пц для пцшников, а спектрум для спектрумистов?

Семь и 1/2 - Армейские маразмы.

Семь и 1/2 - Программирование снизу вверх на искосок.

Семь и 1/2 - Инструкция по технике безопасного секса.

Семь и 1/2 - Особенности национального рулеза.

Семь и 1/2 - отчет с тусовки Кемеровских спектрумистов и сохдателей журнала Deja vu.

Проба пера - Приключения Винни Пуха часть 2.

Проба пера - Фэнтази и фантастика.

Реклама - Реклама и объявления ...

Новости - новый журнал AMIGA RULES.


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

Похожие статьи:
Сказочки! - "Что это ты, Иван, хватаешься за штаны, все чешешь чего-то?"
Только хиты - Самые популярные шлягеры нашего времени только здесь и сейчас.
Реклама - реклама и объявления.
Игроскоп - краткий обзор игровых программ, появившихся в Челябинске: Freddy Kruger Live, Mortal Kombat, Zybex Remix, Gorodki, Atomic Robo Kid, Turbo Skate Fighter, Gremlins 2, Robot, Mercs, The Big Slease, UFO 2, Twin, Клятва Ночи, Trinia, Randex, Hunter, Talisman, Killed Until Dead, Supertetris, Miner, Tarzan, Final Fight, Go Bear Go, Rings Wars, 48 Утюгов, Prince of Persia и т.д.
Презентация - Программа для создания адвентюр QUILL.

В этот день...   27 июля