;------------------------------------------------------------------------------
;Keyboard emulating software written by Jonas Bjurman, Winamp version 1.0
;email: jonas_bjurman@softhome.net
;------------------------------------------------------------------------------
	processor       16C84
#include        "p16c84.inc"
   	radix	hex
	__CONFIG   _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF

;------------------------------------------------------------------------------
;PORTA I/O
CLOCK		EQU	4
DATAOUT		EQU	3
;------------------------------------------------------------------------------
;PORTA I/O, PORTB I/O
IN0		EQU	0
IN1		EQU	1
IN2		EQU	2
IN3		EQU	3
IN4		EQU	4
IN5		EQU	5
IN6		EQU	6
IN7		EQU	7
;------------------------------------------------------------------------------

DELAYREG	EQU	01C
DELAYREG1	EQU	01DH
SENDBUFFER	EQU	1E
PARITY		EQU	1F
BITCOUNT	EQU	20
DLAYREG		EQU	21


;------------------------------------------------------------------------------
;Definitions of scancodes that are sent for each key
;
MAKE0		EQU	75
BREAK0		EQU	0F0
MAKE1		EQU	72
BREAK1		EQU	0F0
MAKE2		EQU	32
BREAK2		EQU	0F0
MAKE3		EQU	01A
BREAK3		EQU	0F0
MAKE4		EQU	74
BREAK4		EQU	0F0
MAKE5		EQU	06B
BREAK5		EQU	0F0
MAKE6		EQU	021
BREAK6		EQU	0F0
MAKE7		EQU	01BH
BREAK7		EQU	0F0
MAKE8		EQU	022
BREAK8		EQU	0F0
MAKE9		EQU	02A
BREAK9		EQU	0F0
MAKE10		EQU	076
BREAK10		EQU	0F0
;------------------------------------------------------------------------------


	MOVLW	000
	MOVWF	PORTA
	BSF	STATUS,RP0
	MOVWF	OPTION_REG	;Enable RB-pullup
	MOVLW	0FF
	MOVWF	TRISA		;Port A all inputs
	MOVWF	TRISB		;Port B all inputs
	BCF	STATUS,RP0

POLL0	BTFSC	PORTB,IN0	;Check S1
	GOTO	POLL1
	MOVLW	MAKE0
	CALL	SENDCODE
KEYDOWN0
	BTFSS	PORTB,IN0	;S1 Released
	GOTO	KEYDOWN0
	MOVLW	BREAK0
	CALL	SENDCODE
	MOVLW	MAKE0
	CALL	SENDCODE

POLL1	BTFSC	PORTB,IN1	;Check S2
	GOTO	POLL2
	MOVLW	MAKE1
	CALL	SENDCODE
KEYDOWN1
	BTFSS	PORTB,IN1	;S2 Released
	GOTO	KEYDOWN1
	MOVLW	BREAK1
	CALL	SENDCODE
	MOVLW	MAKE1
	CALL	SENDCODE
POLL2	BTFSC	PORTB,IN2	;Check S3
	GOTO	POLL3
	MOVLW	MAKE2
	CALL	SENDCODE
KEYDOWN2
	BTFSS	PORTB,IN2	;S3 Released
	GOTO	KEYDOWN2
	MOVLW	BREAK2
	CALL	SENDCODE
	MOVLW	MAKE2
	CALL	SENDCODE

POLL3	BTFSC	PORTB,IN3	;Check S4
	GOTO	POLL4
	MOVLW	MAKE3
	CALL	SENDCODE
KEYDOWN3
	BTFSS	PORTB,IN3	;S4 Released
	GOTO	KEYDOWN3
	MOVLW	BREAK3
	CALL	SENDCODE
	MOVLW	MAKE3
	CALL	SENDCODE

POLL4	BTFSC	PORTB,IN4	;Check S5
	GOTO	POLL5
	MOVLW	MAKE4
	CALL	SENDCODE
KEYDOWN4
	BTFSS	PORTB,IN4	;S5 Released
	GOTO	KEYDOWN4
	MOVLW	BREAK4
	CALL	SENDCODE
	MOVLW	MAKE4
	CALL	SENDCODE

POLL5	BTFSC	PORTB,IN5	;Check S6
	GOTO	POLL6
	MOVLW	MAKE5
	CALL	SENDCODE
KEYDOWN5
	BTFSS	PORTB,IN5	;S6 Released
	GOTO	KEYDOWN5
	MOVLW	BREAK5
	CALL	SENDCODE
	MOVLW	MAKE5
	CALL	SENDCODE

