home *** CD-ROM | disk | FTP | other *** search
- /*
- * saver98.c: hterm timer control and CRT saver for NEC-PC9801
- *
- * Author: HIRANO Satoshi
- * (C) 1989 Halca Computer Science Laboratory TM
- * University of Tokyo
- *
- * 1.1 89/06/20 Halca.Hirano creation; just OFF CRT
- * 1.2 89/07/20 Halca.Hirano add kermit timer
- * ----- V2.3.-1 distributin ----
- * 1.3 89/09/17 Halca.Hirano add special saver attachment mechanism
- * ---- V2.4.0 distribution ----
- * 1.4 89/11/29 Halca.Hirano
- * fix timer bug. restart old interval timer handler.
- *
- * $Header: saver98.cv 1.10 90/07/03 23:55:10 hirano Exp $
- */
-
-
- #include "option.h"
- #include <stdio.h>
- #include "config.h"
- #include "hterm.h"
- #include "default.h"
- #include "global.h"
-
- /*
- * saver type description
- *
- * TO ADD YOUR SAVER:
- * 0) make source.c
- * 1) add extern void FAR newSaver() to next line
- * 2) add saverInfo in savers[]
- * 3) add source.c in makefile
- */
- static void FAR blankSaver();
- #ifdef ICO_SAVER
- extern void FAR icoSaver();
- #endif /* ICO_SAVER */
- #ifdef SOFT_FONT
- static void FAR meltSaver();
- #endif
-
- struct saverInfo {
- char *name;
- char useText; /* flag text CRT on or off */
- char useGraphic; /* flag graphic CRT on or off */
- void (FAR *saverFunc)();
- };
-
- struct saverInfo savers[] = {
- {" Blank Saver ", NO, NO, blankSaver},
- #ifdef ICO_SAVER
- {" Ico Saver ", NO, YES, icoSaver},
- #endif /* ICO_SAVER */
- #if 0
- #ifdef SOFT_FONT
- {" Melt Saver ", NO, YES, meltSaver},
- #endif /* SOFT_FONT */
- #endif
- };
-
- static void (INTERRUPT FAR *oldHandler)(); /* original timer handler */
- extern void INTERRUPT FAR timerHandler2();
- static int someOneUsedTimer;
-
-
- void saverInit()
- {
- saver = DEFAULT_CRT_SAVER;
- maxSaverType = sizeof(savers)/sizeof(savers[0]) - 1;
- saverType = DEFAULT_SAVER_TYPE; /* maybe blank saver */
- oldHandler = 0;
- saverReInit();
- }
-
- void saverReInit()
- {
- setTimerValue(); /* set timerLoadValue non zero */
- oldHandler = GET_DOSVECT(TIMER_INT);/* get old timer handler address */
- #ifdef PC98XA
- someOneUsedTimer = NO;
- #else
- if (inp(IMR) & 1) /* test timer mask bit on IMR */
- someOneUsedTimer = NO;
- else
- someOneUsedTimer = YES; /* flag some TSR might be using the timer */
- #endif
- timerInit(timerHandler); /* iniz timer interrupt */
- }
-
- void saverSetup()
- {
- setTimerValue();
- if (saverType > maxSaverType)
- saverType = 0;
- }
-
- void saverEnd()
- {
- if (oldHandler == 0)
- return;
- /*
- * THIS IS SOMEWHAT DANGEROUS ON EXIT!
- * switch back to old timer handler.
- * If old timer handler is IRET, interval timer will stop soon.
- * Else old handler may restart by himself.
- *
- * This routine restores timer handler vector.
- */
- if (someOneUsedTimer)
- timerInit(oldHandler); /* restore timer handler and chain */
- else {
- timerValue = 2;
- timerLoadValue = 0; /* please stop timer flag */
- while (timerValue == 2)
- nullFunction(); /* wait for timer stop */
- SET_DOSVECT(TIMER_INT, oldHandler); /* restore timer handler */
- }
- oldHandler = 0;
- }
-
- char *saverName(n)
- int n;
- {
- return(savers[n].name);
- }
-
- void setTimerValue()
- {
- switch (saver) {
- case CRT_SAVER_3: timerLoadValue = 3 * 600; /* 3 min */break;
- case CRT_SAVER_OFF: /* here is no BUG! */
- case CRT_SAVER_10:
- default: timerLoadValue = 10 * 600; /* 10 min */ break;
- }
- bsKeyWatcherTimer = BS_WATCHER_SAMPLING_TIME*TICK_SEC;
- }
-
- void CRTSaver()
- {
- int saver = saverType;
-
- if (saverType > maxSaverType)
- saver = 0;
- textCRTOnOff(savers[saver].useText); /* text CRT on or off */
- graphicCRTOnOff(savers[saver].useGraphic); /* graphic CRT on or off */
- /*
- * call saver
- */
- savePage(page0Save);
- (*savers[saver].saverFunc)();
- restorePage(page0Save);
- timerValue = timerLoadValue;
- textCRTOnOff(YES); /* text CRT on */
- graphicCRTOnOff(YES); /* graphic CRT on */
- }
-
- void FAR blankSaver()
- /*
- * keep screen blank
- */
- {
- while (checkEvent() == 0) {
- ;
- }
- }
-
- #if 0
- #ifdef SOFT_FONT
- void FAR meltSaver()
- {
- long x, y, y2;
- u_char FAR *p;
- u_char FAR *p2;
- u_char FAR *vram;
- u_char v, m;
-
- FP_SEG(vram) = GVRAMSEG;
- FP_OFF(vram) = 0;
- for (y = 399; y >= 0; --y)
- for (x = 0; x < 640/8; x++) {
- for (m = 0x80; m ; m >>= 1) {
- if (checkEvent())
- goto end;
- p = vram + (y*640L/8L + x);
- v = (*p & m);
- *p ^= v;
- for (y2 = y+1; y2 < 400; y2++) {
- p2 = vram + (y2*640L/8L + x);
- *p2 = v;
- *p2 = 0;
- }
- }
- }
- end:
- while (checkEvent() == 0) {
- ;
- }
- }
- #endif
- #endif
-