Desenha um quadrado apartir de coordenadas de um ficheiro


Draw a square from the coordenates from a file


STACK SEGMENT PARA STACK
DB 64 DUP ('mystack')
STACK ENDS




MYDATA SEGMENT PARA 'DATA'
FILENAM DB '.\coord.txt',0
FHAND DW ?
NAMEFLD DB 1 DUP (' '),'$'
linha1 db 16 dup (' '), '$'

linha2 db 16 dup (' '), '$'
linha3 db 16 dup (' '), '$'
linha4 db 16 dup (' '), '$'
x1 dw 3
x2 dw 3
x3 dw 3
x4 dw 3
y1 dw 3
y2 dw 3
y3 dw 3
y4 dw 3
modo1 db 1 dup(' ')
modo2 db 1 dup(' ')
modo3 db 1 dup(' ')
modo4 db 1 dup(' ')
deslocamento1 db 1 dup(' ')
deslocamento2 db 1 dup(' ')
deslocamento3 db 1 dup(' ')
deslocamento4 db 1 dup(' ')
comprimento1 dw 3
comprimento2 dw 3
comprimento3 dw 3
comprimento4 dw 3
x dw 3
y dw 3
modo db 1 dup(' ')
deslocamento dw 3
comprimento dw 3
enters db ?
MYDATA ENDS


MYCODE SEGMENT PARA 'CODE'
MYPROC PROC FAR
ASSUME CS:MYCODE,DS:MYDATA,SS:STACK
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,MYDATA
MOV DS,AX
MOV ES,AX

call open
call readfirstlines
call closefil

lea si, linha1
call dividelinha
mov ax, x
mov x1,ax
sub ax,ax
mov ax, y
mov y1,ax
sub ax,ax
mov al, modo
mov modo1,al
sub ax,ax
mov ax, comprimento
mov comprimento1,ax
sub ax,ax
mov ax, deslocamento
mov deslocamento1,al
sub ax,ax

lea si, linha1
call dividelinha
mov ax, x
mov x2,ax
sub ax,ax
mov ax, y
mov y2,ax
sub ax,ax
mov al, modo
mov modo2,al
sub ax,ax
mov ax, comprimento
mov comprimento2,ax
sub ax,ax
mov ax, deslocamento
mov deslocamento2,al
sub ax,ax

lea si, linha3
call dividelinha
mov ax, x
mov x3,ax
sub ax,ax
mov ax, y
mov y3,ax
sub ax,ax
mov al, modo
mov modo3,al
sub ax,ax
mov ax, comprimento
mov comprimento3,ax
sub ax,ax
mov ax, deslocamento
mov deslocamento3,al
sub ax,ax

lea si, linha4
call dividelinha
mov ax, x
mov x4,ax
sub ax,ax
mov ax, y
mov y4,ax
sub ax,ax
mov al, modo
mov modo4,al
sub ax,ax
mov ax, comprimento
mov comprimento4,ax
sub ax,ax
mov ax, deslocamento
mov deslocamento4,al

sub ax,ax
sub bx,bx
sub cx,cx

mov cx, x1
mov dx, y1
mov bx, comprimento1
mov al, deslocamento1
cbw
push ax
push bx
push cx
push dx
cmp modo1, 2dh
je drawReverse1
call drawLine


lp1:
mov cx, x2
mov dx, y2
mov bx, comprimento2
mov al, deslocamento2
cbw
push ax
push bx
push cx
push dx
cmp modo2, 2dh
je drawReverse2
call drawLine


lp2:
mov cx, x3
mov dx, y3
mov bx, comprimento3
mov al, deslocamento3
cbw
push ax
push bx
push cx
push dx
cmp modo3, 2dh
je drawReverse3
call drawLine


lp3:
mov cx, x2
mov dx, y2
mov bx, comprimento3
mov al, deslocamento3
cbw
push ax
push bx
push cx
push dx
cmp modo3, 2dh
je drawReverse4
call drawLine

drawReverse1:
call drawReverseLine
jmp lp1

drawReverse2:
call drawReverseLine
jmp lp2

drawReverse3:
call drawReverseLine
jmp lp3

