home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frostbyte's 1980s DOS Shareware Collection
/
floppyshareware.zip
/
floppyshareware
/
GLEN
/
LQM11.ZIP
/
REVID.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-04-15
|
6KB
|
127 lines
;=============================================================================
; FUNCTION: REVID
; PURPOSE: Reverses the video attribute for a specified number of characters
; beginning at coordinates x,y. Written to interface with a small
; memory model C program. The function call is:
;
; REVID(unsigned int col, row, no_chars);
;
; Note: col and row are numbered from 1 to upper limit.
;
; ARGUMENTS: SP+4 = column number of first character to reverse attribute
; SP+6 = row number of first character to reverse attribute
; SP+8 = number of characters to reverse video attribute
; RETURNS: None
;=============================================================================
_TEXT SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:_TEXT
MAX_COL DB ? ;WIDTH OF SCREEN IN COLUMNS
OLD_CX DW ? ;OLD CX VALUE
PAGE_NUM DB ? ;PAGE NUMBER
POSITION LABEL WORD ;CURSOR POSITION
COL DB ? ;COLUMN NUMBER
ROW DB ? ;ROW NUMBER
START_POS LABEL WORD ;CURSOR POSITION AT START OF ROUTINE
START_COL DB ? ;COLUMN NUMBER AT START OF ROUTINE
START_ROW DB ? ;ROW NUMBER AT START OF ROUTINE
PUBLIC _REVID
_REVID PROC NEAR
PUSH BP ;SAVE BP
MOV BP,SP ;MAKE BP SAME AS SP
MOV OLD_CX,CX ;SAVE OLD CX VALUE
MOV CX,[BP+4] ;RETRIEVE COLUMN NUMBER ARGUMENT
DEC CX ;SUBTRACT ONE FOR DOS REPRESENTATION OF COLUMN
MOV COL,CL
MOV CX,[BP+6] ;RETRIEVE ROW NUMBER ARGUMENT
DEC CX ;SUBTRACT ONE FOR DOS REPRESENTATION OF ROW
MOV ROW,CL
MOV CX,[BP+8] ;RETRIEVE LENGTH ARGUMENT
PUSH AX ;SAVE REGISTERS
PUSH BX
PUSH DX
PUSH DS
PUSH CS ;MAKE CODE & DATA SEGMENTS SAME
POP DS
PUSH CX ;SAVE LENGTH
;GET SCREEN WIDTH & CURRENT PAGE NUMBER
MOV AH,0Fh ;SERVICE OFh, GET CURRENT VIDEO STATE
INT 10h ;CALL BIOS INTERRUPT 10h
MOV MAX_COL,AH ;SAVE SCREEN COLUMN WIDTH
MOV PAGE_NUM,BH ;SAVE PAGE NUMBER
;GET CURRENT CURSOR POSITION AND SAVE IT
MOV AH,03h ;SERVICE 03h, GET CURSOR POSITION AND SIZE
INT 10h ;CALL BIOS INTERRUPT 10h
MOV START_COL,DL ;SAVE STARTING COLUMN NUMBER
MOV START_ROW,DH ;SAVE STARTING ROW NUMBER
;MOVE CURSOR TO START OF STRING
MOV DX,POSITION ;SET CURSOR POSITION
MOV AH,2 ;SERVICE 2, SET CURSOR POSITON
INT 10h ;CALL BIOS INTERRUPT 10h
POP CX ;RETRIEVE COUNTER
DOIT: PUSH CX ;SAVE COUNTER
;READ CURRENT CHARACTER & ATTRIBUTE
MOV BH,PAGE_NUM ;PAGE NUMBER
MOV AH,8 ;SERVICE 8, READ CHARACTER & ATTRIBUTE
INT 10h ;CALL BIOS INTERRUPT 10h
;REVERSE VIDEO ATTRIBUTE
MOV BL,AH ;MOVE ATTRIBUTE TO BL
MOV BH,AH ;MOVE ATTRIBUTE TO BH
MOV CL,4 ;NUMBER OF BITS TO SHIFT
SHR BX,CL ;BL NOW HAS REVERSED ATTRIBUTE BYTES
;WRITE CHARACTER & REVERSED ATTRIBUTE BACK TO SCREEN
MOV BH,PAGE_NUM ;PAGE NUMBER
MOV CX,1 ;PRINT ONE CHARACTER
MOV AH,9 ;SERVICE 9, WRITE CHARACTER & ATTRIBUTE
INT 10h ;CALL BIOS INTERRUPT 10h
CALL CUR_RIGHT ;MOVE CURSOR RIGHT
POP CX ;RESTORE COUNTER
LOOP DOIT ;DEC CL & LOOP IF NOT ZERO
MOV BH,PAGE_NUM ;GET PAGE NUMBER
MOV DX,START_POS ;SET STARTING CURSOR POSITION
MOV AH,2 ;SERVICE 2, SET CURSOR POSITON
INT 10h ;CALL BIOS INTERRUPT 10h
POP DS ;RESTORE REGISTERS
POP DX
POP BX
POP AX
POP BP
MOV CX,OLD_CX
RET ;RETURN TO CALLING ROUTINE
_REVID ENDP
PUBLIC CUR_RIGHT
CUR_RIGHT PROC NEAR
PUSH AX ;SAVE REGISTGERS USED
PUSH BX
PUSH DX
MOV DL,COL ;RETREIVE CURRENT COLUMN
INC DL ;INCREMENT COLUMN POSITION
CMP DL,MAX_COL ;CHECK IF CURSOR AT LAST COLUMN
JGE NEWLINE ;YES, SET COL TO ZERO AND ROW+1
JMP SHORT UPDATE
NEWLINE:
XOR DL,DL ;ZERO COLUMN
INC ROW ;MOVE DOWN ONE ROW
UPDATE:
MOV COL,DL ;SAVE NEW COLUMN POSITION
MOV DH,ROW ;GET ROW NUMBER
MOV BH,PAGE_NUM ;PAGE NUMBER
MOV AH,2 ;SERVICE 2, POSITION CURSOR
INT 10h ;CALL BIOS INTERRUPT 10h
EXIT:
POP DX ;RESTORE REGISTERS
POP BX
POP AX
RET ;RETURN TO CALLING ROUTINE
CUR_RIGHT ENDP
_TEXT ENDS
END