home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------------------------------------------------
- --
- -- MPATCH.C
- --
- -- A small utility that patches a MonitorSpec's BeamCon0 field in order
- -- to fix the sync polarity. Some monitors, like the Commodore 1960,
- -- need other than negative syncs to determine the picture's aspect.
- --
- -- author: Gregor S. M. Kuhlmann
- --
- -- revision history:
- -- 1994-Mar-31 37.0 created
- -- 1994-Apr-01 37.1 added FIXHSYNC and SYNCTRUE options
- -- 1994-Apr-02 37.2 added HSYNCDELAY option
- -- 1994-Apr-04 37.3 added VSYNCDELAY option
- -- 1994-Apr-09 37.4 some minor changes to arg parsing
- --
- -------------------------------------------------------------------------*/
-
- #define __USE_SYSBASE
-
- #include <stdlib.h>
- #include <exec/types.h>
- #include <graphics/monitor.h>
- #include <proto/exec.h>
- #include <proto/graphics.h>
- #include <proto/dos.h>
-
- extern long __oslibversion = 37;
-
- static char version[] = "$VER: MPatch V37.4 (1994-04-09)";
-
- BOOL modifyMonitor(char *name,UWORD beamconMask,UWORD beamconValue,WORD hsync_delay,WORD vsync_delay)
- {
- struct MonitorSpec *mspec;
- struct SpecialMonitor *sm;
- BOOL result = FALSE;
- UWORD beamcon;
- UWORD hsstop,hsstart;
- WORD vsstop,vsstart;
-
- if (mspec=OpenMonitor(name,0L))
- {
- /*--- modify beamcon register ---*/
- beamcon=mspec->BeamCon0;
- beamcon &= beamconMask;
- beamcon |= beamconValue;
- Forbid();
- mspec->BeamCon0=beamcon;
- Permit();
- /*--- perform hsync modifications ---*/
- if (sm=mspec->ms_Special)
- {
- if (hsync_delay)
- {
- hsstart = sm->hsync.asi_Start;
- hsstop = sm->hsync.asi_Stop;
- hsstart += hsync_delay;
- hsstop += hsync_delay;
- if (hsstop>sm->hblank.asi_Stop)
- hsstop=sm->hblank.asi_Stop;
- Forbid();
- sm->hsync.asi_Start=hsstart;
- sm->hsync.asi_Stop=hsstop;
- Permit();
- }
- /*--- perform vsync modifications ---*/
- if (vsync_delay)
- {
- vsync_delay *= mspec->DeniseMaxDisplayColumn;
- vsstart = sm->vsync.asi_Start;
- vsstart += vsync_delay;
- if (vsstart<0)
- vsstart=0;
- vsstop = vsstart + mspec->DeniseMaxDisplayColumn;
- if (vsstop > (sm->vblank.asi_Stop / 2))
- {
- vsstop=sm->vblank.asi_Stop / 2;
- vsstart=vsstop - mspec->DeniseMaxDisplayColumn;
- }
- Forbid();
- sm->vsync.asi_Start=vsstart;
- sm->vsync.asi_Stop=vsstop;
- Permit();
- }
- }
- CloseMonitor(mspec);
- result=TRUE;
- }
- return(result);
- }
-
- void main(void)
- {
- long rc = RETURN_OK;
- UWORD beamconMask = 0xFFFF, beamconValue = 0;
- WORD hsync_delay = 0, vsync_delay = 0;
- struct RDArgs *ra;
- static char template[] = "MONITOR/A,HSYNCTRUE/S,VSYNCTRUE/S,SYNCTRUE/S,LOLDIS/S,HSYNCDELAY/K/N,VSYNCDELAY/K/N";
- LONG values[7] = {0,0,0,0,0,0,0};
-
- if (ra=ReadArgs(template,values,NULL))
- {
- if (values[1])
- beamconValue |= HSYNCTRUE;
- if (values[2])
- beamconValue |= VSYNCTRUE;
- if (values[3])
- beamconValue |= (HSYNCTRUE | VSYNCTRUE);
- if (values[4])
- beamconValue |= LOLDIS;
- if (values[5])
- hsync_delay = *(long*)values[5];
- if (values[6])
- vsync_delay = *(long*)values[6];
- if (modifyMonitor((char*)values[0],beamconMask,beamconValue,hsync_delay,vsync_delay)==FALSE)
- {
- Printf("ERROR: Couldn't access monitor '%s'\n",(char*)values[0]);
- rc=RETURN_ERROR;
- }
- FreeArgs(ra);
- }
- else
- {
- Printf("ERROR: Arguments not suitable for template:\n%s\n",template);
- rc=RETURN_ERROR;
- }
- exit(rc);
- }
-