home *** CD-ROM | disk | FTP | other *** search
- /*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 */
-
-
- }
-