DEMO.DESIGN
Frequently Asked Questions
 
оглавление | demo party в ex-СССР | infused bytes e-mag | новости от ib/news | другие проекты | письмо | win koi lat

следующий фpагмент (2)
- Demo/intro making and discussion (2:5030/84) ------------------ DEMO.DESIGN - Msg : 13024 of 13024 From : Dmitry Uvarov 2:5020/400 23 May 36 21:41:10 To : All 17 Apr 00 00:07:39 Subj : Re: textmode ------------------------------------------------------------------------------- > Пpисоединяюсь. От себя спpошу, как сделать _плавный_ скpоллинг в гpафическом > pежиме снизу ввеpх, а также спpава налево (бегущая стpока). Интеpесует также > на весь экpан. Вот, нашёл у себя старенький файлик... скроллинг в текстовом режиме + split screen А насчёт графического режима - если через VESA, то там функция специальная для этого есть, а если через VGA - то читай документацию... там специальные порты для этого дела есть... Regards, Dmitry. http://codexorg.webjump.com { Hardware Panning & Split Screen / VGA Text Mode 720x400 } uses Txt; { ДДДДДДДДДДДДДДД Split2Static ДДДДДДДДДДДДДДД } procedure Split2Static; var A:byte; begin A:=Port[$3DA]; { Attribute mode control } Port[$3C0]:=$10 or $20; Port[$3C0]:=Port[$3C1] or $20; end; { ДДДДДДДДДДДДДДД SplitScreen ДДДДДДДДДДДДДДД } procedure SplitScr(N:integer); { 1023..0 } var A:byte; begin { Screen-up is Start addr high/low, -down is $B800 } Port[$3D4]:=$18; Port[$3D5]:=Lo(N); { Bit 0-7, Line compare } Port[$3D4]:=$07; A:=Port[$3D5]; { Bit 8, Overflow } if N<$100 then A:=A and $EF else A:=A or $10; Port[$3D5]:=A; Port[$3D4]:=$09; A:=Port[$3D5]; { Bit 9, Maximum scan line } if N<$200 then A:=A and $BF else A:=A or $40; Port[$3D5]:=A; end; { ДДДДДДДДДДДДДДД SetSize ДДДДДДДДДДДДДДД } procedure SetSize(X,Y:integer); begin Port[$3D4]:=$13; Port[$3D5]:=X shr 1; MemW[0:$44A]:=X; MemW[0:$484]:=Y-1; MemW[0:$44C]:=X*Y; end; { ДДДДДДДДДДДДДДД SetTextDisplay ДДДДДДДДДДДДДДД } procedure SetTextDisp(X,Y:integer); var A:byte; begin while Port[$3DA] and 8=8 do; while Port[$3DA] and 8<>8 do; while Port[$3DA] and 1=1 do; while Port[$3DA] and 1<>1 do; Port[$3D4]:=$0C; Port[$3D5]:=Hi(Y shr 4*160+X div 9); { Start XY addr } Port[$3D4]:=$0D; Port[$3D5]:=Lo(Y shr 4*160+X div 9); Port[$3D4]:=$08; Port[$3D5]:=Port[$3D5] and $E0 or (Y and 15); A:=Port[$3DA]; { Horizental PEL } Port[$3C0]:=$13 or $20; Port[$3C0]:=(X+8) mod 9; end; { ДДДДДДДДДДДДДДД Scroll ДДДДДДДДДДДДДДД } procedure Scroll; var K,K2,X,Y,N:integer; begin VideoMode(3); TextWidth:=320; SetSize(160,50); TextBar(1,1,160,50,$1F,' '); TextBox(1,1,160,50,$1F,2); for K:=0 to 87 do PrintText(35*(K and 3)+10,2*(K shr 2)+4,$19+K mod 7, 'Hardware Panning...Smooth......'); PrintBig(47,10,8,16,$3F,'¦','Hardware',GetFontAddr(6)^); PrintBig(47,25,8,16,$3F,'¦','Panning',GetFontAddr(6)^); X:=0; Y:=0; K:=0; K2:=-1; N:=6; SplitScr(299); Split2Static; repeat SetTextDisp(X,Y); if KeyPressed then begin K:=Key; if K=K2 then K:=Key; K2:=K; end; case K of $4B00:Dec(X,N); $4D00:Inc(X,N); { Left,Right } $4800:Dec(Y,N); $5000:Inc(Y,N); { Up,Down } $4700:begin Dec(X,N); Dec(Y,N); end; { Home } $4F00:begin Dec(X,N); Inc(Y,N); end; { End } $4900:begin Inc(X,N); Dec(Y,N); end; { PgUp } $5100:begin Inc(X,N); Inc(Y,N); end; { PgDn } end; if X<0 then X:=0; if X>720 then X:=720; if Y<0 then Y:=0; if Y>500 then Y:=500; until (K=$011B) or (K=$1C0D); { Esc,Enter } SetTextDisp(0,0); VideoMode(3); end; begin Scroll; end.
следующий фpагмент (3)|пpедыдущий фpагмент (1)
Плавный поточечный scrolling в текстовом режиме в пределах одного знакоместа, ну а обобщить на произвольное число линий труда не составит. (* Sergey Andrianov *) function clock:longint; begin clock:=MemL[Seg0040:$6c]; end; const CrtP = $3d4; { Базовый номер порта контроллера ЭЛТ } {Устанавливает один из регистров VGA: P - Базовый адрес регистра New_v - новое значение,которое нужно записать в регистр, Mask - маска, Number - индекс регистра} Procedure SetVgaReg(P:word;New_V,Mask,Number:byte); Begin Inline($0FA);{ Cli - запрещает прерывания} Port[P] := Number; Port[P+1] := (Port[P+1] and (not Mask))or (New_V and Mask); Inline($0FB);{ Sti - разрешает прерывания} End; var b : byte; l : longint; begin for b := 0 to 25 do writeln('Строка текста номер ',b); l := clock; for b := 0 to 15 do begin while clock < l + 2 do; {задержка на 1/9 сек.} setvgareg(crtp,b,$1f,8); l := clock; end; for b := 15 downto 0 do begin while clock < l + 2 do; {задержка на 1/9 сек.} setvgareg(crtp,b,$1f,8); l := clock; end; end.

Всего 2 фpагмент(а/ов) |пpедыдущий фpагмент (2)

Если вы хотите дополнить FAQ - пожалуйста пишите.

design/collection/some content by Frog,
DEMO DESIGN FAQ (C) Realm Of Illusion 1994-2000,
При перепечатке материалов этой страницы пожалуйста ссылайтесь на источник: "DEMO.DESIGN FAQ, http://www.enlight.ru/demo/faq".