The AVR Assembler Site

HOME
RETRO_DAN
ASM FORUM
ASM MATH
TUTORIAL #1
TUTORIAL #2
TUTORIAL #3
MATH 200
MATH 200b
MATH 201
MATH 202
MATH 32X
MATH YX
DIV16 XX
DIV 24 24
DIV 3216
FLOAT 128
SQRT16
MATH 202
MATH 202
DEC ASCII
INT ASCII
HX2ASC
AVG8 222
FFT7
COPY 102
LPM 108
EPROM 100
SER EPROM
DFLASH AT45
FLASH CARD
VFX SMIL
VFX MEM
SORT 220
CRC 236
XMODEM REC
UART 304
UART 305
UART 128
UART BUFF
USB 232
AVR ISP
ISP 2313
ISP 1200
AVR SPI
I2C 300
I2C 302
I2C TWI26
I2C/TWI 128
I2C/TWI AT8
DALLAS-1W
DALLAS CRC
ETHNET 8019
TEA
ADC 128
ADC 10B
ADC 400
ADC 401
THERM 232
IRD 410
LCD HD44
LCD 2313
LCD44 2313
KBD 240
MUX 242
KBD PS2
KBD PC/128
PS2 EMU
BOOT MG8
BOOT DR8
ALM CLK
CLOCK 8564
90 DAYS
DELAYS
CALL ID
DTMF 314
PWM 6CH
PWM 10K
ENCODE
STH-11
ATMEL CORP
AVR BUTTERFLY
AVR BOOK

PS2 KEYBOARD EMULATOR FOR 8515

                                    ;***********************************************************************
                                    ;*
                                    ;* Number		: **.**
                                    ;* File Name		:"Main.asm"
                                    ;* Title		:Keymatrix interface to AT PS/2
                                    ;* 
                                    ;* Date (Orig.)		:2001.09.13.
                                    ;* Date (Last)		:2001.10.14.
                                    ;* Version 		:1.1.0
                                    ;* Support telephone	:+36-30-9541-658
                                    ;* Support fax		:+36-30-9809-372
                                    ;* Support E-mail	:info@vfx.hu
                                    ;* Target MCU		:AT90S8515
                                    ;*
                                    ;* DESCRIPTION
                                    ;* kezeli a kovetkezo eszkozoket:
                                    ;*  - 84 key  
                                    ;*  - 6 LED 
                                    ;*  - 16,11,11x Jacksly??
                                    ;*  - PS/2 style interface to AT or MARGOR CP-01
                                    ;*
                                    ;*	AT90S8515 PLCC Pin discriptions
                                    ;*
                                    ;*	ROW0	 T0 (PB0) 	 VCC
                                    ;*	ROW1     T1 (PB1) 	 (PA0) AD0  D0
                                    ;*	ROW2   AIN0 (PB2) 	 (PA1) AD1  D1
                                    ;*	ROW3   AIN1 (PB3) 	 (PA2) AD2  D2
                                    ;*      ROW4     SS (PB4) 	 (PA3) AD3  D3
                                    ;*      LED3 * MOSI (PB5) 	 (PA4) AD4  D4
                                    ;*	LED4 * MISO (PB6) 	 (PA5) AD5  D5
                                    ;*	LED5  * SCK (PB7) 	 (PA6) AD6  D6
                                    ;*		    RESET 	 (PA7) AD7  D7
                                    ;*	LED0    RxD (PD0) 	 ICP 
                                    ;*      LED1    TxD (PD1) 	 ALE
                                    ;*     	KCLK   INT0 (PD2) 	 OC1B
                                    ;*     	KDATA  INT1 (PD3) 	 (PC7) A15  D8
                                    ;*	LED2  	    (PD4) 	 (PC6) A14  D9
                                    ;*	ROW5   OC1A (PD5) 	 (PC5) A13  D10
                                    ;*	ROW6     WR (PD6) 	 (PC4) A12  D11
                                    ;*	ROW7     RD (PD7) 	 (PC3) A11  D12
                                    ;*	            XTAL2 	 (PC2) A10  D13
                                    ;*                  XTAL1 	 (PC1) A9   D14
                                    ;*     	              GND 	 (PC0) A8   D15
                                    ;*
                                    ;*	Quarc: f=3.6864 MHz (T=0.27126 us)
                                    ;*
                                    ;***********************************************************************
                                    .include "8515def.inc"
                                    
                                    
                                    
                                    ;**********************!!!!!!!!!!!!!!!!!!!!!!***************************
                                    
                                    ;* R15 regisztert modositani tilos!
                                    ;* Atjaro az interrupt rutinok es a foprogram kozott!!!!
                                    				; 0. = 1 ismetles kell a bill.nyomas utan, Timer lejart
                                    
                                    
                                    ;**********************!!!!!!!!!!!!!!!!!!!!!!***************************
                                    
                                    
                                    
                                    ;**************************************************************************
                                    ;* Const Def
                                    .EQU	BaudRate=23		;23 - 9600 @3.6864MHz
                                    
                                    .EQU	T0Freq=227		;220 @1.8432MHz/1024 = 50Hz
                                    				;184 @3.6864MHz/1024 = 50Hz
                                    				;220 @7.3728MHz/1024 = 200Hz
                                    				;227 @7.3728MHz/64   = 4000Hz/250us
                                    
                                    
                                    				;238 @3.6864MHz/1024 = 200Hz
                                    				;250 @3.6864MHz/1024 = 600Hz
                                    
                                    
                                    .EQU	ONESEC=200		;for 1s
                                    
                                    .EQU	FlashPeriod=1000	;LEDek villogasi periodusa ~250us egysegekben
                                    
                                    
                                    ;***************************************************************************
                                    ;***** Hardware Abstraction Layer
                                    
                                    .EQU	DTLo_PORT = DDRA
                                    .EQU	DTHi_PORT = DDRC			;2x8 bit adat port Pull-upos kell
                                    
                                    
                                    
                                    .EQU	Row0  = 0	;PortB kiosztasa
                                    .EQU	Row1  = 1
                                    .EQU	Row2  = 2
                                    .EQU	Row3  = 3
                                    .EQU	Row4  = 4
                                    .EQU	LED3 = 5				;LED3
                                    .EQU	LED4 = 6				;LED4
                                    .EQU	LED5 = 7				;LED5
                                    
                                    .EQU	LED345 = PORTB
                                    .EQU	Row01234 = PORTB
                                    
                                    
                                    .EQU	LED0  = 0	;PortD kiosztasa	 LED0
                                    .EQU	LED1  = 1				;LED1
                                    .EQU	LED2  = 4				;LED2
                                    .EQU	Row5  = 5
                                    .EQU	Row6  = 6
                                    .EQU	Row7  = 7
                                    
                                    .EQU	LED012 = PORTD
                                    .EQU	Row567 = PORTD
                                    
                                    
                                    ;******************************************************************************
                                    ;**** VARIABLES
                                    .DSEG
                                    Flag1:	 .BYTE 1		;Flagbitek
                                    				;2   = paros/paratlan szamlalo led villogtatashoz
                                    				;1:0 = scan mode 01 = scan1, 10 =  scan2, 11 = scan3
                                    
                                    CNT1L:	 .BYTE 1
                                    CNT1H:	 .BYTE 1		;software Timer
                                    
                                    CNT2L:	 .BYTE 1
                                    CNT2H:	 .BYTE 1		;LED villogtatas freki
                                    
                                    
                                    KeyHead: .BYTE 1		;Bill. puffer eleje
                                    KeyTrail:.BYTE 1		;Bill. puffer vege
                                    
                                    
                                    WTime:	 .BYTE 2		;Bill.nyomas utan a varakozas ido
                                    WRep:	 .BYTE 2		;Bill.nyomas utan a ismetlesi ido 
                                    
                                    PS2Flag: .BYTE 1		;PS2 flag csak az int. rutin hasznalhatja
                                    				;3. = 1 Parameterre var, komunikacio kozben vagyunk
                                    				;2. = 1 Request resend
                                    				;1. = 1 Resend last data to host
                                    				;0. = 1 Send ACK
                                    				
                                    PS2NextA:.BYTE 2		;PS2 program cim, ahova a kovetkezo int ugrik
                                    LastSend:.BYTE 1		;PS2 Utoljara kuldott kod
                                    RepChar: .BYTE 1		;karakter sorszama amit ismetelni kell
                                    
                                    
                                    StatLEDs:.BYTE 2		;STAUS LEDek  allapota eg / nem eg
                                    				;masodik byte a villogas mask byte-ja
                                    
                                    
                                    ParamErr:.BYTE 1		;parameterre max 4ms ideig var utana hiba
                                    
                                    
                                    
                                    .EQU	KeyBuffLen = 17
                                    KeyBuff:  .BYTE KeyBuffLen		;Transmit key-buffer
                                    
                                    
                                    
                                    .EQU	KeyCount = 128			;max 128 bill.,de csak 119 db billenyut kell kezelni
                                    Matrix:	  .BYTE KeyCount		;Keys allapota
                                    
                                    
                                    
                                    ;**************************************************************************************
                                    .ESEG
                                    	.db	"MAGOR HI-01 Keyboard-matrix Controller by VFX. V1.1.0 [orig. 2001.09.16] "
                                    	.db	"Last Upd. [2001.10.14]  Info: info@vfx.hu  Data area>>"
                                    
                                    ;*****************************************************************************
                                    ;****		I N T E R R U P T S
                                    ;****
                                    ;*****************************************************************************
                                    .CSEG
                                    		rjmp RESET	 ; Reset Handler
                                    		rjmp EXT_INT0	 ; IRQ0 Handler
                                    		rjmp EXT_INT1	 ; IRQ1 Handler
                                    		rjmp TIM1_CAPT	 ; Timer1 Capture Handler
                                    		rjmp TIM1_COMPA	 ; Timer1 CompareA Handler
                                    		rjmp TIM1_COMPB	 ; Timer1 CompareB Handler
                                    		rjmp TIM1_OVF	 ; Timer1 Overflow Handler
                                    		rjmp TIM0_OVF	 ; Timer0 Overflow Handler
                                    		rjmp SPI_INT	 ; SPI Transfer Complete Handler
                                    		rjmp UART_RXC	 ; UART RX Complete Handler
                                    		rjmp UART_DRE	 ; UDR Empty Handler
                                    		rjmp UART_TXC	 ; UART TX Complete Handler
                                    		rjmp ACI_INT	 ; Analog Comparator Handler
                                    
                                    
                                    ;*********************
                                    EXT_INT0:	RETI
                                    EXT_INT1:	RETI
                                    TIM1_CAPT:	RETI
                                    ;************************
                                    ;* Key Deleay & Rep Time
                                    ;************************
                                    TIM1_COMPA:    	PUSH	ZL
                                    		IN	ZL,SREG
                                    		PUSH	ZL
                                    
                                    		ldd	ZL,Y+WRep+1-RAMSTRT
                                    		out	OCR1AH,ZL
                                    		ldd	ZL,Y+WRep+0-RAMSTRT
                                    		out	OCR1AL,ZL		;rep. timer beallitasa
                                    		ldi	ZL,1
                                    		or	R15,Zl			;timer lejart ismetles mehet Flag
                                    		
                                    		POP	ZL
                                    		OUT	SREG,ZL
                                    		POP	ZL
                                    		RETI
                                    ;**
                                    TIM1_COMPB:	RETI
                                    TIM1_OVF:	RETI
                                    
                                    ;*********************
                                    ;* RealTime Clock Int
                                    ;*********************
                                    ;* 
                                    TIM0_OVF:	PUSH	ZL
                                    		PUSH	ZH
                                    		IN	ZL,SREG
                                    		PUSH	ZL
                                    
                                    		LDI	ZL,T0Freq	
                                    		OUT	TCNT0,ZL		;Reload  Timer
                                    
                                    		LDD	ZL,Y+CNT1L-RAMSTRT
                                    		LDD	ZH,Y+CNT1H-RAMSTRT
                                    		OR	ZL,ZH
                                    		BREQ	TIM_01
                                    		LDD	ZL,Y+CNT1L-RAMSTRT
                                    		SBIW	ZL,1
                                    		STD	Y+CNT1L-RAMSTRT,ZL
                                    		STD	Y+CNT1H-RAMSTRT,ZH
                                    
                                    TIM_01:
                                    		LDD	ZL,Y+CNT2L-RAMSTRT
                                    		LDD	ZH,Y+CNT2H-RAMSTRT
                                    		OR	ZL,ZH
                                    		BREQ	TIM_02
                                    		LDD	ZL,Y+CNT2L-RAMSTRT
                                    		SBIW	ZL,1
                                    		STD	Y+CNT2L-RAMSTRT,ZL
                                    		STD	Y+CNT2H-RAMSTRT,ZH
                                    
                                    TIM_02:		POP	ZL
                                    		OUT	SREG,ZL
                                    		POP	ZH
                                    		POP	ZL
                                    		RETI
                                    
                                    ;********************
                                    ;* SPI Int Handle
                                    ;********************
                                    SPI_INT:	RETI 
                                    UART_RXC:	RETI
                                    UART_DRE:	RETI
                                    UART_TXC:	RETI
                                    EPR_INT:	RETI
                                    ACI_INT:	RETI
                                    
                                    
                                    
                                    
                                    ;**********************************************************************
                                    ;* Iclude files 
                                    
                                    .include	"keyb.asm"
                                    .include	"ps2.asm"
                                    .include	"EEprom.asm"
                                    
                                    
                                    ;**********************************************************************
                                    ;* RESET 
                                    ;**********************************************************************
                                    RESET:	CLI			;GLOBAL INTERRUP DIS.	
                                    	clr	R15		;Flags!!!
                                    
                                    
                                    	ldi r16, high(RAMEND)	;setup stack
                                    	out SPH,r16
                                    	ldi r16, low(RAMEND)
                                    	out SPL,r16
                                    
                                    	LDI	R16,0b00101010	;Sleep enable, Idle mode,INT0, INT1 fall-edge sens.
                                    	OUT	MCUCR,R16	;7. =1 SRE External SARAM Enabled, Alternate Function 
                                    				;6. =1 SRW External SRAM WaitStates Enabled
                                    				;5. = 1 Sleep Enable
                                    				;4. = 0 SLEEP => Idle Mode
                                    				;     1 SLEEP => Power Down Mode
                                    				;3:2 = Inerrupt Sense Control for INT1
                                    				; 00 -> Low Level INT1
                                    				; 01 -> Reserved
                                    				; 10 -> Falling Edge INT1
                                    				; 11 -> Rising Edge INT1
                                    				;1:0 = Inerrupt Sense Control for INT0
                                    				; 00 -> Low Level INT0
                                    				; 01 -> Reserved
                                    				; 10 -> Falling Edge INT0
                                    				; 11 -> Rising Edge INT0
                                    
                                    
                                    	LDI	R16,0b00000000		;INT0, INT1 Disabled
                                    	OUT	GIMSK,R16	;7. = 1 EXT INT1 ACTIVE
                                    				;6. = 1 EXT INT0 ACTIVE
                                    
                                    
                                    
                                    	LDI	R16,0b01000010
                                    	OUT	TIMSK,R16 	;7. = 1 TC1 OWRF EN.  *
                                    				;6. = 1 TC1 COMP MATCH EN.
                                    				;3. = 1 TC1 INP CAPTURE EN.
                                    				;1. = 1 TC0 OWRF EN.   *
                                    	
                                    
                                    	LDI	YL,LOW(RAMSTRT)
                                    	LDI	YH,HIGH(RAMSTRT) ;BAZIS 'Y' +0
                                    
                                    
                                    ;************************************************************************
                                    ;*Prot/Keymatrix and Hardware Init
                                    ;*
                                    
                                    	ldi	R16,255
                                    	STD	Y+RepChar-RAMSTRT,R16 		;ismetelhetettlen karakter sorszam
                                    
                                    	clr	R17
                                    
                                    	out	DTLo_PORT,R17
                                    	out	DTLo_PORT+1,R16			;Lower 8 data bit Input & Pull up
                                    
                                    	out	DTHi_PORT,R17
                                    	out	DTHi_PORT+1,R16			;Higher 8 data bit Input & Pull up
                                    
                                    
                                    	out	DDRB,R16
                                    	out	DDRB+1,R16			;Row0..4 output & H, LED3,4,5 Nem vilagit
                                    
                                    
                                    	ldi	R17,255-(1< OC1 not connected   ; Disconnect OC1A
                                    				;    01 => OC1 not connected   ; Togle OC1A
                                    				;    10 => OC1 non-inv  PWM    ; Clear OC1A
                                    				;    11 => OC1 inverted PWM    ; Set OC1A
                                    				;5:4 00 => OC1 not connected       ""  OC1B
                                    				;    01 => OC1 not connected       ""
                                    				;    10 => OC1 non-inverted PWM    ""
                                    				;    11 => OC1 inverted PWM        ""
                                    				;1:0 00 => PWM Disabled
                                    				;    01 =>  8 bit PWM
                                    				;    10 =>  9 bit PWM
                                    				;    11 => 10 bit PWM
                                    
                                    
                                    	LDI	R17,0b00001000
                                    	OUT	TCCR1B,R17	;7. = 0 Input Capture Noise Canceller Disabled
                                    				;6. = 0 InputCapture ICP Falling edge
                                    				;3. = 1 Reset TC1 when copare match
                                    				;2:0 Clock select
                                    				;   000 => TC1 Stop
                                    				;   001 => Ck
                                    				;   010 => Ck/8
                                    				;   011 => Ck/64
                                    				;   100 => Ck/256
                                    				;   101 => Ck/1024
                                    				;   110 => External T1 Falling Edge
                                    				;   111 => External T1 rising Edge
                                    
                                    
                                    ;************************************
                                    ;**  Timer0 Init		*****
                                    ;**
                                    	LDI	R16,T0Freq
                                    	OUT	TCNT0,R16	;megszakitas frekvenciaja
                                    
                                    	LDI	R16,0b00000011
                                    	OUT	TCCR0,R16	;TC0 Control Register
                                    				;2:0 Clock Select
                                    				; 000 -> Stop
                                    				; 001 -> CK
                                    				; 010 -> CK/8
                                    				; 011 -> CK/64
                                    				; 100 -> CK/256
                                    				; 101 -> CK/1024
                                    				; 110 -> External pin T0 falling edge
                                    				; 111 -> External pin T0 risinrg edge
                                    
                                    
                                    
                                    
                                    		SEI				;SET GLOBAL INT EN.
                                    
                                    
                                    
                                    		CBI	LED012,LED0		;LEDx vilagit
                                    		CBI	LED012,LED1
                                    		CBI	LED012,LED2
                                    		CBI	LED345,LED3
                                    		CBI	LED345,LED4
                                    		CBI	LED345,LED5
                                    
                                    		ldi	R16,Low(ONESEC)
                                    		STD	Y+CNT1L-RAMSTRT,R16	;software down counter, wait for 1s 
                                    		ldi	R16,High(ONESEC)
                                    		STD	Y+CNT1H-RAMSTRT,R16 
                                    
                                    
                                    wait1:		LDD	R16,Y+CNT1L-RAMSTRT 
                                    		LDD	R17,Y+CNT1H-RAMSTRT 
                                    		or	R16,R17
                                    		brne	wait1
                                    
                                    
                                    		SBI	LED012,LED0		;LEDx nem vilagit
                                    		SBI	LED012,LED1
                                    		SBI	LED012,LED2
                                    		SBI	LED345,LED3
                                    		SBI	LED345,LED4
                                    		SBI	LED345,LED5
                                    
                                    		ldi	ZL,low(0)			;led villogtatas kb 0.5s
                                    		STD	Y+CNT2L-RAMSTRT,ZL
                                    		ldi	ZH,high(0)
                                    		STD	Y+CNT2H-RAMSTRT,ZH
                                    
                                    
                                    ;***********************************************************************
                                    ;***********************************************************************
                                    ;********     M     A      I      N				********
                                    ;********							********
                                    ;***********************************************************************
                                    WWW:		ldi	ZL,low(40)
                                    		STD	Y+CNT1L-RAMSTRT,ZL
                                    		ldi	ZH,high(40)
                                    		STD	Y+CNT1H-RAMSTRT,ZH
                                    
                                    Main: 		SLEEP
                                    		rcall	PS2_Com
                                    
                                    		LDD	ZL,Y+CNT2L-RAMSTRT
                                    		LDD	ZH,Y+CNT2H-RAMSTRT
                                    		OR	ZL,ZH
                                    		BRNE	LEDkihagy
                                    
                                    		ldi	ZL,low(FlashPeriod)			;led villogtatas kb 0.5s
                                    		STD	Y+CNT2L-RAMSTRT,ZL
                                    		ldi	ZH,high(FlashPeriod)
                                    		STD	Y+CNT2H-RAMSTRT,ZH
                                    
                                    		LDD	R16,Y+Flag1-RAMSTRT
                                    		ldi	R17,0b0000100
                                    		eor	R16,R17
                                    		STD	Y+Flag1-RAMSTRT,R16		;paros/paratlan bit valtas
                                    	
                                    		rcall	Puts_LEDs
                                    
                                    
                                    LEDkihagy:	LDD	R16,Y+CNT1L-RAMSTRT
                                    		cpi	R16,0
                                    		brne	Main
                                    
                                    		rcall	ScanMatrix			;keymatrix beolvasasa a memoriaba
                                    		rcall	MakeScanC
                                    		rjmp	WWW
                                    
                                    
                                    
                                    
                                    
                                    ;* LEd 7  6  5  4  3  2  1  0
                                    ;*           3P 2P 1P 3Z 2Z 1Z
                                    
                                    Puts_LEDs:	LDD	R16,Y+Flag1-RAMSTRT
                                    		andi	R16,4				;D0 = Paros/paratlan bit
                                    		ldi	R18,0b00000111			;csak zoldek villognak
                                    		breq	paros
                                    		ldi	R18,0b00111000			;csak pirosak villognak
                                    
                                    paros:		LDD	R16,Y+StatLEDs+1-RAMSTRT	;villogas mask = 1 villog
                                    		and	R18,R16				
                                    
                                    		LDD	R16,Y+StatLEDs+0-RAMSTRT	;LED data = 1 villagit
                                    		or	R16,R18
                                    		com	R16
                                    		andi	R16,0b00111111			;inv. kell mert kozos anodosak a ledek
                                    
                                    		mov	R17,R16
                                    		rol	R17
                                    		rol	R17
                                    		andi	R17,0b00010000
                                    		mov	R18,R16
                                    		andi	R18,0b00000011
                                    		or	R17,R18				;ez megy ki a PD portra, zold ledek
                                    		in	R18,LED012
                                    		andi	R18,0b11101100
                                    		or	R18,R17
                                    		out	LED012,R18			;LED0,1,2 kikuldve
                                    		
                                    		rol	R16
                                    		rol	R16
                                    		andi	R16,0b11100000
                                    		in	R17,LED345
                                    		andi	R17,0b00011111
                                    		or	R17,R16
                                    		out	LED345,R17			;LED3,4,5 kikuldve
                                    
                                    		ret
                                    
                                    
                                    ;***********************************************************************
                                    ;*
                                    ;* File Name		:"PS2.asm"
                                    ;* Title		:PS/2 communication protocoll
                                    ;* 
                                    ;* Date (Orig.)		:2001.10.06.
                                    ;* Date (Last)		:2001.10.12.
                                    ;* Version 		:1.0.10
                                    ;* Support telephone	:+36-30-9541-658
                                    ;* Support fax		:+36-30-9809-372
                                    ;* Support E-mail	:info@vfx.hu
                                    ;* Target MCU		:AT90S8515
                                    ;*
                                    ;* DESCRIPTION
                                    ;*  - PS/2 style communication to AT or MARGOR CP-01
                                    ;*
                                    ;*	CLK & DATA = H	-> Two way communication 
                                    ;*	DATA = L	-> PC (MAGOR) sends to Keyb
                                    ;*	CLK = L		-> PC (MAGOR) inhibits communiaction
                                    
                                    ;**************************************************************************
                                    ;* Const Def
                                    
                                    
                                    ;***************************************************************************
                                    ;***** Hardware Abstraction Layer
                                    
                                    .EQU	PS2_CLKPort = DDRD
                                    .EQU	PS2_DATPort = DDRD
                                    
                                    .EQU	KCLK  = 2
                                    .EQU	KDATA = 3
                                    
                                    
                                    ;******************************************************************************
                                    ;**** VARIABLES
                                    .DSEG
                                    
                                    .EQU	NoError   = 0		;No Error
                                    .EQU	RxF_Abort = 2		;Abort communication
                                    .EQU	TxBreak   = 3		;Abort Transmit
                                    .EQU	Parity_Err= 4		;Parity Error
                                    
                                    
                                    ;******************************************************************************
                                    .ESEG
                                    
                                    
                                    ;******************************************************************************
                                    .CSEG
                                    
                                    Init_PS2:	CBI	PS2_CLKPort,KCLK
                                    	CBI	PS2_CLKPort+1,KCLK	;CLK pin tre-stated external pull-up res!!
                                    
                                    		CBI	PS2_DATPort,KDATA
                                    	CBI	PS2_DATPort+1,KDATA	;DATA pin tre-stated external pull-up res!!
                                    
                                    		ldi	R16,0
                                    		STD	Y+PS2NextA+0-RAMSTRT,R16
                                    		STD	Y+PS2NextA+1-RAMSTRT,R16 ;nincs aktiv komunikacio folyamatban
                                    		STD	Y+PS2Flag-RAMSTRT,R16 
                                    
                                    		ret
                                    
                                    
                                    ;******************************************************************************
                                    ;** Communication between Host and Keyboard
                                    ;**
                                    ;******************************************************************************
                                    PS2_Com:	sbis	PS2_CLKPort-1,KCLK
                                    		 ret				;if clk pin low, comm. inhibit
                                    		sbis	PS2_DATPort-1,KDATA
                                    		 rjmp	RxCommand		;if data pin low, HOST sends command/data
                                    
                                    
                                    		LDD	R16,Y+PS2Flag-RAMSTRT	;Request Resend?
                                    		andi	R16,0b00000100
                                    		breq	Ps2_C2
                                    		ldi	R16,0xFE		;RESEND Command
                                    		mov	R1,R16
                                    		rcall	SendByte		;keres elkuldese
                                    		brcs	ResSendERR
                                    		LDD	R16,Y+PS2Flag-RAMSTRT	;Request Resend flag torlese
                                    		andi	R16,0b11111011
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    
                                    
                                    Ps2_C2:		LDD	R16,Y+PS2Flag-RAMSTRT	;Resend last data?
                                    		andi	R16,0b00000010
                                    		breq	Ps2_C0
                                    		ldd	R1,Y+LastSend-RAMSTRT	;utoljara kuldott karakter ismetleshez
                                    		rcall	SendByte		;ujrakuldes
                                    		brcs	ResSendERR
                                    		LDD	R16,Y+PS2Flag-RAMSTRT	;Resend flag torlese
                                    		andi	R16,0b11111101
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    ResSendERR:	ret				;ha hiba volt ujra kuldjuk
                                    
                                    Ps2_C0:		LDD	R16,Y+PS2Flag-RAMSTRT	;Send ACK flag active?
                                    		andi	R16,0b00000001
                                    		breq	Ps2_C1
                                    		ldi	R16,0xFA		;Send ACK to HOST
                                    		mov	R1,R16
                                    		rcall	SendByte
                                    		brcs	ResSendERR		;ha hiba van ujrakuldes lesz
                                    		LDD	R16,Y+PS2Flag-RAMSTRT	;Host Abort
                                    		andi	R16,0b11111110		;ACK flag torlove sikeresen elment		
                                    		STD	Y+PS2Flag-RAMSTRT,R16	;komunikacio nincs
                                    		ret
                                    
                                    Ps2_C1:		LDD	R16,Y+PS2Flag-RAMSTRT	;Parameterre var?
                                    		andi	R16,0b00001000
                                    		breq	Ps2_C3			;ha nem, akkor hadmenjen
                                    
                                    		LDD	R16,Y+ParamErr-RAMSTRT	;parameterr error counter>4ms -> igen, hiba
                                    inc	R16
                                    		cpi	R16,20			;20*250us ido ~4..5ms
                                    		brcs	Megidovan		;idotullepes!!
                                    
                                    		LDD	R16,Y+PS2Flag-RAMSTRT	;Parameterre var bit torlese, nem varunk tovabb!
                                    		andi	R16,0b11110111
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		clr	R16
                                    		STD	Y+PS2NextA+0-RAMSTRT,R16
                                    		STD	Y+PS2NextA+1-RAMSTRT,R16 ;alapallapotba hozas!
                                    Megidovan:	STD	Y+ParamErr-RAMSTRT,R16
                                    		ret
                                    
                                    
                                    Ps2_C3:		LDD	ZL,Y+PS2NextA+0-RAMSTRT
                                    		LDD	ZH,Y+PS2NextA+1-RAMSTRT
                                    		mov	R16,ZL
                                    		or	R16,ZH			;ha nincs komunikacio folyamatban
                                    		breq	SendScan		;akkor kuldjunk scan kodot
                                    		ijmp				;ugras a komunikacios rutinra
                                    
                                    ;********************************************
                                    ;** Send scan/fifo
                                    ;********************************************
                                    SendScan:	ldi	ZL,Low(KeyBuff)
                                    		ldi	ZH,High(KeyBuff)
                                    		LDD	R0,Y+KeyHead-RAMSTRT
                                    		LDD	R16,Y+KeyTrail-RAMSTRT
                                    		cp	R0,R16
                                    		brne	SendScn1
                                    		ret
                                    SendScn1:	clr	R0
                                    		add	Zl,R16
                                    		adc	ZH,R0
                                    		ld	R1,Z
                                    		inc	R16
                                    		cpi	R16,KeyBuffLen
                                    		brcs	SendScn2
                                    		clr	R16
                                    SendScn2:	STD	Y+KeyTrail-RAMSTRT,R16	;uj pointer elmentve
                                    		rcall	SendByte
                                    		brcc	NoSendErr		;nincs hiba siman elment
                                    		LDD	R16,Y+PS2Flag-RAMSTRT	;Resend flag beallitasa
                                    		ori	R16,0b00000010
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    NoSendErr:	ret
                                    
                                    
                                    ;*****************************************
                                    ;** Send R1 to Host
                                    ;** C=1 hiba tortent R17= hibakod
                                    ;*****************************************
                                    SendByte:	sbis	PS2_CLKPort-1,KCLK
                                    		 rjmp	SendByte		;wait for clk=hi
                                    		rcall	Delay45us
                                    		rcall	Delay5us		;wait 50us
                                    		sbis	PS2_CLKPort-1,KCLK
                                    		 rjmp	SendByte		;wait for clk=hi
                                    		sec
                                    		std	Y+LastSend-RAMSTRT,R1	;utoljara kuldott karakter
                                    		ldi	R17,TxBreak		;R17= Transmit break
                                    		sbis	PS2_DATPort-1,KDATA	;Is Data still hi?
                                    		 ret				;ha nem,vissza R17 hibakod!
                                    		rcall	Delay40us
                                    		clr	R0			;R0=0 start bit
                                    		rcall	SendBit
                                    		brcs	SendAborted
                                    
                                    		ldi	R16,8
                                    		mov	R3,R16
                                    		mov	R0,R1
                                    		clr	R2
                                    SendLoop:	rcall	SendBit
                                    		brcs	SendAborted
                                    		dec	R3
                                    		brne	SendLoop
                                    inc	R2			;paratlan paritas kell!!!!!???
                                    		mov	R0,R2
                                    		rcall	SendBit
                                    		clr	R0
                                    		dec	R0			;R0=255 stop bit =H
                                    		rcall	SendBit
                                    		rcall	Delay15us
                                    		rcall	Delay15us
                                    		ldi	R17,NoError
                                    clc
                                    		ret
                                    SendAborted:	ldi	R17,TxBreak		;R17= Transmit break
                                    		sec
                                    		ret		
                                    
                                    ;* C=1 break, C=0 normal transmit
                                    SendBit:	ror	R0			;0. bit -> C
                                    		brcc	bit0
                                    bit1:         	CBI	PS2_DATPort,KDATA	;DATA pin H
                                    		inc	R2			;paritas no egyel
                                    		rjmp	bitn
                                    bit0:          	SBI	PS2_DATPort,KDATA	;DATA pin L
                                    bitn:		rcall	Delay20us
                                    		SBI	PS2_CLKPort,KCLK	;clk = L
                                    		rcall	Delay40us
                                    		CBI	PS2_CLKPort,KCLK	;clk = H
                                    		rcall	Delay20us
                                    		clc
                                    		sbis	PS2_CLKPort-1,KCLK	;Clock=high?
                                    		 sec				;if no -> C=1
                                    		ret
                                    
                                    
                                    ;******************************************************************************
                                    ;* R E C E I V E 
                                    ;*
                                    ;* 80 us/bit device generated clock - host changes the Data line only when
                                    ;* the Clock line is low, and data is latched on the rising edge of the clock pulse
                                    ;* Host may abort transmission at time before the 11th clock pulse (acknowledge bit)
                                    ;* by holding Clock low for at least 100 microseconds. 
                                    ;*
                                    ;* Uses:R1,R2,R17,R18
                                    
                                    RxStream:	sbis	PS2_CLKPort-1,KCLK	;Wait for Clock=high 
                                    		 rjmp	RxStream
                                    
                                    		sbic	PS2_DATPort-1,KDATA	;Is Data still low?
                                    		 rjmp	RxErr			;ha nem, akkor hiba!
                                    
                                    ;Read each bit (8 data bits, parity bit, and stop bit) as follows: 
                                    		clr	R1			;data reg.
                                    		clr	R2			;parity reg.
                                    		ldi	R17,8			;8 bit
                                    
                                    RxBitLoop:	rcall	RxBit			;R18-ban a bit
                                    		add	R2,R18
                                    		ror	R18			;adatbit a C flagben
                                    		ror	R1
                                    		sbis	PS2_CLKPort-1,KCLK	;Clock=high?
                                    		 rjmp	RxAbort			;if no then Abort
                                    		dec	R17
                                    		brne	RxBitLoop
                                    
                                    						;Read parity bit 
                                    		rcall	RxBit			;R18-ban a bit
                                    		inc	R2			;paratlan paritas kell!!??!!!?????
                                    eor	R2,R18			;R2 = parity xor parity bit
                                    		sbis	PS2_CLKPort-1,KCLK
                                    		 rjmp	RxAbort
                                    		
                                    	;Read stop bit 
                                    		rcall	RxBit			;R18-ban a bit
                                    		sbis	PS2_CLKPort-1,KCLK
                                    		 rjmp	RxAbort
                                    
                                    		sbis	PS2_DATPort-1,KDATA	;Is Data still low?
                                    		 rjmp	RxErr1			;Data still equals 0?
                                    						;Output Acknowledge bit 
                                    		rcall	SendAckBit		;Acknowledge bit 
                                    		rcall	Delay45us		;Delay 45 microseconds
                                    						;(to give host time to inhibit
                                    						;next transmission.) 
                                    		ldi	R17,0			;no error flag
                                    		ror	R2			;C-flagben a parity
                                    		brcs	RxParErr
                                    		ret				;R1 = reseived data
                                    
                                    
                                    RxParErr:	ldi	R17,Parity_Err		;Parity Error
                                    		sec				;C flag =0
                                    		ret
                                    
                                    RxAbort:	ldi	R17,RxF_Abort		;Abort
                                    		sec				;C flag =0
                                    		ret
                                    
                                    ;*Keep clocking until Data=1 then generate an error
                                    
                                    RxErr1:		rcall	RxBit
                                    		sbis	PS2_DATPort-1,KDATA	;Is Data still low?
                                    		 rjmp	RxErr1			;ha nem, akkor hiba!						;Data still equals 0? Keep clocking until Data=1 then generate an error
                                    RxErr:		
                                    		ret
                                    
                                    ;Read a bit
                                    RxBit:		rcall	Delay20us
                                    		SBI	PS2_CLKPort,KCLK	;clk = L
                                    		rcall	Delay40us
                                    		CBI	PS2_CLKPort,KCLK	;clk = H
                                    		rcall	Delay20us
                                    		clr	R18			
                                    		sbic	PS2_DATPort-1,KDATA
                                    		 ldi	R18,1			;R18 a beolvasott adatbit
                                    		ret
                                    
                                    ;Send the acknowledge bit
                                    SendAckBit:	rcall	Delay15us
                                    		SBI	PS2_DATPort,KDATA	;data = L
                                    		rcall	Delay5us
                                    		SBI	PS2_CLKPort,KCLK	;clk = L
                                    		rcall	Delay40us
                                    		CBI	PS2_CLKPort,KCLK	;clk = H
                                    		rcall	Delay5us
                                    		CBI	PS2_DATPort,KDATA	;data = H
                                    		ret
                                    
                                    
                                    
                                    ;******************************************************************************
                                    ;* Delayxxus
                                    ;*
                                    ;*rcall [3] + wait [xx] +ret [4] = Delay
                                    ;*	@7.3728MHz
                                    ;*	45 us [332cycl 
                                    ;*	40 us [296cycl 
                                    ;*	20 us [148cycl
                                    ;*	10 us [74cycl]
                                    ;*	 5 us [37cycl]
                                    Delay45us:	ldi	R16,104		;[1] 104*3+10 cycl
                                    		rjmp	DelayLoop	;[2]
                                    Delay5us:	ldi	R16,9		;[1] 9*3+10 cycl
                                    		rjmp	DelayLoop	;[2]
                                    Delay15us:	ldi	R16,34		;[1] 34*3+10 cycl
                                    		rjmp	DelayLoop	;[2]
                                    Delay20us:	ldi	R16,46		;[1] 46*3+10 cycl
                                    		rjmp	DelayLoop	;[2]
                                    Delay40us:	ldi	R16,96		;[1] 96*3 cycl
                                    DelayLoop:	dec	R16		;[1]
                                    		brne	DelayLoop	;[1/2]
                                    		ret			;[4]
                                    
                                    
                                    
                                    ;*******************************************
                                    ;** Host request to send... receive data
                                    ;**
                                    ;*******************************************
                                    RxCommand:	LDD	ZL,Y+PS2NextA+0-RAMSTRT
                                    		LDD	ZH,Y+PS2NextA+1-RAMSTRT
                                    		mov	R16,Zl
                                    		or	R16,ZH
                                    		breq	NewCommand
                                    	ijmp				;ha nem uj, akkor ugras a vegrehajtasra
                                    
                                    NewCommand:	rcall	RxStream		;Read data R1, C=1 hiba, R17 hibakod
                                    		brcc	RxComNoErr
                                    
                                    ReqResend:	LDD	R16,Y+PS2Flag-RAMSTRT	;Host read error Resend needed
                                    		ori	R16,0b00000100		
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    NoValidComm:   	ret
                                    
                                    RxComNoErr:	ldi	ZL,Low(2*ComTab)	;uj parancs jott
                                    		ldi	ZH,High(2*ComTab)       		
                                    RxCommLoop:	lpm
                                    		tst	R0			;ha a tabla vege es nincs parancs kihagyjuk
                                    		breq	NoValidComm
                                    		cp	R0,R1		
                                    		breq	HitComm
                                    		adiw	ZL,2*(ComNex-ComTab)	;kovetkezo parancs
                                    		rjmp	RxCommLoop
                                    
                                    HitComm:	adiw	ZL,2			;pointerre mutat
                                    		lpm	
                                    		mov	R1,R0			;low byte
                                    		adiw	ZL,1
                                    		lpm
                                    		mov	ZH,R0			;hi byte
                                    		mov	ZL,R1
                                    		ijmp				;ugras a parancs vegrehajtasara
                                    
                                    ComTab:		.dw	0xED,STATUS_IND	;Turns on/off LEDs
                                    ComNex:		.dw	0xEE,ECHO	;Echo
                                    		.dw	0xF0,ALT_SCAN	;Set Scan Code Set
                                    		.dw	0xF3,TYPE_RATE	;Set repeat rate 
                                    		.dw	0xF4,KEN	;Enables keysacnning
                                    		.dw	0xF5,KDIS	;Disable keyscanning
                                    		.dw	0xF6,SET_DEF	;Set Default Value
                                    		.dw	0xF7,ALL_TYPE	;Set all keys - Typematic
                                    		.dw	0xF8,ALL_BREAK	;Set all keys - Make/Break
                                    		.dw	0xF9,ALL_MAKE	;Set all keys - Make
                                    		.dw	0xFA,ALL_MTB	;Set all keys - Typematic/Make/Break
                                    		.dw	0xFB,KEY_TYPE	;Set ket type - Typematic
                                    		.dw	0xFC,KEY_BREAK	;Set ket type - Make/Break
                                    		.dw	0xFD,KEY_MAKE	;Set ket type - Make
                                    		.dw	0xFE,RESEND	;Resend
                                    		.dw	0xFF,KRES	;Reset Command
                                    		.dw	0xF2,READID	;Read ID Command
                                    		.dw	0x00		;ez az utolso sor!
                                    
                                    
                                    
                                    
                                    Read_Data:	rcall	RxStream		;Read data R1, C=1 hiba, R17 hibakod
                                    		brcs	RD_Err
                                    		ret
                                    RD_Err:		LDD	R16,Y+PS2Flag-RAMSTRT	;Host read error Resend needed
                                    		ori	R16,0b00000100		
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		sec
                                    	   	ret
                                    
                                    
                                    ;******************************************************************************
                                    ;* C O M M A N D S   from host
                                    ;*
                                    ;******************************************************************************
                                    ;*Set/reset status indicators. A '1' bit turns the indicator ON.
                                    ;*	0. Scrollock,LED0 Green
                                    ;*	1. Numlock,  LED0 Red
                                    ;*	2. Capslock, LED1 Green
                                    ;*	3. 	     LED1 Red
                                    ;*	4. 	     LED2 Green
                                    ;*	5. 	     LED2 Red
                                    ;*	6. =1 Flash
                                    ;*	7. =0  
                                    ;*******************************************************
                                    STATUS_IND:	ldi	ZL,Low(StatInd1)
                                    		ldi	ZH,High(StatInd1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK & Parameter bit flag active
                                    		ori	R16,0b00001001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    StatInd1:	rcall	Read_Data
                                    		brcc	SatInd2
                                    		ret
                                    SatInd2:	mov	R16,R1
                                    		andi	R16,0b01000000			;flash bit active?
                                    		ldi	R16,0b00111111
                                    		breq	noflash		
                                    		and	R16,R1
                                    		STD	Y+StatLEDs+1-RAMSTRT,R16
                                    		rjmp	SatInd3
                                    noflash:	and	R16,R1
                                    		STD	Y+StatLEDs+0-RAMSTRT,R16
                                    SatInd3:	LDD	R16,Y+PS2Flag-RAMSTRT
                                    		andi	R16,0b11110111			;parameter renben megjott, torolve a bit
                                    		ori	R16,0b00000001			;ACK kuldes kell
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		rcall	Puts_LEDs			;uj led allapot kikuldese
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    ECHO:		ldi	ZL,Low(Echo1)
                                    		ldi	ZH,High(Echo1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		ret
                                    Echo1:		ldi	R16,0xEE			;Echo valasz a parancsra
                                    		mov	R1,R16
                                    		rcall	SendByte			;Send
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    
                                    ALT_SCAN:	ldi	ZL,Low(Altscan1)
                                    		ldi	ZH,High(Altscan1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK & Parameter bit flag active
                                    		ori	R16,0b00001001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    Altscan1:	rcall	Read_Data
                                    		brcc	Altscan2
                                    		ret
                                    Altscan2:	LDD	R16,Y+PS2Flag-RAMSTRT
                                    		andi	R16,0b11110111			;parameter renben megjott, torolve a bit
                                    		ori	R16,0b00000001			;ACK kuldes kell
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    
                                    		mov	R16,R1				;parameter byte
                                    		andi	R16,3				;csak az alo 2 bit kell
                                    		cpi	R16,0
                                    		breq	Lekerdezes
                                    		ldd	R17,Y+Flag1-RAMSTRT
                                    		andi	R17,0b11111100			;scan mode maskolasa 
                                    		or	R17,R16
                                    		STD	Y+Flag1-RAMSTRT,R17		;uj scan mode mentese
                                    		rjmp	EndBack
                                    
                                    Lekerdezes:	ldi	ZL,Low(Scanlek)
                                    		ldi	ZH,High(Scanlek)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		ret	
                                    
                                    Scanlek:	ldd	R16,Y+Flag1-RAMSTRT
                                    		andi	R16,0b00000011			;scan mode maskolasa 
                                    		inc	R16				;igy lesz 1,2,3 kodtabla
                                    		mov	R1,R16
                                    		rcall	SendByte			;Send scan tab kod
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    TYPE_RATE:	ldi	ZL,Low(TYPE_RATE1)
                                    		ldi	ZH,High(TYPE_RATE1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK & Parameter bit flag active
                                    		ori	R16,0b00001001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    TYPE_RATE1:	rcall	Read_Data
                                    		brcc	TR1
                                    		ret					;ha hiba volt: request to resend
                                    TR1:		mov	R16,R1				;Bit 7 is unimplemented. 
                                    		andi	R16,0b00011111			;Bits 6:5 - Repeat Delay
                                    		rcall	SetWait				;Bits 4:0 - Repeat Rate
                                    		mov	R16,R1
                                    		swap	R16
                                    		andi	R16,0b00000011
                                    		rcall	SetRep
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    
                                    KEN:		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    	;ide jon a enables code
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    
                                    
                                    KDIS:		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    	;ide jon disables code
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    
                                    SET_DEF:	LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		rcall	Scan_Init			;Default Scantable
                                    		rjmp	EndBack
                                    
                                    
                                    ;*******************************************************
                                    
                                    ALL_TYPE:	LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    	;ide jon a set code
                                    		rjmp	EndBack
                                    ;*******************************************************
                                    
                                    ALL_BREAK:	LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    	;ide jon a set code
                                    		rjmp	EndBack
                                    ;*******************************************************
                                    
                                    ALL_MAKE:	LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    	;ide jon a set code
                                    		rjmp	EndBack
                                    ;*******************************************************
                                    
                                    ALL_MTB:	LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    	;ide jon a set code
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    KEY_TYPE:	ldi	ZL,Low(Ktype1)
                                    		ldi	ZH,High(Ktype1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK & Parameter bit flag active
                                    		ori	R16,0b00001001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    Ktype1:	rcall	Read_Data
                                    		brcc	Ktype2
                                    		ret
                                    Ktype2:	mov	R16,R1				;parameter byte
                                    
                                    
                                    	;ide jon az feldolgozas!!
                                    
                                    		LDD	R16,Y+PS2Flag-RAMSTRT
                                    		andi	R16,0b11110111			;parameter renben megjott, torolve a bit
                                    		ori	R16,0b00000001			;ACK kuldes kell
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    KEY_BREAK:	ldi	ZL,Low(Kbreak1)
                                    		ldi	ZH,High(Kbreak1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK & Parameter bit flag active
                                    		ori	R16,0b00001001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    Kbreak1:	rcall	Read_Data
                                    		brcc	Kbreak2
                                    		ret
                                    Kbreak2:	mov	R16,R1				;parameter byte
                                    
                                    
                                    	;ide jon a feldolgozas!!
                                    
                                    		LDD	R16,Y+PS2Flag-RAMSTRT
                                    		andi	R16,0b11110111			;parameter renben megjott, torolve a bit
                                    		ori	R16,0b00000001			;ACK kuldes kell
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		rjmp	EndBack
                                    
                                    ;*******************************************************
                                    KEY_MAKE:	ldi	ZL,Low(Kmake1)
                                    		ldi	ZH,High(Kmake1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK & Parameter bit flag active
                                    		ori	R16,0b00001001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    Kmake1:	rcall	Read_Data
                                    		brcc	Kmake2
                                    		ret
                                    Kmake2:	mov	R16,R1				;parameter byte
                                    
                                    
                                    	;ide jon a feldolgozas!!
                                    
                                    		LDD	R16,Y+PS2Flag-RAMSTRT
                                    		andi	R16,0b11110111			;parameter renben megjott, torolve a bit
                                    		ori	R16,0b00000001			;ACK kuldes kell
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		rjmp	EndBack
                                    
                                    
                                    ;*******************************************************
                                    RESEND:		LDD	R16,Y+PS2Flag-RAMSTRT		;Resend last data!
                                    		ori	R16,0b00000010
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		rjmp	EndBack
                                    		
                                    ;*******************************************************
                                    ;* Keyboard RESET
                                    ;*******************************************************
                                    KRES:		ldi	ZL,Low(KRES1)
                                    		ldi	ZH,High(KRES1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    KRES1:		ldi	R16,0xAA			;Basic Assurance Test Result	
                                    		mov	R1,R16
                                    		rcall	SendByte			;Send Result of BAT
                                    		rcall	Scan_Init			;Re-init Scantable
                                    		ldi	R16,0
                                    		STD	Y+PS2Flag-RAMSTRT,R16 		;Calears Flags
                                    		STD	Y+StatLEDs+0-RAMSTRT,R16	;LED nem villagit
                                    		STD	Y+StatLEDs+1-RAMSTRT,R16	;LED nem villog
                                    		rjmp	EndBack
                                    
                                    
                                    ;*******************************************************
                                    READID:		ldi	ZL,Low(READID1)
                                    		ldi	ZH,High(READID1)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    		LDD	R16,Y+PS2Flag-RAMSTRT		;Make ACK flag active
                                    		ori	R16,0b00000001
                                    		STD	Y+PS2Flag-RAMSTRT,R16
                                    		ret
                                    READID1:	ldi	ZL,Low(READID2)
                                    		ldi	ZH,High(READID2)
                                    		STD	Y+PS2NextA+0-RAMSTRT,ZL
                                    		STD	Y+PS2NextA+1-RAMSTRT,ZH
                                    	ldi	R16,0xD0			;Eredeti: 0xAB
                                    		mov	R1,R16
                                    		rcall	SendByte			;Send Result of BAT
                                    		ret
                                    READID2: 	ldi	R16,0xDE			;Eredeti: 0x83
                                    		mov	R1,R16
                                    		rcall	SendByte
                                    EndBack:      	ldi	R16,0
                                    		STD	Y+PS2NextA+0-RAMSTRT,R16
                                    		STD	Y+PS2NextA+1-RAMSTRT,R16
                                    		ret
                                    ;*******************************************************
                                    
                                    ;**************************************************************************************
                                    .ESEG
                                    
                                    ;**************************************
                                    ;* Scan kod tabla Scan1 & Scan2 kodokkal
                                    ;*
                                    ;Keys allapota
                                    		;7. = 1 Enabled
                                    		;6. = 1 Ismetleses mod (Typematic)
                                    		;5. = 1 Break mode (felengedeskor scan kod kell)
                                    		;4. = 1 Make mode (lenyomaskor scan kod kell)
                                    		;3. = 1 Utolso ervenyes allapot
                                    		;2:1 = > counter prellegesmentesiteshez
                                    		;0. = 1 Utolso allapot
                                    		;	
                                    		; 6..4 = 1 Typematic/make/break mode
                                    		; 5..4 = 1 Make/break mode
                                    		; 4    = 1 Olny Make mode  
                                    
                                    
                                    MatrixTab:	.db	0xF0	;0. P
                                    		.db	0xF0	;1. L
                                    		.db	0xF0	;2. E
                                    		.db	0xF0	;3. A
                                    		.db	0xF0	;4. B
                                    		.db	0xF0	;5. %
                                    		.db	0xF0	;6. Space Bar
                                    		.db	0xF0	;7. 7
                                    		.db	0xF0	;8. Menu Up
                                    		.db	0xF0	;9. Menu Ok
                                    ;10.
                                    		.db	0xB0	;10. +C
                                    		.db	0xB0	;11. +Z
                                    		.db	0xB0	;12. +Y
                                    		.db	0xB0	;13. Used
                                    		.db	0xF0	;14. 9
                                    		.db	0xF0	;15. 8
                                    		.db	0xF0	;16. D
                                    		.db	0xF0	;17. H
                                    		.db	0xF0	;18. R
                                    		.db	0xF0	;19. I
                                    ;20.
                                    		.db	0xF0	;20. J
                                    		.db	0xF0	;21. K
                                    		.db	0xF0	;22. O
                                    		.db	0xF0	;23. 4
                                    		.db	0xF0	;24. Menu
                                    		.db	0xF0	;25. Menu Cancel
                                    		.db	0xB0	;26. Used
                                    		.db	0xB0	;27. +X
                                    		.db	0xB0	;28. Gyorsmenet
                                    		.db	0xB0	;29. -X
                                    ;30.
                                    		.db	0xF0	;30. 6
                                    		.db	0xF0	;31. 5
                                    		.db	0xF0	;32. N
                                    		.db	0xF0	;33. G
                                    		.db	0xF0	;34. M
                                    		.db	0xF0	;35. F
                                    		.db	0xF0	;36. S
                                    		.db	0xF0	;37. T
                                    		.db	0xF0	;38. Q
                                    		.db	0xF0	;39. 1
                                    ;40.
                                    		.db	0xF0	;40. Menu Down
                                    		.db	0xF0	;41. MODE
                                    		.db	0xB0	;42. -C
                                    		.db	0xB0	;43. Used
                                    		.db	0xB0	;44. -Y
                                    		.db	0xB0	;45. -Z
                                    		.db	0xF0	;46. 3
                                    		.db	0xF0	;47. 2
                                    		.db	0xF0	;48. X
                                    		.db	0xF0	;49. Y
                                    ;50.
                                    		.db	0xF0	;50. Z
                                    		.db	0xF0	;51. U
                                    		.db	0xF0	;52. V
                                    		.db	0xF0	;53. W
                                    		.db	0xF0	;54. C
                                    		.db	0xF0	;55. .
                                    		.db	0xF0	;56. End
                                    		.db	0xF0	;57. Up Arrow
                                    		.db	0xF0	;58. Home
                                    		.db	0xB0	;59. Rotate Right
                                    ;60.
                                    		.db	0xB0	;60. Rotate stop
                                    		.db	0xB0	;61. Rotate Left
                                    		.db	0xF0	;62. 0
                                    		.db	0xF0	;63. -
                                    		.db	0xF0	;64. S1
                                    		.db	0xF0	;65. S2
                                    		.db	0xF0	;66. S3
                                    		.db	0xF0	;67. S4
                                    		.db	0xF0	;68. S5
                                    		.db	0xB0	;69. START
                                    ;70.
                                    		.db	0xB0	;70. STOP
                                    		.db	0xF0	;71. DEL
                                    		.db	0xF0	;72. R Arrow
                                    		.db	0xF0	;73. Dn Arrow
                                    		.db	0xF0	;74. L Arrow
                                    		.db	0xF0	;75. ENTER
                                    		.db	0xF0	;76. CTRL
                                    		.db	0xF0	;77. SHIFT
                                    		.db	0xF0	;78. Backspace
                                    		.db	0xF0	;79. INS
                                    ;80.
                                    		.db	0xB0	;80. Yac-16[0]
                                    		.db	0xB0	;81. Yac-16[1]
                                    		.db	0xB0	;82. Yac-16[2]
                                    		.db	0xB0	;83. Yac-16[3]
                                    		.db	0xB0	;84. Yac-16[4]
                                    		.db	0xB0	;85. Yac-16[5]
                                    		.db	0xB0	;86. Yac-16[6]
                                    		.db	0xB0	;87. Yac-16[7]
                                    		.db	0xB0	;88. Yac-16[8]
                                    		.db	0xB0	;89. Yac-16[9]
                                    ;90.
                                    		.db	0xB0	;90. Yac-16[10]
                                    		.db	0xB0	;91. Yac-16[11]
                                    		.db	0xB0	;92. Yac-16[12]
                                    		.db	0xB0	;93. Yac-16[13]
                                    		.db	0xB0	;94. Yac-16[14]
                                    		.db	0xB0	;95. Yac-16[15]
                                    		.db	0xB0	;96. Yac-11[0]
                                    		.db	0xB0	;97. Yac-11[1]
                                    		.db	0xB0	;98. Yac-11[2]
                                    		.db	0xB0	;99. Yac-11[3]
                                    ;100
                                    		.db	0xB0	;100. Yac-11[4]
                                    		.db	0xB0	;101. Yac-11[5]
                                    		.db	0xB0	;102. Yac-11[6]
                                    		.db	0xB0	;103. Yac-11[7]
                                    		.db	0xB0	;104. Yac-11[8]
                                    		.db	0xB0	;105. Yac-11[9]
                                    		.db	0xB0	;106. Yac-11[10]
                                    		.db	0xB0	;107. 3 allasu kapcs1A
                                    		.db	0xB0	;108. 3 allasu kapcs1B
                                    		.db	0xB0	;109. 3 allasu kapcs2A
                                    ;110
                                    		.db	0xB0	;110. 3 allasu kapcs2B
                                    		.db	0xF0	;111. Not used
                                    		.db	0xB0	;112. Yac-12[0]
                                    		.db	0xB0	;113. Yac-12[1]
                                    		.db	0xB0	;114. Yac-12[2]
                                    		.db	0xB0	;115. Yac-12[3]
                                    		.db	0xB0	;116. Yac-12[4]
                                    		.db	0xB0	;117. Yac-12[5]
                                    		.db	0xB0	;118. Yac-12[6]
                                    		.db	0xB0	;119. Yac-12[7]
                                    		.db	0xB0	;120. Yac-12[8]
                                    		.db	0xB0	;121. Yac-12[9]
                                    		.db	0xB0	;122. Yac-12[10]
                                    		.db	0xB0	;123. Yac-12[11]
                                    		.db	0xF0	;124. Not used
                                    		.db	0xF0	;125. Not used
                                    		.db	0xF0	;126. Not used
                                    		.db	0xF0	;127. Not used
                                    DeleayT:	.db	0x01,0x0C		;Set 500ms rep., 10 char/s
                                    
                                    
                                    ;**************************************************************************************
                                    .CSEG
                                    
                                    Scan_Init:	ldi	XL,Low(Matrix)
                                    		ldi	XH,High(Matrix)
                                    		ldi	ZL,Low(MatrixTab)
                                    		ldi	ZH,High(MatrixTab)
                                    		out 	EEARH,ZH		;output address high for 8515
                                    		out	EEARL,ZL		;output address low for 8515
                                    		ldi	R17,KeyCount
                                    GetMatrix:	rcall	EERead_seq		;get EEPROM data
                                    		ST	X+,R0
                                    		dec	R17
                                    		brne	GetMatrix		;Scan filter torlese
                                    		ldi	ZL,Low(DeleayT)
                                    		ldi	ZH,High(DeleayT)
                                    		out 	EEARH,ZH
                                    		out	EEARL,ZL
                                    		rcall	EERead_seq		;get Dleay
                                    mov	R16,R0
                                    		rcall	SetWait
                                    		rcall	EERead_seq		;get Rep.Time
                                    mov	R16,R0
                                    		rcall	SetRep
                                    		clr	R16
                                    		STD	Y+ParamErr-RAMSTRT,R16 
                                    		ret
                                    
                                    
                                    ;**********************************
                                    ;* Beolvas a Keymatrixrol egy teljes matrixot a memoriaba
                                    ;* 
                                    
                                    ScanMatrix:	CBI	Row01234,Row0
                                    
                                    		ldi	ZL,Low(Matrix)
                                    		ldi	ZH,High(Matrix)		;a billentyu parametertabla cime
                                    
                                    
                                    Row0w:		SBIC	Row01234-2,Row0		;var mig a pin fizikailag nem lesz alacsony
                                    		 rjmp Row0w
                                    		IN	R0,DTLo_PORT-1		;Lower 8 bit 
                                    rcall	HalfRow
                                    		IN	R0,DTHi_PORT-1		;Higher 8 bit 
                                    		SBI	Row01234,Row0
                                    		CBI	Row01234,Row1
                                                    rcall	HalfRow
                                    Row0u:		SBIS	Row01234-2,Row0		;var mig a pin fizikailag nem lesz magas
                                    		 rjmp Row0u
                                    
                                    
                                    Row1w:		SBIC	Row01234-2,Row1
                                    		 rjmp Row1w
                                    		IN	R0,DTLo_PORT-1		;Lower 8 bit 
                                                    rcall	HalfRow
                                    		IN	R0,DTHi_PORT-1		;Higher 8 bit 
                                    		SBI	Row01234,Row1
                                    		CBI	Row01234,Row2
                                                    rcall	HalfRow
                                    Row1u:		SBIS	Row01234-2,Row1
                                    		 rjmp Row1u
                                    
                                    
                                    
                                    Row2w:		SBIC	Row01234-2,Row2
                                    		 rjmp Row2w
                                    		IN	R0,DTLo_PORT-1		;Lower 8 bit 
                                                    rcall	HalfRow
                                    		IN	R0,DTHi_PORT-1		;Higher 8 bit 
                                    		SBI	Row01234,Row2
                                    		CBI	Row01234,Row3
                                                    rcall	HalfRow
                                    Row2u:		SBIS	Row01234-2,Row2
                                    		 rjmp Row2u
                                    
                                    
                                    Row3w:		SBIC	Row01234-2,Row3
                                    		 rjmp Row3w
                                    		IN	R0,DTLo_PORT-1		;Lower 8 bit 
                                                    rcall	HalfRow
                                    		IN	R0,DTHi_PORT-1		;Higher 8 bit 
                                    		SBI	Row01234,Row3
                                    		CBI	Row01234,Row4
                                                    rcall	HalfRow
                                    Row3u:		SBIS	Row01234-2,Row3
                                    		 rjmp Row3u
                                    
                                    
                                    
                                    Row4w:		SBIC	Row01234-2,Row4
                                    		 rjmp Row4w
                                    		IN	R0,DTLo_PORT-1		;Lower 8 bit 
                                                    rcall	HalfRow
                                    		IN	R0,DTHi_PORT-1		;Higher 8 bit 
                                    		SBI	Row01234,Row4
                                    		CBI	Row567,Row5
                                                    rcall	HalfRow
                                    Row4u:		SBIS	Row01234-2,Row4
                                    		 rjmp Row4u
                                    
                                    
                                    Row5w:		SBIC	Row567-2,Row5
                                    		 rjmp Row5w
                                    		IN	R0,DTLo_PORT-1		;Lower 8 bit 
                                                    rcall	HalfRow
                                    		IN	R0,DTHi_PORT-1		;Higher 8 bit 
                                    		SBI	Row567,Row5
                                    		CBI	Row567,Row6
                                                    rcall	HalfRow
                                    Row5u:		SBIS	Row567-2,Row5
                                    		 rjmp Row5u
                                    
                                    
                                    
                                    Row6w:		SBIC	Row567-2,Row6
                                    		 rjmp Row6w
                                    		IN	R0,DTLo_PORT-1		;Lower 8 bit 
                                                    rcall	HalfRow
                                    		IN	R0,DTHi_PORT-1		;Higher 8 bit 
                                    		SBI	Row567,Row6
                                    		CBI	Row567,Row7
                                                    rcall	HalfRow
                                    Row6u:		SBIS	Row567-2,Row6
                                    		 rjmp Row6u
                                    
                                    
                                    Row7w:		SBIC	Row567-2,Row7
                                    		 rjmp Row7w
                                    		IN	R0,DTLo_PORT-1		;Lower 8 bit 
                                                    rcall	HalfRow
                                    		IN	R0,DTHi_PORT-1		;Higher 8 bit 
                                    		SBI	Row567,Row7
                                                    rcall	HalfRow
                                    Row7u:		SBIS	Row567-2,Row7
                                    		 rjmp Row7u
                                    
                                    		ret				;filter bufferben a beolvasott matrix				
                                    
                                    
                                    ;*****************************
                                    ;xx. sor feldolgozasa
                                    
                                    HalfRow:	com	R0			;inv, ekkor 0 = nincs lenyomas, 1 = lenyomva
                                    		ldi	R16,8
                                    
                                    KeyCycl:	ld	R1,Z			;R1-ban a bill. parameter
                                    		mov	R19,R1
                                    		ror	R19
                                    		andi	R19,3			;a szamlalo allapota
                                    		cpi	R19,3
                                    		breq	kc1
                                    		inc	R19			;szamlalo+1
                                    kc1:		mov	R17,R1
                                    		andi	R17,1			;0. bit az elozo allapot
                                    		mov	R18,R0
                                    		andi	R18,1			;0. bit mostani allapot
                                    		eor	R17,R18			;azonos?
                                    		breq	kc2			;ha igen ugras
                                    		clr	R19			;szamlalo torlese, ha nem azonos
                                    kc2:		ror	R0
                                    		rol	R19
                                    		andi	R19,7			;csak a szamlalot es az uj allapotbit kell
                                    		mov	R17,R1
                                    		andi	R17,0b11111000		;a parameter byte also 3 bitje nem kell
                                    		or	R19,R17			;counter es uj allapot bemasolasa
                                    		st	Z+,R19
                                    
                                    		dec	R16
                                    		brne	KeyCycl
                                    		ret
                                    
                                    
                                    
                                    ;*****************************************************
                                    ;* Eloallitja a scankodokat a bill.matrix allapota alapjan
                                    ;*
                                    ;*****************************************************
                                    MakeScanC:	ldi	ZL,Low(2*ScanTabl)
                                    		ldi	ZH,High(2*ScanTabl)		;Scancode table
                                    		ldi	XL,Low(Matrix)
                                    		ldi	XH,High(Matrix)			;a billentyu parametertabla cime