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.


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

Похожие статьи:
Рубрика "X" - игра "Чёрный Ворон 2": что же нас ждет?
Amiga Club - AMIGA - значит подружка.
Анкета - опрос читателей.
Новелла - Новелла по игре "LORD OF MIDNIGHT".
Мозаика - Размышления о рубрике "Видеообзор". Cheat в игре "НЛО - враг неизвестен". О подключении видеопроцессора Dendy к Speccy.

В этот день...   20 апреля