[Back to SCREEN SWAG index]  [Back to Main SWAG index]  [Original]

{
 SG> Anybody know how to place a character at 80,25 in text mode without
 SG> scrolling the screen?  TIA
}

USES Crt;

var
  ScreenHeight : byte;   { screen height in characters (rows) }
  ScreenWidth : word;    { screen width in characters (columns) }
  Screen : pointer;      { screen pointer }

{ some usef00l routines }

Function ScrReadChar(X,Y : BYTE) : CHAR; assembler;
Asm
  LES DI,Screen
  XOR AH,AH
  MOV AL,Y
  DEC AX
  MUL ScreenWidth
  SHL AX,1
  XOR DH,DH
  MOV DL,X
  SHL DX,1
  DEC DX
  DEC DX
  ADD AX,DX
  MOV DI,AX
  MOV AL,BYTE PTR [ES:DI]
  {ScrReadChar := Char(Ptr(Seg(Screen^),
    (Y - 1) * ScreenWidth * 2 + (X * 2) - 2)^)}
End; { ScrReadChar }

Procedure ScrWriteChar(X,Y : BYTE; Ch : CHAR); assembler;
Asm
  LES DI,Screen
  XOR AH,AH
  MOV AL,Y
  DEC AX
  MUL ScreenWidth
  SHL AX,1
  XOR DH,DH
  MOV DL,X
  SHL DX,1
  DEC DX
  DEC DX
  ADD AX,DX
  MOV DI,AX
  MOV AL,Ch
  MOV BYTE PTR [ES:DI],AL
  {Char(Ptr(Seg(Screen^),
    (Y - 1) * ScreenWidth * 2 + (X * 2) - 2)^) := Ch}
End; { ScrWriteChar }

Function ScrReadAttr(X,Y : BYTE) : BYTE; assembler;
Asm
  LES DI,Screen
  XOR AH,AH
  MOV AL,Y
  DEC AX
  MUL ScreenWidth
  SHL AX,1
  XOR DH,DH
  MOV DL,X
  SHL DX,1
  DEC DX
  ADD AX,DX
  MOV DI,AX
  MOV AL,BYTE PTR [ES:DI]
  {ScrReadAttr := TTextAttr(Ptr(Seg(Screen^),
    (Y - 1) * ScreenWidth * 2 + (X * 2) - 1)^)}
End; { ScrReadAttr }

Procedure ScrWriteAttr(X,Y,Color : BYTE); assembler;
Asm
  LES DI,Screen
  XOR AH,AH
  MOV AL,Y
  DEC AX
  MUL ScreenWidth
  SHL AX,1
  XOR DH,DH
  MOV DL,X
  SHL DX,1
  DEC DX
  ADD AX,DX
  MOV DI,AX
  MOV AL,Color
  MOV BYTE PTR [ES:DI],AL
  {TTextAttr(Ptr(Seg(Screen^),
    (Y - 1) * ScreenWidth * 2 + (X * 2) - 1)^) := Color}
End; { ScrWriteAttr }

{ and finally in your program... }

Begin
  { initialize ScreenHeight, ScreenWidth and Screen... }
  if LastMode = Mono then
    Screen := Ptr($B000, 0) else Screen := Ptr($B800, 0);
  if (LastMode and Font8x8) <> 0 then
    ScreenHeight := Mem[$0040:$0084] else ScreenHeight := 25;
  ScreenWidth := MemW[$0040:$004A];

  { do whatever you want, for example: }
    ScrWriteChar(ScreenWidth, ScreenHeight, 'A');
    ScrWriteAttr(ScreenWidth, ScreenHeight, LightGray );

End.


[Back to SCREEN SWAG index]  [Back to Main SWAG index]  [Original]