Deja Vu
#0A
30 сентября 2000 |
|
Программирование - быстрая процедура печати спрайтов через стек от WoodlandStudio.
__________________________________________ (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 ------------------------------------------
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября