Hola Antonio, muchas gracias.
A ver, intento contestar a tu pregunta, aunque ya sabes que el ASM y yo no somos muy amigos.
Al desensamblar el DelayUs sale esto:
001D9C cp0.w [0x001c]
001D9E bra z, 0x001dd8
... aquí todos los NOP ...
001DD4 dec.w [0x001c],[0x001c]
001DD6 bra 0x001d9c
Segun la data, las instrucciones cp0 y dec ocupan un ciclo cada una, mientras que las instrucciones bra ocupan dos.
Por tanto, la duración de cada bucle sería de 1+2+26+1+2=32 ciclos.
Si el micro estuviera trabajando a 32MIPS, esos 32 ciclos serían un microsegundo.
De todas formas, en el ejemplo del Display Nokia, tenía un 30F4011 con oscilador interno ajustado a su máxima velocidad (tienen cierta tolerancia) y corría a 31,446MIPS, por lo que ese DelayUs duraba un pelín menos de 1 microsegundo, aunque en esta aplicación no era en absoluto algo crítico.
Aunque en C30 no es obligatorio para su compilación, en aplicaciones que dependen de la velocidad del micro, siempre defino la variable MIPS, y comprobarás como en esta librería está definida como:
#define MIPS 31446