;; ****************************************************************************
;; 7Seg LED module for pic12/16 Pseudo Operating System
;; ****************************************************************************

	LIST	P=PIC16F88
	INCLUDE	"P16F88.INC"
	INCLUDE	"MACRO.INC"

; *** Define constant ***
#DEFINE	CATHODE_COMMON				;Define if use cathode common
#DEFINE	ANODE_COMMON				;Define if use anode common
	IFNDEF	SEG7_PORT			; _____________
#DEFINE		SEG7_PORT			;|     ___   a |
#DEFINE		SEG7A		PORTB,D'0'	;|   < ___ >   |
#DEFINE		SEG7B		PORTB,D'1'	;|  ^       ^  |
#DEFINE		SEG7C		PORTB,D'2'	;| | |     | |b|
#DEFINE		SEG7D		PORTB,D'3'	;|f| |   g | | |
#DEFINE		SEG7E		PORTB,D'4'	;|  v  ___  v  |
#DEFINE		SEG7F		PORTB,D'5'	;|   < ___ >   |
#DEFINE		SEG7G		PORTB,D'6'	;|  ^       ^  |
#DEFINE		SEG7DP		PORTB,D'7'	;| | |     | |c|
	ENDIF					;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

; *** Request register/routine ***
	EXTERN	ARGUMENT0

; *** Provide register/routine ***
	IFDEF	CATHODE_COMMON
	GLOBAL	SEG7CATHODE			;Output 7Seg LED Cathode common
	ENDIF
	IFDEF	ANODE_COMMON
	GLOBAL	SEG7ANODE			;Output 7Seg LED Anode common
	ENDIF

; *** Program area ***
	CODE

; *** Cathode Common ***
	IFDEF	CATHODE_COMMON
SEG7CATHODE
	MOVLW	HIGH(CATHODE)			; Cathode Common
	MOVWF	PCLATH				; | a | b | c | d | e | f | g | dp
	MOVF	ARGUMENT0,W			;_|_ _|_ _|_ _|_ _|_ _|_ _|_ _|_
	ANDLW	H'0F'				;\ / \ / \ / \ / \ / \ / \ / \ /
	ADDLW	LOW(CATHODE)			;_V_ _V_ _V_ _V_ _V_ _V_ _V_ _V_
	BTFSC	STATUS,C			; |   |   |   |   |   |   |   |
	INCF	PCLATH,F			; |___|___|___|___|___|___|___|
	MOVWF	PCL				;                             | com
CATHODE
	GOTO	CATHODE_1			; _____________
	GOTO	CATHODE_2			;|     ___   a |
	GOTO	CATHODE_3			;|   < ___ >   |
	GOTO	CATHODE_4			;|  ^       ^  |
	GOTO	CATHODE_5			;| | |     | |b|
	GOTO	CATHODE_6			;|f| |   g | | |
	GOTO	CATHODE_7			;|  v  ___  v  |
	GOTO	CATHODE_8			;|   < ___ >   |
	GOTO	CATHODE_9			;|  ^       ^  |
	GOTO	CATHODE_A			;| | |     | |c|
	GOTO	CATHODE_B			;|e| |   d | | |
	GOTO	CATHODE_C			;|  v  ___  v  |
	GOTO	CATHODE_D			;|   < ___ >   |
	GOTO	CATHODE_E			;|_____________|
	GOTO	CATHODE_F

CATHODE_0
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^       ^  |
	BSF	SEG7D				;| | |     | |b|
	BSF	SEG7E				;|f| |     | | |
	BSF	SEG7F				;|  v       v  |
	BCF	SEG7G				;|             |
	BCF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

CATHODE_1
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|             |
	BSF	SEG7B				;|             |
	BSF	SEG7C				;|          ^  |
	BCF	SEG7D				;|         | |b|
	BCF	SEG7E				;|         | | |
	BCF	SEG7F				;|          v  |
	BCF	SEG7G				;|             |
	BCF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|         | | |
						;|          v  |
						;|             |
						;|_____________|

CATHODE_2
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___  a  |
	BSF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|          ^  |
	BSF	SEG7D				;|         | |b|
	BSF	SEG7E				;|       g | | |
	BCF	SEG7F				;|     ___  v  |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|  ^          |
	BACK					;| | |         |
						;|e| |   d     |
						;|  v  ___     |
						;|   < ___ >   |
						;|_____________|

CATHODE_3
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|          ^  |
	BSF	SEG7D				;|         | |b|
	BCF	SEG7E				;|       g | | |
	BCF	SEG7F				;|     ___  v  |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|       d | | |
						;|     ___  v  |
						;|   < ___ >   |
						;|_____________|

CATHODE_4
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|             |
	BSF	SEG7B				;|             |
	BSF	SEG7C				;|  ^       ^  |
	BCF	SEG7D				;| | |     | |b|
	BCF	SEG7E				;|f| |   g | | |
	BSF	SEG7F				;|  v  ___  v  |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|         | | |
						;|          v  |
						;|             |
						;|_____________|

CATHODE_5
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^          |
	BSF	SEG7D				;| | |         |
	BCF	SEG7E				;|f| |   g     |
	BSF	SEG7F				;|  v  ___     |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|       d | | |
						;|     ___  v  |
						;|   < ___ >   |
						;|_____________|

CATHODE_6
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^          |
	BSF	SEG7D				;| | |         |
	BSF	SEG7E				;|f| |   g     |
	BSF	SEG7F				;|  v  ___     |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

CATHODE_7
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^       ^  |
	BCF	SEG7D				;| | |     | |b|
	BCF	SEG7E				;|f| |     | | |
	BSF	SEG7F				;|  v       v  |
	BCF	SEG7G				;|             |
	BCF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|         | | |
						;|          v  |
						;|             |
						;|_____________|

CATHODE_8
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^       ^  |
	BSF	SEG7D				;| | |     | |b|
	BSF	SEG7E				;|f| |   g | | |
	BSF	SEG7F				;|  v  ___  v  |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

CATHODE_9
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^       ^  |
	BSF	SEG7D				;| | |     | |b|
	BCF	SEG7E				;|f| |   g | | |
	BSF	SEG7F				;|  v  ___  v  |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|       d | | |
						;|     ___  v  |
						;|   < ___ >   |
						;|_____________|

CATHODE_A
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^       ^  |
	BCF	SEG7D				;| | |     | |b|
	BSF	SEG7E				;|f| |   g | | |
	BSF	SEG7F				;|  v  ___  v  |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |     | | |
						;|  v       v  |
						;|             |
						;|_____________|

CATHODE_B
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|             |
	BCF	SEG7B				;|             |
	BSF	SEG7C				;|  ^          |
	BSF	SEG7D				;| | |         |
	BSF	SEG7E				;|f| |   g     |
	BSF	SEG7F				;|  v  ___     |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

CATHODE_C
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^          |
	BSF	SEG7D				;| | |         |
	BSF	SEG7E				;|f| |         |
	BSF	SEG7F				;|  v          |
	BCF	SEG7G				;|             |
	BCF	SEG7DP				;|  ^          |
	BACK					;| | |         |
						;|e| |   d     |
						;|  v  ___     |
						;|   < ___ >   |
						;|_____________|

CATHODE_D
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|             |
	BSF	SEG7B				;|             |
	BSF	SEG7C				;|          ^  |
	BSF	SEG7D				;|         | |b|
	BSF	SEG7E				;|       g | | |
	BCF	SEG7F				;|     ___  v  |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

CATHODE_E
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^          |
	BSF	SEG7D				;| | |         |
	BSF	SEG7E				;|f| |   g     |
	BSF	SEG7F				;|  v  ___     |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|  ^          |
	BACK					;| | |         |
						;|e| |   d     |
						;|  v  ___     |
						;|   < ___ >   |
						;|_____________|

CATHODE_F
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^          |
	BCF	SEG7D				;| | |         |
	BSF	SEG7E				;|f| |   g     |
	BSF	SEG7F				;|  v  ___     |
	BSF	SEG7G				;|   < ___ >   |
	BCF	SEG7DP				;|  ^          |
	BACK					;| | |         |
						;|e| |         |
						;|  v          |
						;|             |
						;|_____________|

	ENDIF					;END of Cathode Common

; *** Anode Common ***
	IFDEF	ANODE_COMMON
SEG7ANODE
	MOVLW	HIGH(ANODE)			; Anode Common com
	MOVWF	PCLATH				;  _____________|_____________
	MOVF	ARGUMENT0,W			; |   |   |   |   |   |   |   |
	ANDLW	H'0F'				;_|_ _|_ _|_ _|_ _|_ _|_ _|_ _|_
	ADDLW	LOW(ANODE)			;\ / \ / \ / \ / \ / \ / \ / \ /
	BTFSC	STATUS,C			;_V_ _V_ _V_ _V_ _V_ _V_ _V_ _V_
	INCF	PCLATH,F			; |   |   |   |   |   |   |   | 
	MOVWF	PCL				; | a | b | c | d | d | f | g | dp
ANODE
	GOTO	ANODE_1				; _____________
	GOTO	ANODE_2				;|     ___   a |
	GOTO	ANODE_3				;|   < ___ >   |
	GOTO	ANODE_4				;|  ^       ^  |
	GOTO	ANODE_5				;| | |     | |b|
	GOTO	ANODE_6				;|f| |   g | | |
	GOTO	ANODE_7				;|  v  ___  v  |
	GOTO	ANODE_8				;|   < ___ >   |
	GOTO	ANODE_9				;|  ^       ^  |
	GOTO	ANODE_A				;| | |     | |c|
	GOTO	ANODE_B				;|e| |   d | | |
	GOTO	ANODE_C				;|  v  ___  v  |
	GOTO	ANODE_D				;|   < ___ >   |
	GOTO	ANODE_E				;|_____________|
	GOTO	ANODE_F

ANODE_0
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^       ^  |
	BCF	SEG7D				;| | |     | |b|
	BCF	SEG7E				;|f| |     | | |
	BCF	SEG7F				;|  v       v  |
	BSF	SEG7G				;|             |
	BSF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

ANODE_1
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|             |
	BCF	SEG7B				;|             |
	BCF	SEG7C				;|          ^  |
	BSF	SEG7D				;|         | |b|
	BSF	SEG7E				;|         | | |
	BSF	SEG7F				;|          v  |
	BSF	SEG7G				;|             |
	BSF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|         | | |
						;|          v  |
						;|             |
						;|_____________|

ANODE_2
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___  a  |
	BCF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|          ^  |
	BCF	SEG7D				;|         | |b|
	BCF	SEG7E				;|       g | | |
	BSF	SEG7F				;|     ___  v  |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|  ^          |
	BACK					;| | |         |
						;|e| |   d     |
						;|  v  ___     |
						;|   < ___ >   |
						;|_____________|

ANODE_3
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|          ^  |
	BCF	SEG7D				;|         | |b|
	BSF	SEG7E				;|       g | | |
	BSF	SEG7F				;|     ___  v  |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|       d | | |
						;|     ___  v  |
						;|   < ___ >   |
						;|_____________|

ANODE_4
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|             |
	BCF	SEG7B				;|             |
	BCF	SEG7C				;|  ^       ^  |
	BSF	SEG7D				;| | |     | |b|
	BSF	SEG7E				;|f| |   g | | |
	BCF	SEG7F				;|  v  ___  v  |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|         | | |
						;|          v  |
						;|             |
						;|_____________|

ANODE_5
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^          |
	BCF	SEG7D				;| | |         |
	BSF	SEG7E				;|f| |   g     |
	BCF	SEG7F				;|  v  ___     |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|       d | | |
						;|     ___  v  |
						;|   < ___ >   |
						;|_____________|

ANODE_6
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^          |
	BCF	SEG7D				;| | |         |
	BCF	SEG7E				;|f| |   g     |
	BCF	SEG7F				;|  v  ___     |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

ANODE_7
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^       ^  |
	BSF	SEG7D				;| | |     | |b|
	BSF	SEG7E				;|f| |     | | |
	BCF	SEG7F				;|  v       v  |
	BSF	SEG7G				;|             |
	BSF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|         | | |
						;|          v  |
						;|             |
						;|_____________|

ANODE_8
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^       ^  |
	BCF	SEG7D				;| | |     | |b|
	BCF	SEG7E				;|f| |   g | | |
	BCF	SEG7F				;|  v  ___  v  |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

ANODE_9
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^       ^  |
	BCF	SEG7D				;| | |     | |b|
	BSF	SEG7E				;|f| |   g | | |
	BCF	SEG7F				;|  v  ___  v  |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|          ^  |
	BACK					;|         | |c|
						;|       d | | |
						;|     ___  v  |
						;|   < ___ >   |
						;|_____________|

ANODE_A
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BCF	SEG7B				;|   < ___ >   |
	BCF	SEG7C				;|  ^       ^  |
	BSF	SEG7D				;| | |     | |b|
	BCF	SEG7E				;|f| |   g | | |
	BCF	SEG7F				;|  v  ___  v  |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |     | | |
						;|  v       v  |
						;|             |
						;|_____________|

ANODE_B
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|             |
	BSF	SEG7B				;|             |
	BCF	SEG7C				;|  ^          |
	BCF	SEG7D				;| | |         |
	BCF	SEG7E				;|f| |   g     |
	BCF	SEG7F				;|  v  ___     |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|

ANODE_C
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^          |
	BCF	SEG7D				;| | |         |
	BCF	SEG7E				;|f| |         |
	BCF	SEG7F				;|  v          |
	BSF	SEG7G				;|             |
	BSF	SEG7DP				;|  ^          |
	BACK					;| | |         |
						;|e| |   d     |
						;|  v  ___     |
						;|   < ___ >   |
						;|_____________|


ANODE_D
	BANKSEL(PORTA)				; _____________
	BSF	SEG7A				;|             |
	BCF	SEG7B				;|             |
	BCF	SEG7C				;|          ^  |
	BCF	SEG7D				;|         | |b|
	BCF	SEG7E				;|       g | | |
	BSF	SEG7F				;|     ___  v  |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|  ^       ^  |
	BACK					;| | |     | |c|
						;|e| |   d | | |
						;|  v  ___  v  |
						;|   < ___ >   |
						;|_____________|


ANODE_E
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^          |
	BCF	SEG7D				;| | |         |
	BCF	SEG7E				;|f| |   g     |
	BCF	SEG7F				;|  v  ___     |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|  ^          |
	BACK					;| | |         |
						;|e| |   d     |
						;|  v  ___     |
						;|   < ___ >   |
						;|_____________|


ANODE_F
	BANKSEL(PORTA)				; _____________
	BCF	SEG7A				;|     ___   a |
	BSF	SEG7B				;|   < ___ >   |
	BSF	SEG7C				;|  ^          |
	BSF	SEG7D				;| | |         |
	BCF	SEG7E				;|f| |   g     |
	BCF	SEG7F				;|  v  ___     |
	BCF	SEG7G				;|   < ___ >   |
	BSF	SEG7DP				;|  ^          |
	BACK					;| | |         |
						;|e| |         |
						;|  v          |
						;|             |
						;|_____________|

	ENDIF					;END of Anode Common

	END

;; ****************************************************************************
;;
;;  Copyright (c) Hitoshi Gomi
;;  All rights reserved.
;;
;;  Redistribution and use in source and binary forms, with or without
;;  modification, are permitted provided that the following conditions are met:
;;
;;  1.Redistributions of source code must retain the above copyright notice,
;;    this list of conditions and the following disclaimer.
;;  2.Redistributions in binary form must reproduce the above copyright notice,
;;    this list of conditions and the following disclaimer in the documentation
;;    and/or other materials provided with the distribution.
;;  3.The names of the author may not be used to endorse or promote products
;;    derived from this software without specific prior written permission.
;;
;;  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
;;  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
;;  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
;;  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
;;  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
;;  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
;;  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
;;  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
;;  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
;;  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
;;  POSSIBILITY OF SUCH DAMAGE.
;;
;; ****************************************************************************