home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
archimedes.tar.gz
/
archimedes.tar
/
aramis.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-01
|
7KB
|
433 lines
/* -> c.ckamis
*/
#include "ckcdeb.h"
#ifdef ANSI
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include "ckatio.h"
#include "ckafio.h"
#include <assert.h>
#include "ckamis.h"
#include "ckuusr.h"
#endif
#ifdef ARTHUR
#include "arthur.h"
#include "plib.h"
#include "tty.h"
#endif
#ifdef PANOS
#include "time.h"
#endif
extern char *CWDCMD;
extern int RawFrig;
static reg_set rs;
static error *ret_val;
void
gettimeofday(time_now, time_zone)
timeval *time_now;
int *time_zone;
{
XBinaryTime(time_now);
*time_zone = 0;
}
unsigned int timerdiff(ts, tf)
timeval ts, tf;
{
/*
* Returns difference(in centi-seconds) between 2 time
* stamp records. NB uses simplified double-precision
* algorithm: ts is start time; tf is finishing time,
* assumed greater than ts.
*/
#ifdef ANSI
#define MAX_U_INT UINT_MAX
#else
#define MAX_U_INT (unsigned int) 0xFFFFFFFF
#endif
unsigned int diff;
#ifdef ANSI
if( (tf.high = ts.high) != 0 )
#else
if(tf.high = ts.high)
#endif
diff =(tf.low - ts.low); /* in centi-seconds */
else if((tf.high > ts.high + 1) || (tf.low > ts.low))
diff = MAX_U_INT; /* vast difference */
else
diff =(tf.low +(MAX_U_INT - ts.low) + 1);
return diff;
}
static timeval epoch;
void
rtimer()
{ int timezone;
gettimeofday(&epoch, &timezone);
}
unsigned int
gtimer()
{ timeval now; int timezone;
gettimeofday(&now, &timezone);
return (timerdiff(now, epoch) / 100);
}
void
sleep(secs) int secs; {
msleep(secs * 1000);
}
void
eraseleft() {
XSWriteByte(RawFrig, 127);
}
void
beep() {
XSWriteByte(RawFrig, 7);
}
/***************************************/
/* C H D I R -- Change directory */
/***************************************/
int
chdir(dirnam) char *dirnam; {
char cmdstr [512];
char *prefix, *suffix;
char *cp;
prefix = CWDCMD; suffix = dirnam;
for (cp = cmdstr; *prefix != '\0'; *cp++ = *prefix++) ;
#ifdef ANSI
while ( (*cp++ = *suffix++) != '\0' ) ;
#else
while (*cp++ = *suffix++) ;
#endif
system(cmdstr);
return(0);
}
void
setbaud(speed) int speed; {
int fx;
switch (speed) {
case 75: fx = 1; break;
case 150: fx = 2; break;
case 300: fx = 3; break;
case 1200: fx = 4; break;
case 2400: fx = 5; break;
case 4800: fx = 6; break;
case 9600: fx = 7; break;
case 19200: fx = 8; break;
default:
fx = 7; break;
}
rs.r[0] = 7;
rs.r[1] = fx;
ret_val = osbyte( &rs );
rs.r[0] = 8;
rs.r[1] = fx;
ret_val = osbyte( &rs );
}
int
baudint(newx) int newx; {
switch (newx&7) {
case 0: return(75);
case 1: return(150);
case 2: return(300);
case 3: return(1200);
case 4: return(2400);
case 5: return(4800);
case 6: return(9600);
case 7: return(19200);
default: return(-1);
}
}
int
dfbaudr () {
int fx7code, fx8code;
/* Read baud rate from CMOS ram, can't read directly using fx7 */
rs.r[0] = 161;
rs.r[1] = 15;
rs.r[2] = 0x0;
ret_val = osbyte( &rs );
fx7code = fx8code = (rs.r[2] >> 2) & 0x7;
if (fx7code != fx8code) {
printf("Warning - split baud rates not supported - %d:%d\n\
Please set speed <nnn> immediately\n",
baudint(fx7code), baudint(fx8code));
} else {
setbaud(baudint(fx7code));
}
return(baudint(fx7code));
}
void
DirtyFlush(buffer) int buffer; {
rs.r[0] = 21;
rs.r[1] = buffer;
ret_val = osbyte( &rs );
}
void
fx(a,x,y) int a,x,y; {
rs.r[0] = a;
rs.r[1] = x;
rs.r[2] = y;
ret_val = osbyte( &rs );
}
static char escape_char;
void
initrs() {
/* This should be in ttvt in ckptio - should also be undone afterwards */
fx(204,0,0);
fx(2,2,0);
fx(3,0,0);
fx(181,1,0);
fx(202,48,0);
fx(118,0,0);
rs.r[0] = 220;
rs.r[1] = 0;
rs.r[2] = 255;
ret_val = osbyte( &rs );
escape_char = rs.r[1];
}
void
termrs() {
rs.r[0] = 220;
rs.r[1] = escape_char;
rs.r[2] = 0;
ret_val = osbyte( &rs );
}
int
testbf(buff, val) int buff; int *val; {
#define keybf 0
#define rs423inbf 1
#define rs423outbf 2
int ch;
switch( buff )
{
case keybf:
#ifndef ARTHUR
rs.r[0] = 145;
rs.r[1] = buff;
ch = rs.r[2] = 0xff00;
ret_val = osbyte( &rs );
if ( ch != rs.r[2] )
{ /* not empty */
*val = rs.r[2] & 0xff;
return 1;
}
return 0;
#endif
ch = kbremove(buff);
if( ch == 0 )
return 0;
*val = ch & 0xff;
return 1;
break;
case rs423inbf:
case rs423outbf:
if( (ch = rsremove(buff)) == 0 )
return 0;
*val = ch & 0xff;
return 1;
break;
default:
fatal("Bad buff number\n");
}
return 0;
}
int
putinbf(buff, val) int buff, val; {
rs.r[0] = 153;
rs.r[1] = buff;
rs.r[2] = val;
ret_val = osbyte( &rs );
return(1);
}
int nrsbuf() { /* returns number of chars in RS423 input buffer */
return rscount( 0, 1 );
}
void
get_posn(x,y) int *x,*y; { /* returns Beeb text cursor coords */
rs.r[0] = 134;
rs.r[1] = 0;
rs.r[2] = 0;
ret_val = osbyte( &rs );
*x = rs.r[1];
*y = rs.r[2];
}
error *mosbyte3r(int r0, int r1, int r2)
{ rs.r[0] = r0;
rs.r[1] = r1;
rs.r[2] = r2;
return (osbyte(&rs));
}
void mosbyte3(int r0, int r1, int r2) { mosbyte3r(r0, r1, r2); }
#define MAXNAMLEN 255
static char dirname[MAXNAMLEN];
static char cmdbuf[MAXNAMLEN+4];
int
getcwd()
{
osgbpb_block ctl_blk;
error *ret;
char buf[16];
int len;
ctl_blk.action = 6;
ctl_blk.file_handle = NULL;
ctl_blk.data_addr = buf;
if( (ret = osgbpb( &ctl_blk )) != NULL )
{
printf("%s (%d)\n",ret->errmess,ret->errnum);
return( NULL );
}
/* Format is:
<null byte><length byte><dir name><privilege byte>
*/
len = buf[1];
buf[len+2] = '\0';
if( (len == 1) && (buf[2] == '$') )
{
dirname[0] = '$';
dirname[1] = '\0';
return 1;
}
else
{
system("dir ^");
if( getcwd() == 1 )
{
buf[1] = '.';
strcat( dirname, buf+1 );
return 1;
}
else
return NULL;
}
/* Should never get here! */
return 0;
}
char *
pwd()
{
if( getcwd() != 1 )
return NULL;
strcpy(cmdbuf,"dir ");
strcat(cmdbuf, dirname );
system(cmdbuf);
return dirname;
}
static char disc[] = ":x";
void
du(char * s )
{
reg_set rs;
error *err;
FILE *fp;
if( (fp=fopen(s,"w")) == NULL )
return;
if( (err=swix( 0x040242, &rs )) != NULL )
{
fprintf(fp,"ADFS_Drives error %s (%d)\n",err->errmess,err->errnum);
return ;
}
disc[1] = rs.r[0] + '0';
rs.r[0] = (int)disc;
if( (err=swix( 0x040243, &rs )) != NULL )
{
fprintf(fp,"ADFS_FreeSpace error %s (%d)\n",err->errmess,err->errnum);
return;
}
fprintf(fp,"Bytes free &%.8X = %ld\n",rs.r[0],rs.r[0]);
fclose( fp );
return;
}