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

Материал из SpeccyWiki
Перейти к: навигация, поиск
(Новая страница: «Процедура разработана Busy, встречается в построениях окружности и линии. Для построения ...»)
 
(Содержимое страницы заменено на «Господа, я не порчу, я делаю последнее китайское предупреждение.»)
 
(не показано 5 промежуточных версии 3 участников)
Строка 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>
+
 
+
[[Категория:Программирование графики]]
+

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

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