home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / nan_news / vol1 / no2 / scrolscr.asm < prev    next >
Assembly Source File  |  1986-11-25  |  8KB  |  225 lines

  1.     TITLE SCROLSCR
  2.     PAGE ,132
  3.  
  4. ;   Title:    ROLLSCRN.ASM
  5. ;   Author:    P. Baenziger
  6. ;   Syntax:
  7. ;     DO SCROL_UP [ WITH TOP, LEFT, BOTT, RIGHT, [ NUM LINES , [ ATTRIB ]]]
  8. ;     DO SCROL_UP without parms - scrolls up entire screen, 1 line, 
  9. ;        attrib picked off screen (UP_LEFT for down, BOT_RIGHT for up)
  10. ;     DO SCROL_UP WITH TOP, LEFT, BOTT, RIGHT scrolls up marked rectangle, 
  11. ;        1 line, attrib picked off screen (same as above)
  12. ;     DO SCROL_UP WITH TOP, LEFT, BOTT, RIGHT, NUM_LINES scrolls up rectangle, 
  13. ;        number of lines.  0 number of lines means blanking.  Attribute 
  14. ;        picked off screen (same as above)
  15. ;     DO SCROL_UP WITH TOP, LEFT, BOTT, RIGHT, NUM_LINES, ATTRIB has everything 
  16. ;        determined by passed parms
  17. ;
  18. ;    Revised PBaenziger, pbprograms, 1215 Lane, Kalamzoo, MI 49001
  19. ;    (616) 349-9720 (Evenings), 323-7392 (Days, 8-4:30 EDT)
  20. ;
  21. ;    !!!! Assumes 25x80 screen, active page 0 for default values !!!!        
  22. ;
  23. ;
  24. public   SCROL_UP                 ; declare as public
  25. public   SCROL_DN                 ;
  26. ;
  27. EXTRN    _PARINFO:far             ; Find out what's passed
  28. extrn    _PARNI:far               ; declare as external of type far
  29. extrn    _RET:far                 ;
  30. ;
  31. ;
  32. UP            EQU  6              ; BIOS value for scroll up
  33. DOWN          EQU  7              ; BIOS value for scroll down
  34. SCRN_ROWS     EQU  24             ; Counted from 0
  35. SCRN_COLS     EQU  79        
  36.  
  37. ;==================================================
  38. DGROUP    GROUP    DATASG        ; Clipper's Data Segment
  39. ;==================================================
  40.  
  41. ; the 'public' in the next statement combines the datasg
  42. ; to Clipper's DGROUP group
  43. ;==================================================
  44. DATASG    SEGMENT    PUBLIC    'DATA'
  45. ;==================================================
  46.  
  47. UP_DOWN       DB  1              ; Are we scrolling up or down
  48.                                  ; Used by INT 10H in form CH,CL - Row, Col
  49.                                  ; Arranged so we can make a WORD MOV to CX
  50. UP_LEFT       LABEL  WORD
  51. LEFT          db  2h             ; left corner - column
  52. TOP           db  3h             ; top - row
  53. BOT_RIGHT     LABEL  WORD        
  54. RIGHT         db  4h             ; right corner - column
  55. BOTTOM        db  5h             ; bottom - row
  56. NUM_LINES     DB  6              ; Number of lines to scroll
  57. ATTRIB        DB  7              ; Blanking attribute
  58.  
  59. ;==================================================
  60. DATASG    ENDS
  61. ;==================================================
  62.         
  63.  
  64. ;==================================================
  65. _prog    segment    byte            ; start of code segment
  66. assume    cs:_prog, DS:DGROUP
  67. ;==================================================
  68.  
  69.  
  70. SCROL_UP    proc         far             ; start of ROLLUP process
  71.  
  72.          PUSH      BP              ; GET destroys BP
  73.          MOV       UP_DOWN, UP     ; Record whether we're
  74.                                    ; scrolling up or down
  75.          CALL      SCROL_COMMON
  76.          POP       BP
  77.          call      _RET            ; clears some CLIPPER stack
  78.          RET                       ; actual physical return
  79.  
  80. SCROL_UP    ENDP
  81.         
  82.                 
  83. SCROL_DN    proc         far             ; start of ROLLDN process
  84.         
  85.          PUSH      BP              ; GETX destroys BP
  86.  
  87.          MOV       UP_DOWN, DOWN   ; Record whether we're
  88.                                    ; scrolling up or down
  89.          CALL      SCROL_COMMON
  90.          POP       BP
  91.          call         _RET            ; clears some CLIPPER stack
  92.          RET                       ; actual physical return
  93.  
  94. SCROL_DN    ENDP
  95.         
  96.  
  97. SCROL_COMMON PROC    NEAR    
  98.  
  99.         ;Get number of parameters passed
  100.          SUB       AX, AX
  101.          PUSH      AX
  102.          CALL      _PARINFO
  103.          ADD       SP, 2          ; Adjust stack
  104.          ; Number of parms in AX
  105.  
  106.          ; AX holds number of parms passed
  107.          ; legal are 0, 4,5,6
  108.         
  109.          SUB       AL, 6
  110.          JNZ       FIVE           ; Not all 6 parameters
  111.  
  112.          ; All 6 parms
  113.          CALL      GET6           ; Gets all 6 parameters from CLIPPER
  114.          JMP       SHORT SCRL
  115.         
  116. FIVE:    INC       AL
  117.          JNZ       FOUR           ; Not 5 parameters
  118.  
  119.         ; 5 parameters
  120.          CALL      GET5           ; Gets 5 from CLIPPER, 1 default
  121.          JMP       SHORT DEFLT6
  122.         
  123. FOUR:    INC       AL            
  124.          JNZ       ZERO           ; Not 4 parameters
  125.  
  126.          ; 4 parameters
  127.          CALL      GET4           ; Gets 4 from CLIPPER, 2 default
  128.          JMP       SHORT DEFLT5
  129.         
  130. ZERO:    ADD       AL, 4
  131.          JZ        DEFLT_ALL      ; Illegal, just leave - or could 
  132.          RET                      ; default to full screen scroll,
  133.                                   ; the same as 0 parms.  This is a
  134.                                   ; design decision, best left to
  135.                                   ; the final implementer
  136.     
  137.                                   ; No parameters, AX is 0 with 0 parms
  138. DEFLT_ALL:
  139.          MOV       TOP, AL             ;0
  140.          MOV       LEFT, AL            ;0
  141.          MOV       BOTTOM, SCRN_ROWS   ; Hard wired values for full screen.
  142.          MOV       RIGHT, SCRN_COLS    ; Since CLIPPER is designed for 25x80, 
  143.                                        ; probably OK
  144.         
  145. DEFLT5:  MOV       NUM_LINES, 1
  146.          ; Find screen attribute
  147.  
  148. DEFLT6:  MOV       AH, 3               ; Get current cursor position
  149.          SUB       BH, BH              ; Assume page 0, ok with CLIPPER
  150.          INT       10H                 ; Video interrupt
  151.          PUSH      DX                  ; Save the current position
  152.         
  153.          MOV       DX, [BOT_RIGHT]     ; Assume scroll up
  154.          CMP       [UP_DOWN], UP
  155.          JE        S010
  156.          MOV       DX, [UP_LEFT]       ; No, scroll down - get top 
  157.  
  158. S010:    MOV       AH, 2          ; Set cursor position
  159.          INT       10H            ; Cursor set to BOT_RIGHT or UP_LEFT
  160.         
  161.          MOV       AH, 8          ; Read attribute/char at cursor
  162.          INT       10H    
  163.          MOV       [ATTRIB], AH   ; Attribute returned in AH
  164.         
  165.          POP       DX             ; Restore previous cursor pos
  166.          MOV       AH, 2
  167.          INT       10H            ; Cursor back where it was
  168.         
  169. SCRL:    MOV       CX, [UP_LEFT]
  170.          MOV       DX, [BOT_RIGHT]     ; Corners of rectangle to scroll
  171.          MOV       AL, [NUM_LINES]     ; How lines to scroll
  172.          MOV       BH, [ATTRIB]        ; Attribute used for blanking
  173.          MOV       AH, [UP_DOWN]       ; Direction of scroll
  174.          INT       10H                 ; Do it
  175.  
  176.          RET
  177.         
  178. SCROL_COMMON       endp           ; end of process
  179. ;
  180. ;
  181. GETX     PROC         NEAR
  182.          ASSUME    CS:_PROG, DS:DGROUP
  183.  
  184. GET6:    MOV       AX, 6          ; Attrib
  185.          PUSH      AX
  186.          CALL      _PARNI
  187.          POP       BX
  188.          MOV       ATTRIB, AL
  189.         
  190. GET5:    MOV       AX, 5
  191.          PUSH      AX
  192.          CALL      _PARNI
  193.          POP       BX
  194.          MOV       NUM_LINES, AL
  195.         
  196. GET4:    MOV       AX,4
  197.          PUSH      AX
  198.          MOV       BP, SP         ;Points to pushed parm, BP saved on
  199.                                   ;initial entry, ok to change within
  200.                                   ;routine. This limits pushing/popping
  201.          CALL      _PARNI
  202.          MOV       RIGHT, AL
  203.         
  204.          DEC       BYTE PTR [BP]  ; 3
  205.          CALL      _PARNI
  206.          MOV       BOTTOM, AL
  207.         
  208.          DEC       BYTE PTR [BP]  ; 2
  209.          CALL      _PARNI
  210.          MOV       LEFT, AL
  211.         
  212.          DEC       BYTE PTR [BP]    ; 1
  213.          CALL      _PARNI
  214.          MOV       TOP, AL
  215.          POP       AX             ; Restore stack
  216.         
  217.          RET
  218.         
  219. GETX     ENDP        
  220. ;
  221. _prog    ends
  222.          end
  223.  
  224.  
  225.