;  4                              5678901234567
 
; ┌─────────────────────────────────────────────┐
 
; │Detecting mouse...                           │03
 
; │FF FA AA 00                                  │
 
; │Customization...                             │
 
; │F3 FA C8 FA F3 FA 64 FA F3 FA 50 FA          │
 
; │F2 FA 03                                     │
 
; │E8 FA 02 FA E6 FA F3 FA 64 FA F4 FA          │
 
; │Let's go!                                    │
 
; │08 00 00 00                    ┌───────────┐ │10
 
; │                               │███        │ │11
 
; │                               │█L█  M   R │ │12
 
; │                               │███        │ │13
 
; │                               │           │ │14
 
; │                               │ Wheel = 1 │ │15
 
; │                               │           │ │16
 
; │                               │ X  =  123 │ │17
 
; │                               │ Y  =   58 │ │18
 
; │                               └───────────┘ │
 
; └─────────────────────────────────────────────┘
 
;  4                              5678901234567
 
;
 
;--------------------------------------
 
;
 
.EQU    TPSM_BYTE1      =0
 
.EQU    TPSM_BYTE2      =1
 
.EQU    TPSM_BYTE3      =2
 
.EQU    TPSM_BYTE4      =3
 
.EQU    TPSM_X0         =4
 
.EQU    TPSM_X1         =5
 
.EQU    TPSM_Y          =6
 
.EQU    TPSM_Z          =7
 
.EQU    TPSM_BTN        =8
 
.EQU    TPSM_ID         =9
 
;
 
;--------------------------------------
 
;
 
.EQU    PS2M_BIT_PARITY =0
 
.EQU    PS2M_BIT_ACKBIT =1      ; принят ACK-бит
 
.EQU    PS2M_BIT_TX     =7      ; передача
 
.EQU    PS2M_BIT_READY  =7
 
 
 
.MACRO  PS2M_DATALINE_UP
 
        CBI     DDRD,7
 
        SBI     PORTD,7
 
.ENDMACRO
 
 
 
.MACRO  PS2M_DATALINE_DOWN
 
        CBI     PORTD,7
 
        SBI     DDRD,7
 
.ENDMACRO
 
 
 
.MACRO  PS2M_CLOCKLINE_UP
 
        CBI     DDRE,5
 
        SBI     PORTE,5
 
.ENDMACRO
 
 
 
.MACRO  PS2M_CLOCKLINE_DOWN
 
        CBI     PORTE,5
 
        SBI     DDRE,5
 
.ENDMACRO
 
;
 
;--------------------------------------
 
;
 
.DSEG
 
PS2M_BIT_COUNT: .BYTE   1
 
PS2M_DATA:      .BYTE   1
 
PS2M_RAW_READY: .BYTE   1
 
PS2M_RAW_CODE:  .BYTE   1
 
PS2M_FLAGS:     .BYTE   1
 
PS2M_TIMEOUT:   .BYTE   2
 
.CSEG
 
;
 
;--------------------------------------
 
;
 
MSG_TPSM_1:
 
        .DB     $16,37,15,"Wheel ="
 
MSG_TPSM_2:
 
        .DB     $16,37,12,"L   M   R"
 
        .DB     $16,37,17,"X  =",$16,37,18,"Y  =",0,0
 
MSG_TPSM_3:
 
        .DB     $16, 4,10,$15,$DF,0
 
;
 
;--------------------------------------
 
;
 
WIND_T_PS2M_1:
 
        .DB     3,2,47,19,$DF,$01
 
WIND_T_PS2M_2:
 
        .DB     9,10,34,4,$AF,$01
 
WIND_T_PS2M_3:
 
        .DB     35,10,13,10,$DF,$00
 
;
 
;--------------------------------------
 
;
 
EXT_INT5:
 
        PUSH    TEMP
 
        IN      TEMP,SREG
 
        PUSH    TEMP
 
        PUSH    COUNT
 
        PUSH    DATA
 
        LDS     DATA,PS2M_DATA
 
        LDS     COUNT,PS2M_BIT_COUNT
 
        LDS     TEMP,PS2M_FLAGS
 
        SBRC    TEMP,PS2M_BIT_TX
 
        RJMP    INT5TX_0
 
 
 
        CPI     COUNT,9
 
        BREQ    INT5RX9
 
        CPI     COUNT,10
 
        BRCC    INT5RXS
 
        TST     COUNT
 
        BRNE    INT5RX1
 
