home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG049P.ASM < prev    next >
Assembly Source File  |  1988-04-17  |  3KB  |  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+6]
  8.  
  9.     PUBLIC    Scroll_Page
  10.  
  11. Scroll_Page     PROC FAR
  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    2
  103. Scroll_Page    ENDP
  104.