home *** CD-ROM | disk | FTP | other *** search
- {
- Sinusos Scroll
-
- Ez a rutin egy jól ismert szinuszosan rángatózó dot-scroll. Különlegessége
- az, hogy körülbelül a fél képernyôt kitölti, de szinte alig használ gépidôt.
- Ha megpróbálod lemérni a raszteridejét, a csík még nem is, vagy szinte alig
- látszik a képernyôn. Ezért a rutin kiválóan alkalmas intrókhoz, hiszen ezzel
- már meg van oldva a scroll problémája, és még egy csomó mindenre van idô. A
- rutin használ egy unit-ot, amelyet megtalálsz a forrással együtt a ┼NEWSRC.ZIP
- file-ban. A unit különben csak a betükészletet tartalmazza a
-
- FontX:Array[0..255,0..15] of byte
-
- tömbben.
-
- A müködési elve a következô:
-
- A rutin a 320x200x16-os üzemmódot használja, mert ebben kellôen nagyok a pi-
- xelek (de nem igényel nagy erôfeszítést az átírása más módokra). A ScrollKep
- tömbben vannak benn a képernyôn éppen kinn lévô pontok. Egy sorba 40 pont ke-
- rül, ha a tömb megfelelô eleme 0, akkor nincs pont, ha más, akkor van pont.
- Ahol van pont, akkor a videomemóriába beírjuk a PosBy értékét. Könnyen kiszá-
- mítható, hogy igy az írandó byte-ok száma csak 40*16=640 lesz. Ez az egész
- bagázs pedig úgy fog scrollozni, hogy minden lépésnél a PosBy értékét a SHL
- utasítással egyre balra forgatjuk, s mivel a PosBy értékét pakoljuk a video-
- memóriába, ezért fog scrollozni. Ha a PosBy túlcsodul, akkor a ScrollKep tar-
- talmát is mozgatjuk, s lám az egész tök frankón mûködik.
-
- Ime a forráskód :
-
- (Bocs, ha egy kicsit kevés a komment, de egy-két részrôl már én sem tudom pon-
- tosan, hogy mit csinál, s nem volt kedvem még egyszer átböngészni. :-)
- }
-
- Program SinusScroll;
-
- Uses Crt,FontInst;
-
- Const Szoveg:String = 'Thiz iz ö szkroll rutin báj kriszofkszíd. ';
- Th:Byte = 16;
-
- Var ScrollKep:Array[0..15,0..39] of Byte;
- SinTable:Array[0..355] of Byte;
- PosBy,SinPos,A,MaxChar,SPos,SBy:Byte;
-
- Procedure Scroll;Assembler;
- ASM
- PUSH DS
- MOV AX,0A000h
- MOV ES,AX
- MOV DI,40*20
- LEA SI,ScrollKep
- LEA BX,SinTable
- XOR CX,CX
- MOV CL,SinPos
- ADD BX,CX
- XOR CX,CX
-
- @E1:XOR AL,AL { Az elözôleg kirakott pontok törlése }
- STOSB
- INC SI
- INC CH
- CMP CH,40
- JB @E1
- XOR CH,CH
- MOV AL,[BX]
- ADD BX,2
- XOR AH,AH
- @F1:ADD DI,40
- INC AH { Hoppá! Ezt lehetett volna szorozni is, de
- most már nem írom át. LaMe RuLEz!!! }
- CMP AH,AL
- JB @F1
-
- INC CL
- CMP CL,16
- JB @E1
-
- LEA SI,ScrollKep
- MOV DI,40*20
- INC SinPos
- LEA BX,SinTable
- XOR CX,CX
- MOV CL,SinPos
- ADD BX,CX
- XOR CL,CL
-
- @C1:MOV AL,[SI] { Az új pontok kirakása }
- CMP AL,0
- JE @C2
- MOV AL,PosBy
- @C2:MOV ES:[DI],AL
- INC DI
- INC SI
- INC CH
- CMP CH,40
- JB @C1
- XOR CH,CH
- MOV AL,[BX]
- ADD BX,2
- XOR AH,AH
- @D1:ADD DI,40
- INC AH
- CMP AH,AL
- JB @D1
-
- INC CL
- CMP CL,16
- JB @C1
-
- SHL PosBy,1 { Forgatjuk a PosBy-t }
- JNC @X1 { Ha nem csordul túl, akkor nyomás @X1-re }
- OR PosBy,1 { Ha igen, akkor mozgatni a ScrollKep sorait }
-
- PUSHA
-
- XOR DX,DX
-
- PUSH ES
-
- PUSH DS
- POP ES
- @I1:LEA DI,ScrollKep { Bevallom innen már én sem emlékszem... }
- XOR AX,AX
- MOV AL,40
- MUL DL
- ADD DI,AX
- MOV SI,DI
- INC SI
- MOV CX,39
- REP MOVSB
- INC DL
- CMP DL,16
- JB @I1
-
- POP ES
-
- XOR CX,CX
-
- @T1:XOR AX,AX
- LEA BX,Szoveg
- MOV AL,SPos
- XLAT
- MUL Th
- ADD AX,CX
- LEA BX,FontX
- ADD BX,AX
- MOV DL,[BX]
- AND DL,SBy
- LEA BX,ScrollKep
- MOV AX,40
- MUL CL
- ADD AX,39
- ADD BX,AX
- MOV [BX],DL
-
- INC CL
- CMP CL,16
- JB @T1
-
- SHR SBy,1
- JNC @T3
- OR SBy,128
- INC SPos
- @T3:
- POPA
- @X1:
- POP DS
- END;
-
- Begin
- PosBy:=1;SinPos:=0;
- SPos:=1;SBy:=128;
- MaxChar:=Length(Szoveg);
- FillChar(ScrollKep,16*40,0);
- { A sinustábla feltöltése. Ha egy konstanssal
- töltjük fel, akkor nem lesz hullámzás :-( }
- For A:=0 to 255 do
- SinTable[A]:=Trunc(Sin(2*(360/255)*A*Pi/180)*Sin(2*(360/255)*A*Pi/180)*13);
- For A:=0 to 99 do SinTable[256+A]:=SinTable[A];
- ASM { 320x200x16-os mód bekapcsolása }
- MOV AX,000Dh
- INT 10h
- END;
- Port[$3c4]:=2;Port[$3c5]:=8;
- { A 4. bitmap írásának engedélyezése }
- { Szép szürke lesz!!! :-( }
- { Ha fehéret akarsz, akkor : }
- { Port[$3c4]:=2;Port[$3c5]:=15; }
- Repeat
- ASM { Raster-idôzítés }
- MOV DX,3DAh
- @W1:IN AL,DX
- TEST AL,8
- JNE @W1
- @W2:IN AL,DX
- TEST AL,8
- JE @W2
- END;
- Scroll;
- Until KeyPressed or (SPos>MaxChar);
- While KeyPressed do ReadKey;
- ASM { Szöveges mód visszakapcsolása }
- MOV AX,0003h
- INT 10h
- END;
- End. { Ez itten a vége, ni. }
-
-
-
-