www.pudn.com > bak22.rar > PEN.ASM, change:2006-05-30,size:9725b


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