home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / COMM / MISC / SRC26_2.ZIP / SRC / SAVER98.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-13  |  4.4 KB  |  203 lines

  1. /*
  2.  * saver98.c: hterm timer control and CRT saver for NEC-PC9801
  3.  *
  4.  * Author: HIRANO Satoshi
  5.  * (C) 1989  Halca Computer Science Laboratory TM
  6.  *           University of Tokyo
  7.  *
  8.  * 1.1 89/06/20 Halca.Hirano creation; just OFF CRT
  9.  * 1.2 89/07/20 Halca.Hirano add kermit timer
  10.  *     ----- V2.3.-1 distributin ----
  11.  * 1.3 89/09/17 Halca.Hirano add special saver attachment mechanism
  12.  *    ---- V2.4.0 distribution ----
  13.  * 1.4 89/11/29 Halca.Hirano
  14.  *    fix timer bug. restart old interval timer handler.
  15.  *
  16.  * $Header: saver98.cv  1.10  90/07/03 23:55:10  hirano  Exp $
  17.  */
  18.  
  19.  
  20. #include "option.h"
  21. #include <stdio.h>
  22. #include "config.h"
  23. #include "hterm.h"
  24. #include "default.h"
  25. #include "global.h"
  26.  
  27. /*
  28.  * saver type description
  29.  *
  30.  * TO ADD YOUR SAVER:
  31.  *    0) make source.c
  32.  *    1) add extern void FAR newSaver() to next line
  33.  *    2) add saverInfo in savers[]
  34.  *    3) add source.c in makefile
  35.  */
  36. static void FAR blankSaver();
  37. #ifdef ICO_SAVER
  38. extern void FAR icoSaver();
  39. #endif /* ICO_SAVER */
  40. #ifdef SOFT_FONT
  41. static void FAR meltSaver();
  42. #endif
  43.  
  44. struct saverInfo {
  45.     char *name;
  46.     char    useText;            /* flag    text CRT on or off        */
  47.     char    useGraphic;            /* flag graphic CRT on or off    */
  48.     void (FAR *saverFunc)();
  49. };
  50.  
  51. struct saverInfo savers[] = {
  52.     {" Blank Saver ", NO, NO, blankSaver},
  53. #ifdef  ICO_SAVER
  54.     {" Ico Saver   ", NO, YES, icoSaver},
  55. #endif /* ICO_SAVER */
  56. #if 0
  57. #ifdef SOFT_FONT
  58.     {" Melt Saver  ", NO, YES, meltSaver},
  59. #endif /* SOFT_FONT */
  60. #endif
  61. };
  62.  
  63. static void (INTERRUPT FAR *oldHandler)();    /* original timer handler    */
  64. extern void INTERRUPT FAR timerHandler2();
  65. static int someOneUsedTimer;
  66.  
  67.  
  68. void saverInit()
  69. {
  70.     saver = DEFAULT_CRT_SAVER;
  71.     maxSaverType = sizeof(savers)/sizeof(savers[0]) - 1;
  72.     saverType = DEFAULT_SAVER_TYPE;    /* maybe blank saver        */
  73.     oldHandler = 0;
  74.     saverReInit();
  75. }
  76.  
  77. void saverReInit()
  78. {
  79.     setTimerValue();        /* set timerLoadValue non zero    */
  80.     oldHandler = GET_DOSVECT(TIMER_INT);/* get old timer handler address    */
  81. #ifdef PC98XA
  82.     someOneUsedTimer = NO;
  83. #else
  84.     if (inp(IMR) & 1)                /* test timer mask bit on IMR    */
  85.         someOneUsedTimer = NO;
  86.     else
  87.         someOneUsedTimer = YES;        /* flag some TSR might be using the timer */
  88. #endif
  89.     timerInit(timerHandler);        /* iniz timer interrupt        */
  90. }
  91.  
  92. void saverSetup()
  93. {
  94.     setTimerValue();
  95.     if (saverType > maxSaverType)
  96.         saverType = 0;
  97. }
  98.  
  99. void saverEnd()
  100. {
  101.     if (oldHandler == 0)
  102.         return;
  103.     /*
  104.      * THIS IS SOMEWHAT DANGEROUS ON EXIT!
  105.      * switch back to old timer handler.
  106.      * If old timer handler is IRET, interval timer will stop soon.
  107.      * Else old handler may restart by himself.
  108.      *
  109.      * This routine restores timer handler vector.
  110.      */
  111.     if (someOneUsedTimer)
  112.         timerInit(oldHandler);        /* restore timer handler and chain */
  113.     else {
  114.         timerValue = 2;
  115.         timerLoadValue = 0;            /* please stop timer flag        */
  116.         while (timerValue == 2)
  117.             nullFunction();            /* wait for timer stop            */
  118.         SET_DOSVECT(TIMER_INT, oldHandler);    /* restore timer handler        */
  119.     }
  120.     oldHandler = 0;
  121. }
  122.  
  123. char *saverName(n)
  124. int n;
  125. {
  126.     return(savers[n].name);
  127. }
  128.  
  129. void setTimerValue()
  130. {
  131.     switch (saver) {
  132.     case CRT_SAVER_3: timerLoadValue = 3 * 600; /* 3 min */break;
  133.     case CRT_SAVER_OFF: /* here is no BUG! */
  134.     case CRT_SAVER_10:
  135.     default: timerLoadValue = 10 * 600; /* 10 min */ break;
  136.     }
  137.     bsKeyWatcherTimer = BS_WATCHER_SAMPLING_TIME*TICK_SEC;
  138. }
  139.  
  140. void CRTSaver()
  141. {
  142.     int saver = saverType;
  143.  
  144.     if (saverType > maxSaverType)
  145.         saver = 0;
  146.     textCRTOnOff(savers[saver].useText);        /* text CRT on or off */
  147.     graphicCRTOnOff(savers[saver].useGraphic);    /* graphic CRT on or off */
  148.     /*
  149.      * call saver
  150.      */
  151.     savePage(page0Save);
  152.     (*savers[saver].saverFunc)();
  153.     restorePage(page0Save);
  154.     timerValue = timerLoadValue;
  155.     textCRTOnOff(YES);                    /* text CRT on  */
  156.     graphicCRTOnOff(YES);                /* graphic CRT on */
  157. }
  158.  
  159. void FAR blankSaver()
  160. /*
  161.  * keep screen blank
  162.  */
  163. {
  164.     while (checkEvent() == 0) {
  165.         ;
  166.     }
  167. }
  168.  
  169. #if 0
  170. #ifdef SOFT_FONT
  171. void FAR meltSaver()
  172. {
  173.     long x, y, y2;
  174.     u_char FAR *p;
  175.     u_char FAR *p2;
  176.     u_char FAR *vram;
  177.     u_char v, m;
  178.  
  179.     FP_SEG(vram) = GVRAMSEG;
  180.     FP_OFF(vram) = 0;
  181.     for (y = 399; y >= 0; --y)
  182.         for (x = 0; x < 640/8; x++) {
  183.             for (m = 0x80; m ; m >>= 1) {
  184.                 if (checkEvent())
  185.                     goto end;
  186.                 p = vram + (y*640L/8L + x);
  187.                 v = (*p & m);
  188.                 *p ^= v;
  189.                 for (y2 = y+1; y2 < 400; y2++) {
  190.                     p2 = vram + (y2*640L/8L + x);
  191.                     *p2 = v;
  192.                     *p2 = 0;
  193.                 }
  194.             }
  195.         }
  196. end:
  197.     while (checkEvent() == 0) {
  198.         ;
  199.     }
  200. }
  201. #endif
  202. #endif
  203.