;start bit
 
        SBIC    PIND,7   ; data line
 
        RJMP    INT5RX_CLR_D
 
        CBR     TEMP,(1<<PS2M_BIT_PARITY)
 
        INC     COUNT
 
        RJMP    INT5_EXIT
 
;data bits
 
INT5RX1:LSR     DATA
 
        SBIS    PIND,7   ; data line
 
        RJMP    INT5RX2
 
        ORI     DATA,0B10000000
 
        EOR     TEMP,ONE
 
INT5RX2:INC     COUNT
 
        RJMP    INT5_EXIT
 
;parity bit
 
INT5RX9:SBIC    PIND,7   ; data line
 
        EOR     TEMP,ONE
 
        SBRS    TEMP,PS2M_BIT_PARITY
 
        RJMP    INT5RX_CLR_D
 
        INC     COUNT
 
        RJMP    INT5_EXIT
 
;stop bit
 
INT5RXS:SBIS    PIND,7   ; data line
 
        RJMP    INT5RX_CLR_D
 
 
 
        STS     PS2M_RAW_READY,COUNT
 
        STS     PS2M_RAW_CODE,DATA
 
 
 
INT5RX_CLR_F:
 
        CLR     TEMP
 
INT5RX_CLR_D:
 
        CLR     DATA
 
        CLR     COUNT
 
        RJMP    INT5_EXIT
 
;-------
 
INT5TX_0:
 
        CPI     COUNT,9
 
        BREQ    INT5TX9
 
        CPI     COUNT,10
 
        BREQ    INT5TXS
 
        CPI     COUNT,11
 
        BRCC    INT5TXA
 
        TST     COUNT
 
        BRNE    INT5TX1
 
;start bit
 
        SBR     TEMP,(1<<PS2M_BIT_PARITY)
 
        INC     COUNT
 
        RJMP    INT5_EXIT
 
;data bits
 
INT5TX1:ROR     DATA
 
        BRCC    INT5TX2
 
        PS2M_DATALINE_UP
 
        EOR     TEMP,ONE
 
        INC     COUNT
 
        RJMP    INT5_EXIT
 
INT5TX2:PS2M_DATALINE_DOWN
 
        INC     COUNT
 
        RJMP    INT5_EXIT
 
;parity bit
 
INT5TX9:SBRC    TEMP,PS2M_BIT_PARITY
 
        RJMP    INT5TXP
 
        PS2M_DATALINE_DOWN
 
        INC     COUNT
 
        RJMP    INT5_EXIT
 
INT5TXP:PS2M_DATALINE_UP
 
        INC     COUNT
 
        RJMP    INT5_EXIT
 
;stop bit
 
INT5TXS:PS2M_DATALINE_UP
 
        INC     COUNT
 
        RJMP    INT5_EXIT
 
;ack-bit
 
INT5TXA:CLR     TEMP
 
        SBIS    PIND,7   ; data line
 
        LDI     TEMP,(1<<PS2M_BIT_ACKBIT)
 
        CLR     DATA
 
        CLR     COUNT
 
 
 
INT5_EXIT:
 
        STS     PS2M_BIT_COUNT,COUNT
 
        STS     PS2M_DATA,DATA
 
        STS     PS2M_FLAGS,TEMP
 
        POP     DATA
 
        POP     COUNT
 
        POP     TEMP
 
        OUT     SREG,TEMP
 
        POP     TEMP
 
        RETI
 
;
 
;--------------------------------------
 
;
 
TESTMOUSE:
 
        ANDI    FLAGS1,0B11111011
 
        ORI     FLAGS1,0B00000010
 
        LDIZ    MLMSG_MOUSE_TEST*2
 
        CALL    PRINTMLSTR
 
        ORI     FLAGS1,0B00000100
 
 
 
        GETMEM  10
 
 
 
