bert@bebux.UUCP (Bert Reuling) (01/04/89)
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive"
#
# Contents:
#
# README
# rtc.c
#
# Wrapped by bert@tjilp on Wed Jan 4 11:22:15 1989
PATH=/bin:/usr/bin:/usr/local/bin ; export PATH
if test -f 'README' -a "${1}" != "-c"
then
echo "$0: Will not overwrite existing file: README"
else
echo "x - README (1118 characters)"
sed 's/^X//' <<\END_OF_SHAR >README
X
X
X
X rtc
X
X Copyright (c) 1988
X
X Bert Reuling
X
X This rtc program may be copied freely.
X
X
X
X This rtc program is for use with the Weide RTC clock module.
X This is a clock module for the ATARI 260, 520 and 1040ST. As
X this clock module is NOT compatible with the MEGA ST
X built-in clock, you cannot use the megartc.c program from
X the distribution. The module is produced by:
X
X
X Weide Elektronik
X Regerstrasse 34
X D-4010 Hilden
X Tel. 02103-41226
X BRD (West Germany)
X
X
X Please send bug reports, remarks, etc to:
X
X ...!hp4nl!bebux!bert
X
X
X / / Bert Reuling
X /-, ,--, ,-, /- p/a Radio Holland bv
X / / /--- / / Jan Rebelstraat 20
X `-' `-- ` `-- 1069 CC Amsterdam
X The Netherlands
X
X MINIX werkgroep UNIXgg/HCC
END_OF_SHAR
if test 1118 -ne `wc -c <'README'`
then
echo "$0: unpacked with wrong size: README"
fi
fi
if test -f 'rtc.c' -a "${1}" != "-c"
then
echo "$0: Will not overwrite existing file: rtc.c"
else
echo "x - rtc.c (3660 characters)"
sed 's/^X//' <<\END_OF_SHAR >rtc.c
X/*
X * rtc.c - Weijde RTC for minix v1.0. Copyright (c) 1988 Bert Reuling
X */
X#include <stdio.h>
X#include <fcntl.h>
X
X#define RTC_ADDRESS 0x00fffc00L
X
Xstatic int verbose;
Xstatic char *name, *Copyright = "\0rtc v1.0 Copyright (c) 1988 Bert Reuling";
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X char msg[20];
X int regn, regs[12], fd, i, year, month, day,
X hour, minute, second, wkd, lyr;
X long clock, ticks = 0L;
X static char *nday[7] = {
X "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
X };
X static char *nmonth[13] = {
X "Jan", "Feb", "Mar", "Apr", "May", "Jun",
X "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
X };
X static int mdays[2][12] = {
X { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
X { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
X };
X
X if (getuid() != 0) {
X fprintf(stderr, "%s: cannot execute. (must be root)\n", argv[0]);
X exit(-1);
X }
X
X name = argv[0];
X verbose = (argc != 1);
X
X message(1, "open /dev/mem");
X
X if ((fd = open("/dev/mem", O_RDWR, 0)) < 0)
X message(1, "failed");
X
X message(2, "reading rtc registers");
X
X for (i = 0x9600; i < 0x960d; i++) {
X if (lseek(fd, RTC_ADDRESS, 0) == -1)
X message(2, "seek failed");
X if (write(fd, &i, 2) != 2) {
X sprintf(msg, "register set %d failed\n", (i & 0x000f));
X message(2, msg);
X }
X if (lseek(fd, RTC_ADDRESS, 0) == -1)
X message(2, "seek failed");
X if (read(fd, ®n, 2) != 2) {
X sprintf(msg, "register get %d failed", (i & 0x000f));
X message(2, msg);
X }
X regs[i & 0x0f] = regn & 0x000f;
X sprintf(msg, "register %2d = $%02x", (i & 0x000f), (regn & 0x00ff));
X message(2, msg);
X }
X
X message(3, "closing /dev/mem");
X
X if (close(fd) == -1)
X message(3, "failed");
X
X message(4, "assemble rtc data");
X
X year = 1900 + regs[12] * 10 + regs[11];
X month = regs[10] * 10 + regs[9] - 1;
X day = regs[8] * 10 + regs[7];
X wkd = regs[6];
X hour = (regs[5] & 0x03) * 10 + regs[4];
X minute = regs[3] * 10 + regs[2];
X second = regs[1] * 10 + regs[0];
X lyr = isleap(year);
X
X if (year < 1970)
X message(4, "error in year part");
X if ((month < 0) || (month > 11))
X message(4,"error in month part");
X if ((day < 1) || (day > 31))
X message(4, "error in day part");
X if ((wkd < 0) || (wkd > 6))
X message(4, "error in week-day part");
X if ((hour < 0) || (hour > 23))
X message(4, "error in hour part");
X if ((minute < 0) || (minute > 59))
X message(4, "error in minute part");
X if ((second < 0) || (second > 59))
X message(4, "error in seconds part");
X
X for (i = 1970; i < year; i++)
X ticks += (long) (isleap(i) ? 366 : 365);
X for (i = 0; i < month; i++)
X ticks += (long) mdays[lyr][i];
X ticks -= 1L;
X ticks += (long) day;
X ticks *= 24L;
X ticks += (long) hour;
X ticks *= 60L;
X ticks += (long) minute;
X ticks *= 60L;
X ticks += (long) second;
X
X message(5, "checking time");
X
X time(&clock);
X if (clock < ticks)
X message(5, "time is set backwards");
X
X message(6, "setting system time");
X
X if (stime(&ticks) < 0)
X message(6, "failed");
X
X printf("%s %s %2d %02d:%02d:%02d %d\n", nday[wkd], nmonth[month], day, hour, minute, second, year);
X
X exit(0);
X}
X
X/*
X * isleap - return 1 if 'year' is a leap year
X */
Xisleap(year)
Xint year;
X{
X return (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0));
X}
X
X/*
X * message - print error/diagnostics message
X */
Xmessage(phase, message_string)
Xint phase;
Xchar *message_string;
X{
X if (verbose)
X printf("%s: ** phase %d - %s\n", name, phase, message_string);
X}
X
END_OF_SHAR
if test 3660 -ne `wc -c <'rtc.c'`
then
echo "$0: unpacked with wrong size: rtc.c"
fi
fi
echo "End of archive"
exit 0
#
#
#