home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG047P.ASM < prev    next >
Assembly Source File  |  1988-05-25  |  6KB  |  145 lines

  1.  
  2. ;************************************************************************
  3. ; Scrolling text window in text modes                                   *
  4. ; Entry:        Up, Left        - Upper left row and column             *
  5. ;               Down, Right     - Lower right row and column            *
  6. ;               Count           - Number of lines to scroll             *
  7. ;************************************************************************
  8.  
  9. Up      EQU     WORD PTR [BP+14]
  10. Left    EQU     WORD PTR [BP+12]
  11. Down    EQU     WORD PTR [BP+10]
  12. Right   EQU     WORD PTR [BP+8]
  13. Count   EQU     WORD PTR [BP+6]
  14.  
  15.         PUBLIC  Scroll_Text
  16.  
  17. Scroll_Text    PROC FAR
  18.         PUSH    BP
  19.         MOV     BP,SP
  20.  
  21.         PUSH    DS                      ;Preserve DS
  22.         PUSH    ES                      ;Preserve ES
  23.         PUSH    SI
  24.         PUSH    DI
  25.  
  26.         ;--- Determine and load segement of the display buffer
  27.  
  28.         XOR     AX,AX                   ;Point ES to segment zero
  29.         MOV     ES,AX
  30.         MOV     AX,0B000H               ;Assume monochrome buffer address
  31.         TEST    BYTE PTR ES:[BIOS_Equipment],2   ;Is mono attached?
  32.         JNZ     Scroll_Addr_Ok          ;...Yes, go load segment
  33.         MOV     AX,0B800H               ;...No, change address to color
  34. Scroll_Addr_Ok:
  35.         MOV     DS,AX                   ;Set segment of display buffer
  36.  
  37.         ;--- Compute pointers to source and destination
  38.  
  39.         CMP     Count,0                 ;Are we scrolling up?
  40.         JL      Setup_Down              ;...No, setup for scrolling down
  41. Setup_Up:
  42.         MOV     BX,ES:[BIOS_Columns]    ;Compute address of where to move from
  43.         MOV     AX,Up                   ;Compute first byte to move as
  44.         ADD     AX,Count                ;(Upper row + count)*bytes per line
  45.         MUL     BX                      ; + upper column
  46.         ADD     AX,Left
  47.         MOV     SI,AX                   ;Save source address in SI
  48.         SHL     SI,1                    ;Adjust for two bytes per char
  49.  
  50.         MOV     AX,Up                   ;Compute address of where to move to
  51.         MUL     BX                      ;as Upper row * bytes line + upper
  52.         ADD     AX,Left                 ;   + column
  53.         MOV     DI,AX                   ;Save destination
  54.         SHL     DI,1                    ;Adjust for two bytes per char
  55.  
  56.         MOV     DX,Right                ;Words to move in each line
  57.         SUB     DX,Left                 ;is (Right - Left + 1)
  58.         INC     DX
  59.         SUB     BX,DX                   ;Compute 'update'
  60.         SHL     BX,1
  61.  
  62.         MOV     CX,Down                 ;Compute number of lines to move
  63.         SUB     CX,Up
  64.         SUB     CX,Count
  65.         INC     CX
  66.         PUSH    DS                      ;Copy DS into ES
  67.         POP     ES
  68. Loop_Up:
  69.         PUSH    CX                      ;Save counter of lines
  70.         MOV     CX,DX                   ;Set counter of bytes
  71.         REP     MOVSW                   ;Move next line of bytes (word/char)
  72.         ADD     DI,BX                   ;Set pointers to next line
  73.         ADD     SI,BX
  74.         POP     CX                      ;Restore line counter
  75.         LOOP    Loop_Up                 ;If not done, go move next line
  76. Clear_Up:
  77.         MOV     CX,Count                ;Number of lines to clear
  78.         MOV     AX,0720H                ;Value to use as 'clear'
  79. Loop_Clear_Up:
  80.         PUSH    CX
  81.         MOV     CX,DX                   ;Fetch # bytes in each line
  82.         REP     STOSW                   ;Clear next line
  83.         ADD     DI,BX                   ;Set pointers to next line
  84.         POP     CX
  85.         LOOP    Loop_Clear_Up
  86.  
  87.         JMP     Scroll_Done
  88.  
  89. Setup_Down:
  90.         NEG     Count
  91.         MOV     BX,ES:[BIOS_Columns]    ;Compute bytes/line
  92.         MOV     AX,Down                 ;Compute first source byte
  93.         SUB     AX,Count                ;(Lower row - count)*bytes per line
  94.         MUL     BX                      ; + upper column
  95.         ADD     AX,Left
  96.         MOV     SI,AX                   ;Save source address in SI
  97.         SHL     SI,1                    ;Adjust for two bytes per char
  98.  
  99.         MOV     AX,Down                 ;Compute address of where to move
  100.         MUL     BX                      ;as Lower row * bytes line + left
  101.         ADD     AX,Left                 ;   + column
  102.         MOV     DI,AX                   ;Save destination
  103.         SHL     DI,1                    ;Adjust for two bytes per char
  104.  
  105.         MOV     DX,Right                ;Compute words to move in a line
  106.         SUB     DX,Left                 ;as (Right - Left + 1)
  107.         INC     DX
  108.         ADD     BX,DX                   ;Compute 'update'
  109.         SHL     BX,1
  110.  
  111.         MOV     CX,Down                 ;Compute number of lines to move
  112.         SUB     CX,Up
  113.         SUB     CX,Count
  114.         INC     CX
  115.         PUSH    DS                      ;Copy DS into ES
  116.         POP     ES
  117. Loop_Down:
  118.         PUSH    CX                      ;Save counter of lines
  119.         MOV     CX,DX                   ;Set counter of bytes
  120.         REP     MOVSW                   ;Move next line of bytes
  121.         SUB     DI,BX                   ;Set pointers to next line
  122.         SUB     SI,BX
  123.         POP     CX                      ;Restore line counter
  124.         LOOP    Loop_Down               ;If not done, go move next line
  125.  
  126. Clear_Down:
  127.         MOV     CX,Count                ;Number of lines to clear
  128.         MOV     AX,0720H                ;Value to use as 'clear'
  129. Loop_Clear_Down:
  130.         PUSH    CX
  131.         MOV     CX,DX                   ;Fetch # bytes in each line
  132.         REP     STOSW                   ;Clear next line
  133.         SUB     DI,BX                   ;Set pointers to next line
  134.         POP     CX
  135.         LOOP    Loop_Clear_Down
  136.  
  137. Scroll_Done:
  138.         POP     DI
  139.         POP     SI
  140.         POP     ES
  141.         POP     DS
  142.         POP     BP
  143.         RET    10
  144. Scroll_Text    ENDP
  145.