__________________________________________
(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: