home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / util / cli / mpatch / mpatch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-09  |  3.7 KB  |  130 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 arg parsing
  17. --
  18. -------------------------------------------------------------------------*/
  19.  
  20. #define __USE_SYSBASE
  21.  
  22. #include <stdlib.h>
  23. #include <exec/types.h>
  24. #include <graphics/monitor.h>
  25. #include <proto/exec.h>
  26. #include <proto/graphics.h>
  27. #include <proto/dos.h>
  28.  
  29. extern long __oslibversion = 37;
  30.  
  31. static char version[] = "$VER: MPatch V37.4 (1994-04-09)";
  32.  
  33. BOOL modifyMonitor(char *name,UWORD beamconMask,UWORD beamconValue,WORD hsync_delay,WORD vsync_delay)
  34. {
  35.    struct MonitorSpec *mspec;
  36.    struct SpecialMonitor *sm;
  37.    BOOL result = FALSE;
  38.    UWORD beamcon;
  39.    UWORD hsstop,hsstart;
  40.    WORD vsstop,vsstart;
  41.       
  42.    if (mspec=OpenMonitor(name,0L))
  43.    {
  44. /*--- modify beamcon register ---*/
  45.       beamcon=mspec->BeamCon0;
  46.       beamcon &= beamconMask;
  47.       beamcon |= beamconValue;
  48.       Forbid();
  49.       mspec->BeamCon0=beamcon;
  50.       Permit();
  51. /*--- perform hsync modifications ---*/
  52.       if (sm=mspec->ms_Special)
  53.       {
  54.          if (hsync_delay)
  55.          {
  56.             hsstart = sm->hsync.asi_Start;
  57.             hsstop = sm->hsync.asi_Stop;
  58.             hsstart += hsync_delay;
  59.             hsstop += hsync_delay;
  60.             if (hsstop>sm->hblank.asi_Stop)
  61.                hsstop=sm->hblank.asi_Stop;
  62.             Forbid();
  63.             sm->hsync.asi_Start=hsstart;
  64.             sm->hsync.asi_Stop=hsstop;
  65.             Permit();
  66.          }
  67. /*--- perform vsync modifications ---*/
  68.          if (vsync_delay)
  69.          {
  70.             vsync_delay *= mspec->DeniseMaxDisplayColumn;
  71.             vsstart = sm->vsync.asi_Start;
  72.             vsstart += vsync_delay;
  73.             if (vsstart<0)
  74.                vsstart=0;
  75.             vsstop = vsstart + mspec->DeniseMaxDisplayColumn;
  76.             if (vsstop > (sm->vblank.asi_Stop / 2))
  77.             {
  78.                vsstop=sm->vblank.asi_Stop / 2;
  79.                vsstart=vsstop - mspec->DeniseMaxDisplayColumn;
  80.             }
  81.             Forbid();
  82.             sm->vsync.asi_Start=vsstart;
  83.             sm->vsync.asi_Stop=vsstop;
  84.             Permit();
  85.          }
  86.       }
  87.       CloseMonitor(mspec);
  88.       result=TRUE;   
  89.    }
  90.    return(result);
  91. }
  92.  
  93. void main(void)
  94. {
  95.    long rc = RETURN_OK;
  96.    UWORD beamconMask = 0xFFFF, beamconValue = 0;
  97.    WORD hsync_delay = 0, vsync_delay = 0;
  98.    struct RDArgs *ra;
  99.    static char template[] = "MONITOR/A,HSYNCTRUE/S,VSYNCTRUE/S,SYNCTRUE/S,LOLDIS/S,HSYNCDELAY/K/N,VSYNCDELAY/K/N";
  100.    LONG values[7] = {0,0,0,0,0,0,0};
  101.    
  102.    if (ra=ReadArgs(template,values,NULL))
  103.    {
  104.       if (values[1])
  105.          beamconValue |= HSYNCTRUE;
  106.       if (values[2])
  107.          beamconValue |= VSYNCTRUE;
  108.       if (values[3])
  109.          beamconValue |= (HSYNCTRUE | VSYNCTRUE);
  110.       if (values[4])
  111.          beamconValue |= LOLDIS;
  112.       if (values[5])
  113.          hsync_delay = *(long*)values[5];
  114.       if (values[6])
  115.          vsync_delay = *(long*)values[6];
  116.       if (modifyMonitor((char*)values[0],beamconMask,beamconValue,hsync_delay,vsync_delay)==FALSE)
  117.       {
  118.          Printf("ERROR: Couldn't access monitor '%s'\n",(char*)values[0]);
  119.          rc=RETURN_ERROR;
  120.       }
  121.       FreeArgs(ra);
  122.    }
  123.    else
  124.    {
  125.       Printf("ERROR: Arguments not suitable for template:\n%s\n",template);
  126.       rc=RETURN_ERROR;
  127.    }
  128.    exit(rc);
  129. }
  130.