home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / cpluspls / tsr100je.zip / SCRCOPY.CPP < prev    next >
C/C++ Source or Header  |  1993-03-22  |  5KB  |  149 lines

  1. //--------------------------------------------------------------------------
  2. //
  3. //      SCRCOPY.CPP: Screen save demo for DOS TSR class.
  4. //      (c) J.English 1993 (je@unix.brighton.ac.uk)
  5. //
  6. //      This example saves an image of the screen to disk when the
  7. //      hotkey is pressed.  It demonstrates a critical-error handler.
  8. //
  9. //--------------------------------------------------------------------------
  10.  
  11. #include <iostream.h>
  12. #include <fstream.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <stdio.h>
  16. #include <ctype.h>
  17. #include <bios.h>
  18. #include <dos.h>
  19. #include "tsr.h"
  20.  
  21. //----- Error messages for TSR status values -----
  22. const char* status_msg [] = {
  23.     "success",
  24.     "DOS version 3 or higher required",
  25.     "multiple TSR instances declared in program", 
  26.     "can't allocate stack",
  27.     "can't allocate multiplex function code",
  28.     "already loaded",
  29.     "can't make program resident",
  30.     "startup error"
  31. };
  32.  
  33. //----- Error messages for unload result -----
  34. const char* unload_msg [] = {
  35.     "unloaded",
  36.     "not loaded",
  37.     "can't be unhooked",
  38.     "can't be unloaded",
  39.     "environment can't be unloaded"
  40. };
  41.  
  42. //----- The derived TSR class -----
  43. class ScreenCopy : public TSR
  44. {
  45.   private:
  46.     virtual void main (int);            // body of screen copy TSR
  47.     char filename [200];                // file to save screen image to
  48.   public:
  49.     ScreenCopy () :                     // constructor
  50.         TSR ("TSR screen copier demo")  // ... call base class constructor
  51.         { }                             // ... nothing else needed
  52.  
  53.     TSR::critical_code critical_error (int n);
  54.                                         // critical error handler
  55.     void open (const char* name)        { strcpy (filename, name); }
  56.     const char* file ()                 { return filename; }
  57. };
  58.  
  59. //----- The main program -----
  60. int main (int argc, char** argv)
  61. {
  62.     ScreenCopy copier;
  63.  
  64.     if (argc == 2 && argv[1][0] != '/')
  65.     {
  66.         copier.open (argv[1]);
  67.         cout << "Installing " << copier.name() << " in memory\n";
  68.         cout << "Press ALT-F10 to save screen to " << argv[1] << "\n";
  69.         copier.run (TSR::ALT + TSR::F10);
  70.         cout << "Error installing " << copier.name() << ": "
  71.              << status_msg [copier.status()] << "\n";
  72.     }
  73.     else if (argc == 2 && argv[1][0] == '/' && toupper (argv[1][1]) == 'U')
  74.     {   cout << copier.name() << " "
  75.              << unload_msg [copier.unload()] << "\n";
  76.     }
  77.     else
  78.     {   cout << "Usage: SCRCOPY [filename | /U]\n";
  79.         return -1;
  80.     }
  81.     return copier.status ();
  82. }
  83.  
  84. //----- Resident part of TSR -----
  85. void ScreenCopy::main (int)
  86. {
  87.     union REGS r;                           // get video mode
  88.     r.h.ah = 0x0F;
  89.     int86 (0x10, &r, &r);
  90.  
  91.     if (r.h.al > 3)                         // exit if not text mode 0-3
  92.         return;
  93.  
  94.     char far* screen =                      // address of screen
  95.         (char far*) MK_FP(0xB800 + r.h.bh * 256, 0);
  96.     char line [82];                         // line buffer for screen image
  97.     ofstream f (file());                    // open output file
  98.  
  99.     for (int i = 0; i < 25; i++)            // copy 25 rows
  100.     {   for (int c = 0; c < r.h.ah; c++)    // copy each column
  101.         {   line [c] = *screen;
  102.             screen += 2;
  103.         }
  104.         line [c]   = '\n';                  // bad luck if char 0A on screen!
  105.         line [c+1] = '\0';
  106.         f << line;
  107.     }
  108.     f.close ();
  109. }
  110.  
  111. //----- Critical error handler -----
  112. TSR::critical_code ScreenCopy::critical_error (int n)
  113. {
  114.     union REGS r;                           // get video mode
  115.     r.h.ah = 0x0F;
  116.     int86 (0x10, &r, &r);
  117.     unsigned far* screen =                  // address of screen
  118.         (unsigned far*) MK_FP(0xB800 + r.h.bh * 256, 0);
  119.  
  120.     unsigned line [80];                     // save top line of screen
  121.     int i;
  122.     for (i = 0; i < r.h.ah; i++)
  123.         line[i] = screen[i];
  124.  
  125.     char message [81];                      // display message
  126.     sprintf (message,
  127.              "Critical error %02X: Retry, Ignore or Fail?", n);
  128.     for (i = 0; i < r.h.ah; i++)
  129.         screen[i] = 0x1E00 + (i < strlen(message) ? message[i] : ' ');
  130.  
  131.     TSR::critical_code result;              // get response from user
  132.     char c;
  133.     do {
  134.         c = toupper (bioskey (0));
  135.         if (c == 'R')
  136.             result = TSR::RETRY;
  137.         if (c == 'I')
  138.             result = TSR::IGNORE;
  139.         if (c == 'F')
  140.             result = TSR::FAIL;
  141.     } while (c != 'R' && c != 'I' && c != 'F');
  142.  
  143.     for (i = 0; i < r.h.ah; i++)        // restore top line
  144.         screen[i] = line[i];
  145.  
  146.     return result;                          // return user's response
  147. }
  148.  
  149.