/*SCCS header -          %W%   %G%                                     */
/************************************************************************ 
*                                                                       * 
*                      Filename:        x2x_1.c                         *      
*                       Version:        0.0                             * 
*                       Author :        Gary Duncan                     * 
*					24 Inkster St                   *
*					Kambah ACT 2902                 *
*					Australia                       *
*                                                                       * 
*-----------------------------------------------------------------------* 
* 
* Modification record 
* ------------------- 
* 
* Date         By whom             Change 
* ----         -------             ------ 
* 
* 12 Apr 89     GMD                AMIGA'd
* 
*------------------------------------------------------------------------ 
 
 
* 
*------------------------------------------------------------------------------ 
* Contents 
* ------- 
*+ 
*+              rite_rec        writes DLL record to disc 
*+              get_rtype       validates input file as INTEL/MOTOROLA/TEK.. 
*+              f_reset         resets file pointer to start 
*+              dll_Irec        builds an INTEL  record 
*+              dll_Mrec        builds a MOTOROLA  record 
*+              dll_Trec        builds a TEKTRONIX  record 
*+              dll_Txrec       builds a TEKTRONIX-extended  record 
*+              dll_Qrec        builds a QTAM  record 
*+  
* 
******************************************************************************/ 
 
#include "x2x_amiga.h"
#include "x2x_data.c"


 
/*************************************************************************** 
 
 
  Function :     get_Irec  
 
 
  Purpose  :     reads and compacts an INTEL record (termed by a RET) 
 
  Entry    : 
 
 
  Returns  :     TRUE -  
 
                 FALSE-  
 
 
****************************************************************************/ 
 
int get_Irec () 
 
{ 
  int cch , len , count ; 
 
  
     get_rstart ( ':' ) ;        /* search for record start */ 
 
      count = 0 ; 
       
      while ( count != 4 )                /* process record */ 
	{ 
          cch = getc2 ( ) ; 
 
          switch ( count++ ) 
	    { 
             case 0 : 
               ilen = cch   ;            
               glen = ilen ;          /* data length */
               break ; 
    
             case 1 : 
               iaddr = cch << 8  ;     /* addr hi */ 
                break ; 
    
             case 2 : 
                iaddr |= cch  ;       /* addr lo */ 
               break ; 
 
             case 3 :                 /* type - */ 
                itype = cch ; 
 
                if ( itype == 1 )           /* check for end record */ 
                   return ( 0 ) ; 
                break ; 
            } 
	} 
        /*--------------- act on rec type -----------------------------*/ 
 
       if ( itype == 0 )          /* data rec here  */ 
        {         
          len = ilen ; 
          count = 0 ; 
          while ( len-- ) 
             { 
               cch = getc2 () ; 
 
               yaddr = xibase + iaddr++ ;   /* gen address */ 
               xputc ( yaddr , cch ) ;     /* put addr/chara in buffer */ 
 
             } 
	 } 
       else if ( itype == 2 )         /* seg addr ( USBA ) */ 
         { 
            xibase  = getc2() << 8 ;   /* hi  */ 
            xibase |= getc2 ()     ;   /* lo  */ 
            xibase = xibase << 4   ;   /* make abs  */ 
	  } 
       else 
	 { 
                      /* ignore anything else */ 
	 } 
      return ( 1 ) ; 
} 
 
/*************************************************************************** 
 
 
  Function :     get_Mrec 
 
 
  Purpose  :     Get a Motorola S record 
 
  Entry    : 
 
 
  Returns  :     
 
 
****************************************************************************/ 
 
int  get_Mrec ()        /* gets a Motorola S record                  */ 
 
 
{ 
  int cch , len , count , type ; 
  int adrlen = 0 ; 
  
  while ( !adrlen )              /* ignore all but S1,2,3,9 recs */ 
    { 
      get_rstart ( 'S' ) ;        /* search for record start */ 
       
      type = Ichar() - '0' ; 
      switch ( type ) 
	{ 
        case 9: 
                return ( 0 ) ;     /* EOF */ 
 
	case 3   :  ++adrlen ; 
	case 2   :  ++adrlen ; 
	case 1   :  ++adrlen ; 
 
               break ;        
	default : 
		{} ;                 /* loop */ 
	} 
    } 
      count = 0 ; 
      iaddr = 0 ; 
       
      while ( count != (adrlen + 2) )    /* get len , then 2/3/4 addr bytes */ 
	{ 
          cch = getc2 ( ) ; 
 
          switch ( count++ ) 
	    { 
             case 0 : 
               ilen = cch - adrlen - 2   ;  /* # of data bytes */            
               len = ilen ; 
               break ; 
    
             case 1 : 
               iaddr = cch   ;         /* addr hi */ 
                break ; 
    
             case 2 : 
                iaddr = (iaddr<<8) | cch  ;       /* addr lo */ 
               break ; 
                                        /*--next bytes maybe--- */ 
             case 3 : 
                iaddr = (iaddr<<8) | cch  ;       /* addr lo */ 
 
               break ; 
 
             case 4 : 
                iaddr = (iaddr<<8) | cch  ;       /* addr lo */ 
 
               break ; 
 
            } 
	} 
           
          /* read data bytes */ 
         
          count = 0 ; 
          while ( len-- ) 
             { 
 
               cch = getc2 () ; 
 
               xputc ( iaddr++, cch ) ;     /* put addr/chara in buffer */ 
 
             } 
 
  return ( 1 ) ;        /* flag data type */ 
} 
 
