/* readhex.c
L. Stewart April 8, 1982 1:56 PM
*/
extern int ssenable();
extern ssreturn();
extern wf();
extern debug();
extern getchar();
extern storeb();
extern isdigit();
extern uc();
int recadr, reclen, rectype, recchk; /* record fields */
int bframe; /* incoming data address */
int stframe, stbyte; /* contents of start record */
int rherr[3];
#define SYNTAX 1
#define CHKSUM 2
#define DONE 3
#define DEL 4
loadhex()
{
int retval;
retval = ssenable(rherr);
if (retval) {
switch (retval) {
case SYNTAX: {
waitfordel();
wf("\rsyntax error\r");
break;
};
case CHKSUM: {
waitfordel();
wf("\rchecksum error\r");
break;
};
case DONE: break;
case DEL: {
wf("\raborted\r");
break;
};
default: {
debug("bad smallsig code");
break;
};
};
return;
};
for (;;) getrec();
};
waitfordel()
{
wf("\r Type DEL to continue.\r");
while((getchar() & 0177) != 0177);
};
getrec()
{ /* read a record */
recchk = 0;
getcolon();
reclen = getbyte();
recadr = getword();
rectype = getbyte();
switch (rectype) {
case 0: { getdata(); break; };
case 1: { getend(); break; };
case 2: { getadr(); break; };
case 3: { getstart(); break; };
default: { rherr("unknown record type"); break; };
};
};
getend()
{
rl(0);
cksum();
/* done with input */
locerr(DONE);
};
getstart()
{
rl(4);
stframe = getword();
stbyte = getword();
cksum();
};
getadr()
{
rl(2);
bframe = getword();
cksum();
};
getdata()
{
int i, bbyteadr, bvalue;
bbyteadr = recadr;
bbyteadr += (bframe << 4);
for (i=0;i<reclen; i+=1) {
bvalue = getbyte();
storeb(bvalue, bbyteadr);
bbyteadr += 1;
};
cksum();
};
rl(el)
int el;
{
if ((reclen != el) || (recadr != 0)) locerr(SYNTAX);
};
int getword()
{
int v;
v = getbyte() << 8;
v += getbyte();
return (v);
};
int getbyte()
{
int v;
v = gethexchar() << 4;
v += gethexchar();
recchk += v;
return (v);
};
cksum()
{
getbyte();
if ((recchk & 0xff) != 0) locerr(CHKSUM);
if (getdelchar() != '\r') locerr(SYNTAX);
};
int gethexchar()
{
char c;
int v;
c = getdelchar();
if (isdigit(c)) {
v = (c - '0') & 0xff;
return (v);
};
c = uc(c);
if (c >= 'A' && c <='F') {
v = (c - 'A' + 10) & 0xff;
return (v);
};
locerr(SYNTAX);
};
getcolon()
{
char c;
c = getdelchar();
if (c != ':') locerr(SYNTAX);
};
char getdelchar()
{
char c;
c = getchar() & 0177;
if (c == 0177) locerr(DEL);
return(c);
};
locerr(arg)
int arg;
{
ssreturn(rherr, arg);
};