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(); }
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; }