home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 18 / CD_ASCQ_18_111294_W.iso / dos / prg / pas / gfxfx / scrollup.pas < prev    next >
Pascal/Delphi Source File  |  1994-04-29  |  2KB  |  101 lines

  1.  
  2. {$g+}
  3. program scroll_up;
  4. uses crt;
  5. const
  6.   vidseg:word=$a000;
  7. type
  8.   str40=string[40];
  9. var
  10.   txtfile:text;
  11.   txt:array[1..100] of str40;
  12.   virscr:pointer;
  13.   virseg,fofs,fseg:word;
  14.  
  15. procedure getfont; assembler; asm
  16.   mov ax,1130h
  17.   mov bh,1
  18.   int 10h
  19.   mov fseg,es
  20.   mov fofs,bp
  21. end;
  22.  
  23. procedure setaddress(ad:word); assembler;
  24. asm
  25.   mov dx,3d4h
  26.   mov al,0ch
  27.   mov ah,[byte(ad)+1]
  28.   out dx,ax
  29.   mov al,0dh
  30.   mov ah,[byte(ad)]
  31.   out dx,ax
  32. end;
  33.  
  34. procedure retrace; assembler;
  35. asm
  36.   mov dx,3dah
  37.  @vert1:
  38.   in al,dx
  39.   test al,8
  40.   jnz @vert1
  41.  @vert2:
  42.   in al,dx
  43.   test al,8
  44.   jz @vert2
  45. end;
  46.  
  47. procedure moveup; assembler;
  48. asm
  49.   push ds
  50.   mov es,virseg
  51.   mov ds,virseg
  52.   xor di,di
  53.   mov si,320
  54.   mov cx,320*200/2
  55.   rep movsw
  56.   pop ds
  57. end;
  58.  
  59. procedure flip(src,dst:word); assembler;
  60. asm
  61.   push ds
  62.   mov ax,[dst]
  63.   mov es,ax
  64.   mov ax,[src]
  65.   mov ds,ax
  66.   xor si,si
  67.   xor di,di
  68.   mov cx,320*200/2
  69.   rep movsw
  70.   pop ds
  71. end;
  72.  
  73. var x,y:word;
  74. begin
  75.   getfont;
  76.   getmem(virscr,320*201);
  77.   virseg:=seg(virscr^);
  78.   asm
  79.     mov ax,13h
  80.     int 10h
  81.     mov es,virseg
  82.     xor di,di
  83.     xor ax,ax
  84.     mov cx,320*200/2
  85.     rep stosw
  86.   end;
  87.   assign(txtfile,'scrollup.pas');
  88.   reset(txtfile);
  89.   for y:=1 to 100 do readln(txtfile,txt[y]); { read 100 lines text }
  90.   y:=0;
  91.   repeat
  92.     retrace;
  93.     setaddress(y*80);
  94.     y:=1+y mod 2; if y=2 then moveup;
  95.     for x:=0 to 319 do mem[virseg:320*200+x]:=16+random(16);
  96.     flip(virseg,vidseg);
  97.   until keypressed;
  98.   freemem(virscr,320*201);
  99.   asm mov ax,3; int 10h; end;
  100. end.
  101.