DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦8e9703998⟧ TextFile

    Length: 4398 (0x112e)
    Types: TextFile
    Notes: UNIX file
    Names: »clock.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦2d53db1df⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »hr/src/clock/clock.c« 

TextFile

#include <math.h>
#include <types.h>
#include <timeb.h>
#include <time.h>
#include <smgr.h>

#define	POLY	32
#define BIG	12
#define LITTLE	9
#define SECOND	13
#define	CWINDOW	(WINDOW+8)

extern	uint	CXMAX,
		CYMAX,
		CXRAD,
		CYRAD,
		CXCEN,
		CYCEN;

short	handfl;

struct HAND
{
	POINT left;
	POINT center;
	POINT right;
};

struct HAND	lastbig,
		lastlittle,
		lastsecond;

POINT	cframe[2][32],		/* points on the frame		*/
	cdig[12][4];		/* points on the numerals	*/


setpoints()
{
	register uint i,j;
	double	_dsin, _dcos, _dsin2, _dcos2;

	for(i=0; i< 32; ++i) 
	{
		_dsin = sin((2*PI*i)/31);
		_dcos = cos((2*PI*i)/31);
		for( j = 0; j <= 1; j ++ )
		{
			cframe[j][i].x = (uint)((CXRAD + 5*j) * _dcos + CXCEN);
			cframe[j][i].y = (uint)((CYRAD + 5*j) * _dsin + CYCEN);
		}
	}
	
	j = 0;
	for(i = 0; i< 360; i+= (360/12) )
	{
		_dsin = sin((2*PI*i)/360);
		_dcos = cos((2*PI*i)/360);
		_dsin2 = sin((2*PI*(i+1))/360);
		_dcos2 = cos((2*PI*(i+1))/360);
		cdig[j][0].x = (uint)((15*CXRAD)/16 * _dcos + CXCEN);
		cdig[j][0].y = (uint)((15*CYRAD)/16 * _dsin + CYCEN);
		cdig[j][1].x = (uint)((14*CXRAD)/16 * _dcos2 + CXCEN);
		cdig[j][1].y = (uint)((14*CYRAD)/16 * _dsin2 + CYCEN);	
		cdig[j][2].x = (uint)((12*CXRAD)/16 * _dcos + CXCEN);
		cdig[j][2].y = (uint)((12*CYRAD)/16 * _dsin + CYCEN);
		cdig[j][3].x = (uint)((14*CXRAD)/16 * cos((2*PI*((i+359)%360))/360) +CXCEN);
		cdig[j][3].y = (uint)((14*CYRAD)/16 * sin((2*PI*((i+359)%360))/360) + CYCEN);
		j++;
	}
}

drawface()
{
	GRAPH	g;
	register uint i,j;

	S_ClrClip(CWINDOW);
	g.wn_Logop = L_FALSE;
	G_SetGraph( CWINDOW, &g, GCLOG );
	for(i=0; i< 31; ++i) 
	{
		for( j = 0; j <= 1; j ++ )
			cwline(cframe[j][i], cframe[j][i+1]);
	}
	
	for( i = 0; i< 12; i++ )
	{
		cwmove(cdig[i][0]);
		cwtoline(cdig[i][1]);
		cwtoline(cdig[i][2]);
		cwtoline(cdig[i][3]);
		cwtoline(cdig[i][0]);
	}
	clrhand(&lastbig);
	clrhand(&lastlittle);
	handfl = 0;
	g.wn_Logop = L_NDST;
	G_SetGraph( CWINDOW, &g, GCLOG );
}


drawhands()
{
	struct HAND big,little,second;
	struct tm *atm;
	struct	timeb tb;
	ftime(&tb);
	atm = localtime(&tb.time);
	ghand(&big,atm,BIG);
	ghand(&little,atm,LITTLE);
	ghand(&second,atm,SECOND);
	if(handfl) {
		if(different(&lastbig,&big))
			hand(&lastbig,BIG);
		if(different(&lastlittle, &little))
			hand(&lastlittle,LITTLE);
		hand(&lastsecond,SECOND);
	}
	if(different(&lastbig,&big))
		hand(&big,BIG);
	if(different(&lastlittle, &little))
		hand(&little,LITTLE);
	hand(&second, SECOND);
	lastbig = big;
	lastlittle = little;
	lastsecond = second;
	handfl = 1;
	return(0);
}


different(a,b)
struct HAND *a,*b;
{
	if(( a->right.x != b->right.x) ||
		(a->right.y != b->right.y) ||
		(a->center.x != b->center.x) ||
		(a->center.y != b->center.y) ||
		(a->left.x != b->left.x) ||
		(a->left.y != b->left.y))
		return (1);
	else
		return(0);
}


/*
**	get points for hand
*/
ghand(hs,atm,r)
struct HAND *hs;
struct tm *atm;
int r;
{
	uint i;
	if(r == BIG) 
		i = (atm->tm_min * 360)/60;
	else if(r == LITTLE)
	{
		i = ((atm->tm_hour % 12) * 360)/12;
		i += (atm->tm_min * 30)/60;

	}
	else	i = (atm->tm_sec * 360)/60;
	i = (i+270)%360;
	hs->center.x = (uint)((CXRAD * r)/16 * cos((2*PI*i)/360) + CXCEN);
	hs->center.y = (uint)((CYRAD * r)/16 * sin((2*PI*i)/360) + CYCEN);
	if (r==BIG)
	{
		hs->left.x = (uint)((CXRAD * (r-2))/16 * 
			cos((2*PI*((i+358)%360))/360) + CXCEN);
		hs->left.y = (uint)((CYRAD * (r-2))/16 * 
			sin((2*PI*((i+358)%360))/360) + CYCEN);
		hs->right.x = (uint)((CXRAD * (r-2))/16 * 
			cos((2*PI*((i+2)%360))/360) + CXCEN);
		hs->right.y = (uint)((CYRAD * (r-2))/16 * 
			sin((2*PI*((i+2)%360))/360) + CYCEN);
	}
	else if (r == LITTLE)
	{
		hs->left.x = (uint)((CXRAD * (r-2))/16 *
			cos((2*PI*((i+357)%360))/360) + CXCEN);
		hs->left.y = (uint)((CYRAD * (r-2))/16 *
			sin((2*PI*((i+357)%360))/360) + CYCEN);
		hs->right.x = (uint)((CXRAD * (r-2))/16 *
			cos((2*PI*((i+3)%360))/360) + CXCEN);
		hs->right.y = (uint)((CYRAD * (r-2))/16 *
			sin((2*PI*((i+3)%360))/360) + CYCEN);
	}
}


hand(h,hf)
struct HAND *h;
short hf;
{
		
	cwmove(CXCEN, CYCEN);
	if (hf == SECOND)
	{
		cwtoline(h->center.x, h->center.y);
	}
	else
	{
		cwtoline(h->left.x,h->left.y);
		cwtoline(h->center.x, h->center.y);
		cwtoline(h->right.x, h->right.y);
		cwtoline(CXCEN, CYCEN);
	}
}

clrhand(hp)
struct HAND *hp;
{
	hp->left.x = 0;
	hp->left.y = 0;
	hp->center.x = 0;
	hp->center.y = 0;
	hp->right.x = 0;
	hp->right.y = 0;
}