{Hi Dudes... Dunno if you can do anything with this code; It sure is crappy! Anywayzz, this kinda looks nice on my computer but I'm not sure on how the timing will be on other systems... Might cause a helluvalot of flicker... Well, what can I say? Have Phun 8-)} Program LooksLikeSomeTextModeEffectsToMe_YeahIGuessSo; {$X+,E-,N-,I-,S-,R-,O-} Type BigChar=Array[1..3,1..3] of Byte; MoveRecord = Record XPos,YPos : Integer; XSpeed,YSpeed : Integer; Counter : Word; End; Const BigFont : Array[1..40] of BigChar = ( ((192,196,182),(195,196,191),(188,032,188)), {A} ((192,196,182),(195,196,191),(193,196,183)), {B} ((192,196,190),(187,032,032),(193,196,190)), {C} ((192,190,187),(187,032,187),(193,196,183)), {D} ((192,196,190),(195,190,032),(193,196,190)), {E} ((192,196,190),(195,190,032),(188,032,032)), {F} ((192,196,190),(187,194,182),(193,196,183)), {G} ((189,032,189),(195,196,191),(188,032,188)), {H} ((194,196,190),(032,187,032),(194,196,190)), {I} ((192,196,182),(195,196,191),(188,032,198)), {J} ((192,196,182),(195,196,191),(188,032,198)), {K} ((189,032,032),(187,032,032),(193,196,190)), {L} ((192,196,182),(187,189,187),(188,188,188)), {M} ((192,196,182),(187,032,187),(188,032,188)), {N} ((192,196,182),(187,032,187),(193,196,183)), {O} ((192,196,182),(187,032,187),(187,194,183)), {P} ((192,196,182),(195,196,191),(188,032,198)), {Q} ((192,196,182),(195,196,198),(188,032,197)), {R} ((192,196,190),(193,196,182),(194,196,183)), {S} ((194,196,190),(032,187,032),(032,188,032)), {T} ((189,032,189),(187,032,187),(193,196,183)), {U} ((189,032,187),(188,032,187),(194,196,183)), {V} ((189,189,189),(187,188,187),(193,196,183)), {W} ((189,032,189),(192,196,183),(188,032,187)), {X} ((189,032,189),(193,196,183),(032,188,032)), {Y} ((192,196,182),(195,196,191),(188,032,198)), {Z} ((032,032,032),(032,032,032),(185,185,185)), {...} ((032,187,032),(032,188,032),(032,185,032)), {!} ((192,196,182),(187,186,187),(193,196,183)), {0} ((194,182,032),(032,187,032),(194,196,190)), {1} ((194,196,182),(192,196,183),(193,196,190)), {2} ((194,196,182),(032,194,191),(194,196,183)), {3} ((189,032,189),(193,196,191),(032,032,188)), {4} ((192,196,190),(193,196,182),(194,196,183)), {5} ((192,196,190),(195,196,182),(193,196,183)), {6} ((194,196,182),(032,032,187),(032,032,188)), {7} ((192,196,182),(195,196,191),(193,196,183)), {8} ((192,196,182),(193,196,191),(194,196,183)), {9} ((032,032,032),(194,196,190),(032,032,032)), {-} ((032,032,032),(032,032,032),(032,032,032)));{ } ScrWidth : Word = 160; StartDat : Array[0..15] of Byte = (8,0,1,2,3,4,5,6,7,6,5,4,3,2,1,0); BarRes = 270; BarRad = 260 Div 2; Mes : String = ''; ScrollMessage : String = 'Hi there possoms! howst hanging. How about some simple TextMode Scroller. '; ScrollOfs : Byte = 9; ScrollPos : Byte = 0; CharOfs : Byte = 2; Var BarCols : Array[0..399] of Byte; Bars : Array[1..4] of Record StartCol : Byte; YPos : Integer; End; BarPos : Array[1..BarRes] of Integer; MyPal : Array[0..767] of Byte; MoveMes,MoveSplit : MoveRecord; Procedure CharMap; Assembler; Asm db 0,0,0,0,0,0,192,240,248,252,252,60,60,60,60,60 {¿} db 60,60,60,60,60,252,252,248,240,192,0,0,0,0,0,0 {Ù} db 24,60,60,60, 60,60,60,60, 60,60,60,24, 0,0,0,0 db 0,0,0,0, 60,126,255,255, 255,255,126,60, 0,0,0,0 db 96,240,240,248, 248,120,124,60, 60,62,30,31, 31,15,15,6 db 60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60 db 60,60,60,60,60,60,60,60,60,60,60, 24, 0,0,0,0 db 0,0,0,0, 24,60,60,60,60,60,60,60,60,60,60,60 db 0,0,0,0,0,0,254,255,255,254,0,0,0,0,0,0 {->} db 60,60,60,60,60,124,252,252,252,252,124,60,60,60,60,60 db 0,0,0,0,0,0,3,15,31,63,62,62,60,60,60,60 {Ú} db 60,60,60,60,62,62,63,31,15,3,0,0,0,0,0,0 {À} db 0,0,0,0,0,0,127,255,255,127,0,0,0,0,0,0 {<-} db 60,60,60,60,60,62,63,63, 63,63,62,60, 60,60,60,60 {Ã} db 0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0 {Ä} db 240,120,120,120,120,120,60,60, 60,60,60,24, 0,0,0,0 {\} db 60,60,60,60,60,252,252,248,240,224,224,240,240,240,240,240 End; Procedure SetCharset; Assembler; Asm Push Bp mov ax,cs { Set character set for logo } mov es,ax mov bp,cs:offset charmap mov ax,1100h mov bx,1000h mov cx,17 mov dx,182 int 10h Pop Bp End; Procedure Standard_Palette; Assembler; { DP ][ Ext. Compatible } Asm db 0,0,0,0,0,42,0,42,0,0,42,42,42,0,0,42,0,42,42,21,0,42,42 db 42,21,21,21,21,21,63,21,63,21,21,63,63,63,21,21,63,21,63,63,63,21,63 db 63,63,59,59,59,55,55,55,52,52,52,48,48,48,45,45,45,42,42,42,38,38,38 db 35,35,35,31,31,31,28,28,28,25,25,25,21,21,21,18,18,18,14,14,14,11,11 db 11,8,8,8,63,0,0,59,0,0,56,0,0,53,0,0,50,0,0,47,0,0,44 db 0,0,41,0,0,38,0,0,34,0,0,31,0,0,28,0,0,25,0,0,22,0,0 db 19,0,0,16,0,0,63,54,54,63,46,46,63,39,39,63,31,31,63,23,23,63,16 db 16,63,8,8,63,0,0,63,42,23,63,38,16,63,34,8,63,30,0,57,27,0,51 db 24,0,45,21,0,39,19,0,63,63,54,63,63,46,63,63,39,63,63,31,63,62,23 db 63,61,16,63,61,8,63,61,0,57,54,0,51,49,0,45,43,0,39,39,0,33,33 db 0,28,27,0,22,21,0,16,16,0,52,63,23,49,63,16,45,63,8,40,63,0,36 db 57,0,32,51,0,29,45,0,24,39,0,54,63,54,47,63,46,39,63,39,32,63,31 db 24,63,23,16,63,16,8,63,8,0,63,0,0,63,0,0,59,0,0,56,0,0,53 db 0,1,50,0,1,47,0,1,44,0,1,41,0,1,38,0,1,34,0,1,31,0,1 db 28,0,1,25,0,1,22,0,1,19,0,1,16,0,54,63,63,46,63,63,39,63,63 db 31,63,62,23,63,63,16,63,63,8,63,63,0,63,63,0,57,57,0,51,51,0,45 db 45,0,39,39,0,33,33,0,28,28,0,22,22,0,16,16,23,47,63,16,44,63,8 db 42,63,0,39,63,0,35,57,0,31,51,0,27,45,0,23,39,54,54,63,46,47,63 db 39,39,63,31,32,63,23,24,63,16,16,63,8,9,63,0,1,63,0,0,63,0,0 db 59,0,0,56,0,0,53,0,0,50,0,0,47,0,0,44,0,0,41,0,0,38,0 db 0,34,0,0,31,0,0,28,0,0,25,0,0,22,0,0,19,0,0,16,60,54,63 db 57,46,63,54,39,63,52,31,63,50,23,63,47,16,63,45,8,63,42,0,63,38,0 db 57,32,0,51,29,0,45,24,0,39,20,0,33,17,0,28,13,0,22,10,0,16,63 db 54,63,63,46,63,63,39,63,63,31,63,63,23,63,63,16,63,63,8,63,63,0,63 db 56,0,57,50,0,51,45,0,45,39,0,39,33,0,33,27,0,28,22,0,22,16,0 db 16,63,58,55,63,56,52,63,54,49,63,53,47,63,51,44,63,49,41,63,47,39,63 db 46,36,63,44,32,63,41,28,63,39,24,60,37,23,58,35,22,55,34,21,52,32,20 db 50,31,19,47,30,18,45,28,17,42,26,16,40,25,15,39,24,14,36,23,13,34,22 db 12,32,20,11,29,19,10,27,18,9,23,16,8,21,15,7,18,14,6,16,12,6,14 db 11,5,10,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,49,10,10,49,19,10,49,29,10,49,39,10,49,49,10,39,49 db 10,29,49,10,19,49,10,10,49,12,10,49,23,10,49,34,10,49,45,10,42,49,10 db 31,49,10,20,49,11,10,49,22,10,49,33,10,49,44,10,49,49,10,43,49,10,32 db 49,10,21,49,10,10,63,63,63 End; Function KeyPressed : Boolean; Assembler; Asm Mov Ah,0Bh Int 21h End; Procedure WriteBigMessage(X,Y,Color:Byte; Message:String); Var B,D : Byte; ScrOfs : Word; Const TransTab : Array[0..255] of Byte = (32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, {15} 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, {31} 40,28,32,32,32,32,32,32,32,32,32,32,32,39,27,32, {47} 29,30,31,32,33,34,35,36,37,38,32,32,32,32,32,32, {63} 32, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, {79} 16,17,18,19,20,21,22,23,24,25,26,32,32,32,32,32, {95} 32, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, {111} 16,17,18,19,20,21,22,23,24,25,26,32,32,32,32,32, {127} 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32); Begin Mes:=Message; D:=Length(Mes); If D=0 then Exit; ScrOfs:=(Y-1)*ScrWidth+2*X+2; Asm Mov Ax,$B800 { Set starting address on screen } Mov Es,Ax Mov Di,ScrOfs Mov B,1 { Start with first character ;-) } @StringLoop: Xor Bh,Bh Mov Bl,B Mov Al,Ds:[Offset Mes+Bx] { Get Next Character from String } Mov Bx,Offset TransTab XLat { And translate into real value } Dec Al Mov Bl,9 Mul Bl Mov Si,Offset BigFont { Character offset in Font-Table } Add Si,Ax Mov Ah,Color Mov Dx,3 @FontColumn: { Loop three Rows... } Mov Cx,3 @FontRow: { and three columns } LodsB StosW Loop @FontRow Add Di,ScrWidth Sub Di,6 Dec Dx Jnz @FontColumn Mov Ax,3 { prepare screen address for next character } Mul ScrWidth Sub Di,Ax Add Di,8 Inc B Mov Al,D Cmp B,Al Jng @StringLoop End; End; Procedure WriteCenteredBig(Y,Color:Byte; Message:String); Begin WriteBigMessage(((ScrWidth Div 4)+2)-(Length(Message)*2),Y,Color,Message); End; Procedure MakePal; Var A:Word; Begin For A:=0 to 255 do Begin Mypal[A]:=Mem[Seg(Standard_Palette):Ofs(Standard_Palette)+A*3]; Mypal[A+256]:=Mem[Seg(Standard_Palette):Ofs(Standard_Palette)+A*3+1]; Mypal[A+512]:=Mem[Seg(Standard_Palette):Ofs(Standard_Palette)+A*3+2]; End; End; Procedure SetupBars; Var V : Integer; Begin For V:=1 To BarRes Do BarPos[V]:=Round(BarRad*Sin((2*Pi/BarRes)*V))+BarRad+1; For V:=1 to 4 do With Bars[V] do Begin StartCol:=V*16; if v=3 then startcol:=96; if v=4 then startcol:=144; if v=5 then startcol:=160; YPos:=14*V; End; For V:=304 to 319 do Barcols[V]:=(15-(V mod 16))+160; For V:=320 to 335 do Barcols[V]:=V mod 16+160; End; Procedure UpdateBars; Var V,U,Y : Integer; Begin For V:=1 To 4 do For U:=0 to 31 do BarCols[barpos[Bars[V].YPos]+U]:=0; For V:=1 To 4 do Begin Inc(Bars[V].YPos); If Bars[V].YPos>BarRes then Bars[V].YPos:=1; Y:=BarPos[Bars[V].YPos]; For U:=0 to 15 do BarCols[Y+U]:=Bars[V].StartCol+15-U; For U:=16 to 31 do BarCols[Y+U]:=Bars[V].StartCol+U-16; End; End; Procedure ColorBars; Assembler; Asm MOV DX,$03DA In AL,DX MOV DX,$03C0 { assume color nr 0 = default Text background.. } MOV AL,$20+0 { set color nr 0 .. } OUT DX,AL MOV AL,0 { .. to DAC color 0 } OUT DX,AL Xor SI,SI CLI MOV DX,$03DA MOV AH,8 @Wau: in AL,DX TEST AL,AH JNZ @Wau { wait Until out of retrace } @Wai: in AL,DX TEST AL,AH JZ @Wai { wait Until inside retrace } @Doline: STI Mov Bl,[Offset BarCols+Si] Mov Di,Offset MyPal Add Di,Bx MOV DX,$03C8 { point to DAC[0] } MOV AL,0 OUT DX,AL CLI MOV DX,$03DA @Whu: in AL,DX RCR AL,1 JC @Whu { wait Until out of horizontal retrace } @Whi: in AL,DX RCR AL,1 JNC @Whi { wait Until inside retrace } Inc Si { line counter } { prepare For color effect } MOV DX,$03C9 Mov Al,[Di] OUT DX,Al { Dynamic Red } Mov Al,[Di+256] OUT DX,AL { Dynamic Green } mov Al,[Di+512] OUT DX,AL { Dynamic Blue } CMP SI,296 { Paint just about 3/4 screen } JBE @doline STI End; PROCEDURE Split(Row:Integer); BEGIN ASM mov dx,$3d4 mov ax,row mov bh,ah mov bl,ah and bx,201h mov cl,4 shl bx,cl mov ah,al mov al,18h out dx,ax mov al,7 cli out dx,al inc dx in al,dx sti dec dx mov ah,al and ah,0efh or ah,bl mov al,7 out dx,ax mov al,9 cli out dx,al inc dx in al,dx sti dec dx mov ah,al and ah,0bfh shl bh,1 shl bh,1 or ah,bh mov al,9 out dx,ax END; END; Procedure FastWrite(Col,Row,Attrib:Byte; Str:String); Var MemPos : Word; A : Byte; Begin MemPos:=(Col*2)+(Row*ScrWidth)-ScrWidth-2; A:=Length(Str); For A:=1 to Length(Str) do Begin MemW[$B800:MemPos]:=Ord(Str[A])+Attrib*256; MemPos:=MemPos+2; End; End; Procedure CenterWrite(Y,Color:Byte;Mes:String); Begin FastWrite(41-((Length(Mes)-1) Div 2),Y,Color,Mes); End; Procedure CursorOff; Assembler; Asm Mov Ax,0100h Mov Cx,2000h Int 10h End; Procedure CursorOn; Assembler; Asm Mov Ax,0100h Mov Cx,0607h Int 10h End; Procedure ScrollText(Nr:Word); Assembler; Asm mov ax,nr mov cx,$40 mov es,cx mov cl,es:[$85] div cl mov cx,ax mov dx,es:[$63] push dx mov al,$13 cli out dx,al inc dx in al,dx sti mul cl shl ax,1 mov es:[$4e],ax pop dx mov cl,al mov al,$c out dx,ax mov al,$d mov ah,cl out dx,ax mov ah,ch mov al,8 out dx,ax End; Function ReadKey : Char; Assembler; Asm Mov Ah,07h Int 21h End; Procedure SetHorizOfs(Count:Byte); Var I : Byte; Begin I:=Port[$3DA]; Port[$3C0]:=$33; Port[$3C0]:=StartDat[Count Mod 16]; End; Procedure Sync; Assembler; Asm Mov Dx,3DAh @LoopIt: In Al,Dx Test Al,8 Jz @LoopIt End; Procedure DoubleWidth; Assembler; Asm Mov Dx,3D4h Mov Ax,5013h Out Dx,Ax Mov ScrWidth,320 End; Procedure SetPELReset; Assembler; Asm Mov Dx,3DAh In Al,Dx Mov Dx,3C0h Mov Al,30h Out Dx,Al Mov Al,2Ch Out Dx,Al End; Procedure SetView(X,Y:Word); Var PelPos:Byte; Begin PelPos:=StartDat[X Mod 9]; X:=(X Div 9)+(Y Div 16)*160; Asm Mov Dx,3D4h { Set Screen offset in bytes:} Mov Bx,X Mov Ah,Bh Mov Al,0Ch Out Dx,Ax Mov Ah,Bl Inc Al Out Dx,Ax Mov Al,8 { Set Y-Offset within Character-Row: } Mov Bx,Y And Bl,15 Mov Ah,Bl Out Dx,Ax Mov Dx,3C0h { Set X-Offset within Character-Column: } Mov Al,33h Out Dx,Al Mov Al,PelPos Out Dx,Al End; End; Procedure UpDateScroller; Begin If ScrollOfs=9 then Begin ScrollOfs:=0; Move(Mem[$B800:14*320+2],Mem[$B800:14*320],3*320-2); Inc(CharOfs); If CharOfs=4 then Begin Inc(ScrollPos); WriteBigMessage(84-CharOfs,15,14,ScrollMessage[ScrollPos]); If ScrollPos=Length(ScrollMessage) Then ScrollPos:=0; CharOfs:=0; End; End else Inc(ScrollOfs,9); SetHorizOfs(ScrollOfs); End; Begin CursorOff; FillChar(Mem[$B800:0000],4000,0); With MoveMes do Begin YPos:=110; YSpeed:=2; XPos:=40*8; XSpeed:=3; Counter:=0; End; With MoveSplit Do Begin YPos:=295; YSpeed:=2; End; DoubleWidth; SetPelReset; ScrollText(MoveMes.YPos); Split(MoveSplit.YPos); Setupbars; MakePal; SetCharSet; Sync; CenterWrite(1,14,#194'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ'#190); WriteBigMessage(1,2,4,'GAME - Gotta Get it!'); CenterWrite(5,14,#194'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ'#190); Repeat With MoveMes do Begin If (YPos>80) and (YPos<200) then Inc(YPos,YSpeed) else Begin YSpeed:=-YSpeed; YPos:=YPos+YSpeed; End; Counter:=1-Counter; If Odd(Counter) then Begin If (XPos<40*8) or (XPos>40*8+150) then XSpeed:=-XSpeed; Inc(XPos,XSpeed); End; End; With MoveSplit do Begin If (YPos>290) and (YPos<325) then Inc(YPos,YSpeed) else Begin YSpeed:=-YSpeed; YPos:=YPos+YSpeed; End; End; UpdateBars; ScrollText(MoveMes.YPos); UpDateScroller; Split(MoveSplit.YPos); ColorBars; Until KeyPressed; While KeyPressed do Readkey; Split(400); SetView(0,0); ScrollText(0); Asm Mov Ax,3 Int 10h End; FastWrite(1,1,15,'Bye from World of Wonders!'); Writeln; CursorOn; End.