POLL6	BTFSC	PORTB,IN6	;Check S7
	GOTO	POLL7
	MOVLW	MAKE6
	CALL	SENDCODE
KEYDOWN6
	BTFSS	PORTB,IN6	;S7 Released
	GOTO	KEYDOWN6
	MOVLW	BREAK6
	CALL	SENDCODE
	MOVLW	MAKE6
	CALL	SENDCODE

POLL7	BTFSC	PORTB,IN7	;Check S8
	GOTO	POLL8
	MOVLW	MAKE7
	CALL	SENDCODE
KEYDOWN7
	BTFSS	PORTB,IN7	;S8 Released
	GOTO	KEYDOWN7
	MOVLW	BREAK7
	CALL	SENDCODE
	MOVLW	MAKE7
	CALL	SENDCODE

POLL8	BTFSC	PORTA,IN0	;Check S9
	GOTO	POLL9
	MOVLW	MAKE8
	CALL	SENDCODE
KEYDOWN8
	BTFSS	PORTA,IN0	;S9 Released
	GOTO	KEYDOWN8
	MOVLW	BREAK8
	CALL	SENDCODE
	MOVLW	MAKE8
	CALL	SENDCODE

POLL9	BTFSC	PORTA,IN1	;Check S10
	GOTO	POLL10
	MOVLW	MAKE9
	CALL	SENDCODE
KEYDOWN9
	BTFSS	PORTA,IN1	;S10 Released
	GOTO	KEYDOWN9
	MOVLW	BREAK9
	CALL	SENDCODE
	MOVLW	MAKE9
	CALL	SENDCODE

POLL10	BTFSC	PORTA,IN2	;Check S11
	GOTO	POLL0
	MOVLW	MAKE10
	CALL	SENDCODE
KEYDOWN10
	BTFSS	PORTA,IN2	;S11 Released
	GOTO	KEYDOWN10
	MOVLW	BREAK10
	CALL	SENDCODE
	MOVLW	MAKE10
	CALL	SENDCODE
	GOTO	POLL0
	
SENDCODE
	BTFSS	PORTA,CLOCK		;Ensure that CLOCK and DATA is high
	GOTO	SENDCODE
	BTFSS	PORTA,DATAOUT
	GOTO	SENDCODE
	MOVWF	SENDBUFFER
	MOVLW	08
	MOVWF	BITCOUNT
	CLRF	PARITY
	BSF	STATUS,RP0
	BCF	TRISA,DATAOUT		;startbit
	CALL	WAIT20US
	BCF	TRISA,CLOCK
	CALL	WAIT20US

SENDLOOP
	BSF	STATUS,RP0
	BCF	TRISA,DATAOUT
	BCF	STATUS,RP0
	BTFSS	SENDBUFFER,0
	GOTO	DATA0
	INCF	PARITY,F
	BSF	STATUS,RP0
	BSF	TRISA,DATAOUT		;send bit
DATA0	BSF	STATUS,RP0
	CALL	WAIT20US
	BSF	TRISA,CLOCK
	CALL	WAIT20US
	CALL	WAIT20US
	BCF	TRISA,CLOCK
	CALL	WAIT20US
	BCF	STATUS,RP0
	RRF	SENDBUFFER,F
	DECFSZ	BITCOUNT,F
	GOTO	SENDLOOP
		
	BSF	STATUS,RP0		;parity bit
	BCF	TRISA,DATAOUT
	BCF	STATUS,RP0
	BTFSC	PARITY,0
	GOTO	PBIT0
	BSF	STATUS,RP0
	BSF	TRISA,DATAOUT
PBIT0	BSF	STATUS,RP0
	CALL	WAIT20US
	BSF	TRISA,CLOCK
	CALL	WAIT20US
	CALL	WAIT20US
	BCF	TRISA,CLOCK
	CALL	WAIT20US
	BSF	TRISA,DATAOUT		;STOP BIT
	CALL	WAIT20US
	BSF	TRISA,CLOCK
	CALL	WAIT20US
	CALL	WAIT20US
	BCF	TRISA,CLOCK
	CALL	WAIT20US
	CALL	WAIT20US
	BSF	TRISA,CLOCK
	BCF	STATUS,RP0
	CALL	WAIT20US
	CALL	WAIT20US
	CALL	WAIT20US
	CALL	WAIT20US
	CALL	WAIT20US
	RETURN

WAIT20US
	MOVLW	06
W60LOOP	ADDLW	0FF
	BTFSS	STATUS,Z
	GOTO	W60LOOP
	RETURN

	END
	

