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

{
Does any one know of a way to Write 80 chrs to the bottom line of the
screen without the screen advancing?

You're gonna have to Write directly to the screen : the problem is that,
when you use std ways to Write to the screen, the cursor is always one
Character ahead of the Text you displayed... so standard display procs
can not be used to Write to the 80th Character of the 25th line.

Here is a simple proc to Write Text directly to the screen :
}

Const
     VideoSeg  : Word = $b800 ;    { Replace With $b000 if no color card }

Procedure DisplayString(x, y : Byte; Zlika : String; Attr : Byte); Assembler ;

{ x and y are 0-based }
Asm
  Mov  ES, VideoSeg        { Initialize screen segment adr }

  { Let's Compute the screen address of coordinates (x, y) }
  { Address:=(160*y)+(x ShL 2) ; }
  Mov  AL, 160             { 160 Bytes per screen line }
  Mul  Byte Ptr y
  Mov  BL, x
  Xor  BH, BH
  ShL  BX, 1               { 2 Bytes per on-screen Character }
  Add  BX, AX              { BX contains offset where to display }

  { Initialize stuff... }
  Push DS                  { Save DS }
  ClD                      { String ops increment DI, SI }
  LDS  SI, Zlika           { DS:DI points to String }
  LodSB                    { Load String length in AL }
  Mov  CL, AL              { Copy it to CL }
  Xor  CH, CH              { CX contains String length }
  Mov  DI, BX              { DI contains address where to display }
  Mov  AH, Attr            { Attribute Byte in AH }
@Boucle:
  LodSB                    { Load next Char to display in AL }
  StoSW                    { Store Word (attr & Char) to the screen }
  Loop @Boucle             { Loop For all Chars }

  Pop  DS                  { Restore DS }
end ;

{
Furthermore, this is definitely faster than using Crt.Write...
I will ask those ones owning a CGA card to Forgive me, I ommited to
include the usual snow-checking... but this intends to be a short
example :-))
Also note that there is no kind of checking, so you can Write out of
the screen if you want... but that's no good idea.
BTW, the attribute Byte value is Computed With the "magic Formula"
Attr:=Foreground_Color + (16 * Background_color) [ + 128 For blinking ]
}

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