home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d168
/
dillonstuff.lha
/
src
/
deemu
/
clock.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-11-22
|
5KB
|
216 lines
/*
* CLOCK.C simple clock program
*/
#include <local/typedefs.h>
short Params[] = {
'ST','RT', 0, 0,
'NW',' ', 0, 8, -1, 10, 40, 20,
'TE','XT', 0,16, 'HI','\0T','ES','T.', 0, 0, 0, 0,
'EN','D ', 0, 0
};
#define WPOSX 8
#define WPOSY 9
#define WWIDTH 10
#define WHEIGHT 11
APTR IntuitionBase;
APTR GfxBase;
NW Nw = {
0, 0, 0, 0, 0, 0,
CLOSEWINDOW|REFRESHWINDOW|ACTIVEWINDOW|INACTIVEWINDOW,
SIMPLE_REFRESH|WINDOWCLOSE|BACKDROP|RMBTRAP,
NULL, NULL, (ubyte *)"", NULL, NULL, 4, 4, -1, -1, WBENCHSCREEN
};
short Sin[60+15] = {
0, 27, 53, 79, 104, 128, 150, 171, 190, 207, 222, 234, 243, 250, 255,
256, 255, 250, 243, 234, 222, 207, 190, 171, 150, 128, 104, 79, 53, 27,
0, -27, -53, -79,-104,-128,-150,-171,-190,-207,-222,-234,-243,-250,-255,
-256,-255,-250,-243,-234,-222,-207,-190,-171,-150,-128,-104, -79, -53, -27,
0, 27, 53, 79, 104, 128, 150, 171, 190, 207, 222, 234, 243, 250, 255
};
#define Cos (Sin+15)
_main(ac, av)
char *av[];
{
IOT Iot; /* timer request, 1 second internals */
SCR Scr;
WIN *Win;
PORT TPort; /* port for timer request */
long TMask;
long WMask;
long error = 20;
char notdone = 1;
bzero(&Iot, sizeof(Iot));
bzero(&TPort, sizeof(TPort));
if (!(IntuitionBase = OpenLibrary("intuition.library", 0)))
goto dieilib;
if (!(GfxBase = OpenLibrary("graphics.library", 0)))
goto dieglib;
if (OpenDevice("timer.device", UNIT_VBLANK, &Iot, 0))
goto diedev;
if (!GetScreenData(&Scr, sizeof(Scr), WBENCHSCREEN, NULL))
goto diewin;
Nw.Width = Params[WWIDTH];
Nw.Height = Params[WHEIGHT];
Nw.LeftEdge = Params[WPOSX];
Nw.TopEdge = Params[WPOSY];
if (Nw.Width <= 0)
Nw.Width += Scr.Width;
if (Nw.Height <= 0)
Nw.Height += Scr.Height;
if (Nw.LeftEdge < 0)
Nw.LeftEdge += Scr.Width - Nw.Width;
if (Nw.TopEdge < 0)
Nw.TopEdge += Scr.Height- Nw.Height;
if (Nw.LeftEdge < 0 || Nw.TopEdge < 0 || Nw.LeftEdge + Nw.Width > Scr.Width || Nw.TopEdge + Nw.Height > Scr.Height) {
Nw.LeftEdge = Nw.TopEdge = 0;
Nw.Width = 64;
Nw.Height= 32;
}
if (!(Win = OpenWindow(&Nw)))
goto diewin;
ShowTitle(Win->WScreen, 0);
TPort.mp_Node.ln_Type = NT_MSGPORT;
TPort.mp_SigTask = FindTask(NULL);
TPort.mp_SigBit = AllocSignal(-1);
TPort.mp_Flags = PA_SIGNAL;
NewList(&TPort.mp_MsgList);
Iot.tr_node.io_Message.mn_ReplyPort = &TPort;
Iot.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
Iot.tr_node.io_Command = TR_ADDREQUEST;
Iot.tr_time.tv_secs = 1;
Iot.tr_time.tv_micro= 0;
SendIO(&Iot);
TMask = 1 << TPort.mp_SigBit;
WMask = 1 << Win->UserPort->mp_SigBit;
error = 0;
while (notdone) {
register long mask = Wait(TMask|WMask);
if (mask & TMask) {
register short secs;
WaitIO(&Iot);
secs = UpdateWindow(Win);
Iot.tr_time.tv_secs = 65 - secs;
Iot.tr_time.tv_micro= 0;
Iot.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
SendIO(&Iot);
}
if (mask & WMask) {
register IMESS *im;
while (im = GetMsg(Win->UserPort)) {
switch(im->Class) {
case CLOSEWINDOW:
notdone = 0;
break;
case REFRESHWINDOW:
BeginRefresh(Win);
EndRefresh(Win);
case ACTIVEWINDOW:
case INACTIVEWINDOW:
UpdateWindow(Win);
break;
}
ReplyMsg(im);
}
}
}
AbortIO(&Iot);
WaitIO(&Iot);
FreeSignal(TPort.mp_SigBit);
CloseWindow(Win);
diewin:
CloseDevice(&Iot);
diedev:
CloseLibrary(GfxBase);
dieglib:
CloseLibrary(IntuitionBase);
dieilib:
_exit(error);
}
/*
* Update the window
*
* (1) RectFill
* (2) minute and hour hands
*/
UpdateWindow(win)
register WIN *win;
{
register RP *rp = win->RPort;
DATESTAMP DS;
short minutes;
short hours;
short radiusx, radiusy;
short centerx, centery;
DateStamp(&DS);
minutes = DS.ds_Minute % 60;
hours = (DS.ds_Minute / 12) % 60; /* 0 to 59 (partial hours indicator) */
radiusx = (win->Width - 2) >> 1;
radiusy = (win->Height- 2) >> 1;
centerx = 1 + radiusx;
centery = 1 + radiusy;
SetAPen(rp, 0);
RectFill(rp, 0, 0, win->Width - 1, win->Height - 1);
SetAPen(rp, 1);
{
register short i;
for (i = 0; i < 60; i += 5) {
Move(rp, centerx + ((radiusx * Sin[i]) >> 8), centery + ((radiusy * -Cos[i]) >> 8));
Draw(rp, centerx + ((radiusx * Sin[i]) >> 8), centery + ((radiusy * -Cos[i]) >> 8));
}
}
radiusx -= 2;
radiusy -= 2;
SetAPen(rp, 3); /* minutes */
Move(rp, centerx, centery);
Draw(rp, centerx + ((radiusx * Sin[minutes]) >> 8), centery + ((radiusy * -Cos[minutes]) >> 8));
SetAPen(rp, 2); /* hours */
Move(rp, centerx, centery);
Draw(rp, centerx + ((radiusx * Sin[hours]) / 384), centery + ((radiusy * -Cos[hours]) / 384));
return(DS.ds_Tick / 50 % 60); /* seconds */
}
#asm
; bzero(buf, bytes)
; 4sp 8sp
;
; SIMPLE STUPID BZERO .. I don't even use DBF (don't want to
; have to think at this time of night)
_bzero:
moveq.l #0,D1
move.l 4(sp),A0
move.l 8(sp),D0
beq bze
bz1 move.b D1,(A0)+
subq.l #1,D0
bne bz1
bze rts
#endasm