home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / assemutl.zip / SCRN.ASM < prev    next >
Assembly Source File  |  1985-05-11  |  12KB  |  338 lines

  1.     TITLE    SCRN - SCREEN SAVE RESIDENT UTILITY COMMAND, Version 2.2
  2.     PAGE    60,132                  ; JAN 21, 1984
  3. COMMENT |
  4. ╔═══════════════════════════════════════════════════════════════════╗
  5. ║           Copyright (c), 1984 by J. T. Thannum            ║
  6. ║           All rights reserved.  May be copied            ║
  7. ║           for personal non-commercial use only.            ║
  8. ╚═══════════════════════════════════════════════════════════════════╝
  9.  
  10. SCRN n
  11.   [options]
  12.     n - The Delay Interval in Minutes as a single Integer from 1 to 9
  13.         [Default: 10 Minutes]
  14.  
  15. SCRN is a screen saver utility command which operates using the Timer,
  16. Video and Keyboard Interrupts to monitor activity of the system user.  Upon
  17. detecting no entry via the keyboard OR output to the monitor(s) for "n" min.
  18. the SCRN routine will turn off the video to all monitors attached to the
  19. system.  The idea for this program originated from an article in Softalk,
  20. Dec.  1983 by John Socha.  However, the version presented in this article
  21. had several limitations which needed to be corrected for a viable
  22. permanmently resident utility.    These limitations became the design
  23. criteria for this version, as follows:
  24.  
  25.     1. Must turn "both" color and monochrome monitors off, not
  26.        just the active monitor on two monitor systems.
  27.     2. Must function in a single monitor envirnoment with either
  28.        monitor attached.
  29.     3. Must be extremely frugal in execution.  Since this routine
  30.        will be executed at each timer interrupt,or 18.2 times/sec,
  31.        and at each keyboard interrupt the routine must have the
  32.        minimum of overhead so as not to degrade system performance.
  33.     4. Must be able blank background on color monitor as well as
  34.        foreground text or graphics.
  35.     5. Should utilize the User Exit Interrupt provided in the
  36.        Timer Routine. [INT 1C] (This can be considered optional)
  37.     6. Handle the blanking of the cursor on the Monochrome display
  38.        more efficiently.
  39.     7. Output to the Monitor(s) should reset the timeout counter
  40.        within the delay window but not turn the video back on if
  41.        a timeout has occurred.
  42.     8. Optional Parameter to set Delay Interval from 1 to 10 min.
  43.  
  44. (Special Note:    The Mode register definition shown in the Softalk article
  45.         is incorrect as well as the referenced Enable Video bit.
  46.         The program is correct as shown in the article.)
  47.  
  48. For efficiency and execution the Screen Saver program "hard codes"
  49. addresses and uses its own routine to set adapter parameters.  However,
  50. this hard coding is done via equates and because of the brevity of the
  51. program this would cause only  minor problems if changes were required.
  52.  
  53.                         J. T. Thannum
  54.                         Naperville, Ill 60540
  55. |
  56.         PAGE
  57. ;
  58. ; System Interrupt Vectors for BIOS and DOS
  59. ;    - TIMER_INT Routine User Exit [INT 1C] redirected by SCRN
  60. ;    - KB_INT Routine [INT 9] intercepted by SCRN
  61. ;    - VIDEO_INT Routine [INT 10] intercepted by SCRN
  62. ;
  63. INT_VECTORS    SEGMENT AT 0
  64.         ORG    9H*4
  65. KB_INT        LABEL    DWORD        ;KEYBOARD INTERRUPT
  66.         ORG    10H*4
  67. VIDEO_INT    LABEL    DWORD        ;VIDEO I/O INTERRUPT
  68.         ORG    1CH*4
  69. TIMER_EXIT    LABEL    DWORD        ;TIMER USER ROUTINE EXIT
  70.  
  71. INT_VECTORS    ENDS
  72. ;
  73. ; ROM BIOS Data Area
  74. ;
  75. DATA        SEGMENT AT 40H
  76.         ORG    10H
  77. EQUIP_FLAG    DW    ?        ;EQUIPMENT INSTALLED IN SYSTEM
  78.         ORG    60H
  79. CURSOR_MODE    DW    ?        ;CURRENT CURSOR MODE FOR ACTIVE DISPLAY
  80.         ORG    63H
  81. ADDR_6845    DW    ?        ;BASE ADDRESS OF ACTIVE ADAPTER
  82. CRT_MODE_SET    DB    ?        ;CURRENT SETTING OF 3x8 REGISTER
  83. CRT_PALLETTE    DB    ?        ;CURRENT COLOR SETTINGS
  84.  
  85. DATA        ENDS
  86.         PAGE
  87. ;
  88. ; SCRN - Screen Save Program Code Segment
  89. ;    -Main Procedures:
  90. ;        -TIMER_USER_ROUTINE - Processing at each Timer Interrupt to
  91. ;                      determine if video should be turned "off"
  92. ;        -KEYBOARD_INTERCEPT - Processing at each Keyboard interrupt to
  93. ;                      determine of video should be turned "on".
  94. ;                      Resets delay counter at each invocation.
  95. ;        -VIDEO_IO_INTERCEPT - Processing at each Video I/O interrupt to
  96. ;                      keep video on by resetting delay counter.
  97. ;        -INIT_PROC        - Initialize program and make resident. Not
  98. ;                      retained in memory with resident portion
  99. ;        -CURSOR_SET        - Subroutine to turn Monochrome Adapter
  100. ;                      cursor on and off
  101. ;
  102. SCREEN_SAV    SEGMENT PUBLIC 'CODE'
  103.         ASSUME    CS:SCREEN_SAV
  104. ;
  105. ; Program Segment Prefix
  106. ;    - Location of Command Parameters
  107. ;    - For Valid Parameter String the PARM_COUNT = 2 and the
  108. ;      PARM_DATA byte will be 1 to 9 (31H to 39H ASCII)
  109. ;
  110.         ORG    80H
  111. PARM_COUNT    DB    ?        ;NO. OF CHARACTERS IN PARAMETER STRING
  112. SPACE        DB    ?
  113. PARM_DATA    DB    ?        ;DELAY VALUE PARAMETER
  114. ;
  115.         ORG    100H
  116. BEGIN:        JMP    INIT_PROC        ;INITIALIZE & MAKE RESIDENT
  117. ;
  118. ; Program Save Area for Interrupts and Data
  119. ;
  120. BIOS_KB_INT    DD    ?        ;BIOS INTERRUPT POINTERS FOR KEYBOARD
  121. BIOS_VIDEO_INT    DD    ?        ;BIOS INTERRUPT POINTERS FOR VIDEO I/O
  122. BIOS_TIMER_EXIT DD    ?        ;BIOS INTERRUPT POINTERS FOR TIMER EXIT
  123. VIDEO_STATUS    DB    8        ;SET BIT 4 TO ONE - INITIALIZES AS "ON"
  124. DELAY_VALUE    DW    2AA8H        ;SETS DELAY INTERVAL - DEFAULT 10 MIN
  125. DELAY_COUNTER    DW    2AA8H        ;COUNTDOWN TIMER - INIT @ DEFAULT
  126. MESSAGE     DB    'Screen Saver, Ver. 2.2',CR,LF,'$'
  127. ;
  128. ; Equates
  129. ;
  130. CR        EQU    0DH        ;CARRIAGE RETURN
  131. LF        EQU    0AH        ;LINE FEED
  132. VALID_COUNT    EQU    2        ;VALID COMMAND PARAMETER STRING COUNT
  133. DELAY_1_MIN    EQU    444H        ;DELAY INTERVAL FOR 1 MINUTE
  134. VIDEO_OFF    EQU    8        ;TEST VALUE FOR VIDEO OFF BIT
  135. MONO_CUR_OFF    EQU    2B0CH        ;VALUES TO WRITE TO CURSOR REGISTERS
  136. MONO_CUR_ON    EQU    0B0CH        ;    TO TURN CURSOR "ON" AND "OFF"
  137. COLOR_MODE_REG    EQU    3D8H        ;ADDRESSES FOR EACH ADAPTERS
  138. MONO_MODE_REG    EQU    3B8H        ;    6845 MODE REGISTER
  139. ADDR_6845_MONO    EQU    3B4H        ;MONOCHROME ADAP.- 6845 ADDRESS REGISTER
  140. COLOR_SEL_REG    EQU    3D9H        ;COLOR ADAP.- 6845 COLOR SELECT REGISTER
  141. REG_10        EQU    10        ;CURSOR START REGISTER - CURSOR ENABLE
  142. REG_11        EQU    11        ;CURSOR END   REGISTER
  143. DEF_MODE_ON    EQU    29H        ;DEFAULT CRT_MODE_SET FOR VIDEO ENABLED
  144. DEF_MODE_OFF    EQU    21H        ;   "     "    "   "   "    "  DISABLED
  145. COLOR_ACTIVE    EQU    10H        ;TEST FOR ACTIVE MONITOR ADAPTER
  146. BG_BLACK    EQU    0FH        ;TEST FOR BLACK BACKGROUND SETTING
  147.         PAGE
  148. ;
  149. ; Timer Exit Routine - Determines if video should be turned off
  150. ;    -Uses INT 1C, but chains interrupt in the event additional user routines
  151. ;     are installed
  152. ;
  153. TIMER_USER_ROUTINE  PROC NEAR
  154.         ASSUME CS:SCREEN_SAV,DS:DATA
  155.         PUSH    AX
  156.         PUSH    DS
  157.         MOV    AX,DATA         ;ESTABLISH DATA SEGMENT
  158.         MOV    DS,AX
  159.         TEST    VIDEO_STATUS,VIDEO_OFF    ;IS VIDEO, OFF?
  160.         JZ    EXIT_TIMER        ;  YES, NO ACTION IS REQUIRED
  161.         DEC    DELAY_COUNTER        ;HAS DELAY TIME ELAPSED?
  162.         JNZ    EXIT_TIMER        ;  NO, THEN NO ACTION IS REQ'D
  163. ;
  164.         CLI
  165.         PUSH    DX
  166.         PUSH    CX
  167. ;
  168. ; Turn Monochrome Video OFF including Cursor
  169. ;
  170.         MOV    DX,MONO_MODE_REG ;SET OUTPUT TO MODE REGISTER,
  171.         MOV    AL,DEF_MODE_OFF  ;  GET DATA TO OUTPUT
  172.         OUT    DX,AL         ;  THEN TURN OFF WITH DEFAULT MODE
  173.         MOV    CX,MONO_CUR_OFF  ;SET TO TURN CURSOR OFF,
  174.         CALL    CURSOR_SET     ;  THEN CALL ROUTINE TO DO IT
  175. ;
  176. ; Turn Color Video OFF
  177. ;
  178.         TEST    EQUIP_FLAG,COLOR_ACTIVE ;IS COLOR DISPLAY ACTIVE?
  179.         JZ    GET_MODE        ;  YES, THEN GET CURRENT MODE
  180.         MOV    AL,DEF_MODE_OFF     ;  NO,    THEN USE DEFAULT MODE
  181.         JMP    SHORT CONT
  182. GET_MODE:    MOV    AL,CRT_MODE_SET     ;CURRENT ACTIVE MODE SETTING
  183.         AND    AL,0F7H         ;TURN VIDEO ENABLE BIT OFF
  184.         MOV    CRT_MODE_SET,AL     ;SAVE NEW MODE SETTING
  185. CONT:        MOV    DX,COLOR_MODE_REG    ;GET ADDRESS OF MODE REGISTER
  186.         OUT    DX,AL            ; THEN OUTPUT TO TURN VIDEO OFF
  187.         TEST    CRT_PALLETTE,BG_BLACK    ;IS BACKGROUND COLOR BLACK?
  188.         JZ    DONE            ;  YES, THEN DONE
  189.         MOV    AL,CRT_PALLETTE     ;  ELSE, GET CURRENT PALLETTE
  190.         AND    AL,0F0H         ;SET FOR BLACK BACKGROUND
  191.         MOV    DX,COLOR_SEL_REG    ;GET ADDR OF COLOR SELECT REG
  192.         OUT    DX,AL            ;SET BACKGROUND TO BLACK
  193. DONE:        AND    VIDEO_STATUS,0F7H    ;SET VIDEO STATUS "OFF"
  194.         POP    CX
  195.         POP    DX
  196.         STI
  197. EXIT_TIMER:    POP    DS
  198.         POP    AX
  199.         JMP    BIOS_TIMER_EXIT     ;CHAIN TO NEXT ROUTINE OR EXIT
  200.                         ; TO FINISH TIMER INTERRUPT
  201. TIMER_USER_ROUTINE    ENDP
  202.         PAGE
  203. ;
  204. ; Keyboard Intercept Routine
  205. ;    -Intercepts Keyboard INT 9, checks if video should be turned on
  206. ;     then chains to normal keyboard processing
  207. ;
  208. KEYBOARD_INTERCEPT PROC NEAR
  209.         ASSUME CS:SCREEN_SAV,DS:DATA
  210.         PUSH    AX
  211.         PUSH    DS
  212.         MOV    AX,DATA         ;ESTABLISH DATA SEGMENT
  213.         MOV    DS,AX
  214.         MOV    AX,DELAY_VALUE        ;RESET,
  215.         MOV    DELAY_COUNTER,AX    ;  DELAY COUNTER
  216.         TEST    VIDEO_STATUS,VIDEO_OFF    ;IF VIDEO IS ON,
  217.         JNZ    EXIT_KB         ;  EXIT, NO ACTION IS REQUIRED
  218. ;
  219.         CLI
  220.         PUSH    DX
  221.         PUSH    CX
  222. ;
  223. ; Turn Monochrome Video ON including Cursor
  224. ;
  225.         MOV    DX,MONO_MODE_REG ;SET OUTPUT TO MODE REGISTER,
  226.         MOV    AL,DEF_MODE_ON     ;  GET DATA TO OUTPUT,
  227.         OUT    DX,AL         ;  THEN TURN OFF WITH DEFAULT MODE
  228.         MOV    CX,MONO_CUR_ON     ;SET TO TURN CURSOR ON,
  229.         CALL    CURSOR_SET     ;  THEN CALL ROUTINE TO DO IT
  230. ;
  231. ; Turn Color Video ON
  232. ;
  233.         TEST    EQUIP_FLAG,COLOR_ACTIVE ;IS COLOR DISPLAY ACTIVE?
  234.         JZ    GET_MODE1        ;  YES, THEN GET CURRENT MODE
  235.         MOV    AL,DEF_MODE_ON        ;  NO,    THEN USE DEFAULT MODE
  236.         JMP    SHORT CONT1
  237. GET_MODE1:    MOV    AL,CRT_MODE_SET     ;CURRENT ACTIVE MODE SETTING
  238.         OR    AL,8            ;TURN VIDEO ENABLE BIT ON
  239.         MOV    CRT_MODE_SET,AL     ;SAVE NEW MODE SETTING
  240. CONT1:        MOV    DX,COLOR_MODE_REG    ;GET ADDRESS OF MODE REGISTER
  241.         OUT    DX,AL            ; THEN OUTPUT TO TURN VIDEO ON
  242.         TEST    CRT_PALLETTE,BG_BLACK    ;IS BACKGROUND COLOR BLACK?
  243.         JZ    DONE1            ;  YES, THEN DONE
  244.         MOV    AL,CRT_PALLETTE     ;  ELSE, GET CURRENT PALLETTE
  245.         MOV    DX,COLOR_SEL_REG    ;GET ADDR OF COLOR SELECT REG
  246.         OUT    DX,AL            ;RESTORE BACKGROUND COLOR
  247. DONE1:        OR    VIDEO_STATUS,8        ;SET VIDEO STATUS "ON"
  248.         POP    CX
  249.         POP    DX
  250.         STI
  251. EXIT_KB:    POP    DS
  252.         POP    AX
  253.         JMP    BIOS_KB_INT        ;CHAIN TO NEXT ROUTINE OR EXIT
  254.                         ; TO FINISH TIMER INTERRUPT
  255. KEYBOARD_INTERCEPT    ENDP
  256.         PAGE
  257. ;
  258. ; Video I/O Intercept Routine
  259. ;    -Intercepts Video I/O INT 10H, resets the delay counter
  260. ;     then chains to normal Video I/O processing
  261. ;
  262. VIDEO_IO_INTERCEPT PROC NEAR
  263.         ASSUME CS:SCREEN_SAV,DS:NOTHING
  264.         PUSH    AX
  265.         MOV    AX,DELAY_VALUE        ;RESET,
  266.         MOV    DELAY_COUNTER,AX    ;  DELAY COUNTER
  267.         POP    AX
  268.         JMP    BIOS_VIDEO_INT        ;CHAIN TO VIDEO I/O INTERRUPT
  269.                         ; PROCESSING
  270. VIDEO_IO_INTERCEPT    ENDP
  271. ;
  272. ; Subroutine to Turn Monochrome Adapter Cursor ON or OFF
  273. ;
  274. CURSOR_SET    PROC    NEAR
  275.         ASSUME    CS:SCREEN_SAV,DS:DATA
  276.         MOV    DX,ADDR_6845_MONO    ;SET TO WRITE ADDRESS REGISTER,
  277.         MOV    AL,REG_10        ;  SELECT CURSOR START REGISTER
  278.         OUT    DX,AL            ;  OUTPUT REGISTER SELECTION
  279.         INC    DX            ;POINT TO 6845 DATA REGISTER
  280.         MOV    AL,CH            ;GET CURSOR START VALUE, THEN
  281.         OUT    DX,AL            ;  SET START REGISTER
  282.         DEC    DX            ;POINT BACK TO ADDRESS REGISTER
  283.         MOV    AL,REG_11        ;  SELECT CURSOR END REGISTER
  284.         OUT    DX,AL            ;  OUTPUT REGISTER SELECTION
  285.         INC    DX            ;POINT AGAIN TO DATA REGISTER
  286.         MOV    AL,CL            ;GET CURSOR END VALUE, THEN
  287.         OUT    DX,AL            ;  SET END REGISTER
  288.         RET
  289. CURSOR_SET    ENDP
  290.         PAGE
  291. ;
  292. ; Initialize Screen Save Program and Make Resident
  293. ;
  294. INIT_PROC    PROC    NEAR
  295.         ASSUME    DS:INT_VECTORS
  296.         MOV    AX,INT_VECTORS
  297.         MOV    DS,AX
  298.         PUSH    ES
  299.         CLI
  300.         LES    AX,KB_INT        ;SAVE KB_INT
  301.         MOV    BIOS_KB_INT,AX        ;  POINTERS TO
  302.         MOV    BIOS_KB_INT[2],ES    ;      BIOS KEYBOARD ROUTINE
  303.         MOV    KB_INT,OFFSET KEYBOARD_INTERCEPT  ;SET KEYBOARD INT
  304.         MOV    KB_INT[2],CS              ;  TO POINT HERE
  305. ;
  306.         LES    AX,VIDEO_INT        ;SAVE VIDEO_INT
  307.         MOV    BIOS_VIDEO_INT,AX    ;  POINTERS TO
  308.         MOV    BIOS_VIDEO_INT[2],ES    ;      BIOS VIDEO I/O ROUTINE
  309.         MOV    VIDEO_INT,OFFSET VIDEO_IO_INTERCEPT  ;SET VIDEO I/O INT
  310.         MOV    VIDEO_INT[2],CS              ;    TO POINT HERE
  311. ;
  312.         LES    AX,TIMER_EXIT        ;SAVE ANY OTHER USER
  313.         MOV    BIOS_TIMER_EXIT,AX    ;  ROUTINE USING
  314.         MOV    BIOS_TIMER_EXIT[2],ES    ;      TIMER EXIT
  315.         MOV    TIMER_EXIT,OFFSET TIMER_USER_ROUTINE ;SET TIMER EXIT
  316.         MOV    TIMER_EXIT[2],CS             ;    TO POINT HERE
  317. ;
  318.         CMP    PARM_COUNT,VALID_COUNT    ;CHECK FOR OPTIONS
  319.         JNZ    DEFAULT         ;  NONE, USE DEFAULT OF 10 MIN
  320.         MOV    AL,PARM_DATA        ;GET DELAY OPTION AND
  321.         AND    AX,000FH        ;  CONVERT ASCII TO BINARY
  322.         MOV    BX,DELAY_1_MIN        ;LOAD DELAY VALUE FOR 1 MIN
  323.         MUL    BX            ;CALCULATE DELAY VALUE
  324.         MOV    DELAY_VALUE,AX        ;SAVE DELAY VALUE
  325.         MOV    DELAY_COUNTER,AX    ;SET DELAY COUNTER
  326. DEFAULT:    STI
  327.         ASSUME    DS:SCREEN_SAV
  328.         MOV    AX,CS
  329.         MOV    DS,AX
  330.         MOV    DX,OFFSET MESSAGE    ;PRINT INTRO
  331.         MOV    AH,9
  332.         INT    21H
  333.         MOV    DX,OFFSET INIT_PROC    ;END OF RESIDENT PORTION
  334.         INT    27H            ;  TERMINATE AND STAY RESIDENT
  335. INIT_PROC    ENDP
  336. SCREEN_SAV    ENDS
  337.         END    BEGIN
  338.