/*************************************************************************** 
 
 
  Function :     get_Trec 
 
 
  Purpose  :     Get a TEKTRONIX record 
 
  Entry    : 
 
  Returns  :     TRUE -  
 
                 FALSE- 
 
 
****************************************************************************/ 
 
int  get_Trec ()        /* gets a TEKTRONIX record                  */ 
 
                        /* returns FALSE if error & xerrno = error    */ 
 
 
{ 
  int cch , len , count ; 
 
 
 
      get_rstart ( '/' ) ;        /* search for record start */ 
  
      count = 0 ; 
       
      while ( count != 4 )                /* process record */ 
	{ 
          cch = getc2 ( ) ; 
 
          switch ( count++ ) 
	    { 
    
             case 0 : 
               iaddr = cch << 8  ;     /* addr hi */ 
                break ; 
    
             case 1 : 
                iaddr |= cch  ;       /* addr lo */ 
                break ; 
 
             case 2 :                 /* len */ 
               ilen = cch   ;            
               glen = ilen ; 
               if ( !ilen )          /* exit if last record */ 
                 { 
                   return ( 0 ) ; 
		 } 
 
                break ; 
 
             case 3  :                 /* load sum - ignore */ 
                break ;  
            } 
	} 
           
          /* read data bytes */ 
         
          len = ilen ; 
          count = 0 ; 
          while ( len-- ) 
             { 
 
               cch = getc2 () ; 
 
               xputc ( iaddr++, cch ) ;     /* put addr/chara in buffer */ 
 
             } 
         return ( 1 ) ;        /* not EOF return */ 
} 
 
 
/*************************************************************************** 
 
 
  Function :     get_trec 
 
 
  Purpose  :     Get a TEKTRONIX-extended  record 
 
  Entry    : 
 
  Returns  :     TRUE -  
 
                 FALSE- 
 
 
  Record Format :     %lltCCkx...x<Hex data pairs> 
 
                       ll = length ( all charas after % ) 
                       t  = type chara ( 6 = data , 8 = end ) 
                       CC = checksum  
                       k  = # of address charas, max 8 ( = 4 bytes ) 
                       x...x = 'k' address charas 
         
                       .... data as usual 
  
 
****************************************************************************/ 
 
int  get_trec ()        /* gets a TEKTRONIX-extended record                  */ 
 
                        /* returns FALSE if error & xerrno = error    */ 
 
 
{ 
  int type , cch , count ,  len , nchars ; 
 
 
      get_rstart ( '%' ) ;        /* search for record start */ 
  
      count = 0 ; 
       
      nchars = getc2 ()   ;           /* get length */ 
 
     if ( (type = Ichar ()) == -1 )                  /* MS nibble   */ 
      { 
         fprintf ( stderr , "\Ichar fail" ) ; 
         exit (3) ; 
      } 
 
      if ( type == '8' ) 
          return ( 0 ) ;                 /* end record */ 
      if ( type != '6' ) 
        { 
          fprintf (stderr , "\nBad type ( %d ) " , type ) ; 
          exit (3) ; 
        } 
        
       getc2 () ;                   /* discard 2 checksum charas */ 
 
 
     if ( (len = Ichar ()) == -1 )                  /* MS nibble   */ 
      { 
         fprintf ( stderr , "\Ichar fail" ) ; 
         exit (3) ; 
      } 
       len -=  '0'     ;   /* get addr len  */ 
       nchars = nchars - len - 6 ;  /* adjust for data len */ 
 
       iaddr = 0 ; 
       while ( len-- )              /* build addr */ 
        { 
          if ( (cch = Ichar ()) == -1 )                  /* MS nibble   */ 
            { 
              fprintf ( stderr , "\Ichar fail" ) ; 
              exit (3) ; 
            } 
           cch -= '0' ; 
           iaddr = iaddr*16 + cch ; 
        } 
 
         
           
        /* read data bytes */ 
         
        ilen = nchars / 2 ;    /* set up ext # of bytes */ 
        len = ilen ; 
 
          while ( len-- ) 
             { 
               cch = getc2 () ; 
 
               xputc ( iaddr++, cch ) ;     /* put addr/chara in buffer */ 
 
             } 
         return ( 1 ) ;        /* not EOF return */ 
} 
 
/*************************************************************************** 
 
 
  Function :     get_Qrec 
 
 
  Purpose  :     Get a QTAM record 
 
  Entry    : 
 
  Returns  :     TRUE -  
 
                 FALSE- 
 
 
****************************************************************************/ 
 
int  get_Qrec () 
 
 
 
{ 
  int cch , len  ; 
 
 
 
   get_rstart ( 'Q' ) ;        /* search for record start */ 
  
   len = Ichar () ;                     /* length */ 
   if ( !len )  
      return ( 0 ) ;                    /* EOF */ 
 
   yaddr = Ichar () ;                    /*  3 addr bytes */ 
   yaddr = (yaddr << 8 ) | Ichar () ; 
   yaddr = (yaddr << 8 ) | Ichar () ; 
           
   /* read data bytes */ 
         
 
          while ( len-- ) 
             { 
               cch = Ichar () ; 
               xputc ( yaddr++, cch ) ;     /* put addr/chara in buffer */ 
 
             } 
 
         Ichar () ;           /* discard c/sum chara */ 
 
         return ( 1 ) ;        /* not EOF return */ 
 
 
} 
