Post on 12-Jul-2015
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-