[comp.sys.mac] Vertical Retrace Task in Pascal

rs4u#@ANDREW.CMU.EDU (Richard Siegel) (05/06/87)

Following is a short Lightspeed Pascal program that does a vertical retrace
task.

The program should be commented well enough, but if you've any comments, 
send 'em to rs4u@andrew.cmu.edu or {ucbvax, decvax, seismo}!andrew.cmu.edu!rs4u


		--Rich

PROGRAM Retrace;
{Puts up a vertical retrace task that inverts the menu bar and beeps twice per
second.}

{This is a really quick and dirty program; the task itself calls SetUpA5 so that
the system}
{doesn't risk a crash. This is because we modify "mytask" (an application
global) directly}
{to keep the task running. Recall that a task has to reset its own VBLCount
field}
{in order to keep running. This is the simplest (but not the best) way to do
that}

{Richard Siegel. May 6, 1987}
{Comments to rs4u@andrew.cmu.edu}

	VAR
		myTask : VBLTask;

	PROCEDURE TheTask;
		VAR
			task : VBLTask;

	BEGIN
{Do our thing}
		SysBeep(2);	{beep for 2 ticks}
		FlashMenuBar(0); {invert the menu bar}

		SetUpA5;		{get application globals boundary so we get the right pointer to
"myTask"}
		mytask.vblCount := 30;	{we need to reset this so the task will keep executing}
		RestoreA5;	{restore A5 to what it was before}
	END;

	PROCEDURE InstallTask;
		VAR
			err : OSErr;

	BEGIN
		WITH myTask DO
			BEGIN
				qType := Ord(vType);	{A vertical retrace task!}
				vblAddr := @TheTask;	{our task procedure}
				vblCount := 30;			{30 ticks between invocations}
				vblPhase := 0;			{no timing shift}
			END;

		err := VInstall(@myTask);			{Install it}
	END;

	PROCEDURE RemoveTask;
		VAR
			err : OSErr;

	BEGIN
		err := VRemove(@MyTask);		{fields are already set up; remove the task}
	END;

BEGIN
	InstallTask;

	WHILE NOT Button DO 	{wait for mouse click}
		;

	RemoveTask;	{if we don't remove it the system's likely to crash when we exit}
END.