Subversion Repositories pentevo

Rev

Rev 291 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. ;  4                              5678901234567
  2. ; ┌─────────────────────────────────────────────┐
  3. ; │Detecting mouse...                           │03
  4. ; │FF FA AA 00                                  │
  5. ; │Customization...                             │
  6. ; │F3 FA C8 FA F3 FA 64 FA F3 FA 50 FA          │
  7. ; │F2 FA 03                                     │
  8. ; │E8 FA 02 FA E6 FA F3 FA 64 FA F4 FA          │
  9. ; │Let's go!                                    │
  10. ; │08 00 00 00                    ┌───────────┐ │10
  11. ; │                               │███        │ │11
  12. ; │                               │█L█  M   R │ │12
  13. ; │                               │███        │ │13
  14. ; │                               │           │ │14
  15. ; │                               │ Wheel = 1 │ │15
  16. ; │                               │           │ │16
  17. ; │                               │ X  =  123 │ │17
  18. ; │                               │ Y  =   58 │ │18
  19. ; │                               └───────────┘ │
  20. ; └─────────────────────────────────────────────┘
  21. ;  4                              5678901234567
  22. ;
  23. ;--------------------------------------
  24. ;
  25. .EQU    TPSM_BYTE1      =0
  26. .EQU    TPSM_BYTE2      =1
  27. .EQU    TPSM_BYTE3      =2
  28. .EQU    TPSM_BYTE4      =3
  29. .EQU    TPSM_X0         =4
  30. .EQU    TPSM_X1         =5
  31. .EQU    TPSM_Y          =6
  32. .EQU    TPSM_Z          =7
  33. .EQU    TPSM_BTN        =8
  34. .EQU    TPSM_ID         =9
  35. ;
  36. ;--------------------------------------
  37. ;
  38. .EQU    PS2M_BIT_PARITY =0
  39. .EQU    PS2M_BIT_ACKBIT =1      ; принят ACK-бит
  40. .EQU    PS2M_BIT_TX     =7      ; передача
  41. .EQU    PS2M_BIT_READY  =7
  42.  
  43. .MACRO  PS2M_DATALINE_UP
  44.         CBI     DDRD,7
  45.         SBI     PORTD,7
  46. .ENDMACRO
  47.  
  48. .MACRO  PS2M_DATALINE_DOWN
  49.         CBI     PORTD,7
  50.         SBI     DDRD,7
  51. .ENDMACRO
  52.  
  53. .MACRO  PS2M_CLOCKLINE_UP
  54.         CBI     DDRE,5
  55.         SBI     PORTE,5
  56. .ENDMACRO
  57.  
  58. .MACRO  PS2M_CLOCKLINE_DOWN
  59.         CBI     PORTE,5
  60.         SBI     DDRE,5
  61. .ENDMACRO
  62. ;
  63. ;--------------------------------------
  64. ;
  65. .DSEG
  66. PS2M_BIT_COUNT: .BYTE   1
  67. PS2M_DATA:      .BYTE   1
  68. PS2M_RAW_READY: .BYTE   1
  69. PS2M_RAW_CODE:  .BYTE   1
  70. PS2M_FLAGS:     .BYTE   1
  71. PS2M_TIMEOUT:   .BYTE   2
  72. .CSEG
  73. ;
  74. ;--------------------------------------
  75. ;
  76. MSG_TPSM_1:
  77.         .DB     $16,37,15,"Wheel ="
  78. MSG_TPSM_2:
  79.         .DB     $16,37,12,"L   M   R"
  80.         .DB     $16,37,17,"X  =",$16,37,18,"Y  =",0,0
  81. MSG_TPSM_3:
  82.         .DB     $16, 4,10,$15,$DF,0
  83. ;
  84. ;--------------------------------------
  85. ;
  86. WIND_T_PS2M_1:
  87.         .DB     3,2,47,19,$DF,$01
  88. WIND_T_PS2M_2:
  89.         .DB     9,10,34,4,$AF,$01
  90. WIND_T_PS2M_3:
  91.         .DB     35,10,13,10,$DF,$00
  92. ;
  93. ;--------------------------------------
  94. ;
  95. EXT_INT5:
  96.         PUSH    TEMP
  97.         IN      TEMP,SREG
  98.         PUSH    TEMP
  99.         PUSH    COUNT
  100.         PUSH    DATA
  101.         LDS     DATA,PS2M_DATA
  102.         LDS     COUNT,PS2M_BIT_COUNT
  103.         LDS     TEMP,PS2M_FLAGS
  104.         SBRC    TEMP,PS2M_BIT_TX
  105.         RJMP    INT5TX_0
  106.  
  107.         CPI     COUNT,9
  108.         BREQ    INT5RX9
  109.         CPI     COUNT,10
  110.         BRCC    INT5RXS
  111.         TST     COUNT
  112.         BRNE    INT5RX1
  113. ;start bit
  114.         SBIC    PIND,7   ; data line
  115.         RJMP    INT5RX_CLR_D
  116.         CBR     TEMP,(1<<PS2M_BIT_PARITY)
  117.         INC     COUNT
  118.         RJMP    INT5_EXIT
  119. ;data bits
  120. INT5RX1:LSR     DATA
  121.         SBIS    PIND,7   ; data line
  122.         RJMP    INT5RX2
  123.         ORI     DATA,0B10000000
  124.         EOR     TEMP,ONE
  125. INT5RX2:INC     COUNT
  126.         RJMP    INT5_EXIT
  127. ;parity bit
  128. INT5RX9:SBIC    PIND,7   ; data line
  129.         EOR     TEMP,ONE
  130.         SBRS    TEMP,PS2M_BIT_PARITY
  131.         RJMP    INT5RX_CLR_D
  132.         INC     COUNT
  133.         RJMP    INT5_EXIT
  134. ;stop bit
  135. INT5RXS:SBIS    PIND,7   ; data line
  136.         RJMP    INT5RX_CLR_D
  137.  
  138.         STS     PS2M_RAW_READY,COUNT
  139.         STS     PS2M_RAW_CODE,DATA
  140.  
  141. INT5RX_CLR_F:
  142.         CLR     TEMP
  143. INT5RX_CLR_D:
  144.         CLR     DATA
  145.         CLR     COUNT
  146.         RJMP    INT5_EXIT
  147. ;-------
  148. INT5TX_0:
  149.         CPI     COUNT,9
  150.         BREQ    INT5TX9
  151.         CPI     COUNT,10
  152.         BREQ    INT5TXS
  153.         CPI     COUNT,11
  154.         BRCC    INT5TXA
  155.         TST     COUNT
  156.         BRNE    INT5TX1
  157. ;start bit
  158.         SBR     TEMP,(1<<PS2M_BIT_PARITY)
  159.         INC     COUNT
  160.         RJMP    INT5_EXIT
  161. ;data bits
  162. INT5TX1:ROR     DATA
  163.         BRCC    INT5TX2
  164.         PS2M_DATALINE_UP
  165.         EOR     TEMP,ONE
  166.         INC     COUNT
  167.         RJMP    INT5_EXIT
  168. INT5TX2:PS2M_DATALINE_DOWN
  169.         INC     COUNT
  170.         RJMP    INT5_EXIT
  171. ;parity bit
  172. INT5TX9:SBRC    TEMP,PS2M_BIT_PARITY
  173.         RJMP    INT5TXP
  174.         PS2M_DATALINE_DOWN
  175.         INC     COUNT
  176.         RJMP    INT5_EXIT
  177. INT5TXP:PS2M_DATALINE_UP
  178.         INC     COUNT
  179.         RJMP    INT5_EXIT
  180. ;stop bit
  181. INT5TXS:PS2M_DATALINE_UP
  182.         INC     COUNT
  183.         RJMP    INT5_EXIT
  184. ;ack-bit
  185. INT5TXA:CLR     TEMP
  186.         SBIS    PIND,7   ; data line
  187.         LDI     TEMP,(1<<PS2M_BIT_ACKBIT)
  188.         CLR     DATA
  189.         CLR     COUNT
  190.  
  191. INT5_EXIT:
  192.         STS     PS2M_BIT_COUNT,COUNT
  193.         STS     PS2M_DATA,DATA
  194.         STS     PS2M_FLAGS,TEMP
  195.         POP     DATA
  196.         POP     COUNT
  197.         POP     TEMP
  198.         OUT     SREG,TEMP
  199.         POP     TEMP
  200.         RETI
  201. ;
  202. ;--------------------------------------
  203. ;
  204. TESTMOUSE:
  205.         ANDI    FLAGS1,0B11111011
  206.         ORI     FLAGS1,0B00000010
  207.         LDIZ    MLMSG_MOUSE_TEST*2
  208.         CALL    PRINTMLSTR
  209.         ORI     FLAGS1,0B00000100
  210.  
  211.         GETMEM  10
  212.  
  213. T_PSM_RESTART:
  214.         CLI
  215.         PS2M_DATALINE_UP
  216.         PS2M_CLOCKLINE_UP
  217.         IN      TEMP,EICRB
  218.         ORI     TEMP,(1<<ISC51)|(0<<ISC50)
  219.         OUT     EICRB,TEMP
  220.         IN      TEMP,EIMSK
  221.         ORI     TEMP,(1<<INT5)
  222.         OUT     EIMSK,TEMP
  223.         STS     PS2M_FLAGS,NULL
  224.         STS     PS2M_BIT_COUNT,NULL
  225.         STS     PS2M_RAW_READY,NULL
  226.         SEI
  227.  
  228.         LDIZ    WIND_T_PS2M_1*2
  229.         CALL    WINDOW
  230.         LDI     XL,4
  231.         LDI     XH,3
  232.         RCALL   SCR_SET_CURSOR
  233.         RCALL   UART_CRLF
  234.         LDIZ    MLMSG_MOUSE_DETECT*2
  235.         CALL    PRINTMLSTR
  236.         LDI     XL,4
  237.         LDI     XH,4
  238.         RCALL   SCR_SET_CURSOR
  239.         RCALL   UART_CRLF
  240. ;
  241. ;
  242. T_PSM_DETECT_2:
  243.         STS     PS2M_RAW_READY,NULL
  244.         LDIZ    PS2M_TIMEOUT
  245.         LDIW    2
  246.         CALL    SET_TIMEOUT_MS
  247. T_PSM_DETECT_1:
  248.         LDS     TEMP,PS2M_RAW_READY
  249.         TST     TEMP
  250.         BRNE    T_PSM_DETECT_2
  251.         LDIZ    PS2M_TIMEOUT
  252.         CALL    CHECK_TIMEOUT_MS
  253.         BRCC    T_PSM_DETECT_1
  254.  
  255.         LDI     DATA,$FF
  256.         RCALL   HEXBYTE_FOR_DUMP
  257.         RCALL   PS2M_SEND_BYTE
  258.         BREQ    T_PSM_DETECT_FAIL0_A
  259.         RCALL   PS2M_RECEIVE_BYTE
  260.         BREQ    T_PSM_DETECT_FAIL0_A
  261.         RCALL   HEXBYTE_FOR_DUMP
  262.         CPI     DATA,$FA
  263.         BRNE    T_PSM_DETECT_FAIL0_A
  264.  
  265.         STS     PS2M_RAW_READY,NULL
  266.         LDIZ    PS2M_TIMEOUT
  267.         LDIW    1000
  268.         CALL    SET_TIMEOUT_MS
  269. T_PSM_DETECT_4:
  270.         LDS     TEMP,PS2M_RAW_READY
  271.         TST     TEMP
  272.         BRNE    T_PSM_DETECT_5
  273.         LDIZ    PS2M_TIMEOUT
  274.         CALL    CHECK_TIMEOUT_MS
  275.         BRCC    T_PSM_DETECT_4
  276. T_PSM_DETECT_FAIL2_A:
  277.         RJMP    T_PSM_DETECT_FAIL2
  278. ;
  279. T_PSM_DETECT_FAIL0_A:
  280.         RJMP    T_PSM_DETECT_FAIL0
  281. ;
  282. T_PSM_DETECT_5:
  283.         LDS     DATA,PS2M_RAW_CODE
  284.         RCALL   HEXBYTE_FOR_DUMP
  285.         CPI     DATA,$AA
  286.         BRNE    T_PSM_DETECT_FAIL2_A
  287.         LDI     DATA,$00
  288.         RCALL   T_PSM_DETECT_RECEIVE
  289. ; - - - - - - - - - - - - - - - - - - -
  290.         LDI     XL,4
  291.         LDI     XH,5
  292.         RCALL   SCR_SET_CURSOR
  293.         RCALL   UART_CRLF
  294.         LDIZ    MLMSG_MOUSE_SETUP*2
  295.         CALL    PRINTMLSTR
  296.         LDI     XL,4
  297.         LDI     XH,6
  298.         RCALL   SCR_SET_CURSOR
  299.         RCALL   UART_CRLF
  300.  
  301.         LDI     DATA,$F3
  302.         RCALL   T_PSM_DETECT_SEND
  303.         LDI     DATA,200
  304.         RCALL   T_PSM_DETECT_SEND
  305.  
  306.         LDI     DATA,$F3
  307.         RCALL   T_PSM_DETECT_SEND
  308.         LDI     DATA,100
  309.         RCALL   T_PSM_DETECT_SEND
  310.  
  311.         LDI     DATA,$F3
  312.         RCALL   T_PSM_DETECT_SEND
  313.         LDI     DATA,80
  314.         RCALL   T_PSM_DETECT_SEND
  315.  
  316.         LDI     XL,4
  317.         LDI     XH,7
  318.         RCALL   SCR_SET_CURSOR
  319.         RCALL   UART_CRLF
  320.  
  321.         LDI     DATA,$F2
  322.         RCALL   T_PSM_DETECT_SEND
  323.  
  324.         STS     PS2M_RAW_READY,NULL
  325.         LDIZ    PS2M_TIMEOUT
  326.         LDIW    20
  327.         CALL    SET_TIMEOUT_MS
  328. T_PSM_DETECT_6:
  329.         LDS     TEMP,PS2M_RAW_READY
  330.         TST     TEMP
  331.         BRNE    T_PSM_DETECT_7
  332.         LDIZ    PS2M_TIMEOUT
  333.         CALL    CHECK_TIMEOUT_MS
  334.         BRCC    T_PSM_DETECT_6
  335.         RJMP    T_PSM_DETECT_FAIL2
  336. T_PSM_DETECT_7:
  337.         LDS     DATA,PS2M_RAW_CODE
  338.         STH     TPSM_ID,DATA
  339.         RCALL   HEXBYTE_FOR_DUMP
  340.         TST     DATA
  341.         BREQ    T_PSM_DETECT_8
  342.         CPI     DATA,3
  343.         BREQ    T_PSM_DETECT_8
  344.         RJMP    T_PSM_DETECT_FAIL2
  345.  
  346. T_PSM_DETECT_8:
  347.         LDI     XL,4
  348.         LDI     XH,8
  349.         RCALL   SCR_SET_CURSOR
  350.         RCALL   UART_CRLF
  351.  
  352.         LDI     DATA,$E8
  353.         RCALL   T_PSM_DETECT_SEND
  354.         LDI     DATA,$02
  355.         RCALL   T_PSM_DETECT_SEND
  356.  
  357.         LDI     DATA,$E6
  358.         RCALL   T_PSM_DETECT_SEND
  359.  
  360.         LDI     DATA,$F3
  361.         RCALL   T_PSM_DETECT_SEND
  362.         LDI     DATA,100
  363.         RCALL   T_PSM_DETECT_SEND
  364.  
  365.         LDI     DATA,$F4
  366.         RCALL   T_PSM_DETECT_SEND
  367.  
  368.         LDI     XL,4
  369.         LDI     XH,9
  370.         RCALL   SCR_SET_CURSOR
  371.         RCALL   UART_CRLF
  372.         LDIZ    MLMSG_MOUSE_LETSGO*2
  373.         CALL    PRINTMLSTR
  374.         RCALL   UART_CRLF
  375.  
  376.         RJMP    T_PSM_MAIN
  377. ;
  378. ;--------------------------------------
  379. ;
  380. T_PSM_DETECT_SEND:
  381.         RCALL   HEXBYTE_FOR_DUMP
  382.         RCALL   PS2M_SEND_BYTE
  383.         BREQ    T_PSM_DETECT_FAIL1
  384.         RCALL   PS2M_RECEIVE_BYTE
  385.         BREQ    T_PSM_DETECT_FAIL1
  386.         RCALL   HEXBYTE_FOR_DUMP
  387.         CPI     DATA,$FA
  388.         BRNE    T_PSM_DETECT_FAIL1
  389.         RET
  390. ;
  391. ;--------------------------------------
  392. ;
  393. T_PSM_DETECT_RECEIVE:
  394.         STH     TPSM_BYTE4,DATA         ; temporally
  395.         RCALL   PS2M_RECEIVE_BYTE
  396.         BREQ    T_PSM_DETECT_FAIL1
  397.         RCALL   HEXBYTE_FOR_DUMP
  398.         LDH     TEMP,TPSM_BYTE4         ; temporally
  399.         CP      DATA,TEMP
  400.         BRNE    T_PSM_DETECT_FAIL1
  401.         RET
  402. ;
  403. ;--------------------------------------
  404. ;
  405. T_PSM_DETECT_FAIL1:
  406.         POPZ
  407. T_PSM_DETECT_FAIL2:
  408.         LDIZ    MLMSG_MOUSE_FAIL1*2
  409.         RJMP    T_PSM_DETECT_FAILZ
  410.  
  411. T_PSM_DETECT_FAIL0:
  412.         LDIZ    MLMSG_MOUSE_FAIL0*2
  413. T_PSM_DETECT_FAILZ:
  414.         PUSHZ
  415.         RCALL   UART_CRLF
  416.         LDIZ    WIND_T_PS2M_2*2
  417.         CALL    WINDOW
  418.         LDI     XL,10
  419.         LDI     XH,11
  420.         RCALL   SCR_SET_CURSOR
  421.         POPZ
  422.         CALL    PRINTMLSTR
  423.         LDI     XL,10
  424.         LDI     XH,12
  425.         RCALL   SCR_SET_CURSOR
  426.         LDIZ    MLMSG_MOUSE_RESTART*2
  427.         CALL    PRINTMLSTR
  428.  
  429. T_PSM_WAITKEY:
  430.         CALL    WAITKEY
  431.         CPI     DATA,KEY_ESC
  432.         BREQ    T_PSM_ESCAPE
  433.         CPI     DATA,KEY_ENTER
  434.         BRNE    T_PSM_WAITKEY
  435.         RJMP    T_PSM_RESTART
  436.  
  437. T_PSM_ESCAPE:
  438.         LDI     DATA,0B00000000
  439.         MOV     INT6VECT,DATA
  440.         LDI     TEMP,INT_CONTROL
  441.         CALL    FPGA_REG
  442.         CLR     DATA
  443.         LDI     TEMP,SCR_MOUSE_TEMP
  444.         RCALL   FPGA_REG
  445.         CLR     DATA
  446.         LDI     TEMP,SCR_MOUSE_X
  447.         RCALL   FPGA_REG
  448.         CLR     DATA
  449.         LDI     TEMP,SCR_MOUSE_Y
  450.         RCALL   FPGA_REG
  451.         CLI
  452.         PS2M_DATALINE_UP
  453.         PS2M_CLOCKLINE_UP
  454.         IN      TEMP,EIMSK
  455.         CBR     TEMP,(1<<INT5)
  456.         OUT     EIMSK,TEMP
  457.         SEI
  458.         ORI     FLAGS1,0B00000010
  459.         FREEMEM 10
  460.         RET
  461. ;
  462. ;--------------------------------------
  463. ;
  464. T_PSM_MAIN:
  465.         ANDI    FLAGS1,0B11111100
  466.         LDI     DATA,0B00000010
  467.         MOV     INT6VECT,DATA
  468.         LDI     TEMP,INT_CONTROL
  469.         CALL    FPGA_REG
  470.  
  471.         LDIZ    WIND_T_PS2M_3*2
  472.         CALL    WINDOW
  473.         LDIZ    MSG_TPSM_2*2
  474.         LDH     TEMP,TPSM_ID
  475.         TST     TEMP
  476.         BREQ    T_PSM01
  477.         LDIZ    MSG_TPSM_1*2
  478. T_PSM01:RCALL   SCR_PRINTSTRZ
  479.         LDI     TEMP,150
  480.         STH     TPSM_X0,TEMP
  481.         STH     TPSM_X1,NULL
  482.         LDI     TEMP,120
  483.         STH     TPSM_Y,TEMP
  484.         STH     TPSM_Z,NULL
  485.         STH     TPSM_BTN,NULL
  486.  
  487.         STS     PS2M_RAW_READY,NULL
  488.  
  489. T_PSM10:
  490.         LDH     TEMP,TPSM_ID
  491.         TST     TEMP
  492.         BREQ    T_PSM11
  493.         LDI     XL,45
  494.         LDI     XH,15
  495.         RCALL   SCR_SET_CURSOR
  496.         LDH     DATA,TPSM_Z
  497.         CALL    HEXHALF
  498. T_PSM11:
  499.         LDI     XL,41
  500.         LDI     XH,17
  501.         RCALL   SCR_SET_CURSOR
  502.         LDH     XL,TPSM_X0
  503.         LDH     XH,TPSM_X1
  504.         CALL    DECWORD
  505.  
  506.         LDI     XL,41
  507.         LDI     XH,18
  508.         RCALL   SCR_SET_CURSOR
  509.         LDH     XL,TPSM_Y
  510.         CLR     XH
  511.         CALL    DECWORD
  512.  
  513.         LDI     XH,11
  514. T_PSM12:PUSH    XH
  515.         LDI     XL,36
  516.         RCALL   SCR_SET_CURSOR
  517.         LDI     TEMP,$DF
  518.         LDH     DATA,TPSM_BTN
  519.         SBRC    DATA,0
  520.         LDI     TEMP,$AE
  521.         LDI     COUNT,3
  522.         RCALL   SCR_FILL_ATTR
  523.         LDI     TEMP,$DF
  524.         LDI     COUNT,1
  525.         RCALL   SCR_FILL_ATTR
  526.         LDI     TEMP,$DF
  527.         LDH     DATA,TPSM_BTN
  528.         SBRC    DATA,2
  529.         LDI     TEMP,$AE
  530.         LDI     COUNT,3
  531.         RCALL   SCR_FILL_ATTR
  532.         LDI     TEMP,$DF
  533.         LDI     COUNT,1
  534.         RCALL   SCR_FILL_ATTR
  535.         LDI     TEMP,$DF
  536.         LDH     DATA,TPSM_BTN
  537.         SBRC    DATA,1
  538.         LDI     TEMP,$AE
  539.         LDI     COUNT,3
  540.         RCALL   SCR_FILL_ATTR
  541.         POP     XH
  542.         INC     XH
  543.         CPI     XH,14
  544.         BRCS    T_PSM12
  545. T_PSM20:
  546.         LDS     DATA,NEWFRAME
  547.         TST     DATA
  548.         BREQ    T_PSM21
  549.         STS     NEWFRAME,NULL
  550.         LDH     XL,TPSM_X0
  551.         LDH     XH,TPSM_X1
  552.         ADIW    XL,49
  553.         ADIW    XL,49 ; +98
  554.         PUSH    XL
  555.         MOV     DATA,XH
  556.         LDI     TEMP,SCR_MOUSE_TEMP
  557.         RCALL   FPGA_REG
  558.         POP     DATA
  559.         LDI     TEMP,SCR_MOUSE_X
  560.         RCALL   FPGA_REG
  561.         LDH     XL,TPSM_Y
  562.         CLR     XH
  563.         ADIW    XL,43
  564.         PUSH    XL
  565.         MOV     DATA,XH
  566.         LDI     TEMP,SCR_MOUSE_TEMP
  567.         RCALL   FPGA_REG
  568.         POP     DATA
  569.         LDI     TEMP,SCR_MOUSE_Y
  570.         RCALL   FPGA_REG
  571. T_PSM21:
  572.         CALL    INKEY
  573.         BREQ    T_PSM22
  574.         CPI     DATA,KEY_ESC
  575.         BRNE    T_PSM22
  576.         RJMP    T_PSM_ESCAPE
  577. T_PSM22:
  578.         LDS     DATA,PS2M_RAW_READY
  579.         TST     DATA
  580.         BREQ    T_PSM20
  581.         STS     PS2M_RAW_READY,NULL
  582.         LDS     DATA,PS2M_RAW_CODE
  583.         SBRS    DATA,3
  584.         RJMP    T_PSM20
  585.         STH     TPSM_BYTE1,DATA
  586.  
  587.         RCALL   PS2M_RECEIVE_BYTE
  588.         BREQ    T_PSM20
  589.         STH     TPSM_BYTE2,DATA
  590.  
  591.         RCALL   PS2M_RECEIVE_BYTE
  592.         BREQ    T_PSM20
  593.         STH     TPSM_BYTE3,DATA
  594.  
  595.         LDH     TEMP,TPSM_ID
  596.         TST     TEMP
  597.         BREQ    T_PSM30
  598.  
  599.         RCALL   PS2M_RECEIVE_BYTE
  600.         BREQ    T_PSM20
  601.         STH     TPSM_BYTE4,DATA
  602. ;
  603. T_PSM30:
  604.         LDH     DATA,TPSM_BYTE1
  605.         ANDI    DATA,$07
  606.         STH     TPSM_BTN,DATA
  607.  
  608.         LDH     XL,TPSM_X0
  609.         LDH     XH,TPSM_X1
  610.         LDH     WL,TPSM_BYTE2
  611.         CLR     WH
  612.         LDH     TEMP,TPSM_BYTE1
  613.         SBRC    TEMP,4
  614.         RJMP    T_PSM31
  615.         ADD     XL,WL
  616.         ADC     XH,NULL
  617.         CPI     XL,LOW(318)
  618.         CPC     XH,ONE ;HIGH(318)
  619.         BRCS    T_PSM32
  620.         LDI     XL,LOW(317)
  621.         LDI     XH,HIGH(317)
  622.         RJMP    T_PSM32
  623. T_PSM31:COM     WL
  624.         ADIW    WL,1
  625.         SUB     XL,WL
  626.         SBC     XH,WH
  627.         BRCC    T_PSM32
  628.         CLR     XL
  629.         CLR     XH
  630. T_PSM32:STH     TPSM_X0,XL
  631.         STH     TPSM_X1,XH
  632.  
  633.         LDH     XL,TPSM_Y
  634.         CLR     XH
  635.         LDH     WL,TPSM_BYTE3
  636.         CLR     WH
  637.         LDH     TEMP,TPSM_BYTE1
  638.         SBRS    TEMP,5
  639.         RJMP    T_PSM33
  640.         COM     WL
  641.         ADIW    WL,1
  642.         ADD     XL,WL
  643.         ADC     XH,WH
  644.         TST     XH
  645.         BRNE    T_PSM34
  646.         CPI     XL,250
  647.         BRCS    T_PSM35
  648. T_PSM34:LDI     XL,249
  649.         RJMP    T_PSM35
  650. T_PSM33:SUB     XL,WL
  651.         SBC     XH,NULL
  652.         BRCC    T_PSM35
  653.         CLR     XL
  654. T_PSM35:STH     TPSM_Y,XL
  655.  
  656.         LDH     TEMP,TPSM_ID
  657.         TST     TEMP
  658.         BREQ    T_PSM40
  659.  
  660.         LDH     DATA,TPSM_BYTE4
  661.         LDH     XL,TPSM_Z
  662.         ADD     XL,DATA
  663.         ANDI    XL,$0F
  664.         STH     TPSM_Z,XL
  665.  
  666. T_PSM40:
  667.         LDIZ    MSG_TPSM_3*2
  668.         RCALL   SCR_PRINTSTRZ
  669.  
  670.         ORI     FLAGS1,0B00000010
  671.         LDH     DATA,TPSM_BYTE1
  672.         RCALL   HEXBYTE
  673.         LDI     DATA,$20
  674.         RCALL   PUTCHAR
  675.         LDH     DATA,TPSM_BYTE2
  676.         RCALL   HEXBYTE
  677.         LDI     DATA,$20
  678.         RCALL   PUTCHAR
  679.         LDH     DATA,TPSM_BYTE3
  680.         RCALL   HEXBYTE
  681.         LDI     DATA,$20
  682.         RCALL   PUTCHAR
  683.         LDH     TEMP,TPSM_ID
  684.         TST     TEMP
  685.         BREQ    T_PSM41
  686.         LDH     DATA,TPSM_BYTE4
  687.         RCALL   HEXBYTE
  688.         LDI     DATA,$20
  689.         RCALL   PUTCHAR
  690. T_PSM41:LDI     DATA,$20
  691.         RCALL   PUTCHAR
  692.         ANDI    FLAGS1,0B11111100
  693.  
  694.         RJMP    T_PSM10
  695. ;
  696. ;--------------------------------------
  697. ;in:    DATA
  698. ;out:   sreg.Z - CLR == ok; SET == timeout
  699. PS2M_SEND_BYTE:
  700.         CLR     TEMP
  701. PS2M_SEND0:
  702.         SBIS    PINE,5   ; clock line
  703.         RJMP    PS2M_SEND_BYTE
  704.         DEC     TEMP
  705.         BRNE    PS2M_SEND0
  706.  
  707.         CLI
  708.         STS     PS2M_DATA,DATA
  709.         LDI     TEMP,(1<<PS2M_BIT_TX)
  710.         STS     PS2M_FLAGS,TEMP
  711.         STS     PS2M_BIT_COUNT,NULL
  712.         STS     PS2M_RAW_READY,NULL
  713.         PS2M_CLOCKLINE_DOWN
  714.         SEI
  715.         DELAY_US 130
  716.         PS2M_DATALINE_DOWN
  717.         DELAY_US 20
  718.         LDIZ    PS2M_TIMEOUT
  719.         LDIW    15
  720.         CALL    SET_TIMEOUT_MS
  721.         PS2M_CLOCKLINE_UP
  722. PS2M_SEND1:
  723.         LDS     TEMP,PS2M_FLAGS
  724.         ANDI    TEMP,(1<<PS2M_BIT_ACKBIT)
  725.         BRNE    PS2M_SEND2
  726.         LDIZ    PS2M_TIMEOUT
  727.         CALL    CHECK_TIMEOUT_MS
  728.         BRCC    PS2M_SEND1
  729.         SEZ
  730. PS2M_SEND2:
  731.         RET
  732. ;
  733. ;--------------------------------------
  734. ;out:   sreg.Z - CLR == ok; SET == timeout
  735. ;       DATA == byte
  736. PS2M_RECEIVE_BYTE:
  737.         STS     PS2M_RAW_READY,NULL
  738.         LDIZ    PS2M_TIMEOUT
  739.         LDIW    7
  740.         CALL    SET_TIMEOUT_MS
  741.  
  742. PS2M_RXBYTE1:
  743.         LDS     TEMP,PS2M_RAW_READY
  744.         TST     TEMP
  745.         BRNE    PS2M_RXBYTE2
  746.         LDIZ    PS2M_TIMEOUT
  747.         CALL    CHECK_TIMEOUT_MS
  748.         BRCC    PS2M_RXBYTE1
  749.         SEZ
  750.         RET
  751.  
  752. PS2M_RXBYTE2:
  753.         LDS     DATA,PS2M_RAW_CODE
  754.         STS     PS2M_RAW_READY,NULL
  755.         RET
  756. ;
  757. ;--------------------------------------
  758. ;
  759.