int DECL2 davePutProgramBlock(daveConnection * dc, int blockType, int blknumber, char* buffer, int * length) {
#define maxPBlockLen 0xDe // real maximum 222 bytes
int res=0;
int cnt=0;
int size=0;
int blockNumber,rawLen,netLen,blockCont;
int number=0;
uc pup[]= { // Load request
0x1A,0,1,0,0,0,0,0,9,
0x5F,0x30,0x42,0x30,0x30,0x30,0x30,0x34,0x50, // block type code and number
// _ 0 B 0 0 0 0 4 P
// SDB
0x0D,
0x31,0x30,0x30,0x30,0x32,0x30,0x38,0x30,0x30,0x30,0x31,0x31,0x30,0 // file length and netto length
// 1 0 0 0 2 0 8 0 0 0 1 1 0
};
PDU p,p2;
uc pablock[]= { // parameters for parts of a block
0x1B,0
};
uc progBlock[maxPBlockLen + 4]= {
0,maxPBlockLen,0,0xFB, // This seems to be a fix prefix for program blocks
};
pup[11] = blockType;
paInsert[13] = blockType;
/*pup[12] = number / (10*10*10*10);
pup[13] = (number - (pup[12] * 10*10*10*10 )) / (10*10*10);
pup[14] = (number - (pup[13] * 10*10*10)) / (10*10);
pup[15] = (number - (pup[14] * 10*10)) / (10);
pup[16] = (number - (pup[15] * 10));
pup[12] = pup[12] + 0x30;
pup[13] = pup[13] + 0x30;
pup[14] = pup[14] + 0x30;
pup[15] = pup[15] + 0x30;
pup[16] = pup[16] + 0x30;*/
memcpy(progBlock+4,buffer,maxPBlockLen);
progBlock[9] = (blockType + 0x0A - 'A'); //Convert 'A' to 0x0A
if (blockType == '8') progBlock[9] = 0x08;
progBlock[10] = blknumber / 0x100;
progBlock[11] = blknumber - (progBlock[10] * 0x100);
rawLen=daveGetU16from(progBlock+14);
netLen=daveGetU16from(progBlock+38);
sprintf((char*)pup+19,"1%06d%06d",rawLen,netLen);
sprintf((char*)pup+12,"%05d",blknumber);
sprintf((char*)paInsert+14,"%05d",blknumber);
pup[17]='P';
paInsert[19]='P';
p.header=dc->msgOut+dc->PDUstartO;
_daveInitPDUheader(&p, 1);
_daveAddParam(&p, pup, sizeof(pup)-1);
res=_daveExchange(dc, &p);
if (res==daveResOK) {
res=_daveSetupReceivedPDU(dc, &p2);
if (daveGetDebug() & daveDebugPDU) {
_daveDumpPDU(&p2);
}
res=daveGetPDUerror(&p2);
if (res==0) {
blockCont=1;
res=daveGetResponse(dc);
res=_daveSetupReceivedPDU(dc, &p2);
cnt = 0;
do {
res=0;
res=_daveSetupReceivedPDU(dc, &p2);
number=((PDUHeader*)p2.header)->number;
if (p2.param[0]==0x1B) {
//READFILE
memcpy(progBlock+4,buffer+(cnt*maxPBlockLen),maxPBlockLen);
if (cnt == 0)
{
progBlock[9] = (blockType + 0x0A - 'A'); //Convert 'A' to 0x0A
if (blockType == '8') progBlock[9] = 0x08;
progBlock[10] = blknumber / 0x100;
progBlock[11] = blknumber - (progBlock[10] * 0x100);
}
p.header=dc->msgOut+dc->PDUstartO;
_daveInitPDUheader(&p, 3);
size = maxPBlockLen;
if (*length > ((cnt+1) * maxPBlockLen))
pablock[1]=1;
else
{
size = *length - (cnt * maxPBlockLen);
pablock[1]=0; //last block
blockCont=0;
}
progBlock[1]=size;
_daveAddParam(&p, pablock, sizeof(pablock));
_daveAddData(&p, progBlock, size + 4 /* size of block) */);
((PDUHeader*)p.header)->number=number;
if (daveGetDebug() & daveDebugPDU) {
_daveDumpPDU(&p);
}
_daveExchange(dc,&p);
}
cnt++;
} while (blockCont);
res=_daveSetupReceivedPDU(dc, &p2);
if (daveGetDebug() & daveDebugPDU) {
_daveDumpPDU(&p2);
}
number=((PDUHeader*)p2.header)->number;
if (p2.param[0]==0x1C) {
p.header=dc->msgOut+dc->PDUstartO;
_daveInitPDUheader(&p, 3);
_daveAddParam(&p, p2.param,1);
((PDUHeader*)p.header)->number=number;
_daveExchange(dc,&p);
p.header=dc->msgOut+dc->PDUstartO;
_daveInitPDUheader(&p, 1);
_daveAddParam(&p, paInsert, sizeof(paInsert));
res=_daveExchange(dc, &p);
res=_daveSetupReceivedPDU(dc, &p2);
res=daveGetPDUerror(&p2);
}
} else {
printf("CPU doesn't accept load request:%04X\n",res);
}
return res;
}
return res;
}