{ ------------------------------------- } { Why does it flicker, when I scroll ?? } { ------------------------------------- } { Please excuse of posting a source, but I think it is easier to } { understand my source than understanding my english } { ------------------------------ CUT HERE ---------------------------------} { Scroll Up and Down with "."and ";" } { Most routines are nod made by me .. } { I got them from SWAG i think } { Nearly no documentation :) } uses crt; const rows=200; { Should be greater than 25, do see the problem } var i : integer; qc : char; qs : byte; Start : pointer absolute $b800:0; { Eine Zeile VOR dem sichtbaren Bereich } Blick : pointer absolute $b800:160; { Sichtbarer Bereich } txt : array[1..rows] of string[80]; procedure vretrace; assembler; { vertical retrace } asm mov dx,3dah @vert1: in al,dx test al,8 jz @vert1 @vert2: in al,dx test al,8 jnz @vert2 end; procedure VFine(y:byte);assembler; asm mov dx,03d4h mov ah,Y mov al,8 out dx,ax end; { Not needed by me... perhaps you'll need that } { procedure scroff(soffset:integer);assembler; asm cli mov dx,03d4h mov bx,soffset mov ah,bh mov al,00ch out dx,ax mov ah,bl inc al out dx,ax sti end; } procedure fasttext(x, y : word; col : byte; what : string);assembler; asm push ds dec [x] dec [y] mov ax, $b800 mov es, ax mov ax, [y] mov bl, 160 mul bl add ax, [x] add ax, [x] mov di, ax lds si, what cld lodsb xor ch, ch mov ah, [col] mov cl, al cmp cx, 0 jz @@2 @@1: lodsb stosw loop @@1 @@2: pop ds end; Function formatstr(kette:string;typ,laenge:byte):string; { These routines are not fast, but they are not important for me } { Wenn Typ=1 dann linksorientiert } { Typ=2 dann Mittig } { Typ=3 dann rechtsorientiert } begin if length(kette)>laenge then delete(kette,succ(laenge),length(kette)-laenge); Case typ of 1 : while length(kette)laenge then delete(kette,succ(laenge),1); end; { Schlecht programmiert, aber funktioniert ! } 3 : while length(kette)1 then fasttext (1,1,$0F,txt[pred(qs)]); vfine(15); dec(qs); end; function I2S(I: Longint): String; var S: string[11]; begin Str(I, S); s:=formatstr(s,3,3); I2S:=S; end; procedure make_text; { Creates virtual text .. only for testing purposes } var nn:byte; begin for nn:=1 to rows do begin txt[nn]:='Line '+i2s(nn)+': '+formatstr('ExampleTxt',random(3)+1,70); end; end; begin textattr := 15; clrscr; asm { Cursor Off } mov ah,01 mov ch,20h int 10h end; qs:=0; { Counts the number of current top line } make_text; { Create Virtul Text } fasttext(1,1,$0F,formatstr(' ',1,80)); { Make Blank first Line } for i:=2 to succ((ord(rows<=30)*rows)+(ord(rows>30)*30)) do BEGIN fasttext (1,i,$0F,txt[i-1]); END; for i := 0 to 15 do { Scroll a little bit down, to set } begin { the starting Screen to hmmm to that it is } vretrace; { working ... } vfine (i); end; while keypressed do readkey; repeat qc:=' '; if keypressed then begin qc:=readkey; if (qc='.') and ((qs+25)=1) then ScreenUp; end; until qc='q'; textmode(co80); end. { ------------------------------ CUT HERE ---------------------------------}