home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
asm_kit
/
scrn.asm
< prev
next >
Wrap
Assembly Source File
|
1985-05-10
|
12KB
|
338 lines
TITLE SCRN - SCREEN SAVE RESIDENT UTILITY COMMAND, Version 2.2
PAGE 60,132 ; JAN 21, 1984
COMMENT |
╔═══════════════════════════════════════════════════════════════════╗
║ Copyright (c), 1984 by J. T. Thannum ║
║ All rights reserved. May be copied ║
║ for personal non-commercial use only. ║
╚═══════════════════════════════════════════════════════════════════╝
SCRN n
[options]
n - The Delay Interval in Minutes as a single Integer from 1 to 9
[Default: 10 Minutes]
SCRN is a screen saver utility command which operates using the Timer,
Video and Keyboard Interrupts to monitor activity of the system user. Upon
detecting no entry via the keyboard OR output to the monitor(s) for "n" min.
the SCRN routine will turn off the video to all monitors attached to the
system. The idea for this program originated from an article in Softalk,
Dec. 1983 by John Socha. However, the version presented in this article
had several limitations which needed to be corrected for a viable
permanmently resident utility. These limitations became the design
criteria for this version, as follows:
1. Must turn "both" color and monochrome monitors off, not
just the active monitor on two monitor systems.
2. Must function in a single monitor envirnoment with either
monitor attached.
3. Must be extremely frugal in execution. Since this routine
will be executed at each timer interrupt,or 18.2 times/sec,
and at each keyboard interrupt the routine must have the
minimum of overhead so as not to degrade system performance.
4. Must be able blank background on color monitor as well as
foreground text or graphics.
5. Should utilize the User Exit Interrupt provided in the
Timer Routine. [INT 1C] (This can be considered optional)
6. Handle the blanking of the cursor on the Monochrome display
more efficiently.
7. Output to the Monitor(s) should reset the timeout counter
within the delay window but not turn the video back on if
a timeout has occurred.
8. Optional Parameter to set Delay Interval from 1 to 10 min.
(Special Note: The Mode register definition shown in the Softalk article
is incorrect as well as the referenced Enable Video bit.
The program is correct as shown in the article.)
For efficiency and execution the Screen Saver program "hard codes"
addresses and uses its own routine to set adapter parameters. However,
this hard coding is done via equates and because of the brevity of the
program this would cause only minor problems if changes were required.
J. T. Thannum
Naperville, Ill 60540
|
PAGE
;
; System Interrupt Vectors for BIOS and DOS
; - TIMER_INT Routine User Exit [INT 1C] redirected by SCRN
; - KB_INT Routine [INT 9] intercepted by SCRN
; - VIDEO_INT Routine [INT 10] intercepted by SCRN
;
INT_VECTORS SEGMENT AT 0
ORG 9H*4
KB_INT LABEL DWORD ;KEYBOARD INTERRUPT
ORG 10H*4
VIDEO_INT LABEL DWORD ;VIDEO I/O INTERRUPT
ORG 1CH*4
TIMER_EXIT LABEL DWORD ;TIMER USER ROUTINE EXIT
INT_VECTORS ENDS
;
; ROM BIOS Data Area
;
DATA SEGMENT AT 40H
ORG 10H
EQUIP_FLAG DW ? ;EQUIPMENT INSTALLED IN SYSTEM
ORG 60H
CURSOR_MODE DW ? ;CURRENT CURSOR MODE FOR ACTIVE DISPLAY
ORG 63H
ADDR_6845 DW ? ;BASE ADDRESS OF ACTIVE ADAPTER
CRT_MODE_SET DB ? ;CURRENT SETTING OF 3x8 REGISTER
CRT_PALLETTE DB ? ;CURRENT COLOR SETTINGS
DATA ENDS
PAGE
;
; SCRN - Screen Save Program Code Segment
; -Main Procedures:
; -TIMER_USER_ROUTINE - Processing at each Timer Interrupt to
; determine if video should be turned "off"
; -KEYBOARD_INTERCEPT - Processing at each Keyboard interrupt to
; determine of video should be turned "on".
; Resets delay counter at each invocation.
; -VIDEO_IO_INTERCEPT - Processing at each Video I/O interrupt to
; keep video on by resetting delay counter.
; -INIT_PROC - Initialize program and make resident. Not
; retained in memory with resident portion
; -CURSOR_SET - Subroutine to turn Monochrome Adapter
; cursor on and off
;
SCREEN_SAV SEGMENT PUBLIC 'CODE'
ASSUME CS:SCREEN_SAV
;
; Program Segment Prefix
; - Location of Command Parameters
; - For Valid Parameter String the PARM_COUNT = 2 and the
; PARM_DATA byte will be 1 to 9 (31H to 39H ASCII)
;
ORG 80H
PARM_COUNT DB ? ;NO. OF CHARACTERS IN PARAMETER STRING
SPACE DB ?
PARM_DATA DB ? ;DELAY VALUE PARAMETER
;
ORG 100H
BEGIN: JMP INIT_PROC ;INITIALIZE & MAKE RESIDENT
;
; Program Save Area for Interrupts and Data
;
BIOS_KB_INT DD ? ;BIOS INTERRUPT POINTERS FOR KEYBOARD
BIOS_VIDEO_INT DD ? ;BIOS INTERRUPT POINTERS FOR VIDEO I/O
BIOS_TIMER_EXIT DD ? ;BIOS INTERRUPT POINTERS FOR TIMER EXIT
VIDEO_STATUS DB 8 ;SET BIT 4 TO ONE - INITIALIZES AS "ON"
DELAY_VALUE DW 2AA8H ;SETS DELAY INTERVAL - DEFAULT 10 MIN
DELAY_COUNTER DW 2AA8H ;COUNTDOWN TIMER - INIT @ DEFAULT
MESSAGE DB 'Screen Saver, Ver. 2.2',CR,LF,'$'
;
; Equates
;
CR EQU 0DH ;CARRIAGE RETURN
LF EQU 0AH ;LINE FEED
VALID_COUNT EQU 2 ;VALID COMMAND PARAMETER STRING COUNT
DELAY_1_MIN EQU 444H ;DELAY INTERVAL FOR 1 MINUTE
VIDEO_OFF EQU 8 ;TEST VALUE FOR VIDEO OFF BIT
MONO_CUR_OFF EQU 2B0CH ;VALUES TO WRITE TO CURSOR REGISTERS
MONO_CUR_ON EQU 0B0CH ; TO TURN CURSOR "ON" AND "OFF"
COLOR_MODE_REG EQU 3D8H ;ADDRESSES FOR EACH ADAPTERS
MONO_MODE_REG EQU 3B8H ; 6845 MODE REGISTER
ADDR_6845_MONO EQU 3B4H ;MONOCHROME ADAP.- 6845 ADDRESS REGISTER
COLOR_SEL_REG EQU 3D9H ;COLOR ADAP.- 6845 COLOR SELECT REGISTER
REG_10 EQU 10 ;CURSOR START REGISTER - CURSOR ENABLE
REG_11 EQU 11 ;CURSOR END REGISTER
DEF_MODE_ON EQU 29H ;DEFAULT CRT_MODE_SET FOR VIDEO ENABLED
DEF_MODE_OFF EQU 21H ; " " " " " " DISABLED
COLOR_ACTIVE EQU 10H ;TEST FOR ACTIVE MONITOR ADAPTER
BG_BLACK EQU 0FH ;TEST FOR BLACK BACKGROUND SETTING
PAGE
;
; Timer Exit Routine - Determines if video should be turned off
; -Uses INT 1C, but chains interrupt in the event additional user routines
; are installed
;
TIMER_USER_ROUTINE PROC NEAR
ASSUME CS:SCREEN_SAV,DS:DATA
PUSH AX
PUSH DS
MOV AX,DATA ;ESTABLISH DATA SEGMENT
MOV DS,AX
TEST VIDEO_STATUS,VIDEO_OFF ;IS VIDEO, OFF?
JZ EXIT_TIMER ; YES, NO ACTION IS REQUIRED
DEC DELAY_COUNTER ;HAS DELAY TIME ELAPSED?
JNZ EXIT_TIMER ; NO, THEN NO ACTION IS REQ'D
;
CLI
PUSH DX
PUSH CX
;
; Turn Monochrome Video OFF including Cursor
;
MOV DX,MONO_MODE_REG ;SET OUTPUT TO MODE REGISTER,
MOV AL,DEF_MODE_OFF ; GET DATA TO OUTPUT
OUT DX,AL ; THEN TURN OFF WITH DEFAULT MODE
MOV CX,MONO_CUR_OFF ;SET TO TURN CURSOR OFF,
CALL CURSOR_SET ; THEN CALL ROUTINE TO DO IT
;
; Turn Color Video OFF
;
TEST EQUIP_FLAG,COLOR_ACTIVE ;IS COLOR DISPLAY ACTIVE?
JZ GET_MODE ; YES, THEN GET CURRENT MODE
MOV AL,DEF_MODE_OFF ; NO, THEN USE DEFAULT MODE
JMP SHORT CONT
GET_MODE: MOV AL,CRT_MODE_SET ;CURRENT ACTIVE MODE SETTING
AND AL,0F7H ;TURN VIDEO ENABLE BIT OFF
MOV CRT_MODE_SET,AL ;SAVE NEW MODE SETTING
CONT: MOV DX,COLOR_MODE_REG ;GET ADDRESS OF MODE REGISTER
OUT DX,AL ; THEN OUTPUT TO TURN VIDEO OFF
TEST CRT_PALLETTE,BG_BLACK ;IS BACKGROUND COLOR BLACK?
JZ DONE ; YES, THEN DONE
MOV AL,CRT_PALLETTE ; ELSE, GET CURRENT PALLETTE
AND AL,0F0H ;SET FOR BLACK BACKGROUND
MOV DX,COLOR_SEL_REG ;GET ADDR OF COLOR SELECT REG
OUT DX,AL ;SET BACKGROUND TO BLACK
DONE: AND VIDEO_STATUS,0F7H ;SET VIDEO STATUS "OFF"
POP CX
POP DX
STI
EXIT_TIMER: POP DS
POP AX
JMP BIOS_TIMER_EXIT ;CHAIN TO NEXT ROUTINE OR EXIT
; TO FINISH TIMER INTERRUPT
TIMER_USER_ROUTINE ENDP
PAGE
;
; Keyboard Intercept Routine
; -Intercepts Keyboard INT 9, checks if video should be turned on
; then chains to normal keyboard processing
;
KEYBOARD_INTERCEPT PROC NEAR
ASSUME CS:SCREEN_SAV,DS:DATA
PUSH AX
PUSH DS
MOV AX,DATA ;ESTABLISH DATA SEGMENT
MOV DS,AX
MOV AX,DELAY_VALUE ;RESET,
MOV DELAY_COUNTER,AX ; DELAY COUNTER
TEST VIDEO_STATUS,VIDEO_OFF ;IF VIDEO IS ON,
JNZ EXIT_KB ; EXIT, NO ACTION IS REQUIRED
;
CLI
PUSH DX
PUSH CX
;
; Turn Monochrome Video ON including Cursor
;
MOV DX,MONO_MODE_REG ;SET OUTPUT TO MODE REGISTER,
MOV AL,DEF_MODE_ON ; GET DATA TO OUTPUT,
OUT DX,AL ; THEN TURN OFF WITH DEFAULT MODE
MOV CX,MONO_CUR_ON ;SET TO TURN CURSOR ON,
CALL CURSOR_SET ; THEN CALL ROUTINE TO DO IT
;
; Turn Color Video ON
;
TEST EQUIP_FLAG,COLOR_ACTIVE ;IS COLOR DISPLAY ACTIVE?
JZ GET_MODE1 ; YES, THEN GET CURRENT MODE
MOV AL,DEF_MODE_ON ; NO, THEN USE DEFAULT MODE
JMP SHORT CONT1
GET_MODE1: MOV AL,CRT_MODE_SET ;CURRENT ACTIVE MODE SETTING
OR AL,8 ;TURN VIDEO ENABLE BIT ON
MOV CRT_MODE_SET,AL ;SAVE NEW MODE SETTING
CONT1: MOV DX,COLOR_MODE_REG ;GET ADDRESS OF MODE REGISTER
OUT DX,AL ; THEN OUTPUT TO TURN VIDEO ON
TEST CRT_PALLETTE,BG_BLACK ;IS BACKGROUND COLOR BLACK?
JZ DONE1 ; YES, THEN DONE
MOV AL,CRT_PALLETTE ; ELSE, GET CURRENT PALLETTE
MOV DX,COLOR_SEL_REG ;GET ADDR OF COLOR SELECT REG
OUT DX,AL ;RESTORE BACKGROUND COLOR
DONE1: OR VIDEO_STATUS,8 ;SET VIDEO STATUS "ON"
POP CX
POP DX
STI
EXIT_KB: POP DS
POP AX
JMP BIOS_KB_INT ;CHAIN TO NEXT ROUTINE OR EXIT
; TO FINISH TIMER INTERRUPT
KEYBOARD_INTERCEPT ENDP
PAGE
;
; Video I/O Intercept Routine
; -Intercepts Video I/O INT 10H, resets the delay counter
; then chains to normal Video I/O processing
;
VIDEO_IO_INTERCEPT PROC NEAR
ASSUME CS:SCREEN_SAV,DS:NOTHING
PUSH AX
MOV AX,DELAY_VALUE ;RESET,
MOV DELAY_COUNTER,AX ; DELAY COUNTER
POP AX
JMP BIOS_VIDEO_INT ;CHAIN TO VIDEO I/O INTERRUPT
; PROCESSING
VIDEO_IO_INTERCEPT ENDP
;
; Subroutine to Turn Monochrome Adapter Cursor ON or OFF
;
CURSOR_SET PROC NEAR
ASSUME CS:SCREEN_SAV,DS:DATA
MOV DX,ADDR_6845_MONO ;SET TO WRITE ADDRESS REGISTER,
MOV AL,REG_10 ; SELECT CURSOR START REGISTER
OUT DX,AL ; OUTPUT REGISTER SELECTION
INC DX ;POINT TO 6845 DATA REGISTER
MOV AL,CH ;GET CURSOR START VALUE, THEN
OUT DX,AL ; SET START REGISTER
DEC DX ;POINT BACK TO ADDRESS REGISTER
MOV AL,REG_11 ; SELECT CURSOR END REGISTER
OUT DX,AL ; OUTPUT REGISTER SELECTION
INC DX ;POINT AGAIN TO DATA REGISTER
MOV AL,CL ;GET CURSOR END VALUE, THEN
OUT DX,AL ; SET END REGISTER
RET
CURSOR_SET ENDP
PAGE
;
; Initialize Screen Save Program and Make Resident
;
INIT_PROC PROC NEAR
ASSUME DS:INT_VECTORS
MOV AX,INT_VECTORS
MOV DS,AX
PUSH ES
CLI
LES AX,KB_INT ;SAVE KB_INT
MOV BIOS_KB_INT,AX ; POINTERS TO
MOV BIOS_KB_INT[2],ES ; BIOS KEYBOARD ROUTINE
MOV KB_INT,OFFSET KEYBOARD_INTERCEPT ;SET KEYBOARD INT
MOV KB_INT[2],CS ; TO POINT HERE
;
LES AX,VIDEO_INT ;SAVE VIDEO_INT
MOV BIOS_VIDEO_INT,AX ; POINTERS TO
MOV BIOS_VIDEO_INT[2],ES ; BIOS VIDEO I/O ROUTINE
MOV VIDEO_INT,OFFSET VIDEO_IO_INTERCEPT ;SET VIDEO I/O INT
MOV VIDEO_INT[2],CS ; TO POINT HERE
;
LES AX,TIMER_EXIT ;SAVE ANY OTHER USER
MOV BIOS_TIMER_EXIT,AX ; ROUTINE USING
MOV BIOS_TIMER_EXIT[2],ES ; TIMER EXIT
MOV TIMER_EXIT,OFFSET TIMER_USER_ROUTINE ;SET TIMER EXIT
MOV TIMER_EXIT[2],CS ; TO POINT HERE
;
CMP PARM_COUNT,VALID_COUNT ;CHECK FOR OPTIONS
JNZ DEFAULT ; NONE, USE DEFAULT OF 10 MIN
MOV AL,PARM_DATA ;GET DELAY OPTION AND
AND AX,000FH ; CONVERT ASCII TO BINARY
MOV BX,DELAY_1_MIN ;LOAD DELAY VALUE FOR 1 MIN
MUL BX ;CALCULATE DELAY VALUE
MOV DELAY_VALUE,AX ;SAVE DELAY VALUE
MOV DELAY_COUNTER,AX ;SET DELAY COUNTER
DEFAULT: STI
ASSUME DS:SCREEN_SAV
MOV AX,CS
MOV DS,AX
MOV DX,OFFSET MESSAGE ;PRINT INTRO
MOV AH,9
INT 21H
MOV DX,OFFSET INIT_PROC ;END OF RESIDENT PORTION
INT 27H ; TERMINATE AND STAY RESIDENT
INIT_PROC ENDP
SCREEN_SAV ENDS
END BEGIN