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 >
Wrap
C/C++ Source or Header
|
1990-04-16
|
11KB
|
447 lines
/*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 */
}