home *** CD-ROM | disk | FTP | other *** search
/ CD-X 1 / cdx_01.iso / demodisc / tyrant / s_scr_2 / sinscrol.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1994-12-29  |  5.7 KB  |  211 lines

  1. {
  2.                                 Sinusos Scroll
  3.  
  4.   Ez a rutin egy jól ismert szinuszosan rángatózó dot-scroll. Különlegessége
  5. az, hogy körülbelül a fél képernyôt kitölti, de szinte alig használ gépidôt.
  6. Ha megpróbálod lemérni a raszteridejét, a csík még nem is, vagy szinte alig
  7. látszik a képernyôn. Ezért a rutin kiválóan alkalmas intrókhoz, hiszen ezzel
  8. már meg van oldva a scroll problémája, és még egy csomó mindenre van idô. A
  9. rutin használ egy unit-ot, amelyet megtalálsz a forrással együtt a ┼NEWSRC.ZIP
  10. file-ban. A unit különben csak a betükészletet tartalmazza a
  11.  
  12.    FontX:Array[0..255,0..15] of byte
  13.  
  14. tömbben.
  15.  
  16. A müködési elve a következô:
  17.  
  18. A rutin a 320x200x16-os üzemmódot használja, mert ebben kellôen nagyok a pi-
  19. xelek (de nem igényel nagy erôfeszítést az átírása más módokra). A ScrollKep
  20. tömbben vannak benn a képernyôn éppen kinn lévô pontok. Egy sorba 40 pont ke-
  21. rül, ha a tömb megfelelô eleme 0, akkor nincs pont, ha más, akkor van pont.
  22. Ahol van pont, akkor a videomemóriába beírjuk a PosBy értékét. Könnyen kiszá-
  23. mítható, hogy igy az írandó byte-ok száma csak 40*16=640 lesz. Ez az egész
  24. bagázs pedig úgy fog scrollozni, hogy minden lépésnél a PosBy értékét a SHL
  25. utasítással egyre balra forgatjuk, s mivel a PosBy értékét pakoljuk a video-
  26. memóriába, ezért fog scrollozni. Ha a PosBy túlcsodul, akkor a ScrollKep tar-
  27. talmát is mozgatjuk, s lám az egész tök frankón mûködik.
  28.  
  29. Ime a forráskód :
  30.  
  31. (Bocs, ha egy kicsit kevés a komment, de egy-két részrôl már én sem tudom pon-
  32. tosan, hogy mit csinál, s nem volt kedvem még egyszer átböngészni. :-)
  33. }
  34.  
  35. Program SinusScroll;
  36.  
  37. Uses Crt,FontInst;
  38.  
  39. Const Szoveg:String = 'Thiz iz ö szkroll rutin báj kriszofkszíd.    ';
  40.       Th:Byte = 16;
  41.  
  42. Var ScrollKep:Array[0..15,0..39] of Byte;
  43.     SinTable:Array[0..355] of Byte;
  44.     PosBy,SinPos,A,MaxChar,SPos,SBy:Byte;
  45.  
  46. Procedure Scroll;Assembler;
  47.           ASM
  48.            PUSH DS
  49.            MOV AX,0A000h
  50.            MOV ES,AX
  51.            MOV DI,40*20
  52.            LEA SI,ScrollKep
  53.            LEA BX,SinTable
  54.            XOR CX,CX
  55.            MOV CL,SinPos
  56.            ADD BX,CX
  57.            XOR CX,CX
  58.  
  59.        @E1:XOR AL,AL           { Az elözôleg kirakott pontok törlése }
  60.            STOSB
  61.            INC SI
  62.            INC CH
  63.            CMP CH,40
  64.            JB @E1
  65.            XOR CH,CH
  66.            MOV AL,[BX]
  67.            ADD BX,2
  68.            XOR AH,AH
  69.        @F1:ADD DI,40
  70.            INC AH              { Hoppá! Ezt lehetett volna szorozni is, de
  71.                                  most már nem írom át. LaMe RuLEz!!! }
  72.            CMP AH,AL
  73.            JB @F1
  74.  
  75.            INC CL
  76.            CMP CL,16
  77.            JB @E1
  78.  
  79.            LEA SI,ScrollKep
  80.            MOV DI,40*20
  81.            INC SinPos
  82.            LEA BX,SinTable
  83.            XOR CX,CX
  84.            MOV CL,SinPos
  85.            ADD BX,CX
  86.            XOR CL,CL
  87.  
  88.        @C1:MOV AL,[SI]         { Az új pontok kirakása }
  89.            CMP AL,0
  90.            JE @C2
  91.            MOV AL,PosBy
  92.        @C2:MOV ES:[DI],AL
  93.            INC DI
  94.            INC SI
  95.            INC CH
  96.            CMP CH,40
  97.            JB @C1
  98.            XOR CH,CH
  99.            MOV AL,[BX]
  100.            ADD BX,2
  101.            XOR AH,AH
  102.        @D1:ADD DI,40
  103.            INC AH
  104.            CMP AH,AL
  105.            JB @D1
  106.  
  107.            INC CL
  108.            CMP CL,16
  109.            JB @C1
  110.  
  111.            SHL PosBy,1         { Forgatjuk a PosBy-t }
  112.            JNC @X1             { Ha nem csordul túl, akkor nyomás @X1-re }
  113.            OR PosBy,1          { Ha igen, akkor mozgatni a ScrollKep sorait }
  114.  
  115.            PUSHA
  116.  
  117.            XOR DX,DX
  118.  
  119.            PUSH ES
  120.  
  121.            PUSH DS
  122.            POP ES
  123.        @I1:LEA DI,ScrollKep    { Bevallom innen már én sem emlékszem... }
  124.            XOR AX,AX
  125.            MOV AL,40
  126.            MUL DL
  127.            ADD DI,AX
  128.            MOV SI,DI
  129.            INC SI
  130.            MOV CX,39
  131.            REP MOVSB
  132.            INC DL
  133.            CMP DL,16
  134.            JB @I1
  135.  
  136.            POP ES
  137.  
  138.            XOR CX,CX
  139.  
  140.        @T1:XOR AX,AX
  141.            LEA BX,Szoveg
  142.            MOV AL,SPos
  143.            XLAT
  144.            MUL Th
  145.            ADD AX,CX
  146.            LEA BX,FontX
  147.            ADD BX,AX
  148.            MOV DL,[BX]
  149.            AND DL,SBy
  150.            LEA BX,ScrollKep
  151.            MOV AX,40
  152.            MUL CL
  153.            ADD AX,39
  154.            ADD BX,AX
  155.            MOV [BX],DL
  156.  
  157.            INC CL
  158.            CMP CL,16
  159.            JB @T1
  160.  
  161.            SHR SBy,1
  162.            JNC @T3
  163.            OR SBy,128
  164.            INC SPos
  165.        @T3:
  166.            POPA
  167.        @X1:
  168.            POP DS
  169.           END;
  170.  
  171. Begin
  172.  PosBy:=1;SinPos:=0;
  173.  SPos:=1;SBy:=128;
  174.  MaxChar:=Length(Szoveg);
  175.  FillChar(ScrollKep,16*40,0);
  176.                            { A sinustábla feltöltése. Ha egy konstanssal
  177.                              töltjük fel, akkor nem lesz hullámzás :-( }
  178.  For A:=0 to 255 do
  179.   SinTable[A]:=Trunc(Sin(2*(360/255)*A*Pi/180)*Sin(2*(360/255)*A*Pi/180)*13);
  180.  For A:=0 to 99 do SinTable[256+A]:=SinTable[A];
  181.  ASM                       { 320x200x16-os mód bekapcsolása }
  182.    MOV AX,000Dh
  183.    INT 10h
  184.  END;
  185.  Port[$3c4]:=2;Port[$3c5]:=8;
  186.                            { A 4. bitmap írásának engedélyezése }
  187.                            { Szép szürke lesz!!! :-(            }
  188.                            { Ha fehéret akarsz, akkor :         }
  189.                            {   Port[$3c4]:=2;Port[$3c5]:=15;    }
  190.  Repeat
  191.     ASM                    { Raster-idôzítés }
  192.       MOV DX,3DAh
  193.   @W1:IN AL,DX
  194.       TEST AL,8
  195.       JNE @W1
  196.   @W2:IN AL,DX
  197.       TEST AL,8
  198.       JE @W2
  199.     END;
  200.   Scroll;
  201.  Until KeyPressed or (SPos>MaxChar);
  202.  While KeyPressed do ReadKey;
  203.  ASM                       { Szöveges mód visszakapcsolása }
  204.   MOV AX,0003h
  205.   INT 10h
  206.  END;
  207. End.                       { Ez itten a vége, ni. }
  208.  
  209.  
  210.  
  211.