FastPlot, или как точки попадают на экран

Scene+ #12

FastPlot, или как точки попадают на экран

Перевод из ZX LAND 5 выполнил LCD.

Большинство преподавателей информатики считают, что не имеет значения, насколько быстра программа — главное, чтобы она была короткой (прим. LCD: это отлично видно по раздутым программам на PC!). Что ж, я не собираюсь подрывать авторитет этих специалистов, а хочу представить процедуру PLOT, которая занимает около 1 Кб (+/- 15 байт), но время её выполнения составляет всего 68 тактов.

10  LD L,y
20  LD E,x
30  LD H,Taby1
40  LD D,Tabx1
50  LD A,(DE)
60  INC D
70  ADD A,(HL)
80  INC H
90  LD H,(HL)
100 LD L,A
110 LD A,(DE)
120 OR (HL)
130 LD (HL),A

Команды в строках 10 и 20 не являются частью самой процедуры — они лишь задают координаты точки.

Строки 30 и 40 устанавливают старший байт (MSB) адреса таблиц, то есть регистры HL и DE указывают на координаты X и Y в таблицах Taby1 и Tabx1.

Значение из Tabx1 попадает в A — оно задаёт позицию точки по горизонтали с точностью до знакоместа (колонки PRINT). Мы увеличиваем D на единицу, так что в DE оказывается адрес позиции с номером X из Tabx2. Затем к A мы прибавляем значение из Taby1, которое указывает позицию по вертикали с точностью до группы байтов внутри страницы памяти (256 байт).

Мы увеличиваем H, и в HL получается адрес позиции Y из таблицы Taby2. В регистр H помещается значение из Taby2 — это старший байт адреса экрана (MSB), то есть вертикальная позиция с точностью до строки пикселей.

В регистр L мы помещаем A — таким образом вычислен младший байт (LSB) экранного адреса. А в аккумулятор A считывается значение из Tabx2 — это позиция пикселя внутри одного байта (то есть уже непосредственно точка).

Теперь мы складываем (по OR) значение A с содержимым байта экрана, и результат записывается в видеопамять (чтобы получить режим OVER 1, достаточно заменить OR (HL) на XOR (HL)).

Регистр HL при этом, естественно, разрушается, но DE меняется не полностью. Если перед следующим вызовом процедуры не трогать DE, то вместо LD D,Tabx1 можно написать просто DEC D.

Разумеется, процедура бесполезна без таблиц, и вот их описание. Длина каждой таблицы — 256 байт, и они должны располагаться с начала страницы памяти, то есть начальный адрес должен делиться на 256 без остатка и занимать последовательные страницы, например: #8000 Tabx1, #8100 Tabx2... (прим. LCD: # = Hex).

  • Tabx1: 0*8, 1*8, 2*8, ..., 30*8, 31*8 (то есть 8 нулей, 8 единиц и так далее).
  • Tabx2: (128, 64, 32, 16, 8, 4, 2, 1) * 32 (то есть эта последовательность повторяется 32 раза).
  • Taby1: 0*8, 32*8, 64*8, 96*8, 128*8, 160*8, 192*8, 224*8 — и всё это повторяется трижды. Оставшиеся 64 байта значения не имеют, здесь можно разместить, например, небольшую подпрограмму (прим. LCD: к примеру, саму процедуру FastPlot).
  • Taby2:
    64, 65, 66, 67, 68, 69, 70, 71 — эта последовательность 8 раз;
    72, 73, 74, 75, 76, 77, 78, 79 — эта последовательность тоже 8 раз;
    80, 81, 82, 83, 84, 85, 86, 87 — и эта последовательность 8 раз.
    Оставшиеся 64 байта снова не имеют значения, но лучше всего заполнить их нулями.

При такой настройке начало координат (0,0) находится в левом нижнем углу экрана, а точка (255,191) — в правом верхнем, то есть используется и системная область экрана (прим. LCD: вообще-то 0,0 — это левый верхний угол!). Если хвост Taby заполнить нулями, обращение к координатам больше 191 будет безопасным.

Кроме того, табличный метод позволяет перенастроить экранные координаты под свои нужды, чем я иногда и пользовался.

DC PAK/EXODUS


Что ж, надеюсь, что вскоре я получу от вас, дорогие читатели SCENE+, не менее хорошие статьи. Надеюсь, они будут столь же интересными, как эта.

Кстати, в разделе EXTRAS есть программа со всеми таблицами под названием FPMake (Fast Plot Maker), а также программа FPDemo, демонстрирующая скорость этой процедуры (правда, из-за моих скромных познаний в машинном коде прервать её нельзя).

Если кто-то попытается использовать эту процедуру из Basic или компилированного Basic, то будет разочарован: скорость окажется заметно ниже, и только на чистом машинном коде она раскрывается во всей красе. Так что эта процедура — для фанатов ассемблера. Жаль, что авторы из ZX LAND не догадались приложить эти программы к своему журналу на кассете.

Кто-нибудь может написать серию статей «Ассемблер для начинающих»? Описать регистры и тому подобные вещи я и сам могу, но в остальном в ассемблере я полный ноль! Так что, народ, я тоже хочу наконец-то выучить ассемблер.

Tiger's Claw/I

Поделитесь вашим мнением о статье