T_PSM_RESTART:
 
        CLI
 
        PS2M_DATALINE_UP
 
        PS2M_CLOCKLINE_UP
 
        IN      TEMP,EICRB
 
        ORI     TEMP,(1<<ISC51)|(0<<ISC50)
 
        OUT     EICRB,TEMP
 
        IN      TEMP,EIMSK
 
        ORI     TEMP,(1<<INT5)
 
        OUT     EIMSK,TEMP
 
        STS     PS2M_FLAGS,NULL
 
        STS     PS2M_BIT_COUNT,NULL
 
        STS     PS2M_RAW_READY,NULL
 
        SEI
 
 
 
        LDIZ    WIND_T_PS2M_1*2
 
        CALL    WINDOW
 
        LDI     XL,4
 
        LDI     XH,3
 
        RCALL   SCR_SET_CURSOR
 
        RCALL   UART_CRLF
 
        LDIZ    MLMSG_MOUSE_DETECT*2
 
        CALL    PRINTMLSTR
 
        LDI     XL,4
 
        LDI     XH,4
 
        RCALL   SCR_SET_CURSOR
 
        RCALL   UART_CRLF
 
;
 
;
 
T_PSM_DETECT_2:
 
        STS     PS2M_RAW_READY,NULL
 
        LDIZ    PS2M_TIMEOUT
 
        LDIW    2
 
        CALL    SET_TIMEOUT_MS
 
T_PSM_DETECT_1:
 
        LDS     TEMP,PS2M_RAW_READY
 
        TST     TEMP
 
        BRNE    T_PSM_DETECT_2
 
        LDIZ    PS2M_TIMEOUT
 
        CALL    CHECK_TIMEOUT_MS
 
        BRCC    T_PSM_DETECT_1
 
 
 
        LDI     DATA,$FF
 
        RCALL   HEXBYTE_FOR_DUMP
 
        RCALL   PS2M_SEND_BYTE
 
        BREQ    T_PSM_DETECT_FAIL0_A
 
        RCALL   PS2M_RECEIVE_BYTE
 
        BREQ    T_PSM_DETECT_FAIL0_A
 
        RCALL   HEXBYTE_FOR_DUMP
 
        CPI     DATA,$FA
 
        BRNE    T_PSM_DETECT_FAIL0_A
 
 
 
        STS     PS2M_RAW_READY,NULL
 
        LDIZ    PS2M_TIMEOUT
 
        LDIW    1000
 
        CALL    SET_TIMEOUT_MS
 
T_PSM_DETECT_4:
 
        LDS     TEMP,PS2M_RAW_READY
 
        TST     TEMP
 
        BRNE    T_PSM_DETECT_5
 
        LDIZ    PS2M_TIMEOUT
 
        CALL    CHECK_TIMEOUT_MS
 
        BRCC    T_PSM_DETECT_4
 
T_PSM_DETECT_FAIL2_A:
 
        RJMP    T_PSM_DETECT_FAIL2
 
;
 
T_PSM_DETECT_FAIL0_A:
 
        RJMP    T_PSM_DETECT_FAIL0
 
;
 
T_PSM_DETECT_5:
 
        LDS     DATA,PS2M_RAW_CODE
 
        RCALL   HEXBYTE_FOR_DUMP
 
        CPI     DATA,$AA
 
        BRNE    T_PSM_DETECT_FAIL2_A
 
        LDI     DATA,$00
 
        RCALL   T_PSM_DETECT_RECEIVE
 
; - - - - - - - - - - - - - - - - - - -
 
        LDI     XL,4
 
        LDI     XH,5
 
        RCALL   SCR_SET_CURSOR
 
        RCALL   UART_CRLF
 
        LDIZ    MLMSG_MOUSE_SETUP*2
 
        CALL    PRINTMLSTR
 
        LDI     XL,4
 
        LDI     XH,6
 
        RCALL   SCR_SET_CURSOR
 
        RCALL   UART_CRLF
 
 
 
        LDI     DATA,$F3
 
        RCALL   T_PSM_DETECT_SEND
 
        LDI     DATA,200
 
        RCALL   T_PSM_DETECT_SEND
 
 
 
        LDI     DATA,$F3
 
        RCALL   T_PSM_DETECT_SEND
 
        LDI     DATA,100
 
        RCALL   T_PSM_DETECT_SEND
 
 
 
        LDI     DATA,$F3
 
        RCALL   T_PSM_DETECT_SEND
 
        LDI     DATA,80
 
        RCALL   T_PSM_DETECT_SEND
 
 
 
        LDI     XL,4
 
        LDI     XH,7
 
        RCALL   SCR_SET_CURSOR
 
        RCALL   UART_CRLF
 
 
 
        LDI     DATA,$F2
 
        RCALL   T_PSM_DETECT_SEND
 
 
 
        STS     PS2M_RAW_READY,NULL
 
        LDIZ    PS2M_TIMEOUT
 
        LDIW    20
 
        CALL    SET_TIMEOUT_MS
 
T_PSM_DETECT_6:
 
        LDS     TEMP,PS2M_RAW_READY
 
        TST     TEMP
 
        BRNE    T_PSM_DETECT_7
 
        LDIZ    PS2M_TIMEOUT
 
        CALL    CHECK_TIMEOUT_MS
 
        BRCC    T_PSM_DETECT_6
 
        RJMP    T_PSM_DETECT_FAIL2
 
T_PSM_DETECT_7:
 
        LDS     DATA,PS2M_RAW_CODE
 
        STH     TPSM_ID,DATA
 
        RCALL   HEXBYTE_FOR_DUMP
 
        TST     DATA
 
        BREQ    T_PSM_DETECT_8
 
        CPI     DATA,3
 
        BREQ    T_PSM_DETECT_8
 
        RJMP    T_PSM_DETECT_FAIL2
 
 
 
T_PSM_DETECT_8:
 
        LDI     XL,4
 
        LDI     XH,8
 
        RCALL   SCR_SET_CURSOR
 
        RCALL   UART_CRLF
 
 
 
        LDI     DATA,$E8
 
        RCALL   T_PSM_DETECT_SEND
 
        LDI     DATA,$02
 
        RCALL   T_PSM_DETECT_SEND
 
 
 
        LDI     DATA,$E6
 
        RCALL   T_PSM_DETECT_SEND
 
 
 
        LDI     DATA,$F3
 
        RCALL   T_PSM_DETECT_SEND
 
        LDI     DATA,100
 
        RCALL   T_PSM_DETECT_SEND
 
 
 
        LDI     DATA,$F4
 
        RCALL   T_PSM_DETECT_SEND
 
 
 
        LDI     XL,4
 
        LDI     XH,9
 
        RCALL   SCR_SET_CURSOR
 
        RCALL   UART_CRLF
 
        LDIZ    MLMSG_MOUSE_LETSGO*2
 
        CALL    PRINTMLSTR
 
        RCALL   UART_CRLF
 
 
 
        RJMP    T_PSM_MAIN
 
;
 
;--------------------------------------
 
;
 
T_PSM_DETECT_SEND:
 
        RCALL   HEXBYTE_FOR_DUMP
 
        RCALL   PS2M_SEND_BYTE
 
        BREQ    T_PSM_DETECT_FAIL1
 
        RCALL   PS2M_RECEIVE_BYTE
 
        BREQ    T_PSM_DETECT_FAIL1
 
        RCALL   HEXBYTE_FOR_DUMP
 
        CPI     DATA,$FA
 
        BRNE    T_PSM_DETECT_FAIL1
 
        RET
 
;
 
;--------------------------------------
 
;
 
T_PSM_DETECT_RECEIVE:
 
        STH     TPSM_BYTE4,DATA         ; temporally
 
        RCALL   PS2M_RECEIVE_BYTE
 
        BREQ    T_PSM_DETECT_FAIL1
 
        RCALL   HEXBYTE_FOR_DUMP
 
        LDH     TEMP,TPSM_BYTE4         ; temporally
 
        CP      DATA,TEMP
 
        BRNE    T_PSM_DETECT_FAIL1
 
        RET
 
;
 
;--------------------------------------
 
;
 
T_PSM_DETECT_FAIL1:
 
        POPZ
 
T_PSM_DETECT_FAIL2:
 
        LDIZ    MLMSG_MOUSE_FAIL1*2
 
        RJMP    T_PSM_DETECT_FAILZ
 
 
 
T_PSM_DETECT_FAIL0:
 
        LDIZ    MLMSG_MOUSE_FAIL0*2
 
T_PSM_DETECT_FAILZ:
 
        PUSHZ
 
        RCALL   UART_CRLF
 
        LDIZ    WIND_T_PS2M_2*2
 
        CALL    WINDOW
 
        LDI     XL,10
 
        LDI     XH,11
 
        RCALL   SCR_SET_CURSOR
 
        POPZ
 
        CALL    PRINTMLSTR
 
        LDI     XL,10
 
        LDI     XH,12
 
        RCALL   SCR_SET_CURSOR
 
        LDIZ    MLMSG_MOUSE_RESTART*2
 
        CALL    PRINTMLSTR
 
 
 
