this site has an app in which you enter the time to wait, and the freq of the oscillator
it will generate asm code that you can paste in your program and you can call it at will
the 16F84A is obselete, try the 16F628A it's better and almost half the price (2.5$)
The way it is generally done is with a timer as follows:
If you are working with a 4MHz clock, and have 4 clocks per instruction cycle, your timer will update every 1us. If your counter overflows after 256 counts, you preload a value as an offset then look for the counter to overflow.
If you want to measure 100us, load in a value of 156 into the counter, so you have 100 counts left (before it overflows). 100 counts is 100us.
If you need a longer time, use the prescaler. A prescaler of 8 means your counter increments every 8us, so in the case above you overflow after 800us.
You can then either look to see when your counter is zero (it has overflowed), or set an interrupt to be generated on overflow and detect the overflow that way.
If you want really slow timing, either call the loop many times, or use a slower clock (like a 32kHz crystal)