grafica

14
D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35 ;*******************************************************************************; ; FUNÇÃO GRÁFICA ; ;*******************************************************************************; ;Essa função permite ao usuário plotar círculos, retas e escrever caracteres ;na tela do computador. Ela foi criada pelo Professor Paulo Amaral, para auxiliar ;os alunos no laboratório de microprocessadores da Universidade Federal do ;Espírito Santo. ;PARA USÁ-LA ;1-Copia esse arquivo e cole-o no bloco de notas. Salve como grafica.asm ;2-Abra o Prompt de Comando e entre no diretório onde está o arquivo grafica.asm ;3-Faça o download do arquivo linker + asm na página do professor Paulo Amaral ; http://www2.ele.ufes.br/~paulo/MicroprocessadoresI.htm , e extraia no diretorio ; onde você salvou a função grafica.asm ;4-Depois compile usando o comando: nasm grafica.asm ;5-Depois vc deve linkar o arquivo com o comando: freelink grafica.obj ;6-Agora é só executar: grafica.exe .Veja o que aparece ;7-Modifique para criar o seu projeto ; Versão de 20/10/2009 ; Corrigido erro de arredondamento na rotina line. ;INICIO DA FUNÇÃO segment code ..start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,stacktop ; salvar modo corrente de video(vendo como está o modo de video da maquina) mov ah,0Fh int 10h mov [modo_anterior],al ; alterar modo de video para gráfico 640x480 16 cores mov al,12h mov ah,0 int 10h ;desenhar retas mov byte[cor],branco_intenso ;antenas mov ax,20 push ax mov ax,400 push ax mov ax,620 push ax mov ax,400 push ax -1-

Upload: jeffzm

Post on 12-Jul-2015

225 views

Category:

Education


1 download

TRANSCRIPT

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

;*******************************************************************************;; FUNÇÃO GRÁFICA ;;*******************************************************************************;;Essa função permite ao usuário plotar círculos, retas e escrever caracteres;na tela do computador. Ela foi criada pelo Professor Paulo Amaral, para auxiliar;os alunos no laboratório de microprocessadores da Universidade Federal do ;Espírito Santo.

;PARA USÁ-LA;1-Copia esse arquivo e cole-o no bloco de notas. Salve como grafica.asm;2-Abra o Prompt de Comando e entre no diretório onde está o arquivo grafica.asm;3-Faça o download do arquivo linker + asm na página do professor Paulo Amaral ; http://www2.ele.ufes.br/~paulo/MicroprocessadoresI.htm , e extraia no diretorio; onde você salvou a função grafica.asm ;4-Depois compile usando o comando: nasm grafica.asm ;5-Depois vc deve linkar o arquivo com o comando: freelink grafica.obj;6-Agora é só executar: grafica.exe .Veja o que aparece;7-Modifique para criar o seu projeto

; Versão de 20/10/2009; Corrigido erro de arredondamento na rotina line.

;INICIO DA FUNÇÃO

segment code..start:

mov ax,datamov ds,axmov ax,stackmov ss,axmov sp,stacktop

; salvar modo corrente de video(vendo como está o modo de video da maquina)mov ah,0Fhint 10hmov [modo_anterior],al

; alterar modo de video para gráfico 640x480 16 coresmov al,12hmov ah,0int 10h

;desenhar retas

mov byte[cor],branco_intenso ;antenasmov ax,20push axmov ax,400push axmov ax,620push axmov ax,400push ax

-1-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

call line

mov byte[cor],marrom ;antenasmov ax,130push axmov ax,270push axmov ax,100push axmov ax,300push axcall line

mov ax,130push axmov ax,130push axmov ax,100push axmov ax,100push axcall line

;desenha circulos mov byte[cor],azul ;cabeçamov ax,200push axmov ax,200push axmov ax,100push axcall circle

mov byte[cor],verde ;corpomov ax,450push axmov ax,200push axmov ax,190push axcall circle

mov ax,100 ;circulos das antenaspush axmov ax,100push axmov ax,10push axcall circle

mov ax,100push axmov ax,300

-2-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

push axmov ax,10push axcall circle

mov byte[cor],vermelho ;circulos vermelhosmov ax,500push axmov ax,300push axmov ax,50push axcall full_circle

