📄 pen.asm
字号:
RxDly: .EQU 0x80
TxDly: .EQU 0x100
TxWaitT: .EQU 0x0000 //50ms
ModeCmd: .EQU 0x10
ParaCmd: .EQU 0x20
VerCmd: .EQU 0x30
ParaAddr: .EQU 0x100+FPara-1
VerAddr: .EQU 0x100+FVer-1
ParaLen: .EQU 22
VerLen: .EQU 17
TxNum: .EQU _Tmp1
TxAddr: .EQU _Tmp2
TxLen: .EQU _Tmp3
RxCmdBak: .EQU _Tmp1
RxNum: .EQU _Tmp2
RxLen: .EQU _Tmp3
RxCSBak: .EQU _Tmp4
dTxNoAckErr: .EQU 1
dTxNibbleWaitLoErr: .EQU 2
dTxNibbleWaitHiErr: .EQU 3
// 0: Ok
// 1: No sign error
// 2: Mode umatched error
// 3: Checksum error
// 4: Wait low clk error
// 5: Wait high clk error
// 6: Cmd 0 Error
ComTxMode:
R1|=ModeCmd
[_CommBuf]=R1
R1=_CommBuf
[TxAddr]=R1
R1=1
JMP ComTxStr
ComTxPara:
R1=ParaCmd
[ParaAddr]=R1
R1=ParaAddr
[TxAddr]=R1
R1=ParaLen
JMP ComTxStr
ComTxVer:
R1=VerCmd
[VerAddr]=R1
R1=VerAddr
[TxAddr]=R1
R1=VerLen
ComTxStr:
[TxLen]=R1
R3=[TxAddr] // Addr
R1=[TxLen]
[TxNum]=R1 // Length
CALL ClrAck // ACK=0
ComTxStrWClkL:
R1=TxWaitT
ComTxStrWClkL0:
R1-=1
JE ComTxWaitAckErr
R2+=1
R2=[P_IOA_Data]
TEST R2, PClkB
JNE ComTxStrWClkL0
CALL ComTxNibble // shake hand
CMP R1, 0
JNE ComTxStrErr1
R4=0
ComTxStr0:
R1=[R3]
R1=R1 LSR 4
R1&=0x0f
CALL ComTxNibble // High nibble
CMP R1, 0
JNE ComTxStrErr2
R1=[R3]
R1&=0x0f
CALL ComTxNibble // Low nibble
CMP R1, 0
JNE ComTxStrErr3
R3+=1 // Addr++
R1=[TxNum]
R1-=1
[TxNum]=R1 // Len--
JNE ComTxStr0
R1=R4
R1&=0x0f
CALL ComTxNibble // CheckSum
CMP R1, 0
JNE ComTxStrErr4
R1=0
RETF
ComTxWaitAckErr:
R1=dTxNoAckErr
JMP ComTxStrErr_
ComTxStrErr4:
R1+=0x10
ComTxStrErr3:
R1+=0x10
ComTxStrErr2:
R1+=0x10
ComTxStrErr1:
R1+=0x10
ComTxStrErr_:
R4=R1
CALL SetAck
CALL Delay2ms
R1=R4
RETF
ComTxNibble:
R4+=R1
R5=R1
R5&=0x0f
R5|=0xf000
ComTxNibble0:
R1=[P_IOA_Buffer]
TEST R5, Bit0
JNE ComTxNibbleHi
ComTxNibbleLo:
R1&=PDatB_
JMP ComTxNibble_
ComTxNibbleHi:
R1|=PDatB
ComTxNibble_:
R1&=PAckB_
[P_IOA_Buffer]=R1 // Tx data & Ack=0
ComTxNibbleWL:
R1=TxDly
ComTxNibbleWL0:
R1-=1
JNE ComTxNibbleWL_
R1=dTxNibbleWaitLoErr
RETF
ComTxNibbleWL_:
R2=[P_IOA_Data]
TEST R2, PClkB
JNE ComTxNibbleWL0
ComTxNibbleWH:
R2=[P_IOA_Buffer]
R2|=PAckB
[P_IOA_Buffer]=R2 // Ack=1
R1=TxDly
ComTxNibbleWH0:
R1-=1
JNE ComTxNibbleWH_
R1=dTxNibbleWaitHiErr
RETF
ComTxNibbleWH_:
R2=[P_IOA_Data]
TEST R2, PClkB
JE ComTxNibbleWH0
ComTxNibble2:
R5=R5 LSR 1
TEST R5, BitC
JNE ComTxNibble0
ComTxNibbleE:
R1=0
RETF
ComRx:
R1=[P_IOA_Data]
TEST R1, PClkB
JE ComRx_1
ComRxErr1:
R1=dRxNoSign
RETF
ComRx_1:
CALL ComRxNibble // shake hand
R1-=0
JNE ComRxRet
R4=1
CALL ComRxByte
R1-=0
JNE ComRxRet
CMP R3, 0xff
JNE ComRxCoord
PC = ComRxComand
ComRxCoord: // normal command
[_XCoord]=R3
CALL ComRxByte
R1-=0
JNE ComRxRet
[_YCoord]=R3
CALL ComChecksum
R1-=0
JNE ComRxRet
R1=[_CardMode]
CMP R1, NormalMode
JE ComRxOk
R1=[_CardMode]
CMP R1, CoordMode
JE ComRxOk
ComRxErr2:
R1=dRxUnmatchedModeErr
RETF
ComRxOk:
R1=[_SysFlagA]
R1|=CoordBit
[_SysFlagA]=R1
R1=16
[_RxErrCnt]=R1
R1=dRxOk
RETF
ComRxComand:
CALL ComRxByte
R1-=0
JNE ComRxRet
R3=R3 LSR 4
R3+=ComandTab
PC=[R3]
ComC1Err:
CALL ComChecksum
R1-=0
JNE ComRxRet
R1=ErrC02Err
JMP ComRxErrCmd
ComNo:
R1=6
ComRxRet:
RETF
ComC2Err:
CALL ComChecksum
R1-=0
JNE ComRxRet
R1 = ErrC02DataErr
JMP ComRxErrCmd
ComAdjPErr:
CALL ComChecksum
R1-=0
JNE ComRxRet
R1 = AdjustPercisionErr
ComRxErrCmd:
[_ErrType]=R1
R1=[_SysFlagA]
R1|=SysErrBit
[_SysFlagA]=R1
R1=dRxOk
RETF
ComRxKey:
CALL ComChecksum
R1-=0
JNE ComRxRet
R1=[_SysFlagA]
R1|=KeyBit
[_SysFlagA]=R1
R1=dRxOk
RETF
ComRxVer:
R1=16
[RxLen]=R1
CALL ComRxStr
R1-=0
JNE ComRxRet
R1=[_CardMode]
CMP R1,VersionMode
JNE ComRxErr2_
PC=ComRxOk
ComRxRes:
R1=36
[RxLen]=R1
CALL ComRxStr
R1-=0
JNE ComRxRet
R1=[_SysFlagA]
R1&=BaseDataBit_
[_SysFlagA]=R1
R1=[_CardMode]
CMP R1,TestMode
JNE ComRxErr2_
PC=ComRxOk
ComRxAdj1:
R1=8
[RxLen]=R1
CALL ComRxStr
R1-=0
JNE ComRxRet2
R1=[_CardMode]
CMP R1,AdjustMode
JNE ComRxErr2_
PC=ComRxOk
ComRxErr2_:
R1=2
RETF
ComRxBase:
R1=67
[RxLen]=R1
CALL ComRxStr
R1-=0
JNE ComRxRet2
R1=[_SysFlagA]
R1|=BaseDataBit
[_SysFlagA]=R1
R1=[_CardMode]
CMP R1,TestMode
JNE ComRxErr2_
PC=ComRxOk
ComRxRet2:
RETF
ComRxStr:
R1=0
[RxNum]=R1
ComRxStr0:
CALL ComRxByte
R1-=0
JNE ComRxRet2
R1=[RxNum]
R1+=_CommBuf
[R1]=R3
R1=[RxNum]
R1+=1
[RxNum]=R1
CMP R1, [RxLen]
JNE ComRxStr0
ComChecksum:
R1=R4&0x0f
[RxCSBak]=R1
CALL ComRxNibble
R1-=0
JNE ComRxRet2
R3-=[RxCSBak]
JNE ComChecksumErr3
R1=0
RETF
ComChecksumErr3:
R1=3
RETF
ComRxByte:
R1=[_SysFlagA]
R1&=TmpBit_
JMP ComRxNibble_
ComRxNibble:
R1=[_SysFlagA]
R1|=TmpBit
ComRxNibble_:
[_SysFlagA]=R1
R3=0
ComRxNibble0:
R3=R3 LSL 1
R1= RxDly
ComRxNibble1:
R1-=1
JNE ComRxNibble1_
R1=dRxWaitLowClkErr
RETF
ComRxNibble1_:
R2=[P_IOA_Data]
TEST R2, PClkB // Clk=0
JNE ComRxNibble1
R2=[P_IOA_Data]
TEST R2, PDatB
JNE ComRxNibbleHi
ComRxNibbleLo:
R3&=Bit0_
JMP ComRxNibble2
ComRxNibbleHi:
R3|=Bit0
ComRxNibble2:
R2=[P_IOA_Buffer]
R2&=PAckB_ // Ack=0
[P_IOA_Buffer]=R2
R1= RxDly
ComRxNibble3:
R1-=1
JNE ComRxNibble4
CALL SetAck
R1=dRxWaitHighClkErr
RETF
ComRxNibble4:
R2=[P_IOA_Data]
TEST R2, PClkB // Clk=1
JE ComRxNibble3
CALL SetAck
R3|=Bit8
TEST R3, BitB
JE ComRxNibble0
R1=[_SysFlagA]
TEST R1, TmpBit
JNE ComRxNibbleNibbleOk
TEST R3, BitC
JNE ComRxNibble5
R3=R3^0x06
R1=R3&0x0f
R4+=R1
ComRxNibble5:
TEST R3, BitF
JE ComRxNibble0
ComRxNibbleByteOk:
R3=R3^0x06
R1=R3&0x0f
R4+=R1
R3&=0xff
R1=dRxOk
RETF
ComRxNibbleNibbleOk:
R3=R3^0x06
R3&=0x0f
R4+=R3
R1=dRxOk
RETF
ComandTab:
.DW ComNo
.DW ComC1Err
.DW ComC2Err
.DW ComAdjPErr
.DW ComRxKey
.DW ComRxVer
.DW ComRxRes
.DW ComRxAdj1
.DW ComRxBase
ClrAck:
R1=[P_IOA_Buffer]
R1&=PAckB_
[P_IOA_Buffer]=R1
RETF
SetAck:
R2=[P_IOA_Buffer]
R2|=PAckB
[P_IOA_Buffer]=R2
RETF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -