home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / screen.swg / 0011_SCRWRIT1.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  2KB  |  58 lines

  1. {
  2. Does any one know of a way to Write 80 chrs to the bottom line of the
  3. screen without the screen advancing?
  4.  
  5. You're gonna have to Write directly to the screen : the problem is that,
  6. when you use std ways to Write to the screen, the cursor is always one
  7. Character ahead of the Text you displayed... so standard display procs
  8. can not be used to Write to the 80th Character of the 25th line.
  9.  
  10. Here is a simple proc to Write Text directly to the screen :
  11. }
  12.  
  13. Const
  14.      VideoSeg  : Word = $b800 ;    { Replace With $b000 if no color card }
  15.  
  16. Procedure DisplayString(x, y : Byte; Zlika : String; Attr : Byte); Assembler ;
  17.  
  18. { x and y are 0-based }
  19. Asm
  20.   Mov  ES, VideoSeg        { Initialize screen segment adr }
  21.  
  22.   { Let's Compute the screen address of coordinates (x, y) }
  23.   { Address:=(160*y)+(x ShL 2) ; }
  24.   Mov  AL, 160             { 160 Bytes per screen line }
  25.   Mul  Byte Ptr y
  26.   Mov  BL, x
  27.   Xor  BH, BH
  28.   ShL  BX, 1               { 2 Bytes per on-screen Character }
  29.   Add  BX, AX              { BX contains offset where to display }
  30.  
  31.   { Initialize stuff... }
  32.   Push DS                  { Save DS }
  33.   ClD                      { String ops increment DI, SI }
  34.   LDS  SI, Zlika           { DS:DI points to String }
  35.   LodSB                    { Load String length in AL }
  36.   Mov  CL, AL              { Copy it to CL }
  37.   Xor  CH, CH              { CX contains String length }
  38.   Mov  DI, BX              { DI contains address where to display }
  39.   Mov  AH, Attr            { Attribute Byte in AH }
  40. @Boucle:
  41.   LodSB                    { Load next Char to display in AL }
  42.   StoSW                    { Store Word (attr & Char) to the screen }
  43.   Loop @Boucle             { Loop For all Chars }
  44.  
  45.   Pop  DS                  { Restore DS }
  46. end ;
  47.  
  48. {
  49. Furthermore, this is definitely faster than using Crt.Write...
  50. I will ask those ones owning a CGA card to Forgive me, I ommited to
  51. include the usual snow-checking... but this intends to be a short
  52. example :-))
  53. Also note that there is no kind of checking, so you can Write out of
  54. the screen if you want... but that's no good idea.
  55. BTW, the attribute Byte value is Computed With the "magic Formula"
  56. Attr:=Foreground_Color + (16 * Background_color) [ + 128 For blinking ]
  57. }
  58.