Брезенхем: Алгоритм для рисования линии — различия между версиями
Материал из SpeccyWiki
Goblinish (обсуждение | вклад) (Новая страница: «Процедура использует дополнительные данные, расположенные по адресу '''#7C00-#7CFF'''.Данные п...») |
Goblinish (обсуждение | вклад) |
||
| Строка 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 | ||
| − | |||
ORG #6000 | ORG #6000 | ||
| Строка 9: | Строка 10: | ||
;HL=XY,BC=YX | ;HL=XY,BC=YX | ||
ld BC,#bfff;Демонстрация работы | ld BC,#bfff;Демонстрация работы | ||
| − | MAIN EI | + | MAIN EI |
| − | LD A,0 | + | 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 | + | LD A,2 |
| − | pop bc | + | OUT (#FE),A |
| + | pop bc | ||
| + | dec c | ||
| + | jr z, wkey;выход из цикла к ожиданию нажатия клавиши | ||
jp MAIN | jp MAIN | ||
wkey | wkey | ||
| − | LD A,#7F | + | LD A,#7F |
| − | RRA | + | IN A,(#FE);ждем нажатия Пробел |
| − | EXX | + | RRA |
| + | JR C,wkey | ||
| + | EXX | ||
| + | LD HL,#2758 | ||
| + | EXX | ||
RET | 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 | ||
| + | |||
| + | </pre></code> | ||
| + | |||
| + | процедура рисования линии | ||
| + | |||
| + | <code><pre> | ||
| − | |||
DRAW LD (TEK_POI+1),HL,E,H | DRAW LD (TEK_POI+1),HL,E,H | ||
LD H,high PIX_TAB,A,(HL);[ | LD H,high PIX_TAB,A,(HL);[ | ||
| Строка 55: | Строка 86: | ||
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,H,high PIX_TAB;[ | ||
LD A,(HL):INC H | LD A,(HL):INC H | ||
| Строка 66: | Строка 97: | ||
RETURN RET | RETURN RET | ||
;ANY RET | ;ANY RET | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</pre></code> | </pre></code> | ||
[[Категория:Программирование графики]] | [[Категория:Программирование графики]] | ||
Версия 11:19, 4 августа 2012
Процедура использует дополнительные данные, расположенные по адресу #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,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
процедура рисования линии
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