Брезенхем: Алгоритм для рисования линии — различия между версиями
Материал из SpeccyWiki
Goblinish (обсуждение | вклад) (Содержимое страницы заменено на «Статья удаленна из-за самоуправства рязанского пидора Димачки Быстров…») |
NMI (обсуждение | вклад) м (Отмена правки 35916, сделанной участником Goblinish (обс.) - оскорбление других участников, вандализм) |
||
| Строка 1: | Строка 1: | ||
| − | + | Процедура использует дополнительные данные, расположенные по адресу '''#7C00-#7CFF'''.Данные предназначены для построения точек. Перед использованием алгоритма необходимо вызвать '''INIT'''. Входные параметры:;HL=XY точки,BC=YX точки.использует '''HL'''' | |
| + | |||
| + | пример вызова процедуры: | ||
| + | <code><pre> | ||
| + | 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 | ||
| + | |||
| + | </pre></code> | ||
| + | |||
| + | процедура рисования линии | ||
| + | |||
| + | <code><pre> | ||
| + | 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 | ||
| + | |||
| + | </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