Witam!
Potrzebuję pomocy przy zmodyfikowaniu istniejącego już programu, wygląda tak:
http://img33.imageshack.us/img33/5857/asm.png
W górnej części wybieramy kolor, niżej mamy 2 wiersze - w pierwszym rysujemy prostokąty, zaś w drugim trójkąty.
Czy analogicznie ktoś potrafiłby mi pomóc w dorobieniu rysowania okręgów/kół?
Poniżej zamieszczam kod programu:
.MODEL small
.486
delay macro time
local ext,iter
push cx
mov cx,time
ext:
push cx
mov cx,5000
iter:
loop iter
pop cx
loop ext
pop cx
endm
sdat segment use16
buffer db 100 dup(0)
wpis db 100 dup(0)
DDX DW ?
DDY DW ?
delta DW ?
E1 DW ?
E2 DW ?
X DW ?
Y DW ?
SGNX DW ?
SGNY DW ?
X0 DW ?
X1 DW ?
X2 DW ?
xx DW ?
yy DW ?
Y0 DW ?
Y1 DW ?
Y2 DW ?
Color DB ?
LICZNIK dw ?
TRYB dw ?
TMP DW ?
DDX_DDY DW ?
sdat ends;
;-----------------------------------------------------------------------------------
putpixel MACRO XX, YY, kolor
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,0CH
MOV AL,kolor
MOV CX,XX
MOV DX,YY
INT 10H
POP DX
POP CX
POP BX
POP AX
ENDM
;***********************************************
STK segment stack
dw 100 dup(?)
STK ends;
codseg segment use16
assume ds:sdat,cs:codseg,ss:stk
MAIN PROC far
MOV COLOR,1
MOV TRYB,0
MOV AH,00H
MOV AL,12H
INT 10H
mov ax,00h
int 33h
mov ax,01h
int 33h
mov cx,0020h
mov dx,0020h
loop2:
mov bx,0020h
mov ax,0020h
loop1:
putpixel dx,bx,5
inc bx
sub ax,01h
JNZ loop1
inc dx
sub cx,01h
JNZ loop2
mov cx,0020h
mov dx,0060h
loop4:
mov bx,0020h
mov ax,0020h
loop3:
putpixel dx,bx,1
inc bx
sub ax,01h
JNZ loop3
inc dx
sub cx,01h
JNZ loop4
mov cx,0020h
mov dx,00A0h
loop6:
mov bx,0020h
mov ax,0020h
loop5:
putpixel dx,bx,0Ah
inc bx
sub ax,01h
JNZ loop5
inc dx
sub cx,01h
JNZ loop6
mov cx,0020h
mov dx,00E0h
loop8:
mov bx,0020h
mov ax,0020h
loop7:
putpixel dx,bx,07h
inc bx
sub ax,01h
JNZ loop7
inc dx
sub cx,01h
JNZ loop8
mov cx,0020h
mov dx,0200h
loop14:
mov bx,0020h
mov ax,0020h
loop13:
putpixel dx,bx,04h
inc bx
sub ax,01h
JNZ loop13
inc dx
sub cx,01h
JNZ loop14
;----------------------------------------------------------------------------
mov COLOR, 0
mov x0,200h
mov x1,220h
mov y0,20h
mov y1,40h
call bresenham
mov x0,200h
mov x1,220h
mov y0,40h
mov y1,20h
call bresenham
mov cx,0300h
mov dx,0001h
loop1444:
mov bx,00FFh
mov ax,0001h
loop1333:
putpixel dx,bx,04h
inc bx
sub ax,01h
JNZ loop1333
inc dx
sub cx,01h
JNZ loop1444
mov cx,0300h
mov dx,0001h
loop1444a:
mov bx,0050h
mov ax,0001h
loop1333a:
putpixel dx,bx,04h
inc bx
sub ax,01h
JNZ loop1333a
inc dx
sub cx,01h
JNZ loop1444a
mov COLOR, 01h
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
loop21:
mov ax,0005h
mov bx,01h
int 33h
sub ax,01h
JNZ loop21
mov ax,03h
int 33h
mov x0,cx
mov y0,dx
mov AX, 50h
sub AX, y0
JS ddd
mov y0, 51h
ddd:
mov xx,cx
mov yy,dx
;-----------------------------------------------------
CMP yy,0020h
JG dalej
JMP loop23a
dalej:
CMP yy,0040h
JL dalej2
JMP loop23a
dalej2:
CMP xx,0020h
JG dalej3
JMP loop23a
dalej3:
CMP xx,0040h
JL dalej4
JMP loop23a
dalej4:
MOV COLOR,5
JMP loop21
loop23a:
CMP yy,0020h
JG dalej1
JMP loop23b
dalej1:
CMP yy,0040h
JL dalej12
JMP loop23b
dalej12:
CMP xx,0060h
JG dalej13
JMP loop23b
dalej13:
CMP xx,0080h
JL dalej14
JMP loop23b
dalej14:
MOV COLOR,1
JMP loop21
loop23b:
CMP yy,0020h
JG dalej2a
JMP loop23c
dalej2a:
CMP yy,0040h
JL dalej22
JMP loop23c
dalej22:
CMP xx,00A0h
JG dalej23
JMP loop23c
dalej23:
CMP xx,00C0h
JL dalej24
JMP loop23c
dalej24:
MOV COLOR,0Ah
JMP loop21
loop23c:
CMP yy,0020h
JG dalej3a
JMP loop23d
dalej3a:
CMP yy,0040h
JL dalej32
JMP loop23d
dalej32:
CMP xx,00E0h
JG dalej33
JMP loop23d
dalej33:
CMP xx,0100h
JL dalej34
JMP loop23d
dalej34:
MOV COLOR,7h
JMP loop21
loop23d:
CMP yy,00ffh
JG dalej4a
JMP loop23f
dalej4a:
MOV TRYB, 0
JMP loop23
loop23f:
CMP yy,0020h
JG dalej6a
JMP loop23g
dalej6a:
CMP yy,0040h
JL dalej62
JMP loop23g
dalej62:
CMP xx,0200h
JG dalej63
JMP loop23g
dalej63:
CMP xx,0220h
JL dalej64
JMP loop23g
dalej64:
MOV AH,00H
MOV AL,03
INT 10H
mov ax,4c00h
int 21h
JMP loop21
loop23g:
CMP yy,0050h
JG dalej7a
JMP loop23h
dalej7a:
CMP yy,00FFh
JL dalej72
JMP loop23h
dalej72:
MOV TRYB, 2
JMP loop23
loop23h:
JMP loop21
loop23:
mov ax,06h
mov bx,01h
int 33h
sub ax,01h
JZ loop23
loop22:
mov ax,0005h
mov bx,01h
int 33h
sub ax,01h
JNZ loop22
mov ax,03h
int 33h
mov x1,cx
mov y1,dx
mov x2,cx
mov y2,dx
mov AX, 51h
sub AX, y1
JS ddd2
JMP loop21
ddd2:
loop24:
mov ax,06h
mov bx,01h
int 33h
sub ax,01h
JZ loop24
CMP TRYB, 2
JZ kontynuuj2
call bresenham
loop22aaa:
mov ax,0005h
mov bx,01h
int 33h
sub ax,01h
JNZ loop22aaa
mov ax,03h
int 33h
mov x1,cx
mov y1,dx
loop24aaa:
mov ax,06h
mov bx,01h
int 33h
sub ax,01h
JZ loop24aaa
call bresenham
mov ax,x2
mov x0,ax
mov ax,y2
mov y0,ax
call bresenham
JMP loop21
;--------------------------------------------------------------------------
kontynuuj:
putpixel x0,y0,COLOR
JMP loop21
kontynuuj2:
MOV AX,X1 ;obliczany DDX
SUB AX,X0
JS kw2
MOV DDX,AX
MOV AX,Y1 ;obliczamy DDY
SUB AX,Y0
JS kw3
MOV DDY,AX
JMP rys
kw2:
MOV ax, x0
MOV BX, X1
MOV x1, ax
MOV X0, BX
MOV AX,X1 ;obliczany DDX
SUB AX,X0
MOV DDX,AX
MOV AX,Y1 ;obliczamy DDY
SUB AX,Y0
JS kw3
MOV DDY,AX
JMP rys
kw3:
MOV ax, y0
MOV BX, y1
MOV y1, ax
MOV y0, BX
MOV AX,Y1 ;obliczamy DDY
SUB AX,Y0
MOV DDY,AX
rys:
mov cx,DDX
mov dx,x0
loopk1:
mov bx,y0
mov ax,DDY
loopk2:
putpixel dx,bx,COLOR
inc bx
sub ax,01h
JNZ loopk2
inc dx
sub cx,01h
JNZ loopk1
JMP loop21
kontynuuj3:
JMP loop21
;************************************************* ********
MOV AH,08H;GETCH
INT 21H
MOV AH,00H; graficzny tryb
MOV AL,03; tryb tekstowy
INT 10H
mov ax,4c00h
int 21h
MAIN ENDP
;************************************************* ********
bresenham PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,X1 ;obliczany DDX
SUB AX,X0
MOV DDX,AX
MOV SGNX,0001H ;sprawdzanie czy DDX>0
TEST DDX,8000H
JZ dx_dodatni
MOV SGNX,0FFFFH ;-1
MOV AX,X0 ; /DDX/
SUB AX,X1
MOV DDX,AX
dx_dodatni:
MOV AX,Y1 ;obliczamy DDY
SUB AX,Y0
MOV DDY,AX
MOV SGNY,0001H ;sprawdzenie czy DDY>0
TEST DDY,8000H
JZ dy_dodatni
MOV SGNY,0FFFFH ;-1
MOV AX,Y0 ; /DDY/
SUB AX,Y1
MOV DDY,AX
dy_dodatni:
MOV AX,DDX ;sprawdzenie czy DDX-DDY>0
SUB AX,DDY
MOV DDX_DDY,0H
TEST AX,8000H
JZ DDY_wieksze_od_DDX
MOV DDX_DDY,1H ; dla DDY>DDX zamiana DDX<=>DDY
MOV AX,DDX
MOV TMP,AX
MOV AX,DDY
MOV DDX,AX
MOV AX,TMP
MOV DDY,AX
DDY_wieksze_od_DDX:
MOV AX,DDY ; 2*(DDY-DDX)
SUB AX,DDX
SHL AX,1
MOV delta,AX; delta=2*(DDY-DDX)
MOV AX,DDY
SHL AX,1
MOV E1,AX ;E1=2*DDY
MOV AX,delta
MOV E2,AX ;E2=delta=2*(DDY-DDX)
MOV AX,X0 ;X=X0 Y=Y0
MOV X,AX
MOV AX,Y0
MOV Y,AX
putpixel X,Y,Color
iteracja:
TEST delta,8000H
JZ delta_dodatnia
TEST DDX_DDY,1H
JZ zamiana_1
MOV AX,Y ;dla kata > 45 stopni INC Y
ADD AX,SGNY
MOV Y,AX
JMP bez_zamiany_1
zamiana_1:
MOV AX,X ;INCX ;dla kata < 45 stopni ICN X
ADD AX,SGNX
MOV X,AX
bez_zamiany_1:
MOV AX,delta
ADD AX,E1
MOV delta,AX
JMP przeskok_delta
delta_dodatnia:
MOV AX,X ;INCX
ADD AX,SGNX
MOV X,AX
MOV AX,Y ;INCY
ADD AX,SGNY
MOV Y,AX
MOV AX,delta
ADD AX,E2
MOV delta,AX
przeskok_delta:
putpixel X,Y,Color
MOV AX,X1
SUB AX,X
SUB AX,1
JC koniec
JMP iteracja
koniec:
POP DX
POP CX
POP BX
POP AX
RET
bresenham ENDP
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~
codseg ends
end main