home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1994 / 12 / 02 / monitor-tuning / mpatch_monitorinfo / mpatch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  5.3 KB  |  173 lines

  1. /*-------------------------------------------------------------------------
  2. --
  3. -- MPATCH.C
  4. -- 
  5. -- A small utility that patches a MonitorSpec's BeamCon0 field in order
  6. -- to fix the sync polarity. Some monitors, like the Commodore 1960,
  7. -- need other than negative syncs to determine the picture's aspect.
  8. --
  9. -- author: Gregor S. M. Kuhlmann
  10. --
  11. -- revision history:
  12. -- 1994-Mar-31    37.0  created
  13. -- 1994-Apr-01    37.1  added FIXHSYNC and SYNCTRUE options  
  14. -- 1994-Apr-02    37.2  added HSYNCDELAY option
  15. -- 1994-Apr-04    37.3  added VSYNCDELAY option
  16. -- 1994-Apr-09    37.4  some minor changes to argument parsing
  17. --                      FIXHSYNC option removed
  18. -- 1994-Apr-21    37.5  HSYNC and VSYNC flags are now reset to zeros if
  19. --                      no ...SYNCTRUE is specified   
  20. -- 1994-Apr-26    37.6  above behaviour changed: sync flags are now left
  21. --                      alone if no ...SYNCTRUE option is specified
  22. -- 1994-May-03    37.7  improved ...SYNCDELAY range checking
  23. -- 1994-May-04    37.8  added ...SYNCLEN and HSYNCFALSE, VSYNCFALSE keywds.
  24. -- 1994-May-05    37.9  lots of bug fixes, range checking modified
  25. --
  26. -------------------------------------------------------------------------*/
  27.  
  28. #define __USE_SYSBASE
  29.  
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <exec/types.h>
  33. #include <graphics/monitor.h>
  34. #include <proto/exec.h>
  35. #include <proto/graphics.h>
  36. #include <proto/dos.h>
  37. #ifdef GERMAN
  38. #include "german_text.h"
  39. #else
  40. #include "english_text.h"
  41. #endif
  42.  
  43. extern long __oslibversion = 37;
  44.  
  45. static char version[] = "$VER: MPatch 37.9 (5.5.94)";
  46.  
  47. #define NOT_CHANGED  (-1)
  48.  
  49. UWORD beamconMask = 0xffff, beamconValue = 0x0000;
  50. WORD hsync_delay = NOT_CHANGED, vsync_delay = NOT_CHANGED;
  51. WORD hsync_len = NOT_CHANGED, vsync_len = NOT_CHANGED;
  52.  
  53. BOOL modifyMonitor(char *name)
  54. {
  55.    struct MonitorSpec *mspec;
  56.    struct SpecialMonitor *sm;
  57.    BOOL result = FALSE;
  58.    UWORD beamcon;
  59.       
  60.    if (mspec=OpenMonitor(name,0L))
  61.    {
  62.       result=TRUE;
  63. /*--- modify beamcon register ---*/
  64.       beamcon=mspec->BeamCon0;
  65.       beamcon &= beamconMask;
  66.       beamcon |= beamconValue;
  67.       Forbid();
  68.       mspec->BeamCon0=beamcon;
  69.       Permit();
  70. /*--- perform hsync modifications ---*/
  71.       if (sm=mspec->ms_Special)
  72.       {
  73.          if (hsync_delay<0)
  74.             hsync_delay = sm->hsync.asi_Start;
  75.          else
  76.             hsync_delay += sm->hblank.asi_Start;
  77.          if (hsync_len<2)
  78.             hsync_len = sm->hsync.asi_Stop - sm->hsync.asi_Start;
  79.          if (hsync_delay + hsync_len <= sm->hblank.asi_Stop)
  80.          {
  81.             Forbid();
  82.             sm->hsync.asi_Start=hsync_delay;
  83.             sm->hsync.asi_Stop=hsync_delay + hsync_len;
  84.             Permit();
  85.          }
  86. /*--- perform vsync modifications ---*/
  87.          if (vsync_delay<0)
  88.             vsync_delay = sm->vsync.asi_Start / mspec->total_colorclocks;
  89.          if (vsync_len<2)
  90.             vsync_len = (sm->vsync.asi_Stop - sm->vsync.asi_Start) / mspec->total_colorclocks;
  91.          if (vsync_delay + vsync_len < mspec->min_row / 2)
  92.          {
  93.             Forbid();
  94.             sm->vsync.asi_Start=vsync_delay * mspec->total_colorclocks;
  95.             sm->vsync.asi_Stop=(vsync_delay + vsync_len) * mspec->total_colorclocks;
  96.             Permit();
  97.          }
  98.       }
  99.       CloseMonitor(mspec);
  100.    }
  101.    return(result);
  102. }
  103.  
  104. void main(void)
  105. {
  106.    long rc = RETURN_OK;
  107.    struct RDArgs *ra;
  108.    char buffer[32];
  109.    char *bufptr = buffer;
  110.    static char template[] = "MONITOR/A,HSYNCTRUE/S,VSYNCTRUE/S,SYNCTRUE/S,HSYNCFALSE/S,VSYNCFALSE/S,SYNCFALSE/S,LOLDIS/S,HSYNCDELAY/K/N,VSYNCDELAY/K/N,HSYNCLEN/K/N,VSYNCLEN/K/N";
  111.    enum value_ids { MONITOR_NAME=0,HSYNC_TRUE,VSYNC_TRUE,SYNC_TRUE,HSYNC_FALSE,VSYNC_FALSE,SYNC_FALSE,LOLDIS_FLAG,HSYNC_DELAY,VSYNC_DELAY,HSYNC_LEN,VSYNC_LEN,MAX_VALUES };
  112.    LONG values[MAX_VALUES] = {0,0,0,0,0,0,0,0,0,0,0,0};
  113.    
  114.    if (ra=ReadArgs(template,values,NULL))
  115.    {
  116.       if (values[HSYNC_TRUE])
  117.       {
  118.          beamconMask &= ~(HSYNCTRUE | VSYNCTRUE);
  119.          beamconValue |= HSYNCTRUE;
  120.       }
  121.       if (values[HSYNC_FALSE])
  122.       {
  123.          beamconMask &= ~HSYNCTRUE;
  124.          beamconValue &= ~VSYNCTRUE;
  125.       }
  126.       if (values[VSYNC_TRUE])
  127.       {
  128.          beamconMask &= ~(HSYNCTRUE | VSYNCTRUE);
  129.          beamconValue |= VSYNCTRUE;
  130.       }
  131.       if (values[VSYNC_FALSE])
  132.       {
  133.          beamconMask &= ~VSYNCTRUE;
  134.          beamconValue &= ~VSYNCTRUE;
  135.       }
  136.       if (values[SYNC_TRUE])
  137.       {
  138.          beamconMask &= ~(HSYNCTRUE | VSYNCTRUE);
  139.          beamconValue |= (HSYNCTRUE | VSYNCTRUE);
  140.       }
  141.       if (values[SYNC_FALSE])
  142.       {
  143.          beamconMask &= ~(HSYNCTRUE | VSYNCTRUE);
  144.          beamconValue &= ~(HSYNCTRUE | VSYNCTRUE);
  145.       }
  146.       if (values[LOLDIS_FLAG])
  147.          beamconValue |= LOLDIS;
  148.       if (values[HSYNC_DELAY])
  149.          hsync_delay = *(long*)values[HSYNC_DELAY];
  150.       if (values[VSYNC_DELAY])
  151.          vsync_delay = *(long*)values[VSYNC_DELAY];
  152.       if (values[HSYNC_LEN])
  153.          hsync_len = *(long*)values[HSYNC_LEN];
  154.       if (values[VSYNC_LEN])
  155.          vsync_len = *(long*)values[VSYNC_LEN];
  156.       strcpy(buffer,(char*)values[MONITOR_NAME]);
  157.       while ((*bufptr) && (*bufptr!='.')) bufptr++;
  158.       if (*bufptr==0) strcat(buffer,".monitor");
  159.       if (!modifyMonitor(buffer))
  160.       {
  161.          Printf(TXT_NOMONITOR,buffer);
  162.          rc=RETURN_ERROR;
  163.       }
  164.       FreeArgs(ra);
  165.    }
  166.    else
  167.    {
  168.       Printf(TXT_INVALIDARGS,template);
  169.       rc=RETURN_ERROR;
  170.    }
  171.    exit(rc);
  172. }
  173.