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

  1.  
  2. ;************************************************************************
  3. ; Smooth simultaneous scroll in horizontal and vertical direction       *
  4. ; Entry:        X_Offset- Current horizontal offset                     *
  5. ;               Y_Offset- Current vertical offset                       *
  6. ;************************************************************************
  7.  
  8. X_Offset        EQU     [BP+4]
  9. Y_Offset        EQU     [BP+6]
  10.  
  11.         PUBLIC  _Smooth_Scroll
  12.  
  13. _Smooth_Scroll  PROC    NEAR
  14.         PUSH    BP                      ;Standard entry from high level
  15.         MOV     BP,SP
  16.         PUSH    ES
  17.  
  18.         XOR     AX,AX                   ;Point ES to segment zero
  19.         MOV     ES,AX
  20.  
  21.         ;--- Set CRTC ADDRESS register to offset/8
  22.         ;--- Compute offset into display buffer to be loaded into CRTC
  23.         ;    START ADDRESS register as:
  24.         ;    X_Offset/8 + Y_Offset/Char_Height * columns
  25.  
  26.         MOV     AX,Y_Offset             ;Fetch Y_Offset
  27.         XOR     DX,DX                   ;Clear DX for divide
  28.         MOV     BX,ES:[BIOS_Height]     ;Get character height
  29.         DIV     BX                      ;Divide offset by character height
  30.         MOV     BX,AX                   ;Save number of text lines to skip
  31.         MOV     CX,DX                   ;Save number of scan lines to skip
  32.         MOV     AX,ES:[BIOS_Columns]    ;Fetch number of bytes per text line
  33.         SHL     AH,1                    ; (adjust for attributes)
  34.         MUL     BX                      ;Convert to number of bytes to skip
  35.  
  36.         MOV     BX,X_Offset             ;Compute how many bytes to skip due
  37.         SHR     BX,1                    ;to X_Offset
  38.         SHR     BX,1
  39.         SHR     BX,1
  40.         ADD     BX,AX                   ;and add to previously computed offset
  41.                                         ;due to Y_Offset
  42.  
  43.         ;--- Wait for an end of vertical retrace
  44.  
  45.         MOV     DX,ES:[BIOS_CRT_Addr]   ;Get address of CRT controller
  46.         ADD     DX,6                    ;Wait for retrace to change registers
  47. SS_Wait1:                               ;Wait for vertical to start
  48.         IN      AL,DX
  49.         JMP     $+2
  50.         TEST    AL,8
  51.         JZ      SS_Wait1
  52. SS_Wait2:                               ;Wait for vertical to end
  53.         IN      AL,DX
  54.         JMP     $+2
  55.         TEST    AL,8
  56.         JNZ     SS_Wait2
  57.  
  58.         ;--- Set START ADDRESS register in CRTC to the value just computed
  59.  
  60.         MOV     DX,ES:[BIOS_CRT_Addr]   ;Fetch address of CRTC
  61.         MOV     AL,0DH                  ;Index for START ADDRESS register LO
  62.         OUT     DX,AL                   ;Select index
  63.         INC     DX
  64.         MOV     AL,BL                   ;Fetch the scroll value we computed
  65.         OUT     DX,AL                   ;Set START register
  66.         DEC     DX
  67.         MOV     AL,0CH                  ;Select index for START ADDRESS hi
  68.         OUT     DX,AL
  69.         INC     DX
  70.         MOV     AL,BH                   ;Set START register
  71.         OUT     DX,AL
  72.         DEC     DX
  73.  
  74.         ; Wait for vertical retrace to start
  75.  
  76.         ADD     DX,6
  77. SS_Wait3:                               ;Wait for vertical to start
  78.         IN      AL,DX
  79.         JMP     $+2
  80.         TEST    AL,8
  81.         JZ      SS_Wait3
  82.         SUB     DX,6
  83.  
  84.         ;--- Set CRTC PRESET ROW SCAN register to number of scan lines to skip
  85.         ;    it was earlier computed as (Y_Offset MOD Char_Height)
  86.  
  87.         MOV     AL,8                    ;Index of PRESET ROW SCAN register
  88.         OUT     DX,AL                   ;Select PRESET ROW SCAN register
  89.         MOV     AL,CL                   ;Fetch scan lines to skip
  90.         INC     DX
  91.         OUT     DX,AL                   ;Set PRESET ROW SCAN register
  92.  
  93.         ;--- Set Attribute PANNING register to Y_Offset MOD 8
  94.  
  95.         ADD     DX,5                    ;Compute Attr Read register address
  96.         IN      AL,DX                   ;Reset Attr index/data flip-flop
  97.         MOV     DX,3C0H                 ;Fetch address of Attr write register
  98.         MOV     AL,33H                  ;Fetch index
  99.         OUT     DX,AL                   ;Select PANNING register
  100.         MOV     AX,X_Offset             ;Fetch offset
  101.         AND     AL,7                    ;Keep last 3 bits (offset mod 8)
  102.         OUT     DX,AL                   ;Set PANNING register
  103.  
  104.         POP     ES                      ;Standard exit to high level
  105.         MOV     SP,BP
  106.         POP     BP
  107.         RET
  108. _Smooth_Scroll  ENDP
  109.