📄 ps2d.lis
字号:
000A JC .mdelay_exit ; exit if carry set, time has already expired
000A
000A call PS2D_Delay
000A
000A .mdelay_exit:
000A
000A pop A
000A MACRO CLEARC
000A and f,~(FLAG_CARRY)
000A MACRO SETC
000A or f,FLAG_CARRY
AREA UserModules (ROM, REL)
;-----------------------------------------------------------------------------
; FUNCTION NAME: PS2D_Start
;
; DESCRIPTION:
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS:
;
; RETURNS:
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
0000 .SECTION
0000 PS2D_Start:
0000 _PS2D_Start:
0000
0000 ; Set PS2_SCLK and PS2_SDATA to Resistive Pull Up
0000 909A CALL PS2D_Release
0002
IF PS2D_IO_CONFIG_TYPE
0002 620D03 MOV REG[P10CR], (PS2_PULLUP_ENABLE | OUTPUT_ENABLE) ; Enable the pullups
0005 620E05 MOV REG[P11CR], (OPEN_DRAIN | OUTPUT_ENABLE) ; Enable the pullups
0008
ELSE
or F, FLAG_XIO_MASK
OR REG[PS2D_DM1],(PS2D_SCLK | PS2D_SDATA) ; Set the clock and data
OR REG[PS2D_DM0],(PS2D_SCLK | PS2D_SDATA) ; Set the clock and data
and F, ~FLAG_XIO_MASK
AND REG[PS2D_DM2],~(PS2D_SCLK | PS2D_SDATA) ; clear the clock and data
ENDIF
0008 9002 CALL PS2D_BAT
000A
000A 7F RET
000B .ENDSECTION
000B ;-----------------------------------------------------------------------------
000B ; FUNCTION NAME: PS2D_Stop
000B ;
000B ; DESCRIPTION:
000B ;
000B ;-----------------------------------------------------------------------------
000B ;
000B ; ARGUMENTS:
000B ;
000B ; RETURNS:
000B ;
000B ; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
000B ;
000B ; THEORY of OPERATION or PROCEDURE:
000B ;
000B .SECTION
000B PS2D_Stop:
000B _PS2D_Stop:
000B 7F ret
000C .ENDSECTION
000C ;-----------------------------------------------------------------------------
000C ; FUNCTION NAME: PS2D_BAT
000C ;
000C ; DESCRIPTION:
000C ;
000C ;-----------------------------------------------------------------------------
000C ;
000C ; ARGUMENTS:
000C ;
000C ; RETURNS:
000C ;
000C ; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
000C ;
000C ; THEORY of OPERATION or PROCEDURE:
000C ;
000C .SECTION
000C PS2D_BAT:
000C _PS2D_BAT:
000C
000C 9000 CALL PS2D_StartDevice ; Device specific start
000E
000E ; Delay for ~500 mSec
000E 57FA MOV X, 250 ; 250 * 20 * 100 uSec = 500 mSec
0010 .wait_loop_o:
0010 5014 MOV A, 20 ; Inner loop
0012 .wait_loop_i:
0012
0012 08 push A
0013
IF (100)
ELSE
PSOC_ERROR PS2D User Module - Delay value must be greater than zero
ENDIF
IF CPU_CLOCK_SPEED - OSC_CR0_CPU_24MHz
IF CPU_CLOCK_SPEED - OSC_CR0_CPU_12MHz
IF CPU_CLOCK_SPEED - OSC_CR0_CPU_6MHz
PSOC_ERROR PS2D User Module - Only supports 6, 12, or 24 Mhz
ELSE
; 6 Mhz
0013 5042 MOV A, ((100*2)/3) ; convert uSec to number of delay loops required
0015 1102 SUB A, ((((((0+21)*167)/1000)+1)*2)/3) ; subtract cpu cycles plus current overhead
0017
ENDIF
ELSE
; 12 Mhz
MOV A, ((100*4)/7) ; convert uSec to number of delay loops required
SUB A, (((((0+21)*83)/1000)*4)/7) ; subtract cpu cycles plus current overhead
ENDIF
ELSE
; 24 Mhz
MOV A, ((100*8)/11) ; convert uSec to number of delay loops required
SUB A, (((((0+21)*42)/1000)*8)/11) ; subtract cpu cycles plus current overhead
ENDIF
0017 C003 JC .mdelay_exit ; exit if carry set, time has already expired
0019
0019 9089 call PS2D_Delay
001B
001B .mdelay_exit:
001B
001B 18 pop A
001C 62E300 mov reg[RES_WDT], 00h
001F
001F 78 DEC A ; Are we done with inner loop?
0020 BFF1 JNZ .wait_loop_i
0022
0022 79 DEC X ; Are we done with outer loop??
0023 BFEC JNZ .wait_loop_o
0025
0025 50AA mov a, PS2_CMD_PASS_BAT ; Completion
0027 9069 call PS2D_SendResponseByte ; Send it
0029
0029 ; Mouse only
IF (PS2D_DEVICE_TYPE & PS2D_DEVICE_TYPE_MOUSE)
0029 3901 cmp a, PS2D_CLKH_DATAL ; Was the host in RTS
002B A005 jz .exit ; Exit if RTS
002D 5100 mov a, [PS2D_bDeviceID] ; Device ID
002F 9061 call PS2D_SendResponseByte ; Send it
ENDIF
0031 .exit:
0031 7F ret
0032 .ENDSECTION
0032 ;-----------------------------------------------------------------------------
0032 ; FUNCTION NAME: PS2D_IsEnabled
0032 ;
0032 ; DESCRIPTION: API Function returns the current enable status of the UM
0032 ;
0032 ;-----------------------------------------------------------------------------
0032 ;
0032 ; ARGUMENTS: None
0032 ;
0032 ; RETURNS: A: 0 Disabled
0032 ; 1 Enabled
0032 ;
0032 ; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
0032 ;
0032 ; THEORY of OPERATION or PROCEDURE:
0032 ;
0032 ;-----------------------------------------------------------------------------
0032 .SECTION
0032 PS2D_IsEnabled:
0032 _PS2D_IsEnabled:
0032 5100 mov a, [PS2D_bIsEnabled] ; Simply return the enabled status
0034 7F ret
0035 .ENDSECTION
0035 ;-----------------------------------------------------------------------------
0035 ; FUNCTION NAME: PS2D_TransferInProgress
0035 ;
0035 ; DESCRIPTION: API Function returns the current transfer status of the UM
0035 ;
0035 ;-----------------------------------------------------------------------------
0035 ;
0035 ; ARGUMENTS: None
0035 ;
0035 ; RETURNS: A: 0 if no transfer is in progress
0035 ; 1 if a transfer is in progress
0035 ;
0035 ; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
0035 ;
0035 ; THEORY of OPERATION or PROCEDURE:
0035 ;
0035 ;-----------------------------------------------------------------------------
0035 .SECTION
0035 PS2D_TransferInProgress:
0035 _PS2D_TransferInProgress:
0035 5103 mov a,[PS2D_bTxPktIndex] ; Compare the current index
0037 3A04 cmp a,[PS2D_bTxPktSize] ; verses the packet size
0039 A005 jz .no_more
003B
003B ; Flow here with more to transfer
003B 5001 mov a,0x01
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -