home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / PPL4C11.ZIP / SI.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-18  |  11.8 KB  |  506 lines

  1. /*
  2. **
  3. **   --- please read this ! ---
  4. **
  5. **  This source code is in "shrouded" form. It is distributed in this form
  6. **  rather than as a library (.LIB) file because of the inconsistancies
  7. **  between object files generated by different compilers. To support several
  8. **  compilers would require a .LIB file for each compiler manufacturer, and
  9. **  sometimes several versions of the .LIB file are needed for the different
  10. **  versions of the same manufacturers compiler!
  11. **
  12. **  You can compile this code, but you will have to register with us in order
  13. **  to get the normal (commented) C source code with normal variable names.
  14. */
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <ctype.h>
  21. #include <conio.h>
  22. #include "opcodes.h"
  23. #include "si.h"
  24. #include "pcl4c.h"
  25. #include "term.h"
  26. #include "term_io.h"
  27. #include "modem_io.h"
  28. #include "amodem.h"
  29. #include "xymodem.h"
  30. #include "zmodem.h"
  31. #include "win_io.h"
  32. #include "ascii.h"
  33.  
  34. #ifndef FALSE
  35. #define FALSE 0
  36. #define TRUE !FALSE
  37. #endif
  38.  
  39. #define MARK 0x55
  40. #define BYTE unsigned char
  41.  
  42. #define CODE_SIZE 1024
  43. #define DATA_SIZE 1024
  44. #define STACK_SIZE  32
  45.  
  46. #define BUFBLK_SIZE 1024
  47.  
  48. static int  V43 = 2;     
  49. static BYTE V5 = 0;    
  50. static int  V8 = 0;      
  51. static int  V13 = 0;      
  52. static int  V38 = 0;    
  53. static char V25;         
  54. static int  V26 = 1;    
  55. static int  V29 = 540;   
  56. static int  V27 = 5;     
  57. static int  V24 = TRUE;  
  58. static char V28 = 'X';  
  59. static FILE *V3;     
  60. static char V16[15];    
  61. static BYTE V6[CODE_SIZE];   
  62. static char V10[DATA_SIZE];   
  63. static BYTE V37[STACK_SIZE]; 
  64. static int  V2;
  65. static int  V23;
  66. static int  V11;
  67. static int  V39;
  68. static int  V15[10] =
  69.   {0x180,0x0C0,0x060,0x030,0x018,0x00C,0x006,0x003,0x002,0x001};
  70. static char V4[BUFBLK_SIZE];
  71. static int  V40 = FALSE;
  72. static char V41[80];
  73.  
  74. void SaySiErr(int Code)
  75. {
  76.  switch(Code)
  77.    {case  SI_CANNOT_OPEN:
  78.       WinPutString(SCR_WIN,"Cannot open script binary\n");
  79.       break;
  80.     case  SI_UNEXPECTED_EOF:
  81.       WinPutString(SCR_WIN,"Unexpected EOF\n");
  82.       break;
  83.     case  SI_NOT_SCRIPT_BINARY:
  84.       WinPutString(SCR_WIN,"Not script binary\n");
  85.       break;
  86.     case  SI_NOT_CURRENT_VERSION:
  87.       WinPutString(SCR_WIN,"Incorrect script version\n");
  88.       break;
  89.     case  SI_CODE_LENGTH_OVERFLOW:
  90.       WinPutString(SCR_WIN,"Code overflow\n");
  91.       break;
  92.     case  SI_DATA_LENGTH_OVERFLOW:
  93.       WinPutString(SCR_WIN,"Data overflow\n");
  94.       break;
  95.     case  SI_BAD_OPCODE:
  96.       WinPutString(SCR_WIN,"Bad opcode encountered\n");
  97.       break;
  98.     case  SI_USER_ABORTS:
  99.       WinPutString(SCR_WIN,"User aborting...\n");
  100.       break;
  101.     case  SI_STACK_OVERFLOW:
  102.       WinPutString(SCR_WIN,"Stack overflow\n");
  103.       break;
  104.     case  SI_STACK_UNDERFLOW:
  105.       WinPutString(SCR_WIN,"Stack underflow\n");
  106.       break;
  107.     case  SI_BAD_CHECKSUM:
  108.       WinPutString(SCR_WIN,"Bad checksum\n");
  109.       break;
  110.     default:
  111.       sprintf(V41,"Script error %d\n",Code);
  112.       WinPutString(SCR_WIN,V41);
  113.       break;
  114.    }
  115. }
  116.  
  117. static int V18(void)
  118. {int i, k;
  119.  i = fgetc(V3);
  120.  if(i==EOF) return(SI_UNEXPECTED_EOF);
  121.  V5 ^= (BYTE)i;
  122.  return((BYTE)i);
  123. }
  124.  
  125. static int V33(int Item)
  126. {V37[V38++] = Item;
  127.  if(V38==STACK_SIZE) return(SI_STACK_OVERFLOW);
  128.  return (0);
  129. }
  130.  
  131. static int V30(void)
  132. {if(V38==0) return(SI_STACK_UNDERFLOW);
  133.  return (V37[--V38]);
  134. }
  135.  
  136. static char V36(int Flag)
  137. {char c;
  138.  if(Flag) return('T');
  139.  else return('F');
  140. }
  141.  
  142.  
  143. static int V17(int V14)
  144. {int i;
  145.  for(i=0;i<10;i++) if(V14==V15[i]) return i;
  146.  return -1;
  147. }
  148.  
  149.  
  150.  
  151. int si(int Port,char *FilePtr,int Debug)
  152. {int i, k;
  153.  int V35;
  154.  char c;
  155.  char *V32;
  156.  int V21; 
  157.  int V22;   
  158.  int V1;   
  159.  int V7;    
  160.  int V12;    
  161.  int V9;
  162.  int V31;
  163.  int V19;
  164.  char V34 = '"';
  165.  char V42[80];
  166.  int V14;
  167.  char NCGchar = 'C';
  168.  
  169.  V14 = SioGetDiv(Port);
  170.  V2 = V17(V14);
  171.  V31 = SioRead(Port,3);
  172.  V11 = 0x03 & V31;
  173.  V39 = 0x01 & (V31>>2);
  174.  V23 = 0x07 & (V31>>3);
  175. #if 0
  176.  sprintf(V41,"Codes: Baud=%d Data=%d Stop=%d Parity=%d\n",
  177.    V2,V11,V39,V23);
  178.  WinPutString(SCR_WIN,V41);
  179. #endif
  180.  
  181.  if(V2<=Baud19200) V40 = TRUE;
  182.  else V40 = FALSE;
  183.  
  184.  for(i=0;i<CODE_SIZE;i++) V6[i] = OPC_HALT;
  185.  for(i=0;i<DATA_SIZE;i++) V10[i] = 0;
  186.  V5 = 0;
  187.  V8 = 0;
  188.  V13 = 0;
  189.  V38 = 0;
  190.  V25 = TRUE;
  191.  V26 = 1;
  192.  
  193.  strncpy(V16,FilePtr,8);
  194.  strcat(V16,".sb");
  195.  
  196.  V3 = fopen(V16,"rb");
  197.  if(V3==NULL) return (SI_CANNOT_OPEN);
  198.  
  199.  if((V35=V18())<0) return(V35);
  200.  if(V35!=MARK) return(SI_NOT_SCRIPT_BINARY);
  201.  
  202.  if((V35=V18())<0) return(V35);
  203.  if(V35!=V43) return(SI_NOT_CURRENT_VERSION);
  204.  
  205.  if((V35=V18())<0) return(V35);
  206.  V7 = 0x00ff & V35;
  207.  if((V35=V18())<0) return(V35);
  208.  V7 = 256*V7 + (0x00ff&V35);
  209. #if 0
  210. sprintf(V41,"Code Length = %d \n",V7)
  211. WinPutString(SCR_WIN,V41);
  212. #endif
  213.  if(V7>=CODE_SIZE) return(SI_CODE_LENGTH_OVERFLOW);
  214.  
  215.  if((V35=V18())<0) return(V35);
  216.  V12 = 0x00ff & V35;
  217.  if((V35=V18())<0) return(V35);
  218.  V12 = 256*V12 + (0x00ff&V35);
  219. #if 0
  220. sprintf(V41,"Data Length = %d \n",V12);
  221. WinPutString(SCR_WIN,V41);
  222. #endif
  223.  if(V12>=DATA_SIZE) return(SI_DATA_LENGTH_OVERFLOW);
  224.  
  225.  for(i=0;i<V7;i++)
  226.    {if((V35=V18())<0) return(V35);
  227. #if 0
  228. sprintf(Temp"%d: %d\n",i,0x003f&V35);
  229. WinPutString(SCR_WIN,V41);
  230. #endif
  231.     V6[V8++] = (BYTE)V35;
  232.    }
  233.  
  234.  if((V35=V18())<0) return(V35);
  235.  if(V35!=MARK) return(SI_NOT_SCRIPT_BINARY);
  236.  
  237.  for(i=0;i<V12;i++)
  238.    {if((V35=V18())<0) return(V35);
  239. #if 0
  240. sprintf(V41,"%d: %d\n",i,V35);
  241. WinPutString(SCR_WIN,V41);
  242. #endif
  243.     V10[V13++] = (BYTE)V35;
  244.    }
  245.  
  246.  if((V35=V18())<0) return(V35);
  247.  if(V35!=MARK) return(SI_NOT_SCRIPT_BINARY);
  248.  
  249.  V9 = V5;
  250.  if((V35=V18())<0) return(V35);
  251.  
  252.  if((BYTE)V35!=V9)
  253.    {
  254. #if 1
  255.     sprintf(V41,"Received V5=%d\n",(BYTE)V35);
  256.     WinPutString(SCR_WIN,V41);
  257.     sprintf(V41,"Computed V5=%d\n",V9);
  258.     WinPutString(SCR_WIN,V41);
  259. #endif
  260.     return(SI_BAD_CHECKSUM);
  261.    }
  262.  
  263.  
  264.  V8 = 0;
  265.  while(1)
  266.    {if(kbhit())
  267.      {c = getch();
  268.       if(c==ESC) return(SI_USER_ABORTS);
  269.       else CharPut(Port,c);
  270.      }
  271.     
  272.     k = V6[V8++];
  273.     V21 = 0x003F & k;
  274.     V22 = (0x00C0 & k) << 2;
  275.     if(Debug)
  276.       {V19 = MatchOpCode(V21);
  277.        sprintf(V41,"@%d",V8);
  278.        sprintf(V42,"[%4s: %s ",V41,GetOpText(V19));
  279.        WinPutString(SCR_WIN,V42);
  280.       }
  281.     
  282.     if(V21>=8)
  283.       {V1 = V22 | (0x00ff & V6[V8++]);
  284.        if(Debug) switch(GetOperType(V19))
  285.          {case CODE_REF:
  286.             sprintf(V41," %d]\n",V1);
  287.             WinPutString(SCR_WIN,V41);
  288.             break;
  289.           case DATA_REF:
  290.             sprintf(V41," %c%s%c]\n",V34,&V10[V1],V34);
  291.             WinPutString(SCR_WIN,V41);
  292.          }
  293.       }
  294.     
  295.     switch(V21)
  296.      {case OPC_HALT:
  297.         return(0);
  298.       case OPC_STATUS:
  299.         sprintf(V41,"PgmChar=%c (%xH) Count=%d Wait=%d Pace=%d Case=%c Protocol=%c\n",
  300.            V36(V25),V25,V26,V29,V27,V36(V24),
  301.            V28);
  302.         WinPutString(SCR_WIN,V41);
  303.         sprintf(V41,"CodePC=%d V21=%d V1=%d V31=%xH BaudDiv=%xH\n",
  304.            V8,V21,V1,SioRead(Port,3),SioGetDiv(Port));
  305.         WinPutString(SCR_WIN,V41);
  306.         ModemDump();
  307.         break;
  308.       case OPC_DELAY:
  309.         SioDelay( (int) (18.2*atof(&V10[V1])) );
  310.         break;
  311.       case OPC_CALL:
  312.         if((V35=V33(V8))<0) return V35;
  313.         V8 = V1;
  314.         break;
  315.       case OPC_RETURN:
  316.         V35 = V30();
  317.         if(V35<0) return V35;
  318.         V8 = V35;
  319.         break;
  320.       case OPC_BAUD:
  321.         i = BaudMatch(&V10[V1]);
  322.         if(V2==-1) V25 = FALSE;
  323.         else
  324.           {V2 = i;
  325.            SioBaud(Port,V2);
  326.            V25 = TRUE;
  327.           }
  328.         break;
  329.       case OPC_DATABITS:
  330.         i = (int) atoi(&V10[V1]);
  331.         V25 = TRUE;
  332.         switch(i)
  333.           {case 7:
  334.              V11 = WordLength7;
  335.              break;
  336.            case 8:
  337.              V11 = WordLength8;
  338.              break;
  339.            default:
  340.              V25 = FALSE;
  341.              break;
  342.           }
  343.         if(V25) SioParms(Port,V23,V39,V11);
  344.         break;
  345.       case OPC_STOPBITS:
  346.         i = (int) atoi(&V10[V1]);
  347.         V25 = TRUE;
  348.         switch(i)
  349.           {case 1:
  350.              V39 = OneStopBit;
  351.              break;
  352.            case 2:
  353.              V39 = TwoStopBits;
  354.              break;
  355.            default:
  356.              V25 = FALSE;
  357.              break;
  358.           }
  359.         if(V25) SioParms(Port,V23,V39,V11);
  360.         break;
  361.       case OPC_PARITY:
  362.         c = V10[V1];
  363.         V25 = TRUE;
  364.         switch(c)
  365.           {case 'N':
  366.              V23 = NoParity;
  367.              break;
  368.            case 'E':
  369.              V23 = EvenParity;
  370.              break;
  371.            case 'O':
  372.              V23 = OddParity;
  373.              break;
  374.            default:
  375.              V25 = FALSE;
  376.              break;
  377.           }
  378.         if(V25) SioParms(Port,V23,V39,V11);
  379.         break;
  380.       case OPC_REPLY:
  381.         ModemSendTo(Port,V27,&V10[V1]);
  382.         break;
  383.       case OPC_SETCOUNT:
  384.         V26 = atoi(&V10[V1]);
  385.         break;
  386.       case OPC_SETWAIT:
  387.         V29 = (int) (18.2*atof(&V10[V1]));
  388.         break;
  389.       case OPC_LOOP:
  390.         if(--V26>0) V8 = V1;
  391.         break;
  392.       case OPC_IFTRUE:
  393.         if(V25) V8 = V1;
  394.         break;
  395.       case OPC_IFFALSE:
  396.         if(!V25) V8 = V1;
  397.         break;
  398.       case OPC_IF:
  399.         if(V25!=V10[V1]) V8 += 2;
  400.         break;
  401.       case OPC_IFNOT:
  402.         if(V25==V10[V1]) V8 += 2;
  403.         break;
  404.       case OPC_GOTO:
  405.         V8 = V1;
  406.         break;
  407.       case OPC_TEST:
  408.         V25 = V10[V1];
  409.         break;
  410.       case OPC_ACCEPT:    
  411.         WinGetString(SCR_WIN,&V10[V1],15);
  412.         break;
  413.       case OPC_SAY:
  414.         V32 = &V10[V1];
  415.         for(i=0;;i++)
  416.           {c = *V32++;
  417.            if(c=='\0') break;
  418.            if(c=='^') c = ( *V32++ ) - '@';
  419.            WinPutChar(SCR_WIN,c);
  420.           }
  421.         break;
  422.       case OPC_WAITFOR:
  423.         V25 = ModemWaitFor(Port,V29,V24,&V10[V1]);
  424.         break;
  425.       case OPC_NOP:
  426.         break;
  427.       case OPC_DEBUG:
  428.         ModemDebug();
  429.         break;
  430.       case OPC_SETPACE:
  431.         V27 = (int) (18.2*atof(&V10[V1]));
  432.         break;
  433.       case OPC_SETCASE:
  434.         c = toupper(V10[V1]);
  435.         if(c=='T') V24 = TRUE;
  436.         if(c=='F') V24 = FALSE;
  437.         break;
  438.       case OPC_QUIET:
  439.         ModemQuiet(Port, (int) (18.2*atof(&V10[V1])) );
  440.         break;
  441.       case OPC_HANGUP:
  442.         ModemHangup(Port);
  443.         break;
  444.       case OPC_PROTOCOL:
  445.         c = toupper(V10[V1]);
  446.         if(c=='A') V28 = 'A';
  447.         if(c=='X') V28 = 'X';
  448.         if(c=='Y') V28 = 'Y';
  449.         if(c=='Z') V28 = 'Z';
  450.         break;
  451.       case OPC_SEND:
  452.         if(V28!='A') ModemEcho(Port,10);
  453.         switch(V28)
  454.           {case 'A':
  455.              
  456.              TxAscii(Port,&V10[V1],V4,BUFBLK_SIZE,FALSE,0,CAN,TRUE);
  457.              break;
  458.            case 'X':
  459.              
  460.              XmodemTx(Port,&V10[V1],V4,FALSE);
  461.              break;
  462.            case 'Y':
  463.              
  464.              YmodemTx(Port,&V10[V1],V4);
  465.              break;
  466.            case 'Z':
  467.              
  468.              ZmodemTx(Port,V16,V40);
  469.              break;
  470.           }
  471.         break;
  472.       case OPC_RECEIVE:
  473.         if(V28!='A') ModemEcho(Port,10);
  474.         switch(V28)
  475.            {case 'A':
  476.                
  477.                RxAscii(Port,&V10[V1],V4,BUFBLK_SIZE,GetBufSize(),FALSE,
  478.                        0x00,5,TRUE);
  479.                break;
  480.             case 'X':
  481.                
  482.                XmodemRx(Port,&V10[V1],V4,NCGchar);
  483.                break;
  484.             case 'Y':
  485.                
  486.                YmodemRx(Port,V4,NCGchar);
  487.             case 'Z':
  488.                
  489.                ZmodemRx(Port,V40);
  490.                break;
  491.            }
  492.         ModemSendTo(Port,V27,"!");
  493.         break;
  494.       case OPC_USER1:
  495.       case OPC_USER2:
  496.       case OPC_USER3:
  497.       case OPC_USER4:
  498.       case OPC_USER5:
  499.       case OPC_USER6:
  500.       case OPC_USER7:
  501.       case OPC_USER8:
  502.         break;
  503.      }
  504.    } 
  505.