; filename: concert.asm

; This is a demo for driving an FDS-185 display from Surtronic BV as found in a surplus store (Baco IJmuiden).
; Used in buses for line number/destination display. This display is a 48x80 pixel LED display, organized
; as 16 rows by 240 columns (30 bytes). The columns are driven by 30 TPIC6B595 shift registers, the rows by
; 16 high side MOSFETs. Data is shifted from top left to bottom right, MSB of row 16 in the bottom right corner.

; v0.0	260523	Start project
; v0.1	260524	Add ROWDATA
; v0.2	260525	Brightness Control (LDR)
; v0.3	260528	Better Brite (EN)

	LIST	P=16F1827, F=INHX32
	#include <p16f1827.inc>
	ERRORLEVEL -302			; sod message about using proper bank

	__CONFIG _CONFIG1, _WDTE_OFF & _BOREN_OFF & _CLKOUTEN_ON & _FOSC_INTOSC
	__CONFIG _CONFIG2, _PLLEN_ON

; Equates
RESET_V		EQU	0x00		; Address of RESET Vector

; Registers
FLAGS	EQU	0x70			; Various flags
CTR	EQU	0x71			; General Purpose Counter
INDX	EQU	0x72			; Index for rowdata
BRT	EQU	0x73			; Brightness Control Register
BRT_SET	EQU	0x74			; Set value derived from LDR
BRT_CTR	EQU	0x75			; Counter to prevent display flashing when setting brite


; Defines
#define	STROE	LATB,1			; Strobe for '595
#define	EN	LATA,7			; Output Enable for '595 (active LOW)
#define A0	LATB,3			; Row select A for '238
#define	A1	LATA,3			; Row select B for '238
#define	A2	LATA,2			; Row select C for '238
#define TOP	LATA,4			; Rows 1-8, active LOW ('238)
#define	BOT	LATB,0			; Rows 9-16, active LOW ('238)
#define	TETS	LATA,1			; Test pin for scope trigger
;	SDO1	RB4 not defined
;	SCK1	RB2 not defined

	ORG	0
	GOTO	INIT
	ORG	4

; Interrupts
	RETFIE				; There are no interrupts

INIT
; Init stuff
	CLRF	STATUS			; Do initialization
	CLRF	BSR			; Select Bank 0
	CLRF	INTCON			; Clear int-flags, disable interrupts
	CLRF	PCLATH			; Keep in lower 2KByte
	BANKSEL	TRISA			; Select Bank 1
	CLRF	TRISA			; RA7-0 Outputs
	BSF	TRISA,0			; RA0 Input
	CLRF	TRISB			; RB7-0 Outputs
	MOVLW	B'00000110'		; Timer0, prescaler 1:128
	MOVWF	OPTION_REG
	MOVLW	B'11110000'
	MOVWF	OSCCON			; 32 MHz intosc
	MOVLW	B'00000010'
	MOVWF	WDTCON			; WDT 2 ms, disabled
	MOVLW	B'00000001'
	MOVWF	ADCON0			; AN0, ADC Enabled
	MOVLW	B'00100000'
	MOVWF	ADCON1
	BANKSEL	ANSELA
	MOVLW	B'00000001'
	MOVWF	ANSELA			; RA0 Analog input
	BANKSEL	SSP1STAT		; Select Bank 4
	MOVLW	B'01000000'
	MOVWF	SSP1STAT
	MOVLW	B'00100000'
	MOVWF	SSP1CON1		; SPI Master Mode, 4 MHz clock
	BANKSEL	PORTA			; Select Bank 0
	CLRF	PORTA
	CLRF	PORTB
	CLRF	FLAGS
	MOVLW	0x1D
	MOVWF	BRT_SET			; Preload BRT Set value
	BANKSEL	LATA			; Select Bank 2

MAIN
	BSF	EN			; Blank display
	BSF	TETS
	BCF	TETS			; Scope trigger
	CALL	GETBRT			; Get new BRT set value (LDR)
	MOVLW	0x1E
	MOVWF	CTR
	CLRF	INDX
	MOVFW	INDX
	CALL	ROWDATA1
	CALL	OUTDATA			; OUT Row 1 (000)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BCF	A0
	BCF	A1
	BCF	A2
	BCF	TOP
	BSF	BOT
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA1
	CALL	OUTDATA			; OUT Row 2 (001)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BSF	A0
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA1
	CALL	OUTDATA			; OUT Row 3 (010)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	MOVLW	0x1E
	MOVWF	CTR
	BSF	STROE
	BCF	STROE
	BCF	A0
	BSF	A1
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA1
	CALL	OUTDATA			; OUT Row 4 (011)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BSF	A0
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA1
	CALL	OUTDATA			; OUT Row 5 (100)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BCF	A0
	BCF	A1
	BSF	A2
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA1
	CALL	OUTDATA			; OUT Row 6 (101)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BSF	A0
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA1
	CALL	OUTDATA			; OUT Row 7 (110)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BCF	A0
	BSF	A1
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA1
	CALL	OUTDATA			; OUT Row 8 (111)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BSF	A0
	MOVLW	0x1E
	MOVWF	CTR
	CLRF	INDX			; Second page
	MOVFW	INDX
	CALL	ROWDATA2
	CALL	OUTDATA			; OUT Row 9 (000)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BCF	A0
	BCF	A1
	BCF	A2
	BSF	TOP
	BCF	BOT
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA2
	CALL	OUTDATA			; OUT Row 10 (001)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BSF	A0
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA2
	CALL	OUTDATA			; OUT Row 11 (010)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BCF	A0
	BSF	A1
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA2
	CALL	OUTDATA			; OUT Row 12 (011)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BSF	A0
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA2
	CALL	OUTDATA			; OUT Row 13 (100)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BCF	A0
	BCF	A1
	BSF	A2
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA2
	CALL	OUTDATA			; OUT Row 14 (101)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BSF	A0
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA2
	CALL	OUTDATA			; OUT Row 15 (110)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BCF	A0
	BSF	A1
	MOVLW	0x1E
	MOVWF	CTR
	MOVFW	INDX
	CALL	ROWDATA2
	CALL	OUTDATA			; OUT Row 16 (111)
	DECFSZ	BRT,F
	GOTO	$+2
	BCF	EN
	INCF	INDX,F
	DECFSZ	CTR,F
	GOTO	$-8
	BSF	EN			; Blank display
	MOVFW	BRT_SET
	MOVWF	BRT
	BSF	STROE
	BCF	STROE
	BSF	A0
	GOTO	MAIN

; Subroutines
GETBRT
	DECFSZ	BRT_CTR,F
	RETURN
	MOVLW	0x1D
	MOVWF	BRT_SET			; Preload BRT Set value
	BANKSEL	ADCON0
	BSF	ADCON0,GO
	BTFSC	ADCON0,GO
	GOTO	$-1
	MOVLW	0xCF
	BANKSEL	ADRESH
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x1C
	MOVLW	0xBF
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x1B
	MOVLW	0xAF
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x1A
	MOVLW	0xA7
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x19
	MOVLW	0x9F
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x18
	MOVLW	0x8F
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x17
	MOVLW	0x87
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x16
	MOVLW	0x7F
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x15
	MOVLW	0x77
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x14
	MOVLW	0x6F
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x13
	MOVLW	0x67
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x12
	MOVLW	0x5F
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x11
	MOVLW	0x5B
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x10
	MOVLW	0x57
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x0F
	MOVLW	0x53
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x0E
	MOVLW	0x4F
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x0D
	MOVLW	0x4B
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x0C
	MOVLW	0x47
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x0B
	MOVLW	0x43
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x0A
	MOVLW	0x3F
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x09
	MOVLW	0x3B
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x08
	MOVLW	0x37
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x07
	MOVLW	0x33
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x06
	MOVLW	0x2F
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x05
	MOVLW	0x27
	SUBWF	ADRESH,W
	BTFSC	STATUS,C
	RETURN
	DECF	BRT_SET,F		; Set level 0x04
	RETURN

OUTDATA
	BANKSEL	SSP1BUF			; Select Bank 4
	MOVWF	SSP1BUF
	BANKSEL	PIR1			; Select Bank 0
	BTFSS	PIR1,SSP1IF
	GOTO	$-1
	BCF	PIR1,SSP1IF
	BANKSEL	LATA			; Select Bank 2
	RETURN

ROWDATA1
; 240 bytes called by INDX
; Row 1
	BRW
	RETLW	0x45
	RETLW	0x29
	RETLW	0x31
	RETLW	0x92
	RETLW	0x10
	RETLW	0x00
	RETLW	0x04
	RETLW	0xB5
	RETLW	0xEA
	RETLW	0x9A
	RETLW	0xD0
	RETLW	0x00
	RETLW	0x00
	RETLW	0x3A
	RETLW	0x5D
	RETLW	0x17
	RETLW	0x10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

; Row 2
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x04
	RETLW	0xA5
	RETLW	0x28
	RETLW	0x8A
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x0A
	RETLW	0xC5
	RETLW	0x11
	RETLW	0x10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

; 	Row 3
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x03
	RETLW	0xA5
	RETLW	0x28
	RETLW	0xBA
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x3B
	RETLW	0x4C
	RETLW	0xA3
	RETLW	0x10
	RETLW	0x00
	RETLW	0x03
	RETLW	0x9D
	RETLW	0xD9
	RETLW	0x26
	RETLW	0x60
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

; 	Row 4
	RETLW	0x1F
	RETLW	0x08
	RETLW	0x7C
	RETLW	0x21
	RETLW	0xF0
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x22
	RETLW	0x44
	RETLW	0xA1
	RETLW	0x10
	RETLW	0x00
	RETLW	0x01
	RETLW	0x24
	RETLW	0x45
	RETLW	0x69
	RETLW	0x10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

; 	Row 5
	RETLW	0x24
	RETLW	0x94
	RETLW	0x92
	RETLW	0x52
	RETLW	0x48
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x3A
	RETLW	0x5C
	RETLW	0x47
	RETLW	0x70
	RETLW	0x00
	RETLW	0x01
	RETLW	0x1C
	RETLW	0xC5
	RETLW	0xA9
	RETLW	0x10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

; 	Row 6
	RETLW	0x4A
	RETLW	0x49
	RETLW	0x29
	RETLW	0x24
	RETLW	0xA4
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x97
	RETLW	0x70
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x01
	RETLW	0x24
	RETLW	0x45
	RETLW	0x29
	RETLW	0x10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

; 	Row 7
	RETLW	0x84
	RETLW	0x3E
	RETLW	0x10
	RETLW	0xF8
	RETLW	0x42
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0xB1
	RETLW	0x10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x01
	RETLW	0x25
	RETLW	0xD9
	RETLW	0x26
	RETLW	0x60
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

; 	Row 8
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0xD3
	RETLW	0x30
	RETLW	0x00
	RETLW	0x00
	RETLW	0x39
	RETLW	0x90
	RETLW	0x9C
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

ROWDATA2
; 240 bytes called by INDX
; Row 9
	BRW
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x91
	RETLW	0x10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x10
	RETLW	0x50
	RETLW	0xA4
	RETLW	0x50
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00

; 	Row 10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x97
	RETLW	0x70
	RETLW	0x00
	RETLW	0x00
	RETLW	0x13
	RETLW	0x50
	RETLW	0x9C
	RETLW	0x70
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0xEE
	RETLW	0x70
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x01
	RETLW	0x83

; 	Row 11
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x12
	RETLW	0x52
	RETLW	0xA4
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x22
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x82

; 	Row 12
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x11
	RETLW	0x8C
	RETLW	0xA5
	RETLW	0x10
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0xE6
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0xEE
	RETLW	0x91
	RETLW	0x26
	RETLW	0x44

; 	Row 13
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x44
	RETLW	0xC7
	RETLW	0x31
	RETLW	0x8E
	RETLW	0x70
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x82
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x42
	RETLW	0x91
	RETLW	0x69
	RETLW	0x44

; 	Row 14
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x6D
	RETLW	0x29
	RETLW	0x0A
	RETLW	0x52
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0xEE
	RETLW	0x70
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x46
	RETLW	0xF1
	RETLW	0xAF
	RETLW	0x28

; 	Row 15
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x55
	RETLW	0xE7
	RETLW	0x6A
	RETLW	0x4E
	RETLW	0x70
	RETLW	0x00
	RETLW	0x03
	RETLW	0xA4
	RETLW	0xC8
	RETLW	0xBA
	RETLW	0x90
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x42
	RETLW	0x91
	RETLW	0x29
	RETLW	0x28

; 	Row 16
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x45
	RETLW	0x29
	RETLW	0x4A
	RETLW	0x52
	RETLW	0x10
	RETLW	0x00
	RETLW	0x04
	RETLW	0xAD
	RETLW	0x2D
	RETLW	0x8A
	RETLW	0xB0
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x00
	RETLW	0x4E
	RETLW	0x91
	RETLW	0x29
	RETLW	0x10

; End Subroutines

	END