Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Aluno: LEONARDO REIS DA SILVA
- ;Cartao: 00316357
- .model small
- .stack
- CR equ 13
- LF equ 10
- BS equ 8
- .data
- BufferTec db 12 dup (?),0
- Digite_o_nome db "Digite o nome do arquivo: ",0
- Nome_e_cartao db "************ Aluno: Leonardo Reis da Silva ****** Matricula: 316357 ************",CR,LF,0
- Nome_e_cartao_grafico db "************ Aluno: Leonardo Reis da Silva ****** Matricula: 316357 ************",0
- Contador_caracteres dw ?
- Programa_encerrado db CR,LF,"Programa encerrado por decisao do usuario",CR,LF,0
- Extensao_digitada db 6 dup (?)
- Ponto_par db ".par",CR,LF,0
- Caract_temp1 db 1
- Caract_temp2 db 1
- Quebra db CR,LF,"O nome do arquivo eh: "
- Arquivo_ok db CR,LF,"ARQUIVO SUCESSO",CR,LF,0
- Arquivo_nok db CR,LF,"OCORREU UM ERRO NA ABERTURA DO ARQUIVO.",CR,LF,0
- Tamanho_ladrilho db 24
- String_ARQUIVO db "Arquivo ",0
- String_TOTAL db " - Total de ladrilhos por cor:",0
- Desenha_ate db 24
- Coluna_ate db ?
- Linha_ate db ?
- Cor_temp db ?
- Cor_temp2 db ?
- Lado_temp db ?
- Totalizador_x db 0
- Totalizador_cor db 0
- ;;totalizadores de ladrilhos
- PRETO db ?
- AZUL db ?
- VERDE db ?
- CIANO db ?
- VERMELHO db ?
- MAGENTA db ?
- MARROM db ?
- CINZA_CLARO db ?
- CINZA_ESCURO db ?
- AZUL_CLARO db ?
- VERDE_CLARO db ?
- CIANO_CLARO db ?
- VERMELHO_CLARO db ?
- MAGENTA_CLARO db ?
- AMARELO db ?
- .code
- .startup
- ;--------------------------------------------------
- call limpa_tela ;chama funcao de limpar a tela(WIP)
- ;--------------------------------------------------
- ;---------------------------------------------------
- mov Contador_caracteres,0 ;move 0 para o contador do nome do arquivo(num de caracteres)
- ;----------------------------------------------------
- ;-------------------------------------------------------------------
- lea bx,Nome_e_cartao ;exibe nome do aluno e cartao
- call printf_s ;passa o parametro em bx e chama a rotina
- ;-------------------------------------------------------------------
- etapa2:
- lea bx,Digite_o_nome ;pede o nome do arquivo
- call printf_s ;passa o parametro em bx e chama a rotina
- mov cx,8 ;move 30 para cx(tamanho maximo do nome do arquivo)
- lea bx,BufferTec ;move o inicio do buffer do teclado para bx
- call ReadString ;chama rotina de ler string do teclado
- ;;PROBLEMA: CORRIGIR ERRO QUANDO STRING POSSUI BS E TEM EXATAMENTE 8 CARACTERES
- lea ax,BufferTec ;carrega *BufferTec para ax
- sub ax,5 ;e ajusta o ponteiro
- add ax,Contador_caracteres ;para as 4 ultimas posicoes do nome do arquivo
- ;que, talvez, sera a extensao .par
- ;;FIM DO PROBLEMA
- lea bx, Extensao_digitada ;move para bx o ponteiro que ira receber uma copiar
- call printf_s
- call remove_extensao ;dos 4 ultimos caracteres do nome do arq. e chama
- ;a funcao que ira remover a extensao e copiar
- lea bx, Extensao_digitada ;move ponteiro para a extensao digitada
- call compara_extensao ;para bx, chama a funcao que verifica
- cmp bx,1 ;se o arquivo continha um .par
- je possui_extensao
- jmp chama_poe_extensao
- ;;aqui eh caso nao possua extensao, tera que colocar
- possui_extensao: ;;aqui eh caso possua extensao .par, nao precisa por
- jmp chama_abrir_arquivo
- chama_poe_extensao:
- lea si, BufferTec
- call poe_extensao
- chama_abrir_arquivo:
- lea dx, BufferTec ;;passa o nome do arquivo em dx
- call abre_arquivo ;;chama a funcao de abertura do arquivo
- etapa3:
- mov ah,0h ;;chama tela grafica
- mov al,12h ;;640x480
- int 10h ;;chama interrupcao de gpu
- mov dl,0 ;;move cursor para
- mov dh,0 ;;(0,0)
- mov ah,02h
- mov bh,00h
- int 10h ;;chama interrupcao
- lea bx, Nome_e_cartao_grafico ;;escreve dados do aluno
- call printf_s ;;usando printf_s
- mov bx, 20
- call desenha_linha_horizontal
- mov bx, 1
- call moldura_vertical
- mov bx, 638
- call moldura_vertical
- mov bx, 380
- call desenha_linha_horizontal
- mov dl,0
- mov dh,24
- mov ah,02h
- mov bh,00h
- int 10h
- lea bx, String_ARQUIVO
- call printf_s
- lea bx, BufferTec
- call printf_s
- lea bx, String_TOTAL
- call printf_s
- mov dl,0 ;;move cursor para
- mov dh,81 ;;fora da tela
- mov ah,02h ;;para nao interferir
- mov bh,00h ;;na tela
- int 10h ;;chama interrupcao
- ;;desenha quadrados que ficarao com os totalizadores
- mov bl, Tamanho_ladrilho
- mov cx, 5
- mov dx, 420
- mov al, 0
- call quadrado_preenchido
- mov bl, Tamanho_ladrilho
- mov cx, 60
- mov dx, 420
- mov al, 2
- call quadrado_preenchido
- ;;lea bx,Quebra (MOSTRA SE ESTAVA CONCATENANDO)
- ;;call printf_s
- ;;lea bx,BufferTec
- ;;call printf_s
- ;;lea bx, Extensao_digitada teste funcao digitada
- ;;call printf_s
- ;cmp [Extensao_digitada]," " ;ao finalizar leitura, compara de foi so 1 caractere
- ;jne termina ;se nao, continua
- ;lea bx,Programa_encerrado ;caso sim, diz que o programa foi encerrado(pois so
- ;call printf_s ;foi digitado enter)
- termina:
- .exit
- ;--------------------------------------------------------------------
- ;quadrado_preenchido: desenha um quadrado preenchido
- ;em bx deve ser passado a dimensao do lado do quadrado
- ;em cx deve ser passado x do quadrado
- ;em dx deve ser passado y do quadrado
- ;em al deve ser passada a cor do quadrado
- ;Desenha um quadrado preenchido no metodo de "camadas"
- ;--------------------------------------------------------------------
- quadrado_preenchido proc near
- mov Linha_ate, cl ;salva x original do quadrado
- mov Coluna_ate, dl ;salva y original do quadrado
- mov Lado_temp, bl ;salva dimensao original do quadrado
- mov Cor_temp2, al ;move cor original do quadrado para uma variavel
- add Desenha_ate, cl ;soma um offset do tamanho do quadrado na sua pos inicial x
- loop_quadrado: ;;loop de desenho do quadrado
- call quadrado ;;chama funcao de desenho
- mov al, Cor_temp2 ;;colocando a cor correta
- mov Cor_temp, al ;;na variavel Cor_temp que sera usada para colorir o pixel
- inc cx ;;incrementa diagonalmente o desenho
- inc dx
- mov al, Desenha_ate
- cmp cl, al
- je termina_quadrado
- dec bx ;;decrementa dimensao do quadrado
- jmp loop_quadrado
- termina_quadrado:
- mov cl, Linha_ate
- mov dl, Coluna_ate
- mov bl, Lado_temp
- mov Cor_temp, 15
- call quadrado
- ret
- quadrado_preenchido endp
- ;--------------------------------------------------------------------
- ;--------------------------------------------------------------------
- ;Funcao: Desenha um quadrado na tela gráfica
- ;Entra: BX -> dimensão do LADO do quadrado
- ; CX -> Lado esquerdo
- ; DX -> Lado superior
- ;--------------------------------------------------------------------
- quadrado proc near
- call retaH
- call retaV
- push cx
- add cx,bx
- call retaV
- pop cx
- push dx
- add dx,bx
- call retaH
- pop dx
- ret
- quadrado endp
- ;--------------------------------------------------------------------
- ;Funcao: Desenha uma linha horizontal na tela grafica
- ;Entra: BX -> tamanho da reta
- ; CX -> coluna de inicio
- ; DX -> linha de inicio
- ;--------------------------------------------------------------------
- retaH proc near
- push bx
- push cx
- loopRetaH:
- call setPixel
- inc cx
- dec bx
- jnz loopRetaH
- pop cx
- pop bx
- ret
- retaH endp
- ;--------------------------------------------------------------------
- ;Funcao: Desenha uma linha vertical na tela grafica
- ;Entra: BX -> tamanho da reta
- ; CX -> coluna de inicio
- ; DX -> linha de inicio
- ;--------------------------------------------------------------------
- retaV proc near
- push bx
- push dx
- loopRetaV:
- call setPixel
- inc dx
- dec bx
- jnz loopRetaV
- pop dx
- pop bx
- ret
- retaV endp
- ;--------------------------------------------------------------------
- ;Função: Liga o bit das coordenadas dadas
- ;Entra:
- ; DX - linha
- ; CX - coluna
- ; Usar BIOS Write Pixel (INT 10H com AH=0CH)
- ; AL - Color to set (set bit 10000000b for XOR mode).
- ; BH - Video page number.
- ; CX - Pixel column number.
- ; DX - Pixel row number.
- ;--------------------------------------------------------------------
- SetPixel proc near
- push bx
- push cx
- push dx
- mov al,Cor_temp
- mov bh,0
- mov ah,0ch
- int 10h
- pop dx
- pop cx
- pop bx
- ret
- SetPixel ENDP
- ;-------------------------------------------------------------------------------------
- ;-------------------------------------------------------------------------------------
- ; moldura_vertical: desenha uma linha vertical da moldura branca na posicao x recebida
- ; em bx
- ;-------------------------------------------------------------------------------------
- moldura_vertical proc near
- mov dx, 20
- mov cx,bx
- mov ah, 0ch
- mov al, 15
- mov bh, 0
- loop_v:
- int 10h
- inc dx
- cmp dx,380
- jnz loop_v
- ret
- moldura_vertical endp
- ;--------------------------------------------------------------------
- ; desenha_linha_horizontal: desenha uma linha horizontal branca na posicao y recebida
- ; em bx
- ;--------------------------------------------------------------------
- desenha_linha_horizontal proc near
- mov cx, 1
- mov dx,bx
- mov ah, 0ch
- mov al, 15
- mov bh, 0
- loop_h:
- int 10h
- inc cx
- cmp cx,639
- jnz loop_h
- ret
- desenha_linha_horizontal endp
- ;--------------------------------------------------------------------
- ; abre_arquivo: dado uma string contendo o nome do arquivo em dx,
- ; abre o arquivo e devolve em ax o handle do arquivo(caso abra com sucesso)
- ; e abre tela grafica(o que significa que o arquivo foi aberto com sucesso)
- ; ou retorna mensagem de erro na tela caso houver algum erro na abertura
- ;--------------------------------------------------------------------
- abre_arquivo proc near
- mov ah, 3dh
- mov al, 0
- int 21h
- jc abre_arquivo_erro
- lea bx, Arquivo_ok
- call printf_s
- ret
- abre_arquivo_erro:
- lea bx, Arquivo_nok
- call printf_s
- jmp termina
- abre_arquivo endp
- ;--------------------------------------------------------------------
- ;Função: Lê um string do teclado
- ;Entra: (S) -> DS:BX -> Ponteiro para o string
- ; (M) -> CX -> numero maximo de caracteres aceitos
- ;--------------------------------------------------------------------
- ReadString proc near
- ;Pos = 0
- mov dx,0
- RDSTR_1:
- ;while(1) {
- ; al = Int21(7) // Espera pelo teclado
- inc Contador_caracteres
- mov ah,7
- int 21H
- ; if (al==CR) {
- cmp al,0DH
- jne RDSTR_A
- ; *S = '\0'
- mov byte ptr[bx],0
- ; return
- ret
- ; }
- RDSTR_A:
- ; if (al==BS) {
- cmp al,08H
- jne RDSTR_B
- ; if (Pos==0) continue;
- cmp dx,0
- jz RDSTR_1
- ; Print (BS, SPACE, BS)
- push dx
- mov dl,08H
- mov ah,2
- int 21H
- mov dl,' '
- mov ah,2
- int 21H
- mov dl,08H
- mov ah,2
- int 21H
- pop dx
- ; --s
- dec bx
- ; ++M
- inc cx
- ; --Pos
- dec dx
- ; }
- jmp RDSTR_1
- RDSTR_B:
- ; if (M==0) continue
- cmp cx,0
- je RDSTR_1
- ; if (al>=SPACE) {
- cmp al,' '
- jl RDSTR_1
- ; *S = al
- mov [bx],al
- ; ++S
- inc bx
- ; --M
- dec cx
- ; ++Pos
- inc dx
- ; Int21 (s, AL)
- push dx
- mov dl,al
- mov ah,2
- int 21H
- pop dx
- ; }
- ;}
- jmp RDSTR_1
- ReadString endp
- ;
- ;--------------------------------------------------------------------
- ;Função: Escrever um string na tela
- ;--------------------------------------------------------------------
- printf_s proc near
- ; While (*s!='\0') {
- mov dl,[bx]
- cmp dl,0
- je ps_1
- ; putchar(*s)
- push bx
- mov ah,2
- int 21H
- pop bx
- ; ++s;
- inc bx
- ; }
- jmp printf_s
- ps_1:
- ret
- printf_s endp
- limpa_tela proc near
- mov ax, 0700h ; function 07, AL=0 means scroll whole window
- mov bh, 07h ; character attribute = white on black
- mov cx, 0000h ; row = 0, col = 0
- mov dx, 184fh ; row = 24 (0x18), col = 79 (0x4f)
- int 10h ; call BIOS video interrupt
- ret
- limpa_tela endp
- ;--------------------------------------------------------------------
- ;remove_extensao
- ;recebe em ax ponteiro para os 4 ultimos caracteres do nome do arquivo
- ;recebe em bx o ponteiro para a string que ira copiar os 4 ultimos caracteres
- ;nao devolve nada, apenas escreve os ultimos 4 caracteres - uma possivel extensao -
- ;para o endereço contido no ponteiro em bx
- ;--------------------------------------------------------------------
- remove_extensao proc near
- mov si, ax
- mov cx, 6
- inicio_loop:
- mov ah,[si]
- mov [bx],ah
- inc bx
- inc si
- dec cx
- cmp cx, 0
- jne inicio_loop
- ret
- remove_extensao endp
- ;--------------------------------------------------------------------
- ; compara_extensao
- ; recebe em bx o ponteiro para a extensao digitada pelo usuario
- ; devolve bx = 0 se nao conter .par e bx = 1 se conter .par
- ;--------------------------------------------------------------------
- compara_extensao proc near
- lea si,Ponto_par
- mov cx, 4
- loop_compara_extensao:
- cmp [bx],8
- jnz continua_compara_extensao
- cmp [bx],13
- jnz continua_compara_extensao
- inc bx
- jmp loop_compara_extensao
- continua_compara_extensao:
- mov ah, [si]
- mov Caract_temp1, ah
- mov ah, [bx]
- mov Caract_temp2, ah
- inc bx
- inc si
- dec cx
- mov ah, Caract_temp1
- mov dh, Caract_temp2
- cmp ah, dh
- jne extensao_diferente
- cmp cx, 0
- jne loop_compara_extensao
- mov bx, 1
- ret
- extensao_diferente:
- mov bx, 0
- ret
- compara_extensao endp
- ;------------------------------------------
- ; poe_extensao: dado um ponteiro para uma
- ; string em si, escreve .par nessa string
- ;------------------------------------------
- poe_extensao proc near
- mov cx,8
- loop_poe_extensao:
- cmp [si], 32
- jge continua_loop_extensao
- jmp coloca_ponto_par
- continua_loop_extensao:
- dec cx
- cmp cx,0
- inc si
- jne loop_poe_extensao
- coloca_ponto_par:
- mov cx, 4
- lea bx,Ponto_par
- loop_coloca_ponto_par:
- mov ax,[bx]
- mov [si],ax
- inc si
- inc bx
- dec cx
- cmp cx,0
- jne loop_coloca_ponto_par
- ret
- poe_extensao endp
- ;--------------------------------------------------------------------
- end
- ;--------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement