2 * Copyright (c) 1992 Commodore-Amiga, Inc.
4 * This example is provided in electronic form by Commodore-Amiga, Inc. for
5 * use with the "Amiga ROM Kernel Reference Manual: Devices", 3rd Edition,
6 * published by Addison-Wesley (ISBN 0-201-56775-X).
8 * The "Amiga ROM Kernel Reference Manual: Devices" contains additional
9 * information on the correct usage of the techniques and operating system
10 * functions presented in these examples. The source and executable code
11 * of these examples may only be distributed in free electronic form, via
12 * bulletin board or as part of a fully non-commercial and freely
13 * redistributable diskette. Both the source and executable code (including
14 * comments) must be included, without modification, in any copy. This
15 * example may not be published in printed form or distributed with any
16 * commercial product. However, the programming techniques and support
17 * routines set forth in these examples may be used in the development
18 * of original executable software products for Commodore Amiga computers.
20 * All other rights reserved.
22 * This example is provided "as-is" and is subject to change; no
23 * warranties are made. All use is at your own risk. No liability or
24 * responsibility is assumed.
26 *****************************************************************************
30 * This program is designed to do multiple (3) time requests using one
31 * OpenDevice. It creates a message port - TimerMP, creates an
32 * extended I/O structure of type timerequest named TimerIO[0] and
33 * then uses that to open the device. The other two time request
34 * structures - TimerIO[1] and TimerIO[2] - are created using AllocMem
35 * and then copying TimerIO[0] into them. The tv_secs field of each
36 * structure is set and then three SendIOs are done with the requests.
37 * The program then goes into a while loop until all messages are received.
39 * Compile with SAS C 5.10 lc -b1 -cfistq -v -y -L
44 #include <exec/types.h>
45 #include <exec/memory.h>
46 #include <devices/timer.h>
48 #include <proto/exec.h>
49 #include <clib/alib_protos.h>
54 int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
55 int chkabort(void) { return(0); } /* really */
60 struct timerequest
*TimerIO
[3];
61 struct MsgPort
*TimerMP
;
62 struct Message
*TimerMSG
;
64 ULONG error
,x
,seconds
[3]={4,1,2}, microseconds
[3]={0,0,0};
67 char *position
[]={"last","second","first"};
69 if ((TimerMP
= CreatePort(0,0)))
71 if ((TimerIO
[0] = (struct timerequest
*)
72 CreateExtIO(TimerMP
,sizeof(struct timerequest
))))
74 /* Open the device once */
75 if (!(error
=OpenDevice( TIMERNAME
, UNIT_VBLANK
,(struct IORequest
*) TimerIO
[0], 0L)))
77 /* Set command to TR_ADDREQUEST */
78 TimerIO
[0]->tr_node
.io_Command
= TR_ADDREQUEST
;
80 if ((TimerIO
[1]=(struct timerequest
*)
81 AllocMem(sizeof(struct timerequest
),MEMF_PUBLIC
| MEMF_CLEAR
)))
83 if ((TimerIO
[2]=(struct timerequest
*)
84 AllocMem(sizeof(struct timerequest
),MEMF_PUBLIC
| MEMF_CLEAR
)))
86 /* Copy fields from the request used to open the timer device */
87 *TimerIO
[1] = *TimerIO
[0];
88 *TimerIO
[2] = *TimerIO
[0];
90 /* Initialize other fields */
93 TimerIO
[x
]->tr_time
.tv_secs
= seconds
[x
];
94 TimerIO
[x
]->tr_time
.tv_micro
= microseconds
[x
];
95 printf("\nInitializing TimerIO[%ld]",x
);
98 printf("\n\nSending multiple requests\n\n");
100 /* Send multiple requests asynchronously */
101 /* Do not got to sleep yet... */
102 SendIO((struct IORequest
*)TimerIO
[0]);
103 SendIO((struct IORequest
*)TimerIO
[1]);
104 SendIO((struct IORequest
*)TimerIO
[2]);
106 /* There might be other processing done here */
108 /* Now go to sleep with WaitPort() waiting for the requests */
112 /* Get the reply message */
113 TimerMSG
=GetMsg(TimerMP
);
115 if (TimerMSG
==(struct Message
*)TimerIO
[x
])
116 printf("Request %ld finished %s\n",x
,position
[--allin
]);
119 FreeMem(TimerIO
[2],sizeof(struct timerequest
));
123 printf("Error: could not allocate TimerIO[2] memory\n");
125 FreeMem(TimerIO
[1],sizeof(struct timerequest
));
129 printf("Error could not allocate TimerIO[1] memory\n");
131 CloseDevice((struct IORequest
*) TimerIO
[0]);
135 printf("\nError: Could not OpenDevice\n");
137 DeleteExtIO((struct IORequest
*) TimerIO
[0]);
141 printf("Error: could not create IORequest\n");
147 printf("\nError: Could not CreatePort\n");