Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
473
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;Aluno: LEONARDO REIS DA SILVA
  2. ;Cartao: 00316357
  3.         .model  small
  4.         .stack
  5.  
  6. CR      equ     13
  7. LF      equ     10
  8. BS      equ     8
  9.  
  10.    
  11. .data
  12. BufferTec               db      12 dup (?),0
  13. Digite_o_nome           db      "Digite o nome do arquivo: ",0
  14. Nome_e_cartao           db      "************ Aluno: Leonardo Reis da Silva ****** Matricula: 316357 ************",CR,LF,0
  15. Nome_e_cartao_grafico           db      "************ Aluno: Leonardo Reis da Silva ****** Matricula: 316357 ************",0
  16. Contador_caracteres     dw      ?
  17. Programa_encerrado      db      CR,LF,"Programa encerrado por decisao do usuario",CR,LF,0
  18. Extensao_digitada       db      6   dup (?)
  19. Ponto_par               db      ".par",CR,LF,0
  20. Caract_temp1            db      1
  21. Caract_temp2            db      1
  22. Quebra                  db      CR,LF,"O nome do arquivo eh: "
  23. Arquivo_ok              db      CR,LF,"ARQUIVO SUCESSO",CR,LF,0
  24. Arquivo_nok             db      CR,LF,"OCORREU UM ERRO NA ABERTURA DO ARQUIVO.",CR,LF,0
  25. Tamanho_ladrilho        db      24
  26. String_ARQUIVO          db      "Arquivo ",0
  27. String_TOTAL            db      " - Total de ladrilhos por cor:",0
  28. Desenha_ate             db      24
  29. Coluna_ate              db      ?
  30. Linha_ate               db      ?
  31. Cor_temp                db      ?
  32. Cor_temp2               db      ?
  33. Lado_temp               db      ?
  34. Totalizador_x           db      0
  35. Totalizador_cor         db      0
  36. ;;totalizadores de ladrilhos
  37. PRETO                   db      ?
  38. AZUL                    db      ?
  39. VERDE                   db      ?
  40. CIANO                   db      ?
  41. VERMELHO                db      ?
  42. MAGENTA                 db      ?
  43. MARROM                  db      ?
  44. CINZA_CLARO             db      ?
  45. CINZA_ESCURO            db      ?
  46. AZUL_CLARO              db      ?
  47. VERDE_CLARO             db      ?
  48. CIANO_CLARO             db      ?
  49. VERMELHO_CLARO          db      ?
  50. MAGENTA_CLARO           db      ?
  51. AMARELO                 db      ?
  52.  
  53.  
  54.         .code
  55.  
  56.         .startup
  57.        
  58.         ;--------------------------------------------------
  59.         call limpa_tela ;chama funcao de limpar a tela(WIP)
  60.         ;--------------------------------------------------
  61.        
  62.         ;---------------------------------------------------
  63.         mov Contador_caracteres,0   ;move 0 para o contador do nome do arquivo(num de caracteres)
  64.         ;----------------------------------------------------
  65.        
  66.        
  67.         ;-------------------------------------------------------------------
  68.         lea bx,Nome_e_cartao        ;exibe nome do aluno e cartao
  69.         call printf_s               ;passa o parametro em bx e chama a rotina
  70.         ;-------------------------------------------------------------------
  71.    
  72.        
  73.     etapa2:
  74.    
  75.         lea bx,Digite_o_nome        ;pede o nome do arquivo
  76.         call printf_s               ;passa o parametro em bx e chama a rotina
  77.        
  78.         mov     cx,8            ;move 30 para cx(tamanho maximo do nome do arquivo)
  79.         lea     bx,BufferTec        ;move o inicio do buffer do teclado para bx
  80.         call    ReadString          ;chama rotina de ler string do teclado
  81.        
  82.         ;;PROBLEMA: CORRIGIR ERRO QUANDO STRING POSSUI BS E TEM EXATAMENTE 8 CARACTERES
  83.        
  84.         lea ax,BufferTec            ;carrega *BufferTec para ax
  85.         sub ax,5                    ;e ajusta o ponteiro
  86.         add ax,Contador_caracteres  ;para as 4 ultimas posicoes do nome do arquivo
  87.                                     ;que, talvez, sera a extensao .par
  88.         ;;FIM DO PROBLEMA
  89.        
  90.         lea bx, Extensao_digitada   ;move para bx o ponteiro que ira receber uma copiar
  91.         call printf_s
  92.        
  93.         call remove_extensao        ;dos 4 ultimos caracteres do nome do arq. e chama
  94.                                     ;a funcao que ira remover a extensao e copiar
  95.        
  96.        
  97.        
  98.        
  99.         lea bx, Extensao_digitada   ;move ponteiro para a extensao digitada
  100.         call compara_extensao       ;para bx, chama a funcao que verifica
  101.         cmp bx,1                    ;se o arquivo continha um .par
  102.         je possui_extensao
  103.         jmp chama_poe_extensao
  104.        
  105.                             ;;aqui eh caso nao possua extensao, tera que colocar
  106.        
  107.        
  108. possui_extensao:            ;;aqui eh caso possua extensao .par, nao precisa por
  109.        
  110.         jmp chama_abrir_arquivo
  111.    
  112.  
  113. chama_poe_extensao:
  114.    
  115.         lea si, BufferTec
  116.         call poe_extensao
  117.    
  118. chama_abrir_arquivo:
  119.        
  120.         lea dx, BufferTec ;;passa o nome do arquivo em dx
  121.         call abre_arquivo ;;chama a funcao de abertura do arquivo
  122.        
  123. etapa3:
  124.  
  125.         mov ah,0h           ;;chama tela grafica
  126.         mov al,12h          ;;640x480
  127.         int 10h             ;;chama interrupcao de gpu
  128.        
  129.         mov dl,0            ;;move cursor para
  130.         mov dh,0            ;;(0,0)
  131.         mov ah,02h         
  132.         mov bh,00h
  133.         int 10h             ;;chama interrupcao
  134.        
  135.         lea bx, Nome_e_cartao_grafico   ;;escreve dados do aluno
  136.         call printf_s                   ;;usando printf_s
  137.        
  138.        
  139.         mov  bx, 20
  140.         call desenha_linha_horizontal
  141.        
  142.         mov bx,  1
  143.         call moldura_vertical
  144.        
  145.         mov bx,  638
  146.         call moldura_vertical
  147.        
  148.        
  149.         mov bx, 380
  150.         call desenha_linha_horizontal
  151.        
  152.    
  153.         mov dl,0
  154.         mov dh,24
  155.         mov ah,02h
  156.         mov bh,00h
  157.         int 10h
  158.         lea bx, String_ARQUIVO
  159.         call printf_s
  160.         lea bx, BufferTec
  161.         call printf_s
  162.         lea bx, String_TOTAL
  163.         call printf_s
  164.    
  165.    
  166.         mov dl,0            ;;move cursor para
  167.         mov dh,81           ;;fora da tela
  168.         mov ah,02h          ;;para nao interferir
  169.         mov bh,00h          ;;na tela
  170.         int 10h             ;;chama interrupcao
  171.        
  172.         ;;desenha quadrados que ficarao com os totalizadores
  173.        
  174.         mov bl, Tamanho_ladrilho
  175.         mov cx, 5
  176.         mov dx, 420
  177.         mov al, 0
  178.         call quadrado_preenchido
  179.        
  180.        
  181.        
  182.         mov bl, Tamanho_ladrilho
  183.         mov cx, 60
  184.         mov dx, 420
  185.         mov al, 2
  186.         call quadrado_preenchido
  187.        
  188.        
  189.        
  190.         ;;lea bx,Quebra (MOSTRA SE ESTAVA CONCATENANDO)
  191.         ;;call printf_s
  192.         ;;lea bx,BufferTec
  193.         ;;call printf_s
  194.        
  195.        
  196.        
  197.        
  198.         ;;lea bx, Extensao_digitada teste funcao digitada
  199.         ;;call printf_s
  200.        
  201.        
  202.                
  203.  
  204.         ;cmp    [Extensao_digitada],"      "    ;ao finalizar leitura, compara de foi so 1 caractere
  205.         ;jne        termina                 ;se nao, continua
  206.         ;lea    bx,Programa_encerrado   ;caso sim, diz que o programa foi encerrado(pois so
  207.         ;call   printf_s                ;foi digitado enter)
  208.        
  209.        
  210.        
  211.        
  212.        
  213.        
  214.     termina:    
  215.         .exit
  216.  
  217.  
  218. ;--------------------------------------------------------------------
  219. ;quadrado_preenchido: desenha um quadrado preenchido
  220. ;em bx deve ser passado a dimensao do lado do quadrado
  221. ;em cx deve ser passado x do quadrado
  222. ;em dx deve ser passado y do quadrado
  223. ;em al deve ser passada a cor do quadrado
  224. ;Desenha um quadrado preenchido no metodo de "camadas"
  225. ;--------------------------------------------------------------------
  226. quadrado_preenchido proc near
  227.  
  228. mov Linha_ate, cl       ;salva x original do quadrado
  229. mov Coluna_ate, dl      ;salva y original do quadrado
  230. mov Lado_temp, bl       ;salva dimensao original do quadrado
  231.  
  232. mov Cor_temp2, al       ;move cor original do quadrado para uma variavel
  233. add Desenha_ate, cl     ;soma um offset do tamanho do quadrado na sua pos inicial x
  234.  
  235.  
  236. loop_quadrado:          ;;loop de desenho do quadrado
  237. call quadrado           ;;chama funcao de desenho
  238. mov al, Cor_temp2       ;;colocando a cor correta
  239. mov Cor_temp, al        ;;na variavel Cor_temp que sera usada para colorir o pixel
  240. inc cx                  ;;incrementa diagonalmente o desenho
  241. inc dx
  242. mov al, Desenha_ate    
  243. cmp cl, al
  244. je termina_quadrado
  245. dec bx                  ;;decrementa dimensao do quadrado
  246.  
  247.  
  248.  
  249.  
  250. jmp loop_quadrado
  251.  
  252. termina_quadrado:
  253.     mov cl, Linha_ate
  254.     mov dl, Coluna_ate
  255.     mov bl, Lado_temp
  256.     mov Cor_temp, 15
  257.     call quadrado
  258.     ret
  259.  
  260. quadrado_preenchido endp
  261. ;--------------------------------------------------------------------
  262.    
  263. ;--------------------------------------------------------------------
  264. ;Funcao: Desenha um quadrado na tela gráfica
  265. ;Entra: BX -> dimensão do LADO do quadrado
  266. ;       CX -> Lado esquerdo
  267. ;       DX -> Lado superior
  268. ;--------------------------------------------------------------------
  269. quadrado    proc    near
  270.  
  271.     call    retaH
  272.     call    retaV
  273.  
  274.     push    cx
  275.     add     cx,bx
  276.     call    retaV
  277.     pop     cx
  278.    
  279.     push    dx
  280.     add     dx,bx
  281.     call    retaH
  282.     pop     dx
  283.    
  284.     ret
  285. quadrado    endp
  286.  
  287.  
  288. ;--------------------------------------------------------------------
  289. ;Funcao: Desenha uma linha horizontal na tela grafica
  290. ;Entra: BX -> tamanho da reta
  291. ;       CX -> coluna de inicio
  292. ;       DX -> linha de inicio
  293. ;--------------------------------------------------------------------
  294. retaH   proc    near
  295.     push    bx
  296.     push    cx
  297.  
  298. loopRetaH:
  299.     call    setPixel
  300.     inc     cx
  301.     dec     bx
  302.     jnz     loopRetaH
  303.    
  304.     pop     cx
  305.     pop     bx
  306.     ret
  307. retaH   endp
  308.  
  309.  
  310. ;--------------------------------------------------------------------
  311. ;Funcao: Desenha uma linha vertical na tela grafica
  312. ;Entra: BX -> tamanho da reta
  313. ;       CX -> coluna de inicio
  314. ;       DX -> linha de inicio
  315. ;--------------------------------------------------------------------
  316. retaV   proc    near
  317.     push    bx
  318.     push    dx
  319.  
  320. loopRetaV:
  321.     call    setPixel   
  322.     inc     dx
  323.     dec     bx
  324.     jnz     loopRetaV
  325.    
  326.     pop     dx
  327.     pop     bx
  328.     ret
  329. retaV   endp
  330.  
  331. ;--------------------------------------------------------------------
  332. ;Função: Liga o bit das coordenadas dadas
  333. ;Entra:
  334. ;   DX - linha
  335. ;   CX - coluna
  336. ; Usar BIOS Write Pixel (INT 10H com AH=0CH)
  337. ; AL - Color to set (set bit 10000000b for XOR mode).
  338. ; BH - Video page number.
  339. ; CX - Pixel column number.
  340. ; DX - Pixel row number.
  341. ;--------------------------------------------------------------------
  342. SetPixel    proc    near
  343.     push    bx
  344.     push    cx
  345.     push    dx
  346.    
  347.     mov al,Cor_temp
  348.     mov bh,0
  349.     mov ah,0ch
  350.     int 10h
  351.    
  352.     pop     dx
  353.     pop     cx
  354.     pop     bx
  355.    
  356.     ret
  357. SetPixel    ENDP
  358. ;-------------------------------------------------------------------------------------
  359.  
  360. ;-------------------------------------------------------------------------------------
  361. ; moldura_vertical: desenha uma linha vertical da moldura branca na posicao x recebida
  362. ; em bx
  363. ;-------------------------------------------------------------------------------------
  364.  
  365. moldura_vertical proc near
  366.  
  367. mov dx, 20
  368. mov cx,bx
  369. mov ah, 0ch
  370. mov al, 15
  371. mov bh, 0
  372. loop_v:
  373.     int 10h
  374.     inc dx
  375.     cmp dx,380
  376.     jnz loop_v
  377.     ret
  378.  
  379. moldura_vertical endp
  380.  
  381.  
  382.  
  383.  
  384. ;--------------------------------------------------------------------
  385. ; desenha_linha_horizontal: desenha uma linha horizontal branca na posicao y recebida
  386. ; em bx
  387. ;--------------------------------------------------------------------
  388. desenha_linha_horizontal proc near
  389.  
  390. mov cx, 1
  391. mov dx,bx
  392. mov ah, 0ch
  393. mov al, 15
  394. mov bh, 0
  395. loop_h:
  396.     int 10h
  397.     inc cx
  398.     cmp cx,639
  399.     jnz loop_h
  400.     ret
  401.  
  402.  
  403. desenha_linha_horizontal endp      
  404.  
  405. ;--------------------------------------------------------------------
  406. ; abre_arquivo: dado uma string contendo o nome do arquivo em dx,
  407. ; abre o arquivo e devolve em ax o handle do arquivo(caso abra com sucesso)
  408. ; e abre tela grafica(o que significa que o arquivo foi aberto com sucesso)
  409. ; ou retorna mensagem de erro na tela caso houver algum erro na abertura
  410. ;--------------------------------------------------------------------
  411. abre_arquivo proc near
  412.  
  413.  
  414. mov ah, 3dh
  415. mov al, 0
  416. int 21h
  417.  
  418. jc abre_arquivo_erro
  419.  
  420. lea bx, Arquivo_ok
  421. call printf_s
  422.  
  423. ret
  424.  
  425. abre_arquivo_erro:
  426.  
  427.     lea bx, Arquivo_nok
  428.     call printf_s
  429.     jmp termina
  430.  
  431.  
  432. abre_arquivo endp  
  433. ;--------------------------------------------------------------------
  434. ;Função: Lê um string do teclado
  435. ;Entra: (S) -> DS:BX -> Ponteiro para o string
  436. ;       (M) -> CX -> numero maximo de caracteres aceitos
  437. ;--------------------------------------------------------------------
  438. ReadString  proc    near
  439.  
  440.         ;Pos = 0
  441.         mov     dx,0
  442.        
  443.  
  444. RDSTR_1:
  445.         ;while(1) {
  446.         ;   al = Int21(7)       // Espera pelo teclado
  447.         inc     Contador_caracteres
  448.         mov     ah,7
  449.         int     21H
  450.  
  451.         ;   if (al==CR) {
  452.         cmp     al,0DH
  453.         jne     RDSTR_A
  454.  
  455.         ;       *S = '\0'
  456.         mov     byte ptr[bx],0
  457.         ;       return
  458.         ret
  459.         ;   }
  460.  
  461. RDSTR_A:
  462.         ;   if (al==BS) {
  463.         cmp     al,08H
  464.         jne     RDSTR_B
  465.  
  466.         ;       if (Pos==0) continue;
  467.         cmp     dx,0
  468.         jz      RDSTR_1
  469.  
  470.         ;       Print (BS, SPACE, BS)
  471.         push    dx
  472.        
  473.         mov     dl,08H
  474.         mov     ah,2
  475.         int     21H
  476.        
  477.         mov     dl,' '
  478.         mov     ah,2
  479.         int     21H
  480.        
  481.         mov     dl,08H
  482.         mov     ah,2
  483.         int     21H
  484.        
  485.         pop     dx
  486.  
  487.         ;       --s
  488.         dec     bx
  489.         ;       ++M
  490.         inc     cx
  491.         ;       --Pos
  492.         dec     dx
  493.        
  494.         ;   }
  495.         jmp     RDSTR_1
  496.  
  497. RDSTR_B:
  498.         ;   if (M==0) continue
  499.         cmp     cx,0
  500.         je      RDSTR_1
  501.  
  502.         ;   if (al>=SPACE) {
  503.         cmp     al,' '
  504.         jl      RDSTR_1
  505.  
  506.         ;       *S = al
  507.         mov     [bx],al
  508.  
  509.         ;       ++S
  510.         inc     bx
  511.         ;       --M
  512.         dec     cx
  513.         ;       ++Pos
  514.         inc     dx
  515.  
  516.         ;       Int21 (s, AL)
  517.         push    dx
  518.         mov     dl,al
  519.         mov     ah,2
  520.         int     21H
  521.         pop     dx
  522.  
  523.         ;   }
  524.         ;}
  525.         jmp     RDSTR_1
  526.  
  527. ReadString  endp
  528.  
  529.  
  530.  
  531. ;
  532. ;--------------------------------------------------------------------
  533. ;Função: Escrever um string na tela
  534. ;--------------------------------------------------------------------
  535. printf_s    proc    near
  536.  
  537. ;   While (*s!='\0') {
  538.     mov     dl,[bx]
  539.     cmp     dl,0
  540.     je      ps_1
  541.  
  542. ;       putchar(*s)
  543.     push    bx
  544.     mov     ah,2
  545.     int     21H
  546.     pop     bx
  547.  
  548. ;       ++s;
  549.     inc     bx
  550.        
  551. ;   }
  552.     jmp     printf_s
  553.        
  554. ps_1:
  555.     ret
  556.    
  557. printf_s    endp
  558.  
  559.  
  560. limpa_tela proc near
  561.  
  562.  
  563.  
  564. mov ax, 0700h  ; function 07, AL=0 means scroll whole window
  565. mov bh, 07h    ; character attribute = white on black
  566. mov cx, 0000h ; row = 0, col = 0
  567. mov dx, 184fh  ; row = 24 (0x18), col = 79 (0x4f)
  568. int 10h        ; call BIOS video interrupt
  569.  
  570.  
  571.  
  572. ret
  573.  
  574. limpa_tela endp
  575.  
  576.  
  577. ;--------------------------------------------------------------------
  578.     ;remove_extensao
  579.     ;recebe em ax ponteiro para os 4 ultimos caracteres do nome do arquivo
  580.     ;recebe em bx o ponteiro para a string que ira copiar os 4 ultimos caracteres
  581.     ;nao devolve nada, apenas escreve os ultimos 4 caracteres - uma possivel extensao -
  582.     ;para o endereço contido no ponteiro em bx
  583.    
  584. ;--------------------------------------------------------------------
  585.  
  586. remove_extensao proc near
  587.  
  588.        
  589.         mov si, ax
  590.         mov cx, 6
  591. inicio_loop:
  592.         mov ah,[si]
  593.         mov [bx],ah
  594.         inc bx
  595.         inc si
  596.         dec cx
  597.         cmp cx, 0
  598.         jne inicio_loop
  599.         ret
  600.        
  601. remove_extensao endp
  602.  
  603. ;--------------------------------------------------------------------
  604. ; compara_extensao
  605. ; recebe em bx o ponteiro para a extensao digitada pelo usuario
  606. ; devolve bx = 0 se nao conter .par e bx = 1 se conter .par
  607. ;--------------------------------------------------------------------
  608. compara_extensao proc near
  609.  
  610.  
  611.         lea si,Ponto_par
  612.         mov cx, 4
  613.        
  614. loop_compara_extensao:
  615.         cmp [bx],8
  616.         jnz continua_compara_extensao
  617.         cmp [bx],13
  618.         jnz continua_compara_extensao
  619.         inc bx
  620.         jmp loop_compara_extensao
  621.        
  622. continua_compara_extensao:
  623.  
  624.         mov ah, [si]
  625.         mov Caract_temp1, ah
  626.         mov ah, [bx]
  627.         mov Caract_temp2, ah
  628.         inc bx
  629.         inc si
  630.         dec cx
  631.         mov ah, Caract_temp1
  632.         mov dh, Caract_temp2
  633.         cmp ah, dh
  634.         jne extensao_diferente
  635.         cmp cx, 0
  636.         jne loop_compara_extensao
  637.        
  638.         mov bx, 1
  639.         ret
  640.        
  641.         extensao_diferente:
  642.             mov bx, 0
  643.             ret
  644.            
  645. compara_extensao endp
  646.  
  647. ;------------------------------------------
  648. ; poe_extensao: dado um ponteiro para uma
  649. ; string em si, escreve .par nessa string
  650. ;------------------------------------------
  651. poe_extensao proc near
  652.  
  653. mov cx,8
  654.  
  655. loop_poe_extensao: 
  656.        
  657.         cmp [si], 32
  658.         jge continua_loop_extensao
  659.         jmp coloca_ponto_par
  660.        
  661. continua_loop_extensao:
  662.         dec cx
  663.         cmp cx,0
  664.         inc si
  665.         jne loop_poe_extensao
  666.        
  667.  
  668. coloca_ponto_par:
  669.         mov cx, 4
  670.         lea bx,Ponto_par
  671.        
  672. loop_coloca_ponto_par:
  673.         mov ax,[bx]
  674.         mov [si],ax
  675.         inc si
  676.         inc bx
  677.         dec cx
  678.         cmp cx,0
  679.         jne loop_coloca_ponto_par
  680.        
  681. ret
  682.  
  683. poe_extensao endp
  684.  
  685.  
  686. ;--------------------------------------------------------------------
  687.         end
  688. ;--------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement