home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 18 / CD_ASCQ_18_111294_W.iso / dos / prg / pas / pasgraph / xmode1.pas < prev   
Pascal/Delphi Source File  |  1994-07-21  |  4KB  |  125 lines

  1. { Illustration on how VGA Write Mode 1 works }
  2. { by Andrew Golovin (2:5080/10@Fidonet)      }
  3. { Can be used at your own risk freely w/o    }
  4. { any charge                                 }
  5. {============================================}
  6. { PREFACE:                                   }
  7. { In VGA Write Mode 1 (VWM1) data stored in  }
  8. { Video Memory from Latch Register that can  }
  9. { be readed from VMem too. VWM1 can be used  }
  10. { in such application as Scrolling or        }
  11. { handling sprites placed in VMem            }
  12. { (on Unvisible Page).                       }
  13. { Some tricks with MaskBits can give you     }
  14. { many effects. I think that this code       }
  15. { can be used as basis for creating          }
  16. { 2ndReality alike plasma. ;)                }
  17.  
  18. var
  19.   OldMode: Byte;
  20.   X: Word;
  21.  
  22. procedure SetWriteMode(Wmode: Byte); assembler;
  23. asm
  24.   Mov     DX,3ceh
  25.   Mov     AL,5
  26.   Out     DX,AL
  27.   Inc     DX
  28.   In      AL,DX
  29.   And     AL,11111100b
  30.   Or      AL,WMode
  31.   Out     DX,AL
  32. end;
  33.  
  34. Procedure MaskPlanes(PlaneToMask: Byte); assembler;
  35. asm
  36.   Mov     DX,3c4h
  37.   Mov     AL,2
  38.   Out     DX,AL
  39.   Inc     DX
  40.   Mov     AL,PlaneToMask
  41.   Out     DX,AL
  42. End;
  43.  
  44. procedure Init320x200_X; assembler;
  45. asm
  46.   Mov AH,0fh; Int 10h; Mov [OldMode],al; Mov AX,13h; Int 10h;
  47.   Mov DX,3c4h; Mov AL,04h; Out DX,AL; Inc DX; In AL,DX; And AL,011110111b;
  48.   Or AL,000000100b; Out DX,AL; Dec DX; Mov AX,0f02h; Out DX,AX;
  49.   Mov AX,0a000h; Mov ES,AX; XOr DI,DI; XOr AX,AX; Mov CX,8000h;
  50.   ClD; RepNZ StoSW; Mov DX,3d4h; Mov AL,14h; Out DX,AL; Inc DX;
  51.   In AL,DX; And AL,010111111b; Out DX,AL; Dec DX; Mov AL,017h;
  52.   Out DX,AL; Inc DX; In AL,DX; Or AL,01000000b; Out DX,AL; Mov DX,3d4h;
  53.   Mov AX,80; ShR AX,1; Mov AH,AL; Mov AL,13h; Out DX,AX; Ret
  54. end;
  55.  
  56. procedure ScrollLineByLine; assembler;
  57.   asm
  58.     Push    DS
  59.     Mov     CX,200       { 200 lines on screen              }
  60.   @1:
  61.     Push    CX
  62.  
  63.     Mov     AX,0a000h    { all works is in Video Segment    }
  64.     Mov     DS,AX
  65.     Mov     ES,AX
  66.  
  67.     Mov     SI,80        { Source for scrolling is 2nd line }
  68.     XOr     DI,DI        { Destination - 1st line           }
  69.     Mov     CX,16000     { Copy all screen                  }
  70.     Rep     MovSB        { byte by byte                     }
  71.  
  72.     { You can try to implement another method of scrolling
  73.       For example - word by word
  74.  
  75.      Mov    CX,8000
  76.      Rep    MovSW
  77.  
  78.       Or by DWords (if you have 386 CPU)
  79.  
  80.      Mov    CX,4000
  81.      db     66h
  82.      Rep    MovSW
  83.  
  84.       This methods is much faster.
  85.       But i can't explain some video effects appearing on screen
  86.       May be you can explain it. I think this is my bug somewhere }
  87.  
  88.     Pop     CX
  89.     Loop    @1
  90.  
  91.     Pop     DS
  92.   end;
  93.  
  94. begin
  95.  { Only init 320x200x256 X-signed mode. Don't pay much attention }
  96.  Init320x200_x;
  97.  { Following lines uses VGA Write Mode 0 (as default) }
  98.  { Don't pay much attention on this code. It's only draws }
  99.  { some kind of picture on screen }
  100.  for X:=0 to 15999 do
  101.    Mem[$A000:X]:=(X mod 16)+32+(X div 320);
  102.  { Set VWM1 }
  103.  SetWriteMode(1);
  104.  { You can play a bit with parameters for MaskPalnes }
  105.  { Mask planes as 1010b. Only 4 lo-bits makes sence }
  106.  { This mask enable only even pixels scrolling }
  107.  MaskPlanes(10);
  108.  { Scroll even pixels }
  109.  ScrollLineByLine;
  110.  { Mask planes as 0101b. Only 4 lo-bits makes sence }
  111.  { This mask enable only odd pixels scrolling }
  112.  MaskPlanes(5);
  113.  { Scroll odd pixels }
  114.  ScrollLineByLine;
  115.  { Restore old CRTC mode }
  116.  asm Mov al,OldMode; XOr ah,ah; Int 10h end;
  117. end.
  118.  
  119. Andrew
  120.  
  121. -!- GaldED 2.42-
  122.  ! Origin:  The BEST! BBS Ekaterinburg\Russia +7-343-257-9848  (2:5080/10)
  123.  
  124.  
  125.