home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / graph / tscroll.pas < prev    next >
Pascal/Delphi Source File  |  1994-10-07  |  3KB  |  89 lines

  1. Program defilement_mode_texte;
  2.  
  3. Uses ModeXLib,Crt;
  4.  
  5. Var x,                  {abscisse en pixels}
  6.     x_dir,              {direction horizontale }
  7.     y,                  {ordonnée en pixels }
  8.     y_dir:Word;         {direction verticale }
  9.  
  10. Procedure Wait_In_Display;assembler;
  11. {symétrique de Wait_In_Retrace, attend la génération
  12. de l'image par le rayon cathodique }
  13. asm
  14.   mov dx,3dah           {Input Status 1}
  15. @wait2:
  16.   in al,dx
  17.   test al,8h
  18.   jnz @wait2            {Image présente ? -> terminé }
  19. End;
  20. Procedure Wait_In_Retrace;assembler;
  21. {attend le retour de balayage vertical, réinitialise
  22. en même temps le flip-flop de l'ATC en effectuant
  23. un accès en lecture au registre Input Status 1 }
  24. asm
  25.   mov dx,3dah           {Input Status 1}
  26. @wait1:
  27.   in al,dx
  28.   test al,8h
  29.   jz @wait1             {balayage actif ? -> terminé }
  30. End;
  31.  
  32. Procedure FillScreen;
  33. {remplit la mémoire d'écran avec une image de test de 160*50 caractères}
  34. var i:word;
  35. Begin
  36.   For i:=0 to 160*50 do Begin   {boucle des caractères}
  37.     If i mod 10 <> 0 Then       {enregistrer le compteur de colonnes ?}
  38.       mem[$b800:i shl 1]:=      {non, alors '-'}
  39.         Ord('-') Else
  40.       mem[$b800:i shl 1]:=      {oui, numéro de colonne décompté en dizaines }
  41.       ((i mod 160) div 10) mod 10 + Ord('0');
  42.     If i mod 160 = 0 Then   {colonne 0 ? -> enregistre le compteur de lignes }
  43.       mem[$b800:i shl 1]:=(i div 160) mod 10 + Ord('0');
  44.   End;
  45. End;
  46. Procedure V_Pan(n:Byte);assembler;
  47. {exécute un panoramique vertical}
  48. asm
  49.   mov dx,3d4h                 {registre 8 du CRTC (Inittial Row Adress)}
  50.   mov al,8
  51.   mov ah,n                    {fixe le déplacement panoramique }
  52.   out dx,ax
  53. End;
  54. Procedure H_Pan(n:Byte);assembler;
  55. {exécute un panoramique horizontal  }
  56. asm
  57.   mov dx,3c0h                 {Index/Data Port de l'ATC}
  58.   mov al,13h or 32d           {sélectionne le registre 13 h (Horizontal Pixel Paning)}
  59.   out dx,al                   {met à 1 le bit 5 (Palette RAM Address Source)}
  60.   mov al,n                    { pour ne pas couper l'écran }
  61.   or al,32d                   {fixe le déplacement panoramique }
  62.   out dx,al
  63. End;
  64.  
  65. Begin
  66.   TextMode(3);          {mode 3 du BIOS (80*25 caractères, couleur)}
  67.   FillScreen;           {construit l'image de test }
  68.   portw[$3d4]:=$5013;   {double largeur d'écran virtuelle (160 caractères)}
  69.   x:=0;                 {initialise les coordonnées et directions }
  70.   x_dir:=1;
  71.   y:=0;
  72.   y_dir:=1;
  73.   Repeat
  74.     Inc(x,x_dir);       {déplacement horizontal et vertical }
  75.     Inc(y,y_dir);
  76.     If (x<=0) or (x>=80*9) {changement de direction au bord }
  77.       Then x_dir:=-x_dir;
  78.     if (y<=0) or (y>=25*16)
  79.       Then y_dir:=-y_dir;
  80.     Wait_in_Display;     {attend la génération de l'image }
  81.     SetStart((y div 16 *160)  {recale l'adresse de début (défilement grossier }
  82.       + x div 9);
  83.     Wait_in_Retrace;          {attend le retour de balayage }
  84.     V_Pan(y mod 16);          {panoramique vertical (défilement fin)}
  85.     H_Pan((x-1) mod 9);       {panoramique horizontal (défilement fin)}
  86.   Until KeyPressed;           {attend une frappe de touche }
  87.   TextMode(3);                {remet le mode vidéo normal }
  88. End.
  89.