T_PSM_WAITKEY:
 
        CALL    WAITKEY
 
        CPI     DATA,KEY_ESC
 
        BREQ    T_PSM_ESCAPE
 
        CPI     DATA,KEY_ENTER
 
        BRNE    T_PSM_WAITKEY
 
        RJMP    T_PSM_RESTART
 
 
 
T_PSM_ESCAPE:
 
        LDI     DATA,0B00000000
 
        MOV     INT6VECT,DATA
 
        LDI     TEMP,INT_CONTROL
 
        CALL    FPGA_REG
 
        CLR     DATA
 
        LDI     TEMP,SCR_MOUSE_TEMP
 
        RCALL   FPGA_REG
 
        CLR     DATA
 
        LDI     TEMP,SCR_MOUSE_X
 
        RCALL   FPGA_REG
 
        CLR     DATA
 
        LDI     TEMP,SCR_MOUSE_Y
 
        RCALL   FPGA_REG
 
        CLI
 
        PS2M_DATALINE_UP
 
        PS2M_CLOCKLINE_UP
 
        IN      TEMP,EIMSK
 
        CBR     TEMP,(1<<INT5)
 
        OUT     EIMSK,TEMP
 
        SEI
 
        ORI     FLAGS1,0B00000010
 
        FREEMEM 10
 
        RET
 
;
 
;--------------------------------------
 
;
 
T_PSM_MAIN:
 
        ANDI    FLAGS1,0B11111100
 
        LDI     DATA,0B00000010
 
        MOV     INT6VECT,DATA
 
        LDI     TEMP,INT_CONTROL
 
        CALL    FPGA_REG
 
 
 
        LDIZ    WIND_T_PS2M_3*2
 
        CALL    WINDOW
 
        LDIZ    MSG_TPSM_2*2
 
        LDH     TEMP,TPSM_ID
 
        TST     TEMP
 
        BREQ    T_PSM01
 
        LDIZ    MSG_TPSM_1*2
 
T_PSM01:RCALL   SCR_PRINTSTRZ
 
        LDI     TEMP,150
 
        STH     TPSM_X0,TEMP
 
        STH     TPSM_X1,NULL
 
        LDI     TEMP,120
 
        STH     TPSM_Y,TEMP
 
        STH     TPSM_Z,NULL
 
        STH     TPSM_BTN,NULL
 
 
 
        STS     PS2M_RAW_READY,NULL
 
 
 
T_PSM10:
 
        LDH     TEMP,TPSM_ID
 
        TST     TEMP
 
        BREQ    T_PSM11
 
        LDI     XL,45
 
        LDI     XH,15
 
        RCALL   SCR_SET_CURSOR
 
        LDH     DATA,TPSM_Z
 
        CALL    HEXHALF
 
T_PSM11:
 
        LDI     XL,41
 
        LDI     XH,17
 
        RCALL   SCR_SET_CURSOR
 
        LDH     XL,TPSM_X0
 
        LDH     XH,TPSM_X1
 
        CALL    DECWORD
 
 
 
        LDI     XL,41
 
        LDI     XH,18
 
        RCALL   SCR_SET_CURSOR
 
        LDH     XL,TPSM_Y
 
        CLR     XH
 
        CALL    DECWORD
 
 
 
        LDI     XH,11
 
T_PSM12:PUSH    XH
 
        LDI     XL,36
 
        RCALL   SCR_SET_CURSOR
 
        LDI     TEMP,$DF
 
        LDH     DATA,TPSM_BTN
 
        SBRC    DATA,0
 
        LDI     TEMP,$AE
 
        LDI     COUNT,3
 
        RCALL   SCR_FILL_ATTR
 
        LDI     TEMP,$DF
 
        LDI     COUNT,1
 
        RCALL   SCR_FILL_ATTR
 
        LDI     TEMP,$DF
 
        LDH     DATA,TPSM_BTN
 
        SBRC    DATA,2
 
        LDI     TEMP,$AE
 
        LDI     COUNT,3
 
        RCALL   SCR_FILL_ATTR
 
        LDI     TEMP,$DF
 
        LDI     COUNT,1
 
        RCALL   SCR_FILL_ATTR
 
        LDI     TEMP,$DF
 
        LDH     DATA,TPSM_BTN
 
        SBRC    DATA,1
 
        LDI     TEMP,$AE
 
        LDI     COUNT,3
 
        RCALL   SCR_FILL_ATTR
 
        POP     XH
 
        INC     XH
 
        CPI     XH,14
 
        BRCS    T_PSM12
 
