{$R-}
UNIT FWrite;
{ ************************************************************
Module: UNIT FWRITE
File : FWRITE.pas
Date : 23.9.94
Author: Rubenking
used units: crt
used files: none
2x faster Write-routines
************************************************************}
INTERFACE
var
ScreenWidth,
ScreenHeight : Byte;
Procedure FastWrite(S: String; co, ro, at: Byte);
Procedure FasterWrite(S: String; co, ro, at: Word);
Procedure CheckWidthHeight;
IMPLEMENTATION
uses crt;
Type
WordArray = Array[0..65520 DIV 2] of word;
VAR
Display :^WordArray;
Crt_Cols: Word ABSOLUTE $40:$4A;
Crt_Rows: Word ABSOLUTE $40:$84;
procedure FastWrite;
var
Start, WordAttr: Word;
N: Byte;
begin
Start:=pred(ro)*Screenwidth+pred(co);
wordAttr:=Word(At) shl 8;
for n:=1 to ord(S[0]) do
Display^[start+pred(N)]:=WordAttr+ord(S[N]);
end;
procedure FasterWrite(S: String; co, ro, at: word); assembler;
asm
mov ax, ro;
dec al;
shl al,1;
mul screenwidth;
add ax,co;
dec ax;
mov di,word(display);
add di, ax;
mov ax,word(Display+2);
mov es, ax;
push ds;
lds si,s;
xor cx,cx;
mov cl, [si];
inc si;
mov bh, Byte(At)
@Loop:
movsb;
mov es:[di], bh;
inc di;
loop @loop;
pop ds
end;
procedure checkwidthheight;
begin
ScreenWidth:=Crt_Cols;
ScreenHeight:=Succ(Crt_Rows);
end;
begin
CheckWidthHeight;
if LastMode = 7 then display:=PTR($B000,0)
else Display:=PTR($B800,0);
end.
               (
geocities.com/~franzglaser)