home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / noyau / cadres.asm next >
Assembly Source File  |  1994-05-25  |  6KB  |  297 lines

  1. ;
  2. ;   Procédures de gestion d'écran en mode texte
  3. ;
  4. ;   EQUALIZER  - Art Of Code.
  5. ;
  6. ;             Avril 1992
  7. ;
  8.  
  9. .MODEL SMALL
  10. .286
  11.  
  12. .DATA
  13.  
  14.         Longueur DB 00
  15.         Largeur  DB 00
  16.  
  17. .CODE
  18.                 
  19.                 PUBLIC Trace_Cadre
  20. ;***************************************************************
  21. ;       Procédure de tracé de Cadres en mode texte 80*25
  22. ; *************************************************************
  23. ;  Ah=x1 Al=y1 Bh=x2 Bl=y2  Dl=Attribut
  24.  
  25. Trace_Cadre PROC
  26.         Push ES
  27.         PUSH DS
  28.         PushA                   ; On empile les registres
  29.  
  30.         Cmp Ah,01
  31.         JL Fin_Trace_Cadre
  32.         Cmp Ah,80
  33.         JG Fin_Trace_Cadre
  34.         Cmp Bh,80
  35.         JG Fin_Trace_Cadre
  36.         Cmp Bh,Ah
  37.         JL Fin_Trace_Cadre
  38.         Cmp Al,01
  39.         JL Fin_Trace_Cadre
  40.         Cmp Al,25
  41.         JG Fin_Trace_Cadre
  42.         Cmp Bl,25
  43.         JG Fin_Trace_Cadre
  44.         Cmp Bl,Al
  45.         Jl Fin_Trace_Cadre
  46.         Push BX
  47.     SUB Bh,Ah
  48.     SUB Bl,Al
  49.     INC Bl
  50.     CMP Bh,5
  51.     Jl Fin_Trace_Cadre2
  52.     CMP Bl,3
  53.     Jl Fin_Trace_Cadre2
  54.         POP  BX
  55.         JMP Suite
  56. Fin_Trace_Cadre:
  57.         JMP Fin_Cadre
  58. Fin_Trace_Cadre2:
  59.         POP BX
  60.         JMP Fin_Cadre
  61. Suite:
  62.         Push AX                 ; on sauve Ax
  63.         MOV  ax,0B800h          ; segment du Buffer Vidéo
  64.         MOV  ES,AX              ;
  65.         MOV  AX,@DATA           ; segment DATA
  66.         MOV  DS,AX
  67.         XOR  DI,DI              ; Di=0000h
  68.         POP AX
  69.         MOV  Dh,Dl
  70.         MOV  Dl,218             ; Caractère = ┌ 
  71.         PUSH BX                 ; On sauve BX et AX
  72.     SUB  bh,ah        ; On calcule la Longueur et la largeur
  73.     MOV  SI,OFFSET Longueur
  74.     MOV  DS:[SI],Bh
  75.     SUB  Bl,Al
  76.     MOV  SI,OFFSET Largeur
  77.     MOV  DS:[SI],Bl
  78.         POP  BX
  79.                                 ; On calcule DI
  80.         Xor DI,DI
  81.         DEC Al
  82.         DEC Ah
  83.         MOV BX,AX
  84.         MOV Bl,Bh
  85.         Xor Bh,Bh
  86.         ADD DI,BX
  87.         ADD DI,BX               ; Di=2*(x-1)
  88.         XOR ah,Ah               ; Ax=00yy
  89.         SAL  AX,5
  90.         MOV  BX,AX
  91.     SAL  AX,2
  92.         ADD  AX,BX
  93.         ADD  DI,AX
  94.     MOV  ES:[DI],DX
  95.         PUSH DI
  96.     add DI,2
  97.         MOV  Dl,196             ;─
  98.         MOV  SI,Offset Longueur
  99.     MOV  CX,DS:[SI]
  100.         XOR  Ch,Ch
  101.         DEC  CX
  102.         PUSH CX
  103.         MOV  AX,DX
  104.         CALL LIgne
  105.         POP CX
  106.         MOV Al,191              ;┐
  107.         STOSW
  108.         POP DI
  109.         MOV Dx,CX
  110.         MOV BX,Offset Largeur
  111.         MOV SI,BX
  112.     MOV CX,DS:[SI]
  113.         xor ch,ch
  114.         dec CX
  115.         cld
  116. Ligne2:
  117.         PUSH CX
  118.         ; Une Ligne
  119.         MOV AL,179              ;│
  120.         ADD DI,160
  121.         PUSH DI
  122.         stosw
  123.         Mov Al,20h              ;' '
  124.         MOV CX,Dx
  125.         Call Ligne
  126.         MOV AL,179              ;│
  127.         stosw
  128.         POP DI
  129.         POP CX
  130.         LOOP LIgne2
  131.         ; Fin de la ligne
  132.         MOV AL,192              ;└
  133.         ADD DI,160
  134.         STOSW
  135.         MOV AL,196              ;─
  136.         MOV CX,DX
  137.         CALL Ligne
  138.         MOV AL,217              ;┘
  139.         STOSW
  140.         POPA
  141.         Call Ombre
  142.         PushA
  143. Fin_Cadre:
  144.  
  145.         PopA
  146.         POP DS
  147.         POP ES
  148.         RET
  149. Trace_Cadre ENDP
  150.  
  151. Ombre:
  152.     PushA
  153.         Cmp Bh,80
  154.         JGE Ombre_Bas
  155.         
  156.         MOV DX,0B800h
  157.         MOV ES,DX
  158.         
  159.         PUSH AX
  160.         PUSH BX
  161.                                 ; On calcule DI
  162.         XOR DI,DI
  163.         MOV Bl,Bh
  164.         Xor Bh,Bh
  165.         ADD DI,BX
  166.         ADD DI,BX               ; Di=2*(x-1)
  167.         XOR ah,Ah               ; Ax=00yy
  168.         SAL  AX,5
  169.         MOV  BX,AX
  170.         SAL  AX,1
  171.         SAL  AX,1
  172.         ADD  AX,BX
  173.         ADD  DI,AX              ; Di=2*x+160*y
  174.  
  175.         POP BX
  176.         POP AX
  177.         INC DI                  ; Offset de l'octet d'attribut
  178.         MOV AX,@data
  179.         MOV DS,AX
  180.         MOV AX,Offset Largeur
  181.         MOV SI,AX
  182.     MOV CX,DS:[SI]
  183.         XOR Ch,Ch
  184.         MOV AX,0007h
  185. Ombre_Droite:
  186.     MOV ES:[DI],Al
  187.         ADD DI,160
  188.         LOOP Ombre_Droite
  189. Ombre_Bas:
  190.     POPA        ; On calcule DI
  191.     pusha
  192.         CMP Bl,25
  193.         JGE Fin_Ombre
  194.         XOR DI,DI
  195.         PUSH BX
  196.         PUSH AX
  197.         PUSH BX
  198.         POP  AX
  199.         POP  BX
  200.         MOV BL,BH
  201.         Xor Bh,Bh
  202.         ADD DI,BX
  203.         ADD DI,BX               ; Di=2*(x-1)
  204.         XOR ah,Ah               ; Ax=00yy
  205.         SAL  AX,5
  206.         MOV  BX,AX
  207.         SAL  AX,1
  208.         SAL  AX,1
  209.         ADD  AX,BX
  210.         ADD  DI,AX              ; Di=2*x+160*y
  211.         INC  DI
  212.  
  213.         POP BX
  214.         MOV AX,@DATA
  215.         MOV DS,AX
  216.         MOV AX,0B800h
  217.         MOV ES,AX
  218.         MOV AX,OFFSET Longueur
  219.         MOV SI,AX
  220.     MOV CX,DS:[SI]
  221.         XOR Ch,Ch
  222.         CMP Bh,80
  223.         Je Suite_Ombre_Bas
  224.         INC CX
  225. Suite_Ombre_Bas:
  226.         XOR Ch,Ch
  227.         MOV AX,0007h
  228. Boucle_Ombre_Bas:
  229.     MOV ES:[DI],Al
  230.         INC DI
  231.         INC DI
  232.         LOOP Boucle_Ombre_Bas
  233.  
  234. Fin_Ombre:
  235.         POPA
  236.         RET
  237.  
  238.  
  239. Ligne:
  240.         CLD
  241. boucle1:
  242.         STOSW
  243.         LOOP Boucle1
  244.         RET
  245.  
  246.                 PUBLIC Clear_Screen
  247.  
  248. Clear_Screen PROC
  249.         PUSHA
  250.  
  251.         PUSH ES
  252.         PUSH DS
  253.         MOV Al,176
  254.                 MOV ah,23
  255.                 MOV BX,0B800h
  256.                 MOV ES,BX
  257.                 XOR DI,DI
  258.                 MOV CX,80*25
  259.                 REP STOSW
  260.         POP DS
  261.         POP ES
  262.  
  263.         POPA
  264.         RET
  265. Clear_Screen ENDP
  266.  
  267.     PUBLIC Affiche_Chaine
  268.  
  269. ;   Affichage d'une chaine de caractères (sans attribut) terminée par 0
  270. ;   DS:SI = Chaine
  271. ;   DI = Destination à l'écran
  272. ;
  273. Affiche_Chaine PROC
  274.     PUSHA
  275.     PUSH ES
  276.  
  277.     mov ax,0B800h
  278.     mov es,ax
  279. affiche_chaine_suite:
  280.     mov al,BYTE PTR ds:[si]
  281.     or al,al
  282.     jz fin_affichage
  283.     stosb
  284.     inc di
  285.     inc si
  286.     jmp affiche_chaine_suite
  287. fin_affichage:
  288.  
  289.     POP ES
  290.     POPA
  291.     RET
  292. Affiche_Chaine ENDP
  293.  
  294. RET
  295.  
  296. END
  297.