home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff345.lzh / X2X / x2x_1.c < prev    next >
C/C++ Source or Header  |  1990-04-16  |  11KB  |  447 lines

  1. /*SCCS header -          %W%   %G%                                     */
  2. /************************************************************************ 
  3. *                                                                       * 
  4. *                      Filename:        x2x_1.c                         *      
  5. *                       Version:        0.0                             * 
  6. *                       Author :        Gary Duncan                     * 
  7. *                    24 Inkster St                   *
  8. *                    Kambah ACT 2902                 *
  9. *                    Australia                       *
  10. *                                                                       * 
  11. *-----------------------------------------------------------------------* 
  12. * Modification record 
  13. * ------------------- 
  14. * Date         By whom             Change 
  15. * ----         -------             ------ 
  16. * 12 Apr 89     GMD                AMIGA'd
  17. *------------------------------------------------------------------------ 
  18.  
  19.  
  20. *------------------------------------------------------------------------------ 
  21. * Contents 
  22. * ------- 
  23. *+ 
  24. *+              rite_rec        writes DLL record to disc 
  25. *+              get_rtype       validates input file as INTEL/MOTOROLA/TEK.. 
  26. *+              f_reset         resets file pointer to start 
  27. *+              dll_Irec        builds an INTEL  record 
  28. *+              dll_Mrec        builds a MOTOROLA  record 
  29. *+              dll_Trec        builds a TEKTRONIX  record 
  30. *+              dll_Txrec       builds a TEKTRONIX-extended  record 
  31. *+              dll_Qrec        builds a QTAM  record 
  32. *+  
  33. ******************************************************************************/ 
  34.  
  35. #include "x2x_amiga.h"
  36. #include "x2x_data.c"
  37.  
  38.  
  39.  
  40. /*************************************************************************** 
  41.  
  42.  
  43.   Function :     get_Irec  
  44.  
  45.  
  46.   Purpose  :     reads and compacts an INTEL record (termed by a RET) 
  47.  
  48.   Entry    : 
  49.  
  50.  
  51.   Returns  :     TRUE -  
  52.  
  53.                  FALSE-  
  54.  
  55.  
  56. ****************************************************************************/ 
  57.  
  58. int get_Irec () 
  59.  
  60.   int cch , len , count ; 
  61.  
  62.   
  63.      get_rstart ( ':' ) ;        /* search for record start */ 
  64.  
  65.       count = 0 ; 
  66.        
  67.       while ( count != 4 )                /* process record */ 
  68.     { 
  69.           cch = getc2 ( ) ; 
  70.  
  71.           switch ( count++ ) 
  72.         { 
  73.              case 0 : 
  74.                ilen = cch   ;            
  75.                glen = ilen ;          /* data length */
  76.                break ; 
  77.     
  78.              case 1 : 
  79.                iaddr = cch << 8  ;     /* addr hi */ 
  80.                 break ; 
  81.     
  82.              case 2 : 
  83.                 iaddr |= cch  ;       /* addr lo */ 
  84.                break ; 
  85.  
  86.              case 3 :                 /* type - */ 
  87.                 itype = cch ; 
  88.  
  89.                 if ( itype == 1 )           /* check for end record */ 
  90.                    return ( 0 ) ; 
  91.                 break ; 
  92.             } 
  93.     } 
  94.         /*--------------- act on rec type -----------------------------*/ 
  95.  
  96.        if ( itype == 0 )          /* data rec here  */ 
  97.         {         
  98.           len = ilen ; 
  99.           count = 0 ; 
  100.           while ( len-- ) 
  101.              { 
  102.                cch = getc2 () ; 
  103.  
  104.                yaddr = xibase + iaddr++ ;   /* gen address */ 
  105.                xputc ( yaddr , cch ) ;     /* put addr/chara in buffer */ 
  106.  
  107.              } 
  108.      } 
  109.        else if ( itype == 2 )         /* seg addr ( USBA ) */ 
  110.          { 
  111.             xibase  = getc2() << 8 ;   /* hi  */ 
  112.             xibase |= getc2 ()     ;   /* lo  */ 
  113.             xibase = xibase << 4   ;   /* make abs  */ 
  114.       } 
  115.        else 
  116.      { 
  117.                       /* ignore anything else */ 
  118.      } 
  119.       return ( 1 ) ; 
  120.  
  121. /*************************************************************************** 
  122.  
  123.  
  124.   Function :     get_Mrec 
  125.  
  126.  
  127.   Purpose  :     Get a Motorola S record 
  128.  
  129.   Entry    : 
  130.  
  131.  
  132.   Returns  :     
  133.  
  134.  
  135. ****************************************************************************/ 
  136.  
  137. int  get_Mrec ()        /* gets a Motorola S record                  */ 
  138.  
  139.  
  140.   int cch , len , count , type ; 
  141.   int adrlen = 0 ; 
  142.   
  143.   while ( !adrlen )              /* ignore all but S1,2,3,9 recs */ 
  144.     { 
  145.       get_rstart ( 'S' ) ;        /* search for record start */ 
  146.        
  147.       type = Ichar() - '0' ; 
  148.       switch ( type ) 
  149.     { 
  150.         case 9: 
  151.                 return ( 0 ) ;     /* EOF */ 
  152.  
  153.     case 3   :  ++adrlen ; 
  154.     case 2   :  ++adrlen ; 
  155.     case 1   :  ++adrlen ; 
  156.  
  157.                break ;        
  158.     default : 
  159.         {} ;                 /* loop */ 
  160.     } 
  161.     } 
  162.       count = 0 ; 
  163.       iaddr = 0 ; 
  164.        
  165.       while ( count != (adrlen + 2) )    /* get len , then 2/3/4 addr bytes */ 
  166.     { 
  167.           cch = getc2 ( ) ; 
  168.  
  169.           switch ( count++ ) 
  170.         { 
  171.              case 0 : 
  172.                ilen = cch - adrlen - 2   ;  /* # of data bytes */            
  173.                len = ilen ; 
  174.                break ; 
  175.     
  176.              case 1 : 
  177.                iaddr = cch   ;         /* addr hi */ 
  178.                 break ; 
  179.     
  180.              case 2 : 
  181.                 iaddr = (iaddr<<8) | cch  ;       /* addr lo */ 
  182.                break ; 
  183.                                         /*--next bytes maybe--- */ 
  184.              case 3 : 
  185.                 iaddr = (iaddr<<8) | cch  ;       /* addr lo */ 
  186.  
  187.                break ; 
  188.  
  189.              case 4 : 
  190.                 iaddr = (iaddr<<8) | cch  ;       /* addr lo */ 
  191.  
  192.                break ; 
  193.  
  194.             } 
  195.     } 
  196.            
  197.           /* read data bytes */ 
  198.          
  199.           count = 0 ; 
  200.           while ( len-- ) 
  201.              { 
  202.  
  203.                cch = getc2 () ; 
  204.  
  205.                xputc ( iaddr++, cch ) ;     /* put addr/chara in buffer */ 
  206.  
  207.              } 
  208.  
  209.   return ( 1 ) ;        /* flag data type */ 
  210.  
  211. /*************************************************************************** 
  212.  
  213.  
  214.   Function :     get_Trec 
  215.  
  216.  
  217.   Purpose  :     Get a TEKTRONIX record 
  218.  
  219.   Entry    : 
  220.  
  221.   Returns  :     TRUE -  
  222.  
  223.                  FALSE- 
  224.  
  225.  
  226. ****************************************************************************/ 
  227.  
  228. int  get_Trec ()        /* gets a TEKTRONIX record                  */ 
  229.  
  230.                         /* returns FALSE if error & xerrno = error    */ 
  231.  
  232.  
  233.   int cch , len , count ; 
  234.  
  235.  
  236.  
  237.       get_rstart ( '/' ) ;        /* search for record start */ 
  238.   
  239.       count = 0 ; 
  240.        
  241.       while ( count != 4 )                /* process record */ 
  242.     { 
  243.           cch = getc2 ( ) ; 
  244.  
  245.           switch ( count++ ) 
  246.         { 
  247.     
  248.              case 0 : 
  249.                iaddr = cch << 8  ;     /* addr hi */ 
  250.                 break ; 
  251.     
  252.              case 1 : 
  253.                 iaddr |= cch  ;       /* addr lo */ 
  254.                 break ; 
  255.  
  256.              case 2 :                 /* len */ 
  257.                ilen = cch   ;            
  258.                glen = ilen ; 
  259.                if ( !ilen )          /* exit if last record */ 
  260.                  { 
  261.                    return ( 0 ) ; 
  262.          } 
  263.  
  264.                 break ; 
  265.  
  266.              case 3  :                 /* load sum - ignore */ 
  267.                 break ;  
  268.             } 
  269.     } 
  270.            
  271.           /* read data bytes */ 
  272.          
  273.           len = ilen ; 
  274.           count = 0 ; 
  275.           while ( len-- ) 
  276.              { 
  277.  
  278.                cch = getc2 () ; 
  279.  
  280.                xputc ( iaddr++, cch ) ;     /* put addr/chara in buffer */ 
  281.  
  282.              } 
  283.          return ( 1 ) ;        /* not EOF return */ 
  284.  
  285.  
  286. /*************************************************************************** 
  287.  
  288.  
  289.   Function :     get_trec 
  290.  
  291.  
  292.   Purpose  :     Get a TEKTRONIX-extended  record 
  293.  
  294.   Entry    : 
  295.  
  296.   Returns  :     TRUE -  
  297.  
  298.                  FALSE- 
  299.  
  300.  
  301.   Record Format :     %lltCCkx...x<Hex data pairs> 
  302.  
  303.                        ll = length ( all charas after % ) 
  304.                        t  = type chara ( 6 = data , 8 = end ) 
  305.                        CC = checksum  
  306.                        k  = # of address charas, max 8 ( = 4 bytes ) 
  307.                        x...x = 'k' address charas 
  308.          
  309.                        .... data as usual 
  310.   
  311.  
  312. ****************************************************************************/ 
  313.  
  314. int  get_trec ()        /* gets a TEKTRONIX-extended record                  */ 
  315.  
  316.                         /* returns FALSE if error & xerrno = error    */ 
  317.  
  318.  
  319.   int type , cch , count ,  len , nchars ; 
  320.  
  321.  
  322.       get_rstart ( '%' ) ;        /* search for record start */ 
  323.   
  324.       count = 0 ; 
  325.        
  326.       nchars = getc2 ()   ;           /* get length */ 
  327.  
  328.      if ( (type = Ichar ()) == -1 )                  /* MS nibble   */ 
  329.       { 
  330.          fprintf ( stderr , "\Ichar fail" ) ; 
  331.          exit (3) ; 
  332.       } 
  333.  
  334.       if ( type == '8' ) 
  335.           return ( 0 ) ;                 /* end record */ 
  336.       if ( type != '6' ) 
  337.         { 
  338.           fprintf (stderr , "\nBad type ( %d ) " , type ) ; 
  339.           exit (3) ; 
  340.         } 
  341.         
  342.        getc2 () ;                   /* discard 2 checksum charas */ 
  343.  
  344.  
  345.      if ( (len = Ichar ()) == -1 )                  /* MS nibble   */ 
  346.       { 
  347.          fprintf ( stderr , "\Ichar fail" ) ; 
  348.          exit (3) ; 
  349.       } 
  350.        len -=  '0'     ;   /* get addr len  */ 
  351.        nchars = nchars - len - 6 ;  /* adjust for data len */ 
  352.  
  353.        iaddr = 0 ; 
  354.        while ( len-- )              /* build addr */ 
  355.         { 
  356.           if ( (cch = Ichar ()) == -1 )                  /* MS nibble   */ 
  357.             { 
  358.               fprintf ( stderr , "\Ichar fail" ) ; 
  359.               exit (3) ; 
  360.             } 
  361.            cch -= '0' ; 
  362.            iaddr = iaddr*16 + cch ; 
  363.         } 
  364.  
  365.          
  366.            
  367.         /* read data bytes */ 
  368.          
  369.         ilen = nchars / 2 ;    /* set up ext # of bytes */ 
  370.         len = ilen ; 
  371.  
  372.           while ( len-- ) 
  373.              { 
  374.                cch = getc2 () ; 
  375.  
  376.                xputc ( iaddr++, cch ) ;     /* put addr/chara in buffer */ 
  377.  
  378.              } 
  379.          return ( 1 ) ;        /* not EOF return */ 
  380.  
  381. /*************************************************************************** 
  382.  
  383.  
  384.   Function :     get_Qrec 
  385.  
  386.  
  387.   Purpose  :     Get a QTAM record 
  388.  
  389.   Entry    : 
  390.  
  391.   Returns  :     TRUE -  
  392.  
  393.                  FALSE- 
  394.  
  395.  
  396. ****************************************************************************/ 
  397.  
  398. int  get_Qrec () 
  399.  
  400.  
  401.  
  402.   int cch , len  ; 
  403.  
  404.  
  405.  
  406.    get_rstart ( 'Q' ) ;        /* search for record start */ 
  407.   
  408.    len = Ichar () ;                     /* length */ 
  409.    if ( !len )  
  410.       return ( 0 ) ;                    /* EOF */ 
  411.  
  412.    yaddr = Ichar () ;                    /*  3 addr bytes */ 
  413.    yaddr = (yaddr << 8 ) | Ichar () ; 
  414.    yaddr = (yaddr << 8 ) | Ichar () ; 
  415.            
  416.    /* read data bytes */ 
  417.          
  418.  
  419.           while ( len-- ) 
  420.              { 
  421.                cch = Ichar () ; 
  422.                xputc ( yaddr++, cch ) ;     /* put addr/chara in buffer */ 
  423.  
  424.              } 
  425.  
  426.          Ichar () ;           /* discard c/sum chara */ 
  427.  
  428.          return ( 1 ) ;        /* not EOF return */ 
  429.  
  430.  
  431.