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

  1.  
  2. ;************************************************************************
  3. ; Smooth horizontal scroll                                              *
  4. ; There is no error checking and it is assumed that new width was set   *
  5. ; Entry:        X_Offset- Current horizontal offset                     *
  6. ;************************************************************************
  7.  
  8. X_Offset        EQU     [BP+6]
  9.  
  10.         PUBLIC  Horizontal_Scroll
  11.  
  12. Horizontal_Scroll      PROC    FAR
  13.         PUSH    BP                      ;Standard entry from high level
  14.         MOV     BP,SP
  15.         PUSH    ES
  16.  
  17.         XOR     AX,AX                   ;Point ES to segment 0
  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. HS_Wait1:                               ;Wait for vertical to start
  25.         IN      AL,DX
  26.         JMP     $+2
  27.         TEST    AL,8
  28.         JZ      HS_Wait1
  29. HS_Wait2:                               ;Wait for vertical to end
  30.         IN      AL,DX
  31.         JMP     $+2
  32.         TEST    AL,8
  33.         JNZ     HS_Wait2
  34.  
  35.         ;--- Set CRTC ADDRESS register to offset/8
  36.  
  37.         MOV     BX,X_Offset             ;Compute multiple of 8 offset to use
  38.         SHR     BX,1                    ;in CRTC start address register 0D
  39.         SHR     BX,1
  40.         SHR     BX,1
  41.         MOV     DX,ES:[BIOS_CRT_Addr]   ;Get address of CRT controller
  42.         MOV     AL,0DH                  ;Index for START ADDRESS register LO
  43.         OUT     DX,AL                   ;Select index
  44.         INC     DX
  45.         MOV     AL,BL                   ;Fetch the scroll value we computed
  46.         OUT     DX,AL                   ;Set START register
  47.  
  48.         ;--- Set Attribute PANNING register to (offset mod 8)
  49.  
  50.         ADD     DX,5                    ;Point to status port
  51. HS_Wait3:                               ;Wait for vertical to start
  52.         IN      AL,DX
  53.         JMP     $+2
  54.         TEST    AL,8
  55.         JZ      HS_Wait3
  56.  
  57.         MOV     DX,3C0H                 ;Fetch address of Attr write register
  58.         MOV     AL,33H                  ;Fetch index
  59.         OUT     DX,AL                   ;Select PANNING register
  60.         MOV     AX,X_Offset             ;Fetch offset
  61.         AND     AL,7                    ;Keep last 3 bits (offset mod 8)
  62.         OUT     DX,AL                   ;Set PANNING register
  63.  
  64.         POP     ES
  65.         MOV     SP,BP
  66.         POP     BP
  67.         RET    2
  68. Horizontal_Scroll      ENDP
  69.