home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / connerp.zip / CONNER.C next >
C/C++ Source or Header  |  1992-12-18  |  5KB  |  153 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <dos.h>
  6. #include <time.h>
  7. #define INCL_NOPM
  8. #define INCL_NOCOMMON
  9. #define INCL_DOSPROCESS
  10. #define INCL_DOSNLS
  11. #include <os2.h>
  12.  
  13. #define MAX_MINUTES 20
  14. #define AUTO_ON     ((unsigned char)0xE3)
  15. #define AUTO_OFF    ((unsigned char)0xE2)
  16.  
  17. extern const char _far * _cdecl _near _pgmptr;
  18.  
  19. #pragma optimize("",off)
  20. #pragma check_stack(off)
  21. int _far _pascal _export ShipCmd(unsigned char cmd, unsigned char periods);
  22. #pragma alloc_text(IOPL_SEG,ShipCmd)
  23. int _far _pascal _export ShipCmd(unsigned char cmd, unsigned char periods)
  24.    {
  25.    _asm
  26.       {
  27.       cli
  28.       mov dx, 0x3F6
  29.       jmp SHORT $+2
  30.       jmp SHORT $+2
  31.       jmp SHORT $+2
  32.       in al,dx
  33.       and al, 0x80        // Führt noch letzten Befehl aus
  34.       jnz Busy
  35.  
  36.       mov al,0x0B         // Command: Read Interrupt service register
  37.       out 0xA0, al
  38.       jmp SHORT $+2
  39.       jmp SHORT $+2
  40.       jmp SHORT $+2
  41.       in al, 0xA0         // Service register
  42.       and al, 0x40        // Irq14 (Platte) aktiv ?
  43.       jnz Busy
  44.  
  45.       mov dx, 0x1F2
  46.       mov al, periods
  47.       jmp SHORT $+2
  48.       jmp SHORT $+2
  49.       jmp SHORT $+2
  50.       out dx, al
  51.       mov dx, 0x1F7
  52.       mov al, cmd
  53.       jmp SHORT $+2
  54.       jmp SHORT $+2
  55.       jmp SHORT $+2
  56.       out dx, al
  57.       mov ax, 1
  58.       jmp SHORT Done
  59.  
  60.       Busy:
  61.       xor ax, ax
  62.       Done:
  63.       sti
  64.       }
  65.    };
  66. #pragma optimize("",on)
  67. #pragma check_stack()
  68.  
  69. static USHORT _fastcall _near QueryCountry(void)
  70.    {
  71.    USHORT ciLen = 0;
  72.    COUNTRYCODE cc;
  73.    COUNTRYINFO ci;
  74.  
  75.    memset(&cc,0,sizeof(cc));
  76.    memset(&ci,0,sizeof(ci));
  77.  
  78.    if (!DosGetCtryInfo(sizeof(ci), &cc, &ci, &ciLen)
  79.        && ciLen >= sizeof(USHORT))
  80.       return ci.country;
  81.    return 0;
  82.    };
  83.  
  84. int _cdecl main (int argC, char *argV[])
  85.    {
  86.    int minutes;
  87.    char drive[_MAX_DRIVE];
  88.    char dir[_MAX_DIR];
  89.    char fname[_MAX_FNAME];
  90.    char ext[_MAX_EXT];
  91.    char path[_MAX_PATH];
  92.  
  93.    USHORT country = QueryCountry(); // 18-DEC-92
  94.  
  95.    if (argC == 2
  96.        && ( ((minutes = atoi(argV[1])) && abs(minutes) <= MAX_MINUTES)
  97.             || !strcmp(argV[1],"0")))
  98.       {
  99.       time_t now = time(NULL);
  100.       do
  101.          {
  102.          if (ShipCmd((minutes < 0 ? AUTO_OFF : AUTO_ON),
  103. // Falsch    (unsigned char)((unsigned char)abs((unsigned char)minutes)*(unsigned char)12)))
  104. /*06-JUN-91*/(unsigned char)((unsigned char)abs(minutes)*(unsigned char)12)))
  105.             return 0;
  106.          DosSleep(10L);
  107.          }
  108.       while ((time(NULL)-now) < 3);
  109.  
  110.       if (country == 49)
  111.          fprintf(stderr, "\aPlattensteuerung ist z.Zt. beschäftigt.\a");
  112.       else
  113.          fprintf(stderr, "\aDrive is busy. Please retry later.\a");      
  114.  
  115.       return 2;
  116.       };
  117.  
  118.    if (argC > 2
  119.        || (argC == 2 && strcmp(argV[1],"?")))
  120.       putc('\a',stderr);
  121.    
  122.    _fstrncpy(path,_pgmptr,sizeof(path)-1);
  123.    path[sizeof(path)-1] = '\0';
  124.    _splitpath(path,drive,dir,fname,ext);
  125.    if (country == 49)
  126.       {
  127.       fprintf(stderr, "%s ist ein Hilfsprogramm\n", path);
  128.       fprintf(stderr, "\tzum Einstellen der Nachlaufzeit von Conner 3½\" AT-Bus-Platten.\n");
  129.       fprintf(stderr, "Aufruf: %s Nachlauf der Festplatte in Minuten\n", fname);
  130.       fprintf(stderr, "\t Minuten zwischen 1 und %u: Abschaltzeit nach Zugriffen\n", MAX_MINUTES);
  131.       fprintf(stderr, "\t Minuten zwischen -1 und -%u: Zusätzlich Platte sofort aus\n", MAX_MINUTES);
  132.       fprintf(stderr, "\t Minuten 0: Platte ein, kein autom. Abschalten\n");
  133.       fprintf(stderr, "Hinweise: Getestet unter OS/2 2.0, 1.x und DOS für:\n");
  134.       fprintf(stderr, "\t   CP3024 (20MB), CP3044 (40MB), CP30104 (115MB).\n");
  135.       fprintf(stderr, "\t  NICHT MIT ANDEREN PLATTEN VERWENDEN! VERWENDUNG AUF EIGENE GEFAHR!\n");
  136.       fprintf(stderr, "Version 3 (englisch und deutsch), R.W.Saddey, Berlin; Dez. 92");
  137.       }
  138.    else
  139.       {
  140.       fprintf(stderr, "%s is a utility\n", path);
  141.       fprintf(stderr, "\tto set automatic power-down for Conner 3½ inch IDE-drives.\n");
  142.       fprintf(stderr, "Call: %s Power-down delay (minutes)\n", fname);
  143.       fprintf(stderr, "\tdelay from 1 to %u: Power-down after (minutes) idle time\n", MAX_MINUTES);
  144.       fprintf(stderr, "\tdelay from -1 to -%u: Additionally turn off drive now\n", MAX_MINUTES);
  145.       fprintf(stderr, "\tdelay = 0: Turn on drive, disable auto power-down\n");
  146.       fprintf(stderr, "Notes: Tested with OS/2 2.0, 1.x and DOS for:\n");
  147.       fprintf(stderr, "\tCP3024 (20MB), CP3044 (40MB), CP30104 (115MB).\n");
  148.       fprintf(stderr, "       DO NOT USE WITH OTHER DRIVES! USE AT YOUR OWN RISK ONLY!\n");
  149.       fprintf(stderr, "Version 3 (US & German message), R.W.Saddey, Berlin, Germany; DEC-92");
  150.       };
  151.    return 1;
  152.    };
  153.