mov ax,500push axmov ax,100push axmov ax,50push axcall full_circle

mov ax,350push axmov ax,200push axmov ax,50push axcall full_circle

;escrever uma mensagem

mov cx,14 ;número de caracteresmov bx,0mov dh,0 ;linha 0-29mov dl,30 ;coluna 0-79mov byte[cor],azul

l4:call cursormov al,[bx+mens]call caracterinc bx ;proximo caracterinc dl ;avanca a colunainc byte [cor] ;mudar a cor para a seguinteloop l4

mov ah,08hint 21hmov ah,0 ; set video modemov al,[modo_anterior] ; modo anteriorint 10hmov ax,4c00hint 21h

-3-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

;***************************************************************************;; função cursor;; dh = linha (0-29) e dl=coluna (0-79)cursor:

pushfpush axpush bxpush cxpush dxpush sipush dipush bpmov ah,2mov bh,0int 10hpop bppop dipop sipop dxpop cxpop bxpop axpopfret

;_____________________________________________________________________________;; função caracter escrito na posição do cursor;; al= caracter a ser escrito; cor definida na variavel corcaracter:

pushfpush axpush bxpush cxpush dxpush sipush dipush bp

mov ah,9mov bh,0mov cx,1

mov bl,[cor]int 10h

pop bppop dipop sipop dxpop cxpop bxpop axpopf

-4-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

ret;_____________________________________________________________________________;; função plot_xy;; push x; push y; call plot_xy; (x<639, y<479); cor definida na variavel corplot_xy:

push bpmov bp,sppushfpush axpush bxpush cxpush dxpush sipush dimov ah,0chmov al,[cor]mov bh,0mov dx,479sub dx,[bp+4]mov cx,[bp+6]int 10hpop dipop sipop dxpop cxpop bxpop axpopfpop bpret 4

;_____________________________________________________________________________; função circle; push xc; push yc; push r; call circle; (xc+r<639,yc+r<479)e(xc-r>0,yc-r>0); cor definida na variavel corcircle:

push bpmov bp,sppushf ;coloca os flags na pilhapush axpush bxpush cxpush dxpush sipush di

mov ax,[bp+8] ; resgata xcmov bx,[bp+6] ; resgata ycmov cx,[bp+4] ; resgata r

mov dx,bxadd dx,cx ;ponto extremo superior

-5-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

push axpush dxcall plot_xy

mov dx,bxsub dx,cx ;ponto extremo inferiorpush axpush dxcall plot_xy

mov dx,axadd dx,cx ;ponto extremo direitapush dxpush bxcall plot_xy

mov dx,axsub dx,cx ;ponto extremo esquerdapush dxpush bxcall plot_xy

mov di,cxsub di,1 ;di=r-1mov dx,0 ;dx será a variável x. cx é a variavel y

;aqui em cima a lógica foi invertida, 1-r => r-1;e as comparações passaram a ser jl => jg, assim garante ;valores positivos para d

stay: ;loopmov si,dicmp si,0jg inf ;caso d for menor que 0, seleciona pixel superior (não salta)mov si,dx ;o jl é importante porque trata-se de conta com sinalsal si,1 ;multiplica por doi (shift arithmetic left)add si,3add di,si ;nesse ponto d=d+2*dx+3inc dx ;incrementa dxjmp plotar

inf:mov si,dxsub si,cx ;faz x - y (dx-cx), e salva em di sal si,1add si,5add di,si ;nesse ponto d=d+2*(dx-cx)+5inc dx ;incrementa x (dx)dec cx ;decrementa y (cx)

plotar:mov si,dxadd si,axpush si ;coloca a abcisa x+xc na pilhamov si,cx

-6-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

