home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG049.ASM < prev    next >
Assembly Source File  |  1988-04-10  |  5KB  |  104 lines

  1.  
  2. ;************************************************************************
  3. ; Scrolling 80 column page of text                                      *
  4. ; Entry:        Count           - Number of lines to scroll             *
  5. ;************************************************************************
  6.  
  7. Count   EQU     WORD PTR [BP+4]
  8.  
  9.         PUBLIC  _Scroll_Page
  10.  
  11. _Scroll_Page     PROC NEAR
  12.         PUSH    BP
  13.         MOV     BP,SP
  14.  
  15.         ;--- Determine and load segement of the display buffer
  16.  
  17.         PUSH    DS                      ;Preserve registers
  18.         PUSH    ES
  19.         PUSH    SI
  20.         PUSH    DI
  21.  
  22.         XOR     AX,AX                   ;Point ES to segment zero
  23.         MOV     ES,AX
  24.         MOV     AX,0B000H               ;Assume monochrome buffer address
  25.         TEST    BYTE PTR ES:[BIOS_Equipment],2   ;Is mono attached?
  26.         JNZ     PAddr_Ok                ;...Yes, go load segment
  27.         MOV     AX,0B800H               ;...No, change address to color
  28. PAddr_Ok:
  29.         MOV     DS,AX                   ;Set segment of display buffer
  30.  
  31.         ;--- Compute pointers to source and destination
  32.  
  33.         CMP     Count,0                 ;Are we scrolling up?
  34.         JL      P_Set_Down              ;...No, setup for scrolling down
  35. P_Set_Up:
  36.         MOV     BX,ES:[BIOS_Columns]    ;Fetch number of columns
  37.         MOV     AX,Count                ;Fetch number of rows to scroll
  38.         MUL     BX                      ;Compute address of first byte to
  39.         SHL     AX,1                    ;move as Columns*Count*2
  40.         MOV     SI,AX                   ;Save address of first byte to move
  41.         XOR     DI,DI                   ;Address of where to move to
  42.         MOV     AL,ES:[BIOS_Rows]       ;Number of bytes to move is
  43.         XOR     AH,AH
  44.         SUB     AX,Count                ;(Total_Rows-Count)*Columns*2
  45.         MUL     BX                      ;multiply rows*columns
  46.         SHL     AX,1                    ;multipy by 2 (account for attrib)
  47.         MOV     CX,AX                   ;Move count into register CX
  48.         MOV     AX,DS                   ;Point segment register ES to
  49.         MOV     ES,AX                   ;the display buffer segment
  50.         REP     MOVSB                   ;Move rows up
  51. P_Clear_Up:
  52.         MOV     AX,Count                ;Compute number of words to clear
  53.         MUL     BX                      ;as Rows*Columns
  54.         MOV     CX,AX                   ;Save the count in register CX
  55.         MOV     AX,0700H+' '            ;Value to use in 'cleared' area
  56.                                         ;is attribute 7 and character ' '
  57.         REP     STOSW                   ;'Clear' the area
  58.         JMP     Page_Scroll_Done
  59.  
  60. P_Set_Down:
  61.         MOV     BX,ES:[BIOS_Columns]    ;Fetch number of columns
  62.         MOV     AL,ES:[BIOS_Rows]       ;Fetch total number of rows
  63.         XOR     AH,AH
  64.         SUB     AX,Count                ;Compue address of first byte
  65.         MUL     BX                      ;to move as Total Rows - Count *
  66.         DEC     AX                      ;* Columns * 2 - 2
  67.         SHL     AX,1
  68.         MOV     SI,AX                   ;Save address of first byte to move
  69.  
  70.         MOV     AL,ES:[BIOS_Rows]       ;Fetch total number of rows
  71.         XOR     AH,AH
  72.         MUL     BX                      ;Compute address of first byte of
  73.         DEC     AX                      ;where the to move bytes to as
  74.         SHL     AX,1                    ;(Total Rows * Columns - 1) * 2
  75.         MOV     DI,AX                   ;Save address in register DI
  76.  
  77.         MOV     AL,ES:[BIOS_Rows]       ;Compute number of byte to
  78.         XOR     AH,AH
  79.         SUB     AX,Count                ;move as
  80.         MUL     BX                      ;(Total Rows - Count) * Columns * 2
  81.         SHL     AX,1
  82.         MOV     CX,AX                   ;Put count into register CX
  83.         STD                             ;Set direction flag to 'decrement'
  84.         REP     MOVSB                   ;Move rows up
  85.  
  86. P_Clear_Down:
  87.         MOV     AX,Count                ;Compute number of words to clear
  88.         MUL     BX                      ;as Rows*Columns
  89.         MOV     CX,AX                   ;Save the count in register CX
  90.         MOV     AX,0700H+' '            ;Value to use in 'cleared' area
  91.                                         ;is attribute 7 and character ' '
  92.         REP     STOSW                   ;'Clear' the area
  93.         CLD                             ;Reset the direction flag
  94.  
  95. Page_Scroll_Done:
  96.         POP     DI
  97.         POP     SI
  98.         POP     ES
  99.         POP     DS
  100.  
  101.         POP     BP
  102.         RET
  103. _Scroll_Page    ENDP
  104.