Брезенхем: Алгоритм для рисования линии

Материал из SpeccyWiki
Версия от 16:01, 2 сентября 2015; NMI (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Процедура использует дополнительные данные, расположенные по адресу #7C00-#7CFF.Данные предназначены для построения точек. Перед использованием алгоритма необходимо вызвать INIT. Входные параметры:;HL=XY точки,BC=YX точки.использует HL'

пример вызова процедуры:

PIX_TAB EQU #7C00

        ORG #6000
begin
        CALL INIT;расчет данных для построения.
;HL=XY,BC=YX
   ld BC,#bfff;Демонстрация работы
MAIN    EI
        HALT
        LD A,0
        OUT (#FE),A
        push bc
        LD HL,#0000
        CALL DRAW;вызов рисования линии с координатами в BC и HL
        LD A,2
        OUT (#FE),A
        pop bc
        dec c
        jr z, wkey;выход из цикла к ожиданию нажатия клавиши
        jp MAIN
wkey
        LD A,#7F
        IN A,(#FE);ждем нажатия Пробел
        RRA 
        JR C,wkey
        EXX
        LD HL,#2758
        EXX
        RET
INIT    LD DE,#4000
        LD L,E
        LD BC,#8000
ILP1    LD H,#7c;high PIX_TAB,high - аналог [ в Storm.
        LD(HL),E
        INC H
        LD (HL),D
        INC H
        LD (HL),C
        INC H
        LD (HL),B
        CALL DOWN_DE
        RRC B
        LD A,C
        ADC A,0
        LD C,A
        INC L
        JR NZ,ILP1
        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

процедура рисования линии

DRAW    LD (TEK_POI+1),HL
	LD E,H
        LD H,#7C;high PIX_TAB
        LD A,(HL)
        INC H
        LD D,(HL)
        INC H
        LD L,E
        OR (HL)
        LD E,A
        INC H
        LD A,(DE)
        OR (HL)
        LD (DE),A

        LD HL,(TEK_POI+1)
        LD DE,#FFFF
        LD A,H
        SUB C
        JR NC,$+6
        NEG
        LD E,1
        LD C,A
        LD A,L
        SUB B
        JR NC,$+6
        NEG
        LD D,1
        LD B,A
        LD A,C
        CP B
        JR NC,L24C4
        LD L,C
        PUSH DE
        XOR A
        LD E,A
        JR L24CB
L24C4   OR C
	RET Z
	LD L,B
	LD B,C
        PUSH DE
        LD D,0
L24CB   LD H,B
	LD A,B
        RRA
L24CE   ADD A,L
	JR C,L24D4
        CP H
        JR C,L24DB
L24D4   SUB H
	LD C,A
        EXX
        POP BC
        PUSH BC
        JR TEK_POI
L24DB   LD C,A
	PUSH DE
        EXX
        POP BC
TEK_POI LD HL,0
	LD A,C
        ADD A,H
        LD H,A,A,B
        ADD A,L
        LD L,A
        LD (TEK_POI+1),HL

        LD E,H
        LD H,#7C;high PIX_TAB;[
        LD A,(HL)
        INC H
        LD D,(HL)
        INC H
        LD L,E
        OR (HL)
        LD E,A
        INC H
        LD A,(DE)
        OR (HL)
        LD (DE),A
        EXX
        LD A,C
        DJNZ L24CE
        POP DE
RETURN  RET