[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]
{$R-}
UNIT FWrite;
(**) INTERFACE (**)
USES Crt;
VAR
ScreenWidth,
ScreenHeight : Byte;
PROCEDURE FastWrite(S : String; co, ro, at : Byte);
PROCEDURE FasterWrite(S:String; co, ro, at : Word);
PROCEDURE CheckWidthHeight;
(**) IMPLEMENTATION (**)
TYPE
WordArray = ARRAY[0..65520 DIV 2] OF Word;
VAR
Display : ^WordArray;
Crt_Cols : Word ABSOLUTE $0040:$004A;
Crt_Rows : Word ABSOLUTE $0040:$0084;
PROCEDURE FastWrite(S : String; co, ro, at : Byte);
VAR
Start, WordAttr : Word;
N : Byte;
BEGIN
Start:= pred(ro)*ScreenWidth + pred(co);
WordAttr := Word(At) SHL 8;
FOR N := 1 to length(S) 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 { These calculations }
SHL AL, 1 { get the initial offset }
MUL ScreenWidth { into the AX register }
ADD AX, co { }
DEC AX { }
MOV DI, Word(Display) { DI now points to the }
ADD DI, AX { starting offset. }
MOV AX, Word(Display+2)
MOV ES, AX { ES has video segment }
PUSH DS
LDS SI, S { DS:SI points to string }
XOR CX, CX
MOV CL, [SI] { String length in CX }
INC SI
MOV BH, Byte(At) { Attribute in BH }
@Loop:
MOVSB { Move a char to screen }
MOV ES:[DI], BH { .. and its attribute }
INC DI
Loop @Loop
POP DS
END;
PROCEDURE CheckWidthHeight;
BEGIN
ScreenWidth := Crt_Cols;
ScreenHeight := succ(Crt_Rows);
END;
(** INITIALIZATION **)
BEGIN
CheckWidthHeight;
IF LastMode = 7 THEN
Display := Ptr($B000, 0)
ELSE Display := Ptr($B800, 0);
END.
[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]