add si,bxpush si ;coloca a ordenada y+yc na pilhacall plot_xy ;toma conta do segundo octantemov si,axadd si,dxpush si ;coloca a abcisa xc+x na pilhamov si,bxsub si,cxpush si ;coloca a ordenada yc-y na pilhacall plot_xy ;toma conta do sétimo octantemov si,axadd si,cxpush si ;coloca a abcisa xc+y na pilhamov si,bxadd si,dxpush si ;coloca a ordenada yc+x na pilhacall plot_xy ;toma conta do segundo octantemov si,axadd si,cxpush si ;coloca a abcisa xc+y na pilhamov si,bxsub si,dxpush si ;coloca a ordenada yc-x na pilhacall plot_xy ;toma conta do oitavo octantemov si,axsub si,dxpush si ;coloca a abcisa xc-x na pilhamov si,bxadd si,cxpush si ;coloca a ordenada yc+y na pilhacall plot_xy ;toma conta do terceiro octantemov si,axsub si,dxpush si ;coloca a abcisa xc-x na pilhamov si,bxsub si,cxpush si ;coloca a ordenada yc-y na pilhacall plot_xy ;toma conta do sexto octantemov si,axsub si,cxpush si ;coloca a abcisa xc-y na pilhamov si,bxsub si,dxpush si ;coloca a ordenada yc-x na pilhacall plot_xy ;toma conta do quinto octantemov si,axsub si,cxpush si ;coloca a abcisa xc-y na pilhamov si,bxadd si,dxpush si ;coloca a ordenada yc-x na pilhacall plot_xy ;toma conta do quarto octante

cmp cx,dx

-7-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

jb fim_circle ;se cx (y) está abaixo de dx (x), termina jmp stay ;se cx (y) está acima de dx (x), continua no loop

fim_circle:pop dipop sipop dxpop cxpop bxpop axpopfpop bpret 8

;-----------------------------------------------------------------------------; função full_circle; push xc; push yc; push r; call full_circle; (xc+r<639,yc+r<479)e(xc-r>0,yc-r>0); cor definida na variavel corfull_circle:

push bpmov bp,sppushf ;coloca os flags na pilhapush axpush bxpush cxpush dxpush sipush di

mov ax,[bp+8] ; resgata xcmov bx,[bp+6] ; resgata ycmov cx,[bp+4] ; resgata r

mov si,bxsub si,cxpush ax ;coloca xc na pilhapush si ;coloca yc-r na pilhamov si,bxadd si,cxpush ax ;coloca xc na pilhapush si ;coloca yc+r na pilhacall line

mov di,cxsub di,1 ;di=r-1mov dx,0 ;dx será a variável x. cx é a variavel y

;aqui em cima a lógica foi invertida, 1-r => r-1;e as comparações passaram a ser jl => jg, assim garante ;valores positivos para d

stay_full: ;loopmov si,di

-8-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

cmp si,0jg inf_full ;caso d for menor que 0, seleciona pixel superior (não salta)mov si,dx ;o jl é importante porque trata-se de conta com sinalsal si,1 ;multiplica por doi (shift arithmetic left)add si,3add di,si ;nesse ponto d=d+2*dx+3inc dx ;incrementa dxjmp plotar_full

inf_full:mov si,dxsub si,cx ;faz x - y (dx-cx), e salva em di sal si,1add si,5add di,si ;nesse ponto d=d+2*(dx-cx)+5inc dx ;incrementa x (dx)dec cx ;decrementa y (cx)

plotar_full:mov si,axadd si,cxpush si ;coloca a abcisa y+xc na pilhamov si,bxsub si,dxpush si ;coloca a ordenada yc-x na pilhamov si,axadd si,cxpush si ;coloca a abcisa y+xc na pilhamov si,bxadd si,dxpush si ;coloca a ordenada yc+x na pilhacall line

mov si,axadd si,dxpush si ;coloca a abcisa xc+x na pilhamov si,bxsub si,cxpush si ;coloca a ordenada yc-y na pilhamov si,axadd si,dxpush si ;coloca a abcisa xc+x na pilhamov si,bxadd si,cxpush si ;coloca a ordenada yc+y na pilhacall line

mov si,axsub si,dxpush si ;coloca a abcisa xc-x na pilhamov si,bxsub si,cxpush si ;coloca a ordenada yc-y na pilhamov si,axsub si,dx

-9-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

push si ;coloca a abcisa xc-x na pilhamov si,bxadd si,cxpush si ;coloca a ordenada yc+y na pilhacall line

mov si,axsub si,cxpush si ;coloca a abcisa xc-y na pilhamov si,bxsub si,dxpush si ;coloca a ordenada yc-x na pilhamov si,axsub si,cxpush si ;coloca a abcisa xc-y na pilhamov si,bxadd si,dxpush si ;coloca a ordenada yc+x na pilhacall line

