[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]