drawReverse4:
call drawReverseLine

MYPROC ENDP




OPEN proc near
mov ah, 3dh ;par‚metro de abertura
mov al, 0 ;Abre para leitura
lea dx, FILENAM ;Nome do ficheiro a abrir
int 21h ;abre
mov FHAND, ax
ret
OPEN endp

READFIRSTLINES PROC NEAR
LP:
mov ah,3fh ;par‚metro de leitura
lea dx, NAMEFLD ;carrega em dx o endereÁo do que est· a ser lido
mov cx, 1 ;para ler 1 bytes
mov bx, FHAND ;posiÁ„o onde estamos no ficheiro
int 21h ;invoca a interrupÁ„o 21h do dos
cmp ax, cx ;vÍ se È o fim do ficheiro,pois em ax est· o que falta ler
jne EOF


cmp NAMEFLD,0ah ;ve se È enter
je INCLINE ;se for incrementa

cmp enters, 0
je Saveline1

cmp enters, 1
je Saveline2

cmp enters, 2
je Saveline3

cmp enters, 3
je Saveline4
jmp lp
SAVELINE1:
mov al, namefld ;move para al o byte que esta a ser lido
cbw
mov x1[si], ax ;move para coordenadas o que esta em al
inc si ;incrementa o index
jmp LP ;lÍ o proximo byte

SAVELINE2:
mov al, namefld ;move para al o byte que esta a ser lido
mov linha2[si], al ;move para coordenadas o que esta em al
inc si ;incrementa o index
jmp LP ;lÍ o proximo byte
SAVELINE3:
mov al, namefld ;move para al o byte que esta a ser lido
mov linha3[si], al ;move para coordenadas o que esta em al
inc si ;incrementa o index
jmp LP ;lÍ o proximo byte
SAVELINE4:
mov al, namefld ;move para al o byte que esta a ser lido
mov linha4[si], al ;move para coordenadas o que esta em al
inc si ;incrementa o index
jmp LP ;lÍ o proximo byte
INCLINE: inc enters ;incrementa o n?mero de enters
sub si,si
jmp LP


EOF: RET
READFIRSTLINES ENDP


CLOSEFIL PROC near
PUSH AX
PUSH BX
MOV AH,3EH ;flag para fechar o ficheiro
MOV BX,FHAND
INT 21H
POP BX
POP AX
RET
CLOSEFIL ENDP

divideLinha proc near
lea dx, linha1
mov ah,09
int 21h
lea si, linha1
push bx
push cx
sub si,si ;coloca si a zero
sub ax,ax ;coloca ax a zero
add si, 3h ;limpa o lixo existente em si

guardaX:
mov cx,10 ;coloca 10 em cx para a multiplicaÁ„o
sub bx,bx
sub ax,ax
leX:
mov al, [si] ;move para al o caracter da string coordenadas correspondente ao index si
inc si
cmp al, 2ch ;verifica se È um espaÁo
je lex
cmp al,'0' ;verifica se È n?mero
jb lex
cmp al, '9' ;verifica se È n?mero
ja lex
sub al, 30h ;subtrai a al 30, para converter o numero
push ax
mov ax,bx
mul cx ;multiplica ax por cx
mov bx,ax
pop ax
xor ah,ah
add bx,ax
inc si ;incrementa o index
jmp leX

acabaX: mov ax,bx
inc si
mov x,ax ;Move para largura o valor de ax
sub ax,ax
jmp fim ;salta para a label guardaLargura

guardaY: mov cx,10
sub bx,bx
sub ax,ax
leY:
mov al, [si] ;move para al o caracter da string coordenadas correspondente ao index si
cmp al, 2ch ;verifica se È um espaÁo
je acabaY
cmp al,'0' ;verifica se È numero
jb acabaY
cmp al, '9' ;verifica se È numero
ja acabaY
sub al, 30h ;subtrai a al 30, para converter o numero
push ax
mov ax,bx
mul cx ;multiplica por cx
mov bx,ax
pop ax
sub ah,ah
add bx,ax
inc si ;incrementa o index
jmp leY
acabaY: mov ax,bx
inc si
mov y,ax
sub ax,ax
jmp guardacomp ;salta para guardaAltura

