home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / com / computer / midi_com / sourcen / mc_drive.mid / mcdrv1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-17  |  3.7 KB  |  206 lines

  1. #include <tos.h>
  2. #include <stdlib.h>
  3. #include <screen.h>
  4. #include "drv_ass.h"
  5. #include "drv_type.h"
  6.  
  7. typedef struct
  8. {
  9.     int            *errbell;
  10.     unsigned    long    ok;
  11.     unsigned    long    errs;
  12.     unsigned    long    errc;
  13. }errstate;
  14.  
  15. int hlp=0;
  16.  
  17. errstate rec_proto={&hlp,0,0,0};
  18.  
  19. io_rec        *midi_io;
  20. char        midi_buf[25000];
  21.  
  22. void set_errbell(int *errbell)
  23. {
  24.     rec_proto.ok=0L;
  25.     rec_proto.errs=0L;
  26.     rec_proto.errbell=errbell;
  27. }
  28.  
  29. void do_install(void)
  30. {
  31.     midi_io=INSTALL(sizeof(midi_buf)-10,midi_buf);
  32. }
  33.  
  34. void    clear_buff(void)
  35. {
  36. int i;
  37.     do
  38.     {    
  39.         MIDEIN();
  40.         for (i=0;i<10;i++)    Vsync();
  41.     }    while (midi_io->nw!=midi_io->nl);
  42. }
  43.  
  44. void AES_install(void)
  45. {
  46.  
  47. #ifdef DOWNIRLV
  48.  INST_2(4);
  49. #endif
  50. #ifdef MOUSEVEK
  51.  INST_2(1);
  52. #endif
  53. #ifdef MAUSIKBD
  54.  INST_2(3);
  55. #endif
  56. #ifdef ALLES
  57.  INST_2(7);
  58. #endif
  59. #ifdef IRV_MOUS
  60.  INST_2(5);
  61. #else
  62.  INST_2(0);
  63. #endif
  64. }
  65.  
  66.  
  67. int mdstat(void)
  68. {
  69.  int nl,nw;
  70.  nl=midi_io->nl; nw=midi_io->nw;
  71.  if ((INTC!=0) || (nl!=nw)) return(-1);
  72.  else return(0);
  73. }
  74.  
  75. int fil_request(void)
  76. {
  77. register int nl,nw,size;
  78. register long fuellung;
  79.  
  80.  nl=midi_io->nl; nw=midi_io->nw;
  81.  if (INTC!=0) return(1);
  82.  if (nl==nw) return(0);
  83.  
  84.     nw++;
  85.     if (nw==midi_io->size) nw=0;
  86.     size=midi_io->ibuf[nw];
  87.     size<<=8;
  88.     nw++;
  89.     if (nw==midi_io->size) nw=0;
  90.     size|=midi_io->ibuf[nw];
  91.     if ((size<14) || (size>4400)) return(1);
  92.  
  93.     fuellung=(nw<nl) ? (nl-nw) :(midi_io->size-nw+nl);
  94.     if (fuellung>(size-14)) return(1);
  95.         else return(0);
  96. }
  97.  
  98. void proto_out(char *msgtyp, int sender, int empf, int state) 
  99. {
  100. static char hlp[20];
  101. int msg;
  102.  
  103.     if (*rec_proto.errbell >0)
  104.     {
  105.         msg = msgtyp[0];
  106.         msg <<= 8;
  107.         msg |= msgtyp[1];
  108.         Save_pos();
  109.         switch (state)
  110.         {
  111.             case 0: Goto_pos(1,50);break;
  112.             case 1: 
  113.             case 2: Goto_pos(2,50);break;
  114.             case 3: 
  115.             case 4: 
  116.             case 5: Goto_pos(3,50);break; /*senden*/
  117.         }
  118.         Cconws("TYP:");Cconws(itoa(msg,hlp,10));
  119.         Cconws(" !=>");Cconws(itoa(sender,hlp,10));
  120.         Cconws(" =>!");Cconws(itoa(empf,hlp,10));
  121.         switch (state)
  122.         {
  123.             case 0: Cconws("      ");break; /*Auftrag*/
  124.             case 1: Cconws(" >>>>>");break; /*sendung*/
  125.             case 2: Cconws(" <<<<<");break; /*empfang*/
  126.             case 3: Cconws(" ?????");break; /*request von aussen*/
  127.             case 4: Cconws(" reply");break; /*senden*/
  128.             case 5: Cconws(" >===>");break; /*durchreichen*/
  129.         }
  130.         Load_pos();
  131.     }
  132. }
  133.  
  134.  
  135. void err_out( int rec_err,int CRC_err)
  136. {
  137. static char hlp[20];
  138.  
  139.     switch (*rec_proto.errbell)
  140.     {
  141.         case 0:break;
  142.         case 1: 
  143.             if (rec_err)
  144.             {
  145.                   if (CRC_err) rec_proto.errc++;
  146.                      else rec_proto.errs++;
  147.                   Save_pos();
  148.                   Goto_pos(0,57);
  149.                   Cconws("ok=");Cconws(ultoa(rec_proto.ok,hlp,10));
  150.                   Cconws(" #");Cconws(ultoa(rec_proto.errs,hlp,10));
  151.                   Cconws(" CRC");Cconws(ultoa(rec_proto.errc,hlp,10));
  152.                   Load_pos();
  153.             } else rec_proto.ok++;
  154.             break;
  155.         case 2: 
  156.             if (rec_err)
  157.             {
  158.                 if (CRC_err) rec_proto.errc++;
  159.                      else rec_proto.errs++;
  160.               }
  161.             else rec_proto.ok++;
  162.                Save_pos();
  163.             Goto_pos(0,57);
  164.             Cconws("ok=");Cconws(ultoa(rec_proto.ok,hlp,10));
  165.             Cconws(" #");Cconws(ultoa(rec_proto.errs,hlp,10));
  166.               Cconws(" CRC");Cconws(ultoa(rec_proto.errc,hlp,10));
  167.                Load_pos();break;
  168.     }
  169. }
  170.  
  171.  
  172. #define    out_count    1000
  173.  
  174. int lese(int len,char *buff)
  175. {
  176. int i=0;
  177. int err1=0,err2=0;
  178.  
  179. if ((len<2) || (len>4500)) return(1);
  180. do 
  181. {
  182.     if (midi_io->nw!=midi_io->nl)
  183.     {
  184.         midi_io->nw++;
  185.         if (midi_io->nw==midi_io->size) midi_io->nw=0;
  186.         buff[i++]=midi_io->ibuf[midi_io->nw];
  187.         err1=0;
  188.     }
  189.     else err1++;
  190. } while ((err1<out_count) && (i<len) && (0==INTC));
  191.  
  192. err2=INTC;
  193.     if ((err1>=out_count) || (err2!=0)) 
  194.     {
  195.         return(err1|err2);
  196.     }
  197.     else return(0);
  198.  
  199. long  SENDE(int len, char *buff)
  200. {
  201.     MSEND(len-1,buff);
  202.     return(0);
  203. }
  204.  
  205.