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