home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / nor_asm / cursor.asm < prev    next >
Assembly Source File  |  1989-08-13  |  6KB  |  212 lines

  1. CR    EQU    13            ;Carriage return
  2. LF    EQU    10            ;Line feed
  3.  
  4. ;-----------------------------------------------------------------------;
  5. ; This file contains procedures that move the cursor, as well as two    ;
  6. ; procedures for clearing parts of the screen.                ;
  7. ;                                    ;
  8. ; CLEAR_SCREEN            Clear the entire screen            ;
  9. ; GOTO_XY            Move the cursor to a new position    ;
  10. ; CURSOR_RIGHT            Move the cursor right one column    ;
  11. ; UPDATE_REAL_CURSOR        Move real cursor to virtual cursor posn    ;
  12. ; UPDATE_VIRTUAL_CURSOR        Move virtual cursor to real cursor posn    ;
  13. ; READ_CURSOR_POSITION        Get the current cursor position        ;
  14. ; CLEAR_TO_END_OF_LINE        Clear all the line after the cursor    ;
  15. ; SEND_CRLF            Move cursor to start of the next line    ;
  16. ;-----------------------------------------------------------------------;
  17.  
  18. .MODEL    SMALL
  19. .CODE
  20.  
  21.     PUBLIC    CLEAR_SCREEN
  22. ;-----------------------------------------------------------------------;
  23. ; This procedure clears the entire screen.                ;
  24. ;-----------------------------------------------------------------------;
  25. CLEAR_SCREEN    PROC
  26.     PUSH    AX
  27.     PUSH    BX
  28.     PUSH    CX
  29.     PUSH    DX
  30.     XOR    AL,AL            ;Blank entire window
  31.     XOR    CX,CX            ;Upper left corner is at (0,0)
  32.     MOV    DH,24            ;Bottom line of screen is line 24
  33.     MOV    DL,79            ;Right side is at column 79
  34.     MOV    BH,7            ;Use normal attribute for blanks
  35.     MOV    AH,6            ;Call for SCROLL-UP function
  36.     INT    10h            ;Clear the window
  37.     POP    DX
  38.     POP    CX
  39.     POP    BX
  40.     POP    AX
  41.     RET
  42. CLEAR_SCREEN    ENDP
  43.  
  44.  
  45.     PUBLIC    GOTO_XY
  46. .DATA
  47.     EXTRN    SCREEN_PTR:WORD        ;Pointer to character under cursor
  48.     EXTRN    SCREEN_X:BYTE, SCREEN_Y:BYTE
  49. .CODE
  50. ;-----------------------------------------------------------------------;
  51. ; This procedure moves the cursor                    ;
  52. ;                                    ;
  53. ; On entry:    DH    Row (Y)                        ;
  54. ;        DL    Column (X)                    ;
  55. ;-----------------------------------------------------------------------;
  56. GOTO_XY        PROC
  57.     PUSH    AX
  58.     PUSH    BX
  59.     MOV    BH,0            ;Display page 0
  60.     MOV    AH,2            ;Call for SET CURSOR POSITION
  61.     INT    10h
  62.  
  63.     MOV    AL,DH            ;Get the row number
  64.     MOV    BL,80            ;Multiply by 80 chars per line
  65.     MUL    BL            ;AX = row * 80
  66.     ADD    AL,DL            ;Add column
  67.     ADC    AH,0            ;AX = row * 80 + column
  68.     SHL    AX,1            ;Convert to a byte offset
  69.     MOV    SCREEN_PTR,AX        ;Save the cursor offset
  70.     MOV    SCREEN_X,DL        ;Save the cursor position
  71.     MOV    SCREEN_Y,DH
  72.     
  73.     POP    BX
  74.     POP    AX
  75.     RET
  76. GOTO_XY        ENDP
  77.  
  78.     PUBLIC    CURSOR_RIGHT
  79. .DATA
  80.     EXTRN    SCREEN_PTR:WORD        ;Pointer to character under cursor
  81.     EXTRN    SCREEN_X:BYTE, SCREEN_Y:BYTE
  82. .CODE
  83. ;-----------------------------------------------------------------------;
  84. ; This procedure moves the cursor one position to the right or to the    ;
  85. ; next line if the cursor was at the end of a line.            ;
  86. ;                                    ;
  87. ; Uses:        SEND_CRLF                        ;
  88. ; Writes:    SCREEN_PTR, SCREEN_X, SCREEN_Y                ;
  89. ;-----------------------------------------------------------------------;
  90. CURSOR_RIGHT    PROC
  91.     INC    SCREEN_PTR        ;Move to next character position (word)
  92.     INC    SCREEN_PTR
  93.     INC    SCREEN_X        ;Move to next column
  94.     CMP    SCREEN_X,79        ;Make sure column <= 79
  95.     JBE    OK
  96.     CALL    SEND_CRLF        ;Go to next line
  97. OK:
  98.     RET
  99. CURSOR_RIGHT    ENDP
  100.  
  101.     PUBLIC    UPDATE_REAL_CURSOR
  102. ;-----------------------------------------------------------------------;
  103. ; This procedure moves the real cursor to the current virtual cursor    ;
  104. ; position.  You'll want to call it just before you wait for keyboard    ;
  105. ; input.                                ;
  106. ;-----------------------------------------------------------------------;
  107. UPDATE_REAL_CURSOR    PROC
  108.     PUSH    DX
  109.     MOV    DL,SCREEN_X        ;Get position of the virtual cursor
  110.     MOV    DH,SCREEN_Y
  111.     CALL    GOTO_XY            ;Move real cursor to this position
  112.     POP    DX
  113.     RET
  114. UPDATE_REAL_CURSOR    ENDP
  115.  
  116.  
  117.     PUBLIC    UPDATE_VIRTUAL_CURSOR
  118. ;-----------------------------------------------------------------------;
  119. ; This procedure updates the position of our virtual cursor to agree    ;
  120. ; with the position of the real cursor.                    ;
  121. ;-----------------------------------------------------------------------;
  122. UPDATE_VIRTUAL_CURSOR    PROC
  123.     PUSH    AX
  124.     PUSH    BX
  125.     PUSH    CX
  126.     PUSH    DX
  127.     MOV    AH,3            ;Ask for the cursor position
  128.     XOR    BH,BH            ;On page 0
  129.     INT    10h            ;Get cursor position into DH, DL
  130.     CALL    GOTO_XY            ;Move virtual cursor to this position
  131.     POP    DX
  132.     POP    CX
  133.     POP    BX
  134.     POP    AX
  135.     RET
  136. UPDATE_VIRTUAL_CURSOR    ENDP
  137.  
  138.  
  139.     PUBLIC    READ_CURSOR_POSITION
  140. ;-----------------------------------------------------------------------;
  141. ; This procedure doesn't follow the conventions for returning        ;
  142. ; information in the AX register so that it can be used easily with    ;
  143. ; GOTO_XY.                                ;
  144. ;                                    ;
  145. ; Returns:    DH,DL    Row, column of cursor                ;
  146. ;-----------------------------------------------------------------------;
  147. READ_CURSOR_POSITION    PROC
  148.     PUSH    AX
  149.     PUSH    BX
  150.     PUSH    CX
  151.     MOV    AH,3            ;Ask for current cursor position
  152.     MOV    BH,0            ;On page 0
  153.     INT    10h            ;Return information in DX
  154.     POP    CX
  155.     POP    BX
  156.     POP    AX
  157.     RET
  158. READ_CURSOR_POSITION    ENDP
  159.  
  160.  
  161.     PUBLIC    CLEAR_TO_END_OF_LINE
  162. ;-----------------------------------------------------------------------;
  163. ; This procedure clears the line from the current cursor position to    ;
  164. ; the end of that line.                            ;
  165. ;-----------------------------------------------------------------------;
  166. CLEAR_TO_END_OF_LINE    PROC
  167.     PUSH    AX
  168.     PUSH    BX
  169.     PUSH    CX
  170.     PUSH    DX
  171.     MOV    DL,SCREEN_X
  172.     MOV    DH,SCREEN_Y
  173.     MOV    AH,6            ;Set up to clear to end of line
  174.     XOR    AL,AL            ;Clear window
  175.     MOV    CH,DH            ;All on same line
  176.     MOV    CL,DL            ;Start at the cursor position
  177.     MOV    DL,79            ;And stop at the end of the line
  178.     MOV    BH,7            ;Use normal attribute
  179.     INT    10h
  180.     POP    DX
  181.     POP    CX
  182.     POP    BX
  183.     POP    AX
  184.     RET
  185. CLEAR_TO_END_OF_LINE    ENDP
  186.  
  187.  
  188.     PUBLIC    SEND_CRLF
  189. ;-----------------------------------------------------------------------;
  190. ; This routine just sends a carriage return-line feed pair to the    ;
  191. ; display, using the DOS routines so that scrolling will be handled    ;
  192. ; correctly.                                ;
  193. ;                                    ;
  194. ; Uses:        UPDATE_VIRTUAL_CURSOR                    ;
  195. ;-----------------------------------------------------------------------;
  196. SEND_CRLF    PROC
  197.     PUSH    AX
  198.     PUSH    DX
  199.     MOV    AH,2
  200.     MOV    DL,CR
  201.     INT    21h
  202.     MOV    DL,LF
  203.     INT    21h
  204.     CALL    UPDATE_VIRTUAL_CURSOR    ;Update position of virtual cursor
  205.     POP    DX
  206.     POP    AX
  207.     RET
  208. SEND_CRLF    ENDP
  209.  
  210.  
  211.     END
  212.