Из журнала Deja Vu #0A, Кемерово, 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 в руки...