home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archimedes / aramis.c < prev    next >
C/C++ Source or Header  |  2020-01-01  |  7KB  |  433 lines

  1. /* -> c.ckamis
  2.  */
  3.  
  4. #include "ckcdeb.h"
  5.  
  6. #ifdef ANSI
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <limits.h>
  11. #include "ckatio.h"
  12. #include "ckafio.h"
  13. #include <assert.h>
  14. #include "ckamis.h"
  15. #include "ckuusr.h"
  16. #endif
  17.  
  18. #ifdef ARTHUR
  19. #include "arthur.h"
  20. #include "plib.h"
  21. #include "tty.h"
  22. #endif
  23.  
  24. #ifdef PANOS
  25. #include "time.h"
  26. #endif
  27.  
  28. extern char *CWDCMD;
  29. extern int RawFrig;
  30.  
  31. static reg_set rs;
  32. static error *ret_val;
  33.  
  34. void
  35. gettimeofday(time_now, time_zone)
  36. timeval *time_now;
  37. int *time_zone;
  38. {
  39.       XBinaryTime(time_now);
  40.       *time_zone = 0;
  41. }
  42.  
  43. unsigned int timerdiff(ts, tf)
  44. timeval ts, tf;
  45. {
  46. /*
  47.  * Returns difference(in centi-seconds) between 2 time
  48.  * stamp records.  NB uses simplified double-precision
  49.  * algorithm: ts is start time; tf is finishing time,
  50.  * assumed greater than ts.
  51.  */
  52. #ifdef ANSI
  53. #define MAX_U_INT UINT_MAX
  54. #else
  55. #define MAX_U_INT (unsigned int) 0xFFFFFFFF
  56. #endif
  57.   unsigned int diff;
  58.  
  59. #ifdef ANSI  
  60.   if( (tf.high = ts.high) != 0 )
  61. #else
  62.   if(tf.high = ts.high)
  63. #endif
  64.     diff =(tf.low - ts.low);  /* in centi-seconds */
  65.   else if((tf.high > ts.high + 1) || (tf.low > ts.low))
  66.     diff = MAX_U_INT; /* vast difference */
  67.   else
  68.     diff =(tf.low +(MAX_U_INT - ts.low) + 1);
  69.   return diff;
  70. }
  71.  
  72. static timeval epoch;
  73.  
  74. void
  75. rtimer()
  76. { int timezone;
  77.   gettimeofday(&epoch, &timezone);
  78. }
  79.  
  80. unsigned int
  81. gtimer()
  82. { timeval now; int timezone;
  83.   gettimeofday(&now, &timezone);
  84.   return (timerdiff(now, epoch) / 100);
  85. }
  86.  
  87. void
  88. sleep(secs) int secs; {
  89.   msleep(secs * 1000);
  90. }
  91.  
  92. void
  93. eraseleft() {
  94.   XSWriteByte(RawFrig, 127);
  95. }
  96.  
  97. void
  98. beep() {
  99.   XSWriteByte(RawFrig, 7);
  100. }
  101.  
  102. /***************************************/
  103. /*    C H D I R  --  Change directory  */
  104. /***************************************/
  105. int
  106. chdir(dirnam) char *dirnam; {
  107. char cmdstr [512];
  108. char *prefix, *suffix;
  109.   char *cp;
  110.   prefix = CWDCMD; suffix = dirnam;
  111.   for (cp = cmdstr; *prefix != '\0'; *cp++ = *prefix++) ;
  112. #ifdef ANSI
  113.   while ( (*cp++ = *suffix++) != '\0' ) ;
  114. #else
  115.   while (*cp++ = *suffix++) ;
  116. #endif
  117.   system(cmdstr);
  118.   return(0);
  119. }
  120.  
  121. void
  122. setbaud(speed) int speed; {
  123. int fx;
  124.  
  125.   switch (speed) {
  126.   case 75: fx = 1; break;
  127.   case 150: fx = 2; break;
  128.   case 300: fx = 3; break;
  129.   case 1200: fx = 4; break;
  130.   case 2400: fx = 5; break;
  131.   case 4800: fx = 6; break;
  132.   case 9600: fx = 7; break;
  133.   case 19200: fx = 8; break;
  134.   default:
  135.     fx = 7; break;
  136.   }
  137.  
  138.   rs.r[0] = 7;
  139.   rs.r[1] = fx;
  140.   ret_val = osbyte( &rs );
  141.  
  142.   rs.r[0] = 8;
  143.   rs.r[1] = fx;
  144.   ret_val = osbyte( &rs );
  145.  
  146. }
  147.  
  148. int
  149. baudint(newx) int newx; {
  150.   switch (newx&7) {
  151.   case 0: return(75);
  152.   case 1: return(150);
  153.   case 2: return(300);
  154.   case 3: return(1200);
  155.   case 4: return(2400);
  156.   case 5: return(4800);
  157.   case 6: return(9600);
  158.   case 7: return(19200);
  159.   default:  return(-1);
  160.   }
  161.  
  162. }
  163.  
  164.  
  165. int
  166. dfbaudr () {
  167. int fx7code, fx8code;
  168.  
  169.  
  170.     /* Read baud rate from CMOS ram, can't read directly using fx7 */
  171.  
  172.     rs.r[0] = 161;
  173.     rs.r[1] = 15;
  174.     rs.r[2] = 0x0;
  175.     ret_val = osbyte( &rs );
  176.  
  177.     fx7code = fx8code = (rs.r[2] >> 2) & 0x7;
  178.  
  179.     if (fx7code != fx8code) {
  180.        printf("Warning - split baud rates not supported - %d:%d\n\
  181.   Please set speed <nnn> immediately\n",
  182.        baudint(fx7code), baudint(fx8code));
  183.     } else {
  184.       setbaud(baudint(fx7code));
  185.     }
  186.   
  187.   return(baudint(fx7code));
  188.  
  189. }
  190.  
  191. void
  192. DirtyFlush(buffer) int buffer; {
  193.  
  194.     rs.r[0] = 21;
  195.     rs.r[1] = buffer;
  196.     ret_val = osbyte( &rs );
  197.  
  198. }
  199.  
  200. void
  201. fx(a,x,y) int a,x,y; {
  202.  
  203.     rs.r[0] = a; 
  204.     rs.r[1] = x;
  205.     rs.r[2] = y;
  206.     ret_val = osbyte( &rs );
  207.  
  208. }
  209.  
  210. static char escape_char;
  211.  
  212. void
  213. initrs() {
  214.  
  215.   /* This should be in ttvt in ckptio - should also be undone afterwards */
  216.   fx(204,0,0);
  217.   fx(2,2,0);
  218.   fx(3,0,0);
  219.   fx(181,1,0);
  220.   fx(202,48,0);
  221.   fx(118,0,0);
  222.  
  223.   rs.r[0] = 220;
  224.   rs.r[1] = 0;
  225.   rs.r[2] = 255;
  226.   ret_val = osbyte( &rs );
  227.   escape_char = rs.r[1];
  228.  
  229. void
  230. termrs() {
  231.   
  232.   rs.r[0] = 220;
  233.   rs.r[1] = escape_char;
  234.   rs.r[2] = 0;
  235.   ret_val = osbyte( &rs );
  236.  
  237. }
  238.  
  239. int
  240. testbf(buff, val) int buff; int *val; {
  241. #define keybf      0
  242. #define rs423inbf  1
  243. #define rs423outbf 2
  244.  
  245. int ch;
  246.  
  247.     switch( buff )
  248.     {
  249.         case keybf:
  250. #ifndef ARTHUR
  251.             rs.r[0] = 145;
  252.             rs.r[1] = buff;
  253.             ch = rs.r[2] = 0xff00;
  254.  
  255.             ret_val = osbyte( &rs );
  256.  
  257.             if ( ch != rs.r[2] )
  258.             { /* not empty */
  259.                  *val = rs.r[2] & 0xff;
  260.                  return 1;
  261.             }
  262.             return 0;
  263. #endif
  264.             ch = kbremove(buff);
  265.             if( ch == 0 )
  266.                 return 0;
  267.  
  268.             *val = ch & 0xff;
  269.             return 1;
  270.             break;
  271.         case rs423inbf:
  272.         case rs423outbf:
  273.             if( (ch = rsremove(buff)) == 0 )
  274.                 return 0;
  275.  
  276.             *val = ch & 0xff;
  277.             return 1;
  278.             break;
  279.         default:
  280.             fatal("Bad buff number\n");
  281.     }
  282.  
  283.     return 0;
  284.  
  285. }
  286.  
  287. int
  288. putinbf(buff, val) int buff, val; {
  289.  
  290.   rs.r[0] = 153;
  291.   rs.r[1] = buff;
  292.   rs.r[2] = val;
  293.   ret_val = osbyte( &rs );
  294.  
  295.   return(1);
  296.  
  297.  
  298. }
  299.  
  300. int nrsbuf() { /* returns number of chars in RS423 input buffer */
  301.     return rscount( 0, 1 );
  302. }
  303.  
  304. void
  305. get_posn(x,y) int *x,*y; { /* returns Beeb text cursor coords */
  306.   
  307.   rs.r[0] = 134;
  308.   rs.r[1] = 0;
  309.   rs.r[2] = 0;
  310.  
  311.   ret_val = osbyte( &rs );
  312.   *x = rs.r[1];
  313.   *y = rs.r[2];
  314.  
  315. }
  316.  
  317. error *mosbyte3r(int r0, int r1, int r2)
  318. {       rs.r[0] = r0;
  319.         rs.r[1] = r1;
  320.         rs.r[2] = r2;
  321.         return (osbyte(&rs));
  322. }
  323.  
  324. void mosbyte3(int r0, int r1, int r2) { mosbyte3r(r0, r1, r2); }
  325.  
  326.  
  327. #define MAXNAMLEN 255
  328. static char dirname[MAXNAMLEN];
  329. static char cmdbuf[MAXNAMLEN+4];
  330.  
  331.  
  332. int
  333. getcwd()
  334. {
  335. osgbpb_block ctl_blk;
  336. error *ret;
  337. char buf[16];
  338. int len;
  339.  
  340.  
  341.         ctl_blk.action = 6;
  342.         ctl_blk.file_handle = NULL; 
  343.         ctl_blk.data_addr = buf;
  344.  
  345.         if( (ret = osgbpb( &ctl_blk )) != NULL )
  346.         {
  347.                 printf("%s (%d)\n",ret->errmess,ret->errnum);
  348.                 return( NULL );
  349.         }
  350.  
  351.         /* Format is:
  352.            <null byte><length byte><dir name><privilege byte>
  353.          */
  354.         len = buf[1];
  355.         buf[len+2] = '\0';
  356.  
  357.         if( (len == 1) && (buf[2] == '$') )
  358.         {
  359.             dirname[0] = '$';
  360.             dirname[1] = '\0';
  361.             return 1;
  362.         }
  363.         else
  364.         {
  365.             system("dir ^");
  366.             if( getcwd() == 1 )
  367.             {
  368.                 buf[1] = '.'; 
  369.                 strcat( dirname, buf+1 );
  370.                 return 1;
  371.             }
  372.             else 
  373.                 return NULL;
  374.         }
  375.                  
  376.         /* Should never get here! */
  377.         return 0;
  378.  
  379. }
  380.  
  381.  
  382. char *
  383. pwd()
  384. {
  385.  
  386.     if( getcwd() != 1 )
  387.         return NULL;
  388.  
  389.     strcpy(cmdbuf,"dir ");
  390.     strcat(cmdbuf, dirname );
  391.     system(cmdbuf);
  392.  
  393.     return dirname;
  394.  
  395. }
  396.  
  397. static char disc[] = ":x";
  398.  
  399. void
  400. du(char * s )
  401. {
  402. reg_set rs;                                                                 
  403. error *err;
  404. FILE *fp;
  405.  
  406.     if( (fp=fopen(s,"w")) == NULL )
  407.         return;
  408.  
  409.     if( (err=swix( 0x040242, &rs )) != NULL )
  410.     {
  411.         fprintf(fp,"ADFS_Drives error %s (%d)\n",err->errmess,err->errnum);
  412.         return ;
  413.     }
  414.  
  415.     disc[1] = rs.r[0] + '0';
  416.  
  417.     rs.r[0] = (int)disc;
  418.  
  419.     if( (err=swix( 0x040243, &rs )) != NULL )
  420.     {
  421.         fprintf(fp,"ADFS_FreeSpace error %s (%d)\n",err->errmess,err->errnum);
  422.         return;
  423.     }
  424.  
  425.     fprintf(fp,"Bytes free &%.8X = %ld\n",rs.r[0],rs.r[0]);
  426.  
  427.     fclose( fp );
  428.  
  429.     return;
  430. }
  431.  
  432.