ZX Guide #01
27 ноября 1998

Ликбез - горе от ума: о выводе экрана за прерывание

<b>Ликбез</b> - горе от ума: о выводе экрана за прерывание
  К вопросу о выводе экрана за прерывание
 Alone Coder

   В  первом  номере компьютерного журнала
ZX-Power была опубикована статья,автор ко-
торой,призвав в помощь математику,убедите-
льно  опроверг  программистскую легенду, о
том,что кто-то якобы бросил экран (без ат-
рибутов, т.е.6144 байт) за одно прерывание
Пентагона (71680 тактов процессора).
   Автор был прав  и не прав одновременно.
Прав он был в том,что в 1996 году никто из
программистов  не писал вышеуказанного эф-
фекта.Не прав же он был в том,что по своей
предубежденности  о невозможности реализа-
ции вышеупомянутого эффекта он пропустил 1
(один) способ вывода экрана,а именно метод
LD-PUSH. Метод POP-PUSH нуждается в частой
модификации указателя стека SP и потому не
обеспечивает нужной скорости; метод же LD-
PUSH модифицирует стек вдвое реже.
   Вот о чем я говорю:
      LD SP,...
      LD DE,xx
      PUSH DE
      LD DE,yy
      PUSH DE
      ...
   Можно указать мне на то,что в указанной
статье шла речь о перемещении экрана,а мой
метод выводит лишь те данные, которые ука-
заны  непосредственно  в программе вывода.
Это  неверно: LD тоже считывает данные, но
лежащие  лишь в определенной области памя-
ти. Этот недостаток искупают три преимуще-
ства: освобождение регистров позволяет мо-
дифицировать SP вычислениями;последнее да-
ет возможность перемещать приемник данных,
что  не позволяет метод POP-PUSH; однотип-
ность операций в программе упрощает реали-
зацию.
   Покажу,как использовать метод,в частно-
сти,для плавного скроллинга вверх.
PROG  ;начало программы вывода
      DOWN SP        ┐
              ┐      │
      LD DE,nn├16 раз├192 раза
      PUSH DE │      │
              ┘      ┘
      JP PROG
   Под DOWN SP подразумевается процедурка,
которая рассчитывает адрес строки, лежащей
на одну ниже указанной в HL,и помещает его
в SP.Простейший пример такой процедурки:
      SET 7,H
      LD E,(HL)
      INC L
      LD D,(HL)
      EX DE,HL
      LD SP,HL
   Она использует таблицу, лежащую в адре-
сах #C000Ў#D800 и занимает 35 тактов. Вна-
чале я ее и использовал,но из-за ее медли-
тельности  мне пришлось пожертвовать двумя
крайними столбцами экрана,то есть програм-
ма уже не удовлетворяла заданному условию.
Если изменить ее по такому образцу,то ско-
рость будет вполне соответствовать требуе-
мой:
      SET 7,H
      LD SP,HL
      POP HL
      LD SP,HL
   Этот вариант использует аналогичную та-
блицу,но ест уже 30 тактов.Финальный штрих
в процедуру:
      INC H
      RRCA
    ┌─JR NC,$+6
    │ SET 7,H
    │ LD SP,HL
    │ POP HL
    ╘LD SP,HL
   Теперь используется только 28+3/8 такта
(в регистре A установлен один бит, поэтому
центральная  часть вызывается 1 раз из 8).
Если заменить JR на JP,то всего 28 тактов.
   Программа  замкнута  на себя. Как же ее
вызывать?
   Заводим в основной программе (диспетче-
ре) счетчик,который указывает на некоторую
строку  из 192, которые выводит программа.
Записываем туда breakpoint, т.е. JP USE, и
прыгаем  в программу в обход процедуры мо-
дификации SP (о которой я только что гово-
рил). Выглядит это примерно так:
BEGIN LD (HL),195
      INC HL
      LD DE,USE
      LD (HL),E
      INC HL
      LD (HL),D
      PUSH HL
      LD DE,6
      ADD HL,DE
      LD (USE+1),SP
      PUSH HL
      LD HL,#4020;конец 1-й строки экрана
      LD A,128
      RET
USE   LD SP,0
      POP HL
      LD (HL),код jr nc
      DEC HL
      LD (HL),код rrca
      DEC HL
      LD (HL),код inc h
      LD DE,4*16+9
      ADD HL,DE
      BIT 7,(HL)
      JR Z,$+5
      LD HL,PROG;если дошли до конца
      JR BEGIN
   Чтобы  вставить HALT, нужно завести еще
один счетчик (например,HL'),который указы-
вал бы на 96 строчек ниже первого,а вместо
breakpoint'а ставить JP (IX),где IX=IMER
IMER  LD SP,0
      EXX
      HALT
      LD (HL),код rrca
      DEC L
      LD (HL),код inc h
      PUSH HL
      EXX
      RET
   Как выводить буквы? По одной строчке: в
ту строчку, которая освободилась после из-
менения  счетчика N 1, в параметры LD надо
записать соответствующие линии букв.Не мне
вам  об этом писать: вы и сами знаете, как
это делается, а коли не знаете,так еще ин-
тереснее будет открыть это для себя.
   Программа,  которая  изображает  эффект
сдвига  вверх  с аршинными буквами, есть в
Приложении. Она называется PUSHROLL.H.

   P.S.: одна из демонстраций с FUNTOP '98
 выводит экран в прерывание,но
это, по-видимому, какой-то  другой эффект,
поскольку в ее же эпилоге сдвиг происходит
как всегда,классический,- за два.



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

Об игрушках - Doom by Digital Reality

Об игрушках - Ikari warriors

Об игрушках - Демо-версия игры Wolfenstein 3D

Ассемблер - Краткий урок ассемблера для ламеров

Ассемблер - Этюды

Ликбез - горе от ума: о выводе экрана за прерывание

Ликбез - Никогда! обзор ассемблеров: EditAs,Zeus,GENS,TASM,PASM,ZX-Asm,MASM, XAS,ALASM,IS-DOS Assembler

TR-DOS - Функции TR-DOS

Железо - расширяем экран спектрума методом "тыка"

Рабочий стол - Описание редактора AC Edit v0.09

Рабочий стол - Теневой многотекстовый ассемблер-отладчик ALASM v4.1 Краткое описание

Интервью - воспоминания Alone Coder

Отдохнем - анекдоты

Отдохнем - БИЛЛ - ГЕРОЙ ГАЛАКТИКИ (1)

Отдохнем - Аркадий Стругацкий, Борис Стругацкий: Чрезвычайное происшествие

Почтовый ящик - обьявления

Управление - Страничка помощи

Авторы - авторы журнала

От редактора - Мы выпустили этот журнал чтобы принести массу информации, которой не дают остальные журналы

Как я это сделал - Как я делал этот журнал


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

Похожие статьи:
Открытые письма Nemo №6.275
Железо - Подключение компьютера к ламповому телеприемнику серии "700" (Доработки ZX-Spectrum и телевизора).
Презентация - CMOS service v1.0
Всё о музыке - "KИНО"
События - Отчёт главного организатора CHAOS CONSTRUCTION'2000 - Random^CC.

В этот день...   1 января

SibNews #08, Woot! #01, Spectrum Magazine #01, ACNews #25, Psychoz #14, ACNews #14, Last 128 #08, Last 128 #06, Last 128 #05, Last 128 #04, Last 128 #03, Last 128 #02, Last 128 #09, Last 128 #3.5, Last 128 #8.025, Sinclair Club #05, Last 128 #M!R 01, Fantadrom #01, Buzz #20, Last 128 #01, DonNews #13, Nicron #120, Promised Land #01, Inferno #01, Marazm #25, Ultimathum #01, Marazm #21, Hooy Mag #02, KrNews #11, Marazm #22, Marazm #23, ZX Football 2000 #01, Codemania #01, Always #03, Bugs #02, IzhNews #08, Virtual Worlds #01, Listok #04, Scenergy #02, Flash Info #18, Marazm #16, Marazm #17, Zed #01, Balagan #02, ZX Format #08, ZX Power #03, Shock #01, Impulse #02, Deja Vu #03, ZX Club #08, ZX Club #06, Numberology #01, Marazm #13, Marazm #12, Marazm #14, Gorodok #02, Zodiac #01, Marazm #15, Deja Vu #07, Marazm #11, Deja Vu #07, Playboy #03, Crazy News #2, Crazy News #4, ZX Light #01, Crazy News #5, Playboy #02, ZX News #03, ZX Review #1-2, Read Me #02, Crazy News #3, Nicron #13, Read Me #01, Public Spirit #01, Faultless #06, Faultless #05, ZX Software #01, Stump #04, Speccy #07, Возраждение #0, Speccy #03, On-Line #17, Scene+ #01, Welcome Press #01, ZX Konig #04, Adventurer #01, Faultless #05, Faultless #04, Di Halt #01, Faultless #01, Playboy #01, Crazy News #1, Faultless #03, Pioneer #03, Sinclair Town #02, ZX Magazine #01, Eldorado #01, ZX Magazine #02, Spectron #01, ZX News #01, ZX Konig #02, 200 #W, Welcome Press #00, Dune #07, Subliminal Extacy #01, Subliminal Extacy #02, ZX Konig #01, Subliminal Extacy #00, Muchomor #01, Spectrofon #01, ZX Revija #02, Outlet #01, Outlet #1-3