home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / USCX / ASMUT-03.ZIP / SL.ASM < prev    next >
Assembly Source File  |  1985-05-15  |  3KB  |  121 lines

  1.  
  2. ;---------------------------------------------------------------
  3. ;
  4. ; Scroll the screen by telling the 6845 that the screen
  5. ; begins a line later.
  6. ;
  7. ;  FUNCTION:
  8. ;        This is a test program, which scrolls the screen
  9. ;
  10. ;  Author: Malcolm McCorquodale III.  Summer 1983.
  11. ;       3470 Locke Lane
  12. ;       Houston, Texas 77027
  13. ;       713 - 626 - 4979
  14. ; Copyright 1983.
  15. ;
  16. ;---------------------------------------------------------------
  17.     PAGE    ,132
  18. DATA    SEGMENT AT 40H
  19.     org    4ah
  20. CRT_COLS    DW    ?
  21.     org    4eh
  22. CRT_START    DW    ?
  23.     org    50h
  24. CURSOR_POSN    DW    8 DUP(?)
  25.     org    63h
  26. ADDR_6845    DW    ?
  27. DATA    ENDS
  28.  
  29. CODE    SEGMENT 'CODE'
  30.     ASSUME    CS:CODE,DS:DATA
  31.  
  32. MAIN    PROC    FAR
  33.     PUSH    DS    ; DOS linkage.
  34.     XOR    AX,AX
  35.     PUSH    AX
  36.     MOV    AX,DATA    ; Establish addressibility for low memory.
  37.     MOV    DS,AX
  38.     MOV    CX,10
  39. LP:
  40.     PUSH    CX
  41.     CALL    SCROLL
  42.     POP    CX
  43.     LOOP    LP
  44.  
  45.     RET
  46. MAIN    ENDP
  47.  
  48. ;------------------------------------------------------------------------
  49. ;
  50. ; This routine outputs the CX register to the 6845
  51. ; registers at [AH] and [AH+1].
  52. ;
  53. ;------------------------------------------------------------------------
  54. OUTPUT_TO_6845    PROC    NEAR
  55.     MOV    DX,ADDR_6845    ; Address of 6845 Address register to DX.
  56.     MOV    AL,AH        ; Get register number into AL.
  57.     OUT    DX,AL        ; Tell 6845 what register to write to.
  58.  
  59.     INC    DX        ; Point to Data Register
  60.     MOV    AL,CH        ; Output <CH> to 6845 register addressed
  61.     OUT    DX,AL        ;    by DX.
  62.  
  63.     DEC    DX
  64.     MOV    AL,AH
  65.     INC    AL        ; Point to other data register.
  66.     OUT    DX,AL        ; Tell 6845 what register to write to.
  67.  
  68.     INC    DX        ; Point to data register.
  69.     MOV    AL,CL        ; Output <CL> to register addressed
  70.     OUT    DX,AL        ;    by DX.
  71.  
  72.     RET
  73. OUTPUT_TO_6845    ENDP
  74.  
  75. ;------------------------------------------------------------------------
  76. ;
  77. ; Set cursor position,
  78. ; INPUT: AX has ROW/COLUMN for cursor.
  79. ;
  80. ;------------------------------------------------------------------------
  81. SET_CURSOR    PROC    NEAR
  82.     MOV    CX,AX        ; Save Row / Col.
  83.     MOV    AL,AH
  84.     MUL    BYTE PTR CRT_COLS    ; Determine bytes per row.
  85.     XOR    CH,CH        ; Zap 'saved' rows.
  86.     ADD    CX,AX        ; Add in column value.
  87.     SHR    CX,1        ; *2 for attribute bytes.
  88.     ADD    CX,CRT_START    ; Add offset to begining of screen to offset
  89.                 ;   into screen.
  90.     SAR    CX,1        ; /2 for attribute bytes.
  91.     MOV    AH,14
  92.     CALL    OUTPUT_TO_6845
  93.     RET
  94. SET_CURSOR    ENDP
  95.  
  96. ;----------------------------------------------------------------
  97. ; SCROLL
  98. ;    This routine scrolls the screen by telling the 6845 that the
  99. ;    screen begins a line later.
  100. ; INPUT
  101. ;    None.
  102. ; OUTPUT
  103. ;    The 6845 is reset to display a new page starting one line
  104. ;    later.
  105. ;------------------------------------------------------------------------
  106. SCROLL    PROC    NEAR
  107.  
  108.     MOV    AX,CRT_START    ; Get start of screen.
  109.     ADD    AX,CRT_COLS    ; Increment by number of columns.
  110.     MOV    CRT_START,AX    ; Save screen start address.
  111.     SAR    CX,1        ; Divide columns by 2 for 6845 handling.
  112.     MOV    AH,12        ; 6845 register 12 = start address.
  113.     CALL    OUTPUT_TO_6845    ; Output screen starting address to 6845.
  114.  
  115.     MOV    AX,[OFFSET CURSOR_POSN]     ; Get cursor for this page.
  116.     CALL    SET_CURSOR    ; Set the cursor position.
  117.     RET
  118. SCROLL    ENDP
  119. CODE    ENDS
  120.     END
  121.