Subversion Repositories pentevo

Rev

Rev 290 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. .EQU    KEY_ESC         =$76
  2. .EQU    KEY_ENTER       =$5A
  3. .EQU    KEY_UP          =$75
  4. .EQU    KEY_DOWN        =$72
  5. .EQU    KEY_LEFT        =$6B
  6. .EQU    KEY_RIGHT       =$74
  7. .EQU    KEY_PAGEUP      =$7D
  8. .EQU    KEY_PAGEDOWN    =$7A
  9. .EQU    KEY_HOME        =$6C
  10. .EQU    KEY_END         =$69
  11. .EQU    KEY_F1          =$05
  12. .EQU    KEY_NUMLOCK     =$77
  13. .EQU    KEY_CAPSLOCK    =$58
  14. .EQU    KEY_SCROLLLOCK  =$7E
  15. .EQU    KEY_Y           =$35
  16.  
  17. .EQU    PS2K_BIT_PARITY =0
  18. .EQU    PS2K_BIT_EXTKEY =1      ; расш.код
  19. .EQU    PS2K_BIT_RELEASE=2      ; отпускание
  20. .EQU    PS2K_BIT_ACKBIT =3      ; окончание передачи
  21. .EQU    PS2K_BIT_TX     =7      ; передача
  22. .EQU    PS2K_BIT_READY  =7
  23.  
  24. .MACRO  PS2K_DATALINE_UP
  25.         CBI     DDRD,6
  26.         SBI     PORTD,6
  27. .ENDMACRO
  28.  
  29. .MACRO  PS2K_DATALINE_DOWN
  30.         CBI     PORTD,6
  31.         SBI     DDRD,6
  32. .ENDMACRO
  33.  
  34. .MACRO  PS2K_CLOCKLINE_UP
  35.         CBI     DDRE,4
  36.         SBI     PORTE,4
  37. .ENDMACRO
  38.  
  39. .MACRO  PS2K_CLOCKLINE_DOWN
  40.         CBI     PORTE,4
  41.         SBI     DDRE,4
  42. .ENDMACRO
  43. ;
  44. ;--------------------------------------
  45. ;
  46. .DSEG
  47. PS2K_BIT_COUNT: .BYTE   1
  48. PS2K_DATA:      .BYTE   1
  49. PS2K_RAW_READY: .BYTE   1
  50. PS2K_RAW_CODE:  .BYTE   1
  51. PS2K_SKIP:      .BYTE   1
  52. PS2K_FLAGS:     .BYTE   1
  53. PS2K_KEY_FLAGS: .BYTE   1
  54. PS2K_KEY_CODE:  .BYTE   1
  55. PS2K_TIMEOUT:   .BYTE   2
  56. .CSEG
  57. ;
  58. ;--------------------------------------
  59. ;
  60. PS2K_INIT:
  61.  
  62.         IN      TEMP,EICRB
  63.         ORI     TEMP,(1<<ISC41)|(0<<ISC40)
  64.         OUT     EICRB,TEMP
  65.         IN      TEMP,EIMSK
  66.         ORI     TEMP,(1<<INT4)
  67.         OUT     EIMSK,TEMP
  68.  
  69.         LDI     TEMP,(0<<CS02)|(1<<CS01)|(0<<CS00) ; clk/8
  70.         OUT     TCCR0,TEMP
  71.  
  72.         STS     PS2K_FLAGS,NULL
  73.         STS     PS2K_BIT_COUNT,NULL
  74.         STS     PS2K_SKIP,NULL
  75.         STS     PS2K_KEY_FLAGS,NULL
  76.  
  77.         RET
  78. ;
  79. ;--------------------------------------
  80. ;
  81. TIM0_OVF:
  82.         PS2K_DATALINE_UP
  83.         PUSH    TEMP
  84.         IN      TEMP,SREG
  85.         PUSH    TEMP
  86.         IN      TEMP,TIMSK
  87.         CBR     TEMP,(1<<TOIE0)
  88.         OUT     TIMSK,TEMP
  89.         POP     TEMP
  90.         OUT     SREG,TEMP
  91.         POP     TEMP
  92.         PS2K_CLOCKLINE_UP
  93.         RETI
  94. ;
  95. ;--------------------------------------
  96. ;
  97. EXT_INT4:
  98.         PUSH    TEMP
  99.         IN      TEMP,SREG
  100.         PUSH    TEMP
  101.         PUSH    COUNT
  102.         PUSH    DATA
  103.         LDS     DATA,PS2K_DATA
  104.         LDS     COUNT,PS2K_BIT_COUNT
  105.         LDS     TEMP,PS2K_FLAGS
  106.         SBRC    TEMP,PS2K_BIT_TX
  107.         RJMP    INT4TX_0
  108.  
  109.         CPI     COUNT,9
  110.         BREQ    INT4RX9
  111.         CPI     COUNT,10
  112.         BRCC    INT4RXS
  113.         TST     COUNT
  114.         BRNE    INT4RX1
  115. ;start bit
  116.         SBIC    PIND,6   ; data line
  117.         RJMP    INT4RX_CLR_D
  118.         CBR     TEMP,(1<<PS2K_BIT_PARITY)
  119.         INC     COUNT
  120.         RJMP    INT4_EXIT
  121. ;data bits
  122. INT4RX1:LSR     DATA
  123.         SBIS    PIND,6   ; data line
  124.         RJMP    INT4RX2
  125.         ORI     DATA,0B10000000
  126.         EOR     TEMP,ONE
  127. INT4RX2:INC     COUNT
  128.         RJMP    INT4_EXIT
  129. ;parity bit
  130. INT4RX9:SBIC    PIND,6   ; data line
  131.         EOR     TEMP,ONE
  132.         SBRS    TEMP,PS2K_BIT_PARITY
  133.         RJMP    INT4RX_CLR_D
  134.         INC     COUNT
  135.         RJMP    INT4_EXIT
  136. ;stop bit
  137. INT4RXS:SBIS    PIND,6   ; data line
  138.         RJMP    INT4RX_CLR_D
  139.  
  140.         STS     PS2K_RAW_READY,COUNT
  141.         STS     PS2K_RAW_CODE,DATA
  142.         PS2K_CLOCKLINE_DOWN
  143.         LDI     COUNT,$80
  144.         OUT     TCNT0,COUNT     ;Tclk*8*128=~92us
  145.         LDI     COUNT,(1<<TOV0)
  146.         OUT     TIFR,COUNT
  147.         IN      COUNT,TIMSK
  148.         ORI     COUNT,(1<<TOIE0)
  149.         OUT     TIMSK,COUNT
  150.  
  151.         LDS     COUNT,PS2K_SKIP
  152.         TST     COUNT
  153.         BRNE    INT4RX_SKIP
  154.  
  155.         CPI     DATA,$E1
  156.         BREQ    INT4RX_E1
  157.         CPI     DATA,$AA
  158.         BREQ    INT4RX_CLR_F
  159.         CPI     DATA,$AB
  160.         BREQ    INT4RX_AB
  161.         CPI     DATA,$EE
  162.         BREQ    INT4RX_CLR_F
  163.         CPI     DATA,$FA
  164.         BREQ    INT4RX_CLR_F
  165.         CPI     DATA,$FE
  166.         BREQ    INT4RX_CLR_F
  167.         CPI     DATA,$E0
  168.         BREQ    INT4RX_E0
  169.         CPI     DATA,$F0
  170.         BREQ    INT4RX_F0
  171.  
  172.         SBR     TEMP,(1<<PS2K_BIT_READY)
  173.         STS     PS2K_KEY_FLAGS,TEMP
  174.         STS     PS2K_KEY_CODE,DATA
  175.         RJMP    INT4RX_CLR_F
  176.  
  177. INT4RX_E0:
  178.         SBR     TEMP,(1<<PS2K_BIT_EXTKEY)
  179.         RJMP    INT4RX_CLR_D
  180.  
  181. INT4RX_F0:
  182.         SBR     TEMP,(1<<PS2K_BIT_RELEASE)
  183.         RJMP    INT4RX_CLR_D
  184.  
  185. INT4RX_SKIP:
  186.         DEC     COUNT
  187.         STS     PS2K_SKIP,COUNT
  188.         BRNE    INT4RX_CLR_D
  189.         LDS     DATA,PS2K_KEY_CODE
  190.         CPI     DATA,$7E
  191.         BRNE    INT4RX_CLR_D
  192.         LDI     TEMP,(1<<PS2K_BIT_READY)|(1<<PS2K_BIT_RELEASE)|(1<<PS2K_BIT_EXTKEY)
  193.         STS     PS2K_KEY_FLAGS,TEMP
  194.         RJMP    INT4RX_CLR_F
  195.  
  196. INT4RX_AB:
  197.         STS     PS2K_KEY_CODE,NULL
  198.         LDI     COUNT,1
  199.         STS     PS2K_SKIP,COUNT
  200.         RJMP    INT4RX_CLR_F
  201.  
  202. INT4RX_E1:
  203.         LDI     TEMP,(1<<PS2K_BIT_READY)|(1<<PS2K_BIT_EXTKEY)
  204.         STS     PS2K_KEY_FLAGS,TEMP
  205.         LDI     DATA,$7E
  206.         STS     PS2K_KEY_CODE,DATA
  207.         LDI     COUNT,7
  208.         STS     PS2K_SKIP,COUNT
  209.  
  210. INT4RX_CLR_F:
  211.         CLR     TEMP
  212. INT4RX_CLR_D:
  213.         CLR     DATA
  214.         CLR     COUNT
  215.         RJMP    INT4_EXIT
  216. ;-------
  217. INT4TX_0:
  218.         CPI     COUNT,9
  219.         BREQ    INT4TX9
  220.         CPI     COUNT,10
  221.         BREQ    INT4TXS
  222.         CPI     COUNT,11
  223.         BRCC    INT4TXA
  224.         TST     COUNT
  225.         BRNE    INT4TX1
  226. ;start bit
  227.         SBR     TEMP,(1<<PS2K_BIT_PARITY)
  228.         INC     COUNT
  229.         RJMP    INT4_EXIT
  230. ;data bits
  231. INT4TX1:ROR     DATA
  232.         BRCC    INT4TX2
  233.         PS2K_DATALINE_UP
  234.         EOR     TEMP,ONE
  235.         INC     COUNT
  236.         RJMP    INT4_EXIT
  237. INT4TX2:PS2K_DATALINE_DOWN
  238.         INC     COUNT
  239.         RJMP    INT4_EXIT
  240. ;parity bit
  241. INT4TX9:SBRC    TEMP,PS2K_BIT_PARITY
  242.         RJMP    INT4TXP
  243.         PS2K_DATALINE_DOWN
  244.         INC     COUNT
  245.         RJMP    INT4_EXIT
  246. INT4TXP:PS2K_DATALINE_UP
  247.         INC     COUNT
  248.         RJMP    INT4_EXIT
  249. ;stop bit
  250. INT4TXS:PS2K_DATALINE_UP
  251.         INC     COUNT
  252.         RJMP    INT4_EXIT
  253. ;здесь раньше проверялся ack-bit, но CHRV знает ;)
  254. ; где есть такие клавиатуры, которые не выдают этот бит.
  255. INT4TXA:;CLR     TEMP
  256.         ;SBIS    PIND,6   ; data line
  257.         LDI     TEMP,(1<<PS2K_BIT_ACKBIT)
  258.         CLR     DATA
  259.         CLR     COUNT
  260.  
  261. INT4_EXIT:
  262.         STS     PS2K_BIT_COUNT,COUNT
  263.         STS     PS2K_DATA,DATA
  264.         STS     PS2K_FLAGS,TEMP
  265.         POP     DATA
  266.         POP     COUNT
  267.         POP     TEMP
  268.         OUT     SREG,TEMP
  269.         POP     TEMP
  270.         RETI
  271. ;
  272. ;--------------------------------------
  273. ;out:   DATA == скан-код клавиши
  274. ;       TEMP.PS2K_BIT_EXTKEY == расш.код
  275. WAITKEY:CALL    RANDOM
  276.         LDS     TEMP,PS2K_KEY_FLAGS
  277.         SBRS    TEMP,PS2K_BIT_READY
  278.         RJMP    WAITKEY
  279.         STS     PS2K_KEY_FLAGS,NULL
  280.         SBRC    TEMP,PS2K_BIT_RELEASE
  281.         RJMP    WAITKEY
  282.         LDS     DATA,PS2K_KEY_CODE
  283.         RET
  284. ;
  285. ;--------------------------------------
  286. ;out:   sreg.Z == clr - было нажатие (автоповтор)
  287. ;       DATA == скан-код клавиши
  288. ;       TEMP.PS2K_BIT_EXTKEY == расш.код
  289. INKEY:  CALL    RANDOM
  290.         LDS     TEMP,PS2K_KEY_FLAGS
  291.         SBRS    TEMP,PS2K_BIT_READY
  292.         RJMP    INKEY9
  293.         STS     PS2K_KEY_FLAGS,NULL
  294.         SBRC    TEMP,PS2K_BIT_RELEASE
  295.         RJMP    INKEY9
  296.         LDS     DATA,PS2K_KEY_CODE
  297.         CLZ
  298.         RET
  299.  
  300. INKEY9: SEZ
  301.         RET
  302. ;
  303. ;--------------------------------------
  304. ;in:    DATA
  305. ;out:   sreg.Z - CLR == ok; SET == timeout
  306. PS2K_SEND_BYTE:
  307.         PS2K_DATALINE_UP
  308.         IN      TEMP,TIMSK
  309.         CBR     TEMP,(1<<TOIE0)
  310.         OUT     TIMSK,TEMP
  311.         PS2K_CLOCKLINE_UP
  312.         CLR     TEMP
  313. PS2K_SEND0:
  314.         SBIS    PINE,4   ; clock line
  315.         RJMP    PS2K_SEND_BYTE
  316.         DEC     TEMP
  317.         BRNE    PS2K_SEND0
  318.  
  319.         CLI
  320.         PS2K_CLOCKLINE_DOWN
  321.         PS2K_DATALINE_DOWN
  322.         STS     PS2K_DATA,DATA
  323.         LDI     TEMP,(1<<PS2K_BIT_TX)
  324.         STS     PS2K_FLAGS,TEMP
  325.         STS     PS2K_BIT_COUNT,NULL
  326.         STS     PS2K_SKIP,NULL
  327.         STS     PS2K_KEY_FLAGS,NULL
  328.         STS     PS2K_RAW_READY,NULL
  329.         SEI
  330.         DELAY_US 100
  331.         PS2K_DATALINE_DOWN
  332.         DELAY_US 500
  333.         LDIZ    PS2K_TIMEOUT
  334.         LDIW    15
  335.         CALL    SET_TIMEOUT_MS
  336.         PS2K_CLOCKLINE_UP
  337. PS2K_SEND1:
  338.         LDS     TEMP,PS2K_FLAGS
  339.         ANDI    TEMP,(1<<PS2K_BIT_ACKBIT)
  340.         BRNE    PS2K_SEND2
  341.         LDIZ    PS2K_TIMEOUT
  342.         CALL    CHECK_TIMEOUT_MS
  343.         BRCC    PS2K_SEND1
  344.         PS2K_DATALINE_UP
  345.         SEZ
  346. PS2K_SEND2:
  347.         RET
  348. ;
  349. ;--------------------------------------
  350. ;out:   sreg.Z - CLR == ok; SET == timeout
  351. ;       DATA == byte
  352. PS2K_RECEIVE_BYTE:
  353.         STS     PS2K_RAW_READY,NULL
  354.         LDIZ    PS2K_TIMEOUT
  355.         LDIW    20
  356.         CALL    SET_TIMEOUT_MS
  357.  
  358. PS2K_RXBYTE1:
  359.         LDS     TEMP,PS2K_RAW_READY
  360.         TST     TEMP
  361.         BRNE    PS2K_RXBYTE2
  362.         LDIZ    PS2K_TIMEOUT
  363.         CALL    CHECK_TIMEOUT_MS
  364.         BRCC    PS2K_RXBYTE1
  365.         CLR     DATA
  366.         SEZ
  367.         RET
  368.  
  369. PS2K_RXBYTE2:
  370.         LDS     DATA,PS2K_RAW_CODE
  371.         RET
  372. ;
  373. ;--------------------------------------
  374. ;
  375. .EQU    PS2K_DETECT_TEMP=0
  376. ;
  377. PS2K_DETECT_KBD:
  378.         GETMEM  1
  379.         PS2K_CLOCKLINE_UP
  380.         LDIZ    MLMSG_KBD_DETECT*2
  381.         RCALL   PRINTMLSTR
  382.  
  383.         STS     PS2K_RAW_READY,NULL
  384.         LDIZ    PS2K_TIMEOUT
  385.         LDIW    500
  386.         CALL    SET_TIMEOUT_MS
  387. PS2K_DETECT_K1:
  388.         LDS     TEMP,PS2K_RAW_READY
  389.         TST     TEMP
  390.         BRNE    PS2K_DETECT_K2
  391.         LDIZ    PS2K_TIMEOUT
  392.         CALL    CHECK_TIMEOUT_MS
  393.         BRCC    PS2K_DETECT_K1
  394.         RJMP    PS2K_DETECT_K3
  395. PS2K_DETECT_K2:
  396.         LDS     DATA,PS2K_RAW_CODE
  397.         RCALL   HEXBYTE_FOR_DUMP
  398. PS2K_DETECT_K3:
  399.  
  400.         LDI     DATA,$FF
  401.         RCALL   PS2K_DETECT_SEND
  402. ;        BRNE    PS2K_DETECT_K6
  403.         STS     PS2K_RAW_READY,NULL
  404.         LDIZ    PS2K_TIMEOUT
  405.         LDIW    1000
  406.         CALL    SET_TIMEOUT_MS
  407. PS2K_DETECT_K4:
  408.         LDS     TEMP,PS2K_RAW_READY
  409.         TST     TEMP
  410.         BRNE    PS2K_DETECT_K5
  411.         LDIZ    PS2K_TIMEOUT
  412.         CALL    CHECK_TIMEOUT_MS
  413.         BRCC    PS2K_DETECT_K4
  414.         RCALL   PS2K_DETECT_NORESPONSE
  415.         RJMP    PS2K_DETECT_K6
  416. PS2K_DETECT_K5:
  417.         LDS     DATA,PS2K_RAW_CODE
  418.         RCALL   HEXBYTE_FOR_DUMP
  419.         CPI     DATA,$AA
  420.         BREQ    PS2K_DETECT_K6
  421.         RCALL   PS2K_DETECT_UNWANTED
  422.  
  423. PS2K_DETECT_K6:
  424.         LDI     DATA,$F2
  425.         RCALL   PS2K_DETECT_SEND
  426.         BRNE    PS2K_DETECT_K7
  427.         LDI     DATA,$AB
  428.         RCALL   PS2K_DETECT_RECEIVE
  429.         BRNE    PS2K_DETECT_K7
  430.         LDI     DATA,$83
  431.         RCALL   PS2K_DETECT_RECEIVE
  432. PS2K_DETECT_K7:
  433.         LDI     DATA,$F0
  434.         RCALL   PS2K_DETECT_SEND
  435.         BRNE    PS2K_DETECT_K8
  436.         LDI     DATA,$02
  437.         RCALL   PS2K_DETECT_SEND
  438. PS2K_DETECT_K8:
  439.         LDI     DATA,$F3
  440.         RCALL   PS2K_DETECT_SEND
  441.         BRNE    PS2K_DETECT_K9
  442.         LDI     DATA,$00
  443.         RCALL   PS2K_DETECT_SEND
  444.         LDIZ    MSG_READY*2+3
  445.         CALL    PRINTSTRZ
  446. PS2K_DETECT_K9:
  447.         FREEMEM 1
  448.         RET
  449. ;
  450. PS2K_DETECT_SEND:
  451.         RCALL   HEXBYTE_FOR_DUMP
  452.         RCALL   PS2K_SEND_BYTE
  453.         BREQ    PS2K_DETECT_TXFAIL
  454.         RCALL   PS2K_RECEIVE_BYTE
  455.         BREQ    PS2K_DETECT_NORESPONSE
  456.         RCALL   HEXBYTE_FOR_DUMP
  457.         CPI     DATA,$FA
  458.         BRNE    PS2K_DETECT_UNWANTED
  459.         RET
  460. ;
  461. PS2K_DETECT_RECEIVE:
  462.         STH     PS2K_DETECT_TEMP,DATA
  463.         RCALL   PS2K_RECEIVE_BYTE
  464.         BREQ    PS2K_DETECT_NORESPONSE
  465.         RCALL   HEXBYTE_FOR_DUMP
  466.         LDH     TEMP,PS2K_DETECT_TEMP
  467.         CP      DATA,TEMP
  468.         BRNE    PS2K_DETECT_UNWANTED
  469.         RET
  470. ;
  471. PS2K_DETECT_TXFAIL:
  472.         LDIZ    MLMSG_TXFAIL*2
  473.         RJMP    PS2K_DETECT_XXFAIL
  474. PS2K_DETECT_UNWANTED:
  475.         LDIZ    MLMSG_UNWANTED*2
  476.         RJMP    PS2K_DETECT_XXFAIL
  477. PS2K_DETECT_NORESPONSE:
  478.         LDIZ    MLMSG_NORESPONSE*2
  479. PS2K_DETECT_XXFAIL:
  480.         CALL    PRINTMLSTR
  481.         CLZ
  482.         RET
  483. ;
  484. ;--------------------------------------
  485. ;
  486.