/*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 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 */ }