уточню на примерах
1 ... int far *ptr=(int far *) (((unsigned long)VALSEG<<16) | (unsigned)(off)); *ptr++=value1; *ptr++=value2; ... value3=*ptr;
2 static void _ideReadWord(unsigned far *adr) { unsigned i; for(i=0;i<256;i++) { *adr++ =io_space_read(IDE_DATAREG); } }
3 inline void SetEntryVal(bool bFat32,unsigned far *buf,unsigned thisoff,unsigned long *pval) { if(!bFat32) { *((WORD *)(buf+thisoff))=*((WORD *)pval+1); } else { unsigned far *ptr=buf+thisoff*2; *ptr++=*(((WORD *)pval+1)); *ptr= (*ptr & 0xF000) | (*(((WORD *)pval)) & 0x0FFF); } }
Если вы помните, тоже самое применялось и в x86 в DOS small модели, все указатели по умолчанию до 64к, а для дпинных успользовалось far для задания другого сегмента. Для этого DSP это более чем оправдано, т.к. быстрые DSP алгоритмы живут во внутренней памяти и использование смещения при адресации лишь приведет к потери быстродействияю. В ранних версиях VDSP такое обращение возможно было только через специальные функции external_memory_read и external_memory_write. Использование far - чистый Си наглядный и переносимый код
|