Esempio n. 1
0
void
simfac(void)
{
	int h;
	save();
	p1 = pop();
	if (car(p1) == symbol(ADD)) {
		h = tos;
		p1 = cdr(p1);
		while (p1 != symbol(NIL)) {
			push(car(p1));
			simfac_term();
			p1 = cdr(p1);
		}
		addk(tos - h);
		p1 = pop();
		if (find(p1, symbol(FACTORIAL))) {
			push(p1);
			if (car(p1) == symbol(ADD)) {
				Condense();
				simfac_term();
			}
		}
	} else {
		push(p1);
		simfac_term();
	}
	restore();
}
Esempio n. 2
0
bool BlazeUpdate(int Index)
{
    struct CAddressRange addr_round;//(Chip_Info.MaxErasableSegmentInByte);

//    if(strstr(Chip_Info.Class,SUPPORT_ATMEL_45DBxxxD) != NULL)
//        SetPageSize(&Chip_Info,Index);

    // dealwith lock phase 1
    struct CAddressRange down_with_lock_range;//(m_context.runtime.range_download);
    down_with_lock_range.start=DownloadAddrRange.start;
    down_with_lock_range.end=DownloadAddrRange.end;
    DownloadAddrRange.length=DownloadAddrRange.end-DownloadAddrRange.start;
    down_with_lock_range.length=down_with_lock_range.end-down_with_lock_range.start;

    struct CAddressRange effectiveRange;//(addr_round.SectionRound(down_with_lock_range));
    effectiveRange.start=down_with_lock_range.start &(~(Chip_Info.MaxErasableSegmentInByte - 1)) ;
    effectiveRange.end=(down_with_lock_range.end + (Chip_Info.MaxErasableSegmentInByte - 1)) & (~(Chip_Info.MaxErasableSegmentInByte - 1));
    effectiveRange.length=effectiveRange.end-effectiveRange.start;

    if(!threadReadRangeChip(effectiveRange,Index)) return false;

    unsigned int offsetOfRealStartAddrOffset = DownloadAddrRange.start - effectiveRange.start;

    unsigned char* vc;
    vc=(unsigned char*)malloc(effectiveRange.length);
    memcpy(vc,pBufferForLastReadData,effectiveRange.length);
    size_t* addrs=(size_t*)malloc(min(DownloadAddrRange.length,g_ulFileSize));
    size_t Leng=0;
    Leng=GenerateDiff(addrs,vc+offsetOfRealStartAddrOffset,DownloadAddrRange.length,pBufferforLoadedFile,g_ulFileSize,DownloadAddrRange.start,Chip_Info.MaxErasableSegmentInByte);

//    printf("Leng=%X\r\n",Leng);
    if(Leng==0)  // speed optimisation
    {
        return true;
    }
    else
    {
        size_t* condensed_addr=(size_t*)malloc(min(DownloadAddrRange.length,g_ulFileSize));
        size_t condensed_size;
        condensed_size=Condense(condensed_addr,vc, addrs, Leng, effectiveRange.start,Chip_Info.MaxErasableSegmentInByte);
//        printf("condensed_size=%d\r\n",condensed_size);
        SerialFlash_batchErase(condensed_addr,condensed_size,Index);

        if(strstr(Chip_Info.Class,SUPPORT_MACRONIX_MX25Lxxx) != NULL)
        {
            TurnOFFVcc(Index);
            Sleep(100);
            TurnONVcc(Index);
        }

        memcpy(vc+offsetOfRealStartAddrOffset,pBufferforLoadedFile,DownloadAddrRange.length);
        size_t i = 0;
        for(i=0; i<Leng; i++)
        {
            size_t idx_in_vc = addrs[i] - effectiveRange.start;
            struct CAddressRange addr_range;
            addr_range.start=addrs[i];
            addr_range.end=addrs[i]+Chip_Info.MaxErasableSegmentInByte;
            addr_range.length=addr_range.end-addr_range.start;

            if(SerialFlash_rangeProgram(&addr_range,vc+idx_in_vc,Index)==0)
            {
                free(vc);
                free(addrs);
                free(condensed_addr);
                return false;
            }
        }
        free(vc);
        free(addrs);
        free(condensed_addr);
        return true;
    }
    free(vc);
    free(addrs);
    return true;
}