Построение точки — различия между версиями

Материал из SpeccyWiki
Перейти к: навигация, поиск
м (Откат правок Goblinish (обсуждение) к версии Alone)
(Содержимое страницы заменено на «Господа, я не порчу, я делаю последнее китайское предупреждение.»)
 
(не показаны 2 промежуточные версии 2 участников)
Строка 1: Строка 1:
Процедура разработана Busy, встречается в построениях окружности и линии. Для построения точек необходимо подготовить вспомогательную таблицу, которая занимает 4*256=1024 байта:
+
Господа, я не порчу, я делаю последнее китайское предупреждение.
0-255 байт: старшие значащие байты адреса экрана(координата Y)
+
256-511 байт: младшие значащие байты адреса экрана(координата Y)
+
512-767 байт: смещение по экрану(координата X)
+
768-1023 байт: битовые значения(координата X)
+
 
+
<code><pre>
+
PIX_TAB EQU #7C00
+
PIX_TAB_HI EQU PIX_TAB/256;#7C
+
 
+
        ORG #6000
+
;формирование адресов
+
INIT    LD DE,#4000;адрес экранной области
+
        LD L,E
+
        LD BC,#8000
+
ILP1    LD H,PIX_TAB_HI;high - аналог [ в Storm.
+
        LD(HL),D;старший байт
+
        INC H
+
        LD (HL),E;младший байт
+
        INC H
+
        LD (HL),C;смещение X
+
        INC H
+
        LD (HL),B;битовое значение
+
        CALL DOWN_DE;следующая линия экрана
+
        RRC B;циклический сдвиг битового значения - #80->#40->...->#4->#2->#1
+
        LD A,C; после того, когда в регистре B хранилось значение 1, сдвиг RRC установил флаг переноса C=1
+
        ADC A,0; поэтому вместо проверки выполняем сложение регистра C с учетом, получается C=C+1
+
        LD C,A
+
        INC L; переходим к следующей таблице
+
        JR NZ,ILP1;завершение цикла, 0-255
+
; при первоначальном выполнении в таблицу заносятся значения от #4000 до #5800
+
; поэтому процедура построения при значении Y>191 внесет изменения в атрибуты
+
; чтобы не выполнять проверку, заполним часть таблицы нулями
+
        LD HL,PIX_TAB+96
+
ILP2    LD (HL),0
+
        INC L
+
        JR NZ,ILP2
+
        RET
+
;-------------------------------
+
DOWN_DE INC D
+
        LD A,D
+
        AND 7
+
        RET NZ
+
        LD A,E
+
        ADD A,32
+
        LD E,A
+
        RET C
+
        LD A,D
+
        SUB 8
+
        LD D,A
+
        RET
+
 
+
</pre></code>
+
ставим точку, входные данные DE=YX координаты
+
<code><pre>
+
PLOT    PUSH HL
+
        PUSH BC;сохранить на стеке используемые регистры
+
        LD H,PIX_TAB_HI
+
        LD L,D
+
        LD B,(HL)
+
        INC H
+
        LD A,(HL)
+
        LD L,E
+
        INC H
+
        OR (HL)
+
        INC H
+
        LD C,A;BC=адрес экрана
+
        LD A,(BC); чтобы поставить точку нужно получить значение из экрана
+
        OR (HL); проводим операцию OR
+
        LD (BC),A; занести значение по адресу
+
        POP BC;восстановить сохраненные регистры
+
        POP HL
+
        RET
+
</pre></code>
+
 
+
Существует и более быстрая процедура<ref>http://zxdn.narod.ru/coding/zg1etud2.txt</ref>:
+
 
+
<code><pre>
+
  <Точка Старых>: по координатам,заданным
+
в регистрах L=y, E=x, в произвольном месте
+
экрана(и даже за экран)за 58(!)тактов ста-
+
вится точка.Регистр C равен старшему байту
+
адреса таблиц('TABLE), регистр D=C+2.
+
    LD H,C
+
    LD A,(DE);x/8 \
+
    INC D        |-даёт младший байт
+
    OR (HL);L(y)  /
+
    INC H
+
    LD H,(HL);H(y)
+
    LD L,A
+
    LD A,(DE);byte(x)
+
    (X)OR (HL);метод постановки точки
+
    LD (HL),A
+
  Если вместо последних 2 команд вставить
+
AND (HL),то это будет функция POINT. Чтобы
+
процедура работала многократно, в конце её
+
поставьте DEC D. Таблицы генерируются сле-
+
дующей программой:
+
    LD HL,TABLE+256
+
    LD DE,#4000
+
GEN0 LD (HL),D  \
+
    DEC H      |
+
    LD (HL),E  |
+
    INC H      |
+
    DOWN DE    | 1-я
+
    LD A,D    |- и
+
    SUB 88    | 2-я
+
    JR NZ,$+3  |
+
    LD D,A    |
+
    INC L      |
+
    JR NZ,GEN0 /
+
    INC H
+
    LD A,128
+
GEN1 LD (HL),E  \
+
    INC H      |
+
    LD (HL),A  |
+
    DEC H      | 3-я
+
    RRCA      |- и
+
    JR NC,$+3  | 4-я
+
    INC E      |
+
    INC L      |
+
    JR NZ,GEN1 /
+
</pre></code>
+
 
+
== Примечания ==
+
<REFERENCES />
+
 
+
[[Категория:Программирование графики]]
+

Текущая версия на 17:36, 6 октября 2015

Господа, я не порчу, я делаю последнее китайское предупреждение.