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

Материал из SpeccyWiki
Перейти к: навигация, поиск
(Новая страница: «Процедура использует дополнительные данные, расположенные по адресу '''#7C00-#7CFF'''.Данные п...»)
 
м (Отмена правки 35916, сделанной участником Goblinish (обс.) - оскорбление других участников, вандализм)
 
(не показаны 3 промежуточные версии ещё одного участника)
Строка 1: Строка 1:
Процедура использует дополнительные данные, расположенные по адресу '''#7C00-#7CFF'''.Данные предназначены для построения точек. Перед использованием алгоритма необходимо вызвать '''INIT'''. Входные параметры:;HL=XY точки,BC=YX точки.
+
Процедура использует дополнительные данные, расположенные по адресу '''#7C00-#7CFF'''.Данные предназначены для построения точек. Перед использованием алгоритма необходимо вызвать '''INIT'''. Входные параметры:;HL=XY точки,BC=YX точки.использует '''HL''''
 +
 
 +
пример вызова процедуры:
 
<code><pre>
 
<code><pre>
 
PIX_TAB EQU #7C00
 
PIX_TAB EQU #7C00
device zxspectrum128;используется для sjAsm
 
  
 
         ORG #6000
 
         ORG #6000
Строка 9: Строка 10:
 
;HL=XY,BC=YX
 
;HL=XY,BC=YX
 
   ld BC,#bfff;Демонстрация работы
 
   ld BC,#bfff;Демонстрация работы
MAIN    EI:HALT
+
MAIN    EI
         LD A,0:OUT (#FE),A
+
        HALT
 +
         LD A,0
 +
        OUT (#FE),A
 
         push bc
 
         push bc
 
         LD HL,#0000
 
         LD HL,#0000
 
         CALL DRAW;вызов рисования линии с координатами в BC и HL
 
         CALL DRAW;вызов рисования линии с координатами в BC и HL
         LD A,2:OUT (#FE),A
+
         LD A,2
         pop bc:dec c:jr z, wkey;выход из цикла к ожиданию нажатия клавиши
+
        OUT (#FE),A
 +
         pop bc
 +
        dec c
 +
        jr z, wkey;выход из цикла к ожиданию нажатия клавиши
 
         jp MAIN
 
         jp MAIN
 
wkey
 
wkey
         LD A,#7F:IN A,(#FE);ждем нажатия Пробел
+
         LD A,#7F
         RRA:JR C,wkey;MAIN
+
        IN A,(#FE);ждем нажатия Пробел
         EXX:LD HL,#2758:EXX
+
         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
 
         RET
  
;-------------------------------процедура рисования линии
+
</pre></code>
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
+
<code><pre>
         INC H:LD A,(DE):OR (HL)
+
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 (DE),A
  
         LD HL,(TEK_POI+1),DE,#FFFF
+
         LD HL,(TEK_POI+1)
         LD A,H:SUB C:JR NC,$+6
+
        LD DE,#FFFF
         NEG:LD E,1,C,A
+
         LD A,H
         LD A,L:SUB B:JR NC,$+6
+
        SUB C
         NEG:LD D,1,B,A
+
        JR NC,$+6
         LD A,C:CP B:JR NC,L24C4
+
         NEG
         LD L,C:PUSH DE:XOR A
+
        LD E,1
         LD E,A:JR L24CB
+
        LD C,A
L24C4  OR C:RET Z:LD L,B,B,C
+
         LD A,L
         PUSH DE:LD D,0
+
        SUB B
L24CB  LD H,B,A,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
 
         RRA
L24CE  ADD A,L:JR C,L24D4
+
L24CE  ADD A,L
         CP H:JR C,L24DB
+
JR C,L24D4
L24D4  SUB H:LD C,A
+
         CP H
         EXX:POP BC:PUSH BC
+
        JR C,L24DB
 +
L24D4  SUB H
 +
LD C,A
 +
         EXX
 +
        POP BC
 +
        PUSH BC
 
         JR TEK_POI
 
         JR TEK_POI
L24DB  LD C,A:PUSH DE
+
L24DB  LD C,A
         EXX:POP BC
+
PUSH DE
TEK_POI LD HL,0,A,C
+
         EXX
 +
        POP BC
 +
TEK_POI LD HL,0
 +
LD A,C
 
         ADD A,H
 
         ADD A,H
 
         LD H,A,A,B
 
         LD H,A,A,B
         ADD A,L:LD L,A
+
         ADD A,L
 +
        LD L,A
 
         LD (TEK_POI+1),HL
 
         LD (TEK_POI+1),HL
  
         LD E,H,H,high PIX_TAB;[
+
         LD E,H
         LD A,(HL):INC H
+
        LD H,#7C;high PIX_TAB;[
         LD D,(HL):INC H
+
         LD A,(HL)
         LD L,E:OR (HL)
+
        INC H
         LD E,A:INC H
+
         LD D,(HL)
         LD A,(DE):OR (HL):LD (DE),A
+
        INC H
         EXX:LD A,C:DJNZ L24CE
+
         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
 
         POP DE
 
RETURN  RET
 
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
 
 
</pre></code>
 
</pre></code>
 
[[Категория:Программирование графики]]
 
[[Категория:Программирование графики]]

Текущая версия на 16:01, 2 сентября 2015

Процедура использует дополнительные данные, расположенные по адресу #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