Dobra zorobione dzieki wielkie:a o to kod programu:
[code]
.MODEL small,pascal
.STACK 0ffffh
.486
.DATA
napis db "Ile dodatkowych elips ma zostac wyswietlonych? ",'$'
napis1 db "Podaj wsp X pierwszej elipsy (0-320): ",'$'
napis2 db "Podaj wsp Y pierwszej elipsy (0-200): ",'$'
napis3 db "Podaj rozmiar polprostej X: ",'$'
napis4 db "Podaj rozmiar polprostej Y: ",'$'
pomoc db "Program rysujacy x wypelnionych elips",13,10
db "Uzytkownik podaje wspolrzedne srodka pierwszej elipsy,",13,10
db "oraz wielkosc obu polprostych",13,10,'$'
ent db 13,10,'$'
parametr db 3 DUP ('$')
liczba db 10 DUP ('$')
kolor db 9
x0 dw 50
y0 dw 50
x dw 0
y dw 0
ppx dw 5
ppy dw 5
ile_elips dw 0
RndHi dw ?
RndLo dw ?
Seed dw 1h
oneten dq 0.01
.CODE
jmp Start
Random PROC
mov bx,Seed
add bx,9248h
ror bx,1
ror bx,1
ror bx,1
mov Seed,bx
mov ax,RndHi
sub ax,RndLo
mul bx
mov ax,dx
add ax,RndLo
ret
ENDP Random
ZamienNaliczbe PROC
mov di,offset liczba ;do DI adres bufora z ciagiem cyfr
xor bx,bx
mov bl,byte ptr ds:[di+1]
add bl,2
add bx,di
mov al,'$'
mov byte ptr ds:[bx], al
mov bx,10 ;do BX wkladamy 10
xor ax,ax ;zerujemy AX
xor dx,dx ;zerujemy DX
add di,2
mov cl,liczba[1] ;do CX wkladamy 5 - tyle cyfr max moze miec
przez_10: ;nasza liczba
cmp byte ptr ds:[di],'$';sprawdzamy czy to juz koniec cyfr
je nie_koniec
mul bx ;mnozymy cyfre w AX przez BX=10
mov dl,byte ptr ds:[di] ;wkladamy do dl nasz znak z bufora
sub dl,30h ;odejmujemy stala 30h i dostajemy cyfre
add ax,dx ;dodajemy otrzymana cyfre w DX do AX
xor dx,dx ;zerujemy DX
nie_koniec:
inc di ;zwiekszamy offset bufora o 1
loop przez_10 ;powtarzamy instrukcje 5 razy
ret
ZamienNaLiczbe ENDP
SetPixel PROC ;al -> kolor, cx -> X, dx -> Y
push bx
mov ah,0Ch
mov bx,01h
int 10h
pop bx
ret
SetPixel ENDP
Ellipse PROC
finit
fldz
mov cx,0
rysujElipse:
fld st
fcos
fimul [ppx]
fiadd [x0]
frndint
fistp [x]
fld st
fsin
fimul [ppy]
fiadd [y0]
frndint
fistp [y]
fadd [oneten]
push cx
mov al,[kolor]
mov cx,[x]
mov dx,[y]
call SetPixel
pop cx
inc cx
cmp cx,6284
jne rysujElipse
ret
Ellipse ENDP
Fill PROC
ret
Fill ENDP
DrukujEnter PROC
mov ah,09h
mov dx,offset ent
int 21h
ret
DrukujEnter ENDP
WczytajLiczby PROC
mov ah,09h
mov dx,offset napis
int 21h
mov ah,0ah
mov dx,offset liczba
int 21h
call ZamienNaLiczbe
mov [ile_elips],ax
call DrukujEnter
mov ah,09h
mov dx,offset napis1
int 21h
mov ah,0ah
mov dx,offset liczba
int 21h
call ZamienNaLiczbe
mov [x0],ax
call DrukujEnter
mov ah,09h
mov dx,offset napis2
int 21h
mov ah,0ah
mov dx,offset liczba
int 21h
call ZamienNaLiczbe
mov [y0],ax
call DrukujEnter
mov ah,09h
mov dx,offset napis3
int 21h
mov ah,0ah
mov dx,offset liczba
int 21h
call ZamienNaLiczbe
mov [ppx],ax
call DrukujEnter
mov ah,09h
mov dx,offset napis4
int 21h
mov ah,0ah
mov dx,offset liczba
int 21h
call ZamienNaLiczbe
mov [ppy],ax
mov ax,[ile_elips]
add ax,[x0]
add ax,[y0]
add ax,[ppx]
add ax,[ppy]
mov [Seed],ax
ret
WczytajLiczby ENDP
fill_seed PROC
ARG xx: WORD, yy: WORD, edge_color: WORD, color: WORD
mov ah,0dh
mov bx,1
mov cx,xx
mov dx,yy
int 10h
mov bx,edge_color
cmp al,bl
je koniec
mov bx,color
cmp al,bl
je koniec
mov ax,color
mov cx,xx
mov dx,yy
call SetPixel
mov ax, yy
dec ax
call fill_seed, xx, ax, edge_color, color
mov ax, yy
inc ax
call fill_seed, xx, ax, edge_color, color
mov ax, xx
dec ax
call fill_seed, ax, yy, edge_color, color
mov ax, xx
inc ax
call fill_seed, ax, yy, edge_color, color
koniec:
ret
ENDP
Start:
mov ax,@data
mov ds,ax
;uruchomiony program w DOSie posiada PSP (Program Segment Prefix),
;jest on tworzony podczas ladowania programu
;pod offsetem 80h znajduje sie liczba znakow podanych jako parametry
xor di,di ;potrzebny index,bedzie wskazywal kolejny element parametru
mov bx,80h ;sprawdzamy czy istnieje
mov cl,es:[bx] ;jakikolwiek parametr
cmp cl,0 ;jesli nie to wykonuj program normalnie
jne czytajp1
jmp go
czytajp1:
inc bx ;parametry zaczynaja sie od 81h
mov dl,es:[bx] ;wczytujemy go do dl
mov parametr[di],dl ;a nastepnie do bufora
inc di
loop czytajp1
cmp parametr[1],'/' ;sprawdzamy czy podany parametr
je czytajp2 ;jest poprawny
jmp go
czytajp2:
cmp parametr[2],'?' ;jesli tak to wyswietlamy pomoc
jne go
mov ah,09h
mov dx,offset pomoc
int 21h
jmp NieRysuj
go:
call WczytajLiczby
mov ax,0013h
int 10h
call Ellipse
xor ax,ax
mov al,kolor
mov bx,ax
inc bx
call fill_seed, x0, y0, ax, ax
mov cx,[ile_elips]
cmp cx,1
je NieRysuj
;sub cx,1
Rysuj:
push cx
mov [RndHi],270
mov [RndLo],50
call Random
mov [x0],ax
mov [RndHi],150
mov [RndLo],50
call Random
mov [y0],ax
mov [RndHi],15
mov [RndLo],1
call Random
mov [kolor],al
call Ellipse
xor ax,ax
mov al,kolor
mov bx,ax
inc bx
call fill_seed, x0, y0, ax, ax
pop cx
loop Rysuj
NieRysuj:
mov ah,08h
int 21h
mov ax,0003h
int 10h
mov ah,4Ch
int 21h
END Start
[/code]
Może się przyda..
// tagi plizzz [mf]