T_PSM20:
 
        LDS     DATA,NEWFRAME
 
        TST     DATA
 
        BREQ    T_PSM21
 
        STS     NEWFRAME,NULL
 
        LDH     XL,TPSM_X0
 
        LDH     XH,TPSM_X1
 
        ADIW    XL,49
 
        ADIW    XL,49 ; +98
 
        PUSH    XL
 
        MOV     DATA,XH
 
        LDI     TEMP,SCR_MOUSE_TEMP
 
        RCALL   FPGA_REG
 
        POP     DATA
 
        LDI     TEMP,SCR_MOUSE_X
 
        RCALL   FPGA_REG
 
        LDH     XL,TPSM_Y
 
        CLR     XH
 
        ADIW    XL,43
 
        PUSH    XL
 
        MOV     DATA,XH
 
        LDI     TEMP,SCR_MOUSE_TEMP
 
        RCALL   FPGA_REG
 
        POP     DATA
 
        LDI     TEMP,SCR_MOUSE_Y
 
        RCALL   FPGA_REG
 
T_PSM21:
 
        CALL    INKEY
 
        BREQ    T_PSM22
 
        CPI     DATA,KEY_ESC
 
        BRNE    T_PSM22
 
        RJMP    T_PSM_ESCAPE
 
T_PSM22:
 
        LDS     DATA,PS2M_RAW_READY
 
        TST     DATA
 
        BREQ    T_PSM20
 
        STS     PS2M_RAW_READY,NULL
 
        LDS     DATA,PS2M_RAW_CODE
 
        SBRS    DATA,3
 
        RJMP    T_PSM20
 
        STH     TPSM_BYTE1,DATA
 
 
 
        RCALL   PS2M_RECEIVE_BYTE
 
        BREQ    T_PSM20
 
        STH     TPSM_BYTE2,DATA
 
 
 
        RCALL   PS2M_RECEIVE_BYTE
 
        BREQ    T_PSM20
 
        STH     TPSM_BYTE3,DATA
 
 
 
        LDH     TEMP,TPSM_ID
 
        TST     TEMP
 
        BREQ    T_PSM30
 
 
 
        RCALL   PS2M_RECEIVE_BYTE
 
        BREQ    T_PSM20
 
        STH     TPSM_BYTE4,DATA
 
;
 
T_PSM30:
 
        LDH     DATA,TPSM_BYTE1
 
        ANDI    DATA,$07
 
        STH     TPSM_BTN,DATA
 
 
 
        LDH     XL,TPSM_X0
 
        LDH     XH,TPSM_X1
 
        LDH     WL,TPSM_BYTE2
 
        CLR     WH
 
        LDH     TEMP,TPSM_BYTE1
 
        SBRC    TEMP,4
 
        RJMP    T_PSM31
 
        ADD     XL,WL
 
        ADC     XH,NULL
 
        CPI     XL,LOW(318)
 
        CPC     XH,ONE ;HIGH(318)
 
        BRCS    T_PSM32
 
        LDI     XL,LOW(317)
 
        LDI     XH,HIGH(317)
 
        RJMP    T_PSM32
 
T_PSM31:COM     WL
 
        ADIW    WL,1
 
        SUB     XL,WL
 
        SBC     XH,WH
 
        BRCC    T_PSM32
 
        CLR     XL
 
        CLR     XH
 
T_PSM32:STH     TPSM_X0,XL
 
        STH     TPSM_X1,XH
 
 
 
        LDH     XL,TPSM_Y
 
        CLR     XH
 
        LDH     WL,TPSM_BYTE3
 
        CLR     WH
 
        LDH     TEMP,TPSM_BYTE1
 
        SBRS    TEMP,5
 
        RJMP    T_PSM33
 
        COM     WL
 
        ADIW    WL,1
 
        ADD     XL,WL
 
        ADC     XH,WH
 
        TST     XH
 
        BRNE    T_PSM34
 
        CPI     XL,250
 
        BRCS    T_PSM35
 
