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

Материал из SpeccyWiki
Версия от 13:48, 4 августа 2012; Goblinish (обсуждение | вклад)

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

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

PIX_TAB EQU #7C00
	device zxspectrum128;используется для sjAsm

        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;MAIN
        EXX:LD HL,#2758:EXX
        RET

;-------------------------------процедура рисования линии
DRAW    LD (TEK_POI+1),HL,E,H
        LD H,high PIX_TAB,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),DE,#FFFF
        LD A,H:SUB C:JR NC,$+6
        NEG:LD E,1,C,A
        LD A,L:SUB B:JR NC,$+6
        NEG:LD D,1,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,B,C
        PUSH DE:LD D,0
L24CB   LD H,B,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,A,C
        ADD A,H
        LD H,A,A,B
        ADD A,L:LD L,A
        LD (TEK_POI+1),HL

        LD E,H,H,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
;ANY RET

INIT    LD DE,#4000,L,E,BC,#8000
ILP1    LD H,high PIX_TAB,(HL),E:INC H;high - аналог [ в Storm.
        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;256+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
end
	display /d,end-begin;используется для sjAsm
	savesna "test.sna",begin;используется для sjAsm