; 30-DEC-2000   Eric Smith
; changed for GPASM assembler

;6-JAN-2000	Richard Ottosen
 
;This routine is for the SX parts in Turbo mode only. It does not matter if the
; Carry fuse is set or clear.
;
;Macro to delay for M number of cycles from 0 through 65535.
;  The macro includes paging for long calls.
;
;Uses the routine "DelW" to do the short delays and uses the variable "DelMCnt"
;  as well for long delays.
;The constants 5 and 15 must be loaded into variables "Five" and "Fifteen"
; before DelM is used.
;
;
DelM	MACRO	_MM
	IF	LOW(_MM) ==0	;No delay at all
	ENDIF
	IF	LOW(_MM) ==1
	  NOP			;Delay 1 cycle inline
	ENDIF
	IF	LOW(_MM) ==2
	  NOP			;Delay 2 cycles inline
	  NOP
	ENDIF
	IF	LOW(_MM) ==3
	  GOTO	$+1		;Delay 3 cycles inline
	ENDIF
	IF	LOW(_MM) ==4
	  GOTO	$+1		;Delay 4 cycles inline
	  NOP
	ENDIF
	IF	LOW(_MM) ==5
	  GOTO	$+1		;Delay 5 cycles inline
	  NOP
	  NOP
	ENDIF
	IF	LOW(_MM) ==6
	  GOTO	$+1		;Delay 6 cycles inline
	  GOTO	$+1
	ENDIF
	IF	LOW(_MM) ==7
	  ERRORLEVEL	-306
	  PAGE	Delay6
	  CALL	Delay6		;Delay 7 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==8
	  ERRORLEVEL	-306
	  PAGE	Delay7
	  CALL	Delay7		;Delay 8 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==9
	  ERRORLEVEL	-306
	  PAGE	Delay8
	  CALL	Delay8		;Delay 9 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==10
	  ERRORLEVEL	-306
	  PAGE	Delay9
	  CALL	Delay9		;Delay 10 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==11
	  ERRORLEVEL	-306
	  PAGE	Delay10
	  CALL	Delay10		;Delay 11 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==12
	  ERRORLEVEL	-306
	  PAGE	Delay11
	  CALL	Delay11		;Delay 12 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==13
	  ERRORLEVEL	-306
	  PAGE	Delay12
	  CALL	Delay12		;Delay 13 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==14
	  ERRORLEVEL	-306
	  PAGE	Delay13
	  CALL	Delay13		;Delay 14 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==15
	  ERRORLEVEL	-306
	  PAGE	Delay14
	  CALL	Delay14		;Delay 15 cycles
	  ERRORLEVEL	+306
	ENDIF
	IF	LOW(_MM) ==16
	  ERRORLEVEL	-306
	  PAGE	Delay15
	  CALL	Delay15		;Delay 16 cycles
	  ERRORLEVEL	+306
	ENDIF
 
	IF	LOW(_MM) >16
	  MOVLW	LOW(_MM-1)
	  ERRORLEVEL	-306
	  PAGE	DelW
	  CALL	DelW		;Delay for 17 thru 255 cycles
	  ERRORLEVEL	+306
	ENDIF
 
 
	IF	HIGH(_MM) !=0
	  LOCAL	_DelMLoop
	  MOVLW	HIGH(_MM)	;Delay more for greater than 255 cycles
	  MOVWF	DelMCnt
_DelMLoop	  MOVLW	251
	  ERRORLEVEL	-306
	  PAGE	DelW
	  CALL	DelW
	  ERRORLEVEL	+306
	  DECFSZ	DelMCnt
	  GOTO	_DelMLoop
	ENDIF
 
	ENDM
 
; Eric Smith  7/8/96	Hacked by Richard Ottosen 8/8/99
 
;-----------------------------------------------------------------------------
;This version of DelW is for the Scenix parts in Turbo mode. It does not matter
;if the Carry fuse is set or clear.
; DelW delays W cycles, including call, return, and one cycle for the
; MOVLW instruction to set up the count in W
; range is 16..255
;
; For example, the sequence:
;   MOVLW 17
;   CALL  DelW
; will take 17 cycles to execute
;-----------------------------------------------------------------------------
 
; W value on entry:		   16   17   18   19   20     21     22     23
; Caller's instructions:          ---  ---  ---  ---  ---  -----  -----  -----
;   MOVLW n			   0    0    0    0    0    0      0      0
;   CALL  DelW			   1    1    1    1    1    1      1      1
 
DelW	BSF	status,cf	;  4    4    4    4    4    4      4      4
	SUBWF	Fifteen,W	;  5    5    5    5    5    5      5      5
_DelWLp	ADDWF	Five,W		;  6    6    6    6    6    6 11   7 11   7 11
	BTFSS	status,cf	;  7    7    7    7    7    7 12     12     12
	GOTO	_DelWLp         ;                           8      8      8
	BCF	status,cf	;  9    9    9    9    9      14     14     14
	ADDWF	pcl		; 10   10   10   10   10      15     15     15
Delay10	NOP			;                     13
Delay9	NOP			;                13   14                    
Delay8	NOP			;           13   14   15             	    18
Delay7	NOP			;      13   14   15   16             18     19
Delay6	RETP			; 13   14   15   16   17      18     19     20
				; 16   17   18   19   20      21     22     23
 
Delay15	NOP
Delay14	NOP
Delay13	NOP
Delay12	NOP
Delay11	GOTO	Delay8

Interested: