;**********************************************************************
;                                                                     *
;    Filename:         101 Keyboard Decoder.asm		              *
;    Date:             12/1/2011                                      *
;    File Version:     0.1                                            *
;                                                                     *
;    Author:           David Hoffman                                  *
;    Company:          NeoLoch, LLC                                   *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required: P16F882.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    License: Creative Commons                                        *
;    Attribution-NonCommercial-ShareAlike 3.0 Unported License.       *
;             http://creativecommons.org/licenses/by-nc-sa/3.0        *
;                                                                     *
;**********************************************************************
; This file is a rough first version of a keyboard reading program.   *
; This code is incomplete and is intended to aid programmers in       *
; in designing their own code to read 101 keyboards.                  *
;                                                                     *
; If you have any questions regarding this code, feel free to contact *
; me.                                                                 *
;**********************************************************************

     LIST      p=16F882            ; list directive to define processor
     #INCLUDE <p16F882.inc>        ; processor specific variable definitions

     __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT 
     __CONFIG _CONFIG2, _WRT_OFF & _BOR40V

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.
; Note that the _DEBUG_ON is changed by selecting a debugger or programmer.  
; There isn't much advantage to setting it in the code.  
ERRORLEVEL -302

#DEFINE		KEY_PORT	PORTC
#DEFINE		KEY_TRIS	TRISC
#DEFINE		KEY_BIT_CLK	4
#DEFINE		KEY_BIT_DATA	3
#DEFINE		KEY_CLK		KEY_PORT,KEY_BIT_CLK
#DEFINE		KEY_DATA	KEY_PORT,KEY_BIT_DATA
#DEFINE		KEY_SHOW	PORTA
#DEFINE		CLK_TIMER_MS	0X4F		;MAX AMOUNT OF TIME TO WAIT FOR CLK TO CHANGE. 4F

KEY_VAR		UDATA 0X20
RS232_TEMP	RES 1
RS232_COUNTER	RES 1
RS232_CHAR	RES 1
RS232_REG	RES 1
RS232_LOOP	RES 1
RS232_FLAG	RES 1



KEY_VAR_SHR	UDATA_SHR
DEBUG_REG	RES 1
KEY_PARITY	RES 1
KEY_CODE	RES 3
KEY_TEMP	RES 1
KEY_CMD_CMD	RES 1
KEY_CMD_DATA	RES 1
KEY_COUNT	RES 1
CLK_TIMERL	RES 1
CLK_TIMERH	RES 1
KEY_POINTER	RES 1
KEY_FLAG	RES 1
;7 = ERROR BIT.
;6 = PARITY BIT.
;5 = KEYBOARD OKAY FLAG.
;4
;3 = GET NEXT CODE
;2
;1

;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------

RESET_VECTOR    CODE   0x0000
          goto    START             ; When using debug header, ICD2 may not stop
                                    ; on instruction 0 during reset.

;------------------------------------------------------------------------------
; CONFIGURATION CODE
;------------------------------------------------------------------------------
;START	ORG	0X05
MAIN_PROG       ORG	0X05
START
	CALL	RS232_CONFIG		;CONFIGURE RS232 COMMUNICATIONS
	CALL	SYSTEM_CONFIG		;CONFIGURE MCU

;	MOVLW	0XED			;CONFIGURE TEST COMMAND TO TURN
;	MOVWF	KEY_CMD_CMD		;ON KEYBOARD LEDs.
;	MOVLW	0X03
;	MOVWF	KEY_CMD_DATA

;------------------------------------------------------------------------------
; MAIN CODE
;------------------------------------------------------------------------------
MAIN
	BANKSEL	PORTA
	CALL	SCAN_KEYBOARD		;SCAN KEYBOARD FOR START BIT.
	CALL	KEYBOARD_OKAY		;CHECK FOR KEYBOARD BOOT UP TEST CODE.

	BTFSC	KEY_FLAG,4		;DID WE RECEIVE A MAKE OR BREAK CODE?
	CALL	KEY_CODE_DISPLAY	;YES

;	BTFSS	KEY_FLAG,5		;XMIT COMMAND TO KEYBOARD
;	CALL	KEYBOARD_CMD

	GOTO	MAIN			;LOOP AROUND AND IT ALL OVER AGAIN.

KEYBOARD_OKAY
	MOVLW	0XAA
	SUBWF	KEY_CODE,W
	BTFSS	STATUS,Z
	RETURN
	BSF	KEY_FLAG,5		;KEYBOARD OKAY.
	RETURN

;------------------------------------------------------------------------------
; THIS ROUTINE WILL SCAN THE DATA INPUT AND STORE THE CLOCKED IN DATA IN REGISTER
; KEY_TEMP. AFTER THE 8 BITS HAVE BEEN CLOCKED IN, A PARITY BIT IS READ IN. THE
; LAST STEP IS WAITING FOR AN ACK FROM THE KEYBOARD.
; NOTE: BIT 3 IN KEY_FLAG IS USED TO SIGNAL WHEN THE LAST BYTE IN A MAKE OR BREAK
; CODE HAS BEEN RECEIVED.
;------------------------------------------------------------------------------
SCAN_KEYBOARD
	BANKSEL	KEY_CODE
	BTFSC	KEY_DATA		;STARTING COMMUNICATIONS?
	RETURN				;NO

	MOVLW	0X09			;SETUP TO RECIEVE DATA.
	MOVWF	KEY_COUNT

SCAN_KEY_BIT
	BCF	KEY_FLAG,3		;CLEAR GET NEXT CODE FLAG.
	BCF	STATUS,C		;MAKE SURE CARRY BIT IS CLEAR.
	RRF	KEY_TEMP,F		;SHIFT BITS RIGHT ONE PLACE.
	CALL	CLOCK_HIGH_TO_LOW	;WAIT FOR CLOCK TO GO LOW.
	CALL	CLOCK_LOW_TO_HIGH	;WAIT FOR CLOCK TO GO HIGH.
	BCF	KEY_TEMP,7		;CLEAR BIT 7 IN KEY_TEMP.
	BTFSC	KEY_DATA		;IS DATA INPUT LOW?
	BSF	KEY_TEMP,7		;NO - SET BIT 7 IN KEY_TEMP.
	DECFSZ	KEY_COUNT,F		;DECREMENT COUNTER.
	GOTO	SCAN_KEY_BIT		;LOOP AROUND AND DO IT AGAIN.
;PARITY BIT
	CALL	CLOCK_HIGH_TO_LOW	;WAIT FOR CLOCK TO GO LOW.
	CALL	CLOCK_LOW_TO_HIGH	;WAIT FOR CLOCK TO GO HIGH.
	BCF	KEY_FLAG,0		;CLEAR PARITY BIT IN KEY_FLAG.
	BTFSC	KEY_DATA		;IS PARITY BIT SET?
	BSF	KEY_FLAG,0		;YES - SET BIT IN KEY_FLAG
;STOP BIT
	CALL	CLOCK_HIGH_TO_LOW	;WAIT FOR CLOCK TO GO LOW.
	CALL	CLOCK_LOW_TO_HIGH	;WAIT FOR CLOCK TO GO HIGH.
	CALL	SCAN_KEY_STORE		;STORE DATA READ IN CORRECT MEM LOCATION.

	MOVLW	0XE0			;COPY E0 TO W.
	SUBWF	KEY_TEMP,W		;SUB W FROM KEY_TEMP (FIRST BYTE READ)
	BTFSC	STATUS,Z		;DOES THE SUBTRACTION RESULT = 0?
	BSF	KEY_FLAG,3		;YES - WE NEED TO READ NEXT CODE.

	MOVLW	0XF0			;SAME AS PREVIOUS BUT FOR CODE F0
	SUBWF	KEY_TEMP,W
	BTFSC	STATUS,Z
	BSF	KEY_FLAG,3		;SET GET ANOTHER CODE FLAG.

	BTFSC	KEY_FLAG,3		;IS GET ANOTHER CODE FLAG SET?
	INCF	KEY_POINTER,F		;YES - INCREMENT BUFFER POINTER.
	BTFSC	KEY_FLAG,3		;IS GET ANOTHER CODE FLAG SET?
	GOTO	SCAN_KEYBOARD		;YES - LOOP AROUND AND GET NEXT CODE.
	BSF	KEY_FLAG,4		;SET CODE RECIEVED FLAG.
	RETURN


;------------------------------------------------------------------------------
; STORE KEYBOARD DATA
;------------------------------------------------------------------------------
SCAN_KEY_STORE
	BANKSEL	PORTA			;SELECT REGISTER BANK 0.
	MOVLW	KEY_CODE		;COPY ADDRESS OF CHAR BUFFER TO W.
	MOVWF	FSR			;COPY W TO FSR REGISTER.
	MOVF	KEY_POINTER,W		;COPY KEY_POINTER TO W.
	ADDWF	FSR,F			;ADD W TO FSR TO GET CURRENT BUFFER POSITION.
	MOVF	KEY_TEMP,W		;COPY KEY_TEMP TO W.
	MOVWF	INDF			;COPY W TO BUFFER.
	RETURN

;------------------------------------------------------------------------------
; PULL CLOCK LOW SO KEYBOARD WON'T SEND DATA.
;------------------------------------------------------------------------------
SCAN_STOP_KB
	BANKSEL	PORTA			;SELECT REGISTER BANK 0.
	BCF	KEY_CLK			;CLEAR KEY_CLK
	BANKSEL	KEY_TRIS		;SELECT BANK WITH TRIS REGISTERS.
	BCF	KEY_TRIS,KEY_BIT_CLK	;CLEAR TRIS BIT (KEY_CLK = OUTPUT)
	BANKSEL	KEY_PORT		;SELECT REGISTER BANK 0.
	RETURN	

;------------------------------------------------------------------------------
; RELEASE CLOCK LOW SO KEYBOARD CAN SEND DATA.
;------------------------------------------------------------------------------
SCAN_START_KB
	BANKSEL	PORTA
	BSF	KEY_CLK
	BANKSEL	KEY_TRIS
	BSF	KEY_TRIS,KEY_BIT_CLK
	BANKSEL	KEY_PORT
	RETURN

;------------------------------------------------------------------------------
; WAIT FOR CLOCK TO GO LOW. THIS ROUTINE HAS AN EXPIRE TIMER AND WILL SET ERROR
; BIT IF TIMER EXPIRES.
;------------------------------------------------------------------------------
CLOCK_HIGH_TO_LOW
	CLRF	CLK_TIMERL
	MOVLW	CLK_TIMER_MS
	MOVWF	CLK_TIMERH
	BTFSS	KEY_CLK			;IS CLOCK HIGH?
	RETURN				;NO
	DECFSZ	CLK_TIMERL,F		;YES
	GOTO	$-3
	DECFSZ	CLK_TIMERH,F
	GOTO	$-5
	BSF	KEY_FLAG,7		;SET ERROR BIT.
	RETURN

;------------------------------------------------------------------------------
; WAIT FOR CLOCK TO GO HIGH. THIS ROUTINE HAS AN EXPIRE TIMER AND WILL SET ERROR
; BIT IF TIMER EXPIRES.
;------------------------------------------------------------------------------
CLOCK_LOW_TO_HIGH
	CLRF	CLK_TIMERL
	MOVLW	CLK_TIMER_MS
	MOVWF	CLK_TIMERH
	BTFSC	KEY_CLK			;IS CLOCK HIGH?
	RETURN				;NO
	DECFSZ	CLK_TIMERL,F		;YES
	GOTO	$-3
	DECFSZ	CLK_TIMERH,F
	GOTO	$-5
	BSF	KEY_FLAG,7		;SET ERROR BIT.
	RETURN	

;#INCLUDE <101KB - Send.ASM>
;------------------------------------------------------------------------------
; SET INTERNAL OSCILLATOR TO 8 MHZ.
;------------------------------------------------------------------------------
SYSTEM_CONFIG
	BANKSEL	OSCCON
	BSF	OSCCON,0
;------------------------------------------------------------------------------
; CONFIG PORTA
;------------------------------------------------------------------------------
	BANKSEL PORTA
	CLRF	PORTA
	BANKSEL	ANSEL
	CLRF	ANSEL
	BANKSEL	TRISA
	CLRW
	MOVWF	TRISA
;------------------------------------------------------------------------------
; CONFIG PORTB
;------------------------------------------------------------------------------
;	BANKSEL	ANSELH			;SELECT THE BANK THAT ANSELH IS IN.
;	CLRF	ANSELH			;SET PORTB AS DIGITAL I/O.
;	BANKSEL	TRISB			;SELECT THE BANK THAT TRISB IS IN.
;	CLRW
;	MOVWF	TRISB			;SET PORT B AS DIGITAL OUTPUT.
;	BANKSEL PORTB			;SELECT BANK THAT PORT B IS IN.
;	MOVLW	0XFF			;COPY 0XFF TO W.
;	MOVWF	PORTB			;TURN ALL PORTB BITS ON.
;------------------------------------------------------------------------------
; CONFIG PORTC
;------------------------------------------------------------------------------
	BANKSEL PORTC
	CLRF	PORTC
	BANKSEL	TRISC
	MOVLW	0XFF
	MOVWF	TRISC	
;------------------------------------------------------------------------------
; CLEAR ALL RAM MEMORY FROM 0X20 TO 0X7F.
;------------------------------------------------------------------------------
	BANKSEL	PORTA
	MOVLW	0X20			;START OF CLEAR.
	MOVWF	FSR			;COPY ADDRESS 0X20 TO FSR.
	CLRF	INDF			;CLEAR CURRENT ADDRESS
	INCF	FSR,F			;INCREMENT FSR.
	MOVLW	0X7F
	SUBWF	FSR,W
	BTFSS	STATUS,Z		;ARE WE AT TOP OF RAM?
	GOTO	$-5			;NO - JUMP BACK TO CLRF INDF.
	RETURN

;==============================================================================
; XMIT KEYCODES TO RS232 PORT. TEMP CODE FOR DEBUGGING AND TESTING.
;==============================================================================
KEY_CODE_DISPLAY
	CALL	RS232_SCON
	BCF	KEY_FLAG,4
	CALL	SCAN_STOP_KB		;STOP KEYBOARD FROM SENDING CODES.
	BANKSEL	KEY_CODE

	MOVLW	0X05			;CLEAR DISPLAY IF F1 KEY IS PRESSED.
	SUBWF	KEY_CODE,W
	BTFSC	STATUS,Z
	CALL	RS232_CLEAR

	MOVLW	0XF0			;CHECK FOR BREAK CODE.
	SUBWF	KEY_CODE,W
	BTFSC	STATUS,Z
	CALL	RS232_BREAK		;SEND OUT STRING "BREAK"

	MOVLW	0XF0
	SUBWF	KEY_CODE,W
	BTFSS	STATUS,Z
	CALL	RS232_MAKE

	MOVF	KEY_CODE,W		;SEND FIRST CODE IN BUFFER TO TERMINAL.
	MOVWF	RS232_REG
	CALL	RS232_REG_OUT
	CALL	RS232_SPACE
;------------------------------------------------------------------------------
	BANKSEL	KEY_CODE
	MOVLW	0X00
	SUBWF	KEY_CODE+1,W
	BTFSC	STATUS,Z
	GOTO	$+5
	MOVF	KEY_CODE+1,W			;YES
	MOVWF	RS232_REG
	CALL	RS232_REG_OUT
	CALL	RS232_SPACE
;------------------------------------------------------------------------------
	BANKSEL	KEY_CODE
	MOVLW	0X00
	SUBWF	KEY_CODE+2,W
	BTFSC	STATUS,Z
	GOTO	$+5
	MOVF	KEY_CODE+2,W			;YES
	MOVWF	RS232_REG
	CALL	RS232_REG_OUT
	CALL	RS232_SPACE

	MOVLW	0XAA			;CHECK FOR KEYBOARD AA CODE
	SUBWF	KEY_CODE,W
	BTFSC	STATUS,Z
	GOTO	KEY_CODE_DISPLAY

	MOVLW	0XF0			;CHECK FOR BREAK CODE.
	SUBWF	KEY_CODE,W
	BTFSS	STATUS,Z
	CALL	RS232_CHARACTER

KEY_CODE_DISPLAY_2
	MOVLW	0X7F
	ANDWF	KEY_CODE,W
	CALL	KEYBOARD_MB_LOOKUP
	BCF	PCLATH,1
	BCF	PCLATH,2
	CALL	RS232_SEND

	CALL	RS232_CR
	CLRF	KEY_POINTER

	CALL	SCAN_START_KB

	CLRF	KEY_CODE
	CLRF	KEY_CODE+1
	CLRF	KEY_CODE+2
	RETURN

;------------------------------------------------------------------------------
; RS232 CONTROL ROUTINES.
;------------------------------------------------------------------------------
RS232_CONFIG
	BANKSEL	BAUDCTL
	BCF	BAUDCTL,BRG16
	BANKSEL	TXSTA
	BCF	TXSTA,BRGH
	BANKSEL	SPBRG
	MOVLW	D'25'			;SET BAUD RATE TO 2400
	MOVWF	SPBRG
	CLRF	SPBRGH
	BCF	TXSTA,SYNC
	BANKSEL	RS232_CHAR
	CLRF	RS232_CHAR
	BANKSEL	RCSTA
	BSF	RCSTA,CREN		;TURN ON RS-232 RECEIVE
	BSF	RCSTA,SPEN		;TURN ON PORT
	RETURN

RS232_SEND
	BANKSEL	TXREG
	MOVWF	TXREG			;COPY W TO TRANSMIT REGISTER
	GOTO	RS232_WAIT

RS232_WAIT
	BANKSEL	TXSTA
	BTFSS	TXSTA,TRMT		;IS TRASMISSION COMPLETED?
	GOTO	RS232_WAIT		;NO - LOOP AROUND AND CHECK AGAIN.
	BANKSEL	RS232_REG
	RETURN				;YES - RETURN FROM ROUTINE.

RS232_SCON
	BANKSEL	RCSTA
	BCF	RCSTA,CREN		;TURN OFF RECIEVE
	BANKSEL	TXSTA
	BSF	TXSTA,TXEN		;TURN ON SEND
	RETURN

RS232_RCON
	BANKSEL	TXSTA			;TURN RECIEVE MODE BACK ON.
	BCF	TXSTA,TXEN		;TURN OF SEND.
	BANKSEL	RCSTA
	BSF	RCSTA,CREN		;TURN ON RECIEVE.
	RETURN

	CALL	RS232_SEND		;NO - SEND CHARACTER OUT TO TERMINAL.

;------------------------------------------------------------------------------
; SEND CONTENTS OF RS232_REG TO TERMINAL. LOOKS AT EACH BIT IN RS232_REG
;------------------------------------------------------------------------------
RS232_REG_OUT
	CALL	RS232_SCON
	BANKSEL	RS232_REG
	SWAPF	RS232_REG,F
	CALL	RS232_LOOKUP
	CALL	RS232_SEND
	BANKSEL	RS232_REG
	SWAPF	RS232_REG,F
	CALL	RS232_LOOKUP
	CALL	RS232_SEND
	RETURN

RS232_LOOKUP
	BSF	PCLATH,0
	MOVLW	0X0F
	ANDWF	RS232_REG,W
	ADDWF	PCL,F
	RETLW	"0"
	RETLW	"1"
	RETLW	"2"
	RETLW	"3"
	RETLW	"4"
	RETLW	"5"
	RETLW	"6"
	RETLW	"7"
	RETLW	"8"
	RETLW	"9"
	RETLW	"A"
	RETLW	"B"
	RETLW	"C"
	RETLW	"D"
	RETLW	"E"
	RETLW	"F"

RS232_CR
	MOVLW	0X0A
	CALL	RS232_SEND
	MOVLW	0X0D
	CALL	RS232_SEND
	RETURN

RS232_CLEAR
	MOVLW	0X1B
	CALL	RS232_SEND
	MOVLW	"["
	CALL	RS232_SEND
	MOVLW	"2"
	CALL	RS232_SEND
	MOVLW	"J"
	CALL	RS232_SEND
	RETURN

RS232_SPACE
	MOVLW	" "
	CALL	RS232_SEND
	RETURN

RS232_MAKE
	MOVLW	"M"
	CALL	RS232_SEND
	MOVLW	"A"
	CALL	RS232_SEND
	MOVLW	"K"
	CALL	RS232_SEND
	MOVLW	"E"
	CALL	RS232_SEND
	MOVLW	" "
	CALL	RS232_SEND
	MOVLW	":"
	CALL	RS232_SEND
	RETURN

RS232_BREAK
	MOVLW	"B"
	CALL	RS232_SEND
	MOVLW	"R"
	CALL	RS232_SEND
	MOVLW	"E"
	CALL	RS232_SEND
	MOVLW	"A"
	CALL	RS232_SEND
	MOVLW	"K"
	CALL	RS232_SEND
	MOVLW	":"
	CALL	RS232_SEND
	RETURN

RS232_CHARACTER
	MOVLW	" "
	CALL	RS232_SEND
	MOVLW	" "
	CALL	RS232_SEND
	MOVLW	" "
	CALL	RS232_SEND
	MOVLW	" "
	CALL	RS232_SEND
	MOVLW	" "
	CALL	RS232_SEND
	MOVLW	"C"
	CALL	RS232_SEND
	MOVLW	"H"
	CALL	RS232_SEND
	MOVLW	"A"
	CALL	RS232_SEND
	MOVLW	"R"
	CALL	RS232_SEND
	MOVLW	":"
	CALL	RS232_SEND
	RETURN

	ORG	0X200
;==============================================================================
; KEYBOARD KEYCODE LOOKUP TABLES
;==============================================================================
KEYBOARD_MB_LOOKUP
	BCF	PCLATH,0
	BSF	PCLATH,1
	ADDWF	PCL,F
	RETLW	0X00			;00
	RETLW	0X00			;01 - F9
	RETLW	0X00			;02
	RETLW	0X00			;03 - F5
	RETLW	0X00			;04 - F3
	RETLW	0X00			;05 - F1
	RETLW	0X00			;06 - F2
	RETLW	0X00			;07 - F12
	RETLW	0X00			;08
	RETLW	0X00			;09 - F10
	RETLW	0X00			;0A - F8
	RETLW	0X00			;0B - F6
	RETLW	0X00			;0C - F4
	RETLW	0X00			;0D - TAB (HMMM NOT SURE HOW TO HANDLE)
	RETLW	"'"			;0E - '
	RETLW	0X00			;0F
	RETLW	0X00			;10
	RETLW	0X00			;11 - LEFT ALTH KEY
	RETLW	0X00			;12 - LEFT SHIFT KEY
	RETLW	0X00			;13
	RETLW	0X00			;14 - LEFT CTRL KEY
	RETLW	"q"			;15 - q
	RETLW	"1"			;16 - 1 (ONE)
	RETLW	0X00			;17
	RETLW	0X00			;18
	RETLW	0X00			;19
	RETLW	"z"			;1A - z
	RETLW	"s"			;1B - s
	RETLW	"a"			;1C - a
	RETLW	"w"			;1D - w
	RETLW	"2"			;1E - 2
	RETLW	0X00			;1F
	RETLW	0X00			;20
	RETLW	"c"			;21 - c
	RETLW	"x"			;22 - x
	RETLW	"d"			;23 - d
	RETLW	"e"			;24 - e
	RETLW	"4"			;25 - 4
	RETLW	"3"			;26 - 3
	RETLW	0X00			;27
	RETLW	0X00			;28
	RETLW	" "			;29 - SPACE
	RETLW	"v"			;2A - v
	RETLW	"f"			;2B - f
	RETLW	"t"			;2C - t
	RETLW	"r"			;2D - r
	RETLW	"5"			;2E - 5
	RETLW	0X00			;2F
	RETLW	0X00			;30
	RETLW	"n"			;31 - n
	RETLW	"b"			;32 - b
	RETLW	"h"			;33 - h
	RETLW	"g"			;34 - g
	RETLW	"y"			;35 - y
	RETLW	"6"			;36 - 6
	RETLW	0X00			;37
	RETLW	0X00			;38
	RETLW	0X00			;39
	RETLW	"m"			;3A - m
	RETLW	"j"			;3B - j
	RETLW	"u"			;3C - u
	RETLW	"7"			;3D - 7
	RETLW	"8"			;3E - 8
	RETLW	0X00			;3F
	RETLW	0X00			;40
	RETLW	","			;41 - ,
	RETLW	"k"			;42 - k
	RETLW	"i"			;43 - i
	RETLW	"o"			;44 - o
	RETLW	"0"			;45 - 0 (ZERO)
	RETLW	"9"			;46 - 0
	RETLW	0X00			;47
	RETLW	0X00			;48
	RETLW	"."			;49 - .
	RETLW	"/"			;4A - /
	RETLW	"l"			;4B - l
	RETLW	";"			;4C - ;
	RETLW	"p"			;4D - p
	RETLW	"-"			;4E - -
	RETLW	0X00			;4F
	RETLW	0X00			;50
	RETLW	0X00			;51
	RETLW	"'"			;52 - '
	RETLW	0X00			;53
	RETLW	"["			;54
	RETLW	"="			;55 - =
	RETLW	0X00			;56
	RETLW	0X00			;57
	RETLW	0X00			;58 - CAPS (NOT SURE HOW TO HANDLE)
	RETLW	0X00			;59 - RIGHT SHIFT KEY
	RETLW	0X0D			;5A - ENTER (CR)
	RETLW	"]"			;5B - ]
	RETLW	0X00			;5C
	RETLW	" "			;5D - PROBLEM WITH \ HERE. NEED ASCII CODE.
	RETLW	0X00			;5E
	RETLW	0X00			;5F
	RETLW	0X00			;60
	RETLW	0X00			;61
	RETLW	0X00			;62
	RETLW	0X00			;63
	RETLW	0X00			;64
	RETLW	0X00			;65
	RETLW	0X08			;66 - BACKSPACE
	RETLW	0X00			;67
	RETLW	0X00			;68
	RETLW	"1"			;69 - KEYPAD "1"
	RETLW	0X00			;6A
	RETLW	"4"			;6B - KEYPAD "4"
	RETLW	"7"			;6C - KEYPAD "7"
	RETLW	0X00			;6D
	RETLW	0X00			;6E
	RETLW	0X00			;6F
	RETLW	"0"			;70 - KEYPAD "0"
	RETLW	"."			;71 - KEYAPD "."
	RETLW	"2"			;72 - KEYPAD "2"
	RETLW	"5"			;73 - KEYPAD "5"
	RETLW	"6"			;74 - KEYPAD "6"
	RETLW	"8"			;75 - KEYPAD "8"
	RETLW	0X00			;76 - ESCAPE KEY
	RETLW	0X00			;77 - NUM LOCK
	RETLW	0X00			;78
	RETLW	"+"			;79 - KEYPAD "+"
	RETLW	"3"			;7A - KEYPAD "3"
	RETLW	"-"			;7B - KEYPAD "-"
	RETLW	"*"			;7C - KEYPAD "*"
	RETLW	"9"			;7D - KEYPAD "9"
	RETLW	0X00			;7E - SCROLL



	END