cmp cx,dxjb fim_full_circle ;se cx (y) está abaixo de dx (x), termina jmp stay_full ;se cx (y) está acima de dx (x), continua no loop

fim_full_circle:pop dipop sipop dxpop cxpop bxpop axpopfpop bpret 8

;-----------------------------------------------------------------------------;; função line;; push x1; push y1; push x2; push y2; call line; (x<639, y<479)line:

push bpmov bp,sppushf ;coloca os flags na pilhapush axpush bxpush cxpush dxpush sipush dimov ax,[bp+10] ; resgata os valores das coordenadasmov bx,[bp+8] ; resgata os valores das coordenadasmov cx,[bp+6] ; resgata os valores das coordenadasmov dx,[bp+4] ; resgata os valores das coordenadas

-10-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

cmp ax,cxje line2jb line1xchg ax,cxxchg bx,dxjmp line1

line2: ; deltax=0cmp bx,dx ;subtrai dx de bxjb line3xchg bx,dx ;troca os valores de bx e dx entre eles

line3: ; dx > bxpush axpush bxcall plot_xycmp bx,dxjne line31jmp fim_line

line31: inc bxjmp line3

;deltax <>0line1:; comparar módulos de deltax e deltay sabendo que cx>ax

; cx > axpush cxsub cx,axmov [deltax],cxpop cxpush dxsub dx,bxja line32neg dx

line32:mov [deltay],dxpop dx

push axmov ax,[deltax]cmp ax,[deltay]pop axjb line5

; cx > ax e deltax>deltaypush cxsub cx,axmov [deltax],cxpop cxpush dxsub dx,bxmov [deltay],dxpop dx

mov si,axline4:

push ax

-11-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

push dxpush sisub si,ax ;(x-x1)mov ax,[deltay]imul simov si,[deltax] ;arredondarshr si,1

; se numerador (DX)>0 soma se <0 subtraicmp dx,0jl ar1add ax,siadc dx,0jmp arc1

ar1: sub ax,sisbb dx,0

arc1:idiv word [deltax]add ax,bxpop sipush sipush axcall plot_xypop dxpop axcmp si,cxje fim_lineinc sijmp line4

line5: cmp bx,dxjb line7xchg ax,cxxchg bx,dx

line7:push cxsub cx,axmov [deltax],cxpop cxpush dxsub dx,bxmov [deltay],dxpop dx

mov si,bxline6:

push dxpush sipush axsub si,bx ;(y-y1)mov ax,[deltax]imul simov si,[deltay] ;arredondar

-12-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

shr si,1; se numerador (DX)>0 soma se <0 subtrai

cmp dx,0jl ar2add ax,siadc dx,0jmp arc2

ar2: sub ax,sisbb dx,0

arc2:idiv word [deltay]mov di,axpop axadd di,axpop sipush dipush sicall plot_xypop dxcmp si,dxje fim_lineinc sijmp line6

fim_line:pop dipop sipop dxpop cxpop bxpop axpopfpop bpret 8

;*******************************************************************segment data

cor db branco_intenso

; I R G B COR; 0 0 0 0 preto; 0 0 0 1 azul; 0 0 1 0 verde; 0 0 1 1 cyan; 0 1 0 0 vermelho; 0 1 0 1 magenta; 0 1 1 0 marrom; 0 1 1 1 branco; 1 0 0 0 cinza; 1 0 0 1 azul claro; 1 0 1 0 verde claro; 1 0 1 1 cyan claro; 1 1 0 0 rosa; 1 1 0 1 magenta claro

-13-

D:\UFES\MICRO_I\GRAFICA.ASM segunda-feira, 26 de outubro de 2009 13:35

; 1 1 1 0 amarelo; 1 1 1 1 branco intenso

preto equ 0azul equ 1verde equ 2cyan equ 3vermelho equ 4magenta equ 5marrom equ 6branco equ 7cinza equ 8azul_claro equ 9verde_claro equ 10cyan_claro equ 11rosa equ 12magenta_claro equ 13amarelo equ 14branco_intenso equ 15

modo_anterior db 0linha dw 0coluna dw 0deltax dw 0deltay dw 0mens db 'Funcao Grafica';*************************************************************************segment stack stack

resb 512stacktop:

-14-