int DECL2 davePutProgramBlock(daveConnection * dc, int blockType, int number, 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;
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
};
memcpy(progBlock+4,buffer,maxPBlockLen);
rawLen=daveGetU16from(progBlock+14);
netLen=daveGetU16from(progBlock+38);
pup[17]='P';
paInsert[19]='P';
sprintf((char*)pup+19,"1%06d%06d",rawLen,netLen);
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);
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;
}
//if (res==maxPBlockLen) pablock[1]=1; //more blocks
//else {
// pablock[1]=0; //last block
// blockCont=0;
//}
progBlock[1]=res;
_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);
}
} 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;
}