home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / basic / library / tb / tbscreen / rest-tb.asm < prev    next >
Assembly Source File  |  1987-11-03  |  3KB  |  69 lines

  1. ;SCRNREST.ASM - restores a portion of the text screen in Turbo Basic
  2.  
  3. Code        Segment Byte
  4.             Assume  CS:Code
  5.  
  6. ScrnRest    Proc    Far
  7.  
  8. Begin:      Push  BP            ;save registers for BASIC
  9.             Push  DS
  10.             Mov   BP,SP         ;locate stack to get variable addresses later
  11.  
  12.             Mov   DX,0          ;look at low memory using ES
  13.             Mov   ES,DX
  14.             Mov   BX,0B000h     ;assume mono screen segment for now
  15.             Mov   AL,ES:[410h]  ;get the equipment list
  16.             And   AL,48         ;just look at the monitor type
  17.             Cmp   AL,48         ;is it mono?
  18.             JZ    Get_Params    ;yes, skip over adding 800h
  19.             Add   BX,800h       ;no, adjust for color screen memory
  20.  
  21.             Mov   AL,ES:[487h]  ;if an EGA is present, AL will not be zero
  22.             Cmp   AL,0          ;is it an EGA?
  23.             JNZ   Get_Params    ;yes, leave DX set to zero as a flag for later
  24.             Mov   DX,3DAh       ;no, specify the port to check for retrace
  25.  
  26. Get_Params: Mov   ES,BX         ;set ES to the appropriate screen segment
  27.  
  28.             LDS   DI,[BP+12]    ;get the address for LastLine
  29.             Mov   AL,[DI]       ;and put it into AL
  30.             Mov   CL,160        ;prepare to multiple times 160
  31.             Mul   CL            ;now AX holds last screen address to restore
  32.             Mov   BX,AX         ;save it in BX for later
  33.  
  34.             LDS   DI,[BP+16]    ;get the address for FirstLine
  35.             Mov   AL,[DI]       ;put it into AL
  36.             Dec   AL            ;adjust 1-25 to 0-24
  37.             Mul   CL            ;calculate actual starting address on screen
  38.             Mov   DI,AX         ;now DI points to the destination address
  39.  
  40.             Sub   BX,AX         ;calculate the number of bytes to copy
  41.             Mov   CX,BX         ;put it into CX for Rep or Loop below
  42.             Shr   CX,1          ;divide CX by 2 to obtain the number of words
  43.  
  44.             LDS   SI,[BP+08]    ;get the segment and address of storage array
  45.  
  46.             Cld                 ;all data moves below will be forward
  47.             Cmp   DL,0          ;are we doing monochrome or EGA?
  48.             JZ    Mono          ;yes, skip over the retrace stuff
  49.  
  50. No_Retrace: In    AL,DX         ;get the video status byte
  51.             Test  AL,1          ;test just the horizontal retrace bit
  52.             JNZ   No_Retrace    ;if doing a retrace, wait until it's not
  53. Retrace:    In    AL,DX         ;get the status byte again
  54.             Test  AL,1          ;are we currently doing a retrace?
  55.             JZ    Retrace       ;no wait until we are
  56.             Lodsw               ;now get the word from the screen
  57.             Stosw               ;and put it into the array
  58.             Loop  No_Retrace    ;loop until done
  59.             Jmp   Exit          ;skip over the mono routine and exit
  60.  
  61. Mono:       Rep   Movsw         ;move the data in one operation
  62.  
  63. Exit:       Pop   DS            ;restore registers for BASIC
  64.             Pop   BP
  65.  
  66. ScrnRest    Endp
  67. Code        Ends
  68.             End   Begin
  69.