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

  1.  
  2. ;************************************************************************
  3. ; Smooth vertical scroll                                                *
  4. ; Assumes that line width is set correctly in the BIOS data area        *
  5. ; Entry:        Y_Offset- Current vertical offset                       *
  6. ;************************************************************************
  7.  
  8. Y_Offset        EQU     [BP+4]
  9.  
  10.         PUBLIC  _Vertical_Scroll
  11.  
  12. _Vertical_Scroll PROC    NEAR
  13.         PUSH    BP                      ;Standard entry from high level
  14.         MOV     BP,SP
  15.         PUSH    ES
  16.  
  17.         XOR     AX,AX                   ;Point ES to segment zero
  18.         MOV     ES,AX
  19.  
  20.         ;--- Wait for an end of vertical retrace
  21.  
  22.         MOV     DX,ES:[BIOS_CRT_Addr]   ;Get address of CRT controller
  23.         ADD     DX,6                    ;Wait for retrace to change registers
  24. VS_Wait1:                               ;Wait for vertical to start
  25.         IN      AL,DX
  26.         JMP     $+2
  27.         TEST    AL,8
  28.         JZ      VS_Wait1
  29. VS_Wait2:                               ;Wait for vertical to end
  30.         IN      AL,DX
  31.         JMP     $+2
  32.         TEST    AL,8
  33.         JNZ     VS_Wait2
  34.  
  35.         ;--- Set CRTC ADDRESS register to (columns * offset / char_height)
  36.  
  37.         MOV     AX,Y_Offset             ;Fetch new Y
  38.         XOR     DX,DX                   ;Clear DX for divide
  39.         MOV     BX,ES:[BIOS_Height]     ;Get character height
  40.         DIV     BX                      ;Divide offset by character height
  41.         MOV     BX,AX                   ;Save number of text lines to skip
  42.         MOV     CX,DX                   ;Save number of scan lines to skip
  43.         MOV     AX,ES:[BIOS_Columns]    ;Fetch number of bytes per text line
  44.         MUL     BX                      ;Compute number of bytes to skip
  45.         MOV     BX,AX                   ;Save it in BX
  46.         MOV     DX,ES:[BIOS_CRT_Addr]   ;Get address of CRT controller
  47.         MOV     AL,0DH                  ;Index for START ADDRESS register LO
  48.         OUT     DX,AL                   ;Select index
  49.         INC     DX
  50.         MOV     AL,BL                   ;Fetch the scroll value we computed
  51.         OUT     DX,AL                   ;Set START register
  52.         DEC     DX
  53.         MOV     AL,0CH                  ;Write the high byte of the start addr
  54.         OUT     DX,AL
  55.         INC     DX
  56.         MOV     AL,BH
  57.         OUT     DX,AL
  58.         DEC     DX
  59.  
  60.         ;--- Set CRTC PRESET ROW SCAN register to number of scan lines to skip
  61.  
  62.         ADD     DX,6
  63. VS_Wait3:                               ;Wait for vertical to start
  64.         IN      AL,DX
  65.         JMP     $+2
  66.         TEST    AL,8
  67.         JZ      VS_Wait3
  68.         SUB     DX,6
  69.  
  70.         MOV     AL,8                    ;Index of PRESET ROW SCAN register
  71.         OUT     DX,AL                   ;Select PRESET ROW SCAN register
  72.         MOV     AL,CL                   ;Fetch scan lines to skip
  73.         INC     DX
  74.         OUT     DX,AL                   ;Set PRESET ROW SCAN register
  75.  
  76.         POP     ES
  77.         MOV     SP,BP
  78.         POP     BP
  79.         RET
  80. _Vertical_Scroll ENDP
  81.