home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
nor_asm
/
cursor.asm
< prev
next >
Wrap
Assembly Source File
|
1989-08-13
|
6KB
|
212 lines
CR EQU 13 ;Carriage return
LF EQU 10 ;Line feed
;-----------------------------------------------------------------------;
; This file contains procedures that move the cursor, as well as two ;
; procedures for clearing parts of the screen. ;
; ;
; CLEAR_SCREEN Clear the entire screen ;
; GOTO_XY Move the cursor to a new position ;
; CURSOR_RIGHT Move the cursor right one column ;
; UPDATE_REAL_CURSOR Move real cursor to virtual cursor posn ;
; UPDATE_VIRTUAL_CURSOR Move virtual cursor to real cursor posn ;
; READ_CURSOR_POSITION Get the current cursor position ;
; CLEAR_TO_END_OF_LINE Clear all the line after the cursor ;
; SEND_CRLF Move cursor to start of the next line ;
;-----------------------------------------------------------------------;
.MODEL SMALL
.CODE
PUBLIC CLEAR_SCREEN
;-----------------------------------------------------------------------;
; This procedure clears the entire screen. ;
;-----------------------------------------------------------------------;
CLEAR_SCREEN PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR AL,AL ;Blank entire window
XOR CX,CX ;Upper left corner is at (0,0)
MOV DH,24 ;Bottom line of screen is line 24
MOV DL,79 ;Right side is at column 79
MOV BH,7 ;Use normal attribute for blanks
MOV AH,6 ;Call for SCROLL-UP function
INT 10h ;Clear the window
POP DX
POP CX
POP BX
POP AX
RET
CLEAR_SCREEN ENDP
PUBLIC GOTO_XY
.DATA
EXTRN SCREEN_PTR:WORD ;Pointer to character under cursor
EXTRN SCREEN_X:BYTE, SCREEN_Y:BYTE
.CODE
;-----------------------------------------------------------------------;
; This procedure moves the cursor ;
; ;
; On entry: DH Row (Y) ;
; DL Column (X) ;
;-----------------------------------------------------------------------;
GOTO_XY PROC
PUSH AX
PUSH BX
MOV BH,0 ;Display page 0
MOV AH,2 ;Call for SET CURSOR POSITION
INT 10h
MOV AL,DH ;Get the row number
MOV BL,80 ;Multiply by 80 chars per line
MUL BL ;AX = row * 80
ADD AL,DL ;Add column
ADC AH,0 ;AX = row * 80 + column
SHL AX,1 ;Convert to a byte offset
MOV SCREEN_PTR,AX ;Save the cursor offset
MOV SCREEN_X,DL ;Save the cursor position
MOV SCREEN_Y,DH
POP BX
POP AX
RET
GOTO_XY ENDP
PUBLIC CURSOR_RIGHT
.DATA
EXTRN SCREEN_PTR:WORD ;Pointer to character under cursor
EXTRN SCREEN_X:BYTE, SCREEN_Y:BYTE
.CODE
;-----------------------------------------------------------------------;
; This procedure moves the cursor one position to the right or to the ;
; next line if the cursor was at the end of a line. ;
; ;
; Uses: SEND_CRLF ;
; Writes: SCREEN_PTR, SCREEN_X, SCREEN_Y ;
;-----------------------------------------------------------------------;
CURSOR_RIGHT PROC
INC SCREEN_PTR ;Move to next character position (word)
INC SCREEN_PTR
INC SCREEN_X ;Move to next column
CMP SCREEN_X,79 ;Make sure column <= 79
JBE OK
CALL SEND_CRLF ;Go to next line
OK:
RET
CURSOR_RIGHT ENDP
PUBLIC UPDATE_REAL_CURSOR
;-----------------------------------------------------------------------;
; This procedure moves the real cursor to the current virtual cursor ;
; position. You'll want to call it just before you wait for keyboard ;
; input. ;
;-----------------------------------------------------------------------;
UPDATE_REAL_CURSOR PROC
PUSH DX
MOV DL,SCREEN_X ;Get position of the virtual cursor
MOV DH,SCREEN_Y
CALL GOTO_XY ;Move real cursor to this position
POP DX
RET
UPDATE_REAL_CURSOR ENDP
PUBLIC UPDATE_VIRTUAL_CURSOR
;-----------------------------------------------------------------------;
; This procedure updates the position of our virtual cursor to agree ;
; with the position of the real cursor. ;
;-----------------------------------------------------------------------;
UPDATE_VIRTUAL_CURSOR PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3 ;Ask for the cursor position
XOR BH,BH ;On page 0
INT 10h ;Get cursor position into DH, DL
CALL GOTO_XY ;Move virtual cursor to this position
POP DX
POP CX
POP BX
POP AX
RET
UPDATE_VIRTUAL_CURSOR ENDP
PUBLIC READ_CURSOR_POSITION
;-----------------------------------------------------------------------;
; This procedure doesn't follow the conventions for returning ;
; information in the AX register so that it can be used easily with ;
; GOTO_XY. ;
; ;
; Returns: DH,DL Row, column of cursor ;
;-----------------------------------------------------------------------;
READ_CURSOR_POSITION PROC
PUSH AX
PUSH BX
PUSH CX
MOV AH,3 ;Ask for current cursor position
MOV BH,0 ;On page 0
INT 10h ;Return information in DX
POP CX
POP BX
POP AX
RET
READ_CURSOR_POSITION ENDP
PUBLIC CLEAR_TO_END_OF_LINE
;-----------------------------------------------------------------------;
; This procedure clears the line from the current cursor position to ;
; the end of that line. ;
;-----------------------------------------------------------------------;
CLEAR_TO_END_OF_LINE PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DL,SCREEN_X
MOV DH,SCREEN_Y
MOV AH,6 ;Set up to clear to end of line
XOR AL,AL ;Clear window
MOV CH,DH ;All on same line
MOV CL,DL ;Start at the cursor position
MOV DL,79 ;And stop at the end of the line
MOV BH,7 ;Use normal attribute
INT 10h
POP DX
POP CX
POP BX
POP AX
RET
CLEAR_TO_END_OF_LINE ENDP
PUBLIC SEND_CRLF
;-----------------------------------------------------------------------;
; This routine just sends a carriage return-line feed pair to the ;
; display, using the DOS routines so that scrolling will be handled ;
; correctly. ;
; ;
; Uses: UPDATE_VIRTUAL_CURSOR ;
;-----------------------------------------------------------------------;
SEND_CRLF PROC
PUSH AX
PUSH DX
MOV AH,2
MOV DL,CR
INT 21h
MOV DL,LF
INT 21h
CALL UPDATE_VIRTUAL_CURSOR ;Update position of virtual cursor
POP DX
POP AX
RET
SEND_CRLF ENDP
END