Hum, es müsste rein theoretisch auch einfacher gehen. Meine erste Idee wäre ein lookup-table und ein computed goto gewesen, wobei das aber um einiges leichter ins Auge gehen kann.
Die Grundidee ist relativ einfach, du hast eine Variable, die multipilizerst du mit 2 (einfaches shiften nach links) und addierst den neuen Wert zu dem PCL hinzu. Die Tabelle schaut dann aus 2er Blöcken, einem bsf und einem return/retlw commando.

Code:
Compute:
	rlf	Temp
	movfw	Temp
	addwf	PCL,f
Table
	bsf	POTRB,0
	return
	bsf	PORTB,1
	return
	bsf	PORTB,2
	return
	bsf	PORTB,3
	return
	bsf	PORTB,4
	return
	bsf	PORTB,5
	return
	bsf	PORTB,6
	return
	bsf	PORTB,7
	return
	...
Hab den Code grad durch den Simulator rennen lassen, funktioniert gut, ABER nur wenn der PCL keinen overflow verursacht. Sollte dies der Fall sein, so muss auch PCLATH in Betracht gezogen werden (welches die high-bits des Programm-Counters beinhaltet).
MfG
Mobius