00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "asuro_unix.h"
00020 #include "asuro_unix_decode.h"
00021 #include "asuro_defs.h"
00022
00023 #include <stdlib.h>
00024 #include <stdio.h>
00025 #include <string.h>
00026 #include <signal.h>
00027 #include <sys/time.h>
00028 #include <sys/resource.h>
00029 #include <sys/types.h>
00030 #include <unistd.h>
00031
00032 volatile int AS_unix_alarmCount = 0;
00033 volatile double AS_unix_simTime = 0.0;
00034 volatile int AS_unix_ioLock = 0;
00035
00036
00037
00038
00039 void AS_unix_sh_SIGALRM(int signo, siginfo_t *info, void *context)
00040 {
00041 if (signo == SIGALRM) {
00042 int i;
00043 for (i = 0; i < 255; i++) {
00044 SIG_OUTPUT_COMPARE2();
00045
00046 }
00047
00048 AS_unix_alarmCount++;
00049 if (AS_unix_alarmCount >= 28) {
00050 AS_unix_simTime += 0.003556*28;
00051 AS_unix_alarmCount = 0;
00052
00053 AS_unix_decode();
00054
00055 }
00056
00057 }
00058
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 int AS_unix_prepareIo(int io_addr)
00073 {
00074
00075 if (AS_unix_ioLock) return io_addr;
00076 AS_unix_ioLock = 1;
00077
00078 switch (io_addr) {
00079
00080 case 0x0A: {
00081 UDR = '\0';
00082 UCSRA |= 0x20 | 0x40;
00083 UCSRA &= ~0x80;
00084 break;
00085 }
00086
00087
00088 case 0x0C: {
00089 if (UCSRB == 0x08) {
00090
00091 printf("%c", UDR);
00092 fflush(stdout);
00093
00094 } else if (UCSRB == 0x10) {
00095
00096
00097 }
00098 break;
00099 }
00100
00101 default: {}
00102 }
00103
00104 AS_unix_ioLock = 0;
00105 return io_addr;
00106 }
00107
00108
00109
00110
00111 inline void AS_Init(void)
00112 {
00113 fprintf(stderr, "AS_Init()\n");
00114
00115
00116 memset(AS_unix_ioVector, 0, sizeof(AS_unix_ioVector));
00117
00118
00119 struct sigaction act;
00120 memset(&act, 0, sizeof(act));
00121 act.sa_flags = SA_SIGINFO;
00122 act.sa_sigaction = AS_unix_sh_SIGALRM;
00123 sigaction(SIGALRM, &act, NULL);
00124
00125
00126 struct itimerval itimer;
00127 memset(&itimer, 0, sizeof(itimer));
00128 itimer.it_interval.tv_usec = 7000;
00129 itimer.it_value.tv_usec = 7000;
00130 setitimer(ITIMER_REAL, &itimer, NULL);
00131
00132
00133 setpriority(PRIO_PROCESS, getpid(), 5);
00134
00135 }