Category : Assembly Language Source Code
Archive   : NORTASM.ZIP
Filename : CURSOR.ASM

 
Output of file : CURSOR.ASM contained in archive : NORTASM.ZIP
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


  3 Responses to “Category : Assembly Language Source Code
Archive   : NORTASM.ZIP
Filename : CURSOR.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/