alarm-clock-6502/alarm.clock.c

355 lines
6.9 KiB
C
Raw Normal View History

2015-08-21 14:37:15 +00:00
#include <stdio.h> /* scanf */
#include <stdint.h> /* uint8_t */
#include <stdbool.h> /* true */
#include <ctype.h> /* toupper */
#include <conio.h> /* clrscr, kbhit */
2015-10-09 15:26:41 +00:00
#include <time.h> /* time_t, struct tm */
2015-08-21 14:37:15 +00:00
2015-10-09 15:26:41 +00:00
#include "noslotclock.h"
#include "time.h"
#include "trace.h"
2015-08-21 14:37:15 +00:00
#define CLOCK_FREQUENCY 1023000L
#define CYCLES_PER_NOOP 2
#define NOOPS_PER_SEC 511500
#define CTRL_C '\x03'
#define ESC '\x1B'
2015-10-09 15:26:41 +00:00
#define FMTD_TIME_SIZE 16
2015-08-21 14:37:15 +00:00
void read_inputs(void);
2015-10-09 15:26:41 +00:00
void sleep_one_second(void);
void do_nothing_for_one_second(void);
2015-08-21 14:37:15 +00:00
void run_clock(void);
2015-10-09 15:26:41 +00:00
static struct tm G_Current_Time;
static struct tm G_Alarm_Time;
2015-08-21 14:37:15 +00:00
void main(void)
{
2015-10-09 15:26:41 +00:00
TRACE_ENTER("main");
2015-08-21 14:37:15 +00:00
2015-10-09 15:26:41 +00:00
load_driver();
2015-08-24 06:40:05 +00:00
clrscr();
2015-08-21 14:37:15 +00:00
read_inputs();
clrscr();
printf("\nAlarm Time: ");
2015-10-09 15:26:41 +00:00
print_12_hour_time(&G_Alarm_Time);
2015-08-21 14:37:15 +00:00
printf("\nCurrent Time: ");
run_clock();
2015-10-09 15:26:41 +00:00
TRACE_EXIT("main");
2015-08-21 14:37:15 +00:00
}
void read_inputs()
{
2015-10-09 15:26:41 +00:00
TRACE_ENTER("read_inputs");
read_time(&G_Current_Time);
2015-08-21 14:37:15 +00:00
puts("Alarm Time");
2015-10-09 15:26:41 +00:00
read_time_interactively(&G_Alarm_Time);
TRACE_EXIT("read_inputs");
2015-08-21 14:37:15 +00:00
}
void run_clock()
{
char c;
2015-10-09 15:26:41 +00:00
TRACE_ENTER("run_clock");
print_12_hour_time(&G_Current_Time);
2015-08-21 14:37:15 +00:00
while (true) {
2015-10-09 15:26:41 +00:00
sleep_one_second();
reprint_12_hour_time(&G_Current_Time);
2015-08-21 14:37:15 +00:00
if (kbhit()) {
c = cgetc();
if (c == ESC || toupper(c) == 'Q' || c == CTRL_C) {
puts("");
break;
}
}
}
2015-10-09 15:26:41 +00:00
TRACE_EXIT("run_clock");
}
/**
* Waits for one second. Modifies the global G_Current_Time.
*/
void sleep_one_second()
{
time_t old_time;
TRACE_ENTER("sleep_one_second");
old_time = mktime(read_time(&G_Current_Time));
while (mktime(read_time(&G_Current_Time)) <= old_time) {
do_nothing_for_one_second();
}
TRACE_EXIT("sleep_one_second");
2015-08-21 14:37:15 +00:00
}
2015-10-09 15:26:41 +00:00
void do_nothing_for_one_second()
2015-08-21 14:37:15 +00:00
{
2015-10-09 15:26:41 +00:00
int i = 0;
2015-08-21 14:37:15 +00:00
int max_loops;
2015-10-09 15:26:41 +00:00
TRACE_ENTER("do_nothing_for_one_second");
2015-08-21 14:37:15 +00:00
max_loops = NOOPS_PER_SEC / 250;
2015-10-09 15:26:41 +00:00
for ( ; i < max_loops; ++i) {
2015-08-21 14:37:15 +00:00
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
2015-10-09 15:26:41 +00:00
TRACE_EXIT("do_nothing_for_one_second");
2015-08-21 14:37:15 +00:00
}