1
0
mirror of https://github.com/prirun/p50em.git synced 2026-01-20 01:25:11 +00:00
Jim bc8742fb5c removed syscom/ directory, clock auto-sets via VCP interface +
SVC always fault - no more emulation of Primos II
added support for 102.4 and 3.2us clock ticks
2007-03-21 00:00:00 -04:00

193 lines
4.0 KiB
C

/* os.c, Jim Wilcoxson, 4/15/2005
Emulations of Primos Operating System routines for Unix.
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
#include <sys/times.h>
#include "os.h"
os_init() {
os.ttydev = open("/dev/tty", O_RDWR, 0);
if (os.ttydev < 0) {
perror(" error opening /dev/tty");
exit(1);
}
}
os_break$(short *onoff) {
}
os_c1in(short *charg) {
unsigned char ch;
int n;
fprintf(stderr," c1in waiting for data\n");
do {
n = read(os.ttydev, &ch, 1);
if (n == 0)
sleep(1);
} while (n == 0);
if (n < 0) {
perror(" error reading from tty");
exit(1);
}
if (n != 1) {
fprintf(stderr," unexpected error reading from tty, n=%d", n);
exit(1);
}
if (ch == 015)
ch = 012;
*charg = ch | 0x80;
}
os_comanl() {
}
os_cnin$(unsigned char *buf, short *maxchars, short *n) {
short ch;
*n = 0;
while (*n < *maxchars) {
os_c1in(&ch);
buf[*n] = ch;
(*n)++;
if (ch == 0212) break;
}
}
os_exit() {
fprintf(stderr,"\nProgram called EXIT\n");
exit(1);
}
os_erkl$$(short *key, short *erasech, short *killch, short *code) {
if (*key == 1) { /* k$read */
*erasech = 0210;
*killch = 0377;
*code = 0;
}
}
os_errpr$ (short *key, short *code, char *msg, short *msglen, char *prog, short *proglen) {
if (*code == 0) return;
fprintf (stderr, " key=%d, code=%d, msglen=%d, proglen=%d\n", *key, *code, *msglen, *proglen);
exit(1);
}
os_ginfo (short *buf, short *bufsiz) {
int i;
fprintf(stderr," ginfo bufsiz=%d\n", *bufsiz);
if (*bufsiz <= 0) return;
buf[0] = 0;
if (*bufsiz > 1) buf[1] = 0;
if (*bufsiz > 2) buf[2] = 61; /* max device # */
for (i=0; i < *bufsiz-3; i++)
buf[i+3] = 440; /* disk record size */
}
/* RDTK$$
key - 1=read UC, 2=read, 3=reset, 4=rest, 5=init
info - output array
[0] = type - 1=normal, 2=regular, 5=null, 6=eol
info[1] = length
info[2] = flags
:100000=decimal, :40000=octal, :20000=dash, :10000=info[3] < 8
info[3] = positional token's position 0-9 (1/44, 4/20, etc)
info[4] = positional token's value
buf - output token buffer
buflen - size in words of buf (in)
code - return code
*/
os_rdtk$$(short *key, short *info, char *buf, short *buflen, short *code) {
fprintf(stderr," key=%d\n", *key);
*code = 0;
if (*key = 1) {
info[0] = 6;
info[1] = 0;
info[2] = 0;
info[3] = 0;
info[4] = 0;
} else {
exit(1);
}
}
os_t1ou(short *charg) {
fprintf(stderr," Character is '%o/%d, Prime is '%o/%d, (%c)\n", *charg, *charg, *charg & 0x7f, *charg & 0x7f, *charg & 0x7f);
putchar(*charg & 0x7f);
fflush(stdout);
}
os_timdat(short *userbuf, short *n) {
time_t tod;
struct tm tms;
struct {
char mmddyy[6];
short timemins; /* minutes since midnight */
short timesecs; /* plus seconds (0-50) */
short timeticks; /* plus ticks (0-329 330ths of a second) */
short cpusecs;
short cputicks;
short iosecs;
short ioticks;
short tickspersec;
short userno;
char username[32];
} timbuf;
if (sizeof(timbuf) != sizeof(short)*28) {
fprintf(stderr," sizeof(timebuf)=%d, size of 28-word array=%d\n",
sizeof(timbuf), sizeof(short)*28);
exit(1);
}
tod = time(NULL);
localtime_r(&tod, &tms);
strncpy(timbuf.mmddyy,"042105",6);
#if 0
timbuf.timemins = tms.tm_hour*60 + tms.tm_min;
timbuf.timesecs = tms.tm_sec;
#else
timbuf.timemins = 0;
timbuf.timesecs = 0;
#endif
timbuf.timeticks = 0;
timbuf.cpusecs = timbuf.cputicks = timbuf.iosecs = timbuf.ioticks = 0;
timbuf.tickspersec = 330;
timbuf.userno = 1;
strncpy(timbuf.username,"SYSTEM ",32);
memcpy(userbuf, &timbuf, *n*2);
}
os_tnoua(unsigned char *s, short *len) {
int i;
fprintf(stderr," writing %d char string \"", *len);
for (i=0; i < *len; i++)
fputc(s[i] & 0x7f,stderr);
fprintf(stderr,"\"\n");
for (i=0; i < *len; i++)
putchar(s[i] & 0x7f);
fflush(stdout);
}