/* -> c.ckamis */ #include "ckcdeb.h" #ifdef ANSI #include #include #include #include #include "ckatio.h" #include "ckafio.h" #include #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 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: */ 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; }