T_PSM34:LDI     XL,249
 
        RJMP    T_PSM35
 
T_PSM33:SUB     XL,WL
 
        SBC     XH,NULL
 
        BRCC    T_PSM35
 
        CLR     XL
 
T_PSM35:STH     TPSM_Y,XL
 
 
 
        LDH     TEMP,TPSM_ID
 
        TST     TEMP
 
        BREQ    T_PSM40
 
 
 
        LDH     DATA,TPSM_BYTE4
 
        LDH     XL,TPSM_Z
 
        ADD     XL,DATA
 
        ANDI    XL,$0F
 
        STH     TPSM_Z,XL
 
 
 
T_PSM40:
 
        LDIZ    MSG_TPSM_3*2
 
        RCALL   SCR_PRINTSTRZ
 
 
 
        ORI     FLAGS1,0B00000010
 
        LDH     DATA,TPSM_BYTE1
 
        RCALL   HEXBYTE
 
        LDI     DATA,$20
 
        RCALL   PUTCHAR
 
        LDH     DATA,TPSM_BYTE2
 
        RCALL   HEXBYTE
 
        LDI     DATA,$20
 
        RCALL   PUTCHAR
 
        LDH     DATA,TPSM_BYTE3
 
        RCALL   HEXBYTE
 
        LDI     DATA,$20
 
        RCALL   PUTCHAR
 
        LDH     TEMP,TPSM_ID
 
        TST     TEMP
 
        BREQ    T_PSM41
 
        LDH     DATA,TPSM_BYTE4
 
        RCALL   HEXBYTE
 
        LDI     DATA,$20
 
        RCALL   PUTCHAR
 
T_PSM41:LDI     DATA,$20
 
        RCALL   PUTCHAR
 
        ANDI    FLAGS1,0B11111100
 
 
 
        RJMP    T_PSM10
 
;
 
;--------------------------------------
 
;in:    DATA
 
;out:   sreg.Z - CLR == ok; SET == timeout
 
PS2M_SEND_BYTE:
 
        CLR     TEMP
 
PS2M_SEND0:
 
        SBIS    PINE,5   ; clock line
 
        RJMP    PS2M_SEND_BYTE
 
        DEC     TEMP
 
        BRNE    PS2M_SEND0
 
 
 
        CLI
 
        STS     PS2M_DATA,DATA
 
        LDI     TEMP,(1<<PS2M_BIT_TX)
 
        STS     PS2M_FLAGS,TEMP
 
        STS     PS2M_BIT_COUNT,NULL
 
        STS     PS2M_RAW_READY,NULL
 
        PS2M_CLOCKLINE_DOWN
 
        SEI
 
        DELAY_US 130
 
        PS2M_DATALINE_DOWN
 
        DELAY_US 20
 
        LDIZ    PS2M_TIMEOUT
 
        LDIW    15
 
        CALL    SET_TIMEOUT_MS
 
        PS2M_CLOCKLINE_UP
 
PS2M_SEND1:
 
        LDS     TEMP,PS2M_FLAGS
 
        ANDI    TEMP,(1<<PS2M_BIT_ACKBIT)
 
        BRNE    PS2M_SEND2
 
        LDIZ    PS2M_TIMEOUT
 
        CALL    CHECK_TIMEOUT_MS
 
        BRCC    PS2M_SEND1
 
        SEZ
 
PS2M_SEND2:
 
        RET
 
;
 
;--------------------------------------
 
;out:   sreg.Z - CLR == ok; SET == timeout
 
;       DATA == byte
 
PS2M_RECEIVE_BYTE:
 
        STS     PS2M_RAW_READY,NULL
 
        LDIZ    PS2M_TIMEOUT
 
        LDIW    7
 
        CALL    SET_TIMEOUT_MS
 
 
 
PS2M_RXBYTE1:
 
        LDS     TEMP,PS2M_RAW_READY
 
        TST     TEMP
 
        BRNE    PS2M_RXBYTE2
 
        LDIZ    PS2M_TIMEOUT
 
        CALL    CHECK_TIMEOUT_MS
 
        BRCC    PS2M_RXBYTE1
 
        SEZ
 
        RET
 
 
 
PS2M_RXBYTE2:
 
        LDS     DATA,PS2M_RAW_CODE
 
        STS     PS2M_RAW_READY,NULL
 
        RET
 
;
 
;--------------------------------------
 
;