guardacomp:
mov cx,10 ;coloca 10 em cx para a multiplicaÁ„o
sub bx,bx
sub ax,ax
lecomp:
mov al, [si] ;move para al o caracter da string coordenadas correspondente ao index si
cmp al,2dh
je guardamodo
cmp al, 2ch ;verifica se È um espaÁo
je acabacomp
cmp al,'0' ;verifica se È n?mero
jb acabacomp
cmp al, '9' ;verifica se È n?mero
ja acabacomp
sub al, 30h ;subtrai a al 30, para converter o numero
push ax
mov ax,bx
mul cx ;multiplica ax por cx
mov bx,ax
pop ax
xor ah,ah
add bx,ax
inc si ;incrementa o index
jmp leX

acabacomp: mov ax,bx
inc si
mov x,ax ;Move para largura o valor de ax
sub ax,ax
jmp guardadesl
guardadesl:
mov al,[si]
cbw
mov deslocamento, ax
jmp fim


guardamodo:
mov modo,al
inc si
jmp lecomp


fim: ; Coloca na altura o valor de ax
mov x,ax
pop cx
pop bx
ret ;acaba o procedimento
divideLinha endp


CORES PROC NEAR
mov ah,0Fh ; function 0Fh - get current mode
int 10h ; Bios video service call
MOV AH, 00h ; prepara para definir o modo graf.
MOV AL, 13h ; modo graf. de 256 cores 320x200 color mode
INT 10h ; invoca a interrupÁ„o 10h da BIOS
MOV AH,11 ; prepara configuraÁ„o da palete de core
MOV BH,00 ; inicializa a cor de background
MOV BL,01 ; background azul
INT 10h ; invoca a interrupÁ„o 10h da BIOS
MOV AH,00 ; prepara configuraÁ„o da palete de cores
MOV BH,01 ; prepara configuraÁ„o do foreground
MOV BL,00 ; verde, vermelho e amarelo
INT 10h ; invoca a interrupÁ„o 10h da BIOS
ret
CORES ENDP


drawReverseLine proc near
pop dx
pop cx
pop bx
pop ax
sub si,si
cmp ax, 76h ;compara com v(ertical)
je coluna
linha:
MOV AL,02
MOV AH,12 ;configura INT10h para plot do pixel
INT 10h ;invoca a interrupÁ„o 10h da BIOS (desenha ponto)
dec cx ;incrementa coluna
inc si
mov comprimento, bx
CMP si,comprimento -1 ;linha feita ?
JLE linha ;se n„o for lÍ o proximo byte

;para desenhar a proxima linha
coluna:
MOV AL,02
MOV AH,12 ;configura INT10h para plot do pixel
INT 10h ;invoca a interrupÁ„o 10h da BIOS (desenha ponto)
dec cx ;incrementa coluna
inc si
mov comprimento, bx
CMP si,comprimento -1 ;linha feita ?
JLE coluna ;se n„o for lÍ o proximo byte
ret
drawReverseLine ENDP


drawLine proc near
pop dx
pop cx
pop bx
pop ax
sub si,si
cmp ax, 76h ;compara com v(ertical)
je coluna
linhad:
MOV AL,02
MOV AH,12 ;configura INT10h para plot do pixel
INT 10h ;invoca a interrupÁ„o 10h da BIOS (desenha ponto)
inc cx ;incrementa coluna
inc si
mov comprimento, bx
CMP si,comprimento -1 ;linha feita ?
JLE linhad ;se n„o for lÍ o proximo byte

;para desenhar a proxima linha
colunad:
MOV AL,02
MOV AH,12 ;configura INT10h para plot do pixel
INT 10h ;invoca a interrupÁ„o 10h da BIOS (desenha ponto)
inc dx ;incrementa linha
inc si
mov comprimento, bx
CMP si,comprimento -1
CMP si,bx ;linha feita ?
JLE colunad ;se n„o for lÍ o proximo byte
ret
drawLine ENDP

MYCODE ENDS
end

0 comentários:

Enviar um comentário